Przeglądaj źródła

separate workloads for building, add dispose to gizmo manager

Trevor Baron 7 lat temu
rodzic
commit
9bc6925dca

+ 26 - 8
Tools/Gulp/config.json

@@ -95,6 +95,8 @@
             "physics",
             "textureFormats",
             "debug",
+            "utilityLayer",
+            "gizmos",
             "morphTargets",
             "octrees",
             "vr",
@@ -1020,8 +1022,27 @@
                 "../../src/Debug/babylon.rayHelper.js",
                 "../../src/Debug/babylon.debugLayer.js",
                 "../../src/Debug/babylon.physicsViewer.js",
-                "../../src/Rendering/babylon.boundingBoxRenderer.js",
-                "../../src/Rendering/babylon.utilityLayerRenderer.js",
+                "../../src/Rendering/babylon.boundingBoxRenderer.js"
+            ],
+            "dependUpon": [
+                "shaderMaterial",
+                "additionalMeshes",
+                "core",
+                "stringDictionary",
+                "actions"
+            ],
+            "shaders": []
+        },
+        "utilityLayer": {
+            "files": [
+                "../../src/Rendering/babylon.utilityLayerRenderer.js"
+            ],
+            "dependUpon": [
+                "core"
+            ]
+        },
+        "gizmos": {
+            "files": [
                 "../../src/Gizmos/babylon.gizmo.js",
                 "../../src/Gizmos/babylon.axisDragGizmo.js",
                 "../../src/Gizmos/babylon.axisScaleGizmo.js",
@@ -1032,13 +1053,10 @@
                 "../../src/Gizmos/babylon.gizmoManager.js"
             ],
             "dependUpon": [
-                "shaderMaterial",
-                "additionalMeshes",
                 "core",
-                "stringDictionary",
-                "actions"
-            ],
-            "shaders": []
+                "utilityLayer",
+                "meshBehaviors"
+            ]
         },
         "morphTargets": {
             "files": [

+ 37 - 24
src/Gizmos/babylon.gizmoManager.ts

@@ -2,14 +2,20 @@ module BABYLON {
     /**
      * Helps setup gizmo's in the scene to rotate/scale/position meshes
      */
-    export class GizmoManager {
+    export class GizmoManager implements IDisposable{
+
+        private _gizmoLayer:UtilityLayerRenderer;
+        // Set of gizmos that are currently in the scene for each mesh
+        private _gizmoSet:{[meshID: string]: {positionGizmo: PositionGizmo, rotationGizmo: RotationGizmo}} = {}
+        private _pointerObserver:Nullable<Observer<PointerInfo>> = null;
+
         /**
          * Instatiates a gizmo manager
          * @param scene the scene to overlay the gizmos on top of
          * @param options If only a single gizmo should exist at one time
          */
-        constructor(scene:Scene, options?:{singleGizmo?:boolean}){
-            var gizmoLayer = new BABYLON.UtilityLayerRenderer(scene);
+        constructor(private scene:Scene, options?:{singleGizmo?:boolean}){
+            this._gizmoLayer = new UtilityLayerRenderer(scene);
 
             // Options parsing
             if(!options){
@@ -18,44 +24,34 @@ module BABYLON {
             if(options.singleGizmo === undefined){
                 options.singleGizmo = true;
             }
-            
-            // Set of gizmos that are currently in the scene for each mesh
-            var gizmoSet:{[meshID: string]: {positionGizmo: PositionGizmo, rotationGizmo: RotationGizmo}} = {}
-            var clearGizmos = ()=>{
-                for(var key in gizmoSet){
-                    gizmoSet[key].positionGizmo.dispose();
-                    gizmoSet[key].rotationGizmo.dispose();
-                    delete gizmoSet[key];
-                }
-            }
 
             // Instatiate/dispose gizmos based on pointer actions
-            scene.onPointerObservable.add((pointerInfo, state)=>{
+            this._pointerObserver = scene.onPointerObservable.add((pointerInfo, state)=>{
                 if(pointerInfo.type == BABYLON.PointerEventTypes.POINTERDOWN){
                     if(pointerInfo.pickInfo && pointerInfo.pickInfo.pickedMesh){
-                        if(!gizmoSet[pointerInfo.pickInfo.pickedMesh.uniqueId]){
+                        if(!this._gizmoSet[pointerInfo.pickInfo.pickedMesh.uniqueId]){
                             if(options!.singleGizmo){
-                                clearGizmos();
+                                this._clearGizmos();
                             }                            
                             // Enable gizmo when mesh is selected
-                            gizmoSet[pointerInfo.pickInfo.pickedMesh.uniqueId] = {positionGizmo: new PositionGizmo(gizmoLayer), rotationGizmo: new RotationGizmo(gizmoLayer)}
-                            gizmoSet[pointerInfo.pickInfo.pickedMesh.uniqueId].positionGizmo.attachedMesh = pointerInfo.pickInfo.pickedMesh;
-                            gizmoSet[pointerInfo.pickInfo.pickedMesh.uniqueId].rotationGizmo.attachedMesh = pointerInfo.pickInfo.pickedMesh;
+                            this._gizmoSet[pointerInfo.pickInfo.pickedMesh.uniqueId] = {positionGizmo: new PositionGizmo(this._gizmoLayer), rotationGizmo: new RotationGizmo(this._gizmoLayer)}
+                            this._gizmoSet[pointerInfo.pickInfo.pickedMesh.uniqueId].positionGizmo.attachedMesh = pointerInfo.pickInfo.pickedMesh;
+                            this._gizmoSet[pointerInfo.pickInfo.pickedMesh.uniqueId].rotationGizmo.attachedMesh = pointerInfo.pickInfo.pickedMesh;
                         }else{
                             if(!options!.singleGizmo){
                                 // Disable gizmo when clicked again
-                                gizmoSet[pointerInfo.pickInfo.pickedMesh.uniqueId].positionGizmo.dispose();
-                                gizmoSet[pointerInfo.pickInfo.pickedMesh.uniqueId].rotationGizmo.dispose();
-                                delete gizmoSet[pointerInfo.pickInfo.pickedMesh.uniqueId];
+                                this._gizmoSet[pointerInfo.pickInfo.pickedMesh.uniqueId].positionGizmo.dispose();
+                                this._gizmoSet[pointerInfo.pickInfo.pickedMesh.uniqueId].rotationGizmo.dispose();
+                                delete this._gizmoSet[pointerInfo.pickInfo.pickedMesh.uniqueId];
                             }
                         }
                     }else {
                         if(options!.singleGizmo){
                             // Disable gizmo when clicked away
                             if(pointerInfo.pickInfo && pointerInfo.pickInfo.ray){
-                                var gizmoPick = gizmoLayer.utilityLayerScene.pickWithRay(pointerInfo.pickInfo.ray);
+                                var gizmoPick = this._gizmoLayer.utilityLayerScene.pickWithRay(pointerInfo.pickInfo.ray);
                                 if(gizmoPick && !gizmoPick.hit){
-                                    clearGizmos();
+                                    this._clearGizmos();
                                 }
                             }
                         }
@@ -63,5 +59,22 @@ module BABYLON {
                 }
             })
         }
+
+        /**
+         * Disposes of the gizmo manager
+         */
+        public dispose(){
+            this.scene.onPointerObservable.remove(this._pointerObserver);
+            this._clearGizmos();
+            this._gizmoLayer.dispose();
+        }
+
+        private _clearGizmos(){
+            for(var key in this._gizmoSet){
+                this._gizmoSet[key].positionGizmo.dispose();
+                this._gizmoSet[key].rotationGizmo.dispose();
+                delete this._gizmoSet[key];
+            }
+        }
     }
 }

+ 5 - 1
src/Rendering/babylon.utilityLayerRenderer.ts

@@ -18,6 +18,7 @@ module BABYLON {
         public onlyCheckPointerDownEvents = true;
         private _afterRenderObserver:Nullable<Observer<Scene>>;
         private _sceneDisposeObserver:Nullable<Observer<Scene>>;
+        private _originalPointerObserver:Nullable<Observer<PointerInfoPre>>;
         /**
          * Instantiates a UtilityLayerRenderer
          * @param originalScene the original scene that will be rendered on top of
@@ -29,7 +30,7 @@ module BABYLON {
 
             // Detach controls on utility scene, events will be fired by logic below to handle picking priority
             this.utilityLayerScene.detachControl();
-            originalScene.onPrePointerObservable.add((prePointerInfo, eventState)=>{
+            this._originalPointerObserver = originalScene.onPrePointerObservable.add((prePointerInfo, eventState)=>{
                 var utilityScenePick = prePointerInfo.ray ? this.utilityLayerScene.pickWithRay(prePointerInfo.ray) : this.utilityLayerScene.pick(originalScene.pointerX, originalScene.pointerY);
                 if(!prePointerInfo.ray && utilityScenePick){
                     prePointerInfo.ray = utilityScenePick.ray;
@@ -105,6 +106,9 @@ module BABYLON {
             if(this._sceneDisposeObserver){
                 this.originalScene.onDisposeObservable.remove(this._sceneDisposeObserver);
             }
+            if(this._originalPointerObserver){
+                this.originalScene.onPrePointerObservable.remove(this._originalPointerObserver);
+            }
             this.utilityLayerScene.dispose();
         }