@babylonjs/gui 5.21.0 → 5.23.0

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 (178) hide show
  1. package/2D/adtInstrumentation.js +70 -90
  2. package/2D/adtInstrumentation.js.map +1 -1
  3. package/2D/advancedDynamicTexture.d.ts +12 -0
  4. package/2D/advancedDynamicTexture.js +569 -622
  5. package/2D/advancedDynamicTexture.js.map +1 -1
  6. package/2D/controls/button.js +76 -90
  7. package/2D/controls/button.js.map +1 -1
  8. package/2D/controls/checkbox.js +86 -106
  9. package/2D/controls/checkbox.js.map +1 -1
  10. package/2D/controls/colorpicker.js +395 -415
  11. package/2D/controls/colorpicker.js.map +1 -1
  12. package/2D/controls/container.js +187 -230
  13. package/2D/controls/container.js.map +1 -1
  14. package/2D/controls/control.js +1067 -1353
  15. package/2D/controls/control.js.map +1 -1
  16. package/2D/controls/displayGrid.js +152 -196
  17. package/2D/controls/displayGrid.js.map +1 -1
  18. package/2D/controls/ellipse.js +32 -40
  19. package/2D/controls/ellipse.js.map +1 -1
  20. package/2D/controls/focusableButton.js +30 -35
  21. package/2D/controls/focusableButton.js.map +1 -1
  22. package/2D/controls/grid.js +172 -212
  23. package/2D/controls/grid.js.map +1 -1
  24. package/2D/controls/image.js +489 -592
  25. package/2D/controls/image.js.map +1 -1
  26. package/2D/controls/inputPassword.js +9 -16
  27. package/2D/controls/inputPassword.js.map +1 -1
  28. package/2D/controls/inputText.js +380 -467
  29. package/2D/controls/inputText.js.map +1 -1
  30. package/2D/controls/inputTextArea.js +234 -273
  31. package/2D/controls/inputTextArea.js.map +1 -1
  32. package/2D/controls/line.js +147 -198
  33. package/2D/controls/line.js.map +1 -1
  34. package/2D/controls/multiLine.js +87 -113
  35. package/2D/controls/multiLine.js.map +1 -1
  36. package/2D/controls/radioButton.js +106 -127
  37. package/2D/controls/radioButton.js.map +1 -1
  38. package/2D/controls/rectangle.js +60 -72
  39. package/2D/controls/rectangle.js.map +1 -1
  40. package/2D/controls/scrollViewers/scrollViewer.js +439 -543
  41. package/2D/controls/scrollViewers/scrollViewer.js.map +1 -1
  42. package/2D/controls/scrollViewers/scrollViewerWindow.js +99 -118
  43. package/2D/controls/scrollViewers/scrollViewerWindow.js.map +1 -1
  44. package/2D/controls/selector.js +241 -329
  45. package/2D/controls/selector.js.map +1 -1
  46. package/2D/controls/sliders/baseSlider.js +182 -230
  47. package/2D/controls/sliders/baseSlider.js.map +1 -1
  48. package/2D/controls/sliders/imageBasedSlider.js +86 -109
  49. package/2D/controls/sliders/imageBasedSlider.js.map +1 -1
  50. package/2D/controls/sliders/imageScrollBar.js +148 -178
  51. package/2D/controls/sliders/imageScrollBar.js.map +1 -1
  52. package/2D/controls/sliders/scrollBar.js +64 -80
  53. package/2D/controls/sliders/scrollBar.js.map +1 -1
  54. package/2D/controls/sliders/slider.js +91 -115
  55. package/2D/controls/sliders/slider.js.map +1 -1
  56. package/2D/controls/stackPanel.js +114 -135
  57. package/2D/controls/stackPanel.js.map +1 -1
  58. package/2D/controls/statics.js +5 -5
  59. package/2D/controls/statics.js.map +1 -1
  60. package/2D/controls/textBlock.js +322 -384
  61. package/2D/controls/textBlock.js.map +1 -1
  62. package/2D/controls/textWrapper.js +27 -41
  63. package/2D/controls/textWrapper.js.map +1 -1
  64. package/2D/controls/toggleButton.js +105 -121
  65. package/2D/controls/toggleButton.js.map +1 -1
  66. package/2D/controls/virtualKeyboard.js +101 -123
  67. package/2D/controls/virtualKeyboard.js.map +1 -1
  68. package/2D/math2D.js +62 -70
  69. package/2D/math2D.js.map +1 -1
  70. package/2D/measure.js +30 -32
  71. package/2D/measure.js.map +1 -1
  72. package/2D/multiLinePoint.js +71 -89
  73. package/2D/multiLinePoint.js.map +1 -1
  74. package/2D/style.js +55 -73
  75. package/2D/style.js.map +1 -1
  76. package/2D/valueAndUnit.js +71 -104
  77. package/2D/valueAndUnit.js.map +1 -1
  78. package/2D/xmlLoader.js +70 -84
  79. package/2D/xmlLoader.js.map +1 -1
  80. package/3D/behaviors/defaultBehavior.js +40 -59
  81. package/3D/behaviors/defaultBehavior.js.map +1 -1
  82. package/3D/controls/abstractButton3D.js +8 -12
  83. package/3D/controls/abstractButton3D.js.map +1 -1
  84. package/3D/controls/button3D.js +30 -35
  85. package/3D/controls/button3D.js.map +1 -1
  86. package/3D/controls/container3D.js +57 -71
  87. package/3D/controls/container3D.js.map +1 -1
  88. package/3D/controls/contentDisplay3D.js +47 -60
  89. package/3D/controls/contentDisplay3D.js.map +1 -1
  90. package/3D/controls/control3D.js +123 -158
  91. package/3D/controls/control3D.js.map +1 -1
  92. package/3D/controls/cylinderPanel.js +28 -38
  93. package/3D/controls/cylinderPanel.js.map +1 -1
  94. package/3D/controls/handMenu.js +20 -29
  95. package/3D/controls/handMenu.js.map +1 -1
  96. package/3D/controls/holographicBackplate.js +52 -72
  97. package/3D/controls/holographicBackplate.js.map +1 -1
  98. package/3D/controls/holographicButton.js +160 -200
  99. package/3D/controls/holographicButton.js.map +1 -1
  100. package/3D/controls/holographicSlate.js +176 -206
  101. package/3D/controls/holographicSlate.js.map +1 -1
  102. package/3D/controls/meshButton3D.js +24 -30
  103. package/3D/controls/meshButton3D.js.map +1 -1
  104. package/3D/controls/nearMenu.js +57 -71
  105. package/3D/controls/nearMenu.js.map +1 -1
  106. package/3D/controls/planePanel.js +6 -13
  107. package/3D/controls/planePanel.js.map +1 -1
  108. package/3D/controls/scatterPanel.js +43 -54
  109. package/3D/controls/scatterPanel.js.map +1 -1
  110. package/3D/controls/slider3D.js +168 -222
  111. package/3D/controls/slider3D.js.map +1 -1
  112. package/3D/controls/spherePanel.js +29 -39
  113. package/3D/controls/spherePanel.js.map +1 -1
  114. package/3D/controls/stackPanel3D.js +36 -49
  115. package/3D/controls/stackPanel3D.js.map +1 -1
  116. package/3D/controls/touchButton3D.js +126 -154
  117. package/3D/controls/touchButton3D.js.map +1 -1
  118. package/3D/controls/touchHolographicButton.js +223 -272
  119. package/3D/controls/touchHolographicButton.js.map +1 -1
  120. package/3D/controls/touchHolographicMenu.js +55 -66
  121. package/3D/controls/touchHolographicMenu.js.map +1 -1
  122. package/3D/controls/touchMeshButton3D.js +24 -30
  123. package/3D/controls/touchMeshButton3D.js.map +1 -1
  124. package/3D/controls/volumeBasedPanel.js +85 -107
  125. package/3D/controls/volumeBasedPanel.js.map +1 -1
  126. package/3D/gizmos/gizmoHandle.js +68 -103
  127. package/3D/gizmos/gizmoHandle.js.map +1 -1
  128. package/3D/gizmos/slateGizmo.js +165 -182
  129. package/3D/gizmos/slateGizmo.js.map +1 -1
  130. package/3D/gui3DManager.js +76 -101
  131. package/3D/gui3DManager.js.map +1 -1
  132. package/3D/materials/fluent/fluentMaterial.js +110 -119
  133. package/3D/materials/fluent/fluentMaterial.js.map +1 -1
  134. package/3D/materials/fluent/shaders/fluent.fragment.js +20 -3
  135. package/3D/materials/fluent/shaders/fluent.fragment.js.map +1 -1
  136. package/3D/materials/fluent/shaders/fluent.vertex.js +11 -3
  137. package/3D/materials/fluent/shaders/fluent.vertex.js.map +1 -1
  138. package/3D/materials/fluentBackplate/fluentBackplateMaterial.js +168 -177
  139. package/3D/materials/fluentBackplate/fluentBackplateMaterial.js.map +1 -1
  140. package/3D/materials/fluentBackplate/shaders/fluentBackplate.fragment.js +9 -3
  141. package/3D/materials/fluentBackplate/shaders/fluentBackplate.fragment.js.map +1 -1
  142. package/3D/materials/fluentBackplate/shaders/fluentBackplate.vertex.js +15 -3
  143. package/3D/materials/fluentBackplate/shaders/fluentBackplate.vertex.js.map +1 -1
  144. package/3D/materials/fluentButton/fluentButtonMaterial.js +205 -213
  145. package/3D/materials/fluentButton/fluentButtonMaterial.js.map +1 -1
  146. package/3D/materials/fluentButton/shaders/fluentButton.fragment.js +6 -3
  147. package/3D/materials/fluentButton/shaders/fluentButton.fragment.js.map +1 -1
  148. package/3D/materials/fluentButton/shaders/fluentButton.vertex.js +6 -3
  149. package/3D/materials/fluentButton/shaders/fluentButton.vertex.js.map +1 -1
  150. package/3D/materials/handle/handleMaterial.js +56 -69
  151. package/3D/materials/handle/handleMaterial.js.map +1 -1
  152. package/3D/materials/handle/shaders/handle.fragment.js +3 -3
  153. package/3D/materials/handle/shaders/handle.fragment.js.map +1 -1
  154. package/3D/materials/handle/shaders/handle.vertex.js +3 -3
  155. package/3D/materials/handle/shaders/handle.vertex.js.map +1 -1
  156. package/3D/materials/mrdl/mrdlBackplateMaterial.js +158 -166
  157. package/3D/materials/mrdl/mrdlBackplateMaterial.js.map +1 -1
  158. package/3D/materials/mrdl/mrdlSliderBarMaterial.js +322 -330
  159. package/3D/materials/mrdl/mrdlSliderBarMaterial.js.map +1 -1
  160. package/3D/materials/mrdl/mrdlSliderThumbMaterial.js +322 -330
  161. package/3D/materials/mrdl/mrdlSliderThumbMaterial.js.map +1 -1
  162. package/3D/materials/mrdl/shaders/mrdlBackplate.fragment.js +9 -3
  163. package/3D/materials/mrdl/shaders/mrdlBackplate.fragment.js.map +1 -1
  164. package/3D/materials/mrdl/shaders/mrdlBackplate.vertex.js +6 -3
  165. package/3D/materials/mrdl/shaders/mrdlBackplate.vertex.js.map +1 -1
  166. package/3D/materials/mrdl/shaders/mrdlSliderBar.fragment.js +24 -3
  167. package/3D/materials/mrdl/shaders/mrdlSliderBar.fragment.js.map +1 -1
  168. package/3D/materials/mrdl/shaders/mrdlSliderBar.vertex.js +12 -3
  169. package/3D/materials/mrdl/shaders/mrdlSliderBar.vertex.js.map +1 -1
  170. package/3D/materials/mrdl/shaders/mrdlSliderThumb.fragment.js +24 -3
  171. package/3D/materials/mrdl/shaders/mrdlSliderThumb.fragment.js.map +1 -1
  172. package/3D/materials/mrdl/shaders/mrdlSliderThumb.vertex.js +12 -3
  173. package/3D/materials/mrdl/shaders/mrdlSliderThumb.vertex.js.map +1 -1
  174. package/3D/vector3WithInfo.js +6 -12
  175. package/3D/vector3WithInfo.js.map +1 -1
  176. package/legacy/legacy.js +1 -1
  177. package/legacy/legacy.js.map +1 -1
  178. package/package.json +3 -6
@@ -1,5 +1,4 @@
1
1
  // Assumptions: absolute position of button mesh is inside the mesh
2
- import { __extends } from "tslib";
3
2
  import { Vector3, TmpVectors } from "@babylonjs/core/Maths/math.vector.js";
4
3
  import { PointerEventTypes } from "@babylonjs/core/Events/pointerEvents.js";
5
4
  import { Observable } from "@babylonjs/core/Misc/observable.js";
@@ -7,188 +6,163 @@ import { Button3D } from "./button3D.js";
7
6
  /**
8
7
  * Class used to create a touchable button in 3D
9
8
  */
10
- var TouchButton3D = /** @class */ (function (_super) {
11
- __extends(TouchButton3D, _super);
9
+ export class TouchButton3D extends Button3D {
12
10
  /**
13
11
  * Creates a new touchable button
14
12
  * @param name defines the control name
15
13
  * @param collisionMesh mesh to track collisions with
16
14
  */
17
- function TouchButton3D(name, collisionMesh) {
18
- var _this = _super.call(this, name) || this;
19
- _this._isNearPressed = false;
20
- _this._interactionSurfaceHeight = 0;
21
- _this._isToggleButton = false;
22
- _this._toggleState = false;
23
- _this._toggleButtonCallback = function () {
24
- _this._onToggle(!_this._toggleState);
15
+ constructor(name, collisionMesh) {
16
+ super(name);
17
+ this._isNearPressed = false;
18
+ this._interactionSurfaceHeight = 0;
19
+ this._isToggleButton = false;
20
+ this._toggleState = false;
21
+ this._toggleButtonCallback = () => {
22
+ this._onToggle(!this._toggleState);
25
23
  };
26
24
  /**
27
25
  * An event triggered when the button is toggled. Only fired if 'isToggleButton' is true
28
26
  */
29
- _this.onToggleObservable = new Observable();
30
- _this.collidableFrontDirection = Vector3.Zero();
27
+ this.onToggleObservable = new Observable();
28
+ this.collidableFrontDirection = Vector3.Zero();
31
29
  if (collisionMesh) {
32
- _this.collisionMesh = collisionMesh;
30
+ this.collisionMesh = collisionMesh;
33
31
  }
34
- return _this;
35
32
  }
36
- Object.defineProperty(TouchButton3D.prototype, "isActiveNearInteraction", {
37
- /**
38
- * Whether the current interaction is caused by near interaction or not
39
- */
40
- get: function () {
41
- return this._isNearPressed;
42
- },
43
- enumerable: false,
44
- configurable: true
45
- });
46
- Object.defineProperty(TouchButton3D.prototype, "collidableFrontDirection", {
47
- /**
48
- * Returns the front-facing direction of the button, or Vector3.Zero if there is no 'front'
49
- */
50
- get: function () {
51
- if (this._collisionMesh) {
52
- // Update the front direction to reflect any rotations of the collision mesh
53
- var transformedDirection = TmpVectors.Vector3[0];
54
- Vector3.TransformNormalToRef(this._collidableFrontDirection, this._collisionMesh.getWorldMatrix(), transformedDirection);
55
- return transformedDirection.normalize();
56
- }
57
- return this._collidableFrontDirection;
58
- },
59
- /**
60
- * Sets the front-facing direction of the button. Pass in Vector3.Zero to allow interactions from any direction
61
- * @param frontWorldDir the forward direction of the button
62
- */
63
- set: function (frontWorldDir) {
64
- this._collidableFrontDirection = frontWorldDir.normalize();
65
- if (this._collisionMesh) {
66
- var invert = TmpVectors.Matrix[0];
67
- invert.copyFrom(this._collisionMesh.getWorldMatrix());
68
- invert.invert();
69
- Vector3.TransformNormalToRef(this._collidableFrontDirection, invert, this._collidableFrontDirection);
70
- this._collidableFrontDirection.normalize();
33
+ /**
34
+ * Whether the current interaction is caused by near interaction or not
35
+ */
36
+ get isActiveNearInteraction() {
37
+ return this._isNearPressed;
38
+ }
39
+ /**
40
+ * Sets the front-facing direction of the button. Pass in Vector3.Zero to allow interactions from any direction
41
+ * @param frontWorldDir the forward direction of the button
42
+ */
43
+ set collidableFrontDirection(frontWorldDir) {
44
+ this._collidableFrontDirection = frontWorldDir.normalize();
45
+ if (this._collisionMesh) {
46
+ const invert = TmpVectors.Matrix[0];
47
+ invert.copyFrom(this._collisionMesh.getWorldMatrix());
48
+ invert.invert();
49
+ Vector3.TransformNormalToRef(this._collidableFrontDirection, invert, this._collidableFrontDirection);
50
+ this._collidableFrontDirection.normalize();
51
+ }
52
+ }
53
+ /**
54
+ * Returns the front-facing direction of the button, or Vector3.Zero if there is no 'front'
55
+ */
56
+ get collidableFrontDirection() {
57
+ if (this._collisionMesh) {
58
+ // Update the front direction to reflect any rotations of the collision mesh
59
+ const transformedDirection = TmpVectors.Vector3[0];
60
+ Vector3.TransformNormalToRef(this._collidableFrontDirection, this._collisionMesh.getWorldMatrix(), transformedDirection);
61
+ return transformedDirection.normalize();
62
+ }
63
+ return this._collidableFrontDirection;
64
+ }
65
+ /**
66
+ * Sets the mesh used for testing input collision
67
+ * @param collisionMesh the new collision mesh for the button
68
+ */
69
+ set collisionMesh(collisionMesh) {
70
+ // Remove the GUI3DManager's data from the previous collision mesh's reserved data store, and reset interactability
71
+ if (this._collisionMesh) {
72
+ this._collisionMesh.isNearPickable = false;
73
+ if (this._collisionMesh.reservedDataStore?.GUI3D) {
74
+ this._collisionMesh.reservedDataStore.GUI3D = {};
71
75
  }
72
- },
73
- enumerable: false,
74
- configurable: true
75
- });
76
- Object.defineProperty(TouchButton3D.prototype, "collisionMesh", {
77
- /**
78
- * Sets the mesh used for testing input collision
79
- * @param collisionMesh the new collision mesh for the button
80
- */
81
- set: function (collisionMesh) {
82
- var _this = this;
83
- var _a;
84
- // Remove the GUI3DManager's data from the previous collision mesh's reserved data store, and reset interactability
85
- if (this._collisionMesh) {
86
- this._collisionMesh.isNearPickable = false;
87
- if ((_a = this._collisionMesh.reservedDataStore) === null || _a === void 0 ? void 0 : _a.GUI3D) {
88
- this._collisionMesh.reservedDataStore.GUI3D = {};
76
+ this._collisionMesh.getChildMeshes().forEach((mesh) => {
77
+ mesh.isNearPickable = false;
78
+ if (mesh.reservedDataStore?.GUI3D) {
79
+ mesh.reservedDataStore.GUI3D = {};
89
80
  }
90
- this._collisionMesh.getChildMeshes().forEach(function (mesh) {
91
- var _a;
92
- mesh.isNearPickable = false;
93
- if ((_a = mesh.reservedDataStore) === null || _a === void 0 ? void 0 : _a.GUI3D) {
94
- mesh.reservedDataStore.GUI3D = {};
95
- }
96
- });
97
- }
98
- this._collisionMesh = collisionMesh;
99
- this._injectGUI3DReservedDataStore(this._collisionMesh).control = this;
100
- this._collisionMesh.isNearPickable = true;
101
- this._collisionMesh.getChildMeshes().forEach(function (mesh) {
102
- _this._injectGUI3DReservedDataStore(mesh).control = _this;
103
- mesh.isNearPickable = true;
104
81
  });
105
- this.collidableFrontDirection = collisionMesh.forward;
106
- },
107
- enumerable: false,
108
- configurable: true
109
- });
110
- Object.defineProperty(TouchButton3D.prototype, "isToggleButton", {
111
- get: function () {
112
- return this._isToggleButton;
113
- },
114
- /**
115
- * Setter for if this TouchButton3D should be treated as a toggle button
116
- * @param value If this TouchHolographicButton should act like a toggle button
117
- */
118
- set: function (value) {
119
- if (value === this._isToggleButton) {
120
- return;
121
- }
122
- this._isToggleButton = value;
123
- if (value) {
124
- this.onPointerUpObservable.add(this._toggleButtonCallback);
125
- }
126
- else {
127
- this.onPointerUpObservable.removeCallback(this._toggleButtonCallback);
128
- // Safety check, reset the button if it's toggled on but no longer a toggle button
129
- if (this._toggleState) {
130
- this._onToggle(false);
131
- }
132
- }
133
- },
134
- enumerable: false,
135
- configurable: true
136
- });
137
- Object.defineProperty(TouchButton3D.prototype, "isToggled", {
138
- get: function () {
139
- return this._toggleState;
140
- },
141
- /**
142
- * A public entrypoint to set the toggle state of the TouchHolographicButton. Only works if 'isToggleButton' is true
143
- * @param newState The new state to set the TouchHolographicButton's toggle state to
144
- */
145
- set: function (newState) {
146
- if (this._isToggleButton && this._toggleState !== newState) {
147
- this._onToggle(newState);
82
+ }
83
+ this._collisionMesh = collisionMesh;
84
+ this._injectGUI3DReservedDataStore(this._collisionMesh).control = this;
85
+ this._collisionMesh.isNearPickable = true;
86
+ this._collisionMesh.getChildMeshes().forEach((mesh) => {
87
+ this._injectGUI3DReservedDataStore(mesh).control = this;
88
+ mesh.isNearPickable = true;
89
+ });
90
+ this.collidableFrontDirection = collisionMesh.forward;
91
+ }
92
+ /**
93
+ * Setter for if this TouchButton3D should be treated as a toggle button
94
+ * @param value If this TouchHolographicButton should act like a toggle button
95
+ */
96
+ set isToggleButton(value) {
97
+ if (value === this._isToggleButton) {
98
+ return;
99
+ }
100
+ this._isToggleButton = value;
101
+ if (value) {
102
+ this.onPointerUpObservable.add(this._toggleButtonCallback);
103
+ }
104
+ else {
105
+ this.onPointerUpObservable.removeCallback(this._toggleButtonCallback);
106
+ // Safety check, reset the button if it's toggled on but no longer a toggle button
107
+ if (this._toggleState) {
108
+ this._onToggle(false);
148
109
  }
149
- },
150
- enumerable: false,
151
- configurable: true
152
- });
153
- TouchButton3D.prototype._onToggle = function (newState) {
110
+ }
111
+ }
112
+ get isToggleButton() {
113
+ return this._isToggleButton;
114
+ }
115
+ /**
116
+ * A public entrypoint to set the toggle state of the TouchHolographicButton. Only works if 'isToggleButton' is true
117
+ * @param newState The new state to set the TouchHolographicButton's toggle state to
118
+ */
119
+ set isToggled(newState) {
120
+ if (this._isToggleButton && this._toggleState !== newState) {
121
+ this._onToggle(newState);
122
+ }
123
+ }
124
+ get isToggled() {
125
+ return this._toggleState;
126
+ }
127
+ _onToggle(newState) {
154
128
  this._toggleState = newState;
155
129
  this.onToggleObservable.notifyObservers(newState);
156
- };
130
+ }
157
131
  // Returns true if the collidable is in front of the button, or if the button has no front direction
158
- TouchButton3D.prototype._isInteractionInFrontOfButton = function (collidablePos) {
132
+ _isInteractionInFrontOfButton(collidablePos) {
159
133
  return this._getInteractionHeight(collidablePos, this._collisionMesh.getAbsolutePosition()) > 0;
160
- };
134
+ }
161
135
  /**
162
136
  * Get the height of the touchPoint from the collidable part of the button
163
137
  * @param touchPoint the point to compare to the button, in absolute position
164
138
  * @returns the depth of the touch point into the front of the button
165
139
  */
166
- TouchButton3D.prototype.getPressDepth = function (touchPoint) {
140
+ getPressDepth(touchPoint) {
167
141
  if (!this._isNearPressed) {
168
142
  return 0;
169
143
  }
170
- var interactionHeight = this._getInteractionHeight(touchPoint, this._collisionMesh.getAbsolutePosition());
144
+ const interactionHeight = this._getInteractionHeight(touchPoint, this._collisionMesh.getAbsolutePosition());
171
145
  return this._interactionSurfaceHeight - interactionHeight;
172
- };
146
+ }
173
147
  // Returns true if the collidable is in front of the button, or if the button has no front direction
174
- TouchButton3D.prototype._getInteractionHeight = function (interactionPos, basePos) {
175
- var frontDir = this.collidableFrontDirection;
148
+ _getInteractionHeight(interactionPos, basePos) {
149
+ const frontDir = this.collidableFrontDirection;
176
150
  if (frontDir.length() === 0) {
177
151
  // The button has no front, just return the distance to the base
178
152
  return Vector3.Distance(interactionPos, basePos);
179
153
  }
180
- var d = Vector3.Dot(basePos, frontDir);
181
- var abc = Vector3.Dot(interactionPos, frontDir);
154
+ const d = Vector3.Dot(basePos, frontDir);
155
+ const abc = Vector3.Dot(interactionPos, frontDir);
182
156
  return abc - d;
183
- };
157
+ }
184
158
  /**
185
159
  * @param providedType
186
160
  * @param nearMeshPosition
187
161
  * @param activeInteractionCount
188
162
  * @hidden
189
163
  */
190
- TouchButton3D.prototype._generatePointerEventType = function (providedType, nearMeshPosition, activeInteractionCount) {
191
- if (providedType === PointerEventTypes.POINTERDOWN) {
164
+ _generatePointerEventType(providedType, nearMeshPosition, activeInteractionCount) {
165
+ if (providedType === PointerEventTypes.POINTERDOWN || providedType === PointerEventTypes.POINTERMOVE) {
192
166
  if (!this._isInteractionInFrontOfButton(nearMeshPosition)) {
193
167
  // Near interaction mesh is behind the button, don't send a pointer down
194
168
  return PointerEventTypes.POINTERMOVE;
@@ -208,27 +182,25 @@ var TouchButton3D = /** @class */ (function (_super) {
208
182
  }
209
183
  }
210
184
  return providedType;
211
- };
212
- TouchButton3D.prototype._getTypeName = function () {
185
+ }
186
+ _getTypeName() {
213
187
  return "TouchButton3D";
214
- };
188
+ }
215
189
  // Mesh association
216
- TouchButton3D.prototype._createNode = function (scene) {
217
- return _super.prototype._createNode.call(this, scene);
218
- };
190
+ _createNode(scene) {
191
+ return super._createNode(scene);
192
+ }
219
193
  /**
220
194
  * Releases all associated resources
221
195
  */
222
- TouchButton3D.prototype.dispose = function () {
223
- _super.prototype.dispose.call(this);
196
+ dispose() {
197
+ super.dispose();
224
198
  // Clean up toggle observables
225
199
  this.onPointerUpObservable.removeCallback(this._toggleButtonCallback);
226
200
  this.onToggleObservable.clear();
227
201
  if (this._collisionMesh) {
228
202
  this._collisionMesh.dispose();
229
203
  }
230
- };
231
- return TouchButton3D;
232
- }(Button3D));
233
- export { TouchButton3D };
204
+ }
205
+ }
234
206
  //# sourceMappingURL=touchButton3D.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"touchButton3D.js","sourceRoot":"","sources":["../../../../../../lts/gui/generated/3D/controls/touchButton3D.ts"],"names":[],"mappings":"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","sourcesContent":["// Assumptions: absolute position of button mesh is inside the mesh\r\n\r\nimport { Vector3, TmpVectors } from \"core/Maths/math.vector\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\nimport { PointerEventTypes } from \"core/Events/pointerEvents\";\r\nimport type { TransformNode } from \"core/Meshes/transformNode\";\r\nimport type { Scene } from \"core/scene\";\r\n\r\nimport { Observable } from \"core/Misc/observable\";\r\n\r\nimport { Button3D } from \"./button3D\";\r\n\r\n/**\r\n * Class used to create a touchable button in 3D\r\n */\r\nexport class TouchButton3D extends Button3D {\r\n private _collisionMesh: Mesh;\r\n\r\n // 'front' direction. If Vector3.Zero, there is no front and all directions of interaction are accepted\r\n private _collidableFrontDirection: Vector3;\r\n private _isNearPressed = false;\r\n private _interactionSurfaceHeight = 0;\r\n\r\n private _isToggleButton = false;\r\n private _toggleState = false;\r\n private _toggleButtonCallback = () => {\r\n this._onToggle(!this._toggleState);\r\n };\r\n\r\n /**\r\n * An event triggered when the button is toggled. Only fired if 'isToggleButton' is true\r\n */\r\n public onToggleObservable = new Observable<boolean>();\r\n\r\n /**\r\n * Creates a new touchable button\r\n * @param name defines the control name\r\n * @param collisionMesh mesh to track collisions with\r\n */\r\n constructor(name?: string, collisionMesh?: Mesh) {\r\n super(name);\r\n\r\n this.collidableFrontDirection = Vector3.Zero();\r\n\r\n if (collisionMesh) {\r\n this.collisionMesh = collisionMesh;\r\n }\r\n }\r\n\r\n /**\r\n * Whether the current interaction is caused by near interaction or not\r\n */\r\n public get isActiveNearInteraction() {\r\n return this._isNearPressed;\r\n }\r\n\r\n /**\r\n * Sets the front-facing direction of the button. Pass in Vector3.Zero to allow interactions from any direction\r\n * @param frontWorldDir the forward direction of the button\r\n */\r\n public set collidableFrontDirection(frontWorldDir: Vector3) {\r\n this._collidableFrontDirection = frontWorldDir.normalize();\r\n\r\n if (this._collisionMesh) {\r\n const invert = TmpVectors.Matrix[0];\r\n\r\n invert.copyFrom(this._collisionMesh.getWorldMatrix());\r\n invert.invert();\r\n Vector3.TransformNormalToRef(this._collidableFrontDirection, invert, this._collidableFrontDirection);\r\n this._collidableFrontDirection.normalize();\r\n }\r\n }\r\n\r\n /**\r\n * Returns the front-facing direction of the button, or Vector3.Zero if there is no 'front'\r\n */\r\n public get collidableFrontDirection() {\r\n if (this._collisionMesh) {\r\n // Update the front direction to reflect any rotations of the collision mesh\r\n const transformedDirection = TmpVectors.Vector3[0];\r\n Vector3.TransformNormalToRef(this._collidableFrontDirection, this._collisionMesh.getWorldMatrix(), transformedDirection);\r\n\r\n return transformedDirection.normalize();\r\n }\r\n\r\n return this._collidableFrontDirection;\r\n }\r\n\r\n /**\r\n * Sets the mesh used for testing input collision\r\n * @param collisionMesh the new collision mesh for the button\r\n */\r\n public set collisionMesh(collisionMesh: Mesh) {\r\n // Remove the GUI3DManager's data from the previous collision mesh's reserved data store, and reset interactability\r\n if (this._collisionMesh) {\r\n this._collisionMesh.isNearPickable = false;\r\n if (this._collisionMesh.reservedDataStore?.GUI3D) {\r\n this._collisionMesh.reservedDataStore.GUI3D = {};\r\n }\r\n\r\n this._collisionMesh.getChildMeshes().forEach((mesh) => {\r\n mesh.isNearPickable = false;\r\n if (mesh.reservedDataStore?.GUI3D) {\r\n mesh.reservedDataStore.GUI3D = {};\r\n }\r\n });\r\n }\r\n\r\n this._collisionMesh = collisionMesh;\r\n this._injectGUI3DReservedDataStore(this._collisionMesh).control = this;\r\n this._collisionMesh.isNearPickable = true;\r\n\r\n this._collisionMesh.getChildMeshes().forEach((mesh) => {\r\n this._injectGUI3DReservedDataStore(mesh).control = this;\r\n mesh.isNearPickable = true;\r\n });\r\n this.collidableFrontDirection = collisionMesh.forward;\r\n }\r\n\r\n /**\r\n * Setter for if this TouchButton3D should be treated as a toggle button\r\n * @param value If this TouchHolographicButton should act like a toggle button\r\n */\r\n public set isToggleButton(value: boolean) {\r\n if (value === this._isToggleButton) {\r\n return;\r\n }\r\n\r\n this._isToggleButton = value;\r\n\r\n if (value) {\r\n this.onPointerUpObservable.add(this._toggleButtonCallback);\r\n } else {\r\n this.onPointerUpObservable.removeCallback(this._toggleButtonCallback);\r\n\r\n // Safety check, reset the button if it's toggled on but no longer a toggle button\r\n if (this._toggleState) {\r\n this._onToggle(false);\r\n }\r\n }\r\n }\r\n public get isToggleButton() {\r\n return this._isToggleButton;\r\n }\r\n\r\n /**\r\n * A public entrypoint to set the toggle state of the TouchHolographicButton. Only works if 'isToggleButton' is true\r\n * @param newState The new state to set the TouchHolographicButton's toggle state to\r\n */\r\n public set isToggled(newState: boolean) {\r\n if (this._isToggleButton && this._toggleState !== newState) {\r\n this._onToggle(newState);\r\n }\r\n }\r\n public get isToggled() {\r\n return this._toggleState;\r\n }\r\n\r\n protected _onToggle(newState: boolean) {\r\n this._toggleState = newState;\r\n this.onToggleObservable.notifyObservers(newState);\r\n }\r\n\r\n // Returns true if the collidable is in front of the button, or if the button has no front direction\r\n private _isInteractionInFrontOfButton(collidablePos: Vector3) {\r\n return this._getInteractionHeight(collidablePos, this._collisionMesh.getAbsolutePosition()) > 0;\r\n }\r\n\r\n /**\r\n * Get the height of the touchPoint from the collidable part of the button\r\n * @param touchPoint the point to compare to the button, in absolute position\r\n * @returns the depth of the touch point into the front of the button\r\n */\r\n public getPressDepth(touchPoint: Vector3) {\r\n if (!this._isNearPressed) {\r\n return 0;\r\n }\r\n const interactionHeight = this._getInteractionHeight(touchPoint, this._collisionMesh.getAbsolutePosition());\r\n return this._interactionSurfaceHeight - interactionHeight;\r\n }\r\n\r\n // Returns true if the collidable is in front of the button, or if the button has no front direction\r\n protected _getInteractionHeight(interactionPos: Vector3, basePos: Vector3) {\r\n const frontDir = this.collidableFrontDirection;\r\n if (frontDir.length() === 0) {\r\n // The button has no front, just return the distance to the base\r\n return Vector3.Distance(interactionPos, basePos);\r\n }\r\n const d = Vector3.Dot(basePos, frontDir);\r\n const abc = Vector3.Dot(interactionPos, frontDir);\r\n\r\n return abc - d;\r\n }\r\n\r\n /**\r\n * @param providedType\r\n * @param nearMeshPosition\r\n * @param activeInteractionCount\r\n * @hidden\r\n */\r\n public _generatePointerEventType(providedType: number, nearMeshPosition: Vector3, activeInteractionCount: number): number {\r\n if (providedType === PointerEventTypes.POINTERDOWN) {\r\n if (!this._isInteractionInFrontOfButton(nearMeshPosition)) {\r\n // Near interaction mesh is behind the button, don't send a pointer down\r\n return PointerEventTypes.POINTERMOVE;\r\n } else {\r\n this._isNearPressed = true;\r\n this._interactionSurfaceHeight = this._getInteractionHeight(nearMeshPosition, this._collisionMesh.getAbsolutePosition());\r\n }\r\n }\r\n if (providedType === PointerEventTypes.POINTERUP) {\r\n if (activeInteractionCount == 0) {\r\n // We get the release for the down we swallowed earlier, swallow as well\r\n return PointerEventTypes.POINTERMOVE;\r\n } else {\r\n this._isNearPressed = false;\r\n }\r\n }\r\n\r\n return providedType;\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"TouchButton3D\";\r\n }\r\n\r\n // Mesh association\r\n protected _createNode(scene: Scene): TransformNode {\r\n return super._createNode(scene);\r\n }\r\n\r\n /**\r\n * Releases all associated resources\r\n */\r\n public dispose() {\r\n super.dispose();\r\n\r\n // Clean up toggle observables\r\n this.onPointerUpObservable.removeCallback(this._toggleButtonCallback);\r\n this.onToggleObservable.clear();\r\n\r\n if (this._collisionMesh) {\r\n this._collisionMesh.dispose();\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"touchButton3D.js","sourceRoot":"","sources":["../../../../../../lts/gui/generated/3D/controls/touchButton3D.ts"],"names":[],"mappings":"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","sourcesContent":["// Assumptions: absolute position of button mesh is inside the mesh\r\n\r\nimport { Vector3, TmpVectors } from \"core/Maths/math.vector\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\nimport { PointerEventTypes } from \"core/Events/pointerEvents\";\r\nimport type { TransformNode } from \"core/Meshes/transformNode\";\r\nimport type { Scene } from \"core/scene\";\r\n\r\nimport { Observable } from \"core/Misc/observable\";\r\n\r\nimport { Button3D } from \"./button3D\";\r\n\r\n/**\r\n * Class used to create a touchable button in 3D\r\n */\r\nexport class TouchButton3D extends Button3D {\r\n private _collisionMesh: Mesh;\r\n\r\n // 'front' direction. If Vector3.Zero, there is no front and all directions of interaction are accepted\r\n private _collidableFrontDirection: Vector3;\r\n private _isNearPressed = false;\r\n private _interactionSurfaceHeight = 0;\r\n\r\n private _isToggleButton = false;\r\n private _toggleState = false;\r\n private _toggleButtonCallback = () => {\r\n this._onToggle(!this._toggleState);\r\n };\r\n\r\n /**\r\n * An event triggered when the button is toggled. Only fired if 'isToggleButton' is true\r\n */\r\n public onToggleObservable = new Observable<boolean>();\r\n\r\n /**\r\n * Creates a new touchable button\r\n * @param name defines the control name\r\n * @param collisionMesh mesh to track collisions with\r\n */\r\n constructor(name?: string, collisionMesh?: Mesh) {\r\n super(name);\r\n\r\n this.collidableFrontDirection = Vector3.Zero();\r\n\r\n if (collisionMesh) {\r\n this.collisionMesh = collisionMesh;\r\n }\r\n }\r\n\r\n /**\r\n * Whether the current interaction is caused by near interaction or not\r\n */\r\n public get isActiveNearInteraction() {\r\n return this._isNearPressed;\r\n }\r\n\r\n /**\r\n * Sets the front-facing direction of the button. Pass in Vector3.Zero to allow interactions from any direction\r\n * @param frontWorldDir the forward direction of the button\r\n */\r\n public set collidableFrontDirection(frontWorldDir: Vector3) {\r\n this._collidableFrontDirection = frontWorldDir.normalize();\r\n\r\n if (this._collisionMesh) {\r\n const invert = TmpVectors.Matrix[0];\r\n\r\n invert.copyFrom(this._collisionMesh.getWorldMatrix());\r\n invert.invert();\r\n Vector3.TransformNormalToRef(this._collidableFrontDirection, invert, this._collidableFrontDirection);\r\n this._collidableFrontDirection.normalize();\r\n }\r\n }\r\n\r\n /**\r\n * Returns the front-facing direction of the button, or Vector3.Zero if there is no 'front'\r\n */\r\n public get collidableFrontDirection() {\r\n if (this._collisionMesh) {\r\n // Update the front direction to reflect any rotations of the collision mesh\r\n const transformedDirection = TmpVectors.Vector3[0];\r\n Vector3.TransformNormalToRef(this._collidableFrontDirection, this._collisionMesh.getWorldMatrix(), transformedDirection);\r\n\r\n return transformedDirection.normalize();\r\n }\r\n\r\n return this._collidableFrontDirection;\r\n }\r\n\r\n /**\r\n * Sets the mesh used for testing input collision\r\n * @param collisionMesh the new collision mesh for the button\r\n */\r\n public set collisionMesh(collisionMesh: Mesh) {\r\n // Remove the GUI3DManager's data from the previous collision mesh's reserved data store, and reset interactability\r\n if (this._collisionMesh) {\r\n this._collisionMesh.isNearPickable = false;\r\n if (this._collisionMesh.reservedDataStore?.GUI3D) {\r\n this._collisionMesh.reservedDataStore.GUI3D = {};\r\n }\r\n\r\n this._collisionMesh.getChildMeshes().forEach((mesh) => {\r\n mesh.isNearPickable = false;\r\n if (mesh.reservedDataStore?.GUI3D) {\r\n mesh.reservedDataStore.GUI3D = {};\r\n }\r\n });\r\n }\r\n\r\n this._collisionMesh = collisionMesh;\r\n this._injectGUI3DReservedDataStore(this._collisionMesh).control = this;\r\n this._collisionMesh.isNearPickable = true;\r\n\r\n this._collisionMesh.getChildMeshes().forEach((mesh) => {\r\n this._injectGUI3DReservedDataStore(mesh).control = this;\r\n mesh.isNearPickable = true;\r\n });\r\n this.collidableFrontDirection = collisionMesh.forward;\r\n }\r\n\r\n /**\r\n * Setter for if this TouchButton3D should be treated as a toggle button\r\n * @param value If this TouchHolographicButton should act like a toggle button\r\n */\r\n public set isToggleButton(value: boolean) {\r\n if (value === this._isToggleButton) {\r\n return;\r\n }\r\n\r\n this._isToggleButton = value;\r\n\r\n if (value) {\r\n this.onPointerUpObservable.add(this._toggleButtonCallback);\r\n } else {\r\n this.onPointerUpObservable.removeCallback(this._toggleButtonCallback);\r\n\r\n // Safety check, reset the button if it's toggled on but no longer a toggle button\r\n if (this._toggleState) {\r\n this._onToggle(false);\r\n }\r\n }\r\n }\r\n public get isToggleButton() {\r\n return this._isToggleButton;\r\n }\r\n\r\n /**\r\n * A public entrypoint to set the toggle state of the TouchHolographicButton. Only works if 'isToggleButton' is true\r\n * @param newState The new state to set the TouchHolographicButton's toggle state to\r\n */\r\n public set isToggled(newState: boolean) {\r\n if (this._isToggleButton && this._toggleState !== newState) {\r\n this._onToggle(newState);\r\n }\r\n }\r\n public get isToggled() {\r\n return this._toggleState;\r\n }\r\n\r\n protected _onToggle(newState: boolean) {\r\n this._toggleState = newState;\r\n this.onToggleObservable.notifyObservers(newState);\r\n }\r\n\r\n // Returns true if the collidable is in front of the button, or if the button has no front direction\r\n private _isInteractionInFrontOfButton(collidablePos: Vector3) {\r\n return this._getInteractionHeight(collidablePos, this._collisionMesh.getAbsolutePosition()) > 0;\r\n }\r\n\r\n /**\r\n * Get the height of the touchPoint from the collidable part of the button\r\n * @param touchPoint the point to compare to the button, in absolute position\r\n * @returns the depth of the touch point into the front of the button\r\n */\r\n public getPressDepth(touchPoint: Vector3) {\r\n if (!this._isNearPressed) {\r\n return 0;\r\n }\r\n const interactionHeight = this._getInteractionHeight(touchPoint, this._collisionMesh.getAbsolutePosition());\r\n return this._interactionSurfaceHeight - interactionHeight;\r\n }\r\n\r\n // Returns true if the collidable is in front of the button, or if the button has no front direction\r\n protected _getInteractionHeight(interactionPos: Vector3, basePos: Vector3) {\r\n const frontDir = this.collidableFrontDirection;\r\n if (frontDir.length() === 0) {\r\n // The button has no front, just return the distance to the base\r\n return Vector3.Distance(interactionPos, basePos);\r\n }\r\n const d = Vector3.Dot(basePos, frontDir);\r\n const abc = Vector3.Dot(interactionPos, frontDir);\r\n\r\n return abc - d;\r\n }\r\n\r\n /**\r\n * @param providedType\r\n * @param nearMeshPosition\r\n * @param activeInteractionCount\r\n * @hidden\r\n */\r\n public _generatePointerEventType(providedType: number, nearMeshPosition: Vector3, activeInteractionCount: number): number {\r\n if (providedType === PointerEventTypes.POINTERDOWN || providedType === PointerEventTypes.POINTERMOVE) {\r\n if (!this._isInteractionInFrontOfButton(nearMeshPosition)) {\r\n // Near interaction mesh is behind the button, don't send a pointer down\r\n return PointerEventTypes.POINTERMOVE;\r\n } else {\r\n this._isNearPressed = true;\r\n this._interactionSurfaceHeight = this._getInteractionHeight(nearMeshPosition, this._collisionMesh.getAbsolutePosition());\r\n }\r\n }\r\n if (providedType === PointerEventTypes.POINTERUP) {\r\n if (activeInteractionCount == 0) {\r\n // We get the release for the down we swallowed earlier, swallow as well\r\n return PointerEventTypes.POINTERMOVE;\r\n } else {\r\n this._isNearPressed = false;\r\n }\r\n }\r\n\r\n return providedType;\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"TouchButton3D\";\r\n }\r\n\r\n // Mesh association\r\n protected _createNode(scene: Scene): TransformNode {\r\n return super._createNode(scene);\r\n }\r\n\r\n /**\r\n * Releases all associated resources\r\n */\r\n public dispose() {\r\n super.dispose();\r\n\r\n // Clean up toggle observables\r\n this.onPointerUpObservable.removeCallback(this._toggleButtonCallback);\r\n this.onToggleObservable.clear();\r\n\r\n if (this._collisionMesh) {\r\n this._collisionMesh.dispose();\r\n }\r\n }\r\n}\r\n"]}