@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 4.02 kB
JavaScript
import{Color as e}from"../../../core/math/color.js";import{PIXELFORMAT_RGBA8 as t,CULLFACE_NONE as i}from"../../../platform/graphics/constants.js";import{Texture as a}from"../../../platform/graphics/texture.js";import{BLEND_PREMULTIPLIED as l,SPRITE_RENDERMODE_SLICED as o,SPRITE_RENDERMODE_TILED as r}from"../../../scene/constants.js";import{StandardMaterial as s}from"../../../scene/materials/standard-material.js";import{Component as d}from"../component.js";import{ComponentSystem as p}from"../system.js";import{SpriteComponent as c}from"./component.js";import{SpriteComponentData as n}from"./data.js";const u=["enabled"];class f extends p{constructor(e){super(e),this.id="sprite",this.ComponentType=c,this.DataType=n,this.schema=u,this._defaultTexture=null,this._defaultMaterial=null,this._default9SlicedMaterialSlicedMode=null,this._default9SlicedMaterialTiledMode=null,this.app.systems.on("update",this.onUpdate,this),this.on("beforeremove",this.onBeforeRemove,this)}set defaultMaterial(e){this._defaultMaterial=e}get defaultMaterial(){if(!this._defaultMaterial){const e=new a(this.app.graphicsDevice,{width:1,height:1,format:t,name:"sprite"}),o=new Uint8Array(e.lock());o[0]=o[1]=o[2]=o[3]=255,e.unlock();const r=new s;r.diffuse.set(0,0,0),r.emissive.set(.5,.5,.5),r.emissiveMap=e,r.emissiveTint=!0,r.opacityMap=e,r.opacityMapChannel="a",r.opacityTint=!0,r.opacity=0,r.useLighting=!1,r.useGammaTonemap=!1,r.useFog=!1,r.useSkybox=!1,r.blendType=l,r.depthWrite=!1,r.pixelSnap=!1,r.cull=i,r.update(),this._defaultTexture=e,this._defaultMaterial=r}return this._defaultMaterial}set default9SlicedMaterialSlicedMode(e){this._default9SlicedMaterialSlicedMode=e}get default9SlicedMaterialSlicedMode(){if(!this._default9SlicedMaterialSlicedMode){const e=this.defaultMaterial.clone();e.nineSlicedMode=o,e.update(),this._default9SlicedMaterialSlicedMode=e}return this._default9SlicedMaterialSlicedMode}set default9SlicedMaterialTiledMode(e){this._default9SlicedMaterialTiledMode=e}get default9SlicedMaterialTiledMode(){if(!this._default9SlicedMaterialTiledMode){const e=this.defaultMaterial.clone();e.nineSlicedMode=r,e.update(),this._default9SlicedMaterialTiledMode=e}return this._default9SlicedMaterialTiledMode}destroy(){super.destroy(),this.app.systems.off("update",this.onUpdate,this),this._defaultTexture&&(this._defaultTexture.destroy(),this._defaultTexture=null)}initializeComponentData(t,i,a){if(void 0!==i.enabled&&(t.enabled=i.enabled),t.type=i.type,i.layers&&Array.isArray(i.layers)&&(t.layers=i.layers.slice(0)),void 0!==i.drawOrder&&(t.drawOrder=i.drawOrder),void 0!==i.color){var l,o;if(i.color instanceof e)t.color.set(i.color.r,i.color.g,i.color.b,null!=(l=i.opacity)?l:1);else t.color.set(i.color[0],i.color[1],i.color[2],null!=(o=i.opacity)?o:1);t.color=t.color}if(void 0!==i.opacity&&(t.opacity=i.opacity),void 0!==i.flipX&&(t.flipX=i.flipX),void 0!==i.flipY&&(t.flipY=i.flipY),void 0!==i.width&&(t.width=i.width),void 0!==i.height&&(t.height=i.height),void 0!==i.spriteAsset&&(t.spriteAsset=i.spriteAsset),i.sprite&&(t.sprite=i.sprite),void 0!==i.frame&&(t.frame=i.frame),i.clips)for(const e in i.clips)t.addClip(i.clips[e]);void 0!==i.speed&&(t.speed=i.speed),i.autoPlayClip&&(t.autoPlayClip=i.autoPlayClip),t.batchGroupId=void 0===i.batchGroupId||null===i.batchGroupId?-1:i.batchGroupId,super.initializeComponentData(t,i,a)}cloneComponent(e,t){const i=e.sprite;return this.addComponent(t,{enabled:i.enabled,type:i.type,spriteAsset:i.spriteAsset,sprite:i.sprite,width:i.width,height:i.height,frame:i.frame,color:i.color.clone(),opacity:i.opacity,flipX:i.flipX,flipY:i.flipY,speed:i.speed,clips:i.clips,autoPlayClip:i.autoPlayClip,batchGroupId:i.batchGroupId,drawOrder:i.drawOrder,layers:i.layers.slice(0)})}onUpdate(e){const t=this.store;for(const i in t)if(t.hasOwnProperty(i)){const a=t[i];if(a.data.enabled&&a.entity.enabled){const t=a.entity.sprite;t._currentClip&&t._currentClip._update(e)}}}onBeforeRemove(e,t){t.onDestroy()}}d._buildAccessors(c.prototype,u);export{f as SpriteComponentSystem};