Add Orbital

This commit is contained in:
Edwin Jakobs
2019-11-24 12:38:54 +01:00
parent ead9b8a0d3
commit 471b2d5bf7
4 changed files with 393 additions and 338 deletions

View File

@@ -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

View 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)
}
}

View File

@@ -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) {