diff --git a/unpublishedScripts/DomainContent/Home/dressingRoom/dressingRoom.js b/unpublishedScripts/DomainContent/Home/dressingRoom/dressingRoom.js index 49a236fc18..8b8d8ca312 100644 --- a/unpublishedScripts/DomainContent/Home/dressingRoom/dressingRoom.js +++ b/unpublishedScripts/DomainContent/Home/dressingRoom/dressingRoom.js @@ -1,25 +1,58 @@ (function() { + var utilsPath = Script.resolvePath("../utils.js"); + Script.include(utilsPath); + var avatarModelURL; + DressingRoom = function() { return this } DressingRoom.prototype = { preload: function(entityID) { - print('PRELOAD DRESSING ROOM') + print('PRELOAD DRESSING ROOM'); this.entityID = entityID; + avatarModelURL = getAvatarFBX(); }, enterEntity: function() { - print('ENTER DRESSING ROOM') + print('ENTER DRESSING ROOM'); + avatarModelURL = getAvatarFBX(); makeDoppelgangerForMyAvatar(); subscribeToWearableMessages(); - subscribeToFreezeMessages(); + // subscribeToFreezeMessages(); + this.setOccupied(); + var doppelProps = Entities.getEntityProperties(this.entityID); + Entities.editEntity(doppelgangers[0], { + dimensions: doppelProps.naturalDimensions, + }); }, leaveEntity: function() { - print('EXIT DRESSING ROOM!') + print('EXIT DRESSING ROOM!'); + this.setUnoccupied(); 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 // @@ -31,30 +64,26 @@ // Distributed under the Apache License, Version 2.0. // 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 MIRRORED_ENTITY_SCRIPT_URL = Script.resolvePath('mirroredEntity.js'); var FREEZE_TOGGLER_SCRIPT_URL = Script.resolvePath('freezeToggler.js?' + Math.random(0, 1000)) - var THROTTLE = false; + var THROTTLE = true; var THROTTLE_RATE = 100; var doppelgangers = []; - function Doppelganger(avatar) { this.initialProperties = { name: 'Hifi-Doppelganger', type: 'Model', - modelURL: TEST_MODEL_URL, + modelURL: avatarModelURL, // dimensions: getAvatarDimensions(avatar), - position: putDoppelgangerAcrossFromAvatar(this, avatar), - rotation: rotateDoppelgangerTowardAvatar(this, avatar), + position: matchBasePosition(), + rotation: matchBaseRotation(), collisionsWillMove: false, ignoreForCollisions: false, - script: FREEZE_TOGGLER_SCRIPT_URL, + // script: FREEZE_TOGGLER_SCRIPT_URL, userData: JSON.stringify({ grabbableKey: { grabbable: false, @@ -63,11 +92,36 @@ }) }; - this.id = createDoppelgangerEntity(this); + this.id = createDoppelgangerEntity(this.initialProperties); this.avatar = avatar; 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) { var allJointData = []; var jointNames = MyAvatar.jointNames; @@ -86,14 +140,16 @@ } function setJointData(doppelganger, relativeXforms) { + print('setting joint data for ' + doppelganger.id) var jointRotations = []; var i, l = relativeXforms.length; for (i = 0; i < l; i++) { jointRotations.push(relativeXforms[i].rot); } var setJointSuccess = Entities.setAbsoluteJointRotationsInObjectFrame(doppelganger.id, jointRotations); - // print('SUCCESS SETTING JOINTS?' + setJointSuccess + "for " +doppelganger.id) - return true; + print('JOINT ROTATIONS:: ' + JSON.stringify(jointRotations)); + print('SUCCESS SETTING JOINTS?' + setJointSuccess + "for " + doppelganger.id) + return; } // maps joint names to their mirrored joint @@ -344,16 +400,12 @@ return new Doppelganger(avatar); } - function createDoppelgangerEntity(doppelganger) { - return Entities.addEntity(doppelganger.initialProperties); + function createDoppelgangerEntity(initialProperties) { + return Entities.addEntity(initialProperties); } - function putDoppelgangerAcrossFromAvatar(doppelganger, avatar) { - var avatarRot = Quat.fromPitchYawRollDegrees(0, avatar.bodyYaw, 0.0); - var position; - + function matchBasePosition() { var ids = Entities.findEntities(MyAvatar.position, 20); - var hasBase = false; for (var i = 0; i < ids.length; i++) { var entityID = ids[i]; var props = Entities.getEntityProperties(entityID, "name"); @@ -362,19 +414,13 @@ var details = Entities.getEntityProperties(entityID, ["position", "dimensions"]); details.position.y += getAvatarFootOffset(); details.position.y += details.dimensions.y / 2; - position = details.position; - hasBase = true; + print('JBP BASE POSITION ' + JSON.stringify(details.position)) + return details.position; } } - - if (hasBase === false) { - position = Vec3.sum(avatar.position, Vec3.multiply(1.5, Quat.getFront(avatarRot))); - - } - - return position; } + function getAvatarFootOffset() { var data = getJointData(); var upperLeg, lowerLeg, foot, toe, toeTop; @@ -404,14 +450,7 @@ return offset } - - function getAvatarDimensions(avatar) { - return dimensions; - } - - function rotateDoppelgangerTowardAvatar(doppelganger, avatar) { - var avatarRot = Quat.fromPitchYawRollDegrees(0, avatar.bodyYaw, 0.0); - + function matchBaseRotation() { var ids = Entities.findEntities(MyAvatar.position, 20); var hasBase = false; for (var i = 0; i < ids.length; i++) { @@ -420,29 +459,21 @@ var name = props.name; if (name === "Hifi-Dressing-Room-Base") { 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() { Script.update.connect(updateDoppelganger); - isConnected = true; + } function disconnectDoppelgangerUpdates() { - - if (isConnected === true) { - print('SHOULD DISCONNECT') - Script.update.disconnect(updateDoppelganger); - } - isConnected = false; + Script.update.disconnect(updateDoppelganger); } var sinceLastUpdate = 0; @@ -472,12 +503,16 @@ absoluteXforms = mirroredAbsoluteXforms; } var relativeXforms = buildRelativeXformsFromAbsoluteXforms(absoluteXforms); + // print('DOPPELGANGERS:::: ' + doppelgangers.length); + // print('first doppel id:: ' + doppelgangers[0].id); doppelgangers.forEach(function(doppelganger) { setJointData(doppelganger, relativeXforms); - }); + }) + } function makeDoppelgangerForMyAvatar() { + doppelgangers = []; var doppelganger = createDoppelganger(MyAvatar); doppelgangers.push(doppelganger); connectDoppelgangerUpdates(); @@ -515,7 +550,6 @@ } if (parsedMessage.action === 'unfreeze') { print('ACTUAL UNFREEZE') - connectDoppelgangerUpdates(); } @@ -657,14 +691,15 @@ function cleanup() { - if (isConnected === true) { - disconnectDoppelgangerUpdates(); - } + + Script.update.disconnect(updateDoppelganger); doppelgangers.forEach(function(doppelganger) { - print('DOPPELGANGER' + doppelganger.id) + print('DELETING DOPPELGANGER' + doppelganger.id) Entities.deleteEntity(doppelganger.id); }); + + doppelgangers = []; } return new DressingRoom();