From ad20e384b947d1ac881c90b7306adfef50c2cb84 Mon Sep 17 00:00:00 2001 From: luboslenco Date: Thu, 20 Jun 2019 12:53:24 +0200 Subject: [PATCH] Merge camera --- Sources/arm/App.hx | 5 +- Sources/arm/plugin/Camera.hx | 191 +++++++++++++++++++++++++++++ Sources/arm/plugin/FlyCamera.hx | 83 ------------- Sources/arm/plugin/OrbitCamera.hx | 99 --------------- Sources/arm/plugin/RotateCamera.hx | 80 ------------ Sources/arm/util/ViewportUtil.hx | 6 +- 6 files changed, 196 insertions(+), 268 deletions(-) create mode 100644 Sources/arm/plugin/Camera.hx delete mode 100644 Sources/arm/plugin/FlyCamera.hx delete mode 100644 Sources/arm/plugin/OrbitCamera.hx delete mode 100644 Sources/arm/plugin/RotateCamera.hx diff --git a/Sources/arm/App.hx b/Sources/arm/App.hx index 39703858..9c3eedfa 100644 --- a/Sources/arm/App.hx +++ b/Sources/arm/App.hx @@ -22,6 +22,7 @@ import arm.util.Path; import arm.util.RenderUtil; import arm.data.MaterialSlot; import arm.data.ConstData; +import arm.plugin.Camera; import arm.Config; import arm.Tool; using StringTools; @@ -140,9 +141,7 @@ class App { new UITrait(); new UINodes(); new UIView2D(); - root.addTrait(new arm.plugin.FlyCamera()); - root.addTrait(new arm.plugin.OrbitCamera()); - root.addTrait(new arm.plugin.RotateCamera()); + new Camera(); iron.App.notifyOnRender2D(@:privateAccess UITrait.inst.renderCursor); iron.App.notifyOnUpdate(@:privateAccess UINodes.inst.update); iron.App.notifyOnRender2D(@:privateAccess UINodes.inst.render); diff --git a/Sources/arm/plugin/Camera.hx b/Sources/arm/plugin/Camera.hx new file mode 100644 index 00000000..1b73afc3 --- /dev/null +++ b/Sources/arm/plugin/Camera.hx @@ -0,0 +1,191 @@ +package arm.plugin; + +import iron.system.Input; +import iron.system.Time; +import iron.math.Vec4; +import arm.ui.UITrait; +import arm.util.ViewportUtil; + +class Camera { + + public static var inst:Camera; + public static var dist = 0.0; + static inline var speed = 2.0; + var redraws = 0; + var first = true; + var dir = new Vec4(); + var xvec = new Vec4(); + var yvec = new Vec4(); + var ease = 1.0; + + public function new() { + inst = this; + var mouse = Input.getMouse(); + var kb = Input.getKeyboard(); + + iron.App.notifyOnUpdate(function() { + if (Input.occupied || + !arm.App.uienabled || + arm.App.isDragging || + UITrait.inst.isScrolling || + mouse.x < 0 || + mouse.x > iron.App.w()) return; + + var camera = iron.Scene.active.camera; + + if (first) { + first = false; + reset(); + } + + var controls = UITrait.inst.cameraControls; + if (controls == 0) { + if (mouse.wheelDelta != 0) { + redraws = 2; + camera.transform.move(camera.look(), mouse.wheelDelta * (-0.1)); + } + + if (mouse.down("middle") || (mouse.down("right") && kb.down("space"))) { + redraws = 2; + if (kb.down("control")) { + camera.transform.move(camera.look(), mouse.movementX / 75); + } + else { + var look = camera.transform.look().normalize().mult(mouse.movementY / 150); + var right = camera.transform.right().normalize().mult(-mouse.movementX / 150); + camera.transform.loc.add(look); + camera.transform.loc.add(right); + camera.buildMatrix(); + } + } + + if ((mouse.down("right") && !kb.down("space")) || (mouse.down("left") && kb.down("control"))) { + redraws = 2; + var t = UITrait.inst.selectedObject.transform; + + // Rotate X + var up = t.up().normalize(); + t.rotate(up, mouse.movementX / 100); + + // Rotate Y + if (!kb.down("shift")) { + var right = camera.rightWorld().normalize(); + t.rotate(right, mouse.movementY / 100); + t.buildMatrix(); + + if (t.up().z < 0) { + t.rotate(right, -mouse.movementY / 100); + } + } + } + } + else if (controls == 1) { + + if (mouse.wheelDelta != 0) { + redraws = 2; + var f = mouse.wheelDelta * (-0.1); + camera.transform.move(camera.look(), f); + dist -= f; + } + + if (mouse.down("middle") || (mouse.down("right") && kb.down("space"))) { + redraws = 2; + if (kb.down("shift")) { + var light = iron.Scene.active.lights[0]; + var m = iron.math.Mat4.identity(); + m.self = kha.math.FastMatrix4.rotationZ(mouse.movementX / 100); + light.transform.local.multmat(m); + light.transform.decompose(); + } + else if (kb.down("control")) { + var f = mouse.movementX / 75; + camera.transform.move(camera.look(), f); + dist -= f; + } + else { + var look = camera.transform.look().normalize().mult(mouse.movementY / 150); + var right = camera.transform.right().normalize().mult(-mouse.movementX / 150); + camera.transform.loc.add(look); + camera.transform.loc.add(right); + camera.buildMatrix(); + } + } + + if (mouse.down("right") || (mouse.down("left") && kb.down("control"))) { + redraws = 2; + camera.transform.move(camera.lookWorld(), dist); + camera.transform.rotate(new iron.math.Vec4(0, 0, 1), -mouse.movementX / 100); + + // Rotate Y + if (!kb.down("shift")) { + camera.transform.rotate(camera.rightWorld(), -mouse.movementY / 100); + if (camera.upWorld().z < 0) { + camera.transform.rotate(camera.rightWorld(), mouse.movementY / 100); + } + } + + camera.transform.move(camera.lookWorld(), -dist); + } + } + else if (controls == 2 && mouse.down("right")) { + + var moveForward = kb.down("w") || kb.down("up") || mouse.wheelDelta < 0; + var moveBackward = kb.down("s") || kb.down("down") || mouse.wheelDelta > 0; + var strafeLeft = kb.down("a") || kb.down("left"); + var strafeRight = kb.down("d") || kb.down("right"); + var strafeUp = kb.down("e"); + var strafeDown = kb.down("q"); + var fast = kb.down("shift") ? 2.0 : (kb.down("alt") ? 0.5 : 1.0); + if (mouse.wheelDelta != 0) { + fast *= Math.abs(mouse.wheelDelta) * 4.0; + } + + if (moveForward || moveBackward || strafeRight || strafeLeft || strafeUp || strafeDown) { + ease += Time.delta * 15; + if (ease > 1.0) ease = 1.0; + dir.set(0, 0, 0); + if (moveForward) dir.addf(camera.look().x, camera.look().y, camera.look().z); + if (moveBackward) dir.addf(-camera.look().x, -camera.look().y, -camera.look().z); + if (strafeRight) dir.addf(camera.right().x, camera.right().y, camera.right().z); + if (strafeLeft) dir.addf(-camera.right().x, -camera.right().y, -camera.right().z); + if (strafeUp) dir.addf(0, 0, 1); + if (strafeDown) dir.addf(0, 0, -1); + } + else { + ease -= Time.delta * 20.0 * ease; + if (ease < 0.0) ease = 0.0; + } + + var d = Time.delta * speed * fast * ease; + if (d > 0.0) { + UITrait.inst.ddirty = 2; + camera.transform.move(dir, d); + + if (UITrait.inst.cameraType == 1) { + ViewportUtil.updateCameraType(UITrait.inst.cameraType); + } + } + + if (mouse.down("right")) { + UITrait.inst.ddirty = 2; + camera.transform.rotate(Vec4.zAxis(), -mouse.movementX / 200); + camera.transform.rotate(camera.right(), -mouse.movementY / 200); + } + } + + if (redraws > 0) { + redraws--; + UITrait.inst.ddirty = 2; + + if (UITrait.inst.cameraType == 1) { + ViewportUtil.updateCameraType(UITrait.inst.cameraType); + } + } + }); + } + + public function reset() { + var camera = iron.Scene.active.camera; + dist = camera.transform.loc.length(); + } +} diff --git a/Sources/arm/plugin/FlyCamera.hx b/Sources/arm/plugin/FlyCamera.hx deleted file mode 100644 index 4aca0c35..00000000 --- a/Sources/arm/plugin/FlyCamera.hx +++ /dev/null @@ -1,83 +0,0 @@ -package arm.plugin; - -import iron.system.Input; -import iron.system.Time; -import iron.math.Vec4; -import arm.ui.UITrait; -import arm.util.ViewportUtil; - -class FlyCamera extends iron.Trait { - - public static var inst:FlyCamera; - static inline var speed = 2.0; - var dir = new Vec4(); - var xvec = new Vec4(); - var yvec = new Vec4(); - var ease = 1.0; - - public function new() { - super(); - inst = this; - - var keyboard = Input.getKeyboard(); - var mouse = Input.getMouse(); - // var gamepad = Input.getGamepad(); - - notifyOnUpdate(function() { - - if (Input.occupied || - !arm.App.uienabled || - arm.App.isDragging || - UITrait.inst.isScrolling || - UITrait.inst.cameraControls != 2 || - mouse.x < 0 || - mouse.x > iron.App.w() || - !mouse.down("right")) return; - - var camera = iron.Scene.active.camera; - - var moveForward = keyboard.down("w") || keyboard.down("up") || mouse.wheelDelta < 0; - var moveBackward = keyboard.down("s") || keyboard.down("down") || mouse.wheelDelta > 0; - var strafeLeft = keyboard.down("a") || keyboard.down("left"); - var strafeRight = keyboard.down("d") || keyboard.down("right"); - var strafeUp = keyboard.down("e"); - var strafeDown = keyboard.down("q"); - var fast = keyboard.down("shift") ? 2.0 : (keyboard.down("alt") ? 0.5 : 1.0); - if (mouse.wheelDelta != 0) { - fast *= Math.abs(mouse.wheelDelta) * 4.0; - } - - if (moveForward || moveBackward || strafeRight || strafeLeft || strafeUp || strafeDown) { - ease += Time.delta * 15; - if (ease > 1.0) ease = 1.0; - dir.set(0, 0, 0); - if (moveForward) dir.addf(camera.look().x, camera.look().y, camera.look().z); - if (moveBackward) dir.addf(-camera.look().x, -camera.look().y, -camera.look().z); - if (strafeRight) dir.addf(camera.right().x, camera.right().y, camera.right().z); - if (strafeLeft) dir.addf(-camera.right().x, -camera.right().y, -camera.right().z); - if (strafeUp) dir.addf(0, 0, 1); - if (strafeDown) dir.addf(0, 0, -1); - } - else { - ease -= Time.delta * 20.0 * ease; - if (ease < 0.0) ease = 0.0; - } - - var d = Time.delta * speed * fast * ease; - if (d > 0.0) { - UITrait.inst.ddirty = 2; - camera.transform.move(dir, d); - - if (UITrait.inst.cameraType == 1) { - ViewportUtil.updateCameraType(UITrait.inst.cameraType); - } - } - - if (mouse.down("right")) { - UITrait.inst.ddirty = 2; - camera.transform.rotate(Vec4.zAxis(), -mouse.movementX / 200); - camera.transform.rotate(camera.right(), -mouse.movementY / 200); - } - }); - } -} diff --git a/Sources/arm/plugin/OrbitCamera.hx b/Sources/arm/plugin/OrbitCamera.hx deleted file mode 100644 index b65b570d..00000000 --- a/Sources/arm/plugin/OrbitCamera.hx +++ /dev/null @@ -1,99 +0,0 @@ -package arm.plugin; - -import iron.system.Input; -import arm.ui.UITrait; -import arm.util.ViewportUtil; - -class OrbitCamera extends iron.Trait { - - public static var inst:OrbitCamera; - public static var dist = 0.0; - var redraws = 0; - var first = true; - - public function new() { - super(); - inst = this; - - var mouse = Input.getMouse(); - var kb = Input.getKeyboard(); - - notifyOnUpdate(function() { - - if (Input.occupied || - !arm.App.uienabled || - arm.App.isDragging || - UITrait.inst.isScrolling || - UITrait.inst.cameraControls != 1 || - mouse.x < 0 || - mouse.x > iron.App.w()) return; - - var camera = iron.Scene.active.camera; - - if (first) { - first = false; - reset(); - } - - if (mouse.wheelDelta != 0) { - redraws = 2; - var f = mouse.wheelDelta * (-0.1); - camera.transform.move(camera.look(), f); - dist -= f; - } - - if (mouse.down("middle") || (mouse.down("right") && kb.down("space"))) { - redraws = 2; - if (kb.down("shift")) { - var light = iron.Scene.active.lights[0]; - var m = iron.math.Mat4.identity(); - m.self = kha.math.FastMatrix4.rotationZ(mouse.movementX / 100); - light.transform.local.multmat(m); - light.transform.decompose(); - } - else if (kb.down("control")) { - var f = mouse.movementX / 75; - camera.transform.move(camera.look(), f); - dist -= f; - } - else { - var look = camera.transform.look().normalize().mult(mouse.movementY / 150); - var right = camera.transform.right().normalize().mult(-mouse.movementX / 150); - camera.transform.loc.add(look); - camera.transform.loc.add(right); - camera.buildMatrix(); - } - } - - if (mouse.down("right") || (mouse.down("left") && kb.down("control"))) { - redraws = 2; - camera.transform.move(camera.lookWorld(), dist); - camera.transform.rotate(new iron.math.Vec4(0, 0, 1), -mouse.movementX / 100); - - // Rotate Y - if (!kb.down("shift")) { - camera.transform.rotate(camera.rightWorld(), -mouse.movementY / 100); - if (camera.upWorld().z < 0) { - camera.transform.rotate(camera.rightWorld(), mouse.movementY / 100); - } - } - - camera.transform.move(camera.lookWorld(), -dist); - } - - if (redraws > 0) { - redraws--; - UITrait.inst.ddirty = 2; - - if (UITrait.inst.cameraType == 1) { - ViewportUtil.updateCameraType(UITrait.inst.cameraType); - } - } - }); - } - - public function reset() { - var camera = iron.Scene.active.camera; - dist = camera.transform.loc.length(); - } -} diff --git a/Sources/arm/plugin/RotateCamera.hx b/Sources/arm/plugin/RotateCamera.hx deleted file mode 100644 index 7d5e2261..00000000 --- a/Sources/arm/plugin/RotateCamera.hx +++ /dev/null @@ -1,80 +0,0 @@ -package arm.plugin; - -import iron.system.Input; -import arm.ui.UITrait; -import arm.util.ViewportUtil; - -class RotateCamera extends iron.Trait { - - public static var inst:RotateCamera; - var redraws = 0; - - public function new() { - super(); - inst = this; - - var mouse = Input.getMouse(); - var kb = Input.getKeyboard(); - - notifyOnUpdate(function() { - - if (Input.occupied || - !arm.App.uienabled || - arm.App.isDragging || - UITrait.inst.isScrolling || - UITrait.inst.cameraControls != 0 || - mouse.x < 0 || - mouse.x > iron.App.w()) return; - - var camera = iron.Scene.active.camera; - - if (mouse.wheelDelta != 0) { - redraws = 2; - camera.transform.move(camera.look(), mouse.wheelDelta * (-0.1)); - } - - if (mouse.down("middle") || (mouse.down("right") && kb.down("space"))) { - redraws = 2; - if (kb.down("control")) { - camera.transform.move(camera.look(), mouse.movementX / 75); - } - else { - var look = camera.transform.look().normalize().mult(mouse.movementY / 150); - var right = camera.transform.right().normalize().mult(-mouse.movementX / 150); - camera.transform.loc.add(look); - camera.transform.loc.add(right); - camera.buildMatrix(); - } - } - - if ((mouse.down("right") && !kb.down("space")) || (mouse.down("left") && kb.down("control"))) { - redraws = 2; - var t = UITrait.inst.selectedObject.transform; - - // Rotate X - var up = t.up().normalize(); - t.rotate(up, mouse.movementX / 100); - - // Rotate Y - if (!kb.down("shift")) { - var right = camera.rightWorld().normalize(); - t.rotate(right, mouse.movementY / 100); - t.buildMatrix(); - - if (t.up().z < 0) { - t.rotate(right, -mouse.movementY / 100); - } - } - } - - if (redraws > 0) { - redraws--; - UITrait.inst.ddirty = 2; - - if (UITrait.inst.cameraType == 1) { - ViewportUtil.updateCameraType(UITrait.inst.cameraType); - } - } - }); - } -} diff --git a/Sources/arm/util/ViewportUtil.hx b/Sources/arm/util/ViewportUtil.hx index cb0781f2..87ddd94a 100644 --- a/Sources/arm/util/ViewportUtil.hx +++ b/Sources/arm/util/ViewportUtil.hx @@ -31,7 +31,7 @@ class ViewportUtil { cam.data.raw.ortho = null; cam.buildProjection(); UITrait.inst.ddirty = 2; - arm.plugin.OrbitCamera.inst.reset(); + arm.plugin.Camera.inst.reset(); break; } } @@ -47,12 +47,12 @@ class ViewportUtil { cam.transform.buildMatrix(); cam.buildProjection(); UITrait.inst.ddirty = 2; - arm.plugin.OrbitCamera.inst.reset(); + arm.plugin.Camera.inst.reset(); } public static function orbit(x:Float, y:Float) { var cam = Scene.active.camera; - var dist = arm.plugin.OrbitCamera.dist; + var dist = arm.plugin.Camera.dist; cam.transform.move(cam.lookWorld(), dist); cam.transform.rotate(new Vec4(0, 0, 1), x); cam.transform.rotate(cam.rightWorld(), y);