UNPKG

pixi-dragonbones-runtime

Version:
3 lines (2 loc) 9.02 kB
"use strict";var t=require("../core/BaseObject.cjs");require("../core/DragonBones.cjs");var e=require("../geom/Matrix.cjs"),s=require("../geom/Point.cjs"),a=require("../geom/Transform.cjs");class i extends t.BaseObject{_onClear(){this._armature=null,this._target=null,this._root=null,this._bone=null}get name(){return this._constraintData.name}}i._helpMatrix=new e.Matrix,i._helpTransform=new a.Transform,i._helpPoint=new s.Point;exports.Constraint=i,exports.IKConstraint=class 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.Transform.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,c=Math.sqrt(l);let _=o.x-i.x,f=o.y-i.y;const u=_*_+f*f,g=Math.sqrt(u),p=o.rotation,m=i.rotation,b=Math.atan2(f,_);_=s.x-i.x,f=s.y-i.y;const M=_*_+f*f,d=Math.sqrt(M);let x=0;if(c+g<=d||d+c<=g||d+g<=c)x=Math.atan2(s.y-i.y,s.x-i.x),c+g<=d||g<c&&(x+=Math.PI);else{const t=(u-l+M)/(2*M),s=Math.sqrt(u-t*t*M)/d,a=i.x+_*t,n=i.y+f*t,r=-f*s,h=_*s;let c=!1;const g=e.parent;if(null!==g){const t=g.globalTransformMatrix;c=t.a*t.d-t.b*t.c<0}c!==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.Transform.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+p-m+a.Transform.normalizeRadian(B-y-p)*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()}},exports.PathConstraint=class 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 c=this._pathSlot._geometryBones,_=l.bones.length,f=l.offset;let u=i[f+1],g=f+2+_;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=c[i[g++]];if(null===e)continue;e.updateByConstraint();const n=e.globalTransformMatrix,r=o[u++],h=o[u++]*a,l=o[u++]*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 c=2*o,_=c/6,f=-1,u=this.position;n.length=3*e+2;let g=0;if(!t.constantSpeed){const o=t.curveLengths;if(_-=h?1:2,g=o[_],a&&(u*=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(u+=r[t],h)u%=g,u<0&&(u+=g),i=0;else{if(u<0)continue;if(u>g)continue}let e=0;for(;;i++){const t=o[i];if(!(u>t)){if(0===i)e=u/t;else{const s=o[i-1];e=(u-s)/(t-s)}break}}i!==f&&(f=i,h&&i===_?(this._computeVertices(c-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?(c+=2,l.length=o,this._computeVertices(2,c-4,0,l),this._computeVertices(0,2,c-4,l),l[c-2]=l[0],l[c-1]=l[1]):(_--,c-=4,l.length=c,this._computeVertices(2,c,0,l));let p=new Array(_);g=0;let m,b,M,d,x,y,D,B,C=l[0],v=l[1],P=0,T=0,q=0,V=0,w=0,G=0;for(let t=0,e=2;t<_;t++,e+=6)P=l[e],T=l[e+1],q=l[e+2],V=l[e+3],w=l[e+4],G=l[e+5],m=.1875*(C-2*P+q),b=.1875*(v-2*T+V),M=.09375*(3*(P-q)-C+w),d=.09375*(3*(T-V)-v+G),x=2*m+M,y=2*b+d,D=.75*(P-C)+m+.16666667*M,B=.75*(T-v)+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),p[t]=g,C=w,v=G;if(a&&(u*=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){u+=r[t];let e=u;if(h)e%=g,e<0&&(e+=g),i=0;else{if(e<0)continue;if(e>g)continue}for(;;i++){const t=p[i];if(!(e>t)){if(0===i)e/=t;else{const s=p[i-1];e=(e-s)/(t-s)}break}}if(i!==f){f=i;let t=6*i;for(C=l[t],v=l[t+1],P=l[t+2],T=l[t+3],q=l[t+4],V=l[t+5],w=l[t+6],G=l[t+7],m=.03*(C-2*P+q),b=.03*(v-2*T+V),M=.006*(3*(P-q)-C+w),d=.006*(3*(T-V)-v+G),x=2*m+M,y=2*b+d,D=.3*(P-C)+m+.16666667*M,B=.3*(T-v)+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,C,v,P,T,q,V,w,G,n,a,s)}}addCurvePosition(t,e,s,a,i,o,n,r,h,l,c,_){if(0===t)return l[c]=e,l[c+1]=s,void(l[c+2]=0);if(1===t)return l[c]=r,l[c+1]=h,void(l[c+2]=0);const f=1-t,u=f*f,g=t*t,p=u*f,m=u*t*3,b=f*g*3,M=t*g,d=p*e+m*a+b*o+M*r,x=p*s+m*i+b*n+M*h;l[c]=d,l[c+1]=x,l[c+2]=_?Math.atan2(x-(p*s+m*i+b*n),d-(p*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,c=0===n,_=r.length,f=c?_:_+1,u=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+u)*n/s}}else for(let t=0;t<f;t++)g[t]=u;this._computeBezierCurve(t._displayFrame.rawDisplayData,f,c,1===i,2===o);const p=this._positions;let m,b=this.rotateOffset,M=p[0],d=p[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.Transform.DEG_RAD:-a.Transform.DEG_RAD}}const x=this.rotateMix,y=this.translateMix;for(let t=0,e=3;t<_;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=p[e],n=p[e+1],h=o-M,_=n-d;if(l){const e=this._boneLengths[t],s=(Math.sqrt(h*h+_*_)/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,u=i.d;if(t=c?p[e-1]:Math.atan2(_,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)-_)*x}else t+=b;t>a.Transform.PI?t-=a.Transform.PI_D:t<-a.Transform.PI&&(t+=a.Transform.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*u,i.d=n*f+o*u}s.global.fromMatrix(i)}this.dirty=!1}invalidUpdate(){}}; //# sourceMappingURL=Constraint.cjs.map