소스 검색

Merge pull request #5954 from TrevorDev/observerPriority

ability to set observer priority, utility layer pointer priority shou…
David Catuhe 6 년 전
부모
커밋
61db735005

+ 1 - 0
dist/preview release/what's new.md

@@ -124,6 +124,7 @@
 - Added UnitTests for BaseCameraPointersInput and ArcRotateCameraPointersInput. ([mrdunk](https://github.com))
 - onActiveCameraChanged shouldn't be fired when rendering rig cameras ([TrevorDev](https://github.com/TrevorDev))
 - Added `MeshExploder` class ([danjpar](https://github.com/danjpar))
+- Observables can now make observers top or bottom priority ([TrevorDev](https://github.com/TrevorDev))
 
 ### OBJ Loader
 - Add color vertex support (not part of standard) ([brianzinn](https://github.com/brianzinn))

+ 1 - 0
src/Behaviors/Meshes/pointerDragBehavior.ts

@@ -419,5 +419,6 @@ export class PointerDragBehavior implements Behavior<AbstractMesh> {
         if (this._beforeRenderObserver) {
             this._scene.onBeforeRenderObservable.remove(this._beforeRenderObserver);
         }
+        this.releaseDrag();
     }
 }

+ 3 - 0
src/Gizmos/positionGizmo.ts

@@ -31,6 +31,9 @@ export class PositionGizmo extends Gizmo {
     /** Fires an event when any of it's sub gizmos are released from dragging */
     public onDragEndObservable = new Observable();
 
+    public get attachedMesh() {
+        return this.xGizmo.attachedMesh;
+    }
     public set attachedMesh(mesh: Nullable<AbstractMesh>) {
         if (this.xGizmo) {
             this.xGizmo.attachedMesh = mesh;

+ 3 - 0
src/Gizmos/rotationGizmo.ts

@@ -31,6 +31,9 @@ export class RotationGizmo extends Gizmo {
     /** Fires an event when any of it's sub gizmos are released from dragging */
     public onDragEndObservable = new Observable();
 
+    public get attachedMesh() {
+        return this.xGizmo.attachedMesh;
+    }
     public set attachedMesh(mesh: Nullable<AbstractMesh>) {
         if (this.xGizmo) {
             this.xGizmo.attachedMesh = mesh;

+ 3 - 0
src/Gizmos/scaleGizmo.ts

@@ -34,6 +34,9 @@ export class ScaleGizmo extends Gizmo {
     /** Fires an event when any of it's sub gizmos are released from dragging */
     public onDragEndObservable = new Observable();
 
+    public get attachedMesh() {
+        return this.xGizmo.attachedMesh;
+    }
     public set attachedMesh(mesh: Nullable<AbstractMesh>) {
         if (this.xGizmo) {
             this.xGizmo.attachedMesh = mesh;

+ 18 - 0
src/Misc/observable.ts

@@ -268,6 +268,24 @@ export class Observable<T> {
     }
 
     /**
+     * Moves the observable to the top of the observer list making it get called first when notified
+     * @param observer the observer to move
+     */
+    public makeObserverTopPriority(observer: Observer<T>) {
+           this._remove(observer);
+           this._observers.unshift(observer);
+    }
+
+    /**
+     * Moves the observable to the bottom of the observer list making it get called last when notified
+     * @param observer the observer to move
+     */
+    public makeObserverBottomPriority(observer: Observer<T>) {
+        this._remove(observer);
+        this._observers.push(observer);
+    }
+
+    /**
      * 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 defines the data to send to all observers

+ 5 - 1
src/Rendering/utilityLayerRenderer.ts

@@ -187,8 +187,12 @@ export class UtilityLayerRenderer implements IDisposable {
                         }
                     }
                 }
-
             });
+
+            // As a newly added utility layer will be rendered over the screen last, it's pointer events should be processed first
+            if (this._originalPointerObserver) {
+                originalScene.onPrePointerObservable.makeObserverTopPriority(this._originalPointerObserver);
+            }
         }
 
         // Render directly on top of existing scene without clearing