61 lines
1.9 KiB
Kotlin
61 lines
1.9 KiB
Kotlin
import org.openrndr.WindowMultisample
|
|
import org.openrndr.application
|
|
import org.openrndr.color.rgb
|
|
import org.openrndr.draw.DrawPrimitive
|
|
import org.openrndr.draw.shadeStyle
|
|
import org.openrndr.extra.camera.Orbital
|
|
import org.openrndr.extra.meshgenerators.*
|
|
import org.openrndr.extra.noise.simplex
|
|
import org.openrndr.math.Vector3
|
|
|
|
/**
|
|
* Generates a grid of grids of boxes.
|
|
* Interactive orbital camera.
|
|
*
|
|
*/
|
|
fun main() = application {
|
|
configure {
|
|
width = 720
|
|
height = 720
|
|
multisample = WindowMultisample.SampleCount(8)
|
|
}
|
|
program {
|
|
extend(Orbital()) {
|
|
this.eye = Vector3(3.0, 3.0, 10.0)
|
|
this.fov = 60.0
|
|
}
|
|
val m = buildTriangleMesh {
|
|
grid(5, 5) { u, v ->
|
|
isolated {
|
|
grid(3, 3, 3, GridCoordinates.UNIPOLAR) { x, y, z ->
|
|
val pos0 = Vector3(u, v, 0.0) * 10.0
|
|
val pos1 = Vector3(x, y, z) * 2.0
|
|
val pos2 = pos0 + pos1 + Vector3(
|
|
y * 0.12 + z * 0.3,
|
|
x * 0.14 + z * 0.15,
|
|
x * 0.16 + y * 0.17
|
|
)
|
|
// Drop some boxes
|
|
if (simplex(0, pos1 * 0.5 + pos0 * 0.05) > 0) {
|
|
translate(pos2)
|
|
color = rgb(x, y, z)
|
|
box(1.2, 1.2, 1.2)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
extend {
|
|
drawer.shadeStyle = shadeStyle {
|
|
fragmentTransform = """
|
|
x_fill = va_color;
|
|
vec3 s = sin(v_worldPosition.xyz * 2.5);
|
|
x_fill.rgb += s * 0.1 - 0.1;
|
|
""".trimIndent()
|
|
}
|
|
drawer.vertexBuffer(m, DrawPrimitive.TRIANGLES)
|
|
}
|
|
}
|
|
}
|