浏览代码

Optimizing ActionManager
Bug fixing with submeshes and instances

David Catuhe 11 年之前
父节点
当前提交
c4a71ed3a2

+ 32 - 0
Babylon/Actions/babylon.actionManager.js

@@ -128,6 +128,38 @@
             return false;
         };
 
+        Object.defineProperty(ActionManager.prototype, "hasPointerTriggers", {
+            get: function () {
+                for (var index = 0; index < this.actions.length; index++) {
+                    var action = this.actions[index];
+
+                    if (action.trigger >= ActionManager._OnPickTrigger && action.trigger <= ActionManager._OnPointerOutTrigger) {
+                        return true;
+                    }
+                }
+
+                return false;
+            },
+            enumerable: true,
+            configurable: true
+        });
+
+        Object.defineProperty(ActionManager.prototype, "hasPickTriggers", {
+            get: function () {
+                for (var index = 0; index < this.actions.length; index++) {
+                    var action = this.actions[index];
+
+                    if (action.trigger >= ActionManager._OnPickTrigger && action.trigger <= ActionManager._OnCenterPickTrigger) {
+                        return true;
+                    }
+                }
+
+                return false;
+            },
+            enumerable: true,
+            configurable: true
+        });
+
         ActionManager.prototype.registerAction = function (action) {
             if (action.trigger === ActionManager.OnEveryFrameTrigger) {
                 if (this.getScene().actionManager !== this) {

+ 24 - 0
Babylon/Actions/babylon.actionManager.ts

@@ -100,6 +100,30 @@
             return false;
         }
 
+        public get hasPointerTriggers(): boolean {
+            for (var index = 0; index < this.actions.length; index++) {
+                var action = this.actions[index];
+
+                if (action.trigger >= ActionManager._OnPickTrigger && action.trigger <= ActionManager._OnPointerOutTrigger) {
+                    return true;
+                }
+            }
+
+            return false;
+        }
+
+        public get hasPickTriggers(): boolean {
+            for (var index = 0; index < this.actions.length; index++) {
+                var action = this.actions[index];
+
+                if (action.trigger >= ActionManager._OnPickTrigger && action.trigger <= ActionManager._OnCenterPickTrigger) {
+                    return true;
+                }
+            }
+
+            return false;
+        }
+
         public registerAction(action: Action): Action {
             if (action.trigger === ActionManager.OnEveryFrameTrigger) {
                 if (this.getScene().actionManager !== this) {

+ 7 - 5
Babylon/Mesh/babylon.mesh.js

@@ -325,11 +325,13 @@ var BABYLON;
 
             var visibleInstances = batch.visibleInstances[subMesh._id];
 
-            for (var instanceIndex = 0; instanceIndex < visibleInstances.length; instanceIndex++) {
-                var instance = visibleInstances[instanceIndex];
-                instance.getWorldMatrix().copyToArray(this._worldMatricesInstancesArray, offset);
-                offset += 16;
-                instancesCount++;
+            if (visibleInstances) {
+                for (var instanceIndex = 0; instanceIndex < visibleInstances.length; instanceIndex++) {
+                    var instance = visibleInstances[instanceIndex];
+                    instance.getWorldMatrix().copyToArray(this._worldMatricesInstancesArray, offset);
+                    offset += 16;
+                    instancesCount++;
+                }
             }
 
             var offsetLocation0 = effect.getAttributeLocationByName("world0");

+ 7 - 5
Babylon/Mesh/babylon.mesh.ts

@@ -328,11 +328,13 @@
 
             var visibleInstances = batch.visibleInstances[subMesh._id];
 
-            for (var instanceIndex = 0; instanceIndex < visibleInstances.length; instanceIndex++) {
-                var instance = visibleInstances[instanceIndex];
-                instance.getWorldMatrix().copyToArray(this._worldMatricesInstancesArray, offset);
-                offset += 16;
-                instancesCount++;
+            if (visibleInstances) {
+                for (var instanceIndex = 0; instanceIndex < visibleInstances.length; instanceIndex++) {
+                    var instance = visibleInstances[instanceIndex];
+                    instance.getWorldMatrix().copyToArray(this._worldMatricesInstancesArray, offset);
+                    offset += 16;
+                    instancesCount++;
+                }
             }
 
             var offsetLocation0 = effect.getAttributeLocationByName("world0");

+ 2 - 2
Babylon/babylon.scene.js

@@ -190,7 +190,7 @@
                 _this._updatePointerPosition(evt);
 
                 var pickResult = _this.pick(_this._pointerX, _this._pointerY, function (mesh) {
-                    return mesh.actionManager && mesh.isPickable && mesh.isVisible && mesh.isReady();
+                    return mesh.isPickable && mesh.isVisible && mesh.isReady() && mesh.actionManager && mesh.actionManager.hasPointerTriggers;
                 });
 
                 if (pickResult.hit) {
@@ -210,7 +210,7 @@
 
                 if (!_this.onPointerDown) {
                     predicate = function (mesh) {
-                        return mesh.actionManager && mesh.isPickable && mesh.isVisible && mesh.isReady();
+                        return mesh.isPickable && mesh.isVisible && mesh.isReady() && mesh.actionManager && mesh.actionManager.hasPickTriggers;
                     };
                 }
 

+ 2 - 2
Babylon/babylon.scene.ts

@@ -257,7 +257,7 @@
 
                 this._updatePointerPosition(evt);
 
-                var pickResult = this.pick(this._pointerX, this._pointerY, (mesh: AbstractMesh): boolean => mesh.actionManager && mesh.isPickable && mesh.isVisible && mesh.isReady());
+                var pickResult = this.pick(this._pointerX, this._pointerY, (mesh: AbstractMesh): boolean => mesh.isPickable && mesh.isVisible && mesh.isReady() && mesh.actionManager && mesh.actionManager.hasPointerTriggers);
 
                 if (pickResult.hit) {
                     this.setPointerOverMesh(pickResult.pickedMesh);
@@ -277,7 +277,7 @@
 
                 if (!this.onPointerDown) {
                     predicate = (mesh: AbstractMesh): boolean => {
-                        return mesh.actionManager && mesh.isPickable && mesh.isVisible && mesh.isReady();
+                        return mesh.isPickable && mesh.isVisible && mesh.isReady() && mesh.actionManager && mesh.actionManager.hasPickTriggers;
                     };
                 }
 

文件差异内容过多而无法显示
+ 2 - 2
babylon.1.13-beta-debug.js


文件差异内容过多而无法显示
+ 4 - 4
babylon.1.13-beta.js