revert revert

This commit is contained in:
James B. Pollack 2016-03-24 17:01:43 -07:00
parent 542ad2ed62
commit d3e7e4c791

View file

@ -1,25 +1,58 @@
(function() { (function() {
var utilsPath = Script.resolvePath("../utils.js");
Script.include(utilsPath);
var avatarModelURL;
DressingRoom = function() { DressingRoom = function() {
return this return this
} }
DressingRoom.prototype = { DressingRoom.prototype = {
preload: function(entityID) { preload: function(entityID) {
print('PRELOAD DRESSING ROOM') print('PRELOAD DRESSING ROOM');
this.entityID = entityID; this.entityID = entityID;
avatarModelURL = getAvatarFBX();
}, },
enterEntity: function() { enterEntity: function() {
print('ENTER DRESSING ROOM') print('ENTER DRESSING ROOM');
avatarModelURL = getAvatarFBX();
makeDoppelgangerForMyAvatar(); makeDoppelgangerForMyAvatar();
subscribeToWearableMessages(); subscribeToWearableMessages();
subscribeToFreezeMessages(); // subscribeToFreezeMessages();
this.setOccupied();
var doppelProps = Entities.getEntityProperties(this.entityID);
Entities.editEntity(doppelgangers[0], {
dimensions: doppelProps.naturalDimensions,
});
}, },
leaveEntity: function() { leaveEntity: function() {
print('EXIT DRESSING ROOM!') print('EXIT DRESSING ROOM!');
this.setUnoccupied();
cleanup(); cleanup();
} },
checkIfOccupied: function() {
var data = getEntityCustomData('hifi-home-dressing-room', this.entityID, {
occupied: false
});
return data.occupied;
},
setOccupied: function() {
setEntityCustomData('hifi-home-dressing-room', this.entityID, {
occupied: true
});
},
setUnoccupied: function() {
setEntityCustomData('hifi-home-dressing-room', this.entityID, {
occupied: false
});
},
unload: function() {
this.setUnoccupied();
cleanup();
},
}; };
// //
// doppelganger.js // doppelganger.js
// //
@ -31,30 +64,26 @@
// Distributed under the Apache License, Version 2.0. // Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
// //
// To-Do: mirror joints, rotate avatar fully, automatically get avatar fbx, make sure dimensions for avatar are right when u bring it in
var TEST_MODEL_URL = 'https://s3.amazonaws.com/hifi-public/ozan/avatars/albert/albert/albert.fbx';
var MIRROR_JOINT_DATA = true; var MIRROR_JOINT_DATA = true;
var MIRRORED_ENTITY_SCRIPT_URL = Script.resolvePath('mirroredEntity.js'); var MIRRORED_ENTITY_SCRIPT_URL = Script.resolvePath('mirroredEntity.js');
var FREEZE_TOGGLER_SCRIPT_URL = Script.resolvePath('freezeToggler.js?' + Math.random(0, 1000)) var FREEZE_TOGGLER_SCRIPT_URL = Script.resolvePath('freezeToggler.js?' + Math.random(0, 1000))
var THROTTLE = false; var THROTTLE = true;
var THROTTLE_RATE = 100; var THROTTLE_RATE = 100;
var doppelgangers = []; var doppelgangers = [];
function Doppelganger(avatar) { function Doppelganger(avatar) {
this.initialProperties = { this.initialProperties = {
name: 'Hifi-Doppelganger', name: 'Hifi-Doppelganger',
type: 'Model', type: 'Model',
modelURL: TEST_MODEL_URL, modelURL: avatarModelURL,
// dimensions: getAvatarDimensions(avatar), // dimensions: getAvatarDimensions(avatar),
position: putDoppelgangerAcrossFromAvatar(this, avatar), position: matchBasePosition(),
rotation: rotateDoppelgangerTowardAvatar(this, avatar), rotation: matchBaseRotation(),
collisionsWillMove: false, collisionsWillMove: false,
ignoreForCollisions: false, ignoreForCollisions: false,
script: FREEZE_TOGGLER_SCRIPT_URL, // script: FREEZE_TOGGLER_SCRIPT_URL,
userData: JSON.stringify({ userData: JSON.stringify({
grabbableKey: { grabbableKey: {
grabbable: false, grabbable: false,
@ -63,11 +92,36 @@
}) })
}; };
this.id = createDoppelgangerEntity(this); this.id = createDoppelgangerEntity(this.initialProperties);
this.avatar = avatar; this.avatar = avatar;
return this; return this;
} }
function getAvatarFBX() {
var skeletonURL = MyAvatar.skeletonModelURL;
var req = new XMLHttpRequest();
req.open("GET", skeletonURL, false);
req.send();
var fst = req.responseText;
var fbxURL;
var split = fst.split('\n');
split.forEach(function(line) {
if (line.indexOf('filename') > -1) {
var innerSplit = line.split(" ");
innerSplit.forEach(function(inner) {
if (inner.indexOf('.fbx') > -1) {
fbxURL = inner;
}
})
}
});
return fbxURL
}
function getJointData(avatar) { function getJointData(avatar) {
var allJointData = []; var allJointData = [];
var jointNames = MyAvatar.jointNames; var jointNames = MyAvatar.jointNames;
@ -86,14 +140,16 @@
} }
function setJointData(doppelganger, relativeXforms) { function setJointData(doppelganger, relativeXforms) {
print('setting joint data for ' + doppelganger.id)
var jointRotations = []; var jointRotations = [];
var i, l = relativeXforms.length; var i, l = relativeXforms.length;
for (i = 0; i < l; i++) { for (i = 0; i < l; i++) {
jointRotations.push(relativeXforms[i].rot); jointRotations.push(relativeXforms[i].rot);
} }
var setJointSuccess = Entities.setAbsoluteJointRotationsInObjectFrame(doppelganger.id, jointRotations); var setJointSuccess = Entities.setAbsoluteJointRotationsInObjectFrame(doppelganger.id, jointRotations);
// print('SUCCESS SETTING JOINTS?' + setJointSuccess + "for " +doppelganger.id) print('JOINT ROTATIONS:: ' + JSON.stringify(jointRotations));
return true; print('SUCCESS SETTING JOINTS?' + setJointSuccess + "for " + doppelganger.id)
return;
} }
// maps joint names to their mirrored joint // maps joint names to their mirrored joint
@ -344,16 +400,12 @@
return new Doppelganger(avatar); return new Doppelganger(avatar);
} }
function createDoppelgangerEntity(doppelganger) { function createDoppelgangerEntity(initialProperties) {
return Entities.addEntity(doppelganger.initialProperties); return Entities.addEntity(initialProperties);
} }
function putDoppelgangerAcrossFromAvatar(doppelganger, avatar) { function matchBasePosition() {
var avatarRot = Quat.fromPitchYawRollDegrees(0, avatar.bodyYaw, 0.0);
var position;
var ids = Entities.findEntities(MyAvatar.position, 20); var ids = Entities.findEntities(MyAvatar.position, 20);
var hasBase = false;
for (var i = 0; i < ids.length; i++) { for (var i = 0; i < ids.length; i++) {
var entityID = ids[i]; var entityID = ids[i];
var props = Entities.getEntityProperties(entityID, "name"); var props = Entities.getEntityProperties(entityID, "name");
@ -362,18 +414,12 @@
var details = Entities.getEntityProperties(entityID, ["position", "dimensions"]); var details = Entities.getEntityProperties(entityID, ["position", "dimensions"]);
details.position.y += getAvatarFootOffset(); details.position.y += getAvatarFootOffset();
details.position.y += details.dimensions.y / 2; details.position.y += details.dimensions.y / 2;
position = details.position; print('JBP BASE POSITION ' + JSON.stringify(details.position))
hasBase = true; return details.position;
}
} }
} }
if (hasBase === false) {
position = Vec3.sum(avatar.position, Vec3.multiply(1.5, Quat.getFront(avatarRot)));
}
return position;
}
function getAvatarFootOffset() { function getAvatarFootOffset() {
var data = getJointData(); var data = getJointData();
@ -404,14 +450,7 @@
return offset return offset
} }
function matchBaseRotation() {
function getAvatarDimensions(avatar) {
return dimensions;
}
function rotateDoppelgangerTowardAvatar(doppelganger, avatar) {
var avatarRot = Quat.fromPitchYawRollDegrees(0, avatar.bodyYaw, 0.0);
var ids = Entities.findEntities(MyAvatar.position, 20); var ids = Entities.findEntities(MyAvatar.position, 20);
var hasBase = false; var hasBase = false;
for (var i = 0; i < ids.length; i++) { for (var i = 0; i < ids.length; i++) {
@ -420,30 +459,22 @@
var name = props.name; var name = props.name;
if (name === "Hifi-Dressing-Room-Base") { if (name === "Hifi-Dressing-Room-Base") {
var details = Entities.getEntityProperties(entityID, "rotation"); var details = Entities.getEntityProperties(entityID, "rotation");
avatarRot = details.rotation; print('JBP DOPPELGANGER ROTATION SET TO BASE:: ' + JSON.stringify(details.rotation))
return details.rotation;
} }
} }
if (hasBase === false) {
avatarRot = Vec3.multiply(-1, avatarRot);
}
return avatarRot;
} }
var isConnected = false;
function connectDoppelgangerUpdates() { function connectDoppelgangerUpdates() {
Script.update.connect(updateDoppelganger); Script.update.connect(updateDoppelganger);
isConnected = true;
} }
function disconnectDoppelgangerUpdates() { function disconnectDoppelgangerUpdates() {
if (isConnected === true) {
print('SHOULD DISCONNECT')
Script.update.disconnect(updateDoppelganger); Script.update.disconnect(updateDoppelganger);
} }
isConnected = false;
}
var sinceLastUpdate = 0; var sinceLastUpdate = 0;
@ -472,12 +503,16 @@
absoluteXforms = mirroredAbsoluteXforms; absoluteXforms = mirroredAbsoluteXforms;
} }
var relativeXforms = buildRelativeXformsFromAbsoluteXforms(absoluteXforms); var relativeXforms = buildRelativeXformsFromAbsoluteXforms(absoluteXforms);
// print('DOPPELGANGERS:::: ' + doppelgangers.length);
// print('first doppel id:: ' + doppelgangers[0].id);
doppelgangers.forEach(function(doppelganger) { doppelgangers.forEach(function(doppelganger) {
setJointData(doppelganger, relativeXforms); setJointData(doppelganger, relativeXforms);
}); })
} }
function makeDoppelgangerForMyAvatar() { function makeDoppelgangerForMyAvatar() {
doppelgangers = [];
var doppelganger = createDoppelganger(MyAvatar); var doppelganger = createDoppelganger(MyAvatar);
doppelgangers.push(doppelganger); doppelgangers.push(doppelganger);
connectDoppelgangerUpdates(); connectDoppelgangerUpdates();
@ -515,7 +550,6 @@
} }
if (parsedMessage.action === 'unfreeze') { if (parsedMessage.action === 'unfreeze') {
print('ACTUAL UNFREEZE') print('ACTUAL UNFREEZE')
connectDoppelgangerUpdates(); connectDoppelgangerUpdates();
} }
@ -657,14 +691,15 @@
function cleanup() { function cleanup() {
if (isConnected === true) {
disconnectDoppelgangerUpdates(); Script.update.disconnect(updateDoppelganger);
}
doppelgangers.forEach(function(doppelganger) { doppelgangers.forEach(function(doppelganger) {
print('DOPPELGANGER' + doppelganger.id) print('DELETING DOPPELGANGER' + doppelganger.id)
Entities.deleteEntity(doppelganger.id); Entities.deleteEntity(doppelganger.id);
}); });
doppelgangers = [];
} }
return new DressingRoom(); return new DressingRoom();