globalState.ts 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. export class GlobalState {
  11. public onSelectionChangedObservable: Observable<any>;
  12. public onPropertyChangedObservable: Observable<PropertyChangedEvent>;
  13. public onInspectorClosedObservable = new Observable<Scene>();
  14. public onTabChangedObservable = new Observable<number>();
  15. public onPluginActivatedObserver: Nullable<Observer<ISceneLoaderPlugin | ISceneLoaderPluginAsync>>;
  16. public validationResults: IGLTFValidationResults;
  17. public onValidationResultsUpdatedObservable = new Observable<IGLTFValidationResults>();
  18. public onExtensionLoadedObservable: Observable<IGLTFLoaderExtension>;
  19. public glTFLoaderExtensionDefaults: { [name: string]: { [key: string]: any } } = {};
  20. public glTFLoaderDefaults: { [key: string]: any } = { "validate": true };
  21. public blockMutationUpdates = false;
  22. public prepareGLTFPlugin(loader: GLTFFileLoader) {
  23. var loaderState = this.glTFLoaderDefaults;
  24. if (loaderState !== undefined) {
  25. for (const key in loaderState) {
  26. (loader as any)[key] = loaderState[key];
  27. }
  28. }
  29. loader.onExtensionLoadedObservable.add((extension: IGLTFLoaderExtension) => {
  30. var extensionState = this.glTFLoaderExtensionDefaults[extension.name];
  31. if (extensionState !== undefined) {
  32. for (const key in extensionState) {
  33. (extension as any)[key] = extensionState[key];
  34. }
  35. }
  36. });
  37. loader.onValidatedObservable.add((results: IGLTFValidationResults) => {
  38. this.validationResults = results;
  39. this.onValidationResultsUpdatedObservable.notifyObservers(results);
  40. if (results.issues.numErrors || results.issues.numWarnings) {
  41. this.onTabChangedObservable.notifyObservers(3);
  42. }
  43. });
  44. }
  45. // Light gizmos
  46. public lightGizmos: Array<LightGizmo> = [];
  47. public enableLightGizmo(light: Light, enable = true) {
  48. if (enable) {
  49. if (!light.reservedDataStore) {
  50. light.reservedDataStore = {}
  51. }
  52. if (!light.reservedDataStore.lightGizmo) {
  53. light.reservedDataStore.lightGizmo = new LightGizmo();
  54. this.lightGizmos.push(light.reservedDataStore.lightGizmo)
  55. light.reservedDataStore.lightGizmo.light = light;
  56. }
  57. } else if (light.reservedDataStore && light.reservedDataStore.lightGizmo) {
  58. this.lightGizmos.splice(this.lightGizmos.indexOf(light.reservedDataStore.lightGizmo), 1);
  59. light.reservedDataStore.lightGizmo.dispose();
  60. light.reservedDataStore.lightGizmo = null;
  61. }
  62. }
  63. }