@babylonjs/gui 5.0.0-beta.8 → 5.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/2D/advancedDynamicTexture.d.ts +11 -0
- package/2D/advancedDynamicTexture.js +95 -48
- package/2D/advancedDynamicTexture.js.map +1 -1
- package/2D/controls/container.d.ts +1 -1
- package/2D/controls/container.js.map +1 -1
- package/2D/controls/control.d.ts +7 -7
- package/2D/controls/control.js +12 -12
- package/2D/controls/control.js.map +1 -1
- package/2D/controls/inputText.d.ts +2 -0
- package/2D/controls/inputText.js +2 -1
- package/2D/controls/inputText.js.map +1 -1
- package/2D/controls/sliders/baseSlider.js +1 -1
- package/2D/controls/sliders/baseSlider.js.map +1 -1
- package/2D/controls/textBlock.d.ts +1 -0
- package/2D/controls/textBlock.js +17 -7
- package/2D/controls/textBlock.js.map +1 -1
- package/2D/xmlLoader.js +8 -1
- package/2D/xmlLoader.js.map +1 -1
- package/3D/controls/contentDisplay3D.js +1 -1
- package/3D/controls/contentDisplay3D.js.map +1 -1
- package/3D/controls/holographicSlate.d.ts +45 -35
- package/3D/controls/holographicSlate.js +172 -113
- package/3D/controls/holographicSlate.js.map +1 -1
- package/3D/controls/slider3D.d.ts +1 -0
- package/3D/controls/slider3D.js +6 -6
- package/3D/controls/slider3D.js.map +1 -1
- package/3D/controls/touchButton3D.d.ts +12 -1
- package/3D/controls/touchButton3D.js +43 -4
- package/3D/controls/touchButton3D.js.map +1 -1
- package/3D/controls/touchHolographicButton.d.ts +5 -0
- package/3D/controls/touchHolographicButton.js +17 -4
- package/3D/controls/touchHolographicButton.js.map +1 -1
- package/3D/gizmos/slateGizmo.d.ts +2 -4
- package/3D/gizmos/slateGizmo.js +24 -18
- package/3D/gizmos/slateGizmo.js.map +1 -1
- package/3D/gui3DManager.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,19 +1,23 @@
|
|
|
1
1
|
import { __extends } from "tslib";
|
|
2
|
-
import { CreateBox } from "@babylonjs/core/Meshes/Builders/boxBuilder.js";
|
|
3
|
-
import { Mesh } from "@babylonjs/core/Meshes/mesh.js";
|
|
4
|
-
import { FluentMaterial } from "../materials/fluent/fluentMaterial.js";
|
|
5
|
-
import { TouchHolographicButton } from "./touchHolographicButton.js";
|
|
6
|
-
import { Quaternion, Vector2, Vector3 } from "@babylonjs/core/Maths/math.vector.js";
|
|
7
2
|
import { ContentDisplay3D } from "./contentDisplay3D.js";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
3
|
+
import { TouchHolographicButton } from "./touchHolographicButton.js";
|
|
4
|
+
import { AdvancedDynamicTexture } from "../../2D/advancedDynamicTexture.js";
|
|
5
|
+
import { Control } from "../../2D/controls/control.js";
|
|
6
|
+
import { TextBlock, TextWrapping } from "../../2D/controls/textBlock.js";
|
|
10
7
|
import { DefaultBehavior } from "../behaviors/defaultBehavior.js";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import { Scalar } from "@babylonjs/core/Maths/math.scalar.js";
|
|
8
|
+
import { SlateGizmo } from "../gizmos/slateGizmo.js";
|
|
9
|
+
import { FluentMaterial } from "../materials/fluent/fluentMaterial.js";
|
|
14
10
|
import { FluentBackplateMaterial } from "../materials/fluentBackplate/fluentBackplateMaterial.js";
|
|
15
|
-
import {
|
|
11
|
+
import { PointerDragBehavior } from "@babylonjs/core/Behaviors/Meshes/pointerDragBehavior.js";
|
|
16
12
|
import { Vector4 } from "@babylonjs/core/Maths/math.js";
|
|
13
|
+
import { Epsilon } from "@babylonjs/core/Maths/math.constants.js";
|
|
14
|
+
import { Scalar } from "@babylonjs/core/Maths/math.scalar.js";
|
|
15
|
+
import { Quaternion, Vector2, Vector3 } from "@babylonjs/core/Maths/math.vector.js";
|
|
16
|
+
import { Viewport } from "@babylonjs/core/Maths/math.viewport.js";
|
|
17
|
+
import { CreateBox } from "@babylonjs/core/Meshes/Builders/boxBuilder.js";
|
|
18
|
+
import { CreatePlane } from "@babylonjs/core/Meshes/Builders/planeBuilder.js";
|
|
19
|
+
import { Mesh } from "@babylonjs/core/Meshes/mesh.js";
|
|
20
|
+
import { VertexData } from "@babylonjs/core/Meshes/mesh.vertexData.js";
|
|
17
21
|
/**
|
|
18
22
|
* Class used to create a holographic slate
|
|
19
23
|
* @since 5.0.0
|
|
@@ -27,31 +31,27 @@ var HolographicSlate = /** @class */ (function (_super) {
|
|
|
27
31
|
function HolographicSlate(name) {
|
|
28
32
|
var _this = _super.call(this, name) || this;
|
|
29
33
|
/**
|
|
30
|
-
*
|
|
31
|
-
*/
|
|
32
|
-
_this.dimensions = new Vector3(21.875, 12.5, 0.001);
|
|
33
|
-
/**
|
|
34
|
-
* Minimum dimensions of the slate
|
|
34
|
+
* Margin between title bar and contentplate
|
|
35
35
|
*/
|
|
36
|
-
_this.
|
|
36
|
+
_this.titleBarMargin = 0.005;
|
|
37
37
|
/**
|
|
38
|
-
*
|
|
39
|
-
*/
|
|
40
|
-
_this.defaultDimensions = _this.dimensions.clone();
|
|
41
|
-
/**
|
|
42
|
-
* Dimensions of the backplate
|
|
38
|
+
* Origin in local coordinates (top left corner)
|
|
43
39
|
*/
|
|
44
|
-
_this.
|
|
40
|
+
_this.origin = new Vector3(0, 0, 0);
|
|
41
|
+
_this._dimensions = new Vector2(21.875, 12.5);
|
|
42
|
+
_this._titleBarHeight = 0.625;
|
|
43
|
+
_this._titleText = "";
|
|
44
|
+
_this._contentScaleRatio = 1;
|
|
45
45
|
/**
|
|
46
|
-
*
|
|
46
|
+
* Minimum dimensions of the slate
|
|
47
47
|
*/
|
|
48
|
-
_this.
|
|
48
|
+
_this.minDimensions = new Vector2(15.625, 6.25);
|
|
49
49
|
/**
|
|
50
|
-
*
|
|
50
|
+
* Default dimensions of the slate
|
|
51
51
|
*/
|
|
52
|
-
_this.
|
|
53
|
-
_this._contentScaleRatio = 1;
|
|
52
|
+
_this.defaultDimensions = _this._dimensions.clone();
|
|
54
53
|
_this._followButton = new TouchHolographicButton("followButton" + _this.name);
|
|
54
|
+
_this._followButton.isToggleButton = true;
|
|
55
55
|
_this._closeButton = new TouchHolographicButton("closeButton" + _this.name);
|
|
56
56
|
_this._contentViewport = new Viewport(0, 0, 1, 1);
|
|
57
57
|
_this._contentDragBehavior = new PointerDragBehavior({
|
|
@@ -69,35 +69,76 @@ var HolographicSlate = /** @class */ (function (_super) {
|
|
|
69
69
|
enumerable: false,
|
|
70
70
|
configurable: true
|
|
71
71
|
});
|
|
72
|
+
Object.defineProperty(HolographicSlate.prototype, "dimensions", {
|
|
73
|
+
/**
|
|
74
|
+
* 2D dimensions of the slate
|
|
75
|
+
*/
|
|
76
|
+
get: function () {
|
|
77
|
+
return this._dimensions;
|
|
78
|
+
},
|
|
79
|
+
set: function (value) {
|
|
80
|
+
//clamp, respecting ratios
|
|
81
|
+
var scale = 1.0;
|
|
82
|
+
if (value.x < this.minDimensions.x || value.y < this.minDimensions.y) {
|
|
83
|
+
var newRatio = value.x / value.y;
|
|
84
|
+
var minRatio = this.minDimensions.x / this.minDimensions.y;
|
|
85
|
+
if (minRatio > newRatio) {
|
|
86
|
+
// We just need to make sure the x-val is greater than the min
|
|
87
|
+
scale = this.minDimensions.x / value.x;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
// We just need to make sure the y-val is greater than the min
|
|
91
|
+
scale = this.minDimensions.y / value.y;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
this._dimensions.copyFrom(value).scaleInPlace(scale);
|
|
95
|
+
this._updatePivot();
|
|
96
|
+
this._positionElements();
|
|
97
|
+
},
|
|
98
|
+
enumerable: false,
|
|
99
|
+
configurable: true
|
|
100
|
+
});
|
|
101
|
+
Object.defineProperty(HolographicSlate.prototype, "titleBarHeight", {
|
|
102
|
+
/**
|
|
103
|
+
* Height of the title bar component
|
|
104
|
+
*/
|
|
105
|
+
get: function () {
|
|
106
|
+
return this._titleBarHeight;
|
|
107
|
+
},
|
|
108
|
+
set: function (value) {
|
|
109
|
+
this._titleBarHeight = value;
|
|
110
|
+
},
|
|
111
|
+
enumerable: false,
|
|
112
|
+
configurable: true
|
|
113
|
+
});
|
|
72
114
|
Object.defineProperty(HolographicSlate.prototype, "renderingGroupId", {
|
|
73
115
|
get: function () {
|
|
74
|
-
return this.
|
|
116
|
+
return this._titleBar.renderingGroupId;
|
|
75
117
|
},
|
|
76
118
|
/**
|
|
77
|
-
* Rendering ground id of all the
|
|
119
|
+
* Rendering ground id of all the meshes
|
|
78
120
|
*/
|
|
79
121
|
set: function (id) {
|
|
80
|
-
this.
|
|
122
|
+
this._titleBar.renderingGroupId = id;
|
|
123
|
+
this._titleBarTitle.renderingGroupId = id;
|
|
81
124
|
this._contentPlate.renderingGroupId = id;
|
|
125
|
+
this._backPlate.renderingGroupId = id;
|
|
82
126
|
},
|
|
83
127
|
enumerable: false,
|
|
84
128
|
configurable: true
|
|
85
129
|
});
|
|
86
|
-
Object.defineProperty(HolographicSlate.prototype, "
|
|
87
|
-
/**
|
|
88
|
-
* Gets or sets the image url for the button
|
|
89
|
-
*/
|
|
130
|
+
Object.defineProperty(HolographicSlate.prototype, "title", {
|
|
90
131
|
get: function () {
|
|
91
|
-
return this.
|
|
132
|
+
return this._titleText;
|
|
92
133
|
},
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
134
|
+
/**
|
|
135
|
+
* The title text displayed at the top of the slate
|
|
136
|
+
*/
|
|
137
|
+
set: function (title) {
|
|
138
|
+
this._titleText = title;
|
|
139
|
+
if (this._titleTextComponent) {
|
|
140
|
+
this._titleTextComponent.text = title;
|
|
96
141
|
}
|
|
97
|
-
this._imageUrl = value;
|
|
98
|
-
this._rebuildContent();
|
|
99
|
-
this._resetContentPositionAndZoom();
|
|
100
|
-
this._applyContentViewport();
|
|
101
142
|
},
|
|
102
143
|
enumerable: false,
|
|
103
144
|
configurable: true
|
|
@@ -109,22 +150,9 @@ var HolographicSlate = /** @class */ (function (_super) {
|
|
|
109
150
|
*/
|
|
110
151
|
HolographicSlate.prototype._applyFacade = function (facadeTexture) {
|
|
111
152
|
this._contentMaterial.albedoTexture = facadeTexture;
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
}
|
|
116
|
-
};
|
|
117
|
-
HolographicSlate.prototype._rebuildContent = function () {
|
|
118
|
-
this._disposeFacadeTexture();
|
|
119
|
-
if (DomManagement.IsDocumentAvailable() && !!document.createElement) {
|
|
120
|
-
if (this._imageUrl) {
|
|
121
|
-
var image = new Image();
|
|
122
|
-
image.source = this._imageUrl;
|
|
123
|
-
if (this._contentPlate) {
|
|
124
|
-
this.content = image;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
153
|
+
this._resetContentPositionAndZoom();
|
|
154
|
+
this._applyContentViewport();
|
|
155
|
+
facadeTexture.attachToMesh(this._contentPlate, true);
|
|
128
156
|
};
|
|
129
157
|
HolographicSlate.prototype._addControl = function (control) {
|
|
130
158
|
control._host = this._host;
|
|
@@ -139,32 +167,40 @@ var HolographicSlate = /** @class */ (function (_super) {
|
|
|
139
167
|
* @hidden
|
|
140
168
|
*/
|
|
141
169
|
HolographicSlate.prototype._positionElements = function () {
|
|
142
|
-
var
|
|
143
|
-
var
|
|
144
|
-
var
|
|
170
|
+
var followButton = this._followButton;
|
|
171
|
+
var closeButton = this._closeButton;
|
|
172
|
+
var titleBar = this._titleBar;
|
|
173
|
+
var titleBarTitle = this._titleBarTitle;
|
|
145
174
|
var contentPlate = this._contentPlate;
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
followButtonMesh.scaling.setAll(backPlateYScale);
|
|
153
|
-
closeButtonMesh.position
|
|
154
|
-
.copyFromFloats(this.backplateDimensions.x - backPlateYScale / 2, -this.backplateDimensions.y / 2, (-this.backplateDimensions.z / 2) * (this._host.scene.useRightHandedSystem ? -1 : 1))
|
|
175
|
+
var backPlate = this._backPlate;
|
|
176
|
+
if (followButton && closeButton && titleBar) {
|
|
177
|
+
closeButton.scaling.setAll(this.titleBarHeight);
|
|
178
|
+
followButton.scaling.setAll(this.titleBarHeight);
|
|
179
|
+
closeButton.position
|
|
180
|
+
.copyFromFloats(this.dimensions.x - this.titleBarHeight / 2, -this.titleBarHeight / 2, 0)
|
|
155
181
|
.addInPlace(this.origin);
|
|
156
|
-
|
|
157
|
-
.copyFromFloats(this.
|
|
182
|
+
followButton.position
|
|
183
|
+
.copyFromFloats(this.dimensions.x - (3 * this.titleBarHeight) / 2, -this.titleBarHeight / 2, 0)
|
|
158
184
|
.addInPlace(this.origin);
|
|
159
|
-
var contentPlateHeight = this.dimensions.y - this.
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
contentPlate.
|
|
185
|
+
var contentPlateHeight = this.dimensions.y - this.titleBarHeight - this.titleBarMargin;
|
|
186
|
+
var rightHandScene = contentPlate.getScene().useRightHandedSystem;
|
|
187
|
+
titleBar.scaling.set(this.dimensions.x, this.titleBarHeight, Epsilon);
|
|
188
|
+
titleBarTitle.scaling.set(this.dimensions.x - (2 * this.titleBarHeight), this.titleBarHeight, Epsilon);
|
|
189
|
+
contentPlate.scaling.copyFromFloats(this.dimensions.x, contentPlateHeight, Epsilon);
|
|
190
|
+
backPlate.scaling.copyFromFloats(this.dimensions.x, contentPlateHeight, Epsilon);
|
|
191
|
+
titleBar.position.copyFromFloats(this.dimensions.x / 2, -(this.titleBarHeight / 2), 0).addInPlace(this.origin);
|
|
192
|
+
titleBarTitle.position.copyFromFloats((this.dimensions.x / 2) - this.titleBarHeight, -(this.titleBarHeight / 2), rightHandScene ? Epsilon : -Epsilon).addInPlace(this.origin);
|
|
193
|
+
contentPlate.position.copyFromFloats(this.dimensions.x / 2, -(this.titleBarHeight + this.titleBarMargin + contentPlateHeight / 2), 0).addInPlace(this.origin);
|
|
194
|
+
backPlate.position.copyFromFloats(this.dimensions.x / 2, -(this.titleBarHeight + this.titleBarMargin + contentPlateHeight / 2), rightHandScene ? -Epsilon : Epsilon).addInPlace(this.origin);
|
|
195
|
+
// Update the title's AdvancedDynamicTexture scale to avoid visual stretching
|
|
196
|
+
this._titleTextComponent.host.scaleTo(HolographicSlate.DEFAULT_TEXT_RESOLUTION_Y * titleBarTitle.scaling.x / titleBarTitle.scaling.y, HolographicSlate.DEFAULT_TEXT_RESOLUTION_Y);
|
|
164
197
|
var aspectRatio = this.dimensions.x / contentPlateHeight;
|
|
165
198
|
this._contentViewport.width = this._contentScaleRatio;
|
|
166
199
|
this._contentViewport.height = this._contentScaleRatio / aspectRatio;
|
|
167
200
|
this._applyContentViewport();
|
|
201
|
+
if (this._gizmo) {
|
|
202
|
+
this._gizmo.updateBoundingBox();
|
|
203
|
+
}
|
|
168
204
|
}
|
|
169
205
|
};
|
|
170
206
|
HolographicSlate.prototype._applyContentViewport = function () {
|
|
@@ -190,9 +226,8 @@ var HolographicSlate = /** @class */ (function (_super) {
|
|
|
190
226
|
return;
|
|
191
227
|
}
|
|
192
228
|
// Update pivot point so it is at the center of geometry
|
|
193
|
-
var center = this.dimensions.scale(0.5);
|
|
194
229
|
// As origin is topleft corner in 2D, dimensions are calculated towards bottom right corner, thus y axis is downwards
|
|
195
|
-
center.y
|
|
230
|
+
var center = new Vector3(this.dimensions.x * 0.5, -this.dimensions.y * 0.5, Epsilon);
|
|
196
231
|
center.addInPlace(this.origin);
|
|
197
232
|
center.z = 0;
|
|
198
233
|
var origin = new Vector3(0, 0, 0);
|
|
@@ -205,30 +240,47 @@ var HolographicSlate = /** @class */ (function (_super) {
|
|
|
205
240
|
// Mesh association
|
|
206
241
|
HolographicSlate.prototype._createNode = function (scene) {
|
|
207
242
|
var _this = this;
|
|
208
|
-
var node = new Mesh("
|
|
209
|
-
this.
|
|
210
|
-
|
|
243
|
+
var node = new Mesh("slate_" + this.name, scene);
|
|
244
|
+
this._titleBar = CreateBox("titleBar_" + this.name, { size: 1 }, scene);
|
|
245
|
+
this._titleBarTitle = CreatePlane("titleText_" + this.name, { size: 1 }, scene);
|
|
246
|
+
this._titleBarTitle.parent = node;
|
|
247
|
+
this._titleBarTitle.isPickable = false;
|
|
248
|
+
var adt = AdvancedDynamicTexture.CreateForMesh(this._titleBarTitle);
|
|
249
|
+
this._titleTextComponent = new TextBlock("titleText_" + this.name, this._titleText);
|
|
250
|
+
this._titleTextComponent.textWrapping = TextWrapping.Ellipsis;
|
|
251
|
+
this._titleTextComponent.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;
|
|
252
|
+
this._titleTextComponent.color = "white";
|
|
253
|
+
this._titleTextComponent.fontSize = HolographicSlate.DEFAULT_TEXT_RESOLUTION_Y / 2;
|
|
254
|
+
this._titleTextComponent.paddingLeft = HolographicSlate.DEFAULT_TEXT_RESOLUTION_Y / 4;
|
|
255
|
+
adt.addControl(this._titleTextComponent);
|
|
211
256
|
if (scene.useRightHandedSystem) {
|
|
212
|
-
faceUV
|
|
257
|
+
var faceUV = new Vector4(0, 0, 1, 1);
|
|
258
|
+
this._contentPlate = CreatePlane("contentPlate_" + this.name, { size: 1, sideOrientation: VertexData.BACKSIDE, frontUVs: faceUV }, scene);
|
|
259
|
+
this._backPlate = CreatePlane("backPlate_" + this.name, { size: 1, sideOrientation: VertexData.FRONTSIDE }, scene);
|
|
213
260
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
261
|
+
else {
|
|
262
|
+
var faceUV = new Vector4(0, 0, 1, 1);
|
|
263
|
+
this._contentPlate = CreatePlane("contentPlate_" + this.name, { size: 1, sideOrientation: VertexData.FRONTSIDE, frontUVs: faceUV }, scene);
|
|
264
|
+
this._backPlate = CreatePlane("backPlate_" + this.name, { size: 1, sideOrientation: VertexData.BACKSIDE }, scene);
|
|
265
|
+
}
|
|
266
|
+
this._titleBar.parent = node;
|
|
267
|
+
this._titleBar.isNearGrabbable = true;
|
|
217
268
|
this._contentPlate.parent = node;
|
|
269
|
+
this._backPlate.parent = node;
|
|
218
270
|
this._attachContentPlateBehavior();
|
|
219
271
|
this._addControl(this._followButton);
|
|
220
272
|
this._addControl(this._closeButton);
|
|
221
|
-
var
|
|
222
|
-
var
|
|
223
|
-
|
|
224
|
-
|
|
273
|
+
var followButton = this._followButton;
|
|
274
|
+
var closeButton = this._closeButton;
|
|
275
|
+
followButton.node.parent = node;
|
|
276
|
+
closeButton.node.parent = node;
|
|
225
277
|
this._positionElements();
|
|
226
278
|
this._followButton.imageUrl = HolographicSlate.ASSETS_BASE_URL + HolographicSlate.FOLLOW_ICON_FILENAME;
|
|
227
279
|
this._closeButton.imageUrl = HolographicSlate.ASSETS_BASE_URL + HolographicSlate.CLOSE_ICON_FILENAME;
|
|
228
280
|
this._followButton.isBackplateVisible = false;
|
|
229
281
|
this._closeButton.isBackplateVisible = false;
|
|
230
|
-
this._followButton.
|
|
231
|
-
_this._defaultBehavior.followBehaviorEnabled =
|
|
282
|
+
this._followButton.onToggleObservable.add(function (isToggled) {
|
|
283
|
+
_this._defaultBehavior.followBehaviorEnabled = isToggled;
|
|
232
284
|
if (_this._defaultBehavior.followBehaviorEnabled) {
|
|
233
285
|
_this._defaultBehavior.followBehavior.recenter();
|
|
234
286
|
}
|
|
@@ -260,8 +312,8 @@ var HolographicSlate = /** @class */ (function (_super) {
|
|
|
260
312
|
startViewport = _this._contentViewport.clone();
|
|
261
313
|
worldMatrix = _this.node.computeWorldMatrix(true);
|
|
262
314
|
origin.copyFrom(event.dragPlanePoint);
|
|
263
|
-
worldDimensions.
|
|
264
|
-
worldDimensions.y -= _this.
|
|
315
|
+
worldDimensions.set(_this.dimensions.x, _this.dimensions.y, Epsilon);
|
|
316
|
+
worldDimensions.y -= _this.titleBarHeight + _this.titleBarMargin;
|
|
265
317
|
Vector3.TransformNormalToRef(worldDimensions, worldMatrix, worldDimensions);
|
|
266
318
|
upWorld.copyFromFloats(0, 1, 0);
|
|
267
319
|
Vector3.TransformNormalToRef(upWorld, worldMatrix, upWorld);
|
|
@@ -285,20 +337,17 @@ var HolographicSlate = /** @class */ (function (_super) {
|
|
|
285
337
|
};
|
|
286
338
|
HolographicSlate.prototype._affectMaterial = function (mesh) {
|
|
287
339
|
// TODO share materials
|
|
288
|
-
this.
|
|
289
|
-
this.
|
|
290
|
-
// if (pickedPoint) {
|
|
291
|
-
// this._backPlateMaterial. = pickedPoint;
|
|
292
|
-
// this._backPlateMaterial.hoverColor.a = 1.0;
|
|
293
|
-
// } else {
|
|
294
|
-
// this._backPlateMaterial.hoverColor.a = 0;
|
|
295
|
-
// }
|
|
296
|
-
});
|
|
297
|
-
this._contentMaterial = new FluentMaterial(this.name + "contentMaterial", mesh.getScene());
|
|
340
|
+
this._titleBarMaterial = new FluentBackplateMaterial("".concat(this.name, " plateMaterial"), mesh.getScene());
|
|
341
|
+
this._contentMaterial = new FluentMaterial("".concat(this.name, " contentMaterial"), mesh.getScene());
|
|
298
342
|
this._contentMaterial.renderBorders = true;
|
|
299
|
-
this.
|
|
343
|
+
this._backMaterial = new FluentBackplateMaterial("".concat(this.name, " backPlate"), mesh.getScene());
|
|
344
|
+
this._backMaterial.lineWidth = Epsilon;
|
|
345
|
+
this._backMaterial.radius = 0.005;
|
|
346
|
+
this._backMaterial.backFaceCulling = true;
|
|
347
|
+
this._titleBar.material = this._titleBarMaterial;
|
|
300
348
|
this._contentPlate.material = this._contentMaterial;
|
|
301
|
-
this.
|
|
349
|
+
this._backPlate.material = this._backMaterial;
|
|
350
|
+
this._resetContent();
|
|
302
351
|
this._applyContentViewport();
|
|
303
352
|
};
|
|
304
353
|
/** @hidden **/
|
|
@@ -308,17 +357,22 @@ var HolographicSlate = /** @class */ (function (_super) {
|
|
|
308
357
|
this._gizmo = new SlateGizmo(this._host.utilityLayer);
|
|
309
358
|
this._gizmo.attachedSlate = this;
|
|
310
359
|
this._defaultBehavior = new DefaultBehavior();
|
|
311
|
-
this._defaultBehavior.attach(this.node, [this.
|
|
360
|
+
this._defaultBehavior.attach(this.node, [this._titleBar]);
|
|
361
|
+
this._defaultBehavior.sixDofDragBehavior.onDragStartObservable.add(function () {
|
|
362
|
+
_this._followButton.isToggled = false;
|
|
363
|
+
});
|
|
312
364
|
this._positionChangedObserver = this._defaultBehavior.sixDofDragBehavior.onPositionChangedObservable.add(function () {
|
|
313
365
|
_this._gizmo.updateBoundingBox();
|
|
314
366
|
});
|
|
315
367
|
this._updatePivot();
|
|
316
|
-
this.resetDefaultAspectAndPose();
|
|
368
|
+
this.resetDefaultAspectAndPose(false);
|
|
317
369
|
};
|
|
318
370
|
/**
|
|
319
371
|
* Resets the aspect and pose of the slate so it is right in front of the active camera, facing towards it.
|
|
372
|
+
* @param resetAspect Should the slate's dimensions/aspect ratio be reset as well
|
|
320
373
|
*/
|
|
321
|
-
HolographicSlate.prototype.resetDefaultAspectAndPose = function () {
|
|
374
|
+
HolographicSlate.prototype.resetDefaultAspectAndPose = function (resetAspect) {
|
|
375
|
+
if (resetAspect === void 0) { resetAspect = true; }
|
|
322
376
|
if (!this._host || !this._host.utilityLayer || !this.node) {
|
|
323
377
|
return;
|
|
324
378
|
}
|
|
@@ -327,12 +381,14 @@ var HolographicSlate = /** @class */ (function (_super) {
|
|
|
327
381
|
if (camera) {
|
|
328
382
|
var worldMatrix = camera.getWorldMatrix();
|
|
329
383
|
var backward = Vector3.TransformNormal(Vector3.Backward(scene.useRightHandedSystem), worldMatrix);
|
|
330
|
-
this.dimensions.copyFrom(this.defaultDimensions);
|
|
331
384
|
this.origin.setAll(0);
|
|
332
385
|
this._gizmo.updateBoundingBox();
|
|
333
386
|
var pivot = this.node.getAbsolutePivotPoint();
|
|
334
387
|
this.node.position.copyFrom(camera.position).subtractInPlace(backward).subtractInPlace(pivot);
|
|
335
388
|
this.node.rotationQuaternion = Quaternion.FromLookDirectionLH(backward, new Vector3(0, 1, 0));
|
|
389
|
+
if (resetAspect) {
|
|
390
|
+
this.dimensions = this.defaultDimensions;
|
|
391
|
+
}
|
|
336
392
|
}
|
|
337
393
|
};
|
|
338
394
|
/**
|
|
@@ -340,10 +396,12 @@ var HolographicSlate = /** @class */ (function (_super) {
|
|
|
340
396
|
*/
|
|
341
397
|
HolographicSlate.prototype.dispose = function () {
|
|
342
398
|
_super.prototype.dispose.call(this);
|
|
343
|
-
this.
|
|
399
|
+
this._titleBarMaterial.dispose();
|
|
344
400
|
this._contentMaterial.dispose();
|
|
345
|
-
this.
|
|
401
|
+
this._titleBar.dispose();
|
|
402
|
+
this._titleBarTitle.dispose();
|
|
346
403
|
this._contentPlate.dispose();
|
|
404
|
+
this._backPlate.dispose();
|
|
347
405
|
this._followButton.dispose();
|
|
348
406
|
this._closeButton.dispose();
|
|
349
407
|
this._host.onPickedPointChangedObservable.remove(this._pickedPointObserver);
|
|
@@ -364,6 +422,7 @@ var HolographicSlate = /** @class */ (function (_super) {
|
|
|
364
422
|
* File name for the close icon.
|
|
365
423
|
*/
|
|
366
424
|
HolographicSlate.FOLLOW_ICON_FILENAME = "IconFollowMe.png";
|
|
425
|
+
HolographicSlate.DEFAULT_TEXT_RESOLUTION_Y = 102.4;
|
|
367
426
|
return HolographicSlate;
|
|
368
427
|
}(ContentDisplay3D));
|
|
369
428
|
export { HolographicSlate };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"holographicSlate.js","sourceRoot":"","sources":["../../../../sourceES6/gui/src/3D/controls/holographicSlate.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbstractMesh } from \"@babylonjs/core/Meshes/abstractMesh\";\r\nimport { Scene } from \"@babylonjs/core/scene\";\r\nimport { TransformNode } from \"@babylonjs/core/Meshes/transformNode\";\r\nimport { CreateBox } from \"@babylonjs/core/Meshes/Builders/boxBuilder\";\r\nimport { Mesh } from \"@babylonjs/core/Meshes/mesh\";\r\nimport { FluentMaterial } from \"../materials/fluent/fluentMaterial\";\r\nimport { TouchHolographicButton } from \"./touchHolographicButton\";\r\nimport { Nullable } from \"@babylonjs/core/types\";\r\nimport { Observer } from \"@babylonjs/core/Misc/observable\";\r\nimport { Matrix, Quaternion, Vector2, Vector3 } from \"@babylonjs/core/Maths/math.vector\";\r\nimport { Control3D } from \"./control3D\";\r\nimport { ContentDisplay3D } from \"./contentDisplay3D\";\r\nimport { AdvancedDynamicTexture } from \"../../2D/advancedDynamicTexture\";\r\nimport { Image } from \"../../2D/controls/image\";\r\nimport { SlateGizmo } from \"../gizmos/slateGizmo\";\r\nimport { DefaultBehavior } from \"../behaviors/defaultBehavior\";\r\nimport { Viewport } from \"@babylonjs/core/Maths/math.viewport\";\r\nimport { PointerDragBehavior } from \"@babylonjs/core/Behaviors/Meshes/pointerDragBehavior\";\r\nimport { Scalar } from \"@babylonjs/core/Maths/math.scalar\";\r\nimport { Texture } from \"@babylonjs/core/Materials/Textures/texture\";\r\nimport { FluentBackplateMaterial } from \"../materials/fluentBackplate/fluentBackplateMaterial\";\r\nimport { DomManagement } from \"@babylonjs/core/Misc/domManagement\";\r\nimport { Vector4 } from \"@babylonjs/core/Maths/math\";\r\n\r\n/**\r\n * Class used to create a holographic slate\r\n * @since 5.0.0\r\n */\r\nexport class HolographicSlate extends ContentDisplay3D {\r\n /**\r\n * Base Url for the assets.\r\n */\r\n public static ASSETS_BASE_URL: string = \"https://assets.babylonjs.com/meshes/MRTK/\";\r\n /**\r\n * File name for the close icon.\r\n */\r\n public static CLOSE_ICON_FILENAME: string = \"IconClose.png\";\r\n /**\r\n * File name for the close icon.\r\n */\r\n public static FOLLOW_ICON_FILENAME: string = \"IconFollowMe.png\";\r\n\r\n /**\r\n * Dimensions of the slate\r\n */\r\n public dimensions = new Vector3(21.875, 12.5, 0.001);\r\n\r\n /**\r\n * Minimum dimensions of the slate\r\n */\r\n public minDimensions = new Vector3(15.625, 6.25, 0.001);\r\n\r\n /**\r\n * Default dimensions of the slate\r\n */\r\n public readonly defaultDimensions = this.dimensions.clone();\r\n\r\n /**\r\n * Dimensions of the backplate\r\n */\r\n public backplateDimensions = new Vector3(21.875, 0.625, 0.001);\r\n\r\n /**\r\n * Margin between backplate and contentplate\r\n */\r\n public backPlateMargin = 0.005;\r\n\r\n /**\r\n * Origin in local coordinates (top left corner)\r\n */\r\n public origin = new Vector3(0, 0, 0);\r\n\r\n private _backPlateMaterial: FluentBackplateMaterial;\r\n private _contentMaterial: FluentMaterial;\r\n private _pickedPointObserver: Nullable<Observer<Nullable<Vector3>>>;\r\n private _positionChangedObserver: Nullable<Observer<{ position: Vector3 }>>;\r\n private _imageUrl: string;\r\n\r\n private _contentViewport: Viewport;\r\n private _contentDragBehavior: PointerDragBehavior;\r\n\r\n private _defaultBehavior: DefaultBehavior;\r\n /**\r\n * Regroups all mesh behaviors for the slate\r\n */\r\n public get defaultBehavior(): DefaultBehavior {\r\n return this._defaultBehavior;\r\n }\r\n\r\n /** @hidden */\r\n public _gizmo: SlateGizmo;\r\n\r\n protected _backPlate: Mesh;\r\n protected _contentPlate: Mesh;\r\n protected _followButton: TouchHolographicButton;\r\n protected _closeButton: TouchHolographicButton;\r\n protected _contentScaleRatio = 1;\r\n\r\n /**\r\n * Rendering ground id of all the mesh in the button\r\n */\r\n public set renderingGroupId(id: number) {\r\n this._backPlate.renderingGroupId = id;\r\n this._contentPlate.renderingGroupId = id;\r\n }\r\n public get renderingGroupId(): number {\r\n return this._backPlate.renderingGroupId;\r\n }\r\n\r\n /**\r\n * Gets or sets the image url for the button\r\n */\r\n public get imageUrl(): string {\r\n return this._imageUrl;\r\n }\r\n\r\n public set imageUrl(value: string) {\r\n if (this._imageUrl === value) {\r\n return;\r\n }\r\n\r\n this._imageUrl = value;\r\n this._rebuildContent();\r\n this._resetContentPositionAndZoom();\r\n this._applyContentViewport();\r\n }\r\n\r\n /**\r\n * Creates a new slate\r\n * @param name defines the control name\r\n */\r\n constructor(name?: string) {\r\n super(name);\r\n\r\n this._followButton = new TouchHolographicButton(\"followButton\" + this.name);\r\n this._closeButton = new TouchHolographicButton(\"closeButton\" + this.name);\r\n\r\n this._contentViewport = new Viewport(0, 0, 1, 1);\r\n this._contentDragBehavior = new PointerDragBehavior({\r\n dragPlaneNormal: new Vector3(0, 0, -1),\r\n });\r\n }\r\n\r\n /**\r\n * Apply the facade texture (created from the content property).\r\n * This function can be overloaded by child classes\r\n * @param facadeTexture defines the AdvancedDynamicTexture to use\r\n */\r\n protected _applyFacade(facadeTexture: AdvancedDynamicTexture) {\r\n this._contentMaterial.albedoTexture = facadeTexture;\r\n\r\n // We should have a content plate by this point, but check for safety\r\n if (this._contentPlate) {\r\n facadeTexture.attachToMesh(this._contentPlate, true);\r\n }\r\n }\r\n\r\n private _rebuildContent(): void {\r\n this._disposeFacadeTexture();\r\n\r\n if (DomManagement.IsDocumentAvailable() && !!document.createElement) {\r\n if (this._imageUrl) {\r\n let image = new Image();\r\n image.source = this._imageUrl;\r\n\r\n if (this._contentPlate) {\r\n this.content = image;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _addControl(control: Control3D): void {\r\n control._host = this._host;\r\n if (this._host.utilityLayer) {\r\n control._prepareNode(this._host.utilityLayer.utilityLayerScene);\r\n }\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"HolographicSlate\";\r\n }\r\n\r\n /**\r\n * @hidden\r\n */\r\n public _positionElements() {\r\n const followButtonMesh = this._followButton.mesh;\r\n const closeButtonMesh = this._closeButton.mesh;\r\n const backPlate = this._backPlate;\r\n const contentPlate = this._contentPlate;\r\n\r\n if (followButtonMesh && closeButtonMesh && backPlate) {\r\n // World size of a button with 1 scaling\r\n const buttonBaseSize = 1;\r\n\r\n // Buttons take full backPlate on Y axis\r\n const backPlateYScale = this.backplateDimensions.y / buttonBaseSize;\r\n\r\n closeButtonMesh.scaling.setAll(backPlateYScale);\r\n followButtonMesh.scaling.setAll(backPlateYScale);\r\n closeButtonMesh.position\r\n .copyFromFloats(\r\n this.backplateDimensions.x - backPlateYScale / 2,\r\n -this.backplateDimensions.y / 2,\r\n (-this.backplateDimensions.z / 2) * (this._host.scene.useRightHandedSystem ? -1 : 1)\r\n )\r\n .addInPlace(this.origin);\r\n followButtonMesh.position\r\n .copyFromFloats(\r\n this.backplateDimensions.x - (3 * backPlateYScale) / 2,\r\n -this.backplateDimensions.y / 2,\r\n (-this.backplateDimensions.z / 2) * (this._host.scene.useRightHandedSystem ? -1 : 1)\r\n )\r\n .addInPlace(this.origin);\r\n\r\n const contentPlateHeight = this.dimensions.y - this.backplateDimensions.y - this.backPlateMargin;\r\n backPlate.scaling.copyFrom(this.backplateDimensions);\r\n contentPlate.scaling.copyFromFloats(this.dimensions.x, contentPlateHeight, this.dimensions.z);\r\n backPlate.position.copyFromFloats(this.backplateDimensions.x / 2, -(this.backplateDimensions.y / 2), 0).addInPlace(this.origin);\r\n contentPlate.position.copyFromFloats(this.dimensions.x / 2, -(this.backplateDimensions.y + this.backPlateMargin + contentPlateHeight / 2), 0).addInPlace(this.origin);\r\n\r\n const aspectRatio = this.dimensions.x / contentPlateHeight;\r\n this._contentViewport.width = this._contentScaleRatio;\r\n this._contentViewport.height = this._contentScaleRatio / aspectRatio;\r\n\r\n this._applyContentViewport();\r\n }\r\n }\r\n\r\n private _applyContentViewport() {\r\n if (this._contentPlate?.material && (this._contentPlate.material as FluentMaterial).albedoTexture) {\r\n const tex = (this._contentPlate.material as FluentMaterial).albedoTexture as Texture;\r\n tex.uScale = this._contentScaleRatio;\r\n tex.vScale = (this._contentScaleRatio / this._contentViewport.width) * this._contentViewport.height;\r\n tex.uOffset = this._contentViewport.x;\r\n tex.vOffset = this._contentViewport.y;\r\n }\r\n }\r\n\r\n private _resetContentPositionAndZoom() {\r\n this._contentViewport.x = 0;\r\n this._contentViewport.y = 1 - this._contentViewport.height / this._contentViewport.width;\r\n this._contentScaleRatio = 1;\r\n }\r\n\r\n /**\r\n * @hidden\r\n */\r\n public _updatePivot() {\r\n if (!this.mesh) {\r\n return;\r\n }\r\n\r\n // Update pivot point so it is at the center of geometry\r\n const center = this.dimensions.scale(0.5);\r\n // As origin is topleft corner in 2D, dimensions are calculated towards bottom right corner, thus y axis is downwards\r\n center.y *= -1;\r\n center.addInPlace(this.origin);\r\n center.z = 0;\r\n\r\n const origin = new Vector3(0, 0, 0);\r\n Vector3.TransformCoordinatesToRef(origin, this.mesh.computeWorldMatrix(true), origin);\r\n this.mesh.setPivotPoint(center);\r\n const origin2 = new Vector3(0, 0, 0);\r\n Vector3.TransformCoordinatesToRef(origin2, this.mesh.computeWorldMatrix(true), origin2);\r\n this.mesh.position.addInPlace(origin).subtractInPlace(origin2);\r\n }\r\n\r\n // Mesh association\r\n protected _createNode(scene: Scene): TransformNode {\r\n const node = new Mesh(\"slate\" + this.name, scene);\r\n\r\n this._backPlate = CreateBox(\"backPlate\" + this.name, { size: 1 }, scene);\r\n const faceUV = new Array(6).fill(new Vector4(0, 0, 1, 1));\r\n if (scene.useRightHandedSystem) {\r\n faceUV[0].copyFromFloats(0, 1, 1, 0);\r\n }\r\n this._contentPlate = CreateBox(\"contentPlate\" + this.name, { size: 1, faceUV }, scene);\r\n\r\n this._backPlate.parent = node;\r\n this._backPlate.isNearGrabbable = true;\r\n this._contentPlate.parent = node;\r\n this._attachContentPlateBehavior();\r\n\r\n this._addControl(this._followButton);\r\n this._addControl(this._closeButton);\r\n\r\n const followButtonMesh = this._followButton.mesh!;\r\n const closeButtonMesh = this._closeButton.mesh!;\r\n followButtonMesh.parent = node;\r\n closeButtonMesh.parent = node;\r\n\r\n this._positionElements();\r\n\r\n this._followButton.imageUrl = HolographicSlate.ASSETS_BASE_URL + HolographicSlate.FOLLOW_ICON_FILENAME;\r\n this._closeButton.imageUrl = HolographicSlate.ASSETS_BASE_URL + HolographicSlate.CLOSE_ICON_FILENAME;\r\n\r\n this._followButton.isBackplateVisible = false;\r\n this._closeButton.isBackplateVisible = false;\r\n\r\n this._followButton.onPointerClickObservable.add(() => {\r\n this._defaultBehavior.followBehaviorEnabled = !this._defaultBehavior.followBehaviorEnabled;\r\n if (this._defaultBehavior.followBehaviorEnabled) {\r\n this._defaultBehavior.followBehavior.recenter();\r\n }\r\n });\r\n\r\n this._closeButton.onPointerClickObservable.add(() => {\r\n this.dispose();\r\n });\r\n\r\n node.rotationQuaternion = Quaternion.Identity();\r\n node.isVisible = false;\r\n\r\n return node;\r\n }\r\n\r\n private _attachContentPlateBehavior() {\r\n this._contentDragBehavior.attach(this._contentPlate);\r\n this._contentDragBehavior.moveAttached = false;\r\n this._contentDragBehavior.useObjectOrientationForDragging = true;\r\n this._contentDragBehavior.updateDragPlane = false;\r\n\r\n const origin = new Vector3();\r\n const worldDimensions = new Vector3();\r\n const upWorld = new Vector3();\r\n const rightWorld = new Vector3();\r\n const projectedOffset = new Vector2();\r\n let startViewport: Viewport;\r\n let worldMatrix: Matrix;\r\n\r\n this._contentDragBehavior.onDragStartObservable.add((event) => {\r\n if (!this.node) {\r\n return;\r\n }\r\n startViewport = this._contentViewport.clone();\r\n worldMatrix = this.node.computeWorldMatrix(true);\r\n\r\n origin.copyFrom(event.dragPlanePoint);\r\n worldDimensions.copyFrom(this.dimensions);\r\n worldDimensions.y -= this.backplateDimensions.y + this.backPlateMargin;\r\n Vector3.TransformNormalToRef(worldDimensions, worldMatrix, worldDimensions);\r\n upWorld.copyFromFloats(0, 1, 0);\r\n Vector3.TransformNormalToRef(upWorld, worldMatrix, upWorld);\r\n rightWorld.copyFromFloats(1, 0, 0);\r\n Vector3.TransformNormalToRef(rightWorld, worldMatrix, rightWorld);\r\n upWorld.normalize();\r\n upWorld.scaleInPlace(1 / Vector3.Dot(upWorld, worldDimensions));\r\n rightWorld.normalize();\r\n rightWorld.scaleInPlace(1 / Vector3.Dot(rightWorld, worldDimensions));\r\n });\r\n\r\n const offset = new Vector3();\r\n this._contentDragBehavior.onDragObservable.add((event) => {\r\n offset.copyFrom(event.dragPlanePoint);\r\n offset.subtractInPlace(origin);\r\n projectedOffset.copyFromFloats(Vector3.Dot(offset, rightWorld), Vector3.Dot(offset, upWorld));\r\n\r\n // By default, content takes full width available and height is cropped to keep aspect ratio\r\n this._contentViewport.x = Scalar.Clamp(startViewport.x - offset.x, 0, 1 - this._contentViewport.width * this._contentScaleRatio);\r\n this._contentViewport.y = Scalar.Clamp(startViewport.y - offset.y, 0, 1 - this._contentViewport.height * this._contentScaleRatio);\r\n this._applyContentViewport();\r\n });\r\n }\r\n\r\n protected _affectMaterial(mesh: AbstractMesh) {\r\n // TODO share materials\r\n this._backPlateMaterial = new FluentBackplateMaterial(`${this.name} plateMaterial`, mesh.getScene());\r\n\r\n this._pickedPointObserver = this._host.onPickedPointChangedObservable.add((pickedPoint) => {\r\n // if (pickedPoint) {\r\n // this._backPlateMaterial. = pickedPoint;\r\n // this._backPlateMaterial.hoverColor.a = 1.0;\r\n // } else {\r\n // this._backPlateMaterial.hoverColor.a = 0;\r\n // }\r\n });\r\n\r\n this._contentMaterial = new FluentMaterial(this.name + \"contentMaterial\", mesh.getScene());\r\n this._contentMaterial.renderBorders = true;\r\n\r\n this._backPlate.material = this._backPlateMaterial;\r\n this._contentPlate.material = this._contentMaterial;\r\n\r\n this._rebuildContent();\r\n this._applyContentViewport();\r\n }\r\n\r\n /** @hidden **/\r\n public _prepareNode(scene: Scene): void {\r\n super._prepareNode(scene);\r\n this._gizmo = new SlateGizmo(this._host.utilityLayer!);\r\n this._gizmo.attachedSlate = this;\r\n this._defaultBehavior = new DefaultBehavior();\r\n this._defaultBehavior.attach(this.node as Mesh, [this._backPlate]);\r\n\r\n this._positionChangedObserver = this._defaultBehavior.sixDofDragBehavior.onPositionChangedObservable.add(() => {\r\n this._gizmo.updateBoundingBox();\r\n });\r\n\r\n this._updatePivot();\r\n this.resetDefaultAspectAndPose();\r\n }\r\n\r\n /**\r\n * Resets the aspect and pose of the slate so it is right in front of the active camera, facing towards it.\r\n */\r\n public resetDefaultAspectAndPose() {\r\n if (!this._host || !this._host.utilityLayer || !this.node) {\r\n return;\r\n }\r\n const scene = this._host.utilityLayer.utilityLayerScene;\r\n const camera = scene.activeCamera;\r\n if (camera) {\r\n const worldMatrix = camera.getWorldMatrix();\r\n const backward = Vector3.TransformNormal(Vector3.Backward(scene.useRightHandedSystem), worldMatrix);\r\n this.dimensions.copyFrom(this.defaultDimensions);\r\n this.origin.setAll(0);\r\n this._gizmo.updateBoundingBox();\r\n const pivot = this.node.getAbsolutePivotPoint();\r\n this.node.position.copyFrom(camera.position).subtractInPlace(backward).subtractInPlace(pivot);\r\n this.node.rotationQuaternion = Quaternion.FromLookDirectionLH(backward, new Vector3(0, 1, 0));\r\n }\r\n }\r\n\r\n /**\r\n * Releases all associated resources\r\n */\r\n public dispose() {\r\n super.dispose();\r\n this._backPlateMaterial.dispose();\r\n this._contentMaterial.dispose();\r\n\r\n this._backPlate.dispose();\r\n this._contentPlate.dispose();\r\n\r\n this._followButton.dispose();\r\n this._closeButton.dispose();\r\n\r\n this._host.onPickedPointChangedObservable.remove(this._pickedPointObserver);\r\n this._defaultBehavior.sixDofDragBehavior.onPositionChangedObservable.remove(this._positionChangedObserver);\r\n\r\n this._defaultBehavior.detach();\r\n this._gizmo.dispose();\r\n this._contentDragBehavior.detach();\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"holographicSlate.js","sourceRoot":"","sources":["../../../../sourceES6/gui/src/3D/controls/holographicSlate.ts"],"names":[],"mappings":"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","sourcesContent":["import { ContentDisplay3D } from \"./contentDisplay3D\";\r\nimport { Control3D } from \"./control3D\";\r\nimport { TouchHolographicButton } from \"./touchHolographicButton\";\r\nimport { AdvancedDynamicTexture } from \"../../2D/advancedDynamicTexture\";\r\nimport { Control } from \"../../2D/controls/control\";\r\nimport { TextBlock, TextWrapping } from \"../../2D/controls/textBlock\";\r\nimport { DefaultBehavior } from \"../behaviors/defaultBehavior\";\r\nimport { SlateGizmo } from \"../gizmos/slateGizmo\";\r\nimport { FluentMaterial } from \"../materials/fluent/fluentMaterial\";\r\nimport { FluentBackplateMaterial } from \"../materials/fluentBackplate/fluentBackplateMaterial\";\r\nimport { PointerDragBehavior } from \"@babylonjs/core/Behaviors/Meshes/pointerDragBehavior\";\r\nimport { Texture } from \"@babylonjs/core/Materials/Textures/texture\";\r\nimport { Vector4 } from \"@babylonjs/core/Maths/math\";\r\nimport { Epsilon } from \"@babylonjs/core/Maths/math.constants\";\r\nimport { Scalar } from \"@babylonjs/core/Maths/math.scalar\";\r\nimport { Matrix, Quaternion, Vector2, Vector3 } from \"@babylonjs/core/Maths/math.vector\";\r\nimport { Viewport } from \"@babylonjs/core/Maths/math.viewport\";\r\nimport { AbstractMesh } from \"@babylonjs/core/Meshes/abstractMesh\";\r\nimport { CreateBox } from \"@babylonjs/core/Meshes/Builders/boxBuilder\";\r\nimport { CreatePlane } from \"@babylonjs/core/Meshes/Builders/planeBuilder\";\r\nimport { TransformNode } from \"@babylonjs/core/Meshes/transformNode\";\r\nimport { Mesh } from \"@babylonjs/core/Meshes/mesh\";\r\nimport { VertexData } from \"@babylonjs/core/Meshes/mesh.vertexData\";\r\nimport { Observer } from \"@babylonjs/core/Misc/observable\";\r\nimport { Scene } from \"@babylonjs/core/scene\";\r\nimport { Nullable } from \"@babylonjs/core/types\";\r\n\r\n/**\r\n * Class used to create a holographic slate\r\n * @since 5.0.0\r\n */\r\nexport class HolographicSlate extends ContentDisplay3D {\r\n /**\r\n * Base Url for the assets.\r\n */\r\n public static ASSETS_BASE_URL: string = \"https://assets.babylonjs.com/meshes/MRTK/\";\r\n /**\r\n * File name for the close icon.\r\n */\r\n public static CLOSE_ICON_FILENAME: string = \"IconClose.png\";\r\n /**\r\n * File name for the close icon.\r\n */\r\n public static FOLLOW_ICON_FILENAME: string = \"IconFollowMe.png\";\r\n\r\n private static DEFAULT_TEXT_RESOLUTION_Y = 102.4;\r\n\r\n /**\r\n * Margin between title bar and contentplate\r\n */\r\n public titleBarMargin = 0.005;\r\n\r\n /**\r\n * Origin in local coordinates (top left corner)\r\n */\r\n public origin = new Vector3(0, 0, 0);\r\n\r\n private _dimensions = new Vector2(21.875, 12.5);\r\n private _titleBarHeight = 0.625;\r\n\r\n private _titleBarMaterial: FluentBackplateMaterial;\r\n private _backMaterial: FluentBackplateMaterial;\r\n private _contentMaterial: FluentMaterial;\r\n private _pickedPointObserver: Nullable<Observer<Nullable<Vector3>>>;\r\n private _positionChangedObserver: Nullable<Observer<{ position: Vector3 }>>;\r\n\r\n private _titleText = \"\";\r\n private _titleTextComponent: TextBlock;\r\n\r\n private _contentViewport: Viewport;\r\n private _contentDragBehavior: PointerDragBehavior;\r\n\r\n private _defaultBehavior: DefaultBehavior;\r\n /**\r\n * Regroups all mesh behaviors for the slate\r\n */\r\n public get defaultBehavior(): DefaultBehavior {\r\n return this._defaultBehavior;\r\n }\r\n\r\n /** @hidden */\r\n public _gizmo: SlateGizmo;\r\n\r\n protected _titleBar: Mesh;\r\n protected _titleBarTitle: Mesh;\r\n protected _contentPlate: Mesh;\r\n protected _backPlate: Mesh;\r\n /** @hidden */\r\n public _followButton: TouchHolographicButton;\r\n protected _closeButton: TouchHolographicButton;\r\n protected _contentScaleRatio = 1;\r\n\r\n /**\r\n * 2D dimensions of the slate\r\n */\r\n public get dimensions() {\r\n return this._dimensions;\r\n }\r\n public set dimensions(value) {\r\n //clamp, respecting ratios\r\n let scale = 1.0;\r\n if (value.x < this.minDimensions.x || value.y < this.minDimensions.y) {\r\n const newRatio = value.x / value.y;\r\n const minRatio = this.minDimensions.x / this.minDimensions.y;\r\n if (minRatio > newRatio) {\r\n // We just need to make sure the x-val is greater than the min\r\n scale = this.minDimensions.x / value.x;\r\n }\r\n else {\r\n // We just need to make sure the y-val is greater than the min\r\n scale = this.minDimensions.y / value.y;\r\n }\r\n }\r\n\r\n this._dimensions.copyFrom(value).scaleInPlace(scale);\r\n this._updatePivot();\r\n this._positionElements();\r\n }\r\n\r\n /**\r\n * Minimum dimensions of the slate\r\n */\r\n public minDimensions = new Vector2(15.625, 6.25);\r\n\r\n /**\r\n * Default dimensions of the slate\r\n */\r\n public readonly defaultDimensions = this._dimensions.clone();\r\n\r\n /**\r\n * Height of the title bar component\r\n */\r\n public get titleBarHeight() {\r\n return this._titleBarHeight;\r\n }\r\n public set titleBarHeight(value) {\r\n this._titleBarHeight = value;\r\n }\r\n\r\n /**\r\n * Rendering ground id of all the meshes\r\n */\r\n public set renderingGroupId(id: number) {\r\n this._titleBar.renderingGroupId = id;\r\n this._titleBarTitle.renderingGroupId = id;\r\n this._contentPlate.renderingGroupId = id;\r\n this._backPlate.renderingGroupId = id;\r\n }\r\n public get renderingGroupId(): number {\r\n return this._titleBar.renderingGroupId;\r\n }\r\n\r\n /**\r\n * The title text displayed at the top of the slate\r\n */\r\n public set title(title: string) {\r\n this._titleText = title;\r\n if (this._titleTextComponent) {\r\n this._titleTextComponent.text = title;\r\n }\r\n }\r\n public get title() {\r\n return this._titleText;\r\n }\r\n\r\n /**\r\n * Creates a new slate\r\n * @param name defines the control name\r\n */\r\n constructor(name?: string) {\r\n super(name);\r\n\r\n this._followButton = new TouchHolographicButton(\"followButton\" + this.name);\r\n this._followButton.isToggleButton = true;\r\n this._closeButton = new TouchHolographicButton(\"closeButton\" + this.name);\r\n\r\n this._contentViewport = new Viewport(0, 0, 1, 1);\r\n this._contentDragBehavior = new PointerDragBehavior({\r\n dragPlaneNormal: new Vector3(0, 0, -1),\r\n });\r\n }\r\n\r\n /**\r\n * Apply the facade texture (created from the content property).\r\n * This function can be overloaded by child classes\r\n * @param facadeTexture defines the AdvancedDynamicTexture to use\r\n */\r\n protected _applyFacade(facadeTexture: AdvancedDynamicTexture) {\r\n this._contentMaterial.albedoTexture = facadeTexture;\r\n this._resetContentPositionAndZoom();\r\n this._applyContentViewport();\r\n\r\n facadeTexture.attachToMesh(this._contentPlate, true);\r\n }\r\n\r\n private _addControl(control: Control3D): void {\r\n control._host = this._host;\r\n if (this._host.utilityLayer) {\r\n control._prepareNode(this._host.utilityLayer.utilityLayerScene);\r\n }\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"HolographicSlate\";\r\n }\r\n\r\n /**\r\n * @hidden\r\n */\r\n public _positionElements() {\r\n const followButton = this._followButton;\r\n const closeButton = this._closeButton;\r\n const titleBar = this._titleBar;\r\n const titleBarTitle = this._titleBarTitle;\r\n const contentPlate = this._contentPlate;\r\n const backPlate = this._backPlate;\r\n\r\n if (followButton && closeButton && titleBar) {\r\n closeButton.scaling.setAll(this.titleBarHeight);\r\n followButton.scaling.setAll(this.titleBarHeight);\r\n closeButton.position\r\n .copyFromFloats(\r\n this.dimensions.x - this.titleBarHeight / 2,\r\n -this.titleBarHeight / 2,\r\n 0\r\n )\r\n .addInPlace(this.origin);\r\n followButton.position\r\n .copyFromFloats(\r\n this.dimensions.x - (3 * this.titleBarHeight) / 2,\r\n -this.titleBarHeight / 2,\r\n 0\r\n )\r\n .addInPlace(this.origin);\r\n\r\n const contentPlateHeight = this.dimensions.y - this.titleBarHeight - this.titleBarMargin;\r\n const rightHandScene = contentPlate.getScene().useRightHandedSystem;\r\n\r\n titleBar.scaling.set(this.dimensions.x, this.titleBarHeight, Epsilon);\r\n titleBarTitle.scaling.set(this.dimensions.x - (2 * this.titleBarHeight), this.titleBarHeight, Epsilon);\r\n contentPlate.scaling.copyFromFloats(this.dimensions.x, contentPlateHeight, Epsilon);\r\n backPlate.scaling.copyFromFloats(this.dimensions.x, contentPlateHeight, Epsilon);\r\n\r\n titleBar.position.copyFromFloats(this.dimensions.x / 2, -(this.titleBarHeight / 2), 0).addInPlace(this.origin);\r\n titleBarTitle.position.copyFromFloats((this.dimensions.x / 2) - this.titleBarHeight, -(this.titleBarHeight / 2), rightHandScene ? Epsilon : -Epsilon).addInPlace(this.origin);\r\n contentPlate.position.copyFromFloats(this.dimensions.x / 2, -(this.titleBarHeight + this.titleBarMargin + contentPlateHeight / 2), 0).addInPlace(this.origin);\r\n backPlate.position.copyFromFloats(this.dimensions.x / 2, -(this.titleBarHeight + this.titleBarMargin + contentPlateHeight / 2), rightHandScene ? -Epsilon : Epsilon).addInPlace(this.origin);\r\n\r\n // Update the title's AdvancedDynamicTexture scale to avoid visual stretching\r\n this._titleTextComponent.host.scaleTo(HolographicSlate.DEFAULT_TEXT_RESOLUTION_Y * titleBarTitle.scaling.x / titleBarTitle.scaling.y, HolographicSlate.DEFAULT_TEXT_RESOLUTION_Y);\r\n\r\n const aspectRatio = this.dimensions.x / contentPlateHeight;\r\n this._contentViewport.width = this._contentScaleRatio;\r\n this._contentViewport.height = this._contentScaleRatio / aspectRatio;\r\n\r\n this._applyContentViewport();\r\n if (this._gizmo) {\r\n this._gizmo.updateBoundingBox();\r\n }\r\n }\r\n }\r\n\r\n private _applyContentViewport() {\r\n if (this._contentPlate?.material && (this._contentPlate.material as FluentMaterial).albedoTexture) {\r\n const tex = (this._contentPlate.material as FluentMaterial).albedoTexture as Texture;\r\n tex.uScale = this._contentScaleRatio;\r\n tex.vScale = (this._contentScaleRatio / this._contentViewport.width) * this._contentViewport.height;\r\n tex.uOffset = this._contentViewport.x;\r\n tex.vOffset = this._contentViewport.y;\r\n }\r\n }\r\n\r\n private _resetContentPositionAndZoom() {\r\n this._contentViewport.x = 0;\r\n this._contentViewport.y = 1 - this._contentViewport.height / this._contentViewport.width;\r\n this._contentScaleRatio = 1;\r\n }\r\n\r\n /**\r\n * @hidden\r\n */\r\n public _updatePivot() {\r\n if (!this.mesh) {\r\n return;\r\n }\r\n\r\n // Update pivot point so it is at the center of geometry\r\n // As origin is topleft corner in 2D, dimensions are calculated towards bottom right corner, thus y axis is downwards\r\n const center = new Vector3(this.dimensions.x * 0.5, -this.dimensions.y * 0.5, Epsilon);\r\n center.addInPlace(this.origin);\r\n center.z = 0;\r\n\r\n const origin = new Vector3(0, 0, 0);\r\n Vector3.TransformCoordinatesToRef(origin, this.mesh.computeWorldMatrix(true), origin);\r\n this.mesh.setPivotPoint(center);\r\n const origin2 = new Vector3(0, 0, 0);\r\n Vector3.TransformCoordinatesToRef(origin2, this.mesh.computeWorldMatrix(true), origin2);\r\n this.mesh.position.addInPlace(origin).subtractInPlace(origin2);\r\n }\r\n\r\n // Mesh association\r\n protected _createNode(scene: Scene): TransformNode {\r\n const node = new Mesh(\"slate_\" + this.name, scene);\r\n\r\n this._titleBar = CreateBox(\"titleBar_\" + this.name, { size: 1 }, scene);\r\n this._titleBarTitle = CreatePlane(\"titleText_\" + this.name, { size: 1 }, scene);\r\n this._titleBarTitle.parent = node;\r\n this._titleBarTitle.isPickable = false;\r\n\r\n var adt = AdvancedDynamicTexture.CreateForMesh(this._titleBarTitle);\r\n this._titleTextComponent = new TextBlock(\"titleText_\" + this.name, this._titleText);\r\n this._titleTextComponent.textWrapping = TextWrapping.Ellipsis;\r\n this._titleTextComponent.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n this._titleTextComponent.color = \"white\";\r\n this._titleTextComponent.fontSize = HolographicSlate.DEFAULT_TEXT_RESOLUTION_Y / 2;\r\n this._titleTextComponent.paddingLeft = HolographicSlate.DEFAULT_TEXT_RESOLUTION_Y / 4;\r\n adt.addControl(this._titleTextComponent);\r\n\r\n if (scene.useRightHandedSystem) {\r\n const faceUV = new Vector4(0, 0, 1, 1);\r\n this._contentPlate = CreatePlane(\"contentPlate_\" + this.name, { size: 1, sideOrientation: VertexData.BACKSIDE, frontUVs: faceUV }, scene);\r\n this._backPlate = CreatePlane(\"backPlate_\" + this.name, { size: 1, sideOrientation: VertexData.FRONTSIDE }, scene);\r\n }\r\n else {\r\n const faceUV = new Vector4(0, 0, 1, 1);\r\n this._contentPlate = CreatePlane(\"contentPlate_\" + this.name, { size: 1, sideOrientation: VertexData.FRONTSIDE, frontUVs: faceUV }, scene);\r\n this._backPlate = CreatePlane(\"backPlate_\" + this.name, { size: 1, sideOrientation: VertexData.BACKSIDE }, scene);\r\n }\r\n\r\n this._titleBar.parent = node;\r\n this._titleBar.isNearGrabbable = true;\r\n this._contentPlate.parent = node;\r\n this._backPlate.parent = node;\r\n this._attachContentPlateBehavior();\r\n\r\n this._addControl(this._followButton);\r\n this._addControl(this._closeButton);\r\n\r\n const followButton = this._followButton;\r\n const closeButton = this._closeButton;\r\n\r\n followButton.node!.parent = node;\r\n closeButton.node!.parent = node;\r\n\r\n this._positionElements();\r\n\r\n this._followButton.imageUrl = HolographicSlate.ASSETS_BASE_URL + HolographicSlate.FOLLOW_ICON_FILENAME;\r\n this._closeButton.imageUrl = HolographicSlate.ASSETS_BASE_URL + HolographicSlate.CLOSE_ICON_FILENAME;\r\n\r\n this._followButton.isBackplateVisible = false;\r\n this._closeButton.isBackplateVisible = false;\r\n\r\n this._followButton.onToggleObservable.add((isToggled) => {\r\n this._defaultBehavior.followBehaviorEnabled = isToggled;\r\n if (this._defaultBehavior.followBehaviorEnabled) {\r\n this._defaultBehavior.followBehavior.recenter();\r\n }\r\n });\r\n\r\n this._closeButton.onPointerClickObservable.add(() => {\r\n this.dispose();\r\n });\r\n\r\n node.rotationQuaternion = Quaternion.Identity();\r\n node.isVisible = false;\r\n\r\n return node;\r\n }\r\n\r\n private _attachContentPlateBehavior() {\r\n this._contentDragBehavior.attach(this._contentPlate);\r\n this._contentDragBehavior.moveAttached = false;\r\n this._contentDragBehavior.useObjectOrientationForDragging = true;\r\n this._contentDragBehavior.updateDragPlane = false;\r\n\r\n const origin = new Vector3();\r\n const worldDimensions = new Vector3();\r\n const upWorld = new Vector3();\r\n const rightWorld = new Vector3();\r\n const projectedOffset = new Vector2();\r\n let startViewport: Viewport;\r\n let worldMatrix: Matrix;\r\n\r\n this._contentDragBehavior.onDragStartObservable.add((event) => {\r\n if (!this.node) {\r\n return;\r\n }\r\n startViewport = this._contentViewport.clone();\r\n worldMatrix = this.node.computeWorldMatrix(true);\r\n\r\n origin.copyFrom(event.dragPlanePoint);\r\n worldDimensions.set(this.dimensions.x, this.dimensions.y, Epsilon);\r\n worldDimensions.y -= this.titleBarHeight + this.titleBarMargin;\r\n Vector3.TransformNormalToRef(worldDimensions, worldMatrix, worldDimensions);\r\n upWorld.copyFromFloats(0, 1, 0);\r\n Vector3.TransformNormalToRef(upWorld, worldMatrix, upWorld);\r\n rightWorld.copyFromFloats(1, 0, 0);\r\n Vector3.TransformNormalToRef(rightWorld, worldMatrix, rightWorld);\r\n upWorld.normalize();\r\n upWorld.scaleInPlace(1 / Vector3.Dot(upWorld, worldDimensions));\r\n rightWorld.normalize();\r\n rightWorld.scaleInPlace(1 / Vector3.Dot(rightWorld, worldDimensions));\r\n });\r\n\r\n const offset = new Vector3();\r\n this._contentDragBehavior.onDragObservable.add((event) => {\r\n offset.copyFrom(event.dragPlanePoint);\r\n offset.subtractInPlace(origin);\r\n projectedOffset.copyFromFloats(Vector3.Dot(offset, rightWorld), Vector3.Dot(offset, upWorld));\r\n\r\n // By default, content takes full width available and height is cropped to keep aspect ratio\r\n this._contentViewport.x = Scalar.Clamp(startViewport.x - offset.x, 0, 1 - this._contentViewport.width * this._contentScaleRatio);\r\n this._contentViewport.y = Scalar.Clamp(startViewport.y - offset.y, 0, 1 - this._contentViewport.height * this._contentScaleRatio);\r\n this._applyContentViewport();\r\n });\r\n }\r\n\r\n protected _affectMaterial(mesh: AbstractMesh) {\r\n // TODO share materials\r\n this._titleBarMaterial = new FluentBackplateMaterial(`${this.name} plateMaterial`, mesh.getScene());\r\n\r\n this._contentMaterial = new FluentMaterial(`${this.name} contentMaterial`, mesh.getScene());\r\n this._contentMaterial.renderBorders = true;\r\n\r\n this._backMaterial = new FluentBackplateMaterial(`${this.name} backPlate`, mesh.getScene());\r\n this._backMaterial.lineWidth = Epsilon;\r\n this._backMaterial.radius = 0.005;\r\n this._backMaterial.backFaceCulling = true;\r\n\r\n this._titleBar.material = this._titleBarMaterial;\r\n this._contentPlate.material = this._contentMaterial;\r\n this._backPlate.material = this._backMaterial;\r\n\r\n this._resetContent();\r\n this._applyContentViewport();\r\n }\r\n\r\n /** @hidden **/\r\n public _prepareNode(scene: Scene): void {\r\n super._prepareNode(scene);\r\n this._gizmo = new SlateGizmo(this._host.utilityLayer!);\r\n this._gizmo.attachedSlate = this;\r\n this._defaultBehavior = new DefaultBehavior();\r\n this._defaultBehavior.attach(this.node as Mesh, [this._titleBar]);\r\n this._defaultBehavior.sixDofDragBehavior.onDragStartObservable.add(() => {\r\n this._followButton.isToggled = false;\r\n });\r\n\r\n this._positionChangedObserver = this._defaultBehavior.sixDofDragBehavior.onPositionChangedObservable.add(() => {\r\n this._gizmo.updateBoundingBox();\r\n });\r\n\r\n this._updatePivot();\r\n this.resetDefaultAspectAndPose(false);\r\n }\r\n\r\n /**\r\n * Resets the aspect and pose of the slate so it is right in front of the active camera, facing towards it.\r\n * @param resetAspect Should the slate's dimensions/aspect ratio be reset as well\r\n */\r\n public resetDefaultAspectAndPose(resetAspect: boolean = true) {\r\n if (!this._host || !this._host.utilityLayer || !this.node) {\r\n return;\r\n }\r\n const scene = this._host.utilityLayer.utilityLayerScene;\r\n const camera = scene.activeCamera;\r\n if (camera) {\r\n const worldMatrix = camera.getWorldMatrix();\r\n const backward = Vector3.TransformNormal(Vector3.Backward(scene.useRightHandedSystem), worldMatrix);\r\n this.origin.setAll(0);\r\n this._gizmo.updateBoundingBox();\r\n const pivot = this.node.getAbsolutePivotPoint();\r\n this.node.position.copyFrom(camera.position).subtractInPlace(backward).subtractInPlace(pivot);\r\n this.node.rotationQuaternion = Quaternion.FromLookDirectionLH(backward, new Vector3(0, 1, 0));\r\n\r\n if (resetAspect) {\r\n this.dimensions = this.defaultDimensions;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Releases all associated resources\r\n */\r\n public dispose() {\r\n super.dispose();\r\n this._titleBarMaterial.dispose();\r\n this._contentMaterial.dispose();\r\n\r\n this._titleBar.dispose();\r\n this._titleBarTitle.dispose();\r\n this._contentPlate.dispose();\r\n this._backPlate.dispose();\r\n\r\n this._followButton.dispose();\r\n this._closeButton.dispose();\r\n\r\n this._host.onPickedPointChangedObservable.remove(this._pickedPointObserver);\r\n this._defaultBehavior.sixDofDragBehavior.onPositionChangedObservable.remove(this._positionChangedObserver);\r\n\r\n this._defaultBehavior.detach();\r\n this._gizmo.dispose();\r\n this._contentDragBehavior.detach();\r\n }\r\n}\r\n"]}
|