Browse Source

Moving to beta1
Fixing GPS isReady issue
Nightly

David Catuhe 7 years ago
parent
commit
e493210770
39 changed files with 38403 additions and 38022 deletions
  1. 14398 14389
      Playground/babylon.d.txt
  2. 2 1
      Tools/Gulp/gulpfile.js
  3. 16384 16375
      dist/preview release/babylon.d.ts
  4. 52 52
      dist/preview release/babylon.js
  5. 95 43
      dist/preview release/babylon.max.js
  6. 53 53
      dist/preview release/babylon.worker.js
  7. 6220 6211
      dist/preview release/customConfigurations/minimalGLTFViewer/babylon.d.ts
  8. 54 54
      dist/preview release/customConfigurations/minimalGLTFViewer/babylon.js
  9. 187 125
      dist/preview release/customConfigurations/minimalGLTFViewer/babylon.max.js
  10. 187 125
      dist/preview release/customConfigurations/minimalGLTFViewer/es6.js
  11. 95 43
      dist/preview release/es6.js
  12. 3 3
      dist/preview release/gui/babylon.gui.min.js
  13. 4 4
      dist/preview release/inspector/babylon.inspector.bundle.js
  14. 3 3
      dist/preview release/inspector/babylon.inspector.min.js
  15. 2 2
      dist/preview release/loaders/babylon.glTF1FileLoader.min.js
  16. 26 17
      dist/preview release/loaders/babylon.glTF2FileLoader.d.ts
  17. 94 83
      dist/preview release/loaders/babylon.glTF2FileLoader.js
  18. 2 2
      dist/preview release/loaders/babylon.glTF2FileLoader.min.js
  19. 26 17
      dist/preview release/loaders/babylon.glTFFileLoader.d.ts
  20. 94 83
      dist/preview release/loaders/babylon.glTFFileLoader.js
  21. 3 3
      dist/preview release/loaders/babylon.glTFFileLoader.min.js
  22. 1 1
      dist/preview release/loaders/babylon.objFileLoader.min.js
  23. 94 83
      dist/preview release/loaders/babylonjs.loaders.js
  24. 3 3
      dist/preview release/loaders/babylonjs.loaders.min.js
  25. 26 17
      dist/preview release/loaders/babylonjs.loaders.module.d.ts
  26. 1 1
      dist/preview release/materialsLibrary/babylon.customMaterial.min.js
  27. 1 1
      dist/preview release/materialsLibrary/babylon.shadowOnlyMaterial.min.js
  28. 1 1
      dist/preview release/materialsLibrary/babylon.waterMaterial.min.js
  29. 3 3
      dist/preview release/materialsLibrary/babylonjs.materials.min.js
  30. 1 1
      dist/preview release/postProcessesLibrary/babylon.asciiArtPostProcess.min.js
  31. 1 1
      dist/preview release/postProcessesLibrary/babylon.digitalRainPostProcess.min.js
  32. 1 1
      dist/preview release/postProcessesLibrary/babylonjs.postProcess.min.js
  33. 1 1
      dist/preview release/serializers/babylon.glTF2Serializer.min.js
  34. 1 1
      dist/preview release/serializers/babylonjs.serializers.min.js
  35. 65 65
      dist/preview release/viewer/babylon.viewer.js
  36. 189 126
      dist/preview release/viewer/babylon.viewer.max.js
  37. 8 8
      src/Engine/babylon.engine.ts
  38. 2 1
      src/Particles/babylon.gpuParticleSystem.ts
  39. 20 19
      src/Tools/babylon.tools.ts

File diff suppressed because it is too large
+ 14398 - 14389
Playground/babylon.d.txt


+ 2 - 1
Tools/Gulp/gulpfile.js

@@ -622,7 +622,8 @@ gulp.task("deployLocalDev", function () {
 gulp.task("webserver", function () {
     var options = {
         port: 1338,
-        livereload: false
+        livereload: false,
+        
     };
 
     if (commandLineOptions.public) {

File diff suppressed because it is too large
+ 16384 - 16375
dist/preview release/babylon.d.ts


File diff suppressed because it is too large
+ 52 - 52
dist/preview release/babylon.js


File diff suppressed because it is too large
+ 95 - 43
dist/preview release/babylon.max.js


File diff suppressed because it is too large
+ 53 - 53
dist/preview release/babylon.worker.js


File diff suppressed because it is too large
+ 6220 - 6211
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.d.ts


File diff suppressed because it is too large
+ 54 - 54
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.js


File diff suppressed because it is too large
+ 187 - 125
dist/preview release/customConfigurations/minimalGLTFViewer/babylon.max.js


File diff suppressed because it is too large
+ 187 - 125
dist/preview release/customConfigurations/minimalGLTFViewer/es6.js


File diff suppressed because it is too large
+ 95 - 43
dist/preview release/es6.js


File diff suppressed because it is too large
+ 3 - 3
dist/preview release/gui/babylon.gui.min.js


File diff suppressed because it is too large
+ 4 - 4
dist/preview release/inspector/babylon.inspector.bundle.js


File diff suppressed because it is too large
+ 3 - 3
dist/preview release/inspector/babylon.inspector.min.js


File diff suppressed because it is too large
+ 2 - 2
dist/preview release/loaders/babylon.glTF1FileLoader.min.js


+ 26 - 17
dist/preview release/loaders/babylon.glTF2FileLoader.d.ts

@@ -199,7 +199,6 @@ declare module BABYLON.GLTF2 {
         _data?: Promise<TypedArray>;
     }
     interface ILoaderAnimationChannel extends IAnimationChannel, IArrayItem {
-        _babylonAnimationGroup: AnimationGroup;
     }
     interface ILoaderAnimationSamplerData {
         input: Float32Array;
@@ -212,7 +211,7 @@ declare module BABYLON.GLTF2 {
     interface ILoaderAnimation extends IAnimation, IArrayItem {
         channels: ILoaderAnimationChannel[];
         samplers: ILoaderAnimationSampler[];
-        _babylonAnimationGroup: Nullable<AnimationGroup>;
+        _babylonAnimationGroup?: AnimationGroup;
     }
     interface ILoaderBuffer extends IBuffer, IArrayItem {
         _data?: Promise<ArrayBufferView>;
@@ -226,9 +225,13 @@ declare module BABYLON.GLTF2 {
         _objectURL?: Promise<string>;
     }
     interface ILoaderMaterial extends IMaterial, IArrayItem {
-        _babylonMaterial?: Material;
-        _babylonMeshes?: AbstractMesh[];
-        _loaded?: Promise<void>;
+        _babylonData?: {
+            [drawMode: number]: {
+                material: Material;
+                meshes: AbstractMesh[];
+                loaded: Promise<void>;
+            };
+        };
     }
     interface ILoaderMesh extends IMesh, IArrayItem {
         primitives: ILoaderMeshPrimitive[];
@@ -254,7 +257,7 @@ declare module BABYLON.GLTF2 {
     interface ILoaderScene extends IScene, IArrayItem {
     }
     interface ILoaderSkin extends ISkin, IArrayItem {
-        _babylonSkeleton: Nullable<Skeleton>;
+        _babylonSkeleton?: Skeleton;
         _loaded?: Promise<void>;
     }
     interface ILoaderTexture extends ITexture, IArrayItem {
@@ -278,6 +281,10 @@ declare module BABYLON.GLTF2 {
 
 
 declare module BABYLON.GLTF2 {
+    interface MaterialConstructor<T extends Material> {
+        readonly prototype: T;
+        new (name: string, scene: Scene): T;
+    }
     class GLTFLoader implements IGLTFLoader {
         _gltf: ILoaderGLTF;
         _babylonScene: Scene;
@@ -288,6 +295,7 @@ declare module BABYLON.GLTF2 {
         private _rootUrl;
         private _rootBabylonMesh;
         private _defaultSampler;
+        private _defaultBabylonMaterials;
         private _progressCallback?;
         private _requests;
         private static _Names;
@@ -349,12 +357,12 @@ declare module BABYLON.GLTF2 {
         _loadBufferViewAsync(context: string, bufferView: ILoaderBufferView): Promise<ArrayBufferView>;
         private _loadAccessorAsync(context, accessor);
         private _buildArrayBuffer<T>(typedArray, data, byteOffset, count, numComponents, byteStride?);
-        private _getDefaultMaterial();
-        private _loadMaterialMetallicRoughnessPropertiesAsync(context, material);
-        _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, assign: (babylonMaterial: Material) => void): Promise<void>;
-        _createMaterial(material: ILoaderMaterial): PBRMaterial;
-        _loadMaterialBasePropertiesAsync(context: string, material: ILoaderMaterial): Promise<void>;
-        _loadMaterialAlphaProperties(context: string, material: ILoaderMaterial): void;
+        private _getDefaultMaterial(drawMode);
+        private _loadMaterialMetallicRoughnessPropertiesAsync(context, material, babylonMaterial);
+        _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Promise<void>;
+        _createMaterial<T extends Material>(type: MaterialConstructor<T>, name: string, drawMode: number): T;
+        _loadMaterialBasePropertiesAsync(context: string, material: ILoaderMaterial, babylonMaterial: PBRMaterial): Promise<void>;
+        _loadMaterialAlphaProperties(context: string, material: ILoaderMaterial, babylonMaterial: PBRMaterial): void;
         _loadTextureAsync(context: string, textureInfo: ITextureInfo, assign: (texture: Texture) => void): Promise<void>;
         private _loadSampler(context, sampler);
         private _loadImageAsync(context, image);
@@ -365,6 +373,7 @@ declare module BABYLON.GLTF2 {
         private static _GetTextureSamplingMode(context, magFilter?, minFilter?);
         private static _GetNumComponents(context, type);
         private static _ValidateUri(uri);
+        private static _GetDrawMode(context, mode);
         private _compileMaterialsAsync();
         private _compileShadowGeneratorsAsync();
         private _clear();
@@ -387,7 +396,7 @@ declare module BABYLON.GLTF2 {
         /** Override this method to modify the default behavior for loading mesh primitive vertex data. */
         protected _loadVertexDataAsync(context: string, primitive: ILoaderMeshPrimitive, babylonMesh: Mesh): Nullable<Promise<VertexData>>;
         /** Override this method to modify the default behavior for loading materials. */
-        protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
+        protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
         /** Override this method to modify the default behavior for loading uris. */
         protected _loadUriAsync(context: string, uri: string): Nullable<Promise<ArrayBufferView>>;
         /** Helper method called by a loader extension to load an glTF extension. */
@@ -399,7 +408,7 @@ declare module BABYLON.GLTF2 {
         /** Helper method called by the loader to allow extensions to override loading mesh primitive vertex data. */
         static _LoadVertexDataAsync(loader: GLTFLoader, context: string, primitive: ILoaderMeshPrimitive, babylonMesh: Mesh): Nullable<Promise<VertexData>>;
         /** Helper method called by the loader to allow extensions to override loading materials. */
-        static _LoadMaterialAsync(loader: GLTFLoader, context: string, material: ILoaderMaterial, babylonMesh: Mesh, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
+        static _LoadMaterialAsync(loader: GLTFLoader, context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
         /** Helper method called by the loader to allow extensions to override loading uris. */
         static _LoadUriAsync(loader: GLTFLoader, context: string, uri: string): Nullable<Promise<ArrayBufferView>>;
     }
@@ -418,7 +427,7 @@ declare module BABYLON.GLTF2.Extensions {
         private _loadingMaterialLOD;
         private _loadMaterialSignals;
         protected _loadNodeAsync(context: string, node: ILoaderNode): Nullable<Promise<void>>;
-        protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
+        protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
         protected _loadUriAsync(context: string, uri: string): Nullable<Promise<ArrayBufferView>>;
         /**
          * Gets an array of LOD properties from lowest to highest.
@@ -442,8 +451,8 @@ declare module BABYLON.GLTF2.Extensions {
 declare module BABYLON.GLTF2.Extensions {
     class KHR_materials_pbrSpecularGlossiness extends GLTFLoaderExtension {
         readonly name: string;
-        protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
-        private _loadSpecularGlossinessPropertiesAsync(context, material, properties);
+        protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
+        private _loadSpecularGlossinessPropertiesAsync(context, material, properties, babylonMaterial);
     }
 }
 

+ 94 - 83
dist/preview release/loaders/babylon.glTF2FileLoader.js

@@ -515,6 +515,7 @@ var BABYLON;
                 this._state = null;
                 this._extensions = {};
                 this._defaultSampler = {};
+                this._defaultBabylonMaterials = {};
                 this._requests = new Array();
                 this.coordinateSystemMode = BABYLON.GLTFLoaderCoordinateSystemMode.AUTO;
                 this.animationStartMode = BABYLON.GLTFLoaderAnimationStartMode.FIRST;
@@ -899,12 +900,13 @@ var BABYLON;
                     new BABYLON.Geometry(babylonMesh.name, _this._babylonScene, babylonVertexData, false, babylonMesh);
                     return _this._loadMorphTargetsAsync(context, primitive, babylonMesh, babylonVertexData);
                 }));
+                var babylonDrawMode = GLTFLoader._GetDrawMode(context, primitive.mode);
                 if (primitive.material == undefined) {
-                    babylonMesh.material = this._getDefaultMaterial();
+                    babylonMesh.material = this._getDefaultMaterial(babylonDrawMode);
                 }
                 else {
                     var material = GLTFLoader._GetProperty(context + "/material}", this._gltf.materials, primitive.material);
-                    promises.push(this._loadMaterialAsync("#/materials/" + material._index, material, babylonMesh, function (babylonMaterial) {
+                    promises.push(this._loadMaterialAsync("#/materials/" + material._index, material, babylonMesh, babylonDrawMode, function (babylonMaterial) {
                         babylonMesh.material = babylonMaterial;
                     }));
                 }
@@ -920,10 +922,6 @@ var BABYLON;
                 if (!attributes) {
                     throw new Error(context + ": Attributes are missing");
                 }
-                if (primitive.mode != undefined && primitive.mode !== 4 /* TRIANGLES */) {
-                    // TODO: handle other primitive modes
-                    throw new Error(context + ": Mode (" + primitive.mode + ") is not currently supported");
-                }
                 var promises = new Array();
                 var babylonVertexData = new BABYLON.VertexData();
                 if (primitive.indices == undefined) {
@@ -1307,19 +1305,9 @@ var BABYLON;
                             break;
                         }
                     }
-                    var keys;
-                    if (data.input.length === 1) {
-                        var key = getNextKey(0);
-                        keys = [
-                            { frame: key.frame, value: key.value },
-                            { frame: key.frame + 1, value: key.value }
-                        ];
-                    }
-                    else {
-                        keys = new Array(data.input.length);
-                        for (var frameIndex = 0; frameIndex < data.input.length; frameIndex++) {
-                            keys[frameIndex] = getNextKey(frameIndex);
-                        }
+                    var keys = new Array(data.input.length);
+                    for (var frameIndex = 0; frameIndex < data.input.length; frameIndex++) {
+                        keys[frameIndex] = getNextKey(frameIndex);
                     }
                     if (targetPath === "influence") {
                         var _loop_1 = function (targetIndex) {
@@ -1480,22 +1468,19 @@ var BABYLON;
                 }
                 return targetBuffer;
             };
-            GLTFLoader.prototype._getDefaultMaterial = function () {
-                var id = "__gltf_default";
-                var babylonMaterial = this._babylonScene.getMaterialByName(id);
+            GLTFLoader.prototype._getDefaultMaterial = function (drawMode) {
+                var babylonMaterial = this._defaultBabylonMaterials[drawMode];
                 if (!babylonMaterial) {
-                    babylonMaterial = new BABYLON.PBRMaterial(id, this._babylonScene);
+                    babylonMaterial = this._createMaterial(BABYLON.PBRMaterial, "__gltf_default", drawMode);
                     babylonMaterial.transparencyMode = BABYLON.PBRMaterial.PBRMATERIAL_OPAQUE;
-                    babylonMaterial.sideOrientation = this._babylonScene.useRightHandedSystem ? BABYLON.Material.CounterClockWiseSideOrientation : BABYLON.Material.ClockWiseSideOrientation;
                     babylonMaterial.metallic = 1;
                     babylonMaterial.roughness = 1;
                     this.onMaterialLoadedObservable.notifyObservers(babylonMaterial);
                 }
                 return babylonMaterial;
             };
-            GLTFLoader.prototype._loadMaterialMetallicRoughnessPropertiesAsync = function (context, material) {
+            GLTFLoader.prototype._loadMaterialMetallicRoughnessPropertiesAsync = function (context, material, babylonMaterial) {
                 var promises = new Array();
-                var babylonMaterial = material._babylonMaterial;
                 // Ensure metallic workflow
                 babylonMaterial.metallic = 1;
                 babylonMaterial.roughness = 1;
@@ -1524,36 +1509,42 @@ var BABYLON;
                         babylonMaterial.useRoughnessFromMetallicTextureAlpha = false;
                     }
                 }
-                this._loadMaterialAlphaProperties(context, material);
+                this._loadMaterialAlphaProperties(context, material, babylonMaterial);
                 return Promise.all(promises).then(function () { });
             };
-            GLTFLoader.prototype._loadMaterialAsync = function (context, material, babylonMesh, assign) {
-                var promise = GLTF2.GLTFLoaderExtension._LoadMaterialAsync(this, context, material, babylonMesh, assign);
+            GLTFLoader.prototype._loadMaterialAsync = function (context, material, babylonMesh, babylonDrawMode, assign) {
+                var promise = GLTF2.GLTFLoaderExtension._LoadMaterialAsync(this, context, material, babylonMesh, babylonDrawMode, assign);
                 if (promise) {
                     return promise;
                 }
-                material._babylonMeshes = material._babylonMeshes || [];
-                material._babylonMeshes.push(babylonMesh);
-                if (!material._loaded) {
+                material._babylonData = material._babylonData || {};
+                var babylonData = material._babylonData[babylonDrawMode];
+                if (!babylonData) {
                     var promises = new Array();
-                    var babylonMaterial = this._createMaterial(material);
-                    material._babylonMaterial = babylonMaterial;
-                    promises.push(this._loadMaterialBasePropertiesAsync(context, material));
-                    promises.push(this._loadMaterialMetallicRoughnessPropertiesAsync(context, material));
+                    var name_3 = material.name || "materialSG_" + material._index;
+                    var babylonMaterial = this._createMaterial(BABYLON.PBRMaterial, name_3, babylonDrawMode);
+                    promises.push(this._loadMaterialBasePropertiesAsync(context, material, babylonMaterial));
+                    promises.push(this._loadMaterialMetallicRoughnessPropertiesAsync(context, material, babylonMaterial));
                     this.onMaterialLoadedObservable.notifyObservers(babylonMaterial);
-                    material._loaded = Promise.all(promises).then(function () { });
+                    babylonData = {
+                        material: babylonMaterial,
+                        meshes: [],
+                        loaded: Promise.all(promises).then(function () { })
+                    };
+                    material._babylonData[babylonDrawMode] = babylonData;
                 }
-                assign(material._babylonMaterial);
-                return material._loaded;
+                babylonData.meshes.push(babylonMesh);
+                assign(babylonData.material);
+                return babylonData.loaded;
             };
-            GLTFLoader.prototype._createMaterial = function (material) {
-                var babylonMaterial = new BABYLON.PBRMaterial(material.name || "material" + material._index, this._babylonScene);
+            GLTFLoader.prototype._createMaterial = function (type, name, drawMode) {
+                var babylonMaterial = new type(name, this._babylonScene);
                 babylonMaterial.sideOrientation = this._babylonScene.useRightHandedSystem ? BABYLON.Material.CounterClockWiseSideOrientation : BABYLON.Material.ClockWiseSideOrientation;
+                babylonMaterial.fillMode = drawMode;
                 return babylonMaterial;
             };
-            GLTFLoader.prototype._loadMaterialBasePropertiesAsync = function (context, material) {
+            GLTFLoader.prototype._loadMaterialBasePropertiesAsync = function (context, material, babylonMaterial) {
                 var promises = new Array();
-                var babylonMaterial = material._babylonMaterial;
                 babylonMaterial.emissiveColor = material.emissiveFactor ? BABYLON.Color3.FromArray(material.emissiveFactor) : new BABYLON.Color3(0, 0, 0);
                 if (material.doubleSided) {
                     babylonMaterial.backFaceCulling = false;
@@ -1585,8 +1576,7 @@ var BABYLON;
                 }
                 return Promise.all(promises).then(function () { });
             };
-            GLTFLoader.prototype._loadMaterialAlphaProperties = function (context, material) {
-                var babylonMaterial = material._babylonMaterial;
+            GLTFLoader.prototype._loadMaterialAlphaProperties = function (context, material, babylonMaterial) {
                 var alphaMode = material.alphaMode || "OPAQUE" /* OPAQUE */;
                 switch (alphaMode) {
                     case "OPAQUE" /* OPAQUE */: {
@@ -1806,21 +1796,36 @@ var BABYLON;
             GLTFLoader._ValidateUri = function (uri) {
                 return (BABYLON.Tools.IsBase64(uri) || uri.indexOf("..") === -1);
             };
+            GLTFLoader._GetDrawMode = function (context, mode) {
+                mode = mode || 4 /* TRIANGLES */;
+                switch (mode) {
+                    case 0 /* POINTS */: return BABYLON.Material.PointListDrawMode;
+                    case 1 /* LINES */: return BABYLON.Material.LineListDrawMode;
+                    case 2 /* LINE_LOOP */: return BABYLON.Material.LineLoopDrawMode;
+                    case 3 /* LINE_STRIP */: return BABYLON.Material.LineStripDrawMode;
+                    case 4 /* TRIANGLES */: return BABYLON.Material.TriangleFillMode;
+                    case 5 /* TRIANGLE_STRIP */: return BABYLON.Material.TriangleStripDrawMode;
+                    case 6 /* TRIANGLE_FAN */: return BABYLON.Material.TriangleFanDrawMode;
+                }
+                throw new Error(context + ": Invalid mesh primitive mode (" + mode + ")");
+            };
             GLTFLoader.prototype._compileMaterialsAsync = function () {
                 var promises = new Array();
                 if (this._gltf.materials) {
                     for (var _i = 0, _a = this._gltf.materials; _i < _a.length; _i++) {
                         var material = _a[_i];
-                        var babylonMaterial = material._babylonMaterial;
-                        var babylonMeshes = material._babylonMeshes;
-                        if (babylonMaterial && babylonMeshes) {
-                            for (var _b = 0, babylonMeshes_1 = babylonMeshes; _b < babylonMeshes_1.length; _b++) {
-                                var babylonMesh = babylonMeshes_1[_b];
-                                // Ensure nonUniformScaling is set if necessary.
-                                babylonMesh.computeWorldMatrix(true);
-                                promises.push(babylonMaterial.forceCompilationAsync(babylonMesh));
-                                if (this.useClipPlane) {
-                                    promises.push(babylonMaterial.forceCompilationAsync(babylonMesh, { clipPlane: true }));
+                        if (material._babylonData) {
+                            for (var babylonDrawMode in material._babylonData) {
+                                var babylonData = material._babylonData[babylonDrawMode];
+                                for (var _b = 0, _c = babylonData.meshes; _b < _c.length; _b++) {
+                                    var babylonMesh = _c[_b];
+                                    // Ensure nonUniformScaling is set if necessary.
+                                    babylonMesh.computeWorldMatrix(true);
+                                    var babylonMaterial = babylonData.material;
+                                    promises.push(babylonMaterial.forceCompilationAsync(babylonMesh));
+                                    if (this.useClipPlane) {
+                                        promises.push(babylonMaterial.forceCompilationAsync(babylonMesh, { clipPlane: true }));
+                                    }
                                 }
                             }
                         }
@@ -1860,8 +1865,8 @@ var BABYLON;
                 delete this._gltf;
                 delete this._babylonScene;
                 this._completePromises.length = 0;
-                for (var name_3 in this._extensions) {
-                    this._extensions[name_3].dispose();
+                for (var name_4 in this._extensions) {
+                    this._extensions[name_4].dispose();
                 }
                 this._extensions = {};
                 delete this._rootBabylonMesh;
@@ -1872,8 +1877,8 @@ var BABYLON;
             };
             GLTFLoader.prototype._applyExtensions = function (actionAsync) {
                 for (var _i = 0, _a = GLTFLoader._Names; _i < _a.length; _i++) {
-                    var name_4 = _a[_i];
-                    var extension = this._extensions[name_4];
+                    var name_5 = _a[_i];
+                    var extension = this._extensions[name_5];
                     if (extension.enabled) {
                         var promise = actionAsync(extension);
                         if (promise) {
@@ -1915,7 +1920,7 @@ var BABYLON;
             /** Override this method to modify the default behavior for loading mesh primitive vertex data. */
             GLTFLoaderExtension.prototype._loadVertexDataAsync = function (context, primitive, babylonMesh) { return null; };
             /** Override this method to modify the default behavior for loading materials. */
-            GLTFLoaderExtension.prototype._loadMaterialAsync = function (context, material, babylonMesh, assign) { return null; };
+            GLTFLoaderExtension.prototype._loadMaterialAsync = function (context, material, babylonMesh, babylonDrawMode, assign) { return null; };
             /** Override this method to modify the default behavior for loading uris. */
             GLTFLoaderExtension.prototype._loadUriAsync = function (context, uri) { return null; };
             // #endregion
@@ -1952,8 +1957,8 @@ var BABYLON;
                 return loader._applyExtensions(function (extension) { return extension._loadVertexDataAsync(context, primitive, babylonMesh); });
             };
             /** Helper method called by the loader to allow extensions to override loading materials. */
-            GLTFLoaderExtension._LoadMaterialAsync = function (loader, context, material, babylonMesh, assign) {
-                return loader._applyExtensions(function (extension) { return extension._loadMaterialAsync(context, material, babylonMesh, assign); });
+            GLTFLoaderExtension._LoadMaterialAsync = function (loader, context, material, babylonMesh, babylonDrawMode, assign) {
+                return loader._applyExtensions(function (extension) { return extension._loadMaterialAsync(context, material, babylonMesh, babylonDrawMode, assign); });
             };
             /** Helper method called by the loader to allow extensions to override loading uris. */
             GLTFLoaderExtension._LoadUriAsync = function (loader, context, uri) {
@@ -2044,7 +2049,7 @@ var BABYLON;
                         return firstPromise;
                     });
                 };
-                MSFT_lod.prototype._loadMaterialAsync = function (context, material, babylonMesh, assign) {
+                MSFT_lod.prototype._loadMaterialAsync = function (context, material, babylonMesh, babylonDrawMode, assign) {
                     var _this = this;
                     // Don't load material LODs if already loading a node LOD.
                     if (this._loadingNodeLOD) {
@@ -2061,13 +2066,14 @@ var BABYLON;
                                     _this._loadMaterialSignals[materialLOD._index] = new BABYLON.Deferred();
                                 }
                             }
-                            var promise = _this._loader._loadMaterialAsync("#/materials/" + materialLOD._index, materialLOD, babylonMesh, indexLOD === 0 ? assign : function () { }).then(function () {
+                            var promise = _this._loader._loadMaterialAsync("#/materials/" + materialLOD._index, materialLOD, babylonMesh, babylonDrawMode, indexLOD === 0 ? assign : function () { }).then(function () {
                                 if (indexLOD !== 0) {
-                                    assign(materialLOD._babylonMaterial);
-                                    var previousMaterialLOD = materialLODs[indexLOD - 1];
-                                    if (previousMaterialLOD._babylonMaterial) {
-                                        previousMaterialLOD._babylonMaterial.dispose();
-                                        delete previousMaterialLOD._babylonMaterial;
+                                    var babylonDataLOD = materialLOD._babylonData;
+                                    assign(babylonDataLOD[babylonDrawMode].material);
+                                    var previousBabylonDataLOD = materialLODs[indexLOD - 1]._babylonData;
+                                    if (previousBabylonDataLOD[babylonDrawMode]) {
+                                        previousBabylonDataLOD[babylonDrawMode].material.dispose();
+                                        delete previousBabylonDataLOD[babylonDrawMode];
                                     }
                                 }
                                 if (indexLOD !== materialLODs.length - 1) {
@@ -2256,27 +2262,32 @@ var BABYLON;
                     _this.name = NAME;
                     return _this;
                 }
-                KHR_materials_pbrSpecularGlossiness.prototype._loadMaterialAsync = function (context, material, babylonMesh, assign) {
+                KHR_materials_pbrSpecularGlossiness.prototype._loadMaterialAsync = function (context, material, babylonMesh, babylonDrawMode, assign) {
                     var _this = this;
                     return this._loadExtensionAsync(context, material, function (context, extension) {
-                        material._babylonMeshes = material._babylonMeshes || [];
-                        material._babylonMeshes.push(babylonMesh);
-                        if (!material._loaded) {
+                        material._babylonData = material._babylonData || {};
+                        var babylonData = material._babylonData[babylonDrawMode];
+                        if (!babylonData) {
                             var promises = new Array();
-                            var babylonMaterial = _this._loader._createMaterial(material);
-                            material._babylonMaterial = babylonMaterial;
-                            promises.push(_this._loader._loadMaterialBasePropertiesAsync(context, material));
-                            promises.push(_this._loadSpecularGlossinessPropertiesAsync(context, material, extension));
+                            var name_1 = material.name || "materialSG_" + material._index;
+                            var babylonMaterial = _this._loader._createMaterial(BABYLON.PBRMaterial, name_1, babylonDrawMode);
+                            promises.push(_this._loader._loadMaterialBasePropertiesAsync(context, material, babylonMaterial));
+                            promises.push(_this._loadSpecularGlossinessPropertiesAsync(context, material, extension, babylonMaterial));
                             _this._loader.onMaterialLoadedObservable.notifyObservers(babylonMaterial);
-                            material._loaded = Promise.all(promises).then(function () { });
+                            babylonData = {
+                                material: babylonMaterial,
+                                meshes: [],
+                                loaded: Promise.all(promises).then(function () { })
+                            };
+                            material._babylonData[babylonDrawMode] = babylonData;
                         }
-                        assign(material._babylonMaterial);
-                        return material._loaded;
+                        babylonData.meshes.push(babylonMesh);
+                        assign(babylonData.material);
+                        return babylonData.loaded;
                     });
                 };
-                KHR_materials_pbrSpecularGlossiness.prototype._loadSpecularGlossinessPropertiesAsync = function (context, material, properties) {
+                KHR_materials_pbrSpecularGlossiness.prototype._loadSpecularGlossinessPropertiesAsync = function (context, material, properties, babylonMaterial) {
                     var promises = new Array();
-                    var babylonMaterial = material._babylonMaterial;
                     if (properties.diffuseFactor) {
                         babylonMaterial.albedoColor = BABYLON.Color3.FromArray(properties.diffuseFactor);
                         babylonMaterial.alpha = properties.diffuseFactor[3];
@@ -2298,7 +2309,7 @@ var BABYLON;
                         babylonMaterial.reflectivityTexture.hasAlpha = true;
                         babylonMaterial.useMicroSurfaceFromReflectivityMapAlpha = true;
                     }
-                    this._loader._loadMaterialAlphaProperties(context, material);
+                    this._loader._loadMaterialAlphaProperties(context, material, babylonMaterial);
                     return Promise.all(promises).then(function () { });
                 };
                 return KHR_materials_pbrSpecularGlossiness;

File diff suppressed because it is too large
+ 2 - 2
dist/preview release/loaders/babylon.glTF2FileLoader.min.js


+ 26 - 17
dist/preview release/loaders/babylon.glTFFileLoader.d.ts

@@ -755,7 +755,6 @@ declare module BABYLON.GLTF2 {
         _data?: Promise<TypedArray>;
     }
     interface ILoaderAnimationChannel extends IAnimationChannel, IArrayItem {
-        _babylonAnimationGroup: AnimationGroup;
     }
     interface ILoaderAnimationSamplerData {
         input: Float32Array;
@@ -768,7 +767,7 @@ declare module BABYLON.GLTF2 {
     interface ILoaderAnimation extends IAnimation, IArrayItem {
         channels: ILoaderAnimationChannel[];
         samplers: ILoaderAnimationSampler[];
-        _babylonAnimationGroup: Nullable<AnimationGroup>;
+        _babylonAnimationGroup?: AnimationGroup;
     }
     interface ILoaderBuffer extends IBuffer, IArrayItem {
         _data?: Promise<ArrayBufferView>;
@@ -782,9 +781,13 @@ declare module BABYLON.GLTF2 {
         _objectURL?: Promise<string>;
     }
     interface ILoaderMaterial extends IMaterial, IArrayItem {
-        _babylonMaterial?: Material;
-        _babylonMeshes?: AbstractMesh[];
-        _loaded?: Promise<void>;
+        _babylonData?: {
+            [drawMode: number]: {
+                material: Material;
+                meshes: AbstractMesh[];
+                loaded: Promise<void>;
+            };
+        };
     }
     interface ILoaderMesh extends IMesh, IArrayItem {
         primitives: ILoaderMeshPrimitive[];
@@ -810,7 +813,7 @@ declare module BABYLON.GLTF2 {
     interface ILoaderScene extends IScene, IArrayItem {
     }
     interface ILoaderSkin extends ISkin, IArrayItem {
-        _babylonSkeleton: Nullable<Skeleton>;
+        _babylonSkeleton?: Skeleton;
         _loaded?: Promise<void>;
     }
     interface ILoaderTexture extends ITexture, IArrayItem {
@@ -834,6 +837,10 @@ declare module BABYLON.GLTF2 {
 
 
 declare module BABYLON.GLTF2 {
+    interface MaterialConstructor<T extends Material> {
+        readonly prototype: T;
+        new (name: string, scene: Scene): T;
+    }
     class GLTFLoader implements IGLTFLoader {
         _gltf: ILoaderGLTF;
         _babylonScene: Scene;
@@ -844,6 +851,7 @@ declare module BABYLON.GLTF2 {
         private _rootUrl;
         private _rootBabylonMesh;
         private _defaultSampler;
+        private _defaultBabylonMaterials;
         private _progressCallback?;
         private _requests;
         private static _Names;
@@ -905,12 +913,12 @@ declare module BABYLON.GLTF2 {
         _loadBufferViewAsync(context: string, bufferView: ILoaderBufferView): Promise<ArrayBufferView>;
         private _loadAccessorAsync(context, accessor);
         private _buildArrayBuffer<T>(typedArray, data, byteOffset, count, numComponents, byteStride?);
-        private _getDefaultMaterial();
-        private _loadMaterialMetallicRoughnessPropertiesAsync(context, material);
-        _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, assign: (babylonMaterial: Material) => void): Promise<void>;
-        _createMaterial(material: ILoaderMaterial): PBRMaterial;
-        _loadMaterialBasePropertiesAsync(context: string, material: ILoaderMaterial): Promise<void>;
-        _loadMaterialAlphaProperties(context: string, material: ILoaderMaterial): void;
+        private _getDefaultMaterial(drawMode);
+        private _loadMaterialMetallicRoughnessPropertiesAsync(context, material, babylonMaterial);
+        _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Promise<void>;
+        _createMaterial<T extends Material>(type: MaterialConstructor<T>, name: string, drawMode: number): T;
+        _loadMaterialBasePropertiesAsync(context: string, material: ILoaderMaterial, babylonMaterial: PBRMaterial): Promise<void>;
+        _loadMaterialAlphaProperties(context: string, material: ILoaderMaterial, babylonMaterial: PBRMaterial): void;
         _loadTextureAsync(context: string, textureInfo: ITextureInfo, assign: (texture: Texture) => void): Promise<void>;
         private _loadSampler(context, sampler);
         private _loadImageAsync(context, image);
@@ -921,6 +929,7 @@ declare module BABYLON.GLTF2 {
         private static _GetTextureSamplingMode(context, magFilter?, minFilter?);
         private static _GetNumComponents(context, type);
         private static _ValidateUri(uri);
+        private static _GetDrawMode(context, mode);
         private _compileMaterialsAsync();
         private _compileShadowGeneratorsAsync();
         private _clear();
@@ -943,7 +952,7 @@ declare module BABYLON.GLTF2 {
         /** Override this method to modify the default behavior for loading mesh primitive vertex data. */
         protected _loadVertexDataAsync(context: string, primitive: ILoaderMeshPrimitive, babylonMesh: Mesh): Nullable<Promise<VertexData>>;
         /** Override this method to modify the default behavior for loading materials. */
-        protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
+        protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
         /** Override this method to modify the default behavior for loading uris. */
         protected _loadUriAsync(context: string, uri: string): Nullable<Promise<ArrayBufferView>>;
         /** Helper method called by a loader extension to load an glTF extension. */
@@ -955,7 +964,7 @@ declare module BABYLON.GLTF2 {
         /** Helper method called by the loader to allow extensions to override loading mesh primitive vertex data. */
         static _LoadVertexDataAsync(loader: GLTFLoader, context: string, primitive: ILoaderMeshPrimitive, babylonMesh: Mesh): Nullable<Promise<VertexData>>;
         /** Helper method called by the loader to allow extensions to override loading materials. */
-        static _LoadMaterialAsync(loader: GLTFLoader, context: string, material: ILoaderMaterial, babylonMesh: Mesh, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
+        static _LoadMaterialAsync(loader: GLTFLoader, context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
         /** Helper method called by the loader to allow extensions to override loading uris. */
         static _LoadUriAsync(loader: GLTFLoader, context: string, uri: string): Nullable<Promise<ArrayBufferView>>;
     }
@@ -974,7 +983,7 @@ declare module BABYLON.GLTF2.Extensions {
         private _loadingMaterialLOD;
         private _loadMaterialSignals;
         protected _loadNodeAsync(context: string, node: ILoaderNode): Nullable<Promise<void>>;
-        protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
+        protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
         protected _loadUriAsync(context: string, uri: string): Nullable<Promise<ArrayBufferView>>;
         /**
          * Gets an array of LOD properties from lowest to highest.
@@ -998,8 +1007,8 @@ declare module BABYLON.GLTF2.Extensions {
 declare module BABYLON.GLTF2.Extensions {
     class KHR_materials_pbrSpecularGlossiness extends GLTFLoaderExtension {
         readonly name: string;
-        protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
-        private _loadSpecularGlossinessPropertiesAsync(context, material, properties);
+        protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
+        private _loadSpecularGlossinessPropertiesAsync(context, material, properties, babylonMaterial);
     }
 }
 

+ 94 - 83
dist/preview release/loaders/babylon.glTFFileLoader.js

@@ -2692,6 +2692,7 @@ var BABYLON;
                 this._state = null;
                 this._extensions = {};
                 this._defaultSampler = {};
+                this._defaultBabylonMaterials = {};
                 this._requests = new Array();
                 this.coordinateSystemMode = BABYLON.GLTFLoaderCoordinateSystemMode.AUTO;
                 this.animationStartMode = BABYLON.GLTFLoaderAnimationStartMode.FIRST;
@@ -3076,12 +3077,13 @@ var BABYLON;
                     new BABYLON.Geometry(babylonMesh.name, _this._babylonScene, babylonVertexData, false, babylonMesh);
                     return _this._loadMorphTargetsAsync(context, primitive, babylonMesh, babylonVertexData);
                 }));
+                var babylonDrawMode = GLTFLoader._GetDrawMode(context, primitive.mode);
                 if (primitive.material == undefined) {
-                    babylonMesh.material = this._getDefaultMaterial();
+                    babylonMesh.material = this._getDefaultMaterial(babylonDrawMode);
                 }
                 else {
                     var material = GLTFLoader._GetProperty(context + "/material}", this._gltf.materials, primitive.material);
-                    promises.push(this._loadMaterialAsync("#/materials/" + material._index, material, babylonMesh, function (babylonMaterial) {
+                    promises.push(this._loadMaterialAsync("#/materials/" + material._index, material, babylonMesh, babylonDrawMode, function (babylonMaterial) {
                         babylonMesh.material = babylonMaterial;
                     }));
                 }
@@ -3097,10 +3099,6 @@ var BABYLON;
                 if (!attributes) {
                     throw new Error(context + ": Attributes are missing");
                 }
-                if (primitive.mode != undefined && primitive.mode !== 4 /* TRIANGLES */) {
-                    // TODO: handle other primitive modes
-                    throw new Error(context + ": Mode (" + primitive.mode + ") is not currently supported");
-                }
                 var promises = new Array();
                 var babylonVertexData = new BABYLON.VertexData();
                 if (primitive.indices == undefined) {
@@ -3484,19 +3482,9 @@ var BABYLON;
                             break;
                         }
                     }
-                    var keys;
-                    if (data.input.length === 1) {
-                        var key = getNextKey(0);
-                        keys = [
-                            { frame: key.frame, value: key.value },
-                            { frame: key.frame + 1, value: key.value }
-                        ];
-                    }
-                    else {
-                        keys = new Array(data.input.length);
-                        for (var frameIndex = 0; frameIndex < data.input.length; frameIndex++) {
-                            keys[frameIndex] = getNextKey(frameIndex);
-                        }
+                    var keys = new Array(data.input.length);
+                    for (var frameIndex = 0; frameIndex < data.input.length; frameIndex++) {
+                        keys[frameIndex] = getNextKey(frameIndex);
                     }
                     if (targetPath === "influence") {
                         var _loop_1 = function (targetIndex) {
@@ -3657,22 +3645,19 @@ var BABYLON;
                 }
                 return targetBuffer;
             };
-            GLTFLoader.prototype._getDefaultMaterial = function () {
-                var id = "__gltf_default";
-                var babylonMaterial = this._babylonScene.getMaterialByName(id);
+            GLTFLoader.prototype._getDefaultMaterial = function (drawMode) {
+                var babylonMaterial = this._defaultBabylonMaterials[drawMode];
                 if (!babylonMaterial) {
-                    babylonMaterial = new BABYLON.PBRMaterial(id, this._babylonScene);
+                    babylonMaterial = this._createMaterial(BABYLON.PBRMaterial, "__gltf_default", drawMode);
                     babylonMaterial.transparencyMode = BABYLON.PBRMaterial.PBRMATERIAL_OPAQUE;
-                    babylonMaterial.sideOrientation = this._babylonScene.useRightHandedSystem ? BABYLON.Material.CounterClockWiseSideOrientation : BABYLON.Material.ClockWiseSideOrientation;
                     babylonMaterial.metallic = 1;
                     babylonMaterial.roughness = 1;
                     this.onMaterialLoadedObservable.notifyObservers(babylonMaterial);
                 }
                 return babylonMaterial;
             };
-            GLTFLoader.prototype._loadMaterialMetallicRoughnessPropertiesAsync = function (context, material) {
+            GLTFLoader.prototype._loadMaterialMetallicRoughnessPropertiesAsync = function (context, material, babylonMaterial) {
                 var promises = new Array();
-                var babylonMaterial = material._babylonMaterial;
                 // Ensure metallic workflow
                 babylonMaterial.metallic = 1;
                 babylonMaterial.roughness = 1;
@@ -3701,36 +3686,42 @@ var BABYLON;
                         babylonMaterial.useRoughnessFromMetallicTextureAlpha = false;
                     }
                 }
-                this._loadMaterialAlphaProperties(context, material);
+                this._loadMaterialAlphaProperties(context, material, babylonMaterial);
                 return Promise.all(promises).then(function () { });
             };
-            GLTFLoader.prototype._loadMaterialAsync = function (context, material, babylonMesh, assign) {
-                var promise = GLTF2.GLTFLoaderExtension._LoadMaterialAsync(this, context, material, babylonMesh, assign);
+            GLTFLoader.prototype._loadMaterialAsync = function (context, material, babylonMesh, babylonDrawMode, assign) {
+                var promise = GLTF2.GLTFLoaderExtension._LoadMaterialAsync(this, context, material, babylonMesh, babylonDrawMode, assign);
                 if (promise) {
                     return promise;
                 }
-                material._babylonMeshes = material._babylonMeshes || [];
-                material._babylonMeshes.push(babylonMesh);
-                if (!material._loaded) {
+                material._babylonData = material._babylonData || {};
+                var babylonData = material._babylonData[babylonDrawMode];
+                if (!babylonData) {
                     var promises = new Array();
-                    var babylonMaterial = this._createMaterial(material);
-                    material._babylonMaterial = babylonMaterial;
-                    promises.push(this._loadMaterialBasePropertiesAsync(context, material));
-                    promises.push(this._loadMaterialMetallicRoughnessPropertiesAsync(context, material));
+                    var name_3 = material.name || "materialSG_" + material._index;
+                    var babylonMaterial = this._createMaterial(BABYLON.PBRMaterial, name_3, babylonDrawMode);
+                    promises.push(this._loadMaterialBasePropertiesAsync(context, material, babylonMaterial));
+                    promises.push(this._loadMaterialMetallicRoughnessPropertiesAsync(context, material, babylonMaterial));
                     this.onMaterialLoadedObservable.notifyObservers(babylonMaterial);
-                    material._loaded = Promise.all(promises).then(function () { });
+                    babylonData = {
+                        material: babylonMaterial,
+                        meshes: [],
+                        loaded: Promise.all(promises).then(function () { })
+                    };
+                    material._babylonData[babylonDrawMode] = babylonData;
                 }
-                assign(material._babylonMaterial);
-                return material._loaded;
+                babylonData.meshes.push(babylonMesh);
+                assign(babylonData.material);
+                return babylonData.loaded;
             };
-            GLTFLoader.prototype._createMaterial = function (material) {
-                var babylonMaterial = new BABYLON.PBRMaterial(material.name || "material" + material._index, this._babylonScene);
+            GLTFLoader.prototype._createMaterial = function (type, name, drawMode) {
+                var babylonMaterial = new type(name, this._babylonScene);
                 babylonMaterial.sideOrientation = this._babylonScene.useRightHandedSystem ? BABYLON.Material.CounterClockWiseSideOrientation : BABYLON.Material.ClockWiseSideOrientation;
+                babylonMaterial.fillMode = drawMode;
                 return babylonMaterial;
             };
-            GLTFLoader.prototype._loadMaterialBasePropertiesAsync = function (context, material) {
+            GLTFLoader.prototype._loadMaterialBasePropertiesAsync = function (context, material, babylonMaterial) {
                 var promises = new Array();
-                var babylonMaterial = material._babylonMaterial;
                 babylonMaterial.emissiveColor = material.emissiveFactor ? BABYLON.Color3.FromArray(material.emissiveFactor) : new BABYLON.Color3(0, 0, 0);
                 if (material.doubleSided) {
                     babylonMaterial.backFaceCulling = false;
@@ -3762,8 +3753,7 @@ var BABYLON;
                 }
                 return Promise.all(promises).then(function () { });
             };
-            GLTFLoader.prototype._loadMaterialAlphaProperties = function (context, material) {
-                var babylonMaterial = material._babylonMaterial;
+            GLTFLoader.prototype._loadMaterialAlphaProperties = function (context, material, babylonMaterial) {
                 var alphaMode = material.alphaMode || "OPAQUE" /* OPAQUE */;
                 switch (alphaMode) {
                     case "OPAQUE" /* OPAQUE */: {
@@ -3983,21 +3973,36 @@ var BABYLON;
             GLTFLoader._ValidateUri = function (uri) {
                 return (BABYLON.Tools.IsBase64(uri) || uri.indexOf("..") === -1);
             };
+            GLTFLoader._GetDrawMode = function (context, mode) {
+                mode = mode || 4 /* TRIANGLES */;
+                switch (mode) {
+                    case 0 /* POINTS */: return BABYLON.Material.PointListDrawMode;
+                    case 1 /* LINES */: return BABYLON.Material.LineListDrawMode;
+                    case 2 /* LINE_LOOP */: return BABYLON.Material.LineLoopDrawMode;
+                    case 3 /* LINE_STRIP */: return BABYLON.Material.LineStripDrawMode;
+                    case 4 /* TRIANGLES */: return BABYLON.Material.TriangleFillMode;
+                    case 5 /* TRIANGLE_STRIP */: return BABYLON.Material.TriangleStripDrawMode;
+                    case 6 /* TRIANGLE_FAN */: return BABYLON.Material.TriangleFanDrawMode;
+                }
+                throw new Error(context + ": Invalid mesh primitive mode (" + mode + ")");
+            };
             GLTFLoader.prototype._compileMaterialsAsync = function () {
                 var promises = new Array();
                 if (this._gltf.materials) {
                     for (var _i = 0, _a = this._gltf.materials; _i < _a.length; _i++) {
                         var material = _a[_i];
-                        var babylonMaterial = material._babylonMaterial;
-                        var babylonMeshes = material._babylonMeshes;
-                        if (babylonMaterial && babylonMeshes) {
-                            for (var _b = 0, babylonMeshes_1 = babylonMeshes; _b < babylonMeshes_1.length; _b++) {
-                                var babylonMesh = babylonMeshes_1[_b];
-                                // Ensure nonUniformScaling is set if necessary.
-                                babylonMesh.computeWorldMatrix(true);
-                                promises.push(babylonMaterial.forceCompilationAsync(babylonMesh));
-                                if (this.useClipPlane) {
-                                    promises.push(babylonMaterial.forceCompilationAsync(babylonMesh, { clipPlane: true }));
+                        if (material._babylonData) {
+                            for (var babylonDrawMode in material._babylonData) {
+                                var babylonData = material._babylonData[babylonDrawMode];
+                                for (var _b = 0, _c = babylonData.meshes; _b < _c.length; _b++) {
+                                    var babylonMesh = _c[_b];
+                                    // Ensure nonUniformScaling is set if necessary.
+                                    babylonMesh.computeWorldMatrix(true);
+                                    var babylonMaterial = babylonData.material;
+                                    promises.push(babylonMaterial.forceCompilationAsync(babylonMesh));
+                                    if (this.useClipPlane) {
+                                        promises.push(babylonMaterial.forceCompilationAsync(babylonMesh, { clipPlane: true }));
+                                    }
                                 }
                             }
                         }
@@ -4037,8 +4042,8 @@ var BABYLON;
                 delete this._gltf;
                 delete this._babylonScene;
                 this._completePromises.length = 0;
-                for (var name_3 in this._extensions) {
-                    this._extensions[name_3].dispose();
+                for (var name_4 in this._extensions) {
+                    this._extensions[name_4].dispose();
                 }
                 this._extensions = {};
                 delete this._rootBabylonMesh;
@@ -4049,8 +4054,8 @@ var BABYLON;
             };
             GLTFLoader.prototype._applyExtensions = function (actionAsync) {
                 for (var _i = 0, _a = GLTFLoader._Names; _i < _a.length; _i++) {
-                    var name_4 = _a[_i];
-                    var extension = this._extensions[name_4];
+                    var name_5 = _a[_i];
+                    var extension = this._extensions[name_5];
                     if (extension.enabled) {
                         var promise = actionAsync(extension);
                         if (promise) {
@@ -4092,7 +4097,7 @@ var BABYLON;
             /** Override this method to modify the default behavior for loading mesh primitive vertex data. */
             GLTFLoaderExtension.prototype._loadVertexDataAsync = function (context, primitive, babylonMesh) { return null; };
             /** Override this method to modify the default behavior for loading materials. */
-            GLTFLoaderExtension.prototype._loadMaterialAsync = function (context, material, babylonMesh, assign) { return null; };
+            GLTFLoaderExtension.prototype._loadMaterialAsync = function (context, material, babylonMesh, babylonDrawMode, assign) { return null; };
             /** Override this method to modify the default behavior for loading uris. */
             GLTFLoaderExtension.prototype._loadUriAsync = function (context, uri) { return null; };
             // #endregion
@@ -4129,8 +4134,8 @@ var BABYLON;
                 return loader._applyExtensions(function (extension) { return extension._loadVertexDataAsync(context, primitive, babylonMesh); });
             };
             /** Helper method called by the loader to allow extensions to override loading materials. */
-            GLTFLoaderExtension._LoadMaterialAsync = function (loader, context, material, babylonMesh, assign) {
-                return loader._applyExtensions(function (extension) { return extension._loadMaterialAsync(context, material, babylonMesh, assign); });
+            GLTFLoaderExtension._LoadMaterialAsync = function (loader, context, material, babylonMesh, babylonDrawMode, assign) {
+                return loader._applyExtensions(function (extension) { return extension._loadMaterialAsync(context, material, babylonMesh, babylonDrawMode, assign); });
             };
             /** Helper method called by the loader to allow extensions to override loading uris. */
             GLTFLoaderExtension._LoadUriAsync = function (loader, context, uri) {
@@ -4221,7 +4226,7 @@ var BABYLON;
                         return firstPromise;
                     });
                 };
-                MSFT_lod.prototype._loadMaterialAsync = function (context, material, babylonMesh, assign) {
+                MSFT_lod.prototype._loadMaterialAsync = function (context, material, babylonMesh, babylonDrawMode, assign) {
                     var _this = this;
                     // Don't load material LODs if already loading a node LOD.
                     if (this._loadingNodeLOD) {
@@ -4238,13 +4243,14 @@ var BABYLON;
                                     _this._loadMaterialSignals[materialLOD._index] = new BABYLON.Deferred();
                                 }
                             }
-                            var promise = _this._loader._loadMaterialAsync("#/materials/" + materialLOD._index, materialLOD, babylonMesh, indexLOD === 0 ? assign : function () { }).then(function () {
+                            var promise = _this._loader._loadMaterialAsync("#/materials/" + materialLOD._index, materialLOD, babylonMesh, babylonDrawMode, indexLOD === 0 ? assign : function () { }).then(function () {
                                 if (indexLOD !== 0) {
-                                    assign(materialLOD._babylonMaterial);
-                                    var previousMaterialLOD = materialLODs[indexLOD - 1];
-                                    if (previousMaterialLOD._babylonMaterial) {
-                                        previousMaterialLOD._babylonMaterial.dispose();
-                                        delete previousMaterialLOD._babylonMaterial;
+                                    var babylonDataLOD = materialLOD._babylonData;
+                                    assign(babylonDataLOD[babylonDrawMode].material);
+                                    var previousBabylonDataLOD = materialLODs[indexLOD - 1]._babylonData;
+                                    if (previousBabylonDataLOD[babylonDrawMode]) {
+                                        previousBabylonDataLOD[babylonDrawMode].material.dispose();
+                                        delete previousBabylonDataLOD[babylonDrawMode];
                                     }
                                 }
                                 if (indexLOD !== materialLODs.length - 1) {
@@ -4433,27 +4439,32 @@ var BABYLON;
                     _this.name = NAME;
                     return _this;
                 }
-                KHR_materials_pbrSpecularGlossiness.prototype._loadMaterialAsync = function (context, material, babylonMesh, assign) {
+                KHR_materials_pbrSpecularGlossiness.prototype._loadMaterialAsync = function (context, material, babylonMesh, babylonDrawMode, assign) {
                     var _this = this;
                     return this._loadExtensionAsync(context, material, function (context, extension) {
-                        material._babylonMeshes = material._babylonMeshes || [];
-                        material._babylonMeshes.push(babylonMesh);
-                        if (!material._loaded) {
+                        material._babylonData = material._babylonData || {};
+                        var babylonData = material._babylonData[babylonDrawMode];
+                        if (!babylonData) {
                             var promises = new Array();
-                            var babylonMaterial = _this._loader._createMaterial(material);
-                            material._babylonMaterial = babylonMaterial;
-                            promises.push(_this._loader._loadMaterialBasePropertiesAsync(context, material));
-                            promises.push(_this._loadSpecularGlossinessPropertiesAsync(context, material, extension));
+                            var name_1 = material.name || "materialSG_" + material._index;
+                            var babylonMaterial = _this._loader._createMaterial(BABYLON.PBRMaterial, name_1, babylonDrawMode);
+                            promises.push(_this._loader._loadMaterialBasePropertiesAsync(context, material, babylonMaterial));
+                            promises.push(_this._loadSpecularGlossinessPropertiesAsync(context, material, extension, babylonMaterial));
                             _this._loader.onMaterialLoadedObservable.notifyObservers(babylonMaterial);
-                            material._loaded = Promise.all(promises).then(function () { });
+                            babylonData = {
+                                material: babylonMaterial,
+                                meshes: [],
+                                loaded: Promise.all(promises).then(function () { })
+                            };
+                            material._babylonData[babylonDrawMode] = babylonData;
                         }
-                        assign(material._babylonMaterial);
-                        return material._loaded;
+                        babylonData.meshes.push(babylonMesh);
+                        assign(babylonData.material);
+                        return babylonData.loaded;
                     });
                 };
-                KHR_materials_pbrSpecularGlossiness.prototype._loadSpecularGlossinessPropertiesAsync = function (context, material, properties) {
+                KHR_materials_pbrSpecularGlossiness.prototype._loadSpecularGlossinessPropertiesAsync = function (context, material, properties, babylonMaterial) {
                     var promises = new Array();
-                    var babylonMaterial = material._babylonMaterial;
                     if (properties.diffuseFactor) {
                         babylonMaterial.albedoColor = BABYLON.Color3.FromArray(properties.diffuseFactor);
                         babylonMaterial.alpha = properties.diffuseFactor[3];
@@ -4475,7 +4486,7 @@ var BABYLON;
                         babylonMaterial.reflectivityTexture.hasAlpha = true;
                         babylonMaterial.useMicroSurfaceFromReflectivityMapAlpha = true;
                     }
-                    this._loader._loadMaterialAlphaProperties(context, material);
+                    this._loader._loadMaterialAlphaProperties(context, material, babylonMaterial);
                     return Promise.all(promises).then(function () { });
                 };
                 return KHR_materials_pbrSpecularGlossiness;

File diff suppressed because it is too large
+ 3 - 3
dist/preview release/loaders/babylon.glTFFileLoader.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/preview release/loaders/babylon.objFileLoader.min.js


+ 94 - 83
dist/preview release/loaders/babylonjs.loaders.js

@@ -3670,6 +3670,7 @@ var BABYLON;
                 this._state = null;
                 this._extensions = {};
                 this._defaultSampler = {};
+                this._defaultBabylonMaterials = {};
                 this._requests = new Array();
                 this.coordinateSystemMode = BABYLON.GLTFLoaderCoordinateSystemMode.AUTO;
                 this.animationStartMode = BABYLON.GLTFLoaderAnimationStartMode.FIRST;
@@ -4054,12 +4055,13 @@ var BABYLON;
                     new BABYLON.Geometry(babylonMesh.name, _this._babylonScene, babylonVertexData, false, babylonMesh);
                     return _this._loadMorphTargetsAsync(context, primitive, babylonMesh, babylonVertexData);
                 }));
+                var babylonDrawMode = GLTFLoader._GetDrawMode(context, primitive.mode);
                 if (primitive.material == undefined) {
-                    babylonMesh.material = this._getDefaultMaterial();
+                    babylonMesh.material = this._getDefaultMaterial(babylonDrawMode);
                 }
                 else {
                     var material = GLTFLoader._GetProperty(context + "/material}", this._gltf.materials, primitive.material);
-                    promises.push(this._loadMaterialAsync("#/materials/" + material._index, material, babylonMesh, function (babylonMaterial) {
+                    promises.push(this._loadMaterialAsync("#/materials/" + material._index, material, babylonMesh, babylonDrawMode, function (babylonMaterial) {
                         babylonMesh.material = babylonMaterial;
                     }));
                 }
@@ -4075,10 +4077,6 @@ var BABYLON;
                 if (!attributes) {
                     throw new Error(context + ": Attributes are missing");
                 }
-                if (primitive.mode != undefined && primitive.mode !== 4 /* TRIANGLES */) {
-                    // TODO: handle other primitive modes
-                    throw new Error(context + ": Mode (" + primitive.mode + ") is not currently supported");
-                }
                 var promises = new Array();
                 var babylonVertexData = new BABYLON.VertexData();
                 if (primitive.indices == undefined) {
@@ -4462,19 +4460,9 @@ var BABYLON;
                             break;
                         }
                     }
-                    var keys;
-                    if (data.input.length === 1) {
-                        var key = getNextKey(0);
-                        keys = [
-                            { frame: key.frame, value: key.value },
-                            { frame: key.frame + 1, value: key.value }
-                        ];
-                    }
-                    else {
-                        keys = new Array(data.input.length);
-                        for (var frameIndex = 0; frameIndex < data.input.length; frameIndex++) {
-                            keys[frameIndex] = getNextKey(frameIndex);
-                        }
+                    var keys = new Array(data.input.length);
+                    for (var frameIndex = 0; frameIndex < data.input.length; frameIndex++) {
+                        keys[frameIndex] = getNextKey(frameIndex);
                     }
                     if (targetPath === "influence") {
                         var _loop_1 = function (targetIndex) {
@@ -4635,22 +4623,19 @@ var BABYLON;
                 }
                 return targetBuffer;
             };
-            GLTFLoader.prototype._getDefaultMaterial = function () {
-                var id = "__gltf_default";
-                var babylonMaterial = this._babylonScene.getMaterialByName(id);
+            GLTFLoader.prototype._getDefaultMaterial = function (drawMode) {
+                var babylonMaterial = this._defaultBabylonMaterials[drawMode];
                 if (!babylonMaterial) {
-                    babylonMaterial = new BABYLON.PBRMaterial(id, this._babylonScene);
+                    babylonMaterial = this._createMaterial(BABYLON.PBRMaterial, "__gltf_default", drawMode);
                     babylonMaterial.transparencyMode = BABYLON.PBRMaterial.PBRMATERIAL_OPAQUE;
-                    babylonMaterial.sideOrientation = this._babylonScene.useRightHandedSystem ? BABYLON.Material.CounterClockWiseSideOrientation : BABYLON.Material.ClockWiseSideOrientation;
                     babylonMaterial.metallic = 1;
                     babylonMaterial.roughness = 1;
                     this.onMaterialLoadedObservable.notifyObservers(babylonMaterial);
                 }
                 return babylonMaterial;
             };
-            GLTFLoader.prototype._loadMaterialMetallicRoughnessPropertiesAsync = function (context, material) {
+            GLTFLoader.prototype._loadMaterialMetallicRoughnessPropertiesAsync = function (context, material, babylonMaterial) {
                 var promises = new Array();
-                var babylonMaterial = material._babylonMaterial;
                 // Ensure metallic workflow
                 babylonMaterial.metallic = 1;
                 babylonMaterial.roughness = 1;
@@ -4679,36 +4664,42 @@ var BABYLON;
                         babylonMaterial.useRoughnessFromMetallicTextureAlpha = false;
                     }
                 }
-                this._loadMaterialAlphaProperties(context, material);
+                this._loadMaterialAlphaProperties(context, material, babylonMaterial);
                 return Promise.all(promises).then(function () { });
             };
-            GLTFLoader.prototype._loadMaterialAsync = function (context, material, babylonMesh, assign) {
-                var promise = GLTF2.GLTFLoaderExtension._LoadMaterialAsync(this, context, material, babylonMesh, assign);
+            GLTFLoader.prototype._loadMaterialAsync = function (context, material, babylonMesh, babylonDrawMode, assign) {
+                var promise = GLTF2.GLTFLoaderExtension._LoadMaterialAsync(this, context, material, babylonMesh, babylonDrawMode, assign);
                 if (promise) {
                     return promise;
                 }
-                material._babylonMeshes = material._babylonMeshes || [];
-                material._babylonMeshes.push(babylonMesh);
-                if (!material._loaded) {
+                material._babylonData = material._babylonData || {};
+                var babylonData = material._babylonData[babylonDrawMode];
+                if (!babylonData) {
                     var promises = new Array();
-                    var babylonMaterial = this._createMaterial(material);
-                    material._babylonMaterial = babylonMaterial;
-                    promises.push(this._loadMaterialBasePropertiesAsync(context, material));
-                    promises.push(this._loadMaterialMetallicRoughnessPropertiesAsync(context, material));
+                    var name_3 = material.name || "materialSG_" + material._index;
+                    var babylonMaterial = this._createMaterial(BABYLON.PBRMaterial, name_3, babylonDrawMode);
+                    promises.push(this._loadMaterialBasePropertiesAsync(context, material, babylonMaterial));
+                    promises.push(this._loadMaterialMetallicRoughnessPropertiesAsync(context, material, babylonMaterial));
                     this.onMaterialLoadedObservable.notifyObservers(babylonMaterial);
-                    material._loaded = Promise.all(promises).then(function () { });
+                    babylonData = {
+                        material: babylonMaterial,
+                        meshes: [],
+                        loaded: Promise.all(promises).then(function () { })
+                    };
+                    material._babylonData[babylonDrawMode] = babylonData;
                 }
-                assign(material._babylonMaterial);
-                return material._loaded;
+                babylonData.meshes.push(babylonMesh);
+                assign(babylonData.material);
+                return babylonData.loaded;
             };
-            GLTFLoader.prototype._createMaterial = function (material) {
-                var babylonMaterial = new BABYLON.PBRMaterial(material.name || "material" + material._index, this._babylonScene);
+            GLTFLoader.prototype._createMaterial = function (type, name, drawMode) {
+                var babylonMaterial = new type(name, this._babylonScene);
                 babylonMaterial.sideOrientation = this._babylonScene.useRightHandedSystem ? BABYLON.Material.CounterClockWiseSideOrientation : BABYLON.Material.ClockWiseSideOrientation;
+                babylonMaterial.fillMode = drawMode;
                 return babylonMaterial;
             };
-            GLTFLoader.prototype._loadMaterialBasePropertiesAsync = function (context, material) {
+            GLTFLoader.prototype._loadMaterialBasePropertiesAsync = function (context, material, babylonMaterial) {
                 var promises = new Array();
-                var babylonMaterial = material._babylonMaterial;
                 babylonMaterial.emissiveColor = material.emissiveFactor ? BABYLON.Color3.FromArray(material.emissiveFactor) : new BABYLON.Color3(0, 0, 0);
                 if (material.doubleSided) {
                     babylonMaterial.backFaceCulling = false;
@@ -4740,8 +4731,7 @@ var BABYLON;
                 }
                 return Promise.all(promises).then(function () { });
             };
-            GLTFLoader.prototype._loadMaterialAlphaProperties = function (context, material) {
-                var babylonMaterial = material._babylonMaterial;
+            GLTFLoader.prototype._loadMaterialAlphaProperties = function (context, material, babylonMaterial) {
                 var alphaMode = material.alphaMode || "OPAQUE" /* OPAQUE */;
                 switch (alphaMode) {
                     case "OPAQUE" /* OPAQUE */: {
@@ -4961,21 +4951,36 @@ var BABYLON;
             GLTFLoader._ValidateUri = function (uri) {
                 return (BABYLON.Tools.IsBase64(uri) || uri.indexOf("..") === -1);
             };
+            GLTFLoader._GetDrawMode = function (context, mode) {
+                mode = mode || 4 /* TRIANGLES */;
+                switch (mode) {
+                    case 0 /* POINTS */: return BABYLON.Material.PointListDrawMode;
+                    case 1 /* LINES */: return BABYLON.Material.LineListDrawMode;
+                    case 2 /* LINE_LOOP */: return BABYLON.Material.LineLoopDrawMode;
+                    case 3 /* LINE_STRIP */: return BABYLON.Material.LineStripDrawMode;
+                    case 4 /* TRIANGLES */: return BABYLON.Material.TriangleFillMode;
+                    case 5 /* TRIANGLE_STRIP */: return BABYLON.Material.TriangleStripDrawMode;
+                    case 6 /* TRIANGLE_FAN */: return BABYLON.Material.TriangleFanDrawMode;
+                }
+                throw new Error(context + ": Invalid mesh primitive mode (" + mode + ")");
+            };
             GLTFLoader.prototype._compileMaterialsAsync = function () {
                 var promises = new Array();
                 if (this._gltf.materials) {
                     for (var _i = 0, _a = this._gltf.materials; _i < _a.length; _i++) {
                         var material = _a[_i];
-                        var babylonMaterial = material._babylonMaterial;
-                        var babylonMeshes = material._babylonMeshes;
-                        if (babylonMaterial && babylonMeshes) {
-                            for (var _b = 0, babylonMeshes_1 = babylonMeshes; _b < babylonMeshes_1.length; _b++) {
-                                var babylonMesh = babylonMeshes_1[_b];
-                                // Ensure nonUniformScaling is set if necessary.
-                                babylonMesh.computeWorldMatrix(true);
-                                promises.push(babylonMaterial.forceCompilationAsync(babylonMesh));
-                                if (this.useClipPlane) {
-                                    promises.push(babylonMaterial.forceCompilationAsync(babylonMesh, { clipPlane: true }));
+                        if (material._babylonData) {
+                            for (var babylonDrawMode in material._babylonData) {
+                                var babylonData = material._babylonData[babylonDrawMode];
+                                for (var _b = 0, _c = babylonData.meshes; _b < _c.length; _b++) {
+                                    var babylonMesh = _c[_b];
+                                    // Ensure nonUniformScaling is set if necessary.
+                                    babylonMesh.computeWorldMatrix(true);
+                                    var babylonMaterial = babylonData.material;
+                                    promises.push(babylonMaterial.forceCompilationAsync(babylonMesh));
+                                    if (this.useClipPlane) {
+                                        promises.push(babylonMaterial.forceCompilationAsync(babylonMesh, { clipPlane: true }));
+                                    }
                                 }
                             }
                         }
@@ -5015,8 +5020,8 @@ var BABYLON;
                 delete this._gltf;
                 delete this._babylonScene;
                 this._completePromises.length = 0;
-                for (var name_3 in this._extensions) {
-                    this._extensions[name_3].dispose();
+                for (var name_4 in this._extensions) {
+                    this._extensions[name_4].dispose();
                 }
                 this._extensions = {};
                 delete this._rootBabylonMesh;
@@ -5027,8 +5032,8 @@ var BABYLON;
             };
             GLTFLoader.prototype._applyExtensions = function (actionAsync) {
                 for (var _i = 0, _a = GLTFLoader._Names; _i < _a.length; _i++) {
-                    var name_4 = _a[_i];
-                    var extension = this._extensions[name_4];
+                    var name_5 = _a[_i];
+                    var extension = this._extensions[name_5];
                     if (extension.enabled) {
                         var promise = actionAsync(extension);
                         if (promise) {
@@ -5070,7 +5075,7 @@ var BABYLON;
             /** Override this method to modify the default behavior for loading mesh primitive vertex data. */
             GLTFLoaderExtension.prototype._loadVertexDataAsync = function (context, primitive, babylonMesh) { return null; };
             /** Override this method to modify the default behavior for loading materials. */
-            GLTFLoaderExtension.prototype._loadMaterialAsync = function (context, material, babylonMesh, assign) { return null; };
+            GLTFLoaderExtension.prototype._loadMaterialAsync = function (context, material, babylonMesh, babylonDrawMode, assign) { return null; };
             /** Override this method to modify the default behavior for loading uris. */
             GLTFLoaderExtension.prototype._loadUriAsync = function (context, uri) { return null; };
             // #endregion
@@ -5107,8 +5112,8 @@ var BABYLON;
                 return loader._applyExtensions(function (extension) { return extension._loadVertexDataAsync(context, primitive, babylonMesh); });
             };
             /** Helper method called by the loader to allow extensions to override loading materials. */
-            GLTFLoaderExtension._LoadMaterialAsync = function (loader, context, material, babylonMesh, assign) {
-                return loader._applyExtensions(function (extension) { return extension._loadMaterialAsync(context, material, babylonMesh, assign); });
+            GLTFLoaderExtension._LoadMaterialAsync = function (loader, context, material, babylonMesh, babylonDrawMode, assign) {
+                return loader._applyExtensions(function (extension) { return extension._loadMaterialAsync(context, material, babylonMesh, babylonDrawMode, assign); });
             };
             /** Helper method called by the loader to allow extensions to override loading uris. */
             GLTFLoaderExtension._LoadUriAsync = function (loader, context, uri) {
@@ -5190,7 +5195,7 @@ var BABYLON;
                         return firstPromise;
                     });
                 };
-                MSFT_lod.prototype._loadMaterialAsync = function (context, material, babylonMesh, assign) {
+                MSFT_lod.prototype._loadMaterialAsync = function (context, material, babylonMesh, babylonDrawMode, assign) {
                     var _this = this;
                     // Don't load material LODs if already loading a node LOD.
                     if (this._loadingNodeLOD) {
@@ -5207,13 +5212,14 @@ var BABYLON;
                                     _this._loadMaterialSignals[materialLOD._index] = new BABYLON.Deferred();
                                 }
                             }
-                            var promise = _this._loader._loadMaterialAsync("#/materials/" + materialLOD._index, materialLOD, babylonMesh, indexLOD === 0 ? assign : function () { }).then(function () {
+                            var promise = _this._loader._loadMaterialAsync("#/materials/" + materialLOD._index, materialLOD, babylonMesh, babylonDrawMode, indexLOD === 0 ? assign : function () { }).then(function () {
                                 if (indexLOD !== 0) {
-                                    assign(materialLOD._babylonMaterial);
-                                    var previousMaterialLOD = materialLODs[indexLOD - 1];
-                                    if (previousMaterialLOD._babylonMaterial) {
-                                        previousMaterialLOD._babylonMaterial.dispose();
-                                        delete previousMaterialLOD._babylonMaterial;
+                                    var babylonDataLOD = materialLOD._babylonData;
+                                    assign(babylonDataLOD[babylonDrawMode].material);
+                                    var previousBabylonDataLOD = materialLODs[indexLOD - 1]._babylonData;
+                                    if (previousBabylonDataLOD[babylonDrawMode]) {
+                                        previousBabylonDataLOD[babylonDrawMode].material.dispose();
+                                        delete previousBabylonDataLOD[babylonDrawMode];
                                     }
                                 }
                                 if (indexLOD !== materialLODs.length - 1) {
@@ -5384,27 +5390,32 @@ var BABYLON;
                     _this.name = NAME;
                     return _this;
                 }
-                KHR_materials_pbrSpecularGlossiness.prototype._loadMaterialAsync = function (context, material, babylonMesh, assign) {
+                KHR_materials_pbrSpecularGlossiness.prototype._loadMaterialAsync = function (context, material, babylonMesh, babylonDrawMode, assign) {
                     var _this = this;
                     return this._loadExtensionAsync(context, material, function (context, extension) {
-                        material._babylonMeshes = material._babylonMeshes || [];
-                        material._babylonMeshes.push(babylonMesh);
-                        if (!material._loaded) {
+                        material._babylonData = material._babylonData || {};
+                        var babylonData = material._babylonData[babylonDrawMode];
+                        if (!babylonData) {
                             var promises = new Array();
-                            var babylonMaterial = _this._loader._createMaterial(material);
-                            material._babylonMaterial = babylonMaterial;
-                            promises.push(_this._loader._loadMaterialBasePropertiesAsync(context, material));
-                            promises.push(_this._loadSpecularGlossinessPropertiesAsync(context, material, extension));
+                            var name_1 = material.name || "materialSG_" + material._index;
+                            var babylonMaterial = _this._loader._createMaterial(BABYLON.PBRMaterial, name_1, babylonDrawMode);
+                            promises.push(_this._loader._loadMaterialBasePropertiesAsync(context, material, babylonMaterial));
+                            promises.push(_this._loadSpecularGlossinessPropertiesAsync(context, material, extension, babylonMaterial));
                             _this._loader.onMaterialLoadedObservable.notifyObservers(babylonMaterial);
-                            material._loaded = Promise.all(promises).then(function () { });
+                            babylonData = {
+                                material: babylonMaterial,
+                                meshes: [],
+                                loaded: Promise.all(promises).then(function () { })
+                            };
+                            material._babylonData[babylonDrawMode] = babylonData;
                         }
-                        assign(material._babylonMaterial);
-                        return material._loaded;
+                        babylonData.meshes.push(babylonMesh);
+                        assign(babylonData.material);
+                        return babylonData.loaded;
                     });
                 };
-                KHR_materials_pbrSpecularGlossiness.prototype._loadSpecularGlossinessPropertiesAsync = function (context, material, properties) {
+                KHR_materials_pbrSpecularGlossiness.prototype._loadSpecularGlossinessPropertiesAsync = function (context, material, properties, babylonMaterial) {
                     var promises = new Array();
-                    var babylonMaterial = material._babylonMaterial;
                     if (properties.diffuseFactor) {
                         babylonMaterial.albedoColor = BABYLON.Color3.FromArray(properties.diffuseFactor);
                         babylonMaterial.alpha = properties.diffuseFactor[3];
@@ -5426,7 +5437,7 @@ var BABYLON;
                         babylonMaterial.reflectivityTexture.hasAlpha = true;
                         babylonMaterial.useMicroSurfaceFromReflectivityMapAlpha = true;
                     }
-                    this._loader._loadMaterialAlphaProperties(context, material);
+                    this._loader._loadMaterialAlphaProperties(context, material, babylonMaterial);
                     return Promise.all(promises).then(function () { });
                 };
                 return KHR_materials_pbrSpecularGlossiness;

File diff suppressed because it is too large
+ 3 - 3
dist/preview release/loaders/babylonjs.loaders.min.js


+ 26 - 17
dist/preview release/loaders/babylonjs.loaders.module.d.ts

@@ -857,7 +857,6 @@ declare module BABYLON.GLTF2 {
         _data?: Promise<TypedArray>;
     }
     interface ILoaderAnimationChannel extends IAnimationChannel, IArrayItem {
-        _babylonAnimationGroup: AnimationGroup;
     }
     interface ILoaderAnimationSamplerData {
         input: Float32Array;
@@ -870,7 +869,7 @@ declare module BABYLON.GLTF2 {
     interface ILoaderAnimation extends IAnimation, IArrayItem {
         channels: ILoaderAnimationChannel[];
         samplers: ILoaderAnimationSampler[];
-        _babylonAnimationGroup: Nullable<AnimationGroup>;
+        _babylonAnimationGroup?: AnimationGroup;
     }
     interface ILoaderBuffer extends IBuffer, IArrayItem {
         _data?: Promise<ArrayBufferView>;
@@ -884,9 +883,13 @@ declare module BABYLON.GLTF2 {
         _objectURL?: Promise<string>;
     }
     interface ILoaderMaterial extends IMaterial, IArrayItem {
-        _babylonMaterial?: Material;
-        _babylonMeshes?: AbstractMesh[];
-        _loaded?: Promise<void>;
+        _babylonData?: {
+            [drawMode: number]: {
+                material: Material;
+                meshes: AbstractMesh[];
+                loaded: Promise<void>;
+            };
+        };
     }
     interface ILoaderMesh extends IMesh, IArrayItem {
         primitives: ILoaderMeshPrimitive[];
@@ -912,7 +915,7 @@ declare module BABYLON.GLTF2 {
     interface ILoaderScene extends IScene, IArrayItem {
     }
     interface ILoaderSkin extends ISkin, IArrayItem {
-        _babylonSkeleton: Nullable<Skeleton>;
+        _babylonSkeleton?: Skeleton;
         _loaded?: Promise<void>;
     }
     interface ILoaderTexture extends ITexture, IArrayItem {
@@ -936,6 +939,10 @@ declare module BABYLON.GLTF2 {
 
 
 declare module BABYLON.GLTF2 {
+    interface MaterialConstructor<T extends Material> {
+        readonly prototype: T;
+        new (name: string, scene: Scene): T;
+    }
     class GLTFLoader implements IGLTFLoader {
         _gltf: ILoaderGLTF;
         _babylonScene: Scene;
@@ -946,6 +953,7 @@ declare module BABYLON.GLTF2 {
         private _rootUrl;
         private _rootBabylonMesh;
         private _defaultSampler;
+        private _defaultBabylonMaterials;
         private _progressCallback?;
         private _requests;
         private static _Names;
@@ -1007,12 +1015,12 @@ declare module BABYLON.GLTF2 {
         _loadBufferViewAsync(context: string, bufferView: ILoaderBufferView): Promise<ArrayBufferView>;
         private _loadAccessorAsync(context, accessor);
         private _buildArrayBuffer<T>(typedArray, data, byteOffset, count, numComponents, byteStride?);
-        private _getDefaultMaterial();
-        private _loadMaterialMetallicRoughnessPropertiesAsync(context, material);
-        _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, assign: (babylonMaterial: Material) => void): Promise<void>;
-        _createMaterial(material: ILoaderMaterial): PBRMaterial;
-        _loadMaterialBasePropertiesAsync(context: string, material: ILoaderMaterial): Promise<void>;
-        _loadMaterialAlphaProperties(context: string, material: ILoaderMaterial): void;
+        private _getDefaultMaterial(drawMode);
+        private _loadMaterialMetallicRoughnessPropertiesAsync(context, material, babylonMaterial);
+        _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Promise<void>;
+        _createMaterial<T extends Material>(type: MaterialConstructor<T>, name: string, drawMode: number): T;
+        _loadMaterialBasePropertiesAsync(context: string, material: ILoaderMaterial, babylonMaterial: PBRMaterial): Promise<void>;
+        _loadMaterialAlphaProperties(context: string, material: ILoaderMaterial, babylonMaterial: PBRMaterial): void;
         _loadTextureAsync(context: string, textureInfo: ITextureInfo, assign: (texture: Texture) => void): Promise<void>;
         private _loadSampler(context, sampler);
         private _loadImageAsync(context, image);
@@ -1023,6 +1031,7 @@ declare module BABYLON.GLTF2 {
         private static _GetTextureSamplingMode(context, magFilter?, minFilter?);
         private static _GetNumComponents(context, type);
         private static _ValidateUri(uri);
+        private static _GetDrawMode(context, mode);
         private _compileMaterialsAsync();
         private _compileShadowGeneratorsAsync();
         private _clear();
@@ -1045,7 +1054,7 @@ declare module BABYLON.GLTF2 {
         /** Override this method to modify the default behavior for loading mesh primitive vertex data. */
         protected _loadVertexDataAsync(context: string, primitive: ILoaderMeshPrimitive, babylonMesh: Mesh): Nullable<Promise<VertexData>>;
         /** Override this method to modify the default behavior for loading materials. */
-        protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
+        protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
         /** Override this method to modify the default behavior for loading uris. */
         protected _loadUriAsync(context: string, uri: string): Nullable<Promise<ArrayBufferView>>;
         /** Helper method called by a loader extension to load an glTF extension. */
@@ -1057,7 +1066,7 @@ declare module BABYLON.GLTF2 {
         /** Helper method called by the loader to allow extensions to override loading mesh primitive vertex data. */
         static _LoadVertexDataAsync(loader: GLTFLoader, context: string, primitive: ILoaderMeshPrimitive, babylonMesh: Mesh): Nullable<Promise<VertexData>>;
         /** Helper method called by the loader to allow extensions to override loading materials. */
-        static _LoadMaterialAsync(loader: GLTFLoader, context: string, material: ILoaderMaterial, babylonMesh: Mesh, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
+        static _LoadMaterialAsync(loader: GLTFLoader, context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
         /** Helper method called by the loader to allow extensions to override loading uris. */
         static _LoadUriAsync(loader: GLTFLoader, context: string, uri: string): Nullable<Promise<ArrayBufferView>>;
     }
@@ -1076,7 +1085,7 @@ declare module BABYLON.GLTF2.Extensions {
         private _loadingMaterialLOD;
         private _loadMaterialSignals;
         protected _loadNodeAsync(context: string, node: ILoaderNode): Nullable<Promise<void>>;
-        protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
+        protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
         protected _loadUriAsync(context: string, uri: string): Nullable<Promise<ArrayBufferView>>;
         /**
          * Gets an array of LOD properties from lowest to highest.
@@ -1100,8 +1109,8 @@ declare module BABYLON.GLTF2.Extensions {
 declare module BABYLON.GLTF2.Extensions {
     class KHR_materials_pbrSpecularGlossiness extends GLTFLoaderExtension {
         readonly name: string;
-        protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
-        private _loadSpecularGlossinessPropertiesAsync(context, material, properties);
+        protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
+        private _loadSpecularGlossinessPropertiesAsync(context, material, properties, babylonMaterial);
     }
 }
 

File diff suppressed because it is too large
+ 1 - 1
dist/preview release/materialsLibrary/babylon.customMaterial.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/preview release/materialsLibrary/babylon.shadowOnlyMaterial.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/preview release/materialsLibrary/babylon.waterMaterial.min.js


File diff suppressed because it is too large
+ 3 - 3
dist/preview release/materialsLibrary/babylonjs.materials.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/preview release/postProcessesLibrary/babylon.asciiArtPostProcess.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/preview release/postProcessesLibrary/babylon.digitalRainPostProcess.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/preview release/postProcessesLibrary/babylonjs.postProcess.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/preview release/serializers/babylon.glTF2Serializer.min.js


File diff suppressed because it is too large
+ 1 - 1
dist/preview release/serializers/babylonjs.serializers.min.js


File diff suppressed because it is too large
+ 65 - 65
dist/preview release/viewer/babylon.viewer.js


File diff suppressed because it is too large
+ 189 - 126
dist/preview release/viewer/babylon.viewer.max.js


+ 8 - 8
src/Engine/babylon.engine.ts

@@ -597,7 +597,7 @@
         }
 
         public static get Version(): string {
-            return "3.2.0-alphaC";
+            return "3.2.0-beta.1";
         }
 
         // Updatable statics so stick with vars here
@@ -1273,18 +1273,18 @@
             // Checks if some of the format renders first to allow the use of webgl inspector.
             this._caps.colorBufferFloat = this._webGLVersion > 1 && this._gl.getExtension('EXT_color_buffer_float');
 
-            this._caps.textureFloat = this._webGLVersion > 1 || this._gl.getExtension('OES_texture_float');
-            this._caps.textureFloatLinearFiltering = this._caps.textureFloat && this._gl.getExtension('OES_texture_float_linear');
-            this._caps.textureFloatRender = this._caps.textureFloat && this._canRenderToFloatFramebuffer();
+            this._caps.textureFloat = (this._webGLVersion > 1 || this._gl.getExtension('OES_texture_float')) ? true : false;
+            this._caps.textureFloatLinearFiltering = this._caps.textureFloat && this._gl.getExtension('OES_texture_float_linear') ? true : false;
+            this._caps.textureFloatRender = this._caps.textureFloat && this._canRenderToFloatFramebuffer() ? true: false;
 
-            this._caps.textureHalfFloat = this._webGLVersion > 1 || this._gl.getExtension('OES_texture_half_float');
-            this._caps.textureHalfFloatLinearFiltering = this._webGLVersion > 1 || (this._caps.textureHalfFloat && this._gl.getExtension('OES_texture_half_float_linear'));
+            this._caps.textureHalfFloat = (this._webGLVersion > 1 || this._gl.getExtension('OES_texture_half_float')) ? true: false;
+            this._caps.textureHalfFloatLinearFiltering = (this._webGLVersion > 1 || (this._caps.textureHalfFloat && this._gl.getExtension('OES_texture_half_float_linear'))) ? true : false;
             if (this._webGLVersion > 1) {
                 this._gl.HALF_FLOAT_OES = 0x140B;
             }
             this._caps.textureHalfFloatRender = this._caps.textureHalfFloat && this._canRenderToHalfFloatFramebuffer();
 
-            this._caps.textureLOD = this._webGLVersion > 1 || this._gl.getExtension('EXT_shader_texture_lod');
+            this._caps.textureLOD = (this._webGLVersion > 1 || this._gl.getExtension('EXT_shader_texture_lod')) ? true: false;
 
             // Draw buffers
             if (this._webGLVersion > 1) {
@@ -1298,7 +1298,7 @@
                     this._gl.DRAW_FRAMEBUFFER = this._gl.FRAMEBUFFER;
 
                     for (var i = 0; i < 16; i++) {
-                        (<any>this._gl)["COLOR_ATTACHMENT" + i + "_WEBGL"] = drawBuffersExtension["COLOR_ATTACHMENT" + i + "_WEBGL"];
+                        (<any>this._gl)["COLOR_ATTACHMENT" + i + "_WEBGL"] = (<any>drawBuffersExtension)["COLOR_ATTACHMENT" + i + "_WEBGL"];
                     }
                 } else {
                     this._caps.drawBuffersExtension = false;

+ 2 - 1
src/Particles/babylon.gpuParticleSystem.ts

@@ -262,7 +262,8 @@
          * @return true if the system is ready
          */
         public isReady(): boolean {
-            if (!this.emitter || !this._updateEffect.isReady() || !this._renderEffect.isReady() || !this.particleTexture || !this.particleTexture.isReady()) {
+            if (!this.emitter || !this._updateEffect || !this._renderEffect || 
+                !this._updateEffect.isReady() || !this._renderEffect.isReady() || !this.particleTexture || !this.particleTexture.isReady()) {
                 return false;
             }
 

+ 20 - 19
src/Tools/babylon.tools.ts

@@ -815,11 +815,6 @@
                     continue;
                 }
 
-                let descriptor = Object.getOwnPropertyDescriptor(source, prop);
-                //descriptor should exist, should be writable, and should not be a getter.
-                if (!descriptor || !descriptor.writable || descriptor.get) {
-                    continue;
-                }
                 var sourceValue = source[prop];
                 var typeOfSourceValue = typeof sourceValue;
 
@@ -827,28 +822,34 @@
                     continue;
                 }
 
-                if (typeOfSourceValue === "object") {
-                    if (sourceValue instanceof Array) {
-                        destination[prop] = [];
+                try
+                {
+                    if (typeOfSourceValue === "object") {
+                        if (sourceValue instanceof Array) {
+                            destination[prop] = [];
 
-                        if (sourceValue.length > 0) {
-                            if (typeof sourceValue[0] == "object") {
-                                for (var index = 0; index < sourceValue.length; index++) {
-                                    var clonedValue = cloneValue(sourceValue[index], destination);
+                            if (sourceValue.length > 0) {
+                                if (typeof sourceValue[0] == "object") {
+                                    for (var index = 0; index < sourceValue.length; index++) {
+                                        var clonedValue = cloneValue(sourceValue[index], destination);
 
-                                    if (destination[prop].indexOf(clonedValue) === -1) { // Test if auto inject was not done
-                                        destination[prop].push(clonedValue);
+                                        if (destination[prop].indexOf(clonedValue) === -1) { // Test if auto inject was not done
+                                            destination[prop].push(clonedValue);
+                                        }
                                     }
+                                } else {
+                                    destination[prop] = sourceValue.slice(0);
                                 }
-                            } else {
-                                destination[prop] = sourceValue.slice(0);
                             }
+                        } else {
+                            destination[prop] = cloneValue(sourceValue, destination);
                         }
                     } else {
-                        destination[prop] = cloneValue(sourceValue, destination);
+                        destination[prop] = sourceValue;
                     }
-                } else {
-                    destination[prop] = sourceValue;
+                }
+                catch (e) {
+                    // Just ignore error (it could be because of a read-only property)
                 }
             }
         }