ExtrasAsMetadata.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import { Nullable } from "babylonjs/types";
  2. import { TransformNode } from "babylonjs/Meshes/transformNode";
  3. import { Camera } from "babylonjs/Cameras/camera";
  4. import { IProperty } from "babylonjs-gltf2interface";
  5. import { INode, ICamera, IMaterial } from "../glTFLoaderInterfaces";
  6. import { IGLTFLoaderExtension } from "../glTFLoaderExtension";
  7. import { GLTFLoader } from "../glTFLoader";
  8. import { Material } from "babylonjs/Materials/material";
  9. const NAME = "ExtrasAsMetadata";
  10. interface ObjectWithMetadata {
  11. metadata: any;
  12. }
  13. /**
  14. * Store glTF extras (if present) in BJS objects' metadata
  15. */
  16. export class ExtrasAsMetadata implements IGLTFLoaderExtension {
  17. /**
  18. * The name of this extension.
  19. */
  20. public readonly name = NAME;
  21. /**
  22. * Defines whether this extension is enabled.
  23. */
  24. public enabled = true;
  25. private _loader: GLTFLoader;
  26. private _assignExtras(
  27. babylonObject: ObjectWithMetadata,
  28. gltfProp: IProperty
  29. ): void {
  30. if (gltfProp.extras && Object.keys(gltfProp.extras).length > 0) {
  31. const metadata = (babylonObject.metadata = babylonObject.metadata || {});
  32. const gltf = (metadata.gltf = metadata.gltf || {});
  33. gltf.extras = gltfProp.extras;
  34. }
  35. }
  36. /** @hidden */
  37. public constructor(loader: GLTFLoader) {
  38. this._loader = loader;
  39. }
  40. /** @hidden */
  41. public dispose(): void {
  42. delete this._loader;
  43. }
  44. /** @hidden */
  45. public loadNodeAsync(
  46. context: string,
  47. node: INode,
  48. assign: (babylonTransformNode: TransformNode) => void
  49. ): Nullable<Promise<TransformNode>> {
  50. return this._loader.loadNodeAsync(
  51. context,
  52. node,
  53. (babylonTransformNode): void => {
  54. this._assignExtras(babylonTransformNode, node);
  55. assign(babylonTransformNode);
  56. }
  57. );
  58. }
  59. /** @hidden */
  60. public loadCameraAsync(
  61. context: string,
  62. camera: ICamera,
  63. assign: (babylonCamera: Camera) => void
  64. ): Nullable<Promise<Camera>> {
  65. return this._loader.loadCameraAsync(
  66. context,
  67. camera,
  68. (babylonCamera): void => {
  69. this._assignExtras(babylonCamera, camera);
  70. assign(babylonCamera);
  71. }
  72. );
  73. }
  74. /** @hidden */
  75. public createMaterial(
  76. context: string,
  77. material: IMaterial,
  78. babylonDrawMode: number
  79. ): Nullable<Material> {
  80. const babylonMaterial = this._loader.createMaterial(
  81. context,
  82. material,
  83. babylonDrawMode
  84. );
  85. this._assignExtras(babylonMaterial, material);
  86. return babylonMaterial;
  87. }
  88. }
  89. GLTFLoader.RegisterExtension(
  90. NAME,
  91. (loader): IGLTFLoaderExtension => new ExtrasAsMetadata(loader)
  92. );