package phenax.extensions import org.openrndr.* import org.openrndr.color.* import org.openrndr.draw.* import org.openrndr.math.Vector3 import phenax.utils.recordingEnabled enum class ActionType { PAN, LIGHT_MOVE } class CameraManager : Extension { override var enabled: Boolean = true public var cameraPosition: Vector3 = Vector3(0.0, 1.0, 0.0) public var lightPosition: Vector3 = Vector3(1.0, 2.0, 1.0) var font: FontImageMap? = null var actionType: ActionType? = null var lastPos: Vector3? = null override fun setup(program: Program) { if (recordingEnabled) return font = program.loadFont("data/fonts/default.otf", 16.0) program.keyboard.keyDown.listen { if (it.key == KEY_ESCAPE) program.application.exit() } program.mouse.moved.listen { val dimens = Vector3(program.width.toDouble(), program.height.toDouble(), 1.0) val pos = (Vector3(it.position.x, -it.position.y, 0.0) - dimens / 2.0).div(dimens) if (actionType == ActionType.PAN) { lastPos?.let { lastPos -> cameraPosition -= (pos - lastPos) } } else if (actionType == ActionType.LIGHT_MOVE) { lastPos?.let { lastPos -> lightPosition += (pos - lastPos) } } actionType?.let { lastPos = pos } } program.mouse.buttonDown.listen { val isCtrl = KeyModifier.CTRL in it.modifiers actionType = if (isCtrl) ActionType.LIGHT_MOVE else ActionType.PAN } program.mouse.scrolled.listen { val isCtrl = KeyModifier.CTRL in it.modifiers if (isCtrl) { lightPosition += Vector3(0.0, 0.0, it.rotation.y * 0.1) } else { cameraPosition += Vector3(0.0, 0.0, it.rotation.y * 0.1) } } program.mouse.buttonUp.listen { actionType = null lastPos = null } } fun setUniforms(cs: ComputeShader) { cs.uniform("camera_position", cameraPosition) cs.uniform("primary_light_position", lightPosition) } override fun beforeDraw(drawer: Drawer, program: Program) {} override fun afterDraw(drawer: Drawer, program: Program) { if (recordingEnabled) return drawer.fontMap = font drawer.fill = ColorRGBa.WHITE drawer.text( "C: %.2f %.2f %.2f".format(cameraPosition.x, cameraPosition.y, cameraPosition.z), 8.0, 16.0 ) drawer.text( "L: %.2f %.2f %.2f".format(lightPosition.x, lightPosition.y, lightPosition.z), 8.0, 32.0 ) } }