Add Orbital
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package org.openrndr.extras.camera
|
package org.openrndr.extras.camera
|
||||||
|
|
||||||
import org.openrndr.Extension
|
import org.openrndr.Extension
|
||||||
|
import org.openrndr.Program
|
||||||
import org.openrndr.color.ColorRGBa
|
import org.openrndr.color.ColorRGBa
|
||||||
import org.openrndr.draw.*
|
import org.openrndr.draw.*
|
||||||
import org.openrndr.math.Vector3
|
import org.openrndr.math.Vector3
|
||||||
@@ -31,6 +32,10 @@ class Debug3D(val size: Int = 10, val divisions: Int = 10) : Extension {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun beforeDraw(drawer: Drawer, program: Program) {
|
||||||
|
draw(drawer)
|
||||||
|
}
|
||||||
|
|
||||||
fun draw(drawer: Drawer) {
|
fun draw(drawer: Drawer) {
|
||||||
drawer.isolated {
|
drawer.isolated {
|
||||||
drawer.fill = ColorRGBa.WHITE
|
drawer.fill = ColorRGBa.WHITE
|
||||||
|
|||||||
36
orx-camera/src/main/kotlin/Orbital.kt
Normal file
36
orx-camera/src/main/kotlin/Orbital.kt
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
package org.openrndr.extras.camera
|
||||||
|
|
||||||
|
import org.openrndr.Extension
|
||||||
|
import org.openrndr.Program
|
||||||
|
import org.openrndr.draw.Drawer
|
||||||
|
import org.openrndr.math.Vector3
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extension that provides orbital camera view and controls.
|
||||||
|
*/
|
||||||
|
class Orbital : Extension {
|
||||||
|
override var enabled: Boolean = true
|
||||||
|
|
||||||
|
var eye = Vector3.UNIT_Z * 10.0
|
||||||
|
var lookAt = Vector3.ZERO
|
||||||
|
var near = 0.1
|
||||||
|
var far = 1000.0
|
||||||
|
var fov = 90.0
|
||||||
|
var userInteraction = true
|
||||||
|
var keySpeed = 1.0
|
||||||
|
|
||||||
|
val camera by lazy { OrbitalCamera(eye, lookAt, fov, near, far) }
|
||||||
|
val controls by lazy { OrbitalControls(camera, userInteraction, keySpeed) }
|
||||||
|
|
||||||
|
override fun setup(program: Program) {
|
||||||
|
controls.setup(program)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun beforeDraw(drawer: Drawer, program: Program) {
|
||||||
|
camera.beforeDraw(drawer, program)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun afterDraw(drawer: Drawer, program: Program) {
|
||||||
|
camera.afterDraw(drawer, program)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@ package org.openrndr.extras.camera
|
|||||||
|
|
||||||
import org.openrndr.Extension
|
import org.openrndr.Extension
|
||||||
import org.openrndr.Program
|
import org.openrndr.Program
|
||||||
|
import org.openrndr.draw.DepthTestPass
|
||||||
import org.openrndr.draw.Drawer
|
import org.openrndr.draw.Drawer
|
||||||
import org.openrndr.math.Matrix44
|
import org.openrndr.math.Matrix44
|
||||||
import org.openrndr.math.Spherical
|
import org.openrndr.math.Spherical
|
||||||
@@ -9,15 +10,17 @@ import org.openrndr.math.Vector3
|
|||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
import org.openrndr.math.transforms.lookAt as lookAt_
|
import org.openrndr.math.transforms.lookAt as lookAt_
|
||||||
|
|
||||||
class OrbitalCamera(eye: Vector3, lookAt: Vector3, var fov: Double, var near: Double = 0.1, var far: Double = 1000.0) : Extension {
|
class OrbitalCamera(eye: Vector3 = Vector3.ZERO, lookAt: Vector3 = Vector3.UNIT_Z, var fov: Double = 90.0, var near: Double = 0.1, var far: Double = 1000.0) : Extension {
|
||||||
// current position in spherical coordinates
|
// current position in spherical coordinates
|
||||||
var spherical = Spherical.fromVector(eye)
|
var spherical = Spherical.fromVector(eye)
|
||||||
private set
|
private set
|
||||||
var lookAt = lookAt
|
var lookAt = lookAt
|
||||||
private set
|
private set
|
||||||
|
|
||||||
|
var depthTest = true
|
||||||
|
|
||||||
private var sphericalEnd = Spherical.fromVector(eye)
|
private var sphericalEnd = Spherical.fromVector(eye)
|
||||||
private var lookAtEnd = lookAt.copy()
|
private var lookAtEnd = lookAt
|
||||||
private var dirty: Boolean = true
|
private var dirty: Boolean = true
|
||||||
private var lastSeconds: Double = -1.0
|
private var lastSeconds: Double = -1.0
|
||||||
|
|
||||||
@@ -89,6 +92,12 @@ class OrbitalCamera(eye: Vector3, lookAt: Vector3, var fov: Double, var near: Do
|
|||||||
|
|
||||||
fun zoom(degrees: Double) {
|
fun zoom(degrees: Double) {
|
||||||
fovEnd += degrees
|
fovEnd += degrees
|
||||||
|
dirty = true
|
||||||
|
}
|
||||||
|
|
||||||
|
fun zoomTo(degrees: Double) {
|
||||||
|
fovEnd = degrees
|
||||||
|
dirty = true
|
||||||
}
|
}
|
||||||
|
|
||||||
fun update(timeDelta: Double) {
|
fun update(timeDelta: Double) {
|
||||||
@@ -143,6 +152,11 @@ class OrbitalCamera(eye: Vector3, lookAt: Vector3, var fov: Double, var near: Do
|
|||||||
|
|
||||||
drawer.perspective(fov, program.window.size.x / program.window.size.y, near, far)
|
drawer.perspective(fov, program.window.size.x / program.window.size.y, near, far)
|
||||||
drawer.view = viewMatrix()
|
drawer.view = viewMatrix()
|
||||||
|
|
||||||
|
if (depthTest) {
|
||||||
|
drawer.drawStyle.depthWrite = true
|
||||||
|
drawer.drawStyle.depthTestPass = DepthTestPass.LESS_OR_EQUAL
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun afterDraw(drawer: Drawer, program: Program) {
|
override fun afterDraw(drawer: Drawer, program: Program) {
|
||||||
|
|||||||
Reference in New Issue
Block a user