content/hifi-public/andrew/test/js/testAvatarEnterLeaveShapedZone.js
Dale Glass 0d14e5a379 Initial data.
Needs a lot of cleanup. Data has been de-duplicated, and where identical copies existed, one of them
has been replaced with a symlink.

Some files have been excluded, such as binaries, installers and debug dumps. Some of that may still
be present.
2022-02-13 18:59:11 +01:00

131 lines
4.6 KiB
JavaScript

// 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);