浏览代码

new MergeMeshesOptimization for sceneOptimizer

David Catuhe 10 年之前
父节点
当前提交
b7df3680a8

+ 2 - 2
Babylon/Actions/babylon.actionManager.js

@@ -8,9 +8,9 @@
             this.meshUnderPointer = meshUnderPointer;
             this.meshUnderPointer = meshUnderPointer;
             this.sourceEvent = sourceEvent;
             this.sourceEvent = sourceEvent;
         }
         }
-        ActionEvent.CreateNew = function (source) {
+        ActionEvent.CreateNew = function (source, evt) {
             var scene = source.getScene();
             var scene = source.getScene();
-            return new ActionEvent(source, scene.pointerX, scene.pointerY, scene.meshUnderPointer);
+            return new ActionEvent(source, scene.pointerX, scene.pointerY, scene.meshUnderPointer, event);
         };
         };
 
 
         ActionEvent.CreateNewFromScene = function (scene, evt) {
         ActionEvent.CreateNewFromScene = function (scene, evt) {

+ 4 - 4
Babylon/Actions/babylon.actionManager.ts

@@ -2,15 +2,15 @@
 
 
     export class ActionEvent {
     export class ActionEvent {
         constructor(public source: AbstractMesh, public pointerX: number, public pointerY: number, public meshUnderPointer: AbstractMesh, public sourceEvent?: any) {
         constructor(public source: AbstractMesh, public pointerX: number, public pointerY: number, public meshUnderPointer: AbstractMesh, public sourceEvent?: any) {
-            
+
         }
         }
 
 
-        public static CreateNew(source: AbstractMesh): ActionEvent {
+        public static CreateNew(source: AbstractMesh, evt?: Event): ActionEvent {
             var scene = source.getScene();
             var scene = source.getScene();
-            return new ActionEvent(source, scene.pointerX, scene.pointerY, scene.meshUnderPointer);
+            return new ActionEvent(source, scene.pointerX, scene.pointerY, scene.meshUnderPointer, event);
         }
         }
 
 
-        public static CreateNewFromScene(scene: Scene, evt:Event): ActionEvent {
+        public static CreateNewFromScene(scene: Scene, evt: Event): ActionEvent {
             return new ActionEvent(null, scene.pointerX, scene.pointerY, scene.meshUnderPointer, evt);
             return new ActionEvent(null, scene.pointerX, scene.pointerY, scene.meshUnderPointer, evt);
         }
         }
     }
     }

+ 2 - 1
Babylon/Debug/babylon.debugLayer.js

@@ -38,7 +38,7 @@
                     _this._treeDiv.style.top = "10px";
                     _this._treeDiv.style.top = "10px";
                     _this._treeDiv.style.width = "300px";
                     _this._treeDiv.style.width = "300px";
                     _this._treeDiv.style.height = "auto";
                     _this._treeDiv.style.height = "auto";
-                    _this._treeSubsetDiv.style.maxHeight = (canvasRect.height - 420) + "px";
+                    _this._treeSubsetDiv.style.maxHeight = (canvasRect.height - 490) + "px";
                 }
                 }
 
 
                 _this._globalDiv.style.left = canvasRect.left + "px";
                 _this._globalDiv.style.left = canvasRect.left + "px";
@@ -394,6 +394,7 @@
 
 
             leftPart.innerHTML = leftTitle;
             leftPart.innerHTML = leftTitle;
             rightPart.innerHTML = rightTitle;
             rightPart.innerHTML = rightTitle;
+            rightPart.style.maxWidth = "200px";
 
 
             container.appendChild(leftPart);
             container.appendChild(leftPart);
             container.appendChild(rightPart);
             container.appendChild(rightPart);

文件差异内容过多而无法显示
+ 1 - 1
Babylon/Debug/babylon.debugLayer.js.map


+ 2 - 1
Babylon/Debug/babylon.debugLayer.ts

@@ -64,7 +64,7 @@
                     this._treeDiv.style.top = "10px";
                     this._treeDiv.style.top = "10px";
                     this._treeDiv.style.width = "300px";
                     this._treeDiv.style.width = "300px";
                     this._treeDiv.style.height = "auto";
                     this._treeDiv.style.height = "auto";
-                    this._treeSubsetDiv.style.maxHeight = (canvasRect.height - 420) + "px";
+                    this._treeSubsetDiv.style.maxHeight = (canvasRect.height - 490) + "px";
                 }
                 }
 
 
                 this._globalDiv.style.left = canvasRect.left + "px";
                 this._globalDiv.style.left = canvasRect.left + "px";
@@ -424,6 +424,7 @@
 
 
             leftPart.innerHTML = leftTitle;
             leftPart.innerHTML = leftTitle;
             rightPart.innerHTML = rightTitle;
             rightPart.innerHTML = rightTitle;
+            rightPart.style.maxWidth = "200px";
 
 
             container.appendChild(leftPart);
             container.appendChild(leftPart);
             container.appendChild(rightPart);
             container.appendChild(rightPart);

+ 4 - 0
Babylon/Lights/babylon.spotLight.js

@@ -32,6 +32,10 @@ var BABYLON;
                     this._transformedDirection = BABYLON.Vector3.Zero();
                     this._transformedDirection = BABYLON.Vector3.Zero();
                 }
                 }
 
 
+                if (!this._transformedPosition) {
+                    this._transformedPosition = BABYLON.Vector3.Zero();
+                }
+
                 var parentWorldMatrix = this.parent.getWorldMatrix();
                 var parentWorldMatrix = this.parent.getWorldMatrix();
 
 
                 BABYLON.Vector3.TransformCoordinatesToRef(this.position, parentWorldMatrix, this._transformedPosition);
                 BABYLON.Vector3.TransformCoordinatesToRef(this.position, parentWorldMatrix, this._transformedPosition);

+ 4 - 0
Babylon/Lights/babylon.spotLight.ts

@@ -26,6 +26,10 @@
                     this._transformedDirection = BABYLON.Vector3.Zero();
                     this._transformedDirection = BABYLON.Vector3.Zero();
                 }
                 }
 
 
+                if (!this._transformedPosition) {
+                    this._transformedPosition = BABYLON.Vector3.Zero();
+                }
+
                 var parentWorldMatrix = this.parent.getWorldMatrix();
                 var parentWorldMatrix = this.parent.getWorldMatrix();
 
 
                 BABYLON.Vector3.TransformCoordinatesToRef(this.position, parentWorldMatrix, this._transformedPosition);
                 BABYLON.Vector3.TransformCoordinatesToRef(this.position, parentWorldMatrix, this._transformedPosition);

+ 48 - 0
Babylon/Mesh/babylon.mesh.js

@@ -1141,6 +1141,54 @@ var BABYLON;
             var minMaxVector = meshesOrMinMaxVector.min !== undefined ? meshesOrMinMaxVector : BABYLON.Mesh.MinMax(meshesOrMinMaxVector);
             var minMaxVector = meshesOrMinMaxVector.min !== undefined ? meshesOrMinMaxVector : BABYLON.Mesh.MinMax(meshesOrMinMaxVector);
             return BABYLON.Vector3.Center(minMaxVector.min, minMaxVector.max);
             return BABYLON.Vector3.Center(minMaxVector.min, minMaxVector.max);
         };
         };
+
+        Mesh.MergeMeshes = function (meshes, disposeSource, allow32BitsIndices) {
+            if (typeof disposeSource === "undefined") { disposeSource = true; }
+            var source = meshes[0];
+            var material = source.material;
+            var scene = source.getScene();
+
+            if (!allow32BitsIndices) {
+                var totalVertices = 0;
+
+                for (var index = 0; index < meshes.length; index++) {
+                    totalVertices += meshes[index].getTotalVertices();
+
+                    if (totalVertices > 65536) {
+                        BABYLON.Tools.Warn("Cannot merge meshes because resulting mesh will have more than 65536 vertices. Please use allow32BitsIndices = true to use 32 bits indices");
+                        return null;
+                    }
+                }
+            }
+
+            // Merge
+            var vertexData = BABYLON.VertexData.ExtractFromMesh(source);
+            vertexData.transform(source.getWorldMatrix());
+
+            for (index = 1; index < meshes.length; index++) {
+                var otherVertexData = BABYLON.VertexData.ExtractFromMesh(meshes[index]);
+                otherVertexData.transform(meshes[index].getWorldMatrix());
+
+                vertexData.merge(otherVertexData);
+            }
+
+            var newMesh = new Mesh(source.name + "_merged", scene);
+
+            vertexData.applyToMesh(newMesh);
+
+            // Setting properties
+            newMesh.material = material;
+            newMesh.checkCollisions = source.checkCollisions;
+
+            // Cleaning
+            if (disposeSource) {
+                for (index = 0; index < meshes.length; index++) {
+                    meshes[index].dispose();
+                }
+            }
+
+            return newMesh;
+        };
         return Mesh;
         return Mesh;
     })(BABYLON.AbstractMesh);
     })(BABYLON.AbstractMesh);
     BABYLON.Mesh = Mesh;
     BABYLON.Mesh = Mesh;

+ 48 - 0
Babylon/Mesh/babylon.mesh.ts

@@ -1148,5 +1148,53 @@
             var minMaxVector = meshesOrMinMaxVector.min !== undefined ? meshesOrMinMaxVector : BABYLON.Mesh.MinMax(meshesOrMinMaxVector);
             var minMaxVector = meshesOrMinMaxVector.min !== undefined ? meshesOrMinMaxVector : BABYLON.Mesh.MinMax(meshesOrMinMaxVector);
             return BABYLON.Vector3.Center(minMaxVector.min, minMaxVector.max);
             return BABYLON.Vector3.Center(minMaxVector.min, minMaxVector.max);
         }
         }
+
+        public static MergeMeshes(meshes: Array<Mesh>, disposeSource = true, allow32BitsIndices?: boolean): Mesh {
+            var source = meshes[0];
+            var material = source.material;
+            var scene = source.getScene();
+            
+            if (!allow32BitsIndices) {
+                var totalVertices = 0;
+
+                // Counting vertices
+                for (var index = 0; index < meshes.length; index++) {
+                    totalVertices += meshes[index].getTotalVertices();
+
+                    if (totalVertices > 65536) {
+                        Tools.Warn("Cannot merge meshes because resulting mesh will have more than 65536 vertices. Please use allow32BitsIndices = true to use 32 bits indices");
+                        return null;
+                    }
+                }
+            }
+
+            // Merge
+            var vertexData = VertexData.ExtractFromMesh(source);
+            vertexData.transform(source.getWorldMatrix());
+
+            for (index = 1; index < meshes.length; index++) {
+                var otherVertexData = VertexData.ExtractFromMesh(meshes[index]);
+                otherVertexData.transform(meshes[index].getWorldMatrix());
+
+                vertexData.merge(otherVertexData);
+            }
+
+            var newMesh = new Mesh(source.name + "_merged", scene);
+
+            vertexData.applyToMesh(newMesh);
+
+            // Setting properties
+            newMesh.material = material;
+            newMesh.checkCollisions = source.checkCollisions;
+
+            // Cleaning
+            if (disposeSource) {
+                for (index = 0; index < meshes.length; index++) {
+                    meshes[index].dispose();
+                }
+            }
+
+            return newMesh;
+        }
     }
     }
 } 
 } 

+ 5 - 5
Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderEffect.js

@@ -9,12 +9,12 @@ var BABYLON;
             this._getPostProcess = getPostProcess;
             this._getPostProcess = getPostProcess;
 
 
             this._cameras = [];
             this._cameras = [];
-
-            this._postProcesses = [];
             this._indicesForCamera = [];
             this._indicesForCamera = [];
 
 
-            this._renderPasses = [];
-            this._renderEffectAsPasses = [];
+            this._postProcesses = {};
+
+            this._renderPasses = {};
+            this._renderEffectAsPasses = {};
         }
         }
         PostProcessRenderEffect.prototype._update = function () {
         PostProcessRenderEffect.prototype._update = function () {
             for (var renderPassName in this._renderPasses) {
             for (var renderPassName in this._renderPasses) {
@@ -49,7 +49,7 @@ var BABYLON;
         };
         };
 
 
         PostProcessRenderEffect.prototype.emptyPasses = function () {
         PostProcessRenderEffect.prototype.emptyPasses = function () {
-            this._renderPasses.length = 0;
+            this._renderPasses = {};
 
 
             this._linkParameters();
             this._linkParameters();
         };
         };

+ 8 - 8
Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderEffect.ts

@@ -2,7 +2,7 @@ module BABYLON {
     export class PostProcessRenderEffect {
     export class PostProcessRenderEffect {
         private _engine: Engine;
         private _engine: Engine;
 
 
-        private _postProcesses: PostProcess[];
+        private _postProcesses: any;
         private _getPostProcess: () => PostProcess;
         private _getPostProcess: () => PostProcess;
 
 
         private _singleInstance: boolean;
         private _singleInstance: boolean;
@@ -10,8 +10,8 @@ module BABYLON {
         private _cameras: Camera[];
         private _cameras: Camera[];
         private _indicesForCamera: number[][];
         private _indicesForCamera: number[][];
 
 
-        private _renderPasses: PostProcessRenderPass[];
-        private _renderEffectAsPasses: PostProcessRenderEffect[];
+        private _renderPasses: any;
+        private _renderEffectAsPasses: any;
 
 
         // private
         // private
         public _name: string;
         public _name: string;
@@ -26,12 +26,12 @@ module BABYLON {
             this._getPostProcess = getPostProcess;
             this._getPostProcess = getPostProcess;
 
 
             this._cameras = [];
             this._cameras = [];
-
-            this._postProcesses = [];
             this._indicesForCamera = [];
             this._indicesForCamera = [];
 
 
-            this._renderPasses = [];
-            this._renderEffectAsPasses = [];
+            this._postProcesses = {};
+
+            this._renderPasses = {};
+            this._renderEffectAsPasses = {};
         }
         }
 
 
         public _update(): void {
         public _update(): void {
@@ -67,7 +67,7 @@ module BABYLON {
         }
         }
 
 
         public emptyPasses(): void {
         public emptyPasses(): void {
-            this._renderPasses.length = 0;
+            this._renderPasses = {};
 
 
             this._linkParameters();
             this._linkParameters();
         }
         }

+ 2 - 2
Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderPipeline.js

@@ -5,8 +5,8 @@ var BABYLON;
             this._engine = engine;
             this._engine = engine;
             this._name = name;
             this._name = name;
 
 
-            this._renderEffects = [];
-            this._renderEffectsForIsolatedPass = [];
+            this._renderEffects = {};
+            this._renderEffectsForIsolatedPass = {};
 
 
             this._cameras = [];
             this._cameras = [];
         }
         }

+ 4 - 4
Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderPipeline.ts

@@ -2,8 +2,8 @@ module BABYLON {
     export class PostProcessRenderPipeline {
     export class PostProcessRenderPipeline {
         private _engine: Engine;
         private _engine: Engine;
 
 
-        private _renderEffects: PostProcessRenderEffect[];
-        private _renderEffectsForIsolatedPass: PostProcessRenderEffect[];
+        private _renderEffects: any;
+        private _renderEffectsForIsolatedPass: any;
 
 
         private _cameras: Camera[];
         private _cameras: Camera[];
 
 
@@ -17,8 +17,8 @@ module BABYLON {
             this._engine = engine;
             this._engine = engine;
             this._name = name;
             this._name = name;
 
 
-            this._renderEffects = [];
-            this._renderEffectsForIsolatedPass = [];
+            this._renderEffects = {};
+            this._renderEffectsForIsolatedPass = {};
 
 
             this._cameras = [];
             this._cameras = [];
         }
         }

+ 1 - 1
Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderPipelineManager.js

@@ -2,7 +2,7 @@ var BABYLON;
 (function (BABYLON) {
 (function (BABYLON) {
     var PostProcessRenderPipelineManager = (function () {
     var PostProcessRenderPipelineManager = (function () {
         function PostProcessRenderPipelineManager() {
         function PostProcessRenderPipelineManager() {
-            this._renderPipelines = new Array();
+            this._renderPipelines = {};
         }
         }
         PostProcessRenderPipelineManager.prototype.addPipeline = function (renderPipeline) {
         PostProcessRenderPipelineManager.prototype.addPipeline = function (renderPipeline) {
             this._renderPipelines[renderPipeline._name] = renderPipeline;
             this._renderPipelines[renderPipeline._name] = renderPipeline;

+ 2 - 2
Babylon/PostProcess/RenderPipeline/babylon.postProcessRenderPipelineManager.ts

@@ -1,9 +1,9 @@
 module BABYLON {
 module BABYLON {
     export class PostProcessRenderPipelineManager {
     export class PostProcessRenderPipelineManager {
-        private _renderPipelines: Array<PostProcessRenderPipeline>;
+        private _renderPipelines: any;
 
 
         constructor() {
         constructor() {
-            this._renderPipelines = new Array<PostProcessRenderPipeline>();
+            this._renderPipelines = {};
         }
         }
 
 
         public addPipeline(renderPipeline: PostProcessRenderPipeline): void {
         public addPipeline(renderPipeline: PostProcessRenderPipeline): void {

+ 82 - 0
Babylon/Tools/babylon.sceneOptimizer.js

@@ -140,6 +140,85 @@ var BABYLON;
     })(SceneOptimization);
     })(SceneOptimization);
     BABYLON.RenderTargetsOptimization = RenderTargetsOptimization;
     BABYLON.RenderTargetsOptimization = RenderTargetsOptimization;
 
 
+    var MergeMeshesOptimization = (function (_super) {
+        __extends(MergeMeshesOptimization, _super);
+        function MergeMeshesOptimization() {
+            _super.apply(this, arguments);
+            var _this = this;
+            this._canBeMerged = function (abstractMesh) {
+                if (!(abstractMesh instanceof BABYLON.Mesh)) {
+                    return false;
+                }
+
+                var mesh = abstractMesh;
+
+                if (!mesh.isVisible || !mesh.isEnabled()) {
+                    return false;
+                }
+
+                if (mesh.instances.length > 0) {
+                    return false;
+                }
+
+                if (mesh.skeleton || mesh.hasLODLevels) {
+                    return false;
+                }
+
+                return true;
+            };
+            this.apply = function (scene) {
+                var globalPool = scene.meshes.slice(0);
+                var globalLength = globalPool.length;
+
+                for (var index = 0; index < globalLength; index++) {
+                    var currentPool = new Array();
+                    var current = globalPool[index];
+
+                    // Checks
+                    if (!_this._canBeMerged(current)) {
+                        continue;
+                    }
+
+                    currentPool.push(current);
+
+                    for (var subIndex = index + 1; subIndex < globalLength; subIndex++) {
+                        var otherMesh = globalPool[subIndex];
+
+                        if (!_this._canBeMerged(otherMesh)) {
+                            continue;
+                        }
+
+                        if (otherMesh.material !== current.material) {
+                            continue;
+                        }
+
+                        if (otherMesh.checkCollisions !== current.checkCollisions) {
+                            continue;
+                        }
+
+                        currentPool.push(otherMesh);
+                        globalLength--;
+
+                        globalPool.splice(subIndex, 1);
+
+                        subIndex--;
+                    }
+
+                    if (currentPool.length < 2) {
+                        continue;
+                    }
+
+                    // Merge meshes
+                    BABYLON.Mesh.MergeMeshes(currentPool);
+                }
+
+                return true;
+            };
+        }
+        return MergeMeshesOptimization;
+    })(SceneOptimization);
+    BABYLON.MergeMeshesOptimization = MergeMeshesOptimization;
+
     // Options
     // Options
     var SceneOptimizerOptions = (function () {
     var SceneOptimizerOptions = (function () {
         function SceneOptimizerOptions(targetFrameRate, trackerDuration) {
         function SceneOptimizerOptions(targetFrameRate, trackerDuration) {
@@ -153,6 +232,7 @@ var BABYLON;
             var result = new SceneOptimizerOptions(targetFrameRate);
             var result = new SceneOptimizerOptions(targetFrameRate);
 
 
             var priority = 0;
             var priority = 0;
+            result.optimizations.push(new MergeMeshesOptimization(priority));
             result.optimizations.push(new ShadowsOptimization(priority));
             result.optimizations.push(new ShadowsOptimization(priority));
             result.optimizations.push(new LensFlaresOptimization(priority));
             result.optimizations.push(new LensFlaresOptimization(priority));
 
 
@@ -172,6 +252,7 @@ var BABYLON;
             var result = new SceneOptimizerOptions(targetFrameRate);
             var result = new SceneOptimizerOptions(targetFrameRate);
 
 
             var priority = 0;
             var priority = 0;
+            result.optimizations.push(new MergeMeshesOptimization(priority));
             result.optimizations.push(new ShadowsOptimization(priority));
             result.optimizations.push(new ShadowsOptimization(priority));
             result.optimizations.push(new LensFlaresOptimization(priority));
             result.optimizations.push(new LensFlaresOptimization(priority));
 
 
@@ -199,6 +280,7 @@ var BABYLON;
             var result = new SceneOptimizerOptions(targetFrameRate);
             var result = new SceneOptimizerOptions(targetFrameRate);
 
 
             var priority = 0;
             var priority = 0;
+            result.optimizations.push(new MergeMeshesOptimization(priority));
             result.optimizations.push(new ShadowsOptimization(priority));
             result.optimizations.push(new ShadowsOptimization(priority));
             result.optimizations.push(new LensFlaresOptimization(priority));
             result.optimizations.push(new LensFlaresOptimization(priority));
 
 

+ 79 - 0
Babylon/Tools/babylon.sceneOptimizer.ts

@@ -88,6 +88,82 @@
         };
         };
     }
     }
 
 
+    export class MergeMeshesOptimization extends SceneOptimization {
+
+        private _canBeMerged = (abstractMesh: AbstractMesh): boolean => {
+            if (!(abstractMesh instanceof Mesh)) {
+                return false;
+            }
+
+            var mesh = <Mesh>abstractMesh;
+
+            if (!mesh.isVisible || !mesh.isEnabled()) {
+                return false;
+            }
+
+            if (mesh.instances.length > 0) {
+                return false;
+            }
+
+            if (mesh.skeleton || mesh.hasLODLevels) {
+                return false;
+            }
+
+            return true;
+        }
+
+        public apply = (scene: Scene): boolean => {
+
+            var globalPool = scene.meshes.slice(0);
+            var globalLength = globalPool.length;
+
+            for (var index = 0; index < globalLength; index++) {
+                var currentPool = new Array<Mesh>();
+                var current = globalPool[index];
+
+                // Checks
+                if (!this._canBeMerged(current)) {
+                    continue;
+                }
+
+                currentPool.push(<Mesh>current);
+
+                // Find compatible meshes
+                for (var subIndex = index + 1; subIndex < globalLength; subIndex++) {
+                    var otherMesh = globalPool[subIndex];
+
+                    if (!this._canBeMerged(otherMesh)) {
+                        continue;
+                    }
+
+                    if (otherMesh.material !== current.material) {
+                        continue;
+                    }
+
+                    if (otherMesh.checkCollisions !== current.checkCollisions) {
+                        continue;
+                    }
+
+                    currentPool.push(<Mesh>otherMesh);
+                    globalLength--;
+
+                    globalPool.splice(subIndex, 1);
+
+                    subIndex--;
+                }
+
+                if (currentPool.length < 2) {
+                    continue;
+                }
+
+                // Merge meshes
+                Mesh.MergeMeshes(currentPool);
+            }
+
+            return true;
+        };
+    }
+
     // Options
     // Options
     export class SceneOptimizerOptions {
     export class SceneOptimizerOptions {
         public optimizations = new Array<SceneOptimization>();
         public optimizations = new Array<SceneOptimization>();
@@ -99,6 +175,7 @@
             var result = new SceneOptimizerOptions(targetFrameRate);
             var result = new SceneOptimizerOptions(targetFrameRate);
 
 
             var priority = 0;
             var priority = 0;
+            result.optimizations.push(new MergeMeshesOptimization(priority));
             result.optimizations.push(new ShadowsOptimization(priority));
             result.optimizations.push(new ShadowsOptimization(priority));
             result.optimizations.push(new LensFlaresOptimization(priority));
             result.optimizations.push(new LensFlaresOptimization(priority));
 
 
@@ -118,6 +195,7 @@
             var result = new SceneOptimizerOptions(targetFrameRate);
             var result = new SceneOptimizerOptions(targetFrameRate);
 
 
             var priority = 0;
             var priority = 0;
+            result.optimizations.push(new MergeMeshesOptimization(priority));
             result.optimizations.push(new ShadowsOptimization(priority));
             result.optimizations.push(new ShadowsOptimization(priority));
             result.optimizations.push(new LensFlaresOptimization(priority));
             result.optimizations.push(new LensFlaresOptimization(priority));
 
 
@@ -145,6 +223,7 @@
             var result = new SceneOptimizerOptions(targetFrameRate);
             var result = new SceneOptimizerOptions(targetFrameRate);
 
 
             var priority = 0;
             var priority = 0;
+            result.optimizations.push(new MergeMeshesOptimization(priority));
             result.optimizations.push(new ShadowsOptimization(priority));
             result.optimizations.push(new ShadowsOptimization(priority));
             result.optimizations.push(new LensFlaresOptimization(priority));
             result.optimizations.push(new LensFlaresOptimization(priority));
 
 

+ 4 - 4
Babylon/babylon.scene.js

@@ -265,16 +265,16 @@
                     if (pickResult.pickedMesh.actionManager) {
                     if (pickResult.pickedMesh.actionManager) {
                         switch (evt.button) {
                         switch (evt.button) {
                             case 0:
                             case 0:
-                                pickResult.pickedMesh.actionManager.processTrigger(BABYLON.ActionManager.OnLeftPickTrigger, BABYLON.ActionEvent.CreateNew(pickResult.pickedMesh));
+                                pickResult.pickedMesh.actionManager.processTrigger(BABYLON.ActionManager.OnLeftPickTrigger, BABYLON.ActionEvent.CreateNew(pickResult.pickedMesh, evt));
                                 break;
                                 break;
                             case 1:
                             case 1:
-                                pickResult.pickedMesh.actionManager.processTrigger(BABYLON.ActionManager.OnCenterPickTrigger, BABYLON.ActionEvent.CreateNew(pickResult.pickedMesh));
+                                pickResult.pickedMesh.actionManager.processTrigger(BABYLON.ActionManager.OnCenterPickTrigger, BABYLON.ActionEvent.CreateNew(pickResult.pickedMesh, evt));
                                 break;
                                 break;
                             case 2:
                             case 2:
-                                pickResult.pickedMesh.actionManager.processTrigger(BABYLON.ActionManager.OnRightPickTrigger, BABYLON.ActionEvent.CreateNew(pickResult.pickedMesh));
+                                pickResult.pickedMesh.actionManager.processTrigger(BABYLON.ActionManager.OnRightPickTrigger, BABYLON.ActionEvent.CreateNew(pickResult.pickedMesh, evt));
                                 break;
                                 break;
                         }
                         }
-                        pickResult.pickedMesh.actionManager.processTrigger(BABYLON.ActionManager.OnPickTrigger, BABYLON.ActionEvent.CreateNew(pickResult.pickedMesh));
+                        pickResult.pickedMesh.actionManager.processTrigger(BABYLON.ActionManager.OnPickTrigger, BABYLON.ActionEvent.CreateNew(pickResult.pickedMesh, evt));
                     }
                     }
                 }
                 }
 
 

+ 4 - 4
Babylon/babylon.scene.ts

@@ -344,16 +344,16 @@
                     if (pickResult.pickedMesh.actionManager) {
                     if (pickResult.pickedMesh.actionManager) {
                         switch (evt.button) {
                         switch (evt.button) {
                             case 0:
                             case 0:
-                                pickResult.pickedMesh.actionManager.processTrigger(ActionManager.OnLeftPickTrigger, ActionEvent.CreateNew(pickResult.pickedMesh));
+                                pickResult.pickedMesh.actionManager.processTrigger(ActionManager.OnLeftPickTrigger, ActionEvent.CreateNew(pickResult.pickedMesh, evt));
                                 break;
                                 break;
                             case 1:
                             case 1:
-                                pickResult.pickedMesh.actionManager.processTrigger(ActionManager.OnCenterPickTrigger, ActionEvent.CreateNew(pickResult.pickedMesh));
+                                pickResult.pickedMesh.actionManager.processTrigger(ActionManager.OnCenterPickTrigger, ActionEvent.CreateNew(pickResult.pickedMesh, evt));
                                 break;
                                 break;
                             case 2:
                             case 2:
-                                pickResult.pickedMesh.actionManager.processTrigger(ActionManager.OnRightPickTrigger, ActionEvent.CreateNew(pickResult.pickedMesh));
+                                pickResult.pickedMesh.actionManager.processTrigger(ActionManager.OnRightPickTrigger, ActionEvent.CreateNew(pickResult.pickedMesh,evt));
                                 break;
                                 break;
                         }
                         }
-                        pickResult.pickedMesh.actionManager.processTrigger(ActionManager.OnPickTrigger, ActionEvent.CreateNew(pickResult.pickedMesh));
+                        pickResult.pickedMesh.actionManager.processTrigger(ActionManager.OnPickTrigger, ActionEvent.CreateNew(pickResult.pickedMesh,evt));
                     }
                     }
                 }
                 }
 
 

+ 143 - 15
babylon.2.0-alpha.debug.js

@@ -6002,6 +6002,10 @@ var BABYLON;
                     this._transformedDirection = BABYLON.Vector3.Zero();
                     this._transformedDirection = BABYLON.Vector3.Zero();
                 }
                 }
 
 
+                if (!this._transformedPosition) {
+                    this._transformedPosition = BABYLON.Vector3.Zero();
+                }
+
                 var parentWorldMatrix = this.parent.getWorldMatrix();
                 var parentWorldMatrix = this.parent.getWorldMatrix();
 
 
                 BABYLON.Vector3.TransformCoordinatesToRef(this.position, parentWorldMatrix, this._transformedPosition);
                 BABYLON.Vector3.TransformCoordinatesToRef(this.position, parentWorldMatrix, this._transformedPosition);
@@ -8570,16 +8574,16 @@ var BABYLON;
                     if (pickResult.pickedMesh.actionManager) {
                     if (pickResult.pickedMesh.actionManager) {
                         switch (evt.button) {
                         switch (evt.button) {
                             case 0:
                             case 0:
-                                pickResult.pickedMesh.actionManager.processTrigger(BABYLON.ActionManager.OnLeftPickTrigger, BABYLON.ActionEvent.CreateNew(pickResult.pickedMesh));
+                                pickResult.pickedMesh.actionManager.processTrigger(BABYLON.ActionManager.OnLeftPickTrigger, BABYLON.ActionEvent.CreateNew(pickResult.pickedMesh, evt));
                                 break;
                                 break;
                             case 1:
                             case 1:
-                                pickResult.pickedMesh.actionManager.processTrigger(BABYLON.ActionManager.OnCenterPickTrigger, BABYLON.ActionEvent.CreateNew(pickResult.pickedMesh));
+                                pickResult.pickedMesh.actionManager.processTrigger(BABYLON.ActionManager.OnCenterPickTrigger, BABYLON.ActionEvent.CreateNew(pickResult.pickedMesh, evt));
                                 break;
                                 break;
                             case 2:
                             case 2:
-                                pickResult.pickedMesh.actionManager.processTrigger(BABYLON.ActionManager.OnRightPickTrigger, BABYLON.ActionEvent.CreateNew(pickResult.pickedMesh));
+                                pickResult.pickedMesh.actionManager.processTrigger(BABYLON.ActionManager.OnRightPickTrigger, BABYLON.ActionEvent.CreateNew(pickResult.pickedMesh, evt));
                                 break;
                                 break;
                         }
                         }
-                        pickResult.pickedMesh.actionManager.processTrigger(BABYLON.ActionManager.OnPickTrigger, BABYLON.ActionEvent.CreateNew(pickResult.pickedMesh));
+                        pickResult.pickedMesh.actionManager.processTrigger(BABYLON.ActionManager.OnPickTrigger, BABYLON.ActionEvent.CreateNew(pickResult.pickedMesh, evt));
                     }
                     }
                 }
                 }
 
 
@@ -12086,6 +12090,53 @@ var BABYLON;
             var minMaxVector = meshesOrMinMaxVector.min !== undefined ? meshesOrMinMaxVector : BABYLON.Mesh.MinMax(meshesOrMinMaxVector);
             var minMaxVector = meshesOrMinMaxVector.min !== undefined ? meshesOrMinMaxVector : BABYLON.Mesh.MinMax(meshesOrMinMaxVector);
             return BABYLON.Vector3.Center(minMaxVector.min, minMaxVector.max);
             return BABYLON.Vector3.Center(minMaxVector.min, minMaxVector.max);
         };
         };
+
+        Mesh.MergeMeshes = function (meshes, disposeSource, allow32BitsIndices) {
+            if (typeof disposeSource === "undefined") { disposeSource = true; }
+            var source = meshes[0];
+            var material = source.material;
+            var scene = source.getScene();
+
+            if (!allow32BitsIndices) {
+                var totalVertices = 0;
+
+                for (var index = 0; index < meshes.length; index++) {
+                    totalVertices += meshes[index].getTotalVertices();
+
+                    if (totalVertices > 65536) {
+                        BABYLON.Tools.Warn("Cannot merge meshes because resulting mesh will have more than 65536 vertices. Please use allow32BitsIndices = true to use 32 bits indices");
+                        return null;
+                    }
+                }
+            }
+
+           
+            var vertexData = BABYLON.VertexData.ExtractFromMesh(source);
+            vertexData.transform(source.getWorldMatrix());
+
+            for (index = 1; index < meshes.length; index++) {
+                var otherVertexData = BABYLON.VertexData.ExtractFromMesh(meshes[index]);
+                otherVertexData.transform(meshes[index].getWorldMatrix());
+
+                vertexData.merge(otherVertexData);
+            }
+
+            var newMesh = new Mesh(source.name + "_merged", scene);
+
+            vertexData.applyToMesh(newMesh);
+
+           
+            newMesh.material = material;
+
+           
+            if (disposeSource) {
+                for (index = 0; index < meshes.length; index++) {
+                    meshes[index].dispose();
+                }
+            }
+
+            return newMesh;
+        };
         return Mesh;
         return Mesh;
     })(BABYLON.AbstractMesh);
     })(BABYLON.AbstractMesh);
     BABYLON.Mesh = Mesh;
     BABYLON.Mesh = Mesh;
@@ -20941,6 +20992,8 @@ var BABYLON;
                 camera = new BABYLON.GamepadCamera(parsedCamera.name, position, scene);
                 camera = new BABYLON.GamepadCamera(parsedCamera.name, position, scene);
             } else if (parsedCamera.type === "OculusCamera") {
             } else if (parsedCamera.type === "OculusCamera") {
                 camera = new BABYLON.OculusCamera(parsedCamera.name, position, scene);
                 camera = new BABYLON.OculusCamera(parsedCamera.name, position, scene);
+            } else if (parsedCamera.type === "OculusGamepadCamera") {
+                camera = new BABYLON.OculusGamepadCamera(parsedCamera.name, position, scene);
             } else if (parsedCamera.type === "TouchCamera") {
             } else if (parsedCamera.type === "TouchCamera") {
                 camera = new BABYLON.TouchCamera(parsedCamera.name, position, scene);
                 camera = new BABYLON.TouchCamera(parsedCamera.name, position, scene);
             } else if (parsedCamera.type === "VirtualJoysticksCamera") {
             } else if (parsedCamera.type === "VirtualJoysticksCamera") {
@@ -24689,12 +24742,12 @@ var BABYLON;
             this._getPostProcess = getPostProcess;
             this._getPostProcess = getPostProcess;
 
 
             this._cameras = [];
             this._cameras = [];
-
-            this._postProcesses = [];
             this._indicesForCamera = [];
             this._indicesForCamera = [];
 
 
-            this._renderPasses = [];
-            this._renderEffectAsPasses = [];
+            this._postProcesses = {};
+
+            this._renderPasses = {};
+            this._renderEffectAsPasses = {};
         }
         }
         PostProcessRenderEffect.prototype._update = function () {
         PostProcessRenderEffect.prototype._update = function () {
             for (var renderPassName in this._renderPasses) {
             for (var renderPassName in this._renderPasses) {
@@ -24729,7 +24782,7 @@ var BABYLON;
         };
         };
 
 
         PostProcessRenderEffect.prototype.emptyPasses = function () {
         PostProcessRenderEffect.prototype.emptyPasses = function () {
-            this._renderPasses.length = 0;
+            this._renderPasses = {};
 
 
             this._linkParameters();
             this._linkParameters();
         };
         };
@@ -24866,8 +24919,8 @@ var BABYLON;
             this._engine = engine;
             this._engine = engine;
             this._name = name;
             this._name = name;
 
 
-            this._renderEffects = [];
-            this._renderEffectsForIsolatedPass = [];
+            this._renderEffects = {};
+            this._renderEffectsForIsolatedPass = {};
 
 
             this._cameras = [];
             this._cameras = [];
         }
         }
@@ -25010,7 +25063,7 @@ var BABYLON;
 (function (BABYLON) {
 (function (BABYLON) {
     var PostProcessRenderPipelineManager = (function () {
     var PostProcessRenderPipelineManager = (function () {
         function PostProcessRenderPipelineManager() {
         function PostProcessRenderPipelineManager() {
-            this._renderPipelines = new Array();
+            this._renderPipelines = {};
         }
         }
         PostProcessRenderPipelineManager.prototype.addPipeline = function (renderPipeline) {
         PostProcessRenderPipelineManager.prototype.addPipeline = function (renderPipeline) {
             this._renderPipelines[renderPipeline._name] = renderPipeline;
             this._renderPipelines[renderPipeline._name] = renderPipeline;
@@ -26322,9 +26375,9 @@ var BABYLON;
             this.meshUnderPointer = meshUnderPointer;
             this.meshUnderPointer = meshUnderPointer;
             this.sourceEvent = sourceEvent;
             this.sourceEvent = sourceEvent;
         }
         }
-        ActionEvent.CreateNew = function (source) {
+        ActionEvent.CreateNew = function (source, evt) {
             var scene = source.getScene();
             var scene = source.getScene();
-            return new ActionEvent(source, scene.pointerX, scene.pointerY, scene.meshUnderPointer);
+            return new ActionEvent(source, scene.pointerX, scene.pointerY, scene.meshUnderPointer, event);
         };
         };
 
 
         ActionEvent.CreateNewFromScene = function (scene, evt) {
         ActionEvent.CreateNewFromScene = function (scene, evt) {
@@ -28835,6 +28888,77 @@ var BABYLON;
     })(SceneOptimization);
     })(SceneOptimization);
     BABYLON.RenderTargetsOptimization = RenderTargetsOptimization;
     BABYLON.RenderTargetsOptimization = RenderTargetsOptimization;
 
 
+    var MergeMeshesOptimization = (function (_super) {
+        __extends(MergeMeshesOptimization, _super);
+        function MergeMeshesOptimization() {
+            _super.apply(this, arguments);
+            var _this = this;
+            this._canBeMerged = function (abstractMesh) {
+                if (!(abstractMesh instanceof BABYLON.Mesh)) {
+                    return false;
+                }
+
+                var mesh = abstractMesh;
+
+                if (mesh.instances.length > 0) {
+                    return false;
+                }
+
+                if (mesh.skeleton || mesh.hasLODLevels) {
+                    return false;
+                }
+
+                return true;
+            };
+            this.apply = function (scene) {
+                var globalPool = scene.meshes.slice(0);
+                var globalLength = globalPool.length;
+
+                for (var index = 0; index < globalLength; index++) {
+                    var currentPool = new Array();
+                    var current = globalPool[index];
+
+                   
+                    if (!_this._canBeMerged(current)) {
+                        continue;
+                    }
+
+                    currentPool.push(current);
+
+                    for (var subIndex = index + 1; subIndex < globalLength; subIndex++) {
+                        var otherMesh = globalPool[subIndex];
+
+                        if (!_this._canBeMerged(otherMesh)) {
+                            continue;
+                        }
+
+                        if (otherMesh.material !== current.material) {
+                            continue;
+                        }
+
+                        currentPool.push(otherMesh);
+                        globalLength--;
+
+                        globalPool.splice(subIndex, 1);
+
+                        subIndex--;
+                    }
+
+                    if (currentPool.length < 2) {
+                        continue;
+                    }
+
+                   
+                    BABYLON.Mesh.MergeMeshes(currentPool);
+                }
+
+                return true;
+            };
+        }
+        return MergeMeshesOptimization;
+    })(SceneOptimization);
+    BABYLON.MergeMeshesOptimization = MergeMeshesOptimization;
+
    
    
     var SceneOptimizerOptions = (function () {
     var SceneOptimizerOptions = (function () {
         function SceneOptimizerOptions(targetFrameRate, trackerDuration) {
         function SceneOptimizerOptions(targetFrameRate, trackerDuration) {
@@ -28848,6 +28972,7 @@ var BABYLON;
             var result = new SceneOptimizerOptions(targetFrameRate);
             var result = new SceneOptimizerOptions(targetFrameRate);
 
 
             var priority = 0;
             var priority = 0;
+            result.optimizations.push(new MergeMeshesOptimization(priority));
             result.optimizations.push(new ShadowsOptimization(priority));
             result.optimizations.push(new ShadowsOptimization(priority));
             result.optimizations.push(new LensFlaresOptimization(priority));
             result.optimizations.push(new LensFlaresOptimization(priority));
 
 
@@ -28867,6 +28992,7 @@ var BABYLON;
             var result = new SceneOptimizerOptions(targetFrameRate);
             var result = new SceneOptimizerOptions(targetFrameRate);
 
 
             var priority = 0;
             var priority = 0;
+            result.optimizations.push(new MergeMeshesOptimization(priority));
             result.optimizations.push(new ShadowsOptimization(priority));
             result.optimizations.push(new ShadowsOptimization(priority));
             result.optimizations.push(new LensFlaresOptimization(priority));
             result.optimizations.push(new LensFlaresOptimization(priority));
 
 
@@ -28894,6 +29020,7 @@ var BABYLON;
             var result = new SceneOptimizerOptions(targetFrameRate);
             var result = new SceneOptimizerOptions(targetFrameRate);
 
 
             var priority = 0;
             var priority = 0;
+            result.optimizations.push(new MergeMeshesOptimization(priority));
             result.optimizations.push(new ShadowsOptimization(priority));
             result.optimizations.push(new ShadowsOptimization(priority));
             result.optimizations.push(new LensFlaresOptimization(priority));
             result.optimizations.push(new LensFlaresOptimization(priority));
 
 
@@ -29354,7 +29481,7 @@ var BABYLON;
                     _this._treeDiv.style.top = "10px";
                     _this._treeDiv.style.top = "10px";
                     _this._treeDiv.style.width = "300px";
                     _this._treeDiv.style.width = "300px";
                     _this._treeDiv.style.height = "auto";
                     _this._treeDiv.style.height = "auto";
-                    _this._treeSubsetDiv.style.maxHeight = (canvasRect.height - 420) + "px";
+                    _this._treeSubsetDiv.style.maxHeight = (canvasRect.height - 490) + "px";
                 }
                 }
 
 
                 _this._globalDiv.style.left = canvasRect.left + "px";
                 _this._globalDiv.style.left = canvasRect.left + "px";
@@ -29710,6 +29837,7 @@ var BABYLON;
 
 
             leftPart.innerHTML = leftTitle;
             leftPart.innerHTML = leftTitle;
             rightPart.innerHTML = rightTitle;
             rightPart.innerHTML = rightTitle;
+            rightPart.style.maxWidth = "200px";
 
 
             container.appendChild(leftPart);
             container.appendChild(leftPart);
             container.appendChild(rightPart);
             container.appendChild(rightPart);

文件差异内容过多而无法显示
+ 12 - 12
babylon.2.0-alpha.js


+ 6 - 1
babylon.2.0.d.ts

@@ -561,7 +561,7 @@ declare module BABYLON {
         public meshUnderPointer: AbstractMesh;
         public meshUnderPointer: AbstractMesh;
         public sourceEvent: any;
         public sourceEvent: any;
         constructor(source: AbstractMesh, pointerX: number, pointerY: number, meshUnderPointer: AbstractMesh, sourceEvent?: any);
         constructor(source: AbstractMesh, pointerX: number, pointerY: number, meshUnderPointer: AbstractMesh, sourceEvent?: any);
-        static CreateNew(source: AbstractMesh): ActionEvent;
+        static CreateNew(source: AbstractMesh, evt?: Event): ActionEvent;
         static CreateNewFromScene(scene: Scene, evt: Event): ActionEvent;
         static CreateNewFromScene(scene: Scene, evt: Event): ActionEvent;
     }
     }
     class ActionManager {
     class ActionManager {
@@ -3080,6 +3080,7 @@ declare module BABYLON {
             max: Vector3;
             max: Vector3;
         };
         };
         static Center(meshesOrMinMaxVector: any): Vector3;
         static Center(meshesOrMinMaxVector: any): Vector3;
+        static MergeMeshes(meshes: Mesh[], disposeSource?: boolean, allow32BitsIndices?: boolean): Mesh;
     }
     }
 }
 }
 declare module BABYLON {
 declare module BABYLON {
@@ -4017,6 +4018,10 @@ declare module BABYLON {
     class RenderTargetsOptimization extends SceneOptimization {
     class RenderTargetsOptimization extends SceneOptimization {
         public apply: (scene: Scene) => boolean;
         public apply: (scene: Scene) => boolean;
     }
     }
+    class MergeMeshesOptimization extends SceneOptimization {
+        private _canBeMerged;
+        public apply: (scene: Scene) => boolean;
+    }
     class SceneOptimizerOptions {
     class SceneOptimizerOptions {
         public targetFrameRate: number;
         public targetFrameRate: number;
         public trackerDuration: number;
         public trackerDuration: number;