CameraController.hx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package hide.view;
  2. import hxd.Math;
  3. import hxd.Key as K;
  4. class CamController extends h3d.scene.CameraController {
  5. public var groundSnapAngle = hxd.Math.degToRad(30);
  6. var sceneEditor : hide.comp.SceneEditor;
  7. var startPush : h2d.col.Point;
  8. var moveCount = 0;
  9. public function new(parent, sceneEditor) {
  10. super(null, parent);
  11. this.sceneEditor = sceneEditor;
  12. }
  13. override function onEvent( e : hxd.Event ) {
  14. if(curPos == null) return;
  15. switch( e.kind ) {
  16. case EWheel:
  17. zoom(e.wheelDelta);
  18. case EPush:
  19. pushing = e.button;
  20. pushTime = haxe.Timer.stamp();
  21. pushStartX = pushX = e.relX;
  22. pushStartY = pushY = e.relY;
  23. startPush = new h2d.col.Point(pushX, pushY);
  24. if( pushing == 2 ) {
  25. var se = sceneEditor;
  26. var selection = se.getSelection();
  27. var angle = hxd.Math.abs(Math.PI/2 - phi);
  28. if( selection.length == 0 && angle > groundSnapAngle ) {
  29. var visGround = se.screenToGround(se.scene.s2d.width / 2, se.scene.s2d.height / 2);
  30. var dist = se.screenDistToGround(se.scene.s2d.width / 2, se.scene.s2d.height / 2);
  31. if( dist != null ) {
  32. set(dist, null, null, visGround);
  33. }
  34. }
  35. }
  36. moveCount = 0;
  37. @:privateAccess scene.window.mouseLock = true;
  38. case ERelease, EReleaseOutside:
  39. if( pushing == e.button ) {
  40. pushing = -1;
  41. startPush = null;
  42. if( e.kind == ERelease && haxe.Timer.stamp() - pushTime < 0.2 && hxd.Math.distance(e.relX - pushStartX,e.relY - pushStartY) < 5 )
  43. onClick(e);
  44. @:privateAccess scene.window.mouseLock = false;
  45. }
  46. case EMove:
  47. // Windows bug that jumps movementX/Y on all browsers
  48. if( moveCount < 10 && Math.distanceSq(pushX - e.relX, pushY - e.relY) > 100000 ) {
  49. pushX = e.relX;
  50. pushY = e.relY;
  51. return;
  52. }
  53. moveCount++;
  54. switch( pushing ) {
  55. case 1:
  56. if(startPush != null && startPush.distance(new h2d.col.Point(e.relX, e.relY)) > 3) {
  57. var angle = hxd.Math.abs(Math.PI/2 - phi);
  58. if(K.isDown(K.SHIFT) || angle < groundSnapAngle) {
  59. var m = 0.001 * curPos.x * panSpeed / 25;
  60. pan(-(e.relX - pushX) * m, (e.relY - pushY) * m);
  61. }
  62. else {
  63. var se = sceneEditor;
  64. var fromPt = se.screenToGround(pushX, pushY);
  65. var toPt = se.screenToGround(e.relX, e.relY);
  66. if(fromPt == null || toPt == null)
  67. return;
  68. var delta = toPt.sub(fromPt).toVector();
  69. delta.w = 0;
  70. targetOffset = targetOffset.sub(delta);
  71. }
  72. }
  73. pushX = e.relX;
  74. pushY = e.relY;
  75. case 2:
  76. rot(e.relX - pushX, e.relY - pushY);
  77. pushX = e.relX;
  78. pushY = e.relY;
  79. default:
  80. }
  81. case EFocus:
  82. @:privateAccess scene.window.mouseLock = false;
  83. default:
  84. }
  85. }
  86. function moveKeys() {
  87. var mov = new h3d.Vector();
  88. if( K.isDown(K.UP) || K.isDown(K.Z) || K.isDown(K.W) )
  89. mov.x += 1;
  90. if( K.isDown(K.DOWN) || K.isDown(K.S) )
  91. mov.x -= 1;
  92. if( K.isDown(K.LEFT) || K.isDown(K.Q) || K.isDown(K.A) )
  93. mov.y -= 1;
  94. if( K.isDown(K.RIGHT) || K.isDown(K.D) )
  95. mov.y += 1;
  96. if( mov.x == 0 && mov.y == 0 )
  97. return;
  98. var dir = new h3d.Vector(
  99. mov.x * Math.cos(theta) + mov.y * Math.cos(Math.PI / 2 + theta),
  100. mov.x * Math.sin(theta) + mov.y * Math.sin(Math.PI / 2 + theta)
  101. );
  102. var moveSpeed = Ide.inst.currentConfig.get("sceneeditor.camera.moveSpeed", 1.5);
  103. var delta = dir.multiply(0.01 * moveSpeed * (distance + scene.camera.zNear));
  104. delta.w = 0;
  105. targetOffset = targetOffset.sub(delta);
  106. }
  107. override function sync(ctx : h3d.scene.RenderContext) {
  108. if( pushing == 2 ) {
  109. moveKeys();
  110. }
  111. var old = ctx.elapsedTime;
  112. ctx.elapsedTime = hxd.Timer.dt;
  113. super.sync(ctx);
  114. ctx.elapsedTime = old;
  115. }
  116. }