Manipulator.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. var Vector4 = BABYLON.Vector2;
  2. var Sandbox;
  3. (function (Sandbox) {
  4. var Vector3 = BABYLON.Vector3;
  5. var Matrix = BABYLON.Matrix;
  6. var Plane = BABYLON.Plane;
  7. var ManipulatorInteractionHelper = (function () {
  8. function ManipulatorInteractionHelper(scene) {
  9. this._scene = scene;
  10. }
  11. ManipulatorInteractionHelper.prototype.hasManipulatedMode = function (value) {
  12. return (this._manipulatedMode & value) !== 0;
  13. };
  14. ManipulatorInteractionHelper.prototype.hasManFlags = function (value) {
  15. return (this._flags & value) !== 0;
  16. };
  17. ManipulatorInteractionHelper.ComputeRayHit = function (ray, distance) {
  18. return ray.origin.add(ray.direction.multiplyByFloats(distance, distance, distance));
  19. };
  20. ManipulatorInteractionHelper.prototype.doPos = function (mouse) {
  21. var v = Vector3.Zero();
  22. var ray = this._scene.createPickingRay(mouse.x, mouse.y, Matrix.Identity(), this._scene.activeCamera);
  23. if (this.hasManipulatedMode(16 /* PlaneSelectionXY */ | 32 /* PlaneSelectionXZ */ | 64 /* PlaneSelectionYZ */)) {
  24. var pl0;
  25. var hit;
  26. if (this.hasManipulatedMode(16 /* PlaneSelectionXY */)) {
  27. pl0 = Plane.FromPoints(this._pos, this._pos.add(this._right), this._pos.add(this._up));
  28. }
  29. else if (this.hasManipulatedMode(32 /* PlaneSelectionXZ */)) {
  30. pl0 = Plane.FromPoints(this._pos, this._pos.add(this._right), this._pos.add(this._view));
  31. }
  32. else if (this.hasManipulatedMode(64 /* PlaneSelectionYZ */)) {
  33. pl0 = Plane.FromPoints(this._pos, this._pos.add(this._up), this._pos.add(this._view));
  34. }
  35. else {
  36. }
  37. var clip = 0.06;
  38. //Check if the plane is too parallel to the ray
  39. if (Math.abs(Vector3.Dot(pl0.normal, ray.direction)) < clip) {
  40. return;
  41. }
  42. //Make the intersection
  43. var distance = ray.intersectsPlane(pl0);
  44. hit = ManipulatorInteractionHelper.ComputeRayHit(ray, distance);
  45. //Check if it's the first call
  46. if (this.hasManFlags(2 /* FirstHit */)) {
  47. this._flags &= ~2 /* FirstHit */;
  48. this._prevHit = hit;
  49. return;
  50. }
  51. //Compute the vector
  52. v = hit.subtract(this._prevHit);
  53. }
  54. else if ((this._manipulatedMode & (1 /* ArrowX */ | 2 /* ArrowY */ | 4 /* ArrowZ */)) != 0) {
  55. var pl0, pl1;
  56. var hit;
  57. var s;
  58. if (this.hasManFlags(2 /* FirstHit */)) {
  59. var res = this.setupIntersectionPlanes(this._manipulatedMode);
  60. pl0 = res.p0;
  61. pl1 = res.p1;
  62. if (Math.abs(Vector3.Dot(pl0.normal, ray.direction)) > Math.abs(Vector3.Dot(pl1.normal, ray.direction))) {
  63. var distance = ray.intersectsPlane(pl0);
  64. hit = ManipulatorInteractionHelper.ComputeRayHit(ray, distance);
  65. this._flags &= ~3 /* Plane2 */;
  66. }
  67. else {
  68. var distance = ray.intersectsPlane(pl1);
  69. hit = ManipulatorInteractionHelper.ComputeRayHit(ray, distance);
  70. this._flags |= 3 /* Plane2 */;
  71. }
  72. this._flags &= ~2 /* FirstHit */;
  73. this._prevHit = hit;
  74. return;
  75. }
  76. else {
  77. var axis;
  78. var res = this.setupIntersectionPlane(this._manipulatedMode, this.hasManFlags(3 /* Plane2 */));
  79. pl0 = res.plane;
  80. axis = res.axis;
  81. var distance = ray.intersectsPlane(pl0);
  82. hit = ManipulatorInteractionHelper.ComputeRayHit(ray, distance);
  83. v = hit.subtract(this._prevHit);
  84. s = Vector3.Dot(axis, v);
  85. v = axis.multiplyByFloats(s, s, s);
  86. }
  87. }
  88. if (this.translationStep !== 0.0) {
  89. v.x -= v.x % this.translationStep;
  90. v.y -= v.y % this.translationStep;
  91. v.z -= v.z % this.translationStep;
  92. }
  93. var mtx = this._firstTransform;
  94. mtx.setTranslation(mtx.getTranslation().add(v));
  95. this._pos = mtx.getTranslation();
  96. //TODO
  97. //this._manipulatedObject.SetSmartPropertyValue(this._manipulatedTransform, mtx);
  98. };
  99. ManipulatorInteractionHelper.prototype.setupIntersectionPlane = function (mode, plane2) {
  100. var res = this.setupIntersectionPlanes(mode);
  101. var pl = plane2 ? res.p1 : res.p0;
  102. var axis;
  103. switch (mode) {
  104. case 1 /* ArrowX */:
  105. axis = this._right;
  106. break;
  107. case 2 /* ArrowY */:
  108. axis = this._up;
  109. break;
  110. case 4 /* ArrowZ */:
  111. axis = this._view;
  112. break;
  113. default:
  114. axis = Vector3.Zero();
  115. break;
  116. }
  117. return { plane: pl, axis: axis };
  118. };
  119. ManipulatorInteractionHelper.prototype.setupIntersectionPlanes = function (mode) {
  120. var p0, p1;
  121. switch (mode) {
  122. case 1 /* ArrowX */:
  123. p0 = Plane.FromPoints(this._pos, this._pos.add(this._view), this._pos.add(this._right));
  124. p1 = Plane.FromPoints(this._pos, this._pos.add(this._right), this._pos.add(this._up));
  125. break;
  126. case 2 /* ArrowY */:
  127. p0 = Plane.FromPoints(this._pos, this._pos.add(this._up), this._pos.add(this._right));
  128. p1 = Plane.FromPoints(this._pos, this._pos.add(this._up), this._pos.add(this._view));
  129. break;
  130. case 4 /* ArrowZ */:
  131. p0 = Plane.FromPoints(this._pos, this._pos.add(this._view), this._pos.add(this._right));
  132. p1 = Plane.FromPoints(this._pos, this._pos.add(this._view), this._pos.add(this._up));
  133. break;
  134. }
  135. return { p0: p0, p1: p1 };
  136. };
  137. ManipulatorInteractionHelper.prototype.attachManipulatedNode = function (node) {
  138. };
  139. ManipulatorInteractionHelper.prototype.detachManipulatedNode = function (node) {
  140. };
  141. return ManipulatorInteractionHelper;
  142. }());
  143. Sandbox.ManipulatorInteractionHelper = ManipulatorInteractionHelper;
  144. })(Sandbox || (Sandbox = {}));
  145. //# sourceMappingURL=Manipulator.js.map