Browse Source

Canvas2D: WorldSpaceCanvas bug fixes

 - sideOrientation setting is finally working, Mesh.DOUBLESIDE has now the expected behavior
 - pointerObservable is now working with unitScaleFactor
 - pointer enter/over is working for WorldSpaceCanvas
nockawa 8 năm trước cách đây
mục cha
commit
cd85989e2a

+ 21 - 4
canvas2D/src/Engine/babylon.canvas2d.ts

@@ -344,7 +344,7 @@
 
 
         /**
         /**
          * If you set your own WorldSpaceNode to display the Canvas2D you have to provide your own implementation of this method which computes the local position in the Canvas based on the given 3D World one.
          * If you set your own WorldSpaceNode to display the Canvas2D you have to provide your own implementation of this method which computes the local position in the Canvas based on the given 3D World one.
-         * Beware that you have to take under consideration the origin in your calculations! Good luck!
+         * Beware that you have to take under consideration the origin and unitScaleFactor in your calculations! Good luck!
          */
          */
         public worldSpaceToNodeLocal = (worldPos: Vector3): Vector2 => {
         public worldSpaceToNodeLocal = (worldPos: Vector3): Vector2 => {
             let node = this._worldSpaceNode;
             let node = this._worldSpaceNode;
@@ -354,11 +354,14 @@
 
 
             let mtx = node.getWorldMatrix().clone();
             let mtx = node.getWorldMatrix().clone();
             mtx.invert();
             mtx.invert();
+            let usf = this.unitScaleFactor;
             let v = Vector3.TransformCoordinates(worldPos, mtx);
             let v = Vector3.TransformCoordinates(worldPos, mtx);
             let res = new Vector2(v.x, v.y);
             let res = new Vector2(v.x, v.y);
             let size = this.actualSize;
             let size = this.actualSize;
-            res.x += size.width * 0.5;  // res is centered, make it relative to bottom/left
-            res.y += size.height * 0.5;
+            res.x += (size.width/usf) * 0.5;  // res is centered, make it relative to bottom/left
+            res.y += (size.height/usf) * 0.5;
+            res.x *= usf; // multiply by the unitScaleFactor, which defines if the canvas is nth time bigger than the original world plane
+            res.y *= usf;
             return res;
             return res;
         }
         }
 
 
@@ -599,10 +602,14 @@
 
 
         // Based on the previousIntersectionList and the actualInstersectionList we can determined which primitives are being hover state or loosing it
         // Based on the previousIntersectionList and the actualInstersectionList we can determined which primitives are being hover state or loosing it
         private _updateOverStatus(force: boolean) {
         private _updateOverStatus(force: boolean) {
-            if ((!force && (this.scene.getRenderId() === this._hoverStatusRenderId)) || !this._previousIntersectionList || !this._actualIntersectionList) {
+            if ((!force && (this.scene.getRenderId() === this._hoverStatusRenderId)) || !this._actualIntersectionList) {
                 return;
                 return;
             }
             }
 
 
+            if (this._previousIntersectionList == null) {
+                this._previousIntersectionList = [];
+            }
+
             // Detect a change of over
             // Detect a change of over
             let prevPrim = this._previousOverPrimitive ? this._previousOverPrimitive.prim : null;
             let prevPrim = this._previousOverPrimitive ? this._previousOverPrimitive.prim : null;
             let actualPrim = this._actualOverPrimitive ? this._actualOverPrimitive.prim : null;
             let actualPrim = this._actualOverPrimitive ? this._actualOverPrimitive.prim : null;
@@ -1061,6 +1068,10 @@
             return this.__engineData;
             return this.__engineData;
         }
         }
 
 
+        public get unitScaleFactor(): number {
+            return this._unitScaleFactor;
+        }
+
         public createCanvasProfileInfoCanvas(): Canvas2D {
         public createCanvasProfileInfoCanvas(): Canvas2D {
             if (this._profilingCanvas) {
             if (this._profilingCanvas) {
                 return this._profilingCanvas;
                 return this._profilingCanvas;
@@ -1227,6 +1238,7 @@
         private _beforeRenderObserver: Observer<Scene>;
         private _beforeRenderObserver: Observer<Scene>;
         private _afterRenderObserver: Observer<Scene>;
         private _afterRenderObserver: Observer<Scene>;
         private _supprtInstancedArray: boolean;
         private _supprtInstancedArray: boolean;
+        protected _unitScaleFactor: number;
         private _trackedGroups: Array<Group2D>;
         private _trackedGroups: Array<Group2D>;
         protected _trackNode: Node;
         protected _trackNode: Node;
         protected _trackNodeOffset :Vector3;
         protected _trackNodeOffset :Vector3;
@@ -1811,6 +1823,8 @@
             super(scene, settings);
             super(scene, settings);
             Prim2DBase._isCanvasInit = false;
             Prim2DBase._isCanvasInit = false;
 
 
+            this._unitScaleFactor = (settings.unitScaleFactor != null) ? settings.unitScaleFactor : 1;
+
             this._renderableData._useMipMap = true;
             this._renderableData._useMipMap = true;
             this._renderableData._anisotropicLevel = 8;
             this._renderableData._anisotropicLevel = 8;
 
 
@@ -1857,6 +1871,9 @@
                 mtl.specularColor = new Color3(0, 0, 0);
                 mtl.specularColor = new Color3(0, 0, 0);
                 mtl.disableLighting = true;
                 mtl.disableLighting = true;
                 mtl.useAlphaFromDiffuseTexture = true;
                 mtl.useAlphaFromDiffuseTexture = true;
+                if (settings && settings.sideOrientation) {
+                    mtl.backFaceCulling = (settings.sideOrientation === Mesh.DEFAULTSIDE || settings.sideOrientation === Mesh.FRONTSIDE);
+                }
                 plane.position = settings && settings.worldPosition || Vector3.Zero();
                 plane.position = settings && settings.worldPosition || Vector3.Zero();
                 plane.rotationQuaternion = settings && settings.worldRotation || Quaternion.Identity();
                 plane.rotationQuaternion = settings && settings.worldRotation || Quaternion.Identity();
                 plane.material = mtl;
                 plane.material = mtl;