globalState.ts 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { GLTFFileLoader, IGLTFLoaderExtension } from "babylonjs-loaders/glTF/index";
  2. import { IGLTFValidationResults } from "babylonjs-gltf2interface";
  3. import { Nullable } from "babylonjs/types";
  4. import { Observable, Observer } from "babylonjs/Misc/observable";
  5. import { ISceneLoaderPlugin, ISceneLoaderPluginAsync } from "babylonjs/Loading/sceneLoader";
  6. import { Scene } from "babylonjs/scene";
  7. import { Light } from "babylonjs/Lights/light";
  8. import { LightGizmo } from "babylonjs/Gizmos/lightGizmo";
  9. import { PropertyChangedEvent } from "./propertyChangedEvent";
  10. import { ReplayRecorder } from './replayRecorder';
  11. export class GlobalState {
  12. public onSelectionChangedObservable: Observable<any>;
  13. public onPropertyChangedObservable: Observable<PropertyChangedEvent>;
  14. public onInspectorClosedObservable = new Observable<Scene>();
  15. public onTabChangedObservable = new Observable<number>();
  16. public onPluginActivatedObserver: Nullable<Observer<ISceneLoaderPlugin | ISceneLoaderPluginAsync>>;
  17. public validationResults: IGLTFValidationResults;
  18. public onValidationResultsUpdatedObservable = new Observable<IGLTFValidationResults>();
  19. public onExtensionLoadedObservable: Observable<IGLTFLoaderExtension>;
  20. public glTFLoaderExtensionDefaults: { [name: string]: { [key: string]: any } } = {};
  21. public glTFLoaderDefaults: { [key: string]: any } = { "validate": true };
  22. public blockMutationUpdates = false;
  23. public selectedLineContainerTitle = "";
  24. public recorder = new ReplayRecorder();
  25. public init(propertyChangedObservable: Observable<PropertyChangedEvent>) {
  26. this.onPropertyChangedObservable = propertyChangedObservable;
  27. propertyChangedObservable.add(event => {
  28. this.recorder.record(event);
  29. })
  30. }
  31. public prepareGLTFPlugin(loader: GLTFFileLoader) {
  32. var loaderState = this.glTFLoaderDefaults;
  33. if (loaderState !== undefined) {
  34. for (const key in loaderState) {
  35. (loader as any)[key] = loaderState[key];
  36. }
  37. }
  38. loader.onExtensionLoadedObservable.add((extension: IGLTFLoaderExtension) => {
  39. var extensionState = this.glTFLoaderExtensionDefaults[extension.name];
  40. if (extensionState !== undefined) {
  41. for (const key in extensionState) {
  42. (extension as any)[key] = extensionState[key];
  43. }
  44. }
  45. });
  46. loader.onValidatedObservable.add((results: IGLTFValidationResults) => {
  47. this.validationResults = results;
  48. this.onValidationResultsUpdatedObservable.notifyObservers(results);
  49. if (results.issues.numErrors || results.issues.numWarnings) {
  50. this.onTabChangedObservable.notifyObservers(3);
  51. }
  52. });
  53. }
  54. // Light gizmos
  55. public lightGizmos: Array<LightGizmo> = [];
  56. public enableLightGizmo(light: Light, enable = true) {
  57. if (enable) {
  58. if (!light.reservedDataStore) {
  59. light.reservedDataStore = {}
  60. }
  61. if (!light.reservedDataStore.lightGizmo) {
  62. light.reservedDataStore.lightGizmo = new LightGizmo();
  63. this.lightGizmos.push(light.reservedDataStore.lightGizmo)
  64. light.reservedDataStore.lightGizmo.light = light;
  65. }
  66. } else if (light.reservedDataStore && light.reservedDataStore.lightGizmo) {
  67. this.lightGizmos.splice(this.lightGizmos.indexOf(light.reservedDataStore.lightGizmo), 1);
  68. light.reservedDataStore.lightGizmo.dispose();
  69. light.reservedDataStore.lightGizmo = null;
  70. }
  71. }
  72. }