// testAvatarEnterLeaveEntity.js // // Creates a Box with an enterLeave entityScript on it. // Moves box around such that MyAvatar goes in/out of intersection. // We expect to receive Enter/Leave events accordingly. // uncomment one of these: //var testShape = "Cube"; var testShape = "Sphere"; //var testShape = "Cylinder"; var rezDistance = 7.0; var rezOrientation = { x: 0, y: 0, z: 0.258819045102521, w: 0.965925826289068 }; // pi/6 rotation about z //var rezOrientation = MyAvatar.orientation; //var rezOrientation = { x: 0, y: 0, z: 0, w: 1 }; var forward = Quat.getFront(MyAvatar.orientation); var forwardOffset = Vec3.multiply(rezDistance, forward); var rezPosition = Vec3.sum(MyAvatar.position, forwardOffset); var rezDimensions = { x: 3.0, y: 11.0, z: 5.0 }; var rezRegistrationPoint = { x: 0.35, y: 0.62, z: 0.43 }; var rezCollidesWith = "dynamic"; // not with myAvatar var rezLifetime = 180; var properties = { type: "Shape", shape: testShape, name: "test", script: "https://s3.amazonaws.com/hifi-public/andrew/test/js/entityScripts/playSoundOnEnterOrLeave.js", position: rezPosition, rotation: rezOrientation, dimensions: rezDimensions, registrationPoint: rezRegistrationPoint, collidesWith: rezCollidesWith, lifetime: rezLifetime }; var entity = Entities.addEntity(properties); // these are the normalizedLocalPoints we will test: // pairs of points inside/outside the var delta = 0.01; var halfSide = 0.5; var normalizedLocalPoints = [ // center/outside-corner { x: 0, y: 0, z: 0 }, { x: halfSide + delta, y: halfSide + delta, z: halfSide + delta }, // x-axis { x: halfSide - delta, y: 0, z: 0 }, { x: halfSide + delta, y: 0, z: 0 }, { x: -halfSide + delta, y: 0, z: 0 }, { x: -halfSide - delta, y: 0, z: 0 }, // y-axis { x: 0, y: halfSide - delta, z: 0 }, { x: 0, y: halfSide + delta, z: 0 }, { x: 0, y: -halfSide + delta, z: 0 }, { x: 0, y: -halfSide - delta, z: 0 }, // z-axis { x: 0, y: 0, z: halfSide - delta }, { x: 0, y: 0, z: halfSide + delta }, { x: 0, y: 0, z: -halfSide + delta }, { x: 0, y: 0, z: -halfSide - delta } ]; // for each "normalized local" Point compute an entityPositioin that will move it such that MyAvatar // is at the transformed-to-world Point // // worldPoint = entityPosition + entityOrientation * (entityDimensions .* (normalizedCenter - registrationPoint) + normalizedPoint) // // avatarPosition = worldPoint // // entityPosition = avatarPosition - entityOrientation * (entityDimensions .* (normalizedCenter - registrationPoint) + normalizedPoint) // var testPoints = []; var myAvatarPosition = MyAvatar.position; var localCenter = { x: 0.5 - rezRegistrationPoint.x, y: 0.5 - rezRegistrationPoint.y, z: 0.5 - rezRegistrationPoint.z }; var numPoints = normalizedLocalPoints.length; for (var i = 0; i < numPoints; ++i) { var point = normalizedLocalPoints[i]; var offsetPoint = Vec3.sum(localCenter, point); var scaledPoint = { x: rezDimensions.x * offsetPoint.x, y: rezDimensions.y * offsetPoint.y, z: rezDimensions.z * offsetPoint.z }; var rotatedPoint = Vec3.multiplyQbyV(rezOrientation, scaledPoint); var entityPosition = Vec3.subtract(myAvatarPosition, rotatedPoint); testPoints.push(entityPosition); } var testDelay = 2000; var intervalHandle = Script.setInterval(function() { }, testDelay); Script.clearInterval(intervalHandle); intervalHandle = null; var testIndex = 0; var testNextPoint = function () { var p = { position: rezPosition }; if (testIndex < testPoints.length) { p.position = testPoints[testIndex]; testIndex++; } else { Script.clearInterval(intervalHandle); intervalHandle = null; } Entities.editEntity(entity, p); } intervalHandle = Script.setInterval(testNextPoint, testDelay); var onEndScript = function() { Entities.deleteEntity(entity); }; Script.scriptEnding.connect(onEndScript);