mirror of
https://github.com/JulianGro/overte.git
synced 2025-05-28 19:50:15 +02:00
unmuddle saved state in Settings and userData
This commit is contained in:
parent
464f74fc1b
commit
0c5c682887
2 changed files with 36 additions and 67 deletions
|
@ -209,35 +209,6 @@ function AttachedEntitiesManager() {
|
||||||
grabbableData = getEntityCustomData('grabbableKey', entityID, {});
|
grabbableData = getEntityCustomData('grabbableKey', entityID, {});
|
||||||
this.updateRelativeOffsets(entityID, props);
|
this.updateRelativeOffsets(entityID, props);
|
||||||
props = Entities.getEntityProperties(entityID); // refresh, because updateRelativeOffsets changed them
|
props = Entities.getEntityProperties(entityID); // refresh, because updateRelativeOffsets changed them
|
||||||
|
|
||||||
// if an entity is currently being held or equipped, its original properties are saved in
|
|
||||||
// the userData under "grabKey". Save with these original properties rather than the
|
|
||||||
// ones currently on the entity.
|
|
||||||
if (grabData.refCount > 0) {
|
|
||||||
if ("gravity" in grabData) {
|
|
||||||
props.gravity = grabData.gravity;
|
|
||||||
}
|
|
||||||
if ("collidesWith" in grabData) {
|
|
||||||
props.collidesWith = grabData.collidesWith;
|
|
||||||
}
|
|
||||||
if ("dynamic" in grabData) {
|
|
||||||
props.dynamic = grabData.dynamic;
|
|
||||||
}
|
|
||||||
if ("collisionless" in grabData) {
|
|
||||||
if ("invertSolidWhileHeld" in grabbableData && grabbableData.invertSolidWhileHeld) {
|
|
||||||
props.collisionless = !grabData.collisionless;
|
|
||||||
} else {
|
|
||||||
props.collisionless = grabData.collisionless;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// if ("parentID" in grabData) {
|
|
||||||
// props.parentID = grabData.parentID;
|
|
||||||
// }
|
|
||||||
// if ("parentJointIndex" in grabData) {
|
|
||||||
// props.parentJointIndex = grabData.parentJointIndex;
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
this.scrubProperties(props);
|
this.scrubProperties(props);
|
||||||
saveData.push(props);
|
saveData.push(props);
|
||||||
}
|
}
|
||||||
|
@ -253,12 +224,13 @@ function AttachedEntitiesManager() {
|
||||||
toScrub.forEach(function(propertyName) {
|
toScrub.forEach(function(propertyName) {
|
||||||
delete props[propertyName];
|
delete props[propertyName];
|
||||||
});
|
});
|
||||||
// if the userData has a grabKey, strip it out
|
// if the userData has a grabKey, clear old state
|
||||||
if ("userData" in props) {
|
if ("userData" in props) {
|
||||||
try {
|
try {
|
||||||
parsedUserData = JSON.parse(props.userData);
|
parsedUserData = JSON.parse(props.userData);
|
||||||
if ("grabKey" in parsedUserData) {
|
if ("grabKey" in parsedUserData) {
|
||||||
delete parsedUserData["grabKey"];
|
parsedUserData.grabKey.refCount = 0;
|
||||||
|
delete parsedUserData.grabKey["avatarId"];
|
||||||
props["userData"] = JSON.stringify(parsedUserData);
|
props["userData"] = JSON.stringify(parsedUserData);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
|
@ -913,7 +913,7 @@ function MyController(hand) {
|
||||||
var SEARCH_SPHERE_FOLLOW_RATE = 0.50;
|
var SEARCH_SPHERE_FOLLOW_RATE = 0.50;
|
||||||
|
|
||||||
if (this.intersectionDistance > 0) {
|
if (this.intersectionDistance > 0) {
|
||||||
// If we hit something with our pick ray, move the search sphere toward that distance
|
// If we hit something with our pick ray, move the search sphere toward that distance
|
||||||
this.searchSphereDistance = this.searchSphereDistance * SEARCH_SPHERE_FOLLOW_RATE +
|
this.searchSphereDistance = this.searchSphereDistance * SEARCH_SPHERE_FOLLOW_RATE +
|
||||||
this.intersectionDistance * (1.0 - SEARCH_SPHERE_FOLLOW_RATE);
|
this.intersectionDistance * (1.0 - SEARCH_SPHERE_FOLLOW_RATE);
|
||||||
}
|
}
|
||||||
|
@ -1215,7 +1215,7 @@ function MyController(hand) {
|
||||||
return allowedJoints[handJointName][1];
|
return allowedJoints[handJointName][1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.nearGrabbing = function() {
|
this.nearGrabbing = function() {
|
||||||
var now = Date.now();
|
var now = Date.now();
|
||||||
var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, this.grabbedEntity, DEFAULT_GRABBABLE_DATA);
|
var grabbableData = getEntityCustomData(GRABBABLE_DATA_KEY, this.grabbedEntity, DEFAULT_GRABBABLE_DATA);
|
||||||
|
@ -1589,45 +1589,42 @@ function MyController(hand) {
|
||||||
data["avatarId"] = MyAvatar.sessionUUID;
|
data["avatarId"] = MyAvatar.sessionUUID;
|
||||||
if (wasLoaded) {
|
if (wasLoaded) {
|
||||||
data["refCount"] = 1;
|
data["refCount"] = 1;
|
||||||
|
data["avatarId"] = MyAvatar.sessionUUID;
|
||||||
} else {
|
} else {
|
||||||
data["refCount"] = data["refCount"] ? data["refCount"] + 1 : 1;
|
data["refCount"] = data["refCount"] ? data["refCount"] + 1 : 1;
|
||||||
}
|
|
||||||
// zero gravity and set ignoreForCollisions in a way that lets us put them back, after all grabs are done
|
|
||||||
if (data["refCount"] == 1) {
|
|
||||||
this.isInitialGrab = true;
|
|
||||||
data["gravity"] = grabbedProperties.gravity;
|
|
||||||
data["collidesWith"] = grabbedProperties.collidesWith;
|
|
||||||
data["collisionless"] = grabbedProperties.collisionless;
|
|
||||||
data["dynamic"] = grabbedProperties.dynamic;
|
|
||||||
data["parentID"] = wasLoaded ? NULL_UUID : grabbedProperties.parentID;
|
|
||||||
data["parentJointIndex"] = grabbedProperties.parentJointIndex;
|
|
||||||
|
|
||||||
if ("invertSolidWhileHeld" in grabbableData && grabbableData.invertSolidWhileHeld) {
|
// zero gravity and set ignoreForCollisions in a way that lets us put them back, after all grabs are done
|
||||||
data["collisionless"] = !data["collisionless"];
|
if (data["refCount"] == 1) {
|
||||||
|
this.isInitialGrab = true;
|
||||||
|
data["gravity"] = grabbedProperties.gravity;
|
||||||
|
data["collidesWith"] = grabbedProperties.collidesWith;
|
||||||
|
data["collisionless"] = grabbedProperties.collisionless;
|
||||||
|
data["dynamic"] = grabbedProperties.dynamic;
|
||||||
|
data["parentID"] = wasLoaded ? NULL_UUID : grabbedProperties.parentID;
|
||||||
|
data["parentJointIndex"] = grabbedProperties.parentJointIndex;
|
||||||
|
|
||||||
|
var whileHeldProperties = {
|
||||||
|
gravity: {
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
z: 0
|
||||||
|
},
|
||||||
|
// bummer, it isn't easy to do bitwise collisionMask operations like this:
|
||||||
|
//"collisionMask": COLLISION_MASK_WHILE_GRABBED | grabbedProperties.collisionMask
|
||||||
|
// when using string values
|
||||||
|
"collidesWith": COLLIDES_WITH_WHILE_GRABBED
|
||||||
|
};
|
||||||
|
Entities.editEntity(entityID, whileHeldProperties);
|
||||||
|
} else if (data["refCount"] > 1) {
|
||||||
|
this.isInitialGrab = false;
|
||||||
|
// if an object is being grabbed by more than one person (or the same person twice, but nevermind), switch
|
||||||
|
// the collision groups so that it wont collide with "other" avatars. This avoids a situation where two
|
||||||
|
// people are holding something and one of them will be able (if the other releases at the right time) to
|
||||||
|
// bootstrap themselves with the held object. This happens because the meaning of "otherAvatar" in
|
||||||
|
// the collision mask hinges on who the physics simulation owner is.
|
||||||
|
Entities.editEntity(entityID, {"collidesWith": COLLIDES_WITH_WHILE_MULTI_GRABBED});
|
||||||
}
|
}
|
||||||
|
|
||||||
var whileHeldProperties = {
|
|
||||||
gravity: {
|
|
||||||
x: 0,
|
|
||||||
y: 0,
|
|
||||||
z: 0
|
|
||||||
},
|
|
||||||
// bummer, it isn't easy to do bitwise collisionMask operations like this:
|
|
||||||
//"collisionMask": COLLISION_MASK_WHILE_GRABBED | grabbedProperties.collisionMask
|
|
||||||
// when using string values
|
|
||||||
"collidesWith": COLLIDES_WITH_WHILE_GRABBED
|
|
||||||
};
|
|
||||||
Entities.editEntity(entityID, whileHeldProperties);
|
|
||||||
} else if (data["refCount"] > 1) {
|
|
||||||
this.isInitialGrab = false;
|
|
||||||
// if an object is being grabbed by more than one person (or the same person twice, but nevermind), switch
|
|
||||||
// the collision groups so that it wont collide with "other" avatars. This avoids a situation where two
|
|
||||||
// people are holding something and one of them will be able (if the other releases at the right time) to
|
|
||||||
// bootstrap themselves with the held object. This happens because the meaning of "otherAvatar" in
|
|
||||||
// the collision mask hinges on who the physics simulation owner is.
|
|
||||||
Entities.editEntity(entityID, {"collidesWith": COLLIDES_WITH_WHILE_MULTI_GRABBED});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setEntityCustomData(GRAB_USER_DATA_KEY, entityID, data);
|
setEntityCustomData(GRAB_USER_DATA_KEY, entityID, data);
|
||||||
return data;
|
return data;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue