diff --git a/src/components/animated-robot-hands.js b/src/components/animated-robot-hands.js index ef7b429d177864cc4d78a907f333e5e38411d7f9..d963306eb9186654f89f201732ea5c91562f64c1 100644 --- a/src/components/animated-robot-hands.js +++ b/src/components/animated-robot-hands.js @@ -23,7 +23,7 @@ AFRAME.registerComponent("animated-robot-hands", { this.playAnimation = this.playAnimation.bind(this); // Get the three.js object in the scene graph that has the animation data - const root = this.el.querySelector("a-gltf-entity .RootScene").object3D.children[0]; + const root = this.el.object3D.children[0]; this.mixer = new THREE.AnimationMixer(root); this.root = root; diff --git a/src/components/ik-controller.js b/src/components/ik-controller.js index 3b4f323df72d83cfbe0d03ab00094318485eed22..ea8a1d216ad19cefc1b7d7450330888e1776c9c6 100644 --- a/src/components/ik-controller.js +++ b/src/components/ik-controller.js @@ -23,13 +23,16 @@ AFRAME.registerComponent("ik-root", { this.rightController = this.el.querySelector(this.data.rightController); updated = true; } - - if (updated) { - this.el.querySelector("[ik-controller]").components["ik-controller"].updateIkRoot(this); - } } }); +function findIKRoot(entity) { + while (entity && !(entity.components && entity.components["ik-root"])) { + entity = entity.parentNode; + } + return entity && entity.components["ik-root"]; +} + AFRAME.registerComponent("ik-controller", { schema: { leftEye: { type: "string", default: ".LeftEye" }, @@ -65,6 +68,8 @@ AFRAME.registerComponent("ik-controller", { this.rootToChest = new Matrix4(); this.invRootToChest = new Matrix4(); + this.ikRoot = findIKRoot(this.el); + this.hands = { left: { lastVisible: true, @@ -124,10 +129,6 @@ AFRAME.registerComponent("ik-controller", { .negate(); }, - updateIkRoot(ikRoot) { - this.ikRoot = ikRoot; - }, - tick(time, dt) { if (!this.ikRoot) { return; diff --git a/src/network-schemas.js b/src/network-schemas.js index 7685d08ca4b0daf81052e108d4d7c3629447bdfd..175cce5cf7c1d1ad48beb01fe72143ca781818a8 100644 --- a/src/network-schemas.js +++ b/src/network-schemas.js @@ -5,6 +5,7 @@ function registerNetworkSchemas() { "position", "rotation", "scale", + "player-info", { selector: ".camera", component: "position" @@ -36,11 +37,6 @@ function registerNetworkSchemas() { { selector: ".right-controller", component: "visible" - }, - { - selector: ".nametag", - component: "text", - property: "value" } ] }); diff --git a/src/room.html b/src/room.html index bf25b9b22a87d6c4702546bba5abac4e179f2709..c29bb29e467f8395cbd22ccd04479df7a210b674 100644 --- a/src/room.html +++ b/src/room.html @@ -33,7 +33,7 @@ high-src="./assets/avatars/BotDefault_Avatar.glb" low-src="./assets/avatars/BotDefault_Avatar_Unlit.glb" ></a-progressive-asset> - + <a-asset-item id="bot-dom-mesh" response-type="arraybuffer" src="./assets/avatars/BotDom_Avatar.glb"></a-asset-item> <a-asset-item id="watch-model" response-type="arraybuffer" src="./assets/hud/watch.glb"></a-asset-item> <a-asset-item id="meeting-space1-mesh" response-type="arraybuffer" src="./assets/environments/MeetingSpace1_mesh.glb"></a-asset-item> @@ -50,14 +50,18 @@ </template> <template id="remote-avatar-template"> - <a-entity ik-root> + <a-entity ik-root player-info> <a-entity class="camera"></a-entity> <a-entity class="left-controller"></a-entity> <a-entity class="right-controller"></a-entity> - <a-gltf-entity src="#bot-skinned-mesh" inflate="true" ik-controller > + <a-gltf-entity class="model" inflate="true"> + <template data-selector=".RootScene"> + <a-entity ik-controller></a-entity> + </template> + <template data-selector=".Neck"> <a-entity> <a-entity @@ -79,7 +83,7 @@ </a-entity> </template> - <template selector=".LeftHand"> + <template data-selector=".LeftHand"> <a-entity personal-space-invader ></a-entity> </template> @@ -100,7 +104,7 @@ wasd-to-analog2d character-controller="pivot: #player-camera" ik-root - animated-robot-hands + player-info > <a-entity id="player-camera" @@ -129,7 +133,14 @@ haptic-feedback ></a-entity> - <a-gltf-entity src="#bot-skinned-mesh" inflate="true" ik-controller> + <a-gltf-entity class="model" inflate="true"> + <template data-selector=".RootScene"> + <a-entity + ik-controller + animated-robot-hands + ></a-entity> + </template> + <template data-selector=".Neck"> <a-entity> <a-entity class="nametag" visible="false" text ></a-entity> diff --git a/src/room.js b/src/room.js index 849cd012ca5590ac974c9f9c4d6313c097671d02..854b58f495fe0fd0bd333128b5bbf0f9a5e9c2fd 100644 --- a/src/room.js +++ b/src/room.js @@ -40,6 +40,7 @@ import "./components/layers"; import "./components/spawn-controller"; import "./components/animated-robot-hands"; import "./components/hide-when-quality"; +import "./components/player-info"; import "./components/debug"; import "./systems/personal-space-bubble"; @@ -104,6 +105,7 @@ async function shareMedia(audio, video) { async function onSceneLoad() { const scene = document.querySelector("a-scene"); + const playerRig = document.querySelector("#player-rig"); scene.setAttribute("networked-scene", { room: qs.room && !isNaN(parseInt(qs.room)) ? parseInt(qs.room) : 1, @@ -115,7 +117,6 @@ async function onSceneLoad() { } if (isMobile || qs.mobile) { - const playerRig = document.querySelector("#player-rig"); playerRig.setAttribute("virtual-gamepad-controls", {}); } @@ -133,8 +134,10 @@ async function onSceneLoad() { username = promptForName(username); // promptForName is blocking } - const myNametag = document.querySelector("#player-rig .nametag"); - myNametag.setAttribute("text", "value", username); + playerRig.setAttribute("player-info", { + displayName: username, + avatar: qs.avatar || "#bot-skinned-mesh" + }); const avatarScale = parseInt(qs.avatarScale, 10);