Advertisement
Guest User

Untitled

a guest
Jan 20th, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.57 KB | None | 0 0
  1. /**
  2. * Unprojects canvas position to a World-space ray.
  3. */
  4. var canvasPosToWorldRay = (function () {
  5.  
  6. var pvMat = mat4.create();
  7. var pvMatInverse = mat4.create();
  8. var screenA = vec4.create();
  9. var screenB = vec4.create();
  10. var projA = vec4.create();
  11. var projB = vec4.create();
  12.  
  13. return function (canvasPos, worldRayOrigin, worldRayDir) {
  14.  
  15. var canvas = Human.renderer.canvas.canvas[0];
  16. var viewMat = Human.renderer.getViewMat();
  17. var projMat = Human.renderer.getProjMat();
  18.  
  19. mat4.multiply(pvMat, projMat, viewMat); // Projection-view mat
  20. mat4.invert(pvMatInverse, pvMat); // Inverse projection-view mat
  21.  
  22. var canvasWidth = canvas.width;
  23. var canvasHeight = canvas.height;
  24.  
  25. var clipX = (canvasPos[0] - canvasWidth / 2) / (canvasWidth / 2); // Calculate clip space coordinates
  26. var clipY = -(canvasPos[1] - canvasHeight / 2) / (canvasHeight / 2);
  27.  
  28. screenA[0] = clipX;
  29. screenA[1] = clipY;
  30. screenA[2] = -1;
  31. screenA[3] = 1;
  32.  
  33. vec4.transformMat4(projA, screenA, pvMatInverse);
  34. vec4.scale(projA, projA, 1 / projA[3]);
  35.  
  36. screenB[0] = clipX;
  37. screenB[1] = clipY;
  38. screenB[2] = 1;
  39. screenB[3] = 1;
  40.  
  41. vec4.transformMat4(projB, screenB, pvMatInverse);
  42. vec4.scale(projB, projB, 1 / projB[3]);
  43.  
  44. vec3.subtract(worldRayDir, projB, projA);
  45. vec3.normalize(worldRayDir, worldRayDir);
  46.  
  47. worldRayOrigin[0] = projB[0];
  48. worldRayOrigin[1] = projB[1];
  49. worldRayOrigin[2] = projB[2];
  50. };
  51. })();
  52.  
  53. /**
  54. * Returns array of scene objects whose boundaries intersect the given World-space ray.
  55. */
  56. var findIntersectingObjects = (function () {
  57.  
  58. /**
  59. * Tests ray for intersection with AABB.
  60. */
  61. function rayAABBIntersect(origin, dir, aabb) {
  62.  
  63. var lo = -Infinity;
  64. var hi = +Infinity;
  65. var dimLo;
  66. var dimHi;
  67. var tmp;
  68.  
  69. dimLo = (aabb.xmin - origin[0]) / dir[0];
  70. dimHi = (aabb.xmax - origin[0]) / dir[0];
  71.  
  72. if (dimLo > dimHi) {
  73. tmp = dimLo;
  74. dimLo = dimHi;
  75. dimHi = tmp;
  76. }
  77.  
  78. if (dimHi < lo || dimLo > hi) {
  79. return false
  80. }
  81.  
  82. if (dimLo > lo) {
  83. lo = dimLo;
  84. }
  85.  
  86. if (dimHi < hi) {
  87. hi = dimHi;
  88. }
  89.  
  90. dimLo = (aabb.ymin - origin[1]) / dir[1];
  91. dimHi = (aabb.ymax - origin[1]) / dir[1];
  92.  
  93. if (dimLo > dimHi) {
  94. tmp = dimLo;
  95. dimLo = dimHi;
  96. dimHi = tmp;
  97. }
  98.  
  99. if (dimHi < lo || dimLo > hi) {
  100. return false
  101. }
  102.  
  103. if (dimLo > lo) {
  104. lo = dimLo;
  105. }
  106. if (dimHi < hi) {
  107. hi = dimHi;
  108. }
  109.  
  110. dimLo = (aabb.zmin - origin[2]) / dir[2];
  111. dimHi = (aabb.zmax - origin[2]) / dir[2];
  112.  
  113. if (dimLo > dimHi) {
  114. tmp = dimLo;
  115. dimLo = dimHi;
  116. dimHi = tmp;
  117. }
  118.  
  119. if (dimHi < lo || dimLo > hi) {
  120. return false
  121. }
  122.  
  123. if (dimLo > lo) {
  124. lo = dimLo;
  125. }
  126.  
  127. if (dimHi < hi) {
  128. hi = dimHi;
  129. }
  130.  
  131. return (lo <= hi);
  132. }
  133.  
  134. return function (origin, dir) {
  135.  
  136. var objects = Human.scene.objects;
  137. var object;
  138. var boundary;
  139. var pickId;
  140. var objectIds;
  141.  
  142. for (var objectId in objects) {
  143. if (objects.hasOwnProperty(objectId)) {
  144.  
  145. object = objects[objectId];
  146.  
  147. boundary = object.getBoundary();
  148.  
  149. if (rayAABBIntersect(origin, dir, boundary)) {
  150.  
  151. pickId = object.pickId;
  152.  
  153. if (pickId !== null && pickId !== undefined) {
  154.  
  155. if (!objectIds) {
  156. objectIds = [];
  157. }
  158.  
  159. objectIds.push(pickId);
  160.  
  161. //object.setHighlight(true);
  162. }
  163. } else {
  164. // object.setHighlight(false);
  165. }
  166. }
  167. }
  168.  
  169. return objectIds;
  170. };
  171. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement