@pixiv/three-vrm-core 2.0.6 → 2.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/three-vrm-core.js +87 -56
- package/lib/three-vrm-core.min.js +1 -1
- package/lib/three-vrm-core.module.js +87 -56
- package/lib/three-vrm-core.module.min.js +1 -1
- package/package.json +9 -7
- package/ts3.4/types/expressions/VRMExpressionMaterialColorBind.d.ts +16 -3
- package/types/expressions/VRMExpressionMaterialColorBind.d.ts +16 -3
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! (c) 2020-2023 pixiv Inc. - https://github.com/pixiv/three-vrm/blob/release/LICENSE */
|
|
2
|
-
import*as e from"three";class t extends e.Object3D{get overrideBlinkAmount(){return"block"===this.overrideBlink?0<this.weight?1:0:"blend"===this.overrideBlink?this.weight:0}get overrideLookAtAmount(){return"block"===this.overrideLookAt?0<this.weight?1:0:"blend"===this.overrideLookAt?this.weight:0}get overrideMouthAmount(){return"block"===this.overrideMouth?0<this.weight?1:0:"blend"===this.overrideMouth?this.weight:0}constructor(e){super(),this.weight=0,this.isBinary=!1,this.overrideBlink="none",this.overrideLookAt="none",this.overrideMouth="none",this._binds=[],this.name=`VRMExpression_${e}`,this.expressionName=e,this.type="VRMExpression",this.visible=!1}addBind(e){this._binds.push(e)}applyWeight(e){var t;let i=this.isBinary?this.weight<=.5?0:1:this.weight;i*=null!==(t=null==e?void 0:e.multiplier)&&void 0!==t?t:1,this._binds.forEach((e=>e.applyWeight(i)))}clearAppliedWeight(){this._binds.forEach((e=>e.clearAppliedWeight()))}}function i(e,t,i,r){return new(i||(i=Promise))((function(o,n){function s(e){try{l(r.next(e))}catch(e){n(e)}}function a(e){try{l(r.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(s,a)}l((r=r.apply(e,t||[])).next())}))}function r(e,t,i){var r,o;const n=e.parser.json,s=null===(r=n.nodes)||void 0===r?void 0:r[t];if(null==s)return console.warn(`extractPrimitivesInternal: Attempt to use nodes[${t}] of glTF but the node doesn't exist`),null;const a=s.mesh;if(null==a)return null;const l=null===(o=n.meshes)||void 0===o?void 0:o[a];if(null==l)return console.warn(`extractPrimitivesInternal: Attempt to use meshes[${a}] of glTF but the mesh doesn't exist`),null;const h=l.primitives.length,u=[];return i.traverse((e=>{u.length<h&&e.isMesh&&u.push(e)})),u}function o(e,t){return i(this,void 0,void 0,(function*(){const i=yield e.parser.getDependency("node",t);return r(e,t,i)}))}function n(e){return i(this,void 0,void 0,(function*(){const t=yield e.parser.getDependencies("node"),i=new Map;return t.forEach(((t,o)=>{const n=r(e,o,t);null!=n&&i.set(o,n)})),i}))}function s(t,i){var r,o;let n=null;if(parseInt(e.REVISION,10)>=133)n=null!==(o=null===(r=t.associations.get(i))||void 0===r?void 0:r.materials)&&void 0!==o?o:null;else{const e=t.associations.get(i);"materials"===(null==e?void 0:e.type)&&(n=e.index)}return n}const a={Aa:"aa",Ih:"ih",Ou:"ou",Ee:"ee",Oh:"oh",Blink:"blink",Happy:"happy",Angry:"angry",Sad:"sad",Relaxed:"relaxed",LookUp:"lookUp",Surprised:"surprised",LookDown:"lookDown",LookLeft:"lookLeft",LookRight:"lookRight",BlinkLeft:"blinkLeft",BlinkRight:"blinkRight",Neutral:"neutral"};function l(e){return Math.max(Math.min(e,1),0)}class h{get expressions(){return this._expressions.concat()}get expressionMap(){return Object.assign({},this._expressionMap)}get presetExpressionMap(){const e={},t=new Set(Object.values(a));return Object.entries(this._expressionMap).forEach((([i,r])=>{t.has(i)&&(e[i]=r)})),e}get customExpressionMap(){const e={},t=new Set(Object.values(a));return Object.entries(this._expressionMap).forEach((([i,r])=>{t.has(i)||(e[i]=r)})),e}constructor(){this.blinkExpressionNames=["blink","blinkLeft","blinkRight"],this.lookAtExpressionNames=["lookLeft","lookRight","lookUp","lookDown"],this.mouthExpressionNames=["aa","ee","ih","oh","ou"],this._expressions=[],this._expressionMap={}}copy(e){return this._expressions.concat().forEach((e=>{this.unregisterExpression(e)})),e._expressions.forEach((e=>{this.registerExpression(e)})),this.blinkExpressionNames=e.blinkExpressionNames.concat(),this.lookAtExpressionNames=e.lookAtExpressionNames.concat(),this.mouthExpressionNames=e.mouthExpressionNames.concat(),this}clone(){return(new h).copy(this)}getExpression(e){var t;return null!==(t=this._expressionMap[e])&&void 0!==t?t:null}registerExpression(e){this._expressions.push(e),this._expressionMap[e.expressionName]=e}unregisterExpression(e){const t=this._expressions.indexOf(e);-1===t&&console.warn("VRMExpressionManager: The specified expressions is not registered"),this._expressions.splice(t,1),delete this._expressionMap[e.expressionName]}getValue(e){var t;const i=this.getExpression(e);return null!==(t=null==i?void 0:i.weight)&&void 0!==t?t:null}setValue(e,t){const i=this.getExpression(e);i&&(i.weight=l(t))}getExpressionTrackName(e){const t=this.getExpression(e);return t?`${t.name}.weight`:null}update(){const e=this._calculateWeightMultipliers();this._expressions.forEach((e=>{e.clearAppliedWeight()})),this._expressions.forEach((t=>{let i=1;const r=t.expressionName;-1!==this.blinkExpressionNames.indexOf(r)&&(i*=e.blink),-1!==this.lookAtExpressionNames.indexOf(r)&&(i*=e.lookAt),-1!==this.mouthExpressionNames.indexOf(r)&&(i*=e.mouth),t.applyWeight({multiplier:i})}))}_calculateWeightMultipliers(){let e=1,t=1,i=1;return this._expressions.forEach((r=>{e-=r.overrideBlinkAmount,t-=r.overrideLookAtAmount,i-=r.overrideMouthAmount})),e=Math.max(0,e),t=Math.max(0,t),i=Math.max(0,i),{blink:e,lookAt:t,mouth:i}}}const u={Color:"color",EmissionColor:"emissionColor",ShadeColor:"shadeColor",MatcapColor:"matcapColor",RimColor:"rimColor",OutlineColor:"outlineColor"},d={_Color:u.Color,_EmissionColor:u.EmissionColor,_ShadeColor:u.ShadeColor,_RimColor:u.RimColor,_OutlineColor:u.OutlineColor},p=new e.Color;class c{constructor({material:t,type:i,targetValue:r}){var o,n,s;this.material=t,this.type=i,this.targetValue=r;const a=null===(o=Object.entries(c._propertyNameMapMap).find((([e])=>!0===t[e])))||void 0===o?void 0:o[1],l=null!==(n=null==a?void 0:a[i])&&void 0!==n?n:null;if(null==l)console.warn(`Tried to add a material color bind to the material ${null!==(s=t.name)&&void 0!==s?s:"(no name)"}, the type ${i} but the material or the type is not supported.`),this._state=null;else{const i=t[l].clone(),o=new e.Color(r.r-i.r,r.g-i.g,r.b-i.b);this._state={propertyName:l,initialValue:i,deltaValue:o}}}applyWeight(e){if(null==this._state)return;const{propertyName:t,deltaValue:i}=this._state,r=this.material[t];void 0!==r&&(r.add(p.copy(i).multiplyScalar(e)),"boolean"==typeof this.material.shouldApplyUniforms&&(this.material.shouldApplyUniforms=!0))}clearAppliedWeight(){if(null==this._state)return;const{propertyName:e,initialValue:t}=this._state,i=this.material[e];void 0!==i&&(i.copy(t),"boolean"==typeof this.material.shouldApplyUniforms&&(this.material.shouldApplyUniforms=!0))}}c._propertyNameMapMap={isMeshStandardMaterial:{color:"color",emissionColor:"emissive"},isMeshBasicMaterial:{color:"color"},isMToonMaterial:{color:"color",emissionColor:"emissive",outlineColor:"outlineColorFactor",matcapColor:"matcapFactor",rimColor:"parametricRimColorFactor",shadeColor:"shadeColorFactor"}};class m{constructor({primitives:e,index:t,weight:i}){this.primitives=e,this.index=t,this.weight=i}applyWeight(e){this.primitives.forEach((t=>{var i;null!=(null===(i=t.morphTargetInfluences)||void 0===i?void 0:i[this.index])&&(t.morphTargetInfluences[this.index]+=this.weight*e)}))}clearAppliedWeight(){this.primitives.forEach((e=>{var t;null!=(null===(t=e.morphTargetInfluences)||void 0===t?void 0:t[this.index])&&(e.morphTargetInfluences[this.index]=0)}))}}const g=new e.Vector2;class f{constructor({material:e,scale:t,offset:i}){var r,o;this.material=e,this.scale=t,this.offset=i;const n=null===(r=Object.entries(f._propertyNamesMap).find((([t])=>!0===e[t])))||void 0===r?void 0:r[1];null==n?(console.warn(`Tried to add a texture transform bind to the material ${null!==(o=e.name)&&void 0!==o?o:"(no name)"} but the material is not supported.`),this._properties=[]):(this._properties=[],n.forEach((r=>{var o;const n=null===(o=e[r])||void 0===o?void 0:o.clone();if(!n)return null;e[r]=n;const s=n.offset.clone(),a=n.repeat.clone(),l=i.clone().sub(s),h=t.clone().sub(a);this._properties.push({name:r,initialOffset:s,deltaOffset:l,initialScale:a,deltaScale:h})})))}applyWeight(e){this._properties.forEach((t=>{const i=this.material[t.name];void 0!==i&&(i.offset.add(g.copy(t.deltaOffset).multiplyScalar(e)),i.repeat.add(g.copy(t.deltaScale).multiplyScalar(e)),i.needsUpdate=!0)}))}clearAppliedWeight(){this._properties.forEach((e=>{const t=this.material[e.name];void 0!==t&&(t.offset.copy(e.initialOffset),t.repeat.copy(e.initialScale),t.needsUpdate=!0)}))}}f._propertyNamesMap={isMeshStandardMaterial:["map","emissiveMap","bumpMap","normalMap","displacementMap","roughnessMap","metalnessMap","alphaMap"],isMeshBasicMaterial:["map","specularMap","alphaMap"],isMToonMaterial:["map","normalMap","emissiveMap","shadeMultiplyTexture","rimMultiplyTexture","outlineWidthMultiplyTexture","uvAnimationMaskTexture"]};const v=new Set(["1.0","1.0-beta"]);class y{get name(){return"VRMExpressionLoaderPlugin"}constructor(e){this.parser=e}afterRoot(e){return i(this,void 0,void 0,(function*(){e.userData.vrmExpressionManager=yield this._import(e)}))}_import(e){return i(this,void 0,void 0,(function*(){const t=yield this._v1Import(e);if(t)return t;const i=yield this._v0Import(e);return i||null}))}_v1Import(r){var n,l;return i(this,void 0,void 0,(function*(){const u=this.parser.json;if(!(-1!==(null===(n=u.extensionsUsed)||void 0===n?void 0:n.indexOf("VRMC_vrm"))))return null;const d=null===(l=u.extensions)||void 0===l?void 0:l.VRMC_vrm;if(!d)return null;const p=d.specVersion;if(!v.has(p))return console.warn(`VRMExpressionLoaderPlugin: Unknown VRMC_vrm specVersion "${p}"`),null;const g=d.expressions;if(!g)return null;const y=new Set(Object.values(a)),w=new Map;null!=g.preset&&Object.entries(g.preset).forEach((([e,t])=>{null!=t&&(y.has(e)?w.set(e,t):console.warn(`VRMExpressionLoaderPlugin: Unknown preset name "${e}" detected. Ignoring the expression`))})),null!=g.custom&&Object.entries(g.custom).forEach((([e,t])=>{y.has(e)?console.warn(`VRMExpressionLoaderPlugin: Custom expression cannot have preset name "${e}". Ignoring the expression`):w.set(e,t)}));const x=new h;return yield Promise.all(Array.from(w.entries()).map((([n,a])=>i(this,void 0,void 0,(function*(){var l,h,u,d,p,g,v;const y=new t(n);if(r.scene.add(y),y.isBinary=null!==(l=a.isBinary)&&void 0!==l&&l,y.overrideBlink=null!==(h=a.overrideBlink)&&void 0!==h?h:"none",y.overrideLookAt=null!==(u=a.overrideLookAt)&&void 0!==u?u:"none",y.overrideMouth=null!==(d=a.overrideMouth)&&void 0!==d?d:"none",null===(p=a.morphTargetBinds)||void 0===p||p.forEach((e=>i(this,void 0,void 0,(function*(){var t;if(void 0===e.node||void 0===e.index)return;const i=yield o(r,e.node),n=e.index;i.every((e=>Array.isArray(e.morphTargetInfluences)&&n<e.morphTargetInfluences.length))?y.addBind(new m({primitives:i,index:n,weight:null!==(t=e.weight)&&void 0!==t?t:1})):console.warn(`VRMExpressionLoaderPlugin: ${a.name} attempts to index morph #${n} but not found.`)})))),a.materialColorBinds||a.textureTransformBinds){const t=[];r.scene.traverse((e=>{const i=e.material;i&&t.push(i)})),null===(g=a.materialColorBinds)||void 0===g||g.forEach((r=>i(this,void 0,void 0,(function*(){t.filter((e=>{const t=s(this.parser,e);return r.material===t})).forEach((t=>{y.addBind(new c({material:t,type:r.type,targetValue:(new e.Color).fromArray(r.targetValue)}))}))})))),null===(v=a.textureTransformBinds)||void 0===v||v.forEach((r=>i(this,void 0,void 0,(function*(){t.filter((e=>{const t=s(this.parser,e);return r.material===t})).forEach((t=>{var i,o;y.addBind(new f({material:t,offset:(new e.Vector2).fromArray(null!==(i=r.offset)&&void 0!==i?i:[0,0]),scale:(new e.Vector2).fromArray(null!==(o=r.scale)&&void 0!==o?o:[1,1])}))}))}))))}x.registerExpression(y)}))))),x}))}_v0Import(r){var n;return i(this,void 0,void 0,(function*(){const s=this.parser.json,a=null===(n=s.extensions)||void 0===n?void 0:n.VRM;if(!a)return null;const l=a.blendShapeMaster;if(!l)return null;const u=new h,p=l.blendShapeGroups;if(!p)return u;const g=new Set;return yield Promise.all(p.map((n=>i(this,void 0,void 0,(function*(){var a;const l=n.presetName,h=null!=l&&y.v0v1PresetNameMap[l]||null,p=null!=h?h:n.name;if(null==p)return void console.warn("VRMExpressionLoaderPlugin: One of custom expressions has no name. Ignoring the expression");if(g.has(p))return void console.warn(`VRMExpressionLoaderPlugin: An expression preset ${l} has duplicated entries. Ignoring the expression`);g.add(p);const v=new t(p);r.scene.add(v),v.isBinary=null!==(a=n.isBinary)&&void 0!==a&&a,n.binds&&n.binds.forEach((e=>i(this,void 0,void 0,(function*(){var t;if(void 0===e.mesh||void 0===e.index)return;const a=[];null===(t=s.nodes)||void 0===t||t.forEach(((t,i)=>{t.mesh===e.mesh&&a.push(i)}));const l=e.index;yield Promise.all(a.map((t=>i(this,void 0,void 0,(function*(){var i;const s=yield o(r,t);s.every((e=>Array.isArray(e.morphTargetInfluences)&&l<e.morphTargetInfluences.length))?v.addBind(new m({primitives:s,index:l,weight:.01*(null!==(i=e.weight)&&void 0!==i?i:100)})):console.warn(`VRMExpressionLoaderPlugin: ${n.name} attempts to index ${l}th morph but not found.`)})))))}))));const w=n.materialValues;w&&0!==w.length&&w.forEach((t=>{if(void 0===t.materialName||void 0===t.propertyName||void 0===t.targetValue)return;const i=[];r.scene.traverse((e=>{if(e.material){const r=e.material;Array.isArray(r)?i.push(...r.filter((e=>(e.name===t.materialName||e.name===t.materialName+" (Outline)")&&-1===i.indexOf(e)))):r.name===t.materialName&&-1===i.indexOf(r)&&i.push(r)}}));const o=t.propertyName;i.forEach((i=>{if("_MainTex_ST"===o){const r=new e.Vector2(t.targetValue[0],t.targetValue[1]),o=new e.Vector2(t.targetValue[2],t.targetValue[3]);return o.y=1-o.y-r.y,void v.addBind(new f({material:i,scale:r,offset:o}))}const r=d[o];r?v.addBind(new c({material:i,type:r,targetValue:new e.Color(...t.targetValue.slice(0,3))})):console.warn(o+" is not supported")}))})),u.registerExpression(v)}))))),u}))}}y.v0v1PresetNameMap={a:"aa",e:"ee",i:"ih",o:"oh",u:"ou",blink:"blink",joy:"happy",angry:"angry",sorrow:"sad",fun:"relaxed",lookup:"lookUp",lookdown:"lookDown",lookleft:"lookLeft",lookright:"lookRight",blink_l:"blinkLeft",blink_r:"blinkRight",neutral:"neutral"};const w={None:"none",Block:"block",Blend:"blend"};class x{constructor(e,t){this._firstPersonOnlyLayer=x.DEFAULT_FIRSTPERSON_ONLY_LAYER,this._thirdPersonOnlyLayer=x.DEFAULT_THIRDPERSON_ONLY_LAYER,this._initializedLayers=!1,this.humanoid=e,this.meshAnnotations=t}copy(e){if(this.humanoid!==e.humanoid)throw new Error("VRMFirstPerson: humanoid must be same in order to copy");return this.meshAnnotations=e.meshAnnotations.map((e=>({meshes:e.meshes.concat(),type:e.type}))),this}clone(){return new x(this.humanoid,this.meshAnnotations).copy(this)}get firstPersonOnlyLayer(){return this._firstPersonOnlyLayer}get thirdPersonOnlyLayer(){return this._thirdPersonOnlyLayer}setup({firstPersonOnlyLayer:e=x.DEFAULT_FIRSTPERSON_ONLY_LAYER,thirdPersonOnlyLayer:t=x.DEFAULT_THIRDPERSON_ONLY_LAYER}={}){this._initializedLayers||(this._firstPersonOnlyLayer=e,this._thirdPersonOnlyLayer=t,this.meshAnnotations.forEach((e=>{e.meshes.forEach((t=>{"firstPersonOnly"===e.type?(t.layers.set(this._firstPersonOnlyLayer),t.traverse((e=>e.layers.set(this._firstPersonOnlyLayer)))):"thirdPersonOnly"===e.type?(t.layers.set(this._thirdPersonOnlyLayer),t.traverse((e=>e.layers.set(this._thirdPersonOnlyLayer)))):"auto"===e.type&&this._createHeadlessModel(t)}))})),this._initializedLayers=!0)}_excludeTriangles(e,t,i,r){let o=0;if(null!=t&&t.length>0)for(let n=0;n<e.length;n+=3){const s=e[n],a=e[n+1],l=e[n+2],h=t[s],u=i[s];if(h[0]>0&&r.includes(u[0]))continue;if(h[1]>0&&r.includes(u[1]))continue;if(h[2]>0&&r.includes(u[2]))continue;if(h[3]>0&&r.includes(u[3]))continue;const d=t[a],p=i[a];if(d[0]>0&&r.includes(p[0]))continue;if(d[1]>0&&r.includes(p[1]))continue;if(d[2]>0&&r.includes(p[2]))continue;if(d[3]>0&&r.includes(p[3]))continue;const c=t[l],m=i[l];c[0]>0&&r.includes(m[0])||(c[1]>0&&r.includes(m[1])||c[2]>0&&r.includes(m[2])||c[3]>0&&r.includes(m[3])||(e[o++]=s,e[o++]=a,e[o++]=l))}return o}_createErasedMesh(t,i){const r=new e.SkinnedMesh(t.geometry.clone(),t.material);r.name=`${t.name}(erase)`,r.frustumCulled=t.frustumCulled,r.layers.set(this._firstPersonOnlyLayer);const o=r.geometry,n=o.getAttribute("skinIndex"),s=n instanceof e.GLBufferAttribute?[]:n.array,a=[];for(let e=0;e<s.length;e+=4)a.push([s[e],s[e+1],s[e+2],s[e+3]]);const l=o.getAttribute("skinWeight"),h=l instanceof e.GLBufferAttribute?[]:l.array,u=[];for(let e=0;e<h.length;e+=4)u.push([h[e],h[e+1],h[e+2],h[e+3]]);const d=o.getIndex();if(!d)throw new Error("The geometry doesn't have an index buffer");const p=Array.from(d.array),c=this._excludeTriangles(p,u,a,i),m=[];for(let e=0;e<c;e++)m[e]=p[e];return o.setIndex(m),t.onBeforeRender&&(r.onBeforeRender=t.onBeforeRender),r.bind(new e.Skeleton(t.skeleton.bones,t.skeleton.boneInverses),new e.Matrix4),r}_createHeadlessModelForSkinnedMesh(e,t){const i=[];if(t.skeleton.bones.forEach(((e,t)=>{this._isEraseTarget(e)&&i.push(t)})),!i.length)return t.layers.enable(this._thirdPersonOnlyLayer),void t.layers.enable(this._firstPersonOnlyLayer);t.layers.set(this._thirdPersonOnlyLayer);const r=this._createErasedMesh(t,i);e.add(r)}_createHeadlessModel(t){if("Group"===t.type)if(t.layers.set(this._thirdPersonOnlyLayer),this._isEraseTarget(t))t.traverse((e=>e.layers.set(this._thirdPersonOnlyLayer)));else{const i=new e.Group;i.name=`_headless_${t.name}`,i.layers.set(this._firstPersonOnlyLayer),t.parent.add(i),t.children.filter((e=>"SkinnedMesh"===e.type)).forEach((e=>{const t=e;this._createHeadlessModelForSkinnedMesh(i,t)}))}else if("SkinnedMesh"===t.type){const e=t;this._createHeadlessModelForSkinnedMesh(t.parent,e)}else this._isEraseTarget(t)&&(t.layers.set(this._thirdPersonOnlyLayer),t.traverse((e=>e.layers.set(this._thirdPersonOnlyLayer))))}_isEraseTarget(e){return e===this.humanoid.getRawBoneNode("head")||!!e.parent&&this._isEraseTarget(e.parent)}}x.DEFAULT_FIRSTPERSON_ONLY_LAYER=9,x.DEFAULT_THIRDPERSON_ONLY_LAYER=10;const _=new Set(["1.0","1.0-beta"]);class M{get name(){return"VRMFirstPersonLoaderPlugin"}constructor(e){this.parser=e}afterRoot(e){return i(this,void 0,void 0,(function*(){const t=e.userData.vrmHumanoid;if(null!==t){if(void 0===t)throw new Error("VRMFirstPersonLoaderPlugin: vrmHumanoid is undefined. VRMHumanoidLoaderPlugin have to be used first");e.userData.vrmFirstPerson=yield this._import(e,t)}}))}_import(e,t){return i(this,void 0,void 0,(function*(){if(null==t)return null;const i=yield this._v1Import(e,t);if(i)return i;const r=yield this._v0Import(e,t);return r||null}))}_v1Import(e,t){var r,o;return i(this,void 0,void 0,(function*(){const i=this.parser.json;if(!(-1!==(null===(r=i.extensionsUsed)||void 0===r?void 0:r.indexOf("VRMC_vrm"))))return null;const s=null===(o=i.extensions)||void 0===o?void 0:o.VRMC_vrm;if(!s)return null;const a=s.specVersion;if(!_.has(a))return console.warn(`VRMFirstPersonLoaderPlugin: Unknown VRMC_vrm specVersion "${a}"`),null;const l=s.firstPerson;if(!l)return null;const h=[],u=yield n(e);return Array.from(u.entries()).forEach((([e,t])=>{var i;const r=l.meshAnnotations?l.meshAnnotations.find((t=>t.node===e)):void 0;h.push({meshes:t,type:null!==(i=null==r?void 0:r.type)&&void 0!==i?i:"both"})})),new x(t,h)}))}_v0Import(e,t){var r;return i(this,void 0,void 0,(function*(){const i=this.parser.json,o=null===(r=i.extensions)||void 0===r?void 0:r.VRM;if(!o)return null;const s=o.firstPerson;if(!s)return null;const a=[],l=yield n(e);return Array.from(l.entries()).forEach((([e,t])=>{const r=i.nodes[e],o=s.meshAnnotations?s.meshAnnotations.find((e=>e.mesh===r.mesh)):void 0;a.push({meshes:t,type:this._convertV0FlagToV1Type(null==o?void 0:o.firstPersonFlag)})})),new x(t,a)}))}_convertV0FlagToV1Type(e){return"FirstPersonOnly"===e?"firstPersonOnly":"ThirdPersonOnly"===e?"thirdPersonOnly":"Auto"===e?"auto":"both"}}const R={Auto:"auto",Both:"both",ThirdPersonOnly:"thirdPersonOnly",FirstPersonOnly:"firstPersonOnly"},P=new e.Vector3,L=new e.Vector3,A=new e.Quaternion;class b extends e.Group{constructor(t){super(),this.vrmHumanoid=t,this._boneAxesMap=new Map,Object.values(t.humanBones).forEach((t=>{const i=new e.AxesHelper(1);i.matrixAutoUpdate=!1,i.material.depthTest=!1,i.material.depthWrite=!1,this.add(i),this._boneAxesMap.set(t,i)}))}dispose(){Array.from(this._boneAxesMap.values()).forEach((e=>{e.geometry.dispose(),e.material.dispose()}))}updateMatrixWorld(e){Array.from(this._boneAxesMap.entries()).forEach((([e,t])=>{e.node.updateWorldMatrix(!0,!1),e.node.matrixWorld.decompose(P,A,L);const i=P.set(.1,.1,.1).divide(L);t.matrix.copy(e.node.matrixWorld).scale(i)})),super.updateMatrixWorld(e)}}const E=["hips","spine","chest","upperChest","neck","head","leftEye","rightEye","jaw","leftUpperLeg","leftLowerLeg","leftFoot","leftToes","rightUpperLeg","rightLowerLeg","rightFoot","rightToes","leftShoulder","leftUpperArm","leftLowerArm","leftHand","rightShoulder","rightUpperArm","rightLowerArm","rightHand","leftThumbMetacarpal","leftThumbProximal","leftThumbDistal","leftIndexProximal","leftIndexIntermediate","leftIndexDistal","leftMiddleProximal","leftMiddleIntermediate","leftMiddleDistal","leftRingProximal","leftRingIntermediate","leftRingDistal","leftLittleProximal","leftLittleIntermediate","leftLittleDistal","rightThumbMetacarpal","rightThumbProximal","rightThumbDistal","rightIndexProximal","rightIndexIntermediate","rightIndexDistal","rightMiddleProximal","rightMiddleIntermediate","rightMiddleDistal","rightRingProximal","rightRingIntermediate","rightRingDistal","rightLittleProximal","rightLittleIntermediate","rightLittleDistal"],I={Hips:"hips",Spine:"spine",Chest:"chest",UpperChest:"upperChest",Neck:"neck",Head:"head",LeftEye:"leftEye",RightEye:"rightEye",Jaw:"jaw",LeftUpperLeg:"leftUpperLeg",LeftLowerLeg:"leftLowerLeg",LeftFoot:"leftFoot",LeftToes:"leftToes",RightUpperLeg:"rightUpperLeg",RightLowerLeg:"rightLowerLeg",RightFoot:"rightFoot",RightToes:"rightToes",LeftShoulder:"leftShoulder",LeftUpperArm:"leftUpperArm",LeftLowerArm:"leftLowerArm",LeftHand:"leftHand",RightShoulder:"rightShoulder",RightUpperArm:"rightUpperArm",RightLowerArm:"rightLowerArm",RightHand:"rightHand",LeftThumbMetacarpal:"leftThumbMetacarpal",LeftThumbProximal:"leftThumbProximal",LeftThumbDistal:"leftThumbDistal",LeftIndexProximal:"leftIndexProximal",LeftIndexIntermediate:"leftIndexIntermediate",LeftIndexDistal:"leftIndexDistal",LeftMiddleProximal:"leftMiddleProximal",LeftMiddleIntermediate:"leftMiddleIntermediate",LeftMiddleDistal:"leftMiddleDistal",LeftRingProximal:"leftRingProximal",LeftRingIntermediate:"leftRingIntermediate",LeftRingDistal:"leftRingDistal",LeftLittleProximal:"leftLittleProximal",LeftLittleIntermediate:"leftLittleIntermediate",LeftLittleDistal:"leftLittleDistal",RightThumbMetacarpal:"rightThumbMetacarpal",RightThumbProximal:"rightThumbProximal",RightThumbDistal:"rightThumbDistal",RightIndexProximal:"rightIndexProximal",RightIndexIntermediate:"rightIndexIntermediate",RightIndexDistal:"rightIndexDistal",RightMiddleProximal:"rightMiddleProximal",RightMiddleIntermediate:"rightMiddleIntermediate",RightMiddleDistal:"rightMiddleDistal",RightRingProximal:"rightRingProximal",RightRingIntermediate:"rightRingIntermediate",RightRingDistal:"rightRingDistal",RightLittleProximal:"rightLittleProximal",RightLittleIntermediate:"rightLittleIntermediate",RightLittleDistal:"rightLittleDistal"},B={hips:null,spine:"hips",chest:"spine",upperChest:"chest",neck:"upperChest",head:"neck",leftEye:"head",rightEye:"head",jaw:"head",leftUpperLeg:"hips",leftLowerLeg:"leftUpperLeg",leftFoot:"leftLowerLeg",leftToes:"leftFoot",rightUpperLeg:"hips",rightLowerLeg:"rightUpperLeg",rightFoot:"rightLowerLeg",rightToes:"rightFoot",leftShoulder:"upperChest",leftUpperArm:"leftShoulder",leftLowerArm:"leftUpperArm",leftHand:"leftLowerArm",rightShoulder:"upperChest",rightUpperArm:"rightShoulder",rightLowerArm:"rightUpperArm",rightHand:"rightLowerArm",leftThumbMetacarpal:"leftHand",leftThumbProximal:"leftThumbMetacarpal",leftThumbDistal:"leftThumbProximal",leftIndexProximal:"leftHand",leftIndexIntermediate:"leftIndexProximal",leftIndexDistal:"leftIndexIntermediate",leftMiddleProximal:"leftHand",leftMiddleIntermediate:"leftMiddleProximal",leftMiddleDistal:"leftMiddleIntermediate",leftRingProximal:"leftHand",leftRingIntermediate:"leftRingProximal",leftRingDistal:"leftRingIntermediate",leftLittleProximal:"leftHand",leftLittleIntermediate:"leftLittleProximal",leftLittleDistal:"leftLittleIntermediate",rightThumbMetacarpal:"rightHand",rightThumbProximal:"rightThumbMetacarpal",rightThumbDistal:"rightThumbProximal",rightIndexProximal:"rightHand",rightIndexIntermediate:"rightIndexProximal",rightIndexDistal:"rightIndexIntermediate",rightMiddleProximal:"rightHand",rightMiddleIntermediate:"rightMiddleProximal",rightMiddleDistal:"rightMiddleIntermediate",rightRingProximal:"rightHand",rightRingIntermediate:"rightRingProximal",rightRingDistal:"rightRingIntermediate",rightLittleProximal:"rightHand",rightLittleIntermediate:"rightLittleProximal",rightLittleDistal:"rightLittleIntermediate"};function V(e){return e.invert?e.invert():e.inverse(),e}const U=new e.Vector3,k=new e.Quaternion;class T{constructor(e){this.humanBones=e,this.restPose=this.getAbsolutePose()}getAbsolutePose(){const e={};return Object.keys(this.humanBones).forEach((t=>{const i=t,r=this.getBoneNode(i);r&&(U.copy(r.position),k.copy(r.quaternion),e[i]={position:U.toArray(),rotation:k.toArray()})})),e}getPose(){const e={};return Object.keys(this.humanBones).forEach((t=>{const i=t,r=this.getBoneNode(i);if(!r)return;U.set(0,0,0),k.identity();const o=this.restPose[i];(null==o?void 0:o.position)&&U.fromArray(o.position).negate(),(null==o?void 0:o.rotation)&&V(k.fromArray(o.rotation)),U.add(r.position),k.premultiply(r.quaternion),e[i]={position:U.toArray(),rotation:k.toArray()}})),e}setPose(e){Object.entries(e).forEach((([e,t])=>{const i=e,r=this.getBoneNode(i);if(!r)return;const o=this.restPose[i];o&&((null==t?void 0:t.position)&&(r.position.fromArray(t.position),o.position&&r.position.add(U.fromArray(o.position))),(null==t?void 0:t.rotation)&&(r.quaternion.fromArray(t.rotation),o.rotation&&r.quaternion.multiply(k.fromArray(o.rotation))))}))}resetPose(){Object.entries(this.restPose).forEach((([e,t])=>{const i=this.getBoneNode(e);i&&((null==t?void 0:t.position)&&i.position.fromArray(t.position),(null==t?void 0:t.rotation)&&i.quaternion.fromArray(t.rotation))}))}getBone(e){var t;return null!==(t=this.humanBones[e])&&void 0!==t?t:void 0}getBoneNode(e){var t,i;return null!==(i=null===(t=this.humanBones[e])||void 0===t?void 0:t.node)&&void 0!==i?i:null}}const D=new e.Vector3,H=new e.Quaternion,O=new e.Vector3;class N extends T{static _setupTransforms(t){const i=new e.Object3D;i.name="VRMHumanoidRig";const r={},o={},n={};E.forEach((i=>{const s=t.getBoneNode(i);if(s){const t=new e.Vector3,a=new e.Quaternion;s.updateWorldMatrix(!0,!1),s.matrixWorld.decompose(t,a,D),r[i]=t,o[i]=a,n[i]=s.quaternion.clone()}}));const s={},a={};return E.forEach((n=>{var l;const h=t.getBoneNode(n);if(h){const t=r[n];let u,d,p=n;for(;null==u&&(p=B[p],null!=p);)u=r[p],d=o[p];const c=new e.Object3D;c.name="Normalized_"+h.name;(p?null===(l=a[p])||void 0===l?void 0:l.node:i).add(c),c.position.copy(t),u&&c.position.sub(u),a[n]={node:c},s[n]=null!=d?d:new e.Quaternion}})),{rigBones:a,root:i,parentWorldRotations:s,boneRotations:n}}constructor(e){const{rigBones:t,root:i,parentWorldRotations:r,boneRotations:o}=N._setupTransforms(e);super(t),this.original=e,this.root=i,this._parentWorldRotations=r,this._boneRotations=o}update(){E.forEach((e=>{const t=this.original.getBoneNode(e);if(null!=t){const i=this.getBoneNode(e),r=this._parentWorldRotations[e],o=H.copy(r).invert(),n=this._boneRotations[e];if(t.quaternion.copy(i.quaternion).multiply(r).premultiply(o).multiply(n),"hips"===e){const e=i.getWorldPosition(O);t.parent.updateWorldMatrix(!0,!1);const r=t.parent.matrixWorld,o=e.applyMatrix4(r.invert());t.position.copy(o)}}}))}}class F{get restPose(){return console.warn("VRMHumanoid: restPose is deprecated. Use either rawRestPose or normalizedRestPose instead."),this.rawRestPose}get rawRestPose(){return this._rawHumanBones.restPose}get normalizedRestPose(){return this._normalizedHumanBones.restPose}get humanBones(){return this._rawHumanBones.humanBones}get rawHumanBones(){return this._rawHumanBones.humanBones}get normalizedHumanBones(){return this._normalizedHumanBones.humanBones}get normalizedHumanBonesRoot(){return this._normalizedHumanBones.root}constructor(e,t){var i;this.autoUpdateHumanBones=null===(i=null==t?void 0:t.autoUpdateHumanBones)||void 0===i||i,this._rawHumanBones=new T(e),this._normalizedHumanBones=new N(this._rawHumanBones)}copy(e){return this.autoUpdateHumanBones=e.autoUpdateHumanBones,this._rawHumanBones=new T(e.humanBones),this._normalizedHumanBones=new N(this._rawHumanBones),this}clone(){return new F(this.humanBones,{autoUpdateHumanBones:this.autoUpdateHumanBones}).copy(this)}getAbsolutePose(){return console.warn("VRMHumanoid: getAbsolutePose() is deprecated. Use either getRawAbsolutePose() or getNormalizedAbsolutePose() instead."),this.getRawAbsolutePose()}getRawAbsolutePose(){return this._rawHumanBones.getAbsolutePose()}getNormalizedAbsolutePose(){return this._normalizedHumanBones.getAbsolutePose()}getPose(){return console.warn("VRMHumanoid: getPose() is deprecated. Use either getRawPose() or getNormalizedPose() instead."),this.getRawPose()}getRawPose(){return this._rawHumanBones.getPose()}getNormalizedPose(){return this._normalizedHumanBones.getPose()}setPose(e){return console.warn("VRMHumanoid: setPose() is deprecated. Use either setRawPose() or setNormalizedPose() instead."),this.setRawPose(e)}setRawPose(e){return this._rawHumanBones.setPose(e)}setNormalizedPose(e){return this._normalizedHumanBones.setPose(e)}resetPose(){return console.warn("VRMHumanoid: resetPose() is deprecated. Use either resetRawPose() or resetNormalizedPose() instead."),this.resetRawPose()}resetRawPose(){return this._rawHumanBones.resetPose()}resetNormalizedPose(){return this._normalizedHumanBones.resetPose()}getBone(e){return console.warn("VRMHumanoid: getBone() is deprecated. Use either getRawBone() or getNormalizedBone() instead."),this.getRawBone(e)}getRawBone(e){return this._rawHumanBones.getBone(e)}getNormalizedBone(e){return this._normalizedHumanBones.getBone(e)}getBoneNode(e){return console.warn("VRMHumanoid: getBoneNode() is deprecated. Use either getRawBoneNode() or getNormalizedBoneNode() instead."),this.getRawBoneNode(e)}getRawBoneNode(e){return this._rawHumanBones.getBoneNode(e)}getNormalizedBoneNode(e){return this._normalizedHumanBones.getBoneNode(e)}update(){this.autoUpdateHumanBones&&this._normalizedHumanBones.update()}}const S={Hips:"hips",Spine:"spine",Head:"head",LeftUpperLeg:"leftUpperLeg",LeftLowerLeg:"leftLowerLeg",LeftFoot:"leftFoot",RightUpperLeg:"rightUpperLeg",RightLowerLeg:"rightLowerLeg",RightFoot:"rightFoot",LeftUpperArm:"leftUpperArm",LeftLowerArm:"leftLowerArm",LeftHand:"leftHand",RightUpperArm:"rightUpperArm",RightLowerArm:"rightLowerArm",RightHand:"rightHand"},C=new Set(["1.0","1.0-beta"]),W={leftThumbProximal:"leftThumbMetacarpal",leftThumbIntermediate:"leftThumbProximal",rightThumbProximal:"rightThumbMetacarpal",rightThumbIntermediate:"rightThumbProximal"};class z{get name(){return"VRMHumanoidLoaderPlugin"}constructor(e,t){this.parser=e,this.helperRoot=null==t?void 0:t.helperRoot,this.autoUpdateHumanBones=null==t?void 0:t.autoUpdateHumanBones}afterRoot(e){return i(this,void 0,void 0,(function*(){e.userData.vrmHumanoid=yield this._import(e)}))}_import(e){return i(this,void 0,void 0,(function*(){const t=yield this._v1Import(e);if(t)return t;const i=yield this._v0Import(e);return i||null}))}_v1Import(e){var t,r;return i(this,void 0,void 0,(function*(){const o=this.parser.json;if(!(-1!==(null===(t=o.extensionsUsed)||void 0===t?void 0:t.indexOf("VRMC_vrm"))))return null;const n=null===(r=o.extensions)||void 0===r?void 0:r.VRMC_vrm;if(!n)return null;const s=n.specVersion;if(!C.has(s))return console.warn(`VRMHumanoidLoaderPlugin: Unknown VRMC_vrm specVersion "${s}"`),null;const a=n.humanoid;if(!a)return null;const l=null!=a.humanBones.leftThumbIntermediate||null!=a.humanBones.rightThumbIntermediate,h={};null!=a.humanBones&&(yield Promise.all(Object.entries(a.humanBones).map((([e,t])=>i(this,void 0,void 0,(function*(){let i=e;const r=t.node;if(l){const e=W[i];null!=e&&(i=e)}const o=yield this.parser.getDependency("node",r);null!=o?h[i]={node:o}:console.warn(`A glTF node bound to the humanoid bone ${i} (index = ${r}) does not exist`)}))))));const u=new F(this._ensureRequiredBonesExist(h),{autoUpdateHumanBones:this.autoUpdateHumanBones});if(e.scene.add(u.normalizedHumanBonesRoot),this.helperRoot){const e=new b(u);this.helperRoot.add(e),e.renderOrder=this.helperRoot.renderOrder}return u}))}_v0Import(e){var t;return i(this,void 0,void 0,(function*(){const r=this.parser.json,o=null===(t=r.extensions)||void 0===t?void 0:t.VRM;if(!o)return null;const n=o.humanoid;if(!n)return null;const s={};null!=n.humanBones&&(yield Promise.all(n.humanBones.map((e=>i(this,void 0,void 0,(function*(){const t=e.bone,i=e.node;if(null==t||null==i)return;const r=yield this.parser.getDependency("node",i);if(null==r)return void console.warn(`A glTF node bound to the humanoid bone ${t} (index = ${i}) does not exist`);const o=W[t],n=null!=o?o:t;null==s[n]?s[n]={node:r}:console.warn(`Multiple bone entries for ${n} detected (index = ${i}), ignoring duplicated entries.`)}))))));const a=new F(this._ensureRequiredBonesExist(s),{autoUpdateHumanBones:this.autoUpdateHumanBones});if(e.scene.add(a.normalizedHumanBonesRoot),this.helperRoot){const e=new b(a);this.helperRoot.add(e),e.renderOrder=this.helperRoot.renderOrder}return a}))}_ensureRequiredBonesExist(e){const t=Object.values(S).filter((t=>null==e[t]));if(t.length>0)throw new Error(`VRMHumanoidLoaderPlugin: These humanoid bones are required but not exist: ${t.join(", ")}`);return e}}class Q extends e.BufferGeometry{constructor(){super(),this._currentTheta=0,this._currentRadius=0,this.theta=0,this.radius=0,this._currentTheta=0,this._currentRadius=0,this._attrPos=new e.BufferAttribute(new Float32Array(195),3),this.setAttribute("position",this._attrPos),this._attrIndex=new e.BufferAttribute(new Uint16Array(189),1),this.setIndex(this._attrIndex),this._buildIndex(),this.update()}update(){let e=!1;this._currentTheta!==this.theta&&(this._currentTheta=this.theta,e=!0),this._currentRadius!==this.radius&&(this._currentRadius=this.radius,e=!0),e&&this._buildPosition()}_buildPosition(){this._attrPos.setXYZ(0,0,0,0);for(let e=0;e<64;e++){const t=e/63*this._currentTheta;this._attrPos.setXYZ(e+1,this._currentRadius*Math.sin(t),0,this._currentRadius*Math.cos(t))}this._attrPos.needsUpdate=!0}_buildIndex(){for(let e=0;e<63;e++)this._attrIndex.setXYZ(3*e,0,e+1,e+2);this._attrIndex.needsUpdate=!0}}class Y extends e.BufferGeometry{constructor(){super(),this.radius=0,this._currentRadius=0,this.tail=new e.Vector3,this._currentTail=new e.Vector3,this._attrPos=new e.BufferAttribute(new Float32Array(294),3),this.setAttribute("position",this._attrPos),this._attrIndex=new e.BufferAttribute(new Uint16Array(194),1),this.setIndex(this._attrIndex),this._buildIndex(),this.update()}update(){let e=!1;this._currentRadius!==this.radius&&(this._currentRadius=this.radius,e=!0),this._currentTail.equals(this.tail)||(this._currentTail.copy(this.tail),e=!0),e&&this._buildPosition()}_buildPosition(){for(let e=0;e<32;e++){const t=e/16*Math.PI;this._attrPos.setXYZ(e,Math.cos(t),Math.sin(t),0),this._attrPos.setXYZ(32+e,0,Math.cos(t),Math.sin(t)),this._attrPos.setXYZ(64+e,Math.sin(t),0,Math.cos(t))}this.scale(this._currentRadius,this._currentRadius,this._currentRadius),this.translate(this._currentTail.x,this._currentTail.y,this._currentTail.z),this._attrPos.setXYZ(96,0,0,0),this._attrPos.setXYZ(97,this._currentTail.x,this._currentTail.y,this._currentTail.z),this._attrPos.needsUpdate=!0}_buildIndex(){for(let e=0;e<32;e++){const t=(e+1)%32;this._attrIndex.setXY(2*e,e,t),this._attrIndex.setXY(64+2*e,32+e,32+t),this._attrIndex.setXY(128+2*e,64+e,64+t)}this._attrIndex.setXY(192,96,97),this._attrIndex.needsUpdate=!0}}const j=new e.Quaternion,$=new e.Quaternion,q=new e.Vector3,G=new e.Vector3,X=Math.sqrt(2)/2,Z=new e.Quaternion(0,0,-X,X),J=new e.Vector3(0,1,0);class K extends e.Group{constructor(t){super(),this.matrixAutoUpdate=!1,this.vrmLookAt=t;{const t=new Q;t.radius=.5;const i=new e.MeshBasicMaterial({color:65280,transparent:!0,opacity:.5,side:e.DoubleSide,depthTest:!1,depthWrite:!1});this._meshPitch=new e.Mesh(t,i),this.add(this._meshPitch)}{const t=new Q;t.radius=.5;const i=new e.MeshBasicMaterial({color:16711680,transparent:!0,opacity:.5,side:e.DoubleSide,depthTest:!1,depthWrite:!1});this._meshYaw=new e.Mesh(t,i),this.add(this._meshYaw)}{const t=new Y;t.radius=.1;const i=new e.LineBasicMaterial({color:16777215,depthTest:!1,depthWrite:!1});this._lineTarget=new e.LineSegments(t,i),this._lineTarget.frustumCulled=!1,this.add(this._lineTarget)}}dispose(){this._meshYaw.geometry.dispose(),this._meshYaw.material.dispose(),this._meshPitch.geometry.dispose(),this._meshPitch.material.dispose(),this._lineTarget.geometry.dispose(),this._lineTarget.material.dispose()}updateMatrixWorld(t){const i=e.MathUtils.DEG2RAD*this.vrmLookAt.yaw;this._meshYaw.geometry.theta=i,this._meshYaw.geometry.update();const r=e.MathUtils.DEG2RAD*this.vrmLookAt.pitch;this._meshPitch.geometry.theta=r,this._meshPitch.geometry.update(),this.vrmLookAt.getLookAtWorldPosition(q),this.vrmLookAt.getLookAtWorldQuaternion(j),j.multiply(this.vrmLookAt.getFaceFrontQuaternion($)),this._meshYaw.position.copy(q),this._meshYaw.quaternion.copy(j),this._meshPitch.position.copy(q),this._meshPitch.quaternion.copy(j),this._meshPitch.quaternion.multiply($.setFromAxisAngle(J,i)),this._meshPitch.quaternion.multiply(Z);const{target:o,autoUpdate:n}=this.vrmLookAt;null!=o&&n&&(o.getWorldPosition(G).sub(q),this._lineTarget.geometry.tail.copy(G),this._lineTarget.geometry.update(),this._lineTarget.position.copy(q)),super.updateMatrixWorld(t)}}const ee=new e.Vector3,te=new e.Vector3;function ie(e,t){return e.matrixWorld.decompose(ee,t,te),t}function re(e){return[Math.atan2(-e.z,e.x),Math.atan2(e.y,Math.sqrt(e.x*e.x+e.z*e.z))]}function oe(e){const t=Math.round(e/2/Math.PI);return e-2*Math.PI*t}const ne=new e.Vector3(0,0,1),se=new e.Vector3,ae=new e.Vector3,le=new e.Vector3,he=new e.Quaternion,ue=new e.Quaternion,de=new e.Quaternion,pe=new e.Quaternion,ce=new e.Euler;class me{get yaw(){return this._yaw}set yaw(e){this._yaw=e,this._needsUpdate=!0}get pitch(){return this._pitch}set pitch(e){this._pitch=e,this._needsUpdate=!0}get euler(){return console.warn("VRMLookAt: euler is deprecated. use getEuler() instead."),this.getEuler(new e.Euler)}constructor(t,i){this.offsetFromHeadBone=new e.Vector3,this.autoUpdate=!0,this.faceFront=new e.Vector3(0,0,1),this.humanoid=t,this.applier=i,this._yaw=0,this._pitch=0,this._needsUpdate=!0,this._restHeadWorldQuaternion=this.getLookAtWorldQuaternion(new e.Quaternion)}getEuler(t){return t.set(e.MathUtils.DEG2RAD*this._pitch,e.MathUtils.DEG2RAD*this._yaw,0,"YXZ")}copy(e){if(this.humanoid!==e.humanoid)throw new Error("VRMLookAt: humanoid must be same in order to copy");return this.offsetFromHeadBone.copy(e.offsetFromHeadBone),this.applier=e.applier,this.autoUpdate=e.autoUpdate,this.target=e.target,this.faceFront.copy(e.faceFront),this}clone(){return new me(this.humanoid,this.applier).copy(this)}reset(){this._yaw=0,this._pitch=0,this._needsUpdate=!0}getLookAtWorldPosition(e){const t=this.humanoid.getRawBoneNode("head");return e.copy(this.offsetFromHeadBone).applyMatrix4(t.matrixWorld)}getLookAtWorldQuaternion(e){return ie(this.humanoid.getRawBoneNode("head"),e)}getFaceFrontQuaternion(e){if(this.faceFront.distanceToSquared(ne)<.01)return e.copy(this._restHeadWorldQuaternion).invert();const[t,i]=re(this.faceFront);return ce.set(0,.5*Math.PI+t,i,"YZX"),e.setFromEuler(ce).premultiply(pe.copy(this._restHeadWorldQuaternion).invert())}getLookAtWorldDirection(e){return this.getLookAtWorldQuaternion(ue),this.getFaceFrontQuaternion(de),e.copy(ne).applyQuaternion(ue).applyQuaternion(de).applyEuler(this.getEuler(ce))}lookAt(t){const i=he.copy(this._restHeadWorldQuaternion).multiply(V(this.getLookAtWorldQuaternion(ue))),r=this.getLookAtWorldPosition(ae),o=le.copy(t).sub(r).applyQuaternion(i).normalize(),[n,s]=re(this.faceFront),[a,l]=re(o),h=oe(a-n),u=oe(s-l);this._yaw=e.MathUtils.RAD2DEG*h,this._pitch=e.MathUtils.RAD2DEG*u,this._needsUpdate=!0}update(e){null!=this.target&&this.autoUpdate&&this.lookAt(this.target.getWorldPosition(se)),this._needsUpdate&&(this._needsUpdate=!1,this.applier.applyYawPitch(this._yaw,this._pitch))}}me.EULER_ORDER="YXZ";const ge=new e.Vector3(0,0,1),fe=new e.Quaternion,ve=new e.Quaternion,ye=new e.Euler(0,0,0,"YXZ");class we{constructor(t,i,r,o,n){this.humanoid=t,this.rangeMapHorizontalInner=i,this.rangeMapHorizontalOuter=r,this.rangeMapVerticalDown=o,this.rangeMapVerticalUp=n,this.faceFront=new e.Vector3(0,0,1),this._restQuatLeftEye=new e.Quaternion,this._restQuatRightEye=new e.Quaternion,this._restLeftEyeParentWorldQuat=new e.Quaternion,this._restRightEyeParentWorldQuat=new e.Quaternion;const s=this.humanoid.getRawBoneNode("leftEye"),a=this.humanoid.getRawBoneNode("rightEye");s&&(this._restQuatLeftEye.copy(s.quaternion),ie(s.parent,this._restLeftEyeParentWorldQuat)),a&&(this._restQuatRightEye.copy(a.quaternion),ie(a.parent,this._restRightEyeParentWorldQuat))}applyYawPitch(t,i){const r=this.humanoid.getRawBoneNode("leftEye"),o=this.humanoid.getRawBoneNode("rightEye"),n=this.humanoid.getNormalizedBoneNode("leftEye"),s=this.humanoid.getNormalizedBoneNode("rightEye");r&&(ye.x=i<0?-e.MathUtils.DEG2RAD*this.rangeMapVerticalDown.map(-i):e.MathUtils.DEG2RAD*this.rangeMapVerticalUp.map(i),ye.y=t<0?-e.MathUtils.DEG2RAD*this.rangeMapHorizontalInner.map(-t):e.MathUtils.DEG2RAD*this.rangeMapHorizontalOuter.map(t),fe.setFromEuler(ye),this._getWorldFaceFrontQuat(ve),n.quaternion.copy(ve).multiply(fe).multiply(ve.invert()),fe.copy(this._restLeftEyeParentWorldQuat),r.quaternion.copy(n.quaternion).multiply(fe).premultiply(fe.invert()).multiply(this._restQuatLeftEye)),o&&(ye.x=i<0?-e.MathUtils.DEG2RAD*this.rangeMapVerticalDown.map(-i):e.MathUtils.DEG2RAD*this.rangeMapVerticalUp.map(i),ye.y=t<0?-e.MathUtils.DEG2RAD*this.rangeMapHorizontalOuter.map(-t):e.MathUtils.DEG2RAD*this.rangeMapHorizontalInner.map(t),fe.setFromEuler(ye),this._getWorldFaceFrontQuat(ve),s.quaternion.copy(ve).multiply(fe).multiply(ve.invert()),fe.copy(this._restRightEyeParentWorldQuat),o.quaternion.copy(s.quaternion).multiply(fe).premultiply(fe.invert()).multiply(this._restQuatRightEye))}lookAt(t){console.warn("VRMLookAtBoneApplier: lookAt() is deprecated. use apply() instead.");const i=e.MathUtils.RAD2DEG*t.y,r=e.MathUtils.RAD2DEG*t.x;this.applyYawPitch(i,r)}_getWorldFaceFrontQuat(e){if(this.faceFront.distanceToSquared(ge)<.01)return e.identity();const[t,i]=re(this.faceFront);return ye.set(0,.5*Math.PI+t,i,"YZX"),e.setFromEuler(ye)}}we.type="bone";class xe{constructor(e,t,i,r,o){this.expressions=e,this.rangeMapHorizontalInner=t,this.rangeMapHorizontalOuter=i,this.rangeMapVerticalDown=r,this.rangeMapVerticalUp=o}applyYawPitch(e,t){t<0?(this.expressions.setValue("lookDown",0),this.expressions.setValue("lookUp",this.rangeMapVerticalUp.map(-t))):(this.expressions.setValue("lookUp",0),this.expressions.setValue("lookDown",this.rangeMapVerticalDown.map(t))),e<0?(this.expressions.setValue("lookLeft",0),this.expressions.setValue("lookRight",this.rangeMapHorizontalOuter.map(-e))):(this.expressions.setValue("lookRight",0),this.expressions.setValue("lookLeft",this.rangeMapHorizontalOuter.map(e)))}lookAt(t){console.warn("VRMLookAtBoneApplier: lookAt() is deprecated. use apply() instead.");const i=e.MathUtils.RAD2DEG*t.y,r=e.MathUtils.RAD2DEG*t.x;this.applyYawPitch(i,r)}}xe.type="expression";class _e{constructor(e,t){this.inputMaxValue=e,this.outputScale=t}map(e){return this.outputScale*l(e/this.inputMaxValue)}}const Me=new Set(["1.0","1.0-beta"]);class Re{get name(){return"VRMLookAtLoaderPlugin"}constructor(e,t){this.parser=e,this.helperRoot=null==t?void 0:t.helperRoot}afterRoot(e){return i(this,void 0,void 0,(function*(){const t=e.userData.vrmHumanoid;if(null===t)return;if(void 0===t)throw new Error("VRMLookAtLoaderPlugin: vrmHumanoid is undefined. VRMHumanoidLoaderPlugin have to be used first");const i=e.userData.vrmExpressionManager;if(null!==i){if(void 0===i)throw new Error("VRMLookAtLoaderPlugin: vrmExpressionManager is undefined. VRMExpressionLoaderPlugin have to be used first");e.userData.vrmLookAt=yield this._import(e,t,i)}}))}_import(e,t,r){return i(this,void 0,void 0,(function*(){if(null==t||null==r)return null;const i=yield this._v1Import(e,t,r);if(i)return i;const o=yield this._v0Import(e,t,r);return o||null}))}_v1Import(e,t,r){var o,n,s;return i(this,void 0,void 0,(function*(){const e=this.parser.json;if(!(-1!==(null===(o=e.extensionsUsed)||void 0===o?void 0:o.indexOf("VRMC_vrm"))))return null;const i=null===(n=e.extensions)||void 0===n?void 0:n.VRMC_vrm;if(!i)return null;const a=i.specVersion;if(!Me.has(a))return console.warn(`VRMLookAtLoaderPlugin: Unknown VRMC_vrm specVersion "${a}"`),null;const l=i.lookAt;if(!l)return null;const h="expression"===l.type?1:10,u=this._v1ImportRangeMap(l.rangeMapHorizontalInner,h),d=this._v1ImportRangeMap(l.rangeMapHorizontalOuter,h),p=this._v1ImportRangeMap(l.rangeMapVerticalDown,h),c=this._v1ImportRangeMap(l.rangeMapVerticalUp,h);let m;m="expression"===l.type?new xe(r,u,d,p,c):new we(t,u,d,p,c);const g=this._importLookAt(t,m);return g.offsetFromHeadBone.fromArray(null!==(s=l.offsetFromHeadBone)&&void 0!==s?s:[0,.06,0]),g}))}_v1ImportRangeMap(e,t){var i,r;let o=null!==(i=null==e?void 0:e.inputMaxValue)&&void 0!==i?i:90;const n=null!==(r=null==e?void 0:e.outputScale)&&void 0!==r?r:t;return o<.01&&(console.warn("VRMLookAtLoaderPlugin: inputMaxValue of a range map is too small. Consider reviewing the range map!"),o=.01),new _e(o,n)}_v0Import(e,t,r){var o,n,s,a;return i(this,void 0,void 0,(function*(){const e=this.parser.json,i=null===(o=e.extensions)||void 0===o?void 0:o.VRM;if(!i)return null;const l=i.firstPerson;if(!l)return null;const h="BlendShape"===l.lookAtTypeName?1:10,u=this._v0ImportDegreeMap(l.lookAtHorizontalInner,h),d=this._v0ImportDegreeMap(l.lookAtHorizontalOuter,h),p=this._v0ImportDegreeMap(l.lookAtVerticalDown,h),c=this._v0ImportDegreeMap(l.lookAtVerticalUp,h);let m;m="BlendShape"===l.lookAtTypeName?new xe(r,u,d,p,c):new we(t,u,d,p,c);const g=this._importLookAt(t,m);return l.firstPersonBoneOffset?g.offsetFromHeadBone.set(null!==(n=l.firstPersonBoneOffset.x)&&void 0!==n?n:0,null!==(s=l.firstPersonBoneOffset.y)&&void 0!==s?s:.06,-(null!==(a=l.firstPersonBoneOffset.z)&&void 0!==a?a:0)):g.offsetFromHeadBone.set(0,.06,0),g.faceFront.set(0,0,-1),m instanceof we&&m.faceFront.set(0,0,-1),g}))}_v0ImportDegreeMap(e,t){var i,r;const o=null==e?void 0:e.curve;"[0,0,0,1,1,1,1,0]"!==JSON.stringify(o)&&console.warn("Curves of LookAtDegreeMap defined in VRM 0.0 are not supported");let n=null!==(i=null==e?void 0:e.xRange)&&void 0!==i?i:90;const s=null!==(r=null==e?void 0:e.yRange)&&void 0!==r?r:t;return n<.01&&(console.warn("VRMLookAtLoaderPlugin: xRange of a degree map is too small. Consider reviewing the degree map!"),n=.01),new _e(n,s)}_importLookAt(e,t){const i=new me(e,t);if(this.helperRoot){const e=new K(i);this.helperRoot.add(e),e.renderOrder=this.helperRoot.renderOrder}return i}}const Pe={Bone:"bone",Expression:"expression"};const Le=new Set(["1.0","1.0-beta"]);class Ae{get name(){return"VRMMetaLoaderPlugin"}constructor(e,t){var i,r,o;this.parser=e,this.needThumbnailImage=null===(i=null==t?void 0:t.needThumbnailImage)||void 0===i||i,this.acceptLicenseUrls=null!==(r=null==t?void 0:t.acceptLicenseUrls)&&void 0!==r?r:["https://vrm.dev/licenses/1.0/"],this.acceptV0Meta=null===(o=null==t?void 0:t.acceptV0Meta)||void 0===o||o}afterRoot(e){return i(this,void 0,void 0,(function*(){e.userData.vrmMeta=yield this._import(e)}))}_import(e){return i(this,void 0,void 0,(function*(){const t=yield this._v1Import(e);if(null!=t)return t;const i=yield this._v0Import(e);return null!=i?i:null}))}_v1Import(e){var t,r,o;return i(this,void 0,void 0,(function*(){const e=this.parser.json;if(!(-1!==(null===(t=e.extensionsUsed)||void 0===t?void 0:t.indexOf("VRMC_vrm"))))return null;const i=null===(r=e.extensions)||void 0===r?void 0:r.VRMC_vrm;if(null==i)return null;const n=i.specVersion;if(!Le.has(n))return console.warn(`VRMMetaLoaderPlugin: Unknown VRMC_vrm specVersion "${n}"`),null;const s=i.meta;if(!s)return null;const a=s.licenseUrl;if(!new Set(this.acceptLicenseUrls).has(a))throw new Error(`VRMMetaLoaderPlugin: The license url "${a}" is not accepted`);let l;return this.needThumbnailImage&&null!=s.thumbnailImage&&(l=null!==(o=yield this._extractGLTFImage(s.thumbnailImage))&&void 0!==o?o:void 0),{metaVersion:"1",name:s.name,version:s.version,authors:s.authors,copyrightInformation:s.copyrightInformation,contactInformation:s.contactInformation,references:s.references,thirdPartyLicenses:s.thirdPartyLicenses,thumbnailImage:l,licenseUrl:s.licenseUrl,avatarPermission:s.avatarPermission,allowExcessivelyViolentUsage:s.allowExcessivelyViolentUsage,allowExcessivelySexualUsage:s.allowExcessivelySexualUsage,commercialUsage:s.commercialUsage,allowPoliticalOrReligiousUsage:s.allowPoliticalOrReligiousUsage,allowAntisocialOrHateUsage:s.allowAntisocialOrHateUsage,creditNotation:s.creditNotation,allowRedistribution:s.allowRedistribution,modification:s.modification,otherLicenseUrl:s.otherLicenseUrl}}))}_v0Import(e){var t;return i(this,void 0,void 0,(function*(){const e=this.parser.json,i=null===(t=e.extensions)||void 0===t?void 0:t.VRM;if(!i)return null;const r=i.meta;if(!r)return null;if(!this.acceptV0Meta)throw new Error("VRMMetaLoaderPlugin: Attempted to load VRM0.0 meta but acceptV0Meta is false");let o;return this.needThumbnailImage&&null!=r.texture&&-1!==r.texture&&(o=yield this.parser.getDependency("texture",r.texture)),{metaVersion:"0",allowedUserName:r.allowedUserName,author:r.author,commercialUssageName:r.commercialUssageName,contactInformation:r.contactInformation,licenseName:r.licenseName,otherLicenseUrl:r.otherLicenseUrl,otherPermissionUrl:r.otherPermissionUrl,reference:r.reference,sexualUssageName:r.sexualUssageName,texture:null!=o?o:void 0,title:r.title,version:r.version,violentUssageName:r.violentUssageName}}))}_extractGLTFImage(t){var r;return i(this,void 0,void 0,(function*(){const i=this.parser.json,o=null===(r=i.images)||void 0===r?void 0:r[t];if(null==o)return console.warn(`VRMMetaLoaderPlugin: Attempt to use images[${t}] of glTF as a thumbnail but the image doesn't exist`),null;let n=o.uri;if(null!=o.bufferView){const e=yield this.parser.getDependency("bufferView",o.bufferView),t=new Blob([e],{type:o.mimeType});n=URL.createObjectURL(t)}if(null==n)return console.warn(`VRMMetaLoaderPlugin: Attempt to use images[${t}] of glTF as a thumbnail but the image couldn't load properly`),null;const s=new e.ImageLoader;return yield s.loadAsync((a=n,l=this.parser.options.path,"string"!=typeof a||""===a?"":(/^https?:\/\//i.test(l)&&/^\//.test(a)&&(l=l.replace(/(^https?:\/\/[^/]+).*/i,"$1")),/^(https?:)?\/\//i.test(a)||/^data:.*,.*$/i.test(a)||/^blob:.*$/i.test(a)?a:l+a))).catch((e=>(console.error(e),console.warn("VRMMetaLoaderPlugin: Failed to load a thumbnail image"),null)));var a,l}))}}class be{constructor(e){this.scene=e.scene,this.meta=e.meta,this.humanoid=e.humanoid,this.expressionManager=e.expressionManager,this.firstPerson=e.firstPerson,this.lookAt=e.lookAt}update(e){this.humanoid.update(),this.lookAt&&this.lookAt.update(e),this.expressionManager&&this.expressionManager.update()}}class Ee{get name(){return"VRMC_vrm"}constructor(e,t){var i,r,o,n,s;this.parser=e;const a=null==t?void 0:t.helperRoot,l=null==t?void 0:t.autoUpdateHumanBones;this.expressionPlugin=null!==(i=null==t?void 0:t.expressionPlugin)&&void 0!==i?i:new y(e),this.firstPersonPlugin=null!==(r=null==t?void 0:t.firstPersonPlugin)&&void 0!==r?r:new M(e),this.humanoidPlugin=null!==(o=null==t?void 0:t.humanoidPlugin)&&void 0!==o?o:new z(e,{helperRoot:a,autoUpdateHumanBones:l}),this.lookAtPlugin=null!==(n=null==t?void 0:t.lookAtPlugin)&&void 0!==n?n:new Re(e,{helperRoot:a}),this.metaPlugin=null!==(s=null==t?void 0:t.metaPlugin)&&void 0!==s?s:new Ae(e)}afterRoot(e){return i(this,void 0,void 0,(function*(){yield this.metaPlugin.afterRoot(e),yield this.humanoidPlugin.afterRoot(e),yield this.expressionPlugin.afterRoot(e),yield this.lookAtPlugin.afterRoot(e),yield this.firstPersonPlugin.afterRoot(e);const t=e.userData.vrmMeta,i=e.userData.vrmHumanoid;if(t&&i){const r=new be({scene:e.scene,expressionManager:e.userData.vrmExpressionManager,firstPerson:e.userData.vrmFirstPerson,humanoid:i,lookAt:e.userData.vrmLookAt,meta:t});e.userData.vrmCore=r}}))}}export{be as VRMCore,Ee as VRMCoreLoaderPlugin,t as VRMExpression,y as VRMExpressionLoaderPlugin,h as VRMExpressionManager,c as VRMExpressionMaterialColorBind,u as VRMExpressionMaterialColorType,m as VRMExpressionMorphTargetBind,w as VRMExpressionOverrideType,a as VRMExpressionPresetName,f as VRMExpressionTextureTransformBind,x as VRMFirstPerson,M as VRMFirstPersonLoaderPlugin,R as VRMFirstPersonMeshAnnotationType,E as VRMHumanBoneList,I as VRMHumanBoneName,B as VRMHumanBoneParentMap,F as VRMHumanoid,b as VRMHumanoidHelper,z as VRMHumanoidLoaderPlugin,me as VRMLookAt,we as VRMLookAtBoneApplier,xe as VRMLookAtExpressionApplier,K as VRMLookAtHelper,Re as VRMLookAtLoaderPlugin,_e as VRMLookAtRangeMap,Pe as VRMLookAtTypeName,Ae as VRMMetaLoaderPlugin,S as VRMRequiredHumanBoneName};
|
|
2
|
+
import*as e from"three";class t extends e.Object3D{get overrideBlinkAmount(){return"block"===this.overrideBlink?0<this.weight?1:0:"blend"===this.overrideBlink?this.weight:0}get overrideLookAtAmount(){return"block"===this.overrideLookAt?0<this.weight?1:0:"blend"===this.overrideLookAt?this.weight:0}get overrideMouthAmount(){return"block"===this.overrideMouth?0<this.weight?1:0:"blend"===this.overrideMouth?this.weight:0}constructor(e){super(),this.weight=0,this.isBinary=!1,this.overrideBlink="none",this.overrideLookAt="none",this.overrideMouth="none",this._binds=[],this.name=`VRMExpression_${e}`,this.expressionName=e,this.type="VRMExpression",this.visible=!1}addBind(e){this._binds.push(e)}applyWeight(e){var t;let i=this.isBinary?this.weight<=.5?0:1:this.weight;i*=null!==(t=null==e?void 0:e.multiplier)&&void 0!==t?t:1,this._binds.forEach((e=>e.applyWeight(i)))}clearAppliedWeight(){this._binds.forEach((e=>e.clearAppliedWeight()))}}function i(e,t,i,r){return new(i||(i=Promise))((function(n,o){function s(e){try{l(r.next(e))}catch(e){o(e)}}function a(e){try{l(r.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(s,a)}l((r=r.apply(e,t||[])).next())}))}function r(e,t,i){var r,n;const o=e.parser.json,s=null===(r=o.nodes)||void 0===r?void 0:r[t];if(null==s)return console.warn(`extractPrimitivesInternal: Attempt to use nodes[${t}] of glTF but the node doesn't exist`),null;const a=s.mesh;if(null==a)return null;const l=null===(n=o.meshes)||void 0===n?void 0:n[a];if(null==l)return console.warn(`extractPrimitivesInternal: Attempt to use meshes[${a}] of glTF but the mesh doesn't exist`),null;const h=l.primitives.length,u=[];return i.traverse((e=>{u.length<h&&e.isMesh&&u.push(e)})),u}function n(e,t){return i(this,void 0,void 0,(function*(){const i=yield e.parser.getDependency("node",t);return r(e,t,i)}))}function o(e){return i(this,void 0,void 0,(function*(){const t=yield e.parser.getDependencies("node"),i=new Map;return t.forEach(((t,n)=>{const o=r(e,n,t);null!=o&&i.set(n,o)})),i}))}function s(t,i){var r,n;let o=null;if(parseInt(e.REVISION,10)>=133)o=null!==(n=null===(r=t.associations.get(i))||void 0===r?void 0:r.materials)&&void 0!==n?n:null;else{const e=t.associations.get(i);"materials"===(null==e?void 0:e.type)&&(o=e.index)}return o}const a={Aa:"aa",Ih:"ih",Ou:"ou",Ee:"ee",Oh:"oh",Blink:"blink",Happy:"happy",Angry:"angry",Sad:"sad",Relaxed:"relaxed",LookUp:"lookUp",Surprised:"surprised",LookDown:"lookDown",LookLeft:"lookLeft",LookRight:"lookRight",BlinkLeft:"blinkLeft",BlinkRight:"blinkRight",Neutral:"neutral"};function l(e){return Math.max(Math.min(e,1),0)}class h{get expressions(){return this._expressions.concat()}get expressionMap(){return Object.assign({},this._expressionMap)}get presetExpressionMap(){const e={},t=new Set(Object.values(a));return Object.entries(this._expressionMap).forEach((([i,r])=>{t.has(i)&&(e[i]=r)})),e}get customExpressionMap(){const e={},t=new Set(Object.values(a));return Object.entries(this._expressionMap).forEach((([i,r])=>{t.has(i)||(e[i]=r)})),e}constructor(){this.blinkExpressionNames=["blink","blinkLeft","blinkRight"],this.lookAtExpressionNames=["lookLeft","lookRight","lookUp","lookDown"],this.mouthExpressionNames=["aa","ee","ih","oh","ou"],this._expressions=[],this._expressionMap={}}copy(e){return this._expressions.concat().forEach((e=>{this.unregisterExpression(e)})),e._expressions.forEach((e=>{this.registerExpression(e)})),this.blinkExpressionNames=e.blinkExpressionNames.concat(),this.lookAtExpressionNames=e.lookAtExpressionNames.concat(),this.mouthExpressionNames=e.mouthExpressionNames.concat(),this}clone(){return(new h).copy(this)}getExpression(e){var t;return null!==(t=this._expressionMap[e])&&void 0!==t?t:null}registerExpression(e){this._expressions.push(e),this._expressionMap[e.expressionName]=e}unregisterExpression(e){const t=this._expressions.indexOf(e);-1===t&&console.warn("VRMExpressionManager: The specified expressions is not registered"),this._expressions.splice(t,1),delete this._expressionMap[e.expressionName]}getValue(e){var t;const i=this.getExpression(e);return null!==(t=null==i?void 0:i.weight)&&void 0!==t?t:null}setValue(e,t){const i=this.getExpression(e);i&&(i.weight=l(t))}getExpressionTrackName(e){const t=this.getExpression(e);return t?`${t.name}.weight`:null}update(){const e=this._calculateWeightMultipliers();this._expressions.forEach((e=>{e.clearAppliedWeight()})),this._expressions.forEach((t=>{let i=1;const r=t.expressionName;-1!==this.blinkExpressionNames.indexOf(r)&&(i*=e.blink),-1!==this.lookAtExpressionNames.indexOf(r)&&(i*=e.lookAt),-1!==this.mouthExpressionNames.indexOf(r)&&(i*=e.mouth),t.applyWeight({multiplier:i})}))}_calculateWeightMultipliers(){let e=1,t=1,i=1;return this._expressions.forEach((r=>{e-=r.overrideBlinkAmount,t-=r.overrideLookAtAmount,i-=r.overrideMouthAmount})),e=Math.max(0,e),t=Math.max(0,t),i=Math.max(0,i),{blink:e,lookAt:t,mouth:i}}}const u={Color:"color",EmissionColor:"emissionColor",ShadeColor:"shadeColor",MatcapColor:"matcapColor",RimColor:"rimColor",OutlineColor:"outlineColor"},d={_Color:u.Color,_EmissionColor:u.EmissionColor,_ShadeColor:u.ShadeColor,_RimColor:u.RimColor,_OutlineColor:u.OutlineColor},p=new e.Color;class c{constructor({material:e,type:t,targetValue:i,targetAlpha:r}){this.material=e,this.type=t,this.targetValue=i,this.targetAlpha=null!=r?r:1;const n=this._initColorBindState(),o=this._initAlphaBindState();this._state={color:n,alpha:o}}applyWeight(e){const{color:t,alpha:i}=this._state;if(null!=t){const{propertyName:i,deltaValue:r}=t,n=this.material[i];null!=n&&n.add(p.copy(r).multiplyScalar(e))}if(null!=i){const{propertyName:t,deltaValue:r}=i;null!=this.material[t]&&(this.material[t]+=r*e)}}clearAppliedWeight(){const{color:e,alpha:t}=this._state;if(null!=e){const{propertyName:t,initialValue:i}=e,r=this.material[t];null!=r&&r.copy(i)}if(null!=t){const{propertyName:e,initialValue:i}=t;null!=this.material[e]&&(this.material[e]=i)}}_initColorBindState(){var t,i,r;const{material:n,type:o,targetValue:s}=this,a=this._getPropertyNameMap(),l=null!==(i=null===(t=null==a?void 0:a[o])||void 0===t?void 0:t[0])&&void 0!==i?i:null;if(null==l)return console.warn(`Tried to add a material color bind to the material ${null!==(r=n.name)&&void 0!==r?r:"(no name)"}, the type ${o} but the material or the type is not supported.`),null;const h=n[l].clone();return{propertyName:l,initialValue:h,deltaValue:new e.Color(s.r-h.r,s.g-h.g,s.b-h.b)}}_initAlphaBindState(){var e,t,i;const{material:r,type:n,targetAlpha:o}=this,s=this._getPropertyNameMap(),a=null!==(t=null===(e=null==s?void 0:s[n])||void 0===e?void 0:e[1])&&void 0!==t?t:null;if(null==a&&1!==o)return console.warn(`Tried to add a material alpha bind to the material ${null!==(i=r.name)&&void 0!==i?i:"(no name)"}, the type ${n} but the material or the type does not support alpha.`),null;if(null==a)return null;const l=r[a];return{propertyName:a,initialValue:l,deltaValue:o-l}}_getPropertyNameMap(){var e,t;return null!==(t=null===(e=Object.entries(c._propertyNameMapMap).find((([e])=>!0===this.material[e])))||void 0===e?void 0:e[1])&&void 0!==t?t:null}}c._propertyNameMapMap={isMeshStandardMaterial:{color:["color","opacity"],emissionColor:["emissive",null]},isMeshBasicMaterial:{color:["color","opacity"]},isMToonMaterial:{color:["color","opacity"],emissionColor:["emissive",null],outlineColor:["outlineColorFactor",null],matcapColor:["matcapFactor",null],rimColor:["parametricRimColorFactor",null],shadeColor:["shadeColorFactor",null]}};class m{constructor({primitives:e,index:t,weight:i}){this.primitives=e,this.index=t,this.weight=i}applyWeight(e){this.primitives.forEach((t=>{var i;null!=(null===(i=t.morphTargetInfluences)||void 0===i?void 0:i[this.index])&&(t.morphTargetInfluences[this.index]+=this.weight*e)}))}clearAppliedWeight(){this.primitives.forEach((e=>{var t;null!=(null===(t=e.morphTargetInfluences)||void 0===t?void 0:t[this.index])&&(e.morphTargetInfluences[this.index]=0)}))}}const g=new e.Vector2;class f{constructor({material:e,scale:t,offset:i}){var r,n;this.material=e,this.scale=t,this.offset=i;const o=null===(r=Object.entries(f._propertyNamesMap).find((([t])=>!0===e[t])))||void 0===r?void 0:r[1];null==o?(console.warn(`Tried to add a texture transform bind to the material ${null!==(n=e.name)&&void 0!==n?n:"(no name)"} but the material is not supported.`),this._properties=[]):(this._properties=[],o.forEach((r=>{var n;const o=null===(n=e[r])||void 0===n?void 0:n.clone();if(!o)return null;e[r]=o;const s=o.offset.clone(),a=o.repeat.clone(),l=i.clone().sub(s),h=t.clone().sub(a);this._properties.push({name:r,initialOffset:s,deltaOffset:l,initialScale:a,deltaScale:h})})))}applyWeight(e){this._properties.forEach((t=>{const i=this.material[t.name];void 0!==i&&(i.offset.add(g.copy(t.deltaOffset).multiplyScalar(e)),i.repeat.add(g.copy(t.deltaScale).multiplyScalar(e)),i.needsUpdate=!0)}))}clearAppliedWeight(){this._properties.forEach((e=>{const t=this.material[e.name];void 0!==t&&(t.offset.copy(e.initialOffset),t.repeat.copy(e.initialScale),t.needsUpdate=!0)}))}}f._propertyNamesMap={isMeshStandardMaterial:["map","emissiveMap","bumpMap","normalMap","displacementMap","roughnessMap","metalnessMap","alphaMap"],isMeshBasicMaterial:["map","specularMap","alphaMap"],isMToonMaterial:["map","normalMap","emissiveMap","shadeMultiplyTexture","rimMultiplyTexture","outlineWidthMultiplyTexture","uvAnimationMaskTexture"]};const v=new Set(["1.0","1.0-beta"]);class y{get name(){return"VRMExpressionLoaderPlugin"}constructor(e){this.parser=e}afterRoot(e){return i(this,void 0,void 0,(function*(){e.userData.vrmExpressionManager=yield this._import(e)}))}_import(e){return i(this,void 0,void 0,(function*(){const t=yield this._v1Import(e);if(t)return t;const i=yield this._v0Import(e);return i||null}))}_v1Import(r){var o,l;return i(this,void 0,void 0,(function*(){const u=this.parser.json;if(!(-1!==(null===(o=u.extensionsUsed)||void 0===o?void 0:o.indexOf("VRMC_vrm"))))return null;const d=null===(l=u.extensions)||void 0===l?void 0:l.VRMC_vrm;if(!d)return null;const p=d.specVersion;if(!v.has(p))return console.warn(`VRMExpressionLoaderPlugin: Unknown VRMC_vrm specVersion "${p}"`),null;const g=d.expressions;if(!g)return null;const y=new Set(Object.values(a)),w=new Map;null!=g.preset&&Object.entries(g.preset).forEach((([e,t])=>{null!=t&&(y.has(e)?w.set(e,t):console.warn(`VRMExpressionLoaderPlugin: Unknown preset name "${e}" detected. Ignoring the expression`))})),null!=g.custom&&Object.entries(g.custom).forEach((([e,t])=>{y.has(e)?console.warn(`VRMExpressionLoaderPlugin: Custom expression cannot have preset name "${e}". Ignoring the expression`):w.set(e,t)}));const x=new h;return yield Promise.all(Array.from(w.entries()).map((([o,a])=>i(this,void 0,void 0,(function*(){var l,h,u,d,p,g,v;const y=new t(o);if(r.scene.add(y),y.isBinary=null!==(l=a.isBinary)&&void 0!==l&&l,y.overrideBlink=null!==(h=a.overrideBlink)&&void 0!==h?h:"none",y.overrideLookAt=null!==(u=a.overrideLookAt)&&void 0!==u?u:"none",y.overrideMouth=null!==(d=a.overrideMouth)&&void 0!==d?d:"none",null===(p=a.morphTargetBinds)||void 0===p||p.forEach((e=>i(this,void 0,void 0,(function*(){var t;if(void 0===e.node||void 0===e.index)return;const i=yield n(r,e.node),o=e.index;i.every((e=>Array.isArray(e.morphTargetInfluences)&&o<e.morphTargetInfluences.length))?y.addBind(new m({primitives:i,index:o,weight:null!==(t=e.weight)&&void 0!==t?t:1})):console.warn(`VRMExpressionLoaderPlugin: ${a.name} attempts to index morph #${o} but not found.`)})))),a.materialColorBinds||a.textureTransformBinds){const t=[];r.scene.traverse((e=>{const i=e.material;i&&t.push(i)})),null===(g=a.materialColorBinds)||void 0===g||g.forEach((r=>i(this,void 0,void 0,(function*(){t.filter((e=>{const t=s(this.parser,e);return r.material===t})).forEach((t=>{y.addBind(new c({material:t,type:r.type,targetValue:(new e.Color).fromArray(r.targetValue),targetAlpha:r.targetValue[3]}))}))})))),null===(v=a.textureTransformBinds)||void 0===v||v.forEach((r=>i(this,void 0,void 0,(function*(){t.filter((e=>{const t=s(this.parser,e);return r.material===t})).forEach((t=>{var i,n;y.addBind(new f({material:t,offset:(new e.Vector2).fromArray(null!==(i=r.offset)&&void 0!==i?i:[0,0]),scale:(new e.Vector2).fromArray(null!==(n=r.scale)&&void 0!==n?n:[1,1])}))}))}))))}x.registerExpression(y)}))))),x}))}_v0Import(r){var o;return i(this,void 0,void 0,(function*(){const s=this.parser.json,a=null===(o=s.extensions)||void 0===o?void 0:o.VRM;if(!a)return null;const l=a.blendShapeMaster;if(!l)return null;const u=new h,p=l.blendShapeGroups;if(!p)return u;const g=new Set;return yield Promise.all(p.map((o=>i(this,void 0,void 0,(function*(){var a;const l=o.presetName,h=null!=l&&y.v0v1PresetNameMap[l]||null,p=null!=h?h:o.name;if(null==p)return void console.warn("VRMExpressionLoaderPlugin: One of custom expressions has no name. Ignoring the expression");if(g.has(p))return void console.warn(`VRMExpressionLoaderPlugin: An expression preset ${l} has duplicated entries. Ignoring the expression`);g.add(p);const v=new t(p);r.scene.add(v),v.isBinary=null!==(a=o.isBinary)&&void 0!==a&&a,o.binds&&o.binds.forEach((e=>i(this,void 0,void 0,(function*(){var t;if(void 0===e.mesh||void 0===e.index)return;const a=[];null===(t=s.nodes)||void 0===t||t.forEach(((t,i)=>{t.mesh===e.mesh&&a.push(i)}));const l=e.index;yield Promise.all(a.map((t=>i(this,void 0,void 0,(function*(){var i;const s=yield n(r,t);s.every((e=>Array.isArray(e.morphTargetInfluences)&&l<e.morphTargetInfluences.length))?v.addBind(new m({primitives:s,index:l,weight:.01*(null!==(i=e.weight)&&void 0!==i?i:100)})):console.warn(`VRMExpressionLoaderPlugin: ${o.name} attempts to index ${l}th morph but not found.`)})))))}))));const w=o.materialValues;w&&0!==w.length&&w.forEach((t=>{if(void 0===t.materialName||void 0===t.propertyName||void 0===t.targetValue)return;const i=[];r.scene.traverse((e=>{if(e.material){const r=e.material;Array.isArray(r)?i.push(...r.filter((e=>(e.name===t.materialName||e.name===t.materialName+" (Outline)")&&-1===i.indexOf(e)))):r.name===t.materialName&&-1===i.indexOf(r)&&i.push(r)}}));const n=t.propertyName;i.forEach((i=>{if("_MainTex_ST"===n){const r=new e.Vector2(t.targetValue[0],t.targetValue[1]),n=new e.Vector2(t.targetValue[2],t.targetValue[3]);return n.y=1-n.y-r.y,void v.addBind(new f({material:i,scale:r,offset:n}))}const r=d[n];r?v.addBind(new c({material:i,type:r,targetValue:(new e.Color).fromArray(t.targetValue),targetAlpha:t.targetValue[3]})):console.warn(n+" is not supported")}))})),u.registerExpression(v)}))))),u}))}}y.v0v1PresetNameMap={a:"aa",e:"ee",i:"ih",o:"oh",u:"ou",blink:"blink",joy:"happy",angry:"angry",sorrow:"sad",fun:"relaxed",lookup:"lookUp",lookdown:"lookDown",lookleft:"lookLeft",lookright:"lookRight",blink_l:"blinkLeft",blink_r:"blinkRight",neutral:"neutral"};const w={None:"none",Block:"block",Blend:"blend"};class x{constructor(e,t){this._firstPersonOnlyLayer=x.DEFAULT_FIRSTPERSON_ONLY_LAYER,this._thirdPersonOnlyLayer=x.DEFAULT_THIRDPERSON_ONLY_LAYER,this._initializedLayers=!1,this.humanoid=e,this.meshAnnotations=t}copy(e){if(this.humanoid!==e.humanoid)throw new Error("VRMFirstPerson: humanoid must be same in order to copy");return this.meshAnnotations=e.meshAnnotations.map((e=>({meshes:e.meshes.concat(),type:e.type}))),this}clone(){return new x(this.humanoid,this.meshAnnotations).copy(this)}get firstPersonOnlyLayer(){return this._firstPersonOnlyLayer}get thirdPersonOnlyLayer(){return this._thirdPersonOnlyLayer}setup({firstPersonOnlyLayer:e=x.DEFAULT_FIRSTPERSON_ONLY_LAYER,thirdPersonOnlyLayer:t=x.DEFAULT_THIRDPERSON_ONLY_LAYER}={}){this._initializedLayers||(this._firstPersonOnlyLayer=e,this._thirdPersonOnlyLayer=t,this.meshAnnotations.forEach((e=>{e.meshes.forEach((t=>{"firstPersonOnly"===e.type?(t.layers.set(this._firstPersonOnlyLayer),t.traverse((e=>e.layers.set(this._firstPersonOnlyLayer)))):"thirdPersonOnly"===e.type?(t.layers.set(this._thirdPersonOnlyLayer),t.traverse((e=>e.layers.set(this._thirdPersonOnlyLayer)))):"auto"===e.type&&this._createHeadlessModel(t)}))})),this._initializedLayers=!0)}_excludeTriangles(e,t,i,r){let n=0;if(null!=t&&t.length>0)for(let o=0;o<e.length;o+=3){const s=e[o],a=e[o+1],l=e[o+2],h=t[s],u=i[s];if(h[0]>0&&r.includes(u[0]))continue;if(h[1]>0&&r.includes(u[1]))continue;if(h[2]>0&&r.includes(u[2]))continue;if(h[3]>0&&r.includes(u[3]))continue;const d=t[a],p=i[a];if(d[0]>0&&r.includes(p[0]))continue;if(d[1]>0&&r.includes(p[1]))continue;if(d[2]>0&&r.includes(p[2]))continue;if(d[3]>0&&r.includes(p[3]))continue;const c=t[l],m=i[l];c[0]>0&&r.includes(m[0])||(c[1]>0&&r.includes(m[1])||c[2]>0&&r.includes(m[2])||c[3]>0&&r.includes(m[3])||(e[n++]=s,e[n++]=a,e[n++]=l))}return n}_createErasedMesh(t,i){const r=new e.SkinnedMesh(t.geometry.clone(),t.material);r.name=`${t.name}(erase)`,r.frustumCulled=t.frustumCulled,r.layers.set(this._firstPersonOnlyLayer);const n=r.geometry,o=n.getAttribute("skinIndex"),s=o instanceof e.GLBufferAttribute?[]:o.array,a=[];for(let e=0;e<s.length;e+=4)a.push([s[e],s[e+1],s[e+2],s[e+3]]);const l=n.getAttribute("skinWeight"),h=l instanceof e.GLBufferAttribute?[]:l.array,u=[];for(let e=0;e<h.length;e+=4)u.push([h[e],h[e+1],h[e+2],h[e+3]]);const d=n.getIndex();if(!d)throw new Error("The geometry doesn't have an index buffer");const p=Array.from(d.array),c=this._excludeTriangles(p,u,a,i),m=[];for(let e=0;e<c;e++)m[e]=p[e];return n.setIndex(m),t.onBeforeRender&&(r.onBeforeRender=t.onBeforeRender),r.bind(new e.Skeleton(t.skeleton.bones,t.skeleton.boneInverses),new e.Matrix4),r}_createHeadlessModelForSkinnedMesh(e,t){const i=[];if(t.skeleton.bones.forEach(((e,t)=>{this._isEraseTarget(e)&&i.push(t)})),!i.length)return t.layers.enable(this._thirdPersonOnlyLayer),void t.layers.enable(this._firstPersonOnlyLayer);t.layers.set(this._thirdPersonOnlyLayer);const r=this._createErasedMesh(t,i);e.add(r)}_createHeadlessModel(t){if("Group"===t.type)if(t.layers.set(this._thirdPersonOnlyLayer),this._isEraseTarget(t))t.traverse((e=>e.layers.set(this._thirdPersonOnlyLayer)));else{const i=new e.Group;i.name=`_headless_${t.name}`,i.layers.set(this._firstPersonOnlyLayer),t.parent.add(i),t.children.filter((e=>"SkinnedMesh"===e.type)).forEach((e=>{const t=e;this._createHeadlessModelForSkinnedMesh(i,t)}))}else if("SkinnedMesh"===t.type){const e=t;this._createHeadlessModelForSkinnedMesh(t.parent,e)}else this._isEraseTarget(t)&&(t.layers.set(this._thirdPersonOnlyLayer),t.traverse((e=>e.layers.set(this._thirdPersonOnlyLayer))))}_isEraseTarget(e){return e===this.humanoid.getRawBoneNode("head")||!!e.parent&&this._isEraseTarget(e.parent)}}x.DEFAULT_FIRSTPERSON_ONLY_LAYER=9,x.DEFAULT_THIRDPERSON_ONLY_LAYER=10;const _=new Set(["1.0","1.0-beta"]);class M{get name(){return"VRMFirstPersonLoaderPlugin"}constructor(e){this.parser=e}afterRoot(e){return i(this,void 0,void 0,(function*(){const t=e.userData.vrmHumanoid;if(null!==t){if(void 0===t)throw new Error("VRMFirstPersonLoaderPlugin: vrmHumanoid is undefined. VRMHumanoidLoaderPlugin have to be used first");e.userData.vrmFirstPerson=yield this._import(e,t)}}))}_import(e,t){return i(this,void 0,void 0,(function*(){if(null==t)return null;const i=yield this._v1Import(e,t);if(i)return i;const r=yield this._v0Import(e,t);return r||null}))}_v1Import(e,t){var r,n;return i(this,void 0,void 0,(function*(){const i=this.parser.json;if(!(-1!==(null===(r=i.extensionsUsed)||void 0===r?void 0:r.indexOf("VRMC_vrm"))))return null;const s=null===(n=i.extensions)||void 0===n?void 0:n.VRMC_vrm;if(!s)return null;const a=s.specVersion;if(!_.has(a))return console.warn(`VRMFirstPersonLoaderPlugin: Unknown VRMC_vrm specVersion "${a}"`),null;const l=s.firstPerson;if(!l)return null;const h=[],u=yield o(e);return Array.from(u.entries()).forEach((([e,t])=>{var i;const r=l.meshAnnotations?l.meshAnnotations.find((t=>t.node===e)):void 0;h.push({meshes:t,type:null!==(i=null==r?void 0:r.type)&&void 0!==i?i:"both"})})),new x(t,h)}))}_v0Import(e,t){var r;return i(this,void 0,void 0,(function*(){const i=this.parser.json,n=null===(r=i.extensions)||void 0===r?void 0:r.VRM;if(!n)return null;const s=n.firstPerson;if(!s)return null;const a=[],l=yield o(e);return Array.from(l.entries()).forEach((([e,t])=>{const r=i.nodes[e],n=s.meshAnnotations?s.meshAnnotations.find((e=>e.mesh===r.mesh)):void 0;a.push({meshes:t,type:this._convertV0FlagToV1Type(null==n?void 0:n.firstPersonFlag)})})),new x(t,a)}))}_convertV0FlagToV1Type(e){return"FirstPersonOnly"===e?"firstPersonOnly":"ThirdPersonOnly"===e?"thirdPersonOnly":"Auto"===e?"auto":"both"}}const R={Auto:"auto",Both:"both",ThirdPersonOnly:"thirdPersonOnly",FirstPersonOnly:"firstPersonOnly"},P=new e.Vector3,L=new e.Vector3,A=new e.Quaternion;class b extends e.Group{constructor(t){super(),this.vrmHumanoid=t,this._boneAxesMap=new Map,Object.values(t.humanBones).forEach((t=>{const i=new e.AxesHelper(1);i.matrixAutoUpdate=!1,i.material.depthTest=!1,i.material.depthWrite=!1,this.add(i),this._boneAxesMap.set(t,i)}))}dispose(){Array.from(this._boneAxesMap.values()).forEach((e=>{e.geometry.dispose(),e.material.dispose()}))}updateMatrixWorld(e){Array.from(this._boneAxesMap.entries()).forEach((([e,t])=>{e.node.updateWorldMatrix(!0,!1),e.node.matrixWorld.decompose(P,A,L);const i=P.set(.1,.1,.1).divide(L);t.matrix.copy(e.node.matrixWorld).scale(i)})),super.updateMatrixWorld(e)}}const E=["hips","spine","chest","upperChest","neck","head","leftEye","rightEye","jaw","leftUpperLeg","leftLowerLeg","leftFoot","leftToes","rightUpperLeg","rightLowerLeg","rightFoot","rightToes","leftShoulder","leftUpperArm","leftLowerArm","leftHand","rightShoulder","rightUpperArm","rightLowerArm","rightHand","leftThumbMetacarpal","leftThumbProximal","leftThumbDistal","leftIndexProximal","leftIndexIntermediate","leftIndexDistal","leftMiddleProximal","leftMiddleIntermediate","leftMiddleDistal","leftRingProximal","leftRingIntermediate","leftRingDistal","leftLittleProximal","leftLittleIntermediate","leftLittleDistal","rightThumbMetacarpal","rightThumbProximal","rightThumbDistal","rightIndexProximal","rightIndexIntermediate","rightIndexDistal","rightMiddleProximal","rightMiddleIntermediate","rightMiddleDistal","rightRingProximal","rightRingIntermediate","rightRingDistal","rightLittleProximal","rightLittleIntermediate","rightLittleDistal"],B={Hips:"hips",Spine:"spine",Chest:"chest",UpperChest:"upperChest",Neck:"neck",Head:"head",LeftEye:"leftEye",RightEye:"rightEye",Jaw:"jaw",LeftUpperLeg:"leftUpperLeg",LeftLowerLeg:"leftLowerLeg",LeftFoot:"leftFoot",LeftToes:"leftToes",RightUpperLeg:"rightUpperLeg",RightLowerLeg:"rightLowerLeg",RightFoot:"rightFoot",RightToes:"rightToes",LeftShoulder:"leftShoulder",LeftUpperArm:"leftUpperArm",LeftLowerArm:"leftLowerArm",LeftHand:"leftHand",RightShoulder:"rightShoulder",RightUpperArm:"rightUpperArm",RightLowerArm:"rightLowerArm",RightHand:"rightHand",LeftThumbMetacarpal:"leftThumbMetacarpal",LeftThumbProximal:"leftThumbProximal",LeftThumbDistal:"leftThumbDistal",LeftIndexProximal:"leftIndexProximal",LeftIndexIntermediate:"leftIndexIntermediate",LeftIndexDistal:"leftIndexDistal",LeftMiddleProximal:"leftMiddleProximal",LeftMiddleIntermediate:"leftMiddleIntermediate",LeftMiddleDistal:"leftMiddleDistal",LeftRingProximal:"leftRingProximal",LeftRingIntermediate:"leftRingIntermediate",LeftRingDistal:"leftRingDistal",LeftLittleProximal:"leftLittleProximal",LeftLittleIntermediate:"leftLittleIntermediate",LeftLittleDistal:"leftLittleDistal",RightThumbMetacarpal:"rightThumbMetacarpal",RightThumbProximal:"rightThumbProximal",RightThumbDistal:"rightThumbDistal",RightIndexProximal:"rightIndexProximal",RightIndexIntermediate:"rightIndexIntermediate",RightIndexDistal:"rightIndexDistal",RightMiddleProximal:"rightMiddleProximal",RightMiddleIntermediate:"rightMiddleIntermediate",RightMiddleDistal:"rightMiddleDistal",RightRingProximal:"rightRingProximal",RightRingIntermediate:"rightRingIntermediate",RightRingDistal:"rightRingDistal",RightLittleProximal:"rightLittleProximal",RightLittleIntermediate:"rightLittleIntermediate",RightLittleDistal:"rightLittleDistal"},I={hips:null,spine:"hips",chest:"spine",upperChest:"chest",neck:"upperChest",head:"neck",leftEye:"head",rightEye:"head",jaw:"head",leftUpperLeg:"hips",leftLowerLeg:"leftUpperLeg",leftFoot:"leftLowerLeg",leftToes:"leftFoot",rightUpperLeg:"hips",rightLowerLeg:"rightUpperLeg",rightFoot:"rightLowerLeg",rightToes:"rightFoot",leftShoulder:"upperChest",leftUpperArm:"leftShoulder",leftLowerArm:"leftUpperArm",leftHand:"leftLowerArm",rightShoulder:"upperChest",rightUpperArm:"rightShoulder",rightLowerArm:"rightUpperArm",rightHand:"rightLowerArm",leftThumbMetacarpal:"leftHand",leftThumbProximal:"leftThumbMetacarpal",leftThumbDistal:"leftThumbProximal",leftIndexProximal:"leftHand",leftIndexIntermediate:"leftIndexProximal",leftIndexDistal:"leftIndexIntermediate",leftMiddleProximal:"leftHand",leftMiddleIntermediate:"leftMiddleProximal",leftMiddleDistal:"leftMiddleIntermediate",leftRingProximal:"leftHand",leftRingIntermediate:"leftRingProximal",leftRingDistal:"leftRingIntermediate",leftLittleProximal:"leftHand",leftLittleIntermediate:"leftLittleProximal",leftLittleDistal:"leftLittleIntermediate",rightThumbMetacarpal:"rightHand",rightThumbProximal:"rightThumbMetacarpal",rightThumbDistal:"rightThumbProximal",rightIndexProximal:"rightHand",rightIndexIntermediate:"rightIndexProximal",rightIndexDistal:"rightIndexIntermediate",rightMiddleProximal:"rightHand",rightMiddleIntermediate:"rightMiddleProximal",rightMiddleDistal:"rightMiddleIntermediate",rightRingProximal:"rightHand",rightRingIntermediate:"rightRingProximal",rightRingDistal:"rightRingIntermediate",rightLittleProximal:"rightHand",rightLittleIntermediate:"rightLittleProximal",rightLittleDistal:"rightLittleIntermediate"};function V(e){return e.invert?e.invert():e.inverse(),e}const k=new e.Vector3,U=new e.Quaternion;class T{constructor(e){this.humanBones=e,this.restPose=this.getAbsolutePose()}getAbsolutePose(){const e={};return Object.keys(this.humanBones).forEach((t=>{const i=t,r=this.getBoneNode(i);r&&(k.copy(r.position),U.copy(r.quaternion),e[i]={position:k.toArray(),rotation:U.toArray()})})),e}getPose(){const e={};return Object.keys(this.humanBones).forEach((t=>{const i=t,r=this.getBoneNode(i);if(!r)return;k.set(0,0,0),U.identity();const n=this.restPose[i];(null==n?void 0:n.position)&&k.fromArray(n.position).negate(),(null==n?void 0:n.rotation)&&V(U.fromArray(n.rotation)),k.add(r.position),U.premultiply(r.quaternion),e[i]={position:k.toArray(),rotation:U.toArray()}})),e}setPose(e){Object.entries(e).forEach((([e,t])=>{const i=e,r=this.getBoneNode(i);if(!r)return;const n=this.restPose[i];n&&((null==t?void 0:t.position)&&(r.position.fromArray(t.position),n.position&&r.position.add(k.fromArray(n.position))),(null==t?void 0:t.rotation)&&(r.quaternion.fromArray(t.rotation),n.rotation&&r.quaternion.multiply(U.fromArray(n.rotation))))}))}resetPose(){Object.entries(this.restPose).forEach((([e,t])=>{const i=this.getBoneNode(e);i&&((null==t?void 0:t.position)&&i.position.fromArray(t.position),(null==t?void 0:t.rotation)&&i.quaternion.fromArray(t.rotation))}))}getBone(e){var t;return null!==(t=this.humanBones[e])&&void 0!==t?t:void 0}getBoneNode(e){var t,i;return null!==(i=null===(t=this.humanBones[e])||void 0===t?void 0:t.node)&&void 0!==i?i:null}}const D=new e.Vector3,H=new e.Quaternion,O=new e.Vector3;class N extends T{static _setupTransforms(t){const i=new e.Object3D;i.name="VRMHumanoidRig";const r={},n={},o={};E.forEach((i=>{const s=t.getBoneNode(i);if(s){const t=new e.Vector3,a=new e.Quaternion;s.updateWorldMatrix(!0,!1),s.matrixWorld.decompose(t,a,D),r[i]=t,n[i]=a,o[i]=s.quaternion.clone()}}));const s={},a={};return E.forEach((o=>{var l;const h=t.getBoneNode(o);if(h){const t=r[o];let u,d,p=o;for(;null==u&&(p=I[p],null!=p);)u=r[p],d=n[p];const c=new e.Object3D;c.name="Normalized_"+h.name;(p?null===(l=a[p])||void 0===l?void 0:l.node:i).add(c),c.position.copy(t),u&&c.position.sub(u),a[o]={node:c},s[o]=null!=d?d:new e.Quaternion}})),{rigBones:a,root:i,parentWorldRotations:s,boneRotations:o}}constructor(e){const{rigBones:t,root:i,parentWorldRotations:r,boneRotations:n}=N._setupTransforms(e);super(t),this.original=e,this.root=i,this._parentWorldRotations=r,this._boneRotations=n}update(){E.forEach((e=>{const t=this.original.getBoneNode(e);if(null!=t){const i=this.getBoneNode(e),r=this._parentWorldRotations[e],n=H.copy(r).invert(),o=this._boneRotations[e];if(t.quaternion.copy(i.quaternion).multiply(r).premultiply(n).multiply(o),"hips"===e){const e=i.getWorldPosition(O);t.parent.updateWorldMatrix(!0,!1);const r=t.parent.matrixWorld,n=e.applyMatrix4(r.invert());t.position.copy(n)}}}))}}class F{get restPose(){return console.warn("VRMHumanoid: restPose is deprecated. Use either rawRestPose or normalizedRestPose instead."),this.rawRestPose}get rawRestPose(){return this._rawHumanBones.restPose}get normalizedRestPose(){return this._normalizedHumanBones.restPose}get humanBones(){return this._rawHumanBones.humanBones}get rawHumanBones(){return this._rawHumanBones.humanBones}get normalizedHumanBones(){return this._normalizedHumanBones.humanBones}get normalizedHumanBonesRoot(){return this._normalizedHumanBones.root}constructor(e,t){var i;this.autoUpdateHumanBones=null===(i=null==t?void 0:t.autoUpdateHumanBones)||void 0===i||i,this._rawHumanBones=new T(e),this._normalizedHumanBones=new N(this._rawHumanBones)}copy(e){return this.autoUpdateHumanBones=e.autoUpdateHumanBones,this._rawHumanBones=new T(e.humanBones),this._normalizedHumanBones=new N(this._rawHumanBones),this}clone(){return new F(this.humanBones,{autoUpdateHumanBones:this.autoUpdateHumanBones}).copy(this)}getAbsolutePose(){return console.warn("VRMHumanoid: getAbsolutePose() is deprecated. Use either getRawAbsolutePose() or getNormalizedAbsolutePose() instead."),this.getRawAbsolutePose()}getRawAbsolutePose(){return this._rawHumanBones.getAbsolutePose()}getNormalizedAbsolutePose(){return this._normalizedHumanBones.getAbsolutePose()}getPose(){return console.warn("VRMHumanoid: getPose() is deprecated. Use either getRawPose() or getNormalizedPose() instead."),this.getRawPose()}getRawPose(){return this._rawHumanBones.getPose()}getNormalizedPose(){return this._normalizedHumanBones.getPose()}setPose(e){return console.warn("VRMHumanoid: setPose() is deprecated. Use either setRawPose() or setNormalizedPose() instead."),this.setRawPose(e)}setRawPose(e){return this._rawHumanBones.setPose(e)}setNormalizedPose(e){return this._normalizedHumanBones.setPose(e)}resetPose(){return console.warn("VRMHumanoid: resetPose() is deprecated. Use either resetRawPose() or resetNormalizedPose() instead."),this.resetRawPose()}resetRawPose(){return this._rawHumanBones.resetPose()}resetNormalizedPose(){return this._normalizedHumanBones.resetPose()}getBone(e){return console.warn("VRMHumanoid: getBone() is deprecated. Use either getRawBone() or getNormalizedBone() instead."),this.getRawBone(e)}getRawBone(e){return this._rawHumanBones.getBone(e)}getNormalizedBone(e){return this._normalizedHumanBones.getBone(e)}getBoneNode(e){return console.warn("VRMHumanoid: getBoneNode() is deprecated. Use either getRawBoneNode() or getNormalizedBoneNode() instead."),this.getRawBoneNode(e)}getRawBoneNode(e){return this._rawHumanBones.getBoneNode(e)}getNormalizedBoneNode(e){return this._normalizedHumanBones.getBoneNode(e)}update(){this.autoUpdateHumanBones&&this._normalizedHumanBones.update()}}const S={Hips:"hips",Spine:"spine",Head:"head",LeftUpperLeg:"leftUpperLeg",LeftLowerLeg:"leftLowerLeg",LeftFoot:"leftFoot",RightUpperLeg:"rightUpperLeg",RightLowerLeg:"rightLowerLeg",RightFoot:"rightFoot",LeftUpperArm:"leftUpperArm",LeftLowerArm:"leftLowerArm",LeftHand:"leftHand",RightUpperArm:"rightUpperArm",RightLowerArm:"rightLowerArm",RightHand:"rightHand"},C=new Set(["1.0","1.0-beta"]),W={leftThumbProximal:"leftThumbMetacarpal",leftThumbIntermediate:"leftThumbProximal",rightThumbProximal:"rightThumbMetacarpal",rightThumbIntermediate:"rightThumbProximal"};class z{get name(){return"VRMHumanoidLoaderPlugin"}constructor(e,t){this.parser=e,this.helperRoot=null==t?void 0:t.helperRoot,this.autoUpdateHumanBones=null==t?void 0:t.autoUpdateHumanBones}afterRoot(e){return i(this,void 0,void 0,(function*(){e.userData.vrmHumanoid=yield this._import(e)}))}_import(e){return i(this,void 0,void 0,(function*(){const t=yield this._v1Import(e);if(t)return t;const i=yield this._v0Import(e);return i||null}))}_v1Import(e){var t,r;return i(this,void 0,void 0,(function*(){const n=this.parser.json;if(!(-1!==(null===(t=n.extensionsUsed)||void 0===t?void 0:t.indexOf("VRMC_vrm"))))return null;const o=null===(r=n.extensions)||void 0===r?void 0:r.VRMC_vrm;if(!o)return null;const s=o.specVersion;if(!C.has(s))return console.warn(`VRMHumanoidLoaderPlugin: Unknown VRMC_vrm specVersion "${s}"`),null;const a=o.humanoid;if(!a)return null;const l=null!=a.humanBones.leftThumbIntermediate||null!=a.humanBones.rightThumbIntermediate,h={};null!=a.humanBones&&(yield Promise.all(Object.entries(a.humanBones).map((([e,t])=>i(this,void 0,void 0,(function*(){let i=e;const r=t.node;if(l){const e=W[i];null!=e&&(i=e)}const n=yield this.parser.getDependency("node",r);null!=n?h[i]={node:n}:console.warn(`A glTF node bound to the humanoid bone ${i} (index = ${r}) does not exist`)}))))));const u=new F(this._ensureRequiredBonesExist(h),{autoUpdateHumanBones:this.autoUpdateHumanBones});if(e.scene.add(u.normalizedHumanBonesRoot),this.helperRoot){const e=new b(u);this.helperRoot.add(e),e.renderOrder=this.helperRoot.renderOrder}return u}))}_v0Import(e){var t;return i(this,void 0,void 0,(function*(){const r=this.parser.json,n=null===(t=r.extensions)||void 0===t?void 0:t.VRM;if(!n)return null;const o=n.humanoid;if(!o)return null;const s={};null!=o.humanBones&&(yield Promise.all(o.humanBones.map((e=>i(this,void 0,void 0,(function*(){const t=e.bone,i=e.node;if(null==t||null==i)return;const r=yield this.parser.getDependency("node",i);if(null==r)return void console.warn(`A glTF node bound to the humanoid bone ${t} (index = ${i}) does not exist`);const n=W[t],o=null!=n?n:t;null==s[o]?s[o]={node:r}:console.warn(`Multiple bone entries for ${o} detected (index = ${i}), ignoring duplicated entries.`)}))))));const a=new F(this._ensureRequiredBonesExist(s),{autoUpdateHumanBones:this.autoUpdateHumanBones});if(e.scene.add(a.normalizedHumanBonesRoot),this.helperRoot){const e=new b(a);this.helperRoot.add(e),e.renderOrder=this.helperRoot.renderOrder}return a}))}_ensureRequiredBonesExist(e){const t=Object.values(S).filter((t=>null==e[t]));if(t.length>0)throw new Error(`VRMHumanoidLoaderPlugin: These humanoid bones are required but not exist: ${t.join(", ")}`);return e}}class Q extends e.BufferGeometry{constructor(){super(),this._currentTheta=0,this._currentRadius=0,this.theta=0,this.radius=0,this._currentTheta=0,this._currentRadius=0,this._attrPos=new e.BufferAttribute(new Float32Array(195),3),this.setAttribute("position",this._attrPos),this._attrIndex=new e.BufferAttribute(new Uint16Array(189),1),this.setIndex(this._attrIndex),this._buildIndex(),this.update()}update(){let e=!1;this._currentTheta!==this.theta&&(this._currentTheta=this.theta,e=!0),this._currentRadius!==this.radius&&(this._currentRadius=this.radius,e=!0),e&&this._buildPosition()}_buildPosition(){this._attrPos.setXYZ(0,0,0,0);for(let e=0;e<64;e++){const t=e/63*this._currentTheta;this._attrPos.setXYZ(e+1,this._currentRadius*Math.sin(t),0,this._currentRadius*Math.cos(t))}this._attrPos.needsUpdate=!0}_buildIndex(){for(let e=0;e<63;e++)this._attrIndex.setXYZ(3*e,0,e+1,e+2);this._attrIndex.needsUpdate=!0}}class Y extends e.BufferGeometry{constructor(){super(),this.radius=0,this._currentRadius=0,this.tail=new e.Vector3,this._currentTail=new e.Vector3,this._attrPos=new e.BufferAttribute(new Float32Array(294),3),this.setAttribute("position",this._attrPos),this._attrIndex=new e.BufferAttribute(new Uint16Array(194),1),this.setIndex(this._attrIndex),this._buildIndex(),this.update()}update(){let e=!1;this._currentRadius!==this.radius&&(this._currentRadius=this.radius,e=!0),this._currentTail.equals(this.tail)||(this._currentTail.copy(this.tail),e=!0),e&&this._buildPosition()}_buildPosition(){for(let e=0;e<32;e++){const t=e/16*Math.PI;this._attrPos.setXYZ(e,Math.cos(t),Math.sin(t),0),this._attrPos.setXYZ(32+e,0,Math.cos(t),Math.sin(t)),this._attrPos.setXYZ(64+e,Math.sin(t),0,Math.cos(t))}this.scale(this._currentRadius,this._currentRadius,this._currentRadius),this.translate(this._currentTail.x,this._currentTail.y,this._currentTail.z),this._attrPos.setXYZ(96,0,0,0),this._attrPos.setXYZ(97,this._currentTail.x,this._currentTail.y,this._currentTail.z),this._attrPos.needsUpdate=!0}_buildIndex(){for(let e=0;e<32;e++){const t=(e+1)%32;this._attrIndex.setXY(2*e,e,t),this._attrIndex.setXY(64+2*e,32+e,32+t),this._attrIndex.setXY(128+2*e,64+e,64+t)}this._attrIndex.setXY(192,96,97),this._attrIndex.needsUpdate=!0}}const j=new e.Quaternion,$=new e.Quaternion,q=new e.Vector3,G=new e.Vector3,X=Math.sqrt(2)/2,Z=new e.Quaternion(0,0,-X,X),J=new e.Vector3(0,1,0);class K extends e.Group{constructor(t){super(),this.matrixAutoUpdate=!1,this.vrmLookAt=t;{const t=new Q;t.radius=.5;const i=new e.MeshBasicMaterial({color:65280,transparent:!0,opacity:.5,side:e.DoubleSide,depthTest:!1,depthWrite:!1});this._meshPitch=new e.Mesh(t,i),this.add(this._meshPitch)}{const t=new Q;t.radius=.5;const i=new e.MeshBasicMaterial({color:16711680,transparent:!0,opacity:.5,side:e.DoubleSide,depthTest:!1,depthWrite:!1});this._meshYaw=new e.Mesh(t,i),this.add(this._meshYaw)}{const t=new Y;t.radius=.1;const i=new e.LineBasicMaterial({color:16777215,depthTest:!1,depthWrite:!1});this._lineTarget=new e.LineSegments(t,i),this._lineTarget.frustumCulled=!1,this.add(this._lineTarget)}}dispose(){this._meshYaw.geometry.dispose(),this._meshYaw.material.dispose(),this._meshPitch.geometry.dispose(),this._meshPitch.material.dispose(),this._lineTarget.geometry.dispose(),this._lineTarget.material.dispose()}updateMatrixWorld(t){const i=e.MathUtils.DEG2RAD*this.vrmLookAt.yaw;this._meshYaw.geometry.theta=i,this._meshYaw.geometry.update();const r=e.MathUtils.DEG2RAD*this.vrmLookAt.pitch;this._meshPitch.geometry.theta=r,this._meshPitch.geometry.update(),this.vrmLookAt.getLookAtWorldPosition(q),this.vrmLookAt.getLookAtWorldQuaternion(j),j.multiply(this.vrmLookAt.getFaceFrontQuaternion($)),this._meshYaw.position.copy(q),this._meshYaw.quaternion.copy(j),this._meshPitch.position.copy(q),this._meshPitch.quaternion.copy(j),this._meshPitch.quaternion.multiply($.setFromAxisAngle(J,i)),this._meshPitch.quaternion.multiply(Z);const{target:n,autoUpdate:o}=this.vrmLookAt;null!=n&&o&&(n.getWorldPosition(G).sub(q),this._lineTarget.geometry.tail.copy(G),this._lineTarget.geometry.update(),this._lineTarget.position.copy(q)),super.updateMatrixWorld(t)}}const ee=new e.Vector3,te=new e.Vector3;function ie(e,t){return e.matrixWorld.decompose(ee,t,te),t}function re(e){return[Math.atan2(-e.z,e.x),Math.atan2(e.y,Math.sqrt(e.x*e.x+e.z*e.z))]}function ne(e){const t=Math.round(e/2/Math.PI);return e-2*Math.PI*t}const oe=new e.Vector3(0,0,1),se=new e.Vector3,ae=new e.Vector3,le=new e.Vector3,he=new e.Quaternion,ue=new e.Quaternion,de=new e.Quaternion,pe=new e.Quaternion,ce=new e.Euler;class me{get yaw(){return this._yaw}set yaw(e){this._yaw=e,this._needsUpdate=!0}get pitch(){return this._pitch}set pitch(e){this._pitch=e,this._needsUpdate=!0}get euler(){return console.warn("VRMLookAt: euler is deprecated. use getEuler() instead."),this.getEuler(new e.Euler)}constructor(t,i){this.offsetFromHeadBone=new e.Vector3,this.autoUpdate=!0,this.faceFront=new e.Vector3(0,0,1),this.humanoid=t,this.applier=i,this._yaw=0,this._pitch=0,this._needsUpdate=!0,this._restHeadWorldQuaternion=this.getLookAtWorldQuaternion(new e.Quaternion)}getEuler(t){return t.set(e.MathUtils.DEG2RAD*this._pitch,e.MathUtils.DEG2RAD*this._yaw,0,"YXZ")}copy(e){if(this.humanoid!==e.humanoid)throw new Error("VRMLookAt: humanoid must be same in order to copy");return this.offsetFromHeadBone.copy(e.offsetFromHeadBone),this.applier=e.applier,this.autoUpdate=e.autoUpdate,this.target=e.target,this.faceFront.copy(e.faceFront),this}clone(){return new me(this.humanoid,this.applier).copy(this)}reset(){this._yaw=0,this._pitch=0,this._needsUpdate=!0}getLookAtWorldPosition(e){const t=this.humanoid.getRawBoneNode("head");return e.copy(this.offsetFromHeadBone).applyMatrix4(t.matrixWorld)}getLookAtWorldQuaternion(e){return ie(this.humanoid.getRawBoneNode("head"),e)}getFaceFrontQuaternion(e){if(this.faceFront.distanceToSquared(oe)<.01)return e.copy(this._restHeadWorldQuaternion).invert();const[t,i]=re(this.faceFront);return ce.set(0,.5*Math.PI+t,i,"YZX"),e.setFromEuler(ce).premultiply(pe.copy(this._restHeadWorldQuaternion).invert())}getLookAtWorldDirection(e){return this.getLookAtWorldQuaternion(ue),this.getFaceFrontQuaternion(de),e.copy(oe).applyQuaternion(ue).applyQuaternion(de).applyEuler(this.getEuler(ce))}lookAt(t){const i=he.copy(this._restHeadWorldQuaternion).multiply(V(this.getLookAtWorldQuaternion(ue))),r=this.getLookAtWorldPosition(ae),n=le.copy(t).sub(r).applyQuaternion(i).normalize(),[o,s]=re(this.faceFront),[a,l]=re(n),h=ne(a-o),u=ne(s-l);this._yaw=e.MathUtils.RAD2DEG*h,this._pitch=e.MathUtils.RAD2DEG*u,this._needsUpdate=!0}update(e){null!=this.target&&this.autoUpdate&&this.lookAt(this.target.getWorldPosition(se)),this._needsUpdate&&(this._needsUpdate=!1,this.applier.applyYawPitch(this._yaw,this._pitch))}}me.EULER_ORDER="YXZ";const ge=new e.Vector3(0,0,1),fe=new e.Quaternion,ve=new e.Quaternion,ye=new e.Euler(0,0,0,"YXZ");class we{constructor(t,i,r,n,o){this.humanoid=t,this.rangeMapHorizontalInner=i,this.rangeMapHorizontalOuter=r,this.rangeMapVerticalDown=n,this.rangeMapVerticalUp=o,this.faceFront=new e.Vector3(0,0,1),this._restQuatLeftEye=new e.Quaternion,this._restQuatRightEye=new e.Quaternion,this._restLeftEyeParentWorldQuat=new e.Quaternion,this._restRightEyeParentWorldQuat=new e.Quaternion;const s=this.humanoid.getRawBoneNode("leftEye"),a=this.humanoid.getRawBoneNode("rightEye");s&&(this._restQuatLeftEye.copy(s.quaternion),ie(s.parent,this._restLeftEyeParentWorldQuat)),a&&(this._restQuatRightEye.copy(a.quaternion),ie(a.parent,this._restRightEyeParentWorldQuat))}applyYawPitch(t,i){const r=this.humanoid.getRawBoneNode("leftEye"),n=this.humanoid.getRawBoneNode("rightEye"),o=this.humanoid.getNormalizedBoneNode("leftEye"),s=this.humanoid.getNormalizedBoneNode("rightEye");r&&(ye.x=i<0?-e.MathUtils.DEG2RAD*this.rangeMapVerticalDown.map(-i):e.MathUtils.DEG2RAD*this.rangeMapVerticalUp.map(i),ye.y=t<0?-e.MathUtils.DEG2RAD*this.rangeMapHorizontalInner.map(-t):e.MathUtils.DEG2RAD*this.rangeMapHorizontalOuter.map(t),fe.setFromEuler(ye),this._getWorldFaceFrontQuat(ve),o.quaternion.copy(ve).multiply(fe).multiply(ve.invert()),fe.copy(this._restLeftEyeParentWorldQuat),r.quaternion.copy(o.quaternion).multiply(fe).premultiply(fe.invert()).multiply(this._restQuatLeftEye)),n&&(ye.x=i<0?-e.MathUtils.DEG2RAD*this.rangeMapVerticalDown.map(-i):e.MathUtils.DEG2RAD*this.rangeMapVerticalUp.map(i),ye.y=t<0?-e.MathUtils.DEG2RAD*this.rangeMapHorizontalOuter.map(-t):e.MathUtils.DEG2RAD*this.rangeMapHorizontalInner.map(t),fe.setFromEuler(ye),this._getWorldFaceFrontQuat(ve),s.quaternion.copy(ve).multiply(fe).multiply(ve.invert()),fe.copy(this._restRightEyeParentWorldQuat),n.quaternion.copy(s.quaternion).multiply(fe).premultiply(fe.invert()).multiply(this._restQuatRightEye))}lookAt(t){console.warn("VRMLookAtBoneApplier: lookAt() is deprecated. use apply() instead.");const i=e.MathUtils.RAD2DEG*t.y,r=e.MathUtils.RAD2DEG*t.x;this.applyYawPitch(i,r)}_getWorldFaceFrontQuat(e){if(this.faceFront.distanceToSquared(ge)<.01)return e.identity();const[t,i]=re(this.faceFront);return ye.set(0,.5*Math.PI+t,i,"YZX"),e.setFromEuler(ye)}}we.type="bone";class xe{constructor(e,t,i,r,n){this.expressions=e,this.rangeMapHorizontalInner=t,this.rangeMapHorizontalOuter=i,this.rangeMapVerticalDown=r,this.rangeMapVerticalUp=n}applyYawPitch(e,t){t<0?(this.expressions.setValue("lookDown",0),this.expressions.setValue("lookUp",this.rangeMapVerticalUp.map(-t))):(this.expressions.setValue("lookUp",0),this.expressions.setValue("lookDown",this.rangeMapVerticalDown.map(t))),e<0?(this.expressions.setValue("lookLeft",0),this.expressions.setValue("lookRight",this.rangeMapHorizontalOuter.map(-e))):(this.expressions.setValue("lookRight",0),this.expressions.setValue("lookLeft",this.rangeMapHorizontalOuter.map(e)))}lookAt(t){console.warn("VRMLookAtBoneApplier: lookAt() is deprecated. use apply() instead.");const i=e.MathUtils.RAD2DEG*t.y,r=e.MathUtils.RAD2DEG*t.x;this.applyYawPitch(i,r)}}xe.type="expression";class _e{constructor(e,t){this.inputMaxValue=e,this.outputScale=t}map(e){return this.outputScale*l(e/this.inputMaxValue)}}const Me=new Set(["1.0","1.0-beta"]);class Re{get name(){return"VRMLookAtLoaderPlugin"}constructor(e,t){this.parser=e,this.helperRoot=null==t?void 0:t.helperRoot}afterRoot(e){return i(this,void 0,void 0,(function*(){const t=e.userData.vrmHumanoid;if(null===t)return;if(void 0===t)throw new Error("VRMLookAtLoaderPlugin: vrmHumanoid is undefined. VRMHumanoidLoaderPlugin have to be used first");const i=e.userData.vrmExpressionManager;if(null!==i){if(void 0===i)throw new Error("VRMLookAtLoaderPlugin: vrmExpressionManager is undefined. VRMExpressionLoaderPlugin have to be used first");e.userData.vrmLookAt=yield this._import(e,t,i)}}))}_import(e,t,r){return i(this,void 0,void 0,(function*(){if(null==t||null==r)return null;const i=yield this._v1Import(e,t,r);if(i)return i;const n=yield this._v0Import(e,t,r);return n||null}))}_v1Import(e,t,r){var n,o,s;return i(this,void 0,void 0,(function*(){const e=this.parser.json;if(!(-1!==(null===(n=e.extensionsUsed)||void 0===n?void 0:n.indexOf("VRMC_vrm"))))return null;const i=null===(o=e.extensions)||void 0===o?void 0:o.VRMC_vrm;if(!i)return null;const a=i.specVersion;if(!Me.has(a))return console.warn(`VRMLookAtLoaderPlugin: Unknown VRMC_vrm specVersion "${a}"`),null;const l=i.lookAt;if(!l)return null;const h="expression"===l.type?1:10,u=this._v1ImportRangeMap(l.rangeMapHorizontalInner,h),d=this._v1ImportRangeMap(l.rangeMapHorizontalOuter,h),p=this._v1ImportRangeMap(l.rangeMapVerticalDown,h),c=this._v1ImportRangeMap(l.rangeMapVerticalUp,h);let m;m="expression"===l.type?new xe(r,u,d,p,c):new we(t,u,d,p,c);const g=this._importLookAt(t,m);return g.offsetFromHeadBone.fromArray(null!==(s=l.offsetFromHeadBone)&&void 0!==s?s:[0,.06,0]),g}))}_v1ImportRangeMap(e,t){var i,r;let n=null!==(i=null==e?void 0:e.inputMaxValue)&&void 0!==i?i:90;const o=null!==(r=null==e?void 0:e.outputScale)&&void 0!==r?r:t;return n<.01&&(console.warn("VRMLookAtLoaderPlugin: inputMaxValue of a range map is too small. Consider reviewing the range map!"),n=.01),new _e(n,o)}_v0Import(e,t,r){var n,o,s,a;return i(this,void 0,void 0,(function*(){const e=this.parser.json,i=null===(n=e.extensions)||void 0===n?void 0:n.VRM;if(!i)return null;const l=i.firstPerson;if(!l)return null;const h="BlendShape"===l.lookAtTypeName?1:10,u=this._v0ImportDegreeMap(l.lookAtHorizontalInner,h),d=this._v0ImportDegreeMap(l.lookAtHorizontalOuter,h),p=this._v0ImportDegreeMap(l.lookAtVerticalDown,h),c=this._v0ImportDegreeMap(l.lookAtVerticalUp,h);let m;m="BlendShape"===l.lookAtTypeName?new xe(r,u,d,p,c):new we(t,u,d,p,c);const g=this._importLookAt(t,m);return l.firstPersonBoneOffset?g.offsetFromHeadBone.set(null!==(o=l.firstPersonBoneOffset.x)&&void 0!==o?o:0,null!==(s=l.firstPersonBoneOffset.y)&&void 0!==s?s:.06,-(null!==(a=l.firstPersonBoneOffset.z)&&void 0!==a?a:0)):g.offsetFromHeadBone.set(0,.06,0),g.faceFront.set(0,0,-1),m instanceof we&&m.faceFront.set(0,0,-1),g}))}_v0ImportDegreeMap(e,t){var i,r;const n=null==e?void 0:e.curve;"[0,0,0,1,1,1,1,0]"!==JSON.stringify(n)&&console.warn("Curves of LookAtDegreeMap defined in VRM 0.0 are not supported");let o=null!==(i=null==e?void 0:e.xRange)&&void 0!==i?i:90;const s=null!==(r=null==e?void 0:e.yRange)&&void 0!==r?r:t;return o<.01&&(console.warn("VRMLookAtLoaderPlugin: xRange of a degree map is too small. Consider reviewing the degree map!"),o=.01),new _e(o,s)}_importLookAt(e,t){const i=new me(e,t);if(this.helperRoot){const e=new K(i);this.helperRoot.add(e),e.renderOrder=this.helperRoot.renderOrder}return i}}const Pe={Bone:"bone",Expression:"expression"};const Le=new Set(["1.0","1.0-beta"]);class Ae{get name(){return"VRMMetaLoaderPlugin"}constructor(e,t){var i,r,n;this.parser=e,this.needThumbnailImage=null===(i=null==t?void 0:t.needThumbnailImage)||void 0===i||i,this.acceptLicenseUrls=null!==(r=null==t?void 0:t.acceptLicenseUrls)&&void 0!==r?r:["https://vrm.dev/licenses/1.0/"],this.acceptV0Meta=null===(n=null==t?void 0:t.acceptV0Meta)||void 0===n||n}afterRoot(e){return i(this,void 0,void 0,(function*(){e.userData.vrmMeta=yield this._import(e)}))}_import(e){return i(this,void 0,void 0,(function*(){const t=yield this._v1Import(e);if(null!=t)return t;const i=yield this._v0Import(e);return null!=i?i:null}))}_v1Import(e){var t,r,n;return i(this,void 0,void 0,(function*(){const e=this.parser.json;if(!(-1!==(null===(t=e.extensionsUsed)||void 0===t?void 0:t.indexOf("VRMC_vrm"))))return null;const i=null===(r=e.extensions)||void 0===r?void 0:r.VRMC_vrm;if(null==i)return null;const o=i.specVersion;if(!Le.has(o))return console.warn(`VRMMetaLoaderPlugin: Unknown VRMC_vrm specVersion "${o}"`),null;const s=i.meta;if(!s)return null;const a=s.licenseUrl;if(!new Set(this.acceptLicenseUrls).has(a))throw new Error(`VRMMetaLoaderPlugin: The license url "${a}" is not accepted`);let l;return this.needThumbnailImage&&null!=s.thumbnailImage&&(l=null!==(n=yield this._extractGLTFImage(s.thumbnailImage))&&void 0!==n?n:void 0),{metaVersion:"1",name:s.name,version:s.version,authors:s.authors,copyrightInformation:s.copyrightInformation,contactInformation:s.contactInformation,references:s.references,thirdPartyLicenses:s.thirdPartyLicenses,thumbnailImage:l,licenseUrl:s.licenseUrl,avatarPermission:s.avatarPermission,allowExcessivelyViolentUsage:s.allowExcessivelyViolentUsage,allowExcessivelySexualUsage:s.allowExcessivelySexualUsage,commercialUsage:s.commercialUsage,allowPoliticalOrReligiousUsage:s.allowPoliticalOrReligiousUsage,allowAntisocialOrHateUsage:s.allowAntisocialOrHateUsage,creditNotation:s.creditNotation,allowRedistribution:s.allowRedistribution,modification:s.modification,otherLicenseUrl:s.otherLicenseUrl}}))}_v0Import(e){var t;return i(this,void 0,void 0,(function*(){const e=this.parser.json,i=null===(t=e.extensions)||void 0===t?void 0:t.VRM;if(!i)return null;const r=i.meta;if(!r)return null;if(!this.acceptV0Meta)throw new Error("VRMMetaLoaderPlugin: Attempted to load VRM0.0 meta but acceptV0Meta is false");let n;return this.needThumbnailImage&&null!=r.texture&&-1!==r.texture&&(n=yield this.parser.getDependency("texture",r.texture)),{metaVersion:"0",allowedUserName:r.allowedUserName,author:r.author,commercialUssageName:r.commercialUssageName,contactInformation:r.contactInformation,licenseName:r.licenseName,otherLicenseUrl:r.otherLicenseUrl,otherPermissionUrl:r.otherPermissionUrl,reference:r.reference,sexualUssageName:r.sexualUssageName,texture:null!=n?n:void 0,title:r.title,version:r.version,violentUssageName:r.violentUssageName}}))}_extractGLTFImage(t){var r;return i(this,void 0,void 0,(function*(){const i=this.parser.json,n=null===(r=i.images)||void 0===r?void 0:r[t];if(null==n)return console.warn(`VRMMetaLoaderPlugin: Attempt to use images[${t}] of glTF as a thumbnail but the image doesn't exist`),null;let o=n.uri;if(null!=n.bufferView){const e=yield this.parser.getDependency("bufferView",n.bufferView),t=new Blob([e],{type:n.mimeType});o=URL.createObjectURL(t)}if(null==o)return console.warn(`VRMMetaLoaderPlugin: Attempt to use images[${t}] of glTF as a thumbnail but the image couldn't load properly`),null;const s=new e.ImageLoader;return yield s.loadAsync((a=o,l=this.parser.options.path,"string"!=typeof a||""===a?"":(/^https?:\/\//i.test(l)&&/^\//.test(a)&&(l=l.replace(/(^https?:\/\/[^/]+).*/i,"$1")),/^(https?:)?\/\//i.test(a)||/^data:.*,.*$/i.test(a)||/^blob:.*$/i.test(a)?a:l+a))).catch((e=>(console.error(e),console.warn("VRMMetaLoaderPlugin: Failed to load a thumbnail image"),null)));var a,l}))}}class be{constructor(e){this.scene=e.scene,this.meta=e.meta,this.humanoid=e.humanoid,this.expressionManager=e.expressionManager,this.firstPerson=e.firstPerson,this.lookAt=e.lookAt}update(e){this.humanoid.update(),this.lookAt&&this.lookAt.update(e),this.expressionManager&&this.expressionManager.update()}}class Ee{get name(){return"VRMC_vrm"}constructor(e,t){var i,r,n,o,s;this.parser=e;const a=null==t?void 0:t.helperRoot,l=null==t?void 0:t.autoUpdateHumanBones;this.expressionPlugin=null!==(i=null==t?void 0:t.expressionPlugin)&&void 0!==i?i:new y(e),this.firstPersonPlugin=null!==(r=null==t?void 0:t.firstPersonPlugin)&&void 0!==r?r:new M(e),this.humanoidPlugin=null!==(n=null==t?void 0:t.humanoidPlugin)&&void 0!==n?n:new z(e,{helperRoot:a,autoUpdateHumanBones:l}),this.lookAtPlugin=null!==(o=null==t?void 0:t.lookAtPlugin)&&void 0!==o?o:new Re(e,{helperRoot:a}),this.metaPlugin=null!==(s=null==t?void 0:t.metaPlugin)&&void 0!==s?s:new Ae(e)}afterRoot(e){return i(this,void 0,void 0,(function*(){yield this.metaPlugin.afterRoot(e),yield this.humanoidPlugin.afterRoot(e),yield this.expressionPlugin.afterRoot(e),yield this.lookAtPlugin.afterRoot(e),yield this.firstPersonPlugin.afterRoot(e);const t=e.userData.vrmMeta,i=e.userData.vrmHumanoid;if(t&&i){const r=new be({scene:e.scene,expressionManager:e.userData.vrmExpressionManager,firstPerson:e.userData.vrmFirstPerson,humanoid:i,lookAt:e.userData.vrmLookAt,meta:t});e.userData.vrmCore=r}}))}}export{be as VRMCore,Ee as VRMCoreLoaderPlugin,t as VRMExpression,y as VRMExpressionLoaderPlugin,h as VRMExpressionManager,c as VRMExpressionMaterialColorBind,u as VRMExpressionMaterialColorType,m as VRMExpressionMorphTargetBind,w as VRMExpressionOverrideType,a as VRMExpressionPresetName,f as VRMExpressionTextureTransformBind,x as VRMFirstPerson,M as VRMFirstPersonLoaderPlugin,R as VRMFirstPersonMeshAnnotationType,E as VRMHumanBoneList,B as VRMHumanBoneName,I as VRMHumanBoneParentMap,F as VRMHumanoid,b as VRMHumanoidHelper,z as VRMHumanoidLoaderPlugin,me as VRMLookAt,we as VRMLookAtBoneApplier,xe as VRMLookAtExpressionApplier,K as VRMLookAtHelper,Re as VRMLookAtLoaderPlugin,_e as VRMLookAtRangeMap,Pe as VRMLookAtTypeName,Ae as VRMMetaLoaderPlugin,S as VRMRequiredHumanBoneName};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pixiv/three-vrm-core",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.7",
|
|
4
4
|
"description": "The implementation of core features of VRM, for @pixiv/three-vrm",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "pixiv",
|
|
@@ -37,27 +37,29 @@
|
|
|
37
37
|
"docs": "typedoc --entryPoints ./src/index.ts --out docs",
|
|
38
38
|
"test": "jest",
|
|
39
39
|
"lint": "eslint \"src/**/*.{ts,tsx}\" && yarn lint-examples && prettier \"src/**/*.{ts,tsx}\" --check",
|
|
40
|
-
"lint-examples": "eslint \"examples/**/*.{
|
|
41
|
-
"lint-fix": "eslint \"src/**/*.{ts,tsx}\" --fix && eslint \"examples/**/*.{
|
|
40
|
+
"lint-examples": "eslint \"examples/**/*.{js,html}\" --rule \"padded-blocks: error\"",
|
|
41
|
+
"lint-fix": "eslint \"src/**/*.{ts,tsx}\" --fix && eslint \"examples/**/*.{js,html}\" --fix && prettier \"src/**/*.{ts,tsx}\" --write"
|
|
42
42
|
},
|
|
43
43
|
"lint-staged": {
|
|
44
44
|
"./src/**/*.{ts,tsx}": [
|
|
45
45
|
"eslint --fix",
|
|
46
46
|
"prettier --write"
|
|
47
|
+
],
|
|
48
|
+
"./examples/**/*.{js,html}": [
|
|
49
|
+
"eslint --fix --rule \"padded-blocks: error\""
|
|
47
50
|
]
|
|
48
51
|
},
|
|
49
52
|
"dependencies": {
|
|
50
|
-
"@pixiv/types-vrm-0.0": "2.0.
|
|
51
|
-
"@pixiv/types-vrmc-vrm-1.0": "2.0.
|
|
53
|
+
"@pixiv/types-vrm-0.0": "2.0.7",
|
|
54
|
+
"@pixiv/types-vrmc-vrm-1.0": "2.0.7"
|
|
52
55
|
},
|
|
53
56
|
"devDependencies": {
|
|
54
57
|
"@types/three": "^0.154.0",
|
|
55
|
-
"lint-staged": "13.1.2",
|
|
56
58
|
"three": "^0.154.0"
|
|
57
59
|
},
|
|
58
60
|
"peerDependencies": {
|
|
59
61
|
"@types/three": "^0.154.0",
|
|
60
62
|
"three": "^0.154.0"
|
|
61
63
|
},
|
|
62
|
-
"gitHead": "
|
|
64
|
+
"gitHead": "d137ae95bc84ab13cd57aa3472a978e0f5d80696"
|
|
63
65
|
}
|
|
@@ -7,6 +7,8 @@ import { VRMExpressionMaterialColorType } from './VRMExpressionMaterialColorType
|
|
|
7
7
|
export declare class VRMExpressionMaterialColorBind implements VRMExpressionBind {
|
|
8
8
|
/**
|
|
9
9
|
* Mapping of property names from VRMC/materialColorBinds.type to three.js/Material.
|
|
10
|
+
* The first element stands for color channels, the second element stands for the alpha channel.
|
|
11
|
+
* The second element can be null if the target property doesn't exist.
|
|
10
12
|
*/
|
|
11
13
|
private static _propertyNameMapMap;
|
|
12
14
|
/**
|
|
@@ -22,11 +24,15 @@ export declare class VRMExpressionMaterialColorBind implements VRMExpressionBind
|
|
|
22
24
|
*/
|
|
23
25
|
readonly targetValue: THREE.Color;
|
|
24
26
|
/**
|
|
25
|
-
*
|
|
26
|
-
|
|
27
|
+
* The target alpha.
|
|
28
|
+
*/
|
|
29
|
+
readonly targetAlpha: number;
|
|
30
|
+
/**
|
|
31
|
+
* Its binding state.
|
|
32
|
+
* If it cannot find the target property in the constructor, each property will be null instead.
|
|
27
33
|
*/
|
|
28
34
|
private _state;
|
|
29
|
-
constructor({ material, type, targetValue, }: {
|
|
35
|
+
constructor({ material, type, targetValue, targetAlpha, }: {
|
|
30
36
|
/**
|
|
31
37
|
* The target material.
|
|
32
38
|
*/
|
|
@@ -39,7 +45,14 @@ export declare class VRMExpressionMaterialColorBind implements VRMExpressionBind
|
|
|
39
45
|
* The target color.
|
|
40
46
|
*/
|
|
41
47
|
targetValue: THREE.Color;
|
|
48
|
+
/**
|
|
49
|
+
* The target alpha.
|
|
50
|
+
*/
|
|
51
|
+
targetAlpha?: number;
|
|
42
52
|
});
|
|
43
53
|
applyWeight(weight: number): void;
|
|
44
54
|
clearAppliedWeight(): void;
|
|
55
|
+
private _initColorBindState;
|
|
56
|
+
private _initAlphaBindState;
|
|
57
|
+
private _getPropertyNameMap;
|
|
45
58
|
}
|
|
@@ -7,6 +7,8 @@ import type { VRMExpressionMaterialColorType } from './VRMExpressionMaterialColo
|
|
|
7
7
|
export declare class VRMExpressionMaterialColorBind implements VRMExpressionBind {
|
|
8
8
|
/**
|
|
9
9
|
* Mapping of property names from VRMC/materialColorBinds.type to three.js/Material.
|
|
10
|
+
* The first element stands for color channels, the second element stands for the alpha channel.
|
|
11
|
+
* The second element can be null if the target property doesn't exist.
|
|
10
12
|
*/
|
|
11
13
|
private static _propertyNameMapMap;
|
|
12
14
|
/**
|
|
@@ -22,11 +24,15 @@ export declare class VRMExpressionMaterialColorBind implements VRMExpressionBind
|
|
|
22
24
|
*/
|
|
23
25
|
readonly targetValue: THREE.Color;
|
|
24
26
|
/**
|
|
25
|
-
*
|
|
26
|
-
|
|
27
|
+
* The target alpha.
|
|
28
|
+
*/
|
|
29
|
+
readonly targetAlpha: number;
|
|
30
|
+
/**
|
|
31
|
+
* Its binding state.
|
|
32
|
+
* If it cannot find the target property in the constructor, each property will be null instead.
|
|
27
33
|
*/
|
|
28
34
|
private _state;
|
|
29
|
-
constructor({ material, type, targetValue, }: {
|
|
35
|
+
constructor({ material, type, targetValue, targetAlpha, }: {
|
|
30
36
|
/**
|
|
31
37
|
* The target material.
|
|
32
38
|
*/
|
|
@@ -39,7 +45,14 @@ export declare class VRMExpressionMaterialColorBind implements VRMExpressionBind
|
|
|
39
45
|
* The target color.
|
|
40
46
|
*/
|
|
41
47
|
targetValue: THREE.Color;
|
|
48
|
+
/**
|
|
49
|
+
* The target alpha.
|
|
50
|
+
*/
|
|
51
|
+
targetAlpha?: number;
|
|
42
52
|
});
|
|
43
53
|
applyWeight(weight: number): void;
|
|
44
54
|
clearAppliedWeight(): void;
|
|
55
|
+
private _initColorBindState;
|
|
56
|
+
private _initAlphaBindState;
|
|
57
|
+
private _getPropertyNameMap;
|
|
45
58
|
}
|