From c6c44e8b810b647ab707432d9c3e1bcf65b66e55 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 9 Oct 2015 15:42:30 -0700 Subject: [PATCH] add a userdata flag that allows toggling of the ignoreForCollisions entity property when an item is held. --- examples/controllers/handControllerGrab.js | 33 +++++++++++----------- examples/grab.js | 16 +++++++---- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/examples/controllers/handControllerGrab.js b/examples/controllers/handControllerGrab.js index 47bcc0083c..1cdd6c5a77 100644 --- a/examples/controllers/handControllerGrab.js +++ b/examples/controllers/handControllerGrab.js @@ -84,6 +84,11 @@ var STATE_RELEASE = 10; var GRABBABLE_DATA_KEY = "grabbableKey"; // shared with grab.js var GRAB_USER_DATA_KEY = "grabKey"; // shared with grab.js +var DEFAULT_GRABBABLE_DATA = { + grabbable: true, + invertSolidWhileHeld: false +}; + function getTag() { return "grab-" + MyAvatar.sessionUUID; } @@ -254,10 +259,6 @@ function MyController(hand, triggerAction) { this.lineOn(pickRay.origin, Vec3.multiply(pickRay.direction, LINE_LENGTH), NO_INTERSECT_COLOR); - var defaultGrabbableData = { - grabbable: true - }; - var intersection = Entities.findRayIntersection(pickRay, true); if (intersection.intersects && intersection.properties.locked === 0) { // the ray is intersecting something we can move. @@ -265,7 +266,7 @@ function MyController(hand, triggerAction) { var intersectionDistance = Vec3.distance(handControllerPosition, intersection.intersection); this.grabbedEntity = intersection.entityID; - var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, intersection.entityID, defaultGrabbableData); + var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, intersection.entityID, DEFAULT_GRABBABLE_DATA); if (grabbableData.grabbable === false) { this.grabbedEntity = null; return; @@ -298,7 +299,7 @@ function MyController(hand, triggerAction) { for (i = 0; i < nearbyEntities.length; i++) { - var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, nearbyEntities[i], defaultGrabbableData); + var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, nearbyEntities[i], DEFAULT_GRABBABLE_DATA); if (grabbableData.grabbable === false) { return; } @@ -690,24 +691,24 @@ function MyController(hand, triggerAction) { }; this.activateEntity = function(entityID, grabbedProperties) { + var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, entityID, DEFAULT_GRABBABLE_DATA); + var invertSolidWhileHeld = grabbableData["invertSolidWhileHeld"]; var data = getEntityCustomData(GRAB_USER_DATA_KEY, entityID, {}); data["activated"] = true; data["avatarId"] = MyAvatar.sessionUUID; data["refCount"] = data["refCount"] ? data["refCount"] + 1 : 1; - // zero gravity and set ignoreForCollisions to true, but in a way that lets us put them back, after all grabs are done + // zero gravity and set ignoreForCollisions in a way that lets us put them back, after all grabs are done if (data["refCount"] == 1) { data["gravity"] = grabbedProperties.gravity; data["ignoreForCollisions"] = grabbedProperties.ignoreForCollisions; - Entities.editEntity(entityID, { - gravity: { - x: 0, - y: 0, - z: 0 - }, - ignoreForCollisions: true - }); + var whileHeldProperties = {gravity: {x:0, y:0, z:0}}; + if (invertSolidWhileHeld) { + whileHeldProperties["ignoreForCollisions"] = ! grabbedProperties.ignoreForCollisions; + } + Entities.editEntity(entityID, whileHeldProperties); } setEntityCustomData(GRAB_USER_DATA_KEY, entityID, data); + return data; }; this.deactivateEntity = function(entityID) { @@ -742,4 +743,4 @@ function cleanup() { } Script.scriptEnding.connect(cleanup); -Script.update.connect(update); \ No newline at end of file +Script.update.connect(update); diff --git a/examples/grab.js b/examples/grab.js index 1c49775a49..1a02911db9 100644 --- a/examples/grab.js +++ b/examples/grab.js @@ -29,8 +29,9 @@ var IDENTITY_QUAT = { var GRABBABLE_DATA_KEY = "grabbableKey"; // shared with handControllerGrab.js var GRAB_USER_DATA_KEY = "grabKey"; // shared with handControllerGrab.js -var defaultGrabbableData = { - grabbable: true +var DEFAULT_GRABBABLE_DATA = { + grabbable: true, + invertSolidWhileHeld: false }; @@ -324,8 +325,7 @@ Grabber.prototype.pressEvent = function(event) { return; } - - var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, pickResults.entityID, defaultGrabbableData); + var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, pickResults.entityID, DEFAULT_GRABBABLE_DATA); if (grabbableData.grabbable === false) { return; } @@ -496,6 +496,8 @@ Grabber.prototype.keyPressEvent = function(event) { } Grabber.prototype.activateEntity = function(entityID, grabbedProperties) { + var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, entityID, DEFAULT_GRABBABLE_DATA); + var invertSolidWhileHeld = grabbableData["invertSolidWhileHeld"]; var data = getEntityCustomData(GRAB_USER_DATA_KEY, entityID, {}); data["activated"] = true; data["avatarId"] = MyAvatar.sessionUUID; @@ -504,7 +506,11 @@ Grabber.prototype.activateEntity = function(entityID, grabbedProperties) { if (data["refCount"] == 1) { data["gravity"] = grabbedProperties.gravity; data["ignoreForCollisions"] = grabbedProperties.ignoreForCollisions; - Entities.editEntity(entityID, {gravity: {x:0, y:0, z:0}, ignoreForCollisions: true}); + var whileHeldProperties = {gravity: {x:0, y:0, z:0}}; + if (invertSolidWhileHeld) { + whileHeldProperties["ignoreForCollisions"] = ! grabbedProperties.ignoreForCollisions; + } + Entities.editEntity(entityID, whileHeldProperties); } setEntityCustomData(GRAB_USER_DATA_KEY, entityID, data); };