use collision masks to prevent grab-bootstrap

This commit is contained in:
Andrew Meadows 2016-01-08 10:47:14 -08:00
parent 6c49d81475
commit 00e5d040a2

View file

@ -106,7 +106,7 @@ var GRABBABLE_PROPERTIES = [
"position",
"rotation",
"gravity",
"ignoreForCollisions",
"collisionMask",
"collisionsWillMove",
"locked",
"name"
@ -117,7 +117,6 @@ var GRAB_USER_DATA_KEY = "grabKey"; // shared with grab.js
var DEFAULT_GRABBABLE_DATA = {
grabbable: true,
invertSolidWhileHeld: false
};
@ -164,6 +163,14 @@ var POINT_HAND_STATES = [STATE_NEAR_TRIGGER, STATE_CONTINUE_NEAR_TRIGGER, STATE_
var FAR_GRASP_HAND_STATES = [STATE_DISTANCE_HOLDING, STATE_CONTINUE_DISTANCE_HOLDING];
// otherwise grasp
var COLLISION_GROUP_STATIC = 0x01; // bit 0
var COLLISION_GROUP_DYNAMIC = 0x02; // bit 1
var COLLISION_GROUP_KINEMATIC = 0x04; // bit 2
var COLLISION_GROUP_MY_AVATAR = 0x08; // bit 3
var COLLISION_GROUP_OTHER_AVATAR = 0x10; // bit 4
var COLLISION_MASK_WHILE_GRABBED = COLLISION_GROUP_DYNAMIC | COLLISION_GROUP_OTHER_AVATAR;
function stateToName(state) {
switch (state) {
case STATE_OFF:
@ -1823,7 +1830,6 @@ function MyController(hand) {
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;
@ -1831,18 +1837,16 @@ function MyController(hand) {
// 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;
data["collisionMask"] = grabbedProperties.collisionMask;
data["collisionsWillMove"] = grabbedProperties.collisionsWillMove;
var whileHeldProperties = {
gravity: {
x: 0,
y: 0,
z: 0
}
},
collisionMask: COLLISION_MASK_WHILE_GRABBED & grabbedProperties.collisionMask
};
if (invertSolidWhileHeld) {
whileHeldProperties["ignoreForCollisions"] = !grabbedProperties.ignoreForCollisions;
}
Entities.editEntity(entityID, whileHeldProperties);
}
@ -1857,7 +1861,7 @@ function MyController(hand) {
if (data["refCount"] < 1) {
Entities.editEntity(entityID, {
gravity: data["gravity"],
ignoreForCollisions: data["ignoreForCollisions"],
collisionMask: data["collisionMask"],
collisionsWillMove: data["collisionsWillMove"]
});
data = null;