Переглянути джерело

added a pointerdownup event for mesh to babylon.scene

Johannes Dobler 9 роки тому
батько
коміт
cb5a7838ea
2 змінених файлів з 20 додано та 6 видалено
  1. 9 2
      src/babylon.scene.js
  2. 11 4
      src/babylon.scene.ts

+ 9 - 2
src/babylon.scene.js

@@ -137,6 +137,7 @@ var BABYLON;
             this._transformMatrix = BABYLON.Matrix.Zero();
             this._edgesRenderers = new BABYLON.SmartArray(16);
             this._uniqueIdCounter = 0;
+            this._pickedMeshName = null;
             this._engine = engine;
             engine.scenes.push(this);
             this._renderingManager = new BABYLON.RenderingManager(this);
@@ -360,12 +361,13 @@ var BABYLON;
                     return;
                 }
                 _this._updatePointerPosition(evt);
+                _this._pickedMeshName = null;
                 _this._startingPointerPosition.x = _this._pointerX;
                 _this._startingPointerPosition.y = _this._pointerY;
                 _this._startingPointerTime = new Date().getTime();
                 var predicate = null;
                 // Meshes
-                if (!_this.onPointerDown) {
+                if (!_this.onPointerDown && !_this.onPointerDownUp) {
                     predicate = function (mesh) {
                         return mesh.isPickable && mesh.isVisible && mesh.isReady() && mesh.actionManager && mesh.actionManager.hasPointerTriggers;
                     };
@@ -373,6 +375,8 @@ var BABYLON;
                 var pickResult = _this.pick(_this._pointerX, _this._pointerY, predicate, false, _this.cameraToUseForPointers);
                 if (pickResult.hit && pickResult.pickedMesh) {
                     if (pickResult.pickedMesh.actionManager) {
+                        _this._pickedMeshName = pickResult.pickedMesh.name;
+                        console.log(_this._pickedMeshName);
                         if (pickResult.pickedMesh.actionManager.hasPickTriggers) {
                             switch (evt.button) {
                                 case 0:
@@ -433,7 +437,7 @@ var BABYLON;
                 }
                 var predicate = null;
                 _this._updatePointerPosition(evt);
-                if (!_this.onPointerUp) {
+                if (!_this.onPointerUp && !_this.onPointerDownUp) {
                     predicate = function (mesh) {
                         return mesh.isPickable && mesh.isVisible && mesh.isReady() && mesh.actionManager && (mesh.actionManager.hasPickTriggers || mesh.actionManager.hasSpecificTrigger(BABYLON.ActionManager.OnLongPressTrigger));
                     };
@@ -441,6 +445,9 @@ var BABYLON;
                 // Meshes
                 var pickResult = _this.pick(_this._pointerX, _this._pointerY, predicate, false, _this.cameraToUseForPointers);
                 if (pickResult.hit && pickResult.pickedMesh) {
+                    if (_this.onPointerDownUp && _this._pickedMeshName != null && pickResult.pickedMesh.name == _this._pickedMeshName) {
+                        _this.onPointerDownUp(evt, pickResult);
+                    }
                     if (pickResult.pickedMesh.actionManager) {
                         pickResult.pickedMesh.actionManager.processTrigger(BABYLON.ActionManager.OnPickUpTrigger, BABYLON.ActionEvent.CreateNew(pickResult.pickedMesh, evt));
                         if (Math.abs(_this._startingPointerPosition.x - _this._pointerX) < BABYLON.ActionManager.DragMovementThreshold && Math.abs(_this._startingPointerPosition.y - _this._pointerY) < BABYLON.ActionManager.DragMovementThreshold) {

+ 11 - 4
src/babylon.scene.ts

@@ -68,6 +68,7 @@
         public onPointerMove: (evt: PointerEvent, pickInfo: PickingInfo) => void;
         public onPointerDown: (evt: PointerEvent, pickInfo: PickingInfo) => void;
         public onPointerUp: (evt: PointerEvent, pickInfo: PickingInfo) => void;
+        public onPointerDownUp: (evt: PointerEvent, pickInfo: PickingInfo) => void;
         public cameraToUseForPointers: Camera = null; // Define this parameter if you are using multiple cameras and you want to specify which one should be used for pointer position
         private _pointerX: number;
         private _pointerY: number;
@@ -277,6 +278,8 @@
         private _depthRenderer: DepthRenderer;
 
         private _uniqueIdCounter = 0;
+        
+        private _pickedMeshName : string = null;
 
         /**
          * @constructor
@@ -508,8 +511,8 @@
                     return;
                 }
 
-                this._updatePointerPosition(evt);
-
+                this._updatePointerPosition(evt); 
+                this._pickedMeshName = null;
                 this._startingPointerPosition.x = this._pointerX;
                 this._startingPointerPosition.y = this._pointerY;
                 this._startingPointerTime = new Date().getTime();
@@ -517,7 +520,7 @@
                 var predicate = null;
 
                 // Meshes
-                if (!this.onPointerDown) {
+                if (!this.onPointerDown && !this.onPointerDownUp) {
                     predicate = (mesh: AbstractMesh): boolean => {
                         return mesh.isPickable && mesh.isVisible && mesh.isReady() && mesh.actionManager && mesh.actionManager.hasPointerTriggers;
                     };
@@ -525,6 +528,7 @@
                 var pickResult = this.pick(this._pointerX, this._pointerY, predicate, false, this.cameraToUseForPointers);
 
                 if (pickResult.hit && pickResult.pickedMesh) {
+                    this._pickedMeshName = pickResult.pickedMesh.name;
                     if (pickResult.pickedMesh.actionManager) {
                         if (pickResult.pickedMesh.actionManager.hasPickTriggers) {
                             switch (evt.button) {
@@ -597,7 +601,7 @@
 
                 this._updatePointerPosition(evt);
 
-                if (!this.onPointerUp) {
+                if (!this.onPointerUp && !this.onPointerDownUp) {
                     predicate = (mesh: AbstractMesh): boolean => {
                         return mesh.isPickable && mesh.isVisible && mesh.isReady() && mesh.actionManager && (mesh.actionManager.hasPickTriggers || mesh.actionManager.hasSpecificTrigger(ActionManager.OnLongPressTrigger));
                     };
@@ -607,6 +611,9 @@
                 var pickResult = this.pick(this._pointerX, this._pointerY, predicate, false, this.cameraToUseForPointers);
 
                 if (pickResult.hit && pickResult.pickedMesh) {
+                    if(this.onPointerDownUp && this._pickedMeshName != null && pickResult.pickedMesh.name == this._pickedMeshName){
+						this.onPointerDownUp(evt, pickResult);
+					}
                     if (pickResult.pickedMesh.actionManager) {
                         pickResult.pickedMesh.actionManager.processTrigger(ActionManager.OnPickUpTrigger, ActionEvent.CreateNew(pickResult.pickedMesh, evt));