mirror of
https://github.com/overte-org/overte.git
synced 2025-04-14 17:46:52 +02:00
Updated version of puck-attach.js
This commit is contained in:
parent
82654c7cda
commit
498ac5d0ab
1 changed files with 121 additions and 52 deletions
|
@ -17,7 +17,7 @@ Script.include("/~/system/libraries/Xform.js");
|
||||||
(function() { // BEGIN LOCAL_SCOPE
|
(function() { // BEGIN LOCAL_SCOPE
|
||||||
|
|
||||||
var TABLET_BUTTON_NAME = "PUCKTACH";
|
var TABLET_BUTTON_NAME = "PUCKTACH";
|
||||||
var TABLET_APP_URL = "http://content.highfidelity.com/seefo/production/puck-attach/puck-attach.html";
|
var TABLET_APP_URL = "https://hifi-content.s3.amazonaws.com/seefo/production/puck-attach/puck-attach.html";
|
||||||
|
|
||||||
var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system");
|
var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system");
|
||||||
var tabletButton = tablet.addButton({
|
var tabletButton = tablet.addButton({
|
||||||
|
@ -33,12 +33,6 @@ function onScreenChanged(type, url) {
|
||||||
if (!shown) {
|
if (!shown) {
|
||||||
// hook up to event bridge
|
// hook up to event bridge
|
||||||
tablet.webEventReceived.connect(onWebEventReceived);
|
tablet.webEventReceived.connect(onWebEventReceived);
|
||||||
|
|
||||||
Script.setTimeout(function () {
|
|
||||||
// send available tracked objects to the html running in the tablet.
|
|
||||||
var availableTrackedObjects = getAvailableTrackedObjects();
|
|
||||||
tablet.emitScriptEvent(JSON.stringify(availableTrackedObjects));
|
|
||||||
}, 1000); // wait 1 sec before sending..
|
|
||||||
}
|
}
|
||||||
shown = true;
|
shown = true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -72,6 +66,12 @@ function getAvailableTrackedObjects() {
|
||||||
}
|
}
|
||||||
return available;
|
return available;
|
||||||
}
|
}
|
||||||
|
function sendAvailableTrackedObjects() {
|
||||||
|
tablet.emitScriptEvent(JSON.stringify({
|
||||||
|
pucks: getAvailableTrackedObjects(),
|
||||||
|
selectedPuck: ((lastPuck === undefined) ? -1 : lastPuck.name)
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
function getRelativePosition(origin, rotation, offset) {
|
function getRelativePosition(origin, rotation, offset) {
|
||||||
var relativeOffset = Vec3.multiplyQbyV(rotation, offset);
|
var relativeOffset = Vec3.multiplyQbyV(rotation, offset);
|
||||||
|
@ -81,45 +81,74 @@ function getRelativePosition(origin, rotation, offset) {
|
||||||
function getPropertyForEntity(entityID, propertyName) {
|
function getPropertyForEntity(entityID, propertyName) {
|
||||||
return Entities.getEntityProperties(entityID, [propertyName])[propertyName];
|
return Entities.getEntityProperties(entityID, [propertyName])[propertyName];
|
||||||
}
|
}
|
||||||
|
function entityExists(entityID) {
|
||||||
|
return Object.keys(Entities.getEntityProperties(entityID)).length > 0;
|
||||||
|
}
|
||||||
|
|
||||||
var VIVE_PUCK_MODEL = "http://content.highfidelity.com/seefo/production/puck-attach/vive_tracker_puck.obj";
|
var VIVE_PUCK_MODEL = "http://content.highfidelity.com/seefo/production/puck-attach/vive_tracker_puck.obj";
|
||||||
var VIVE_PUCK_DIMENSIONS = { x: 0.0945, y: 0.0921, z: 0.0423 }; // 1/1000th scale of model
|
var VIVE_PUCK_DIMENSIONS = { x: 0.0945, y: 0.0921, z: 0.0423 }; // 1/1000th scale of model
|
||||||
var VIVE_PUCK_SEARCH_DISTANCE = 1.5; // metres
|
var VIVE_PUCK_SEARCH_DISTANCE = 1.5; // metres
|
||||||
var VIVE_PUCK_SPAWN_DISTANCE = 1.0; // metres
|
var VIVE_PUCK_SPAWN_DISTANCE = 0.5; // metres
|
||||||
|
var VIVE_PUCK_TRACKED_OBJECT_MAX_DISTANCE = 10.0; // metres
|
||||||
var VIVE_PUCK_NAME = "Tracked Puck";
|
var VIVE_PUCK_NAME = "Tracked Puck";
|
||||||
|
|
||||||
var trackedPucks = { };
|
var trackedPucks = { };
|
||||||
var lastPuck = { };
|
var lastPuck;
|
||||||
|
|
||||||
function createPuck(puck) {
|
function createPuck(puck) {
|
||||||
// create a puck entity and add it to our list of pucks
|
// create a puck entity and add it to our list of pucks
|
||||||
var spawnOffset = Vec3.multiply(Vec3.FRONT, VIVE_PUCK_SPAWN_DISTANCE);
|
var action = indexToTrackedObjectName(puck.puckno);
|
||||||
var spawnPosition = getRelativePosition(MyAvatar.position, MyAvatar.orientation, spawnOffset);
|
var pose = Controller.getPoseValue(Controller.Standard[action]);
|
||||||
|
|
||||||
// should be an overlay
|
|
||||||
var puckEntityProperties = {
|
|
||||||
name: "Tracked Puck",
|
|
||||||
type: "Model",
|
|
||||||
modelURL: VIVE_PUCK_MODEL,
|
|
||||||
dimensions: VIVE_PUCK_DIMENSIONS,
|
|
||||||
position: spawnPosition,
|
|
||||||
userData: '{ "grabbableKey": { "grabbable": true, "kinematic": false } }'
|
|
||||||
};
|
|
||||||
|
|
||||||
var puckEntityID = Entities.addEntity(puckEntityProperties);
|
|
||||||
|
|
||||||
if (trackedPucks.hasOwnProperty(puck.puckno)) {
|
if (pose && pose.valid) {
|
||||||
destroyPuck(puck.puckno);
|
var spawnOffset = Vec3.multiply(Vec3.FRONT, VIVE_PUCK_SPAWN_DISTANCE);
|
||||||
|
var spawnPosition = getRelativePosition(MyAvatar.position, MyAvatar.orientation, spawnOffset);
|
||||||
|
|
||||||
|
// should be an overlay
|
||||||
|
var puckEntityProperties = {
|
||||||
|
name: "Tracked Puck",
|
||||||
|
type: "Model",
|
||||||
|
modelURL: VIVE_PUCK_MODEL,
|
||||||
|
dimensions: VIVE_PUCK_DIMENSIONS,
|
||||||
|
position: spawnPosition,
|
||||||
|
userData: '{ "grabbableKey": { "grabbable": true, "kinematic": false } }'
|
||||||
|
};
|
||||||
|
|
||||||
|
var puckEntityID = Entities.addEntity(puckEntityProperties);
|
||||||
|
|
||||||
|
// if we've already created this puck, destroy it
|
||||||
|
if (trackedPucks.hasOwnProperty(puck.puckno)) {
|
||||||
|
destroyPuck(puck.puckno);
|
||||||
|
}
|
||||||
|
// if we had an unfinalized puck, destroy it
|
||||||
|
if (lastPuck !== undefined) {
|
||||||
|
destroyPuck(lastPuck.name);
|
||||||
|
}
|
||||||
|
// create our new unfinalized puck
|
||||||
|
trackedPucks[puck.puckno] = {
|
||||||
|
puckEntityID: puckEntityID,
|
||||||
|
trackedEntityID: ""
|
||||||
|
};
|
||||||
|
lastPuck = trackedPucks[puck.puckno];
|
||||||
|
lastPuck.name = Number(puck.puckno);
|
||||||
}
|
}
|
||||||
|
|
||||||
trackedPucks[puck.puckno] = {
|
|
||||||
puckEntityID: puckEntityID,
|
|
||||||
trackedEntityID: ""
|
|
||||||
};
|
|
||||||
lastPuck = trackedPucks[puck.puckno];
|
|
||||||
}
|
}
|
||||||
function finalizePuck() {
|
function finalizePuck(puckName) {
|
||||||
// find nearest entity and change its parent to the puck
|
// find nearest entity and change its parent to the puck
|
||||||
|
|
||||||
|
if (!trackedPucks.hasOwnProperty(puckName)) {
|
||||||
|
print('2');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (lastPuck === undefined) {
|
||||||
|
print('3');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (lastPuck.name !== Number(puckName)) {
|
||||||
|
print('1');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var puckPosition = getPropertyForEntity(lastPuck.puckEntityID, "position");
|
var puckPosition = getPropertyForEntity(lastPuck.puckEntityID, "position");
|
||||||
var foundEntities = Entities.findEntities(puckPosition, VIVE_PUCK_SEARCH_DISTANCE);
|
var foundEntities = Entities.findEntities(puckPosition, VIVE_PUCK_SEARCH_DISTANCE);
|
||||||
|
|
||||||
|
@ -142,7 +171,16 @@ function finalizePuck() {
|
||||||
|
|
||||||
if (foundEntity) {
|
if (foundEntity) {
|
||||||
lastPuck.trackedEntityID = foundEntity;
|
lastPuck.trackedEntityID = foundEntity;
|
||||||
Entities.editEntity(lastPuck.trackedEntityID, { "parentID": lastPuck.puckEntityID });
|
// remember the userdata for the tracked entity since we're about to
|
||||||
|
// remove it and make it ungrabbable
|
||||||
|
lastPuck.trackedEntityUserData = getPropertyForEntity(foundEntity, "userData");
|
||||||
|
// update properties of the tracked entity
|
||||||
|
Entities.editEntity(lastPuck.trackedEntityID, {
|
||||||
|
"parentID": lastPuck.puckEntityID,
|
||||||
|
"userData": '{ "grabbableKey": { "grabbable": false } }'
|
||||||
|
});
|
||||||
|
// remove reference to puck since it is now calibrated and finalized
|
||||||
|
lastPuck = undefined;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function updatePucks() {
|
function updatePucks() {
|
||||||
|
@ -156,32 +194,57 @@ function updatePucks() {
|
||||||
if (pose && pose.valid) {
|
if (pose && pose.valid) {
|
||||||
var puck = trackedPucks[puckName];
|
var puck = trackedPucks[puckName];
|
||||||
if (puck.trackedEntityID) {
|
if (puck.trackedEntityID) {
|
||||||
var avatarXform = new Xform(MyAvatar.orientation, MyAvatar.position);
|
if (entityExists(puck.trackedEntityID)) {
|
||||||
var puckXform = new Xform(pose.rotation, pose.translation);
|
var avatarXform = new Xform(MyAvatar.orientation, MyAvatar.position);
|
||||||
var finalXform = Xform.mul(avatarXform, puckXform);
|
var puckXform = new Xform(pose.rotation, pose.translation);
|
||||||
|
var finalXform = Xform.mul(avatarXform, puckXform);
|
||||||
|
|
||||||
|
var d = Vec3.distance(MyAvatar.position, finalXform.pos);
|
||||||
|
if (d > VIVE_PUCK_TRACKED_OBJECT_MAX_DISTANCE) {
|
||||||
|
print('tried to move tracked object too far away: ' + d);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Entities.editEntity(puck.puckEntityID, {
|
Entities.editEntity(puck.puckEntityID, {
|
||||||
position: finalXform.pos,
|
position: finalXform.pos,
|
||||||
rotation: finalXform.rot,
|
rotation: finalXform.rot
|
||||||
});
|
});
|
||||||
|
|
||||||
// in case someone grabbed both entities and destroyed the
|
// in case someone grabbed both entities and destroyed the
|
||||||
// child/parent relationship
|
// child/parent relationship
|
||||||
Entities.editEntity(puck.trackedEntityID, {
|
Entities.editEntity(puck.trackedEntityID, {
|
||||||
parentID: puck.puckEntityID
|
parentID: puck.puckEntityID
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
destroyPuck(puckName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function destroyPuck(puckName) {
|
function destroyPuck(puckName) {
|
||||||
// unparent entity and delete its parent
|
// unparent entity and delete its parent
|
||||||
var puckEntityID = trackedPucks[puckName].puckEntityID;
|
if (!trackedPucks.hasOwnProperty(puckName)) {
|
||||||
var trackedEntityID = trackedPucks[puckName].trackedEntityID;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var puck = trackedPucks[puckName];
|
||||||
|
var puckEntityID = puck.puckEntityID;
|
||||||
|
var trackedEntityID = puck.trackedEntityID;
|
||||||
|
|
||||||
// remove the puck as a parent entity and then delete the puck
|
// remove the puck as a parent entity and restore the tracked entities
|
||||||
Entities.editEntity(trackedEntityID, { "parentID": "{00000000-0000-0000-0000-000000000000}" });
|
// former userdata
|
||||||
Entities.deleteEntity(puckEntityID);
|
Entities.editEntity(trackedEntityID, {
|
||||||
|
"parentID": "{00000000-0000-0000-0000-000000000000}",
|
||||||
|
"userData": puck.trackedEntityUserData
|
||||||
|
});
|
||||||
|
|
||||||
|
delete trackedPucks[puckName];
|
||||||
|
|
||||||
|
Script.setTimeout(function() {
|
||||||
|
// delete the puck
|
||||||
|
Entities.deleteEntity(puckEntityID);
|
||||||
|
}, 100);
|
||||||
}
|
}
|
||||||
function destroyPucks() {
|
function destroyPucks() {
|
||||||
// remove all pucks and unparent entities
|
// remove all pucks and unparent entities
|
||||||
|
@ -202,11 +265,17 @@ function onWebEventReceived(msg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (obj.cmd) {
|
switch (obj.cmd) {
|
||||||
|
case "ready":
|
||||||
|
sendAvailableTrackedObjects();
|
||||||
|
break;
|
||||||
case "create":
|
case "create":
|
||||||
createPuck(obj);
|
createPuck(obj);
|
||||||
break;
|
break;
|
||||||
case "finalize":
|
case "finalize":
|
||||||
finalizePuck();
|
finalizePuck(obj.puckno);
|
||||||
|
break;
|
||||||
|
case "destroy":
|
||||||
|
destroyPuck(obj.puckno);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue