Added box, plane and sphere mesh generators
This commit is contained in:
50
orx-mesh-generators/src/main/kotlin/Sphere.kt
Normal file
50
orx-mesh-generators/src/main/kotlin/Sphere.kt
Normal file
@@ -0,0 +1,50 @@
|
||||
package org.openrndr.extras.meshgenerators
|
||||
|
||||
import org.openrndr.draw.VertexBuffer
|
||||
import org.openrndr.math.Spherical
|
||||
import org.openrndr.math.Vector2
|
||||
|
||||
fun sphereMesh(sides:Int, segments:Int, radius: Double): VertexBuffer {
|
||||
val vertexCount = 2 * sides * 3 + Math.max(0, (segments-2)) * sides * 6
|
||||
val vb = meshVertexBuffer(vertexCount)
|
||||
vb.put {
|
||||
generateSphere(sides, segments, radius, bufferWriter(this))
|
||||
}
|
||||
return vb
|
||||
}
|
||||
|
||||
fun generateSphere(sides: Int, segments: Int, radius: Double = 1.0, writer: VertexWriter) {
|
||||
for (t in 0 until segments) {
|
||||
for (s in 0 until sides) {
|
||||
val st00 = Spherical(radius, s*Math.PI*2.0/sides, t*Math.PI/segments)
|
||||
val st01 = Spherical(radius, s*Math.PI*2.0/sides, (t+1)*Math.PI/segments)
|
||||
val st10 = Spherical(radius, (s+1)*Math.PI*2.0/sides, t*Math.PI/segments)
|
||||
val st11 = Spherical(radius, (s+1)*Math.PI*2.0/sides, (t+1)*Math.PI/segments)
|
||||
|
||||
val thetaMax = Math.PI
|
||||
val phiMax = Math.PI*2.0
|
||||
|
||||
when (t) {
|
||||
0 -> {
|
||||
writer(st00.cartesian, st00.cartesian.normalized, Vector2(st00.phi/phiMax, st00.theta/thetaMax))
|
||||
writer(st01.cartesian, st01.cartesian.normalized, Vector2(st01.phi/phiMax, st01.theta/thetaMax))
|
||||
writer(st11.cartesian, st11.cartesian.normalized, Vector2(st11.phi/phiMax, st11.theta/thetaMax))
|
||||
}
|
||||
segments-1 -> {
|
||||
writer(st00.cartesian, st00.cartesian.normalized, Vector2(st00.phi/phiMax, st00.theta/thetaMax))
|
||||
writer(st10.cartesian, st10.cartesian.normalized, Vector2(st10.phi/phiMax, st10.theta/thetaMax))
|
||||
writer(st11.cartesian, st11.cartesian.normalized, Vector2(st11.phi/phiMax, st11.theta/thetaMax))
|
||||
}
|
||||
else -> {
|
||||
writer(st00.cartesian, st00.cartesian.normalized, Vector2(st00.phi/phiMax, st00.theta/thetaMax))
|
||||
writer(st10.cartesian, st10.cartesian.normalized, Vector2(st10.phi/phiMax, st10.theta/thetaMax))
|
||||
writer(st11.cartesian, st11.cartesian.normalized, Vector2(st11.phi/phiMax, st11.theta/thetaMax))
|
||||
|
||||
writer(st11.cartesian, st11.cartesian.normalized, Vector2(st11.phi/phiMax, st11.theta/thetaMax))
|
||||
writer(st01.cartesian, st01.cartesian.normalized, Vector2(st01.phi/phiMax, st01.theta/thetaMax))
|
||||
writer(st00.cartesian, st00.cartesian.normalized, Vector2(st00.phi/phiMax, st00.theta/thetaMax))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user