Browse Source

Merge remote-tracking branch 'upstream/master' into Development

sevan 8 năm trước cách đây
mục cha
commit
812971be82

+ 29 - 26
Playground/scripts/ssao 2.js

@@ -29,33 +29,36 @@ var createScene = function () {
         blurRatio: 0.5// Ratio of the combine post-process (combines the SSAO and the scene)
     };
 
-    var ssao = new BABYLON.SSAO2RenderingPipeline("ssao", scene, ssaoRatio);
-    ssao.radius = 3.5;
-    ssao.totalStrength = 1.3;
-    ssao.expensiveBlur = true;
-    ssao.samples = 16;
-    ssao.maxZ = 250;
+    if (BABYLON.SSAO2RenderingPipeline.IsSupported) {
+        var ssao = new BABYLON.SSAO2RenderingPipeline("ssao", scene, ssaoRatio);
+        ssao.radius = 3.5;
+        ssao.totalStrength = 1.3;
+        ssao.expensiveBlur = true;
+        ssao.samples = 16;
+        ssao.maxZ = 250;
+        // Attach camera to the SSAO render pipeline
+        scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline("ssao", camera);
 
-    // Attach camera to the SSAO render pipeline
-    scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline("ssao", camera);
-
-    // Manage SSAO
-    window.addEventListener("keydown", function (evt) {
-        // draw SSAO with scene when pressed "1"
-        if (evt.keyCode === 49) {
-            scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline("ssao", camera);
-            scene.postProcessRenderPipelineManager.enableEffectInPipeline("ssao", ssao.SSAOCombineRenderEffect, camera);
-        }
-            // draw without SSAO when pressed "2"
-        else if (evt.keyCode === 50) {
-            scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline("ssao", camera);
-        }
-            // draw only SSAO when pressed "2"
-        else if (evt.keyCode === 51) {
-            scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline("ssao", camera);
-            scene.postProcessRenderPipelineManager.disableEffectInPipeline("ssao", ssao.SSAOCombineRenderEffect, camera);
-        }
-    });
+        // Manage SSAO
+        window.addEventListener("keydown", function (evt) {
+            // draw SSAO with scene when pressed "1"
+            if (evt.keyCode === 49) {
+                scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline("ssao", camera);
+                scene.postProcessRenderPipelineManager.enableEffectInPipeline("ssao", ssao.SSAOCombineRenderEffect, camera);
+            }
+                // draw without SSAO when pressed "2"
+            else if (evt.keyCode === 50) {
+                scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline("ssao", camera);
+            }
+                // draw only SSAO when pressed "2"
+            else if (evt.keyCode === 51) {
+                scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline("ssao", camera);
+                scene.postProcessRenderPipelineManager.disableEffectInPipeline("ssao", ssao.SSAOCombineRenderEffect, camera);
+            }
+        });
+    } else {
+        alert("WebGL2 is required to use SSAO2 effect");
+    }
 
     return scene;
 }

+ 7 - 0
src/Loading/Plugins/babylon.babylonFileLoader.ts

@@ -31,6 +31,13 @@
 
     SceneLoader.RegisterPlugin({
         extensions: ".babylon",
+        canDirectLoad: (data: string) => {
+            if (data.indexOf("babylon") !== -1) { // We consider that the producer string is filled
+                return true;
+            }
+
+            return false;
+        },
         importMesh: (meshesNames: any, scene: Scene, data: any, rootUrl: string, meshes: AbstractMesh[], particleSystems: ParticleSystem[], skeletons: Skeleton[]): boolean => {
             // Entire method running in try block, so ALWAYS logs as far as it got, only actually writes details
             // when SceneLoader.debugLogging = true (default), or exception encountered.

+ 19 - 5
src/Loading/babylon.sceneLoader.ts

@@ -8,13 +8,15 @@
     export interface ISceneLoaderPlugin {
         extensions: string | ISceneLoaderPluginExtensions;
         importMesh: (meshesNames: any, scene: Scene, data: any, rootUrl: string, meshes: AbstractMesh[], particleSystems: ParticleSystem[], skeletons: Skeleton[]) => boolean;
-        load: (scene: Scene, data: string, rootUrl: string) => boolean;
+        load: (scene: Scene, data: string, rootUrl: string) => boolean;        
+        canDirectLoad?: (data: string) => boolean;
     }
 
     export interface ISceneLoaderPluginAsync {
         extensions: string | ISceneLoaderPluginExtensions;
         importMeshAsync: (meshesNames: any, scene: Scene, data: any, rootUrl: string, onsuccess: (meshes: AbstractMesh[], particleSystems: ParticleSystem[], skeletons: Skeleton[]) => void, onerror: () => void) => void;
-        loadAsync: (scene: Scene, data: string, rootUrl: string, onsuccess: () => void, onerror: () => void) => void;
+        loadAsync: (scene: Scene, data: string, rootUrl: string, onsuccess: () => void, onerror: () => void) => void;        
+        canDirectLoad?: (data: string) => boolean;
     }
 
     interface IRegisteredPlugin {
@@ -85,6 +87,18 @@
             return SceneLoader._getDefaultPlugin();
         }
 
+        private static _getPluginForDirectLoad(data: string): IRegisteredPlugin {
+            for (var extension in SceneLoader._registeredPlugins) {
+                var plugin = SceneLoader._registeredPlugins[extension].plugin;
+
+                if (plugin.canDirectLoad && plugin.canDirectLoad(data)) {
+                    return SceneLoader._registeredPlugins[extension];
+                }
+            }
+
+            return SceneLoader._getDefaultPlugin();
+        }
+
         private static _getPluginForFilename(sceneFilename: any): IRegisteredPlugin {
             if (sceneFilename.name) {
                 sceneFilename = sceneFilename.name;
@@ -146,7 +160,7 @@
                 return;
             }
 
-            var directLoad =SceneLoader._getDirectLoad(sceneFilename);
+            var directLoad = SceneLoader._getDirectLoad(sceneFilename);
 
             var loadingToken = {};
             scene._addPendingData(loadingToken);
@@ -154,7 +168,7 @@
             var manifestChecked = success => {
                 scene.database = database;
 
-                var registeredPlugin = directLoad ? SceneLoader._getDefaultPlugin() : SceneLoader._getPluginForFilename(sceneFilename);
+                var registeredPlugin = directLoad ? SceneLoader._getPluginForDirectLoad(sceneFilename) : SceneLoader._getPluginForFilename(sceneFilename);
                 var plugin = registeredPlugin.plugin;
                 var useArrayBuffer = registeredPlugin.isBinary;
 
@@ -257,7 +271,7 @@
             }
 
             var directLoad = SceneLoader._getDirectLoad(sceneFilename);
-            var registeredPlugin = directLoad ? SceneLoader._getDefaultPlugin() : SceneLoader._getPluginForFilename(sceneFilename);
+            var registeredPlugin = directLoad ? SceneLoader._getPluginForDirectLoad(sceneFilename) : SceneLoader._getPluginForFilename(sceneFilename);
             var plugin = registeredPlugin.plugin;
             var useArrayBuffer = registeredPlugin.isBinary;
             var database;

+ 2 - 2
src/PostProcess/babylon.ssao2RenderingPipeline.ts

@@ -118,8 +118,8 @@
         *  Support test.
         * @type {boolean}
         */
-        public get isSupported(): boolean {
-            var engine = this._scene.getEngine();
+        public static get IsSupported(): boolean {
+            var engine = Engine.LastCreatedEngine;
             return engine.webGLVersion > 1;
         }
 

+ 15 - 2
src/Rendering/babylon.renderingGroup.ts

@@ -16,6 +16,8 @@
         private _renderAlphaTest: (subMeshes: SmartArray<SubMesh>) => void;
         private _renderTransparent: (subMeshes: SmartArray<SubMesh>) => void;
 
+        private _edgesRenderers = new SmartArray<EdgesRenderer>(16);
+
         public onBeforeTransparentRendering: () => void;
 
         /**
@@ -125,6 +127,11 @@
                 engine.setAlphaMode(Engine.ALPHA_DISABLE);
             }
             engine.setStencilBuffer(stencilState);
+
+            // Edges
+            for (var edgesRendererIndex = 0; edgesRendererIndex < this._edgesRenderers.length; edgesRendererIndex++) {
+                this._edgesRenderers.data[edgesRendererIndex].render();
+            }
         }
 
         /**
@@ -256,7 +263,8 @@
             this._transparentSubMeshes.reset();
             this._alphaTestSubMeshes.reset();
             this._particleSystems.reset();
-            this._spriteManagers.reset();
+            this._spriteManagers.reset();            
+            this._edgesRenderers.reset();
         }
 
         public dispose(): void {
@@ -264,7 +272,8 @@
             this._transparentSubMeshes.dispose();
             this._alphaTestSubMeshes.dispose();
             this._particleSystems.dispose();
-            this._spriteManagers.dispose();
+            this._spriteManagers.dispose();                      
+            this._edgesRenderers.dispose();
         }
 
         /**
@@ -282,6 +291,10 @@
             } else {
                 this._opaqueSubMeshes.push(subMesh); // Opaque
             }
+
+            if (mesh._edgesRenderer) {
+                this._edgesRenderers.push(mesh._edgesRenderer);
+            }
         }
 
         public dispatchSprites(spriteManager: SpriteManager) {

+ 1 - 13
src/babylon.scene.ts

@@ -725,8 +725,7 @@
         private _sceneUbo: UniformBuffer;
 
         private _pickWithRayInverseMatrix: Matrix;
-
-        private _edgesRenderers = new SmartArray<EdgesRenderer>(16);
+        
         private _boundingBoxRenderer: BoundingBoxRenderer;
         private _outlineRenderer: OutlineRenderer;
 
@@ -2478,7 +2477,6 @@
             if (this._boundingBoxRenderer) {
                 this._boundingBoxRenderer.reset();
             }
-            this._edgesRenderers.reset();
 
             // Meshes
             var meshes: AbstractMesh[];
@@ -2569,10 +2567,6 @@
                 this.getBoundingBoxRenderer().renderList.push(sourceMesh.getBoundingInfo().boundingBox);
             }
 
-            if (sourceMesh._edgesRenderer) {
-                this._edgesRenderers.push(sourceMesh._edgesRenderer);
-            }
-
             if (mesh && mesh.subMeshes) {
                 // Submeshes Octrees
                 var len: number;
@@ -2739,11 +2733,6 @@
                 this._boundingBoxRenderer.render();
             }
 
-            // Edges
-            for (var edgesRendererIndex = 0; edgesRendererIndex < this._edgesRenderers.length; edgesRendererIndex++) {
-                this._edgesRenderers.data[edgesRendererIndex].render();
-            }
-
             // Lens flares
             if (this.lensFlaresEnabled) {
                 Tools.StartPerformanceCounter("Lens flares", this.lensFlareSystems.length > 0);
@@ -3235,7 +3224,6 @@
             if (this._boundingBoxRenderer) {
                 this._boundingBoxRenderer.dispose();
             }
-            this._edgesRenderers.dispose();
             this._meshesForIntersections.dispose();
             this._toBeDisposed.dispose();