|
@@ -0,0 +1,86 @@
|
|
|
|
+import { Nullable } from "babylonjs/types";
|
|
|
|
+import { TransformNode } from "babylonjs/Meshes/transformNode";
|
|
|
|
+import { Camera } from "babylonjs/Cameras/camera";
|
|
|
|
+
|
|
|
|
+import { IProperty } from 'babylonjs-gltf2interface';
|
|
|
|
+import { INode, ICamera, IMaterial } from "../glTFLoaderInterfaces";
|
|
|
|
+import { IGLTFLoaderExtension } from "../glTFLoaderExtension";
|
|
|
|
+import { GLTFLoader } from "../glTFLoader";
|
|
|
|
+import { Material } from 'babylonjs/Materials/material';
|
|
|
|
+
|
|
|
|
+const NAME = "ExtrasAsMetadata";
|
|
|
|
+
|
|
|
|
+interface ObjectWithMetadata {
|
|
|
|
+ metadata: any
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * Store glTF extras (if present) in BJS Object metadata
|
|
|
|
+ */
|
|
|
|
+export class ExtrasAsMetadata implements IGLTFLoaderExtension {
|
|
|
|
+ /** The name of this extension. */
|
|
|
|
+ public readonly name = NAME;
|
|
|
|
+
|
|
|
|
+ /** Defines whether this extension is enabled. */
|
|
|
|
+ public enabled = true;
|
|
|
|
+
|
|
|
|
+ private _loader: GLTFLoader;
|
|
|
|
+
|
|
|
|
+ private _assignExtras(babylonObject: ObjectWithMetadata, gltfProp: IProperty): void {
|
|
|
|
+ if (gltfProp.extras && Object.keys(gltfProp.extras).length > 0) {
|
|
|
|
+ if (!babylonObject.metadata) {
|
|
|
|
+ babylonObject.metadata = {};
|
|
|
|
+ }
|
|
|
|
+ Object.assign(babylonObject.metadata, gltfProp.extras);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /** @hidden */
|
|
|
|
+ public constructor(loader: GLTFLoader) {
|
|
|
|
+ this._loader = loader;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /** @hidden */
|
|
|
|
+ public dispose(): void {
|
|
|
|
+ delete this._loader;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /** @hidden */
|
|
|
|
+ public loadNodeAsync(
|
|
|
|
+ context: string,
|
|
|
|
+ node: INode,
|
|
|
|
+ assign: (babylonTransformNode: TransformNode) => void
|
|
|
|
+ ): Nullable<Promise<TransformNode>> {
|
|
|
|
+ return this._loader.loadNodeAsync(
|
|
|
|
+ context,
|
|
|
|
+ node,
|
|
|
|
+ (babylonTransformNode): void => {
|
|
|
|
+ this._assignExtras(babylonTransformNode, node);
|
|
|
|
+ assign(babylonTransformNode);
|
|
|
|
+ }
|
|
|
|
+ );
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /** @hidden */
|
|
|
|
+ public loadCameraAsync(context: string, camera: ICamera, assign: (babylonCamera: Camera) => void): Nullable<Promise<Camera>> {
|
|
|
|
+ return this._loader.loadCameraAsync(context, camera, (babylonCamera): void => {
|
|
|
|
+ this._assignExtras(babylonCamera, camera);
|
|
|
|
+ assign(babylonCamera);
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /** @hidden */
|
|
|
|
+ public createMaterial(context: string, material: IMaterial, babylonDrawMode: number): Nullable<Material> {
|
|
|
|
+ const babylonMaterial = this._loader.createMaterial(context, material, babylonDrawMode);
|
|
|
|
+ if(babylonMaterial) {
|
|
|
|
+ this._assignExtras(babylonMaterial, material);
|
|
|
|
+ }
|
|
|
|
+ return babylonMaterial;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+GLTFLoader.RegisterExtension(
|
|
|
|
+ NAME,
|
|
|
|
+ (loader): IGLTFLoaderExtension => new ExtrasAsMetadata(loader)
|
|
|
|
+);
|