Forráskód Böngészése

Also handle extras for materials and cameras

- Updated test file to have extras for everything Blender is
able to export, including: object, mesh, camera, scene, material
Pelle Johnsen 6 éve
szülő
commit
a6b68257e0

BIN
Playground/scenes/Box/Box_extras.bin


+ 113 - 8
Playground/scenes/Box/Box_extras.gltf

@@ -1,19 +1,104 @@
 {
     "asset" : {
-        "generator" : "Khronos glTF Blender I/O v0.9.21",
+        "generator" : "Khronos glTF Blender I/O v0.9.28",
         "version" : "2.0"
     },
+    "extensionsUsed" : [
+        "KHR_lights_punctual"
+    ],
+    "extensionsRequired" : [
+        "KHR_lights_punctual"
+    ],
+    "extensions" : {
+        "KHR_lights_punctual" : {
+            "lights" : [
+                {
+                    "color" : [
+                        1,
+                        1,
+                        1
+                    ],
+                    "intensity" : 1000,
+                    "type" : "point",
+                    "name" : "Light"
+                }
+            ]
+        }
+    },
     "scene" : 0,
     "scenes" : [
         {
+            "extras" : {
+                "custom" : "sceneProp"
+            },
             "name" : "Scene",
             "nodes" : [
-                0
+                1,
+                3,
+                4
             ]
         }
     ],
     "nodes" : [
         {
+            "extensions" : {
+                "KHR_lights_punctual" : {
+                    "light" : 0
+                }
+            },
+            "name" : "Light_Orientation",
+            "rotation" : [
+                -0.7071067690849304,
+                0,
+                0,
+                0.7071067690849304
+            ]
+        },
+        {
+            "children" : [
+                0
+            ],
+            "name" : "Light",
+            "rotation" : [
+                0.16907575726509094,
+                0.7558803558349609,
+                -0.27217137813568115,
+                0.570947527885437
+            ],
+            "translation" : [
+                4.076245307922363,
+                5.903861999511719,
+                -1.0054539442062378
+            ]
+        },
+        {
+            "camera" : 0,
+            "name" : "Camera_Orientation",
+            "rotation" : [
+                -0.7071067690849304,
+                0,
+                0,
+                0.7071067690849304
+            ]
+        },
+        {
+            "children" : [
+                2
+            ],
+            "name" : "Camera",
+            "rotation" : [
+                0.483536034822464,
+                0.33687159419059753,
+                -0.20870360732078552,
+                0.7804827094078064
+            ],
+            "translation" : [
+                7.358891487121582,
+                4.958309173583984,
+                6.925790786743164
+            ]
+        },
+        {
             "extras" : {
                 "kind" : "nice cube",
                 "magic" : 42
@@ -21,16 +106,33 @@
             "mesh" : 0,
             "name" : "Box001",
             "rotation" : [
-                0.7071068286895752,
+                1,
                 0,
                 0,
-                0.7071067094802856
+                -1.3435885648505064e-07
             ]
         }
     ],
+    "cameras" : [
+        {
+            "extras" : {
+                "custom" : "cameraProp"
+            },
+            "name" : "Camera",
+            "perspective" : {
+                "yfov" : 0.39959652046304894,
+                "zfar" : 100,
+                "znear" : 0.10000000149011612
+            },
+            "type" : "perspective"
+        }
+    ],
     "materials" : [
         {
             "doubleSided" : true,
+            "extras" : {
+                "custom" : "materialProp"
+            },
             "name" : "01___Default",
             "pbrMetallicRoughness" : {
                 "baseColorTexture" : {
@@ -44,6 +146,9 @@
     ],
     "meshes" : [
         {
+            "extras" : {
+                "custom" : "meshProp"
+            },
             "name" : "Box001",
             "primitives" : [
                 {
@@ -77,13 +182,13 @@
             "count" : 24,
             "max" : [
                 13.23270034790039,
-                16.098499298095703,
-                0
+                0,
+                16.17329978942871
             ],
             "min" : [
                 -13.83899974822998,
-                -16.17329978942871,
-                -23.56559944152832
+                -23.56559944152832,
+                -16.098499298095703
             ],
             "type" : "VEC3"
         },

+ 1 - 1
dist/preview release/what's new.md

@@ -56,7 +56,7 @@
 ### Loaders
 - Added support for non-float accessors in animation data for glTF loader. ([bghgary](https://github.com/bghgary))
 - Support loading cube data in .basis loader ([TrevorDev](https://github.com/TrevorDev))
-- Load glTF nodes' extras into BJS metadata ([pjoe](https://github.com/pjoe))
+- Load glTF extras into BJS metadata ([pjoe](https://github.com/pjoe))
 
 ### Materials
 - Added `ShaderMaterial.setColor4Array` ([JonathanTron](https://github.com/JonathanTron/))

+ 86 - 0
loaders/src/glTF/2.0/Extensions/ExtrasAsMetadata.ts

@@ -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)
+);

+ 1 - 1
loaders/src/glTF/2.0/Extensions/index.ts

@@ -8,4 +8,4 @@ export * from "./MSFT_audio_emitter";
 export * from "./MSFT_lod";
 export * from "./MSFT_minecraftMesh";
 export * from "./MSFT_sRGBFactors";
-export * from "./node_extras_as_metadata";
+export * from "./ExtrasAsMetadata";

+ 0 - 57
loaders/src/glTF/2.0/Extensions/node_extras_as_metadata.ts

@@ -1,57 +0,0 @@
-import { Nullable } from "babylonjs/types";
-import { TransformNode } from "babylonjs/Meshes/transformNode";
-
-import { INode } from "../glTFLoaderInterfaces";
-import { IGLTFLoaderExtension } from "../glTFLoaderExtension";
-import { GLTFLoader } from "../glTFLoader";
-
-const NAME = "node_extras_as_metadata";
-
-/**
- * Store node extras (if present) in BJS TransformNode metadata
- */
-export class CustomProps implements IGLTFLoaderExtension {
-    /** The name of this extension. */
-    public readonly name = NAME;
-
-    /** Defines whether this extension is enabled. */
-    public enabled = true;
-
-    private _loader: GLTFLoader;
-
-    /** @hidden */
-    public constructor(loader: GLTFLoader) {
-        this._loader = loader;
-    }
-
-    /** @hidden */
-    public dispose(): void {
-        delete this._loader;
-    }
-
-    /** @hidden */
-    public loadNodeAsync(
-        context: string,
-        node: INode,
-        assign: (babylonMesh: TransformNode) => void
-    ): Nullable<Promise<TransformNode>> {
-        return this._loader.loadNodeAsync(
-            context,
-            node,
-            (babylonMesh): void => {
-                if (node.extras && Object.keys(node.extras).length > 0) {
-                    if (!babylonMesh.metadata) {
-                        babylonMesh.metadata = {};
-                    }
-                    Object.assign(babylonMesh.metadata, node.extras);
-                }
-                assign(babylonMesh);
-            }
-        );
-    }
-}
-
-GLTFLoader.RegisterExtension(
-    NAME,
-    (loader): IGLTFLoaderExtension => new CustomProps(loader)
-);

+ 13 - 4
tests/unit/babylon/src/Loading/babylon.sceneLoader.tests.ts

@@ -518,11 +518,20 @@ describe('Babylon Scene Loader', function() {
             return BABYLON.SceneLoader.AppendAsync("/Playground/scenes/Box/", "Box_extras.gltf", scene).then((scene) => {
                 expect(scene.meshes.length, "scene.meshes.length").to.equal(2);
                 expect(scene.materials.length, "scene.materials.length").to.equal(1);
-                const mesh = scene.getMeshByName("Box001")
+                const mesh = scene.getMeshByName("Box001");
                 expect(mesh, "Box001").to.exist;
-                expect(mesh.metadata, "metadata").to.exist;
-                expect(mesh.metadata.kind, "extras.kind").to.equal("nice cube");
-                expect(mesh.metadata.magic, "extras.magic").to.equal(42);
+                expect(mesh.metadata, "Box001 metadata").to.exist;
+                expect(mesh.metadata.kind, "Box001 extras.kind").to.equal("nice cube");
+                expect(mesh.metadata.magic, "Box001 extras.magic").to.equal(42);
+                const camera = scene.getCameraByName("Camera");
+                expect(camera, "Camera").to.exist;
+                expect(camera.metadata, "Camera metadata").to.exist;
+                expect(camera.metadata.custom, "Camera extras.custom").to.equal("cameraProp");
+                const material = scene.getMaterialByName("01___Default")
+                expect(material, "Material").to.exist;
+                expect(material.metadata, "Material metadata").to.exist;
+                expect(material.metadata.custom, "Material extras.custom").to.equal("materialProp");
+
             });
         });