@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 7.21 kB
JavaScript
import{EventHandler as e}from"../../core/event-handler.js";import{sortPriority as t}from"../../core/sort.js";import{LAYERID_DEPTH as s}from"../constants.js";import{RenderAction as r}from"./render-action.js";class a extends e{constructor(e="Untitled"){super(),this.layerList=[],this.layerIdMap=new Map,this.layerNameMap=new Map,this.layerOpaqueIndexMap=new Map,this.layerTransparentIndexMap=new Map,this.subLayerList=[],this.subLayerEnabled=[],this.cameras=[],this.camerasMap=new Map,this._renderActions=[],this._dirty=!1,this.name=e,this._opaqueOrder={},this._transparentOrder={}}destroy(){this.destroyRenderActions()}destroyRenderActions(){this._renderActions.forEach((e=>e.destroy())),this._renderActions.length=0}_update(){const e=this.layerList.length;if(!this._dirty)for(let t=0;t<e;t++)if(this.layerList[t]._dirtyComposition){this._dirty=!0;break}if(this._dirty){this._dirty=!1,this.cameras.length=0;for(let t=0;t<e;t++){const e=this.layerList[t];e._dirtyComposition=!1;for(let t=0;t<e.cameras.length;t++){const s=e.cameras[t];this.cameras.indexOf(s)<0&&this.cameras.push(s)}}this.cameras.length>1&&t(this.cameras),this.camerasMap.clear();for(let e=0;e<this.cameras.length;e++)this.camerasMap.set(this.cameras[e],e);let s=0;this.destroyRenderActions();for(let t=0;t<this.cameras.length;t++){const r=this.cameras[t];if(r.camera.renderPasses.length>0){this.addDummyRenderAction(s,r),s++;continue}let a=!0;const i=s;let n=null,h=!1;for(let t=0;t<e;t++){const e=this.layerList[t];if(e.enabled&&this.subLayerEnabled[t]&&e.cameras.length>0&&r.layers.indexOf(e.id)>=0){h||e.id!==r.disablePostEffectsLayer||(h=!0,n&&(n.triggerPostprocess=!0));const i=this.subLayerList[t];n=this.addRenderAction(s,e,i,r,a,h),s++,a=!1}}i<s&&(n.lastCameraUse=!0),!h&&n&&(n.triggerPostprocess=!0),r.renderTarget&&r.postEffectsEnabled&&this.propagateRenderTarget(i-1,r)}this._logRenderActions()}}getNextRenderAction(e){const t=new r;return this._renderActions.push(t),t}addDummyRenderAction(e,t){const s=this.getNextRenderAction(e);s.camera=t,s.useCameraPasses=!0}addRenderAction(e,t,r,a,i,n){let h=t.renderTarget;a&&a.renderTarget&&t.id!==s&&(h=a.renderTarget);let d=!1;const l=this._renderActions;for(let t=e-1;t>=0;t--)if(l[t].camera===a&&l[t].renderTarget===h){d=!0;break}n&&a.postEffectsEnabled&&(h=null);const p=this.getNextRenderAction(e);p.triggerPostprocess=!1,p.layer=t,p.transparent=r,p.camera=a,p.renderTarget=h,p.firstCameraUse=i,p.lastCameraUse=!1;const y=i||!d,u=t.clearColorBuffer||t.clearDepthBuffer||t.clearStencilBuffer;return(y||u)&&p.setupClears(y?a:void 0,t),p}propagateRenderTarget(e,t){for(let r=e;r>=0;r--){const e=this._renderActions[r],a=e.layer;if(e.renderTarget&&a.id!==s)break;if(a.id===s)continue;if(e.useCameraPasses)break;const i=null==e?void 0:e.camera.camera;if(i&&(!t.camera.rect.equals(i.rect)||!t.camera.scissorRect.equals(i.scissorRect)))break;e.renderTarget=t.renderTarget}}_logRenderActions(){}_isLayerAdded(e){return this.layerIdMap.get(e.id)===e}_isSublayerAdded(e,t){return void 0!==(t?this.layerTransparentIndexMap:this.layerOpaqueIndexMap).get(e)}push(e){this._isLayerAdded(e)||(this.layerList.push(e),this.layerList.push(e),this._opaqueOrder[e.id]=this.subLayerList.push(!1)-1,this._transparentOrder[e.id]=this.subLayerList.push(!0)-1,this.subLayerEnabled.push(!0),this.subLayerEnabled.push(!0),this._updateLayerMaps(),this._dirty=!0,this.fire("add",e))}insert(e,t){if(this._isLayerAdded(e))return;this.layerList.splice(t,0,e,e),this.subLayerList.splice(t,0,!1,!0);const s=this.layerList.length;this._updateOpaqueOrder(t,s-1),this._updateTransparentOrder(t,s-1),this.subLayerEnabled.splice(t,0,!0,!0),this._updateLayerMaps(),this._dirty=!0,this.fire("add",e)}remove(e){let t=this.layerList.indexOf(e);for(delete this._opaqueOrder[t],delete this._transparentOrder[t];t>=0;)this.layerList.splice(t,1),this.subLayerList.splice(t,1),this.subLayerEnabled.splice(t,1),t=this.layerList.indexOf(e),this._dirty=!0,this.fire("remove",e);const s=this.layerList.length;this._updateOpaqueOrder(0,s-1),this._updateTransparentOrder(0,s-1),this._updateLayerMaps()}pushOpaque(e){this._isSublayerAdded(e,!1)||(this.layerList.push(e),this._opaqueOrder[e.id]=this.subLayerList.push(!1)-1,this.subLayerEnabled.push(!0),this._updateLayerMaps(),this._dirty=!0,this.fire("add",e))}insertOpaque(e,t){if(this._isSublayerAdded(e,!1))return;this.layerList.splice(t,0,e),this.subLayerList.splice(t,0,!1);const s=this.subLayerList.length;this._updateOpaqueOrder(t,s-1),this.subLayerEnabled.splice(t,0,!0),this._updateLayerMaps(),this._dirty=!0,this.fire("add",e)}removeOpaque(e){for(let t=0,s=this.layerList.length;t<s;t++)if(this.layerList[t]===e&&!this.subLayerList[t]){this.layerList.splice(t,1),this.subLayerList.splice(t,1),s--,this._updateOpaqueOrder(t,s-1),this.subLayerEnabled.splice(t,1),this._dirty=!0,this.layerList.indexOf(e)<0&&this.fire("remove",e);break}this._updateLayerMaps()}pushTransparent(e){this._isSublayerAdded(e,!0)||(this.layerList.push(e),this._transparentOrder[e.id]=this.subLayerList.push(!0)-1,this.subLayerEnabled.push(!0),this._updateLayerMaps(),this._dirty=!0,this.fire("add",e))}insertTransparent(e,t){if(this._isSublayerAdded(e,!0))return;this.layerList.splice(t,0,e),this.subLayerList.splice(t,0,!0);const s=this.subLayerList.length;this._updateTransparentOrder(t,s-1),this.subLayerEnabled.splice(t,0,!0),this._updateLayerMaps(),this._dirty=!0,this.fire("add",e)}removeTransparent(e){for(let t=0,s=this.layerList.length;t<s;t++)if(this.layerList[t]===e&&this.subLayerList[t]){this.layerList.splice(t,1),this.subLayerList.splice(t,1),s--,this._updateTransparentOrder(t,s-1),this.subLayerEnabled.splice(t,1),this._dirty=!0,this.layerList.indexOf(e)<0&&this.fire("remove",e);break}this._updateLayerMaps()}getOpaqueIndex(e){var t;return null!=(t=this.layerOpaqueIndexMap.get(e))?t:-1}getTransparentIndex(e){var t;return null!=(t=this.layerTransparentIndexMap.get(e))?t:-1}isEnabled(e,t){const s=t?this.getTransparentIndex(e):this.getOpaqueIndex(e);return this.subLayerEnabled[s]}_updateLayerMaps(){this.layerIdMap.clear(),this.layerNameMap.clear(),this.layerOpaqueIndexMap.clear(),this.layerTransparentIndexMap.clear();for(let e=0;e<this.layerList.length;e++){const t=this.layerList[e];this.layerIdMap.set(t.id,t),this.layerNameMap.set(t.name,t);(this.subLayerList[e]?this.layerTransparentIndexMap:this.layerOpaqueIndexMap).set(t,e)}}getLayerById(e){var t;return null!=(t=this.layerIdMap.get(e))?t:null}getLayerByName(e){var t;return null!=(t=this.layerNameMap.get(e))?t:null}_updateOpaqueOrder(e,t){for(let s=e;s<=t;s++)!1===this.subLayerList[s]&&(this._opaqueOrder[this.layerList[s].id]=s)}_updateTransparentOrder(e,t){for(let s=e;s<=t;s++)!0===this.subLayerList[s]&&(this._transparentOrder[this.layerList[s].id]=s)}_sortLayersDescending(e,t,s){let r=-1,a=-1;for(let t=0,a=e.length;t<a;t++){const a=e[t];s.hasOwnProperty(a)&&(r=Math.max(r,s[a]))}for(let e=0,r=t.length;e<r;e++){const r=t[e];s.hasOwnProperty(r)&&(a=Math.max(a,s[r]))}return-1===r&&-1!==a?1:-1===a&&-1!==r?-1:a-r}sortTransparentLayers(e,t){return this._sortLayersDescending(e,t,this._transparentOrder)}sortOpaqueLayers(e,t){return this._sortLayersDescending(e,t,this._opaqueOrder)}}export{a as LayerComposition};