[orx-camera] Add rotation to Camera2D (#283)

This commit is contained in:
Abe Pazos
2022-12-22 10:38:40 +00:00
committed by GitHub
parent bf2614ebc6
commit beb53bbde7

View File

@@ -1,18 +1,22 @@
package org.openrndr.extra.camera package org.openrndr.extra.camera
import org.openrndr.Extension import org.openrndr.Extension
import org.openrndr.MouseButton
import org.openrndr.MouseEvents import org.openrndr.MouseEvents
import org.openrndr.Program import org.openrndr.Program
import org.openrndr.draw.Drawer import org.openrndr.draw.Drawer
import org.openrndr.draw.RenderTarget import org.openrndr.draw.RenderTarget
import org.openrndr.events.Event import org.openrndr.events.Event
import org.openrndr.math.Matrix44 import org.openrndr.math.Matrix44
import org.openrndr.math.Vector2
import org.openrndr.math.transforms.buildTransform import org.openrndr.math.transforms.buildTransform
/** /**
* The [Camera2D] extension enables: * The [Camera2D] extension enables panning, rotating and zooming the view
* - **panning** the view by moving the mouse while a mouse button is pressed * with the mouse:
* - **zooming** in and out by using the mouse wheel * - left click and drag to **pan**
* - right click and drag to **rotate**
* - use the mouse wheel to **zoom** in and out
* *
* Usage: `extend(Camera2D())` * Usage: `extend(Camera2D())`
*/ */
@@ -20,6 +24,7 @@ class Camera2D : Extension, ChangeEvents {
override var enabled = true override var enabled = true
var view = Matrix44.IDENTITY var view = Matrix44.IDENTITY
var rotationCenter = Vector2.ZERO
override val changed = Event<Unit>() override val changed = Event<Unit>()
@@ -34,8 +39,23 @@ class Camera2D : Extension, ChangeEvents {
get() = dirty get() = dirty
fun setupMouseEvents(mouse: MouseEvents) { fun setupMouseEvents(mouse: MouseEvents) {
mouse.buttonDown.listen {
rotationCenter = it.position
}
mouse.dragged.listen { mouse.dragged.listen {
view = buildTransform { translate(it.dragDisplacement) } * view when (it.button) {
MouseButton.LEFT -> view = buildTransform {
translate(it.dragDisplacement)
} * view
MouseButton.RIGHT -> view = buildTransform {
translate(rotationCenter)
rotate(it.dragDisplacement.x + it.dragDisplacement.y)
translate(-rotationCenter)
} * view
else -> Unit
}
dirty = true dirty = true
} }
mouse.scrolled.listen { mouse.scrolled.listen {
@@ -48,6 +68,7 @@ class Camera2D : Extension, ChangeEvents {
dirty = true dirty = true
} }
} }
override fun setup(program: Program) { override fun setup(program: Program) {
setupMouseEvents(program.mouse) setupMouseEvents(program.mouse)
} }