FlyCamera.hx 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package arm;
  2. import iron.Trait;
  3. import iron.system.Input;
  4. import iron.system.Time;
  5. import iron.object.CameraObject;
  6. import iron.math.Vec4;
  7. class FlyCamera extends Trait {
  8. public static var inst:FlyCamera;
  9. public var enabled = false;
  10. static inline var speed = 2.0;
  11. var dir = new Vec4();
  12. var xvec = new Vec4();
  13. var yvec = new Vec4();
  14. var easing = true;
  15. var ease = 1.0;
  16. public function new(easing = true) {
  17. super();
  18. inst = this;
  19. this.easing = easing;
  20. notifyOnUpdate(update);
  21. }
  22. function update() {
  23. if (Input.occupied) return;
  24. if (!arm.App.uienabled) return;
  25. if (UITrait.inst.isScrolling) return;
  26. if (arm.App.isDragging) return;
  27. if (UITrait.inst.cameraType != 1) return;
  28. var keyboard = Input.getKeyboard();
  29. var gamepad = Input.getGamepad();
  30. var mouse = Input.getMouse();
  31. var camera = iron.Scene.active.camera;
  32. if (mouse.x > iron.App.w()) return;
  33. var moveForward = keyboard.down("w") || keyboard.down("up") || mouse.wheelDelta < 0;
  34. var moveBackward = keyboard.down("s") || keyboard.down("down") || mouse.wheelDelta > 0;
  35. var strafeLeft = keyboard.down("a") || keyboard.down("left");
  36. var strafeRight = keyboard.down("d") || keyboard.down("right");
  37. var strafeUp = keyboard.down("e");
  38. var strafeDown = keyboard.down("q");
  39. var fast = keyboard.down("shift") ? 2.0 : (keyboard.down("alt") ? 0.5 : 1.0);
  40. if (mouse.wheelDelta != 0) {
  41. fast *= Math.abs(mouse.wheelDelta) * 4.0;
  42. }
  43. if (moveForward || moveBackward || strafeRight || strafeLeft || strafeUp || strafeDown) {
  44. if (easing) {
  45. ease += Time.delta * 15;
  46. if (ease > 1.0) ease = 1.0;
  47. }
  48. else ease = 1.0;
  49. dir.set(0, 0, 0);
  50. if (moveForward) dir.addf(camera.look().x, camera.look().y, camera.look().z);
  51. if (moveBackward) dir.addf(-camera.look().x, -camera.look().y, -camera.look().z);
  52. if (strafeRight) dir.addf(camera.right().x, camera.right().y, camera.right().z);
  53. if (strafeLeft) dir.addf(-camera.right().x, -camera.right().y, -camera.right().z);
  54. if (strafeUp) dir.addf(0, 0, 1);
  55. if (strafeDown) dir.addf(0, 0, -1);
  56. }
  57. else {
  58. if (easing) {
  59. ease -= Time.delta * 20.0 * ease;
  60. if (ease < 0.0) ease = 0.0;
  61. }
  62. else ease = 0.0;
  63. }
  64. var d = Time.delta * speed * fast * ease;
  65. if (d > 0.0) {
  66. UITrait.inst.dirty = true;
  67. camera.move(dir, d);
  68. }
  69. if (mouse.down("right")) {
  70. UITrait.inst.dirty = true;
  71. camera.rotate(Vec4.zAxis(), -mouse.movementX / 200);
  72. camera.rotate(camera.right(), -mouse.movementY / 200);
  73. }
  74. }
  75. }