From 7377f35a0070741d38056c7b73a47a71fd562cb6 Mon Sep 17 00:00:00 2001 From: Ricardo Matias Date: Thu, 21 Nov 2019 13:55:35 +0100 Subject: [PATCH] Turn OrbitControls into extension and add key speed modifier --- orx-camera/src/main/kotlin/OrbitalControls.kt | 51 ++++++++++--------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/orx-camera/src/main/kotlin/OrbitalControls.kt b/orx-camera/src/main/kotlin/OrbitalControls.kt index 503ea8c3..c581a281 100644 --- a/orx-camera/src/main/kotlin/OrbitalControls.kt +++ b/orx-camera/src/main/kotlin/OrbitalControls.kt @@ -3,9 +3,11 @@ package org.openrndr.extras.camera import org.openrndr.* import org.openrndr.math.Vector2 import org.openrndr.math.Vector3 +import kotlin.math.PI +import kotlin.math.abs +import kotlin.math.tan -class OrbitalControls(val orbitalCamera: OrbitalCamera, val userInteraction: Boolean = true) { - +class OrbitalControls(val orbitalCamera: OrbitalCamera, val userInteraction: Boolean = true, val keySpeed: Double = 1.0) : Extension { enum class STATE { NONE, ROTATE, @@ -13,13 +15,13 @@ class OrbitalControls(val orbitalCamera: OrbitalCamera, val userInteraction: Boo } private var state = STATE.NONE - var fov = 90.0 + var fov = orbitalCamera.fov private lateinit var program: Program private lateinit var lastMousePosition: Vector2 private fun mouseScrolled(event: MouseEvent) { - if (Math.abs(event.rotation.x) > 0.1) return + if (abs(event.rotation.x) > 0.1) return when { event.rotation.y > 0 -> orbitalCamera.dollyIn() @@ -38,15 +40,15 @@ class OrbitalControls(val orbitalCamera: OrbitalCamera, val userInteraction: Boo val offset = Vector3.fromSpherical(orbitalCamera.spherical) - orbitalCamera.lookAt // half of the fov is center to top of screen - val targetDistance = offset.length * Math.tan((fov / 2) * Math.PI / 180) + val targetDistance = offset.length * tan((fov / 2) * PI / 180) val panX = (2 * delta.x * targetDistance / program.window.size.x) val panY = (2 * delta.y * targetDistance / program.window.size.y) orbitalCamera.pan(panX, -panY, 0.0) } else { - val rotX = 2 * Math.PI * delta.x / program.window.size.x - val rotY = 2 * Math.PI * delta.y / program.window.size.y + val rotX = 2 * PI * delta.x / program.window.size.x + val rotY = 2 * PI * delta.y / program.window.size.y orbitalCamera.rotate(rotX, rotY) } @@ -75,55 +77,58 @@ class OrbitalControls(val orbitalCamera: OrbitalCamera, val userInteraction: Boo fun keyPressed(keyEvent: KeyEvent) { if (keyEvent.key == KEY_ARROW_RIGHT) { - orbitalCamera.pan(1.0, 0.0, 0.0) + orbitalCamera.pan(keySpeed, 0.0, 0.0) } if (keyEvent.key == KEY_ARROW_LEFT) { - orbitalCamera.pan(-1.0, 0.0, 0.0) + orbitalCamera.pan(-keySpeed, 0.0, 0.0) } if (keyEvent.key == KEY_ARROW_UP) { - orbitalCamera.pan(0.0, 1.0, 0.0) + orbitalCamera.pan(0.0, keySpeed, 0.0) } if (keyEvent.key == KEY_ARROW_DOWN) { - orbitalCamera.pan(0.0, -1.0, 0.0) + orbitalCamera.pan(0.0, -keySpeed, 0.0) } if (keyEvent.name == "q") { - orbitalCamera.pan(0.0, -1.0, 0.0) + orbitalCamera.pan(0.0, -keySpeed, 0.0) } if (keyEvent.name == "e") { - orbitalCamera.pan(0.0, 1.0, 0.0) + orbitalCamera.pan(0.0, keySpeed, 0.0) } if (keyEvent.name == "w") { - orbitalCamera.pan(0.0, 0.0, -1.0) + orbitalCamera.pan(0.0, 0.0, -keySpeed) } if (keyEvent.name == "s") { - orbitalCamera.pan(0.0, 0.0, 1.0) + orbitalCamera.pan(0.0, 0.0, keySpeed) } if (keyEvent.name == "a") { - orbitalCamera.pan(-1.0, 0.0, 0.0) + orbitalCamera.pan(-keySpeed, 0.0, 0.0) } if (keyEvent.name == "d") { - orbitalCamera.pan(1.0, 0.0, 0.0) + orbitalCamera.pan(keySpeed, 0.0, 0.0) } if (keyEvent.key == KEY_PAGE_UP) { - orbitalCamera.zoom(1.0) + orbitalCamera.zoom(keySpeed) } - if (keyEvent.key == KEY_PAGE_DOWN) { - orbitalCamera.zoom(-1.0) + orbitalCamera.zoom(-keySpeed) } - } - fun setup(program: Program) { + // EXTENSION + override var enabled: Boolean = true + + override fun setup(program: Program) { this.program = program - if(userInteraction) + + if (userInteraction) { program.mouse.moved.listen { mouseMoved(it) } program.mouse.buttonDown.listen { mouseButtonDown(it) } program.mouse.buttonUp.listen { state = STATE.NONE } program.mouse.scrolled.listen { mouseScrolled(it) } program.keyboard.keyDown.listen { keyPressed(it) } program.keyboard.keyRepeat.listen{ keyPressed(it) } + } } }