// testAvatarEnterLeaveZone.js // // Creates a Zone with an enterLeave entityScript on it, with a visible "proxy" with same shape. // Moves zone+proxy around such that MyAvatar goes in/out of intersection. // We expect to receive Enter/Leave events accordingly. // possible shapeTypes var boxShape = { zone: "box", proxy: "Cube" }; var ellipsoidShape = { zone: "ellipsoid", proxy: "Sphere" }; var cylinderShape = { zone: "cylinder-y", proxy: "Cylinder" } // pick a shapeType from above var testShape = boxShape; var enterLeaveScript = "https://s3.amazonaws.com/hifi-public/andrew/test/js/entityScripts/playSoundOnEnterOrLeave.js"; var rezDistance = 5.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: 4.0, y: 8.0, z: 4.0 }; var rezRegistrationPoint = { x: 0.35, y: 0.62, z: 0.43 }; var rezCollidesWith = "dynamic"; // not with myAvatar var rezLifetime = 180; var zoneProperties = { type: "Zone", name: "testZone", shapeType: testShape.zone, script: enterLeaveScript, position: rezPosition, rotation: rezOrientation, dimensions: rezDimensions, registrationPoint: rezRegistrationPoint, collidesWith: rezCollidesWith, lifetime: rezLifetime }; var zoneEntity = Entities.addEntity(zoneProperties); var proxyProperties = { type: "Shape", shape: testShape.proxy, name: "proxyShape", position: rezPosition, rotation: rezOrientation, dimensions: rezDimensions, registrationPoint: rezRegistrationPoint, collidesWith: rezCollidesWith, lifetime: rezLifetime }; var proxyEntity = Entities.addEntity(proxyProperties); // 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(zoneEntity, p); Entities.editEntity(proxyEntity, p); } intervalHandle = Script.setInterval(testNextPoint, testDelay); var onEndScript = function() { Entities.deleteEntity(zoneEntity); Entities.deleteEntity(proxyEntity); }; Script.scriptEnding.connect(onEndScript);