import { GLTFFileLoader, IGLTFLoaderExtension } from "babylonjs-loaders/glTF/index"; import { IGLTFValidationResults } from "babylonjs-gltf2interface"; import { Nullable } from "babylonjs/types"; import { Observable, Observer } from "babylonjs/Misc/observable"; import { ISceneLoaderPlugin, ISceneLoaderPluginAsync } from "babylonjs/Loading/sceneLoader"; import { Scene } from "babylonjs/scene"; import { Light } from "babylonjs/Lights/light"; import { LightGizmo } from "babylonjs/Gizmos/lightGizmo"; import { PropertyChangedEvent } from "./propertyChangedEvent"; export class GlobalState { public onSelectionChangedObservable: Observable; public onPropertyChangedObservable: Observable; public onInspectorClosedObservable = new Observable(); public onTabChangedObservable = new Observable(); public onPluginActivatedObserver: Nullable>; public validationResults: IGLTFValidationResults; public onValidationResultsUpdatedObservable = new Observable(); public onExtensionLoadedObservable: Observable; public glTFLoaderExtensionDefaults: { [name: string]: { [key: string]: any } } = {}; public glTFLoaderDefaults: { [key: string]: any } = { "validate": true }; public blockMutationUpdates = false; public prepareGLTFPlugin(loader: GLTFFileLoader) { var loaderState = this.glTFLoaderDefaults; if (loaderState !== undefined) { for (const key in loaderState) { (loader as any)[key] = loaderState[key]; } } loader.onExtensionLoadedObservable.add((extension: IGLTFLoaderExtension) => { var extensionState = this.glTFLoaderExtensionDefaults[extension.name]; if (extensionState !== undefined) { for (const key in extensionState) { (extension as any)[key] = extensionState[key]; } } }); loader.onValidatedObservable.add((results: IGLTFValidationResults) => { this.validationResults = results; this.onValidationResultsUpdatedObservable.notifyObservers(results); if (results.issues.numErrors || results.issues.numWarnings) { this.onTabChangedObservable.notifyObservers(3); } }); } // Light gizmos public lightGizmos: Array = []; public enableLightGizmo(light: Light, enable = true) { if (enable) { if (!light.reservedDataStore) { light.reservedDataStore = {} } if (!light.reservedDataStore.lightGizmo) { light.reservedDataStore.lightGizmo = new LightGizmo(); this.lightGizmos.push(light.reservedDataStore.lightGizmo) light.reservedDataStore.lightGizmo.light = light; } } else if (light.reservedDataStore && light.reservedDataStore.lightGizmo) { this.lightGizmos.splice(this.lightGizmos.indexOf(light.reservedDataStore.lightGizmo), 1); light.reservedDataStore.lightGizmo.dispose(); light.reservedDataStore.lightGizmo = null; } } }