@babylonjs/gui 5.0.0-beta.8 → 5.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/2D/advancedDynamicTexture.d.ts +11 -0
  2. package/2D/advancedDynamicTexture.js +95 -48
  3. package/2D/advancedDynamicTexture.js.map +1 -1
  4. package/2D/controls/container.d.ts +1 -1
  5. package/2D/controls/container.js.map +1 -1
  6. package/2D/controls/control.d.ts +7 -7
  7. package/2D/controls/control.js +12 -12
  8. package/2D/controls/control.js.map +1 -1
  9. package/2D/controls/inputText.d.ts +2 -0
  10. package/2D/controls/inputText.js +2 -1
  11. package/2D/controls/inputText.js.map +1 -1
  12. package/2D/controls/sliders/baseSlider.js +1 -1
  13. package/2D/controls/sliders/baseSlider.js.map +1 -1
  14. package/2D/controls/textBlock.d.ts +1 -0
  15. package/2D/controls/textBlock.js +17 -7
  16. package/2D/controls/textBlock.js.map +1 -1
  17. package/2D/xmlLoader.js +8 -1
  18. package/2D/xmlLoader.js.map +1 -1
  19. package/3D/controls/contentDisplay3D.js +1 -1
  20. package/3D/controls/contentDisplay3D.js.map +1 -1
  21. package/3D/controls/holographicSlate.d.ts +45 -35
  22. package/3D/controls/holographicSlate.js +172 -113
  23. package/3D/controls/holographicSlate.js.map +1 -1
  24. package/3D/controls/slider3D.d.ts +1 -0
  25. package/3D/controls/slider3D.js +6 -6
  26. package/3D/controls/slider3D.js.map +1 -1
  27. package/3D/controls/touchButton3D.d.ts +12 -1
  28. package/3D/controls/touchButton3D.js +43 -4
  29. package/3D/controls/touchButton3D.js.map +1 -1
  30. package/3D/controls/touchHolographicButton.d.ts +5 -0
  31. package/3D/controls/touchHolographicButton.js +17 -4
  32. package/3D/controls/touchHolographicButton.js.map +1 -1
  33. package/3D/gizmos/slateGizmo.d.ts +2 -4
  34. package/3D/gizmos/slateGizmo.js +24 -18
  35. package/3D/gizmos/slateGizmo.js.map +1 -1
  36. package/3D/gui3DManager.js.map +1 -1
  37. package/package.json +2 -2
@@ -1,5 +1,6 @@
1
1
  import { __extends } from "tslib";
2
2
  import { Gizmo } from "@babylonjs/core/Gizmos/gizmo.js";
3
+ import { Epsilon } from "@babylonjs/core/Maths/math.constants.js";
3
4
  import { Matrix, Quaternion, TmpVectors, Vector3 } from "@babylonjs/core/Maths/math.vector.js";
4
5
  import { TransformNode } from "@babylonjs/core/Meshes/transformNode.js";
5
6
  import { PivotTools } from "@babylonjs/core/Misc/pivotTools.js";
@@ -27,6 +28,7 @@ var SlateGizmo = /** @class */ (function (_super) {
27
28
  * Value we use to offset handles from mesh
28
29
  */
29
30
  _this._margin = 0.35;
31
+ _this._handleSize = 0.075;
30
32
  _this._attachedSlate = null;
31
33
  _this._existingSlateScale = new Vector3();
32
34
  /**
@@ -37,10 +39,6 @@ var SlateGizmo = /** @class */ (function (_super) {
37
39
  * The distance away from the object which the draggable meshes should appear world sized when fixedScreenSize is set to true (default: 10)
38
40
  */
39
41
  _this.fixedScreenSizeDistanceFactor = 10;
40
- /**
41
- * Size of the handles (meters in XR)
42
- */
43
- _this.handleSize = 0.01;
44
42
  _this._createNode();
45
43
  _this.updateScale = false;
46
44
  _this._renderObserver = _this.gizmoLayer.originalScene.onBeforeRenderObservable.add(function () {
@@ -111,7 +109,6 @@ var SlateGizmo = /** @class */ (function (_super) {
111
109
  var corner = new CornerHandle(this, this.gizmoLayer.utilityLayerScene);
112
110
  this._corners.push(corner);
113
111
  corner.node.rotation.z = (Math.PI / 2) * i;
114
- corner.node.scaling.setAll(this.handleSize);
115
112
  corner.node.parent = this._handlesParent;
116
113
  this._assignDragBehaviorCorners(corner, function (originStart, dimensionsStart, offset, masks) { return _this._moveHandle(originStart, dimensionsStart, offset, masks, true); }, masksCorners[i]);
117
114
  }
@@ -119,7 +116,6 @@ var SlateGizmo = /** @class */ (function (_super) {
119
116
  var side = new SideHandle(this, this.gizmoLayer.utilityLayerScene);
120
117
  this._sides.push(side);
121
118
  side.node.rotation.z = (Math.PI / 2) * i;
122
- side.node.scaling.copyFromFloats(this.handleSize, this.handleSize, this.handleSize);
123
119
  side.node.parent = this._handlesParent;
124
120
  this._assignDragBehaviorSides(side, i % 2 === 0 ? new Vector3(0, 1, 0) : new Vector3(1, 0, 0));
125
121
  }
@@ -166,8 +162,7 @@ var SlateGizmo = /** @class */ (function (_super) {
166
162
  offsetOriginMasked.copyFrom(offset).multiplyInPlace(masks.origin);
167
163
  offsetDimensionsMasked.copyFrom(offset).multiplyInPlace(masks.dimensions);
168
164
  this._attachedSlate.origin.copyFrom(originStart).addInPlace(offsetOriginMasked);
169
- this._attachedSlate.dimensions.copyFrom(dimensionsStart).addInPlace(offsetDimensionsMasked);
170
- this._attachedSlate.backplateDimensions.x = this._attachedSlate.dimensions.x;
165
+ this._attachedSlate.dimensions.set(dimensionsStart.x + offsetDimensionsMasked.x, dimensionsStart.y + offsetDimensionsMasked.y);
171
166
  };
172
167
  SlateGizmo.prototype._assignDragBehaviorCorners = function (handle, moveFn, masks) {
173
168
  var _this = this;
@@ -176,7 +171,6 @@ var SlateGizmo = /** @class */ (function (_super) {
176
171
  var dragOrigin = new Vector3();
177
172
  var toObjectFrame = new Matrix();
178
173
  var dragPlaneNormal = new Vector3();
179
- var previousFollowState = false;
180
174
  var projectToRef = function (position, normal, origin, ref) {
181
175
  // Projects on the plane with its normal and origin
182
176
  position.subtractToRef(origin, TmpVectors.Vector3[0]);
@@ -187,13 +181,12 @@ var SlateGizmo = /** @class */ (function (_super) {
187
181
  };
188
182
  var dragStart = function (event) {
189
183
  if (_this.attachedSlate && _this.attachedMesh) {
190
- dimensionsStart.copyFrom(_this.attachedSlate.dimensions);
184
+ dimensionsStart.set(_this.attachedSlate.dimensions.x, _this.attachedSlate.dimensions.y, Epsilon);
191
185
  originStart.copyFrom(_this.attachedSlate.origin);
192
186
  dragOrigin.copyFrom(event.position);
193
187
  toObjectFrame.copyFrom(_this.attachedMesh.computeWorldMatrix(true));
194
188
  toObjectFrame.invert();
195
- previousFollowState = _this.attachedSlate.defaultBehavior.followBehaviorEnabled;
196
- _this.attachedSlate.defaultBehavior.followBehaviorEnabled = false;
189
+ _this.attachedSlate._followButton.isToggled = false;
197
190
  Vector3.TransformNormalToRef(Vector3.Forward(), _this.attachedMesh.getWorldMatrix(), dragPlaneNormal);
198
191
  dragPlaneNormal.normalize();
199
192
  if (_this._handleHovered) {
@@ -215,7 +208,6 @@ var SlateGizmo = /** @class */ (function (_super) {
215
208
  var dragEnd = function () {
216
209
  if (_this.attachedSlate && _this.attachedNode) {
217
210
  _this.attachedSlate._updatePivot();
218
- _this.attachedSlate.defaultBehavior.followBehaviorEnabled = previousFollowState;
219
211
  if (_this._handleDragged) {
220
212
  _this._handleDragged.drag = false;
221
213
  _this._handleDragged = null;
@@ -230,16 +222,14 @@ var SlateGizmo = /** @class */ (function (_super) {
230
222
  var dragOrigin = new Vector3();
231
223
  var directionOrigin = new Vector3();
232
224
  var worldPivot = new Vector3();
233
- var previousFollowState;
234
225
  var worldPlaneNormal = new Vector3();
235
226
  var dragStart = function (event) {
236
227
  if (_this.attachedSlate && _this.attachedMesh) {
237
228
  quaternionOrigin.copyFrom(_this.attachedMesh.rotationQuaternion);
238
229
  dragOrigin.copyFrom(event.position);
239
- previousFollowState = _this.attachedSlate.defaultBehavior.followBehaviorEnabled;
240
- _this.attachedSlate.defaultBehavior.followBehaviorEnabled = false;
241
230
  worldPivot.copyFrom(_this.attachedMesh.getAbsolutePivotPoint());
242
231
  directionOrigin.copyFrom(dragOrigin).subtractInPlace(worldPivot).normalize();
232
+ _this.attachedSlate._followButton.isToggled = false;
243
233
  Vector3.TransformNormalToRef(dragPlaneNormal, _this.attachedMesh.getWorldMatrix(), worldPlaneNormal);
244
234
  worldPlaneNormal.normalize();
245
235
  if (_this._handleHovered) {
@@ -261,7 +251,6 @@ var SlateGizmo = /** @class */ (function (_super) {
261
251
  var dragEnd = function () {
262
252
  if (_this.attachedSlate && _this.attachedNode) {
263
253
  _this.attachedSlate._updatePivot();
264
- _this.attachedSlate.defaultBehavior.followBehaviorEnabled = previousFollowState;
265
254
  if (_this._handleDragged) {
266
255
  _this._handleDragged.drag = false;
267
256
  _this._handleDragged = null;
@@ -301,6 +290,7 @@ var SlateGizmo = /** @class */ (function (_super) {
301
290
  this._boundingBoxGizmo.max = boundingMinMax.max;
302
291
  // Update handles of the gizmo
303
292
  this._updateHandlesPosition();
293
+ this._updateHandlesScaling();
304
294
  // Restore position/rotation values
305
295
  this.attachedMesh.rotationQuaternion.copyFrom(this._tmpQuaternion);
306
296
  this.attachedMesh.position.copyFrom(this._tmpVector);
@@ -329,6 +319,19 @@ var SlateGizmo = /** @class */ (function (_super) {
329
319
  this._sides[2].node.position.copyFromFloats(max.x, center.y, 0);
330
320
  this._sides[3].node.position.copyFromFloats(center.x, max.y, 0);
331
321
  };
322
+ SlateGizmo.prototype._updateHandlesScaling = function () {
323
+ if (this._attachedSlate && this._attachedSlate.mesh) {
324
+ var scaledWidth = this._attachedSlate.mesh.scaling.x * this._attachedSlate.dimensions.x;
325
+ var scaledHeight = this._attachedSlate.mesh.scaling.y * this._attachedSlate.dimensions.y;
326
+ var scale = Math.min(scaledWidth, scaledHeight) * this._handleSize;
327
+ for (var index = 0; index < this._corners.length; index++) {
328
+ this._corners[index].node.scaling.setAll(scale);
329
+ }
330
+ for (var index = 0; index < this._sides.length; index++) {
331
+ this._sides[index].node.scaling.setAll(scale);
332
+ }
333
+ }
334
+ };
332
335
  SlateGizmo.prototype._update = function () {
333
336
  _super.prototype._update.call(this);
334
337
  if (!this.gizmoLayer.utilityLayerScene.activeCamera) {
@@ -337,10 +340,13 @@ var SlateGizmo = /** @class */ (function (_super) {
337
340
  if (this._attachedSlate && this._attachedSlate.mesh) {
338
341
  if (this.fixedScreenSize) {
339
342
  this._attachedSlate.mesh.absolutePosition.subtractToRef(this.gizmoLayer.utilityLayerScene.activeCamera.position, this._tmpVector);
340
- var distanceFromCamera = (this.handleSize * this._tmpVector.length()) / this.fixedScreenSizeDistanceFactor;
343
+ var distanceFromCamera = (this._handleSize * this._tmpVector.length()) / this.fixedScreenSizeDistanceFactor;
341
344
  for (var i = 0; i < this._corners.length; i++) {
342
345
  this._corners[i].node.scaling.set(distanceFromCamera, distanceFromCamera, distanceFromCamera);
343
346
  }
347
+ for (var i = 0; i < this._sides.length; i++) {
348
+ this._sides[i].node.scaling.set(distanceFromCamera, distanceFromCamera, distanceFromCamera);
349
+ }
344
350
  }
345
351
  this._updateHandlesPosition();
346
352
  }
@@ -1 +1 @@
1
- {"version":3,"file":"slateGizmo.js","sourceRoot":"","sources":["../../../../sourceES6/gui/src/3D/gizmos/slateGizmo.ts"],"names":[],"mappings":"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","sourcesContent":["import { Gizmo } from \"@babylonjs/core/Gizmos/gizmo\";\r\nimport { Matrix, Quaternion, TmpVectors, Vector3 } from \"@babylonjs/core/Maths/math.vector\";\r\nimport { Scene } from \"@babylonjs/core/scene\";\r\nimport { AbstractMesh } from \"@babylonjs/core/Meshes/abstractMesh\";\r\nimport { TransformNode } from \"@babylonjs/core/Meshes/transformNode\";\r\nimport { Observer } from \"@babylonjs/core/Misc/observable\";\r\nimport { PivotTools } from \"@babylonjs/core/Misc/pivotTools\";\r\nimport { UtilityLayerRenderer } from \"@babylonjs/core/Rendering/utilityLayerRenderer\";\r\nimport { Nullable } from \"@babylonjs/core/types\";\r\n\r\nimport { HolographicSlate } from \"../controls/holographicSlate\";\r\nimport { CornerHandle, GizmoHandle, SideHandle } from \"./gizmoHandle\";\r\n\r\n// Mask contains the influence of the drag offset vectors on dimensions or origin of the slate\r\n// Mask vector is multiplied to the offset vector\r\ntype HandleMasks = {\r\n dimensions: Vector3;\r\n origin: Vector3;\r\n};\r\n\r\n/**\r\n * Gizmo to resize 2D slates\r\n */\r\nexport class SlateGizmo extends Gizmo {\r\n private _boundingDimensions = new Vector3(0, 0, 0);\r\n private _pickedPointObserver: Nullable<Observer<Nullable<AbstractMesh>>>;\r\n private _renderObserver: Nullable<Observer<Scene>> = null;\r\n\r\n private _tmpQuaternion = new Quaternion();\r\n private _tmpVector = new Vector3(0, 0, 0);\r\n\r\n // Ordered bl, br, tr, tl\r\n private _corners: CornerHandle[] = [];\r\n // Ordered left, bottom, right, top\r\n private _sides: SideHandle[] = [];\r\n private _handlesParent: TransformNode;\r\n private _handleHovered: Nullable<GizmoHandle>;\r\n private _handleDragged: Nullable<GizmoHandle>;\r\n\r\n private _boundingBoxGizmo = {\r\n min: new Vector3(),\r\n max: new Vector3(),\r\n };\r\n\r\n /**\r\n * Value we use to offset handles from mesh\r\n */\r\n private _margin = 0.35;\r\n private _attachedSlate: Nullable<HolographicSlate> = null;\r\n private _existingSlateScale = new Vector3();\r\n /**\r\n * If set, the handles will increase in size based on the distance away from the camera to have a consistent screen size (Default: true)\r\n */\r\n public fixedScreenSize = false;\r\n /**\r\n * The distance away from the object which the draggable meshes should appear world sized when fixedScreenSize is set to true (default: 10)\r\n */\r\n public fixedScreenSizeDistanceFactor = 10;\r\n\r\n /**\r\n * Size of the handles (meters in XR)\r\n */\r\n public handleSize = 0.01;\r\n\r\n /**\r\n * The slate attached to this gizmo\r\n */\r\n public set attachedSlate(control: Nullable<HolographicSlate>) {\r\n if (control) {\r\n this.attachedMesh = control.mesh;\r\n this.updateBoundingBox();\r\n\r\n this._pickedPointObserver = control._host.onPickingObservable.add((pickedMesh) => {\r\n if (this._handleHovered && (!pickedMesh || pickedMesh.parent !== this._handleHovered.node)) {\r\n this._handleHovered.hover = false;\r\n this._handleHovered = null;\r\n }\r\n\r\n if (pickedMesh && pickedMesh.parent && pickedMesh.parent.reservedDataStore && pickedMesh.parent.reservedDataStore.handle) {\r\n const handle = pickedMesh.parent.reservedDataStore.handle as GizmoHandle;\r\n if (handle.gizmo === this) {\r\n this._handleHovered = handle;\r\n this._handleHovered.hover = true;\r\n }\r\n }\r\n });\r\n } else if (this._attachedSlate) {\r\n this._attachedSlate._host.onPickingObservable.remove(this._pickedPointObserver);\r\n }\r\n this._attachedSlate = control;\r\n }\r\n\r\n public get attachedSlate(): Nullable<HolographicSlate> {\r\n return this._attachedSlate;\r\n }\r\n\r\n constructor(utilityLayer?: UtilityLayerRenderer) {\r\n super(utilityLayer);\r\n\r\n this._createNode();\r\n this.updateScale = false;\r\n\r\n this._renderObserver = this.gizmoLayer.originalScene.onBeforeRenderObservable.add(() => {\r\n // Only update the bounding box if scaling has changed\r\n if (this.attachedMesh && !this._existingSlateScale.equals(this.attachedMesh.scaling)) {\r\n this.updateBoundingBox();\r\n }\r\n });\r\n }\r\n\r\n private _createNode() {\r\n this._handlesParent = new TransformNode(\"handlesParent\", this.gizmoLayer.utilityLayerScene);\r\n this._handlesParent.rotationQuaternion = Quaternion.Identity();\r\n\r\n const masksCorners = [\r\n {\r\n dimensions: new Vector3(-1, -1, 0),\r\n origin: new Vector3(1, 0, 0),\r\n },\r\n {\r\n dimensions: new Vector3(1, -1, 0),\r\n origin: new Vector3(0, 0, 0),\r\n },\r\n {\r\n dimensions: new Vector3(1, 1, 0),\r\n origin: new Vector3(0, 1, 0),\r\n },\r\n {\r\n dimensions: new Vector3(-1, 1, 0),\r\n origin: new Vector3(1, 1, 0),\r\n },\r\n ];\r\n\r\n for (let i = 0; i < 4; i++) {\r\n const corner = new CornerHandle(this, this.gizmoLayer.utilityLayerScene);\r\n this._corners.push(corner);\r\n corner.node.rotation.z = (Math.PI / 2) * i;\r\n corner.node.scaling.setAll(this.handleSize);\r\n\r\n corner.node.parent = this._handlesParent;\r\n this._assignDragBehaviorCorners(\r\n corner,\r\n (originStart: Vector3, dimensionsStart: Vector3, offset: Vector3, masks: HandleMasks) => this._moveHandle(originStart, dimensionsStart, offset, masks, true),\r\n masksCorners[i]\r\n );\r\n }\r\n\r\n for (let i = 0; i < 4; i++) {\r\n const side = new SideHandle(this, this.gizmoLayer.utilityLayerScene);\r\n this._sides.push(side);\r\n side.node.rotation.z = (Math.PI / 2) * i;\r\n side.node.scaling.copyFromFloats(this.handleSize, this.handleSize, this.handleSize);\r\n side.node.parent = this._handlesParent;\r\n this._assignDragBehaviorSides(side, i % 2 === 0 ? new Vector3(0, 1, 0) : new Vector3(1, 0, 0));\r\n }\r\n\r\n this._handlesParent.parent = this._rootMesh;\r\n }\r\n\r\n private _keepAspectRatio(vector: Vector3, aspectRatio: number, invertDiagonal: boolean = false) {\r\n const axis = TmpVectors.Vector3[0];\r\n axis.copyFromFloats(aspectRatio, 1, 0).normalize();\r\n if (invertDiagonal) {\r\n axis.y *= -1;\r\n }\r\n const dot = Vector3.Dot(vector, axis);\r\n vector.copyFrom(axis).scaleInPlace(dot);\r\n }\r\n\r\n private _clampDimensions(vector: Vector3, dimensions: Vector3, mask: Vector3, keepAspectRatio: boolean = false) {\r\n const impact = TmpVectors.Vector3[0];\r\n impact.copyFrom(vector).multiplyInPlace(mask);\r\n\r\n const clampedDimensions = TmpVectors.Vector3[1];\r\n clampedDimensions.copyFromFloats(\r\n Math.max(this._attachedSlate!.minDimensions.x, impact.x + dimensions.x),\r\n Math.max(this._attachedSlate!.minDimensions.y, impact.y + dimensions.y),\r\n 0\r\n );\r\n\r\n if (keepAspectRatio) {\r\n // Extra logic to ensure the ratio is maintained when the vector has been clamped\r\n const ratio = dimensions.x / dimensions.y;\r\n clampedDimensions.x = Math.max(clampedDimensions.x, clampedDimensions.y * ratio);\r\n clampedDimensions.y = Math.max(clampedDimensions.y, clampedDimensions.x / ratio);\r\n }\r\n\r\n // Calculating the real impact of vector on clamped dimensions\r\n impact.copyFrom(clampedDimensions).subtractInPlace(dimensions);\r\n\r\n vector.x = Math.sign(vector.x) * Math.abs(impact.x);\r\n vector.y = Math.sign(vector.y) * Math.abs(impact.y);\r\n }\r\n\r\n private _moveHandle(originStart: Vector3, dimensionsStart: Vector3, offset: Vector3, masks: HandleMasks, isCorner: boolean) {\r\n if (!this._attachedSlate) {\r\n return;\r\n }\r\n\r\n if (isCorner) {\r\n const aspectRatio = dimensionsStart.x / dimensionsStart.y;\r\n this._keepAspectRatio(offset, aspectRatio, masks.dimensions.x * masks.dimensions.y < 0);\r\n }\r\n this._clampDimensions(offset, dimensionsStart, masks.dimensions, isCorner);\r\n\r\n const offsetOriginMasked = TmpVectors.Vector3[0];\r\n const offsetDimensionsMasked = TmpVectors.Vector3[1];\r\n offsetOriginMasked.copyFrom(offset).multiplyInPlace(masks.origin);\r\n offsetDimensionsMasked.copyFrom(offset).multiplyInPlace(masks.dimensions);\r\n\r\n this._attachedSlate.origin.copyFrom(originStart).addInPlace(offsetOriginMasked);\r\n this._attachedSlate.dimensions.copyFrom(dimensionsStart).addInPlace(offsetDimensionsMasked);\r\n this._attachedSlate.backplateDimensions.x = this._attachedSlate.dimensions.x;\r\n }\r\n\r\n private _assignDragBehaviorCorners(\r\n handle: GizmoHandle,\r\n moveFn: (originStart: Vector3, dimensionsStart: Vector3, offset: Vector3, masks: HandleMasks) => void,\r\n masks: HandleMasks\r\n ) {\r\n const dimensionsStart = new Vector3();\r\n const originStart = new Vector3();\r\n const dragOrigin = new Vector3();\r\n const toObjectFrame = new Matrix();\r\n const dragPlaneNormal = new Vector3();\r\n\r\n let previousFollowState = false;\r\n const projectToRef = (position: Vector3, normal: Vector3, origin: Vector3, ref: Vector3) => {\r\n // Projects on the plane with its normal and origin\r\n position.subtractToRef(origin, TmpVectors.Vector3[0]);\r\n const dot = Vector3.Dot(TmpVectors.Vector3[0], normal);\r\n TmpVectors.Vector3[1].copyFrom(normal).scaleInPlace(dot);\r\n TmpVectors.Vector3[0].subtractInPlace(TmpVectors.Vector3[1]);\r\n TmpVectors.Vector3[0].addToRef(origin, ref);\r\n };\r\n\r\n const dragStart = (event: { position: Vector3 }) => {\r\n if (this.attachedSlate && this.attachedMesh) {\r\n dimensionsStart.copyFrom(this.attachedSlate.dimensions);\r\n originStart.copyFrom(this.attachedSlate.origin);\r\n dragOrigin.copyFrom(event.position);\r\n toObjectFrame.copyFrom(this.attachedMesh.computeWorldMatrix(true));\r\n toObjectFrame.invert();\r\n previousFollowState = this.attachedSlate.defaultBehavior.followBehaviorEnabled;\r\n this.attachedSlate.defaultBehavior.followBehaviorEnabled = false;\r\n Vector3.TransformNormalToRef(Vector3.Forward(), this.attachedMesh.getWorldMatrix(), dragPlaneNormal);\r\n dragPlaneNormal.normalize();\r\n\r\n if (this._handleHovered) {\r\n this._handleDragged = this._handleHovered;\r\n this._handleDragged.drag = true;\r\n }\r\n }\r\n };\r\n\r\n const dragging = (event: { position: Vector3 }) => {\r\n if (this.attachedSlate && this.attachedMesh) {\r\n projectToRef(event.position, dragPlaneNormal, dragOrigin, this._tmpVector);\r\n this._tmpVector.subtractInPlace(dragOrigin);\r\n Vector3.TransformNormalToRef(this._tmpVector, toObjectFrame, this._tmpVector);\r\n\r\n moveFn(originStart, dimensionsStart, this._tmpVector, masks);\r\n this.attachedSlate._positionElements();\r\n this.updateBoundingBox();\r\n }\r\n };\r\n\r\n const dragEnd = () => {\r\n if (this.attachedSlate && this.attachedNode) {\r\n this.attachedSlate._updatePivot();\r\n this.attachedSlate.defaultBehavior.followBehaviorEnabled = previousFollowState;\r\n\r\n if (this._handleDragged) {\r\n this._handleDragged.drag = false;\r\n this._handleDragged = null;\r\n }\r\n }\r\n };\r\n\r\n handle.setDragBehavior(dragStart, dragging, dragEnd);\r\n }\r\n\r\n private _assignDragBehaviorSides(handle: GizmoHandle, dragPlaneNormal: Vector3) {\r\n let quaternionOrigin = new Quaternion();\r\n let dragOrigin = new Vector3();\r\n let directionOrigin = new Vector3();\r\n let worldPivot = new Vector3();\r\n let previousFollowState: boolean;\r\n let worldPlaneNormal = new Vector3();\r\n\r\n const dragStart = (event: { position: Vector3 }) => {\r\n if (this.attachedSlate && this.attachedMesh) {\r\n quaternionOrigin.copyFrom(this.attachedMesh.rotationQuaternion!);\r\n dragOrigin.copyFrom(event.position);\r\n previousFollowState = this.attachedSlate.defaultBehavior.followBehaviorEnabled;\r\n this.attachedSlate.defaultBehavior.followBehaviorEnabled = false;\r\n worldPivot.copyFrom(this.attachedMesh.getAbsolutePivotPoint());\r\n directionOrigin.copyFrom(dragOrigin).subtractInPlace(worldPivot).normalize();\r\n Vector3.TransformNormalToRef(dragPlaneNormal, this.attachedMesh.getWorldMatrix(), worldPlaneNormal);\r\n worldPlaneNormal.normalize();\r\n\r\n if (this._handleHovered) {\r\n this._handleDragged = this._handleHovered;\r\n this._handleDragged.drag = true;\r\n }\r\n }\r\n };\r\n\r\n const dragging = (event: { position: Vector3 }) => {\r\n if (this.attachedSlate && this.attachedMesh) {\r\n this._tmpVector.copyFrom(event.position);\r\n this._tmpVector.subtractInPlace(worldPivot);\r\n this._tmpVector.normalize();\r\n\r\n let angle = -Vector3.GetAngleBetweenVectorsOnPlane(this._tmpVector, directionOrigin, worldPlaneNormal);\r\n Quaternion.RotationAxisToRef(dragPlaneNormal, angle, this._tmpQuaternion);\r\n quaternionOrigin.multiplyToRef(this._tmpQuaternion, this.attachedMesh.rotationQuaternion!);\r\n }\r\n };\r\n\r\n const dragEnd = () => {\r\n if (this.attachedSlate && this.attachedNode) {\r\n this.attachedSlate._updatePivot();\r\n this.attachedSlate.defaultBehavior.followBehaviorEnabled = previousFollowState;\r\n\r\n if (this._handleDragged) {\r\n this._handleDragged.drag = false;\r\n this._handleDragged = null;\r\n }\r\n }\r\n };\r\n\r\n handle.setDragBehavior(dragStart, dragging, dragEnd);\r\n }\r\n\r\n protected _attachedNodeChanged(value: Nullable<AbstractMesh>) {\r\n if (value) {\r\n this.updateBoundingBox();\r\n }\r\n }\r\n\r\n /**\r\n * Updates the bounding box information for the gizmo\r\n */\r\n public updateBoundingBox() {\r\n if (this.attachedMesh) {\r\n PivotTools._RemoveAndStorePivotPoint(this.attachedMesh);\r\n\r\n // Store original parent\r\n const originalParent = this.attachedMesh.parent;\r\n this.attachedMesh.setParent(null);\r\n\r\n this._update();\r\n\r\n // Rotate based on axis\r\n if (!this.attachedMesh.rotationQuaternion) {\r\n this.attachedMesh.rotationQuaternion = Quaternion.RotationYawPitchRoll(this.attachedMesh.rotation.y, this.attachedMesh.rotation.x, this.attachedMesh.rotation.z);\r\n }\r\n\r\n // Store original position and reset mesh to origin before computing the bounding box\r\n this._tmpQuaternion.copyFrom(this.attachedMesh.rotationQuaternion);\r\n this._tmpVector.copyFrom(this.attachedMesh.position);\r\n this.attachedMesh.rotationQuaternion.set(0, 0, 0, 1);\r\n this.attachedMesh.position.set(0, 0, 0);\r\n\r\n // Update bounding dimensions/positions\r\n const boundingMinMax = this.attachedMesh.getHierarchyBoundingVectors();\r\n boundingMinMax.max.subtractToRef(boundingMinMax.min, this._boundingDimensions);\r\n this._boundingBoxGizmo.min = boundingMinMax.min;\r\n this._boundingBoxGizmo.max = boundingMinMax.max;\r\n\r\n // Update handles of the gizmo\r\n this._updateHandlesPosition();\r\n\r\n // Restore position/rotation values\r\n this.attachedMesh.rotationQuaternion.copyFrom(this._tmpQuaternion);\r\n this.attachedMesh.position.copyFrom(this._tmpVector);\r\n\r\n PivotTools._RestorePivotPoint(this.attachedMesh);\r\n\r\n // Restore original parent\r\n this.attachedMesh.setParent(originalParent);\r\n this.attachedMesh.computeWorldMatrix(true);\r\n\r\n this._existingSlateScale.copyFrom(this.attachedMesh.scaling);\r\n }\r\n }\r\n\r\n private _updateHandlesPosition() {\r\n const min = this._boundingBoxGizmo.min.clone();\r\n const max = this._boundingBoxGizmo.max.clone();\r\n\r\n const handleScaling = this._corners[0].node.scaling.length();\r\n min.x -= this._margin * handleScaling;\r\n min.y -= this._margin * handleScaling;\r\n max.x += this._margin * handleScaling;\r\n max.y += this._margin * handleScaling;\r\n\r\n const center = min.add(max).scaleInPlace(0.5);\r\n\r\n this._corners[0].node.position.copyFromFloats(min.x, min.y, 0);\r\n this._corners[1].node.position.copyFromFloats(max.x, min.y, 0);\r\n this._corners[2].node.position.copyFromFloats(max.x, max.y, 0);\r\n this._corners[3].node.position.copyFromFloats(min.x, max.y, 0);\r\n\r\n this._sides[0].node.position.copyFromFloats(min.x, center.y, 0);\r\n this._sides[1].node.position.copyFromFloats(center.x, min.y, 0);\r\n this._sides[2].node.position.copyFromFloats(max.x, center.y, 0);\r\n this._sides[3].node.position.copyFromFloats(center.x, max.y, 0);\r\n }\r\n\r\n protected _update() {\r\n super._update();\r\n\r\n if (!this.gizmoLayer.utilityLayerScene.activeCamera) {\r\n return;\r\n }\r\n\r\n if (this._attachedSlate && this._attachedSlate.mesh) {\r\n if (this.fixedScreenSize) {\r\n this._attachedSlate.mesh.absolutePosition.subtractToRef(this.gizmoLayer.utilityLayerScene.activeCamera.position, this._tmpVector);\r\n var distanceFromCamera = (this.handleSize * this._tmpVector.length()) / this.fixedScreenSizeDistanceFactor;\r\n for (let i = 0; i < this._corners.length; i++) {\r\n this._corners[i].node.scaling.set(distanceFromCamera, distanceFromCamera, distanceFromCamera);\r\n }\r\n }\r\n this._updateHandlesPosition();\r\n }\r\n }\r\n\r\n public dispose() {\r\n this.gizmoLayer.originalScene.onBeforeRenderObservable.remove(this._renderObserver);\r\n\r\n // Will dispose rootMesh and all descendants\r\n super.dispose();\r\n\r\n for (const corner of this._corners) {\r\n corner.dispose();\r\n }\r\n\r\n for (const side of this._sides) {\r\n side.dispose();\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"slateGizmo.js","sourceRoot":"","sources":["../../../../sourceES6/gui/src/3D/gizmos/slateGizmo.ts"],"names":[],"mappings":"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","sourcesContent":["import { Gizmo } from \"@babylonjs/core/Gizmos/gizmo\";\r\nimport { Epsilon } from \"@babylonjs/core/Maths/math.constants\";\r\nimport { Matrix, Quaternion, TmpVectors, Vector3 } from \"@babylonjs/core/Maths/math.vector\";\r\nimport { Scene } from \"@babylonjs/core/scene\";\r\nimport { AbstractMesh } from \"@babylonjs/core/Meshes/abstractMesh\";\r\nimport { TransformNode } from \"@babylonjs/core/Meshes/transformNode\";\r\nimport { Observer } from \"@babylonjs/core/Misc/observable\";\r\nimport { PivotTools } from \"@babylonjs/core/Misc/pivotTools\";\r\nimport { UtilityLayerRenderer } from \"@babylonjs/core/Rendering/utilityLayerRenderer\";\r\nimport { Nullable } from \"@babylonjs/core/types\";\r\n\r\nimport { HolographicSlate } from \"../controls/holographicSlate\";\r\nimport { CornerHandle, GizmoHandle, SideHandle } from \"./gizmoHandle\";\r\n\r\n// Mask contains the influence of the drag offset vectors on dimensions or origin of the slate\r\n// Mask vector is multiplied to the offset vector\r\ntype HandleMasks = {\r\n dimensions: Vector3;\r\n origin: Vector3;\r\n};\r\n\r\n/**\r\n * Gizmo to resize 2D slates\r\n */\r\nexport class SlateGizmo extends Gizmo {\r\n private _boundingDimensions = new Vector3(0, 0, 0);\r\n private _pickedPointObserver: Nullable<Observer<Nullable<AbstractMesh>>>;\r\n private _renderObserver: Nullable<Observer<Scene>> = null;\r\n\r\n private _tmpQuaternion = new Quaternion();\r\n private _tmpVector = new Vector3(0, 0, 0);\r\n\r\n // Ordered bl, br, tr, tl\r\n private _corners: CornerHandle[] = [];\r\n // Ordered left, bottom, right, top\r\n private _sides: SideHandle[] = [];\r\n private _handlesParent: TransformNode;\r\n private _handleHovered: Nullable<GizmoHandle>;\r\n private _handleDragged: Nullable<GizmoHandle>;\r\n\r\n private _boundingBoxGizmo = {\r\n min: new Vector3(),\r\n max: new Vector3(),\r\n };\r\n\r\n /**\r\n * Value we use to offset handles from mesh\r\n */\r\n private _margin = 0.35;\r\n private _handleSize = 0.075;\r\n private _attachedSlate: Nullable<HolographicSlate> = null;\r\n private _existingSlateScale = new Vector3();\r\n /**\r\n * If set, the handles will increase in size based on the distance away from the camera to have a consistent screen size (Default: true)\r\n */\r\n public fixedScreenSize = false;\r\n /**\r\n * The distance away from the object which the draggable meshes should appear world sized when fixedScreenSize is set to true (default: 10)\r\n */\r\n public fixedScreenSizeDistanceFactor = 10;\r\n\r\n /**\r\n * The slate attached to this gizmo\r\n */\r\n public set attachedSlate(control: Nullable<HolographicSlate>) {\r\n if (control) {\r\n this.attachedMesh = control.mesh;\r\n this.updateBoundingBox();\r\n\r\n this._pickedPointObserver = control._host.onPickingObservable.add((pickedMesh) => {\r\n if (this._handleHovered && (!pickedMesh || pickedMesh.parent !== this._handleHovered.node)) {\r\n this._handleHovered.hover = false;\r\n this._handleHovered = null;\r\n }\r\n\r\n if (pickedMesh && pickedMesh.parent && pickedMesh.parent.reservedDataStore && pickedMesh.parent.reservedDataStore.handle) {\r\n const handle = pickedMesh.parent.reservedDataStore.handle as GizmoHandle;\r\n if (handle.gizmo === this) {\r\n this._handleHovered = handle;\r\n this._handleHovered.hover = true;\r\n }\r\n }\r\n });\r\n } else if (this._attachedSlate) {\r\n this._attachedSlate._host.onPickingObservable.remove(this._pickedPointObserver);\r\n }\r\n this._attachedSlate = control;\r\n }\r\n\r\n public get attachedSlate(): Nullable<HolographicSlate> {\r\n return this._attachedSlate;\r\n }\r\n\r\n constructor(utilityLayer?: UtilityLayerRenderer) {\r\n super(utilityLayer);\r\n\r\n this._createNode();\r\n this.updateScale = false;\r\n\r\n this._renderObserver = this.gizmoLayer.originalScene.onBeforeRenderObservable.add(() => {\r\n // Only update the bounding box if scaling has changed\r\n if (this.attachedMesh && !this._existingSlateScale.equals(this.attachedMesh.scaling)) {\r\n this.updateBoundingBox();\r\n }\r\n });\r\n }\r\n\r\n private _createNode() {\r\n this._handlesParent = new TransformNode(\"handlesParent\", this.gizmoLayer.utilityLayerScene);\r\n this._handlesParent.rotationQuaternion = Quaternion.Identity();\r\n\r\n const masksCorners = [\r\n {\r\n dimensions: new Vector3(-1, -1, 0),\r\n origin: new Vector3(1, 0, 0),\r\n },\r\n {\r\n dimensions: new Vector3(1, -1, 0),\r\n origin: new Vector3(0, 0, 0),\r\n },\r\n {\r\n dimensions: new Vector3(1, 1, 0),\r\n origin: new Vector3(0, 1, 0),\r\n },\r\n {\r\n dimensions: new Vector3(-1, 1, 0),\r\n origin: new Vector3(1, 1, 0),\r\n },\r\n ];\r\n\r\n for (let i = 0; i < 4; i++) {\r\n const corner = new CornerHandle(this, this.gizmoLayer.utilityLayerScene);\r\n this._corners.push(corner);\r\n corner.node.rotation.z = (Math.PI / 2) * i;\r\n\r\n corner.node.parent = this._handlesParent;\r\n this._assignDragBehaviorCorners(\r\n corner,\r\n (originStart: Vector3, dimensionsStart: Vector3, offset: Vector3, masks: HandleMasks) => this._moveHandle(originStart, dimensionsStart, offset, masks, true),\r\n masksCorners[i]\r\n );\r\n }\r\n\r\n for (let i = 0; i < 4; i++) {\r\n const side = new SideHandle(this, this.gizmoLayer.utilityLayerScene);\r\n this._sides.push(side);\r\n side.node.rotation.z = (Math.PI / 2) * i;\r\n side.node.parent = this._handlesParent;\r\n this._assignDragBehaviorSides(side, i % 2 === 0 ? new Vector3(0, 1, 0) : new Vector3(1, 0, 0));\r\n }\r\n\r\n this._handlesParent.parent = this._rootMesh;\r\n }\r\n\r\n private _keepAspectRatio(vector: Vector3, aspectRatio: number, invertDiagonal: boolean = false) {\r\n const axis = TmpVectors.Vector3[0];\r\n axis.copyFromFloats(aspectRatio, 1, 0).normalize();\r\n if (invertDiagonal) {\r\n axis.y *= -1;\r\n }\r\n const dot = Vector3.Dot(vector, axis);\r\n vector.copyFrom(axis).scaleInPlace(dot);\r\n }\r\n\r\n private _clampDimensions(vector: Vector3, dimensions: Vector3, mask: Vector3, keepAspectRatio: boolean = false) {\r\n const impact = TmpVectors.Vector3[0];\r\n impact.copyFrom(vector).multiplyInPlace(mask);\r\n\r\n const clampedDimensions = TmpVectors.Vector3[1];\r\n clampedDimensions.copyFromFloats(\r\n Math.max(this._attachedSlate!.minDimensions.x, impact.x + dimensions.x),\r\n Math.max(this._attachedSlate!.minDimensions.y, impact.y + dimensions.y),\r\n 0\r\n );\r\n\r\n if (keepAspectRatio) {\r\n // Extra logic to ensure the ratio is maintained when the vector has been clamped\r\n const ratio = dimensions.x / dimensions.y;\r\n clampedDimensions.x = Math.max(clampedDimensions.x, clampedDimensions.y * ratio);\r\n clampedDimensions.y = Math.max(clampedDimensions.y, clampedDimensions.x / ratio);\r\n }\r\n\r\n // Calculating the real impact of vector on clamped dimensions\r\n impact.copyFrom(clampedDimensions).subtractInPlace(dimensions);\r\n\r\n vector.x = Math.sign(vector.x) * Math.abs(impact.x);\r\n vector.y = Math.sign(vector.y) * Math.abs(impact.y);\r\n }\r\n\r\n private _moveHandle(originStart: Vector3, dimensionsStart: Vector3, offset: Vector3, masks: HandleMasks, isCorner: boolean) {\r\n if (!this._attachedSlate) {\r\n return;\r\n }\r\n\r\n if (isCorner) {\r\n const aspectRatio = dimensionsStart.x / dimensionsStart.y;\r\n this._keepAspectRatio(offset, aspectRatio, masks.dimensions.x * masks.dimensions.y < 0);\r\n }\r\n this._clampDimensions(offset, dimensionsStart, masks.dimensions, isCorner);\r\n\r\n const offsetOriginMasked = TmpVectors.Vector3[0];\r\n const offsetDimensionsMasked = TmpVectors.Vector3[1];\r\n offsetOriginMasked.copyFrom(offset).multiplyInPlace(masks.origin);\r\n offsetDimensionsMasked.copyFrom(offset).multiplyInPlace(masks.dimensions);\r\n\r\n this._attachedSlate.origin.copyFrom(originStart).addInPlace(offsetOriginMasked);\r\n this._attachedSlate.dimensions.set(dimensionsStart.x + offsetDimensionsMasked.x, dimensionsStart.y + offsetDimensionsMasked.y);\r\n }\r\n\r\n private _assignDragBehaviorCorners(\r\n handle: GizmoHandle,\r\n moveFn: (originStart: Vector3, dimensionsStart: Vector3, offset: Vector3, masks: HandleMasks) => void,\r\n masks: HandleMasks\r\n ) {\r\n const dimensionsStart = new Vector3();\r\n const originStart = new Vector3();\r\n const dragOrigin = new Vector3();\r\n const toObjectFrame = new Matrix();\r\n const dragPlaneNormal = new Vector3();\r\n\r\n const projectToRef = (position: Vector3, normal: Vector3, origin: Vector3, ref: Vector3) => {\r\n // Projects on the plane with its normal and origin\r\n position.subtractToRef(origin, TmpVectors.Vector3[0]);\r\n const dot = Vector3.Dot(TmpVectors.Vector3[0], normal);\r\n TmpVectors.Vector3[1].copyFrom(normal).scaleInPlace(dot);\r\n TmpVectors.Vector3[0].subtractInPlace(TmpVectors.Vector3[1]);\r\n TmpVectors.Vector3[0].addToRef(origin, ref);\r\n };\r\n\r\n const dragStart = (event: { position: Vector3 }) => {\r\n if (this.attachedSlate && this.attachedMesh) {\r\n dimensionsStart.set(this.attachedSlate.dimensions.x, this.attachedSlate.dimensions.y, Epsilon);\r\n originStart.copyFrom(this.attachedSlate.origin);\r\n dragOrigin.copyFrom(event.position);\r\n toObjectFrame.copyFrom(this.attachedMesh.computeWorldMatrix(true));\r\n toObjectFrame.invert();\r\n this.attachedSlate._followButton.isToggled = false;\r\n Vector3.TransformNormalToRef(Vector3.Forward(), this.attachedMesh.getWorldMatrix(), dragPlaneNormal);\r\n dragPlaneNormal.normalize();\r\n\r\n if (this._handleHovered) {\r\n this._handleDragged = this._handleHovered;\r\n this._handleDragged.drag = true;\r\n }\r\n }\r\n };\r\n\r\n const dragging = (event: { position: Vector3 }) => {\r\n if (this.attachedSlate && this.attachedMesh) {\r\n projectToRef(event.position, dragPlaneNormal, dragOrigin, this._tmpVector);\r\n this._tmpVector.subtractInPlace(dragOrigin);\r\n Vector3.TransformNormalToRef(this._tmpVector, toObjectFrame, this._tmpVector);\r\n\r\n moveFn(originStart, dimensionsStart, this._tmpVector, masks);\r\n this.attachedSlate._positionElements();\r\n this.updateBoundingBox();\r\n }\r\n };\r\n\r\n const dragEnd = () => {\r\n if (this.attachedSlate && this.attachedNode) {\r\n this.attachedSlate._updatePivot();\r\n\r\n if (this._handleDragged) {\r\n this._handleDragged.drag = false;\r\n this._handleDragged = null;\r\n }\r\n }\r\n };\r\n\r\n handle.setDragBehavior(dragStart, dragging, dragEnd);\r\n }\r\n\r\n private _assignDragBehaviorSides(handle: GizmoHandle, dragPlaneNormal: Vector3) {\r\n let quaternionOrigin = new Quaternion();\r\n let dragOrigin = new Vector3();\r\n let directionOrigin = new Vector3();\r\n let worldPivot = new Vector3();\r\n let worldPlaneNormal = new Vector3();\r\n\r\n const dragStart = (event: { position: Vector3 }) => {\r\n if (this.attachedSlate && this.attachedMesh) {\r\n quaternionOrigin.copyFrom(this.attachedMesh.rotationQuaternion!);\r\n dragOrigin.copyFrom(event.position);\r\n worldPivot.copyFrom(this.attachedMesh.getAbsolutePivotPoint());\r\n directionOrigin.copyFrom(dragOrigin).subtractInPlace(worldPivot).normalize();\r\n this.attachedSlate._followButton.isToggled = false;\r\n Vector3.TransformNormalToRef(dragPlaneNormal, this.attachedMesh.getWorldMatrix(), worldPlaneNormal);\r\n worldPlaneNormal.normalize();\r\n\r\n if (this._handleHovered) {\r\n this._handleDragged = this._handleHovered;\r\n this._handleDragged.drag = true;\r\n }\r\n }\r\n };\r\n\r\n const dragging = (event: { position: Vector3 }) => {\r\n if (this.attachedSlate && this.attachedMesh) {\r\n this._tmpVector.copyFrom(event.position);\r\n this._tmpVector.subtractInPlace(worldPivot);\r\n this._tmpVector.normalize();\r\n\r\n let angle = -Vector3.GetAngleBetweenVectorsOnPlane(this._tmpVector, directionOrigin, worldPlaneNormal);\r\n Quaternion.RotationAxisToRef(dragPlaneNormal, angle, this._tmpQuaternion);\r\n quaternionOrigin.multiplyToRef(this._tmpQuaternion, this.attachedMesh.rotationQuaternion!);\r\n }\r\n };\r\n\r\n const dragEnd = () => {\r\n if (this.attachedSlate && this.attachedNode) {\r\n this.attachedSlate._updatePivot();\r\n\r\n if (this._handleDragged) {\r\n this._handleDragged.drag = false;\r\n this._handleDragged = null;\r\n }\r\n }\r\n };\r\n\r\n handle.setDragBehavior(dragStart, dragging, dragEnd);\r\n }\r\n\r\n protected _attachedNodeChanged(value: Nullable<AbstractMesh>) {\r\n if (value) {\r\n this.updateBoundingBox();\r\n }\r\n }\r\n\r\n /**\r\n * Updates the bounding box information for the gizmo\r\n */\r\n public updateBoundingBox() {\r\n if (this.attachedMesh) {\r\n PivotTools._RemoveAndStorePivotPoint(this.attachedMesh);\r\n\r\n // Store original parent\r\n const originalParent = this.attachedMesh.parent;\r\n this.attachedMesh.setParent(null);\r\n\r\n this._update();\r\n\r\n // Rotate based on axis\r\n if (!this.attachedMesh.rotationQuaternion) {\r\n this.attachedMesh.rotationQuaternion = Quaternion.RotationYawPitchRoll(this.attachedMesh.rotation.y, this.attachedMesh.rotation.x, this.attachedMesh.rotation.z);\r\n }\r\n\r\n // Store original position and reset mesh to origin before computing the bounding box\r\n this._tmpQuaternion.copyFrom(this.attachedMesh.rotationQuaternion);\r\n this._tmpVector.copyFrom(this.attachedMesh.position);\r\n this.attachedMesh.rotationQuaternion.set(0, 0, 0, 1);\r\n this.attachedMesh.position.set(0, 0, 0);\r\n\r\n // Update bounding dimensions/positions\r\n const boundingMinMax = this.attachedMesh.getHierarchyBoundingVectors();\r\n boundingMinMax.max.subtractToRef(boundingMinMax.min, this._boundingDimensions);\r\n this._boundingBoxGizmo.min = boundingMinMax.min;\r\n this._boundingBoxGizmo.max = boundingMinMax.max;\r\n\r\n // Update handles of the gizmo\r\n this._updateHandlesPosition();\r\n this._updateHandlesScaling();\r\n\r\n // Restore position/rotation values\r\n this.attachedMesh.rotationQuaternion.copyFrom(this._tmpQuaternion);\r\n this.attachedMesh.position.copyFrom(this._tmpVector);\r\n\r\n PivotTools._RestorePivotPoint(this.attachedMesh);\r\n\r\n // Restore original parent\r\n this.attachedMesh.setParent(originalParent);\r\n this.attachedMesh.computeWorldMatrix(true);\r\n\r\n this._existingSlateScale.copyFrom(this.attachedMesh.scaling);\r\n }\r\n }\r\n\r\n private _updateHandlesPosition() {\r\n const min = this._boundingBoxGizmo.min.clone();\r\n const max = this._boundingBoxGizmo.max.clone();\r\n\r\n const handleScaling = this._corners[0].node.scaling.length();\r\n min.x -= this._margin * handleScaling;\r\n min.y -= this._margin * handleScaling;\r\n max.x += this._margin * handleScaling;\r\n max.y += this._margin * handleScaling;\r\n\r\n const center = min.add(max).scaleInPlace(0.5);\r\n\r\n this._corners[0].node.position.copyFromFloats(min.x, min.y, 0);\r\n this._corners[1].node.position.copyFromFloats(max.x, min.y, 0);\r\n this._corners[2].node.position.copyFromFloats(max.x, max.y, 0);\r\n this._corners[3].node.position.copyFromFloats(min.x, max.y, 0);\r\n\r\n this._sides[0].node.position.copyFromFloats(min.x, center.y, 0);\r\n this._sides[1].node.position.copyFromFloats(center.x, min.y, 0);\r\n this._sides[2].node.position.copyFromFloats(max.x, center.y, 0);\r\n this._sides[3].node.position.copyFromFloats(center.x, max.y, 0);\r\n }\r\n\r\n private _updateHandlesScaling() {\r\n if (this._attachedSlate && this._attachedSlate.mesh) {\r\n const scaledWidth = this._attachedSlate.mesh.scaling.x * this._attachedSlate.dimensions.x;\r\n const scaledHeight = this._attachedSlate.mesh.scaling.y * this._attachedSlate.dimensions.y;\r\n const scale = Math.min(scaledWidth, scaledHeight) * this._handleSize;\r\n for (let index = 0; index < this._corners.length; index++) {\r\n this._corners[index].node.scaling.setAll(scale);\r\n }\r\n for (let index = 0; index < this._sides.length; index++) {\r\n this._sides[index].node.scaling.setAll(scale);\r\n }\r\n }\r\n }\r\n\r\n protected _update() {\r\n super._update();\r\n\r\n if (!this.gizmoLayer.utilityLayerScene.activeCamera) {\r\n return;\r\n }\r\n\r\n if (this._attachedSlate && this._attachedSlate.mesh) {\r\n if (this.fixedScreenSize) {\r\n this._attachedSlate.mesh.absolutePosition.subtractToRef(this.gizmoLayer.utilityLayerScene.activeCamera.position, this._tmpVector);\r\n var distanceFromCamera = (this._handleSize * this._tmpVector.length()) / this.fixedScreenSizeDistanceFactor;\r\n for (let i = 0; i < this._corners.length; i++) {\r\n this._corners[i].node.scaling.set(distanceFromCamera, distanceFromCamera, distanceFromCamera);\r\n }\r\n for (let i = 0; i < this._sides.length; i++) {\r\n this._sides[i].node.scaling.set(distanceFromCamera, distanceFromCamera, distanceFromCamera);\r\n }\r\n }\r\n this._updateHandlesPosition();\r\n }\r\n }\r\n\r\n public dispose() {\r\n this.gizmoLayer.originalScene.onBeforeRenderObservable.remove(this._renderObserver);\r\n\r\n // Will dispose rootMesh and all descendants\r\n super.dispose();\r\n\r\n for (const corner of this._corners) {\r\n corner.dispose();\r\n }\r\n\r\n for (const side of this._sides) {\r\n side.dispose();\r\n }\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"gui3DManager.js","sourceRoot":"","sources":["../../../sourceES6/gui/src/3D/gui3DManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from \"@babylonjs/core/types\";\r\nimport { Observable, Observer } from \"@babylonjs/core/Misc/observable\";\r\nimport { Vector3 } from \"@babylonjs/core/Maths/math.vector\";\r\nimport { PointerInfo, PointerEventTypes } from \"@babylonjs/core/Events/pointerEvents\";\r\nimport { Material } from \"@babylonjs/core/Materials/material\";\r\nimport { HemisphericLight } from \"@babylonjs/core/Lights/hemisphericLight\";\r\nimport { AbstractMesh } from \"@babylonjs/core/Meshes/abstractMesh\";\r\nimport { UtilityLayerRenderer } from \"@babylonjs/core/Rendering/utilityLayerRenderer\";\r\nimport { EngineStore } from \"@babylonjs/core/Engines/engineStore\";\r\nimport { IDisposable, Scene } from \"@babylonjs/core/scene\";\r\n\r\nimport { Container3D } from \"./controls/container3D\";\r\nimport { Control3D } from \"./controls/control3D\";\r\n\r\n/**\r\n * Class used to manage 3D user interface\r\n * @see https://doc.babylonjs.com/how_to/gui3d\r\n */\r\nexport class GUI3DManager implements IDisposable {\r\n private _scene: Scene;\r\n private _sceneDisposeObserver: Nullable<Observer<Scene>>;\r\n private _utilityLayer: Nullable<UtilityLayerRenderer>;\r\n private _rootContainer: Container3D;\r\n private _pointerObserver: Nullable<Observer<PointerInfo>>;\r\n private _pointerOutObserver: Nullable<Observer<number>>;\r\n private _customControlScaling = 1.0;\r\n /** @hidden */\r\n public _lastPickedControl: Control3D;\r\n /** @hidden */\r\n public _lastControlOver: { [pointerId: number]: Control3D } = {};\r\n /** @hidden */\r\n public _lastControlDown: { [pointerId: number]: Control3D } = {};\r\n\r\n protected static MRTK_REALISTIC_SCALING: number = 0.032;\r\n\r\n /**\r\n * Observable raised when the point picked by the pointer events changed\r\n */\r\n public onPickedPointChangedObservable = new Observable<Nullable<Vector3>>();\r\n\r\n /**\r\n * Observable raised when a picking happens\r\n */\r\n public onPickingObservable = new Observable<Nullable<AbstractMesh>>();\r\n\r\n // Shared resources\r\n /** @hidden */\r\n public _sharedMaterials: { [key: string]: Material } = {};\r\n\r\n /** @hidden */\r\n public _touchSharedMaterials: { [key: string]: Material } = {};\r\n\r\n /** Gets the hosting scene */\r\n public get scene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n /** Gets associated utility layer */\r\n public get utilityLayer(): Nullable<UtilityLayerRenderer> {\r\n return this._utilityLayer;\r\n }\r\n\r\n /** Gets the scaling for all UI elements owned by this manager */\r\n public get controlScaling() {\r\n return this._customControlScaling;\r\n }\r\n\r\n /** Sets the scaling adjustment for all UI elements owned by this manager */\r\n public set controlScaling(newScale: number) {\r\n if (this._customControlScaling !== newScale && newScale > 0) {\r\n let scaleRatio = newScale / this._customControlScaling;\r\n this._customControlScaling = newScale;\r\n\r\n this._rootContainer.children.forEach((control: Control3D) => {\r\n control.scaling.scaleInPlace(scaleRatio);\r\n\r\n if (newScale !== 1) {\r\n control._isScaledByManager = true;\r\n }\r\n });\r\n }\r\n }\r\n\r\n /** Gets if controls attached to this manager are realistically sized, based on the fact that 1 unit length is 1 meter */\r\n public get useRealisticScaling() {\r\n return this.controlScaling === GUI3DManager.MRTK_REALISTIC_SCALING;\r\n }\r\n\r\n /** Sets if controls attached to this manager are realistically sized, based on the fact that 1 unit length is 1 meter */\r\n public set useRealisticScaling(newValue: boolean) {\r\n this.controlScaling = newValue ? GUI3DManager.MRTK_REALISTIC_SCALING : 1;\r\n }\r\n\r\n /**\r\n * Creates a new GUI3DManager\r\n * @param scene\r\n */\r\n public constructor(scene?: Scene) {\r\n this._scene = scene || EngineStore.LastCreatedScene!;\r\n this._sceneDisposeObserver = this._scene.onDisposeObservable.add(() => {\r\n this._sceneDisposeObserver = null;\r\n this._utilityLayer = null;\r\n this.dispose();\r\n });\r\n\r\n this._utilityLayer = UtilityLayerRenderer._CreateDefaultUtilityLayerFromScene(this._scene);\r\n this._utilityLayer.onlyCheckPointerDownEvents = false;\r\n this._utilityLayer.pickUtilitySceneFirst = false;\r\n this._utilityLayer.mainSceneTrackerPredicate = (mesh: Nullable<AbstractMesh>) => {\r\n return mesh && mesh.reservedDataStore?.GUI3D?.control?._node;\r\n };\r\n\r\n // Root\r\n this._rootContainer = new Container3D(\"RootContainer\");\r\n this._rootContainer._host = this;\r\n let utilityLayerScene = this._utilityLayer.utilityLayerScene;\r\n\r\n // Events\r\n this._pointerOutObserver = this._utilityLayer.onPointerOutObservable.add((pointerId) => {\r\n this._handlePointerOut(pointerId, true);\r\n });\r\n\r\n this._pointerObserver = utilityLayerScene.onPointerObservable.add((pi, state) => {\r\n this._doPicking(pi);\r\n });\r\n\r\n // Scene\r\n this._utilityLayer.utilityLayerScene.autoClear = false;\r\n this._utilityLayer.utilityLayerScene.autoClearDepthAndStencil = false;\r\n new HemisphericLight(\"hemi\", Vector3.Up(), this._utilityLayer.utilityLayerScene);\r\n }\r\n\r\n private _handlePointerOut(pointerId: number, isPointerUp: boolean) {\r\n var previousControlOver = this._lastControlOver[pointerId];\r\n if (previousControlOver) {\r\n previousControlOver._onPointerOut(previousControlOver);\r\n delete this._lastControlOver[pointerId];\r\n }\r\n\r\n if (isPointerUp) {\r\n if (this._lastControlDown[pointerId]) {\r\n this._lastControlDown[pointerId].forcePointerUp();\r\n delete this._lastControlDown[pointerId];\r\n }\r\n }\r\n\r\n this.onPickedPointChangedObservable.notifyObservers(null);\r\n }\r\n\r\n private _doPicking(pi: PointerInfo): boolean {\r\n if (!this._utilityLayer || !this._utilityLayer.shouldRender || !this._utilityLayer.utilityLayerScene.activeCamera) {\r\n return false;\r\n }\r\n\r\n let pointerEvent = <PointerEvent>pi.event;\r\n\r\n let pointerId = pointerEvent.pointerId || 0;\r\n let buttonIndex = pointerEvent.button;\r\n\r\n let pickingInfo = pi.pickInfo;\r\n if (pickingInfo) {\r\n this.onPickingObservable.notifyObservers(pickingInfo.pickedMesh);\r\n }\r\n\r\n if (!pickingInfo || !pickingInfo.hit) {\r\n this._handlePointerOut(pointerId, pi.type === PointerEventTypes.POINTERUP);\r\n return false;\r\n }\r\n\r\n if (pickingInfo.pickedPoint) {\r\n this.onPickedPointChangedObservable.notifyObservers(pickingInfo.pickedPoint);\r\n }\r\n\r\n const control = <Control3D>pickingInfo.pickedMesh!.reservedDataStore?.GUI3D?.control;\r\n if (!!control && !control._processObservables(pi.type, pickingInfo.pickedPoint!, pickingInfo.originMesh?.position || null, pointerId, buttonIndex)) {\r\n if (pi.type === PointerEventTypes.POINTERMOVE) {\r\n if (this._lastControlOver[pointerId]) {\r\n this._lastControlOver[pointerId]._onPointerOut(this._lastControlOver[pointerId]);\r\n }\r\n\r\n delete this._lastControlOver[pointerId];\r\n }\r\n }\r\n\r\n if (pi.type === PointerEventTypes.POINTERUP) {\r\n if (this._lastControlDown[pointerEvent.pointerId]) {\r\n this._lastControlDown[pointerEvent.pointerId].forcePointerUp();\r\n delete this._lastControlDown[pointerEvent.pointerId];\r\n }\r\n\r\n if (pointerEvent.pointerType === \"touch\") {\r\n this._handlePointerOut(pointerId, false);\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Gets the root container\r\n */\r\n public get rootContainer(): Container3D {\r\n return this._rootContainer;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the given control is in the root child list\r\n * @param control defines the control to check\r\n * @returns true if the control is in the root child list\r\n */\r\n public containsControl(control: Control3D): boolean {\r\n return this._rootContainer.containsControl(control);\r\n }\r\n\r\n /**\r\n * Adds a control to the root child list\r\n * @param control defines the control to add\r\n * @returns the current manager\r\n */\r\n public addControl(control: Control3D): GUI3DManager {\r\n this._rootContainer.addControl(control);\r\n if (this._customControlScaling !== 1) {\r\n control.scaling.scaleInPlace(this._customControlScaling);\r\n control._isScaledByManager = true;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes a control from the root child list\r\n * @param control defines the control to remove\r\n * @returns the current container\r\n */\r\n public removeControl(control: Control3D): GUI3DManager {\r\n this._rootContainer.removeControl(control);\r\n if (control._isScaledByManager) {\r\n control.scaling.scaleInPlace(1 / this._customControlScaling);\r\n control._isScaledByManager = false;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Releases all associated resources\r\n */\r\n public dispose() {\r\n this._rootContainer.dispose();\r\n\r\n for (var materialName in this._sharedMaterials) {\r\n if (!this._sharedMaterials.hasOwnProperty(materialName)) {\r\n continue;\r\n }\r\n\r\n this._sharedMaterials[materialName].dispose();\r\n }\r\n\r\n this._sharedMaterials = {};\r\n\r\n for (var materialName in this._touchSharedMaterials) {\r\n if (!this._touchSharedMaterials.hasOwnProperty(materialName)) {\r\n continue;\r\n }\r\n\r\n this._touchSharedMaterials[materialName].dispose();\r\n }\r\n\r\n this._touchSharedMaterials = {};\r\n\r\n if (this._pointerOutObserver && this._utilityLayer) {\r\n this._utilityLayer.onPointerOutObservable.remove(this._pointerOutObserver);\r\n this._pointerOutObserver = null;\r\n }\r\n\r\n this.onPickedPointChangedObservable.clear();\r\n this.onPickingObservable.clear();\r\n\r\n let utilityLayerScene = this._utilityLayer ? this._utilityLayer.utilityLayerScene : null;\r\n\r\n if (utilityLayerScene) {\r\n if (this._pointerObserver) {\r\n utilityLayerScene.onPointerObservable.remove(this._pointerObserver);\r\n this._pointerObserver = null;\r\n }\r\n }\r\n if (this._scene) {\r\n if (this._sceneDisposeObserver) {\r\n this._scene.onDisposeObservable.remove(this._sceneDisposeObserver);\r\n this._sceneDisposeObserver = null;\r\n }\r\n }\r\n\r\n if (this._utilityLayer) {\r\n this._utilityLayer.dispose();\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"gui3DManager.js","sourceRoot":"","sources":["../../../sourceES6/gui/src/3D/gui3DManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from \"@babylonjs/core/types\";\r\nimport { Observable, Observer } from \"@babylonjs/core/Misc/observable\";\r\nimport { Vector3 } from \"@babylonjs/core/Maths/math.vector\";\r\nimport { PointerInfo, PointerEventTypes } from \"@babylonjs/core/Events/pointerEvents\";\r\nimport { Material } from \"@babylonjs/core/Materials/material\";\r\nimport { HemisphericLight } from \"@babylonjs/core/Lights/hemisphericLight\";\r\nimport { AbstractMesh } from \"@babylonjs/core/Meshes/abstractMesh\";\r\nimport { UtilityLayerRenderer } from \"@babylonjs/core/Rendering/utilityLayerRenderer\";\r\nimport { EngineStore } from \"@babylonjs/core/Engines/engineStore\";\r\nimport { IDisposable, Scene } from \"@babylonjs/core/scene\";\r\n\r\nimport { Container3D } from \"./controls/container3D\";\r\nimport { Control3D } from \"./controls/control3D\";\r\nimport { IPointerEvent } from \"@babylonjs/core/Events/deviceInputEvents\";\r\n\r\n/**\r\n * Class used to manage 3D user interface\r\n * @see https://doc.babylonjs.com/how_to/gui3d\r\n */\r\nexport class GUI3DManager implements IDisposable {\r\n private _scene: Scene;\r\n private _sceneDisposeObserver: Nullable<Observer<Scene>>;\r\n private _utilityLayer: Nullable<UtilityLayerRenderer>;\r\n private _rootContainer: Container3D;\r\n private _pointerObserver: Nullable<Observer<PointerInfo>>;\r\n private _pointerOutObserver: Nullable<Observer<number>>;\r\n private _customControlScaling = 1.0;\r\n /** @hidden */\r\n public _lastPickedControl: Control3D;\r\n /** @hidden */\r\n public _lastControlOver: { [pointerId: number]: Control3D } = {};\r\n /** @hidden */\r\n public _lastControlDown: { [pointerId: number]: Control3D } = {};\r\n\r\n protected static MRTK_REALISTIC_SCALING: number = 0.032;\r\n\r\n /**\r\n * Observable raised when the point picked by the pointer events changed\r\n */\r\n public onPickedPointChangedObservable = new Observable<Nullable<Vector3>>();\r\n\r\n /**\r\n * Observable raised when a picking happens\r\n */\r\n public onPickingObservable = new Observable<Nullable<AbstractMesh>>();\r\n\r\n // Shared resources\r\n /** @hidden */\r\n public _sharedMaterials: { [key: string]: Material } = {};\r\n\r\n /** @hidden */\r\n public _touchSharedMaterials: { [key: string]: Material } = {};\r\n\r\n /** Gets the hosting scene */\r\n public get scene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n /** Gets associated utility layer */\r\n public get utilityLayer(): Nullable<UtilityLayerRenderer> {\r\n return this._utilityLayer;\r\n }\r\n\r\n /** Gets the scaling for all UI elements owned by this manager */\r\n public get controlScaling() {\r\n return this._customControlScaling;\r\n }\r\n\r\n /** Sets the scaling adjustment for all UI elements owned by this manager */\r\n public set controlScaling(newScale: number) {\r\n if (this._customControlScaling !== newScale && newScale > 0) {\r\n let scaleRatio = newScale / this._customControlScaling;\r\n this._customControlScaling = newScale;\r\n\r\n this._rootContainer.children.forEach((control: Control3D) => {\r\n control.scaling.scaleInPlace(scaleRatio);\r\n\r\n if (newScale !== 1) {\r\n control._isScaledByManager = true;\r\n }\r\n });\r\n }\r\n }\r\n\r\n /** Gets if controls attached to this manager are realistically sized, based on the fact that 1 unit length is 1 meter */\r\n public get useRealisticScaling() {\r\n return this.controlScaling === GUI3DManager.MRTK_REALISTIC_SCALING;\r\n }\r\n\r\n /** Sets if controls attached to this manager are realistically sized, based on the fact that 1 unit length is 1 meter */\r\n public set useRealisticScaling(newValue: boolean) {\r\n this.controlScaling = newValue ? GUI3DManager.MRTK_REALISTIC_SCALING : 1;\r\n }\r\n\r\n /**\r\n * Creates a new GUI3DManager\r\n * @param scene\r\n */\r\n public constructor(scene?: Scene) {\r\n this._scene = scene || EngineStore.LastCreatedScene!;\r\n this._sceneDisposeObserver = this._scene.onDisposeObservable.add(() => {\r\n this._sceneDisposeObserver = null;\r\n this._utilityLayer = null;\r\n this.dispose();\r\n });\r\n\r\n this._utilityLayer = UtilityLayerRenderer._CreateDefaultUtilityLayerFromScene(this._scene);\r\n this._utilityLayer.onlyCheckPointerDownEvents = false;\r\n this._utilityLayer.pickUtilitySceneFirst = false;\r\n this._utilityLayer.mainSceneTrackerPredicate = (mesh: Nullable<AbstractMesh>) => {\r\n return mesh && mesh.reservedDataStore?.GUI3D?.control?._node;\r\n };\r\n\r\n // Root\r\n this._rootContainer = new Container3D(\"RootContainer\");\r\n this._rootContainer._host = this;\r\n let utilityLayerScene = this._utilityLayer.utilityLayerScene;\r\n\r\n // Events\r\n this._pointerOutObserver = this._utilityLayer.onPointerOutObservable.add((pointerId) => {\r\n this._handlePointerOut(pointerId, true);\r\n });\r\n\r\n this._pointerObserver = utilityLayerScene.onPointerObservable.add((pi, state) => {\r\n this._doPicking(pi);\r\n });\r\n\r\n // Scene\r\n this._utilityLayer.utilityLayerScene.autoClear = false;\r\n this._utilityLayer.utilityLayerScene.autoClearDepthAndStencil = false;\r\n new HemisphericLight(\"hemi\", Vector3.Up(), this._utilityLayer.utilityLayerScene);\r\n }\r\n\r\n private _handlePointerOut(pointerId: number, isPointerUp: boolean) {\r\n var previousControlOver = this._lastControlOver[pointerId];\r\n if (previousControlOver) {\r\n previousControlOver._onPointerOut(previousControlOver);\r\n delete this._lastControlOver[pointerId];\r\n }\r\n\r\n if (isPointerUp) {\r\n if (this._lastControlDown[pointerId]) {\r\n this._lastControlDown[pointerId].forcePointerUp();\r\n delete this._lastControlDown[pointerId];\r\n }\r\n }\r\n\r\n this.onPickedPointChangedObservable.notifyObservers(null);\r\n }\r\n\r\n private _doPicking(pi: PointerInfo): boolean {\r\n if (!this._utilityLayer || !this._utilityLayer.shouldRender || !this._utilityLayer.utilityLayerScene.activeCamera) {\r\n return false;\r\n }\r\n\r\n let pointerEvent = <IPointerEvent>pi.event;\r\n\r\n let pointerId = pointerEvent.pointerId || 0;\r\n let buttonIndex = pointerEvent.button;\r\n\r\n let pickingInfo = pi.pickInfo;\r\n if (pickingInfo) {\r\n this.onPickingObservable.notifyObservers(pickingInfo.pickedMesh);\r\n }\r\n\r\n if (!pickingInfo || !pickingInfo.hit) {\r\n this._handlePointerOut(pointerId, pi.type === PointerEventTypes.POINTERUP);\r\n return false;\r\n }\r\n\r\n if (pickingInfo.pickedPoint) {\r\n this.onPickedPointChangedObservable.notifyObservers(pickingInfo.pickedPoint);\r\n }\r\n\r\n const control = <Control3D>pickingInfo.pickedMesh!.reservedDataStore?.GUI3D?.control;\r\n if (!!control && !control._processObservables(pi.type, pickingInfo.pickedPoint!, pickingInfo.originMesh?.position || null, pointerId, buttonIndex)) {\r\n if (pi.type === PointerEventTypes.POINTERMOVE) {\r\n if (this._lastControlOver[pointerId]) {\r\n this._lastControlOver[pointerId]._onPointerOut(this._lastControlOver[pointerId]);\r\n }\r\n\r\n delete this._lastControlOver[pointerId];\r\n }\r\n }\r\n\r\n if (pi.type === PointerEventTypes.POINTERUP) {\r\n if (this._lastControlDown[pointerEvent.pointerId]) {\r\n this._lastControlDown[pointerEvent.pointerId].forcePointerUp();\r\n delete this._lastControlDown[pointerEvent.pointerId];\r\n }\r\n\r\n if (pointerEvent.pointerType === \"touch\") {\r\n this._handlePointerOut(pointerId, false);\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Gets the root container\r\n */\r\n public get rootContainer(): Container3D {\r\n return this._rootContainer;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the given control is in the root child list\r\n * @param control defines the control to check\r\n * @returns true if the control is in the root child list\r\n */\r\n public containsControl(control: Control3D): boolean {\r\n return this._rootContainer.containsControl(control);\r\n }\r\n\r\n /**\r\n * Adds a control to the root child list\r\n * @param control defines the control to add\r\n * @returns the current manager\r\n */\r\n public addControl(control: Control3D): GUI3DManager {\r\n this._rootContainer.addControl(control);\r\n if (this._customControlScaling !== 1) {\r\n control.scaling.scaleInPlace(this._customControlScaling);\r\n control._isScaledByManager = true;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes a control from the root child list\r\n * @param control defines the control to remove\r\n * @returns the current container\r\n */\r\n public removeControl(control: Control3D): GUI3DManager {\r\n this._rootContainer.removeControl(control);\r\n if (control._isScaledByManager) {\r\n control.scaling.scaleInPlace(1 / this._customControlScaling);\r\n control._isScaledByManager = false;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Releases all associated resources\r\n */\r\n public dispose() {\r\n this._rootContainer.dispose();\r\n\r\n for (var materialName in this._sharedMaterials) {\r\n if (!this._sharedMaterials.hasOwnProperty(materialName)) {\r\n continue;\r\n }\r\n\r\n this._sharedMaterials[materialName].dispose();\r\n }\r\n\r\n this._sharedMaterials = {};\r\n\r\n for (var materialName in this._touchSharedMaterials) {\r\n if (!this._touchSharedMaterials.hasOwnProperty(materialName)) {\r\n continue;\r\n }\r\n\r\n this._touchSharedMaterials[materialName].dispose();\r\n }\r\n\r\n this._touchSharedMaterials = {};\r\n\r\n if (this._pointerOutObserver && this._utilityLayer) {\r\n this._utilityLayer.onPointerOutObservable.remove(this._pointerOutObserver);\r\n this._pointerOutObserver = null;\r\n }\r\n\r\n this.onPickedPointChangedObservable.clear();\r\n this.onPickingObservable.clear();\r\n\r\n let utilityLayerScene = this._utilityLayer ? this._utilityLayer.utilityLayerScene : null;\r\n\r\n if (utilityLayerScene) {\r\n if (this._pointerObserver) {\r\n utilityLayerScene.onPointerObservable.remove(this._pointerObserver);\r\n this._pointerObserver = null;\r\n }\r\n }\r\n if (this._scene) {\r\n if (this._sceneDisposeObserver) {\r\n this._scene.onDisposeObservable.remove(this._sceneDisposeObserver);\r\n this._sceneDisposeObserver = null;\r\n }\r\n }\r\n\r\n if (this._utilityLayer) {\r\n this._utilityLayer.dispose();\r\n }\r\n }\r\n}\r\n"]}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  },
5
5
  "name": "@babylonjs/gui",
6
6
  "description": "The Babylon.js GUI library is an extension you can use to generate interactive user interface. It is build on top of the DynamicTexture.",
7
- "version": "5.0.0-beta.8",
7
+ "version": "5.0.0-rc.1",
8
8
  "repository": {
9
9
  "type": "git",
10
10
  "url": "https://github.com/BabylonJS/Babylon.js.git"
@@ -326,7 +326,7 @@
326
326
  ],
327
327
  "license": "Apache-2.0",
328
328
  "dependencies": {
329
- "@babylonjs/core": "5.0.0-beta.8",
329
+ "@babylonjs/core": "5.0.0-rc.1",
330
330
  "tslib": "^2.3.1"
331
331
  },
332
332
  "engines": {