From cc5d319809ad9025e32be1a541ce2f1ce7d0f81c Mon Sep 17 00:00:00 2001 From: Edwin Jakobs Date: Sun, 25 Nov 2018 17:07:54 +0100 Subject: [PATCH] Added sphere inversion, updated README.md --- orx-mesh-generators/README.md | 36 ++++++++++++++- orx-mesh-generators/src/main/kotlin/Box.kt | 2 +- orx-mesh-generators/src/main/kotlin/Sphere.kt | 46 ++++++++++--------- 3 files changed, 60 insertions(+), 24 deletions(-) diff --git a/orx-mesh-generators/README.md b/orx-mesh-generators/README.md index 007d1b91..ceb4313c 100644 --- a/orx-mesh-generators/README.md +++ b/orx-mesh-generators/README.md @@ -1,3 +1,37 @@ # orx-mesh-generators -Simple mesh generators for OPENRNDR \ No newline at end of file +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 +``` diff --git a/orx-mesh-generators/src/main/kotlin/Box.kt b/orx-mesh-generators/src/main/kotlin/Box.kt index e60bb2fb..12c9017f 100644 --- a/orx-mesh-generators/src/main/kotlin/Box.kt +++ b/orx-mesh-generators/src/main/kotlin/Box.kt @@ -3,7 +3,7 @@ package org.openrndr.extras.meshgenerators import org.openrndr.draw.VertexBuffer 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, invert: Boolean = false): VertexBuffer { val vb = meshVertexBuffer(widthSegments * heightSegments * 6 * 2 + diff --git a/orx-mesh-generators/src/main/kotlin/Sphere.kt b/orx-mesh-generators/src/main/kotlin/Sphere.kt index e83c9b1f..f17fd241 100644 --- a/orx-mesh-generators/src/main/kotlin/Sphere.kt +++ b/orx-mesh-generators/src/main/kotlin/Sphere.kt @@ -4,45 +4,47 @@ 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 +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 vb = meshVertexBuffer(vertexCount) vb.put { - generateSphere(sides, segments, radius, bufferWriter(this)) + generateSphere(sides, segments, radius, invert, bufferWriter(this)) } 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 (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 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 + 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)) + writer(st00.cartesian, st00.cartesian.normalized * inverter, Vector2(st00.phi / phiMax, st00.theta / thetaMax)) + writer(st01.cartesian, st01.cartesian.normalized * inverter, Vector2(st01.phi / phiMax, st01.theta / thetaMax)) + writer(st11.cartesian, st11.cartesian.normalized * inverter, 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)) + segments - 1 -> { + writer(st00.cartesian, st00.cartesian.normalized * inverter, Vector2(st00.phi / phiMax, st00.theta / thetaMax)) + writer(st10.cartesian, st10.cartesian.normalized * inverter, Vector2(st10.phi / phiMax, st10.theta / thetaMax)) + writer(st11.cartesian, st11.cartesian.normalized * inverter, 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(st00.cartesian, st00.cartesian.normalized * inverter, Vector2(st00.phi / phiMax, st00.theta / thetaMax)) + writer(st10.cartesian, st10.cartesian.normalized * inverter, Vector2(st10.phi / phiMax, st10.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(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)) + writer(st11.cartesian, st11.cartesian.normalized * inverter, Vector2(st11.phi / phiMax, st11.theta / thetaMax)) + writer(st01.cartesian, st01.cartesian.normalized * inverter, Vector2(st01.phi / phiMax, st01.theta / thetaMax)) + writer(st00.cartesian, st00.cartesian.normalized * inverter, Vector2(st00.phi / phiMax, st00.theta / thetaMax)) } } }