Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Unprojects canvas position to a World-space ray.
- */
- var canvasPosToWorldRay = (function () {
- var pvMat = mat4.create();
- var pvMatInverse = mat4.create();
- var screenA = vec4.create();
- var screenB = vec4.create();
- var projA = vec4.create();
- var projB = vec4.create();
- return function (canvasPos, worldRayOrigin, worldRayDir) {
- var canvas = Human.renderer.canvas.canvas[0];
- var viewMat = Human.renderer.getViewMat();
- var projMat = Human.renderer.getProjMat();
- mat4.multiply(pvMat, projMat, viewMat); // Projection-view mat
- mat4.invert(pvMatInverse, pvMat); // Inverse projection-view mat
- var canvasWidth = canvas.width;
- var canvasHeight = canvas.height;
- var clipX = (canvasPos[0] - canvasWidth / 2) / (canvasWidth / 2); // Calculate clip space coordinates
- var clipY = -(canvasPos[1] - canvasHeight / 2) / (canvasHeight / 2);
- screenA[0] = clipX;
- screenA[1] = clipY;
- screenA[2] = -1;
- screenA[3] = 1;
- vec4.transformMat4(projA, screenA, pvMatInverse);
- vec4.scale(projA, projA, 1 / projA[3]);
- screenB[0] = clipX;
- screenB[1] = clipY;
- screenB[2] = 1;
- screenB[3] = 1;
- vec4.transformMat4(projB, screenB, pvMatInverse);
- vec4.scale(projB, projB, 1 / projB[3]);
- vec3.subtract(worldRayDir, projB, projA);
- vec3.normalize(worldRayDir, worldRayDir);
- worldRayOrigin[0] = projB[0];
- worldRayOrigin[1] = projB[1];
- worldRayOrigin[2] = projB[2];
- };
- })();
- /**
- * Returns array of scene objects whose boundaries intersect the given World-space ray.
- */
- var findIntersectingObjects = (function () {
- /**
- * Tests ray for intersection with AABB.
- */
- function rayAABBIntersect(origin, dir, aabb) {
- var lo = -Infinity;
- var hi = +Infinity;
- var dimLo;
- var dimHi;
- var tmp;
- dimLo = (aabb.xmin - origin[0]) / dir[0];
- dimHi = (aabb.xmax - origin[0]) / dir[0];
- if (dimLo > dimHi) {
- tmp = dimLo;
- dimLo = dimHi;
- dimHi = tmp;
- }
- if (dimHi < lo || dimLo > hi) {
- return false
- }
- if (dimLo > lo) {
- lo = dimLo;
- }
- if (dimHi < hi) {
- hi = dimHi;
- }
- dimLo = (aabb.ymin - origin[1]) / dir[1];
- dimHi = (aabb.ymax - origin[1]) / dir[1];
- if (dimLo > dimHi) {
- tmp = dimLo;
- dimLo = dimHi;
- dimHi = tmp;
- }
- if (dimHi < lo || dimLo > hi) {
- return false
- }
- if (dimLo > lo) {
- lo = dimLo;
- }
- if (dimHi < hi) {
- hi = dimHi;
- }
- dimLo = (aabb.zmin - origin[2]) / dir[2];
- dimHi = (aabb.zmax - origin[2]) / dir[2];
- if (dimLo > dimHi) {
- tmp = dimLo;
- dimLo = dimHi;
- dimHi = tmp;
- }
- if (dimHi < lo || dimLo > hi) {
- return false
- }
- if (dimLo > lo) {
- lo = dimLo;
- }
- if (dimHi < hi) {
- hi = dimHi;
- }
- return (lo <= hi);
- }
- return function (origin, dir) {
- var objects = Human.scene.objects;
- var object;
- var boundary;
- var pickId;
- var objectIds;
- for (var objectId in objects) {
- if (objects.hasOwnProperty(objectId)) {
- object = objects[objectId];
- boundary = object.getBoundary();
- if (rayAABBIntersect(origin, dir, boundary)) {
- pickId = object.pickId;
- if (pickId !== null && pickId !== undefined) {
- if (!objectIds) {
- objectIds = [];
- }
- objectIds.push(pickId);
- //object.setHighlight(true);
- }
- } else {
- // object.setHighlight(false);
- }
- }
- }
- return objectIds;
- };
- })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement