Added sphere inversion, updated README.md
This commit is contained in:
@@ -1,3 +1,37 @@
|
|||||||
# orx-mesh-generators
|
# orx-mesh-generators
|
||||||
|
|
||||||
Simple mesh generators for OPENRNDR
|
Simple mesh generators for OPENRNDR
|
||||||
|
|
||||||
|
##### usage
|
||||||
|
|
||||||
|
```kotlin
|
||||||
|
val sphere = sphereMesh(32, 32, 4.0)
|
||||||
|
val unitSphere = sphereMesh()
|
||||||
|
val cube = boxMesh()
|
||||||
|
val box = boxMesh(2.0, 4.0, 2.0)
|
||||||
|
```
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
```kotlin
|
||||||
|
fun sphereMesh(
|
||||||
|
sides: Int = 16,
|
||||||
|
segments: Int = 16,
|
||||||
|
radius: Double = 1.0,
|
||||||
|
invert: Boolean = false): VertexBuffer
|
||||||
|
|
||||||
|
fun groundPlaneMesh(
|
||||||
|
width: Double = 1.0,
|
||||||
|
height: Double = 1.0,
|
||||||
|
widthSegments: Int = 1,
|
||||||
|
heightSegments: Int): VertexBuffer
|
||||||
|
|
||||||
|
fun boxMesh(
|
||||||
|
width: Double = 1.0,
|
||||||
|
height: Double = 1.0,
|
||||||
|
depth: Double = 1.0,
|
||||||
|
widthSegments: Int = 1,
|
||||||
|
heightSegments: Int = 1,
|
||||||
|
depthSegments: Int = 1,
|
||||||
|
invert: Boolean = false): VertexBuffer
|
||||||
|
```
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package org.openrndr.extras.meshgenerators
|
|||||||
import org.openrndr.draw.VertexBuffer
|
import org.openrndr.draw.VertexBuffer
|
||||||
import org.openrndr.math.Vector3
|
import org.openrndr.math.Vector3
|
||||||
|
|
||||||
fun boxMesh(width: Double = 1.0, height: Double = 1.0, depth: Double,
|
fun boxMesh(width: Double = 1.0, height: Double = 1.0, depth: Double = 1.0,
|
||||||
widthSegments: Int = 1, heightSegments: Int = 1, depthSegments: Int = 1,
|
widthSegments: Int = 1, heightSegments: Int = 1, depthSegments: Int = 1,
|
||||||
invert: Boolean = false): VertexBuffer {
|
invert: Boolean = false): VertexBuffer {
|
||||||
val vb = meshVertexBuffer(widthSegments * heightSegments * 6 * 2 +
|
val vb = meshVertexBuffer(widthSegments * heightSegments * 6 * 2 +
|
||||||
|
|||||||
@@ -4,45 +4,47 @@ import org.openrndr.draw.VertexBuffer
|
|||||||
import org.openrndr.math.Spherical
|
import org.openrndr.math.Spherical
|
||||||
import org.openrndr.math.Vector2
|
import org.openrndr.math.Vector2
|
||||||
|
|
||||||
fun sphereMesh(sides:Int, segments:Int, radius: Double): VertexBuffer {
|
fun sphereMesh(sides: Int = 16, segments: Int = 16, radius: Double = 1.0, invert: Boolean = false): VertexBuffer {
|
||||||
val vertexCount = 2 * sides * 3 + Math.max(0, (segments-2)) * sides * 6
|
val vertexCount = 2 * sides * 3 + Math.max(0, (segments - 2)) * sides * 6
|
||||||
val vb = meshVertexBuffer(vertexCount)
|
val vb = meshVertexBuffer(vertexCount)
|
||||||
vb.put {
|
vb.put {
|
||||||
generateSphere(sides, segments, radius, bufferWriter(this))
|
generateSphere(sides, segments, radius, invert, bufferWriter(this))
|
||||||
}
|
}
|
||||||
return vb
|
return vb
|
||||||
}
|
}
|
||||||
|
|
||||||
fun generateSphere(sides: Int, segments: Int, radius: Double = 1.0, writer: VertexWriter) {
|
fun generateSphere(sides: Int, segments: Int, radius: Double = 1.0, invert: Boolean = false, writer: VertexWriter) {
|
||||||
|
|
||||||
|
val inverter = if (invert) -1.0 else 1.0
|
||||||
for (t in 0 until segments) {
|
for (t in 0 until segments) {
|
||||||
for (s in 0 until sides) {
|
for (s in 0 until sides) {
|
||||||
val st00 = Spherical(radius, s*Math.PI*2.0/sides, t*Math.PI/segments)
|
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 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 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 st11 = Spherical(radius, (s + 1) * Math.PI * 2.0 / sides, (t + 1) * Math.PI / segments)
|
||||||
|
|
||||||
val thetaMax = Math.PI
|
val thetaMax = Math.PI
|
||||||
val phiMax = Math.PI*2.0
|
val phiMax = Math.PI * 2.0
|
||||||
|
|
||||||
when (t) {
|
when (t) {
|
||||||
0 -> {
|
0 -> {
|
||||||
writer(st00.cartesian, st00.cartesian.normalized, Vector2(st00.phi/phiMax, st00.theta/thetaMax))
|
writer(st00.cartesian, st00.cartesian.normalized * inverter, Vector2(st00.phi / phiMax, st00.theta / thetaMax))
|
||||||
writer(st01.cartesian, st01.cartesian.normalized, Vector2(st01.phi/phiMax, st01.theta/thetaMax))
|
writer(st01.cartesian, st01.cartesian.normalized * inverter, Vector2(st01.phi / phiMax, st01.theta / thetaMax))
|
||||||
writer(st11.cartesian, st11.cartesian.normalized, Vector2(st11.phi/phiMax, st11.theta/thetaMax))
|
writer(st11.cartesian, st11.cartesian.normalized * inverter, Vector2(st11.phi / phiMax, st11.theta / thetaMax))
|
||||||
}
|
}
|
||||||
segments-1 -> {
|
segments - 1 -> {
|
||||||
writer(st00.cartesian, st00.cartesian.normalized, Vector2(st00.phi/phiMax, st00.theta/thetaMax))
|
writer(st00.cartesian, st00.cartesian.normalized * inverter, Vector2(st00.phi / phiMax, st00.theta / thetaMax))
|
||||||
writer(st10.cartesian, st10.cartesian.normalized, Vector2(st10.phi/phiMax, st10.theta/thetaMax))
|
writer(st10.cartesian, st10.cartesian.normalized * inverter, 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 * inverter, Vector2(st11.phi / phiMax, st11.theta / thetaMax))
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
writer(st00.cartesian, st00.cartesian.normalized, Vector2(st00.phi/phiMax, st00.theta/thetaMax))
|
writer(st00.cartesian, st00.cartesian.normalized * inverter, Vector2(st00.phi / phiMax, st00.theta / thetaMax))
|
||||||
writer(st10.cartesian, st10.cartesian.normalized, Vector2(st10.phi/phiMax, st10.theta/thetaMax))
|
writer(st10.cartesian, st10.cartesian.normalized * inverter, 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 * inverter, Vector2(st11.phi / phiMax, st11.theta / thetaMax))
|
||||||
|
|
||||||
writer(st11.cartesian, st11.cartesian.normalized, Vector2(st11.phi/phiMax, st11.theta/thetaMax))
|
writer(st11.cartesian, st11.cartesian.normalized * inverter, Vector2(st11.phi / phiMax, st11.theta / thetaMax))
|
||||||
writer(st01.cartesian, st01.cartesian.normalized, Vector2(st01.phi/phiMax, st01.theta/thetaMax))
|
writer(st01.cartesian, st01.cartesian.normalized * inverter, Vector2(st01.phi / phiMax, st01.theta / thetaMax))
|
||||||
writer(st00.cartesian, st00.cartesian.normalized, Vector2(st00.phi/phiMax, st00.theta/thetaMax))
|
writer(st00.cartesian, st00.cartesian.normalized * inverter, Vector2(st00.phi / phiMax, st00.theta / thetaMax))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user