|
@@ -3395,6 +3395,7 @@ var BABYLON;
|
|
var Observable = (function () {
|
|
var Observable = (function () {
|
|
function Observable() {
|
|
function Observable() {
|
|
this._observers = new Array();
|
|
this._observers = new Array();
|
|
|
|
+ this._eventState = new EventState(0);
|
|
}
|
|
}
|
|
/**
|
|
/**
|
|
* Create a new Observer with the specified callback
|
|
* Create a new Observer with the specified callback
|
|
@@ -3444,23 +3445,25 @@ var BABYLON;
|
|
};
|
|
};
|
|
/**
|
|
/**
|
|
* Notify all Observers by calling their respective callback with the given data
|
|
* Notify all Observers by calling their respective callback with the given data
|
|
|
|
+ * Will return true if all observers were executed, false if an observer set skipNextObservers to true, then prevent the subsequent ones to execute
|
|
* @param eventData
|
|
* @param eventData
|
|
* @param mask
|
|
* @param mask
|
|
*/
|
|
*/
|
|
Observable.prototype.notifyObservers = function (eventData, mask) {
|
|
Observable.prototype.notifyObservers = function (eventData, mask) {
|
|
if (mask === void 0) { mask = -1; }
|
|
if (mask === void 0) { mask = -1; }
|
|
- var state = Observable._pooledEventState ? Observable._pooledEventState.initalize(mask) : new EventState(mask);
|
|
|
|
- Observable._pooledEventState = null;
|
|
|
|
|
|
+ var state = this._eventState;
|
|
|
|
+ state.mask = mask;
|
|
|
|
+ state.skipNextObservers = false;
|
|
for (var _i = 0, _a = this._observers; _i < _a.length; _i++) {
|
|
for (var _i = 0, _a = this._observers; _i < _a.length; _i++) {
|
|
var obs = _a[_i];
|
|
var obs = _a[_i];
|
|
if (obs.mask & mask) {
|
|
if (obs.mask & mask) {
|
|
obs.callback(eventData, state);
|
|
obs.callback(eventData, state);
|
|
}
|
|
}
|
|
if (state.skipNextObservers) {
|
|
if (state.skipNextObservers) {
|
|
- break;
|
|
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- Observable._pooledEventState = state;
|
|
|
|
|
|
+ return true;
|
|
};
|
|
};
|
|
/**
|
|
/**
|
|
* return true is the Observable has at least one Observer registered
|
|
* return true is the Observable has at least one Observer registered
|
|
@@ -3482,7 +3485,6 @@ var BABYLON;
|
|
result._observers = this._observers.slice(0);
|
|
result._observers = this._observers.slice(0);
|
|
return result;
|
|
return result;
|
|
};
|
|
};
|
|
- Observable._pooledEventState = null;
|
|
|
|
return Observable;
|
|
return Observable;
|
|
})();
|
|
})();
|
|
BABYLON.Observable = Observable;
|
|
BABYLON.Observable = Observable;
|
|
@@ -47867,18 +47869,20 @@ var BABYLON;
|
|
var targetPointerPos = capturedPrim ? this._primPointerInfo.canvasPointerPos.subtract(new BABYLON.Vector2(targetPrim.globalTransform.m[12], targetPrim.globalTransform.m[13])) : this._actualOverPrimitive.intersectionLocation;
|
|
var targetPointerPos = capturedPrim ? this._primPointerInfo.canvasPointerPos.subtract(new BABYLON.Vector2(targetPrim.globalTransform.m[12], targetPrim.globalTransform.m[13])) : this._actualOverPrimitive.intersectionLocation;
|
|
this._primPointerInfo.updateRelatedTarget(targetPrim, targetPointerPos);
|
|
this._primPointerInfo.updateRelatedTarget(targetPrim, targetPointerPos);
|
|
// Analyze the pointer event type and fire proper events on the primitive
|
|
// Analyze the pointer event type and fire proper events on the primitive
|
|
|
|
+ var skip = false;
|
|
if (eventData.type === BABYLON.PointerEventTypes.POINTERWHEEL) {
|
|
if (eventData.type === BABYLON.PointerEventTypes.POINTERWHEEL) {
|
|
- this._bubbleNotifyPrimPointerObserver(targetPrim, BABYLON.PrimitivePointerInfo.PointerMouseWheel, eventData.event);
|
|
|
|
|
|
+ skip = !this._bubbleNotifyPrimPointerObserver(targetPrim, BABYLON.PrimitivePointerInfo.PointerMouseWheel, eventData);
|
|
}
|
|
}
|
|
else if (eventData.type === BABYLON.PointerEventTypes.POINTERMOVE) {
|
|
else if (eventData.type === BABYLON.PointerEventTypes.POINTERMOVE) {
|
|
- this._bubbleNotifyPrimPointerObserver(targetPrim, BABYLON.PrimitivePointerInfo.PointerMove, eventData.event);
|
|
|
|
|
|
+ skip = !this._bubbleNotifyPrimPointerObserver(targetPrim, BABYLON.PrimitivePointerInfo.PointerMove, eventData);
|
|
}
|
|
}
|
|
else if (eventData.type === BABYLON.PointerEventTypes.POINTERDOWN) {
|
|
else if (eventData.type === BABYLON.PointerEventTypes.POINTERDOWN) {
|
|
- this._bubbleNotifyPrimPointerObserver(targetPrim, BABYLON.PrimitivePointerInfo.PointerDown, eventData.event);
|
|
|
|
|
|
+ skip = !this._bubbleNotifyPrimPointerObserver(targetPrim, BABYLON.PrimitivePointerInfo.PointerDown, eventData);
|
|
}
|
|
}
|
|
else if (eventData.type === BABYLON.PointerEventTypes.POINTERUP) {
|
|
else if (eventData.type === BABYLON.PointerEventTypes.POINTERUP) {
|
|
- this._bubbleNotifyPrimPointerObserver(targetPrim, BABYLON.PrimitivePointerInfo.PointerUp, eventData.event);
|
|
|
|
|
|
+ skip = !this._bubbleNotifyPrimPointerObserver(targetPrim, BABYLON.PrimitivePointerInfo.PointerUp, eventData);
|
|
}
|
|
}
|
|
|
|
+ eventState.skipNextObservers = skip;
|
|
};
|
|
};
|
|
Canvas2D.prototype._updatePointerInfo = function (eventData, localPosition) {
|
|
Canvas2D.prototype._updatePointerInfo = function (eventData, localPosition) {
|
|
var pii = this._primPointerInfo;
|
|
var pii = this._primPointerInfo;
|
|
@@ -48007,6 +48011,7 @@ var BABYLON;
|
|
};
|
|
};
|
|
Canvas2D.prototype._bubbleNotifyPrimPointerObserver = function (prim, mask, eventData) {
|
|
Canvas2D.prototype._bubbleNotifyPrimPointerObserver = function (prim, mask, eventData) {
|
|
var ppi = this._primPointerInfo;
|
|
var ppi = this._primPointerInfo;
|
|
|
|
+ var event = eventData ? eventData.event : null;
|
|
// In case of PointerOver/Out we will first notify the parent with PointerEnter/Leave
|
|
// In case of PointerOver/Out we will first notify the parent with PointerEnter/Leave
|
|
if ((mask & (BABYLON.PrimitivePointerInfo.PointerOver | BABYLON.PrimitivePointerInfo.PointerOut)) !== 0) {
|
|
if ((mask & (BABYLON.PrimitivePointerInfo.PointerOver | BABYLON.PrimitivePointerInfo.PointerOut)) !== 0) {
|
|
this._notifParents(prim, mask);
|
|
this._notifParents(prim, mask);
|
|
@@ -48019,13 +48024,16 @@ var BABYLON;
|
|
this._updatePrimPointerPos(cur);
|
|
this._updatePrimPointerPos(cur);
|
|
// Exec the observers
|
|
// Exec the observers
|
|
this._debugExecObserver(cur, mask);
|
|
this._debugExecObserver(cur, mask);
|
|
- cur._pointerEventObservable.notifyObservers(ppi, mask);
|
|
|
|
- this._triggerActionManager(cur, ppi, mask, eventData);
|
|
|
|
|
|
+ if (!cur._pointerEventObservable.notifyObservers(ppi, mask) && eventData instanceof BABYLON.PointerInfoPre) {
|
|
|
|
+ eventData.skipOnPointerObservable = true;
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ this._triggerActionManager(cur, ppi, mask, event);
|
|
// Bubble canceled? If we're not executing PointerOver or PointerOut, quit immediately
|
|
// Bubble canceled? If we're not executing PointerOver or PointerOut, quit immediately
|
|
// If it's PointerOver/Out we have to trigger PointerEnter/Leave no matter what
|
|
// If it's PointerOver/Out we have to trigger PointerEnter/Leave no matter what
|
|
if (ppi.cancelBubble) {
|
|
if (ppi.cancelBubble) {
|
|
if ((mask & (BABYLON.PrimitivePointerInfo.PointerOver | BABYLON.PrimitivePointerInfo.PointerOut)) === 0) {
|
|
if ((mask & (BABYLON.PrimitivePointerInfo.PointerOver | BABYLON.PrimitivePointerInfo.PointerOut)) === 0) {
|
|
- return;
|
|
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
// We're dealing with PointerOver/Out, let's keep looping to fire PointerEnter/Leave, but not Over/Out anymore
|
|
// We're dealing with PointerOver/Out, let's keep looping to fire PointerEnter/Leave, but not Over/Out anymore
|
|
bubbleCancelled = true;
|
|
bubbleCancelled = true;
|
|
@@ -48047,6 +48055,7 @@ var BABYLON;
|
|
// Loop to the parent
|
|
// Loop to the parent
|
|
cur = cur.parent;
|
|
cur = cur.parent;
|
|
}
|
|
}
|
|
|
|
+ return true;
|
|
};
|
|
};
|
|
Canvas2D.prototype._triggerActionManager = function (prim, ppi, mask, eventData) {
|
|
Canvas2D.prototype._triggerActionManager = function (prim, ppi, mask, eventData) {
|
|
var _this = this;
|
|
var _this = this;
|