UNPKG

@expofp/floorplan

Version:

Interactive floor plan library for expos and events

2 lines (1 loc) 2.85 kB
import{Renderer as h}from"@expofp/renderer";import{HandlerRegistry as a}from"./HandlerRegistry";import{loadCustomFontsUrls as o}from"./index";import d from"../tools/logger";import{isDefaultScene as c}from"./engine-core/defs";export class RendererService{_renderer=null;_scene=null;_fontUrls=[];requestRepaint=null;currentPtScale=null;rendererEventsCleanup=null;ptScaleRegistry=new a;rollRegistry=new a;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 h(e),this._fontUrls=o(),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,s){this._renderer=e,this._scene=r,this._fontUrls=o(),this.requestRepaint=s??null,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}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=l=>{const{ptScale:t,sceneId:n}=p(l);if(!c(n)||!Number.isFinite(t))return;this.currentPtScale=t;const u=[...this.ptScaleRegistry.invoke(t)];u.length&&this.update(...u)},s=l=>{if(!Number.isFinite(l))return;const t=[];for(const n of this.rollRegistry.invoke(l))Array.isArray(n)?t.push(...n):t.push(n);t.length&&this.update(...t)};e.events.addEventListener("viewport:ptscale",r),e.events.addEventListener("navigation:roll",s),this.rendererEventsCleanup=()=>{e.events.removeEventListener("viewport:ptscale",r),e.events.removeEventListener("navigation:roll",s)}}}function p(i){return typeof i=="number"?{ptScale:i}:i}