|
var gdjs;(function(h){const p=new h.Logger("LayerPixiRenderer"),l=class{constructor(e,t,r){this._lightingSprite=null;this._renderTexture=null;this._oldWidth=null;this._oldHeight=null;this._threeGroup=null;this._threeScene=null;this._threeCamera=null;this._threeCameraDirty=!1;this._threeEffectComposer=null;this._threePlaneTexture=null;this._threePlaneGeometry=null;this._threePlaneMaterial=null;this._threePlaneMesh=null;this._pixiContainer=new PIXI.Container,this._pixiContainer.sortableChildren=!0,this._layer=e,this._isLightingLayer=e.isLightingLayer();const s=t.getRendererObject();s&&s.addChild(this._pixiContainer),this._pixiContainer.filters=[];const a=r.getPIXIRenderer();this._isLightingLayer?(this._clearColor=e.getClearColor(),this._setupLightingRendering(a,t)):(this._clearColor=[...h.hexNumberToRGBArray(this._layer.getRuntimeScene().getBackgroundColor()),0],this._setup3DRendering(a,t))}onCreated(){this._update3DCameraAspectAndPosition()}onGameResolutionResized(){this._update3DCameraAspectAndPosition()}_update3DCameraAspectAndPosition(){if(!!this._threeCamera){if(this._threeCamera instanceof THREE.OrthographicCamera){const e=this._layer.getWidth(),t=this._layer.getHeight();this._threeCamera.left=-e/2,this._threeCamera.right=e/2,this._threeCamera.top=t/2,this._threeCamera.bottom=-t/2}else this._threeCamera.aspect=this._layer.getWidth()/this._layer.getHeight();this._threeCamera.updateProjectionMatrix(),this.updatePosition()}}getRendererObject(){return this._pixiContainer}getThreeScene(){return this._threeScene}getThreeCamera(){return this._threeCamera}getThreeEffectComposer(){return this._threeEffectComposer}addPostProcessingPass(e){if(!this._threeEffectComposer)return;const t=this._layer.getRuntimeScene().getGame(),r=this._threeEffectComposer.passes.length-(t.getAntialiasingMode()==="none"?1:2);this._threeEffectComposer.insertPass(e,r)}removePostProcessingPass(e){!this._threeEffectComposer||this._threeEffectComposer.removePass(e)}hasPostProcessingPass(){if(!this._threeEffectComposer)return!1;const t=this._layer.getRuntimeScene().getGame().getAntialiasingMode()==="none"?2:3;return this._threeEffectComposer.passes.length>t}getLightingSprite(){return this._lightingSprite}_setup3DRendering(e,t){if(typeof THREE!="undefined")if(this._layer instanceof h.Layer){if(this._layer.getRenderingType()===h.RuntimeLayerRenderingType.THREE_D||this._layer.getRenderingType()===h.RuntimeLayerRenderingType.TWO_D_PLUS_THREE_D){if(this._threeScene||this._threeGroup||this._threeCamera)throw new Error("Tried to setup 3D rendering for a layer that is already set up.");if(this._threeScene=new THREE.Scene,this._threeScene.scale.y=-1,this._threeGroup=new THREE.Group,this._threeScene.add(this._threeGroup),this._layer.getCameraType()===h.RuntimeLayerCameraType.ORTHOGRAPHIC){const a=this._layer.getWidth(),n=this._layer.getHeight();this._threeCamera=new THREE.OrthographicCamera(-a/2,a/2,n/2,-n/2,this._layer.getInitialCamera3DNearPlaneDistance(),this._layer.getInitialCamera3DFarPlaneDistance())}else this._threeCamera=new THREE.PerspectiveCamera(this._layer.getInitialCamera3DFieldOfView(),1,this._layer.getInitialCamera3DNearPlaneDistance(),this._layer.getInitialCamera3DFarPlaneDistance());this._threeCamera.rotation.order="ZYX";const r=this._layer.getRuntimeScene().getGame(),s=r.getRenderer().getThreeRenderer();if(s&&(this._threeEffectComposer=new THREE_ADDONS.EffectComposer(s),this._threeEffectComposer.addPass(new THREE_ADDONS.RenderPass(this._threeScene,this._threeCamera)),r.getAntialiasingMode()!=="none"&&this._threeEffectComposer.addPass(new THREE_ADDONS.SMAAPass(r.getGameResolutionWidth(),r.getGameResolutionHeight())),this._threeEffectComposer.addPass(new THREE_ADDONS.OutputPass)),this._layer.getRenderingType()===h.RuntimeLayerRenderingType.TWO_D_PLUS_THREE_D){if(this._renderTexture||this._threePlaneGeometry||this._threePlaneMaterial||this._threePlaneTexture||this._threePlaneMesh)throw new Error("Tried to setup PixiJS plane for 2D rendering in 3D for a layer that is already set up.");this._createPixiRenderTexture(e),this._threePlaneGeometry=new THREE.PlaneGeometry(1,1);const a=1,n=1,u=a*n,g=new Uint8Array(4*u),_=new THREE.DataTexture(g,a,n);_.needsUpdate=!0,this._threePlaneTexture=_,this._threePlaneTexture.generateMipmaps=!1;const d=this._layer.getRuntimeScene().getGame().getScaleMode()==="nearest"?THREE.NearestFilter:THREE.LinearFilter;this._threePlaneTexture.minFilter=d,this._threePlaneTexture.magFilter=d,this._threePlaneTexture.wrapS=THREE.ClampToEdgeWrapping,this._threePlaneTexture.wrapT=THREE.ClampToEdgeWrapping;const i={vertexShader:` |
|
`,uniforms:{map:{value:this._threePlaneTexture}},side:THREE.FrontSide,transparent:!0};this._threePlaneMaterial=new THREE.ShaderMaterial(i),this._threePlaneMaterial,this._threePlaneMesh=new THREE.Mesh(this._threePlaneGeometry,this._threePlaneMaterial),this._threePlaneMesh.renderOrder=Number.MAX_SAFE_INTEGER,this._threeScene.add(this._threePlaneMesh)}}}else{const r=t.get3DRendererObject();if(!r)return;this._threeGroup||(this._threeGroup=new THREE.Group,r.add(this._threeGroup))}}setThreeCameraDirty(e){this._threeCameraDirty=e}show2DRenderingPlane(e){!this._threePlaneMesh||this._threePlaneMesh.visible!==e&&(this._threePlaneMesh.visible=e)}updatePosition(){const e=-h.toRad(this._layer.getCameraRotation()),t=this._layer.getCameraZoom();this._pixiContainer.rotation=e,this._pixiContainer.scale.x=t,this._pixiContainer.scale.y=t;const r=Math.cos(e),s=Math.sin(e),a=this._layer.getCameraX()*t*r-this._layer.getCameraY()*t*s,n=this._layer.getCameraX()*t*s+this._layer.getCameraY()*t*r;this._pixiContainer.position.x=this._layer.getWidth()/2-a,this._pixiContainer.position.y=this._layer.getHeight()/2-n,this._layer.getRuntimeScene().getGame().getPixelsRounding()&&(r===0||s===0)&&Number.isInteger(t)&&(this._layer.getRuntimeScene().getGame().getRenderer().getPIXIRenderer()instanceof PIXI.Renderer?(this._pixiContainer.position.x=Math.round(this._pixiContainer.position.x),this._pixiContainer.position.y=Math.round(this._pixiContainer.position.y)):(this._pixiContainer.position.x=Math.ceil(this._pixiContainer.position.x),this._pixiContainer.position.y=Math.ceil(this._pixiContainer.position.y))),this._threeCamera&&(this._threeCamera.position.x=this._layer.getCameraX(),this._threeCamera.position.y=-this._layer.getCameraY(),this._threeCamera.rotation.z=e,this._threeCamera instanceof THREE.OrthographicCamera?(this._threeCamera.zoom=this._layer.getCameraZoom(),this._threeCamera.updateProjectionMatrix(),this._threeCamera.position.z=this._layer.getCameraZ(null)):this._threeCamera.position.z=this._layer.getCameraZ(this._threeCamera.fov),this._threePlaneMesh&&(this._threePlaneMesh.scale.x=this._layer.getWidth()/t,this._threePlaneMesh.scale.y=this._layer.getHeight()/t,this._threePlaneMesh.position.x=this._threeCamera.position.x,this._threePlaneMesh.position.y=-this._threeCamera.position.y,this._threePlaneMesh.rotation.z=-e))}updateResolution(){if(this._threeEffectComposer){const e=this._layer.getRuntimeScene().getGame();this._threeEffectComposer.setSize(e.getGameResolutionWidth(),e.getGameResolutionHeight())}}isCameraRotatedIn3D(){return this._threeCamera&&(this._threeCamera.rotation.x!==0||this._threeCamera.rotation.y!==0)}transformTo3DWorld(e,t,r,s,a){const n=this._threeCamera;if(!n)return a[0]=0,a[1]=0,a;const u=this._layer.getWidth(),g=this._layer.getHeight(),_=e/u*2-1,d=-(t/g)*2+1;let i=l.vectorForProjections;if(i||(i=new THREE.Vector3,l.vectorForProjections=i),n.updateMatrixWorld(),n instanceof THREE.OrthographicCamera){i.set(_,d,0),i.unproject(n);const o=new THREE.Vector3;n.getWorldDirection(o);const m=(r-i.z)/o.z;i.x+=m*o.x,i.y+=m*o.y}else{i.set(_,d,.5),i.unproject(n),i.sub(n.position).normalize();const o=(r-n.position.z)/i.z;i.x=o*i.x+n.position.x,i.y=o*i.y+n.position.y}return!Number.isFinite(i.x)||!Number.isFinite(i.y)?(a[0]=0,a[1]=0,a):(a[0]=i.x,a[1]=-i.y,a)}updateVisibility(e){this._pixiContainer.visible=!!e,this._threeGroup&&(this._threeGroup.visible=!!e)}updatePreRender(){if(this._threeCameraDirty){const e=this.getThreeCamera();e&&e.updateProjectionMatrix(),this._threeCameraDirty=!1}}addRendererObject(e,t){const r=e;r.zIndex=t||l.zeroZOrderForPixi,this._pixiContainer.addChild(r)}changeRendererObjectZOrder(e,t){const r=e;r.zIndex=t}removeRendererObject(e){this._pixiContainer.removeChild(e)}has3DObjects(){return!!this._threeGroup&&this._threeGroup.children.length>0}has2DObjects(){return this._pixiContainer.children.length>0}add3DRendererObject(e){!this._threeGroup||this._threeGroup.add(e)}remove3DRendererObject(e){!this._threeGroup||this._threeGroup.remove(e)}updateClearColor(){this._clearColor=this._layer.getClearColor()}_createPixiRenderTexture(e){if(!e||e.type!==PIXI.RENDERER_TYPE.WEBGL)return;if(this._renderTexture){p.error("Tried to create a PixiJS RenderTexture for a layer that already has one.");return}this._oldWidth=e.screen.width,this._oldHeight=e.screen.height;const t=this._oldWidth,r=this._oldHeight,s=e.resolution;this._renderTexture=PIXI.RenderTexture.create({width:t||100,height:r||100,resolution:s}),this._renderTexture.baseTexture.scaleMode=PIXI.SCALE_MODES.LINEAR,p.info(`RenderTexture created for layer ${this._layer.getName()}.`)}renderOnPixiRenderTexture(e){if(!this._renderTexture)return;(this._oldWidth!==e.screen.width||this._oldHeight!==e.screen.height)&&(this._renderTexture.resize(e.screen.width||100,e.screen.height||100),this._oldWidth=e.screen.width,this._oldHeight=e.screen.height);const t=e.renderTexture.current||void 0,r=e.renderTexture.sourceFrame;e.renderTexture.bind(this._renderTexture),this._clearColor[3]=this._isLightingLayer?1:0,e.renderTexture.clear(this._clearColor),e.render(this._pixiContainer,{renderTexture:this._renderTexture,clear:!1}),e.renderTexture.bind(t,r,void 0)}updateThreePlaneTextureFromPixiRenderTexture(e,t){if(!this._threePlaneTexture||!this._renderTexture)return;const r=this._renderTexture.baseTexture._glTextures[t.CONTEXT_UID];if(r){const s=e.properties.get(this._threePlaneTexture);s.__webglTexture=r.texture}}_setupLightingRendering(e,t){if(this._createPixiRenderTexture(e),!this._renderTexture)return;this._lightingSprite=new PIXI.Sprite(this._renderTexture),this._lightingSprite.blendMode=PIXI.BLEND_MODES.MULTIPLY;const r=t.getRendererObject();if(r){const s=r.getChildIndex(this._pixiContainer);r.addChildAt(this._lightingSprite,s),r.removeChild(this._pixiContainer)}}};let c=l;c.zeroZOrderForPixi=Math.pow(2,-24),c.vectorForProjections=null,h.LayerPixiRenderer=c,h.LayerRenderer=h.LayerPixiRenderer})(gdjs||(gdjs={})); |