aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/phenax/extensions/CameraManager.kt
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2026-09-14 11:46:56 +0530
committerAkshay Nair <phenax5@gmail.com>2026-09-14 11:46:56 +0530
commit707c8896cef6bff291f5d2f3339cf9bf46ee2242 (patch)
treefd62d97b8d92c0b0cc8ff817ce2477df771d20d7 /src/main/kotlin/phenax/extensions/CameraManager.kt
parent42b66232530f933b184d446a7461e2e9f8d42bce (diff)
downloadart-playground-openrndr-707c8896cef6bff291f5d2f3339cf9bf46ee2242.tar.gz
art-playground-openrndr-707c8896cef6bff291f5d2f3339cf9bf46ee2242.zip
Refactor stuff
Diffstat (limited to '')
-rw-r--r--src/main/kotlin/phenax/extensions/CameraManager.kt85
1 files changed, 85 insertions, 0 deletions
diff --git a/src/main/kotlin/phenax/extensions/CameraManager.kt b/src/main/kotlin/phenax/extensions/CameraManager.kt
new file mode 100644
index 0000000..ab2403c
--- /dev/null
+++ b/src/main/kotlin/phenax/extensions/CameraManager.kt
@@ -0,0 +1,85 @@
+package phenax.extensions
+
+import org.openrndr.*
+import org.openrndr.color.*
+import org.openrndr.draw.*
+import org.openrndr.math.Vector3
+import phenax.utils.recordingEnabled
+
+enum class ActionType {
+ PAN,
+ LIGHT_MOVE
+}
+
+class CameraManager : Extension {
+ override var enabled: Boolean = true
+
+ public var cameraPosition: Vector3 = Vector3(0.0, 1.0, 0.0)
+ public var lightPosition: Vector3 = Vector3(1.0, 2.0, 1.0)
+
+ var font: FontImageMap? = null
+ var actionType: ActionType? = null
+ var lastPos: Vector3? = null
+
+ override fun setup(program: Program) {
+ if (recordingEnabled) return
+
+ font = program.loadFont("data/fonts/default.otf", 16.0)
+
+ program.keyboard.keyDown.listen { if (it.key == KEY_ESCAPE) program.application.exit() }
+
+ program.mouse.moved.listen {
+ val dimens = Vector3(program.width.toDouble(), program.height.toDouble(), 1.0)
+ val pos = (Vector3(it.position.x, -it.position.y, 0.0) - dimens / 2.0).div(dimens)
+ if (actionType == ActionType.PAN) {
+ lastPos?.let { lastPos -> cameraPosition -= (pos - lastPos) }
+ } else if (actionType == ActionType.LIGHT_MOVE) {
+ lastPos?.let { lastPos -> lightPosition += (pos - lastPos) }
+ }
+ actionType?.let { lastPos = pos }
+ }
+
+ program.mouse.buttonDown.listen {
+ val isCtrl = KeyModifier.CTRL in it.modifiers
+ actionType = if (isCtrl) ActionType.LIGHT_MOVE else ActionType.PAN
+ }
+
+ program.mouse.scrolled.listen {
+ val isCtrl = KeyModifier.CTRL in it.modifiers
+ if (isCtrl) {
+ lightPosition += Vector3(0.0, 0.0, it.rotation.y * 0.1)
+ } else {
+ cameraPosition += Vector3(0.0, 0.0, it.rotation.y * 0.1)
+ }
+ }
+
+ program.mouse.buttonUp.listen {
+ actionType = null
+ lastPos = null
+ }
+ }
+
+ fun setUniforms(cs: ComputeShader) {
+ cs.uniform("camera_position", cameraPosition)
+ cs.uniform("primary_light_position", lightPosition)
+ }
+
+ override fun beforeDraw(drawer: Drawer, program: Program) {}
+
+ override fun afterDraw(drawer: Drawer, program: Program) {
+ if (recordingEnabled) return
+
+ drawer.fontMap = font
+ drawer.fill = ColorRGBa.WHITE
+ drawer.text(
+ "C: %.2f %.2f %.2f".format(cameraPosition.x, cameraPosition.y, cameraPosition.z),
+ 8.0,
+ 16.0
+ )
+ drawer.text(
+ "L: %.2f %.2f %.2f".format(lightPosition.x, lightPosition.y, lightPosition.z),
+ 8.0,
+ 32.0
+ )
+ }
+}