@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 3.86 kB
JavaScript
import{Mat4 as e}from"../../../core/math/mat4.js";import{Vec2 as t}from"../../../core/math/vec2.js";import{Entity as s}from"../../entity.js";import{SCALEMODE_NONE as i,SCALEMODE_BLEND as r}from"./constants.js";import{Component as n}from"../component.js";const c=new e;class o extends n{constructor(s,r){super(s,r),this._resolution=new t(640,320),this._referenceResolution=new t(640,320),this._scaleMode=i,this.scale=1,this._scaleBlend=.5,this._priority=0,this._screenSpace=!1,this.cull=this._screenSpace,this._screenMatrix=new e,this._elements=new Set,s.app.graphicsDevice.on("resizecanvas",this._onResize,this)}syncDrawOrder(){this.system.queueDrawOrderSync(this.entity.getGuid(),this._processDrawOrderSync,this)}_recurseDrawOrderSync(e,t){if(!(e instanceof s))return t;if(e.element){const s=e.element.drawOrder;var i;if(e.element.drawOrder=t++,e.element._batchGroupId>=0&&s!==e.element.drawOrder)null==(i=this.system.app.batcher)||i.markGroupDirty(e.element._batchGroupId)}e.particlesystem&&(e.particlesystem.drawOrder=t++);const r=e.children;for(let e=0;e<r.length;e++)t=this._recurseDrawOrderSync(r[e],t);return t}_processDrawOrderSync(){this._recurseDrawOrderSync(this.entity,1),this.fire("syncdraworder")}_calcProjectionMatrix(){const e=this._resolution.x/this.scale,t=this._resolution.y/this.scale,s=e,i=-t;this._screenMatrix.setOrtho(0,s,i,0,1,-1),this._screenSpace||(c.setScale(.5*e,.5*t,1),this._screenMatrix.mul2(c,this._screenMatrix))}_updateScale(){this.scale=this._calcScale(this._resolution,this.referenceResolution)}_calcScale(e,t){const s=Math.log2((e.x||1)/t.x),i=Math.log2((e.y||1)/t.y);return Math.pow(2,s*(1-this._scaleBlend)+i*this._scaleBlend)}_onResize(e,t){this._screenSpace&&(this._resolution.set(e,t),this.resolution=this._resolution)}_bindElement(e){this._elements.add(e)}_unbindElement(e){this._elements.delete(e)}onRemove(){this.system.app.graphicsDevice.off("resizecanvas",this._onResize,this),this.fire("remove"),this._elements.forEach((e=>e._onScreenRemove())),this._elements.clear(),this.off()}set resolution(e){this._screenSpace?this._resolution.set(this.system.app.graphicsDevice.width,this.system.app.graphicsDevice.height):this._resolution.set(e.x,e.y),this._updateScale(),this._calcProjectionMatrix(),this.entity._dirtyLocal||this.entity._dirtifyLocal(),this.fire("set:resolution",this._resolution),this._elements.forEach((e=>e._onScreenResize(this._resolution)))}get resolution(){return this._resolution}set referenceResolution(e){this._referenceResolution.set(e.x,e.y),this._updateScale(),this._calcProjectionMatrix(),this.entity._dirtyLocal||this.entity._dirtifyLocal(),this.fire("set:referenceresolution",this._resolution),this._elements.forEach((e=>e._onScreenResize(this._resolution)))}get referenceResolution(){return this._scaleMode===i?this._resolution:this._referenceResolution}set screenSpace(e){this._screenSpace=e,this._screenSpace&&this._resolution.set(this.system.app.graphicsDevice.width,this.system.app.graphicsDevice.height),this.resolution=this._resolution,this.entity._dirtyLocal||this.entity._dirtifyLocal(),this.fire("set:screenspace",this._screenSpace),this._elements.forEach((e=>e._onScreenSpaceChange()))}get screenSpace(){return this._screenSpace}set scaleMode(e){e!==i&&e!==r&&(e=i),this._screenSpace||e===i||(e=i),this._scaleMode=e,this.resolution=this._resolution,this.fire("set:scalemode",this._scaleMode)}get scaleMode(){return this._scaleMode}set scaleBlend(e){this._scaleBlend=e,this._updateScale(),this._calcProjectionMatrix(),this.entity._dirtyLocal||this.entity._dirtifyLocal(),this.fire("set:scaleblend",this._scaleBlend),this._elements.forEach((e=>e._onScreenResize(this._resolution)))}get scaleBlend(){return this._scaleBlend}set priority(e){e>255&&(e=255),this._priority!==e&&(this._priority=e,this.syncDrawOrder())}get priority(){return this._priority}}export{o as ScreenComponent};