pixi-dragonbones-runtime
Version:
DragonBones Runtime for Pixi.js
3 lines (2 loc) • 8.92 kB
JavaScript
import{BaseObject as t}from"../core/BaseObject.mjs";import"../core/DragonBones.mjs";import{Matrix as e}from"../geom/Matrix.mjs";import{Point as s}from"../geom/Point.mjs";import{Transform as a}from"../geom/Transform.mjs";class i extends t{_onClear(){this._armature=null,this._target=null,this._root=null,this._bone=null}get name(){return this._constraintData.name}}i._helpMatrix=new e,i._helpTransform=new a,i._helpPoint=new s;class o extends i{static toString(){return"[class dragonBones.IKConstraint]"}_onClear(){super._onClear(),this._bendPositive=!1,this._weight=1,this._constraintData=null}_computeA(){const t=this._target.global,e=this._root.global,s=this._root.globalTransformMatrix;let i=Math.atan2(t.y-e.y,t.x-e.x);e.scaleX<0&&(i+=Math.PI),e.rotation+=a.normalizeRadian(i-e.rotation)*this._weight,e.toMatrix(s)}_computeB(){const t=this._bone._boneData.length,e=this._root,s=this._target.global,i=e.global,o=this._bone.global,n=this._bone.globalTransformMatrix,r=n.a*t,h=n.b*t,l=r*r+h*h,_=Math.sqrt(l);let c=o.x-i.x,f=o.y-i.y;const p=c*c+f*f,g=Math.sqrt(p),u=o.rotation,m=i.rotation,b=Math.atan2(f,c);c=s.x-i.x,f=s.y-i.y;const M=c*c+f*f,d=Math.sqrt(M);let x=0;if(_+g<=d||d+_<=g||d+g<=_)x=Math.atan2(s.y-i.y,s.x-i.x),_+g<=d||g<_&&(x+=Math.PI);else{const t=(p-l+M)/(2*M),s=Math.sqrt(p-t*t*M)/d,a=i.x+c*t,n=i.y+f*t,r=-f*s,h=c*s;let _=!1;const g=e.parent;if(null!==g){const t=g.globalTransformMatrix;_=t.a*t.d-t.b*t.c<0}_!==this._bendPositive?(o.x=a-r,o.y=n-h):(o.x=a+r,o.y=n+h),x=Math.atan2(o.y-i.y,o.x-i.x)}const y=a.normalizeRadian(x-b);i.rotation=m+y*this._weight,i.toMatrix(e.globalTransformMatrix);const D=b+y*this._weight;o.x=i.x+Math.cos(D)*g,o.y=i.y+Math.sin(D)*g;let B=Math.atan2(s.y-o.y,s.x-o.x);o.scaleX<0&&(B+=Math.PI),o.rotation=i.rotation+u-m+a.normalizeRadian(B-y-u)*this._weight,o.toMatrix(n)}init(t,e){if(null===this._constraintData){this._constraintData=t,this._armature=e,this._target=this._armature.getBone(this._constraintData.target.name),this._root=this._armature.getBone(this._constraintData.root.name),this._bone=null!==this._constraintData.bone?this._armature.getBone(this._constraintData.bone.name):null;{const t=this._constraintData;this._bendPositive=t.bendPositive,this._weight=t.weight}this._root._hasConstraint=!0}}update(){this._root.updateByConstraint(),null!==this._bone?(this._bone.updateByConstraint(),this._computeB()):this._computeA()}invalidUpdate(){this._root.invalidUpdate(),null!==this._bone&&this._bone.invalidUpdate()}}class n extends i{constructor(){super(...arguments),this._bones=[],this._spaces=[],this._positions=[],this._curves=[],this._boneLengths=[],this._pathGlobalVertices=[],this._segments=[10]}static toString(){return"[class dragonBones.PathConstraint]"}_onClear(){super._onClear(),this.dirty=!1,this.pathOffset=0,this.position=0,this.spacing=0,this.rotateOffset=0,this.rotateMix=1,this.translateMix=1,this._pathSlot=null,this._bones.length=0,this._spaces.length=0,this._positions.length=0,this._curves.length=0,this._boneLengths.length=0,this._pathGlobalVertices.length=0}_updatePathVertices(t){const e=this._armature,s=e.armatureData.parent,a=e.armatureData.scale,i=s.intArray,o=s.floatArray,n=t.offset,r=i[n+0],h=i[n+2];this._pathGlobalVertices.length=2*r;const l=t.weight;if(null===l){const t=this._pathSlot.parent;t.updateByConstraint();const e=t.globalTransformMatrix;for(let t=0,s=h;t<r;t+=2){const i=o[s++]*a,n=o[s++]*a,r=e.a*i+e.c*n+e.tx,h=e.b*i+e.d*n+e.ty;this._pathGlobalVertices[t]=r,this._pathGlobalVertices[t+1]=h}return}const _=this._pathSlot._geometryBones,c=l.bones.length,f=l.offset;let p=i[f+1],g=f+2+c;for(let t=0,e=0;t<r;t++){let t=0,s=0;for(let e=0,n=i[g++];e<n;e++){const e=_[i[g++]];if(null===e)continue;e.updateByConstraint();const n=e.globalTransformMatrix,r=o[p++],h=o[p++]*a,l=o[p++]*a;t+=(n.a*h+n.c*l+n.tx)*r,s+=(n.b*h+n.d*l+n.ty)*r}this._pathGlobalVertices[e++]=t,this._pathGlobalVertices[e++]=s}}_computeVertices(t,e,s,a){for(let i=s,o=t;i<e;i+=2)a[i]=this._pathGlobalVertices[o++],a[i+1]=this._pathGlobalVertices[o++]}_computeBezierCurve(t,e,s,a,i){const o=this._armature.armatureData.parent.intArray[t.geometry.offset+0],n=this._positions,r=this._spaces,h=t.closed,l=Array();let _=2*o,c=_/6,f=-1,p=this.position;n.length=3*e+2;let g=0;if(!t.constantSpeed){const o=t.curveLengths;if(c-=h?1:2,g=o[c],a&&(p*=g),i)for(let t=0;t<e;t++)r[t]*=g;l.length=8;for(let t=0,a=0,i=0;t<e;t++,a+=3){if(p+=r[t],h)p%=g,p<0&&(p+=g),i=0;else{if(p<0)continue;if(p>g)continue}let e=0;for(;;i++){const t=o[i];if(!(p>t)){if(0===i)e=p/t;else{const s=o[i-1];e=(p-s)/(t-s)}break}}i!==f&&(f=i,h&&i===c?(this._computeVertices(_-4,4,0,l),this._computeVertices(0,4,4,l)):this._computeVertices(6*i+2,8,0,l)),this.addCurvePosition(e,l[0],l[1],l[2],l[3],l[4],l[5],l[6],l[7],n,a,s)}return}h?(_+=2,l.length=o,this._computeVertices(2,_-4,0,l),this._computeVertices(0,2,_-4,l),l[_-2]=l[0],l[_-1]=l[1]):(c--,_-=4,l.length=_,this._computeVertices(2,_,0,l));let u=new Array(c);g=0;let m,b,M,d,x,y,D,B,v=l[0],C=l[1],P=0,V=0,q=0,w=0,T=0,G=0;for(let t=0,e=2;t<c;t++,e+=6)P=l[e],V=l[e+1],q=l[e+2],w=l[e+3],T=l[e+4],G=l[e+5],m=.1875*(v-2*P+q),b=.1875*(C-2*V+w),M=.09375*(3*(P-q)-v+T),d=.09375*(3*(V-w)-C+G),x=2*m+M,y=2*b+d,D=.75*(P-v)+m+.16666667*M,B=.75*(V-C)+b+.16666667*d,g+=Math.sqrt(D*D+B*B),D+=x,B+=y,x+=M,y+=d,g+=Math.sqrt(D*D+B*B),D+=x,B+=y,g+=Math.sqrt(D*D+B*B),D+=x+M,B+=y+d,g+=Math.sqrt(D*D+B*B),u[t]=g,v=T,C=G;if(a&&(p*=g),i)for(let t=0;t<e;t++)r[t]*=g;let S=this._segments,A=0;for(let t=0,a=0,i=0,o=0;t<e;t++,a+=3){p+=r[t];let e=p;if(h)e%=g,e<0&&(e+=g),i=0;else{if(e<0)continue;if(e>g)continue}for(;;i++){const t=u[i];if(!(e>t)){if(0===i)e/=t;else{const s=u[i-1];e=(e-s)/(t-s)}break}}if(i!==f){f=i;let t=6*i;for(v=l[t],C=l[t+1],P=l[t+2],V=l[t+3],q=l[t+4],w=l[t+5],T=l[t+6],G=l[t+7],m=.03*(v-2*P+q),b=.03*(C-2*V+w),M=.006*(3*(P-q)-v+T),d=.006*(3*(V-w)-C+G),x=2*m+M,y=2*b+d,D=.3*(P-v)+m+.16666667*M,B=.3*(V-C)+b+.16666667*d,A=Math.sqrt(D*D+B*B),S[0]=A,t=1;t<8;t++)D+=x,B+=y,x+=M,y+=d,A+=Math.sqrt(D*D+B*B),S[t]=A;D+=x,B+=y,A+=Math.sqrt(D*D+B*B),S[8]=A,D+=x+M,B+=y+d,A+=Math.sqrt(D*D+B*B),S[9]=A,o=0}for(e*=A;;o++){const t=S[o];if(!(e>t)){if(0===o)e/=t;else{const s=S[o-1];e=o+(e-s)/(t-s)}break}}this.addCurvePosition(.1*e,v,C,P,V,q,w,T,G,n,a,s)}}addCurvePosition(t,e,s,a,i,o,n,r,h,l,_,c){if(0===t)return l[_]=e,l[_+1]=s,void(l[_+2]=0);if(1===t)return l[_]=r,l[_+1]=h,void(l[_+2]=0);const f=1-t,p=f*f,g=t*t,u=p*f,m=p*t*3,b=f*g*3,M=t*g,d=u*e+m*a+b*o+M*r,x=u*s+m*i+b*n+M*h;l[_]=d,l[_+1]=x,l[_+2]=c?Math.atan2(x-(u*s+m*i+b*n),d-(u*e+m*a+b*o)):0}init(t,e){this._constraintData=t,this._armature=e;let s=t;this.pathOffset=s.pathDisplayData.geometry.offset,this.position=s.position,this.spacing=s.spacing,this.rotateOffset=s.rotateOffset,this.rotateMix=s.rotateMix,this.translateMix=s.translateMix,this._root=this._armature.getBone(s.root.name),this._target=this._armature.getBone(s.target.name),this._pathSlot=this._armature.getSlot(s.pathSlot.name);for(let t=0,e=s.bones.length;t<e;t++){const e=this._armature.getBone(s.bones[t].name);null!==e&&this._bones.push(e)}2===s.rotateMode&&(this._boneLengths.length=this._bones.length),this._root._hasConstraint=!0}update(){const t=this._pathSlot;if(null===t._geometryData||t._geometryData.offset!==this.pathOffset)return;const e=this._constraintData;let s=!1;if(this._root._childrenTransformDirty?(this._updatePathVertices(t._geometryData),s=!0):(t._verticesDirty||t._isBonesUpdate())&&(this._updatePathVertices(t._geometryData),t._verticesDirty=!1,s=!0),!s&&!this.dirty)return;const i=e.positionMode,o=e.spacingMode,n=e.rotateMode,r=this._bones,h=0===o,l=2===n,_=0===n,c=r.length,f=_?c:c+1,p=this.spacing;let g=this._spaces;if(g.length=f,l||h){g[0]=0;for(let t=0,e=f-1;t<e;t++){const e=r[t];e.updateByConstraint();const s=e._boneData.length,a=e.globalTransformMatrix,i=s*a.a,o=s*a.b,n=Math.sqrt(i*i+o*o);l&&(this._boneLengths[t]=n),g[t+1]=(s+p)*n/s}}else for(let t=0;t<f;t++)g[t]=p;this._computeBezierCurve(t._displayFrame.rawDisplayData,f,_,1===i,2===o);const u=this._positions;let m,b=this.rotateOffset,M=u[0],d=u[1];if(0===b)m=1===n;else{m=!1;const e=t.parent;if(null!==e){const t=e.globalTransformMatrix;b*=t.a*t.d-t.b*t.c>0?a.DEG_RAD:-a.DEG_RAD}}const x=this.rotateMix,y=this.translateMix;for(let t=0,e=3;t<c;t++,e+=3){let s=r[t];s.updateByConstraint();let i=s.globalTransformMatrix;i.tx+=(M-i.tx)*y,i.ty+=(d-i.ty)*y;const o=u[e],n=u[e+1],h=o-M,c=n-d;if(l){const e=this._boneLengths[t],s=(Math.sqrt(h*h+c*c)/e-1)*x+1;i.a*=s,i.b*=s}if(M=o,d=n,x>0){let t,o,n,r=i.a,l=i.b,f=i.c,p=i.d;if(t=_?u[e-1]:Math.atan2(c,h),t-=Math.atan2(l,r),m){o=Math.cos(t),n=Math.sin(t);const e=s._boneData.length;M+=(e*(o*r-n*l)-h)*x,d+=(e*(n*r+o*l)-c)*x}else t+=b;t>a.PI?t-=a.PI_D:t<-a.PI&&(t+=a.PI_D),t*=x,o=Math.cos(t),n=Math.sin(t),i.a=o*r-n*l,i.b=n*r+o*l,i.c=o*f-n*p,i.d=n*f+o*p}s.global.fromMatrix(i)}this.dirty=!1}invalidUpdate(){}}export{i as Constraint,o as IKConstraint,n as PathConstraint};
//# sourceMappingURL=Constraint.mjs.map