@expofp/floorplan
Version:
Interactive floor plan library for expos and events
2 lines (1 loc) • 3.02 kB
JavaScript
import{Renderer as c}from"@expofp/renderer";import{HandlerRegistry as a}from"./HandlerRegistry";import{loadCustomFontsUrls as u}from"./index";import d from"../tools/logger";import{isDefaultScene as p}from"./engine-core/defs";export class RendererService{constructor(){this._renderer=null,this._scene=null,this._fontUrls=[],this.requestRepaint=null,this.currentPtScale=null,this.ptScaleCorrection=1,this.rendererEventsCleanup=null,this.ptScaleRegistry=new a,this.rollRegistry=new a,this.layerImagesRegistry=new a}get renderer(){return this._renderer?.isInitialized?this._renderer:null}get scene(){return this._scene}get fontUrls(){return this._fontUrls}getCameraState(){if(!this._renderer?.isInitialized){d.warn("Renderer is not initialized. Cannot get camera state.");return}return this._renderer.controls.getCameraState()}get scale(){return this.currentPtScale!==null?this.currentPtScale:this._renderer?.isInitialized?this._renderer.controls.getCameraState()?.ptScale??1:1}get angle(){return this._renderer?.isInitialized?this._renderer.controls.getCameraState()?.roll??0:0}create(e){return this._renderer=new c(e),this._fontUrls=u(),this.setupEventListeners(),this._renderer}start(e){if(this._scene=e,this.requestRepaint=null,!this._renderer)throw new Error("RendererService: renderer is not created.");this._renderer.init(e),this._renderer.start()}attach(e,r,l,n=1){this._renderer=e,this._scene=r,this._fontUrls=u(),this.requestRepaint=l??null,this.ptScaleCorrection=n,this.setupEventListeners()}dispose(){this.rendererEventsCleanup?.(),this.rendererEventsCleanup=null,this.ptScaleRegistry.clear(),this.rollRegistry.clear(),this.layerImagesRegistry.clear(),this._renderer?.dispose(),this._renderer=null,this._scene=null,this._fontUrls=[],this.requestRepaint=null,this.currentPtScale=null,this.ptScaleCorrection=1}disposeIfCurrent(e){if(!e||this._renderer!==e){e?.dispose();return}this.dispose()}onPtScale(e,r){return this.ptScaleRegistry.register(e,r)}onRoll(e,r){return this.rollRegistry.register(e,r)}onLayerImages(e,r){return this.layerImagesRegistry.register(e,r)}update(...e){if(this._renderer){if(!this._renderer.isInitialized){d.warn("Renderer is not initialized. Cannot update.");return}this._renderer.update(...e),this.requestRepaint?.()}}setupEventListeners(){this.rendererEventsCleanup?.(),this.rendererEventsCleanup=null;const e=this._renderer;if(!e)return;const r=n=>{const{ptScale:t,sceneId:i}=f(n);if(!p(i)||!Number.isFinite(t))return;const o=t*this.ptScaleCorrection;this.currentPtScale=o;const h=[...this.ptScaleRegistry.invoke(o)];h.length&&this.update(...h)},l=n=>{if(!Number.isFinite(n))return;const t=[];for(const i of this.rollRegistry.invoke(n))Array.isArray(i)?t.push(...i):t.push(i);t.length&&this.update(...t)};e.events.addEventListener("viewport:ptscale",r),e.events.addEventListener("navigation:roll",l),this.rendererEventsCleanup=()=>{e.events.removeEventListener("viewport:ptscale",r),e.events.removeEventListener("navigation:roll",l)}}}function f(s){return typeof s=="number"?{ptScale:s}:s}