[orx-camera] Enable toggling user interaction in OrbitalControls (#276)
This commit is contained in:
@@ -38,6 +38,7 @@ kotlin {
|
|||||||
val jvmDemo by getting {
|
val jvmDemo by getting {
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation(project(":orx-camera"))
|
implementation(project(":orx-camera"))
|
||||||
|
implementation(project(":orx-mesh-generators"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,11 @@ import kotlin.math.PI
|
|||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
import kotlin.math.tan
|
import kotlin.math.tan
|
||||||
|
|
||||||
class OrbitalControls(val orbitalCamera: OrbitalCamera, val userInteraction: Boolean = true, val keySpeed: Double = 1.0) : Extension {
|
class OrbitalControls(
|
||||||
|
val orbitalCamera: OrbitalCamera,
|
||||||
|
var userInteraction: Boolean = true,
|
||||||
|
val keySpeed: Double = 1.0
|
||||||
|
) : Extension {
|
||||||
enum class STATE {
|
enum class STATE {
|
||||||
NONE,
|
NONE,
|
||||||
ROTATE,
|
ROTATE,
|
||||||
@@ -22,7 +26,7 @@ class OrbitalControls(val orbitalCamera: OrbitalCamera, val userInteraction: Boo
|
|||||||
private lateinit var lastMousePosition: Vector2
|
private lateinit var lastMousePosition: Vector2
|
||||||
|
|
||||||
private fun mouseScrolled(event: MouseEvent) {
|
private fun mouseScrolled(event: MouseEvent) {
|
||||||
if (!event.propagationCancelled) {
|
if (userInteraction && !event.propagationCancelled) {
|
||||||
|
|
||||||
if (orbitalCamera.projectionType == ProjectionType.PERSPECTIVE) {
|
if (orbitalCamera.projectionType == ProjectionType.PERSPECTIVE) {
|
||||||
if (abs(event.rotation.x) > 0.1) return
|
if (abs(event.rotation.x) > 0.1) return
|
||||||
@@ -42,7 +46,7 @@ class OrbitalControls(val orbitalCamera: OrbitalCamera, val userInteraction: Boo
|
|||||||
|
|
||||||
private fun mouseMoved(event: MouseEvent) {
|
private fun mouseMoved(event: MouseEvent) {
|
||||||
|
|
||||||
if (!event.propagationCancelled) {
|
if (userInteraction && !event.propagationCancelled) {
|
||||||
if (state == STATE.NONE) return
|
if (state == STATE.NONE) return
|
||||||
val delta = lastMousePosition - event.position
|
val delta = lastMousePosition - event.position
|
||||||
lastMousePosition = event.position
|
lastMousePosition = event.position
|
||||||
@@ -67,7 +71,7 @@ class OrbitalControls(val orbitalCamera: OrbitalCamera, val userInteraction: Boo
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun mouseButtonDown(event: MouseEvent) {
|
private fun mouseButtonDown(event: MouseEvent) {
|
||||||
if (!event.propagationCancelled) {
|
if (userInteraction && !event.propagationCancelled) {
|
||||||
val previousState = state
|
val previousState = state
|
||||||
|
|
||||||
when (event.button) {
|
when (event.button) {
|
||||||
@@ -90,7 +94,7 @@ class OrbitalControls(val orbitalCamera: OrbitalCamera, val userInteraction: Boo
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun keyPressed(keyEvent: KeyEvent) {
|
fun keyPressed(keyEvent: KeyEvent) {
|
||||||
if (!keyEvent.propagationCancelled) {
|
if (userInteraction && !keyEvent.propagationCancelled) {
|
||||||
if (keyEvent.key == KEY_ARROW_RIGHT) {
|
if (keyEvent.key == KEY_ARROW_RIGHT) {
|
||||||
orbitalCamera.pan(keySpeed, 0.0, 0.0)
|
orbitalCamera.pan(keySpeed, 0.0, 0.0)
|
||||||
}
|
}
|
||||||
@@ -138,7 +142,6 @@ class OrbitalControls(val orbitalCamera: OrbitalCamera, val userInteraction: Boo
|
|||||||
override fun setup(program: Program) {
|
override fun setup(program: Program) {
|
||||||
this.program = program
|
this.program = program
|
||||||
|
|
||||||
if (userInteraction) {
|
|
||||||
program.mouse.moved.listen { mouseMoved(it) }
|
program.mouse.moved.listen { mouseMoved(it) }
|
||||||
program.mouse.buttonDown.listen { mouseButtonDown(it) }
|
program.mouse.buttonDown.listen { mouseButtonDown(it) }
|
||||||
program.mouse.buttonUp.listen { state = STATE.NONE }
|
program.mouse.buttonUp.listen { state = STATE.NONE }
|
||||||
@@ -147,4 +150,3 @@ class OrbitalControls(val orbitalCamera: OrbitalCamera, val userInteraction: Boo
|
|||||||
program.keyboard.keyRepeat.listen { keyPressed(it) }
|
program.keyboard.keyRepeat.listen { keyPressed(it) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
25
orx-camera/src/demo/kotlin/DemoCamera2D_01.kt
Normal file
25
orx-camera/src/demo/kotlin/DemoCamera2D_01.kt
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
import org.openrndr.application
|
||||||
|
import org.openrndr.color.ColorRGBa
|
||||||
|
import org.openrndr.draw.loadFont
|
||||||
|
import org.openrndr.extra.camera.Camera2D
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # Camera2D demo
|
||||||
|
*
|
||||||
|
* click and drag the mouse for panning, use the mouse wheel for zooming
|
||||||
|
*/
|
||||||
|
fun main() = application {
|
||||||
|
program {
|
||||||
|
val font = loadFont("demo-data/fonts/IBMPlexMono-Regular.ttf", 72.0)
|
||||||
|
|
||||||
|
extend(Camera2D())
|
||||||
|
extend {
|
||||||
|
drawer.circle(drawer.bounds.center, 300.0)
|
||||||
|
|
||||||
|
drawer.fontMap = font
|
||||||
|
drawer.fill = ColorRGBa.PINK
|
||||||
|
drawer.text("click and drag mouse", 50.0, 400.0)
|
||||||
|
drawer.text("use mouse wheel", 50.0, 500.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
52
orx-camera/src/demo/kotlin/DemoOrbitalCamera01.kt
Normal file
52
orx-camera/src/demo/kotlin/DemoOrbitalCamera01.kt
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
import org.openrndr.application
|
||||||
|
import org.openrndr.color.ColorRGBa
|
||||||
|
import org.openrndr.draw.DrawPrimitive
|
||||||
|
import org.openrndr.extra.camera.AxisHelper
|
||||||
|
import org.openrndr.extra.camera.GridHelper
|
||||||
|
import org.openrndr.extra.camera.OrbitalCamera
|
||||||
|
import org.openrndr.extra.camera.OrbitalControls
|
||||||
|
import org.openrndr.extra.meshgenerators.boxMesh
|
||||||
|
import org.openrndr.extra.meshgenerators.sphereMesh
|
||||||
|
import org.openrndr.math.Vector3
|
||||||
|
|
||||||
|
fun main() = application {
|
||||||
|
program {
|
||||||
|
val camera = OrbitalCamera(
|
||||||
|
Vector3.UNIT_Z * 90.0, Vector3.ZERO, 90.0, 0.1, 5000.0
|
||||||
|
)
|
||||||
|
val controls = OrbitalControls(camera, keySpeed = 10.0)
|
||||||
|
controls.userInteraction = false
|
||||||
|
|
||||||
|
val sphere = sphereMesh(radius = 25.0)
|
||||||
|
val cube = boxMesh(20.0, 20.0, 5.0, 5, 5, 2)
|
||||||
|
|
||||||
|
extend(camera)
|
||||||
|
|
||||||
|
// shows XYZ axes as RGB lines
|
||||||
|
extend(AxisHelper())
|
||||||
|
|
||||||
|
// debug ground plane
|
||||||
|
extend(GridHelper(100))
|
||||||
|
|
||||||
|
// adds mouse and keyboard bindings
|
||||||
|
extend(controls)
|
||||||
|
|
||||||
|
extend {
|
||||||
|
// mouse and keyboard input can be toggled on and off
|
||||||
|
controls.userInteraction = seconds.toInt() % 4 < 2
|
||||||
|
|
||||||
|
drawer.vertexBuffer(sphere, DrawPrimitive.LINE_LOOP)
|
||||||
|
drawer.vertexBuffer(cube, DrawPrimitive.LINE_LOOP)
|
||||||
|
|
||||||
|
drawer.stroke = if(controls.userInteraction) ColorRGBa.GREEN else ColorRGBa.WHITE
|
||||||
|
drawer.fill = null
|
||||||
|
|
||||||
|
repeat(10) {
|
||||||
|
drawer.translate(0.0, 0.0, 10.0)
|
||||||
|
// Note: 2D primitives are not optimized for 3D and can
|
||||||
|
// occlude each other
|
||||||
|
drawer.circle(0.0, 0.0, 50.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user