diff --git a/orx-mesh-generators/src/demo/kotlin/DemoComplex01.kt b/orx-mesh-generators/src/demo/kotlin/DemoComplex01.kt new file mode 100644 index 00000000..72f671ec --- /dev/null +++ b/orx-mesh-generators/src/demo/kotlin/DemoComplex01.kt @@ -0,0 +1,34 @@ +import org.openrndr.application +import org.openrndr.draw.DrawPrimitive +import org.openrndr.draw.shadeStyle +import org.openrndr.extras.camera.Orbital +import org.openrndr.extras.meshgenerators.box +import org.openrndr.extras.meshgenerators.group +import org.openrndr.extras.meshgenerators.meshGenerator +import org.openrndr.extras.meshgenerators.sphere +import org.openrndr.math.transforms.transform + +fun main() { + application { + program { + extend(Orbital()) + val m = meshGenerator { + sphere(32, 32, 1.0) + group { + box(4.0, 4.0, 4.0) + transform(transform { + translate(0.0, -2.0, 0.0) + }) + } + } + extend { + drawer.shadeStyle = shadeStyle { + fragmentTransform = """ + x_fill.rgb *= v_viewNormal.z; + """.trimIndent() + } + drawer.vertexBuffer(m, DrawPrimitive.TRIANGLES) + } + } + } +} \ No newline at end of file diff --git a/orx-mesh-generators/src/demo/kotlin/DemoComplex02.kt b/orx-mesh-generators/src/demo/kotlin/DemoComplex02.kt new file mode 100644 index 00000000..8de50432 --- /dev/null +++ b/orx-mesh-generators/src/demo/kotlin/DemoComplex02.kt @@ -0,0 +1,64 @@ +import org.openrndr.application +import org.openrndr.draw.DrawPrimitive +import org.openrndr.draw.shadeStyle +import org.openrndr.extras.camera.Orbital +import org.openrndr.extras.meshgenerators.* +import org.openrndr.math.Vector3 +import org.openrndr.math.transforms.transform + +fun main() { + application { + program { + extend(Orbital()) + val m = meshGenerator { + group { + hemisphere(32, 16, 5.0) + transform(transform { + translate(0.0, 12.0, 0.0) + }) + } + group { + cylinder(32, 1, 5.0, 6.0) + transform(transform { + translate(0.0, 9.0, 0.0) + rotate(Vector3.UNIT_X, 90.0) + }) + } + group { + hemisphere(32, 16, 5.0) + transform(transform { + translate(0.0, 6.0, 0.0) + rotate(Vector3.UNIT_X, 180.0) + }) + } + group { + val legCount = 12 + val baseRadius = 3.0 + val legRadius = 0.05 + val legLength = 4.0 + for (i in 0 until legCount) { + group { + val dphi = 360.0 / legCount + cylinder(32, 1, legRadius, legLength) + transform(transform { + rotate(Vector3.UNIT_Y, dphi * i) + translate(baseRadius, 0.0, 0.0) + rotate(Vector3.UNIT_Z, -15.0) + translate(0.0, legLength/2.0, 0.0) + rotate(Vector3.UNIT_X, 90.0) + }) + } + } + } + } + extend { + drawer.shadeStyle = shadeStyle { + fragmentTransform = """ + x_fill.rgb *= v_viewNormal.z; + """.trimIndent() + } + drawer.vertexBuffer(m, DrawPrimitive.TRIANGLES) + } + } + } +} \ No newline at end of file diff --git a/orx-mesh-generators/src/demo/kotlin/DemoComplex03.kt b/orx-mesh-generators/src/demo/kotlin/DemoComplex03.kt new file mode 100644 index 00000000..ba97369c --- /dev/null +++ b/orx-mesh-generators/src/demo/kotlin/DemoComplex03.kt @@ -0,0 +1,85 @@ +import org.openrndr.application +import org.openrndr.draw.DrawPrimitive +import org.openrndr.draw.shadeStyle +import org.openrndr.extras.camera.Orbital +import org.openrndr.extras.meshgenerators.* +import org.openrndr.math.Vector3 +import org.openrndr.math.transforms.transform + +fun main() { + application { + program { + extend(Orbital()) + val m = meshGenerator { + group { + hemisphere(32, 16, 5.0) + transform(transform { + translate(0.0, 12.0, 0.0) + }) + } + + val ridges = 5 + val midLength = 6.0 + val ridgeLength = midLength / ridges + val ridgeRadius = 5.5 + + for (r in 0 until ridges) { + group { + taperedCylinder(32, 1, 5.0, ridgeRadius, ridgeLength/ 2.0) + transform(transform { + translate(0.0, + ridgeLength/4.0 + r * ridgeLength + 6.0, + 0.0) + rotate(Vector3.UNIT_X, 270.0) + }) + } + + group { + taperedCylinder(32, 1, ridgeRadius, 5.0, ridgeLength/2.0) + transform(transform { + translate(0.0, + ridgeLength/4.0 + ridgeLength/2.0 + r * ridgeLength + 6.0, + 0.0) + rotate(Vector3.UNIT_X, 270.0) + }) + } + } + group { + hemisphere(32, 16, 5.0) + transform(transform { + translate(0.0, 6.0, 0.0) + rotate(Vector3.UNIT_X, 180.0) + }) + } + group { + val legCount = 12 + val baseRadius = 3.0 + val legRadius = 0.05 + val legLength = 4.0 + for (i in 0 until legCount) { + group { + val dphi = 360.0 / legCount + cylinder(32, 1, legRadius, legLength) + transform(transform { + rotate(Vector3.UNIT_Y, dphi * i) + translate(baseRadius, 0.0, 0.0) + rotate(Vector3.UNIT_Z, -15.0) + translate(0.0, legLength/2.0, 0.0) + rotate(Vector3.UNIT_X, 90.0) + }) + } + } + } + } + + extend { + drawer.shadeStyle = shadeStyle { + fragmentTransform = """ + x_fill.rgb *= v_viewNormal.z; + """.trimIndent() + } + drawer.vertexBuffer(m, DrawPrimitive.TRIANGLES) + } + } + } +} \ No newline at end of file diff --git a/orx-mesh-generators/src/demo/kotlin/DemoComplex04.kt b/orx-mesh-generators/src/demo/kotlin/DemoComplex04.kt new file mode 100644 index 00000000..ed0f344c --- /dev/null +++ b/orx-mesh-generators/src/demo/kotlin/DemoComplex04.kt @@ -0,0 +1,109 @@ +import org.openrndr.application +import org.openrndr.draw.DrawPrimitive +import org.openrndr.draw.shadeStyle +import org.openrndr.extras.camera.Orbital +import org.openrndr.extras.meshgenerators.* +import org.openrndr.math.Vector2 +import org.openrndr.math.Vector3 +import org.openrndr.math.transforms.transform + +fun main() { + application { + program { + extend(Orbital()) + val m = meshGenerator { + val sides = 12 + group { + cap(sides, 5.0, listOf( + Vector2(0.0, 1.0), + Vector2(0.5, 1.0), + Vector2(0.5, 0.5), + Vector2(0.9, 0.5), + Vector2(1.0, 0.0)) + ) + transform(transform { + translate(0.0, 12.0, 0.0) + }) + } + + val ridges = 5 + val midLength = 6.0 + val ridgeLength = midLength / ridges + val ridgeRadius = 5.5 + + + for (r in 0 until ridges) { + group { + taperedCylinder(sides, 1, 5.0, ridgeRadius, ridgeLength / 3.0) + transform(transform { + translate( + 0.0, + ridgeLength / 6.0 + r * ridgeLength + 6.0, + 0.0 + ) + rotate(Vector3.UNIT_X, 270.0) + }) + } + group { + taperedCylinder(sides, 1, ridgeRadius, ridgeRadius, ridgeLength / 3.0) + transform(transform { + translate( + 0.0, + ridgeLength / 6.0 + ridgeLength / 3.0 + r * ridgeLength + 6.0, + 0.0 + ) + rotate(Vector3.UNIT_X, 270.0) + }) + } + + group { + taperedCylinder(sides, 1, ridgeRadius, 5.0, ridgeLength / 3.0) + transform(transform { + translate( + 0.0, + ridgeLength / 6.0 + 2 * ridgeLength / 3.0 + r * ridgeLength + 6.0, + 0.0 + ) + rotate(Vector3.UNIT_X, 270.0) + }) + } + } + group { + cap(sides, 5.0, listOf(Vector2(0.0, 0.0), Vector2(1.0, 0.0))) + transform(transform { + translate(0.0, 6.0, 0.0) + rotate(Vector3.UNIT_X, 180.0) + }) + } + group { + val legCount = 12 + val baseRadius = 4.5 + val legRadius = 0.05 + val legLength = 7.0 + for (i in 0 until legCount) { + group { + val dphi = 360.0 / legCount + cylinder(sides, 1, legRadius, legLength) + transform(transform { + rotate(Vector3.UNIT_Y, dphi * i) + translate(baseRadius, 0.0, 0.0) + //rotate(Vector3.UNIT_Z, -15.0) + translate(0.0, legLength / 2.0, 0.0) + rotate(Vector3.UNIT_X, 90.0) + }) + } + } + } + } + + extend { + drawer.shadeStyle = shadeStyle { + fragmentTransform = """ + x_fill.rgb *= v_viewNormal.z; + """.trimIndent() + } + drawer.vertexBuffer(m, DrawPrimitive.TRIANGLES) + } + } + } +} \ No newline at end of file diff --git a/orx-mesh-generators/src/demo/kotlin/DemoComplex05.kt b/orx-mesh-generators/src/demo/kotlin/DemoComplex05.kt new file mode 100644 index 00000000..4603043c --- /dev/null +++ b/orx-mesh-generators/src/demo/kotlin/DemoComplex05.kt @@ -0,0 +1,36 @@ +import org.openrndr.application +import org.openrndr.draw.DrawPrimitive +import org.openrndr.draw.shadeStyle +import org.openrndr.extras.camera.Orbital +import org.openrndr.extras.meshgenerators.* +import org.openrndr.math.Vector2 +import org.openrndr.math.Vector3 +import org.openrndr.math.transforms.transform +import org.openrndr.shape.Circle + +fun main() { + application { + program { + extend(Orbital()) + val m = meshGenerator { + + grid(5,5, 5) { u, v, w -> + extrudeShape(Circle(0.0, 0.0, 50.0).shape, 4.0, scale = 0.1) + transform(transform{ translate(u*20.0, v*20.0, w * 20.0)} ) + } + twist(360.0/200.0, 0.0) + twist(360.0/200.0, 0.0, Vector3.UNIT_X) + twist(360.0/200.0, 0.0, Vector3.UNIT_Z) + } + + extend { + drawer.shadeStyle = shadeStyle { + fragmentTransform = """ + x_fill.rgb *= v_viewNormal.z; + """.trimIndent() + } + drawer.vertexBuffer(m, DrawPrimitive.TRIANGLES) + } + } + } +} \ No newline at end of file diff --git a/orx-mesh-generators/src/demo/kotlin/DemoComplex06.kt b/orx-mesh-generators/src/demo/kotlin/DemoComplex06.kt new file mode 100644 index 00000000..d20fc55d --- /dev/null +++ b/orx-mesh-generators/src/demo/kotlin/DemoComplex06.kt @@ -0,0 +1,35 @@ +import org.openrndr.application +import org.openrndr.draw.DrawPrimitive +import org.openrndr.draw.shadeStyle +import org.openrndr.extras.camera.Orbital +import org.openrndr.extras.meshgenerators.* +import org.openrndr.math.Vector2 +import org.openrndr.math.Vector3 +import org.openrndr.math.transforms.transform +import org.openrndr.shape.Circle + +fun main() { + application { + program { + extend(Orbital()) + val m = meshGenerator { + + grid(5,5, 5) { u, v, w -> + extrudeShape(Circle(0.0, 0.0, 50.0).shape, 4.0, scale = 0.1) + transform(transform{ translate(u*20.0, v*20.0, w * 20.0)} ) + } + twist(360.0/200.0, 0.0) + twist(360.0/200.0, 0.0, Vector3.UNIT_X) + twist(360.0/200.0, 0.0, Vector3.UNIT_Z) + } + extend { + drawer.shadeStyle = shadeStyle { + fragmentTransform = """ + x_fill.rgb *= v_viewNormal.z; + """.trimIndent() + } + drawer.vertexBuffer(m, DrawPrimitive.TRIANGLES) + } + } + } +} \ No newline at end of file diff --git a/orx-mesh-generators/src/main/kotlin/Cap.kt b/orx-mesh-generators/src/main/kotlin/Cap.kt index 9a17cc5f..47e8066b 100644 --- a/orx-mesh-generators/src/main/kotlin/Cap.kt +++ b/orx-mesh-generators/src/main/kotlin/Cap.kt @@ -3,6 +3,7 @@ package org.openrndr.extras.meshgenerators import org.openrndr.math.Matrix44 import org.openrndr.math.Vector2 import org.openrndr.math.Vector3 +import org.openrndr.math.YPolarity import org.openrndr.math.transforms.rotateY fun generateCap(sides: Int, radius: Double, enveloppe: List = listOf(Vector2(0.0, 0.0), Vector2(1.0, 0.0)), writer: VertexWriter) { @@ -13,7 +14,7 @@ fun generateCap(sides: Int, radius: Double, enveloppe: List = listOf(Ve val normals2D = enveloppe.zipWithNext().map { val d = it.second - it.first - d.normalized.perpendicular() + d.normalized.perpendicular(YPolarity.CCW_POSITIVE_Y) } val basePositions = cleanEnveloppe.map { Vector3(it.x, it.y, 0.0) } diff --git a/orx-mesh-generators/src/main/kotlin/Cylinder.kt b/orx-mesh-generators/src/main/kotlin/Cylinder.kt index 551efd24..cdc3d081 100644 --- a/orx-mesh-generators/src/main/kotlin/Cylinder.kt +++ b/orx-mesh-generators/src/main/kotlin/Cylinder.kt @@ -24,7 +24,7 @@ fun generateTaperedCylinder(sides: Int, segments: Int, radiusStart: Double, radi val dphi = (Math.PI * 2) / sides val ddeg = (360.0) / sides - val invertFactor = if (invert) -1.0 else 1.0 + val invertFactor = if (invert) 1.0 else -1.0 val dr = radiusEnd - radiusStart @@ -61,7 +61,7 @@ fun generateTaperedCylinder(sides: Int, segments: Int, radiusStart: Double, radi val n1 = (Matrix44.rotateZ((side+1) * ddeg) * baseNormal.xyz0).xyz.normalized * invertFactor - if (!invert) { + if (invert) { vertexWriter(Vector3(x00, y00, z0), n0, Vector2(u0, v0)) vertexWriter(Vector3(x10, y10, z0), n1, Vector2(u0, v1)) vertexWriter(Vector3(x11, y11, z1), n1, Vector2(u1, v1))