ecspresso
Version:
A minimal Entity-Component-System library for typescript and javascript.
5 lines (3 loc) • 8.76 kB
JavaScript
var h=((Q)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(Q,{get:($,K)=>(typeof require<"u"?require:$)[K]}):Q)(function(Q){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+Q+'" is not supported')});import{definePlugin as d}from"ecspresso";import{createTransformPlugin as l}from"ecspresso/plugins/spatial/transform";import{createBounds as I}from"ecspresso/plugins/spatial/bounds";import{createTransform as ZF,createLocalTransform as _F,createWorldTransform as $F,DEFAULT_LOCAL_TRANSFORM as zF,DEFAULT_WORLD_TRANSFORM as DF}from"ecspresso/plugins/spatial/transform";async function c(Q){let{Application:$}=await import("pixi.js"),K=new $;return await K.init({preference:"webgpu",...Q}),K}function L(Q,$){let K=$?.scale,M=typeof K==="number"?K:K?.x??1,q=typeof K==="number"?K:K?.y??1;return{x:Q?.x??0,y:Q?.y??0,rotation:$?.rotation??0,scaleX:M,scaleY:q}}function H(Q){return{visible:Q?.visible??!0,alpha:Q?.alpha}}function i(Q,$,K){if(K?.anchor)Q.anchor.set(K.anchor.x,K.anchor.y);return{sprite:Q,localTransform:L($,K),worldTransform:L($,K),visible:H(K)}}function t(Q,$,K){return{graphics:Q,localTransform:L($,K),worldTransform:L($,K),visible:H(K)}}function e(Q,$,K){return{container:Q,localTransform:L($,K),worldTransform:L($,K),visible:H(K)}}var p={fit:(Q,$)=>{let K=Math.min(Q,$);return{scaleX:K,scaleY:K}},cover:(Q,$)=>{let K=Math.max(Q,$);return{scaleX:K,scaleY:K}},stretch:(Q,$)=>({scaleX:Q,scaleY:$})};function u(Q,$,K,M,q){let W=Q/K,P=$/M,{scaleX:j,scaleY:R}=p[q](W,P);return{scaleX:j,scaleY:R,offsetX:(Q-K*j)/2,offsetY:($-M*R)/2,physicalWidth:Q,physicalHeight:$,mode:q,designWidth:K,designHeight:M}}function a(Q,$,K){return{x:(Q-K.offsetX)/K.scaleX,y:($-K.offsetY)/K.scaleY}}function FF(Q,$,K,M){let q=K.getBoundingClientRect(),W=(Q-q.left)*(M.physicalWidth/q.width),P=($-q.top)*(M.physicalHeight/q.height);return a(W,P,M)}function JF(Q){Q.renderer.emit("resize",Q.screen.width,Q.screen.height,Q.renderer.resolution)}function KF(Q){let{rootContainer:$,systemGroup:K="renderer2d",renderSyncPriority:M=500,transform:q,startLoop:W=!0,renderLayers:P=[],screenSpaceLayers:j=[],camera:R=!1,screenScale:f}=Q,G=f!==void 0,V=f?.width??0,X=f?.height??0,S=f?.mode??"fit",Y=new Map,x=new Map,C=new Set(j),v=()=>{throw Error("renderer2D: createLayerContainer called before initialization")},O=null;function m(_,F){let Z=x.get(_);if(Z)return Z;let U=v(`layer:${_}`);return x.set(_,U),(O&&C.has(_)?O:F).addChild(U),U}function g(_,F){let Z=F.getResource("rootContainer"),U=F.getComponent(_,"renderLayer");if(U)return m(U,Z);return Z}function b(_,F,Z){let U=g(_,Z);if(F.parent!==U)U.addChild(F)}function T(_,F){let Z=Y.get(_);if(!Z)return;let U=g(_,F);if(Z.parent!==U)Z.removeFromParent(),U.addChild(Z)}let y=!(("app"in Q)&&Q.app!==void 0);return d("renderer2d").withComponentTypes().withEventTypes().withResourceTypes().withLabels().withGroups().withReactiveQueryNames().install((_)=>{if(_.installPlugin(l(q)),y){let F=Q,{pixiInit:Z,background:U,width:z,height:D}=F,J=F.container??document.body,k=typeof J==="string"?document.querySelector(J):J,B={...Z,...U!==void 0&&{background:U},...z!==void 0&&{width:z},...D!==void 0&&{height:D}},E=k!==null&&B.resizeTo===void 0&&B.width===void 0&&B.height===void 0,w={...B,...E&&{resizeTo:k}};if(_.addResource("pixiApp",async()=>{let N=await c(w);if(k)k.appendChild(N.canvas);else if(typeof J==="string")console.warn(`Renderer2D plugin: container selector "${J}" not found`);return N}),_.addResource("rootContainer",{dependsOn:["pixiApp"],factory:(N)=>$??N.getResource("pixiApp").stage}),_.addResource("bounds",{dependsOn:["pixiApp"],factory:(N)=>{if(G)return I(V,X);let A=N.getResource("pixiApp");return I(A.screen.width,A.screen.height)}}),G)_.addResource("viewportScale",{dependsOn:["pixiApp"],factory:(N)=>{let A=N.getResource("pixiApp");return u(A.screen.width,A.screen.height,V,X,S)}})}else{let F=Q.app;if(_.addResource("pixiApp",F),_.addResource("rootContainer",$??F.stage),_.addResource("bounds",G?I(V,X):I(F.screen.width,F.screen.height)),G)_.addResource("viewportScale",u(F.screen.width,F.screen.height,V,X,S))}if(_.registerDispose("sprite",({value:F})=>{F.removeFromParent()}),_.registerDispose("graphics",({value:F})=>{F.removeFromParent()}),_.registerDispose("container",({value:F})=>{F.removeFromParent()}),_.registerRequired("sprite","localTransform",()=>L()),_.registerRequired("sprite","visible",()=>H()),_.registerRequired("graphics","localTransform",()=>L()),_.registerRequired("graphics","visible",()=>H()),_.registerRequired("container","localTransform",()=>L()),_.registerRequired("container","visible",()=>H()),_.addSystem("renderer2d-sync").setPriority(M).inPhase("render").inGroup(K).addQuery("sprites",{with:["sprite","worldTransform","visible"],changed:["worldTransform"]}).addQuery("graphics",{with:["graphics","worldTransform","visible"],changed:["worldTransform"]}).addQuery("containers",{with:["container","worldTransform","visible"],changed:["worldTransform"]}).setProcess(({queries:F})=>{for(let Z of F.sprites){let{sprite:U,worldTransform:z,visible:D}=Z.components;if(U.position.set(z.x,z.y),U.rotation=z.rotation,U.scale.set(z.scaleX,z.scaleY),U.visible=D.visible,D.alpha!==void 0)U.alpha=D.alpha}for(let Z of F.graphics){let{graphics:U,worldTransform:z,visible:D}=Z.components;if(U.position.set(z.x,z.y),U.rotation=z.rotation,U.scale.set(z.scaleX,z.scaleY),U.visible=D.visible,D.alpha!==void 0)U.alpha=D.alpha}for(let Z of F.containers){let{container:U,worldTransform:z,visible:D}=Z.components;if(U.position.set(z.x,z.y),U.rotation=z.rotation,U.scale.set(z.scaleX,z.scaleY),U.visible=D.visible,D.alpha!==void 0)U.alpha=D.alpha}}),_.addSystem("renderer2d-scene-graph").setPriority(9999).inGroup(K).setOnInitialize(async(F)=>{let Z=F.getResource("pixiApp"),U=F.getResource("rootContainer"),{Container:z}=await import("pixi.js");v=(J)=>{let k=new z;return k.label=J,k};let D;if(G){D=new z,D.label="viewportContainer";let J=F.tryGetResource("viewportScale");if(!J)throw Error("renderer2D: viewportScale resource not found");D.position.set(J.offsetX,J.offsetY),D.scale.set(J.scaleX,J.scaleY);let k=new z;k.label="rootContainer",Z.stage.addChild(D),D.addChild(k),F.updateResource("rootContainer",()=>k),U=k}if(R&&C.size>0){if(U===Z.stage){let J=new z;J.label="rootContainer",Z.stage.addChild(J),F.updateResource("rootContainer",()=>J),U=J}O=U.parent??Z.stage}for(let J of P)m(J,U);if(F.addReactiveQuery("renderer2d-sprites",{with:["sprite"],onEnter:(J)=>{let k=J.components.sprite;Y.set(J.id,k),b(J.id,k,F)},onExit:(J)=>{Y.delete(J)}}),F.addReactiveQuery("renderer2d-graphics",{with:["graphics"],onEnter:(J)=>{let k=J.components.graphics;Y.set(J.id,k),b(J.id,k,F)},onExit:(J)=>{Y.delete(J)}}),F.addReactiveQuery("renderer2d-containers",{with:["container"],onEnter:(J)=>{let k=J.components.container;Y.set(J.id,k),b(J.id,k,F)},onExit:(J)=>{Y.delete(J)}}),F.on("hierarchyChanged",({entityId:J})=>{T(J,F)}),F.onComponentAdded("renderLayer",({entity:J})=>{T(J.id,F)}),F.onComponentRemoved("renderLayer",({entity:J})=>{T(J.id,F)}),R){let J=F.tryGetResource("cameraState");if(!J)throw Error("renderer2D: cameraState resource not found");J.viewportWidth=G?V:Z.screen.width,J.viewportHeight=G?X:Z.screen.height}if(Z.renderer.on("resize",(J,k)=>{if(G){let B=F.tryGetResource("viewportScale");if(!B)throw Error("renderer2D: viewportScale resource not found");let E=u(J,k,V,X,B.mode);if(B.scaleX=E.scaleX,B.scaleY=E.scaleY,B.offsetX=E.offsetX,B.offsetY=E.offsetY,B.physicalWidth=J,B.physicalHeight=k,D)D.position.set(E.offsetX,E.offsetY),D.scale.set(E.scaleX,E.scaleY)}else{let B=F.getResource("bounds");if(B.width=J,B.height=k,R){let E=F.tryGetResource("cameraState");if(!E)throw Error("renderer2D: cameraState resource not found");E.viewportWidth=J,E.viewportHeight=k}}}),W)Z.ticker.add((J)=>{F.update(J.deltaMS/1000)})}),R)_.addSystem("renderer2d-camera-sync").setPriority(900).inPhase("render").inGroup(K).setProcess(({ecs:F})=>{let Z=F.tryGetResource("cameraState");if(!Z)throw Error("renderer2D: cameraState resource not found");let U=F.getResource("rootContainer"),[z,D]=G?[V,X]:[F.getResource("pixiApp").screen.width,F.getResource("pixiApp").screen.height];U.position.set(z/2-(Z.x+Z.shakeOffsetX)*Z.zoom,D/2-(Z.y+Z.shakeOffsetY)*Z.zoom),U.scale.set(Z.zoom),U.rotation=-(Z.rotation+Z.shakeRotation)})})}export{JF as reapplyViewportScale,a as physicalToLogical,$F as createWorldTransform,ZF as createTransform,i as createSpriteComponents,KF as createRenderer2DPlugin,_F as createLocalTransform,t as createGraphicsComponents,e as createContainerComponents,u as computeViewportScale,FF as clientToLogical,DF as DEFAULT_WORLD_TRANSFORM,zF as DEFAULT_LOCAL_TRANSFORM};
//# debugId=E2C12784688031C064756E2164756E21
//# sourceMappingURL=renderer2D.js.map