Add Orbital
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package org.openrndr.extras.camera
|
||||
|
||||
import org.openrndr.Extension
|
||||
import org.openrndr.Program
|
||||
import org.openrndr.color.ColorRGBa
|
||||
import org.openrndr.draw.*
|
||||
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) {
|
||||
drawer.isolated {
|
||||
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.Program
|
||||
import org.openrndr.draw.DepthTestPass
|
||||
import org.openrndr.draw.Drawer
|
||||
import org.openrndr.math.Matrix44
|
||||
import org.openrndr.math.Spherical
|
||||
@@ -9,15 +10,17 @@ import org.openrndr.math.Vector3
|
||||
import kotlin.math.abs
|
||||
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
|
||||
var spherical = Spherical.fromVector(eye)
|
||||
private set
|
||||
var lookAt = lookAt
|
||||
private set
|
||||
|
||||
var depthTest = true
|
||||
|
||||
private var sphericalEnd = Spherical.fromVector(eye)
|
||||
private var lookAtEnd = lookAt.copy()
|
||||
private var lookAtEnd = lookAt
|
||||
private var dirty: Boolean = true
|
||||
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) {
|
||||
fovEnd += degrees
|
||||
dirty = true
|
||||
}
|
||||
|
||||
fun zoomTo(degrees: Double) {
|
||||
fovEnd = degrees
|
||||
dirty = true
|
||||
}
|
||||
|
||||
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.view = viewMatrix()
|
||||
|
||||
if (depthTest) {
|
||||
drawer.drawStyle.depthWrite = true
|
||||
drawer.drawStyle.depthTestPass = DepthTestPass.LESS_OR_EQUAL
|
||||
}
|
||||
}
|
||||
|
||||
override fun afterDraw(drawer: Drawer, program: Program) {
|
||||
|
||||
Reference in New Issue
Block a user