@pixiv/three-vrm-springbone 3.2.0 → 3.3.1

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.
@@ -1,2 +1,2 @@
1
1
  /*! (c) 2019-2024 pixiv Inc. - https://github.com/pixiv/three-vrm/blob/release/LICENSE */
2
- var Q=(a,t,e)=>new Promise((r,i)=>{var o=s=>{try{l(e.next(s))}catch(d){i(d)}},n=s=>{try{l(e.throw(s))}catch(d){i(d)}},l=s=>s.done?r(s.value):Promise.resolve(s.value).then(o,n);l((e=e.apply(a,t)).next())});import*as P from"three";import*as K from"three";var w=class{};var de=new K.Vector3,L=new K.Vector3,X=class extends w{get type(){return"capsule"}constructor(t){var e,r,i,o;super(),this.offset=(e=t==null?void 0:t.offset)!=null?e:new K.Vector3(0,0,0),this.tail=(r=t==null?void 0:t.tail)!=null?r:new K.Vector3(0,0,0),this.radius=(i=t==null?void 0:t.radius)!=null?i:0,this.inside=(o=t==null?void 0:t.inside)!=null?o:!1}calculateCollision(t,e,r,i){de.copy(this.offset).applyMatrix4(t),L.copy(this.tail).applyMatrix4(t),L.sub(de);let o=L.lengthSq();i.copy(e).sub(de);let n=L.dot(i);n<=0||(o<=n||L.multiplyScalar(n/o),i.sub(L));let l=this.inside?this.radius-r-i.length():i.length()-r-this.radius;return i.normalize(),this.inside&&i.negate(),l}};import*as F from"three";var he=new F.Vector3,ge=new F.Matrix3,Y=class extends w{get type(){return"plane"}constructor(t){var e,r;super(),this.offset=(e=t==null?void 0:t.offset)!=null?e:new F.Vector3(0,0,0),this.normal=(r=t==null?void 0:t.normal)!=null?r:new F.Vector3(0,0,1)}calculateCollision(t,e,r,i){i.copy(this.offset).applyMatrix4(t),i.negate().add(e),ge.getNormalMatrix(t),he.copy(this.normal).applyNormalMatrix(ge).normalize();let o=i.dot(he)-r;return i.copy(he),o}};import*as Te from"three";var U=class extends w{get type(){return"sphere"}constructor(t){var e,r,i;super(),this.offset=(e=t==null?void 0:t.offset)!=null?e:new Te.Vector3(0,0,0),this.radius=(r=t==null?void 0:t.radius)!=null?r:0,this.inside=(i=t==null?void 0:t.inside)!=null?i:!1}calculateCollision(t,e,r,i){i.copy(this.offset).applyMatrix4(t),i.negate().add(e);let o=this.inside?this.radius-r-i.length():i.length()-r-this.radius;return i.normalize(),this.inside&&i.negate(),o}};import*as V from"three";var y=new V.Vector3,oe=class extends V.BufferGeometry{constructor(e){super();this.worldScale=1;this._currentRadius=0;this._currentOffset=new V.Vector3;this._currentTail=new V.Vector3;this._shape=e,this._attrPos=new V.BufferAttribute(new Float32Array(396),3),this.setAttribute("position",this._attrPos),this._attrIndex=new V.BufferAttribute(new Uint16Array(264),1),this.setIndex(this._attrIndex),this._buildIndex(),this.update()}update(){let e=!1,r=this._shape.radius/this.worldScale;this._currentRadius!==r&&(this._currentRadius=r,e=!0),this._currentOffset.equals(this._shape.offset)||(this._currentOffset.copy(this._shape.offset),e=!0);let i=y.copy(this._shape.tail).divideScalar(this.worldScale);this._currentTail.distanceToSquared(i)>1e-10&&(this._currentTail.copy(i),e=!0),e&&this._buildPosition()}_buildPosition(){y.copy(this._currentTail).sub(this._currentOffset);let e=y.length()/this._currentRadius;for(let o=0;o<=16;o++){let n=o/16*Math.PI;this._attrPos.setXYZ(o,-Math.sin(n),-Math.cos(n),0),this._attrPos.setXYZ(17+o,e+Math.sin(n),Math.cos(n),0),this._attrPos.setXYZ(34+o,-Math.sin(n),0,-Math.cos(n)),this._attrPos.setXYZ(51+o,e+Math.sin(n),0,Math.cos(n))}for(let o=0;o<32;o++){let n=o/16*Math.PI;this._attrPos.setXYZ(68+o,0,Math.sin(n),Math.cos(n)),this._attrPos.setXYZ(100+o,e,Math.sin(n),Math.cos(n))}let r=Math.atan2(y.y,Math.sqrt(y.x*y.x+y.z*y.z)),i=-Math.atan2(y.z,y.x);this.rotateZ(r),this.rotateY(i),this.scale(this._currentRadius,this._currentRadius,this._currentRadius),this.translate(this._currentOffset.x,this._currentOffset.y,this._currentOffset.z),this._attrPos.needsUpdate=!0}_buildIndex(){for(let e=0;e<34;e++){let r=(e+1)%34;this._attrIndex.setXY(e*2,e,r),this._attrIndex.setXY(68+e*2,34+e,34+r)}for(let e=0;e<32;e++){let r=(e+1)%32;this._attrIndex.setXY(136+e*2,68+e,68+r),this._attrIndex.setXY(200+e*2,100+e,100+r)}this._attrIndex.needsUpdate=!0}};import*as C from"three";var ne=class extends C.BufferGeometry{constructor(e){super();this.worldScale=1;this._currentOffset=new C.Vector3;this._currentNormal=new C.Vector3;this._shape=e,this._attrPos=new C.BufferAttribute(new Float32Array(6*3),3),this.setAttribute("position",this._attrPos),this._attrIndex=new C.BufferAttribute(new Uint16Array(10),1),this.setIndex(this._attrIndex),this._buildIndex(),this.update()}update(){let e=!1;this._currentOffset.equals(this._shape.offset)||(this._currentOffset.copy(this._shape.offset),e=!0),this._currentNormal.equals(this._shape.normal)||(this._currentNormal.copy(this._shape.normal),e=!0),e&&this._buildPosition()}_buildPosition(){this._attrPos.setXYZ(0,-.5,-.5,0),this._attrPos.setXYZ(1,.5,-.5,0),this._attrPos.setXYZ(2,.5,.5,0),this._attrPos.setXYZ(3,-.5,.5,0),this._attrPos.setXYZ(4,0,0,0),this._attrPos.setXYZ(5,0,0,.25),this.translate(this._currentOffset.x,this._currentOffset.y,this._currentOffset.z),this.lookAt(this._currentNormal),this._attrPos.needsUpdate=!0}_buildIndex(){this._attrIndex.setXY(0,0,1),this._attrIndex.setXY(2,1,2),this._attrIndex.setXY(4,2,3),this._attrIndex.setXY(6,3,0),this._attrIndex.setXY(8,4,5),this._attrIndex.needsUpdate=!0}};import*as j from"three";var se=class extends j.BufferGeometry{constructor(e){super();this.worldScale=1;this._currentRadius=0;this._currentOffset=new j.Vector3;this._shape=e,this._attrPos=new j.BufferAttribute(new Float32Array(32*3*3),3),this.setAttribute("position",this._attrPos),this._attrIndex=new j.BufferAttribute(new Uint16Array(64*3),1),this.setIndex(this._attrIndex),this._buildIndex(),this.update()}update(){let e=!1,r=this._shape.radius/this.worldScale;this._currentRadius!==r&&(this._currentRadius=r,e=!0),this._currentOffset.equals(this._shape.offset)||(this._currentOffset.copy(this._shape.offset),e=!0),e&&this._buildPosition()}_buildPosition(){for(let e=0;e<32;e++){let r=e/16*Math.PI;this._attrPos.setXYZ(e,Math.cos(r),Math.sin(r),0),this._attrPos.setXYZ(32+e,0,Math.cos(r),Math.sin(r)),this._attrPos.setXYZ(64+e,Math.sin(r),0,Math.cos(r))}this.scale(this._currentRadius,this._currentRadius,this._currentRadius),this.translate(this._currentOffset.x,this._currentOffset.y,this._currentOffset.z),this._attrPos.needsUpdate=!0}_buildIndex(){for(let e=0;e<32;e++){let r=(e+1)%32;this._attrIndex.setXY(e*2,e,r),this._attrIndex.setXY(64+e*2,32+e,32+r),this._attrIndex.setXY(128+e*2,64+e,64+r)}this._attrIndex.needsUpdate=!0}};var we=new P.Vector3,J=class extends P.Group{constructor(t){if(super(),this.matrixAutoUpdate=!1,this.collider=t,this.collider.shape instanceof U)this._geometry=new se(this.collider.shape);else if(this.collider.shape instanceof X)this._geometry=new oe(this.collider.shape);else if(this.collider.shape instanceof Y)this._geometry=new ne(this.collider.shape);else throw new Error("VRMSpringBoneColliderHelper: Unknown collider shape type detected");let e=new P.LineBasicMaterial({color:16711935,depthTest:!1,depthWrite:!1});this._line=new P.LineSegments(this._geometry,e),this.add(this._line)}dispose(){this._geometry.dispose()}updateMatrixWorld(t){this.collider.updateWorldMatrix(!0,!1),this.matrix.copy(this.collider.matrixWorld);let e=this.matrix.elements;this._geometry.worldScale=we.set(e[0],e[1],e[2]).length(),this._geometry.update(),super.updateMatrixWorld(t)}};import*as I from"three";import*as W from"three";var ae=class extends W.BufferGeometry{constructor(e){super();this.worldScale=1;this._currentRadius=0;this._currentTail=new W.Vector3;this._springBone=e,this._attrPos=new W.BufferAttribute(new Float32Array(294),3),this.setAttribute("position",this._attrPos),this._attrIndex=new W.BufferAttribute(new Uint16Array(194),1),this.setIndex(this._attrIndex),this._buildIndex(),this.update()}update(){let e=!1,r=this._springBone.settings.hitRadius/this.worldScale;this._currentRadius!==r&&(this._currentRadius=r,e=!0),this._currentTail.equals(this._springBone.initialLocalChildPosition)||(this._currentTail.copy(this._springBone.initialLocalChildPosition),e=!0),e&&this._buildPosition()}_buildPosition(){for(let e=0;e<32;e++){let r=e/16*Math.PI;this._attrPos.setXYZ(e,Math.cos(r),Math.sin(r),0),this._attrPos.setXYZ(32+e,0,Math.cos(r),Math.sin(r)),this._attrPos.setXYZ(64+e,Math.sin(r),0,Math.cos(r))}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++){let r=(e+1)%32;this._attrIndex.setXY(e*2,e,r),this._attrIndex.setXY(64+e*2,32+e,32+r),this._attrIndex.setXY(128+e*2,64+e,64+r)}this._attrIndex.setXY(192,96,97),this._attrIndex.needsUpdate=!0}};var Ce=new I.Vector3,ee=class extends I.Group{constructor(t){super(),this.matrixAutoUpdate=!1,this.springBone=t,this._geometry=new ae(this.springBone);let e=new I.LineBasicMaterial({color:16776960,depthTest:!1,depthWrite:!1});this._line=new I.LineSegments(this._geometry,e),this.add(this._line)}dispose(){this._geometry.dispose()}updateMatrixWorld(t){this.springBone.bone.updateWorldMatrix(!0,!1),this.matrix.copy(this.springBone.bone.matrixWorld);let e=this.matrix.elements;this._geometry.worldScale=Ce.set(e[0],e[1],e[2]).length(),this._geometry.update(),super.updateMatrixWorld(t)}};import*as Me from"three";var N=class extends Me.Object3D{constructor(t){super(),this.shape=t}};import*as c from"three";import*as xe from"three";var Pe=new xe.Matrix4;function le(a){return a.invert?a.invert():a.getInverse(Pe.copy(a)),a}import*as be from"three";var pe=class{constructor(t){this._inverseCache=new be.Matrix4;this._shouldUpdateInverse=!0;this.matrix=t;let e={set:(r,i,o)=>(this._shouldUpdateInverse=!0,r[i]=o,!0)};this._originalElements=t.elements,t.elements=new Proxy(t.elements,e)}get inverse(){return this._shouldUpdateInverse&&(le(this._inverseCache.copy(this.matrix)),this._shouldUpdateInverse=!1),this._inverseCache}revert(){this.matrix.elements=this._originalElements}};var Ie=new c.Matrix4,v=new c.Vector3,te=new c.Vector3,Oe=new c.Vector3,z=new c.Vector3,ye=new c.Vector3,re=new c.Vector3,He=new c.Quaternion,Z=new c.Matrix4,Ae=new c.Matrix4,ce=class{constructor(t,e,r={},i=[]){this._currentTail=new c.Vector3;this._prevTail=new c.Vector3;this._boneAxis=new c.Vector3;this._worldSpaceBoneLength=0;this._center=null;this._initialLocalMatrix=new c.Matrix4;this._initialLocalRotation=new c.Quaternion;this._initialLocalChildPosition=new c.Vector3;var o,n,l,s,d,g;this.bone=t,this.bone.matrixAutoUpdate=!1,this.child=e,this.settings={hitRadius:(o=r.hitRadius)!=null?o:0,stiffness:(n=r.stiffness)!=null?n:1,gravityPower:(l=r.gravityPower)!=null?l:0,gravityDir:(d=(s=r.gravityDir)==null?void 0:s.clone())!=null?d:new c.Vector3(0,-1,0),dragForce:(g=r.dragForce)!=null?g:.4},this.colliderGroups=i}get center(){return this._center}set center(t){var e;(e=this._center)!=null&&e.userData.inverseCacheProxy&&(this._center.userData.inverseCacheProxy.revert(),delete this._center.userData.inverseCacheProxy),this._center=t,this._center&&(this._center.userData.inverseCacheProxy||(this._center.userData.inverseCacheProxy=new pe(this._center.matrixWorld)))}get initialLocalChildPosition(){return this._initialLocalChildPosition}get _parentMatrixWorld(){return this.bone.parent?this.bone.parent.matrixWorld:Ie}setInitState(){this._initialLocalMatrix.copy(this.bone.matrix),this._initialLocalRotation.copy(this.bone.quaternion),this.child?this._initialLocalChildPosition.copy(this.child.position):this._initialLocalChildPosition.copy(this.bone.position).normalize().multiplyScalar(.07);let t=this._getMatrixWorldToCenter(Z);this.bone.localToWorld(this._currentTail.copy(this._initialLocalChildPosition)).applyMatrix4(t),this._prevTail.copy(this._currentTail),this._boneAxis.copy(this._initialLocalChildPosition).normalize()}reset(){this.bone.quaternion.copy(this._initialLocalRotation),this.bone.updateMatrix(),this.bone.matrixWorld.multiplyMatrices(this._parentMatrixWorld,this.bone.matrix);let t=this._getMatrixWorldToCenter(Z);this.bone.localToWorld(this._currentTail.copy(this._initialLocalChildPosition)).applyMatrix4(t),this._prevTail.copy(this._currentTail)}update(t){if(t<=0)return;this._calcWorldSpaceBoneLength(),z.setFromMatrixPosition(this.bone.matrixWorld);let e=this._getMatrixWorldToCenter(Z);ye.copy(z).applyMatrix4(e);let r=He.setFromRotationMatrix(e),i=Ae.copy(e).multiply(this._parentMatrixWorld),o=te.copy(this._boneAxis).applyMatrix4(this._initialLocalMatrix).applyMatrix4(i).sub(ye).normalize(),n=Oe.copy(this.settings.gravityDir).applyQuaternion(r).normalize(),l=this._getMatrixCenterToWorld(Z);re.copy(this._currentTail).add(v.copy(this._currentTail).sub(this._prevTail).multiplyScalar(1-this.settings.dragForce)).add(v.copy(o).multiplyScalar(this.settings.stiffness*t)).add(v.copy(n).multiplyScalar(this.settings.gravityPower*t)).applyMatrix4(l),re.sub(z).normalize().multiplyScalar(this._worldSpaceBoneLength).add(z),this._collision(re),e=this._getMatrixWorldToCenter(Z),this._prevTail.copy(this._currentTail),this._currentTail.copy(v.copy(re).applyMatrix4(e));let s=le(Z.copy(this._parentMatrixWorld).multiply(this._initialLocalMatrix)),d=He.setFromUnitVectors(this._boneAxis,v.copy(re).applyMatrix4(s).normalize());this.bone.quaternion.copy(this._initialLocalRotation).multiply(d),this.bone.updateMatrix(),this.bone.matrixWorld.multiplyMatrices(this._parentMatrixWorld,this.bone.matrix)}_collision(t){this.colliderGroups.forEach(e=>{e.colliders.forEach(r=>{let i=r.shape.calculateCollision(r.matrixWorld,t,this.settings.hitRadius,v);i<0&&(t.add(v.multiplyScalar(-i)),t.sub(z).normalize().multiplyScalar(this._worldSpaceBoneLength).add(z))})})}_calcWorldSpaceBoneLength(){v.setFromMatrixPosition(this.bone.matrixWorld),this.child?te.setFromMatrixPosition(this.child.matrixWorld):(te.copy(this._initialLocalChildPosition),te.applyMatrix4(this.bone.matrixWorld)),this._worldSpaceBoneLength=v.sub(te).length()}_getMatrixCenterToWorld(t){return this._center?t.copy(this._center.matrixWorld):t.identity(),t}_getMatrixWorldToCenter(t){return this._center?t.copy(this._center.userData.inverseCacheProxy.inverse):t.identity(),t}};import*as S from"three";function Ve(a,t){let e=[],r=a;for(;r!==null;)e.unshift(r),r=r.parent;e.forEach(i=>{t(i)})}function ue(a,t){a.children.forEach(e=>{t(e)||ue(e,t)})}var ie=class{constructor(){this._joints=new Set;this._hasWarnedCircularDependency=!1;this._objectSpringBonesMap=new Map}get joints(){return this._joints}get springBones(){return console.warn("VRMSpringBoneManager: springBones is deprecated. use joints instead."),this._joints}get colliderGroups(){let t=new Set;return this._joints.forEach(e=>{e.colliderGroups.forEach(r=>{t.add(r)})}),Array.from(t)}get colliders(){let t=new Set;return this.colliderGroups.forEach(e=>{e.colliders.forEach(r=>{t.add(r)})}),Array.from(t)}addJoint(t){this._joints.add(t);let e=this._objectSpringBonesMap.get(t.bone);e==null&&(e=new Set,this._objectSpringBonesMap.set(t.bone,e)),e.add(t)}addSpringBone(t){console.warn("VRMSpringBoneManager: addSpringBone() is deprecated. use addJoint() instead."),this.addJoint(t)}deleteJoint(t){this._joints.delete(t),this._objectSpringBonesMap.get(t.bone).delete(t)}deleteSpringBone(t){console.warn("VRMSpringBoneManager: deleteSpringBone() is deprecated. use deleteJoint() instead."),this.deleteJoint(t)}setInitState(){let t=new Set,e=new Set,r=new Set;for(let i of this._joints)this._processSpringBone(i,t,e,r,o=>o.setInitState())}reset(){let t=new Set,e=new Set,r=new Set;for(let i of this._joints)this._processSpringBone(i,t,e,r,o=>o.reset())}update(t){let e=new Set,r=new Set,i=new Set;for(let o of this._joints)this._processSpringBone(o,e,r,i,n=>n.update(t)),ue(o.bone,n=>{var l,s;return((s=(l=this._objectSpringBonesMap.get(n))==null?void 0:l.size)!=null?s:0)>0?!0:(n.updateWorldMatrix(!1,!1),!1)})}_processSpringBone(t,e,r,i,o){if(r.has(t))return;if(e.has(t)){this._hasWarnedCircularDependency||(console.warn("VRMSpringBoneManager: Circular dependency detected while updating springbones"),this._hasWarnedCircularDependency=!0);return}e.add(t);let n=this._getDependencies(t);for(let l of n)Ve(l,s=>{let d=this._objectSpringBonesMap.get(s);if(d)for(let g of d)this._processSpringBone(g,e,r,i,o);else i.has(s)||(s.updateWorldMatrix(!1,!1),i.add(s))});t.bone.updateMatrix(),t.bone.updateWorldMatrix(!1,!1),o(t),i.add(t.bone),r.add(t)}_getDependencies(t){let e=new Set,r=t.bone.parent;return r&&e.add(r),t.colliderGroups.forEach(i=>{i.colliders.forEach(o=>{e.add(o)})}),e}};var ve="VRMC_springBone_extended_collider",De=new Set(["1.0","1.0-beta"]),Le=new Set(["1.0"]),O=class O{get name(){return O.EXTENSION_NAME}constructor(t,e){var r;this.parser=t,this.jointHelperRoot=e==null?void 0:e.jointHelperRoot,this.colliderHelperRoot=e==null?void 0:e.colliderHelperRoot,this.useExtendedColliders=(r=e==null?void 0:e.useExtendedColliders)!=null?r:!0}afterRoot(t){return Q(this,null,function*(){t.userData.vrmSpringBoneManager=yield this._import(t)})}_import(t){return Q(this,null,function*(){let e=yield this._v1Import(t);if(e!=null)return e;let r=yield this._v0Import(t);return r!=null?r:null})}_v1Import(t){return Q(this,null,function*(){var g,q,$,h,G;let e=t.parser.json;if(!(((g=e.extensionsUsed)==null?void 0:g.indexOf(O.EXTENSION_NAME))!==-1))return null;let i=new ie,o=yield t.parser.getDependencies("node"),n=(q=e.extensions)==null?void 0:q[O.EXTENSION_NAME];if(!n)return null;let l=n.specVersion;if(!De.has(l))return console.warn(`VRMSpringBoneLoaderPlugin: Unknown ${O.EXTENSION_NAME} specVersion "${l}"`),null;let s=($=n.colliders)==null?void 0:$.map((E,T)=>{var p,M,R,x,A,D,b,H,B,k,fe,Ee,_e,Re,me;let u=o[E.node],f=E.shape,_=(p=E.extensions)==null?void 0:p[ve];if(this.useExtendedColliders&&_!=null){let Se=_.specVersion;if(!Le.has(Se))console.warn(`VRMSpringBoneLoaderPlugin: Unknown ${ve} specVersion "${Se}". Fallbacking to the ${O.EXTENSION_NAME} definition`);else{let m=_.shape;if(m.sphere)return this._importSphereCollider(u,{offset:new S.Vector3().fromArray((M=m.sphere.offset)!=null?M:[0,0,0]),radius:(R=m.sphere.radius)!=null?R:0,inside:(x=m.sphere.inside)!=null?x:!1});if(m.capsule)return this._importCapsuleCollider(u,{offset:new S.Vector3().fromArray((A=m.capsule.offset)!=null?A:[0,0,0]),radius:(D=m.capsule.radius)!=null?D:0,tail:new S.Vector3().fromArray((b=m.capsule.tail)!=null?b:[0,0,0]),inside:(H=m.capsule.inside)!=null?H:!1});if(m.plane)return this._importPlaneCollider(u,{offset:new S.Vector3().fromArray((B=m.plane.offset)!=null?B:[0,0,0]),normal:new S.Vector3().fromArray((k=m.plane.normal)!=null?k:[0,0,1])})}}if(f.sphere)return this._importSphereCollider(u,{offset:new S.Vector3().fromArray((fe=f.sphere.offset)!=null?fe:[0,0,0]),radius:(Ee=f.sphere.radius)!=null?Ee:0,inside:!1});if(f.capsule)return this._importCapsuleCollider(u,{offset:new S.Vector3().fromArray((_e=f.capsule.offset)!=null?_e:[0,0,0]),radius:(Re=f.capsule.radius)!=null?Re:0,tail:new S.Vector3().fromArray((me=f.capsule.tail)!=null?me:[0,0,0]),inside:!1});throw new Error(`VRMSpringBoneLoaderPlugin: The collider #${T} has no valid shape`)}),d=(h=n.colliderGroups)==null?void 0:h.map((E,T)=>{var f;return{colliders:((f=E.colliders)!=null?f:[]).map(_=>{let p=s==null?void 0:s[_];if(p==null)throw new Error(`VRMSpringBoneLoaderPlugin: The colliderGroup #${T} attempted to use a collider #${_} but not found`);return p}),name:E.name}});return(G=n.springs)==null||G.forEach((E,T)=>{var M;let u=E.joints,f=(M=E.colliderGroups)==null?void 0:M.map(R=>{let x=d==null?void 0:d[R];if(x==null)throw new Error(`VRMSpringBoneLoaderPlugin: The spring #${T} attempted to use a colliderGroup ${R} but not found`);return x}),_=E.center!=null?o[E.center]:void 0,p;u.forEach(R=>{if(p){let x=p.node,A=o[x],D=R.node,b=o[D],H={hitRadius:p.hitRadius,dragForce:p.dragForce,gravityPower:p.gravityPower,stiffness:p.stiffness,gravityDir:p.gravityDir!=null?new S.Vector3().fromArray(p.gravityDir):void 0},B=this._importJoint(A,b,H,f);_&&(B.center=_),i.addJoint(B)}p=R})}),i.setInitState(),i})}_v0Import(t){return Q(this,null,function*(){var g,q,$;let e=t.parser.json;if(!(((g=e.extensionsUsed)==null?void 0:g.indexOf("VRM"))!==-1))return null;let i=(q=e.extensions)==null?void 0:q.VRM,o=i==null?void 0:i.secondaryAnimation;if(!o)return null;let n=o==null?void 0:o.boneGroups;if(!n)return null;let l=new ie,s=yield t.parser.getDependencies("node"),d=($=o.colliderGroups)==null?void 0:$.map(h=>{var T;let G=s[h.node];return{colliders:((T=h.colliders)!=null?T:[]).map((u,f)=>{var p,M,R;let _=new S.Vector3(0,0,0);return u.offset&&_.set((p=u.offset.x)!=null?p:0,(M=u.offset.y)!=null?M:0,u.offset.z?-u.offset.z:0),this._importSphereCollider(G,{offset:_,radius:(R=u.radius)!=null?R:0,inside:!1})})}});return n==null||n.forEach((h,G)=>{let E=h.bones;E&&E.forEach(T=>{var R,x,A,D;let u=s[T],f=new S.Vector3;h.gravityDir?f.set((R=h.gravityDir.x)!=null?R:0,(x=h.gravityDir.y)!=null?x:0,(A=h.gravityDir.z)!=null?A:0):f.set(0,-1,0);let _=h.center!=null?s[h.center]:void 0,p={hitRadius:h.hitRadius,dragForce:h.dragForce,gravityPower:h.gravityPower,stiffness:h.stiffiness,gravityDir:f},M=(D=h.colliderGroups)==null?void 0:D.map(b=>{let H=d==null?void 0:d[b];if(H==null)throw new Error(`VRMSpringBoneLoaderPlugin: The spring #${G} attempted to use a colliderGroup ${b} but not found`);return H});u.traverse(b=>{var k;let H=(k=b.children[0])!=null?k:null,B=this._importJoint(b,H,p,M);_&&(B.center=_),l.addJoint(B)})})}),t.scene.updateMatrixWorld(),l.setInitState(),l})}_importJoint(t,e,r,i){let o=new ce(t,e,r,i);if(this.jointHelperRoot){let n=new ee(o);this.jointHelperRoot.add(n),n.renderOrder=this.jointHelperRoot.renderOrder}return o}_importSphereCollider(t,e){let r=new U(e),i=new N(r);if(t.add(i),this.colliderHelperRoot){let o=new J(i);this.colliderHelperRoot.add(o),o.renderOrder=this.colliderHelperRoot.renderOrder}return i}_importCapsuleCollider(t,e){let r=new X(e),i=new N(r);if(t.add(i),this.colliderHelperRoot){let o=new J(i);this.colliderHelperRoot.add(o),o.renderOrder=this.colliderHelperRoot.renderOrder}return i}_importPlaneCollider(t,e){let r=new Y(e),i=new N(r);if(t.add(i),this.colliderHelperRoot){let o=new J(i);this.colliderHelperRoot.add(o),o.renderOrder=this.colliderHelperRoot.renderOrder}return i}};O.EXTENSION_NAME="VRMC_springBone";var Be=O;export{N as VRMSpringBoneCollider,J as VRMSpringBoneColliderHelper,w as VRMSpringBoneColliderShape,X as VRMSpringBoneColliderShapeCapsule,Y as VRMSpringBoneColliderShapePlane,U as VRMSpringBoneColliderShapeSphere,ce as VRMSpringBoneJoint,ee as VRMSpringBoneJointHelper,Be as VRMSpringBoneLoaderPlugin,ie as VRMSpringBoneManager};
2
+ var q=(s,t,e)=>new Promise((r,i)=>{var o=l=>{try{a(e.next(l))}catch(p){i(p)}},n=l=>{try{a(e.throw(l))}catch(p){i(p)}},a=l=>l.done?r(l.value):Promise.resolve(l.value).then(o,n);a((e=e.apply(s,t)).next())});import*as P from"three";import*as k from"three";var w=class{};var de=new k.Vector3,J=new k.Vector3,F=class extends w{get type(){return"capsule"}constructor(t){var e,r,i,o;super(),this.offset=(e=t==null?void 0:t.offset)!=null?e:new k.Vector3(0,0,0),this.tail=(r=t==null?void 0:t.tail)!=null?r:new k.Vector3(0,0,0),this.radius=(i=t==null?void 0:t.radius)!=null?i:0,this.inside=(o=t==null?void 0:t.inside)!=null?o:!1}calculateCollision(t,e,r,i){de.setFromMatrixPosition(t),J.subVectors(this.tail,this.offset).applyMatrix4(t),J.sub(de);let o=J.lengthSq();i.copy(e).sub(de);let n=J.dot(i);n<=0||(o<=n||J.multiplyScalar(n/o),i.sub(J));let a=i.length(),l=this.inside?this.radius-r-a:a-r-this.radius;return l<0&&(i.multiplyScalar(1/a),this.inside&&i.negate()),l}};import*as U from"three";var he=new U.Vector3,be=new U.Matrix3,Y=class extends w{get type(){return"plane"}constructor(t){var e,r;super(),this.offset=(e=t==null?void 0:t.offset)!=null?e:new U.Vector3(0,0,0),this.normal=(r=t==null?void 0:t.normal)!=null?r:new U.Vector3(0,0,1)}calculateCollision(t,e,r,i){i.setFromMatrixPosition(t),i.negate().add(e),be.getNormalMatrix(t),he.copy(this.normal).applyNormalMatrix(be).normalize();let o=i.dot(he)-r;return i.copy(he),o}};import*as ue from"three";var Be=new ue.Vector3,N=class extends w{get type(){return"sphere"}constructor(t){var e,r,i;super(),this.offset=(e=t==null?void 0:t.offset)!=null?e:new ue.Vector3(0,0,0),this.radius=(r=t==null?void 0:t.radius)!=null?r:0,this.inside=(i=t==null?void 0:t.inside)!=null?i:!1}calculateCollision(t,e,r,i){i.subVectors(e,Be.setFromMatrixPosition(t));let o=i.length(),n=this.inside?this.radius-r-o:o-r-this.radius;return n<0&&(i.multiplyScalar(1/o),this.inside&&i.negate()),n}};import*as V from"three";var y=new V.Vector3,ie=class extends V.BufferGeometry{constructor(e){super();this.worldScale=1;this._currentRadius=0;this._currentOffset=new V.Vector3;this._currentTail=new V.Vector3;this._shape=e,this._attrPos=new V.BufferAttribute(new Float32Array(396),3),this.setAttribute("position",this._attrPos),this._attrIndex=new V.BufferAttribute(new Uint16Array(264),1),this.setIndex(this._attrIndex),this._buildIndex(),this.update()}update(){let e=!1,r=this._shape.radius/this.worldScale;this._currentRadius!==r&&(this._currentRadius=r,e=!0),this._currentOffset.equals(this._shape.offset)||(this._currentOffset.copy(this._shape.offset),e=!0);let i=y.copy(this._shape.tail).divideScalar(this.worldScale);this._currentTail.distanceToSquared(i)>1e-10&&(this._currentTail.copy(i),e=!0),e&&this._buildPosition()}_buildPosition(){y.copy(this._currentTail).sub(this._currentOffset);let e=y.length()/this._currentRadius;for(let o=0;o<=16;o++){let n=o/16*Math.PI;this._attrPos.setXYZ(o,-Math.sin(n),-Math.cos(n),0),this._attrPos.setXYZ(17+o,e+Math.sin(n),Math.cos(n),0),this._attrPos.setXYZ(34+o,-Math.sin(n),0,-Math.cos(n)),this._attrPos.setXYZ(51+o,e+Math.sin(n),0,Math.cos(n))}for(let o=0;o<32;o++){let n=o/16*Math.PI;this._attrPos.setXYZ(68+o,0,Math.sin(n),Math.cos(n)),this._attrPos.setXYZ(100+o,e,Math.sin(n),Math.cos(n))}let r=Math.atan2(y.y,Math.sqrt(y.x*y.x+y.z*y.z)),i=-Math.atan2(y.z,y.x);this.rotateZ(r),this.rotateY(i),this.scale(this._currentRadius,this._currentRadius,this._currentRadius),this.translate(this._currentOffset.x,this._currentOffset.y,this._currentOffset.z),this._attrPos.needsUpdate=!0}_buildIndex(){for(let e=0;e<34;e++){let r=(e+1)%34;this._attrIndex.setXY(e*2,e,r),this._attrIndex.setXY(68+e*2,34+e,34+r)}for(let e=0;e<32;e++){let r=(e+1)%32;this._attrIndex.setXY(136+e*2,68+e,68+r),this._attrIndex.setXY(200+e*2,100+e,100+r)}this._attrIndex.needsUpdate=!0}};import*as C from"three";var oe=class extends C.BufferGeometry{constructor(e){super();this.worldScale=1;this._currentOffset=new C.Vector3;this._currentNormal=new C.Vector3;this._shape=e,this._attrPos=new C.BufferAttribute(new Float32Array(6*3),3),this.setAttribute("position",this._attrPos),this._attrIndex=new C.BufferAttribute(new Uint16Array(10),1),this.setIndex(this._attrIndex),this._buildIndex(),this.update()}update(){let e=!1;this._currentOffset.equals(this._shape.offset)||(this._currentOffset.copy(this._shape.offset),e=!0),this._currentNormal.equals(this._shape.normal)||(this._currentNormal.copy(this._shape.normal),e=!0),e&&this._buildPosition()}_buildPosition(){this._attrPos.setXYZ(0,-.5,-.5,0),this._attrPos.setXYZ(1,.5,-.5,0),this._attrPos.setXYZ(2,.5,.5,0),this._attrPos.setXYZ(3,-.5,.5,0),this._attrPos.setXYZ(4,0,0,0),this._attrPos.setXYZ(5,0,0,.25),this.translate(this._currentOffset.x,this._currentOffset.y,this._currentOffset.z),this.lookAt(this._currentNormal),this._attrPos.needsUpdate=!0}_buildIndex(){this._attrIndex.setXY(0,0,1),this._attrIndex.setXY(2,1,2),this._attrIndex.setXY(4,2,3),this._attrIndex.setXY(6,3,0),this._attrIndex.setXY(8,4,5),this._attrIndex.needsUpdate=!0}};import*as L from"three";var ne=class extends L.BufferGeometry{constructor(e){super();this.worldScale=1;this._currentRadius=0;this._currentOffset=new L.Vector3;this._shape=e,this._attrPos=new L.BufferAttribute(new Float32Array(32*3*3),3),this.setAttribute("position",this._attrPos),this._attrIndex=new L.BufferAttribute(new Uint16Array(64*3),1),this.setIndex(this._attrIndex),this._buildIndex(),this.update()}update(){let e=!1,r=this._shape.radius/this.worldScale;this._currentRadius!==r&&(this._currentRadius=r,e=!0),this._currentOffset.equals(this._shape.offset)||(this._currentOffset.copy(this._shape.offset),e=!0),e&&this._buildPosition()}_buildPosition(){for(let e=0;e<32;e++){let r=e/16*Math.PI;this._attrPos.setXYZ(e,Math.cos(r),Math.sin(r),0),this._attrPos.setXYZ(32+e,0,Math.cos(r),Math.sin(r)),this._attrPos.setXYZ(64+e,Math.sin(r),0,Math.cos(r))}this.scale(this._currentRadius,this._currentRadius,this._currentRadius),this.translate(this._currentOffset.x,this._currentOffset.y,this._currentOffset.z),this._attrPos.needsUpdate=!0}_buildIndex(){for(let e=0;e<32;e++){let r=(e+1)%32;this._attrIndex.setXY(e*2,e,r),this._attrIndex.setXY(64+e*2,32+e,32+r),this._attrIndex.setXY(128+e*2,64+e,64+r)}this._attrIndex.needsUpdate=!0}};var we=new P.Vector3,G=class extends P.Group{constructor(t){if(super(),this.matrixAutoUpdate=!1,this.collider=t,this.collider.shape instanceof N)this._geometry=new ne(this.collider.shape);else if(this.collider.shape instanceof F)this._geometry=new ie(this.collider.shape);else if(this.collider.shape instanceof Y)this._geometry=new oe(this.collider.shape);else throw new Error("VRMSpringBoneColliderHelper: Unknown collider shape type detected");let e=new P.LineBasicMaterial({color:16711935,depthTest:!1,depthWrite:!1});this._line=new P.LineSegments(this._geometry,e),this.add(this._line)}dispose(){this._geometry.dispose()}updateMatrixWorld(t){this.collider.updateWorldMatrix(!0,!1),this.matrix.copy(this.collider.matrixWorld);let e=this.matrix.elements;this._geometry.worldScale=we.set(e[0],e[1],e[2]).length(),this._geometry.update(),super.updateMatrixWorld(t)}};import*as I from"three";import*as W from"three";var se=class extends W.BufferGeometry{constructor(e){super();this.worldScale=1;this._currentRadius=0;this._currentTail=new W.Vector3;this._springBone=e,this._attrPos=new W.BufferAttribute(new Float32Array(294),3),this.setAttribute("position",this._attrPos),this._attrIndex=new W.BufferAttribute(new Uint16Array(194),1),this.setIndex(this._attrIndex),this._buildIndex(),this.update()}update(){let e=!1,r=this._springBone.settings.hitRadius/this.worldScale;this._currentRadius!==r&&(this._currentRadius=r,e=!0),this._currentTail.equals(this._springBone.initialLocalChildPosition)||(this._currentTail.copy(this._springBone.initialLocalChildPosition),e=!0),e&&this._buildPosition()}_buildPosition(){for(let e=0;e<32;e++){let r=e/16*Math.PI;this._attrPos.setXYZ(e,Math.cos(r),Math.sin(r),0),this._attrPos.setXYZ(32+e,0,Math.cos(r),Math.sin(r)),this._attrPos.setXYZ(64+e,Math.sin(r),0,Math.cos(r))}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++){let r=(e+1)%32;this._attrIndex.setXY(e*2,e,r),this._attrIndex.setXY(64+e*2,32+e,32+r),this._attrIndex.setXY(128+e*2,64+e,64+r)}this._attrIndex.setXY(192,96,97),this._attrIndex.needsUpdate=!0}};var Ce=new I.Vector3,Q=class extends I.Group{constructor(t){super(),this.matrixAutoUpdate=!1,this.springBone=t,this._geometry=new se(this.springBone);let e=new I.LineBasicMaterial({color:16776960,depthTest:!1,depthWrite:!1});this._line=new I.LineSegments(this._geometry,e),this.add(this._line)}dispose(){this._geometry.dispose()}updateMatrixWorld(t){this.springBone.bone.updateWorldMatrix(!0,!1),this.matrix.copy(this.springBone.bone.matrixWorld);let e=this.matrix.elements;this._geometry.worldScale=Ce.set(e[0],e[1],e[2]).length(),this._geometry.update(),super.updateMatrixWorld(t)}};import*as le from"three";var z=class extends le.Object3D{constructor(e){super();this.colliderMatrix=new le.Matrix4;this.shape=e}updateWorldMatrix(e,r){super.updateWorldMatrix(e,r),Pe(this.colliderMatrix,this.matrixWorld,this.shape.offset)}};function Pe(s,t,e){let r=t.elements;s.copy(t),e&&(s.elements[12]=r[0]*e.x+r[4]*e.y+r[8]*e.z+r[12],s.elements[13]=r[1]*e.x+r[5]*e.y+r[9]*e.z+r[13],s.elements[14]=r[2]*e.x+r[6]*e.y+r[10]*e.z+r[14])}import*as E from"three";import*as xe from"three";import*as Te from"three";var Ie=new Te.Matrix4;function Me(s){return s.invert?s.invert():s.getInverse(Ie.copy(s)),s}var ae=class{constructor(t){this._inverseCache=new xe.Matrix4;this._shouldUpdateInverse=!0;this.matrix=t;let e={set:(r,i,o)=>(this._shouldUpdateInverse=!0,r[i]=o,!0)};this._originalElements=t.elements,t.elements=new Proxy(t.elements,e)}get inverse(){return this._shouldUpdateInverse&&(Me(this._inverseCache.copy(this.matrix)),this._shouldUpdateInverse=!1),this._inverseCache}revert(){this.matrix.elements=this._originalElements}};var fe=new E.Matrix4,Z=new E.Vector3,K=new E.Vector3,ee=new E.Vector3,te=new E.Vector3,Oe=new E.Matrix4,ce=class{constructor(t,e,r={},i=[]){this._currentTail=new E.Vector3;this._prevTail=new E.Vector3;this._boneAxis=new E.Vector3;this._worldSpaceBoneLength=0;this._center=null;this._initialLocalMatrix=new E.Matrix4;this._initialLocalRotation=new E.Quaternion;this._initialLocalChildPosition=new E.Vector3;var o,n,a,l,p,S;this.bone=t,this.bone.matrixAutoUpdate=!1,this.child=e,this.settings={hitRadius:(o=r.hitRadius)!=null?o:0,stiffness:(n=r.stiffness)!=null?n:1,gravityPower:(a=r.gravityPower)!=null?a:0,gravityDir:(p=(l=r.gravityDir)==null?void 0:l.clone())!=null?p:new E.Vector3(0,-1,0),dragForce:(S=r.dragForce)!=null?S:.4},this.colliderGroups=i}get dependencies(){let t=new Set,e=this.bone.parent;e&&t.add(e);for(let r=0;r<this.colliderGroups.length;r++)for(let i=0;i<this.colliderGroups[r].colliders.length;i++)t.add(this.colliderGroups[r].colliders[i]);return t}get center(){return this._center}set center(t){var e;(e=this._center)!=null&&e.userData.inverseCacheProxy&&(this._center.userData.inverseCacheProxy.revert(),delete this._center.userData.inverseCacheProxy),this._center=t,this._center&&(this._center.userData.inverseCacheProxy||(this._center.userData.inverseCacheProxy=new ae(this._center.matrixWorld)))}get initialLocalChildPosition(){return this._initialLocalChildPosition}get _parentMatrixWorld(){return this.bone.parent?this.bone.parent.matrixWorld:fe}setInitState(){this._initialLocalMatrix.copy(this.bone.matrix),this._initialLocalRotation.copy(this.bone.quaternion),this.child?this._initialLocalChildPosition.copy(this.child.position):this._initialLocalChildPosition.copy(this.bone.position).normalize().multiplyScalar(.07);let t=this._getMatrixWorldToCenter();this.bone.localToWorld(this._currentTail.copy(this._initialLocalChildPosition)).applyMatrix4(t),this._prevTail.copy(this._currentTail),this._boneAxis.copy(this._initialLocalChildPosition).normalize()}reset(){this.bone.quaternion.copy(this._initialLocalRotation),this.bone.updateMatrix(),this.bone.matrixWorld.multiplyMatrices(this._parentMatrixWorld,this.bone.matrix);let t=this._getMatrixWorldToCenter();this.bone.localToWorld(this._currentTail.copy(this._initialLocalChildPosition)).applyMatrix4(t),this._prevTail.copy(this._currentTail)}update(t){if(t<=0)return;this._calcWorldSpaceBoneLength();let e=K.copy(this._boneAxis).transformDirection(this._initialLocalMatrix).transformDirection(this._parentMatrixWorld);te.copy(this._currentTail).add(Z.subVectors(this._currentTail,this._prevTail).multiplyScalar(1-this.settings.dragForce)).applyMatrix4(this._getMatrixCenterToWorld()).addScaledVector(e,this.settings.stiffness*t).addScaledVector(this.settings.gravityDir,this.settings.gravityPower*t),ee.setFromMatrixPosition(this.bone.matrixWorld),te.sub(ee).normalize().multiplyScalar(this._worldSpaceBoneLength).add(ee),this._collision(te),this._prevTail.copy(this._currentTail),this._currentTail.copy(te).applyMatrix4(this._getMatrixWorldToCenter());let r=Oe.multiplyMatrices(this._parentMatrixWorld,this._initialLocalMatrix).invert();this.bone.quaternion.setFromUnitVectors(this._boneAxis,Z.copy(te).applyMatrix4(r).normalize()).premultiply(this._initialLocalRotation),this.bone.updateMatrix(),this.bone.matrixWorld.multiplyMatrices(this._parentMatrixWorld,this.bone.matrix)}_collision(t){for(let e=0;e<this.colliderGroups.length;e++)for(let r=0;r<this.colliderGroups[e].colliders.length;r++){let i=this.colliderGroups[e].colliders[r],o=i.shape.calculateCollision(i.colliderMatrix,t,this.settings.hitRadius,Z);if(o<0){t.addScaledVector(Z,-o),t.sub(ee);let n=t.length();t.multiplyScalar(this._worldSpaceBoneLength/n).add(ee)}}}_calcWorldSpaceBoneLength(){Z.setFromMatrixPosition(this.bone.matrixWorld),this.child?K.setFromMatrixPosition(this.child.matrixWorld):(K.copy(this._initialLocalChildPosition),K.applyMatrix4(this.bone.matrixWorld)),this._worldSpaceBoneLength=Z.sub(K).length()}_getMatrixCenterToWorld(){return this._center?this._center.matrixWorld:fe}_getMatrixWorldToCenter(){return this._center?this._center.userData.inverseCacheProxy.inverse:fe}};import*as g from"three";function ye(s,t){let e=[],r=s;for(;r!==null;)e.unshift(r),r=r.parent;e.forEach(i=>{t(i)})}function pe(s,t){s.children.forEach(e=>{t(e)||pe(e,t)})}function He(s){var e;let t=new Map;for(let r of s){let i=r;do{let o=((e=t.get(i))!=null?e:0)+1;if(o===s.size)return i;t.set(i,o),i=i.parent}while(i!==null)}return null}var re=class{constructor(){this._joints=new Set;this._sortedJoints=[];this._hasWarnedCircularDependency=!1;this._ancestors=[];this._objectSpringBonesMap=new Map;this._isSortedJointsDirty=!1;this._relevantChildrenUpdated=this._relevantChildrenUpdated.bind(this)}get joints(){return this._joints}get springBones(){return console.warn("VRMSpringBoneManager: springBones is deprecated. use joints instead."),this._joints}get colliderGroups(){let t=new Set;return this._joints.forEach(e=>{e.colliderGroups.forEach(r=>{t.add(r)})}),Array.from(t)}get colliders(){let t=new Set;return this.colliderGroups.forEach(e=>{e.colliders.forEach(r=>{t.add(r)})}),Array.from(t)}addJoint(t){this._joints.add(t);let e=this._objectSpringBonesMap.get(t.bone);e==null&&(e=new Set,this._objectSpringBonesMap.set(t.bone,e)),e.add(t),this._isSortedJointsDirty=!0}addSpringBone(t){console.warn("VRMSpringBoneManager: addSpringBone() is deprecated. use addJoint() instead."),this.addJoint(t)}deleteJoint(t){this._joints.delete(t),this._objectSpringBonesMap.get(t.bone).delete(t),this._isSortedJointsDirty=!0}deleteSpringBone(t){console.warn("VRMSpringBoneManager: deleteSpringBone() is deprecated. use deleteJoint() instead."),this.deleteJoint(t)}setInitState(){this._sortJoints();for(let t=0;t<this._sortedJoints.length;t++){let e=this._sortedJoints[t];e.bone.updateMatrix(),e.bone.updateWorldMatrix(!1,!1),e.setInitState()}}reset(){this._sortJoints();for(let t=0;t<this._sortedJoints.length;t++){let e=this._sortedJoints[t];e.bone.updateMatrix(),e.bone.updateWorldMatrix(!1,!1),e.reset()}}update(t){this._sortJoints();for(let e=0;e<this._ancestors.length;e++)this._ancestors[e].updateWorldMatrix(e===0,!1);for(let e=0;e<this._sortedJoints.length;e++){let r=this._sortedJoints[e];r.bone.updateMatrix(),r.bone.updateWorldMatrix(!1,!1),r.update(t),pe(r.bone,this._relevantChildrenUpdated)}}_sortJoints(){if(!this._isSortedJointsDirty)return;let t=[],e=new Set,r=new Set,i=new Set;for(let n of this._joints)this._insertJointSort(n,e,r,t,i);this._sortedJoints=t;let o=He(i);this._ancestors=[],o&&(this._ancestors.push(o),pe(o,n=>{var a,l;return((l=(a=this._objectSpringBonesMap.get(n))==null?void 0:a.size)!=null?l:0)>0?!0:(this._ancestors.push(n),!1)})),this._isSortedJointsDirty=!1}_insertJointSort(t,e,r,i,o){if(r.has(t))return;if(e.has(t)){this._hasWarnedCircularDependency||(console.warn("VRMSpringBoneManager: Circular dependency detected"),this._hasWarnedCircularDependency=!0);return}e.add(t);let n=t.dependencies;for(let a of n){let l=!1,p=null;ye(a,S=>{let v=this._objectSpringBonesMap.get(S);if(v)for(let A of v)l=!0,this._insertJointSort(A,e,r,i,o);else l||(p=S)}),p&&o.add(p)}i.push(t),r.add(t)}_relevantChildrenUpdated(t){var e,r;return((r=(e=this._objectSpringBonesMap.get(t))==null?void 0:e.size)!=null?r:0)>0?!0:(t.updateWorldMatrix(!1,!1),!1)}};var Ve="VRMC_springBone_extended_collider",Ae=new Set(["1.0","1.0-beta"]),De=new Set(["1.0"]),O=class O{get name(){return O.EXTENSION_NAME}constructor(t,e){var r;this.parser=t,this.jointHelperRoot=e==null?void 0:e.jointHelperRoot,this.colliderHelperRoot=e==null?void 0:e.colliderHelperRoot,this.useExtendedColliders=(r=e==null?void 0:e.useExtendedColliders)!=null?r:!0}afterRoot(t){return q(this,null,function*(){t.userData.vrmSpringBoneManager=yield this._import(t)})}_import(t){return q(this,null,function*(){let e=yield this._v1Import(t);if(e!=null)return e;let r=yield this._v0Import(t);return r!=null?r:null})}_v1Import(t){return q(this,null,function*(){var S,v,A,d,X;let e=t.parser.json;if(!(((S=e.extensionsUsed)==null?void 0:S.indexOf(O.EXTENSION_NAME))!==-1))return null;let i=new re,o=yield t.parser.getDependencies("node"),n=(v=e.extensions)==null?void 0:v[O.EXTENSION_NAME];if(!n)return null;let a=n.specVersion;if(!Ae.has(a))return console.warn(`VRMSpringBoneLoaderPlugin: Unknown ${O.EXTENSION_NAME} specVersion "${a}"`),null;let l=(A=n.colliders)==null?void 0:A.map((f,b)=>{var c,T,R,M,D,j,x,H,B,$,Ee,_e,Re,me,ge;let h=o[f.node];if(h==null)return console.warn(`VRMSpringBoneLoaderPlugin: The collider #${b} attempted to use the node #${f.node} but not found`),null;let u=f.shape,_=(c=f.extensions)==null?void 0:c[Ve];if(this.useExtendedColliders&&_!=null){let Se=_.specVersion;if(!De.has(Se))console.warn(`VRMSpringBoneLoaderPlugin: Unknown ${Ve} specVersion "${Se}". Fallbacking to the ${O.EXTENSION_NAME} definition`);else{let m=_.shape;if(m.sphere)return this._importSphereCollider(h,{offset:new g.Vector3().fromArray((T=m.sphere.offset)!=null?T:[0,0,0]),radius:(R=m.sphere.radius)!=null?R:0,inside:(M=m.sphere.inside)!=null?M:!1});if(m.capsule)return this._importCapsuleCollider(h,{offset:new g.Vector3().fromArray((D=m.capsule.offset)!=null?D:[0,0,0]),radius:(j=m.capsule.radius)!=null?j:0,tail:new g.Vector3().fromArray((x=m.capsule.tail)!=null?x:[0,0,0]),inside:(H=m.capsule.inside)!=null?H:!1});if(m.plane)return this._importPlaneCollider(h,{offset:new g.Vector3().fromArray((B=m.plane.offset)!=null?B:[0,0,0]),normal:new g.Vector3().fromArray(($=m.plane.normal)!=null?$:[0,0,1])})}}if(u.sphere)return this._importSphereCollider(h,{offset:new g.Vector3().fromArray((Ee=u.sphere.offset)!=null?Ee:[0,0,0]),radius:(_e=u.sphere.radius)!=null?_e:0,inside:!1});if(u.capsule)return this._importCapsuleCollider(h,{offset:new g.Vector3().fromArray((Re=u.capsule.offset)!=null?Re:[0,0,0]),radius:(me=u.capsule.radius)!=null?me:0,tail:new g.Vector3().fromArray((ge=u.capsule.tail)!=null?ge:[0,0,0]),inside:!1});throw new Error(`VRMSpringBoneLoaderPlugin: The collider #${b} has no valid shape`)}),p=(d=n.colliderGroups)==null?void 0:d.map((f,b)=>{var u;return{colliders:((u=f.colliders)!=null?u:[]).flatMap(_=>{let c=l==null?void 0:l[_];return c==null?(console.warn(`VRMSpringBoneLoaderPlugin: The colliderGroup #${b} attempted to use a collider #${_} but not found`),[]):c}),name:f.name}});return(X=n.springs)==null||X.forEach((f,b)=>{var T;let h=f.joints,u=(T=f.colliderGroups)==null?void 0:T.map(R=>{let M=p==null?void 0:p[R];if(M==null)throw new Error(`VRMSpringBoneLoaderPlugin: The spring #${b} attempted to use a colliderGroup ${R} but not found`);return M}),_=f.center!=null?o[f.center]:void 0,c;h.forEach(R=>{if(c){let M=c.node,D=o[M],j=R.node,x=o[j],H={hitRadius:c.hitRadius,dragForce:c.dragForce,gravityPower:c.gravityPower,stiffness:c.stiffness,gravityDir:c.gravityDir!=null?new g.Vector3().fromArray(c.gravityDir):void 0},B=this._importJoint(D,x,H,u);_&&(B.center=_),i.addJoint(B)}c=R})}),i.setInitState(),i})}_v0Import(t){return q(this,null,function*(){var S,v,A;let e=t.parser.json;if(!(((S=e.extensionsUsed)==null?void 0:S.indexOf("VRM"))!==-1))return null;let i=(v=e.extensions)==null?void 0:v.VRM,o=i==null?void 0:i.secondaryAnimation;if(!o)return null;let n=o==null?void 0:o.boneGroups;if(!n)return null;let a=new re,l=yield t.parser.getDependencies("node"),p=(A=o.colliderGroups)==null?void 0:A.map(d=>{var b;let X=l[d.node];return{colliders:((b=d.colliders)!=null?b:[]).map((h,u)=>{var c,T,R;let _=new g.Vector3(0,0,0);return h.offset&&_.set((c=h.offset.x)!=null?c:0,(T=h.offset.y)!=null?T:0,h.offset.z?-h.offset.z:0),this._importSphereCollider(X,{offset:_,radius:(R=h.radius)!=null?R:0,inside:!1})})}});return n==null||n.forEach((d,X)=>{let f=d.bones;f&&f.forEach(b=>{var R,M,D,j;let h=l[b],u=new g.Vector3;d.gravityDir?u.set((R=d.gravityDir.x)!=null?R:0,(M=d.gravityDir.y)!=null?M:0,(D=d.gravityDir.z)!=null?D:0):u.set(0,-1,0);let _=d.center!=null?l[d.center]:void 0,c={hitRadius:d.hitRadius,dragForce:d.dragForce,gravityPower:d.gravityPower,stiffness:d.stiffiness,gravityDir:u},T=(j=d.colliderGroups)==null?void 0:j.map(x=>{let H=p==null?void 0:p[x];if(H==null)throw new Error(`VRMSpringBoneLoaderPlugin: The spring #${X} attempted to use a colliderGroup ${x} but not found`);return H});h.traverse(x=>{var $;let H=($=x.children[0])!=null?$:null,B=this._importJoint(x,H,c,T);_&&(B.center=_),a.addJoint(B)})})}),t.scene.updateMatrixWorld(),a.setInitState(),a})}_importJoint(t,e,r,i){let o=new ce(t,e,r,i);if(this.jointHelperRoot){let n=new Q(o);this.jointHelperRoot.add(n),n.renderOrder=this.jointHelperRoot.renderOrder}return o}_importSphereCollider(t,e){let r=new N(e),i=new z(r);if(t.add(i),this.colliderHelperRoot){let o=new G(i);this.colliderHelperRoot.add(o),o.renderOrder=this.colliderHelperRoot.renderOrder}return i}_importCapsuleCollider(t,e){let r=new F(e),i=new z(r);if(t.add(i),this.colliderHelperRoot){let o=new G(i);this.colliderHelperRoot.add(o),o.renderOrder=this.colliderHelperRoot.renderOrder}return i}_importPlaneCollider(t,e){let r=new Y(e),i=new z(r);if(t.add(i),this.colliderHelperRoot){let o=new G(i);this.colliderHelperRoot.add(o),o.renderOrder=this.colliderHelperRoot.renderOrder}return i}};O.EXTENSION_NAME="VRMC_springBone";var ve=O;export{z as VRMSpringBoneCollider,G as VRMSpringBoneColliderHelper,w as VRMSpringBoneColliderShape,F as VRMSpringBoneColliderShapeCapsule,Y as VRMSpringBoneColliderShapePlane,N as VRMSpringBoneColliderShapeSphere,ce as VRMSpringBoneJoint,Q as VRMSpringBoneJointHelper,ve as VRMSpringBoneLoaderPlugin,re as VRMSpringBoneManager};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixiv/three-vrm-springbone",
3
- "version": "3.2.0",
3
+ "version": "3.3.1",
4
4
  "description": "Spring bone module for @pixiv/three-vrm",
5
5
  "license": "MIT",
6
6
  "author": "pixiv",
@@ -51,9 +51,9 @@
51
51
  ]
52
52
  },
53
53
  "dependencies": {
54
- "@pixiv/types-vrm-0.0": "3.2.0",
55
- "@pixiv/types-vrmc-springbone-1.0": "3.2.0",
56
- "@pixiv/types-vrmc-springbone-extended-collider-1.0": "3.2.0"
54
+ "@pixiv/types-vrm-0.0": "3.3.1",
55
+ "@pixiv/types-vrmc-springbone-1.0": "3.3.1",
56
+ "@pixiv/types-vrmc-springbone-extended-collider-1.0": "3.3.1"
57
57
  },
58
58
  "devDependencies": {
59
59
  "@types/three": "^0.169.0",
@@ -62,5 +62,5 @@
62
62
  "peerDependencies": {
63
63
  "three": ">=0.137"
64
64
  },
65
- "gitHead": "3588ce8881f54676fa640ef1355fcaa3a5441b46"
65
+ "gitHead": "9ce14ae014e3a251a629b980624d1a7fe5c73e14"
66
66
  }
@@ -8,5 +8,10 @@ export declare class VRMSpringBoneCollider extends THREE.Object3D {
8
8
  * The shape of the collider.
9
9
  */
10
10
  readonly shape: VRMSpringBoneColliderShape;
11
+ /**
12
+ * World space matrix for the collider shape used in collision calculations.
13
+ */
14
+ readonly colliderMatrix: THREE.Matrix4;
11
15
  constructor(shape: VRMSpringBoneColliderShape);
16
+ updateWorldMatrix(updateParents: boolean, updateChildren: boolean): void;
12
17
  }
@@ -7,6 +7,10 @@ export declare abstract class VRMSpringBoneColliderShape {
7
7
  * The type of the shape.
8
8
  */
9
9
  abstract get type(): string;
10
+ /**
11
+ * The offset to the shape.
12
+ */
13
+ offset?: THREE.Vector3;
10
14
  /**
11
15
  * Calculate a distance and a direction from the collider to a target object.
12
16
  * It's hit if the distance is negative.
@@ -42,6 +42,10 @@ export declare class VRMSpringBoneJoint {
42
42
  * It's same as local unit length unless there are scale transformations in the world space.
43
43
  */
44
44
  private _worldSpaceBoneLength;
45
+ /**
46
+ * Set of dependencies that need to be updated before this joint.
47
+ */
48
+ get dependencies(): Set<THREE.Object3D>;
45
49
  /**
46
50
  * This springbone will be calculated based on the space relative from this object.
47
51
  * If this is `null`, springbone will be calculated in world space.
@@ -106,12 +110,10 @@ export declare class VRMSpringBoneJoint {
106
110
  private _calcWorldSpaceBoneLength;
107
111
  /**
108
112
  * Create a matrix that converts center space into world space.
109
- * @param target Target matrix
110
113
  */
111
114
  private _getMatrixCenterToWorld;
112
115
  /**
113
116
  * Create a matrix that converts world space into center space.
114
- * @param target Target matrix
115
117
  */
116
118
  private _getMatrixWorldToCenter;
117
119
  }
@@ -1,9 +1,18 @@
1
- import type { VRMSpringBoneJoint } from './VRMSpringBoneJoint';
2
- import type { VRMSpringBoneCollider } from './VRMSpringBoneCollider';
3
- import type { VRMSpringBoneColliderGroup } from './VRMSpringBoneColliderGroup';
1
+ import type { VRMSpringBoneJoint } from './VRMSpringBoneJoint.js';
2
+ import type { VRMSpringBoneCollider } from './VRMSpringBoneCollider.js';
3
+ import type { VRMSpringBoneColliderGroup } from './VRMSpringBoneColliderGroup.js';
4
4
  export declare class VRMSpringBoneManager {
5
5
  private _joints;
6
+ private _sortedJoints;
6
7
  private _hasWarnedCircularDependency;
8
+ /**
9
+ * An ordered list of ancestors of all the SpringBone joints. Before the
10
+ * SpringBone joints can be updated, the world matrices of these ancestors
11
+ * must be calculated. The first element is the lowest common ancestor, for
12
+ * which not only its world matrix but its ancestors' world matrices are
13
+ * updated as well.
14
+ */
15
+ private _ancestors;
7
16
  get joints(): Set<VRMSpringBoneJoint>;
8
17
  /**
9
18
  * @deprecated Use {@link joints} instead.
@@ -12,6 +21,8 @@ export declare class VRMSpringBoneManager {
12
21
  get colliderGroups(): VRMSpringBoneColliderGroup[];
13
22
  get colliders(): VRMSpringBoneCollider[];
14
23
  private _objectSpringBonesMap;
24
+ private _isSortedJointsDirty;
25
+ constructor();
15
26
  addJoint(joint: VRMSpringBoneJoint): void;
16
27
  /**
17
28
  * @deprecated Use {@link addJoint} instead.
@@ -26,23 +37,12 @@ export declare class VRMSpringBoneManager {
26
37
  reset(): void;
27
38
  update(delta: number): void;
28
39
  /**
29
- * Update a spring bone.
30
- * If there are other spring bone that are dependant, it will try to update them recursively.
31
- * It updates matrixWorld of all ancestors and myself.
32
- * It might log an warning message if there are any circular dependencies.
33
- *
34
- * Intended to be used in {@link update} and {@link _processSpringBone} itself recursively.
40
+ * Sorts the joints ensuring they are updated in the correct order taking dependencies into account.
35
41
  *
36
- * @param springBone A springBone you want to update
37
- * @param springBonesTried Set of springBones that are already tried to be updated
38
- * @param springBonesDone Set of springBones that are already up to date
39
- * @param objectUpdated Set of object3D whose matrixWorld is updated
40
- */
41
- private _processSpringBone;
42
- /**
43
- * Return a set of objects that are dependant of given spring bone.
44
- * @param springBone A spring bone
45
- * @return A set of objects that are dependant of given spring bone
42
+ * This method updates {@link _sortedJoints} and {@link _ancestors}.
43
+ * Make sure to call this before using them.
46
44
  */
47
- private _getDependencies;
45
+ private _sortJoints;
46
+ private _insertJointSort;
47
+ private _relevantChildrenUpdated;
48
48
  }
@@ -0,0 +1,6 @@
1
+ import type * as THREE from 'three';
2
+ /**
3
+ * Finds the lowest common ancestors of the given objects, if it exists.
4
+ * @param objects The objects to find the lowest common ancestor for.
5
+ */
6
+ export declare function lowestCommonAncestor(objects: Set<THREE.Object3D>): THREE.Object3D | null;