UNPKG

@animech-public/playcanvas

Version:
2 lines (1 loc) 3.93 kB
import{EventHandler as e}from"../core/event-handler.js";import{Vec2 as s}from"../core/math/vec2.js";import{SPRITE_RENDERMODE_SIMPLE as t,SPRITE_RENDERMODE_SLICED as i,SPRITE_RENDERMODE_TILED as r}from"./constants.js";import{Mesh as h}from"./mesh.js";import{Geometry as a}from"./geometry/geometry.js";const o=[0,0,1,0,0,1,0,0,1,0,0,1],_=[0,1,3,2,3,1];class n extends e{constructor(e,s){super(),this._device=e,this._pixelsPerUnit=s&&void 0!==s.pixelsPerUnit?s.pixelsPerUnit:1,this._renderMode=s&&void 0!==s.renderMode?s.renderMode:t,this._atlas=s&&void 0!==s.atlas?s.atlas:null,this._frameKeys=s&&void 0!==s.frameKeys?s.frameKeys:null,this._meshes=[],this._updatingProperties=!1,this._meshesDirty=!1,this._atlas&&this._frameKeys&&this._createMeshes()}set frameKeys(e){this._frameKeys=e,this._atlas&&this._frameKeys&&(this._updatingProperties?this._meshesDirty=!0:this._createMeshes()),this.fire("set:frameKeys",e)}get frameKeys(){return this._frameKeys}set atlas(e){e!==this._atlas&&(this._atlas&&(this._atlas.off("set:frames",this._onSetFrames,this),this._atlas.off("set:frame",this._onFrameChanged,this),this._atlas.off("remove:frame",this._onFrameRemoved,this)),this._atlas=e,this._atlas&&this._frameKeys&&(this._atlas.on("set:frames",this._onSetFrames,this),this._atlas.on("set:frame",this._onFrameChanged,this),this._atlas.on("remove:frame",this._onFrameRemoved,this),this._updatingProperties?this._meshesDirty=!0:this._createMeshes()),this.fire("set:atlas",e))}get atlas(){return this._atlas}set pixelsPerUnit(e){this._pixelsPerUnit!==e&&(this._pixelsPerUnit=e,this.fire("set:pixelsPerUnit",e),this._atlas&&this._frameKeys&&this.renderMode===t&&(this._updatingProperties?this._meshesDirty=!0:this._createMeshes()))}get pixelsPerUnit(){return this._pixelsPerUnit}set renderMode(e){if(this._renderMode===e)return;const s=this._renderMode;this._renderMode=e,this.fire("set:renderMode",e),s!==t&&e!==t||this._atlas&&this._frameKeys&&(this._updatingProperties?this._meshesDirty=!0:this._createMeshes())}get renderMode(){return this._renderMode}get meshes(){return this._meshes}_createMeshes(){const e=this._meshes.length;for(let s=0;s<e;s++){const e=this._meshes[s];e&&e.destroy()}const s=this._frameKeys.length;this._meshes=new Array(s);const t=this.renderMode===i||this._renderMode===r?this._create9SliceMesh:this._createSimpleMesh;for(let e=0;e<s;e++){const s=this._atlas.frames[this._frameKeys[e]];this._meshes[e]=s?t.call(this,s):null}this.fire("set:meshes")}_createSimpleMesh(e){const s=e.rect,t=this._atlas.texture.width,i=this._atlas.texture.height,r=s.z/this._pixelsPerUnit,n=s.w/this._pixelsPerUnit,m=e.pivot.x,l=e.pivot.y,d=[-m*r,-l*n,0,(1-m)*r,-l*n,0,(1-m)*r,(1-l)*n,0,-m*r,(1-l)*n,0],f=s.x/t,p=1-s.y/i,c=(s.x+s.z)/t,y=1-(s.y+s.w)/i,u=[f,p,c,p,c,y,f,y],M=new a;return M.positions=d,M.normals=o,M.uvs=u,M.indices=_,h.fromGeometry(this._device,M)}_create9SliceMesh(){const e=s.ONE,t=[],i=[],r=[],o=[];let _=0;for(let s=0;s<=3;s++){const h=0===s||3===s?0:1;for(let a=0;a<=3;a++){const n=-e.x+2*e.x*(s<=1?0:3)/3,m=0,l=-(-e.y+2*e.y*(a<=1?0:3)/3),d=0===a||3===a?0:1;t.push(-n,m,l),i.push(0,1,0),r.push(h,d),s<3&&a<3&&(o.push(_+3+1,_+1,_),o.push(_+3+1,_+3+2,_+1)),_++}}const n=new a;return n.positions=t,n.normals=i,n.uvs=r,n.indices=o,h.fromGeometry(this._device,n)}_onSetFrames(e){this._updatingProperties?this._meshesDirty=!0:this._createMeshes()}_onFrameChanged(e,s){const i=this._frameKeys.indexOf(e);i<0||(s?this.renderMode===t&&(this._meshes[i]=this._createSimpleMesh(s)):this._meshes[i]=null,this.fire("set:meshes"))}_onFrameRemoved(e){const s=this._frameKeys.indexOf(e);s<0||(this._meshes[s]=null,this.fire("set:meshes"))}startUpdate(){this._updatingProperties=!0,this._meshesDirty=!1}endUpdate(){this._updatingProperties=!1,this._meshesDirty&&this._atlas&&this._frameKeys&&this._createMeshes(),this._meshesDirty=!1}destroy(){for(const e of this._meshes)e&&e.destroy();this._meshes.length=0}}export{n as Sprite};