@babylonjs/gui 5.0.0-alpha.9 → 5.0.0-beta.11
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.
- package/2D/adtInstrumentation.js +1 -1
- package/2D/advancedDynamicTexture.d.ts +179 -127
- package/2D/advancedDynamicTexture.js +368 -183
- package/2D/advancedDynamicTexture.js.map +1 -1
- package/2D/controls/button.d.ts +8 -0
- package/2D/controls/button.js +33 -10
- package/2D/controls/button.js.map +1 -1
- package/2D/controls/checkbox.d.ts +2 -1
- package/2D/controls/checkbox.js +10 -8
- package/2D/controls/checkbox.js.map +1 -1
- package/2D/controls/colorpicker.d.ts +4 -3
- package/2D/controls/colorpicker.js +40 -23
- package/2D/controls/colorpicker.js.map +1 -1
- package/2D/controls/container.d.ts +16 -5
- package/2D/controls/container.js +99 -15
- package/2D/controls/container.js.map +1 -1
- package/2D/controls/control.d.ts +115 -47
- package/2D/controls/control.js +318 -139
- package/2D/controls/control.js.map +1 -1
- package/2D/controls/displayGrid.d.ts +2 -1
- package/2D/controls/displayGrid.js +6 -6
- package/2D/controls/displayGrid.js.map +1 -1
- package/2D/controls/ellipse.d.ts +5 -3
- package/2D/controls/ellipse.js +9 -5
- package/2D/controls/ellipse.js.map +1 -1
- package/2D/controls/focusableButton.d.ts +1 -0
- package/2D/controls/focusableButton.js +9 -6
- package/2D/controls/focusableButton.js.map +1 -1
- package/2D/controls/grid.d.ts +13 -2
- package/2D/controls/grid.js +117 -33
- package/2D/controls/grid.js.map +1 -1
- package/2D/controls/image.d.ts +5 -4
- package/2D/controls/image.js +52 -31
- package/2D/controls/image.js.map +1 -1
- package/2D/controls/index.js +29 -29
- package/2D/controls/inputPassword.js +4 -4
- package/2D/controls/inputPassword.js.map +1 -1
- package/2D/controls/inputText.d.ts +4 -1
- package/2D/controls/inputText.js +42 -15
- package/2D/controls/inputText.js.map +1 -1
- package/2D/controls/line.d.ts +3 -2
- package/2D/controls/line.js +8 -8
- package/2D/controls/line.js.map +1 -1
- package/2D/controls/multiLine.d.ts +4 -3
- package/2D/controls/multiLine.js +6 -6
- package/2D/controls/multiLine.js.map +1 -1
- package/2D/controls/radioButton.d.ts +2 -1
- package/2D/controls/radioButton.js +10 -7
- package/2D/controls/radioButton.js.map +1 -1
- package/2D/controls/rectangle.d.ts +8 -3
- package/2D/controls/rectangle.js +21 -5
- package/2D/controls/rectangle.js.map +1 -1
- package/2D/controls/scrollViewers/scrollViewer.d.ts +3 -2
- package/2D/controls/scrollViewers/scrollViewer.js +9 -9
- package/2D/controls/scrollViewers/scrollViewer.js.map +1 -1
- package/2D/controls/scrollViewers/scrollViewerWindow.d.ts +4 -3
- package/2D/controls/scrollViewers/scrollViewerWindow.js +4 -4
- package/2D/controls/scrollViewers/scrollViewerWindow.js.map +1 -1
- package/2D/controls/selector.js +8 -8
- package/2D/controls/selector.js.map +1 -1
- package/2D/controls/sliders/baseSlider.d.ts +1 -1
- package/2D/controls/sliders/baseSlider.js +12 -10
- package/2D/controls/sliders/baseSlider.js.map +1 -1
- package/2D/controls/sliders/imageBasedSlider.d.ts +10 -1
- package/2D/controls/sliders/imageBasedSlider.js +29 -5
- package/2D/controls/sliders/imageBasedSlider.js.map +1 -1
- package/2D/controls/sliders/imageScrollBar.d.ts +2 -1
- package/2D/controls/sliders/imageScrollBar.js +3 -3
- package/2D/controls/sliders/imageScrollBar.js.map +1 -1
- package/2D/controls/sliders/scrollBar.d.ts +2 -1
- package/2D/controls/sliders/scrollBar.js +3 -3
- package/2D/controls/sliders/scrollBar.js.map +1 -1
- package/2D/controls/sliders/slider.d.ts +2 -1
- package/2D/controls/sliders/slider.js +4 -4
- package/2D/controls/sliders/slider.js.map +1 -1
- package/2D/controls/stackPanel.d.ts +10 -3
- package/2D/controls/stackPanel.js +37 -15
- package/2D/controls/stackPanel.js.map +1 -1
- package/2D/controls/statics.js +3 -3
- package/2D/controls/statics.js.map +1 -1
- package/2D/controls/textBlock.d.ts +17 -9
- package/2D/controls/textBlock.js +91 -40
- package/2D/controls/textBlock.js.map +1 -1
- package/2D/controls/textWrapper.js +2 -2
- package/2D/controls/textWrapper.js.map +1 -1
- package/2D/controls/toggleButton.d.ts +1 -13
- package/2D/controls/toggleButton.js +29 -38
- package/2D/controls/toggleButton.js.map +1 -1
- package/2D/controls/virtualKeyboard.js +5 -5
- package/2D/controls/virtualKeyboard.js.map +1 -1
- package/2D/index.d.ts +1 -1
- package/2D/index.js +9 -9
- package/2D/index.js.map +1 -1
- package/2D/math2D.d.ts +5 -0
- package/2D/math2D.js +14 -2
- package/2D/math2D.js.map +1 -1
- package/2D/measure.js +1 -1
- package/2D/measure.js.map +1 -1
- package/2D/multiLinePoint.js +3 -3
- package/2D/style.js +2 -2
- package/2D/valueAndUnit.d.ts +21 -6
- package/2D/valueAndUnit.js +57 -13
- package/2D/valueAndUnit.js.map +1 -1
- package/2D/xmlLoader.d.ts +17 -3
- package/2D/xmlLoader.js +54 -15
- package/2D/xmlLoader.js.map +1 -1
- package/3D/behaviors/defaultBehavior.d.ts +73 -0
- package/3D/behaviors/defaultBehavior.js +122 -0
- package/3D/behaviors/defaultBehavior.js.map +1 -0
- package/3D/controls/abstractButton3D.d.ts +2 -2
- package/3D/controls/abstractButton3D.js +3 -3
- package/3D/controls/abstractButton3D.js.map +1 -1
- package/3D/controls/button3D.d.ts +0 -24
- package/3D/controls/button3D.js +15 -84
- package/3D/controls/button3D.js.map +1 -1
- package/3D/controls/container3D.js +2 -2
- package/3D/controls/contentDisplay3D.d.ts +30 -0
- package/3D/controls/contentDisplay3D.js +79 -0
- package/3D/controls/contentDisplay3D.js.map +1 -0
- package/3D/controls/control3D.d.ts +10 -7
- package/3D/controls/control3D.js +27 -19
- package/3D/controls/control3D.js.map +1 -1
- package/3D/controls/cylinderPanel.js +5 -5
- package/3D/controls/handMenu.d.ts +28 -0
- package/3D/controls/handMenu.js +48 -0
- package/3D/controls/handMenu.js.map +1 -0
- package/3D/controls/holographicBackplate.d.ts +48 -0
- package/3D/controls/holographicBackplate.js +121 -0
- package/3D/controls/holographicBackplate.js.map +1 -0
- package/3D/controls/holographicButton.d.ts +1 -1
- package/3D/controls/holographicButton.js +35 -31
- package/3D/controls/holographicButton.js.map +1 -1
- package/3D/controls/holographicSlate.d.ts +120 -0
- package/3D/controls/holographicSlate.js +372 -0
- package/3D/controls/holographicSlate.js.map +1 -0
- package/3D/controls/index.d.ts +6 -0
- package/3D/controls/index.js +21 -15
- package/3D/controls/index.js.map +1 -1
- package/3D/controls/meshButton3D.js +2 -2
- package/3D/controls/meshButton3D.js.map +1 -1
- package/3D/controls/nearMenu.d.ts +44 -0
- package/3D/controls/nearMenu.js +113 -0
- package/3D/controls/nearMenu.js.map +1 -0
- package/3D/controls/planePanel.js +3 -3
- package/3D/controls/scatterPanel.js +4 -4
- package/3D/controls/slider3D.d.ts +80 -0
- package/3D/controls/slider3D.js +268 -0
- package/3D/controls/slider3D.js.map +1 -0
- package/3D/controls/spherePanel.js +5 -5
- package/3D/controls/stackPanel3D.js +3 -3
- package/3D/controls/touchButton3D.d.ts +30 -21
- package/3D/controls/touchButton3D.js +127 -228
- package/3D/controls/touchButton3D.js.map +1 -1
- package/3D/controls/touchHolographicButton.d.ts +23 -2
- package/3D/controls/touchHolographicButton.js +162 -67
- package/3D/controls/touchHolographicButton.js.map +1 -1
- package/3D/controls/touchHolographicMenu.d.ts +61 -0
- package/3D/controls/touchHolographicMenu.js +149 -0
- package/3D/controls/touchHolographicMenu.js.map +1 -0
- package/3D/controls/touchMeshButton3D.d.ts +3 -6
- package/3D/controls/touchMeshButton3D.js +6 -14
- package/3D/controls/touchMeshButton3D.js.map +1 -1
- package/3D/controls/volumeBasedPanel.d.ts +1 -1
- package/3D/controls/volumeBasedPanel.js +5 -5
- package/3D/controls/volumeBasedPanel.js.map +1 -1
- package/3D/gizmos/gizmoHandle.d.ts +108 -0
- package/3D/gizmos/gizmoHandle.js +210 -0
- package/3D/gizmos/gizmoHandle.js.map +1 -0
- package/3D/gizmos/index.d.ts +2 -0
- package/3D/gizmos/index.js +3 -0
- package/3D/gizmos/index.js.map +1 -0
- package/3D/gizmos/slateGizmo.d.ts +59 -0
- package/3D/gizmos/slateGizmo.js +364 -0
- package/3D/gizmos/slateGizmo.js.map +1 -0
- package/3D/gui3DManager.d.ts +15 -2
- package/3D/gui3DManager.js +62 -41
- package/3D/gui3DManager.js.map +1 -1
- package/3D/index.d.ts +3 -2
- package/3D/index.js +5 -4
- package/3D/index.js.map +1 -1
- package/3D/materials/fluent/fluentMaterial.d.ts +90 -0
- package/3D/materials/fluent/fluentMaterial.js +282 -0
- package/3D/materials/fluent/fluentMaterial.js.map +1 -0
- package/3D/materials/fluent/index.d.ts +1 -0
- package/3D/materials/fluent/index.js +2 -0
- package/3D/materials/fluent/index.js.map +1 -0
- package/3D/materials/{shaders → fluent/shaders}/fluent.fragment.d.ts +0 -0
- package/3D/materials/fluent/shaders/fluent.fragment.js +7 -0
- package/3D/materials/fluent/shaders/fluent.fragment.js.map +1 -0
- package/3D/materials/{shaders → fluent/shaders}/fluent.vertex.d.ts +0 -0
- package/3D/materials/{shaders → fluent/shaders}/fluent.vertex.js +2 -2
- package/3D/materials/fluent/shaders/fluent.vertex.js.map +1 -0
- package/3D/materials/fluentBackplate/fluentBackplateMaterial.d.ts +154 -0
- package/3D/materials/fluentBackplate/fluentBackplateMaterial.js +435 -0
- package/3D/materials/fluentBackplate/fluentBackplateMaterial.js.map +1 -0
- package/3D/materials/fluentBackplate/index.d.ts +1 -0
- package/3D/materials/fluentBackplate/index.js +2 -0
- package/3D/materials/fluentBackplate/index.js.map +1 -0
- package/3D/materials/fluentBackplate/shaders/fluentBackplate.fragment.d.ts +5 -0
- package/3D/materials/fluentBackplate/shaders/fluentBackplate.fragment.js +7 -0
- package/3D/materials/fluentBackplate/shaders/fluentBackplate.fragment.js.map +1 -0
- package/3D/materials/fluentBackplate/shaders/fluentBackplate.vertex.d.ts +5 -0
- package/3D/materials/fluentBackplate/shaders/fluentBackplate.vertex.js +7 -0
- package/3D/materials/fluentBackplate/shaders/fluentBackplate.vertex.js.map +1 -0
- package/3D/materials/fluentButton/fluentButtonMaterial.d.ts +189 -0
- package/3D/materials/fluentButton/fluentButtonMaterial.js +538 -0
- package/3D/materials/fluentButton/fluentButtonMaterial.js.map +1 -0
- package/3D/materials/fluentButton/index.d.ts +1 -0
- package/3D/materials/fluentButton/index.js +2 -0
- package/3D/materials/fluentButton/index.js.map +1 -0
- package/3D/materials/fluentButton/shaders/fluentButton.fragment.d.ts +5 -0
- package/3D/materials/fluentButton/shaders/fluentButton.fragment.js +7 -0
- package/3D/materials/fluentButton/shaders/fluentButton.fragment.js.map +1 -0
- package/3D/materials/fluentButton/shaders/fluentButton.vertex.d.ts +5 -0
- package/3D/materials/fluentButton/shaders/fluentButton.vertex.js +7 -0
- package/3D/materials/fluentButton/shaders/fluentButton.vertex.js.map +1 -0
- package/3D/materials/fluentMaterial.d.ts +2 -88
- package/3D/materials/fluentMaterial.js +2 -277
- package/3D/materials/fluentMaterial.js.map +1 -1
- package/3D/materials/handle/handleMaterial.d.ts +68 -0
- package/3D/materials/handle/handleMaterial.js +127 -0
- package/3D/materials/handle/handleMaterial.js.map +1 -0
- package/3D/materials/handle/index.d.ts +1 -0
- package/3D/materials/handle/index.js +2 -0
- package/3D/materials/handle/index.js.map +1 -0
- package/3D/materials/handle/shaders/handle.fragment.d.ts +5 -0
- package/3D/materials/handle/shaders/handle.fragment.js +7 -0
- package/3D/materials/handle/shaders/handle.fragment.js.map +1 -0
- package/3D/materials/handle/shaders/handle.vertex.d.ts +5 -0
- package/3D/materials/handle/shaders/handle.vertex.js +7 -0
- package/3D/materials/handle/shaders/handle.vertex.js.map +1 -0
- package/3D/materials/index.d.ts +5 -1
- package/3D/materials/index.js +5 -1
- package/3D/materials/index.js.map +1 -1
- package/3D/materials/mrdl/index.d.ts +3 -0
- package/3D/materials/mrdl/index.js +4 -0
- package/3D/materials/mrdl/index.js.map +1 -0
- package/3D/materials/mrdl/mrdlBackplateMaterial.d.ts +147 -0
- package/3D/materials/mrdl/mrdlBackplateMaterial.js +410 -0
- package/3D/materials/mrdl/mrdlBackplateMaterial.js.map +1 -0
- package/3D/materials/mrdl/mrdlSliderBarMaterial.d.ts +333 -0
- package/3D/materials/mrdl/mrdlSliderBarMaterial.js +787 -0
- package/3D/materials/mrdl/mrdlSliderBarMaterial.js.map +1 -0
- package/3D/materials/mrdl/mrdlSliderThumbMaterial.d.ts +333 -0
- package/3D/materials/mrdl/mrdlSliderThumbMaterial.js +787 -0
- package/3D/materials/mrdl/mrdlSliderThumbMaterial.js.map +1 -0
- package/3D/materials/mrdl/shaders/mrdlBackplate.fragment.d.ts +5 -0
- package/3D/materials/mrdl/shaders/mrdlBackplate.fragment.js +7 -0
- package/3D/materials/mrdl/shaders/mrdlBackplate.fragment.js.map +1 -0
- package/3D/materials/mrdl/shaders/mrdlBackplate.vertex.d.ts +5 -0
- package/3D/materials/mrdl/shaders/mrdlBackplate.vertex.js +7 -0
- package/3D/materials/mrdl/shaders/mrdlBackplate.vertex.js.map +1 -0
- package/3D/materials/mrdl/shaders/mrdlSliderBar.fragment.d.ts +5 -0
- package/3D/materials/mrdl/shaders/mrdlSliderBar.fragment.js +7 -0
- package/3D/materials/mrdl/shaders/mrdlSliderBar.fragment.js.map +1 -0
- package/3D/materials/mrdl/shaders/mrdlSliderBar.vertex.d.ts +5 -0
- package/3D/materials/mrdl/shaders/mrdlSliderBar.vertex.js +7 -0
- package/3D/materials/mrdl/shaders/mrdlSliderBar.vertex.js.map +1 -0
- package/3D/materials/mrdl/shaders/mrdlSliderThumb.fragment.d.ts +5 -0
- package/3D/materials/mrdl/shaders/mrdlSliderThumb.fragment.js +7 -0
- package/3D/materials/mrdl/shaders/mrdlSliderThumb.fragment.js.map +1 -0
- package/3D/materials/mrdl/shaders/mrdlSliderThumb.vertex.d.ts +5 -0
- package/3D/materials/mrdl/shaders/mrdlSliderThumb.vertex.js +7 -0
- package/3D/materials/mrdl/shaders/mrdlSliderThumb.vertex.js.map +1 -0
- package/3D/vector3WithInfo.js +1 -1
- package/index.d.ts +2 -2
- package/index.js +2 -2
- package/index.js.map +1 -1
- package/legacy/legacy.js +2 -2
- package/package.json +114 -9
- package/3D/materials/shaders/fluent.fragment.js +0 -7
- package/3D/materials/shaders/fluent.fragment.js.map +0 -1
- package/3D/materials/shaders/fluent.vertex.js.map +0 -1
|
@@ -1,20 +1,10 @@
|
|
|
1
1
|
// Assumptions: absolute position of button mesh is inside the mesh
|
|
2
2
|
import { __extends } from "tslib";
|
|
3
|
-
import { Vector3
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
*/
|
|
9
|
-
var ButtonState;
|
|
10
|
-
(function (ButtonState) {
|
|
11
|
-
/** None */
|
|
12
|
-
ButtonState[ButtonState["None"] = 0] = "None";
|
|
13
|
-
/** Pointer Entered */
|
|
14
|
-
ButtonState[ButtonState["Hover"] = 1] = "Hover";
|
|
15
|
-
/** Pointer Down */
|
|
16
|
-
ButtonState[ButtonState["Press"] = 2] = "Press";
|
|
17
|
-
})(ButtonState || (ButtonState = {}));
|
|
3
|
+
import { Vector3 } from "@babylonjs/core/Maths/math.vector.js";
|
|
4
|
+
import { PointerEventTypes } from "@babylonjs/core/Events/pointerEvents.js";
|
|
5
|
+
import { TmpVectors } from "@babylonjs/core/Maths/math.vector.js";
|
|
6
|
+
import { Observable } from "@babylonjs/core/Misc/observable.js";
|
|
7
|
+
import { Button3D } from "./button3D.js";
|
|
18
8
|
/**
|
|
19
9
|
* Class used to create a touchable button in 3D
|
|
20
10
|
*/
|
|
@@ -27,14 +17,15 @@ var TouchButton3D = /** @class */ (function (_super) {
|
|
|
27
17
|
*/
|
|
28
18
|
function TouchButton3D(name, collisionMesh) {
|
|
29
19
|
var _this = _super.call(this, name) || this;
|
|
30
|
-
_this.
|
|
31
|
-
_this.
|
|
32
|
-
_this.
|
|
33
|
-
_this.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
_this.
|
|
20
|
+
_this._isNearPressed = false;
|
|
21
|
+
_this._isToggleButton = false;
|
|
22
|
+
_this._toggleState = false;
|
|
23
|
+
_this._toggleButtonCallback = function () { _this._onToggle(!_this._toggleState); };
|
|
24
|
+
/**
|
|
25
|
+
* An event triggered when the button is toggled. Only fired if 'isToggleButton' is true
|
|
26
|
+
*/
|
|
27
|
+
_this.onToggleObservable = new Observable();
|
|
28
|
+
_this.collidableFrontDirection = Vector3.Zero();
|
|
38
29
|
if (collisionMesh) {
|
|
39
30
|
_this.collisionMesh = collisionMesh;
|
|
40
31
|
}
|
|
@@ -42,246 +33,151 @@ var TouchButton3D = /** @class */ (function (_super) {
|
|
|
42
33
|
}
|
|
43
34
|
Object.defineProperty(TouchButton3D.prototype, "collidableFrontDirection", {
|
|
44
35
|
/**
|
|
45
|
-
*
|
|
36
|
+
* Returns the front-facing direction of the button, or Vector3.Zero if there is no 'front'
|
|
37
|
+
*/
|
|
38
|
+
get: function () {
|
|
39
|
+
if (this._collisionMesh) {
|
|
40
|
+
// Update the front direction to reflect any rotations of the collision mesh
|
|
41
|
+
var transformedDirection = TmpVectors.Vector3[0];
|
|
42
|
+
Vector3.TransformNormalToRef(this._collidableFrontDirection, this._collisionMesh.getWorldMatrix(), transformedDirection);
|
|
43
|
+
return transformedDirection.normalize();
|
|
44
|
+
}
|
|
45
|
+
return this._collidableFrontDirection;
|
|
46
|
+
},
|
|
47
|
+
/**
|
|
48
|
+
* Sets the front-facing direction of the button. Pass in Vector3.Zero to allow interactions from any direction
|
|
46
49
|
* @param frontDir the forward direction of the button
|
|
47
50
|
*/
|
|
48
51
|
set: function (frontWorldDir) {
|
|
49
52
|
this._collidableFrontDirection = frontWorldDir.normalize();
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
+
if (this._collisionMesh) {
|
|
54
|
+
var invert = TmpVectors.Matrix[0];
|
|
55
|
+
invert.copyFrom(this._collisionMesh.getWorldMatrix());
|
|
56
|
+
invert.invert();
|
|
57
|
+
Vector3.TransformNormalToRef(this._collidableFrontDirection, invert, this._collidableFrontDirection);
|
|
58
|
+
this._collidableFrontDirection.normalize();
|
|
59
|
+
}
|
|
53
60
|
},
|
|
54
61
|
enumerable: false,
|
|
55
62
|
configurable: true
|
|
56
63
|
});
|
|
57
|
-
TouchButton3D.prototype._getWorldMatrixData = function (mesh) {
|
|
58
|
-
var translation = Vector3.Zero();
|
|
59
|
-
var rotation = Quaternion.Identity();
|
|
60
|
-
var scale = Vector3.Zero();
|
|
61
|
-
mesh.getWorldMatrix().decompose(scale, rotation, translation);
|
|
62
|
-
return { translation: translation, rotation: rotation, scale: scale };
|
|
63
|
-
};
|
|
64
64
|
Object.defineProperty(TouchButton3D.prototype, "collisionMesh", {
|
|
65
65
|
/**
|
|
66
66
|
* Sets the mesh used for testing input collision
|
|
67
67
|
* @param collisionMesh the new collision mesh for the button
|
|
68
68
|
*/
|
|
69
69
|
set: function (collisionMesh) {
|
|
70
|
+
var _this = this;
|
|
71
|
+
var _a;
|
|
72
|
+
// Remove the GUI3DManager's data from the previous collision mesh's reserved data store, and reset interactability
|
|
70
73
|
if (this._collisionMesh) {
|
|
71
|
-
this._collisionMesh.
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
74
|
+
this._collisionMesh.isNearPickable = false;
|
|
75
|
+
if ((_a = this._collisionMesh.reservedDataStore) === null || _a === void 0 ? void 0 : _a.GUI3D) {
|
|
76
|
+
this._collisionMesh.reservedDataStore.GUI3D = {};
|
|
77
|
+
}
|
|
78
|
+
this._collisionMesh.getChildMeshes().forEach(function (mesh) {
|
|
79
|
+
var _a;
|
|
80
|
+
mesh.isNearPickable = false;
|
|
81
|
+
if ((_a = mesh.reservedDataStore) === null || _a === void 0 ? void 0 : _a.GUI3D) {
|
|
82
|
+
mesh.reservedDataStore.GUI3D = {};
|
|
83
|
+
}
|
|
84
|
+
});
|
|
76
85
|
}
|
|
77
86
|
this._collisionMesh = collisionMesh;
|
|
78
|
-
this._collisionMesh.
|
|
87
|
+
this._injectGUI3DReservedDataStore(this._collisionMesh).control = this;
|
|
88
|
+
this._collisionMesh.isNearPickable = true;
|
|
89
|
+
this._collisionMesh.getChildMeshes().forEach(function (mesh) {
|
|
90
|
+
_this._injectGUI3DReservedDataStore(mesh).control = _this;
|
|
91
|
+
mesh.isNearPickable = true;
|
|
92
|
+
});
|
|
79
93
|
this.collidableFrontDirection = collisionMesh.forward;
|
|
80
|
-
this._collidableInitialized = true;
|
|
81
94
|
},
|
|
82
95
|
enumerable: false,
|
|
83
96
|
configurable: true
|
|
84
97
|
});
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
var cross = lineDirection.cross(pointToLine);
|
|
97
|
-
return cross.length();
|
|
98
|
-
};
|
|
99
|
-
/*
|
|
100
|
-
* Checks to see if collidable is in a position to interact with the button
|
|
101
|
-
* - check if collidable has a plane height off the button that is within range
|
|
102
|
-
* - check that collidable + normal ray intersect the bounding sphere
|
|
103
|
-
*/
|
|
104
|
-
TouchButton3D.prototype._isPrimedForInteraction = function (collidable) {
|
|
105
|
-
// Check if the collidable has an appropriate planar height
|
|
106
|
-
var heightFromCenter = this._getHeightFromButtonCenter(collidable);
|
|
107
|
-
if (heightFromCenter > this._hoverOffset || heightFromCenter < this._pushThroughBackOffset) {
|
|
108
|
-
return false;
|
|
109
|
-
}
|
|
110
|
-
// Check if the collidable or its hover ray lands within the bounding sphere of the button
|
|
111
|
-
var distanceFromCenter = this._getShortestDistancePointToLine(this._collisionMesh.getAbsolutePosition(), collidable, this._collidableFrontDirection);
|
|
112
|
-
return distanceFromCenter <= this._collisionMesh.getBoundingInfo().boundingSphere.radiusWorld;
|
|
113
|
-
};
|
|
114
|
-
/*
|
|
115
|
-
* Returns a Vector3 of the collidable's projected position on the button
|
|
116
|
-
* Returns the collidable's position if it is inside the button
|
|
117
|
-
*/
|
|
118
|
-
TouchButton3D.prototype._getPointOnButton = function (collidable) {
|
|
119
|
-
var heightFromCenter = this._getHeightFromButtonCenter(collidable);
|
|
120
|
-
if (heightFromCenter <= this._frontOffset && heightFromCenter >= this._backOffset) {
|
|
121
|
-
// The collidable is in the button, return its position
|
|
122
|
-
return collidable;
|
|
123
|
-
}
|
|
124
|
-
else if (heightFromCenter > this._frontOffset) {
|
|
125
|
-
// The collidable is in front of the button, project it to the surface
|
|
126
|
-
var collidableDistanceToFront = (this._frontOffset - heightFromCenter);
|
|
127
|
-
return collidable.add(this._collidableFrontDirection.scale(collidableDistanceToFront));
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
// The collidable is behind the button, project it to its back
|
|
131
|
-
var collidableDistanceToBack = (this._backOffset - heightFromCenter);
|
|
132
|
-
return collidable.add(this._collidableFrontDirection.scale(collidableDistanceToBack));
|
|
133
|
-
}
|
|
134
|
-
};
|
|
135
|
-
/*
|
|
136
|
-
* Updates the distance values.
|
|
137
|
-
* Should be called when the front direction changes, or the mesh size changes
|
|
138
|
-
*
|
|
139
|
-
* Sets the following values:
|
|
140
|
-
* _frontOffset
|
|
141
|
-
* _backOffset
|
|
142
|
-
* _hoverOffset
|
|
143
|
-
* _pushThroughBackOffset
|
|
144
|
-
*
|
|
145
|
-
* Requires population of:
|
|
146
|
-
* _collisionMesh
|
|
147
|
-
* _collidableFrontDirection
|
|
148
|
-
*/
|
|
149
|
-
TouchButton3D.prototype._updateDistanceOffsets = function () {
|
|
150
|
-
var worldMatrixData = this._getWorldMatrixData(this._collisionMesh);
|
|
151
|
-
if (!worldMatrixData.scale.equalsWithEpsilon(this._lastKnownCollidableScale)) {
|
|
152
|
-
var collisionMeshPos = this._collisionMesh.getAbsolutePosition();
|
|
153
|
-
this._tempButtonForwardRay.origin = collisionMeshPos;
|
|
154
|
-
this._tempButtonForwardRay.direction = this._collidableFrontDirection;
|
|
155
|
-
var frontPickingInfo = this._tempButtonForwardRay.intersectsMesh(this._collisionMesh);
|
|
156
|
-
this._tempButtonForwardRay.direction = this._tempButtonForwardRay.direction.negate();
|
|
157
|
-
var backPickingInfo = this._tempButtonForwardRay.intersectsMesh(this._collisionMesh);
|
|
158
|
-
this._frontOffset = 0;
|
|
159
|
-
this._backOffset = 0;
|
|
160
|
-
if (frontPickingInfo.hit && backPickingInfo.hit) {
|
|
161
|
-
this._frontOffset = this._getDistanceOffPlane(frontPickingInfo.pickedPoint, this._collidableFrontDirection, collisionMeshPos);
|
|
162
|
-
this._backOffset = this._getDistanceOffPlane(backPickingInfo.pickedPoint, this._collidableFrontDirection, collisionMeshPos);
|
|
98
|
+
Object.defineProperty(TouchButton3D.prototype, "isToggleButton", {
|
|
99
|
+
get: function () {
|
|
100
|
+
return this._isToggleButton;
|
|
101
|
+
},
|
|
102
|
+
/**
|
|
103
|
+
* Setter for if this TouchButton3D should be treated as a toggle button
|
|
104
|
+
* @param value If this TouchHolographicButton should act like a toggle button
|
|
105
|
+
*/
|
|
106
|
+
set: function (value) {
|
|
107
|
+
if (value === this._isToggleButton) {
|
|
108
|
+
return;
|
|
163
109
|
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
this._pushThroughBackOffset = this._backOffset - (buttonThickness * 1.5);
|
|
168
|
-
this._lastKnownCollidableScale = this._getWorldMatrixData(this._collisionMesh).scale;
|
|
169
|
-
}
|
|
170
|
-
};
|
|
171
|
-
// Returns the distance in front of the center of the button
|
|
172
|
-
// Returned value is negative when collidable is past the center
|
|
173
|
-
TouchButton3D.prototype._getHeightFromButtonCenter = function (collidablePos) {
|
|
174
|
-
return this._getDistanceOffPlane(collidablePos, this._collidableFrontDirection, this._collisionMesh.getAbsolutePosition());
|
|
175
|
-
};
|
|
176
|
-
// Returns the distance from pointOnPlane to point along planeNormal
|
|
177
|
-
TouchButton3D.prototype._getDistanceOffPlane = function (point, planeNormal, pointOnPlane) {
|
|
178
|
-
var d = Vector3.Dot(pointOnPlane, planeNormal);
|
|
179
|
-
var abc = Vector3.Dot(point, planeNormal);
|
|
180
|
-
return abc - d;
|
|
181
|
-
};
|
|
182
|
-
// Updates the stored state of the button, and fire pointer events
|
|
183
|
-
TouchButton3D.prototype._updateButtonState = function (id, newState, pointOnButton) {
|
|
184
|
-
var dummyPointerId = 0;
|
|
185
|
-
var buttonIndex = 0; // Left click
|
|
186
|
-
var buttonStateForId = this._activeInteractions.get(id) || ButtonState.None;
|
|
187
|
-
// Take into account all inputs interacting with the button to avoid state flickering
|
|
188
|
-
var previousPushDepth = 0;
|
|
189
|
-
this._activeInteractions.forEach(function (value, key) {
|
|
190
|
-
previousPushDepth = Math.max(previousPushDepth, value);
|
|
191
|
-
});
|
|
192
|
-
if (buttonStateForId != newState) {
|
|
193
|
-
if (newState == ButtonState.None) {
|
|
194
|
-
this._activeInteractions.delete(id);
|
|
110
|
+
this._isToggleButton = value;
|
|
111
|
+
if (value) {
|
|
112
|
+
this.onPointerUpObservable.add(this._toggleButtonCallback);
|
|
195
113
|
}
|
|
196
114
|
else {
|
|
197
|
-
this.
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
newPushDepth = Math.max(newPushDepth, value);
|
|
203
|
-
});
|
|
204
|
-
if (newPushDepth == ButtonState.Press) {
|
|
205
|
-
if (previousPushDepth == ButtonState.Hover) {
|
|
206
|
-
this._onPointerDown(this, pointOnButton, dummyPointerId, buttonIndex);
|
|
115
|
+
this.onPointerUpObservable.removeCallback(this._toggleButtonCallback);
|
|
116
|
+
// Safety check, reset the button if it's toggled on but no longer a toggle button
|
|
117
|
+
if (this._toggleState) {
|
|
118
|
+
this._onToggle(false);
|
|
119
|
+
}
|
|
207
120
|
}
|
|
208
|
-
|
|
209
|
-
|
|
121
|
+
},
|
|
122
|
+
enumerable: false,
|
|
123
|
+
configurable: true
|
|
124
|
+
});
|
|
125
|
+
Object.defineProperty(TouchButton3D.prototype, "isToggled", {
|
|
126
|
+
get: function () {
|
|
127
|
+
return this._toggleState;
|
|
128
|
+
},
|
|
129
|
+
/**
|
|
130
|
+
* A public entrypoint to set the toggle state of the TouchHolographicButton. Only works if 'isToggleButton' is true
|
|
131
|
+
* @param newState The new state to set the TouchHolographicButton's toggle state to
|
|
132
|
+
*/
|
|
133
|
+
set: function (newState) {
|
|
134
|
+
if (this._isToggleButton && this._toggleState !== newState) {
|
|
135
|
+
this._onToggle(newState);
|
|
210
136
|
}
|
|
137
|
+
},
|
|
138
|
+
enumerable: false,
|
|
139
|
+
configurable: true
|
|
140
|
+
});
|
|
141
|
+
TouchButton3D.prototype._onToggle = function (newState) {
|
|
142
|
+
this._toggleState = newState;
|
|
143
|
+
this.onToggleObservable.notifyObservers(newState);
|
|
144
|
+
};
|
|
145
|
+
// Returns true if the collidable is in front of the button, or if the button has no front direction
|
|
146
|
+
TouchButton3D.prototype._isInteractionInFrontOfButton = function (collidablePos) {
|
|
147
|
+
return this._getInteractionHeight(collidablePos, this._collisionMesh.getAbsolutePosition()) > 0;
|
|
148
|
+
};
|
|
149
|
+
// Returns true if the collidable is in front of the button, or if the button has no front direction
|
|
150
|
+
TouchButton3D.prototype._getInteractionHeight = function (interactionPos, basePos) {
|
|
151
|
+
var frontDir = this.collidableFrontDirection;
|
|
152
|
+
if (frontDir.length() === 0) {
|
|
153
|
+
// The button has no front, just return the distance to the base
|
|
154
|
+
return Vector3.Distance(interactionPos, basePos);
|
|
211
155
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
156
|
+
var d = Vector3.Dot(basePos, frontDir);
|
|
157
|
+
var abc = Vector3.Dot(interactionPos, frontDir);
|
|
158
|
+
return abc - d;
|
|
159
|
+
};
|
|
160
|
+
/** @hidden */
|
|
161
|
+
TouchButton3D.prototype._generatePointerEventType = function (providedType, nearMeshPosition, activeInteractionCount) {
|
|
162
|
+
if (providedType === PointerEventTypes.POINTERDOWN) {
|
|
163
|
+
if (!this._isInteractionInFrontOfButton(nearMeshPosition)) {
|
|
164
|
+
// Near interaction mesh is behind the button, don't send a pointer down
|
|
165
|
+
return PointerEventTypes.POINTERMOVE;
|
|
218
166
|
}
|
|
219
167
|
else {
|
|
220
|
-
this.
|
|
168
|
+
this._isNearPressed = true;
|
|
221
169
|
}
|
|
222
170
|
}
|
|
223
|
-
|
|
224
|
-
if (
|
|
225
|
-
|
|
171
|
+
if (providedType === PointerEventTypes.POINTERUP) {
|
|
172
|
+
if (activeInteractionCount == 0) {
|
|
173
|
+
// We get the release for the down we swallowed earlier, swallow as well
|
|
174
|
+
return PointerEventTypes.POINTERMOVE;
|
|
226
175
|
}
|
|
227
|
-
else
|
|
228
|
-
this.
|
|
229
|
-
this._onPointerOut(this);
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
};
|
|
233
|
-
// Decides whether to change button state based on the planar depth of the input source
|
|
234
|
-
/** @hidden */
|
|
235
|
-
TouchButton3D.prototype._collisionCheckForStateChange = function (mesh) {
|
|
236
|
-
if (this._collidableInitialized) {
|
|
237
|
-
this._updateDistanceOffsets();
|
|
238
|
-
var collidablePosition = mesh.getAbsolutePosition();
|
|
239
|
-
var inRange = this._isPrimedForInteraction(collidablePosition);
|
|
240
|
-
var uniqueId = mesh.uniqueId;
|
|
241
|
-
var activeInteraction = this._activeInteractions.get(uniqueId);
|
|
242
|
-
if (inRange) {
|
|
243
|
-
var pointOnButton = this._getPointOnButton(collidablePosition);
|
|
244
|
-
var heightFromCenter_1 = this._getHeightFromButtonCenter(collidablePosition);
|
|
245
|
-
var flickerDelta_1 = 0.003;
|
|
246
|
-
this._lastTouchPoint = pointOnButton;
|
|
247
|
-
var isGreater = function (compareHeight) {
|
|
248
|
-
return heightFromCenter_1 >= (compareHeight + flickerDelta_1);
|
|
249
|
-
};
|
|
250
|
-
var isLower = function (compareHeight) {
|
|
251
|
-
return heightFromCenter_1 <= (compareHeight - flickerDelta_1);
|
|
252
|
-
};
|
|
253
|
-
// Update button state and fire events
|
|
254
|
-
switch (activeInteraction || ButtonState.None) {
|
|
255
|
-
case ButtonState.None:
|
|
256
|
-
if (isGreater(this._frontOffset) &&
|
|
257
|
-
isLower(this._hoverOffset)) {
|
|
258
|
-
this._updateButtonState(uniqueId, ButtonState.Hover, pointOnButton);
|
|
259
|
-
}
|
|
260
|
-
break;
|
|
261
|
-
case ButtonState.Hover:
|
|
262
|
-
if (isGreater(this._hoverOffset)) {
|
|
263
|
-
this._updateButtonState(uniqueId, ButtonState.None, pointOnButton);
|
|
264
|
-
}
|
|
265
|
-
else if (isLower(this._frontOffset)) {
|
|
266
|
-
this._updateButtonState(uniqueId, ButtonState.Press, pointOnButton);
|
|
267
|
-
}
|
|
268
|
-
break;
|
|
269
|
-
case ButtonState.Press:
|
|
270
|
-
if (isGreater(this._frontOffset)) {
|
|
271
|
-
this._updateButtonState(uniqueId, ButtonState.Hover, pointOnButton);
|
|
272
|
-
}
|
|
273
|
-
else if (isLower(this._pushThroughBackOffset)) {
|
|
274
|
-
this._updateButtonState(uniqueId, ButtonState.None, pointOnButton);
|
|
275
|
-
}
|
|
276
|
-
break;
|
|
277
|
-
}
|
|
278
|
-
this._previousHeight.set(uniqueId, heightFromCenter_1);
|
|
279
|
-
}
|
|
280
|
-
else if ((activeInteraction != undefined) && (activeInteraction != ButtonState.None)) {
|
|
281
|
-
this._updateButtonState(uniqueId, ButtonState.None, this._lastTouchPoint);
|
|
282
|
-
this._previousHeight.delete(uniqueId);
|
|
176
|
+
else {
|
|
177
|
+
this._isNearPressed = false;
|
|
283
178
|
}
|
|
284
179
|
}
|
|
180
|
+
return providedType;
|
|
285
181
|
};
|
|
286
182
|
TouchButton3D.prototype._getTypeName = function () {
|
|
287
183
|
return "TouchButton3D";
|
|
@@ -295,6 +191,9 @@ var TouchButton3D = /** @class */ (function (_super) {
|
|
|
295
191
|
*/
|
|
296
192
|
TouchButton3D.prototype.dispose = function () {
|
|
297
193
|
_super.prototype.dispose.call(this);
|
|
194
|
+
// Clean up toggle observables
|
|
195
|
+
this.onPointerUpObservable.removeCallback(this._toggleButtonCallback);
|
|
196
|
+
this.onToggleObservable.clear();
|
|
298
197
|
if (this._collisionMesh) {
|
|
299
198
|
this._collisionMesh.dispose();
|
|
300
199
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"touchButton3D.js","sourceRoot":"","sources":["../../../../sourceES6/gui/src/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 { DeepImmutableObject } from \"@babylonjs/core/types\";\r\nimport { Vector3, Quaternion } from \"@babylonjs/core/Maths/math.vector\";\r\nimport { Mesh } from \"@babylonjs/core/Meshes/mesh\";\r\nimport { AbstractMesh } from \"@babylonjs/core/Meshes/abstractMesh\";\r\nimport { TransformNode } from \"@babylonjs/core/Meshes/transformNode\";\r\nimport { Scene } from \"@babylonjs/core/scene\";\r\nimport { Ray } from \"@babylonjs/core/Culling/ray\";\r\n\r\nimport { Button3D } from \"./button3D\";\r\n\r\n/**\r\n * Enum for Button States\r\n */\r\nenum ButtonState {\r\n /** None */\r\n None = 0,\r\n /** Pointer Entered */\r\n Hover = 1,\r\n /** Pointer Down */\r\n Press = 2\r\n}\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 private _collidableFrontDirection: Vector3;\r\n private _lastTouchPoint: Vector3;\r\n private _tempButtonForwardRay: Ray;\r\n private _lastKnownCollidableScale: Vector3;\r\n\r\n private _collidableInitialized = false;\r\n\r\n private _frontOffset = 0;\r\n private _backOffset = 0;\r\n private _hoverOffset = 0;\r\n private _pushThroughBackOffset = 0;\r\n\r\n private _activeInteractions = new Map<number, ButtonState>();\r\n private _previousHeight = new Map<number, number>();\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._tempButtonForwardRay = new Ray(Vector3.Zero(), Vector3.Zero());\r\n\r\n if (collisionMesh) {\r\n this.collisionMesh = collisionMesh;\r\n }\r\n }\r\n\r\n /**\r\n * Sets the front-facing direction of the button\r\n * @param frontDir 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 // Zero out the scale to force it to be proplerly updated in _updateDistanceOffsets\r\n this._lastKnownCollidableScale = Vector3.Zero();\r\n\r\n this._updateDistanceOffsets();\r\n }\r\n\r\n private _getWorldMatrixData(mesh: Mesh) {\r\n let translation = Vector3.Zero();\r\n let rotation = Quaternion.Identity();\r\n let scale = Vector3.Zero();\r\n\r\n mesh.getWorldMatrix().decompose(scale, rotation, translation);\r\n\r\n return {translation: translation, rotation: rotation, scale: scale};\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 if (this._collisionMesh) {\r\n this._collisionMesh.dispose();\r\n }\r\n\r\n // parent the mesh to sync transforms\r\n if (!collisionMesh.parent && this.mesh) {\r\n collisionMesh.setParent(this.mesh);\r\n }\r\n\r\n this._collisionMesh = collisionMesh;\r\n this._collisionMesh.metadata = this;\r\n\r\n this.collidableFrontDirection = collisionMesh.forward;\r\n\r\n this._collidableInitialized = true;\r\n }\r\n\r\n /*\r\n * Given a point, and two points on a line, this returns the distance between\r\n * the point and the closest point on the line. The closest point on the line\r\n * does not have to be between the two given points.\r\n *\r\n * Based off the 3D point-line distance equation\r\n *\r\n * Assumes lineDirection is normalized\r\n */\r\n private _getShortestDistancePointToLine(point: Vector3, linePoint: Vector3, lineDirection: Vector3) {\r\n const pointToLine = linePoint.subtract(point);\r\n const cross = lineDirection.cross(pointToLine);\r\n\r\n return cross.length();\r\n }\r\n\r\n /*\r\n * Checks to see if collidable is in a position to interact with the button\r\n * - check if collidable has a plane height off the button that is within range\r\n * - check that collidable + normal ray intersect the bounding sphere\r\n */\r\n private _isPrimedForInteraction(collidable: Vector3): boolean {\r\n // Check if the collidable has an appropriate planar height\r\n const heightFromCenter = this._getHeightFromButtonCenter(collidable);\r\n\r\n if (heightFromCenter > this._hoverOffset || heightFromCenter < this._pushThroughBackOffset) {\r\n return false;\r\n }\r\n\r\n // Check if the collidable or its hover ray lands within the bounding sphere of the button\r\n const distanceFromCenter = this._getShortestDistancePointToLine(this._collisionMesh.getAbsolutePosition(),\r\n collidable,\r\n this._collidableFrontDirection);\r\n return distanceFromCenter <= this._collisionMesh.getBoundingInfo().boundingSphere.radiusWorld;\r\n }\r\n\r\n /*\r\n * Returns a Vector3 of the collidable's projected position on the button\r\n * Returns the collidable's position if it is inside the button\r\n */\r\n private _getPointOnButton(collidable: Vector3): Vector3 {\r\n const heightFromCenter = this._getHeightFromButtonCenter(collidable);\r\n\r\n if (heightFromCenter <= this._frontOffset && heightFromCenter >= this._backOffset) {\r\n // The collidable is in the button, return its position\r\n return collidable;\r\n }\r\n else if (heightFromCenter > this._frontOffset) {\r\n // The collidable is in front of the button, project it to the surface\r\n const collidableDistanceToFront = (this._frontOffset - heightFromCenter);\r\n return collidable.add(this._collidableFrontDirection.scale(collidableDistanceToFront));\r\n }\r\n else {\r\n // The collidable is behind the button, project it to its back\r\n const collidableDistanceToBack = (this._backOffset - heightFromCenter);\r\n return collidable.add(this._collidableFrontDirection.scale(collidableDistanceToBack));\r\n }\r\n }\r\n\r\n /*\r\n * Updates the distance values.\r\n * Should be called when the front direction changes, or the mesh size changes\r\n *\r\n * Sets the following values:\r\n * _frontOffset\r\n * _backOffset\r\n * _hoverOffset\r\n * _pushThroughBackOffset\r\n *\r\n * Requires population of:\r\n * _collisionMesh\r\n * _collidableFrontDirection\r\n */\r\n private _updateDistanceOffsets() {\r\n let worldMatrixData = this._getWorldMatrixData(this._collisionMesh);\r\n\r\n if (!worldMatrixData.scale.equalsWithEpsilon(this._lastKnownCollidableScale)) {\r\n const collisionMeshPos = this._collisionMesh.getAbsolutePosition();\r\n\r\n this._tempButtonForwardRay.origin = collisionMeshPos;\r\n this._tempButtonForwardRay.direction = this._collidableFrontDirection;\r\n\r\n const frontPickingInfo = this._tempButtonForwardRay.intersectsMesh(this._collisionMesh as DeepImmutableObject<AbstractMesh>);\r\n this._tempButtonForwardRay.direction = this._tempButtonForwardRay.direction.negate();\r\n const backPickingInfo = this._tempButtonForwardRay.intersectsMesh(this._collisionMesh as DeepImmutableObject<AbstractMesh>);\r\n\r\n this._frontOffset = 0;\r\n this._backOffset = 0;\r\n\r\n if (frontPickingInfo.hit && backPickingInfo.hit) {\r\n this._frontOffset = this._getDistanceOffPlane(frontPickingInfo.pickedPoint!,\r\n this._collidableFrontDirection,\r\n collisionMeshPos);\r\n this._backOffset = this._getDistanceOffPlane(backPickingInfo.pickedPoint!,\r\n this._collidableFrontDirection,\r\n collisionMeshPos);\r\n }\r\n\r\n // For now, set the hover height equal to the thickness of the button\r\n const buttonThickness = this._frontOffset - this._backOffset;\r\n\r\n this._hoverOffset = this._frontOffset + (buttonThickness * 1.25);\r\n this._pushThroughBackOffset = this._backOffset - (buttonThickness * 1.5);\r\n\r\n this._lastKnownCollidableScale = this._getWorldMatrixData(this._collisionMesh).scale;\r\n }\r\n }\r\n\r\n // Returns the distance in front of the center of the button\r\n // Returned value is negative when collidable is past the center\r\n private _getHeightFromButtonCenter(collidablePos: Vector3) {\r\n return this._getDistanceOffPlane(collidablePos, this._collidableFrontDirection, this._collisionMesh.getAbsolutePosition());\r\n }\r\n\r\n // Returns the distance from pointOnPlane to point along planeNormal\r\n private _getDistanceOffPlane(point: Vector3, planeNormal: Vector3, pointOnPlane: Vector3) {\r\n const d = Vector3.Dot(pointOnPlane, planeNormal);\r\n const abc = Vector3.Dot(point, planeNormal);\r\n\r\n return abc - d;\r\n }\r\n\r\n // Updates the stored state of the button, and fire pointer events\r\n private _updateButtonState(id: number, newState: ButtonState, pointOnButton: Vector3) {\r\n const dummyPointerId = 0;\r\n const buttonIndex = 0; // Left click\r\n const buttonStateForId = this._activeInteractions.get(id) || ButtonState.None;\r\n\r\n // Take into account all inputs interacting with the button to avoid state flickering\r\n let previousPushDepth = 0;\r\n this._activeInteractions.forEach(function(value, key) {\r\n previousPushDepth = Math.max(previousPushDepth, value);\r\n });\r\n\r\n if (buttonStateForId != newState) {\r\n if (newState == ButtonState.None) {\r\n this._activeInteractions.delete(id);\r\n }\r\n else {\r\n this._activeInteractions.set(id, newState);\r\n }\r\n }\r\n\r\n let newPushDepth = 0;\r\n this._activeInteractions.forEach(function(value, key) {\r\n newPushDepth = Math.max(newPushDepth, value);\r\n });\r\n\r\n if (newPushDepth == ButtonState.Press) {\r\n if (previousPushDepth == ButtonState.Hover) {\r\n this._onPointerDown(this, pointOnButton, dummyPointerId, buttonIndex);\r\n }\r\n else if (previousPushDepth == ButtonState.Press) {\r\n this._onPointerMove(this, pointOnButton);\r\n }\r\n }\r\n else if (newPushDepth == ButtonState.Hover) {\r\n if (previousPushDepth == ButtonState.None) {\r\n this._onPointerEnter(this);\r\n }\r\n else if (previousPushDepth == ButtonState.Press) {\r\n this._onPointerUp(this, pointOnButton, dummyPointerId, buttonIndex, false);\r\n }\r\n else {\r\n this._onPointerMove(this, pointOnButton);\r\n }\r\n }\r\n else if (newPushDepth == ButtonState.None) {\r\n if (previousPushDepth == ButtonState.Hover) {\r\n this._onPointerOut(this);\r\n }\r\n else if (previousPushDepth == ButtonState.Press) {\r\n this._onPointerUp(this, pointOnButton, dummyPointerId, buttonIndex, false);\r\n this._onPointerOut(this);\r\n }\r\n }\r\n }\r\n\r\n // Decides whether to change button state based on the planar depth of the input source\r\n /** @hidden */\r\n public _collisionCheckForStateChange(mesh: AbstractMesh) {\r\n if (this._collidableInitialized) {\r\n this._updateDistanceOffsets();\r\n\r\n const collidablePosition = mesh.getAbsolutePosition();\r\n const inRange = this._isPrimedForInteraction(collidablePosition);\r\n\r\n const uniqueId = mesh.uniqueId;\r\n\r\n let activeInteraction = this._activeInteractions.get(uniqueId);\r\n if (inRange) {\r\n const pointOnButton = this._getPointOnButton(collidablePosition);\r\n const heightFromCenter = this._getHeightFromButtonCenter(collidablePosition);\r\n const flickerDelta = 0.003;\r\n\r\n this._lastTouchPoint = pointOnButton;\r\n\r\n const isGreater = function (compareHeight: number) {\r\n return heightFromCenter >= (compareHeight + flickerDelta);\r\n };\r\n\r\n const isLower = function (compareHeight: number) {\r\n return heightFromCenter <= (compareHeight - flickerDelta);\r\n };\r\n\r\n // Update button state and fire events\r\n switch (activeInteraction || ButtonState.None) {\r\n case ButtonState.None:\r\n if (isGreater(this._frontOffset) &&\r\n isLower(this._hoverOffset)) {\r\n this._updateButtonState(uniqueId, ButtonState.Hover, pointOnButton);\r\n }\r\n\r\n break;\r\n case ButtonState.Hover:\r\n if (isGreater(this._hoverOffset)) {\r\n this._updateButtonState(uniqueId, ButtonState.None, pointOnButton);\r\n }\r\n else if (isLower(this._frontOffset)) {\r\n this._updateButtonState(uniqueId, ButtonState.Press, pointOnButton);\r\n }\r\n\r\n break;\r\n case ButtonState.Press:\r\n if (isGreater(this._frontOffset)) {\r\n this._updateButtonState(uniqueId, ButtonState.Hover, pointOnButton);\r\n }\r\n else if (isLower(this._pushThroughBackOffset)) {\r\n this._updateButtonState(uniqueId, ButtonState.None, pointOnButton);\r\n }\r\n\r\n break;\r\n }\r\n\r\n this._previousHeight.set(uniqueId, heightFromCenter);\r\n }\r\n else if ((activeInteraction != undefined) && (activeInteraction != ButtonState.None)) {\r\n this._updateButtonState(uniqueId, ButtonState.None, this._lastTouchPoint);\r\n this._previousHeight.delete(uniqueId);\r\n }\r\n }\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 if (this._collisionMesh) {\r\n this._collisionMesh.dispose();\r\n }\r\n }\r\n}"]}
|
|
1
|
+
{"version":3,"file":"touchButton3D.js","sourceRoot":"","sources":["../../../../sourceES6/gui/src/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 } from \"@babylonjs/core/Maths/math.vector\";\r\nimport { Mesh } from \"@babylonjs/core/Meshes/mesh\";\r\nimport { PointerEventTypes } from \"@babylonjs/core/Events/pointerEvents\";\r\nimport { TransformNode } from \"@babylonjs/core/Meshes/transformNode\";\r\nimport { Scene } from \"@babylonjs/core/scene\";\r\nimport { TmpVectors } from \"@babylonjs/core/Maths/math.vector\";\r\nimport { Observable } from \"@babylonjs/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 protected _isNearPressed = false;\r\n\r\n private _isToggleButton = false;\r\n private _toggleState = false;\r\n private _toggleButtonCallback = () => { this._onToggle(!this._toggleState); };\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 * Sets the front-facing direction of the button. Pass in Vector3.Zero to allow interactions from any direction\r\n * @param frontDir 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 }\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 // 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 /** @hidden */\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 }\r\n else {\r\n this._isNearPressed = true;\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 }\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}"]}
|
|
@@ -3,23 +3,39 @@ import { StandardMaterial } from "@babylonjs/core/Materials/standardMaterial";
|
|
|
3
3
|
import { TransformNode } from "@babylonjs/core/Meshes/transformNode";
|
|
4
4
|
import { Mesh } from "@babylonjs/core/Meshes/mesh";
|
|
5
5
|
import { Scene } from "@babylonjs/core/scene";
|
|
6
|
-
import { FluentMaterial } from "../materials/fluentMaterial";
|
|
6
|
+
import { FluentMaterial } from "../materials/fluent/fluentMaterial";
|
|
7
|
+
import { FluentButtonMaterial } from "../materials/fluentButton/fluentButtonMaterial";
|
|
7
8
|
import { AdvancedDynamicTexture } from "../../2D/advancedDynamicTexture";
|
|
8
9
|
import { TouchButton3D } from "./touchButton3D";
|
|
9
10
|
/**
|
|
10
11
|
* Class used to create a holographic button in 3D
|
|
12
|
+
* @since 5.0.0
|
|
11
13
|
*/
|
|
12
14
|
export declare class TouchHolographicButton extends TouchButton3D {
|
|
15
|
+
/**
|
|
16
|
+
* Base Url for the button model.
|
|
17
|
+
*/
|
|
18
|
+
static MODEL_BASE_URL: string;
|
|
19
|
+
/**
|
|
20
|
+
* File name for the button model.
|
|
21
|
+
*/
|
|
22
|
+
static MODEL_FILENAME: string;
|
|
13
23
|
private _backPlate;
|
|
14
24
|
private _textPlate;
|
|
15
25
|
private _frontPlate;
|
|
16
26
|
private _text;
|
|
17
27
|
private _imageUrl;
|
|
18
28
|
private _shareMaterials;
|
|
29
|
+
private _isBackplateVisible;
|
|
19
30
|
private _frontMaterial;
|
|
20
31
|
private _backMaterial;
|
|
21
32
|
private _plateMaterial;
|
|
22
33
|
private _pickedPointObserver;
|
|
34
|
+
private _pointerHoverObserver;
|
|
35
|
+
private _frontPlateDepth;
|
|
36
|
+
private _backPlateDepth;
|
|
37
|
+
private _backplateColor;
|
|
38
|
+
private _backplateToggledColor;
|
|
23
39
|
private _tooltipFade;
|
|
24
40
|
private _tooltipTextBlock;
|
|
25
41
|
private _tooltipTexture;
|
|
@@ -54,7 +70,7 @@ export declare class TouchHolographicButton extends TouchButton3D {
|
|
|
54
70
|
/**
|
|
55
71
|
* Gets the front material used by this button
|
|
56
72
|
*/
|
|
57
|
-
get frontMaterial():
|
|
73
|
+
get frontMaterial(): FluentButtonMaterial;
|
|
58
74
|
/**
|
|
59
75
|
* Gets the plate material used by this button
|
|
60
76
|
*/
|
|
@@ -63,6 +79,10 @@ export declare class TouchHolographicButton extends TouchButton3D {
|
|
|
63
79
|
* Gets a boolean indicating if this button shares its material with other HolographicButtons
|
|
64
80
|
*/
|
|
65
81
|
get shareMaterials(): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Sets whether the backplate is visible or hidden. Hiding the backplate is not recommended without some sort of replacement
|
|
84
|
+
*/
|
|
85
|
+
set isBackplateVisible(isVisible: boolean);
|
|
66
86
|
/**
|
|
67
87
|
* Creates a new button
|
|
68
88
|
* @param name defines the control name
|
|
@@ -75,6 +95,7 @@ export declare class TouchHolographicButton extends TouchButton3D {
|
|
|
75
95
|
private _createBackMaterial;
|
|
76
96
|
private _createFrontMaterial;
|
|
77
97
|
private _createPlateMaterial;
|
|
98
|
+
protected _onToggle(newState: boolean): void;
|
|
78
99
|
protected _affectMaterial(mesh: Mesh): void;
|
|
79
100
|
/**
|
|
80
101
|
* Releases all associated resources
|