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"; import { ReplayRecorder } from './replayRecorder'; import { Tools } from '../tools'; export class GlobalState { public onSelectionChangedObservable: Observable; public onPropertyChangedObservable: Observable; public onInspectorClosedObservable = new Observable(); public onTabChangedObservable = new Observable(); public onPluginActivatedObserver: Nullable>; public sceneImportDefaults: { [key: string]: any } = {}; 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 selectedLineContainerTitle = ""; public recorder = new ReplayRecorder(); private _onlyUseEulers: Nullable = null; public get onlyUseEulers(): boolean { if (this._onlyUseEulers === null) { this._onlyUseEulers = Tools.ReadLocalBooleanSettings("settings_onlyUseEulers", true); } return this._onlyUseEulers!; } public set onlyUseEulers(value: boolean) { this._onlyUseEulers = value; Tools.StoreLocalBooleanSettings("settings_onlyUseEulers", value); } private _ignoreBackfacesForPicking: Nullable = null; public get ignoreBackfacesForPicking(): boolean { if (this._ignoreBackfacesForPicking === null) { this._ignoreBackfacesForPicking = Tools.ReadLocalBooleanSettings("settings_ignoreBackfacesForPicking", false); } return this._ignoreBackfacesForPicking!; } public set ignoreBackfacesForPicking(value: boolean) { this._ignoreBackfacesForPicking = value; Tools.StoreLocalBooleanSettings("settings_ignoreBackfacesForPicking", value); } public init(propertyChangedObservable: Observable) { this.onPropertyChangedObservable = propertyChangedObservable; propertyChangedObservable.add(event => { this.recorder.record(event); }) } 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; light.reservedDataStore.lightGizmo.material.reservedDataStore = {hidden: true}; } } 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; } } }