@pixiv/three-vrm-springbone 3.2.0 → 3.3.0
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-springbone.cjs +176 -151
- package/lib/three-vrm-springbone.min.cjs +1 -1
- package/lib/three-vrm-springbone.module.js +176 -151
- package/lib/three-vrm-springbone.module.min.js +1 -1
- package/package.json +5 -5
- package/types/VRMSpringBoneCollider.d.ts +5 -0
- package/types/VRMSpringBoneColliderShape.d.ts +4 -0
- package/types/VRMSpringBoneJoint.d.ts +4 -2
- package/types/VRMSpringBoneManager.d.ts +17 -21
- package/types/utils/lowestCommonAncestor.d.ts +6 -0
|
@@ -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 $=(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,L=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),L.subVectors(this.tail,this.offset).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 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,Se=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),Se.getNormalMatrix(t),he.copy(this.normal).applyNormalMatrix(Se).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 J from"three";var ne=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,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 f from"three";import*as Me from"three";import*as Te from"three";var Ie=new Te.Matrix4;function xe(s){return s.invert?s.invert():s.getInverse(Ie.copy(s)),s}var ae=class{constructor(t){this._inverseCache=new Me.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&&(xe(this._inverseCache.copy(this.matrix)),this._shouldUpdateInverse=!1),this._inverseCache}revert(){this.matrix.elements=this._originalElements}};var fe=new f.Matrix4,Z=new f.Vector3,K=new f.Vector3,ee=new f.Vector3,te=new f.Vector3,Oe=new f.Matrix4,ce=class{constructor(t,e,r={},i=[]){this._currentTail=new f.Vector3;this._prevTail=new f.Vector3;this._boneAxis=new f.Vector3;this._worldSpaceBoneLength=0;this._center=null;this._initialLocalMatrix=new f.Matrix4;this._initialLocalRotation=new f.Quaternion;this._initialLocalChildPosition=new f.Vector3;var o,n,a,l,p,b;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 f.Vector3(0,-1,0),dragForce:(b=r.dragForce)!=null?b:.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._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._sortJoints()}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._sortJoints()}deleteSpringBone(t){console.warn("VRMSpringBoneManager: deleteSpringBone() is deprecated. use deleteJoint() instead."),this.deleteJoint(t)}setInitState(){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(){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){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(){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)}))}_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}let n=t.dependencies;for(let a of n){let l=!1,p=null;ye(a,b=>{let v=this._objectSpringBonesMap.get(b);if(v)for(let A of v)l=!0,this._insertJointSort(A,e,r,i,o);else l||(p=b)}),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"]),je=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 $(this,null,function*(){t.userData.vrmSpringBoneManager=yield this._import(t)})}_import(t){return $(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 $(this,null,function*(){var b,v,A,d,X;let e=t.parser.json;if(!(((b=e.extensionsUsed)==null?void 0:b.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((E,S)=>{var c,T,R,x,j,D,M,H,B,q,Ee,_e,Re,me,ge;let h=o[E.node],u=E.shape,_=(c=E.extensions)==null?void 0:c[Ve];if(this.useExtendedColliders&&_!=null){let be=_.specVersion;if(!je.has(be))console.warn(`VRMSpringBoneLoaderPlugin: Unknown ${Ve} specVersion "${be}". 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:(x=m.sphere.inside)!=null?x:!1});if(m.capsule)return this._importCapsuleCollider(h,{offset:new g.Vector3().fromArray((j=m.capsule.offset)!=null?j:[0,0,0]),radius:(D=m.capsule.radius)!=null?D:0,tail:new g.Vector3().fromArray((M=m.capsule.tail)!=null?M:[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((q=m.plane.normal)!=null?q:[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 #${S} has no valid shape`)}),p=(d=n.colliderGroups)==null?void 0:d.map((E,S)=>{var u;return{colliders:((u=E.colliders)!=null?u:[]).map(_=>{let c=l==null?void 0:l[_];if(c==null)throw new Error(`VRMSpringBoneLoaderPlugin: The colliderGroup #${S} attempted to use a collider #${_} but not found`);return c}),name:E.name}});return(X=n.springs)==null||X.forEach((E,S)=>{var T;let h=E.joints,u=(T=E.colliderGroups)==null?void 0:T.map(R=>{let x=p==null?void 0:p[R];if(x==null)throw new Error(`VRMSpringBoneLoaderPlugin: The spring #${S} attempted to use a colliderGroup ${R} but not found`);return x}),_=E.center!=null?o[E.center]:void 0,c;h.forEach(R=>{if(c){let x=c.node,j=o[x],D=R.node,M=o[D],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(j,M,H,u);_&&(B.center=_),i.addJoint(B)}c=R})}),i.setInitState(),i})}_v0Import(t){return $(this,null,function*(){var b,v,A;let e=t.parser.json;if(!(((b=e.extensionsUsed)==null?void 0:b.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 S;let X=l[d.node];return{colliders:((S=d.colliders)!=null?S:[]).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 E=d.bones;E&&E.forEach(S=>{var R,x,j,D;let h=l[S],u=new g.Vector3;d.gravityDir?u.set((R=d.gravityDir.x)!=null?R:0,(x=d.gravityDir.y)!=null?x:0,(j=d.gravityDir.z)!=null?j: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=(D=d.colliderGroups)==null?void 0:D.map(M=>{let H=p==null?void 0:p[M];if(H==null)throw new Error(`VRMSpringBoneLoaderPlugin: The spring #${X} attempted to use a colliderGroup ${M} but not found`);return H});h.traverse(M=>{var q;let H=(q=M.children[0])!=null?q:null,B=this._importJoint(M,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.
|
|
3
|
+
"version": "3.3.0",
|
|
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.
|
|
55
|
-
"@pixiv/types-vrmc-springbone-1.0": "3.
|
|
56
|
-
"@pixiv/types-vrmc-springbone-extended-collider-1.0": "3.
|
|
54
|
+
"@pixiv/types-vrm-0.0": "3.3.0",
|
|
55
|
+
"@pixiv/types-vrmc-springbone-1.0": "3.3.0",
|
|
56
|
+
"@pixiv/types-vrmc-springbone-extended-collider-1.0": "3.3.0"
|
|
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": "
|
|
65
|
+
"gitHead": "5d7116ab3ac4e229d900b6abefbfa6c3959a436d"
|
|
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,7 @@ export declare class VRMSpringBoneManager {
|
|
|
12
21
|
get colliderGroups(): VRMSpringBoneColliderGroup[];
|
|
13
22
|
get colliders(): VRMSpringBoneCollider[];
|
|
14
23
|
private _objectSpringBonesMap;
|
|
24
|
+
constructor();
|
|
15
25
|
addJoint(joint: VRMSpringBoneJoint): void;
|
|
16
26
|
/**
|
|
17
27
|
* @deprecated Use {@link addJoint} instead.
|
|
@@ -26,23 +36,9 @@ export declare class VRMSpringBoneManager {
|
|
|
26
36
|
reset(): void;
|
|
27
37
|
update(delta: number): void;
|
|
28
38
|
/**
|
|
29
|
-
*
|
|
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.
|
|
35
|
-
*
|
|
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
|
|
39
|
+
* Sorts the joints ensuring they are updated in the correct order taking dependencies into account.
|
|
46
40
|
*/
|
|
47
|
-
private
|
|
41
|
+
private _sortJoints;
|
|
42
|
+
private _insertJointSort;
|
|
43
|
+
private _relevantChildrenUpdated;
|
|
48
44
|
}
|
|
@@ -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;
|