From 5d1a5eea4c48872379afda0b7f08f961598a460f Mon Sep 17 00:00:00 2001 From: druiz17 Date: Fri, 8 Sep 2017 13:45:45 -0700 Subject: [PATCH] added test file --- .../developer/tests/controllerTableTest.js | 278 ++++++++++++++++++ 1 file changed, 278 insertions(+) create mode 100644 scripts/developer/tests/controllerTableTest.js diff --git a/scripts/developer/tests/controllerTableTest.js b/scripts/developer/tests/controllerTableTest.js new file mode 100644 index 0000000000..239c7fd0ce --- /dev/null +++ b/scripts/developer/tests/controllerTableTest.js @@ -0,0 +1,278 @@ +"use strict"; + +/* jslint bitwise: true */ +/* global Script, Entities, MyAvatar, Vec3, Quat, Mat4 */ + +(function() { // BEGIN LOCAL_SCOPE + + // var lifetime = -1; + var lifetime = 600; + var tableSections = 32; + var tableRadius = 9; + + var sectionRelativeRotation = 0; + var sectionRotation = 0; + var sectionRelativeCenterA = 0; + var sectionRelativeCenterB = 0; + var sectionRelativeCenterSign = 0; + var sectionCenterA = 0; + var sectionCenterB = 0; + var sectionCenterSign = 0; + var yFlip = 0; + + var objects = []; + var overlays = []; + + var testNames = [ + "FarActionGrab", + "NearParentGrabEntity", + "NearParentGrabOverlay", + "Clone Entity (dynamic)", + "Clone Entity (non-dynamic" + ]; + + function createCloneDynamicEntity(index) { + createPropsCube(index, false, false, true, true); + createPropsModel(index, false, false, true, true); + createSign(index, "Clone Dynamic Entity"); + }; + + function createCloneEntity(index) { + createPropsCube(index, false, false, true, false); + createPropsModel(index, false, false, true, false); + createSign(index, "Clone Non-Dynamic Entity"); + }; + + function createNearGrabOverlay(index) { + createPropsCubeOverlay(index, false, false, true, true); + createPropsModelOverlay(index, false, false, true, true); + createSign(index, "Near Grab Overlay"); + }; + + function createNearGrabEntity(index) { + createPropsCube(index, false, false, false, false); + createPropsModel(index, false, false, false, false); + createSign(index, "Near Grab Entity"); + }; + + function createFarGrabEntity(index) { + createPropsCube(index, true, false, false, false); + createPropsModel(index, true, false, false, false); + createSign(index, "Far Grab Entity"); + }; + + function createPropsModel(i, dynamic, collisionless, clone, cloneDynamic) { + var propsModel = { + name: "controller-tests model object " + i, + type: "Model", + modelURL: "http://headache.hungry.com/~seth/hifi/controller-tests/color-cube.obj", + + position: sectionCenterA, + rotation: sectionRotation, + + gravity: (dynamic && !collisionless) ? { x: 0, y: -1, z: 0 } : { x: 0, y: 0, z: 0 }, + dimensions: { x: 0.2, y: 0.2, z: 0.2 }, + userData: JSON.stringify({ + grabbableKey: { + grabbable: true, + cloneLimit: 10, + cloneable: clone, + cloneDynamic: cloneDynamic + }, + controllerTestEntity: true + }), + lifetime: lifetime, + shapeType: "box", + dynamic: dynamic, + collisionless: collisionless + }; + objects.push(Entities.addEntity(propsModel)); + } + + function createPropsModelOverlay(i, dynamic, collisionless, clone, cloneDynamic) { + var propsModel = { + name: "controller-tests model object " + i, + type: "Model", + modelURL: "http://headache.hungry.com/~seth/hifi/controller-tests/color-cube.obj", + url: "http://headache.hungry.com/~seth/hifi/controller-tests/color-cube.obj", + grabbable: true, + position: sectionCenterA, + rotation: sectionRotation, + dimensions: { x: 0.2, y: 0.2, z: 0.2 }, + userData: JSON.stringify({ + grabbableKey: { + grabbable: true, + }, + controllerTestEntity: true + }), + lifetime: lifetime, + visible: true, + }; + overlays.push(Overlays.addOverlay("model", propsModel)); + } + + + function createPropsCubeOverlay(i, dynamic, collisionless, clone, cloneDynamic) { + var propsCube = { + name: "controller-tests cube object " + i, + type: "Box", + color: { "blue": 200, "green": 10, "red": 20 }, + position: sectionCenterB, + rotation: sectionRotation, + grabbable: true, + dimensions: { x: 0.2, y: 0.2, z: 0.2 }, + userData: JSON.stringify({ + grabbableKey: { + grabbable: true, + }, + controllerTestEntity: true + }), + lifetime: lifetime, + solid: true, + visible: true, + }; + overlays.push(Overlays.addOverlay("cube", propsCube)); + } + + function createPropsCube(i, dynamic, collisionless, clone, cloneDynamic) { + var propsCube = { + name: "controller-tests cube object " + i, + type: "Box", + shape: "Cube", + color: { "blue": 200, "green": 10, "red": 20 }, + position: sectionCenterB, + rotation: sectionRotation, + gravity: dynamic ? { x: 0, y: -1, z: 0 } : { x: 0, y: 0, z: 0 }, + dimensions: { x: 0.2, y: 0.2, z: 0.2 }, + userData: JSON.stringify({ + grabbableKey: { + grabbable: true, + cloneLimit: 10, + cloneable: clone, + cloneDynamic: cloneDynamic + }, + controllerTestEntity: true + }), + lifetime: lifetime, + shapeType: "box", + dynamic: dynamic, + collisionless: collisionless + }; + objects.push(Entities.addEntity(propsCube)); + } + + function createSign(i, signText) { + var propsLabel = { + name: "controller-tests sign " + i, + type: "Text", + lineHeight: 0.125, + position: sectionCenterSign, + rotation: Quat.multiply(sectionRotation, yFlip), + text: signText, + dimensions: { x: 1, y: 1, z: 0.01 }, + lifetime: lifetime, + userData: JSON.stringify({ + grabbableKey: { + grabbable: false, + }, + controllerTestEntity: true + }) + }; + objects.push(Entities.addEntity(propsLabel)); + } + + function chooseType(index) { + switch (index) { + case 0: + createFarGrabEntity(index); + break; + case 1: + createNearGrabEntity(index); + break; + case 2: + createNearGrabOverlay(index); + break; + case 3: + createCloneDynamicEntity(); + break; + case 4: + createCloneEntity(index); + break; + } + } + + function setupControllerTests(testBaseTransform) { + // var tableID = + objects.push(Entities.addEntity({ + name: "controller-tests table", + type: "Model", + modelURL: "http://headache.hungry.com/~seth/hifi/controller-tests/controller-tests-table.obj.gz", + position: Mat4.transformPoint(testBaseTransform, { x: 0, y: 1, z: 0 }), + rotation: Mat4.extractRotation(testBaseTransform), + userData: JSON.stringify({ + grabbableKey: { grabbable: false }, + soundKey: { + url: "http://headache.hungry.com/~seth/hifi/sound/clock-ticking-3.wav", + volume: 0.4, + loop: true, + playbackGap: 0, + playbackGapRange: 0 + }, + controllerTestEntity: true + }), + shapeType: "static-mesh", + lifetime: lifetime + })); + + var Xdynamic = 1; + var Xcollisionless = 2; + var Xkinematic = 4; + var XignoreIK = 8; + + yFlip = Quat.fromPitchYawRollDegrees(0, 180, 0); + + for (var i = 0; i < 16; i++) { + sectionRelativeRotation = Quat.fromPitchYawRollDegrees(0, -360 * i / tableSections, 0); + sectionRotation = Quat.multiply(Mat4.extractRotation(testBaseTransform), sectionRelativeRotation); + sectionRelativeCenterA = Vec3.multiplyQbyV(sectionRotation, { x: -0.2, y: 1.25, z: tableRadius - 0.8 }); + sectionRelativeCenterB = Vec3.multiplyQbyV(sectionRotation, { x: 0.2, y: 1.25, z: tableRadius - 0.8 }); + sectionRelativeCenterSign = Vec3.multiplyQbyV(sectionRotation, { x: 0, y: 1.5, z: tableRadius + 1.0 }); + sectionCenterA = Mat4.transformPoint(testBaseTransform, sectionRelativeCenterA); + sectionCenterB = Mat4.transformPoint(testBaseTransform, sectionRelativeCenterB); + sectionCenterSign = Mat4.transformPoint(testBaseTransform, sectionRelativeCenterSign); + + var dynamic = (i & Xdynamic) ? true : false; + var collisionless = (i & Xcollisionless) ? true : false; + var kinematic = (i & Xkinematic) ? true : false; + var ignoreIK = (i & XignoreIK) ? true : false; + + chooseType(i); + } + } + + // This assumes the avatar is standing on a flat floor with plenty of space. + // Find the floor: + var pickRay = { + origin: Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { x: 0, y: 2, z: -1 })), + direction: { x: 0, y: -1, z: 0 }, + length: 20 + }; + var intersection = Entities.findRayIntersection(pickRay, true, [], [], true); + + if (intersection.intersects) { + var testBaseTransform = Mat4.createFromRotAndTrans(MyAvatar.rotation, intersection.intersection); + setupControllerTests(testBaseTransform); + } + + Script.scriptEnding.connect(function () { + for (var i = 0; i < objects.length; i++) { + var nearbyID = objects[i]; + Entities.deleteEntity(nearbyID); + } + + for (var i = 0; i < overlays.length; i++) { + var overlayID = overlays[i]; + Overlays.deleteOverlay(overlayID); + } + }); +}()); // END LOCAL_SCOPE