Add checks for event.propagationCancelled in OrbitalControls

This commit is contained in:
Edwin Jakobs
2020-03-09 18:50:52 +01:00
parent 0d1eae3752
commit a8fc4f34d7

View File

@@ -7,7 +7,7 @@ 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, val userInteraction: Boolean = true, val keySpeed: Double = 1.0) : Extension {
enum class STATE { enum class STATE {
NONE, NONE,
ROTATE, ROTATE,
@@ -21,98 +21,105 @@ class OrbitalControls(val orbitalCamera: OrbitalCamera , val userInteraction: Bo
private lateinit var lastMousePosition: Vector2 private lateinit var lastMousePosition: Vector2
private fun mouseScrolled(event: MouseEvent) { private fun mouseScrolled(event: MouseEvent) {
if (abs(event.rotation.x) > 0.1) return if (!event.propagationCancelled) {
if (abs(event.rotation.x) > 0.1) return
when { when {
event.rotation.y > 0 -> orbitalCamera.dollyIn() event.rotation.y > 0 -> orbitalCamera.dollyIn()
event.rotation.y < 0 -> orbitalCamera.dollyOut() event.rotation.y < 0 -> orbitalCamera.dollyOut()
}
} }
} }
private fun mouseMoved(event: MouseEvent) { private fun mouseMoved(event: MouseEvent) {
if (state == STATE.NONE) return if (!event.propagationCancelled) {
val delta = lastMousePosition - event.position if (state == STATE.NONE) return
lastMousePosition = event.position val delta = lastMousePosition - event.position
lastMousePosition = event.position
if (state == STATE.PAN) { if (state == STATE.PAN) {
val offset = Vector3.fromSpherical(orbitalCamera.spherical) - orbitalCamera.lookAt val offset = Vector3.fromSpherical(orbitalCamera.spherical) - orbitalCamera.lookAt
// half of the fov is center to top of screen // half of the fov is center to top of screen
val targetDistance = offset.length * tan((Math.toRadians((fov) / 2) ) ) val targetDistance = offset.length * tan((Math.toRadians((fov) / 2)))
val panX = (2 * delta.x * targetDistance / program.window.size.x) val panX = (2 * delta.x * targetDistance / program.window.size.x)
val panY = (2 * delta.y * targetDistance / program.window.size.y) val panY = (2 * delta.y * targetDistance / program.window.size.y)
orbitalCamera.pan(panX, -panY, 0.0) orbitalCamera.pan(panX, -panY, 0.0)
} else { } else {
val rotX = 360.0 * delta.x / program.window.size.x val rotX = 360.0 * delta.x / program.window.size.x
val rotY = 360.0 * delta.y / program.window.size.y val rotY = 360.0 * delta.y / program.window.size.y
orbitalCamera.rotate(rotX, rotY) orbitalCamera.rotate(rotX, rotY)
}
} }
} }
private fun mouseButtonDown(event: MouseEvent) { private fun mouseButtonDown(event: MouseEvent) {
val previousState = state if (!event.propagationCancelled) {
val previousState = state
when (event.button) { when (event.button) {
MouseButton.LEFT -> { MouseButton.LEFT -> {
state = STATE.ROTATE state = STATE.ROTATE
}
MouseButton.RIGHT -> {
state = STATE.PAN
}
MouseButton.CENTER -> {
}
MouseButton.NONE -> {
}
} }
MouseButton.RIGHT -> {
state = STATE.PAN
}
MouseButton.CENTER -> {
}
MouseButton.NONE -> {
}
}
if (previousState == STATE.NONE) { if (previousState == STATE.NONE) {
lastMousePosition = event.position lastMousePosition = event.position
}
} }
} }
fun keyPressed(keyEvent: KeyEvent) { fun keyPressed(keyEvent: KeyEvent) {
if (keyEvent.key == KEY_ARROW_RIGHT) { if (!keyEvent.propagationCancelled) {
orbitalCamera.pan(keySpeed, 0.0, 0.0) if (keyEvent.key == KEY_ARROW_RIGHT) {
} orbitalCamera.pan(keySpeed, 0.0, 0.0)
if (keyEvent.key == KEY_ARROW_LEFT) { }
orbitalCamera.pan(-keySpeed, 0.0, 0.0) if (keyEvent.key == KEY_ARROW_LEFT) {
} orbitalCamera.pan(-keySpeed, 0.0, 0.0)
if (keyEvent.key == KEY_ARROW_UP) { }
orbitalCamera.pan(0.0, keySpeed, 0.0) if (keyEvent.key == KEY_ARROW_UP) {
} orbitalCamera.pan(0.0, keySpeed, 0.0)
if (keyEvent.key == KEY_ARROW_DOWN) { }
orbitalCamera.pan(0.0, -keySpeed, 0.0) if (keyEvent.key == KEY_ARROW_DOWN) {
} orbitalCamera.pan(0.0, -keySpeed, 0.0)
}
if (keyEvent.name == "q") { if (keyEvent.name == "q") {
orbitalCamera.pan(0.0, -keySpeed, 0.0) orbitalCamera.pan(0.0, -keySpeed, 0.0)
} }
if (keyEvent.name == "e") { if (keyEvent.name == "e") {
orbitalCamera.pan(0.0, keySpeed, 0.0) orbitalCamera.pan(0.0, keySpeed, 0.0)
} }
if (keyEvent.name == "w") { if (keyEvent.name == "w") {
orbitalCamera.pan(0.0, 0.0, -keySpeed) orbitalCamera.pan(0.0, 0.0, -keySpeed)
} }
if (keyEvent.name == "s") { if (keyEvent.name == "s") {
orbitalCamera.pan(0.0, 0.0, keySpeed) orbitalCamera.pan(0.0, 0.0, keySpeed)
} }
if (keyEvent.name == "a") { if (keyEvent.name == "a") {
orbitalCamera.pan(-keySpeed, 0.0, 0.0) orbitalCamera.pan(-keySpeed, 0.0, 0.0)
} }
if (keyEvent.name == "d") { if (keyEvent.name == "d") {
orbitalCamera.pan(keySpeed, 0.0, 0.0) orbitalCamera.pan(keySpeed, 0.0, 0.0)
} }
if (keyEvent.key == KEY_PAGE_UP) { if (keyEvent.key == KEY_PAGE_UP) {
orbitalCamera.zoom(keySpeed) orbitalCamera.zoom(keySpeed)
} }
if (keyEvent.key == KEY_PAGE_DOWN) { if (keyEvent.key == KEY_PAGE_DOWN) {
orbitalCamera.zoom(-keySpeed) orbitalCamera.zoom(-keySpeed)
}
} }
} }
@@ -128,7 +135,7 @@ class OrbitalControls(val orbitalCamera: OrbitalCamera , val userInteraction: Bo
program.mouse.buttonUp.listen { state = STATE.NONE } program.mouse.buttonUp.listen { state = STATE.NONE }
program.mouse.scrolled.listen { mouseScrolled(it) } program.mouse.scrolled.listen { mouseScrolled(it) }
program.keyboard.keyDown.listen { keyPressed(it) } program.keyboard.keyDown.listen { keyPressed(it) }
program.keyboard.keyRepeat.listen{ keyPressed(it) } program.keyboard.keyRepeat.listen { keyPressed(it) }
} }
} }
} }