3D graphics
Draw a rotating 3D box with a minimal shadeStyle to simulate lighting. Lower level approach.
fun main() = application {
configure {
multisample = WindowMultisample.SampleCount(4)
}
program {
val cube = boxMesh(140.0, 70.0, 10.0)
extend {
drawer.perspective(60.0, width * 1.0 / height, 0.01, 1000.0)
drawer.depthWrite = true
drawer.depthTestPass = DepthTestPass.LESS_OR_EQUAL
drawer.fill = ColorRGBa.PINK
drawer.shadeStyle = shadeStyle {
fragmentTransform = """
vec3 lightDir = normalize(vec3(0.3, 1.0, 0.5));
float l = dot(va_normal, lightDir) * 0.4 + 0.5;
x_fill.rgb *= l;
""".trimIndent()
}
drawer.translate(0.0, 0.0, -150.0)
drawer.rotate(Vector3.UNIT_X, seconds * 15 + 30)
drawer.rotate(Vector3.UNIT_Y, seconds * 5 + 60)
drawer.vertexBuffer(cube, DrawPrimitive.TRIANGLES)
}
}
}
Draw a rotating 3D box with a minimal shadeStyle to simulate lighting. Uses Orbital to simplify creating a 3D camera which can be controlled with the mouse and the keyboard.
fun main() = application {
configure {
multisample = WindowMultisample.SampleCount(4)
}
program {
val cube = boxMesh(140.0, 70.0, 10.0)
val cam = Orbital()
cam.eye = -Vector3.UNIT_Z * 150.0
extend(cam)
extend {
drawer.fill = ColorRGBa.PINK
drawer.shadeStyle = shadeStyle {
fragmentTransform = """
vec3 lightDir = normalize(vec3(0.3, 1.0, 0.5));
float l = dot(va_normal, lightDir) * 0.4 + 0.5;
x_fill.rgb *= l;
""".trimIndent()
}
drawer.vertexBuffer(cube, DrawPrimitive.TRIANGLES)
}
}
}
Draw ten 2D rectangles in 3D space.
fun main() = application {
configure {
multisample = WindowMultisample.SampleCount(4)
}
program {
val cam = Orbital()
cam.eye = Vector3.UNIT_Z * 150.0
cam.camera.depthTest = false
extend(cam)
extend {
drawer.fill = null
drawer.stroke = ColorRGBa.PINK
repeat(10) {
drawer.rectangle(Rectangle.fromCenter(Vector2.ZERO, 150.0))
drawer.translate(Vector3.UNIT_Z * 10.0)
}
}
}
}
2D drawing operations like drawer.rectangle, drawer.contour, etc. can have depth related occlusion issues, as they are not designed for 3D usage. To avoid such issues you can create your own vertex buffers and meshes.