Files

16 lines
17 KiB
JavaScript

var gdjs;(function(_){const R=new _.Logger("LayerPixiRenderer"),T=[[0,1],[1,2],[2,3],[3,0],[4,5],[5,6],[6,7],[7,4],[0,4],[1,5],[2,6],[3,7]],y=[[-1,-1,-1],[1,-1,-1],[1,1,-1],[-1,1,-1],[-1,-1,1],[1,-1,1],[1,1,1],[-1,1,1]],D=o=>{if(o.length<=2)return o;const e=o.reduce((t,i)=>t+i.x,0)/o.length,r=o.reduce((t,i)=>t+i.y,0)/o.length;return o.map(t=>({p:t,a:Math.atan2(t.y-r,t.x-e)})).sort((t,i)=>t.a-i.a).map(t=>t.p)},b=(o,e,r=1e-9)=>{const t=o.z,i=e.z,a=i-t;if(Math.abs(a)<r)return Math.abs(t)<r&&Math.abs(i)<r,null;const n=-t/a;return n<-r||n>1+r?null:new THREE.Vector3(o.x+n*(e.x-o.x),o.y+n*(e.y-o.y),0)},M=(o,e=1e-6)=>{const r=[];for(const t of o)r.some(a=>Math.abs(t.x-a.x)<e&&Math.abs(t.y-a.y)<e)||r.push(t);return r},v=o=>{o.updateMatrixWorld(!0);const e=y.map(i=>new THREE.Vector3(i[0],i[1],i[2]).unproject(o));if(e.length!==8)return[];const r=[];for(const i of e)Math.abs(i.z)<1e-9&&r.push(new THREE.Vector3(i.x,i.y,0));for(const[i,a]of T){const n=e[i],h=e[a],l=b(n,h);l&&r.push(l)}const t=M(r);return t.length<3?[]:D(t)},E=(o,e,r)=>{if(!o)return null;o.updateMatrixWorld(!0);const t=new THREE.Vector3,i=new THREE.Vector3,a=new THREE.Vector3(e,r,.5);o instanceof THREE.OrthographicCamera?(a.z=0,a.unproject(o),t.copy(a),o.getWorldDirection(i)):(a.unproject(o),t.copy(o.position),i.copy(a).sub(t).normalize());const n=i.z;if(Math.abs(n)<1e-8)return null;const h=-t.z/n;return h<=0?null:t.addScaledVector(i,h).setZ(0)},H=45,f=class{constructor(e,r,t){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._basis=null;this._threePlaneTexture=null;this._threePlaneGeometry=null;this._threePlaneMaterial=null;this._threePlaneMesh=null;this._threePlaneMeshDebugOutline=null;this._2DPlaneMaxDrawingDistance=5e3;this._2DPlaneClampFreeTiltDeg=.1;this._2DPlaneClampHardTiltDeg=6;this._2DPlaneClampRampPower=1.5;this._pixiContainer=new PIXI.Container,this._pixiContainer.sortableChildren=!0,this._layer=e,this._isLightingLayer=e.isLightingLayer();const i=r.getRendererObject();i&&i.addChild(this._pixiContainer),this._pixiContainer.filters=[];const a=t.getPIXIRenderer();this._isLightingLayer?(this._clearColor=e.getClearColor(),this._setupLightingRendering(a,r)):(this._clearColor=[..._.hexNumberToRGBArray(this._layer.getRuntimeScene().getBackgroundColor()),0],this._setup3DRendering(a,r))}onCreated(){this._update3DCameraAspectAndPosition()}onGameResolutionResized(){this._update3DCameraAspectAndPosition()}_update3DCameraAspectAndPosition(){if(!!this._threeCamera){if(this._threeCamera instanceof THREE.OrthographicCamera){const e=this._layer.getWidth(),r=this._layer.getHeight();this._threeCamera.left=-e/2,this._threeCamera.right=e/2,this._threeCamera.top=r/2,this._threeCamera.bottom=-r/2}else this._threeCamera.aspect=this._layer.getWidth()/this._layer.getHeight();this._threeCamera.updateProjectionMatrix(),this.updatePosition()}}getRendererObject(){return this._pixiContainer}getThreeScene(){return this._threeScene}getThreeGroup(){return this._threeGroup}getThreeCamera(){return this._threeCamera}getThreeEffectComposer(){return this._threeEffectComposer}addPostProcessingPass(e){if(!this._threeEffectComposer)return;const r=this._layer.getRuntimeScene().getGame(),t=this._threeEffectComposer.passes.length-(r.getAntialiasingMode()==="none"?1:2);this._threeEffectComposer.insertPass(e,t)}removePostProcessingPass(e){!this._threeEffectComposer||this._threeEffectComposer.removePass(e)}hasPostProcessingPass(){if(!this._threeEffectComposer)return!1;const r=this._layer.getRuntimeScene().getGame().getAntialiasingMode()==="none"?2:3;return this._threeEffectComposer.passes.length>r}getLightingSprite(){return this._lightingSprite}_setup3DRendering(e,r){if(typeof THREE!="undefined")if(this._layer instanceof _.Layer){if(this._layer.getRenderingType()===_.RuntimeLayerRenderingType.THREE_D||this._layer.getRenderingType()===_.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()===_.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 t=this._layer.getRuntimeScene().getGame(),i=t.getRenderer().getThreeRenderer();if(i&&(this._threeEffectComposer=new THREE_ADDONS.EffectComposer(i),this._threeEffectComposer.addPass(new THREE_ADDONS.RenderPass(this._threeScene,this._threeCamera)),t.getAntialiasingMode()!=="none"&&this._threeEffectComposer.addPass(new THREE_ADDONS.SMAAPass(t.getGameResolutionWidth(),t.getGameResolutionHeight())),this._threeEffectComposer.addPass(new THREE_ADDONS.OutputPass)),this._layer.getRenderingType()===_.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.set2DPlaneMaxDrawingDistance(this._layer.getInitialCamera2DPlaneMaxDrawingDistance()),this._createPixiRenderTexture(e),this._threePlaneGeometry=new THREE.PlaneGeometry(1,1);const a=1,n=1,h=a*n,l=new Uint8Array(4*h),c=new THREE.DataTexture(l,a,n);c.needsUpdate=!0,this._threePlaneTexture=c,this._threePlaneTexture.generateMipmaps=!1;const m=this._layer.getRuntimeScene().getGame().getScaleMode()==="nearest"?THREE.NearestFilter:THREE.LinearFilter;this._threePlaneTexture.minFilter=m,this._threePlaneTexture.magFilter=m,this._threePlaneTexture.wrapS=THREE.ClampToEdgeWrapping,this._threePlaneTexture.wrapT=THREE.ClampToEdgeWrapping;const s={vertexShader:`
varying vec2 vUv;
void main() {
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`,fragmentShader:`
uniform sampler2D map;
varying vec2 vUv;
void main() {
vec4 texel = texture2D(map, vUv);
gl_FragColor = texel;
}
`,uniforms:{map:{value:this._threePlaneTexture}},side:THREE.FrontSide,transparent:!0};this._threePlaneMaterial=new THREE.ShaderMaterial(s),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 t=r.get3DRendererObject();if(!t)return;this._threeGroup||(this._threeGroup=new THREE.Group,t.add(this._threeGroup))}}setCamera3DNearPlaneDistance(e){!this._threeCamera||(this._threeCamera.near=Math.min(Math.max(e,1e-4),this._threeCamera.far),this._threeCameraDirty=!0)}getCamera3DNearPlaneDistance(){return this._threeCamera?this._threeCamera.near:0}setCamera3DFarPlaneDistance(e){!this._threeCamera||(this._threeCamera.far=Math.max(e,this._threeCamera.near),this._threeCameraDirty=!0)}getCamera3DFarPlaneDistance(){return this._threeCamera?this._threeCamera.far:0}setCamera3DFieldOfView(e){!this._threeCamera||this._threeCamera instanceof THREE.OrthographicCamera||(this._threeCamera.fov=Math.min(Math.max(e,0),180),this._threeCameraDirty=!0)}getCamera3DFieldOfView(){return this._threeCamera?this._threeCamera?this._threeCamera instanceof THREE.OrthographicCamera?0:this._threeCamera.fov:H:0}show2DRenderingPlane(e){!this._threePlaneMesh||this._threePlaneMesh.visible!==e&&(this._threePlaneMesh.visible=e)}show2DRenderingPlaneDebugOutline(e){if(!!this._threePlaneMesh){if(e&&!this._threePlaneMeshDebugOutline){const r=new THREE.EdgesGeometry(this._threePlaneGeometry),t=new THREE.LineBasicMaterial({color:16711680});this._threePlaneMeshDebugOutline=new THREE.LineSegments(r,t),this._threePlaneMesh.add(this._threePlaneMeshDebugOutline)}!e&&this._threePlaneMeshDebugOutline&&(this._threePlaneMesh.remove(this._threePlaneMeshDebugOutline),this._threePlaneMeshDebugOutline=null)}}set2DPlaneMaxDrawingDistance(e){this._2DPlaneMaxDrawingDistance=Math.max(0,e)}get2DPlaneMaxDrawingDistance(){return this._2DPlaneMaxDrawingDistance}set2DPlaneClampFreeTiltDegrees(e){this._2DPlaneClampFreeTiltDeg=Math.max(0,e)}set2DPlaneClampHardTiltDegrees(e){this._2DPlaneClampHardTiltDeg=Math.max(0,e)}set2DPlaneClampRampPower(e){this._2DPlaneClampRampPower=Math.max(.1,e)}_get2DPlaneSize(){if(!this._threeCamera)return[0,0];const e=v(this._threeCamera);if(e.length===0)return[0,0];let r=1/0,t=-1/0,i=1/0,a=-1/0;for(const g of e)g.x<r&&(r=g.x),g.x>t&&(t=g.x),g.y<i&&(i=g.y),g.y>a&&(a=g.y);let n=Math.max(1e-8,t-r),h=Math.max(1e-8,a-i);const l=this._layer.getWidth()/this._layer.getHeight();n/h<l?n=l*h:h=n/l;const m=new THREE.Vector3;this._threeCamera.getWorldDirection(m);const s=Math.cos(THREE.MathUtils.degToRad(this._2DPlaneClampFreeTiltDeg)),u=Math.cos(THREE.MathUtils.degToRad(this._2DPlaneClampHardTiltDeg)),d=Math.abs(m.z);let p=0;d<=u?p=1:d>=s?p=0:p=(s-d)/(s-u),p=Math.pow(p,this._2DPlaneClampRampPower);const C=1e12,I=Math.max(p,1e-6),P=Math.min(C,this._2DPlaneMaxDrawingDistance/I);if(P<C){const g=Math.max(1e-8,Math.min(h,P));g!==h&&(h=g,n=l*h)}return[n,h]}_get2DPlanePosition(e){if(!this._threeCamera)return[0,0];const r=E(this._threeCamera,-1,-1),t=E(this._threeCamera,1,-1);let i,a;if(r&&t){const n=.5*(r.x+t.x),h=.5*(r.y+t.y);let l=t.x-r.x,c=t.y-r.y;const m=Math.hypot(l,c)||1;l/=m,c/=m;let s=-c,u=l;const d=E(this._threeCamera,0,-.5);if(d){const p=d.x-n,C=d.y-h;p*s+C*u<0&&(s=-s,u=-u)}i=n+s*(e*.5),a=h+u*(e*.5)}else{const n=E(this._threeCamera,0,0);n?(i=n.x,a=n.y):(i=this._threeCamera.position.x,a=this._threeCamera.position.y)}return[i,a]}updatePosition(){const e=this._layer.getInstanceContainer(),r=e.getGame();if(this._threeCamera){const l=-_.toRad(this._layer.getCameraRotation());this._threeCamera.position.x=this._layer.getCameraX(),this._threeCamera.position.y=-this._layer.getCameraY(),this._threeCamera.rotation.z=l,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)}let t=1;const i=-_.toRad(this._layer.getCameraRotation()),a=Math.cos(i),n=Math.sin(i),h=r.isInGameEdition()||this._threeCamera&&this._threePlaneMesh&&this.has3DObjects();if(this._threeCamera&&this._threePlaneMesh){const[l,c]=this._get2DPlaneSize();if(l===0||c===0)this._threePlaneMesh.visible=!1;else{this._threePlaneMesh.visible=!0;const[m,s]=this._get2DPlanePosition(c);if(this._threePlaneMesh.scale.set(l,c,1),this._threePlaneMesh.position.set(m,-s,0),this._threePlaneMesh.rotation.set(0,0,-i),h){t=this._layer.getWidth()/l,this._pixiContainer.scale.set(t,t),this._pixiContainer.rotation=i;const u=m,d=-s,p=u*t*a-d*t*n,C=u*t*n+d*t*a;this._pixiContainer.position.x=this._layer.getWidth()/2-p,this._pixiContainer.position.y=this._layer.getHeight()/2-C}}}if(!h){t=this._layer.getCameraZoom(),this._pixiContainer.rotation=i,this._pixiContainer.scale.x=t,this._pixiContainer.scale.y=t;const l=this._layer.getCameraX()*t*a-this._layer.getCameraY()*t*n,c=this._layer.getCameraX()*t*n+this._layer.getCameraY()*t*a;this._pixiContainer.position.x=e.getViewportOriginX()-l,this._pixiContainer.position.y=e.getViewportOriginY()-c}r.getPixelsRounding()&&(a===0||n===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)))}updateResolution(){if(this._threeEffectComposer){const e=this._layer.getRuntimeScene().getGame();this._threeEffectComposer.setPixelRatio(window.devicePixelRatio),this._threeEffectComposer.setSize(e.getGameResolutionWidth(),e.getGameResolutionHeight())}}isCameraRotatedIn3D(){return this._threeCamera&&(this._threeCamera.rotation.x!==0||this._threeCamera.rotation.y!==0)}getCameraRotationY(){return this._threeCamera?_.toDegrees(this._threeCamera.rotation.y):0}setCameraRotationY(e){!this._threeCamera||(this._threeCamera.rotation.y=_.toRad(e),this.invalidateRotation())}getCameraRotationX(){return this._threeCamera?_.toDegrees(this._threeCamera.rotation.x):0}setCameraRotationX(e){!this._threeCamera||(this._threeCamera.rotation.x=_.toRad(e),this.invalidateRotation())}invalidateRotation(){this._basis&&(this._basis.isDirty=!0)}getCameraForwardX(){return this.getBasis().forwardX}getCameraForwardY(){return this.getBasis().forwardY}getCameraForwardZ(){return this.getBasis().forwardZ}getCameraUpX(){return this.getBasis().upX}getCameraUpY(){return this.getBasis().upY}getCameraUpZ(){return this.getBasis().upZ}getCameraRightX(){return this.getBasis().rightX}getCameraRightY(){return this.getBasis().rightY}getCameraRightZ(){return this.getBasis().rightZ}getBasis(){if(this._basis||(this._basis=new w),!this._basis.isDirty||!this._threeCamera)return this._basis;let e=_.LayerPixiRenderer.matrix4;e||(e=new THREE.Matrix4,_.LayerPixiRenderer.matrix4=e),e.makeRotationFromEuler(this._threeCamera.rotation);const r=e.elements;return this._basis.forwardX=-r[8],this._basis.forwardY=r[9],this._basis.forwardZ=-r[10],this._basis.rightX=r[0],this._basis.rightY=-r[1],this._basis.rightZ=r[2],this._basis.upX=r[4],this._basis.upY=-r[5],this._basis.upZ=r[6],this._basis}transformTo3DWorld(e,r,t,i,a){const n=this._threeCamera;if(!n)return a[0]=0,a[1]=0,a;const h=this._layer.getWidth(),l=this._layer.getHeight(),c=e/h*2-1,m=-(r/l)*2+1;let s=f.vectorForProjections;if(s||(s=new THREE.Vector3,f.vectorForProjections=s),n.updateMatrixWorld(),n instanceof THREE.OrthographicCamera){s.set(c,m,0),s.unproject(n);const u=new THREE.Vector3;n.getWorldDirection(u);const d=(t-s.z)/u.z;s.x+=d*u.x,s.y+=d*u.y}else{s.set(c,m,.5),s.unproject(n),s.sub(n.position).normalize();const u=(t-n.position.z)/s.z;s.x=u*s.x+n.position.x,s.y=u*s.y+n.position.y}return!Number.isFinite(s.x)||!Number.isFinite(s.y)?(a[0]=0,a[1]=0,a):(a[0]=s.x,a[1]=-s.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,r){const t=e;t.zIndex=r||f.zeroZOrderForPixi,this._pixiContainer.addChild(t)}changeRendererObjectZOrder(e,r){const t=e;t.zIndex=r}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){R.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 r=this._oldWidth,t=this._oldHeight,i=e.resolution;this._renderTexture=PIXI.RenderTexture.create({width:r||100,height:t||100,resolution:i}),this._renderTexture.baseTexture.scaleMode=PIXI.SCALE_MODES.LINEAR,R.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 r=e.renderTexture.current||void 0,t=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(r,t,void 0)}updateThreePlaneTextureFromPixiRenderTexture(e,r){if(!this._threePlaneTexture||!this._renderTexture)return;const t=this._renderTexture.baseTexture._glTextures[r.CONTEXT_UID];if(t){const i=e.properties.get(this._threePlaneTexture);i.__webglTexture=t.texture}}_setupLightingRendering(e,r){if(this._createPixiRenderTexture(e),!this._renderTexture)return;this._lightingSprite=new PIXI.Sprite(this._renderTexture),this._lightingSprite.blendMode=PIXI.BLEND_MODES.MULTIPLY;const t=r.getRendererObject();if(t){const i=t.getChildIndex(this._pixiContainer);t.addChildAt(this._lightingSprite,i),t.removeChild(this._pixiContainer)}}};let x=f;x.matrix4=null,x.zeroZOrderForPixi=Math.pow(2,-24),x.vectorForProjections=null,_.LayerPixiRenderer=x;class w{constructor(){this.isDirty=!0;this.forwardX=0;this.forwardY=0;this.forwardZ=0;this.upX=0;this.upY=0;this.upZ=0;this.rightX=0;this.rightY=0;this.rightZ=0}}_.LayerRenderer=_.LayerPixiRenderer})(gdjs||(gdjs={}));
//# sourceMappingURL=layer-pixi-renderer.js.map