浏览代码

Merge pull request #4330 from TrevorDev/utilityLayer

add utility layer
David Catuhe 7 年之前
父节点
当前提交
57d978b8d1
共有 3 个文件被更改,包括 70 次插入1 次删除
  1. 2 1
      Tools/Gulp/config.json
  2. 1 0
      dist/preview release/what's new.md
  3. 67 0
      src/Rendering/babylon.utilityLayerRenderer.ts

+ 2 - 1
Tools/Gulp/config.json

@@ -1011,7 +1011,8 @@
                 "../../src/Debug/babylon.rayHelper.js",
                 "../../src/Debug/babylon.debugLayer.js",
                 "../../src/Debug/babylon.physicsViewer.js",
-                "../../src/Rendering/babylon.boundingBoxRenderer.js"
+                "../../src/Rendering/babylon.boundingBoxRenderer.js",
+                "../../src/Rendering/babylon.utilityLayerRenderer.js"
             ],
             "dependUpon": [
                 "shaderMaterial",

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

@@ -18,6 +18,7 @@
 - Added predicate function to customize the list of mesh included in the computation of bounding vectors in the ```getHierarchyBoundingVectors``` method ([sebavan](http://www.github.com/sebavan))
 - Added webVR constructor options: disable laser pointer toggle, teleportation floor meshes ([TrevorDev](https://github.com/TrevorDev))
 - Get a root mesh from an asset container, load a mesh from a file with a single string url ([TrevorDev](https://github.com/TrevorDev))
+- UtilityLayer class to render another scene as a layer on top of an existing scene ([TrevorDev](https://github.com/TrevorDev))
 
 ### glTF Loader
 

+ 67 - 0
src/Rendering/babylon.utilityLayerRenderer.ts

@@ -0,0 +1,67 @@
+module BABYLON {
+    /**
+     * Renders a layer on top of an existing scene
+     */
+    export class UtilityLayerRenderer implements IDisposable {
+        /** 
+         * The scene that is rendered on top of the original scene
+         */ 
+        public utilityLayerScene:Scene;
+
+        /**
+         *  If the utility layer should automatically be rendered on top of existing scene
+        */
+        public shouldRender:boolean = true;
+
+        private _afterRenderObserver:Nullable<Observer<Scene>>;
+        private _sceneDisposeObserver:Nullable<Observer<Scene>>;
+        /**
+         * Instantiates a UtilityLayerRenderer
+         * @param originalScene the original scene that will be rendered on top of
+         */
+        constructor(/** the original scene that will be rendered on top of */ public originalScene:Scene){
+            // Create scene which will be rendered in the foreground and remove it from being referenced by engine to avoid interfering with existing app
+            this.utilityLayerScene = new BABYLON.Scene(originalScene.getEngine());
+            originalScene.getEngine().scenes.pop();
+
+            // Render directly on top of existing scene without clearing
+            this.utilityLayerScene.clearColor = new BABYLON.Color4(0,0,0,0);
+            this.utilityLayerScene.autoClear = false;
+
+            this._afterRenderObserver = this.originalScene.onAfterRenderObservable.add(()=>{
+                if(this.shouldRender){
+                    this.render();
+                }
+            });
+
+            this._sceneDisposeObserver = this.originalScene.onDisposeObservable.add(()=>{
+                this.dispose();
+            })
+        }
+
+        /**
+         * Renders the utility layers scene on top of the original scene
+         */
+        public render(){
+            this._updateCamera();
+            this.utilityLayerScene.render();
+        }
+
+        /**
+         * Disposes of the renderer
+         */
+        public dispose(){
+            if(this._afterRenderObserver){
+                this.originalScene.onAfterRenderObservable.remove(this._afterRenderObserver);
+            }
+            if(this._sceneDisposeObserver){
+                this.originalScene.onDisposeObservable.remove(this._sceneDisposeObserver);
+            }
+            this.utilityLayerScene.dispose();
+        }
+
+        private _updateCamera(){
+            this.utilityLayerScene.activeCamera=this.originalScene.activeCamera;
+        }
+    }
+}