@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 20.7 kB
JavaScript
import{platform as e}from"../core/platform.js";import{now as t}from"../core/time.js";import{path as s}from"../core/path.js";import{EventHandler as i}from"../core/event-handler.js";import{Color as r}from"../core/math/color.js";import{Mat4 as a}from"../core/math/mat4.js";import{math as n}from"../core/math/math.js";import{Quat as h}from"../core/math/quat.js";import{Vec3 as o}from"../core/math/vec3.js";import{PRIMITIVE_TRIANGLES as d,PRIMITIVE_TRISTRIP as l,PRIMITIVE_TRIFAN as c,CULLFACE_NONE as m}from"../platform/graphics/constants.js";import{http as p}from"../platform/net/http.js";import{LAYERID_WORLD as u,LAYERID_DEPTH as f,SORTMODE_NONE as y,LAYERID_SKYBOX as g,LAYERID_UI as _,SORTMODE_MANUAL as b,LAYERID_IMMEDIATE as w,SPECULAR_BLINN as v}from"../scene/constants.js";import{setProgramLibrary as x}from"../scene/shader-lib/get-program-library.js";import{ProgramLibrary as D}from"../scene/shader-lib/program-library.js";import{ForwardRenderer as L}from"../scene/renderer/forward-renderer.js";import{FrameGraph as T}from"../scene/frame-graph.js";import{AreaLightLuts as k}from"../scene/area-light-luts.js";import{Layer as M}from"../scene/layer.js";import{LayerComposition as C}from"../scene/composition/layer-composition.js";import{Scene as A}from"../scene/scene.js";import{Material as S}from"../scene/materials/material.js";import{StandardMaterial as I}from"../scene/materials/standard-material.js";import{setDefaultMaterial as j}from"../scene/materials/default-material.js";import{Asset as R}from"./asset/asset.js";import{AssetRegistry as P}from"./asset/asset-registry.js";import{BundleRegistry as F}from"./bundle/bundle-registry.js";import{ComponentSystemRegistry as H}from"./components/registry.js";import{BundleHandler as q}from"./handlers/bundle.js";import{ResourceLoader as z}from"./handlers/loader.js";import{I18n as E}from"./i18n/i18n.js";import{ScriptRegistry as U}from"./script/script-registry.js";import{Entity as O}from"./entity.js";import{SceneRegistry as W}from"./scene-registry.js";import{script as B}from"./script.js";import{ApplicationStats as G}from"./stats.js";import{FILLMODE_KEEP_ASPECT as $,RESOLUTION_FIXED as N,RESOLUTION_AUTO as Q,FILLMODE_FILL_WINDOW as V}from"./constants.js";import{getApplication as Y,setApplication as J}from"./globals.js";class K{constructor(e){this.length=e,this.count=0}inc(){this.count++}done(){return this.count===this.length}}let X=null;class Z extends i{constructor(e){super(),this.frameRequestId=void 0,Z._applications[e.id]=this,J(this),X=this,this._destroyRequested=!1,this._inFrameUpdate=!1,this._time=0,this.timeScale=1,this.maxDeltaTime=.1,this.frame=0,this.autoRender=!0,this.renderNextFrame=!1,this.useLegacyScriptAttributeCloning=B.legacy,this._librariesLoaded=!1,this._fillMode=$,this._resolutionMode=N,this._allowResize=!0,this.context=this}init(e){const t=e.graphicsDevice;this.graphicsDevice=t,this._initDefaultMaterial(),this._initProgramLibrary(),this.stats=new G(t),this._soundManager=e.soundManager,this.loader=new z(this),this._entityIndex={},this.scene=new A(t),this._registerSceneImmediate(this.scene),this.root=new O,this.root._enabledInHierarchy=!0,this.assets=new P(this.loader),e.assetPrefix&&(this.assets.prefix=e.assetPrefix),this.bundles=new F(this.assets),this.enableBundles="undefined"!=typeof TextDecoder,this.scriptsOrder=e.scriptsOrder||[],this.scripts=new U(this),this.i18n=new E(this),this.scenes=new W(this),this.defaultLayerWorld=new M({name:"World",id:u}),this.defaultLayerDepth=new M({name:"Depth",id:f,enabled:!1,opaqueSortMode:y}),this.defaultLayerSkybox=new M({name:"Skybox",id:g,opaqueSortMode:y}),this.defaultLayerUi=new M({name:"UI",id:_,transparentSortMode:b}),this.defaultLayerImmediate=new M({name:"Immediate",id:w,opaqueSortMode:y});const s=new C("default");s.pushOpaque(this.defaultLayerWorld),s.pushOpaque(this.defaultLayerDepth),s.pushOpaque(this.defaultLayerSkybox),s.pushTransparent(this.defaultLayerWorld),s.pushOpaque(this.defaultLayerImmediate),s.pushTransparent(this.defaultLayerImmediate),s.pushTransparent(this.defaultLayerUi),this.scene.layers=s,k.createPlaceholder(t),this.renderer=new L(t),this.renderer.scene=this.scene,this.frameGraph=new T,this.lightmapper=null,e.lightmapper&&(this.lightmapper=new e.lightmapper(t,this.root,this.scene,this.renderer,this.assets),this.once("prerender",this._firstBake,this)),this._batcher=null,e.batchManager&&(this._batcher=new e.batchManager(t,this.root,this.scene),this.once("prerender",this._firstBatch,this)),this.keyboard=e.keyboard||null,this.mouse=e.mouse||null,this.touch=e.touch||null,this.gamepads=e.gamepads||null,this.elementInput=e.elementInput||null,this.elementInput&&(this.elementInput.app=this),this.xr=e.xr?new e.xr(this):null,this.elementInput&&this.elementInput.attachSelectEvents(),this._inTools=!1,this._skyboxAsset=null,this._scriptPrefix=e.scriptPrefix||"",this.enableBundles&&this.loader.addHandler("bundle",new q(this)),e.resourceHandlers.forEach((e=>{const t=new e(this);this.loader.addHandler(t.handlerType,t)})),this.systems=new H,e.componentSystems.forEach((e=>{this.systems.add(new e(this))})),this._visibilityChangeHandler=this.onVisibilityChange.bind(this),"undefined"!=typeof document&&(void 0!==document.hidden?(this._hiddenAttr="hidden",document.addEventListener("visibilitychange",this._visibilityChangeHandler,!1)):void 0!==document.mozHidden?(this._hiddenAttr="mozHidden",document.addEventListener("mozvisibilitychange",this._visibilityChangeHandler,!1)):void 0!==document.msHidden?(this._hiddenAttr="msHidden",document.addEventListener("msvisibilitychange",this._visibilityChangeHandler,!1)):void 0!==document.webkitHidden&&(this._hiddenAttr="webkitHidden",document.addEventListener("webkitvisibilitychange",this._visibilityChangeHandler,!1))),this.tick=te(this)}static getApplication(e){return e?Z._applications[e]:Y()}_initDefaultMaterial(){const e=new I;e.name="Default Material",e.shadingModel=v,j(this.graphicsDevice,e)}_initProgramLibrary(){const e=new D(this.graphicsDevice,new I);x(this.graphicsDevice,e)}get soundManager(){return this._soundManager}get batcher(){return this._batcher}get fillMode(){return this._fillMode}get resolutionMode(){return this._resolutionMode}configure(e,t){p.get(e,((e,s)=>{if(e)return void t(e);const i=s.application_properties,r=s.scenes,a=s.assets;this._parseApplicationProperties(i,(e=>{this._parseScenes(r),this._parseAssets(a),t(e||null)}))}))}preload(e){this.fire("preload:start");const t=this.assets.list({preload:!0}),s=new K(t.length);let i=!1;const r=()=>{this.graphicsDevice&&!i&&s.done()&&(i=!0,this.fire("preload:end"),e())},a=t.length;if(s.length){const e=e=>{s.inc(),this.fire("preload:progress",s.count/a),s.done()&&r()},i=(e,t)=>{s.inc(),this.fire("preload:progress",s.count/a),s.done()&&r()};for(let n=0;n<t.length;n++)t[n].loaded?(s.inc(),this.fire("preload:progress",s.count/a),s.done()&&r()):(t[n].once("load",e),t[n].once("error",i),this.assets.load(t[n]))}else r()}_preloadScripts(e,t){if(!B.legacy)return void t();this.systems.script.preloading=!0;const i=this._getScriptReferences(e),r=i.length,a=new K(r),n=/^https?:\/\//;if(r){const e=(e,s)=>{e&&console.error(e),a.inc(),a.done()&&(this.systems.script.preloading=!1,t())};for(let t=0;t<r;t++){let r=i[t];!n.test(r.toLowerCase())&&this._scriptPrefix&&(r=s.join(this._scriptPrefix,i[t])),this.loader.load(r,"script",e)}}else this.systems.script.preloading=!1,t()}_parseApplicationProperties(e,t){if("number"==typeof e.maxAssetRetries&&e.maxAssetRetries>0&&this.loader.enableRetry(e.maxAssetRetries),e.useDevicePixelRatio||(e.useDevicePixelRatio=e.use_device_pixel_ratio),e.resolutionMode||(e.resolutionMode=e.resolution_mode),e.fillMode||(e.fillMode=e.fill_mode),this._width=e.width,this._height=e.height,e.useDevicePixelRatio&&(this.graphicsDevice.maxPixelRatio=window.devicePixelRatio),this.setCanvasResolution(e.resolutionMode,this._width,this._height),this.setCanvasFillMode(e.fillMode,this._width,this._height),e.layers&&e.layerOrder){const t=new C("application"),s={};for(const t in e.layers){const i=e.layers[t];i.id=parseInt(t,10),i.enabled=i.id!==f,s[t]=new M(i)}for(let i=0,r=e.layerOrder.length;i<r;i++){const r=e.layerOrder[i],a=s[r.layer];a&&(r.transparent?t.pushTransparent(a):t.pushOpaque(a),t.subLayerEnabled[i]=r.enabled)}this.scene.layers=t}if(e.batchGroups){const t=this.batcher;if(t)for(let s=0,i=e.batchGroups.length;s<i;s++){const i=e.batchGroups[s];t.addGroup(i.name,i.dynamic,i.maxAabbSize,i.id,i.layers)}}e.i18nAssets&&(this.i18n.assets=e.i18nAssets),this._loadLibraries(e.libraries,t)}_loadLibraries(e,t){const i=e.length;let r=i;const a=/^https?:\/\//;if(i){const n=(e,s)=>{r--,e?t(e):0===r&&(this.onLibrariesLoaded(),t(null))};for(let t=0;t<i;++t){let i=e[t];!a.test(i.toLowerCase())&&this._scriptPrefix&&(i=s.join(this._scriptPrefix,i)),this.loader.load(i,"script",n)}}else this.onLibrariesLoaded(),t(null)}_parseScenes(e){if(e)for(let t=0;t<e.length;t++)this.scenes.add(e[t].name,e[t].url)}_parseAssets(e){const t=[],s={},i={};if(B.legacy){if(this.enableBundles)for(const s in e)"bundle"===e[s].type&&(i[s]=!0,t.push(e[s]));for(const s in e)i[s]||t.push(e[s])}else{for(let i=0;i<this.scriptsOrder.length;i++){const r=this.scriptsOrder[i];e[r]&&(s[r]=!0,t.push(e[r]))}if(this.enableBundles)for(const s in e)"bundle"===e[s].type&&(i[s]=!0,t.push(e[s]));for(const r in e)s[r]||i[r]||t.push(e[r])}for(let e=0;e<t.length;e++){const s=t[e],i=new R(s.name,s.type,s.file,s.data);if(i.id=parseInt(s.id,10),i.preload=!!s.preload&&s.preload,i.loaded="script"===s.type&&s.data&&s.data.loadingType>0,i.tags.add(s.tags),s.i18n)for(const e in s.i18n)i.addLocalizedAssetId(e,s.i18n[e]);this.assets.add(i)}}_getScriptReferences(e){let t=[];e.settings.priority_scripts&&(t=e.settings.priority_scripts);const s=[],i={};for(let e=0;e<t.length;e++)s.push(t[e]),i[t[e]]=!0;const r=e.entities;for(const e in r){if(!r[e].components.script)continue;const t=r[e].components.script.scripts;for(let e=0;e<t.length;e++)i[t[e].url]||(s.push(t[e].url),i[t[e].url]=!0)}return s}start(){this.frame=0,this.fire("start",{timestamp:t(),target:this}),this._librariesLoaded||this.onLibrariesLoaded(),this.systems.fire("initialize",this.root),this.fire("initialize"),this.systems.fire("postInitialize",this.root),this.systems.fire("postPostInitialize",this.root),this.fire("postinitialize"),this.tick()}inputUpdate(e){this.controller&&this.controller.update(e),this.mouse&&this.mouse.update(),this.keyboard&&this.keyboard.update(),this.gamepads&&this.gamepads.update()}update(e){this.frame++,this.graphicsDevice.updateClientRect(),B.legacy&&this.systems.fire("fixedUpdate",1/60),this.systems.fire(this._inTools?"toolsUpdate":"update",e),this.systems.fire("animationUpdate",e),this.systems.fire("postUpdate",e),this.fire("update",e),this.inputUpdate(e)}frameStart(){this.graphicsDevice.frameStart()}frameEnd(){this.graphicsDevice.frameEnd()}render(){this.fire("prerender"),this.root.syncHierarchy(),this._batcher&&this._batcher.updateAll(),this.renderComposition(this.scene.layers),this.fire("postrender")}renderComposition(e){this.renderer.buildFrameGraph(this.frameGraph,e),this.frameGraph.render(this.graphicsDevice)}_fillFrameStatsBasic(e,t,s){const i=this.stats.frame;i.dt=t,i.ms=s,e>i._timeToCountFrames?(i.fps=i._fpsAccum,i._fpsAccum=0,i._timeToCountFrames=e+1e3):i._fpsAccum++,this.stats.drawCalls.total=this.graphicsDevice._drawCallsPerFrame,this.graphicsDevice._drawCallsPerFrame=0}_fillFrameStats(){let e=this.stats.frame;e.cameras=this.renderer._camerasRendered,e.materials=this.renderer._materialSwitches,e.shaders=this.graphicsDevice._shaderSwitchesPerFrame,e.shadowMapUpdates=this.renderer._shadowMapUpdates,e.shadowMapTime=this.renderer._shadowMapTime,e.depthMapTime=this.renderer._depthMapTime,e.forwardTime=this.renderer._forwardTime;const t=this.graphicsDevice._primsPerFrame;e.triangles=t[d]/3+Math.max(t[l]-2,0)+Math.max(t[c]-2,0),e.cullTime=this.renderer._cullTime,e.sortTime=this.renderer._sortTime,e.skinTime=this.renderer._skinTime,e.morphTime=this.renderer._morphTime,e.lightClusters=this.renderer._lightClusters,e.lightClustersTime=this.renderer._lightClustersTime,e.otherPrimitives=0;for(let s=0;s<t.length;s++)s<d&&(e.otherPrimitives+=t[s]),t[s]=0;this.renderer._camerasRendered=0,this.renderer._materialSwitches=0,this.renderer._shadowMapUpdates=0,this.graphicsDevice._shaderSwitchesPerFrame=0,this.renderer._cullTime=0,this.renderer._layerCompositionUpdateTime=0,this.renderer._lightClustersTime=0,this.renderer._sortTime=0,this.renderer._skinTime=0,this.renderer._morphTime=0,this.renderer._shadowMapTime=0,this.renderer._depthMapTime=0,this.renderer._forwardTime=0,e=this.stats.drawCalls,e.forward=this.renderer._forwardDrawCalls,e.culled=this.renderer._numDrawCallsCulled,e.depth=0,e.shadow=this.renderer._shadowDrawCalls,e.skinned=this.renderer._skinDrawCalls,e.immediate=0,e.instanced=0,e.removedByInstancing=0,e.misc=e.total-(e.forward+e.shadow),this.renderer._depthDrawCalls=0,this.renderer._shadowDrawCalls=0,this.renderer._forwardDrawCalls=0,this.renderer._numDrawCallsCulled=0,this.renderer._skinDrawCalls=0,this.renderer._immediateRendered=0,this.renderer._instancedDrawCalls=0,this.stats.misc.renderTargetCreationTime=this.graphicsDevice.renderTargetCreationTime,e=this.stats.particles,e.updatesPerFrame=e._updatesPerFrame,e.frameTime=e._frameTime,e._updatesPerFrame=0,e._frameTime=0}setCanvasFillMode(e,t,s){this._fillMode=e,this.resizeCanvas(t,s)}setCanvasResolution(e,t,s){this._resolutionMode=e,e===Q&&void 0===t&&(t=this.graphicsDevice.canvas.clientWidth,s=this.graphicsDevice.canvas.clientHeight),this.graphicsDevice.resizeCanvas(t,s)}isHidden(){return document[this._hiddenAttr]}onVisibilityChange(){this.isHidden()?this._soundManager&&this._soundManager.suspend():this._soundManager&&this._soundManager.resume()}resizeCanvas(e,t){if(!this._allowResize)return;if(this.xr&&this.xr.session)return;const s=window.innerWidth,i=window.innerHeight;if(this._fillMode===$){const r=this.graphicsDevice.canvas.width/this.graphicsDevice.canvas.height;r>s/i?t=(e=s)/r:e=(t=i)*r}else this._fillMode===V&&(e=s,t=i);return this.graphicsDevice.canvas.style.width=`${e}px`,this.graphicsDevice.canvas.style.height=`${t}px`,this.updateCanvasSize(),{width:e,height:t}}updateCanvasSize(){var e;if(this._allowResize&&(null==(e=this.xr)||!e.active)&&this._resolutionMode===Q){const e=this.graphicsDevice.canvas;this.graphicsDevice.resizeCanvas(e.clientWidth,e.clientHeight)}}onLibrariesLoaded(){this._librariesLoaded=!0,this.systems.rigidbody&&this.systems.rigidbody.onLibraryLoaded()}applySceneSettings(e){let t;if(this.systems.rigidbody&&"undefined"!=typeof Ammo){const t=e.physics.gravity;this.systems.rigidbody.gravity.set(t[0],t[1],t[2])}this.scene.applySettings(e),e.render.hasOwnProperty("skybox")&&(e.render.skybox?(t=this.assets.get(e.render.skybox),t?this.setSkybox(t):this.assets.once(`add:${e.render.skybox}`,this.setSkybox,this)):this.setSkybox(null))}setAreaLightLuts(e,t){e&&t&&k.set(this.graphicsDevice,e,t)}setSkybox(e){if(e!==this._skyboxAsset){const t=()=>{this.setSkybox(null)},s=()=>{this.scene.setSkybox(this._skyboxAsset?this._skyboxAsset.resources:null)};this._skyboxAsset&&(this.assets.off(`load:${this._skyboxAsset.id}`,s,this),this.assets.off(`remove:${this._skyboxAsset.id}`,t,this),this._skyboxAsset.off("change",s,this)),this._skyboxAsset=e,this._skyboxAsset&&(this.assets.on(`load:${this._skyboxAsset.id}`,s,this),this.assets.once(`remove:${this._skyboxAsset.id}`,t,this),this._skyboxAsset.on("change",s,this),0!==this.scene.skyboxMip||this._skyboxAsset.loadFaces||(this._skyboxAsset.loadFaces=!0),this.assets.load(this._skyboxAsset)),s()}}_firstBake(){var e;null==(e=this.lightmapper)||e.bake(null,this.scene.lightmapMode)}_firstBatch(){var e;null==(e=this.batcher)||e.generate()}_processTimestamp(e){return e}drawLine(e,t,s,i,r){this.scene.drawLine(e,t,s,i,r)}drawLines(e,t,s=!0,i=this.scene.defaultDrawLayer){this.scene.drawLines(e,t,s,i)}drawLineArrays(e,t,s=!0,i=this.scene.defaultDrawLayer){this.scene.drawLineArrays(e,t,s,i)}drawWireSphere(e,t,s=r.WHITE,i=20,a=!0,n=this.scene.defaultDrawLayer){this.scene.immediate.drawWireSphere(e,t,s,i,a,n)}drawWireAlignedBox(e,t,s=r.WHITE,i=!0,a=this.scene.defaultDrawLayer,n){this.scene.immediate.drawWireAlignedBox(e,t,s,i,a,n)}drawMeshInstance(e,t=this.scene.defaultDrawLayer){this.scene.immediate.drawMesh(null,null,null,e,t)}drawMesh(e,t,s,i=this.scene.defaultDrawLayer){this.scene.immediate.drawMesh(t,s,e,null,i)}drawQuad(e,t,s=this.scene.defaultDrawLayer){this.scene.immediate.drawMesh(t,e,this.scene.immediate.getQuadMesh(),null,s)}drawTexture(e,t,s,i,r,n,d=this.scene.defaultDrawLayer,l=!0){if(!1===l&&!this.graphicsDevice.isWebGPU)return;const c=new a;c.setTRS(new o(e,t,0),h.IDENTITY,new o(s,-i,0)),n||((n=new S).cull=m,n.setParameter("colorMap",r),n.shader=l?this.scene.immediate.getTextureShader():this.scene.immediate.getUnfilterableTextureShader(),n.update()),this.drawQuad(c,n,d)}drawDepthTexture(e,t,s,i,r=this.scene.defaultDrawLayer){const a=new S;a.cull=m,a.shader=this.scene.immediate.getDepthTextureShader(),a.update(),this.drawTexture(e,t,s,i,null,a,r)}destroy(){var e,t,s,i;if(this._inFrameUpdate)return void(this._destroyRequested=!0);const r=this.graphicsDevice.canvas.id;this.fire("destroy",this),this.off("librariesloaded"),"undefined"!=typeof document&&(document.removeEventListener("visibilitychange",this._visibilityChangeHandler,!1),document.removeEventListener("mozvisibilitychange",this._visibilityChangeHandler,!1),document.removeEventListener("msvisibilitychange",this._visibilityChangeHandler,!1),document.removeEventListener("webkitvisibilitychange",this._visibilityChangeHandler,!1)),this._visibilityChangeHandler=null,this.root.destroy(),this.root=null,this.mouse&&(this.mouse.off(),this.mouse.detach(),this.mouse=null),this.keyboard&&(this.keyboard.off(),this.keyboard.detach(),this.keyboard=null),this.touch&&(this.touch.off(),this.touch.detach(),this.touch=null),this.elementInput&&(this.elementInput.detach(),this.elementInput=null),this.gamepads&&(this.gamepads.destroy(),this.gamepads=null),this.controller&&(this.controller=null),this.systems.destroy(),this.scene.layers&&this.scene.layers.destroy();const a=this.assets.list();for(let e=0;e<a.length;e++)a[e].unload(),a[e].off();this.assets.off(),this.bundles.destroy(),this.bundles=null,this.i18n.destroy(),this.i18n=null;const n=this.loader.getHandler("script");null==n||n.clearCache(),this.loader.destroy(),this.loader=null,this.scene.destroy(),this.scene=null,this.systems=null,this.context=null,this.scripts.destroy(),this.scripts=null,this.scenes.destroy(),this.scenes=null,null==(e=this.lightmapper)||e.destroy(),this.lightmapper=null,this._batcher&&(this._batcher.destroy(),this._batcher=null),this._entityIndex={},this.defaultLayerDepth.onPreRenderOpaque=null,this.defaultLayerDepth.onPostRenderOpaque=null,this.defaultLayerDepth.onDisable=null,this.defaultLayerDepth.onEnable=null,this.defaultLayerDepth=null,this.defaultLayerWorld=null,null==(t=this.xr)||t.end(),null==(s=this.xr)||s.destroy(),this.renderer.destroy(),this.renderer=null,this.graphicsDevice.destroy(),this.graphicsDevice=null,this.tick=null,this.off(),null==(i=this._soundManager)||i.destroy(),this._soundManager=null,B.app=null,Z._applications[r]=null,Y()===this&&J(null),Z.cancelTick(this)}static cancelTick(e){e.frameRequestId&&(window.cancelAnimationFrame(e.frameRequestId),e.frameRequestId=void 0)}getEntityFromIndex(e){return this._entityIndex[e]}_registerSceneImmediate(e){this.on("postrender",e.immediate.onPostRender,e.immediate)}}Z._applications={};const ee={},te=function(s){const i=s;return function(s,r){var a,h;if(!i.graphicsDevice)return;i.frameRequestId&&(null==(h=i.xr)||null==(h=h.session)||h.cancelAnimationFrame(i.frameRequestId),cancelAnimationFrame(i.frameRequestId),i.frameRequestId=null);i._inFrameUpdate=!0,J(i),X=i;const o=i._processTimestamp(s)||t(),d=o-(i._time||o);let l=d/1e3;if(l=n.clamp(l,0,i.maxDeltaTime),l*=i.timeScale,i._time=o,null!=(a=i.xr)&&a.session?i.frameRequestId=i.xr.session.requestAnimationFrame(i.tick):i.frameRequestId=e.browser||e.worker?requestAnimationFrame(i.tick):null,i.graphicsDevice.contextLost)return;i._fillFrameStatsBasic(o,l,d),i.fire("frameupdate",d);let c=!0;var m;r?(c=null==(m=i.xr)?void 0:m.update(r),i.graphicsDevice.defaultFramebuffer=r.session.renderState.baseLayer.framebuffer):i.graphicsDevice.defaultFramebuffer=null;c&&(i.update(l),i.fire("framerender"),(i.autoRender||i.renderNextFrame)&&(i.updateCanvasSize(),i.frameStart(),i.render(),i.frameEnd(),i.renderNextFrame=!1),ee.timestamp=t(),ee.target=i,i.fire("frameend",ee)),i._inFrameUpdate=!1,i._destroyRequested&&i.destroy()}};export{Z as AppBase,X as app};