babylonjs-gui 9.4.1 → 9.5.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/babylon.gui.js +2 -2
- package/babylon.gui.js.map +1 -0
- package/babylon.gui.min.js +2 -2
- package/babylon.gui.min.js.map +1 -1
- package/package.json +6 -10
- package/rollup.config.umd.mjs +17 -0
- package/src/index.ts +9 -4
- package/webpack.config.js +0 -16
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"babylon.gui.min.js","sources":["file:///home/vsts/work/1/s/node_modules/tslib/tslib.es6.js","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/valueAndUnit.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/measure.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/math2D.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/control.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/container.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/rectangle.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/textBlock.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/image.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/button.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/stackPanel.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/checkbox.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/textWrapper.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/inputText.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/grid.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/colorpicker.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/ellipse.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/focusableButton.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/inputTextArea.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/inputPassword.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/line.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/multiLinePoint.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/multiLine.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/radioButton.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/sliders/baseSlider.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/sliders/slider.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/selector.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/scrollViewers/scrollViewerWindow.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/sliders/scrollBar.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/sliders/imageScrollBar.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/scrollViewers/scrollViewer.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/toggleButton.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/virtualKeyboard.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/displayGrid.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/sliders/imageBasedSlider.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/statics.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/gradient/BaseGradient.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/gradient/LinearGradient.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/controls/gradient/RadialGradient.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/style.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/advancedDynamicTexture.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/adtInstrumentation.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/FrameGraph/guiTask.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/FrameGraph/renderGraphGUIBlock.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/2D/xmlLoader.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/vector3WithInfo.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/controls/control3D.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/controls/contentDisplay3D.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/controls/abstractButton3D.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/controls/button3D.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/controls/container3D.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/controls/volumeBasedPanel.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/controls/cylinderPanel.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/fluent/shaders/fluent.vertex.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/fluent/shaders/fluent.fragment.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/fluent/fluentMaterial.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/controls/touchHolographicMenu.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/controls/handMenu.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/fluentBackplate/shaders/fluentBackplate.fragment.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/fluentBackplate/shaders/fluentBackplate.vertex.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/fluentBackplate/fluentBackplateMaterial.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/controls/holographicBackplate.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/controls/holographicButton.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/fluentButton/shaders/fluentButton.fragment.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/fluentButton/shaders/fluentButton.vertex.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/fluentButton/fluentButtonMaterial.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/controls/touchButton3D.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/controls/touchHolographicButton.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/behaviors/defaultBehavior.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/handle/shaders/handle.vertex.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/handle/shaders/handle.fragment.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/gizmos/gizmoHandle.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/handle/handleMaterial.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/gizmos/slateGizmo.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/controls/holographicSlate.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/controls/meshButton3D.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/controls/nearMenu.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/controls/planePanel.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/controls/scatterPanel.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/mrdl/shaders/mrdlSliderBar.fragment.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/mrdl/shaders/mrdlSliderBar.vertex.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/mrdl/mrdlSliderBarMaterial.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/mrdl/shaders/mrdlSliderThumb.fragment.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/mrdl/shaders/mrdlSliderThumb.vertex.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/mrdl/mrdlSliderThumbMaterial.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/mrdl/shaders/mrdlBackplate.fragment.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/mrdl/shaders/mrdlBackplate.vertex.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/mrdl/mrdlBackplateMaterial.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/controls/slider3D.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/controls/spherePanel.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/controls/stackPanel3D.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/controls/touchMeshButton3D.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/mrdl/shaders/mrdlBackglow.fragment.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/mrdl/shaders/mrdlBackglow.vertex.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/mrdl/mrdlBackglowMaterial.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/mrdl/shaders/mrdlFrontplate.fragment.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/mrdl/shaders/mrdlFrontplate.vertex.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/mrdl/mrdlFrontplateMaterial.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/mrdl/shaders/mrdlInnerquad.fragment.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/mrdl/shaders/mrdlInnerquad.vertex.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/materials/mrdl/mrdlInnerquadMaterial.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/controls/MRTK3/touchHolographicButton.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/3D/gui3DManager.ts","file:///home/vsts/work/1/s/packages/dev/gui/src/legacy/legacy.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import { Observable } from \"core/Misc/observable\";\r\nimport { type AdvancedDynamicTexture } from \"./advancedDynamicTexture\";\r\n\r\n/**\r\n * Class used to specific a value and its associated unit\r\n */\r\nexport class ValueAndUnit {\r\n private _value = 1;\r\n private _unit = ValueAndUnit.UNITMODE_PIXEL;\r\n private _originalUnit: number;\r\n\r\n /**\r\n * Gets or sets a value indicating that this value will not scale accordingly with adaptive scaling property\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#adaptive-scaling\r\n */\r\n public ignoreAdaptiveScaling = false;\r\n\r\n /**\r\n * Observable event triggered each time the value or unit changes\r\n */\r\n public onChangedObservable = new Observable<void>();\r\n\r\n /**\r\n * Creates a new ValueAndUnit\r\n * @param value defines the value to store\r\n * @param unit defines the unit to store - defaults to ValueAndUnit.UNITMODE_PIXEL\r\n * @param negativeValueAllowed defines a boolean indicating if the value can be negative\r\n */\r\n public constructor(\r\n value: number,\r\n /** defines the unit to store */\r\n unit = ValueAndUnit.UNITMODE_PIXEL,\r\n /** defines a boolean indicating if the value can be negative */\r\n public negativeValueAllowed = true\r\n ) {\r\n this._value = value;\r\n this._unit = unit;\r\n this._originalUnit = unit;\r\n }\r\n\r\n /** Gets a boolean indicating if the value is a percentage */\r\n public get isPercentage(): boolean {\r\n return this._unit === ValueAndUnit.UNITMODE_PERCENTAGE;\r\n }\r\n\r\n /** Gets a boolean indicating if the value is store as pixel */\r\n public get isPixel(): boolean {\r\n return this._unit === ValueAndUnit.UNITMODE_PIXEL;\r\n }\r\n\r\n /**\r\n * Gets value (without units)\r\n * @deprecated use value property instead\r\n */\r\n public get internalValue(): number {\r\n return this._value;\r\n }\r\n\r\n /** Gets value (without units) */\r\n public get value(): number {\r\n return this._value;\r\n }\r\n\r\n /** Sets value (without units) */\r\n public set value(value: number) {\r\n if (value !== this._value) {\r\n this._value = value;\r\n this.onChangedObservable.notifyObservers();\r\n }\r\n }\r\n\r\n /** Gets units (without value) */\r\n public get unit(): number {\r\n return this._unit;\r\n }\r\n\r\n /** Sets units (without value) */\r\n public set unit(value: number) {\r\n if (value !== this._unit) {\r\n this._unit = value;\r\n this.onChangedObservable.notifyObservers();\r\n }\r\n }\r\n\r\n /**\r\n * Gets value as pixel\r\n * @param host defines the root host\r\n * @param refValue defines the reference value for percentages\r\n * @returns the value as pixel\r\n */\r\n public getValueInPixel(host: AdvancedDynamicTexture, refValue: number): number {\r\n if (this.isPixel) {\r\n return this.getValue(host);\r\n }\r\n\r\n return this.getValue(host) * refValue;\r\n }\r\n\r\n /**\r\n * Update the current value and unit.\r\n * @param value defines the value to store\r\n * @param unit defines the unit to store\r\n * @returns the current ValueAndUnit\r\n */\r\n public updateInPlace(value: number, unit = ValueAndUnit.UNITMODE_PIXEL): ValueAndUnit {\r\n if (this.value !== value || this.unit !== unit) {\r\n // set member variables to notify only once\r\n this._value = value;\r\n this._unit = unit;\r\n this.onChangedObservable.notifyObservers();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the value accordingly to its unit\r\n * @param host defines the root host\r\n * @returns the value\r\n */\r\n public getValue(host: AdvancedDynamicTexture): number {\r\n if (host && !this.ignoreAdaptiveScaling && this.unit !== ValueAndUnit.UNITMODE_PERCENTAGE) {\r\n let width: number = 0;\r\n let height: number = 0;\r\n\r\n if (host.idealWidth) {\r\n width = Math.ceil((this._value * host.getSize().width) / host.idealWidth);\r\n }\r\n\r\n if (host.idealHeight) {\r\n height = Math.ceil((this._value * host.getSize().height) / host.idealHeight);\r\n }\r\n\r\n if (host.useSmallestIdeal && host.idealWidth && host.idealHeight) {\r\n return window.innerWidth < window.innerHeight ? width : height;\r\n }\r\n\r\n if (host.idealWidth) {\r\n // horizontal\r\n return width;\r\n }\r\n\r\n if (host.idealHeight) {\r\n // vertical\r\n return height;\r\n }\r\n }\r\n return this._value;\r\n }\r\n\r\n /**\r\n * Gets a string representation of the value\r\n * @param host defines the root host\r\n * @param decimals defines an optional number of decimals to display\r\n * @returns a string\r\n */\r\n public toString(host: AdvancedDynamicTexture, decimals?: number): string {\r\n switch (this._unit) {\r\n case ValueAndUnit.UNITMODE_PERCENTAGE: {\r\n const percentage = this.getValue(host) * 100;\r\n return (decimals ? percentage.toFixed(decimals) : percentage) + \"%\";\r\n }\r\n case ValueAndUnit.UNITMODE_PIXEL: {\r\n const pixels = this.getValue(host);\r\n return (decimals ? pixels.toFixed(decimals) : pixels) + \"px\";\r\n }\r\n }\r\n\r\n return this._unit.toString();\r\n }\r\n\r\n /**\r\n * Store a value parsed from a string\r\n * @param source defines the source string\r\n * @returns true if the value was successfully parsed and updated\r\n */\r\n public fromString(source: string | number): boolean {\r\n const match = ValueAndUnit._Regex.exec(source.toString());\r\n\r\n if (!match || match.length === 0) {\r\n return false;\r\n }\r\n\r\n let sourceValue = parseFloat(match[1]);\r\n let sourceUnit = this._originalUnit;\r\n\r\n if (!this.negativeValueAllowed) {\r\n if (sourceValue < 0) {\r\n sourceValue = 0;\r\n }\r\n }\r\n\r\n if (match.length === 4) {\r\n switch (match[3]) {\r\n case \"px\":\r\n sourceUnit = ValueAndUnit.UNITMODE_PIXEL;\r\n break;\r\n case \"%\":\r\n sourceUnit = ValueAndUnit.UNITMODE_PERCENTAGE;\r\n sourceValue /= 100.0;\r\n break;\r\n }\r\n }\r\n\r\n if (sourceValue === this._value && sourceUnit === this._unit) {\r\n return false;\r\n }\r\n\r\n this._value = sourceValue;\r\n this._unit = sourceUnit;\r\n this.onChangedObservable.notifyObservers();\r\n\r\n return true;\r\n }\r\n\r\n // Static\r\n private static _Regex = /(^-?\\d*(\\.\\d+)?)(%|px)?/;\r\n private static _UNITMODE_PERCENTAGE = 0;\r\n private static _UNITMODE_PIXEL = 1;\r\n\r\n /** UNITMODE_PERCENTAGE */\r\n public static get UNITMODE_PERCENTAGE(): number {\r\n return ValueAndUnit._UNITMODE_PERCENTAGE;\r\n }\r\n\r\n /** UNITMODE_PIXEL */\r\n public static get UNITMODE_PIXEL(): number {\r\n return ValueAndUnit._UNITMODE_PIXEL;\r\n }\r\n}\r\n","import { type Matrix2D } from \"./math2D\";\r\nimport { Vector2 } from \"core/Maths/math.vector\";\r\n\r\nconst TmpRect = [new Vector2(0, 0), new Vector2(0, 0), new Vector2(0, 0), new Vector2(0, 0)];\r\n\r\nconst TmpRect2 = [new Vector2(0, 0), new Vector2(0, 0), new Vector2(0, 0), new Vector2(0, 0)];\r\n\r\nconst TmpV1 = new Vector2(0, 0);\r\nconst TmpV2 = new Vector2(0, 0);\r\n\r\n/**\r\n * Class used to store 2D control sizes\r\n */\r\nexport class Measure {\r\n /**\r\n * Creates a new measure\r\n * @param left defines left coordinate\r\n * @param top defines top coordinate\r\n * @param width defines width dimension\r\n * @param height defines height dimension\r\n */\r\n public constructor(\r\n /** defines left coordinate */\r\n public left: number,\r\n /** defines top coordinate */\r\n public top: number,\r\n /** defines width dimension */\r\n public width: number,\r\n /** defines height dimension */\r\n public height: number\r\n ) {}\r\n\r\n /**\r\n * Copy from another measure\r\n * @param other defines the other measure to copy from\r\n */\r\n public copyFrom(other: Measure): void {\r\n this.left = other.left;\r\n this.top = other.top;\r\n this.width = other.width;\r\n this.height = other.height;\r\n }\r\n\r\n /**\r\n * Copy from a group of 4 floats\r\n * @param left defines left coordinate\r\n * @param top defines top coordinate\r\n * @param width defines width dimension\r\n * @param height defines height dimension\r\n */\r\n public copyFromFloats(left: number, top: number, width: number, height: number): void {\r\n this.left = left;\r\n this.top = top;\r\n this.width = width;\r\n this.height = height;\r\n }\r\n\r\n /**\r\n * Computes the axis aligned bounding box measure for two given measures\r\n * @param a Input measure\r\n * @param b Input measure\r\n * @param result the resulting bounding measure\r\n */\r\n public static CombineToRef(a: Measure, b: Measure, result: Measure) {\r\n const left = Math.min(a.left, b.left);\r\n const top = Math.min(a.top, b.top);\r\n const right = Math.max(a.left + a.width, b.left + b.width);\r\n const bottom = Math.max(a.top + a.height, b.top + b.height);\r\n result.left = left;\r\n result.top = top;\r\n result.width = right - left;\r\n result.height = bottom - top;\r\n }\r\n\r\n /**\r\n * Computes the axis aligned bounding box of the measure after it is modified by a given transform\r\n * @param transform the matrix to transform the measure before computing the AABB\r\n * @param addX number to add to left\r\n * @param addY number to add to top\r\n * @param addWidth number to add to width\r\n * @param addHeight number to add to height\r\n * @param result the resulting AABB\r\n */\r\n public addAndTransformToRef(transform: Matrix2D, addX: number, addY: number, addWidth: number, addHeight: number, result: Measure) {\r\n const left = this.left + addX;\r\n const top = this.top + addY;\r\n const width = this.width + addWidth;\r\n const height = this.height + addHeight;\r\n\r\n TmpRect[0].copyFromFloats(left, top);\r\n TmpRect[1].copyFromFloats(left + width, top);\r\n TmpRect[2].copyFromFloats(left + width, top + height);\r\n TmpRect[3].copyFromFloats(left, top + height);\r\n\r\n TmpV1.copyFromFloats(Number.MAX_VALUE, Number.MAX_VALUE);\r\n TmpV2.copyFromFloats(0, 0);\r\n for (let i = 0; i < 4; i++) {\r\n transform.transformCoordinates(TmpRect[i].x, TmpRect[i].y, TmpRect2[i]);\r\n TmpV1.x = Math.floor(Math.min(TmpV1.x, TmpRect2[i].x));\r\n TmpV1.y = Math.floor(Math.min(TmpV1.y, TmpRect2[i].y));\r\n TmpV2.x = Math.ceil(Math.max(TmpV2.x, TmpRect2[i].x));\r\n TmpV2.y = Math.ceil(Math.max(TmpV2.y, TmpRect2[i].y));\r\n }\r\n result.left = TmpV1.x;\r\n result.top = TmpV1.y;\r\n result.width = TmpV2.x - TmpV1.x;\r\n result.height = TmpV2.y - TmpV1.y;\r\n }\r\n\r\n /**\r\n * Computes the axis aligned bounding box of the measure after it is modified by a given transform\r\n * @param transform the matrix to transform the measure before computing the AABB\r\n * @param result the resulting AABB\r\n */\r\n public transformToRef(transform: Matrix2D, result: Measure) {\r\n this.addAndTransformToRef(transform, 0, 0, 0, 0, result);\r\n }\r\n /**\r\n * Check equality between this measure and another one\r\n * @param other defines the other measures\r\n * @returns true if both measures are equals\r\n */\r\n public isEqualsTo(other: Measure): boolean {\r\n if (this.left !== other.left) {\r\n return false;\r\n }\r\n\r\n if (this.top !== other.top) {\r\n return false;\r\n }\r\n\r\n if (this.width !== other.width) {\r\n return false;\r\n }\r\n\r\n if (this.height !== other.height) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Creates an empty measure\r\n * @returns a new measure\r\n */\r\n public static Empty(): Measure {\r\n return new Measure(0, 0, 0, 0);\r\n }\r\n}\r\n","import { type Nullable } from \"core/types\";\r\nimport { Vector2 } from \"core/Maths/math.vector\";\r\nimport { Epsilon } from \"core/Maths/math.constants\";\r\n\r\n/**\r\n * Class used to transport Vector2 information for pointer events\r\n */\r\nexport class Vector2WithInfo extends Vector2 {\r\n /**\r\n * Creates a new Vector2WithInfo\r\n * @param source defines the vector2 data to transport\r\n * @param buttonIndex defines the current mouse button index\r\n */\r\n public constructor(\r\n source: Vector2,\r\n /** defines the current mouse button index */\r\n public buttonIndex: number = 0\r\n ) {\r\n super(source.x, source.y);\r\n }\r\n}\r\n\r\n/** Class used to provide 2D matrix features */\r\nexport class Matrix2D {\r\n /** Gets the internal array of 6 floats used to store matrix data */\r\n public m = new Float32Array(6);\r\n\r\n /**\r\n * Creates a new matrix\r\n * @param m00 defines value for (0, 0)\r\n * @param m01 defines value for (0, 1)\r\n * @param m10 defines value for (1, 0)\r\n * @param m11 defines value for (1, 1)\r\n * @param m20 defines value for (2, 0)\r\n * @param m21 defines value for (2, 1)\r\n */\r\n constructor(m00: number, m01: number, m10: number, m11: number, m20: number, m21: number) {\r\n this.fromValues(m00, m01, m10, m11, m20, m21);\r\n }\r\n\r\n /**\r\n * Fills the matrix from direct values\r\n * @param m00 defines value for (0, 0)\r\n * @param m01 defines value for (0, 1)\r\n * @param m10 defines value for (1, 0)\r\n * @param m11 defines value for (1, 1)\r\n * @param m20 defines value for (2, 0)\r\n * @param m21 defines value for (2, 1)\r\n * @returns the current modified matrix\r\n */\r\n public fromValues(m00: number, m01: number, m10: number, m11: number, m20: number, m21: number): Matrix2D {\r\n this.m[0] = m00;\r\n this.m[1] = m01;\r\n this.m[2] = m10;\r\n this.m[3] = m11;\r\n this.m[4] = m20;\r\n this.m[5] = m21;\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets matrix determinant\r\n * @returns the determinant\r\n */\r\n public determinant(): number {\r\n return this.m[0] * this.m[3] - this.m[1] * this.m[2];\r\n }\r\n\r\n /**\r\n * Inverses the matrix and stores it in a target matrix\r\n * @param result defines the target matrix\r\n * @returns the current matrix\r\n */\r\n public invertToRef(result: Matrix2D): Matrix2D {\r\n const l0 = this.m[0];\r\n const l1 = this.m[1];\r\n const l2 = this.m[2];\r\n const l3 = this.m[3];\r\n const l4 = this.m[4];\r\n const l5 = this.m[5];\r\n\r\n const det = this.determinant();\r\n if (det < Epsilon * Epsilon) {\r\n result.m[0] = 0;\r\n result.m[1] = 0;\r\n result.m[2] = 0;\r\n result.m[3] = 0;\r\n result.m[4] = 0;\r\n result.m[5] = 0;\r\n return this;\r\n }\r\n\r\n const detDiv = 1 / det;\r\n\r\n const det4 = l2 * l5 - l3 * l4;\r\n const det5 = l1 * l4 - l0 * l5;\r\n\r\n result.m[0] = l3 * detDiv;\r\n result.m[1] = -l1 * detDiv;\r\n result.m[2] = -l2 * detDiv;\r\n result.m[3] = l0 * detDiv;\r\n result.m[4] = det4 * detDiv;\r\n result.m[5] = det5 * detDiv;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Multiplies the current matrix with another one\r\n * @param other defines the second operand\r\n * @param result defines the target matrix\r\n * @returns the current matrix\r\n */\r\n public multiplyToRef(other: Matrix2D, result: Matrix2D): Matrix2D {\r\n const l0 = this.m[0];\r\n const l1 = this.m[1];\r\n const l2 = this.m[2];\r\n const l3 = this.m[3];\r\n const l4 = this.m[4];\r\n const l5 = this.m[5];\r\n\r\n const r0 = other.m[0];\r\n const r1 = other.m[1];\r\n const r2 = other.m[2];\r\n const r3 = other.m[3];\r\n const r4 = other.m[4];\r\n const r5 = other.m[5];\r\n\r\n result.m[0] = l0 * r0 + l1 * r2;\r\n result.m[1] = l0 * r1 + l1 * r3;\r\n result.m[2] = l2 * r0 + l3 * r2;\r\n result.m[3] = l2 * r1 + l3 * r3;\r\n result.m[4] = l4 * r0 + l5 * r2 + r4;\r\n result.m[5] = l4 * r1 + l5 * r3 + r5;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Applies the current matrix to a set of 2 floats and stores the result in a vector2\r\n * @param x defines the x coordinate to transform\r\n * @param y defines the x coordinate to transform\r\n * @param result defines the target vector2\r\n * @returns the current matrix\r\n */\r\n public transformCoordinates(x: number, y: number, result: Vector2): Matrix2D {\r\n result.x = x * this.m[0] + y * this.m[2] + this.m[4];\r\n result.y = x * this.m[1] + y * this.m[3] + this.m[5];\r\n\r\n return this;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Creates an identity matrix\r\n * @returns a new matrix\r\n */\r\n public static Identity(): Matrix2D {\r\n return new Matrix2D(1, 0, 0, 1, 0, 0);\r\n }\r\n\r\n /**\r\n * Creates an identity matrix and stores it in a target matrix\r\n * @param result defines the target matrix\r\n */\r\n public static IdentityToRef(result: Matrix2D): void {\r\n result.m[0] = 1;\r\n result.m[1] = 0;\r\n result.m[2] = 0;\r\n result.m[3] = 1;\r\n result.m[4] = 0;\r\n result.m[5] = 0;\r\n }\r\n\r\n /**\r\n * Creates a translation matrix and stores it in a target matrix\r\n * @param x defines the x coordinate of the translation\r\n * @param y defines the y coordinate of the translation\r\n * @param result defines the target matrix\r\n */\r\n public static TranslationToRef(x: number, y: number, result: Matrix2D): void {\r\n result.fromValues(1, 0, 0, 1, x, y);\r\n }\r\n\r\n /**\r\n * Creates a scaling matrix and stores it in a target matrix\r\n * @param x defines the x coordinate of the scaling\r\n * @param y defines the y coordinate of the scaling\r\n * @param result defines the target matrix\r\n */\r\n public static ScalingToRef(x: number, y: number, result: Matrix2D): void {\r\n result.fromValues(x, 0, 0, y, 0, 0);\r\n }\r\n\r\n /**\r\n * Creates a rotation matrix and stores it in a target matrix\r\n * @param angle defines the rotation angle\r\n * @param result defines the target matrix\r\n */\r\n public static RotationToRef(angle: number, result: Matrix2D): void {\r\n const s = Math.sin(angle);\r\n const c = Math.cos(angle);\r\n\r\n result.fromValues(c, s, -s, c, 0, 0);\r\n }\r\n\r\n private static _TempPreTranslationMatrix = Matrix2D.Identity();\r\n private static _TempPostTranslationMatrix = Matrix2D.Identity();\r\n private static _TempRotationMatrix = Matrix2D.Identity();\r\n private static _TempScalingMatrix = Matrix2D.Identity();\r\n private static _TempCompose0 = Matrix2D.Identity();\r\n private static _TempCompose1 = Matrix2D.Identity();\r\n private static _TempCompose2 = Matrix2D.Identity();\r\n\r\n /**\r\n * Composes a matrix from translation, rotation, scaling and parent matrix and stores it in a target matrix\r\n * @param tx defines the x coordinate of the translation\r\n * @param ty defines the y coordinate of the translation\r\n * @param angle defines the rotation angle\r\n * @param scaleX defines the x coordinate of the scaling\r\n * @param scaleY defines the y coordinate of the scaling\r\n * @param parentMatrix defines the parent matrix to multiply by (can be null)\r\n * @param result defines the target matrix\r\n */\r\n public static ComposeToRef(tx: number, ty: number, angle: number, scaleX: number, scaleY: number, parentMatrix: Nullable<Matrix2D>, result: Matrix2D): void {\r\n Matrix2D.TranslationToRef(tx, ty, Matrix2D._TempPreTranslationMatrix);\r\n\r\n Matrix2D.ScalingToRef(scaleX, scaleY, Matrix2D._TempScalingMatrix);\r\n\r\n Matrix2D.RotationToRef(angle, Matrix2D._TempRotationMatrix);\r\n\r\n Matrix2D.TranslationToRef(-tx, -ty, Matrix2D._TempPostTranslationMatrix);\r\n\r\n Matrix2D._TempPreTranslationMatrix.multiplyToRef(Matrix2D._TempScalingMatrix, Matrix2D._TempCompose0);\r\n Matrix2D._TempCompose0.multiplyToRef(Matrix2D._TempRotationMatrix, Matrix2D._TempCompose1);\r\n if (parentMatrix) {\r\n Matrix2D._TempCompose1.multiplyToRef(Matrix2D._TempPostTranslationMatrix, Matrix2D._TempCompose2);\r\n Matrix2D._TempCompose2.multiplyToRef(parentMatrix, result);\r\n } else {\r\n Matrix2D._TempCompose1.multiplyToRef(Matrix2D._TempPostTranslationMatrix, result);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Useful math functions\r\n */\r\nexport class MathTools {\r\n /**\r\n * Default rounding precision for GUI elements. It should be\r\n * set to a power of ten, where the exponent means the number\r\n * of decimal digits to round to, i.e, 100 means 2 decimal digits,\r\n * 1000 means 3 decimal digits, etc. Default is 100 (2 decimal digits).\r\n */\r\n public static DefaultRoundingPrecision = 100;\r\n\r\n /**\r\n * Rounds a number to the nearest multiple of a given precision\r\n * @param value the value to be rounded\r\n * @param precision the multiple to which the value will be rounded. Default is 100 (2 decimal digits)\r\n * @returns\r\n */\r\n public static Round(value: number, precision: number = MathTools.DefaultRoundingPrecision): number {\r\n return Math.round(value * precision) / precision;\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport { type Nullable } from \"core/types\";\r\nimport { type Observer, Observable } from \"core/Misc/observable\";\r\nimport { Vector2, Vector3, Matrix } from \"core/Maths/math.vector\";\r\nimport { type PointerInfoBase, PointerEventTypes } from \"core/Events/pointerEvents\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { type TransformNode } from \"core/Meshes/transformNode\";\r\nimport { type Scene } from \"core/scene\";\r\n\r\nimport { type Container } from \"./container\";\r\nimport { type AdvancedDynamicTexture } from \"../advancedDynamicTexture\";\r\nimport { ValueAndUnit } from \"../valueAndUnit\";\r\nimport { Measure } from \"../measure\";\r\nimport { type Style } from \"../style\";\r\nimport { Matrix2D, Vector2WithInfo } from \"../math2D\";\r\nimport { GetClass, RegisterClass } from \"core/Misc/typeStore\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { SerializationHelper } from \"core/Misc/decorators.serialization\";\r\nimport { type ICanvasGradient, type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\nimport { EngineStore } from \"core/Engines/engineStore\";\r\nimport { type IAccessibilityTag } from \"core/IAccessibilityTag\";\r\nimport { type IKeyboardEvent, type IPointerEvent } from \"core/Events/deviceInputEvents\";\r\nimport { type IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { type Animation } from \"core/Animations/animation\";\r\nimport { type BaseGradient } from \"./gradient/BaseGradient\";\r\nimport { type AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport { type IFocusableControl } from \"./focusableControl\";\r\n\r\n/**\r\n * Root class used for all 2D controls\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#controls\r\n */\r\nexport class Control implements IAnimatable, IFocusableControl {\r\n /**\r\n * Gets or sets a boolean indicating if alpha must be an inherited value (false by default)\r\n */\r\n public static AllowAlphaInheritance = false;\r\n\r\n private _alpha = 1;\r\n private _alphaSet = false;\r\n private _zIndex = 0;\r\n /** @internal */\r\n public _host: AdvancedDynamicTexture;\r\n /** Gets or sets the control parent */\r\n public parent: Nullable<Container>;\r\n /** @internal */\r\n public _currentMeasure = Measure.Empty();\r\n /** @internal */\r\n public _tempPaddingMeasure = Measure.Empty();\r\n private _fontFamily = \"\";\r\n private _fontStyle = \"\";\r\n private _fontWeight = \"\";\r\n private _fontSize = new ValueAndUnit(18, ValueAndUnit.UNITMODE_PIXEL, false);\r\n private _font: string;\r\n /** @internal */\r\n public _width = new ValueAndUnit(1, ValueAndUnit.UNITMODE_PERCENTAGE, false);\r\n /** @internal */\r\n public _height = new ValueAndUnit(1, ValueAndUnit.UNITMODE_PERCENTAGE, false);\r\n /** @internal */\r\n protected _fontOffset: { ascent: number; height: number; descent: number };\r\n private _color = \"\";\r\n private _style: Nullable<Style> = null;\r\n private _styleObserver: Nullable<Observer<Style>>;\r\n /** @internal */\r\n protected _horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;\r\n /** @internal */\r\n protected _verticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER;\r\n /** @internal */\r\n protected _isDirty = true;\r\n /** @internal */\r\n protected _wasDirty = false;\r\n /** @internal */\r\n public _tempParentMeasure = Measure.Empty();\r\n /** @internal */\r\n public _prevCurrentMeasureTransformedIntoGlobalSpace = Measure.Empty();\r\n /** @internal */\r\n public _cachedParentMeasure = Measure.Empty();\r\n private _descendantsOnlyPadding = false;\r\n private _paddingLeft = new ValueAndUnit(0);\r\n private _paddingRight = new ValueAndUnit(0);\r\n private _paddingTop = new ValueAndUnit(0);\r\n private _paddingBottom = new ValueAndUnit(0);\r\n /** @internal */\r\n public _left = new ValueAndUnit(0);\r\n /** @internal */\r\n public _top = new ValueAndUnit(0);\r\n private _scaleX = 1.0;\r\n private _scaleY = 1.0;\r\n private _rotation = 0;\r\n private _transformCenterX = 0.5;\r\n private _transformCenterY = 0.5;\r\n /** @internal */\r\n public _transformMatrix = Matrix2D.Identity();\r\n /** @internal */\r\n protected _invertTransformMatrix = Matrix2D.Identity();\r\n /** @internal */\r\n protected _transformedPosition = Vector2.Zero();\r\n private _isMatrixDirty = true;\r\n private _cachedOffsetX: number;\r\n private _cachedOffsetY: number;\r\n private _isVisible = true;\r\n private _isHighlighted = false;\r\n private _highlightColor = \"#4affff\";\r\n protected _highlightLineWidth = 2;\r\n /** @internal */\r\n public _linkedMesh: Nullable<TransformNode>;\r\n private _fontSet = false;\r\n private _dummyVector2 = Vector2.Zero();\r\n private _downCount = 0;\r\n private _enterCount = -1;\r\n private _doNotRender = false;\r\n private _downPointerIds: { [id: number]: boolean } = {};\r\n private _evaluatedMeasure = new Measure(0, 0, 0, 0);\r\n private _evaluatedParentMeasure = new Measure(0, 0, 0, 0);\r\n protected _isEnabled = true;\r\n protected _disabledColor = \"#9a9a9a\";\r\n protected _disabledColorItem = \"#6a6a6a\";\r\n protected _isReadOnly = false;\r\n private _gradient: Nullable<BaseGradient> = null;\r\n /** @internal */\r\n protected _rebuildLayout = false;\r\n\r\n /** @internal */\r\n protected _urlRewriter?: (url: string) => string;\r\n\r\n /**\r\n * Observable that fires when the control's enabled state changes\r\n */\r\n public onEnabledStateChangedObservable = new Observable<boolean>();\r\n\r\n /** @internal */\r\n public _customData: any = {};\r\n\r\n /** @internal */\r\n public _isClipped = false;\r\n\r\n /** @internal */\r\n public _automaticSize = false;\r\n\r\n /** @internal */\r\n public _tag: any;\r\n\r\n /**\r\n * Gets or sets the unique id of the node. Please note that this number will be updated when the control is added to a container\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the control is readonly (default: false).\r\n * A readonly control will still raise pointer events but will not react to them\r\n */\r\n public get isReadOnly() {\r\n return this._isReadOnly;\r\n }\r\n\r\n public set isReadOnly(value: boolean) {\r\n this._isReadOnly = value;\r\n }\r\n\r\n /**\r\n * Gets the transformed measure, that is the bounding box of the control after applying all transformations\r\n */\r\n public get transformedMeasure(): Measure {\r\n return this._evaluatedMeasure;\r\n }\r\n\r\n /**\r\n * Gets or sets an object used to store user defined information for the node\r\n */\r\n @serialize()\r\n public metadata: any = null;\r\n\r\n /** Gets or sets a boolean indicating if the control can be hit with pointer events */\r\n @serialize()\r\n public isHitTestVisible = true;\r\n /** Gets or sets a boolean indicating if the control can block pointer events. False by default except on the following controls:\r\n * * Button controls (Button, RadioButton, ToggleButton)\r\n * * Checkbox\r\n * * ColorPicker\r\n * * InputText\r\n * * Slider\r\n */\r\n @serialize()\r\n public isPointerBlocker = false;\r\n /** Gets or sets a boolean indicating if the control can be focusable */\r\n @serialize()\r\n public isFocusInvisible = false;\r\n\r\n protected _clipChildren = true;\r\n /**\r\n * Sets/Gets a boolean indicating if the children are clipped to the current control bounds.\r\n * Please note that not clipping children may generate issues with adt.useInvalidateRectOptimization so it is recommended to turn this optimization off if you want to use unclipped children\r\n */\r\n public set clipChildren(value: boolean) {\r\n this._clipChildren = value;\r\n }\r\n\r\n @serialize()\r\n public get clipChildren() {\r\n return this._clipChildren;\r\n }\r\n\r\n protected _clipContent = true;\r\n /**\r\n * Sets/Gets a boolean indicating that control content must be clipped\r\n * Please note that not clipping content may generate issues with adt.useInvalidateRectOptimization so it is recommended to turn this optimization off if you want to use unclipped children\r\n */\r\n public set clipContent(value: boolean) {\r\n this._clipContent = value;\r\n }\r\n\r\n @serialize()\r\n public get clipContent() {\r\n return this._clipContent;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the current control should cache its rendering (useful when the control does not change often)\r\n */\r\n @serialize()\r\n public useBitmapCache = false;\r\n\r\n private _cacheData: Nullable<ImageData>;\r\n\r\n private _shadowOffsetX = 0;\r\n /** Gets or sets a value indicating the offset in pixels to apply on X axis to render the shadow */\r\n @serialize()\r\n public get shadowOffsetX() {\r\n return this._shadowOffsetX;\r\n }\r\n\r\n public set shadowOffsetX(value: number) {\r\n if (this._shadowOffsetX === value) {\r\n return;\r\n }\r\n\r\n this._shadowOffsetX = value;\r\n this._markAsDirty();\r\n }\r\n\r\n private _shadowOffsetY = 0;\r\n /** Gets or sets a value indicating the offset in pixels to apply on Y axis to render the shadow */\r\n @serialize()\r\n public get shadowOffsetY() {\r\n return this._shadowOffsetY;\r\n }\r\n\r\n public set shadowOffsetY(value: number) {\r\n if (this._shadowOffsetY === value) {\r\n return;\r\n }\r\n\r\n this._shadowOffsetY = value;\r\n this._markAsDirty();\r\n }\r\n\r\n private _shadowBlur = 0;\r\n private _previousShadowBlur = 0;\r\n /** Gets or sets a value indicating the amount of blur to use to render the shadow */\r\n @serialize()\r\n public get shadowBlur() {\r\n return this._shadowBlur;\r\n }\r\n\r\n public set shadowBlur(value: number) {\r\n if (this._shadowBlur === value) {\r\n return;\r\n }\r\n\r\n this._previousShadowBlur = this._shadowBlur;\r\n\r\n this._shadowBlur = value;\r\n this._markAsDirty();\r\n }\r\n\r\n private _shadowColor = \"black\";\r\n /** Gets or sets a value indicating the color of the shadow (black by default ie. \"#000\") */\r\n @serialize()\r\n public get shadowColor() {\r\n return this._shadowColor;\r\n }\r\n\r\n public set shadowColor(value: string) {\r\n if (this._shadowColor === value) {\r\n return;\r\n }\r\n\r\n this._shadowColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the cursor to use when the control is hovered */\r\n @serialize()\r\n public hoverCursor = \"\";\r\n\r\n /** @internal */\r\n protected _linkOffsetX = new ValueAndUnit(0);\r\n /** @internal */\r\n protected _linkOffsetY = new ValueAndUnit(0);\r\n\r\n // Properties\r\n\r\n /** Gets the control type name */\r\n public get typeName(): string {\r\n return this._getTypeName();\r\n }\r\n\r\n /**\r\n * Get the current class name of the control.\r\n * @returns current class name\r\n */\r\n public getClassName(): string {\r\n return this._getTypeName();\r\n }\r\n\r\n /**\r\n * Gets or sets the accessibility tag to describe the control for accessibility purpose.\r\n * By default, GUI controls already indicate accessibility info, but one can override the info using this tag.\r\n */\r\n public set accessibilityTag(value: Nullable<IAccessibilityTag>) {\r\n this._accessibilityTag = value;\r\n this.onAccessibilityTagChangedObservable.notifyObservers(value);\r\n }\r\n\r\n public get accessibilityTag() {\r\n return this._accessibilityTag;\r\n }\r\n\r\n protected _accessibilityTag: Nullable<IAccessibilityTag> = null;\r\n\r\n /**\r\n * Observable that fires whenever the accessibility event of the control has changed\r\n */\r\n public onAccessibilityTagChangedObservable = new Observable<Nullable<IAccessibilityTag>>();\r\n\r\n /**\r\n * An event triggered when pointer wheel is scrolled\r\n */\r\n public onWheelObservable = new Observable<Vector2>();\r\n /**\r\n * An event triggered when the pointer moves over the control.\r\n */\r\n public onPointerMoveObservable = new Observable<Vector2>();\r\n\r\n /**\r\n * An event triggered when the pointer moves out of the control.\r\n */\r\n public onPointerOutObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered when the pointer taps the control\r\n */\r\n public onPointerDownObservable = new Observable<Vector2WithInfo>();\r\n\r\n /**\r\n * An event triggered when pointer up\r\n */\r\n public onPointerUpObservable = new Observable<Vector2WithInfo>();\r\n\r\n /**\r\n * An event triggered when a control is clicked on\r\n */\r\n public onPointerClickObservable = new Observable<Vector2WithInfo>();\r\n\r\n /**\r\n * An event triggered when a control receives an ENTER key down event\r\n */\r\n public onEnterPressedObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered when pointer enters the control\r\n */\r\n public onPointerEnterObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered when the control is marked as dirty\r\n */\r\n public onDirtyObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered before drawing the control\r\n */\r\n public onBeforeDrawObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered after the control was drawn\r\n */\r\n public onAfterDrawObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered when the control has been disposed\r\n */\r\n public onDisposeObservable = new Observable<Control>();\r\n\r\n /**\r\n * An event triggered when the control isVisible is changed\r\n */\r\n public onIsVisibleChangedObservable = new Observable<boolean>();\r\n\r\n /**\r\n * Get the hosting AdvancedDynamicTexture\r\n */\r\n public get host(): AdvancedDynamicTexture {\r\n return this._host;\r\n }\r\n\r\n /** Gets or set information about font offsets (used to render and align text) */\r\n @serialize()\r\n public get fontOffset(): { ascent: number; height: number; descent: number } {\r\n return this._fontOffset;\r\n }\r\n\r\n public set fontOffset(offset: { ascent: number; height: number; descent: number }) {\r\n this._fontOffset = offset;\r\n }\r\n\r\n /** Gets or sets alpha value for the control (1 means opaque and 0 means entirely transparent) */\r\n @serialize()\r\n public get alpha(): number {\r\n return this._alpha;\r\n }\r\n\r\n public set alpha(value: number) {\r\n if (this._alpha === value) {\r\n return;\r\n }\r\n this._alphaSet = true;\r\n this._alpha = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a number indicating size of stroke we want to highlight the control with (mostly for debugging purpose)\r\n */\r\n public get highlightLineWidth(): number {\r\n return this._highlightLineWidth;\r\n }\r\n\r\n public set highlightLineWidth(value: number) {\r\n if (this._highlightLineWidth === value) {\r\n return;\r\n }\r\n\r\n this._highlightLineWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that we want to highlight the control (mostly for debugging purpose)\r\n */\r\n public get isHighlighted(): boolean {\r\n return this._isHighlighted;\r\n }\r\n\r\n public set isHighlighted(value: boolean) {\r\n if (this._isHighlighted === value) {\r\n return;\r\n }\r\n\r\n this._isHighlighted = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Indicates if the control should be serialized. Defaults to true.\r\n */\r\n @serialize()\r\n public isSerializable: boolean = true;\r\n\r\n /**\r\n * Gets or sets a string defining the color to use for highlighting this control\r\n */\r\n public get highlightColor(): string {\r\n return this._highlightColor;\r\n }\r\n\r\n public set highlightColor(value: string) {\r\n if (this._highlightColor === value) {\r\n return;\r\n }\r\n\r\n this._highlightColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets a value indicating the scale factor on X axis (1 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get scaleX(): number {\r\n return this._scaleX;\r\n }\r\n\r\n public set scaleX(value: number) {\r\n if (this._scaleX === value) {\r\n return;\r\n }\r\n\r\n this._scaleX = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /** Gets or sets a value indicating the scale factor on Y axis (1 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get scaleY(): number {\r\n return this._scaleY;\r\n }\r\n\r\n public set scaleY(value: number) {\r\n if (this._scaleY === value) {\r\n return;\r\n }\r\n\r\n this._scaleY = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /** Gets or sets the rotation angle (0 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get rotation(): number {\r\n return this._rotation;\r\n }\r\n\r\n public set rotation(value: number) {\r\n if (this._rotation === value) {\r\n return;\r\n }\r\n\r\n this._rotation = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /** Gets or sets the transformation center on Y axis (0 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get transformCenterY(): number {\r\n return this._transformCenterY;\r\n }\r\n\r\n public set transformCenterY(value: number) {\r\n if (this._transformCenterY === value) {\r\n return;\r\n }\r\n\r\n this._transformCenterY = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /** Gets or sets the transformation center on X axis (0 by default)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#rotation-and-scaling\r\n */\r\n @serialize()\r\n public get transformCenterX(): number {\r\n return this._transformCenterX;\r\n }\r\n\r\n public set transformCenterX(value: number) {\r\n if (this._transformCenterX === value) {\r\n return;\r\n }\r\n\r\n this._transformCenterX = value;\r\n this._markAsDirty();\r\n this._markMatrixAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the horizontal alignment\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#alignments\r\n */\r\n @serialize()\r\n public get horizontalAlignment(): number {\r\n return this._horizontalAlignment;\r\n }\r\n\r\n public set horizontalAlignment(value: number) {\r\n if (this._horizontalAlignment === value) {\r\n return;\r\n }\r\n\r\n this._horizontalAlignment = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the vertical alignment\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#alignments\r\n */\r\n @serialize()\r\n public get verticalAlignment(): number {\r\n return this._verticalAlignment;\r\n }\r\n\r\n public set verticalAlignment(value: number) {\r\n if (this._verticalAlignment === value) {\r\n return;\r\n }\r\n\r\n this._verticalAlignment = value;\r\n this._markAsDirty();\r\n }\r\n\r\n private _fixedRatio = 0;\r\n public set fixedRatio(value: number) {\r\n if (this._fixedRatio === value) {\r\n return;\r\n }\r\n\r\n this._fixedRatio = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a fixed ratio for this control.\r\n * When different from 0, the ratio is used to compute the \"second\" dimension.\r\n * The first dimension used in the computation is the last one set (by setting width / widthInPixels or height / heightInPixels), and the\r\n * second dimension is computed as first dimension * fixedRatio\r\n */\r\n @serialize()\r\n public get fixedRatio(): number {\r\n return this._fixedRatio;\r\n }\r\n\r\n private _fixedRatioMasterIsWidth = true;\r\n set fixedRatioMasterIsWidth(value: boolean) {\r\n if (this._fixedRatioMasterIsWidth === value) {\r\n return;\r\n }\r\n this._fixedRatioMasterIsWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the fixed ratio is set on the width instead of the height. True by default.\r\n * When the height of a control is set, this property is changed to false.\r\n */\r\n @serialize()\r\n get fixedRatioMasterIsWidth(): boolean {\r\n return this._fixedRatioMasterIsWidth;\r\n }\r\n\r\n /**\r\n * Gets or sets control width\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get width(): string | number {\r\n return this._width.toString(this._host);\r\n }\r\n\r\n public set width(value: string | number) {\r\n this._fixedRatioMasterIsWidth = true;\r\n\r\n if (this._width.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._width.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the control width in pixel\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get widthInPixels(): number {\r\n return this._width.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set widthInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this._fixedRatioMasterIsWidth = true;\r\n this.width = value + \"px\";\r\n }\r\n\r\n /**\r\n * Gets or sets control height\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get height(): string | number {\r\n return this._height.toString(this._host);\r\n }\r\n\r\n public set height(value: string | number) {\r\n this._fixedRatioMasterIsWidth = false;\r\n\r\n if (this._height.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._height.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets control height in pixel\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get heightInPixels(): number {\r\n return this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set heightInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this._fixedRatioMasterIsWidth = false;\r\n this.height = value + \"px\";\r\n }\r\n\r\n /** Gets or set font family */\r\n public get fontFamily(): string {\r\n return this._fontFamily;\r\n }\r\n\r\n public set fontFamily(value: string) {\r\n if (this._fontFamily === value) {\r\n return;\r\n }\r\n\r\n this._fontFamily = value;\r\n this._resetFontCache();\r\n }\r\n\r\n /** Gets or sets font style */\r\n public get fontStyle(): string {\r\n return this._fontStyle;\r\n }\r\n\r\n public set fontStyle(value: string) {\r\n if (this._fontStyle === value) {\r\n return;\r\n }\r\n\r\n this._fontStyle = value;\r\n this._resetFontCache();\r\n }\r\n\r\n /** Gets or sets font weight */\r\n public get fontWeight(): string {\r\n return this._fontWeight;\r\n }\r\n\r\n public set fontWeight(value: string) {\r\n if (this._fontWeight === value) {\r\n return;\r\n }\r\n\r\n this._fontWeight = value;\r\n this._resetFontCache();\r\n }\r\n\r\n /**\r\n * Gets or sets style\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#styles\r\n */\r\n @serialize()\r\n public get style(): Nullable<Style> {\r\n return this._style;\r\n }\r\n\r\n public set style(value: Nullable<Style>) {\r\n if (this._style) {\r\n this._style.onChangedObservable.remove(this._styleObserver);\r\n this._styleObserver = null;\r\n }\r\n\r\n this._style = value;\r\n\r\n if (this._style) {\r\n this._styleObserver = this._style.onChangedObservable.add(() => {\r\n this._markAsDirty();\r\n this._resetFontCache();\r\n });\r\n }\r\n\r\n this._markAsDirty();\r\n this._resetFontCache();\r\n }\r\n\r\n /** @internal */\r\n public get _isFontSizeInPercentage(): boolean {\r\n return this._fontSize.isPercentage;\r\n }\r\n\r\n /** Gets or sets font size in pixels */\r\n public get fontSizeInPixels(): number {\r\n const fontSizeToUse = this._style ? this._style._fontSize : this._fontSize;\r\n\r\n if (fontSizeToUse.isPixel) {\r\n return fontSizeToUse.getValue(this._host);\r\n }\r\n\r\n return fontSizeToUse.getValueInPixel(this._host, this._tempParentMeasure.height || this._cachedParentMeasure.height);\r\n }\r\n\r\n public set fontSizeInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.fontSize = value + \"px\";\r\n }\r\n\r\n /** Gets or sets font size */\r\n public get fontSize(): string | number {\r\n return this._fontSize.toString(this._host);\r\n }\r\n\r\n public set fontSize(value: string | number) {\r\n if (this._fontSize.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._fontSize.fromString(value)) {\r\n this._markAsDirty();\r\n this._resetFontCache();\r\n }\r\n }\r\n\r\n /** Gets or sets foreground color */\r\n @serialize()\r\n public get color(): string {\r\n return this._color;\r\n }\r\n\r\n public set color(value: string) {\r\n if (this._color === value) {\r\n return;\r\n }\r\n\r\n this._color = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets gradient. Setting a gradient will override the color */\r\n @serialize()\r\n public get gradient(): Nullable<BaseGradient> {\r\n return this._gradient;\r\n }\r\n\r\n public set gradient(value: Nullable<BaseGradient>) {\r\n if (this._gradient === value) {\r\n return;\r\n }\r\n\r\n this._gradient = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets z index which is used to reorder controls on the z axis */\r\n @serialize()\r\n public get zIndex(): number {\r\n return this._zIndex;\r\n }\r\n\r\n public set zIndex(value: number) {\r\n if (this.zIndex === value) {\r\n return;\r\n }\r\n\r\n this._zIndex = value;\r\n\r\n if (this.parent) {\r\n this.parent._reOrderControl(this);\r\n }\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the control can be rendered */\r\n @serialize()\r\n public get notRenderable(): boolean {\r\n return this._doNotRender;\r\n }\r\n\r\n public set notRenderable(value: boolean) {\r\n if (this._doNotRender === value) {\r\n return;\r\n }\r\n\r\n this._doNotRender = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the control is visible */\r\n @serialize()\r\n public get isVisible(): boolean {\r\n return this._isVisible;\r\n }\r\n\r\n public set isVisible(value: boolean) {\r\n if (this._isVisible === value) {\r\n return;\r\n }\r\n\r\n this._isVisible = value;\r\n this._markAsDirty(true);\r\n\r\n this.onIsVisibleChangedObservable.notifyObservers(value);\r\n }\r\n\r\n /** Gets a boolean indicating that the control needs to update its rendering */\r\n public get isDirty(): boolean {\r\n return this._isDirty;\r\n }\r\n\r\n /**\r\n * Gets the current linked mesh (or null if none)\r\n */\r\n public get linkedMesh(): Nullable<TransformNode> {\r\n return this._linkedMesh;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding should work like in CSS.\r\n * Basically, it will add the padding amount on each side of the parent control for its children.\r\n */\r\n @serialize()\r\n public get descendantsOnlyPadding(): boolean {\r\n return this._descendantsOnlyPadding;\r\n }\r\n\r\n public set descendantsOnlyPadding(value: boolean) {\r\n if (this._descendantsOnlyPadding === value) {\r\n return;\r\n }\r\n\r\n this._descendantsOnlyPadding = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding to use on the left of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get paddingLeft(): string | number {\r\n return this._paddingLeft.toString(this._host);\r\n }\r\n\r\n public set paddingLeft(value: string | number) {\r\n if (this._paddingLeft.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding in pixels to use on the left of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get paddingLeftInPixels(): number {\r\n return this._paddingLeft.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set paddingLeftInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.paddingLeft = value + \"px\";\r\n }\r\n\r\n /** @internal */\r\n public get _paddingLeftInPixels(): number {\r\n if (this._descendantsOnlyPadding) {\r\n return 0;\r\n }\r\n\r\n return this.paddingLeftInPixels;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding to use on the right of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get paddingRight(): string | number {\r\n return this._paddingRight.toString(this._host);\r\n }\r\n\r\n public set paddingRight(value: string | number) {\r\n if (this._paddingRight.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding in pixels to use on the right of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get paddingRightInPixels(): number {\r\n return this._paddingRight.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set paddingRightInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.paddingRight = value + \"px\";\r\n }\r\n\r\n /** @internal */\r\n public get _paddingRightInPixels(): number {\r\n if (this._descendantsOnlyPadding) {\r\n return 0;\r\n }\r\n\r\n return this.paddingRightInPixels;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding to use on the top of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get paddingTop(): string | number {\r\n return this._paddingTop.toString(this._host);\r\n }\r\n\r\n public set paddingTop(value: string | number) {\r\n if (this._paddingTop.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding in pixels to use on the top of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get paddingTopInPixels(): number {\r\n return this._paddingTop.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set paddingTopInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.paddingTop = value + \"px\";\r\n }\r\n\r\n /** @internal */\r\n public get _paddingTopInPixels(): number {\r\n if (this._descendantsOnlyPadding) {\r\n return 0;\r\n }\r\n\r\n return this.paddingTopInPixels;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding to use on the bottom of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get paddingBottom(): string | number {\r\n return this._paddingBottom.toString(this._host);\r\n }\r\n\r\n public set paddingBottom(value: string | number) {\r\n if (this._paddingBottom.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the padding in pixels to use on the bottom of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get paddingBottomInPixels(): number {\r\n return this._paddingBottom.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set paddingBottomInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.paddingBottom = value + \"px\";\r\n }\r\n\r\n /** @internal */\r\n public get _paddingBottomInPixels(): number {\r\n if (this._descendantsOnlyPadding) {\r\n return 0;\r\n }\r\n\r\n return this.paddingBottomInPixels;\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the left coordinate of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get left(): string | number {\r\n return this._left.toString(this._host);\r\n }\r\n\r\n public set left(value: string | number) {\r\n if (this._left.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the left coordinate in pixels of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get leftInPixels(): number {\r\n return this._left.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set leftInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.left = value + \"px\";\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the top coordinate of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public get top(): string | number {\r\n return this._top.toString(this._host);\r\n }\r\n\r\n public set top(value: string | number) {\r\n if (this._top.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the top coordinate in pixels of the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public get topInPixels(): number {\r\n return this._top.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set topInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.top = value + \"px\";\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the offset on X axis to the linked mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n @serialize()\r\n public get linkOffsetX(): string | number {\r\n return this._linkOffsetX.toString(this._host);\r\n }\r\n\r\n public set linkOffsetX(value: string | number) {\r\n if (this._linkOffsetX.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the offset in pixels on X axis to the linked mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n public get linkOffsetXInPixels(): number {\r\n return this._linkOffsetX.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set linkOffsetXInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.linkOffsetX = value + \"px\";\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the offset on Y axis to the linked mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n @serialize()\r\n public get linkOffsetY(): string | number {\r\n return this._linkOffsetY.toString(this._host);\r\n }\r\n\r\n public set linkOffsetY(value: string | number) {\r\n if (this._linkOffsetY.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets a value indicating the offset in pixels on Y axis to the linked mesh\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n public get linkOffsetYInPixels(): number {\r\n return this._linkOffsetY.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set linkOffsetYInPixels(value: number) {\r\n if (isNaN(value)) {\r\n return;\r\n }\r\n this.linkOffsetY = value + \"px\";\r\n }\r\n\r\n /** Gets the center coordinate on X axis */\r\n public get centerX(): number {\r\n return this._currentMeasure.left + this._currentMeasure.width / 2;\r\n }\r\n\r\n /** Gets the center coordinate on Y axis */\r\n public get centerY(): number {\r\n return this._currentMeasure.top + this._currentMeasure.height / 2;\r\n }\r\n\r\n /** Gets or sets if control is Enabled */\r\n @serialize()\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n\r\n public set isEnabled(value: boolean) {\r\n if (this._isEnabled === value) {\r\n return;\r\n }\r\n\r\n this._isEnabled = value;\r\n this._markAsDirty();\r\n // if this control or any of it's descendants are under a pointer, we need to fire a pointerOut event\r\n const recursivelyFirePointerOut = (control: Control) => {\r\n if (!control.host) {\r\n return;\r\n }\r\n for (const pointer in control.host._lastControlOver) {\r\n if (control === this.host._lastControlOver[pointer]) {\r\n control._onPointerOut(control, null, true);\r\n delete control.host._lastControlOver[pointer];\r\n }\r\n }\r\n if ((control as Container).children !== undefined) {\r\n for (const child of (control as Container).children) {\r\n recursivelyFirePointerOut(child);\r\n }\r\n }\r\n };\r\n recursivelyFirePointerOut(this);\r\n this.onEnabledStateChangedObservable.notifyObservers(value);\r\n }\r\n /** Gets or sets background color of control if it's disabled. Only applies to Button class. */\r\n @serialize()\r\n public get disabledColor(): string {\r\n return this._disabledColor;\r\n }\r\n\r\n public set disabledColor(value: string) {\r\n if (this._disabledColor === value) {\r\n return;\r\n }\r\n\r\n this._disabledColor = value;\r\n this._markAsDirty();\r\n }\r\n /** Gets or sets front color of control if it's disabled. Only applies to Checkbox class. */\r\n @serialize()\r\n public get disabledColorItem(): string {\r\n return this._disabledColorItem;\r\n }\r\n\r\n public set disabledColorItem(value: string) {\r\n if (this._disabledColorItem === value) {\r\n return;\r\n }\r\n\r\n this._disabledColorItem = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets/sets the overlap group of the control.\r\n * Controls with overlapGroup set to a number can be deoverlapped.\r\n * Controls with overlapGroup set to undefined are not deoverlapped.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#deoverlapping\r\n */\r\n @serialize()\r\n public overlapGroup?: number;\r\n /**\r\n * Gets/sets the deoverlap movement multiplier\r\n */\r\n @serialize()\r\n public overlapDeltaMultiplier?: number;\r\n\r\n /**\r\n * Array of animations\r\n */\r\n animations: Nullable<Animation[]> = null;\r\n\r\n // Focus functionality\r\n\r\n protected _focusedColor: Nullable<string> = null;\r\n /**\r\n * Border color when control is focused\r\n * When not defined the ADT color will be used. If no ADT color is defined, focused state won't have any border\r\n */\r\n public get focusedColor(): Nullable<string> {\r\n return this._focusedColor;\r\n }\r\n public set focusedColor(value: Nullable<string>) {\r\n this._focusedColor = value;\r\n }\r\n /**\r\n * The tab index of this control. -1 indicates this control is not part of the tab navigation.\r\n * A positive value indicates the order of the control in the tab navigation.\r\n * A value of 0 indicated the control will be focused after all controls with a positive index.\r\n * More than one control can have the same tab index and the navigation would then go through all controls with the same value in an order defined by the layout or the hierarchy.\r\n * The value can be changed at any time.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex\r\n */\r\n public tabIndex: number = -1;\r\n protected _isFocused = false;\r\n protected _unfocusedColor: Nullable<string> = null;\r\n\r\n /** Observable raised when the control gets the focus */\r\n public onFocusObservable = new Observable<Control>();\r\n /** Observable raised when the control loses the focus */\r\n public onBlurObservable = new Observable<Control>();\r\n /** Observable raised when a key event was processed */\r\n public onKeyboardEventProcessedObservable = new Observable<IKeyboardEvent>();\r\n\r\n /** @internal */\r\n public onBlur(): void {\r\n if (this._isFocused) {\r\n this._isFocused = false;\r\n if (this.focusedColor && this._unfocusedColor != null) {\r\n // Set color back to saved unfocused color\r\n this.color = this._unfocusedColor;\r\n }\r\n this.onBlurObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public onFocus(): void {\r\n this._isFocused = true;\r\n\r\n if (this.focusedColor) {\r\n // Save the unfocused color\r\n this._unfocusedColor = this.color;\r\n this.color = this.focusedColor;\r\n }\r\n this.onFocusObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Function called to get the list of controls that should not steal the focus from this control\r\n * @returns an array of controls\r\n */\r\n public keepsFocusWith(): Nullable<Control[]> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Function to focus a button programmatically\r\n */\r\n public focus() {\r\n this._host.moveFocusToControl(this);\r\n }\r\n\r\n /**\r\n * Function to unfocus a button programmatically\r\n */\r\n public blur() {\r\n this._host.focusedControl = null;\r\n }\r\n\r\n /**\r\n * Handles the keyboard event\r\n * @param evt Defines the KeyboardEvent\r\n */\r\n public processKeyboard(evt: IKeyboardEvent): void {\r\n // if enter, trigger the new observable\r\n if (evt.key === \"Enter\") {\r\n this.onEnterPressedObservable.notifyObservers(this);\r\n }\r\n this.onKeyboardEventProcessedObservable.notifyObservers(evt, -1, this);\r\n }\r\n\r\n // Functions\r\n\r\n /**\r\n * Creates a new control\r\n * @param name defines the name of the control\r\n */\r\n constructor(\r\n /** defines the name of the control */\r\n public name?: string\r\n ) {}\r\n\r\n /** @internal */\r\n protected _getTypeName(): string {\r\n return \"Control\";\r\n }\r\n\r\n /**\r\n * Gets the first ascendant in the hierarchy of the given type\r\n * @param className defines the required type\r\n * @returns the ascendant or null if not found\r\n */\r\n public getAscendantOfClass(className: string): Nullable<Control> {\r\n if (!this.parent) {\r\n return null;\r\n }\r\n\r\n if (this.parent.getClassName() === className) {\r\n return this.parent;\r\n }\r\n\r\n return this.parent.getAscendantOfClass(className);\r\n }\r\n\r\n /**\r\n * Mark control element as dirty\r\n * @param force force non visible elements to be marked too\r\n */\r\n public markAsDirty(force = false): void {\r\n this._markAsDirty(force);\r\n }\r\n\r\n /**\r\n * Mark the element and its children as dirty\r\n */\r\n public markAllAsDirty(): void {\r\n this._markAllAsDirty();\r\n }\r\n\r\n /** @internal */\r\n public _resetFontCache(): void {\r\n this._fontSet = true;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Determines if a container is an ascendant of the current control\r\n * @param container defines the container to look for\r\n * @returns true if the container is one of the ascendant of the control\r\n */\r\n public isAscendant(container: Control): boolean {\r\n if (!this.parent) {\r\n return false;\r\n }\r\n\r\n if (this.parent === container) {\r\n return true;\r\n }\r\n\r\n return this.parent.isAscendant(container);\r\n }\r\n\r\n /**\r\n * Gets coordinates in local control space\r\n * @param globalCoordinates defines the coordinates to transform\r\n * @returns the new coordinates in local space\r\n */\r\n public getLocalCoordinates(globalCoordinates: Vector2): Vector2 {\r\n const result = Vector2.Zero();\r\n\r\n this.getLocalCoordinatesToRef(globalCoordinates, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets coordinates in local control space\r\n * @param globalCoordinates defines the coordinates to transform\r\n * @param result defines the target vector2 where to store the result\r\n * @returns the current control\r\n */\r\n public getLocalCoordinatesToRef(globalCoordinates: Vector2, result: Vector2): Control {\r\n result.x = globalCoordinates.x - this._currentMeasure.left;\r\n result.y = globalCoordinates.y - this._currentMeasure.top;\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets coordinates in parent local control space\r\n * @param globalCoordinates defines the coordinates to transform\r\n * @returns the new coordinates in parent local space\r\n */\r\n public getParentLocalCoordinates(globalCoordinates: Vector2): Vector2 {\r\n const result = Vector2.Zero();\r\n\r\n result.x = globalCoordinates.x - this._cachedParentMeasure.left;\r\n result.y = globalCoordinates.y - this._cachedParentMeasure.top;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Move the current control to a vector3 position projected onto the screen.\r\n * @param position defines the target position\r\n * @param scene defines the hosting scene\r\n */\r\n public moveToVector3(position: Vector3, scene: Scene): void {\r\n if (!this._host || this.parent !== this._host._rootContainer) {\r\n Tools.Error(\"Cannot move a control to a vector3 if the control is not at root level\");\r\n return;\r\n }\r\n\r\n this.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n this.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\r\n\r\n const globalViewport = this._host._getGlobalViewport();\r\n const projectedPosition = Vector3.Project(position, Matrix.IdentityReadOnly, scene.getTransformMatrix(), globalViewport);\r\n\r\n this._moveToProjectedPosition(projectedPosition);\r\n\r\n if (projectedPosition.z < 0 || projectedPosition.z > 1) {\r\n this.notRenderable = true;\r\n return;\r\n }\r\n this.notRenderable = false;\r\n }\r\n\r\n /**\r\n * Will store all controls that have this control as ascendant in a given array\r\n * @param results defines the array where to store the descendants\r\n * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered\r\n * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored\r\n */\r\n public getDescendantsToRef(results: Control[], directDescendantsOnly: boolean = false, predicate?: (control: Control) => boolean): void {\r\n // Do nothing by default\r\n }\r\n\r\n /**\r\n * Will return all controls that have this control as ascendant\r\n * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered\r\n * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored\r\n * @returns all child controls\r\n */\r\n public getDescendants(directDescendantsOnly?: boolean, predicate?: (control: Control) => boolean): Control[] {\r\n const results: Control[] = [];\r\n\r\n this.getDescendantsToRef(results, directDescendantsOnly, predicate);\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Link current control with a target mesh\r\n * @param mesh defines the mesh to link with\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#tracking-positions\r\n */\r\n public linkWithMesh(mesh: Nullable<TransformNode>): void {\r\n if (!this._host || (this.parent && this.parent !== this._host._rootContainer)) {\r\n if (mesh) {\r\n Tools.Error(\"Cannot link a control to a mesh if the control is not at root level\");\r\n }\r\n return;\r\n }\r\n\r\n const index = this._host._linkedControls.indexOf(this);\r\n if (index !== -1) {\r\n this._linkedMesh = mesh;\r\n if (!mesh) {\r\n this._host._linkedControls.splice(index, 1);\r\n }\r\n return;\r\n } else if (!mesh) {\r\n return;\r\n }\r\n\r\n this.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n this.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\r\n this._linkedMesh = mesh;\r\n this._host._linkedControls.push(this);\r\n }\r\n\r\n /**\r\n * Shorthand function to set the top, right, bottom, and left padding values on the control.\r\n * @param { string | number} paddingTop - The value of the top padding.\r\n * @param { string | number} paddingRight - The value of the right padding. If omitted, top is used.\r\n * @param { string | number} paddingBottom - The value of the bottom padding. If omitted, top is used.\r\n * @param { string | number} paddingLeft - The value of the left padding. If omitted, right is used.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public setPadding(paddingTop: string | number, paddingRight?: string | number, paddingBottom?: string | number, paddingLeft?: string | number) {\r\n const top = paddingTop;\r\n const right = paddingRight ?? top;\r\n const bottom = paddingBottom ?? top;\r\n const left = paddingLeft ?? right;\r\n\r\n this.paddingTop = top;\r\n this.paddingRight = right;\r\n this.paddingBottom = bottom;\r\n this.paddingLeft = left;\r\n }\r\n\r\n /**\r\n * Shorthand funtion to set the top, right, bottom, and left padding values in pixels on the control.\r\n * @param { number} paddingTop - The value in pixels of the top padding.\r\n * @param { number} paddingRight - The value in pixels of the right padding. If omitted, top is used.\r\n * @param { number} paddingBottom - The value in pixels of the bottom padding. If omitted, top is used.\r\n * @param { number} paddingLeft - The value in pixels of the left padding. If omitted, right is used.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n public setPaddingInPixels(paddingTop: number, paddingRight?: number, paddingBottom?: number, paddingLeft?: number) {\r\n const top = paddingTop;\r\n const right = paddingRight ?? top;\r\n const bottom = paddingBottom ?? top;\r\n const left = paddingLeft ?? right;\r\n\r\n this.paddingTopInPixels = top;\r\n this.paddingRightInPixels = right;\r\n this.paddingBottomInPixels = bottom;\r\n this.paddingLeftInPixels = left;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _moveToProjectedPosition(projectedPosition: Vector3): void {\r\n const oldLeft = this._left.getValue(this._host);\r\n const oldTop = this._top.getValue(this._host);\r\n\r\n const parentMeasure = this.parent?._currentMeasure;\r\n if (parentMeasure) {\r\n this._processMeasures(parentMeasure, this._host.getContext());\r\n }\r\n\r\n let newLeft = projectedPosition.x + this._linkOffsetX.getValue(this._host) - this._currentMeasure.width / 2;\r\n let newTop = projectedPosition.y + this._linkOffsetY.getValue(this._host) - this._currentMeasure.height / 2;\r\n\r\n if (this._left.ignoreAdaptiveScaling && this._top.ignoreAdaptiveScaling) {\r\n if (Math.abs(newLeft - oldLeft) < 0.5) {\r\n newLeft = oldLeft;\r\n }\r\n\r\n if (Math.abs(newTop - oldTop) < 0.5) {\r\n newTop = oldTop;\r\n }\r\n }\r\n\r\n if (oldLeft === newLeft && oldTop === newTop) {\r\n return;\r\n }\r\n\r\n this.left = newLeft + \"px\";\r\n this.top = newTop + \"px\";\r\n\r\n this._left.ignoreAdaptiveScaling = true;\r\n this._top.ignoreAdaptiveScaling = true;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _offsetLeft(offset: number) {\r\n this._isDirty = true;\r\n this._currentMeasure.left += offset;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _offsetTop(offset: number) {\r\n this._isDirty = true;\r\n this._currentMeasure.top += offset;\r\n }\r\n\r\n /** @internal */\r\n public _markMatrixAsDirty(): void {\r\n this._isMatrixDirty = true;\r\n this._flagDescendantsAsMatrixDirty();\r\n }\r\n\r\n /** @internal */\r\n public _flagDescendantsAsMatrixDirty(): void {\r\n // No child\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _intersectsRect(rect: Measure, context?: ICanvasRenderingContext) {\r\n // make sure we are transformed correctly before checking intersections. no-op if nothing is dirty.\r\n this._transform(context);\r\n if (this._evaluatedMeasure.left >= rect.left + rect.width) {\r\n return false;\r\n }\r\n\r\n if (this._evaluatedMeasure.top >= rect.top + rect.height) {\r\n return false;\r\n }\r\n\r\n if (this._evaluatedMeasure.left + this._evaluatedMeasure.width <= rect.left) {\r\n return false;\r\n }\r\n\r\n if (this._evaluatedMeasure.top + this._evaluatedMeasure.height <= rect.top) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /** @internal */\r\n protected _computeAdditionalOffsetX() {\r\n return 0;\r\n }\r\n\r\n /** @internal */\r\n protected _computeAdditionalOffsetY() {\r\n return 0;\r\n }\r\n\r\n /** @internal */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public invalidateRect() {\r\n this._transform();\r\n if (this.host && this.host.useInvalidateRectOptimization) {\r\n // Rotate by transform to get the measure transformed to global space\r\n this._currentMeasure.transformToRef(this._transformMatrix, this._tmpMeasureA);\r\n // get the boudning box of the current measure and last frames measure in global space and invalidate it\r\n // the previous measure is used to properly clear a control that is scaled down\r\n Measure.CombineToRef(this._tmpMeasureA, this._prevCurrentMeasureTransformedIntoGlobalSpace, this._tmpMeasureA);\r\n\r\n // Expand rect based on shadows\r\n const shadowOffsetX = this.shadowOffsetX * this._host.idealRatio;\r\n const shadowOffsetY = this.shadowOffsetY * this._host.idealRatio;\r\n const shadowBlur = Math.max(this._previousShadowBlur, this.shadowBlur);\r\n\r\n const leftShadowOffset = Math.min(Math.min(shadowOffsetX, 0) - shadowBlur * 2, 0);\r\n const rightShadowOffset = Math.max(Math.max(shadowOffsetX, 0) + shadowBlur * 2, 0);\r\n const topShadowOffset = Math.min(Math.min(shadowOffsetY, 0) - shadowBlur * 2, 0);\r\n const bottomShadowOffset = Math.max(Math.max(shadowOffsetY, 0) + shadowBlur * 2, 0);\r\n\r\n const offsetX = this._computeAdditionalOffsetX();\r\n const offsetY = this._computeAdditionalOffsetY();\r\n\r\n this.host.invalidateRect(\r\n Math.floor(this._tmpMeasureA.left + leftShadowOffset - offsetX),\r\n Math.floor(this._tmpMeasureA.top + topShadowOffset - offsetY),\r\n Math.ceil(this._tmpMeasureA.left + this._tmpMeasureA.width + rightShadowOffset + offsetX),\r\n Math.ceil(this._tmpMeasureA.top + this._tmpMeasureA.height + bottomShadowOffset + offsetY)\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _markAsDirty(force = false): void {\r\n if (!this._isVisible && !force) {\r\n return;\r\n }\r\n\r\n this._isDirty = true;\r\n this._markMatrixAsDirty();\r\n\r\n // Redraw only this rectangle\r\n if (this._host) {\r\n this._host.markAsDirty();\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _markAllAsDirty(): void {\r\n this._markAsDirty();\r\n\r\n if (this._font) {\r\n this._prepareFont();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _link(host: AdvancedDynamicTexture): void {\r\n this._host = host;\r\n if (this._host) {\r\n this.uniqueId = this._host.getScene()!.getUniqueId();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _transform(context?: ICanvasRenderingContext): void {\r\n if (!this._isMatrixDirty && this._scaleX === 1 && this._scaleY === 1 && this._rotation === 0) {\r\n return;\r\n }\r\n\r\n // postTranslate\r\n const offsetX = this._currentMeasure.width * this._transformCenterX + this._currentMeasure.left;\r\n const offsetY = this._currentMeasure.height * this._transformCenterY + this._currentMeasure.top;\r\n if (context) {\r\n context.translate(offsetX, offsetY);\r\n\r\n // rotate\r\n context.rotate(this._rotation);\r\n\r\n // scale\r\n context.scale(this._scaleX, this._scaleY);\r\n\r\n // preTranslate\r\n context.translate(-offsetX, -offsetY);\r\n }\r\n // Need to update matrices?\r\n if (this._isMatrixDirty || this._cachedOffsetX !== offsetX || this._cachedOffsetY !== offsetY) {\r\n this._cachedOffsetX = offsetX;\r\n this._cachedOffsetY = offsetY;\r\n this._isMatrixDirty = false;\r\n this._flagDescendantsAsMatrixDirty();\r\n\r\n Matrix2D.ComposeToRef(-offsetX, -offsetY, this._rotation, this._scaleX, this._scaleY, this.parent ? this.parent._transformMatrix : null, this._transformMatrix);\r\n\r\n this._transformMatrix.invertToRef(this._invertTransformMatrix);\r\n this._currentMeasure.transformToRef(this._transformMatrix, this._evaluatedMeasure);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _renderHighlight(context: ICanvasRenderingContext): void {\r\n if (!this.isHighlighted) {\r\n return;\r\n }\r\n\r\n context.save();\r\n context.strokeStyle = this._highlightColor;\r\n context.lineWidth = this._highlightLineWidth;\r\n\r\n this._renderHighlightSpecific(context);\r\n context.restore();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _renderHighlightSpecific(context: ICanvasRenderingContext): void {\r\n context.strokeRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n\r\n protected _getColor(context: ICanvasRenderingContext): string | ICanvasGradient {\r\n return this.gradient ? this.gradient.getCanvasGradient(context) : this.color;\r\n }\r\n\r\n /**\r\n * Applies the control's state to the provided context. Important: unless this is a temporary context,\r\n * be sure to call context.save() before calling _applyStates() and later call context.restore() when\r\n * you are done using these state updates.\r\n * @internal\r\n */\r\n protected _applyStates(context: ICanvasRenderingContext): void {\r\n if (this._isFontSizeInPercentage) {\r\n this._fontSet = true;\r\n }\r\n\r\n if (this._host && this._host.useSmallestIdeal && !this._font) {\r\n this._fontSet = true;\r\n }\r\n\r\n if (this._fontSet) {\r\n this._prepareFont();\r\n this._fontSet = false;\r\n }\r\n\r\n if (this._font) {\r\n context.font = this._font;\r\n }\r\n\r\n if (this._color || this.gradient) {\r\n context.fillStyle = this._getColor(context);\r\n }\r\n\r\n if (Control.AllowAlphaInheritance) {\r\n context.globalAlpha *= this._alpha;\r\n } else if (this._alphaSet) {\r\n context.globalAlpha = this.parent && !this.parent.renderToIntermediateTexture ? this.parent.alpha * this._alpha : this._alpha;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _layout(parentMeasure: Measure, context: ICanvasRenderingContext): boolean {\r\n if (!this.isDirty && (!this.isVisible || this.notRenderable)) {\r\n return false;\r\n }\r\n\r\n if (this._isDirty || !this._cachedParentMeasure.isEqualsTo(parentMeasure)) {\r\n this.host._numLayoutCalls++;\r\n\r\n this._currentMeasure.addAndTransformToRef(\r\n this._transformMatrix,\r\n -this._paddingLeftInPixels | 0,\r\n -this._paddingTopInPixels | 0,\r\n this._paddingRightInPixels | 0,\r\n this._paddingBottomInPixels | 0,\r\n this._prevCurrentMeasureTransformedIntoGlobalSpace\r\n );\r\n\r\n context.save();\r\n\r\n let rebuildCount = 0;\r\n do {\r\n this._rebuildLayout = false;\r\n this._processMeasures(parentMeasure, context);\r\n rebuildCount++;\r\n } while (this._rebuildLayout && rebuildCount < 4);\r\n\r\n if (rebuildCount >= 4) {\r\n Logger.Error(`Layout cycle detected in GUI (Control name=${this.name}, uniqueId=${this.uniqueId})`);\r\n }\r\n\r\n context.restore();\r\n this.invalidateRect();\r\n this._evaluateClippingState(parentMeasure);\r\n }\r\n\r\n this._wasDirty = this._isDirty;\r\n this._isDirty = false;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _processMeasures(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n context.save();\r\n\r\n // Ensure we always apply states before measuring\r\n this._applyStates(context);\r\n\r\n this._tempPaddingMeasure.copyFrom(parentMeasure);\r\n\r\n // Apply padding if in correct mode\r\n if (this.parent && this.parent.descendantsOnlyPadding) {\r\n this._tempPaddingMeasure.left += this.parent.paddingLeftInPixels;\r\n this._tempPaddingMeasure.top += this.parent.paddingTopInPixels;\r\n this._tempPaddingMeasure.width -= this.parent.paddingLeftInPixels + this.parent.paddingRightInPixels;\r\n this._tempPaddingMeasure.height -= this.parent.paddingTopInPixels + this.parent.paddingBottomInPixels;\r\n }\r\n\r\n this._currentMeasure.copyFrom(this._tempPaddingMeasure);\r\n\r\n // Let children take some pre-measurement actions\r\n this._preMeasure(this._tempPaddingMeasure, context);\r\n\r\n this._measure();\r\n\r\n // Let children take some post-measurement actions\r\n this._postMeasure(this._tempPaddingMeasure, context);\r\n\r\n this._computeAlignment(this._tempPaddingMeasure, context);\r\n\r\n // Let children add more features\r\n this._additionalProcessing(this._tempPaddingMeasure, context);\r\n\r\n this._cachedParentMeasure.copyFrom(this._tempPaddingMeasure);\r\n\r\n this._currentMeasure.transformToRef(this._transformMatrix, this._evaluatedMeasure);\r\n if (this.onDirtyObservable.hasObservers()) {\r\n this.onDirtyObservable.notifyObservers(this);\r\n }\r\n\r\n context.restore();\r\n }\r\n\r\n protected _evaluateClippingState(parentMeasure: Measure) {\r\n // Since transformMatrix is used here, we need to have it freshly computed\r\n this._transform();\r\n this._currentMeasure.transformToRef(this._transformMatrix, this._evaluatedMeasure);\r\n if (this.parent && this.parent.clipChildren) {\r\n parentMeasure.transformToRef(this.parent._transformMatrix, this._evaluatedParentMeasure);\r\n // Early clip\r\n if (this._evaluatedMeasure.left > this._evaluatedParentMeasure.left + this._evaluatedParentMeasure.width) {\r\n this._isClipped = true;\r\n return;\r\n }\r\n\r\n if (this._evaluatedMeasure.left + this._evaluatedMeasure.width < this._evaluatedParentMeasure.left) {\r\n this._isClipped = true;\r\n return;\r\n }\r\n\r\n if (this._evaluatedMeasure.top > this._evaluatedParentMeasure.top + this._evaluatedParentMeasure.height) {\r\n this._isClipped = true;\r\n return;\r\n }\r\n\r\n if (this._evaluatedMeasure.top + this._evaluatedMeasure.height < this._evaluatedParentMeasure.top) {\r\n this._isClipped = true;\r\n return;\r\n }\r\n }\r\n\r\n this._isClipped = false;\r\n }\r\n\r\n /** @internal */\r\n public _measure(): void {\r\n // Width / Height\r\n if (this._width.isPixel) {\r\n this._currentMeasure.width = this._width.getValue(this._host);\r\n } else {\r\n this._currentMeasure.width *= this._width.getValue(this._host);\r\n }\r\n\r\n if (this._height.isPixel) {\r\n this._currentMeasure.height = this._height.getValue(this._host);\r\n } else {\r\n this._currentMeasure.height *= this._height.getValue(this._host);\r\n }\r\n\r\n if (this._fixedRatio !== 0) {\r\n if (this._fixedRatioMasterIsWidth) {\r\n this._currentMeasure.height = this._currentMeasure.width * this._fixedRatio;\r\n } else {\r\n this._currentMeasure.width = this._currentMeasure.height * this._fixedRatio;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _computeAlignment(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n const width = this._currentMeasure.width;\r\n const height = this._currentMeasure.height;\r\n\r\n const parentWidth = parentMeasure.width;\r\n const parentHeight = parentMeasure.height;\r\n\r\n // Left / top\r\n let x = 0;\r\n let y = 0;\r\n\r\n switch (this.horizontalAlignment) {\r\n case Control.HORIZONTAL_ALIGNMENT_LEFT:\r\n x = 0;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_RIGHT:\r\n x = parentWidth - width;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_CENTER:\r\n x = (parentWidth - width) / 2;\r\n break;\r\n }\r\n\r\n switch (this.verticalAlignment) {\r\n case Control.VERTICAL_ALIGNMENT_TOP:\r\n y = 0;\r\n break;\r\n case Control.VERTICAL_ALIGNMENT_BOTTOM:\r\n y = parentHeight - height;\r\n break;\r\n case Control.VERTICAL_ALIGNMENT_CENTER:\r\n y = (parentHeight - height) / 2;\r\n break;\r\n }\r\n\r\n if (!this.descendantsOnlyPadding) {\r\n if (this._paddingLeft.isPixel) {\r\n this._currentMeasure.left += this._paddingLeft.getValue(this._host);\r\n this._currentMeasure.width -= this._paddingLeft.getValue(this._host);\r\n } else {\r\n this._currentMeasure.left += parentWidth * this._paddingLeft.getValue(this._host);\r\n this._currentMeasure.width -= parentWidth * this._paddingLeft.getValue(this._host);\r\n }\r\n\r\n if (this._paddingRight.isPixel) {\r\n this._currentMeasure.width -= this._paddingRight.getValue(this._host);\r\n } else {\r\n this._currentMeasure.width -= parentWidth * this._paddingRight.getValue(this._host);\r\n }\r\n\r\n if (this._paddingTop.isPixel) {\r\n this._currentMeasure.top += this._paddingTop.getValue(this._host);\r\n this._currentMeasure.height -= this._paddingTop.getValue(this._host);\r\n } else {\r\n this._currentMeasure.top += parentHeight * this._paddingTop.getValue(this._host);\r\n this._currentMeasure.height -= parentHeight * this._paddingTop.getValue(this._host);\r\n }\r\n\r\n if (this._paddingBottom.isPixel) {\r\n this._currentMeasure.height -= this._paddingBottom.getValue(this._host);\r\n } else {\r\n this._currentMeasure.height -= parentHeight * this._paddingBottom.getValue(this._host);\r\n }\r\n }\r\n\r\n if (this._left.isPixel) {\r\n this._currentMeasure.left += this._left.getValue(this._host);\r\n } else {\r\n this._currentMeasure.left += parentWidth * this._left.getValue(this._host);\r\n }\r\n\r\n if (this._top.isPixel) {\r\n this._currentMeasure.top += this._top.getValue(this._host);\r\n } else {\r\n this._currentMeasure.top += parentHeight * this._top.getValue(this._host);\r\n }\r\n\r\n this._currentMeasure.left += x;\r\n this._currentMeasure.top += y;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _preMeasure(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _postMeasure(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _additionalProcessing(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _clipForChildren(context: ICanvasRenderingContext): void {\r\n // DO nothing\r\n }\r\n\r\n private static _ClipMeasure = new Measure(0, 0, 0, 0);\r\n private _tmpMeasureA = new Measure(0, 0, 0, 0);\r\n private _clip(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>) {\r\n context.beginPath();\r\n Control._ClipMeasure.copyFrom(this._currentMeasure);\r\n if (invalidatedRectangle) {\r\n // Rotate the invalidated rect into the control's space\r\n invalidatedRectangle.transformToRef(this._invertTransformMatrix, this._tmpMeasureA);\r\n\r\n // Get the intersection of the rect in context space and the current context\r\n const intersection = new Measure(0, 0, 0, 0);\r\n intersection.left = Math.max(this._tmpMeasureA.left, this._currentMeasure.left);\r\n intersection.top = Math.max(this._tmpMeasureA.top, this._currentMeasure.top);\r\n intersection.width = Math.min(this._tmpMeasureA.left + this._tmpMeasureA.width, this._currentMeasure.left + this._currentMeasure.width) - intersection.left;\r\n intersection.height = Math.min(this._tmpMeasureA.top + this._tmpMeasureA.height, this._currentMeasure.top + this._currentMeasure.height) - intersection.top;\r\n Control._ClipMeasure.copyFrom(intersection);\r\n }\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n const shadowOffsetX = this.shadowOffsetX * this._host.idealRatio;\r\n const shadowOffsetY = this.shadowOffsetY * this._host.idealRatio;\r\n const shadowBlur = this.shadowBlur;\r\n\r\n const leftShadowOffset = Math.min(Math.min(shadowOffsetX, 0) - shadowBlur * 2, 0);\r\n const rightShadowOffset = Math.max(Math.max(shadowOffsetX, 0) + shadowBlur * 2, 0);\r\n const topShadowOffset = Math.min(Math.min(shadowOffsetY, 0) - shadowBlur * 2, 0);\r\n const bottomShadowOffset = Math.max(Math.max(shadowOffsetY, 0) + shadowBlur * 2, 0);\r\n\r\n context.rect(\r\n Control._ClipMeasure.left + leftShadowOffset,\r\n Control._ClipMeasure.top + topShadowOffset,\r\n Control._ClipMeasure.width + rightShadowOffset - leftShadowOffset,\r\n Control._ClipMeasure.height + bottomShadowOffset - topShadowOffset\r\n );\r\n } else {\r\n context.rect(Control._ClipMeasure.left, Control._ClipMeasure.top, Control._ClipMeasure.width, Control._ClipMeasure.height);\r\n }\r\n\r\n context.clip();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _render(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>): boolean {\r\n if (!this.isVisible || this.notRenderable || this._isClipped) {\r\n this._isDirty = false;\r\n return false;\r\n }\r\n\r\n this.host._numRenderCalls++;\r\n\r\n context.save();\r\n\r\n this._applyStates(context);\r\n\r\n // Transform\r\n this._transform(context);\r\n\r\n // Clip\r\n if (this.clipContent) {\r\n this._clip(context, invalidatedRectangle);\r\n }\r\n\r\n if (this.onBeforeDrawObservable.hasObservers()) {\r\n this.onBeforeDrawObservable.notifyObservers(this);\r\n }\r\n\r\n if (this.useBitmapCache && !this._wasDirty && this._cacheData) {\r\n context.putImageData(this._cacheData, this._currentMeasure.left, this._currentMeasure.top);\r\n } else {\r\n this._draw(context, invalidatedRectangle);\r\n }\r\n\r\n if (this.useBitmapCache && this._wasDirty) {\r\n this._cacheData = context.getImageData(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n\r\n this._renderHighlight(context);\r\n\r\n if (this.onAfterDrawObservable.hasObservers()) {\r\n this.onAfterDrawObservable.notifyObservers(this);\r\n }\r\n\r\n context.restore();\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _draw(context: ICanvasRenderingContext, invalidatedRectangle?: Nullable<Measure>): void {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Tests if a given coordinates belong to the current control\r\n * @param x defines x coordinate to test\r\n * @param y defines y coordinate to test\r\n * @returns true if the coordinates are inside the control\r\n */\r\n public contains(x: number, y: number): boolean {\r\n // Invert transform\r\n this._invertTransformMatrix.transformCoordinates(x, y, this._transformedPosition);\r\n\r\n x = this._transformedPosition.x;\r\n y = this._transformedPosition.y;\r\n\r\n // Check\r\n if (x < this._currentMeasure.left) {\r\n return false;\r\n }\r\n\r\n if (x > this._currentMeasure.left + this._currentMeasure.width) {\r\n return false;\r\n }\r\n\r\n if (y < this._currentMeasure.top) {\r\n return false;\r\n }\r\n\r\n if (y > this._currentMeasure.top + this._currentMeasure.height) {\r\n return false;\r\n }\r\n\r\n if (this.isPointerBlocker) {\r\n this._host._shouldBlockPointer = true;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _processPicking(x: number, y: number, pi: Nullable<PointerInfoBase>, type: number, pointerId: number, buttonIndex: number, deltaX?: number, deltaY?: number): boolean {\r\n if (!this._isEnabled) {\r\n return false;\r\n }\r\n if (!this.isHitTestVisible || !this.isVisible || this._doNotRender) {\r\n return false;\r\n }\r\n\r\n if (!this.contains(x, y)) {\r\n return false;\r\n }\r\n\r\n this._processObservables(type, x, y, pi, pointerId, buttonIndex, deltaX, deltaY);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerMove(target: Control, coordinates: Vector2, pointerId: number, pi: Nullable<PointerInfoBase>): void {\r\n const canNotify: boolean = this.onPointerMoveObservable.notifyObservers(coordinates, -1, target, this, pi);\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerMove(target, coordinates, pointerId, pi);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerEnter(target: Control, pi: Nullable<PointerInfoBase>): boolean {\r\n if (!this._isEnabled) {\r\n return false;\r\n }\r\n if (this._enterCount > 0) {\r\n return false;\r\n }\r\n\r\n if (this._enterCount === -1) {\r\n // -1 is for touch input, we are now sure we are with a mouse or pencil\r\n this._enterCount = 0;\r\n }\r\n this._enterCount++;\r\n\r\n const canNotify: boolean = this.onPointerEnterObservable.notifyObservers(this, -1, target, this, pi);\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerEnter(target, pi);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerOut(target: Control, pi: Nullable<PointerInfoBase>, force = false): void {\r\n if (!force && !this._isEnabled) {\r\n return;\r\n }\r\n this._enterCount = 0;\r\n\r\n let canNotify: boolean = true;\r\n\r\n if (!target.isAscendant(this)) {\r\n canNotify = this.onPointerOutObservable.notifyObservers(this, -1, target, this, pi);\r\n }\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerOut(target, pi, force);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: Nullable<PointerInfoBase>): boolean {\r\n // Prevent pointerout to lose control context.\r\n // Event redundancy is checked inside the function.\r\n this._onPointerEnter(this, pi);\r\n\r\n if (this.tabIndex !== -1) {\r\n this.host.focusedControl = this;\r\n }\r\n\r\n if (this._downCount !== 0) {\r\n return false;\r\n }\r\n\r\n this._downCount++;\r\n\r\n this._downPointerIds[pointerId] = true;\r\n\r\n const canNotify: boolean = this.onPointerDownObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerDown(target, coordinates, pointerId, buttonIndex, pi);\r\n }\r\n\r\n if (pi && this.uniqueId !== this._host.rootContainer.uniqueId) {\r\n this._host._capturedPointerIds.add((pi.event as IPointerEvent).pointerId);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerUp(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, notifyClick: boolean, pi?: Nullable<PointerInfoBase>): void {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n this._downCount = 0;\r\n\r\n delete this._downPointerIds[pointerId];\r\n\r\n let canNotifyClick: boolean = notifyClick;\r\n if (notifyClick && (this._enterCount > 0 || this._enterCount === -1)) {\r\n if (!this._host.usePointerTapForClickEvent) {\r\n canNotifyClick = this.onPointerClickObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\r\n }\r\n }\r\n const canNotify: boolean = this.onPointerUpObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerUp(target, coordinates, pointerId, buttonIndex, canNotifyClick, pi);\r\n }\r\n\r\n if (pi && this.uniqueId !== this._host.rootContainer.uniqueId) {\r\n this._host._capturedPointerIds.delete((pi.event as IPointerEvent).pointerId);\r\n }\r\n\r\n if (this._host.usePointerTapForClickEvent && this.isPointerBlocker) {\r\n this._host._shouldBlockPointer = false;\r\n }\r\n }\r\n\r\n public _onPointerPick(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, notifyClick: boolean, pi: Nullable<PointerInfoBase>): boolean {\r\n if (!this._host.usePointerTapForClickEvent) {\r\n return false;\r\n }\r\n\r\n let canNotifyClick: boolean = notifyClick;\r\n if (notifyClick && (this._enterCount > 0 || this._enterCount === -1)) {\r\n canNotifyClick = this.onPointerClickObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\r\n }\r\n const canNotify: boolean = this.onPointerUpObservable.notifyObservers(new Vector2WithInfo(coordinates, buttonIndex), -1, target, this, pi);\r\n\r\n if (canNotify && this.parent != null && !this.isPointerBlocker) {\r\n this.parent._onPointerPick(target, coordinates, pointerId, buttonIndex, canNotifyClick, pi);\r\n }\r\n\r\n if (this._host.usePointerTapForClickEvent && this.isPointerBlocker) {\r\n this._host._shouldBlockPointer = true;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _forcePointerUp(pointerId: Nullable<number> = null) {\r\n if (pointerId !== null) {\r\n this._onPointerUp(this, Vector2.Zero(), pointerId, 0, true);\r\n } else {\r\n for (const key in this._downPointerIds) {\r\n this._onPointerUp(this, Vector2.Zero(), +key, 0, true);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onWheelScroll(deltaX?: number, deltaY?: number): void {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n const canNotify: boolean = this.onWheelObservable.notifyObservers(new Vector2(deltaX, deltaY));\r\n\r\n if (canNotify && this.parent != null) {\r\n this.parent._onWheelScroll(deltaX, deltaY);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _onCanvasBlur(): void {}\r\n\r\n /**\r\n * @internal\r\n */\r\n public _processObservables(\r\n type: number,\r\n x: number,\r\n y: number,\r\n pi: Nullable<PointerInfoBase>,\r\n pointerId: number,\r\n buttonIndex: number,\r\n deltaX?: number,\r\n deltaY?: number\r\n ): boolean {\r\n if (!this._isEnabled) {\r\n return false;\r\n }\r\n this._dummyVector2.copyFromFloats(x, y);\r\n if (type === PointerEventTypes.POINTERMOVE) {\r\n this._onPointerMove(this, this._dummyVector2, pointerId, pi);\r\n\r\n const previousControlOver = this._host._lastControlOver[pointerId];\r\n if (previousControlOver && previousControlOver !== this) {\r\n previousControlOver._onPointerOut(this, pi);\r\n }\r\n\r\n if (previousControlOver !== this) {\r\n this._onPointerEnter(this, pi);\r\n }\r\n\r\n this._host._lastControlOver[pointerId] = this;\r\n return true;\r\n } else if (type === PointerEventTypes.POINTERDOWN) {\r\n this._onPointerDown(this, this._dummyVector2, pointerId, buttonIndex, pi);\r\n this._host._registerLastControlDown(this, pointerId);\r\n this._host._lastPickedControl = this;\r\n return true;\r\n } else if (type === PointerEventTypes.POINTERUP) {\r\n if (this._host._lastControlDown[pointerId]) {\r\n this._host._lastControlDown[pointerId]._onPointerUp(this, this._dummyVector2, pointerId, buttonIndex, true, pi);\r\n }\r\n if (!this._host.usePointerTapForClickEvent) {\r\n delete this._host._lastControlDown[pointerId];\r\n }\r\n return true;\r\n } else if (type === PointerEventTypes.POINTERWHEEL) {\r\n if (this._host._lastControlOver[pointerId]) {\r\n this._host._lastControlOver[pointerId]._onWheelScroll(deltaX, deltaY);\r\n return true;\r\n }\r\n } else if (type === PointerEventTypes.POINTERTAP) {\r\n if (this._host._lastControlDown[pointerId]) {\r\n this._host._lastControlDown[pointerId]._onPointerPick(this, this._dummyVector2, pointerId, buttonIndex, true, pi);\r\n }\r\n delete this._host._lastControlDown[pointerId];\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _getStyleProperty(propName: \"fontStyle\" | \"fontWeight\" | \"fontFamily\", defaultValue: string): string {\r\n const prop = (this._style && this._style[propName]) ?? this[propName];\r\n if (!prop && this.parent) {\r\n return this.parent._getStyleProperty(propName, defaultValue);\r\n } else if (!this.parent) {\r\n return defaultValue;\r\n } else {\r\n return prop;\r\n }\r\n }\r\n\r\n private _prepareFont() {\r\n if (!this._font && !this._fontSet) {\r\n return;\r\n }\r\n\r\n this._font =\r\n this._getStyleProperty(\"fontStyle\", \"\") +\r\n \" \" +\r\n this._getStyleProperty(\"fontWeight\", \"\") +\r\n \" \" +\r\n this.fontSizeInPixels +\r\n \"px \" +\r\n this._getStyleProperty(\"fontFamily\", \"Arial\");\r\n\r\n this._fontOffset = Control._GetFontOffset(this._font, this._host?.getScene()?.getEngine());\r\n\r\n //children need to be refreshed\r\n const descendants = this.getDescendants();\r\n for (const child of descendants) {\r\n child._markAllAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * A control has a dimension fully defined if that dimension doesn't depend on the parent's dimension.\r\n * As an example, a control that has dimensions in pixels is fully defined, while in percentage is not fully defined.\r\n * @param dim the dimension to check (width or height)\r\n * @returns if the dimension is fully defined\r\n */\r\n public isDimensionFullyDefined(dim: \"width\" | \"height\"): boolean {\r\n return this.getDimension(dim).isPixel;\r\n }\r\n\r\n /**\r\n * Gets the dimension of the control along a specified axis\r\n * @param dim the dimension to retrieve (width or height)\r\n * @returns the dimension value along the specified axis\r\n */\r\n public getDimension(dim: \"width\" | \"height\"): ValueAndUnit {\r\n if (dim === \"width\") {\r\n return this._width;\r\n } else {\r\n return this._height;\r\n }\r\n }\r\n\r\n /**\r\n * Clones a control and its descendants\r\n * @param host the texture where the control will be instantiated. Can be empty, in which case the control will be created on the same texture\r\n * @returns the cloned control\r\n */\r\n public clone(host?: AdvancedDynamicTexture): Control {\r\n const serialization: any = {};\r\n this.serialize(serialization, true);\r\n const controlType = Tools.Instantiate(\"BABYLON.GUI.\" + serialization.className);\r\n const cloned = new controlType();\r\n cloned.parse(serialization, host);\r\n\r\n return cloned;\r\n }\r\n\r\n /**\r\n * Parses a serialized object into this control\r\n * @param serializedObject the object with the serialized properties\r\n * @param host the texture where the control will be instantiated. Can be empty, in which case the control will be created on the same texture\r\n * @param urlRewriter defines an url rewriter to update urls before sending them to the controls\r\n * @returns this control\r\n */\r\n public parse(serializedObject: any, host?: AdvancedDynamicTexture, urlRewriter?: (url: string) => string): Control {\r\n this._urlRewriter = urlRewriter;\r\n SerializationHelper.Parse(() => this, serializedObject, null);\r\n\r\n this.name = serializedObject.name;\r\n\r\n this._parseFromContent(serializedObject, host ?? this._host);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Serializes the current control\r\n * @param serializationObject defined the JSON serialized object\r\n * @param force if the control should be serialized even if the isSerializable flag is set to false (default false)\r\n * @param allowCanvas defines if the control is allowed to use a Canvas2D object to serialize (true by default)\r\n */\r\n public serialize(serializationObject: any, force: boolean = false, allowCanvas: boolean = true) {\r\n if (!this.isSerializable && !force) {\r\n return;\r\n }\r\n let idealWidth = 0;\r\n let idealHeight = 0;\r\n // the host's ideal width and height are influencing the serialization, as they are used in getValue() of ValueAndUnit.\r\n // for a proper serialization, we need to temporarily set them to 0 and re-set them back afterwards.\r\n if (this.host) {\r\n idealHeight = this.host.idealHeight;\r\n idealWidth = this.host.idealWidth;\r\n this.host.idealWidth = 0;\r\n this.host.idealHeight = 0;\r\n }\r\n SerializationHelper.Serialize(this, serializationObject);\r\n serializationObject.name = this.name;\r\n serializationObject.className = this.getClassName();\r\n\r\n // Call prepareFont to guarantee the font is properly set before serializing\r\n if (allowCanvas) {\r\n this._prepareFont();\r\n }\r\n if (this._fontFamily) {\r\n serializationObject.fontFamily = this._fontFamily;\r\n }\r\n if (this.fontSize) {\r\n serializationObject.fontSize = this.fontSize;\r\n }\r\n if (this.fontWeight) {\r\n serializationObject.fontWeight = this.fontWeight;\r\n }\r\n if (this.fontStyle) {\r\n serializationObject.fontStyle = this.fontStyle;\r\n }\r\n\r\n if (this._gradient) {\r\n serializationObject.gradient = {};\r\n this._gradient.serialize(serializationObject.gradient);\r\n }\r\n\r\n // Animations\r\n SerializationHelper.AppendSerializedAnimations(this, serializationObject);\r\n // re-set the ideal width and height\r\n if (this.host) {\r\n this.host.idealWidth = idealWidth;\r\n this.host.idealHeight = idealHeight;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _parseFromContent(serializedObject: any, host: AdvancedDynamicTexture, urlRewriter?: (url: string) => string) {\r\n if (serializedObject.fontFamily) {\r\n this.fontFamily = serializedObject.fontFamily;\r\n }\r\n\r\n if (serializedObject.fontSize) {\r\n this.fontSize = serializedObject.fontSize;\r\n }\r\n\r\n if (serializedObject.fontWeight) {\r\n this.fontWeight = serializedObject.fontWeight;\r\n }\r\n\r\n if (serializedObject.fontStyle) {\r\n this.fontStyle = serializedObject.fontStyle;\r\n }\r\n\r\n // Gradient\r\n if (serializedObject.gradient) {\r\n const className = Tools.Instantiate(\"BABYLON.GUI.\" + serializedObject.gradient.className);\r\n this._gradient = new className();\r\n this._gradient?.parse(serializedObject.gradient);\r\n }\r\n\r\n // Animations\r\n if (serializedObject.animations) {\r\n this.animations = [];\r\n for (let animationIndex = 0; animationIndex < serializedObject.animations.length; animationIndex++) {\r\n const parsedAnimation = serializedObject.animations[animationIndex];\r\n const internalClass = GetClass(\"BABYLON.Animation\");\r\n if (internalClass) {\r\n this.animations.push(internalClass.Parse(parsedAnimation));\r\n }\r\n }\r\n\r\n if (serializedObject.autoAnimate && this._host && this._host.getScene()) {\r\n this._host\r\n .getScene()!\r\n .beginAnimation(\r\n this,\r\n serializedObject.autoAnimateFrom,\r\n serializedObject.autoAnimateTo,\r\n serializedObject.autoAnimateLoop,\r\n serializedObject.autoAnimateSpeed || 1.0\r\n );\r\n }\r\n }\r\n\r\n this.fixedRatioMasterIsWidth = serializedObject.fixedRatioMasterIsWidth ?? this.fixedRatioMasterIsWidth;\r\n }\r\n\r\n /** Releases associated resources */\r\n public dispose() {\r\n this.onDirtyObservable.clear();\r\n this.onBeforeDrawObservable.clear();\r\n this.onAfterDrawObservable.clear();\r\n this.onPointerDownObservable.clear();\r\n this.onPointerEnterObservable.clear();\r\n this.onPointerMoveObservable.clear();\r\n this.onPointerOutObservable.clear();\r\n this.onPointerUpObservable.clear();\r\n this.onPointerClickObservable.clear();\r\n this.onWheelObservable.clear();\r\n\r\n // focus\r\n this.onBlurObservable.clear();\r\n this.onFocusObservable.clear();\r\n this.onKeyboardEventProcessedObservable.clear();\r\n\r\n if (this._styleObserver && this._style) {\r\n this._style.onChangedObservable.remove(this._styleObserver);\r\n this._styleObserver = null;\r\n }\r\n\r\n if (this.parent) {\r\n this.parent.removeControl(this);\r\n this.parent = null;\r\n }\r\n\r\n if (this._host) {\r\n const index = this._host._linkedControls.indexOf(this);\r\n if (index > -1) {\r\n this.linkWithMesh(null);\r\n }\r\n }\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n this.onDisposeObservable.clear();\r\n }\r\n\r\n // Statics\r\n private static _HORIZONTAL_ALIGNMENT_LEFT = 0;\r\n private static _HORIZONTAL_ALIGNMENT_RIGHT = 1;\r\n private static _HORIZONTAL_ALIGNMENT_CENTER = 2;\r\n\r\n private static _VERTICAL_ALIGNMENT_TOP = 0;\r\n private static _VERTICAL_ALIGNMENT_BOTTOM = 1;\r\n private static _VERTICAL_ALIGNMENT_CENTER = 2;\r\n\r\n /** HORIZONTAL_ALIGNMENT_LEFT */\r\n public static get HORIZONTAL_ALIGNMENT_LEFT(): number {\r\n return Control._HORIZONTAL_ALIGNMENT_LEFT;\r\n }\r\n\r\n /** HORIZONTAL_ALIGNMENT_RIGHT */\r\n public static get HORIZONTAL_ALIGNMENT_RIGHT(): number {\r\n return Control._HORIZONTAL_ALIGNMENT_RIGHT;\r\n }\r\n\r\n /** HORIZONTAL_ALIGNMENT_CENTER */\r\n public static get HORIZONTAL_ALIGNMENT_CENTER(): number {\r\n return Control._HORIZONTAL_ALIGNMENT_CENTER;\r\n }\r\n\r\n /** VERTICAL_ALIGNMENT_TOP */\r\n public static get VERTICAL_ALIGNMENT_TOP(): number {\r\n return Control._VERTICAL_ALIGNMENT_TOP;\r\n }\r\n\r\n /** VERTICAL_ALIGNMENT_BOTTOM */\r\n public static get VERTICAL_ALIGNMENT_BOTTOM(): number {\r\n return Control._VERTICAL_ALIGNMENT_BOTTOM;\r\n }\r\n\r\n /** VERTICAL_ALIGNMENT_CENTER */\r\n public static get VERTICAL_ALIGNMENT_CENTER(): number {\r\n return Control._VERTICAL_ALIGNMENT_CENTER;\r\n }\r\n\r\n private static _FontHeightSizes: { [key: string]: { ascent: number; height: number; descent: number } } = {};\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _GetFontOffset(font: string, engineToUse?: AbstractEngine): { ascent: number; height: number; descent: number } {\r\n if (Control._FontHeightSizes[font]) {\r\n return Control._FontHeightSizes[font];\r\n }\r\n\r\n const engine = engineToUse || EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n throw new Error(\"Invalid engine. Unable to create a canvas.\");\r\n }\r\n\r\n const result = engine.getFontOffset(font);\r\n Control._FontHeightSizes[font] = result;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a Control from parsed data\r\n * @param serializedObject defines parsed data\r\n * @param host defines the hosting AdvancedDynamicTexture\r\n * @param urlRewriter defines an url rewriter to update urls before sending them to the controls\r\n * @returns a new Control\r\n */\r\n public static Parse(serializedObject: any, host: AdvancedDynamicTexture, urlRewriter?: (url: string) => string): Control {\r\n const controlType = Tools.Instantiate(\"BABYLON.GUI.\" + serializedObject.className);\r\n const control = SerializationHelper.Parse(\r\n () => {\r\n const newControl = new controlType() as Control;\r\n newControl._urlRewriter = urlRewriter;\r\n return newControl;\r\n },\r\n serializedObject,\r\n null\r\n );\r\n\r\n control.name = serializedObject.name;\r\n\r\n control._parseFromContent(serializedObject, host, urlRewriter);\r\n\r\n return control;\r\n }\r\n\r\n public static AddHeader: (control: Control, text: string, size: string | number, options: { isHorizontal: boolean; controlFirst: boolean }) => any = () => {};\r\n\r\n /**\r\n * @internal\r\n */\r\n protected static drawEllipse(x: number, y: number, width: number, height: number, arc: number, context: ICanvasRenderingContext): void {\r\n context.translate(x, y);\r\n context.scale(width, height);\r\n\r\n context.beginPath();\r\n context.arc(0, 0, 1, 0, 2 * Math.PI * arc, arc < 0);\r\n\r\n if (arc >= 1) {\r\n context.closePath();\r\n }\r\n\r\n context.scale(1 / width, 1 / height);\r\n context.translate(-x, -y);\r\n }\r\n\r\n /**\r\n * Returns true if the control is ready to be used\r\n * @returns\r\n */\r\n public isReady(): boolean {\r\n // Most controls are ready by default, so the default implementation is to return true\r\n return true;\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.Control\", Control);\r\n","import { type Nullable } from \"core/types\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\nimport { Control } from \"./control\";\r\nimport { Measure } from \"../measure\";\r\nimport { type AdvancedDynamicTexture } from \"../advancedDynamicTexture\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { type PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\nimport { DynamicTexture } from \"core/Materials/Textures/dynamicTexture\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { type BaseGradient } from \"./gradient/BaseGradient\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { Matrix2D } from \"../math2D\";\r\n\r\n/**\r\n * Root class for 2D containers\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#containers\r\n */\r\nexport class Container extends Control {\r\n /** @internal */\r\n public _children = new Array<Control>();\r\n /** @internal */\r\n protected _measureForChildren = Measure.Empty();\r\n /** @internal */\r\n protected _background = \"\";\r\n /** @internal */\r\n protected _backgroundGradient: Nullable<BaseGradient> = null;\r\n /** @internal */\r\n protected _adaptWidthToChildren = false;\r\n /** @internal */\r\n protected _adaptHeightToChildren = false;\r\n /** @internal */\r\n protected _renderToIntermediateTexture: boolean = false;\r\n /** @internal */\r\n protected _intermediateTexture: Nullable<DynamicTexture> = null;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the container will let internal controls handle picking instead of doing it directly using its bounding info\r\n */\r\n @serialize()\r\n public delegatePickingToChildren = false;\r\n\r\n /** Gets or sets boolean indicating if children should be rendered to an intermediate texture rather than directly to host, useful for alpha blending */\r\n @serialize()\r\n public get renderToIntermediateTexture(): boolean {\r\n return this._renderToIntermediateTexture;\r\n }\r\n public set renderToIntermediateTexture(value: boolean) {\r\n if (this._renderToIntermediateTexture === value) {\r\n return;\r\n }\r\n this._renderToIntermediateTexture = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that layout cycle errors should be displayed on the console\r\n */\r\n public logLayoutCycleErrors = false;\r\n\r\n /**\r\n * Gets or sets the number of layout cycles (a change involved by a control while evaluating the layout) allowed\r\n */\r\n @serialize()\r\n public maxLayoutCycle = 3;\r\n\r\n /** Gets or sets a boolean indicating if the container should try to adapt to its children height */\r\n @serialize()\r\n public get adaptHeightToChildren(): boolean {\r\n return this._adaptHeightToChildren;\r\n }\r\n\r\n public set adaptHeightToChildren(value: boolean) {\r\n if (this._adaptHeightToChildren === value) {\r\n return;\r\n }\r\n\r\n this._adaptHeightToChildren = value;\r\n\r\n if (value) {\r\n this.height = \"100%\";\r\n }\r\n\r\n this._rebuildLayout = true;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the container should try to adapt to its children width */\r\n @serialize()\r\n public get adaptWidthToChildren(): boolean {\r\n return this._adaptWidthToChildren;\r\n }\r\n\r\n public set adaptWidthToChildren(value: boolean) {\r\n if (this._adaptWidthToChildren === value) {\r\n return;\r\n }\r\n\r\n this._adaptWidthToChildren = value;\r\n\r\n if (value) {\r\n this.width = \"100%\";\r\n }\r\n\r\n this._rebuildLayout = true;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets background color */\r\n @serialize()\r\n public get background(): string {\r\n return this._background;\r\n }\r\n\r\n public set background(value: string) {\r\n if (this._background === value) {\r\n return;\r\n }\r\n\r\n this._background = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets background gradient color. Takes precedence over background */\r\n @serialize()\r\n public get backgroundGradient() {\r\n return this._backgroundGradient;\r\n }\r\n\r\n public set backgroundGradient(value: Nullable<BaseGradient>) {\r\n if (this._backgroundGradient === value) {\r\n return;\r\n }\r\n this._backgroundGradient = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets the list of children */\r\n public get children(): Control[] {\r\n return this._children;\r\n }\r\n\r\n public override get isReadOnly() {\r\n return this._isReadOnly;\r\n }\r\n\r\n public override set isReadOnly(value: boolean) {\r\n this._isReadOnly = value;\r\n\r\n for (const child of this._children) {\r\n child.isReadOnly = value;\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new Container\r\n * @param name defines the name of the container\r\n */\r\n constructor(public override name?: string) {\r\n super(name);\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"Container\";\r\n }\r\n\r\n public override _flagDescendantsAsMatrixDirty(): void {\r\n for (const child of this.children) {\r\n child._isClipped = false;\r\n child._markMatrixAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets a child using its name\r\n * @param name defines the child name to look for\r\n * @returns the child control if found\r\n */\r\n public getChildByName(name: string): Nullable<Control> {\r\n for (const child of this.children) {\r\n if (child.name === name) {\r\n return child;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets a child using its type and its name\r\n * @param name defines the child name to look for\r\n * @param type defines the child type to look for\r\n * @returns the child control if found\r\n */\r\n public getChildByType(name: string, type: string): Nullable<Control> {\r\n for (const child of this.children) {\r\n if (child.name === name && child.typeName === type) {\r\n return child;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Search for a specific control in children\r\n * @param control defines the control to look for\r\n * @returns true if the control is in child list\r\n */\r\n public containsControl(control: Control): boolean {\r\n return this.children.indexOf(control) !== -1;\r\n }\r\n\r\n /**\r\n * Adds a new control to the current container\r\n * @param control defines the control to add\r\n * @returns the current container\r\n */\r\n public addControl(control: Nullable<Control>): Container {\r\n if (!control) {\r\n return this;\r\n }\r\n\r\n const index = this._children.indexOf(control);\r\n\r\n if (index !== -1) {\r\n return this;\r\n }\r\n control._link(this._host);\r\n\r\n control._markAllAsDirty();\r\n\r\n this._reOrderControl(control);\r\n\r\n this._markAsDirty();\r\n\r\n this.onControlAddedObservable.notifyObservers(control);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes all controls from the current container\r\n * @returns the current container\r\n */\r\n public clearControls(): Container {\r\n const children = this.children.slice();\r\n\r\n for (const child of children) {\r\n this.removeControl(child);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes a control from the current container\r\n * @param control defines the control to remove\r\n * @returns the current container\r\n */\r\n public removeControl(control: Control): Container {\r\n const index = this._children.indexOf(control);\r\n\r\n if (index !== -1) {\r\n this._children.splice(index, 1);\r\n\r\n control.parent = null;\r\n }\r\n\r\n control.linkWithMesh(null);\r\n\r\n if (this._host) {\r\n this._host._cleanControlAfterRemoval(control);\r\n }\r\n\r\n this._markAsDirty();\r\n\r\n this.onControlRemovedObservable.notifyObservers(control);\r\n return this;\r\n }\r\n\r\n /**\r\n * An event triggered when any control is added to this container.\r\n */\r\n public onControlAddedObservable = new Observable<Nullable<Control>>();\r\n\r\n /**\r\n * An event triggered when any control is removed from this container.\r\n */\r\n public onControlRemovedObservable = new Observable<Nullable<Control>>();\r\n\r\n /**\r\n * @internal\r\n */\r\n public _reOrderControl(control: Control): void {\r\n const linkedMesh = control.linkedMesh;\r\n\r\n this.removeControl(control);\r\n\r\n let wasAdded = false;\r\n for (let index = 0; index < this._children.length; index++) {\r\n if (this._children[index].zIndex > control.zIndex) {\r\n this._children.splice(index, 0, control);\r\n wasAdded = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!wasAdded) {\r\n this._children.push(control);\r\n }\r\n\r\n control.parent = this;\r\n\r\n if (linkedMesh) {\r\n control.linkWithMesh(linkedMesh);\r\n }\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _offsetLeft(offset: number) {\r\n super._offsetLeft(offset);\r\n\r\n for (const child of this._children) {\r\n child._offsetLeft(offset);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _offsetTop(offset: number) {\r\n super._offsetTop(offset);\r\n\r\n for (const child of this._children) {\r\n child._offsetTop(offset);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public override _markAllAsDirty(): void {\r\n super._markAllAsDirty();\r\n\r\n for (let index = 0; index < this._children.length; index++) {\r\n this._children[index]._markAllAsDirty();\r\n }\r\n }\r\n\r\n protected _getBackgroundColor(context: ICanvasRenderingContext) {\r\n return this._backgroundGradient ? this._backgroundGradient.getCanvasGradient(context) : this._background;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _localDraw(context: ICanvasRenderingContext): void {\r\n if (this._background || this._backgroundGradient) {\r\n context.save();\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio;\r\n context.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio;\r\n }\r\n\r\n context.fillStyle = this._getBackgroundColor(context);\r\n\r\n context.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n context.restore();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _link(host: AdvancedDynamicTexture): void {\r\n super._link(host);\r\n\r\n for (const child of this._children) {\r\n child._link(host);\r\n }\r\n }\r\n\r\n /** @internal */\r\n protected _beforeLayout() {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected override _processMeasures(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n if (this._isDirty || !this._cachedParentMeasure.isEqualsTo(parentMeasure)) {\r\n super._processMeasures(parentMeasure, context);\r\n this._evaluateClippingState(parentMeasure);\r\n if (this._renderToIntermediateTexture) {\r\n if (this._intermediateTexture && this._host.getScene() != this._intermediateTexture.getScene()) {\r\n this._intermediateTexture.dispose();\r\n this._intermediateTexture = null;\r\n }\r\n if (!this._intermediateTexture) {\r\n this._intermediateTexture = new DynamicTexture(\r\n \"\",\r\n { width: this._currentMeasure.width, height: this._currentMeasure.height },\r\n this._host.getScene(),\r\n false,\r\n Texture.NEAREST_SAMPLINGMODE,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n false\r\n );\r\n this._intermediateTexture.hasAlpha = true;\r\n } else {\r\n this._intermediateTexture.scaleTo(this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _layout(parentMeasure: Measure, context: ICanvasRenderingContext): boolean {\r\n if (!this.isDirty && (!this.isVisible || this.notRenderable)) {\r\n return false;\r\n }\r\n\r\n this.host._numLayoutCalls++;\r\n\r\n if (this._isDirty) {\r\n this._currentMeasure.transformToRef(this._transformMatrix, this._prevCurrentMeasureTransformedIntoGlobalSpace);\r\n }\r\n\r\n let rebuildCount = 0;\r\n\r\n context.save();\r\n\r\n this._applyStates(context);\r\n\r\n this._beforeLayout();\r\n\r\n do {\r\n let computedWidth = -1;\r\n let computedHeight = -1;\r\n this._rebuildLayout = false;\r\n this._processMeasures(parentMeasure, context);\r\n\r\n if (!this._isClipped) {\r\n for (const child of this._children) {\r\n child._tempParentMeasure.copyFrom(this._measureForChildren);\r\n\r\n if (child._layout(this._measureForChildren, context)) {\r\n if (child.isVisible && !child.notRenderable) {\r\n if (this.adaptWidthToChildren && child._width.isPixel) {\r\n computedWidth = Math.max(computedWidth, child._currentMeasure.width + child._paddingLeftInPixels + child._paddingRightInPixels);\r\n }\r\n if (this.adaptHeightToChildren && child._height.isPixel) {\r\n computedHeight = Math.max(computedHeight, child._currentMeasure.height + child._paddingTopInPixels + child._paddingBottomInPixels);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (this.adaptWidthToChildren && computedWidth >= 0) {\r\n computedWidth += this.paddingLeftInPixels + this.paddingRightInPixels;\r\n const width = computedWidth + \"px\";\r\n if (this.width !== width) {\r\n this.parent?._markAsDirty();\r\n this.width = width;\r\n this._width.ignoreAdaptiveScaling = true;\r\n this._rebuildLayout = true;\r\n }\r\n }\r\n if (this.adaptHeightToChildren && computedHeight >= 0) {\r\n computedHeight += this.paddingTopInPixels + this.paddingBottomInPixels;\r\n const height = computedHeight + \"px\";\r\n if (this.height !== height) {\r\n this.parent?._markAsDirty();\r\n this.height = height;\r\n this._height.ignoreAdaptiveScaling = true;\r\n this._rebuildLayout = true;\r\n }\r\n }\r\n\r\n this._postMeasure();\r\n }\r\n rebuildCount++;\r\n } while (this._rebuildLayout && rebuildCount < this.maxLayoutCycle);\r\n\r\n if (this._rebuildLayout && rebuildCount >= this.maxLayoutCycle && this.logLayoutCycleErrors) {\r\n Logger.Error(`Layout cycle detected in GUI (Container name=${this.name}, uniqueId=${this.uniqueId})`);\r\n }\r\n\r\n context.restore();\r\n\r\n if (this._isDirty) {\r\n this.invalidateRect();\r\n\r\n this._isDirty = false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n protected override _postMeasure() {\r\n // Do nothing by default\r\n }\r\n\r\n private _inverseTransformMatrix = Matrix2D.Identity();\r\n private _inverseMeasure = new Measure(0, 0, 0, 0);\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _draw(context: ICanvasRenderingContext, invalidatedRectangle?: Measure): void {\r\n const renderToIntermediateTextureThisDraw = this._renderToIntermediateTexture && this._intermediateTexture;\r\n const contextToDrawTo = renderToIntermediateTextureThisDraw ? (<DynamicTexture>this._intermediateTexture).getContext() : context;\r\n\r\n if (renderToIntermediateTextureThisDraw) {\r\n contextToDrawTo.save();\r\n contextToDrawTo.translate(-this._currentMeasure.left, -this._currentMeasure.top);\r\n if (invalidatedRectangle) {\r\n this._transformMatrix.invertToRef(this._inverseTransformMatrix);\r\n invalidatedRectangle.transformToRef(this._inverseTransformMatrix, this._inverseMeasure);\r\n contextToDrawTo.clearRect(this._inverseMeasure.left, this._inverseMeasure.top, this._inverseMeasure.width, this._inverseMeasure.height);\r\n } else {\r\n contextToDrawTo.clearRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n }\r\n\r\n this._localDraw(contextToDrawTo);\r\n\r\n context.save();\r\n\r\n if (this.clipChildren) {\r\n this._clipForChildren(contextToDrawTo);\r\n }\r\n\r\n for (const child of this._children) {\r\n // Only redraw parts of the screen that are invalidated\r\n if (invalidatedRectangle) {\r\n if (!child._intersectsRect(invalidatedRectangle)) {\r\n continue;\r\n }\r\n }\r\n child._render(contextToDrawTo, invalidatedRectangle);\r\n }\r\n\r\n if (renderToIntermediateTextureThisDraw) {\r\n contextToDrawTo.restore();\r\n context.save();\r\n context.globalAlpha = this.alpha;\r\n context.drawImage(contextToDrawTo.canvas, this._currentMeasure.left, this._currentMeasure.top);\r\n context.restore();\r\n }\r\n\r\n context.restore();\r\n }\r\n\r\n public override getDescendantsToRef(results: Control[], directDescendantsOnly: boolean = false, predicate?: (control: Control) => boolean): void {\r\n if (!this.children) {\r\n return;\r\n }\r\n\r\n for (let index = 0; index < this.children.length; index++) {\r\n const item = this.children[index];\r\n\r\n if (!predicate || predicate(item)) {\r\n results.push(item);\r\n }\r\n\r\n if (!directDescendantsOnly) {\r\n item.getDescendantsToRef(results, false, predicate);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _processPicking(\r\n x: number,\r\n y: number,\r\n pi: Nullable<PointerInfoBase>,\r\n type: number,\r\n pointerId: number,\r\n buttonIndex: number,\r\n deltaX?: number,\r\n deltaY?: number\r\n ): boolean {\r\n if (!this._isEnabled || !this.isVisible || this.notRenderable) {\r\n return false;\r\n }\r\n\r\n // checks if the picking position is within the container\r\n const contains = super.contains(x, y);\r\n\r\n // if clipChildren is off, we should still pass picking events to children even if we don't contain the pointer\r\n if (!contains && this.clipChildren) {\r\n return false;\r\n }\r\n\r\n if (this.delegatePickingToChildren) {\r\n let contains = false;\r\n for (let index = this._children.length - 1; index >= 0; index--) {\r\n const child = this._children[index];\r\n if (child.isEnabled && child.isHitTestVisible && child.isVisible && !child.notRenderable && child.contains(x, y)) {\r\n contains = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!contains) {\r\n return false;\r\n }\r\n }\r\n\r\n // Checking backwards to pick closest first\r\n for (let index = this._children.length - 1; index >= 0; index--) {\r\n const child = this._children[index];\r\n if (child._processPicking(x, y, pi, type, pointerId, buttonIndex, deltaX, deltaY)) {\r\n if (child.hoverCursor) {\r\n this._host._changeCursor(child.hoverCursor);\r\n }\r\n return true;\r\n }\r\n }\r\n\r\n if (!contains) {\r\n return false;\r\n }\r\n\r\n if (!this.isHitTestVisible) {\r\n return false;\r\n }\r\n\r\n return this._processObservables(type, x, y, pi, pointerId, buttonIndex, deltaX, deltaY);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected override _additionalProcessing(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n super._additionalProcessing(parentMeasure, context);\r\n\r\n this._measureForChildren.copyFrom(this._currentMeasure);\r\n }\r\n\r\n protected _getAdaptDimTo(dim: \"width\" | \"height\"): boolean {\r\n if (dim === \"width\") {\r\n return this.adaptWidthToChildren;\r\n } else {\r\n return this.adaptHeightToChildren;\r\n }\r\n }\r\n\r\n public override isDimensionFullyDefined(dim: \"width\" | \"height\"): boolean {\r\n if (this._getAdaptDimTo(dim)) {\r\n for (const child of this.children) {\r\n if (!child.isDimensionFullyDefined(dim)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n return super.isDimensionFullyDefined(dim);\r\n }\r\n\r\n /**\r\n * Serializes the current control\r\n * @param serializationObject defined the JSON serialized object\r\n * @param force force serialization even if isSerializable === false\r\n * @param allowCanvas defines if the control is allowed to use a Canvas2D object to serialize (true by default)\r\n */\r\n public override serialize(serializationObject: any, force: boolean = false, allowCanvas: boolean = true) {\r\n super.serialize(serializationObject, force, allowCanvas);\r\n if (!this.isSerializable && !force) {\r\n return;\r\n }\r\n\r\n if (this.backgroundGradient) {\r\n serializationObject.backgroundGradient = {};\r\n this.backgroundGradient.serialize(serializationObject.backgroundGradient);\r\n }\r\n\r\n if (!this.children.length) {\r\n return;\r\n }\r\n\r\n serializationObject.children = [];\r\n\r\n for (const child of this.children) {\r\n if (child.isSerializable || force) {\r\n const childSerializationObject = {};\r\n child.serialize(childSerializationObject, force, allowCanvas);\r\n serializationObject.children.push(childSerializationObject);\r\n }\r\n }\r\n }\r\n\r\n /** Releases associated resources */\r\n public override dispose() {\r\n super.dispose();\r\n\r\n for (let index = this.children.length - 1; index >= 0; index--) {\r\n this.children[index].dispose();\r\n }\r\n this._intermediateTexture?.dispose();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _parseFromContent(serializedObject: any, host: AdvancedDynamicTexture, urlRewriter?: (url: string) => string) {\r\n super._parseFromContent(serializedObject, host, urlRewriter);\r\n this._link(host);\r\n\r\n // Gradient\r\n if (serializedObject.backgroundGradient) {\r\n const className = Tools.Instantiate(\"BABYLON.GUI.\" + serializedObject.backgroundGradient.className);\r\n this._backgroundGradient = new className();\r\n this._backgroundGradient?.parse(serializedObject.backgroundGradient);\r\n }\r\n\r\n if (!serializedObject.children) {\r\n return;\r\n }\r\n\r\n for (const childData of serializedObject.children) {\r\n this.addControl(Control.Parse(childData, host, urlRewriter));\r\n }\r\n }\r\n\r\n public override isReady(): boolean {\r\n for (const child of this.children) {\r\n if (!child.isReady()) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.Container\", Container);\r\n","import { Container } from \"./container\";\r\nimport { type Measure } from \"../measure\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\n\r\n/** Class used to create rectangle container */\r\nexport class Rectangle extends Container {\r\n private _thickness = 1;\r\n private _cornerRadius = [0, 0, 0, 0];\r\n private _cachedRadius = [0, 0, 0, 0];\r\n\r\n /** Gets or sets border thickness */\r\n @serialize()\r\n public get thickness(): number {\r\n return this._thickness;\r\n }\r\n\r\n public set thickness(value: number) {\r\n if (this._thickness === value) {\r\n return;\r\n }\r\n\r\n this._thickness = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the corner radius of all angles */\r\n @serialize()\r\n public get cornerRadius(): number {\r\n return this._cornerRadius[0];\r\n }\r\n\r\n public set cornerRadius(value: number) {\r\n if (value < 0) {\r\n value = 0;\r\n }\r\n\r\n if (this._cornerRadius[0] === value && this._cornerRadius[1] === value && this._cornerRadius[2] === value && this._cornerRadius[3] === value) {\r\n return;\r\n }\r\n\r\n this._cornerRadius[0] = this._cornerRadius[1] = this._cornerRadius[2] = this._cornerRadius[3] = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the corner radius top left angle */\r\n @serialize()\r\n public get cornerRadiusX(): number {\r\n return this._cornerRadius[0];\r\n }\r\n\r\n public set cornerRadiusX(value: number) {\r\n if (this._cornerRadius[0] === value) {\r\n return;\r\n }\r\n this._cornerRadius[0] = value;\r\n }\r\n\r\n /** Gets or sets the corner radius top right angle */\r\n @serialize()\r\n public get cornerRadiusY(): number {\r\n return this._cornerRadius[1];\r\n }\r\n\r\n public set cornerRadiusY(value: number) {\r\n if (this._cornerRadius[1] === value) {\r\n return;\r\n }\r\n this._cornerRadius[1] = value;\r\n }\r\n\r\n /** Gets or sets the corner radius bottom left angle */\r\n @serialize()\r\n public get cornerRadiusZ(): number {\r\n return this._cornerRadius[2];\r\n }\r\n\r\n public set cornerRadiusZ(value: number) {\r\n if (this._cornerRadius[2] === value) {\r\n return;\r\n }\r\n this._cornerRadius[2] = value;\r\n }\r\n\r\n /** Gets or sets the corner radius bottom right angle */\r\n @serialize()\r\n public get cornerRadiusW(): number {\r\n return this._cornerRadius[3];\r\n }\r\n\r\n public set cornerRadiusW(value: number) {\r\n if (this._cornerRadius[3] === value) {\r\n return;\r\n }\r\n this._cornerRadius[3] = value;\r\n }\r\n\r\n /**\r\n * Creates a new Rectangle\r\n * @param name defines the control name\r\n */\r\n constructor(public override name?: string) {\r\n super(name);\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"Rectangle\";\r\n }\r\n\r\n /** @internal */\r\n protected override _computeAdditionalOffsetX() {\r\n let additionalWidth = 0;\r\n if (this._cornerRadius[0] !== 0 || this._cornerRadius[1] !== 0 || this._cornerRadius[2] !== 0 || this._cornerRadius[3] !== 0) {\r\n // Take in account the aliasing\r\n additionalWidth += 1;\r\n }\r\n if (this.thickness) {\r\n additionalWidth += this.thickness / 2;\r\n }\r\n return additionalWidth;\r\n }\r\n\r\n /** @internal */\r\n protected override _computeAdditionalOffsetY() {\r\n let additionalHeight = 0;\r\n if (this._cornerRadius[0] !== 0 || this._cornerRadius[1] !== 0 || this._cornerRadius[2] !== 0 || this._cornerRadius[3] !== 0) {\r\n // Take in account the aliasing\r\n additionalHeight += 1;\r\n }\r\n if (this.thickness) {\r\n additionalHeight += this.thickness / 2;\r\n }\r\n return additionalHeight;\r\n }\r\n\r\n protected _getRectangleFill(context: ICanvasRenderingContext) {\r\n return this._getBackgroundColor(context);\r\n }\r\n\r\n protected override _localDraw(context: ICanvasRenderingContext): void {\r\n context.save();\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio;\r\n context.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio;\r\n }\r\n\r\n if (this._background || this._backgroundGradient) {\r\n context.fillStyle = this._getRectangleFill(context);\r\n\r\n if (this._cornerRadius[0] !== 0 || this._cornerRadius[1] !== 0 || this._cornerRadius[2] !== 0 || this._cornerRadius[3] !== 0) {\r\n this._drawRoundedRect(context, this._thickness / 2);\r\n context.fill();\r\n } else {\r\n context.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n }\r\n\r\n if (this._thickness) {\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowBlur = 0;\r\n context.shadowOffsetX = 0;\r\n context.shadowOffsetY = 0;\r\n }\r\n\r\n if (this.color || this.gradient) {\r\n context.strokeStyle = this.gradient ? this.gradient.getCanvasGradient(context) : this.color;\r\n }\r\n context.lineWidth = this._thickness;\r\n\r\n if (this._cornerRadius[0] !== 0 || this._cornerRadius[1] !== 0 || this._cornerRadius[2] !== 0 || this._cornerRadius[3] !== 0) {\r\n this._drawRoundedRect(context, this._thickness / 2);\r\n context.stroke();\r\n } else {\r\n context.strokeRect(\r\n this._currentMeasure.left + this._thickness / 2,\r\n this._currentMeasure.top + this._thickness / 2,\r\n this._currentMeasure.width - this._thickness,\r\n this._currentMeasure.height - this._thickness\r\n );\r\n }\r\n }\r\n\r\n context.restore();\r\n }\r\n\r\n protected override _additionalProcessing(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n super._additionalProcessing(parentMeasure, context);\r\n\r\n this._measureForChildren.width -= 2 * this._thickness;\r\n this._measureForChildren.height -= 2 * this._thickness;\r\n this._measureForChildren.left += this._thickness;\r\n this._measureForChildren.top += this._thickness;\r\n }\r\n\r\n private _drawRoundedRect(context: ICanvasRenderingContext, offset: number = 0): void {\r\n const x = this._currentMeasure.left + offset;\r\n const y = this._currentMeasure.top + offset;\r\n const width = this._currentMeasure.width - offset * 2;\r\n const height = this._currentMeasure.height - offset * 2;\r\n\r\n // Scale cornerRadius using idealRatio (same pattern as shadowOffset/spacing)\r\n const idealRatio = this._host.idealRatio;\r\n for (let index = 0; index < this._cornerRadius.length; index++) {\r\n this._cachedRadius[index] = Math.abs(Math.min(height / 2, Math.min(width / 2, this._cornerRadius[index] * idealRatio)));\r\n }\r\n\r\n context.beginPath();\r\n context.moveTo(x + this._cachedRadius[0], y);\r\n context.lineTo(x + width - this._cachedRadius[1], y);\r\n context.arc(x + width - this._cachedRadius[1], y + this._cachedRadius[1], this._cachedRadius[1], (3 * Math.PI) / 2, Math.PI * 2);\r\n context.lineTo(x + width, y + height - this._cachedRadius[2]);\r\n context.arc(x + width - this._cachedRadius[2], y + height - this._cachedRadius[2], this._cachedRadius[2], 0, Math.PI / 2);\r\n context.lineTo(x + this._cachedRadius[3], y + height);\r\n context.arc(x + this._cachedRadius[3], y + height - this._cachedRadius[3], this._cachedRadius[3], Math.PI / 2, Math.PI);\r\n context.lineTo(x, y + this._cachedRadius[0]);\r\n context.arc(x + this._cachedRadius[0], y + this._cachedRadius[0], this._cachedRadius[0], Math.PI, (3 * Math.PI) / 2);\r\n context.closePath();\r\n }\r\n\r\n protected override _clipForChildren(context: ICanvasRenderingContext) {\r\n if (this._cornerRadius[0] !== 0 || this._cornerRadius[1] !== 0 || this._cornerRadius[2] !== 0 || this._cornerRadius[3] !== 0) {\r\n this._drawRoundedRect(context, this._thickness);\r\n context.clip();\r\n }\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.Rectangle\", Rectangle);\r\n","import { Observable } from \"core/Misc/observable\";\r\nimport { type Measure } from \"../measure\";\r\nimport { ValueAndUnit } from \"../valueAndUnit\";\r\nimport { Control } from \"./control\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { type ICanvasRenderingContext, type ITextMetrics } from \"core/Engines/ICanvas\";\r\nimport { EngineStore } from \"core/Engines/engineStore\";\r\n\r\n/**\r\n * Enum that determines the text-wrapping mode to use.\r\n */\r\nexport const enum TextWrapping {\r\n /**\r\n * Clip the text when it's larger than Control.width; this is the default mode.\r\n */\r\n Clip = 0,\r\n\r\n /**\r\n * Wrap the text word-wise, i.e. try to add line-breaks at word boundary to fit within Control.width.\r\n */\r\n WordWrap = 1,\r\n\r\n /**\r\n * Ellipsize the text, i.e. shrink with trailing … when text is larger than Control.width.\r\n */\r\n Ellipsis = 2,\r\n\r\n /**\r\n * Wrap the text word-wise and clip the text when the text's height is larger than the Control.height, and shrink the last line with trailing … .\r\n */\r\n WordWrapEllipsis = 3,\r\n\r\n /**\r\n * Use HTML to wrap the text. This is the only mode that supports east-asian languages.\r\n */\r\n HTML = 4,\r\n}\r\n\r\n/**\r\n * Class used to create text block control\r\n */\r\nexport class TextBlock extends Control {\r\n private _text = \"\";\r\n private _textWrapping = TextWrapping.Clip;\r\n private _textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;\r\n private _textVerticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER;\r\n\r\n private _lines: any[];\r\n private _resizeToFit: boolean = false;\r\n private _lineSpacing: ValueAndUnit = new ValueAndUnit(0);\r\n private _outlineWidth: number = 0;\r\n private _outlineColor: string = \"white\";\r\n private _underline: boolean = false;\r\n private _lineThrough: boolean = false;\r\n private _wordDivider: string = \" \";\r\n private _forceResizeWidth: boolean = false;\r\n private _applyOutlineToUnderline: boolean = false;\r\n\r\n /**\r\n * An event triggered after the text is changed\r\n */\r\n public onTextChangedObservable = new Observable<TextBlock>();\r\n\r\n /**\r\n * An event triggered after the text was broken up into lines\r\n */\r\n public onLinesReadyObservable = new Observable<TextBlock>();\r\n\r\n /**\r\n * Function used to split a string into words. By default, a string is split at each space character found\r\n */\r\n public wordSplittingFunction: Nullable<(line: string) => string[]>;\r\n\r\n /**\r\n * This function will be called when a new HTML element is generated to be used for word wrapping.\r\n * This is only used when wrapping mode HTML is selected.\r\n * Using this function you can adjust word-break, overflow-wrap, hyphens, or any other CSS properties of the HTML element, language-dependent.\r\n */\r\n public adjustWordWrappingHTMLElement: Nullable<(element: HTMLElement) => void>;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the HTML element generated for word wrapping should be reused or removed after each wrapping.\r\n */\r\n public reuseHTMLForWordWrapping: boolean = false;\r\n\r\n /**\r\n * Return the line list (you may need to use the onLinesReadyObservable to make sure the list is ready)\r\n */\r\n public get lines(): any[] {\r\n return this._lines;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the TextBlock will be resized to fit its content\r\n\r\n */\r\n @serialize()\r\n public get resizeToFit(): boolean {\r\n return this._resizeToFit;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the TextBlock will be resized to fit its content\r\n\r\n */\r\n public set resizeToFit(value: boolean) {\r\n if (this._resizeToFit === value) {\r\n return;\r\n }\r\n this._resizeToFit = value;\r\n\r\n if (this._resizeToFit) {\r\n this._width.ignoreAdaptiveScaling = true;\r\n this._height.ignoreAdaptiveScaling = true;\r\n }\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if text must be wrapped\r\n */\r\n @serialize()\r\n public get textWrapping(): TextWrapping | boolean {\r\n return this._textWrapping;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if text must be wrapped\r\n */\r\n public set textWrapping(value: TextWrapping | boolean) {\r\n if (this._textWrapping === value) {\r\n return;\r\n }\r\n this._textWrapping = +value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets text to display\r\n */\r\n @serialize()\r\n public get text(): string {\r\n return this._text;\r\n }\r\n\r\n /**\r\n * Gets or sets text to display\r\n */\r\n public set text(value: string) {\r\n if (this._text === value) {\r\n return;\r\n }\r\n this._text = value + \"\"; // Making sure it is a text\r\n this._markAsDirty();\r\n\r\n this.onTextChangedObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Gets or sets text horizontal alignment (BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_CENTER by default)\r\n */\r\n @serialize()\r\n public get textHorizontalAlignment(): number {\r\n return this._textHorizontalAlignment;\r\n }\r\n\r\n /**\r\n * Gets or sets text horizontal alignment (BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_CENTER by default)\r\n */\r\n public set textHorizontalAlignment(value: number) {\r\n if (this._textHorizontalAlignment === value) {\r\n return;\r\n }\r\n\r\n this._textHorizontalAlignment = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets text vertical alignment (BABYLON.GUI.Control.VERTICAL_ALIGNMENT_CENTER by default)\r\n */\r\n @serialize()\r\n public get textVerticalAlignment(): number {\r\n return this._textVerticalAlignment;\r\n }\r\n\r\n /**\r\n * Gets or sets text vertical alignment (BABYLON.GUI.Control.VERTICAL_ALIGNMENT_CENTER by default)\r\n */\r\n public set textVerticalAlignment(value: number) {\r\n if (this._textVerticalAlignment === value) {\r\n return;\r\n }\r\n\r\n this._textVerticalAlignment = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets line spacing value\r\n */\r\n @serialize()\r\n public set lineSpacing(value: string | number) {\r\n if (this._lineSpacing.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets line spacing value\r\n */\r\n public get lineSpacing(): string | number {\r\n return this._lineSpacing.toString(this._host);\r\n }\r\n\r\n /**\r\n * Gets or sets outlineWidth of the text to display\r\n */\r\n @serialize()\r\n public get outlineWidth(): number {\r\n return this._outlineWidth;\r\n }\r\n\r\n /**\r\n * Gets or sets outlineWidth of the text to display\r\n */\r\n public set outlineWidth(value: number) {\r\n if (this._outlineWidth === value) {\r\n return;\r\n }\r\n this._outlineWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that text must have underline\r\n */\r\n @serialize()\r\n public get underline(): boolean {\r\n return this._underline;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that text must have underline\r\n */\r\n public set underline(value: boolean) {\r\n if (this._underline === value) {\r\n return;\r\n }\r\n this._underline = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets an boolean indicating that text must be crossed out\r\n */\r\n @serialize()\r\n public get lineThrough(): boolean {\r\n return this._lineThrough;\r\n }\r\n\r\n /**\r\n * Gets or sets an boolean indicating that text must be crossed out\r\n */\r\n public set lineThrough(value: boolean) {\r\n if (this._lineThrough === value) {\r\n return;\r\n }\r\n this._lineThrough = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * If the outline should be applied to the underline/strike-through too. Has different behavior in Edge/Chrome vs Firefox.\r\n */\r\n @serialize()\r\n public get applyOutlineToUnderline(): boolean {\r\n return this._applyOutlineToUnderline;\r\n }\r\n\r\n public set applyOutlineToUnderline(value: boolean) {\r\n if (this._applyOutlineToUnderline === value) {\r\n return;\r\n }\r\n this._applyOutlineToUnderline = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets outlineColor of the text to display\r\n */\r\n @serialize()\r\n public get outlineColor(): string {\r\n return this._outlineColor;\r\n }\r\n\r\n /**\r\n * Gets or sets outlineColor of the text to display\r\n */\r\n public set outlineColor(value: string) {\r\n if (this._outlineColor === value) {\r\n return;\r\n }\r\n this._outlineColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets word divider\r\n */\r\n @serialize()\r\n public get wordDivider(): string {\r\n return this._wordDivider;\r\n }\r\n\r\n /**\r\n * Gets or sets word divider\r\n */\r\n public set wordDivider(value: string) {\r\n if (this._wordDivider === value) {\r\n return;\r\n }\r\n this._wordDivider = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * By default, if a text block has text wrapping other than Clip, its width\r\n * is not resized even if resizeToFit = true. This parameter forces the width\r\n * to be resized.\r\n */\r\n @serialize()\r\n public get forceResizeWidth(): boolean {\r\n return this._forceResizeWidth;\r\n }\r\n\r\n public set forceResizeWidth(value: boolean) {\r\n if (this._forceResizeWidth === value) {\r\n return;\r\n }\r\n this._forceResizeWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Creates a new TextBlock object\r\n * @param name defines the name of the control\r\n * @param text defines the text to display (empty string by default)\r\n */\r\n constructor(\r\n /**\r\n * Defines the name of the control\r\n */\r\n public override name?: string,\r\n text: string = \"\"\r\n ) {\r\n super(name);\r\n\r\n this.text = text;\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"TextBlock\";\r\n }\r\n\r\n protected override _processMeasures(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n super._processMeasures(parentMeasure, context);\r\n\r\n // Apply states so we can use the right font to measure\r\n context.save();\r\n this._applyStates(context);\r\n\r\n // Measure the font\r\n if (!this._fontOffset || this.isDirty) {\r\n this._fontOffset = Control._GetFontOffset(context.font, this._host.getScene()?.getEngine());\r\n }\r\n\r\n // Prepare lines\r\n this._lines = this._breakLines(this._currentMeasure.width, this._currentMeasure.height, context);\r\n this.onLinesReadyObservable.notifyObservers(this);\r\n\r\n // Restore context now that we're done measuring the font\r\n context.restore();\r\n\r\n let maxLineWidth: number = 0;\r\n\r\n for (let i = 0; i < this._lines.length; i++) {\r\n const line = this._lines[i];\r\n\r\n if (line.width > maxLineWidth) {\r\n maxLineWidth = line.width;\r\n }\r\n }\r\n\r\n if (this._resizeToFit) {\r\n if (this._textWrapping === TextWrapping.Clip || this._forceResizeWidth) {\r\n const newWidth = Math.ceil(this._paddingLeftInPixels) + Math.ceil(this._paddingRightInPixels) + Math.ceil(maxLineWidth);\r\n if (newWidth !== this._width.getValueInPixel(this._host, this._tempParentMeasure.width)) {\r\n this._width.updateInPlace(newWidth, ValueAndUnit.UNITMODE_PIXEL);\r\n this._rebuildLayout = true;\r\n }\r\n }\r\n let newHeight = (this._paddingTopInPixels + this._paddingBottomInPixels + this._fontOffset.height * this._lines.length) | 0;\r\n\r\n if (this._lines.length > 0 && this._lineSpacing.internalValue !== 0) {\r\n let lineSpacing: number;\r\n if (this._lineSpacing.isPixel) {\r\n lineSpacing = this._lineSpacing.getValue(this._host);\r\n } else {\r\n lineSpacing = this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n newHeight += (this._lines.length - 1) * lineSpacing;\r\n }\r\n\r\n if (newHeight !== this._height.internalValue) {\r\n this._height.updateInPlace(newHeight, ValueAndUnit.UNITMODE_PIXEL);\r\n this._rebuildLayout = true;\r\n }\r\n }\r\n }\r\n\r\n private _drawText(text: string, textWidth: number, y: number, context: ICanvasRenderingContext): void {\r\n const width = this._currentMeasure.width;\r\n let x = 0;\r\n switch (this._textHorizontalAlignment) {\r\n case Control.HORIZONTAL_ALIGNMENT_LEFT:\r\n x = 0;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_RIGHT:\r\n x = width - textWidth;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_CENTER:\r\n x = (width - textWidth) / 2;\r\n break;\r\n }\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n const idealRatio = this.host.idealRatio;\r\n context.shadowOffsetX = this.shadowOffsetX * idealRatio;\r\n context.shadowOffsetY = this.shadowOffsetY * idealRatio;\r\n }\r\n\r\n if (this.outlineWidth) {\r\n context.strokeText(text, this._currentMeasure.left + x, y);\r\n }\r\n context.fillText(text, this._currentMeasure.left + x, y);\r\n\r\n if (this._underline) {\r\n this._drawLine(this._currentMeasure.left + x, y + 3, this._currentMeasure.left + x + textWidth, y + 3, context);\r\n }\r\n\r\n if (this._lineThrough) {\r\n this._drawLine(this._currentMeasure.left + x, y - this.fontSizeInPixels / 3, this._currentMeasure.left + x + textWidth, y - this.fontSizeInPixels / 3, context);\r\n }\r\n }\r\n\r\n private _drawLine(xFrom: number, yFrom: number, xTo: number, yTo: number, context: ICanvasRenderingContext): void {\r\n context.beginPath();\r\n context.lineWidth = Math.round(this.fontSizeInPixels * 0.05);\r\n context.moveTo(xFrom, yFrom);\r\n context.lineTo(xTo, yTo);\r\n if (this.outlineWidth && this.applyOutlineToUnderline) {\r\n context.stroke();\r\n context.fill();\r\n } else {\r\n const currentStroke = context.strokeStyle;\r\n context.strokeStyle = context.fillStyle;\r\n context.stroke();\r\n context.strokeStyle = currentStroke;\r\n }\r\n context.closePath();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _draw(context: ICanvasRenderingContext): void {\r\n context.save();\r\n\r\n this._applyStates(context);\r\n\r\n // Render lines\r\n this._renderLines(context);\r\n\r\n context.restore();\r\n }\r\n\r\n protected override _applyStates(context: ICanvasRenderingContext): void {\r\n super._applyStates(context);\r\n if (this.outlineWidth) {\r\n context.lineWidth = this.outlineWidth;\r\n context.strokeStyle = this.outlineColor;\r\n context.lineJoin = \"miter\";\r\n context.miterLimit = 2;\r\n }\r\n }\r\n\r\n private _linesTemp: object[] = [];\r\n\r\n protected _breakLines(refWidth: number, refHeight: number, context: ICanvasRenderingContext): object[] {\r\n this._linesTemp.length = 0;\r\n const _lines = this._textWrapping === TextWrapping.HTML ? this._parseHTMLText(refWidth, refHeight, context) : this.text.split(\"\\n\");\r\n\r\n switch (this._textWrapping) {\r\n case TextWrapping.WordWrap:\r\n for (const _line of _lines) {\r\n this._linesTemp.push(...this._parseLineWordWrap(_line, refWidth, context));\r\n }\r\n break;\r\n case TextWrapping.Ellipsis:\r\n for (const _line of _lines) {\r\n this._linesTemp.push(this._parseLineEllipsis(_line, refWidth, context));\r\n }\r\n break;\r\n case TextWrapping.WordWrapEllipsis:\r\n for (const _line of _lines) {\r\n this._linesTemp.push(...this._parseLineWordWrapEllipsis(_line, refWidth, refHeight, context));\r\n }\r\n break;\r\n case TextWrapping.HTML:\r\n default:\r\n for (const _line of _lines) {\r\n this._linesTemp.push(this._parseLine(_line, context));\r\n }\r\n break;\r\n }\r\n\r\n return this._linesTemp;\r\n }\r\n\r\n private _htmlElement: Nullable<HTMLElement> = null;\r\n\r\n protected _parseHTMLText(refWidth: number, refHeight: number, context: ICanvasRenderingContext): string[] {\r\n const lines = [] as string[];\r\n if (!this._htmlElement) {\r\n this._htmlElement = document.createElement(\"div\");\r\n document.body.appendChild(this._htmlElement);\r\n }\r\n const htmlElement = this._htmlElement;\r\n htmlElement.textContent = this.text;\r\n htmlElement.style.font = context.font;\r\n htmlElement.style.position = \"absolute\";\r\n htmlElement.style.visibility = \"hidden\";\r\n htmlElement.style.top = \"-1000px\";\r\n htmlElement.style.left = \"-1000px\";\r\n this.adjustWordWrappingHTMLElement?.(htmlElement);\r\n htmlElement.style.width = refWidth + \"px\";\r\n htmlElement.style.height = refHeight + \"px\";\r\n const textContent = htmlElement.textContent;\r\n if (!textContent) {\r\n return lines;\r\n }\r\n // get the text node\r\n const textNode = htmlElement.childNodes[0];\r\n const range = document.createRange();\r\n let idx = 0;\r\n for (const c of textContent) {\r\n range.setStart(textNode, 0);\r\n range.setEnd(textNode, idx + 1);\r\n // \"select\" text from beginning to this position to determine the line\r\n const lineIndex = range.getClientRects().length - 1;\r\n lines[lineIndex] = (lines[lineIndex] || \"\") + c;\r\n idx++;\r\n }\r\n\r\n if (!this.reuseHTMLForWordWrapping) {\r\n htmlElement.remove();\r\n this._htmlElement = null;\r\n }\r\n\r\n return lines;\r\n }\r\n\r\n protected _parseLine(line: string = \"\", context: ICanvasRenderingContext): object {\r\n return { text: line, width: this._getTextMetricsWidth(context.measureText(line)) };\r\n }\r\n\r\n //Calculate how many characters approximately we need to remove\r\n private _getCharsToRemove(lineWidth: number, width: number, lineLength: number) {\r\n const diff = lineWidth > width ? lineWidth - width : 0;\r\n // This isn't exact unless the font is monospaced\r\n const charWidth = lineWidth / lineLength;\r\n const removeChars = Math.max(Math.floor(diff / charWidth), 1);\r\n return removeChars;\r\n }\r\n\r\n protected _parseLineEllipsis(line: string = \"\", width: number, context: ICanvasRenderingContext): object {\r\n let lineWidth = this._getTextMetricsWidth(context.measureText(line));\r\n\r\n let removeChars = this._getCharsToRemove(lineWidth, width, line.length);\r\n\r\n // unicode support. split('') does not work with unicode!\r\n // make sure Array.from is available\r\n const characters = Array.from && Array.from(line);\r\n if (!characters) {\r\n // no array.from, use the old method\r\n while (line.length > 2 && lineWidth > width) {\r\n line = line.slice(0, -removeChars);\r\n lineWidth = this._getTextMetricsWidth(context.measureText(line + \"…\"));\r\n\r\n removeChars = this._getCharsToRemove(lineWidth, width, line.length);\r\n }\r\n // Add on the end\r\n line += \"…\";\r\n } else {\r\n while (characters.length && lineWidth > width) {\r\n characters.splice(characters.length - removeChars, removeChars);\r\n line = `${characters.join(\"\")}…`;\r\n lineWidth = this._getTextMetricsWidth(context.measureText(line));\r\n\r\n removeChars = this._getCharsToRemove(lineWidth, width, line.length);\r\n }\r\n }\r\n\r\n return { text: line, width: lineWidth };\r\n }\r\n\r\n private _getTextMetricsWidth(textMetrics: ITextMetrics) {\r\n if (textMetrics.actualBoundingBoxLeft !== undefined) {\r\n return Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);\r\n }\r\n return textMetrics.width;\r\n }\r\n\r\n protected _parseLineWordWrap(line: string = \"\", width: number, context: ICanvasRenderingContext): object[] {\r\n const lines = [];\r\n const words = this.wordSplittingFunction ? this.wordSplittingFunction(line) : line.split(this._wordDivider);\r\n let lineWidth = this._getTextMetricsWidth(context.measureText(line));\r\n\r\n for (let n = 0; n < words.length; n++) {\r\n const testLine = n > 0 ? line + this._wordDivider + words[n] : words[0];\r\n const testWidth = this._getTextMetricsWidth(context.measureText(testLine));\r\n if (testWidth > width && n > 0) {\r\n lines.push({ text: line, width: lineWidth });\r\n line = words[n];\r\n lineWidth = this._getTextMetricsWidth(context.measureText(line));\r\n } else {\r\n lineWidth = testWidth;\r\n line = testLine;\r\n }\r\n }\r\n lines.push({ text: line, width: lineWidth });\r\n\r\n return lines;\r\n }\r\n\r\n protected _parseLineWordWrapEllipsis(line: string = \"\", width: number, height: number, context: ICanvasRenderingContext): object[] {\r\n const lines = this._parseLineWordWrap(line, width, context);\r\n for (let n = 1; n <= lines.length; n++) {\r\n const currentHeight = this._computeHeightForLinesOf(n);\r\n if (currentHeight > height && n > 1) {\r\n const lastLine = lines[n - 2] as { text: string; width: number };\r\n const currentLine = lines[n - 1] as { text: string; width: number };\r\n lines[n - 2] = this._parseLineEllipsis(lastLine.text + this._wordDivider + currentLine.text, width, context);\r\n const linesToRemove = lines.length - n + 1;\r\n for (let i = 0; i < linesToRemove; i++) {\r\n lines.pop();\r\n }\r\n return lines;\r\n }\r\n }\r\n\r\n return lines;\r\n }\r\n\r\n protected _renderLines(context: ICanvasRenderingContext): void {\r\n if (!this._fontOffset || !this._lines) {\r\n return;\r\n }\r\n const height = this._currentMeasure.height;\r\n let rootY = 0;\r\n switch (this._textVerticalAlignment) {\r\n case Control.VERTICAL_ALIGNMENT_TOP:\r\n rootY = this._fontOffset.ascent;\r\n break;\r\n case Control.VERTICAL_ALIGNMENT_BOTTOM:\r\n rootY = height - this._fontOffset.height * (this._lines.length - 1) - this._fontOffset.descent;\r\n break;\r\n case Control.VERTICAL_ALIGNMENT_CENTER:\r\n rootY = this._fontOffset.ascent + (height - this._fontOffset.height * this._lines.length) / 2;\r\n break;\r\n }\r\n\r\n rootY += this._currentMeasure.top;\r\n\r\n for (let i = 0; i < this._lines.length; i++) {\r\n const line = this._lines[i];\r\n\r\n if (i !== 0 && this._lineSpacing.internalValue !== 0) {\r\n if (this._lineSpacing.isPixel) {\r\n rootY += this._lineSpacing.getValue(this._host);\r\n } else {\r\n rootY = rootY + this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n }\r\n\r\n this._drawText(line.text, line.width, rootY, context);\r\n rootY += this._fontOffset.height;\r\n }\r\n }\r\n\r\n private _computeHeightForLinesOf(lineCount: number): number {\r\n let newHeight = this._paddingTopInPixels + this._paddingBottomInPixels + this._fontOffset.height * lineCount;\r\n\r\n if (lineCount > 0 && this._lineSpacing.internalValue !== 0) {\r\n let lineSpacing: number;\r\n if (this._lineSpacing.isPixel) {\r\n lineSpacing = this._lineSpacing.getValue(this._host);\r\n } else {\r\n lineSpacing = this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n newHeight += (lineCount - 1) * lineSpacing;\r\n }\r\n\r\n return newHeight;\r\n }\r\n\r\n public override isDimensionFullyDefined(dim: \"width\" | \"height\"): boolean {\r\n if (this.resizeToFit) {\r\n return true;\r\n }\r\n return super.isDimensionFullyDefined(dim);\r\n }\r\n\r\n /**\r\n * Given a width constraint applied on the text block, find the expected height\r\n * @returns expected height\r\n */\r\n public computeExpectedHeight(): number {\r\n if (this.text && this.widthInPixels) {\r\n // Should abstract platform instead of using LastCreatedEngine\r\n const context = EngineStore.LastCreatedEngine?.createCanvas(0, 0).getContext(\"2d\");\r\n if (context) {\r\n // This is a temporary context, no need to save/restore\r\n // eslint-disable-next-line babylonjs/require-context-save-before-apply-states\r\n this._applyStates(context);\r\n if (!this._fontOffset) {\r\n this._fontOffset = Control._GetFontOffset(context.font, this._host.getScene()?.getEngine());\r\n }\r\n const lines = this._lines\r\n ? this._lines\r\n : this._breakLines(\r\n this.widthInPixels - this._paddingLeftInPixels - this._paddingRightInPixels,\r\n this.heightInPixels - this._paddingTopInPixels - this._paddingBottomInPixels,\r\n context\r\n );\r\n return this._computeHeightForLinesOf(lines.length);\r\n }\r\n }\r\n return 0;\r\n }\r\n\r\n override dispose(): void {\r\n super.dispose();\r\n\r\n this.onTextChangedObservable.clear();\r\n this._htmlElement?.remove();\r\n this._htmlElement = null;\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.TextBlock\", TextBlock);\r\n","import { type Nullable } from \"core/types\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\nimport { Control } from \"./control\";\r\nimport { type Measure } from \"../measure\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { type ICanvas, type ICanvasRenderingContext, type IImage } from \"core/Engines/ICanvas\";\r\nimport { EngineStore } from \"core/Engines/engineStore\";\r\n\r\n/**\r\n * Class used to create 2D images\r\n */\r\nexport class Image extends Control {\r\n /**\r\n * Specifies an alternate text for the image, if the image for some reason cannot be displayed.\r\n */\r\n public alt?: string;\r\n\r\n private _workingCanvas: Nullable<ICanvas> = null;\r\n\r\n private _domImage: IImage;\r\n private _imageWidth: number;\r\n private _imageHeight: number;\r\n private _loaded = false;\r\n private _stretch = Image.STRETCH_FILL;\r\n private _source: Nullable<string> = null;\r\n private _autoScale = false;\r\n\r\n private _sourceLeft = 0;\r\n private _sourceTop = 0;\r\n private _sourceWidth = 0;\r\n private _sourceHeight = 0;\r\n private _svgAttributesComputationCompleted: boolean = false;\r\n private _isSVG: boolean = false;\r\n\r\n private _cellWidth: number = 0;\r\n private _cellHeight: number = 0;\r\n private _cellId: number = -1;\r\n\r\n private _sliceLeft: number;\r\n private _sliceRight: number;\r\n private _sliceTop: number;\r\n private _sliceBottom: number;\r\n\r\n private _populateNinePatchSlicesFromImage = false;\r\n\r\n private _detectPointerOnOpaqueOnly: boolean;\r\n\r\n private _imageDataCache: {\r\n data: Uint8ClampedArray | null;\r\n key: string;\r\n } = { data: null, key: \"\" };\r\n\r\n /**\r\n * Cache of images to avoid loading the same image multiple times\r\n */\r\n public static SourceImgCache = new Map<string, { img: IImage; timesUsed: number; loaded: boolean; waitingForLoadCallback: Array<() => void> }>();\r\n\r\n /**\r\n * Observable notified when the content is loaded\r\n */\r\n public onImageLoadedObservable = new Observable<Image>();\r\n\r\n /**\r\n * Observable notified when _sourceLeft, _sourceTop, _sourceWidth and _sourceHeight are computed\r\n */\r\n public onSVGAttributesComputedObservable = new Observable<Image>();\r\n\r\n /**\r\n * Gets or sets the referrer policy to apply on the img element load request.\r\n * You should set referrerPolicy before set the source of the image if you want to ensure the header will be present on the xhr loading request\r\n */\r\n public referrerPolicy: Nullable<ReferrerPolicy>;\r\n\r\n /**\r\n * Gets a boolean indicating that the content is loaded\r\n */\r\n public get isLoaded(): boolean {\r\n return this._loaded;\r\n }\r\n\r\n public override isReady(): boolean {\r\n return this.isLoaded;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if pointers should only be validated on pixels with alpha > 0.\r\n * Beware using this as this will consume more memory as the image has to be stored twice\r\n */\r\n @serialize()\r\n public get detectPointerOnOpaqueOnly(): boolean {\r\n return this._detectPointerOnOpaqueOnly;\r\n }\r\n\r\n public set detectPointerOnOpaqueOnly(value: boolean) {\r\n if (this._detectPointerOnOpaqueOnly === value) {\r\n return;\r\n }\r\n\r\n this._detectPointerOnOpaqueOnly = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the left value for slicing (9-patch)\r\n */\r\n @serialize()\r\n public get sliceLeft(): number {\r\n return this._sliceLeft;\r\n }\r\n\r\n public set sliceLeft(value: number) {\r\n if (this._sliceLeft === value) {\r\n return;\r\n }\r\n\r\n this._sliceLeft = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the right value for slicing (9-patch)\r\n */\r\n @serialize()\r\n public get sliceRight(): number {\r\n return this._sliceRight;\r\n }\r\n\r\n public set sliceRight(value: number) {\r\n if (this._sliceRight === value) {\r\n return;\r\n }\r\n\r\n this._sliceRight = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the top value for slicing (9-patch)\r\n */\r\n @serialize()\r\n public get sliceTop(): number {\r\n return this._sliceTop;\r\n }\r\n\r\n public set sliceTop(value: number) {\r\n if (this._sliceTop === value) {\r\n return;\r\n }\r\n\r\n this._sliceTop = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the bottom value for slicing (9-patch)\r\n */\r\n @serialize()\r\n public get sliceBottom(): number {\r\n return this._sliceBottom;\r\n }\r\n\r\n public set sliceBottom(value: number) {\r\n if (this._sliceBottom === value) {\r\n return;\r\n }\r\n\r\n this._sliceBottom = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the left coordinate in the source image\r\n */\r\n @serialize()\r\n public get sourceLeft(): number {\r\n return this._sourceLeft;\r\n }\r\n\r\n public set sourceLeft(value: number) {\r\n if (this._sourceLeft === value) {\r\n return;\r\n }\r\n\r\n this._sourceLeft = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the top coordinate in the source image\r\n */\r\n @serialize()\r\n public get sourceTop(): number {\r\n return this._sourceTop;\r\n }\r\n\r\n public set sourceTop(value: number) {\r\n if (this._sourceTop === value) {\r\n return;\r\n }\r\n\r\n this._sourceTop = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the width to capture in the source image\r\n */\r\n @serialize()\r\n public get sourceWidth(): number {\r\n return this._sourceWidth;\r\n }\r\n\r\n public set sourceWidth(value: number) {\r\n if (this._sourceWidth === value) {\r\n return;\r\n }\r\n\r\n this._sourceWidth = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the height to capture in the source image\r\n */\r\n @serialize()\r\n public get sourceHeight(): number {\r\n return this._sourceHeight;\r\n }\r\n\r\n public set sourceHeight(value: number) {\r\n if (this._sourceHeight === value) {\r\n return;\r\n }\r\n\r\n this._sourceHeight = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets the image width\r\n */\r\n public get imageWidth(): number {\r\n return this._imageWidth;\r\n }\r\n\r\n /**\r\n * Gets the image height\r\n */\r\n public get imageHeight(): number {\r\n return this._imageHeight;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if nine patch slices (left, top, right, bottom) should be read from image data\r\n */\r\n @serialize()\r\n public get populateNinePatchSlicesFromImage(): boolean {\r\n return this._populateNinePatchSlicesFromImage;\r\n }\r\n\r\n public set populateNinePatchSlicesFromImage(value: boolean) {\r\n if (this._populateNinePatchSlicesFromImage === value) {\r\n return;\r\n }\r\n\r\n this._populateNinePatchSlicesFromImage = value;\r\n\r\n if (this._populateNinePatchSlicesFromImage && this._loaded) {\r\n this._extractNinePatchSliceDataFromImage();\r\n }\r\n }\r\n\r\n /** Indicates if the format of the image is SVG */\r\n public get isSVG(): boolean {\r\n return this._isSVG;\r\n }\r\n\r\n /** Gets the status of the SVG attributes computation (sourceLeft, sourceTop, sourceWidth, sourceHeight) */\r\n public get svgAttributesComputationCompleted(): boolean {\r\n return this._svgAttributesComputationCompleted;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the image can force its container to adapt its size\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#image\r\n */\r\n @serialize()\r\n public get autoScale(): boolean {\r\n return this._autoScale;\r\n }\r\n\r\n public set autoScale(value: boolean) {\r\n if (this._autoScale === value) {\r\n return;\r\n }\r\n\r\n this._autoScale = value;\r\n\r\n if (value && this._loaded) {\r\n this.synchronizeSizeWithContent();\r\n }\r\n }\r\n\r\n /** Gets or sets the stretching mode used by the image */\r\n @serialize()\r\n public get stretch(): number {\r\n return this._stretch;\r\n }\r\n\r\n public set stretch(value: number) {\r\n if (this._stretch === value) {\r\n return;\r\n }\r\n\r\n this._stretch = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _rotate90(n: number, preserveProperties: boolean = false): Image {\r\n const width = this._domImage.width;\r\n const height = this._domImage.height;\r\n\r\n // Should abstract platform instead of using LastCreatedEngine\r\n const engine = this._host?.getScene()?.getEngine() || EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n throw new Error(\"Invalid engine. Unable to create a canvas.\");\r\n }\r\n const canvas = engine.createCanvas(height, width);\r\n\r\n const context = canvas.getContext(\"2d\");\r\n\r\n context.translate(canvas.width / 2, canvas.height / 2);\r\n context.rotate((n * Math.PI) / 2);\r\n\r\n context.drawImage(this._domImage, 0, 0, width, height, -width / 2, -height / 2, width, height);\r\n\r\n const dataUrl: string = canvas.toDataURL(\"image/jpg\");\r\n const rotatedImage = new Image(this.name + \"rotated\", dataUrl);\r\n\r\n if (preserveProperties) {\r\n rotatedImage._stretch = this._stretch;\r\n rotatedImage._autoScale = this._autoScale;\r\n rotatedImage._cellId = this._cellId;\r\n rotatedImage._cellWidth = n % 1 ? this._cellHeight : this._cellWidth;\r\n rotatedImage._cellHeight = n % 1 ? this._cellWidth : this._cellHeight;\r\n }\r\n\r\n this._handleRotationForSVGImage(this, rotatedImage, n);\r\n\r\n this._imageDataCache.data = null;\r\n\r\n return rotatedImage;\r\n }\r\n\r\n private _handleRotationForSVGImage(srcImage: Image, dstImage: Image, n: number): void {\r\n if (!srcImage._isSVG) {\r\n return;\r\n }\r\n\r\n if (srcImage._svgAttributesComputationCompleted) {\r\n this._rotate90SourceProperties(srcImage, dstImage, n);\r\n this._markAsDirty();\r\n } else {\r\n srcImage.onSVGAttributesComputedObservable.addOnce(() => {\r\n this._rotate90SourceProperties(srcImage, dstImage, n);\r\n this._markAsDirty();\r\n });\r\n }\r\n }\r\n\r\n private _rotate90SourceProperties(srcImage: Image, dstImage: Image, n: number): void {\r\n let srcLeft = srcImage.sourceLeft,\r\n srcTop = srcImage.sourceTop,\r\n srcWidth = srcImage.domImage.width,\r\n srcHeight = srcImage.domImage.height;\r\n\r\n let dstLeft = srcLeft,\r\n dstTop = srcTop,\r\n dstWidth = srcImage.sourceWidth,\r\n dstHeight = srcImage.sourceHeight;\r\n\r\n if (n != 0) {\r\n const mult = n < 0 ? -1 : 1;\r\n n = n % 4;\r\n for (let i = 0; i < Math.abs(n); ++i) {\r\n dstLeft = -(srcTop - srcHeight / 2) * mult + srcHeight / 2;\r\n dstTop = (srcLeft - srcWidth / 2) * mult + srcWidth / 2;\r\n [dstWidth, dstHeight] = [dstHeight, dstWidth];\r\n if (n < 0) {\r\n dstTop -= dstHeight;\r\n } else {\r\n dstLeft -= dstWidth;\r\n }\r\n srcLeft = dstLeft;\r\n srcTop = dstTop;\r\n [srcWidth, srcHeight] = [srcHeight, srcWidth];\r\n }\r\n }\r\n\r\n dstImage.sourceLeft = dstLeft;\r\n dstImage.sourceTop = dstTop;\r\n dstImage.sourceWidth = dstWidth;\r\n dstImage.sourceHeight = dstHeight;\r\n }\r\n\r\n private _extractNinePatchSliceDataFromImage() {\r\n const width = this._domImage.width;\r\n const height = this._domImage.height;\r\n\r\n if (!this._workingCanvas) {\r\n const engine = this._host?.getScene()?.getEngine() || EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n throw new Error(\"Invalid engine. Unable to create a canvas.\");\r\n }\r\n this._workingCanvas = engine.createCanvas(width, height);\r\n }\r\n const canvas = this._workingCanvas;\r\n const context = canvas.getContext(\"2d\");\r\n\r\n context.drawImage(this._domImage, 0, 0, width, height);\r\n const imageData = context.getImageData(0, 0, width, height);\r\n\r\n // Left and right\r\n this._sliceLeft = -1;\r\n this._sliceRight = -1;\r\n for (let x = 0; x < width; x++) {\r\n const alpha = imageData.data[x * 4 + 3];\r\n\r\n if (alpha > 127 && this._sliceLeft === -1) {\r\n this._sliceLeft = x;\r\n continue;\r\n }\r\n\r\n if (alpha < 127 && this._sliceLeft > -1) {\r\n this._sliceRight = x;\r\n break;\r\n }\r\n }\r\n\r\n // top and bottom\r\n this._sliceTop = -1;\r\n this._sliceBottom = -1;\r\n for (let y = 0; y < height; y++) {\r\n const alpha = imageData.data[y * width * 4 + 3];\r\n\r\n if (alpha > 127 && this._sliceTop === -1) {\r\n this._sliceTop = y;\r\n continue;\r\n }\r\n\r\n if (alpha < 127 && this._sliceTop > -1) {\r\n this._sliceBottom = y;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the internal DOM image used to render the control\r\n */\r\n public set domImage(value: IImage) {\r\n this._domImage = value;\r\n this._loaded = false;\r\n this._imageDataCache.data = null;\r\n\r\n if (this._domImage.width) {\r\n this._onImageLoaded();\r\n } else {\r\n this._domImage.onload = () => {\r\n this._onImageLoaded();\r\n };\r\n }\r\n }\r\n\r\n public get domImage(): IImage {\r\n return this._domImage;\r\n }\r\n\r\n private _onImageLoaded(): void {\r\n this._imageDataCache.data = null;\r\n this._imageWidth = this._domImage.width;\r\n this._imageHeight = this._domImage.height;\r\n this._loaded = true;\r\n\r\n if (this._populateNinePatchSlicesFromImage) {\r\n this._extractNinePatchSliceDataFromImage();\r\n }\r\n\r\n if (this._autoScale) {\r\n this.synchronizeSizeWithContent();\r\n }\r\n\r\n this.onImageLoadedObservable.notifyObservers(this);\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets the image source url\r\n */\r\n @serialize()\r\n public get source() {\r\n return this._source;\r\n }\r\n\r\n /**\r\n * Resets the internal Image Element cache. Can reduce memory usage.\r\n */\r\n public static ResetImageCache() {\r\n Image.SourceImgCache.clear();\r\n }\r\n\r\n private _removeCacheUsage(source: Nullable<string>) {\r\n const value = source && Image.SourceImgCache.get(source);\r\n if (value) {\r\n value.timesUsed -= 1;\r\n\r\n // Remove from DOM\r\n const htmlElement = value.img as HTMLImageElement;\r\n if (htmlElement.parentNode) {\r\n htmlElement.parentNode.removeChild(htmlElement);\r\n }\r\n\r\n // Since the image isn't being used anymore, we can clean it from the cache\r\n if (value.timesUsed === 0) {\r\n Image.SourceImgCache.delete(source);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets image source url\r\n */\r\n public set source(value: Nullable<string>) {\r\n if (this._urlRewriter && value) {\r\n value = this._urlRewriter(value);\r\n }\r\n\r\n if (this._source === value) {\r\n return;\r\n }\r\n\r\n this._removeCacheUsage(this._source);\r\n\r\n this._loaded = false;\r\n this._source = value;\r\n this._imageDataCache.data = null;\r\n\r\n if (value) {\r\n value = this._svgCheck(value);\r\n }\r\n\r\n // Should abstract platform instead of using LastCreatedEngine\r\n const engine = this._host?.getScene()?.getEngine() || EngineStore.LastCreatedEngine;\r\n // If no engine, skip all other DOM operations.\r\n if (!engine) {\r\n return;\r\n }\r\n if (value && Image.SourceImgCache.has(value)) {\r\n const cachedData = Image.SourceImgCache.get(value)!;\r\n this._domImage = cachedData.img;\r\n cachedData.timesUsed += 1;\r\n if (cachedData.loaded) {\r\n this._onImageLoaded();\r\n } else {\r\n cachedData.waitingForLoadCallback.push(this._onImageLoaded.bind(this));\r\n }\r\n return;\r\n }\r\n this._domImage = engine.createCanvasImage();\r\n // need to add to enforce rendering\r\n const imgElement = this._domImage as HTMLImageElement;\r\n let addedToDom = false;\r\n if (imgElement.style && this._source?.endsWith(\".svg\")) {\r\n imgElement.style.visibility = \"hidden\";\r\n imgElement.style.position = \"absolute\";\r\n imgElement.style.top = \"0\";\r\n engine.getRenderingCanvas()?.parentNode?.appendChild(imgElement);\r\n addedToDom = true;\r\n }\r\n\r\n if (value) {\r\n Image.SourceImgCache.set(value, { img: this._domImage, timesUsed: 1, loaded: false, waitingForLoadCallback: [this._onImageLoaded.bind(this)] });\r\n }\r\n\r\n this._domImage.onload = () => {\r\n if (value) {\r\n const cachedData = Image.SourceImgCache.get(value);\r\n if (cachedData) {\r\n cachedData.loaded = true;\r\n for (const waitingCallback of cachedData.waitingForLoadCallback) {\r\n waitingCallback();\r\n }\r\n cachedData.waitingForLoadCallback.length = 0;\r\n addedToDom && imgElement.remove();\r\n return;\r\n }\r\n }\r\n this._onImageLoaded();\r\n addedToDom && imgElement.remove();\r\n };\r\n if (value) {\r\n Tools.SetCorsBehavior(value, this._domImage);\r\n Tools.SetReferrerPolicyBehavior(this.referrerPolicy, this._domImage);\r\n this._domImage.src = value;\r\n }\r\n }\r\n\r\n private _sanitizeSVG(svgString: string) {\r\n if (svgString.indexOf(\"<svg\") === -1) {\r\n return svgString; // Not an SVG, return as is\r\n }\r\n\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(svgString, \"image/svg+xml\");\r\n\r\n const dangerousTags = [\"script\", \"iframe\", \"foreignObject\", \"object\", \"embed\", \"link\", \"style\"];\r\n const dangerousAttrs = [/^on/i, /^xlink:href$/, /^href$/];\r\n\r\n // Remove dangerous elements\r\n dangerousTags.forEach((tag) => {\r\n const elements = doc.getElementsByTagName(tag);\r\n for (let i = elements.length - 1; i >= 0; i--) {\r\n elements[i].remove();\r\n }\r\n });\r\n\r\n // Recursively sanitize attributes\r\n function sanitizeElement(el: Element) {\r\n if (el.attributes) {\r\n for (let i = el.attributes.length - 1; i >= 0; i--) {\r\n const attr = el.attributes[i];\r\n const name = attr.name;\r\n const value = attr.value;\r\n\r\n // Remove dangerous attributes\r\n if (dangerousAttrs.some((regex) => regex.test(name))) {\r\n el.removeAttribute(name);\r\n }\r\n\r\n // Remove javascript: links\r\n if (typeof value === \"string\" && value.trim().toLowerCase().startsWith(\"javascript:\")) {\r\n el.removeAttribute(name);\r\n }\r\n }\r\n }\r\n\r\n // Recursively sanitize children\r\n for (let i = 0; i < el.children.length; i++) {\r\n sanitizeElement(el.children[i]);\r\n }\r\n }\r\n\r\n sanitizeElement(doc.documentElement);\r\n\r\n return new XMLSerializer().serializeToString(doc);\r\n }\r\n\r\n /**\r\n * Checks for svg document with icon id present\r\n * @param value the source svg\r\n * @returns the svg\r\n */\r\n private _svgCheck(value: string): string {\r\n // Skip SVG processing if no window/document or SVG support\r\n if (typeof window === \"undefined\" || typeof document === \"undefined\" || !window.SVGSVGElement) {\r\n return value;\r\n }\r\n\r\n if (window.SVGSVGElement && value.search(/(\\.svg|\\.svg?[?|#].*)$/gi) !== -1 && value.indexOf(\"#\") === value.lastIndexOf(\"#\")) {\r\n this._isSVG = true;\r\n value = this._sanitizeSVG(value);\r\n const svgsrc = value.split(\"#\")[0];\r\n const elemid = value.split(\"#\")[1];\r\n // check if object alr exist in document\r\n const svgExist = <HTMLObjectElement>document.body.querySelector('object[data=\"' + svgsrc + '\"]');\r\n if (svgExist) {\r\n const svgDoc = svgExist.contentDocument;\r\n // get viewbox width and height, get svg document width and height in px\r\n if (svgDoc && svgDoc.documentElement) {\r\n const vb = svgDoc.documentElement.getAttribute(\"viewBox\");\r\n const docwidth = Number(svgDoc.documentElement.getAttribute(\"width\"));\r\n const docheight = Number(svgDoc.documentElement.getAttribute(\"height\"));\r\n const elem = <SVGGraphicsElement>(<unknown>svgDoc.getElementById(elemid));\r\n if (elem && vb && docwidth && docheight) {\r\n this._getSVGAttribs(svgExist, elemid);\r\n return value;\r\n }\r\n }\r\n\r\n // wait for object to load\r\n svgExist.addEventListener(\"load\", () => {\r\n this._getSVGAttribs(svgExist, elemid);\r\n });\r\n } else {\r\n // create document object\r\n const svgImage = document.createElement(\"object\");\r\n svgImage.data = svgsrc;\r\n svgImage.type = \"image/svg+xml\";\r\n svgImage.width = \"0%\";\r\n svgImage.height = \"0%\";\r\n document.body.appendChild(svgImage);\r\n // when the object has loaded, get the element attribs\r\n svgImage.onload = () => {\r\n const svgobj = <HTMLObjectElement>document.body.querySelector('object[data=\"' + svgsrc + '\"]');\r\n if (svgobj) {\r\n this._getSVGAttribs(svgobj, elemid);\r\n }\r\n };\r\n }\r\n return svgsrc;\r\n } else {\r\n return value;\r\n }\r\n }\r\n\r\n /**\r\n * Sets sourceLeft, sourceTop, sourceWidth, sourceHeight automatically\r\n * given external svg file and icon id\r\n * @param svgsrc\r\n * @param elemid\r\n */\r\n private _getSVGAttribs(svgsrc: HTMLObjectElement, elemid: string) {\r\n const svgDoc = svgsrc.contentDocument;\r\n // get viewbox width and height, get svg document width and height in px\r\n if (svgDoc && svgDoc.documentElement) {\r\n const vb = svgDoc.documentElement.getAttribute(\"viewBox\");\r\n const docwidth = Number(svgDoc.documentElement.getAttribute(\"width\"));\r\n const docheight = Number(svgDoc.documentElement.getAttribute(\"height\"));\r\n // get element bbox and matrix transform\r\n const elem = svgDoc.getElementById(elemid) as Nullable<SVGGraphicsElement>;\r\n if (vb && docwidth && docheight && elem) {\r\n const vbWidth = Number(vb.split(\" \")[2]);\r\n const vbHeight = Number(vb.split(\" \")[3]);\r\n const elemBbox = elem.getBBox();\r\n let elemMatrixA = 1;\r\n let elemMatrixD = 1;\r\n let elemMatrixE = 0;\r\n let elemMatrixF = 0;\r\n const consolidatedTransform = elem.transform?.baseVal.consolidate();\r\n if (consolidatedTransform) {\r\n const mainMatrix = consolidatedTransform.matrix;\r\n elemMatrixA = mainMatrix.a;\r\n elemMatrixD = mainMatrix.d;\r\n elemMatrixE = mainMatrix.e;\r\n elemMatrixF = mainMatrix.f;\r\n }\r\n\r\n // compute source coordinates and dimensions\r\n this.sourceLeft = ((elemMatrixA * elemBbox.x + elemMatrixE) * docwidth) / vbWidth;\r\n this.sourceTop = ((elemMatrixD * elemBbox.y + elemMatrixF) * docheight) / vbHeight;\r\n this.sourceWidth = elemBbox.width * elemMatrixA * (docwidth / vbWidth);\r\n this.sourceHeight = elemBbox.height * elemMatrixD * (docheight / vbHeight);\r\n this._svgAttributesComputationCompleted = true;\r\n this.onSVGAttributesComputedObservable.notifyObservers(this);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the cell width to use when animation sheet is enabled\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#image\r\n */\r\n @serialize()\r\n get cellWidth(): number {\r\n return this._cellWidth;\r\n }\r\n set cellWidth(value: number) {\r\n if (this._cellWidth === value) {\r\n return;\r\n }\r\n\r\n this._cellWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the cell height to use when animation sheet is enabled\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#image\r\n */\r\n @serialize()\r\n get cellHeight(): number {\r\n return this._cellHeight;\r\n }\r\n set cellHeight(value: number) {\r\n if (this._cellHeight === value) {\r\n return;\r\n }\r\n\r\n this._cellHeight = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the cell id to use (this will turn on the animation sheet mode)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#image\r\n */\r\n @serialize()\r\n get cellId(): number {\r\n return this._cellId;\r\n }\r\n set cellId(value: number) {\r\n if (this._cellId === value) {\r\n return;\r\n }\r\n\r\n this._cellId = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Creates a new Image\r\n * @param name defines the control name\r\n * @param url defines the image url\r\n */\r\n constructor(\r\n public override name?: string,\r\n url: Nullable<string> = null\r\n ) {\r\n super(name);\r\n this.source = url;\r\n }\r\n\r\n /**\r\n * Tests if a given coordinates belong to the current control\r\n * @param x defines x coordinate to test\r\n * @param y defines y coordinate to test\r\n * @returns true if the coordinates are inside the control\r\n */\r\n public override contains(x: number, y: number): boolean {\r\n if (!super.contains(x, y)) {\r\n return false;\r\n }\r\n\r\n if (!this._detectPointerOnOpaqueOnly || !this._workingCanvas) {\r\n return true;\r\n }\r\n\r\n const width = this._currentMeasure.width | 0;\r\n const height = this._currentMeasure.height | 0;\r\n const key = width + \"_\" + height;\r\n\r\n let imageData = this._imageDataCache.data;\r\n\r\n if (!imageData || this._imageDataCache.key !== key) {\r\n const canvas = this._workingCanvas;\r\n const context = canvas.getContext(\"2d\");\r\n\r\n this._imageDataCache.data = imageData = context.getImageData(0, 0, width, height).data;\r\n this._imageDataCache.key = key;\r\n }\r\n\r\n x = (x - this._currentMeasure.left) | 0;\r\n y = (y - this._currentMeasure.top) | 0;\r\n\r\n const pickedPixel = imageData[(x + y * width) * 4 + 3];\r\n\r\n return pickedPixel > 0;\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"Image\";\r\n }\r\n\r\n /** Force the control to synchronize with its content */\r\n public synchronizeSizeWithContent() {\r\n if (!this._loaded) {\r\n return;\r\n }\r\n\r\n this.width = this._domImage.width + \"px\";\r\n this.height = this._domImage.height + \"px\";\r\n }\r\n\r\n protected override _processMeasures(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n if (this._loaded) {\r\n switch (this._stretch) {\r\n case Image.STRETCH_NONE:\r\n break;\r\n case Image.STRETCH_FILL:\r\n break;\r\n case Image.STRETCH_UNIFORM:\r\n break;\r\n case Image.STRETCH_NINE_PATCH:\r\n break;\r\n case Image.STRETCH_EXTEND:\r\n if (this._autoScale) {\r\n this.synchronizeSizeWithContent();\r\n }\r\n if (this.parent && this.parent.parent) {\r\n // Will update root size if root is not the top root\r\n this.parent.adaptWidthToChildren = true;\r\n this.parent.adaptHeightToChildren = true;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n super._processMeasures(parentMeasure, context);\r\n }\r\n\r\n private _prepareWorkingCanvasForOpaqueDetection() {\r\n if (!this._detectPointerOnOpaqueOnly) {\r\n return;\r\n }\r\n\r\n const width = this._currentMeasure.width;\r\n const height = this._currentMeasure.height;\r\n\r\n if (!this._workingCanvas) {\r\n const engine = this._host?.getScene()?.getEngine() || EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n throw new Error(\"Invalid engine. Unable to create a canvas.\");\r\n }\r\n this._workingCanvas = engine.createCanvas(width, height);\r\n }\r\n const canvas = this._workingCanvas;\r\n\r\n const context = canvas.getContext(\"2d\");\r\n\r\n context.clearRect(0, 0, width, height);\r\n }\r\n\r\n private _drawImage(context: ICanvasRenderingContext, sx: number, sy: number, sw: number, sh: number, tx: number, ty: number, tw: number, th: number) {\r\n context.drawImage(this._domImage, sx, sy, sw, sh, tx, ty, tw, th);\r\n\r\n if (!this._detectPointerOnOpaqueOnly) {\r\n return;\r\n }\r\n\r\n const transform = context.getTransform();\r\n\r\n const canvas = this._workingCanvas!;\r\n const workingCanvasContext = canvas.getContext(\"2d\");\r\n workingCanvasContext.save();\r\n const ttx = tx - this._currentMeasure.left;\r\n const tty = ty - this._currentMeasure.top;\r\n workingCanvasContext.setTransform(transform.a, transform.b, transform.c, transform.d, (ttx + tw) / 2, (tty + th) / 2);\r\n workingCanvasContext.translate(-(ttx + tw) / 2, -(tty + th) / 2);\r\n\r\n workingCanvasContext.drawImage(this._domImage, sx, sy, sw, sh, ttx, tty, tw, th);\r\n workingCanvasContext.restore();\r\n }\r\n\r\n public override _draw(context: ICanvasRenderingContext): void {\r\n context.save();\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio;\r\n context.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio;\r\n }\r\n\r\n let x, y, width, height;\r\n if (this.cellId == -1) {\r\n x = this._sourceLeft;\r\n y = this._sourceTop;\r\n\r\n width = this._sourceWidth ? this._sourceWidth : this._imageWidth;\r\n height = this._sourceHeight ? this._sourceHeight : this._imageHeight;\r\n } else {\r\n const rowCount = this._domImage.naturalWidth / this.cellWidth;\r\n const column = (this.cellId / rowCount) >> 0;\r\n const row = this.cellId % rowCount;\r\n\r\n x = this.cellWidth * row;\r\n y = this.cellHeight * column;\r\n width = this.cellWidth;\r\n height = this.cellHeight;\r\n }\r\n\r\n this._prepareWorkingCanvasForOpaqueDetection();\r\n\r\n this._applyStates(context);\r\n if (this._loaded) {\r\n switch (this._stretch) {\r\n case Image.STRETCH_NONE:\r\n this._drawImage(context, x, y, width, height, this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n break;\r\n case Image.STRETCH_FILL:\r\n this._drawImage(context, x, y, width, height, this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n break;\r\n case Image.STRETCH_UNIFORM: {\r\n const hRatio = this._currentMeasure.width / width;\r\n const vRatio = this._currentMeasure.height / height;\r\n const ratio = Math.min(hRatio, vRatio);\r\n const centerX = (this._currentMeasure.width - width * ratio) / 2;\r\n const centerY = (this._currentMeasure.height - height * ratio) / 2;\r\n\r\n this._drawImage(context, x, y, width, height, this._currentMeasure.left + centerX, this._currentMeasure.top + centerY, width * ratio, height * ratio);\r\n break;\r\n }\r\n case Image.STRETCH_EXTEND:\r\n this._drawImage(context, x, y, width, height, this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n break;\r\n case Image.STRETCH_NINE_PATCH:\r\n this._renderNinePatch(context, x, y, width, height);\r\n break;\r\n }\r\n }\r\n\r\n context.restore();\r\n }\r\n\r\n private _renderNinePatch(context: ICanvasRenderingContext, sx: number, sy: number, sw: number, sh: number): void {\r\n const idealRatio = this.host.idealRatio;\r\n const leftWidth = this._sliceLeft;\r\n const topHeight = this._sliceTop;\r\n const bottomHeight = sh - this._sliceBottom;\r\n const rightWidth = sw - this._sliceRight;\r\n const centerWidth = this._sliceRight - this._sliceLeft;\r\n const centerHeight = this._sliceBottom - this._sliceTop;\r\n const leftWidthAdjusted = Math.round(leftWidth * idealRatio);\r\n const topHeightAdjusted = Math.round(topHeight * idealRatio);\r\n const bottomHeightAdjusted = Math.round(bottomHeight * idealRatio);\r\n const rightWidthAdjusted = Math.round(rightWidth * idealRatio);\r\n const targetCenterWidth = Math.round(this._currentMeasure.width) - rightWidthAdjusted - leftWidthAdjusted + 2;\r\n const targetCenterHeight = Math.round(this._currentMeasure.height) - bottomHeightAdjusted - topHeightAdjusted + 2;\r\n const centerLeftOffset = Math.round(this._currentMeasure.left) + leftWidthAdjusted - 1;\r\n const centerTopOffset = Math.round(this._currentMeasure.top) + topHeightAdjusted - 1;\r\n const rightOffset = Math.round(this._currentMeasure.left + this._currentMeasure.width) - rightWidthAdjusted;\r\n const bottomOffset = Math.round(this._currentMeasure.top + this._currentMeasure.height) - bottomHeightAdjusted;\r\n\r\n //Top Left\r\n this._drawImage(context, sx, sy, leftWidth, topHeight, this._currentMeasure.left, this._currentMeasure.top, leftWidthAdjusted, topHeightAdjusted);\r\n //Top\r\n this._drawImage(context, sx + this._sliceLeft, sy, centerWidth, topHeight, centerLeftOffset + 1, this._currentMeasure.top, targetCenterWidth - 2, topHeightAdjusted);\r\n //Top Right\r\n this._drawImage(context, sx + this._sliceRight, sy, rightWidth, topHeight, rightOffset, this._currentMeasure.top, rightWidthAdjusted, topHeightAdjusted);\r\n //Left\r\n this._drawImage(context, sx, sy + this._sliceTop, leftWidth, centerHeight, this._currentMeasure.left, centerTopOffset + 1, leftWidthAdjusted, targetCenterHeight - 2);\r\n // Center\r\n this._drawImage(\r\n context,\r\n sx + this._sliceLeft,\r\n sy + this._sliceTop,\r\n centerWidth,\r\n centerHeight,\r\n centerLeftOffset + 1,\r\n centerTopOffset + 1,\r\n targetCenterWidth - 2,\r\n targetCenterHeight - 2\r\n );\r\n //Right\r\n this._drawImage(\r\n context,\r\n sx + this._sliceRight,\r\n sy + this._sliceTop,\r\n rightWidth,\r\n centerHeight,\r\n rightOffset,\r\n centerTopOffset + 1,\r\n rightWidthAdjusted,\r\n targetCenterHeight - 2\r\n );\r\n //Bottom Left\r\n this._drawImage(context, sx, sy + this._sliceBottom, leftWidth, bottomHeight, this._currentMeasure.left, bottomOffset, leftWidthAdjusted, bottomHeightAdjusted);\r\n //Bottom\r\n this._drawImage(\r\n context,\r\n sx + this.sliceLeft,\r\n sy + this._sliceBottom,\r\n centerWidth,\r\n bottomHeight,\r\n centerLeftOffset + 1,\r\n bottomOffset,\r\n targetCenterWidth - 2,\r\n bottomHeightAdjusted\r\n );\r\n //Bottom Right\r\n this._drawImage(context, sx + this._sliceRight, sy + this._sliceBottom, rightWidth, bottomHeight, rightOffset, bottomOffset, rightWidthAdjusted, bottomHeightAdjusted);\r\n }\r\n\r\n public override dispose() {\r\n super.dispose();\r\n this.onImageLoadedObservable.clear();\r\n this.onSVGAttributesComputedObservable.clear();\r\n this._removeCacheUsage(this._source);\r\n }\r\n\r\n // Static\r\n /** STRETCH_NONE */\r\n public static readonly STRETCH_NONE = 0;\r\n /** STRETCH_FILL */\r\n public static readonly STRETCH_FILL = 1;\r\n /** STRETCH_UNIFORM */\r\n public static readonly STRETCH_UNIFORM = 2;\r\n /** STRETCH_EXTEND */\r\n public static readonly STRETCH_EXTEND = 3;\r\n /** NINE_PATCH */\r\n public static readonly STRETCH_NINE_PATCH = 4;\r\n}\r\nRegisterClass(\"BABYLON.GUI.Image\", Image);\r\n","import { type Nullable } from \"core/types\";\r\nimport { type Vector2 } from \"core/Maths/math.vector\";\r\n\r\nimport { Rectangle } from \"./rectangle\";\r\nimport { Control } from \"./control\";\r\nimport { TextBlock } from \"./textBlock\";\r\nimport { Image } from \"./image\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { type PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { type AdvancedDynamicTexture } from \"../advancedDynamicTexture\";\r\nimport { type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\n\r\n/**\r\n * Class used to create 2D buttons\r\n */\r\nexport class Button extends Rectangle {\r\n /**\r\n * Function called to generate a pointer enter animation\r\n */\r\n public pointerEnterAnimation: () => void;\r\n /**\r\n * Function called to generate a pointer out animation\r\n */\r\n public pointerOutAnimation: () => void;\r\n /**\r\n * Function called to generate a pointer down animation\r\n */\r\n public pointerDownAnimation: () => void;\r\n /**\r\n * Function called to generate a pointer up animation\r\n */\r\n public pointerUpAnimation: () => void;\r\n\r\n private _image: Nullable<Image>;\r\n /**\r\n * Returns the image part of the button (if any)\r\n */\r\n public get image(): Nullable<Image> {\r\n return this._image;\r\n }\r\n\r\n private _textBlock: Nullable<TextBlock>;\r\n /**\r\n * Returns the TextBlock part of the button (if any)\r\n */\r\n public get textBlock(): Nullable<TextBlock> {\r\n return this._textBlock;\r\n }\r\n\r\n /**\r\n * Creates a new Button\r\n * @param name defines the name of the button\r\n */\r\n constructor(public override name?: string) {\r\n super(name);\r\n\r\n this.thickness = 1;\r\n this.isPointerBlocker = true;\r\n\r\n let alphaStore: Nullable<number> = null;\r\n\r\n this.pointerEnterAnimation = () => {\r\n alphaStore = this.alpha;\r\n this.alpha -= 0.1;\r\n };\r\n\r\n this.pointerOutAnimation = () => {\r\n if (alphaStore !== null) {\r\n this.alpha = alphaStore;\r\n }\r\n };\r\n\r\n this.pointerDownAnimation = () => {\r\n this.scaleX -= 0.05;\r\n this.scaleY -= 0.05;\r\n };\r\n\r\n this.pointerUpAnimation = () => {\r\n this.scaleX += 0.05;\r\n this.scaleY += 0.05;\r\n };\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"Button\";\r\n }\r\n\r\n // While being a container, the button behaves like a control.\r\n /**\r\n * @internal\r\n */\r\n public override _processPicking(x: number, y: number, pi: PointerInfoBase, type: number, pointerId: number, buttonIndex: number, deltaX?: number, deltaY?: number): boolean {\r\n if (!this._isEnabled || !this.isHitTestVisible || !this.isVisible || this.notRenderable) {\r\n return false;\r\n }\r\n\r\n if (!super.contains(x, y)) {\r\n return false;\r\n }\r\n\r\n if (this.delegatePickingToChildren) {\r\n let contains = false;\r\n for (let index = this._children.length - 1; index >= 0; index--) {\r\n const child = this._children[index];\r\n if (child.isEnabled && child.isHitTestVisible && child.isVisible && !child.notRenderable && child.contains(x, y)) {\r\n contains = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!contains) {\r\n return false;\r\n }\r\n }\r\n\r\n this._processObservables(type, x, y, pi, pointerId, buttonIndex, deltaX, deltaY);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _onPointerEnter(target: Control, pi: PointerInfoBase): boolean {\r\n if (!super._onPointerEnter(target, pi)) {\r\n return false;\r\n }\r\n\r\n if (!this.isReadOnly && this.pointerEnterAnimation) {\r\n this.pointerEnterAnimation();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _onPointerOut(target: Control, pi: PointerInfoBase, force = false): void {\r\n if (!this.isReadOnly && this.pointerOutAnimation) {\r\n this.pointerOutAnimation();\r\n }\r\n\r\n super._onPointerOut(target, pi, force);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: PointerInfoBase): boolean {\r\n if (!super._onPointerDown(target, coordinates, pointerId, buttonIndex, pi)) {\r\n return false;\r\n }\r\n\r\n if (!this.isReadOnly && this.pointerDownAnimation) {\r\n this.pointerDownAnimation();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n protected override _getRectangleFill(context: ICanvasRenderingContext) {\r\n if (this.isEnabled) {\r\n return this._getBackgroundColor(context);\r\n } else {\r\n return this._disabledColor;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _onPointerUp(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, notifyClick: boolean, pi: PointerInfoBase): void {\r\n if (!this.isReadOnly && this.pointerUpAnimation) {\r\n this.pointerUpAnimation();\r\n }\r\n\r\n super._onPointerUp(target, coordinates, pointerId, buttonIndex, notifyClick, pi);\r\n }\r\n\r\n /**\r\n * Serializes the current button\r\n * @param serializationObject defines the JSON serialized object\r\n * @param force force serialization even if isSerializable === false\r\n * @param allowCanvas defines if the control is allowed to use a Canvas2D object to serialize\r\n */\r\n public override serialize(serializationObject: any, force: boolean, allowCanvas: boolean) {\r\n super.serialize(serializationObject, force, allowCanvas);\r\n if (!this.isSerializable && !force) {\r\n return;\r\n }\r\n\r\n if (this._textBlock) {\r\n serializationObject.textBlockName = this._textBlock.name;\r\n }\r\n if (this._image) {\r\n serializationObject.imageName = this._image.name;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _parseFromContent(serializedObject: any, host: AdvancedDynamicTexture) {\r\n super._parseFromContent(serializedObject, host);\r\n\r\n if (serializedObject.textBlockName) {\r\n this._textBlock = this.getChildByName(serializedObject.textBlockName) as Nullable<TextBlock>;\r\n }\r\n\r\n if (serializedObject.imageName) {\r\n this._image = this.getChildByName(serializedObject.imageName) as Nullable<Image>;\r\n }\r\n }\r\n\r\n // Statics\r\n /**\r\n * Creates a new button made with an image and a text\r\n * @param name defines the name of the button\r\n * @param text defines the text of the button\r\n * @param imageUrl defines the url of the image\r\n * @returns a new Button\r\n */\r\n public static CreateImageButton(name: string, text: string, imageUrl: string): Button {\r\n const result = new this(name);\r\n\r\n // Adding text\r\n const textBlock = new TextBlock(name + \"_button\", text);\r\n textBlock.textWrapping = true;\r\n textBlock.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;\r\n textBlock.paddingLeft = \"20%\";\r\n result.addControl(textBlock);\r\n\r\n // Adding image\r\n const iconImage = new Image(name + \"_icon\", imageUrl);\r\n iconImage.width = \"20%\";\r\n iconImage.stretch = Image.STRETCH_UNIFORM;\r\n iconImage.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n result.addControl(iconImage);\r\n\r\n // Store\r\n result._image = iconImage;\r\n result._textBlock = textBlock;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new button made with an image\r\n * @param name defines the name of the button\r\n * @param imageUrl defines the url of the image\r\n * @returns a new Button\r\n */\r\n public static CreateImageOnlyButton(name: string, imageUrl: string): Button {\r\n const result = new this(name);\r\n\r\n // Adding image\r\n const iconImage = new Image(name + \"_icon\", imageUrl);\r\n iconImage.stretch = Image.STRETCH_FILL;\r\n iconImage.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n result.addControl(iconImage);\r\n\r\n // Store\r\n result._image = iconImage;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new button made with a text\r\n * @param name defines the name of the button\r\n * @param text defines the text of the button\r\n * @returns a new Button\r\n */\r\n public static CreateSimpleButton(name: string, text: string): Button {\r\n const result = new this(name);\r\n\r\n // Adding text\r\n const textBlock = new TextBlock(name + \"_button\", text);\r\n textBlock.textWrapping = true;\r\n textBlock.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;\r\n result.addControl(textBlock);\r\n\r\n // Store\r\n result._textBlock = textBlock;\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Creates a new button made with an image and a centered text\r\n * @param name defines the name of the button\r\n * @param text defines the text of the button\r\n * @param imageUrl defines the url of the image\r\n * @returns a new Button\r\n */\r\n public static CreateImageWithCenterTextButton(name: string, text: string, imageUrl: string): Button {\r\n const result = new this(name);\r\n\r\n // Adding image\r\n const iconImage = new Image(name + \"_icon\", imageUrl);\r\n iconImage.stretch = Image.STRETCH_FILL;\r\n result.addControl(iconImage);\r\n\r\n // Adding text\r\n const textBlock = new TextBlock(name + \"_button\", text);\r\n textBlock.textWrapping = true;\r\n textBlock.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;\r\n result.addControl(textBlock);\r\n\r\n // Store\r\n result._image = iconImage;\r\n result._textBlock = textBlock;\r\n\r\n return result;\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.Button\", Button);\r\n","import { Container } from \"./container\";\r\nimport { type Measure } from \"../measure\";\r\nimport { Control } from \"./control\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { type AdvancedDynamicTexture } from \"../advancedDynamicTexture\";\r\nimport { type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\n/**\r\n * Class used to create a 2D stack panel container\r\n */\r\nexport class StackPanel extends Container {\r\n private _isVertical = true;\r\n private _manualWidth = false;\r\n private _manualHeight = false;\r\n private _doNotTrackManualChanges = false;\r\n private _spacing = 0;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that layout warnings should be ignored\r\n */\r\n @serialize()\r\n public ignoreLayoutWarnings = false;\r\n\r\n /** Gets or sets a boolean indicating if the stack panel is vertical or horizontal*/\r\n @serialize()\r\n public get isVertical(): boolean {\r\n return this._isVertical;\r\n }\r\n\r\n public set isVertical(value: boolean) {\r\n if (this._isVertical === value) {\r\n return;\r\n }\r\n\r\n this._isVertical = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the spacing (in pixels) between each child.\r\n */\r\n @serialize()\r\n public get spacing(): number {\r\n return this._spacing;\r\n }\r\n\r\n public set spacing(value: number) {\r\n if (this._spacing === value) {\r\n return;\r\n }\r\n\r\n this._spacing = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets panel width.\r\n * This value should not be set when in horizontal mode as it will be computed automatically\r\n */\r\n @serialize()\r\n public override set width(value: string | number) {\r\n if (!this._doNotTrackManualChanges) {\r\n this._manualWidth = true;\r\n }\r\n\r\n if (this._width.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._width.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n public override get width(): string | number {\r\n return this._width.toString(this._host);\r\n }\r\n\r\n /**\r\n * Gets or sets panel height.\r\n * This value should not be set when in vertical mode as it will be computed automatically\r\n */\r\n @serialize()\r\n public override set height(value: string | number) {\r\n if (!this._doNotTrackManualChanges) {\r\n this._manualHeight = true;\r\n }\r\n\r\n if (this._height.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._height.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n public override get height(): string | number {\r\n return this._height.toString(this._host);\r\n }\r\n\r\n /**\r\n * Creates a new StackPanel\r\n * @param name defines control name\r\n */\r\n constructor(public override name?: string) {\r\n super(name);\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"StackPanel\";\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected override _preMeasure(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n for (const child of this._children) {\r\n if (this._isVertical) {\r\n child.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\r\n } else {\r\n child.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n }\r\n }\r\n\r\n super._preMeasure(parentMeasure, context);\r\n }\r\n\r\n protected override _additionalProcessing(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n super._additionalProcessing(parentMeasure, context);\r\n\r\n this._measureForChildren.copyFrom(parentMeasure);\r\n\r\n this._measureForChildren.left = this._currentMeasure.left;\r\n this._measureForChildren.top = this._currentMeasure.top;\r\n\r\n if (!this.isVertical || this._manualWidth) {\r\n this._measureForChildren.width = this._currentMeasure.width;\r\n }\r\n\r\n if (this.isVertical || this._manualHeight) {\r\n this._measureForChildren.height = this._currentMeasure.height;\r\n }\r\n }\r\n\r\n protected override _postMeasure(): void {\r\n let stackWidth = 0;\r\n let stackHeight = 0;\r\n const childrenCount = this._children.length;\r\n\r\n // Calculate scaled spacing using idealRatio (same pattern as shadowOffset)\r\n const scaledSpacing = this._spacing * this._host.idealRatio;\r\n\r\n for (let index = 0; index < childrenCount; index++) {\r\n const child = this._children[index];\r\n if (!child.isVisible || child.notRenderable) {\r\n continue;\r\n }\r\n\r\n if (this._isVertical) {\r\n const top = stackHeight + \"px\";\r\n if (child.top !== top) {\r\n child.top = top;\r\n this._rebuildLayout = true;\r\n child._top.ignoreAdaptiveScaling = true;\r\n }\r\n\r\n if (!this.ignoreLayoutWarnings && !child.isDimensionFullyDefined(\"height\")) {\r\n Logger.Warn(`Control (Name:${child.name}, UniqueId:${child.uniqueId}) is using height in percentage mode inside a vertical StackPanel`, 1);\r\n } else {\r\n stackHeight += child._currentMeasure.height + child._paddingTopInPixels + child._paddingBottomInPixels + (index < childrenCount - 1 ? scaledSpacing : 0);\r\n }\r\n } else {\r\n const left = stackWidth + \"px\";\r\n if (child.left !== left) {\r\n child.left = left;\r\n this._rebuildLayout = true;\r\n child._left.ignoreAdaptiveScaling = true;\r\n }\r\n\r\n if (!this.ignoreLayoutWarnings && !child.isDimensionFullyDefined(\"width\")) {\r\n Logger.Warn(`Control (Name:${child.name}, UniqueId:${child.uniqueId}) is using width in percentage mode inside a horizontal StackPanel`, 1);\r\n } else {\r\n stackWidth += child._currentMeasure.width + child._paddingLeftInPixels + child._paddingRightInPixels + (index < childrenCount - 1 ? scaledSpacing : 0);\r\n }\r\n }\r\n }\r\n\r\n stackWidth += this._paddingLeftInPixels + this._paddingRightInPixels;\r\n stackHeight += this._paddingTopInPixels + this._paddingBottomInPixels;\r\n\r\n this._doNotTrackManualChanges = true;\r\n\r\n // Let stack panel width or height default to stackHeight and stackWidth if dimensions are not specified.\r\n // User can now define their own height and width for stack panel.\r\n\r\n let panelWidthChanged = false;\r\n let panelHeightChanged = false;\r\n\r\n if ((!this._manualHeight || this.adaptHeightToChildren) && this._isVertical) {\r\n // do not specify height if strictly defined by user\r\n const previousHeight = this.height;\r\n this.height = stackHeight + \"px\";\r\n panelHeightChanged = previousHeight !== this.height || !this._height.ignoreAdaptiveScaling;\r\n }\r\n if ((!this._manualWidth || this.adaptWidthToChildren) && !this._isVertical) {\r\n // do not specify width if strictly defined by user\r\n const previousWidth = this.width;\r\n this.width = stackWidth + \"px\";\r\n panelWidthChanged = previousWidth !== this.width || !this._width.ignoreAdaptiveScaling;\r\n }\r\n\r\n if (panelHeightChanged) {\r\n this._height.ignoreAdaptiveScaling = true;\r\n }\r\n\r\n if (panelWidthChanged) {\r\n this._width.ignoreAdaptiveScaling = true;\r\n }\r\n\r\n this._doNotTrackManualChanges = false;\r\n\r\n if (panelWidthChanged || panelHeightChanged) {\r\n this._rebuildLayout = true;\r\n }\r\n\r\n super._postMeasure();\r\n }\r\n\r\n private _getManualDim(dim: \"width\" | \"height\") {\r\n if (dim === \"width\") {\r\n return this._manualWidth;\r\n } else {\r\n return this._manualHeight;\r\n }\r\n }\r\n\r\n public override isDimensionFullyDefined(dim: \"width\" | \"height\"): boolean {\r\n if (dim === \"height\" ? this.isVertical : !this.isVertical && !this._getManualDim(dim)) {\r\n for (const child of this._children) {\r\n if (!child.isDimensionFullyDefined(dim)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n return this.getDimension(dim).isPixel || this._getAdaptDimTo(dim);\r\n }\r\n\r\n /**\r\n * Serializes the current control\r\n * @param serializationObject defined the JSON serialized object\r\n * @param force force serialization even if isSerializable === false\r\n * @param allowCanvas defines if the control is allowed to use a Canvas2D object to serialize\r\n */\r\n public override serialize(serializationObject: any, force: boolean, allowCanvas: boolean) {\r\n super.serialize(serializationObject, force, allowCanvas);\r\n if (!this.isSerializable && !force) {\r\n return;\r\n }\r\n serializationObject.manualWidth = this._manualWidth;\r\n serializationObject.manualHeight = this._manualHeight;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _parseFromContent(serializedObject: any, host: AdvancedDynamicTexture) {\r\n this._manualWidth = serializedObject.manualWidth;\r\n this._manualHeight = serializedObject.manualHeight;\r\n\r\n super._parseFromContent(serializedObject, host);\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.StackPanel\", StackPanel);\r\n","import { Observable } from \"core/Misc/observable\";\r\nimport { type Vector2 } from \"core/Maths/math.vector\";\r\n\r\nimport { Control } from \"./control\";\r\nimport { StackPanel } from \"./stackPanel\";\r\nimport { TextBlock } from \"./textBlock\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { type PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\n\r\n/**\r\n * Class used to represent a 2D checkbox\r\n */\r\nexport class Checkbox extends Control {\r\n private _isChecked = false;\r\n private _background = \"black\";\r\n private _checkSizeRatio = 0.8;\r\n private _thickness = 1;\r\n\r\n /** Gets or sets border thickness */\r\n @serialize()\r\n public get thickness(): number {\r\n return this._thickness;\r\n }\r\n\r\n public set thickness(value: number) {\r\n if (this._thickness === value) {\r\n return;\r\n }\r\n\r\n this._thickness = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Observable raised when isChecked property changes\r\n */\r\n public onIsCheckedChangedObservable = new Observable<boolean>();\r\n\r\n /** Gets or sets a value indicating the ratio between overall size and check size */\r\n @serialize()\r\n public get checkSizeRatio(): number {\r\n return this._checkSizeRatio;\r\n }\r\n\r\n public set checkSizeRatio(value: number) {\r\n value = Math.max(Math.min(1, value), 0);\r\n\r\n if (this._checkSizeRatio === value) {\r\n return;\r\n }\r\n\r\n this._checkSizeRatio = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets background color */\r\n @serialize()\r\n public get background(): string {\r\n return this._background;\r\n }\r\n\r\n public set background(value: string) {\r\n if (this._background === value) {\r\n return;\r\n }\r\n\r\n this._background = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the checkbox is checked or not */\r\n @serialize()\r\n public get isChecked(): boolean {\r\n return this._isChecked;\r\n }\r\n\r\n public set isChecked(value: boolean) {\r\n if (this._isChecked === value) {\r\n return;\r\n }\r\n\r\n this._isChecked = value;\r\n this._markAsDirty();\r\n\r\n this.onIsCheckedChangedObservable.notifyObservers(value);\r\n }\r\n\r\n /**\r\n * Creates a new CheckBox\r\n * @param name defines the control name\r\n */\r\n constructor(public override name?: string) {\r\n super(name);\r\n this.isPointerBlocker = true;\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"Checkbox\";\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _draw(context: ICanvasRenderingContext): void {\r\n context.save();\r\n\r\n this._applyStates(context);\r\n const actualWidth = this._currentMeasure.width - this._thickness;\r\n const actualHeight = this._currentMeasure.height - this._thickness;\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio;\r\n context.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio;\r\n }\r\n\r\n context.fillStyle = this._isEnabled ? this._background : this._disabledColor;\r\n context.fillRect(this._currentMeasure.left + this._thickness / 2, this._currentMeasure.top + this._thickness / 2, actualWidth, actualHeight);\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowBlur = 0;\r\n context.shadowOffsetX = 0;\r\n context.shadowOffsetY = 0;\r\n }\r\n\r\n if (this._isChecked) {\r\n // Color is white if not set\r\n context.fillStyle = this._isEnabled ? (this.color ? this.color : \"#ffffff\") : this._disabledColorItem;\r\n const offsetWidth = actualWidth * this._checkSizeRatio;\r\n const offsetHeight = actualHeight * this._checkSizeRatio;\r\n\r\n context.fillRect(\r\n this._currentMeasure.left + this._thickness / 2 + (actualWidth - offsetWidth) / 2,\r\n this._currentMeasure.top + this._thickness / 2 + (actualHeight - offsetHeight) / 2,\r\n offsetWidth,\r\n offsetHeight\r\n );\r\n }\r\n\r\n context.strokeStyle = this.color;\r\n context.lineWidth = this._thickness;\r\n\r\n context.strokeRect(this._currentMeasure.left + this._thickness / 2, this._currentMeasure.top + this._thickness / 2, actualWidth, actualHeight);\r\n\r\n context.restore();\r\n }\r\n\r\n // Events\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: PointerInfoBase): boolean {\r\n if (!super._onPointerDown(target, coordinates, pointerId, buttonIndex, pi)) {\r\n return false;\r\n }\r\n\r\n if (!this.isReadOnly) {\r\n this.isChecked = !this.isChecked;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Utility function to easily create a checkbox with a header\r\n * @param title defines the label to use for the header\r\n * @param onValueChanged defines the callback to call when value changes\r\n * @returns a StackPanel containing the checkbox and a textBlock\r\n */\r\n public static AddCheckBoxWithHeader(title: string, onValueChanged: (value: boolean) => void): StackPanel {\r\n const panel = new StackPanel();\r\n panel.isVertical = false;\r\n panel.height = \"30px\";\r\n\r\n const checkbox = new Checkbox();\r\n checkbox.width = \"20px\";\r\n checkbox.height = \"20px\";\r\n checkbox.isChecked = true;\r\n checkbox.color = \"green\";\r\n checkbox.onIsCheckedChangedObservable.add(onValueChanged);\r\n panel.addControl(checkbox);\r\n\r\n const header = new TextBlock();\r\n header.text = title;\r\n header.width = \"180px\";\r\n header.paddingLeft = \"5px\";\r\n header.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n header.color = \"white\";\r\n panel.addControl(header);\r\n\r\n return panel;\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.Checkbox\", Checkbox);\r\n","/** @internal */\r\nexport class TextWrapper {\r\n private _text: string;\r\n private _characters: string[] | undefined;\r\n\r\n public get text(): string {\r\n return this._characters ? this._characters.join(\"\") : this._text;\r\n }\r\n\r\n public set text(txt: string) {\r\n this._text = txt;\r\n this._characters = Array.from && Array.from(txt);\r\n }\r\n\r\n public get length(): number {\r\n return this._characters ? this._characters.length : this._text.length;\r\n }\r\n\r\n public removePart(idxStart: number, idxEnd: number, insertTxt?: string): void {\r\n this._text = this._text.slice(0, idxStart) + (insertTxt ? insertTxt : \"\") + this._text.slice(idxEnd);\r\n if (this._characters) {\r\n const newCharacters = insertTxt ? Array.from(insertTxt) : [];\r\n this._characters.splice(idxStart, idxEnd - idxStart, ...newCharacters);\r\n }\r\n }\r\n\r\n public charAt(idx: number): string {\r\n return this._characters ? this._characters[idx] : this._text.charAt(idx);\r\n }\r\n\r\n public substr(from: number, length?: number): string {\r\n if (this._characters) {\r\n if (isNaN(from)) {\r\n from = 0;\r\n } else if (from >= 0) {\r\n from = Math.min(from, this._characters.length);\r\n } else {\r\n from = this._characters.length + Math.max(from, -this._characters.length);\r\n }\r\n if (length === undefined) {\r\n length = this._characters.length - from;\r\n } else if (isNaN(length)) {\r\n length = 0;\r\n } else if (length < 0) {\r\n length = 0;\r\n }\r\n const temp = [];\r\n while (--length >= 0) {\r\n temp[length] = this._characters[from + length];\r\n }\r\n return temp.join(\"\");\r\n }\r\n\r\n return this._text.substring(from, length ? length + from : undefined);\r\n }\r\n\r\n public substring(from: number, to?: number): string {\r\n if (this._characters) {\r\n if (isNaN(from)) {\r\n from = 0;\r\n } else if (from > this._characters.length) {\r\n from = this._characters.length;\r\n } else if (from < 0) {\r\n from = 0;\r\n }\r\n if (to === undefined) {\r\n to = this._characters.length;\r\n } else if (isNaN(to)) {\r\n to = 0;\r\n } else if (to > this._characters.length) {\r\n to = this._characters.length;\r\n } else if (to < 0) {\r\n to = 0;\r\n }\r\n const temp = [];\r\n let idx = 0;\r\n while (from < to) {\r\n temp[idx++] = this._characters[from++];\r\n }\r\n return temp.join(\"\");\r\n }\r\n\r\n return this._text.substring(from, to);\r\n }\r\n\r\n public isWord(index: number): boolean {\r\n const rWord = /\\w/g;\r\n return this._characters ? this._characters[index].search(rWord) !== -1 : this._text.search(rWord) !== -1;\r\n }\r\n}\r\n","import { type Nullable } from \"core/types\";\r\nimport { type Observer, Observable } from \"core/Misc/observable\";\r\nimport { type Vector2 } from \"core/Maths/math.vector\";\r\nimport { type ClipboardInfo, ClipboardEventTypes } from \"core/Events/clipboardEvents\";\r\nimport { type PointerInfo, type PointerInfoBase, PointerEventTypes } from \"core/Events/pointerEvents\";\r\n\r\nimport { Control } from \"./control\";\r\nimport { ValueAndUnit } from \"../valueAndUnit\";\r\nimport { type VirtualKeyboard } from \"./virtualKeyboard\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { TextWrapper } from \"./textWrapper\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { type IKeyboardEvent, type IPointerEvent } from \"core/Events/deviceInputEvents\";\r\nimport { type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\n\r\n/**\r\n * Class used to create input text control\r\n */\r\nexport class InputText extends Control {\r\n protected _textWrapper: TextWrapper;\r\n protected _placeholderText = \"\";\r\n protected _background = \"#222222\";\r\n protected _focusedBackground = \"#000000\";\r\n protected _placeholderColor = \"gray\";\r\n protected _thickness = 1;\r\n protected _margin = new ValueAndUnit(10, ValueAndUnit.UNITMODE_PIXEL);\r\n protected _autoStretchWidth = true;\r\n protected _maxWidth = new ValueAndUnit(1, ValueAndUnit.UNITMODE_PERCENTAGE, false);\r\n /** the type of device that most recently focused the input: \"mouse\", \"touch\" or \"pen\" */\r\n protected _focusedBy: string;\r\n protected _blinkTimeout: number;\r\n protected _blinkIsEven = false;\r\n private _cursorOffset = 0;\r\n protected _scrollLeft: Nullable<number>;\r\n protected _textWidth: number;\r\n protected _clickedCoordinate: Nullable<number>;\r\n protected _deadKey = false;\r\n protected _addKey = true;\r\n protected _currentKey = \"\";\r\n protected _isTextHighlightOn = false;\r\n protected _textHighlightColor = \"#d5e0ff\";\r\n protected _highlighterOpacity = 0.4;\r\n protected _highlightedText = \"\";\r\n private _startHighlightIndex = 0;\r\n private _endHighlightIndex = 0;\r\n private _cursorIndex = -1;\r\n private _outlineWidth: number = 0;\r\n private _outlineColor: string = \"white\";\r\n protected _onFocusSelectAll = false;\r\n protected _isPointerDown = false;\r\n protected _onClipboardObserver: Nullable<Observer<ClipboardInfo>>;\r\n protected _onPointerDblTapObserver: Nullable<Observer<PointerInfo>>;\r\n\r\n /** @internal */\r\n public _connectedVirtualKeyboard: Nullable<VirtualKeyboard>;\r\n\r\n /** Gets or sets a string representing the message displayed on mobile when the control gets the focus */\r\n @serialize()\r\n public promptMessage = \"Please enter text:\";\r\n /** Force disable prompt on mobile device */\r\n @serialize()\r\n public disableMobilePrompt = false;\r\n\r\n /**\r\n * Gets or sets outlineWidth of the text to display\r\n */\r\n public get outlineWidth(): number {\r\n return this._outlineWidth;\r\n }\r\n\r\n public set outlineWidth(value: number) {\r\n if (this._outlineWidth === value) {\r\n return;\r\n }\r\n this._outlineWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets outlineColor of the text to display\r\n */\r\n public get outlineColor(): string {\r\n return this._outlineColor;\r\n }\r\n\r\n public set outlineColor(value: string) {\r\n if (this._outlineColor === value) {\r\n return;\r\n }\r\n this._outlineColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Observable raised when the text changes */\r\n public onTextChangedObservable = new Observable<InputText>();\r\n /** Observable raised just before an entered character is to be added */\r\n public onBeforeKeyAddObservable = new Observable<InputText>();\r\n /** Observable raised when the text is highlighted */\r\n public onTextHighlightObservable = new Observable<InputText>();\r\n /** Observable raised when copy event is triggered */\r\n public onTextCopyObservable = new Observable<InputText>();\r\n /** Observable raised when cut event is triggered */\r\n public onTextCutObservable = new Observable<InputText>();\r\n /** Observable raised when paste event is triggered */\r\n public onTextPasteObservable = new Observable<InputText>();\r\n\r\n /** Gets or sets the maximum width allowed by the control */\r\n @serialize()\r\n public get maxWidth(): string | number {\r\n return this._maxWidth.toString(this._host);\r\n }\r\n\r\n /** Gets the maximum width allowed by the control in pixels */\r\n public get maxWidthInPixels(): number {\r\n return this._maxWidth.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set maxWidth(value: string | number) {\r\n if (this._maxWidth.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._maxWidth.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the text highlighter transparency; default: 0.4\r\n * @deprecated Please use highlighterOpacity instead\r\n */\r\n @serialize()\r\n public get highligherOpacity(): number {\r\n return this.highlighterOpacity;\r\n }\r\n\r\n public set highligherOpacity(value: number) {\r\n this.highlighterOpacity = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the text highlighter transparency; default: 0.4\r\n */\r\n @serialize()\r\n public get highlighterOpacity(): number {\r\n return this._highlighterOpacity;\r\n }\r\n\r\n public set highlighterOpacity(value: number) {\r\n if (this._highlighterOpacity === value) {\r\n return;\r\n }\r\n this._highlighterOpacity = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets a boolean indicating whether to select complete text by default on input focus */\r\n @serialize()\r\n public get onFocusSelectAll(): boolean {\r\n return this._onFocusSelectAll;\r\n }\r\n\r\n public set onFocusSelectAll(value: boolean) {\r\n if (this._onFocusSelectAll === value) {\r\n return;\r\n }\r\n\r\n this._onFocusSelectAll = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the text hightlight color */\r\n @serialize()\r\n public get textHighlightColor(): string {\r\n return this._textHighlightColor;\r\n }\r\n\r\n public set textHighlightColor(value: string) {\r\n if (this._textHighlightColor === value) {\r\n return;\r\n }\r\n this._textHighlightColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets control margin */\r\n @serialize()\r\n public get margin(): string {\r\n return this._margin.toString(this._host);\r\n }\r\n\r\n /** Gets control margin in pixels */\r\n public get marginInPixels(): number {\r\n return this._margin.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set margin(value: string) {\r\n if (this._margin.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._margin.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the control can auto stretch its width to adapt to the text */\r\n @serialize()\r\n public get autoStretchWidth(): boolean {\r\n return this._autoStretchWidth;\r\n }\r\n\r\n public set autoStretchWidth(value: boolean) {\r\n if (this._autoStretchWidth === value) {\r\n return;\r\n }\r\n\r\n this._autoStretchWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets border thickness */\r\n @serialize()\r\n public get thickness(): number {\r\n return this._thickness;\r\n }\r\n\r\n public set thickness(value: number) {\r\n if (this._thickness === value) {\r\n return;\r\n }\r\n\r\n this._thickness = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the background color when focused */\r\n @serialize()\r\n public get focusedBackground(): string {\r\n return this._focusedBackground;\r\n }\r\n\r\n public set focusedBackground(value: string) {\r\n if (this._focusedBackground === value) {\r\n return;\r\n }\r\n\r\n this._focusedBackground = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the background color when focused */\r\n public override set focusedColor(value: string) {\r\n if (this._focusedColor === value) {\r\n return;\r\n }\r\n\r\n this._focusedColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the background color */\r\n @serialize()\r\n public get background(): string {\r\n return this._background;\r\n }\r\n\r\n public set background(value: string) {\r\n if (this._background === value) {\r\n return;\r\n }\r\n\r\n this._background = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the placeholder color */\r\n @serialize()\r\n public get placeholderColor(): string {\r\n return this._placeholderColor;\r\n }\r\n\r\n public set placeholderColor(value: string) {\r\n if (this._placeholderColor === value) {\r\n return;\r\n }\r\n\r\n this._placeholderColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the text displayed when the control is empty */\r\n @serialize()\r\n public get placeholderText(): string {\r\n return this._placeholderText;\r\n }\r\n\r\n public set placeholderText(value: string) {\r\n if (this._placeholderText === value) {\r\n return;\r\n }\r\n this._placeholderText = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the dead key. 0 to disable. */\r\n @serialize()\r\n public get deadKey(): boolean {\r\n return this._deadKey;\r\n }\r\n\r\n public set deadKey(flag: boolean) {\r\n this._deadKey = flag;\r\n }\r\n\r\n /** Gets or sets the highlight text */\r\n public get highlightedText(): string {\r\n return this._highlightedText;\r\n }\r\n public set highlightedText(text: string) {\r\n if (this._highlightedText === text) {\r\n return;\r\n }\r\n this._highlightedText = text;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets if the current key should be added */\r\n public get addKey(): boolean {\r\n return this._addKey;\r\n }\r\n\r\n public set addKey(flag: boolean) {\r\n this._addKey = flag;\r\n }\r\n\r\n /** Gets or sets the value of the current key being entered */\r\n public get currentKey(): string {\r\n return this._currentKey;\r\n }\r\n\r\n public set currentKey(key: string) {\r\n this._currentKey = key;\r\n }\r\n\r\n /** Gets or sets the text displayed in the control */\r\n @serialize()\r\n public get text(): string {\r\n return this._textWrapper.text;\r\n }\r\n\r\n public set text(value: string) {\r\n const valueAsString = value.toString(); // Forcing convertion\r\n\r\n if (!this._textWrapper) {\r\n this._textWrapper = new TextWrapper();\r\n }\r\n\r\n if (this._textWrapper.text === valueAsString) {\r\n return;\r\n }\r\n this._textWrapper.text = valueAsString;\r\n this._textHasChanged();\r\n }\r\n\r\n protected _textHasChanged(): void {\r\n this._markAsDirty();\r\n this.onTextChangedObservable.notifyObservers(this);\r\n }\r\n\r\n protected override _applyStates(context: ICanvasRenderingContext): void {\r\n super._applyStates(context);\r\n if (this.outlineWidth) {\r\n context.lineWidth = this.outlineWidth;\r\n context.strokeStyle = this.outlineColor;\r\n }\r\n }\r\n\r\n /** Gets or sets control width */\r\n @serialize()\r\n public override get width(): string | number {\r\n return this._width.toString(this._host);\r\n }\r\n\r\n public override set width(value: string | number) {\r\n if (this._width.toString(this._host) === value && !this._autoStretchWidth) {\r\n return;\r\n }\r\n\r\n if (this._width.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n\r\n this.autoStretchWidth = false;\r\n }\r\n\r\n /**\r\n * Creates a new InputText\r\n * @param name defines the control name\r\n * @param text defines the text of the control\r\n */\r\n constructor(\r\n public override name?: string,\r\n text: string = \"\"\r\n ) {\r\n super(name);\r\n\r\n this.text = text;\r\n this.isPointerBlocker = true;\r\n this._focusedColor = \"white\";\r\n }\r\n\r\n /** @internal */\r\n public override onBlur(): void {\r\n this._isFocused = false;\r\n this._scrollLeft = null;\r\n this._cursorOffset = 0;\r\n clearTimeout(this._blinkTimeout);\r\n this._markAsDirty();\r\n\r\n this.onBlurObservable.notifyObservers(this);\r\n\r\n this._host.unRegisterClipboardEvents();\r\n if (this._onClipboardObserver) {\r\n this._host.onClipboardObservable.remove(this._onClipboardObserver);\r\n }\r\n const scene = this._host.getScene();\r\n if (this._onPointerDblTapObserver && scene) {\r\n scene.onPointerObservable.remove(this._onPointerDblTapObserver);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public override onFocus(): void {\r\n if (!this._isEnabled) {\r\n return;\r\n }\r\n this._scrollLeft = null;\r\n this._isFocused = true;\r\n this._blinkIsEven = false;\r\n this._cursorOffset = 0;\r\n this._markAsDirty();\r\n\r\n this.onFocusObservable.notifyObservers(this as Control);\r\n\r\n if (this._focusedBy === \"touch\" && !this.disableMobilePrompt) {\r\n const value = prompt(this.promptMessage);\r\n\r\n if (value !== null) {\r\n this.text = value;\r\n }\r\n this._host.focusedControl = null;\r\n return;\r\n }\r\n\r\n this._host.registerClipboardEvents();\r\n\r\n this._onClipboardObserver = this._host.onClipboardObservable.add((clipboardInfo) => {\r\n // process clipboard event, can be configured.\r\n switch (clipboardInfo.type) {\r\n case ClipboardEventTypes.COPY:\r\n this._onCopyText(clipboardInfo.event);\r\n this.onTextCopyObservable.notifyObservers(this);\r\n break;\r\n case ClipboardEventTypes.CUT:\r\n this._onCutText(clipboardInfo.event);\r\n this.onTextCutObservable.notifyObservers(this);\r\n break;\r\n case ClipboardEventTypes.PASTE:\r\n this._onPasteText(clipboardInfo.event);\r\n this.onTextPasteObservable.notifyObservers(this);\r\n break;\r\n default:\r\n return;\r\n }\r\n });\r\n\r\n const scene = this._host.getScene();\r\n if (scene) {\r\n //register the pointer double tap event\r\n this._onPointerDblTapObserver = scene.onPointerObservable.add((pointerInfo) => {\r\n if (!this._isFocused) {\r\n return;\r\n }\r\n if (pointerInfo.type === PointerEventTypes.POINTERDOUBLETAP) {\r\n this._processDblClick(pointerInfo);\r\n }\r\n });\r\n }\r\n\r\n if (this._onFocusSelectAll) {\r\n this.selectAllText();\r\n }\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"InputText\";\r\n }\r\n\r\n /**\r\n * Function called to get the list of controls that should not steal the focus from this control\r\n * @returns an array of controls\r\n */\r\n public override keepsFocusWith(): Nullable<Control[]> {\r\n if (!this._connectedVirtualKeyboard) {\r\n return null;\r\n }\r\n return [this._connectedVirtualKeyboard];\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public processKey(keyCode: number, key?: string, evt?: IKeyboardEvent) {\r\n if (this.isReadOnly) {\r\n return;\r\n }\r\n\r\n //return if clipboard event keys (i.e -ctr/cmd + c,v,x)\r\n if (evt && (evt.ctrlKey || evt.metaKey) && (keyCode === 67 || keyCode === 86 || keyCode === 88)) {\r\n return;\r\n }\r\n\r\n //select all\r\n if (evt && (evt.ctrlKey || evt.metaKey) && keyCode === 65) {\r\n this.selectAllText();\r\n evt.preventDefault();\r\n return;\r\n }\r\n // Specific cases\r\n switch (keyCode) {\r\n case 32: //SPACE\r\n key = \" \"; //ie11 key for space is \"Spacebar\"\r\n break;\r\n case 191: //SLASH\r\n if (evt) {\r\n evt.preventDefault();\r\n }\r\n break;\r\n case 8: // BACKSPACE\r\n if (this._textWrapper.text && this._textWrapper.length > 0) {\r\n //delete the highlighted text\r\n if (this.isTextHighlightOn) {\r\n this._textWrapper.removePart(this._startHighlightIndex, this._endHighlightIndex);\r\n this._textHasChanged();\r\n this.isTextHighlightOn = false;\r\n this._cursorOffset = this._textWrapper.length - this._startHighlightIndex;\r\n this._blinkIsEven = false;\r\n if (evt) {\r\n evt.preventDefault();\r\n }\r\n return;\r\n }\r\n //delete single character\r\n if (this._cursorOffset === 0) {\r\n this.text = this._textWrapper.substring(0, this._textWrapper.length - 1);\r\n } else {\r\n const deletePosition = this._textWrapper.length - this._cursorOffset;\r\n if (deletePosition > 0) {\r\n this._textWrapper.removePart(deletePosition - 1, deletePosition);\r\n this._textHasChanged();\r\n }\r\n }\r\n }\r\n if (evt) {\r\n evt.preventDefault();\r\n }\r\n return;\r\n case 46: // DELETE\r\n if (this.isTextHighlightOn) {\r\n this._textWrapper.removePart(this._startHighlightIndex, this._endHighlightIndex);\r\n this._textHasChanged();\r\n this.isTextHighlightOn = false;\r\n this._cursorOffset = this._textWrapper.length - this._startHighlightIndex;\r\n if (evt) {\r\n evt.preventDefault();\r\n }\r\n return;\r\n }\r\n if (this._textWrapper.text && this._textWrapper.length > 0 && this._cursorOffset > 0) {\r\n const deletePosition = this._textWrapper.length - this._cursorOffset;\r\n this._textWrapper.removePart(deletePosition, deletePosition + 1);\r\n this._textHasChanged();\r\n this._cursorOffset--;\r\n }\r\n if (evt) {\r\n evt.preventDefault();\r\n }\r\n return;\r\n case 13: // RETURN\r\n this._host.focusedControl = null;\r\n this.isTextHighlightOn = false;\r\n return;\r\n case 35: // END\r\n this._cursorOffset = 0;\r\n this._blinkIsEven = false;\r\n this.isTextHighlightOn = false;\r\n this._markAsDirty();\r\n return;\r\n case 36: // HOME\r\n this._cursorOffset = this._textWrapper.length;\r\n this._blinkIsEven = false;\r\n this.isTextHighlightOn = false;\r\n this._markAsDirty();\r\n return;\r\n case 37: // LEFT\r\n this._cursorOffset++;\r\n if (this._cursorOffset > this._textWrapper.length) {\r\n this._cursorOffset = this._textWrapper.length;\r\n }\r\n\r\n if (evt && evt.shiftKey) {\r\n // update the cursor\r\n this._blinkIsEven = false;\r\n // shift + ctrl/cmd + <-\r\n if (evt.ctrlKey || evt.metaKey) {\r\n if (!this.isTextHighlightOn) {\r\n if (this._textWrapper.length === this._cursorOffset) {\r\n return;\r\n } else {\r\n this._endHighlightIndex = this._textWrapper.length - this._cursorOffset + 1;\r\n }\r\n }\r\n this._startHighlightIndex = 0;\r\n this._cursorIndex = this._textWrapper.length - this._endHighlightIndex;\r\n this._cursorOffset = this._textWrapper.length;\r\n this.isTextHighlightOn = true;\r\n this._markAsDirty();\r\n return;\r\n }\r\n //store the starting point\r\n if (!this.isTextHighlightOn) {\r\n this.isTextHighlightOn = true;\r\n this._cursorIndex = this._cursorOffset >= this._textWrapper.length ? this._textWrapper.length : this._cursorOffset - 1;\r\n }\r\n //if text is already highlighted\r\n else if (this._cursorIndex === -1) {\r\n this._cursorIndex = this._textWrapper.length - this._endHighlightIndex;\r\n this._cursorOffset = this._startHighlightIndex === 0 ? this._textWrapper.length : this._textWrapper.length - this._startHighlightIndex + 1;\r\n }\r\n //set the highlight indexes\r\n if (this._cursorIndex < this._cursorOffset) {\r\n this._endHighlightIndex = this._textWrapper.length - this._cursorIndex;\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorOffset;\r\n } else if (this._cursorIndex > this._cursorOffset) {\r\n this._endHighlightIndex = this._textWrapper.length - this._cursorOffset;\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorIndex;\r\n } else {\r\n this.isTextHighlightOn = false;\r\n }\r\n this._markAsDirty();\r\n return;\r\n }\r\n if (this.isTextHighlightOn) {\r\n this._cursorOffset = this._textWrapper.length - this._startHighlightIndex;\r\n this.isTextHighlightOn = false;\r\n }\r\n if (evt && (evt.ctrlKey || evt.metaKey)) {\r\n this._cursorOffset = this._textWrapper.length;\r\n evt.preventDefault();\r\n }\r\n this._blinkIsEven = false;\r\n this.isTextHighlightOn = false;\r\n this._cursorIndex = -1;\r\n this._markAsDirty();\r\n return;\r\n case 39: // RIGHT\r\n this._cursorOffset--;\r\n if (this._cursorOffset < 0) {\r\n this._cursorOffset = 0;\r\n }\r\n if (evt && evt.shiftKey) {\r\n //update the cursor\r\n this._blinkIsEven = false;\r\n //shift + ctrl/cmd + ->\r\n if (evt.ctrlKey || evt.metaKey) {\r\n if (!this.isTextHighlightOn) {\r\n if (this._cursorOffset === 0) {\r\n return;\r\n } else {\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorOffset - 1;\r\n }\r\n }\r\n this._endHighlightIndex = this._textWrapper.length;\r\n this.isTextHighlightOn = true;\r\n this._cursorIndex = this._textWrapper.length - this._startHighlightIndex;\r\n this._cursorOffset = 0;\r\n this._markAsDirty();\r\n return;\r\n }\r\n\r\n if (!this.isTextHighlightOn) {\r\n this.isTextHighlightOn = true;\r\n this._cursorIndex = this._cursorOffset <= 0 ? 0 : this._cursorOffset + 1;\r\n }\r\n //if text is already highlighted\r\n else if (this._cursorIndex === -1) {\r\n this._cursorIndex = this._textWrapper.length - this._startHighlightIndex;\r\n this._cursorOffset = this._textWrapper.length === this._endHighlightIndex ? 0 : this._textWrapper.length - this._endHighlightIndex - 1;\r\n }\r\n //set the highlight indexes\r\n if (this._cursorIndex < this._cursorOffset) {\r\n this._endHighlightIndex = this._textWrapper.length - this._cursorIndex;\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorOffset;\r\n } else if (this._cursorIndex > this._cursorOffset) {\r\n this._endHighlightIndex = this._textWrapper.length - this._cursorOffset;\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorIndex;\r\n } else {\r\n this.isTextHighlightOn = false;\r\n }\r\n this._markAsDirty();\r\n return;\r\n }\r\n if (this.isTextHighlightOn) {\r\n this._cursorOffset = this._textWrapper.length - this._endHighlightIndex;\r\n this.isTextHighlightOn = false;\r\n }\r\n //ctr + ->\r\n if (evt && (evt.ctrlKey || evt.metaKey)) {\r\n this._cursorOffset = 0;\r\n evt.preventDefault();\r\n }\r\n this._blinkIsEven = false;\r\n this.isTextHighlightOn = false;\r\n this._cursorIndex = -1;\r\n this._markAsDirty();\r\n return;\r\n }\r\n if (keyCode === 32) {\r\n key = evt?.key ?? \" \";\r\n }\r\n this._deadKey = key === \"Dead\";\r\n // Printable characters\r\n if (\r\n key &&\r\n (keyCode === -1 || // Direct access\r\n keyCode === 32 || // Space\r\n keyCode === 34 || // \" add support for single and double quotes\r\n keyCode === 39 || // '\r\n (keyCode > 47 && keyCode < 64) || // Numbers\r\n (keyCode > 64 && keyCode < 91) || // Letters\r\n (keyCode > 159 && keyCode < 193) || // Special characters\r\n (keyCode > 218 && keyCode < 223) || // Special characters\r\n (keyCode > 95 && keyCode < 112))\r\n ) {\r\n // Numpad\r\n this._currentKey = key;\r\n this.onBeforeKeyAddObservable.notifyObservers(this);\r\n key = this._currentKey;\r\n if (this._addKey && !this._deadKey) {\r\n if (this.isTextHighlightOn) {\r\n this._textWrapper.removePart(this._startHighlightIndex, this._endHighlightIndex, key);\r\n this._textHasChanged();\r\n this._cursorOffset = this._textWrapper.length - (this._startHighlightIndex + 1);\r\n this.isTextHighlightOn = false;\r\n this._blinkIsEven = false;\r\n this._markAsDirty();\r\n } else if (this._cursorOffset === 0) {\r\n this.text += this._deadKey && evt?.key ? evt.key : key;\r\n } else {\r\n const insertPosition = this._textWrapper.length - this._cursorOffset;\r\n this._textWrapper.removePart(insertPosition, insertPosition, key);\r\n this._textHasChanged();\r\n }\r\n if (evt) {\r\n evt.preventDefault();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _updateValueFromCursorIndex(offset: number) {\r\n //update the cursor\r\n this._blinkIsEven = false;\r\n\r\n if (this._cursorIndex === -1) {\r\n this._cursorIndex = offset;\r\n } else {\r\n if (this._cursorIndex < this._cursorOffset) {\r\n this._endHighlightIndex = this._textWrapper.length - this._cursorIndex;\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorOffset;\r\n } else if (this._cursorIndex > this._cursorOffset) {\r\n this._endHighlightIndex = this._textWrapper.length - this._cursorOffset;\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorIndex;\r\n } else {\r\n this.isTextHighlightOn = false;\r\n this._markAsDirty();\r\n return;\r\n }\r\n }\r\n this.isTextHighlightOn = true;\r\n this._markAsDirty();\r\n }\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _processDblClick(evt: PointerInfo) {\r\n //pre-find the start and end index of the word under cursor, speeds up the rendering\r\n this._startHighlightIndex = this._textWrapper.length - this._cursorOffset;\r\n this._endHighlightIndex = this._startHighlightIndex;\r\n let moveLeft, moveRight;\r\n do {\r\n moveRight = this._endHighlightIndex < this._textWrapper.length && this._textWrapper.isWord(this._endHighlightIndex) ? ++this._endHighlightIndex : 0;\r\n moveLeft = this._startHighlightIndex > 0 && this._textWrapper.isWord(this._startHighlightIndex - 1) ? --this._startHighlightIndex : 0;\r\n } while (moveLeft || moveRight);\r\n\r\n this._cursorOffset = this._textWrapper.length - this._startHighlightIndex;\r\n\r\n this.isTextHighlightOn = true;\r\n this._clickedCoordinate = null;\r\n this._blinkIsEven = true;\r\n this._cursorIndex = -1;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Allow the user to select all text\r\n */\r\n public selectAllText() {\r\n this._blinkIsEven = true;\r\n this.isTextHighlightOn = true;\r\n\r\n this._startHighlightIndex = 0;\r\n this._endHighlightIndex = this._textWrapper.length;\r\n this._cursorOffset = this._textWrapper.length;\r\n this._cursorIndex = -1;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Handles the keyboard event\r\n * @param evt Defines the KeyboardEvent\r\n */\r\n public override processKeyboard(evt: IKeyboardEvent): void {\r\n // process pressed key\r\n this.processKey(evt.keyCode, evt.key, evt);\r\n\r\n super.processKeyboard(evt);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _onCopyText(ev: ClipboardEvent): void {\r\n this.isTextHighlightOn = false;\r\n //when write permission to clipbaord data is denied\r\n try {\r\n ev.clipboardData && ev.clipboardData.setData(\"text/plain\", this._highlightedText);\r\n } catch {} //pass\r\n this._host.clipboardData = this._highlightedText;\r\n }\r\n /**\r\n * @internal\r\n */\r\n protected _onCutText(ev: ClipboardEvent): void {\r\n if (!this._highlightedText) {\r\n return;\r\n }\r\n this._textWrapper.removePart(this._startHighlightIndex, this._endHighlightIndex);\r\n this._textHasChanged();\r\n this.isTextHighlightOn = false;\r\n this._cursorOffset = this._textWrapper.length - this._startHighlightIndex;\r\n //when write permission to clipbaord data is denied\r\n try {\r\n ev.clipboardData && ev.clipboardData.setData(\"text/plain\", this._highlightedText);\r\n } catch {} //pass\r\n\r\n this._host.clipboardData = this._highlightedText;\r\n this._highlightedText = \"\";\r\n }\r\n /**\r\n * @internal\r\n */\r\n protected _onPasteText(ev: ClipboardEvent): void {\r\n let data: string;\r\n if (ev.clipboardData && ev.clipboardData.types.indexOf(\"text/plain\") !== -1) {\r\n data = ev.clipboardData.getData(\"text/plain\");\r\n } else {\r\n //get the cached data; returns blank string by default\r\n data = this._host.clipboardData;\r\n }\r\n const insertPosition = this._textWrapper.length - this._cursorOffset;\r\n this._textWrapper.removePart(insertPosition, insertPosition, data);\r\n this._textHasChanged();\r\n }\r\n\r\n public override _draw(context: ICanvasRenderingContext): void {\r\n context.save();\r\n\r\n this._applyStates(context);\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio;\r\n context.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio;\r\n }\r\n\r\n // Background\r\n if (this._isFocused) {\r\n if (this._focusedBackground) {\r\n context.fillStyle = this._isEnabled ? this._focusedBackground : this._disabledColor;\r\n\r\n context.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n } else if (this._background) {\r\n context.fillStyle = this._isEnabled ? this._background : this._disabledColor;\r\n\r\n context.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowBlur = 0;\r\n context.shadowOffsetX = 0;\r\n context.shadowOffsetY = 0;\r\n }\r\n\r\n if (!this._fontOffset || this._wasDirty) {\r\n this._fontOffset = Control._GetFontOffset(context.font, this._host.getScene()?.getEngine());\r\n }\r\n\r\n // Text\r\n const clipTextLeft = this._currentMeasure.left + this._margin.getValueInPixel(this._host, this._tempParentMeasure.width);\r\n if (this.color) {\r\n context.fillStyle = this.color;\r\n }\r\n\r\n let text = this._beforeRenderText(this._textWrapper);\r\n\r\n if (!this._isFocused && !this._textWrapper.text && this._placeholderText) {\r\n text = new TextWrapper();\r\n text.text = this._placeholderText;\r\n\r\n if (this._placeholderColor) {\r\n context.fillStyle = this._placeholderColor;\r\n }\r\n }\r\n\r\n this._textWidth = context.measureText(text.text).width;\r\n const marginWidth = this._margin.getValueInPixel(this._host, this._tempParentMeasure.width) * 2;\r\n if (this._autoStretchWidth) {\r\n this.width = Math.min(this._maxWidth.getValueInPixel(this._host, this._tempParentMeasure.width), this._textWidth + marginWidth) + \"px\";\r\n this._autoStretchWidth = true; // setting the width will have reset _autoStretchWidth to false!\r\n }\r\n\r\n const rootY = this._fontOffset.ascent + (this._currentMeasure.height - this._fontOffset.height) / 2;\r\n const availableWidth = this._width.getValueInPixel(this._host, this._tempParentMeasure.width) - marginWidth;\r\n\r\n context.save();\r\n context.beginPath();\r\n context.rect(clipTextLeft, this._currentMeasure.top + (this._currentMeasure.height - this._fontOffset.height) / 2, availableWidth + 2, this._currentMeasure.height);\r\n context.clip();\r\n\r\n if (this._isFocused && this._textWidth > availableWidth) {\r\n const textLeft = clipTextLeft - this._textWidth + availableWidth;\r\n if (!this._scrollLeft) {\r\n this._scrollLeft = textLeft;\r\n }\r\n } else {\r\n this._scrollLeft = clipTextLeft;\r\n }\r\n\r\n if (this.outlineWidth) {\r\n context.strokeText(text.text, this._scrollLeft, this._currentMeasure.top + rootY);\r\n }\r\n\r\n context.fillText(text.text, this._scrollLeft, this._currentMeasure.top + rootY);\r\n\r\n // Cursor\r\n if (this._isFocused) {\r\n // Need to move cursor\r\n if (this._clickedCoordinate) {\r\n const rightPosition = this._scrollLeft + this._textWidth;\r\n const absoluteCursorPosition = rightPosition - this._clickedCoordinate;\r\n let currentSize = 0;\r\n this._cursorOffset = 0;\r\n let previousDist = 0;\r\n do {\r\n if (this._cursorOffset) {\r\n previousDist = Math.abs(absoluteCursorPosition - currentSize);\r\n }\r\n this._cursorOffset++;\r\n currentSize = context.measureText(text.substr(text.length - this._cursorOffset, this._cursorOffset)).width;\r\n } while (currentSize < absoluteCursorPosition && text.length >= this._cursorOffset);\r\n\r\n // Find closest move\r\n if (Math.abs(absoluteCursorPosition - currentSize) > previousDist) {\r\n this._cursorOffset--;\r\n }\r\n\r\n this._blinkIsEven = false;\r\n this._clickedCoordinate = null;\r\n }\r\n\r\n // Render cursor\r\n if (!this._blinkIsEven) {\r\n const cursorOffsetText = text.substr(text.length - this._cursorOffset);\r\n const cursorOffsetWidth = context.measureText(cursorOffsetText).width;\r\n let cursorLeft = this._scrollLeft + this._textWidth - cursorOffsetWidth;\r\n\r\n if (cursorLeft < clipTextLeft) {\r\n this._scrollLeft += clipTextLeft - cursorLeft;\r\n cursorLeft = clipTextLeft;\r\n this._markAsDirty();\r\n } else if (cursorLeft > clipTextLeft + availableWidth) {\r\n this._scrollLeft += clipTextLeft + availableWidth - cursorLeft;\r\n cursorLeft = clipTextLeft + availableWidth;\r\n this._markAsDirty();\r\n }\r\n if (!this.isTextHighlightOn) {\r\n context.fillRect(cursorLeft, this._currentMeasure.top + (this._currentMeasure.height - this._fontOffset.height) / 2, 2, this._fontOffset.height);\r\n }\r\n }\r\n\r\n clearTimeout(this._blinkTimeout);\r\n this._blinkTimeout = <any>setTimeout(() => {\r\n this._blinkIsEven = !this._blinkIsEven;\r\n this._markAsDirty();\r\n }, 500);\r\n\r\n //show the highlighted text\r\n if (this.isTextHighlightOn) {\r\n clearTimeout(this._blinkTimeout);\r\n const highlightCursorOffsetWidth = context.measureText(text.substring(this._startHighlightIndex)).width;\r\n let highlightCursorLeft = this._scrollLeft + this._textWidth - highlightCursorOffsetWidth;\r\n this._highlightedText = text.substring(this._startHighlightIndex, this._endHighlightIndex);\r\n let width = context.measureText(text.substring(this._startHighlightIndex, this._endHighlightIndex)).width;\r\n if (highlightCursorLeft < clipTextLeft) {\r\n width = width - (clipTextLeft - highlightCursorLeft);\r\n if (!width) {\r\n // when using left arrow on text.length > availableWidth;\r\n // assigns the width of the first letter after clipTextLeft\r\n width = context.measureText(text.charAt(text.length - this._cursorOffset)).width;\r\n }\r\n highlightCursorLeft = clipTextLeft;\r\n }\r\n //for transparancy\r\n context.globalAlpha = this._highlighterOpacity;\r\n context.fillStyle = this._textHighlightColor;\r\n context.fillRect(highlightCursorLeft, this._currentMeasure.top + (this._currentMeasure.height - this._fontOffset.height) / 2, width, this._fontOffset.height);\r\n context.globalAlpha = 1.0;\r\n }\r\n }\r\n context.restore();\r\n\r\n // Border\r\n if (this._thickness) {\r\n if (this._isFocused) {\r\n if (this.focusedColor) {\r\n context.strokeStyle = this.focusedColor;\r\n }\r\n } else {\r\n if (this.color) {\r\n context.strokeStyle = this.color;\r\n }\r\n }\r\n\r\n context.lineWidth = this._thickness;\r\n\r\n context.strokeRect(\r\n this._currentMeasure.left + this._thickness / 2,\r\n this._currentMeasure.top + this._thickness / 2,\r\n this._currentMeasure.width - this._thickness,\r\n this._currentMeasure.height - this._thickness\r\n );\r\n }\r\n\r\n context.restore();\r\n }\r\n\r\n public override _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: PointerInfoBase): boolean {\r\n if (!super._onPointerDown(target, coordinates, pointerId, buttonIndex, pi)) {\r\n return false;\r\n }\r\n\r\n if (this.isReadOnly) {\r\n return true;\r\n }\r\n\r\n this._clickedCoordinate = coordinates.x;\r\n this.isTextHighlightOn = false;\r\n this._highlightedText = \"\";\r\n this._cursorIndex = -1;\r\n this._isPointerDown = true;\r\n this._host._capturingControl[pointerId] = this;\r\n this._focusedBy = (pi.event as IPointerEvent).pointerType;\r\n if (this._host.focusedControl === this) {\r\n // Move cursor\r\n clearTimeout(this._blinkTimeout);\r\n this._markAsDirty();\r\n return true;\r\n }\r\n if (!this._isEnabled) {\r\n return false;\r\n }\r\n this._host.focusedControl = this;\r\n\r\n return true;\r\n }\r\n public override _onPointerMove(target: Control, coordinates: Vector2, pointerId: number, pi: PointerInfoBase): void {\r\n if (this._host.focusedControl === this && this._isPointerDown && !this.isReadOnly) {\r\n this._clickedCoordinate = coordinates.x;\r\n this._markAsDirty();\r\n this._updateValueFromCursorIndex(this._cursorOffset);\r\n }\r\n super._onPointerMove(target, coordinates, pointerId, pi);\r\n }\r\n\r\n public override _onPointerUp(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, notifyClick: boolean): void {\r\n this._isPointerDown = false;\r\n delete this._host._capturingControl[pointerId];\r\n super._onPointerUp(target, coordinates, pointerId, buttonIndex, notifyClick);\r\n }\r\n\r\n protected _beforeRenderText(textWrapper: TextWrapper): TextWrapper {\r\n return textWrapper;\r\n }\r\n\r\n /** @internal */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private set isTextHighlightOn(value: boolean) {\r\n if (this._isTextHighlightOn === value) {\r\n return;\r\n }\r\n if (value) {\r\n this.onTextHighlightObservable.notifyObservers(this);\r\n }\r\n this._isTextHighlightOn = value;\r\n }\r\n\r\n /** @internal */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private get isTextHighlightOn(): boolean {\r\n return this._isTextHighlightOn;\r\n }\r\n\r\n public override dispose() {\r\n super.dispose();\r\n\r\n this.onBlurObservable.clear();\r\n this.onFocusObservable.clear();\r\n this.onTextChangedObservable.clear();\r\n this.onTextCopyObservable.clear();\r\n this.onTextCutObservable.clear();\r\n this.onTextPasteObservable.clear();\r\n this.onTextHighlightObservable.clear();\r\n this.onKeyboardEventProcessedObservable.clear();\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.InputText\", InputText);\r\n","import { type Nullable } from \"core/types\";\r\n\r\nimport { Container } from \"./container\";\r\nimport { ValueAndUnit } from \"../valueAndUnit\";\r\nimport { Control } from \"./control\";\r\nimport { type Measure } from \"../measure\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\nimport { type AdvancedDynamicTexture } from \"../advancedDynamicTexture\";\r\nimport { type Observer } from \"core/Misc/observable\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\n\r\n/**\r\n * Class used to create a 2D grid container\r\n */\r\nexport class Grid extends Container {\r\n private _rowDefinitions = new Array<ValueAndUnit>();\r\n private _rowDefinitionObservers: Observer<void>[] = [];\r\n private _columnDefinitions = new Array<ValueAndUnit>();\r\n private _columnDefinitionObservers: Observer<void>[] = [];\r\n private _cells: { [key: string]: Container } = {};\r\n private _childControls = new Array<Control>();\r\n\r\n /**\r\n * Sets/Gets a boolean indicating that control content must be clipped\r\n * Please note that not clipping content may generate issues with adt.useInvalidateRectOptimization so it is recommended to turn this optimization off if you want to use unclipped children\r\n */\r\n public override set clipContent(value: boolean) {\r\n this._clipContent = value;\r\n\r\n // This value has to be replicated on all of the container cells\r\n for (const key in this._cells) {\r\n this._cells[key].clipContent = value;\r\n }\r\n }\r\n\r\n @serialize()\r\n public override get clipContent(): boolean {\r\n return this._clipContent;\r\n }\r\n\r\n /**\r\n * Sets/Gets a boolean indicating if the children are clipped to the current control bounds.\r\n * Please note that not clipping children may generate issues with adt.useInvalidateRectOptimization so it is recommended to turn this optimization off if you want to use unclipped children\r\n */\r\n public override set clipChildren(value: boolean) {\r\n this._clipChildren = value;\r\n\r\n // This value has to be replicated on all of the container cells\r\n for (const key in this._cells) {\r\n this._cells[key].clipChildren = value;\r\n }\r\n }\r\n\r\n public override get clipChildren(): boolean {\r\n return this._clipChildren;\r\n }\r\n\r\n /**\r\n * Gets the number of columns\r\n */\r\n public get columnCount(): number {\r\n return this._columnDefinitions.length;\r\n }\r\n\r\n /**\r\n * Gets the number of rows\r\n */\r\n public get rowCount(): number {\r\n return this._rowDefinitions.length;\r\n }\r\n\r\n /** Gets the list of children */\r\n public override get children(): Control[] {\r\n return this._childControls;\r\n }\r\n\r\n /** Gets the list of cells (e.g. the containers) */\r\n public get cells(): { [key: string]: Container } {\r\n return this._cells;\r\n }\r\n\r\n /**\r\n * Gets the definition of a specific row\r\n * @param index defines the index of the row\r\n * @returns the row definition\r\n */\r\n public getRowDefinition(index: number): Nullable<ValueAndUnit> {\r\n if (index < 0 || index >= this._rowDefinitions.length) {\r\n return null;\r\n }\r\n\r\n return this._rowDefinitions[index];\r\n }\r\n\r\n /**\r\n * Gets the definition of a specific column\r\n * @param index defines the index of the column\r\n * @returns the column definition\r\n */\r\n public getColumnDefinition(index: number): Nullable<ValueAndUnit> {\r\n if (index < 0 || index >= this._columnDefinitions.length) {\r\n return null;\r\n }\r\n\r\n return this._columnDefinitions[index];\r\n }\r\n\r\n /**\r\n * Adds a new row to the grid\r\n * @param height defines the height of the row (either in pixel or a value between 0 and 1)\r\n * @param isPixel defines if the height is expressed in pixel (or in percentage)\r\n * @returns the current grid\r\n */\r\n public addRowDefinition(height: number, isPixel = false): Grid {\r\n this._rowDefinitions.push(new ValueAndUnit(height, isPixel ? ValueAndUnit.UNITMODE_PIXEL : ValueAndUnit.UNITMODE_PERCENTAGE));\r\n this._rowDefinitionObservers.push(this._rowDefinitions[this.rowCount - 1].onChangedObservable.add(() => this._markAsDirty()));\r\n this._markAsDirty();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a new column to the grid\r\n * @param width defines the width of the column (either in pixel or a value between 0 and 1)\r\n * @param isPixel defines if the width is expressed in pixel (or in percentage)\r\n * @returns the current grid\r\n */\r\n public addColumnDefinition(width: number, isPixel = false): Grid {\r\n this._columnDefinitions.push(new ValueAndUnit(width, isPixel ? ValueAndUnit.UNITMODE_PIXEL : ValueAndUnit.UNITMODE_PERCENTAGE));\r\n this._columnDefinitionObservers.push(this._columnDefinitions[this.columnCount - 1].onChangedObservable.add(() => this._markAsDirty()));\r\n this._markAsDirty();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Update a row definition\r\n * @param index defines the index of the row to update\r\n * @param height defines the height of the row (either in pixel or a value between 0 and 1)\r\n * @param isPixel defines if the weight is expressed in pixel (or in percentage)\r\n * @returns the current grid\r\n */\r\n public setRowDefinition(index: number, height: number, isPixel = false): Grid {\r\n if (index < 0 || index >= this._rowDefinitions.length) {\r\n return this;\r\n }\r\n\r\n const current = this._rowDefinitions[index];\r\n if (current && current.isPixel === isPixel && current.value === height) {\r\n return this;\r\n }\r\n\r\n this._rowDefinitions[index].onChangedObservable.remove(this._rowDefinitionObservers[index]);\r\n this._rowDefinitions[index] = new ValueAndUnit(height, isPixel ? ValueAndUnit.UNITMODE_PIXEL : ValueAndUnit.UNITMODE_PERCENTAGE);\r\n this._rowDefinitionObservers[index] = this._rowDefinitions[index].onChangedObservable.add(() => this._markAsDirty())!;\r\n\r\n this._markAsDirty();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Update a column definition\r\n * @param index defines the index of the column to update\r\n * @param width defines the width of the column (either in pixel or a value between 0 and 1)\r\n * @param isPixel defines if the width is expressed in pixel (or in percentage)\r\n * @returns the current grid\r\n */\r\n public setColumnDefinition(index: number, width: number, isPixel = false): Grid {\r\n if (index < 0 || index >= this._columnDefinitions.length) {\r\n return this;\r\n }\r\n\r\n const current = this._columnDefinitions[index];\r\n if (current && current.isPixel === isPixel && current.value === width) {\r\n return this;\r\n }\r\n\r\n this._columnDefinitions[index].onChangedObservable.remove(this._columnDefinitionObservers[index]);\r\n this._columnDefinitions[index] = new ValueAndUnit(width, isPixel ? ValueAndUnit.UNITMODE_PIXEL : ValueAndUnit.UNITMODE_PERCENTAGE);\r\n this._columnDefinitionObservers[index] = this._columnDefinitions[index].onChangedObservable.add(() => this._markAsDirty())!;\r\n\r\n this._markAsDirty();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets the list of children stored in a specific cell\r\n * @param row defines the row to check\r\n * @param column defines the column to check\r\n * @returns the list of controls\r\n */\r\n public getChildrenAt(row: number, column: number): Nullable<Array<Control>> {\r\n const cell = this._cells[`${row}:${column}`];\r\n\r\n if (!cell) {\r\n return null;\r\n }\r\n\r\n return cell.children;\r\n }\r\n\r\n /**\r\n * Gets a string representing the child cell info (row x column)\r\n * @param child defines the control to get info from\r\n * @returns a string containing the child cell info (row x column)\r\n */\r\n public getChildCellInfo(child: Control): string {\r\n return child._tag;\r\n }\r\n\r\n private _removeCell(cell: Container, key: string) {\r\n if (!cell) {\r\n return;\r\n }\r\n\r\n super.removeControl(cell);\r\n\r\n for (const control of cell.children) {\r\n const childIndex = this._childControls.indexOf(control);\r\n\r\n if (childIndex !== -1) {\r\n this._childControls.splice(childIndex, 1);\r\n }\r\n }\r\n\r\n delete this._cells[key];\r\n }\r\n\r\n private _offsetCell(previousKey: string, key: string) {\r\n if (!this._cells[key]) {\r\n return;\r\n }\r\n\r\n this._cells[previousKey] = this._cells[key];\r\n\r\n for (const control of this._cells[previousKey].children) {\r\n control._tag = previousKey;\r\n }\r\n\r\n delete this._cells[key];\r\n }\r\n\r\n /**\r\n * Remove a column definition at specified index\r\n * @param index defines the index of the column to remove\r\n * @returns the current grid\r\n */\r\n public removeColumnDefinition(index: number): Grid {\r\n if (index < 0 || index >= this._columnDefinitions.length) {\r\n return this;\r\n }\r\n\r\n for (let x = 0; x < this._rowDefinitions.length; x++) {\r\n const key = `${x}:${index}`;\r\n const cell = this._cells[key];\r\n\r\n this._removeCell(cell, key);\r\n }\r\n\r\n for (let x = 0; x < this._rowDefinitions.length; x++) {\r\n for (let y = index + 1; y < this._columnDefinitions.length; y++) {\r\n const previousKey = `${x}:${y - 1}`;\r\n const key = `${x}:${y}`;\r\n\r\n this._offsetCell(previousKey, key);\r\n }\r\n }\r\n\r\n this._columnDefinitions[index].onChangedObservable.remove(this._columnDefinitionObservers[index]);\r\n this._columnDefinitions.splice(index, 1);\r\n this._columnDefinitionObservers.splice(index, 1);\r\n\r\n this._markAsDirty();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove a row definition at specified index\r\n * @param index defines the index of the row to remove\r\n * @returns the current grid\r\n */\r\n public removeRowDefinition(index: number): Grid {\r\n if (index < 0 || index >= this._rowDefinitions.length) {\r\n return this;\r\n }\r\n\r\n for (let y = 0; y < this._columnDefinitions.length; y++) {\r\n const key = `${index}:${y}`;\r\n const cell = this._cells[key];\r\n\r\n this._removeCell(cell, key);\r\n }\r\n\r\n for (let y = 0; y < this._columnDefinitions.length; y++) {\r\n for (let x = index + 1; x < this._rowDefinitions.length; x++) {\r\n const previousKey = `${x - 1}:${y}`;\r\n const key = `${x}:${y}`;\r\n\r\n this._offsetCell(previousKey, key);\r\n }\r\n }\r\n\r\n this._rowDefinitions[index].onChangedObservable.remove(this._rowDefinitionObservers[index]);\r\n this._rowDefinitions.splice(index, 1);\r\n this._rowDefinitionObservers.splice(index, 1);\r\n\r\n this._markAsDirty();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a new control to the current grid\r\n * @param control defines the control to add\r\n * @param row defines the row where to add the control (0 by default)\r\n * @param column defines the column where to add the control (0 by default)\r\n * @returns the current grid\r\n */\r\n public override addControl(control: Control, row: number = 0, column: number = 0): Grid {\r\n if (this._rowDefinitions.length === 0) {\r\n // Add default row definition\r\n this.addRowDefinition(1, false);\r\n }\r\n\r\n if (this._columnDefinitions.length === 0) {\r\n // Add default column definition\r\n this.addColumnDefinition(1, false);\r\n }\r\n\r\n if (this._childControls.indexOf(control) !== -1) {\r\n Tools.Warn(`Control (Name:${control.name}, UniqueId:${control.uniqueId}) is already associated with this grid. You must remove it before reattaching it`);\r\n return this;\r\n }\r\n\r\n const x = Math.min(row, this._rowDefinitions.length - 1);\r\n const y = Math.min(column, this._columnDefinitions.length - 1);\r\n const key = `${x}:${y}`;\r\n let goodContainer = this._cells[key];\r\n\r\n if (!goodContainer) {\r\n goodContainer = new Container(key);\r\n this._cells[key] = goodContainer;\r\n goodContainer.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n goodContainer.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\r\n goodContainer.clipContent = this.clipContent;\r\n goodContainer.clipChildren = this.clipChildren;\r\n super.addControl(goodContainer);\r\n }\r\n\r\n goodContainer.addControl(control);\r\n this._childControls.push(control);\r\n control._tag = key;\r\n control.parent = this;\r\n\r\n this._markAsDirty();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes a control from the current container\r\n * @param control defines the control to remove\r\n * @returns the current container\r\n */\r\n public override removeControl(control: Control): Container {\r\n const index = this._childControls.indexOf(control);\r\n\r\n if (index !== -1) {\r\n this._childControls.splice(index, 1);\r\n }\r\n\r\n const cell = this._cells[control._tag];\r\n\r\n if (cell) {\r\n cell.removeControl(control);\r\n control._tag = null;\r\n }\r\n\r\n this._markAsDirty();\r\n return this;\r\n }\r\n\r\n /**\r\n * Creates a new Grid\r\n * @param name defines control name\r\n */\r\n constructor(public override name?: string) {\r\n super(name);\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"Grid\";\r\n }\r\n\r\n protected _getGridDefinitions(definitionCallback: (lefts: number[], tops: number[], widths: number[], heights: number[]) => void) {\r\n const widths = [];\r\n const heights = [];\r\n const lefts = [];\r\n const tops = [];\r\n\r\n let availableWidth = this._currentMeasure.width;\r\n let globalWidthPercentage = 0;\r\n let availableHeight = this._currentMeasure.height;\r\n let globalHeightPercentage = 0;\r\n\r\n // Heights\r\n let index = 0;\r\n for (const rowDefinition of this._rowDefinitions) {\r\n if (rowDefinition.isPixel) {\r\n const height = rowDefinition.getValue(this._host);\r\n availableHeight -= height;\r\n heights[index] = height;\r\n } else {\r\n globalHeightPercentage += rowDefinition.value;\r\n }\r\n index++;\r\n }\r\n\r\n let top = 0;\r\n index = 0;\r\n for (const rowDefinition of this._rowDefinitions) {\r\n tops.push(top);\r\n\r\n if (!rowDefinition.isPixel) {\r\n const height = Math.round((rowDefinition.value / globalHeightPercentage) * availableHeight);\r\n top += height;\r\n heights[index] = height;\r\n } else {\r\n top += rowDefinition.getValue(this._host);\r\n }\r\n index++;\r\n }\r\n\r\n // Widths\r\n index = 0;\r\n for (const columnDefinition of this._columnDefinitions) {\r\n if (columnDefinition.isPixel) {\r\n const width = columnDefinition.getValue(this._host);\r\n availableWidth -= width;\r\n widths[index] = width;\r\n } else {\r\n globalWidthPercentage += columnDefinition.value;\r\n }\r\n index++;\r\n }\r\n\r\n let left = 0;\r\n index = 0;\r\n for (const columnDefinition of this._columnDefinitions) {\r\n lefts.push(left);\r\n if (!columnDefinition.isPixel) {\r\n const width = Math.round((columnDefinition.value / globalWidthPercentage) * availableWidth);\r\n left += width;\r\n widths[index] = width;\r\n } else {\r\n left += columnDefinition.getValue(this._host);\r\n }\r\n index++;\r\n }\r\n\r\n definitionCallback(lefts, tops, widths, heights);\r\n }\r\n\r\n protected override _additionalProcessing(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n this._getGridDefinitions((lefts: number[], tops: number[], widths: number[], heights: number[]) => {\r\n // Setting child sizes\r\n for (const key in this._cells) {\r\n if (!Object.prototype.hasOwnProperty.call(this._cells, key)) {\r\n continue;\r\n }\r\n const split = key.split(\":\");\r\n const x = parseInt(split[0]);\r\n const y = parseInt(split[1]);\r\n const cell = this._cells[key];\r\n\r\n cell.leftInPixels = lefts[y];\r\n cell.topInPixels = tops[x];\r\n cell.widthInPixels = widths[y];\r\n cell.heightInPixels = heights[x];\r\n cell._left.ignoreAdaptiveScaling = true;\r\n cell._top.ignoreAdaptiveScaling = true;\r\n cell._width.ignoreAdaptiveScaling = true;\r\n cell._height.ignoreAdaptiveScaling = true;\r\n }\r\n });\r\n\r\n super._additionalProcessing(parentMeasure, context);\r\n }\r\n\r\n public override _flagDescendantsAsMatrixDirty(): void {\r\n for (const key in this._cells) {\r\n if (!Object.prototype.hasOwnProperty.call(this._cells, key)) {\r\n continue;\r\n }\r\n\r\n const child = this._cells[key];\r\n child._markMatrixAsDirty();\r\n }\r\n }\r\n\r\n public override _renderHighlightSpecific(context: ICanvasRenderingContext): void {\r\n super._renderHighlightSpecific(context);\r\n\r\n this._getGridDefinitions((lefts: number[], tops: number[], widths: number[], heights: number[]) => {\r\n // Columns\r\n for (let index = 0; index < lefts.length; index++) {\r\n const left = this._currentMeasure.left + lefts[index] + widths[index];\r\n context.beginPath();\r\n context.moveTo(left, this._currentMeasure.top);\r\n context.lineTo(left, this._currentMeasure.top + this._currentMeasure.height);\r\n context.stroke();\r\n }\r\n\r\n // Rows\r\n for (let index = 0; index < tops.length; index++) {\r\n const top = this._currentMeasure.top + tops[index] + heights[index];\r\n context.beginPath();\r\n context.moveTo(this._currentMeasure.left, top);\r\n context.lineTo(this._currentMeasure.left + this._currentMeasure.width, top);\r\n context.stroke();\r\n }\r\n });\r\n\r\n context.restore();\r\n }\r\n\r\n /** Releases associated resources */\r\n public override dispose() {\r\n super.dispose();\r\n\r\n for (const control of this._childControls) {\r\n control.dispose();\r\n }\r\n for (let index = 0; index < this._rowDefinitions.length; index++) {\r\n this._rowDefinitions[index].onChangedObservable.remove(this._rowDefinitionObservers[index]);\r\n }\r\n for (let index = 0; index < this._columnDefinitions.length; index++) {\r\n this._columnDefinitions[index].onChangedObservable.remove(this._columnDefinitionObservers[index]);\r\n }\r\n this._rowDefinitionObservers.length = 0;\r\n this._rowDefinitions.length = 0;\r\n this._columnDefinitionObservers.length = 0;\r\n this._columnDefinitions.length = 0;\r\n this._cells = {};\r\n this._childControls.length = 0;\r\n }\r\n\r\n /**\r\n * Serializes the current control\r\n * @param serializationObject defined the JSON serialized object\r\n * @param force force serialization even if isSerializable === false\r\n * @param allowCanvas defines if the control is allowed to use a Canvas2D object to serialize\r\n */\r\n public override serialize(serializationObject: any, force: boolean, allowCanvas: boolean) {\r\n super.serialize(serializationObject, force, allowCanvas);\r\n if (!this.isSerializable && !force) {\r\n return;\r\n }\r\n serializationObject.columnCount = this.columnCount;\r\n serializationObject.rowCount = this.rowCount;\r\n serializationObject.columns = [];\r\n serializationObject.rows = [];\r\n serializationObject.tags = [];\r\n for (let i = 0; i < this.columnCount; ++i) {\r\n const cd = this.getColumnDefinition(i);\r\n const childSerializationObject = { value: cd?.getValue(this.host), unit: cd?.unit };\r\n serializationObject.columns.push(childSerializationObject);\r\n }\r\n for (let i = 0; i < this.rowCount; ++i) {\r\n const rd = this.getRowDefinition(i);\r\n const childSerializationObject = { value: rd?.getValue(this.host), unit: rd?.unit };\r\n serializationObject.rows.push(childSerializationObject);\r\n }\r\n for (const child of this.children) {\r\n serializationObject.tags.push(child._tag);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _parseFromContent(serializedObject: any, host: AdvancedDynamicTexture) {\r\n super._parseFromContent(serializedObject, host);\r\n const children: Control[] = [];\r\n for (const child of this.children) {\r\n children.push(child);\r\n }\r\n this.removeRowDefinition(0);\r\n this.removeColumnDefinition(0);\r\n for (let i = 0; i < serializedObject.columnCount; ++i) {\r\n const columnValue = serializedObject.columns[i].value;\r\n const unit = serializedObject.columns[i].unit;\r\n this.addColumnDefinition(columnValue, unit === 1 ? true : false);\r\n }\r\n for (let i = 0; i < serializedObject.rowCount; ++i) {\r\n const rowValue = serializedObject.rows[i].value;\r\n const unit = serializedObject.rows[i].unit;\r\n this.addRowDefinition(rowValue, unit === 1 ? true : false);\r\n }\r\n\r\n for (let i = 0; i < children.length; ++i) {\r\n const cellInfo = serializedObject.tags[i];\r\n let rowNumber = parseInt(cellInfo.substring(0, cellInfo.search(\":\")));\r\n if (isNaN(rowNumber)) {\r\n rowNumber = 0;\r\n }\r\n let columnNumber = parseInt(cellInfo.substring(cellInfo.search(\":\") + 1));\r\n if (isNaN(columnNumber)) {\r\n columnNumber = 0;\r\n }\r\n this.addControl(children[i], rowNumber, columnNumber);\r\n }\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.Grid\", Grid);\r\n","import { Observable } from \"core/Misc/observable\";\r\nimport { type Vector2 } from \"core/Maths/math.vector\";\r\n\r\nimport { Control } from \"./control\";\r\nimport { type Measure } from \"../measure\";\r\nimport { InputText } from \"./inputText\";\r\nimport { Rectangle } from \"./rectangle\";\r\nimport { Button } from \"./button\";\r\nimport { Grid } from \"./grid\";\r\nimport { type AdvancedDynamicTexture } from \"../advancedDynamicTexture\";\r\nimport { TextBlock } from \"../controls/textBlock\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { type PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { type ICanvas, type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\nimport { EngineStore } from \"core/Engines/engineStore\";\r\n\r\n/** Class used to create color pickers */\r\nexport class ColorPicker extends Control {\r\n private static _Epsilon = 0.000001;\r\n private _colorWheelCanvas: ICanvas;\r\n\r\n private _value: Color3 = Color3.Red();\r\n private _tmpColor = new Color3();\r\n\r\n private _pointerStartedOnSquare = false;\r\n private _pointerStartedOnWheel = false;\r\n\r\n private _squareLeft = 0;\r\n private _squareTop = 0;\r\n private _squareSize = 0;\r\n\r\n private _h = 360;\r\n private _s = 1;\r\n private _v = 1;\r\n\r\n private _lastPointerDownId = -1;\r\n\r\n /**\r\n * Observable raised when the value changes\r\n */\r\n public onValueChangedObservable = new Observable<Color3>();\r\n\r\n /** Gets or sets the color of the color picker */\r\n @serialize()\r\n public get value(): Color3 {\r\n return this._value;\r\n }\r\n\r\n public set value(value: Color3) {\r\n if (this._value.equals(value)) {\r\n return;\r\n }\r\n\r\n this._value.copyFrom(value);\r\n\r\n this._value.toHSVToRef(this._tmpColor);\r\n\r\n this._h = this._tmpColor.r;\r\n this._s = Math.max(this._tmpColor.g, 0.00001);\r\n this._v = Math.max(this._tmpColor.b, 0.00001);\r\n\r\n this._markAsDirty();\r\n\r\n if (this._value.r <= ColorPicker._Epsilon) {\r\n this._value.r = 0;\r\n }\r\n\r\n if (this._value.g <= ColorPicker._Epsilon) {\r\n this._value.g = 0;\r\n }\r\n\r\n if (this._value.b <= ColorPicker._Epsilon) {\r\n this._value.b = 0;\r\n }\r\n\r\n if (this._value.r >= 1.0 - ColorPicker._Epsilon) {\r\n this._value.r = 1.0;\r\n }\r\n\r\n if (this._value.g >= 1.0 - ColorPicker._Epsilon) {\r\n this._value.g = 1.0;\r\n }\r\n\r\n if (this._value.b >= 1.0 - ColorPicker._Epsilon) {\r\n this._value.b = 1.0;\r\n }\r\n\r\n this.onValueChangedObservable.notifyObservers(this._value, undefined, this, this);\r\n }\r\n\r\n /**\r\n * Gets or sets control width\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public override get width(): string | number {\r\n return this._width.toString(this._host);\r\n }\r\n\r\n public override set width(value: string | number) {\r\n if (this._width.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._width.fromString(value)) {\r\n if (this._width.getValue(this._host) === 0) {\r\n value = \"1px\";\r\n this._width.fromString(value);\r\n }\r\n this._height.fromString(value);\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets control height\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#position-and-size\r\n */\r\n @serialize()\r\n public override get height(): string | number {\r\n return this._height.toString(this._host);\r\n }\r\n\r\n /** Gets or sets control height */\r\n public override set height(value: string | number) {\r\n if (this._height.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._height.fromString(value)) {\r\n if (this._height.getValue(this._host) === 0) {\r\n value = \"1px\";\r\n this._height.fromString(value);\r\n }\r\n this._width.fromString(value);\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /** Gets or sets control size */\r\n @serialize()\r\n public get size(): string | number {\r\n return this.width;\r\n }\r\n\r\n public set size(value: string | number) {\r\n this.width = value;\r\n }\r\n\r\n /**\r\n * Creates a new ColorPicker\r\n * @param name defines the control name\r\n */\r\n constructor(public override name?: string) {\r\n super(name);\r\n this.value = new Color3(0.88, 0.1, 0.1);\r\n this.size = \"200px\";\r\n this.isPointerBlocker = true;\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"ColorPicker\";\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected override _preMeasure(parentMeasure: Measure): void {\r\n if (parentMeasure.width < parentMeasure.height) {\r\n this._currentMeasure.height = parentMeasure.width;\r\n } else {\r\n this._currentMeasure.width = parentMeasure.height;\r\n }\r\n }\r\n\r\n private _updateSquareProps(): void {\r\n const radius = Math.min(this._currentMeasure.width, this._currentMeasure.height) * 0.5;\r\n const wheelThickness = radius * 0.2;\r\n const innerDiameter = (radius - wheelThickness) * 2;\r\n const squareSize = innerDiameter / Math.sqrt(2);\r\n const offset = radius - squareSize * 0.5;\r\n\r\n this._squareLeft = this._currentMeasure.left + offset;\r\n this._squareTop = this._currentMeasure.top + offset;\r\n this._squareSize = squareSize;\r\n }\r\n\r\n private _drawGradientSquare(hueValue: number, left: number, top: number, width: number, height: number, context: ICanvasRenderingContext) {\r\n const lgh = context.createLinearGradient(left, top, width + left, top);\r\n lgh.addColorStop(0, \"#fff\");\r\n lgh.addColorStop(1, \"hsl(\" + hueValue + \", 100%, 50%)\");\r\n\r\n context.fillStyle = lgh;\r\n context.fillRect(left, top, width, height);\r\n\r\n const lgv = context.createLinearGradient(left, top, left, height + top);\r\n lgv.addColorStop(0, \"rgba(0,0,0,0)\");\r\n lgv.addColorStop(1, \"#000\");\r\n\r\n context.fillStyle = lgv;\r\n context.fillRect(left, top, width, height);\r\n }\r\n\r\n private _drawCircle(centerX: number, centerY: number, radius: number, context: ICanvasRenderingContext) {\r\n context.beginPath();\r\n context.arc(centerX, centerY, radius + 1, 0, 2 * Math.PI, false);\r\n context.lineWidth = 3;\r\n context.strokeStyle = \"#333333\";\r\n context.stroke();\r\n context.beginPath();\r\n context.arc(centerX, centerY, radius, 0, 2 * Math.PI, false);\r\n context.lineWidth = 3;\r\n context.strokeStyle = \"#ffffff\";\r\n context.stroke();\r\n }\r\n\r\n private _createColorWheelCanvas(radius: number, thickness: number): ICanvas {\r\n // Shoudl abstract platform instead of using LastCreatedEngine\r\n const engine = EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n throw new Error(\"Invalid engine. Unable to create a canvas.\");\r\n }\r\n const canvas = engine.createCanvas(radius * 2, radius * 2);\r\n const context = canvas.getContext(\"2d\");\r\n const image = context.getImageData(0, 0, radius * 2, radius * 2);\r\n const data = image.data;\r\n\r\n const color = this._tmpColor;\r\n const maxDistSq = radius * radius;\r\n const innerRadius = radius - thickness;\r\n const minDistSq = innerRadius * innerRadius;\r\n\r\n for (let x = -radius; x < radius; x++) {\r\n for (let y = -radius; y < radius; y++) {\r\n const distSq = x * x + y * y;\r\n\r\n if (distSq > maxDistSq || distSq < minDistSq) {\r\n continue;\r\n }\r\n\r\n const dist = Math.sqrt(distSq);\r\n const ang = Math.atan2(y, x);\r\n\r\n Color3.HSVtoRGBToRef((ang * 180) / Math.PI + 180, dist / radius, 1, color);\r\n\r\n const index = (x + radius + (y + radius) * 2 * radius) * 4;\r\n\r\n data[index] = color.r * 255;\r\n data[index + 1] = color.g * 255;\r\n data[index + 2] = color.b * 255;\r\n\r\n //apply less alpha to bigger color pickers\r\n let alphaAmount: number;\r\n const maxAlpha = 0.2;\r\n const minAlpha = 0.04;\r\n const lowerRadius = 50;\r\n const upperRadius = 150;\r\n\r\n if (radius < lowerRadius) {\r\n alphaAmount = maxAlpha;\r\n } else if (radius > upperRadius) {\r\n alphaAmount = minAlpha;\r\n } else {\r\n alphaAmount = ((minAlpha - maxAlpha) * (radius - lowerRadius)) / (upperRadius - lowerRadius) + maxAlpha;\r\n }\r\n\r\n const alphaRatio = (dist - innerRadius) / (radius - innerRadius);\r\n\r\n if (alphaRatio < alphaAmount) {\r\n data[index + 3] = 255 * (alphaRatio / alphaAmount);\r\n } else if (alphaRatio > 1 - alphaAmount) {\r\n data[index + 3] = 255 * (1.0 - (alphaRatio - (1 - alphaAmount)) / alphaAmount);\r\n } else {\r\n data[index + 3] = 255;\r\n }\r\n }\r\n }\r\n\r\n context.putImageData(image, 0, 0);\r\n\r\n return canvas;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _draw(context: ICanvasRenderingContext): void {\r\n context.save();\r\n\r\n this._applyStates(context);\r\n\r\n const radius = Math.min(this._currentMeasure.width, this._currentMeasure.height) * 0.5;\r\n const wheelThickness = radius * 0.2;\r\n const left = this._currentMeasure.left;\r\n const top = this._currentMeasure.top;\r\n\r\n if (!this._colorWheelCanvas || this._colorWheelCanvas.width != radius * 2) {\r\n this._colorWheelCanvas = this._createColorWheelCanvas(radius, wheelThickness);\r\n }\r\n\r\n this._updateSquareProps();\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio;\r\n context.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio;\r\n\r\n context.fillRect(this._squareLeft, this._squareTop, this._squareSize, this._squareSize);\r\n }\r\n\r\n context.drawImage(this._colorWheelCanvas, left, top);\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowBlur = 0;\r\n context.shadowOffsetX = 0;\r\n context.shadowOffsetY = 0;\r\n }\r\n\r\n this._drawGradientSquare(this._h, this._squareLeft, this._squareTop, this._squareSize, this._squareSize, context);\r\n\r\n let cx = this._squareLeft + this._squareSize * this._s;\r\n let cy = this._squareTop + this._squareSize * (1 - this._v);\r\n\r\n this._drawCircle(cx, cy, radius * 0.04, context);\r\n\r\n const dist = radius - wheelThickness * 0.5;\r\n cx = left + radius + Math.cos(((this._h - 180) * Math.PI) / 180) * dist;\r\n cy = top + radius + Math.sin(((this._h - 180) * Math.PI) / 180) * dist;\r\n this._drawCircle(cx, cy, wheelThickness * 0.35, context);\r\n\r\n context.restore();\r\n }\r\n\r\n // Events\r\n private _pointerIsDown = false;\r\n\r\n private _updateValueFromPointer(x: number, y: number): void {\r\n if (this._pointerStartedOnWheel) {\r\n const radius = Math.min(this._currentMeasure.width, this._currentMeasure.height) * 0.5;\r\n const centerX = radius + this._currentMeasure.left;\r\n const centerY = radius + this._currentMeasure.top;\r\n this._h = (Math.atan2(y - centerY, x - centerX) * 180) / Math.PI + 180;\r\n } else if (this._pointerStartedOnSquare) {\r\n this._updateSquareProps();\r\n this._s = (x - this._squareLeft) / this._squareSize;\r\n this._v = 1 - (y - this._squareTop) / this._squareSize;\r\n this._s = Math.min(this._s, 1);\r\n this._s = Math.max(this._s, ColorPicker._Epsilon);\r\n this._v = Math.min(this._v, 1);\r\n this._v = Math.max(this._v, ColorPicker._Epsilon);\r\n }\r\n\r\n Color3.HSVtoRGBToRef(this._h, this._s, this._v, this._tmpColor);\r\n\r\n this.value = this._tmpColor;\r\n }\r\n\r\n private _isPointOnSquare(x: number, y: number): boolean {\r\n this._updateSquareProps();\r\n\r\n const left = this._squareLeft;\r\n const top = this._squareTop;\r\n const size = this._squareSize;\r\n\r\n if (x >= left && x <= left + size && y >= top && y <= top + size) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _isPointOnWheel(x: number, y: number): boolean {\r\n const radius = Math.min(this._currentMeasure.width, this._currentMeasure.height) * 0.5;\r\n const centerX = radius + this._currentMeasure.left;\r\n const centerY = radius + this._currentMeasure.top;\r\n const wheelThickness = radius * 0.2;\r\n const innerRadius = radius - wheelThickness;\r\n const radiusSq = radius * radius;\r\n const innerRadiusSq = innerRadius * innerRadius;\r\n\r\n const dx = x - centerX;\r\n const dy = y - centerY;\r\n\r\n const distSq = dx * dx + dy * dy;\r\n\r\n if (distSq <= radiusSq && distSq >= innerRadiusSq) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public override _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: PointerInfoBase): boolean {\r\n if (!super._onPointerDown(target, coordinates, pointerId, buttonIndex, pi)) {\r\n return false;\r\n }\r\n\r\n if (this.isReadOnly) {\r\n return true;\r\n }\r\n\r\n this._pointerIsDown = true;\r\n\r\n this._pointerStartedOnSquare = false;\r\n this._pointerStartedOnWheel = false;\r\n\r\n // Invert transform\r\n this._invertTransformMatrix.transformCoordinates(coordinates.x, coordinates.y, this._transformedPosition);\r\n\r\n const x = this._transformedPosition.x;\r\n const y = this._transformedPosition.y;\r\n\r\n if (this._isPointOnSquare(x, y)) {\r\n this._pointerStartedOnSquare = true;\r\n } else if (this._isPointOnWheel(x, y)) {\r\n this._pointerStartedOnWheel = true;\r\n }\r\n\r\n this._updateValueFromPointer(x, y);\r\n this._host._capturingControl[pointerId] = this;\r\n this._lastPointerDownId = pointerId;\r\n return true;\r\n }\r\n\r\n public override _onPointerMove(target: Control, coordinates: Vector2, pointerId: number, pi: PointerInfoBase): void {\r\n // Only listen to pointer move events coming from the last pointer to click on the element (To support dual vr controller interaction)\r\n if (pointerId != this._lastPointerDownId) {\r\n return;\r\n }\r\n\r\n if (!this.isReadOnly) {\r\n // Invert transform\r\n this._invertTransformMatrix.transformCoordinates(coordinates.x, coordinates.y, this._transformedPosition);\r\n\r\n const x = this._transformedPosition.x;\r\n const y = this._transformedPosition.y;\r\n\r\n if (this._pointerIsDown) {\r\n this._updateValueFromPointer(x, y);\r\n }\r\n }\r\n\r\n super._onPointerMove(target, coordinates, pointerId, pi);\r\n }\r\n\r\n public override _onPointerUp(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, notifyClick: boolean, pi: PointerInfoBase): void {\r\n this._pointerIsDown = false;\r\n\r\n delete this._host._capturingControl[pointerId];\r\n super._onPointerUp(target, coordinates, pointerId, buttonIndex, notifyClick, pi);\r\n }\r\n\r\n public override _onCanvasBlur() {\r\n this._forcePointerUp();\r\n super._onCanvasBlur();\r\n }\r\n\r\n /**\r\n * This function expands the color picker by creating a color picker dialog with manual\r\n * color value input and the ability to save colors into an array to be used later in\r\n * subsequent launches of the dialogue.\r\n * @param advancedTexture defines the AdvancedDynamicTexture the dialog is assigned to\r\n * @param options defines size for dialog and options for saved colors. Also accepts last color picked as hex string and saved colors array as hex strings.\r\n * @param options.pickerWidth\r\n * @param options.pickerHeight\r\n * @param options.headerHeight\r\n * @param options.lastColor\r\n * @param options.swatchLimit\r\n * @param options.numSwatchesPerLine\r\n * @param options.savedColors\r\n * @returns picked color as a hex string and the saved colors array as hex strings.\r\n */\r\n public static async ShowPickerDialogAsync(\r\n advancedTexture: AdvancedDynamicTexture,\r\n options: {\r\n pickerWidth?: string;\r\n pickerHeight?: string;\r\n headerHeight?: string;\r\n lastColor?: string;\r\n swatchLimit?: number;\r\n numSwatchesPerLine?: number;\r\n savedColors?: Array<string>;\r\n }\r\n ): Promise<{\r\n savedColors?: string[];\r\n pickedColor: string;\r\n }> {\r\n return await new Promise((resolve) => {\r\n // Default options\r\n options.pickerWidth = options.pickerWidth || \"640px\";\r\n options.pickerHeight = options.pickerHeight || \"400px\";\r\n options.headerHeight = options.headerHeight || \"35px\";\r\n options.lastColor = options.lastColor || \"#000000\";\r\n options.swatchLimit = options.swatchLimit || 20;\r\n options.numSwatchesPerLine = options.numSwatchesPerLine || 10;\r\n\r\n // Window size settings\r\n const drawerMaxRows: number = options.swatchLimit / options.numSwatchesPerLine;\r\n const rawSwatchSize: number = parseFloat(options.pickerWidth) / options.numSwatchesPerLine;\r\n const gutterSize: number = Math.floor(rawSwatchSize * 0.25);\r\n const colGutters: number = gutterSize * (options.numSwatchesPerLine + 1);\r\n const swatchSize: number = Math.floor((parseFloat(options.pickerWidth) - colGutters) / options.numSwatchesPerLine);\r\n const drawerMaxSize: number = swatchSize * drawerMaxRows + gutterSize * (drawerMaxRows + 1);\r\n const containerSize: string = (parseInt(options.pickerHeight) + drawerMaxSize + Math.floor(swatchSize * 0.25)).toString() + \"px\";\r\n\r\n // Button Colors\r\n const buttonColor: string = \"#c0c0c0\";\r\n const buttonBackgroundColor: string = \"#535353\";\r\n const buttonBackgroundHoverColor: string = \"#414141\";\r\n const buttonBackgroundClickColor: string = \"515151\";\r\n const buttonDisabledColor: string = \"#555555\";\r\n const buttonDisabledBackgroundColor: string = \"#454545\";\r\n const currentSwatchesOutlineColor: string = \"#404040\";\r\n const luminanceLimitColor: Color3 = Color3.FromHexString(\"#dddddd\");\r\n const luminanceLimit: number = luminanceLimitColor.r + luminanceLimitColor.g + luminanceLimitColor.b;\r\n const iconColorDark: string = \"#aaaaaa\";\r\n const iconColorLight: string = \"#ffffff\";\r\n\r\n // Button settings\r\n let buttonFontSize: number;\r\n let butEdit: Button;\r\n\r\n // Input Text Colors\r\n const inputFieldLabels: string[] = [\"R\", \"G\", \"B\"];\r\n const inputTextBackgroundColor: string = \"#454545\";\r\n const inputTextColor: string = \"#f0f0f0\";\r\n\r\n // This int is used for naming swatches and serves as the index for calling them from the list\r\n let swatchNumber: number;\r\n\r\n // Menu Panel options. We need to know if the swatchDrawer exists so we can create it if needed.\r\n let swatchDrawer: Grid;\r\n let editSwatchMode: boolean = false;\r\n\r\n // Color InputText fields that will be updated upon value change\r\n let butSave: Button;\r\n let lastVal: string;\r\n let activeField: string;\r\n\r\n // Dialog menu container which will contain both the main dialogue window and the swatch drawer which opens once a color is saved.\r\n const dialogContainer: Grid = new Grid();\r\n dialogContainer.name = \"Dialog Container\";\r\n dialogContainer.width = options.pickerWidth;\r\n if (options.savedColors) {\r\n dialogContainer.height = containerSize;\r\n const topRow: number = parseInt(options.pickerHeight) / parseInt(containerSize);\r\n dialogContainer.addRowDefinition(topRow, false);\r\n dialogContainer.addRowDefinition(1.0 - topRow, false);\r\n } else {\r\n dialogContainer.height = options.pickerHeight;\r\n dialogContainer.addRowDefinition(1.0, false);\r\n }\r\n advancedTexture.addControl(dialogContainer);\r\n\r\n // Swatch drawer which contains all saved color buttons\r\n if (options.savedColors) {\r\n swatchDrawer = new Grid();\r\n swatchDrawer.name = \"Swatch Drawer\";\r\n swatchDrawer.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\r\n swatchDrawer.background = buttonBackgroundColor;\r\n swatchDrawer.width = options.pickerWidth!;\r\n const initialRows: number = options.savedColors.length / options.numSwatchesPerLine;\r\n let gutterCount: number;\r\n if (initialRows == 0) {\r\n gutterCount = 0;\r\n } else {\r\n gutterCount = initialRows + 1;\r\n }\r\n swatchDrawer.height = (swatchSize * initialRows + gutterCount * gutterSize).toString() + \"px\";\r\n swatchDrawer.top = Math.floor(swatchSize * 0.25).toString() + \"px\";\r\n for (let i = 0; i < Math.ceil(options.savedColors.length / options.numSwatchesPerLine) * 2 + 1; i++) {\r\n if (i % 2 != 0) {\r\n swatchDrawer.addRowDefinition(swatchSize, true);\r\n } else {\r\n swatchDrawer.addRowDefinition(gutterSize, true);\r\n }\r\n }\r\n for (let i = 0; i < options.numSwatchesPerLine * 2 + 1; i++) {\r\n if (i % 2 != 0) {\r\n swatchDrawer.addColumnDefinition(swatchSize, true);\r\n } else {\r\n swatchDrawer.addColumnDefinition(gutterSize, true);\r\n }\r\n }\r\n dialogContainer.addControl(swatchDrawer, 1, 0);\r\n }\r\n\r\n // Picker container\r\n const pickerPanel: Grid = new Grid();\r\n pickerPanel.name = \"Picker Panel\";\r\n pickerPanel.height = options.pickerHeight;\r\n const panelHead: number = parseInt(options.headerHeight) / parseInt(options.pickerHeight);\r\n const pickerPanelRows: number[] = [panelHead, 1.0 - panelHead];\r\n pickerPanel.addRowDefinition(pickerPanelRows[0], false);\r\n pickerPanel.addRowDefinition(pickerPanelRows[1], false);\r\n dialogContainer.addControl(pickerPanel, 0, 0);\r\n\r\n // Picker container header\r\n const header: Rectangle = new Rectangle();\r\n header.name = \"Dialogue Header Bar\";\r\n header.background = \"#cccccc\";\r\n header.thickness = 0;\r\n pickerPanel.addControl(header, 0, 0);\r\n\r\n // Header close button\r\n const closeButton: Button = Button.CreateSimpleButton(\"closeButton\", \"a\");\r\n closeButton.fontFamily = \"coreglyphs\";\r\n const headerColor3: Color3 = Color3.FromHexString(header.background);\r\n const closeIconColor = new Color3(1.0 - headerColor3.r, 1.0 - headerColor3.g, 1.0 - headerColor3.b);\r\n closeButton.color = closeIconColor.toHexString();\r\n closeButton.fontSize = Math.floor(parseInt(options.headerHeight) * 0.6);\r\n closeButton.textBlock!.textVerticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER;\r\n closeButton.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_RIGHT;\r\n closeButton.height = closeButton.width = options.headerHeight;\r\n closeButton.background = header.background;\r\n closeButton.thickness = 0;\r\n closeButton.pointerDownAnimation = () => {};\r\n closeButton.pointerUpAnimation = () => {\r\n closeButton.background = header.background;\r\n };\r\n closeButton.pointerEnterAnimation = () => {\r\n closeButton.color = header.background;\r\n closeButton.background = \"red\";\r\n };\r\n closeButton.pointerOutAnimation = () => {\r\n closeButton.color = closeIconColor.toHexString();\r\n closeButton.background = header.background;\r\n };\r\n closeButton.onPointerClickObservable.add(() => {\r\n closePicker(currentSwatch.background);\r\n });\r\n pickerPanel.addControl(closeButton, 0, 0);\r\n\r\n // Dialog container body\r\n const dialogBody: Grid = new Grid();\r\n dialogBody.name = \"Dialogue Body\";\r\n dialogBody.background = buttonBackgroundColor;\r\n const dialogBodyCols: number[] = [0.4375, 0.5625];\r\n dialogBody.addRowDefinition(1.0, false);\r\n dialogBody.addColumnDefinition(dialogBodyCols[0], false);\r\n dialogBody.addColumnDefinition(dialogBodyCols[1], false);\r\n pickerPanel.addControl(dialogBody, 1, 0);\r\n\r\n // Picker grid\r\n const pickerGrid: Grid = new Grid();\r\n pickerGrid.name = \"Picker Grid\";\r\n pickerGrid.addRowDefinition(0.85, false);\r\n pickerGrid.addRowDefinition(0.15, false);\r\n dialogBody.addControl(pickerGrid, 0, 0);\r\n\r\n // Picker control\r\n const picker = new ColorPicker();\r\n picker.name = \"GUI Color Picker\";\r\n if (options.pickerHeight < options.pickerWidth) {\r\n picker.width = 0.89;\r\n } else {\r\n picker.height = 0.89;\r\n }\r\n picker.value = Color3.FromHexString(options.lastColor);\r\n picker.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;\r\n picker.verticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER;\r\n picker.onPointerDownObservable.add(() => {\r\n activeField = picker.name!;\r\n lastVal = \"\";\r\n editSwatches(false);\r\n });\r\n picker.onValueChangedObservable.add(function (value) {\r\n // value is a color3\r\n if (activeField == picker.name) {\r\n updateValues(value, picker.name);\r\n }\r\n });\r\n pickerGrid.addControl(picker, 0, 0);\r\n\r\n // Picker body right quarant\r\n const pickerBodyRight: Grid = new Grid();\r\n pickerBodyRight.name = \"Dialogue Right Half\";\r\n pickerBodyRight.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n const pickerBodyRightRows: number[] = [0.514, 0.486];\r\n pickerBodyRight.addRowDefinition(pickerBodyRightRows[0], false);\r\n pickerBodyRight.addRowDefinition(pickerBodyRightRows[1], false);\r\n dialogBody.addControl(pickerBodyRight, 1, 1);\r\n\r\n // Picker container swatches and buttons\r\n const pickerSwatchesButtons: Grid = new Grid();\r\n pickerSwatchesButtons.name = \"Swatches and Buttons\";\r\n const pickerButtonsCol: number[] = [0.417, 0.583];\r\n pickerSwatchesButtons.addRowDefinition(1.0, false);\r\n pickerSwatchesButtons.addColumnDefinition(pickerButtonsCol[0], false);\r\n pickerSwatchesButtons.addColumnDefinition(pickerButtonsCol[1], false);\r\n pickerBodyRight.addControl(pickerSwatchesButtons, 0, 0);\r\n\r\n // Picker Swatches quadrant\r\n const pickerSwatches: Grid = new Grid();\r\n pickerSwatches.name = \"New and Current Swatches\";\r\n const pickeSwatchesRows: number[] = [0.04, 0.16, 0.64, 0.16];\r\n pickerSwatches.addRowDefinition(pickeSwatchesRows[0], false);\r\n pickerSwatches.addRowDefinition(pickeSwatchesRows[1], false);\r\n pickerSwatches.addRowDefinition(pickeSwatchesRows[2], false);\r\n pickerSwatches.addRowDefinition(pickeSwatchesRows[3], false);\r\n pickerSwatchesButtons.addControl(pickerSwatches, 0, 0);\r\n\r\n // Active swatches\r\n const activeSwatches: Grid = new Grid();\r\n activeSwatches.name = \"Active Swatches\";\r\n activeSwatches.width = 0.67;\r\n activeSwatches.addRowDefinition(0.5, false);\r\n activeSwatches.addRowDefinition(0.5, false);\r\n pickerSwatches.addControl(activeSwatches, 2, 0);\r\n\r\n const labelWidth: number = Math.floor(parseInt(options.pickerWidth) * dialogBodyCols[1] * pickerButtonsCol[0] * 0.11);\r\n const labelHeight: number = Math.floor(parseInt(options.pickerHeight) * pickerPanelRows[1] * pickerBodyRightRows[0] * pickeSwatchesRows[1] * 0.5);\r\n\r\n let labelTextSize: number;\r\n if (options.pickerWidth > options.pickerHeight) {\r\n labelTextSize = labelHeight;\r\n } else {\r\n labelTextSize = labelWidth;\r\n }\r\n // New color swatch and previous color button\r\n const newText: TextBlock = new TextBlock();\r\n newText.text = \"new\";\r\n newText.name = \"New Color Label\";\r\n newText.color = buttonColor;\r\n newText.fontSize = labelTextSize;\r\n pickerSwatches.addControl(newText, 1, 0);\r\n\r\n const newSwatch = new Rectangle();\r\n newSwatch.name = \"New Color Swatch\";\r\n newSwatch.background = options.lastColor;\r\n newSwatch.thickness = 0;\r\n activeSwatches.addControl(newSwatch, 0, 0);\r\n\r\n const currentSwatch: Button = Button.CreateSimpleButton(\"currentSwatch\", \"\");\r\n currentSwatch.background = options.lastColor;\r\n currentSwatch.thickness = 0;\r\n currentSwatch.onPointerClickObservable.add(() => {\r\n const revertColor = Color3.FromHexString(currentSwatch.background);\r\n updateValues(revertColor, currentSwatch.name!);\r\n editSwatches(false);\r\n });\r\n currentSwatch.pointerDownAnimation = () => {};\r\n currentSwatch.pointerUpAnimation = () => {};\r\n currentSwatch.pointerEnterAnimation = () => {};\r\n currentSwatch.pointerOutAnimation = () => {};\r\n activeSwatches.addControl(currentSwatch, 1, 0);\r\n\r\n const swatchOutline: Rectangle = new Rectangle();\r\n swatchOutline.name = \"Swatch Outline\";\r\n swatchOutline.width = 0.67;\r\n swatchOutline.thickness = 2;\r\n swatchOutline.color = currentSwatchesOutlineColor;\r\n swatchOutline.isHitTestVisible = false;\r\n pickerSwatches.addControl(swatchOutline, 2, 0);\r\n\r\n const currentText: TextBlock = new TextBlock();\r\n currentText.name = \"Current Color Label\";\r\n currentText.text = \"current\";\r\n currentText.color = buttonColor;\r\n currentText.fontSize = labelTextSize;\r\n pickerSwatches.addControl(currentText, 3, 0);\r\n\r\n // Buttons grid\r\n const buttonGrid: Grid = new Grid();\r\n buttonGrid.name = \"Button Grid\";\r\n buttonGrid.height = 0.8;\r\n const buttonGridRows: number = 1 / 3;\r\n buttonGrid.addRowDefinition(buttonGridRows, false);\r\n buttonGrid.addRowDefinition(buttonGridRows, false);\r\n buttonGrid.addRowDefinition(buttonGridRows, false);\r\n pickerSwatchesButtons.addControl(buttonGrid, 0, 1);\r\n\r\n // Determine pixel width and height for all buttons from overall panel dimensions\r\n const buttonWidth = Math.floor(parseInt(options.pickerWidth) * dialogBodyCols[1] * pickerButtonsCol[1] * 0.67).toString() + \"px\";\r\n const buttonHeight =\r\n Math.floor(\r\n parseInt(options.pickerHeight) * pickerPanelRows[1] * pickerBodyRightRows[0] * (parseFloat(buttonGrid.height.toString()) / 100) * buttonGridRows * 0.7\r\n ).toString() + \"px\";\r\n\r\n // Determine button type size\r\n if (parseFloat(buttonWidth) > parseFloat(buttonHeight)) {\r\n buttonFontSize = Math.floor(parseFloat(buttonHeight) * 0.45);\r\n } else {\r\n buttonFontSize = Math.floor(parseFloat(buttonWidth) * 0.11);\r\n }\r\n\r\n // Panel Buttons\r\n const butOK: Button = Button.CreateSimpleButton(\"butOK\", \"OK\");\r\n butOK.width = buttonWidth;\r\n butOK.height = buttonHeight;\r\n butOK.verticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER;\r\n butOK.thickness = 2;\r\n butOK.color = buttonColor;\r\n butOK.fontSize = buttonFontSize;\r\n butOK.background = buttonBackgroundColor;\r\n butOK.onPointerEnterObservable.add(() => {\r\n butOK.background = buttonBackgroundHoverColor;\r\n });\r\n butOK.onPointerOutObservable.add(() => {\r\n butOK.background = buttonBackgroundColor;\r\n });\r\n butOK.pointerDownAnimation = () => {\r\n butOK.background = buttonBackgroundClickColor;\r\n };\r\n butOK.pointerUpAnimation = () => {\r\n butOK.background = buttonBackgroundHoverColor;\r\n };\r\n butOK.onPointerClickObservable.add(() => {\r\n editSwatches(false);\r\n closePicker(newSwatch.background);\r\n });\r\n buttonGrid.addControl(butOK, 0, 0);\r\n\r\n const butCancel: Button = Button.CreateSimpleButton(\"butCancel\", \"Cancel\");\r\n butCancel.width = buttonWidth;\r\n butCancel.height = buttonHeight;\r\n butCancel.verticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER;\r\n butCancel.thickness = 2;\r\n butCancel.color = buttonColor;\r\n butCancel.fontSize = buttonFontSize;\r\n butCancel.background = buttonBackgroundColor;\r\n butCancel.onPointerEnterObservable.add(() => {\r\n butCancel.background = buttonBackgroundHoverColor;\r\n });\r\n butCancel.onPointerOutObservable.add(() => {\r\n butCancel.background = buttonBackgroundColor;\r\n });\r\n butCancel.pointerDownAnimation = () => {\r\n butCancel.background = buttonBackgroundClickColor;\r\n };\r\n butCancel.pointerUpAnimation = () => {\r\n butCancel.background = buttonBackgroundHoverColor;\r\n };\r\n butCancel.onPointerClickObservable.add(() => {\r\n editSwatches(false);\r\n closePicker(currentSwatch.background);\r\n });\r\n buttonGrid.addControl(butCancel, 1, 0);\r\n\r\n if (options.savedColors) {\r\n butSave = Button.CreateSimpleButton(\"butSave\", \"Save\");\r\n butSave.width = buttonWidth;\r\n butSave.height = buttonHeight;\r\n butSave.verticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER;\r\n butSave.thickness = 2;\r\n butSave.fontSize = buttonFontSize;\r\n if (options.savedColors.length < options.swatchLimit) {\r\n butSave.color = buttonColor;\r\n butSave.background = buttonBackgroundColor;\r\n } else {\r\n disableButton(butSave, true);\r\n }\r\n butSave.onPointerEnterObservable.add(() => {\r\n if (options.savedColors) {\r\n if (options.savedColors.length < options.swatchLimit!) {\r\n butSave.background = buttonBackgroundHoverColor;\r\n }\r\n }\r\n });\r\n butSave.onPointerOutObservable.add(() => {\r\n if (options.savedColors) {\r\n if (options.savedColors.length < options.swatchLimit!) {\r\n butSave.background = buttonBackgroundColor;\r\n }\r\n }\r\n });\r\n butSave.pointerDownAnimation = () => {\r\n if (options.savedColors) {\r\n if (options.savedColors.length < options.swatchLimit!) {\r\n butSave.background = buttonBackgroundClickColor;\r\n }\r\n }\r\n };\r\n butSave.pointerUpAnimation = () => {\r\n if (options.savedColors) {\r\n if (options.savedColors.length < options.swatchLimit!) {\r\n butSave.background = buttonBackgroundHoverColor;\r\n }\r\n }\r\n };\r\n butSave.onPointerClickObservable.add(() => {\r\n if (options.savedColors) {\r\n if (options.savedColors.length == 0) {\r\n setEditButtonVisibility(true);\r\n }\r\n if (options.savedColors.length < options.swatchLimit!) {\r\n updateSwatches(newSwatch.background, butSave);\r\n }\r\n editSwatches(false);\r\n }\r\n });\r\n if (options.savedColors.length > 0) {\r\n setEditButtonVisibility(true);\r\n }\r\n buttonGrid.addControl(butSave, 2, 0);\r\n }\r\n\r\n // Picker color values input\r\n const pickerColorValues: Grid = new Grid();\r\n pickerColorValues.name = \"Dialog Lower Right\";\r\n pickerColorValues.addRowDefinition(0.02, false);\r\n pickerColorValues.addRowDefinition(0.63, false);\r\n pickerColorValues.addRowDefinition(0.21, false);\r\n pickerColorValues.addRowDefinition(0.14, false);\r\n pickerBodyRight.addControl(pickerColorValues, 1, 0);\r\n\r\n // RGB values text boxes\r\n const currentColor = Color3.FromHexString(options.lastColor);\r\n const rgbValuesQuadrant: Grid = new Grid();\r\n rgbValuesQuadrant.name = \"RGB Values\";\r\n rgbValuesQuadrant.width = 0.82;\r\n rgbValuesQuadrant.verticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER;\r\n rgbValuesQuadrant.addRowDefinition(1 / 3, false);\r\n rgbValuesQuadrant.addRowDefinition(1 / 3, false);\r\n rgbValuesQuadrant.addRowDefinition(1 / 3, false);\r\n rgbValuesQuadrant.addColumnDefinition(0.1, false);\r\n rgbValuesQuadrant.addColumnDefinition(0.2, false);\r\n rgbValuesQuadrant.addColumnDefinition(0.7, false);\r\n pickerColorValues.addControl(rgbValuesQuadrant, 1, 0);\r\n\r\n for (let i = 0; i < inputFieldLabels.length; i++) {\r\n const labelText: TextBlock = new TextBlock();\r\n labelText.text = inputFieldLabels[i];\r\n labelText.color = buttonColor;\r\n labelText.fontSize = buttonFontSize;\r\n rgbValuesQuadrant.addControl(labelText, i, 0);\r\n }\r\n\r\n // Input fields for RGB values\r\n const rValInt = new InputText();\r\n rValInt.width = 0.83;\r\n rValInt.height = 0.72;\r\n rValInt.name = \"rIntField\";\r\n rValInt.fontSize = buttonFontSize;\r\n rValInt.text = (currentColor.r * 255).toString();\r\n rValInt.color = inputTextColor;\r\n rValInt.background = inputTextBackgroundColor;\r\n rValInt.onFocusObservable.add(() => {\r\n activeField = rValInt.name!;\r\n lastVal = rValInt.text;\r\n editSwatches(false);\r\n });\r\n rValInt.onBlurObservable.add(() => {\r\n if (rValInt.text == \"\") {\r\n rValInt.text = \"0\";\r\n }\r\n updateInt(rValInt, \"r\");\r\n if (activeField == rValInt.name) {\r\n activeField = \"\";\r\n }\r\n });\r\n rValInt.onTextChangedObservable.add(() => {\r\n if (activeField == rValInt.name) {\r\n updateInt(rValInt, \"r\");\r\n }\r\n });\r\n rgbValuesQuadrant.addControl(rValInt, 0, 1);\r\n\r\n const gValInt = new InputText();\r\n gValInt.width = 0.83;\r\n gValInt.height = 0.72;\r\n gValInt.name = \"gIntField\";\r\n gValInt.fontSize = buttonFontSize;\r\n gValInt.text = (currentColor.g * 255).toString();\r\n gValInt.color = inputTextColor;\r\n gValInt.background = inputTextBackgroundColor;\r\n gValInt.onFocusObservable.add(() => {\r\n activeField = gValInt.name!;\r\n lastVal = gValInt.text;\r\n editSwatches(false);\r\n });\r\n gValInt.onBlurObservable.add(() => {\r\n if (gValInt.text == \"\") {\r\n gValInt.text = \"0\";\r\n }\r\n updateInt(gValInt, \"g\");\r\n if (activeField == gValInt.name) {\r\n activeField = \"\";\r\n }\r\n });\r\n gValInt.onTextChangedObservable.add(() => {\r\n if (activeField == gValInt.name) {\r\n updateInt(gValInt, \"g\");\r\n }\r\n });\r\n rgbValuesQuadrant.addControl(gValInt, 1, 1);\r\n\r\n const bValInt = new InputText();\r\n bValInt.width = 0.83;\r\n bValInt.height = 0.72;\r\n bValInt.name = \"bIntField\";\r\n bValInt.fontSize = buttonFontSize;\r\n bValInt.text = (currentColor.b * 255).toString();\r\n bValInt.color = inputTextColor;\r\n bValInt.background = inputTextBackgroundColor;\r\n bValInt.onFocusObservable.add(() => {\r\n activeField = bValInt.name!;\r\n lastVal = bValInt.text;\r\n editSwatches(false);\r\n });\r\n bValInt.onBlurObservable.add(() => {\r\n if (bValInt.text == \"\") {\r\n bValInt.text = \"0\";\r\n }\r\n updateInt(bValInt, \"b\");\r\n if (activeField == bValInt.name) {\r\n activeField = \"\";\r\n }\r\n });\r\n bValInt.onTextChangedObservable.add(() => {\r\n if (activeField == bValInt.name) {\r\n updateInt(bValInt, \"b\");\r\n }\r\n });\r\n rgbValuesQuadrant.addControl(bValInt, 2, 1);\r\n\r\n const rValDec = new InputText();\r\n rValDec.width = 0.95;\r\n rValDec.height = 0.72;\r\n rValDec.name = \"rDecField\";\r\n rValDec.fontSize = buttonFontSize;\r\n rValDec.text = currentColor.r.toString();\r\n rValDec.color = inputTextColor;\r\n rValDec.background = inputTextBackgroundColor;\r\n rValDec.onFocusObservable.add(() => {\r\n activeField = rValDec.name!;\r\n lastVal = rValDec.text;\r\n editSwatches(false);\r\n });\r\n rValDec.onBlurObservable.add(() => {\r\n if (parseFloat(rValDec.text) == 0 || rValDec.text == \"\") {\r\n rValDec.text = \"0\";\r\n updateFloat(rValDec, \"r\");\r\n }\r\n if (activeField == rValDec.name) {\r\n activeField = \"\";\r\n }\r\n });\r\n rValDec.onTextChangedObservable.add(() => {\r\n if (activeField == rValDec.name) {\r\n updateFloat(rValDec, \"r\");\r\n }\r\n });\r\n rgbValuesQuadrant.addControl(rValDec, 0, 2);\r\n\r\n const gValDec = new InputText();\r\n gValDec.width = 0.95;\r\n gValDec.height = 0.72;\r\n gValDec.name = \"gDecField\";\r\n gValDec.fontSize = buttonFontSize;\r\n gValDec.text = currentColor.g.toString();\r\n gValDec.color = inputTextColor;\r\n gValDec.background = inputTextBackgroundColor;\r\n gValDec.onFocusObservable.add(() => {\r\n activeField = gValDec.name!;\r\n lastVal = gValDec.text;\r\n editSwatches(false);\r\n });\r\n gValDec.onBlurObservable.add(() => {\r\n if (parseFloat(gValDec.text) == 0 || gValDec.text == \"\") {\r\n gValDec.text = \"0\";\r\n updateFloat(gValDec, \"g\");\r\n }\r\n if (activeField == gValDec.name) {\r\n activeField = \"\";\r\n }\r\n });\r\n gValDec.onTextChangedObservable.add(() => {\r\n if (activeField == gValDec.name) {\r\n updateFloat(gValDec, \"g\");\r\n }\r\n });\r\n rgbValuesQuadrant.addControl(gValDec, 1, 2);\r\n\r\n const bValDec = new InputText();\r\n bValDec.width = 0.95;\r\n bValDec.height = 0.72;\r\n bValDec.name = \"bDecField\";\r\n bValDec.fontSize = buttonFontSize;\r\n bValDec.text = currentColor.b.toString();\r\n bValDec.color = inputTextColor;\r\n bValDec.background = inputTextBackgroundColor;\r\n bValDec.onFocusObservable.add(() => {\r\n activeField = bValDec.name!;\r\n lastVal = bValDec.text;\r\n editSwatches(false);\r\n });\r\n bValDec.onBlurObservable.add(() => {\r\n if (parseFloat(bValDec.text) == 0 || bValDec.text == \"\") {\r\n bValDec.text = \"0\";\r\n updateFloat(bValDec, \"b\");\r\n }\r\n if (activeField == bValDec.name) {\r\n activeField = \"\";\r\n }\r\n });\r\n bValDec.onTextChangedObservable.add(() => {\r\n if (activeField == bValDec.name) {\r\n updateFloat(bValDec, \"b\");\r\n }\r\n });\r\n rgbValuesQuadrant.addControl(bValDec, 2, 2);\r\n\r\n // Hex value input\r\n const hexValueQuadrant: Grid = new Grid();\r\n hexValueQuadrant.name = \"Hex Value\";\r\n hexValueQuadrant.width = 0.82;\r\n hexValueQuadrant.addRowDefinition(1.0, false);\r\n hexValueQuadrant.addColumnDefinition(0.1, false);\r\n hexValueQuadrant.addColumnDefinition(0.9, false);\r\n pickerColorValues.addControl(hexValueQuadrant, 2, 0);\r\n\r\n const labelText: TextBlock = new TextBlock();\r\n labelText.text = \"#\";\r\n labelText.color = buttonColor;\r\n labelText.fontSize = buttonFontSize;\r\n hexValueQuadrant.addControl(labelText, 0, 0);\r\n\r\n const hexVal = new InputText();\r\n hexVal.width = 0.96;\r\n hexVal.height = 0.72;\r\n hexVal.name = \"hexField\";\r\n hexVal.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;\r\n hexVal.fontSize = buttonFontSize;\r\n const minusPound = options.lastColor.split(\"#\");\r\n hexVal.text = minusPound[1];\r\n hexVal.color = inputTextColor;\r\n hexVal.background = inputTextBackgroundColor;\r\n hexVal.onFocusObservable.add(() => {\r\n activeField = hexVal.name!;\r\n lastVal = hexVal.text;\r\n editSwatches(false);\r\n });\r\n hexVal.onBlurObservable.add(() => {\r\n if (hexVal.text.length == 3) {\r\n const val = hexVal.text.split(\"\");\r\n hexVal.text = val[0] + val[0] + val[1] + val[1] + val[2] + val[2];\r\n }\r\n if (hexVal.text == \"\") {\r\n hexVal.text = \"000000\";\r\n updateValues(Color3.FromHexString(hexVal.text), \"b\");\r\n }\r\n if (activeField == hexVal.name) {\r\n activeField = \"\";\r\n }\r\n });\r\n hexVal.onTextChangedObservable.add(() => {\r\n let newHexValue: string = hexVal.text;\r\n const checkHex: boolean = /[^0-9A-F]/i.test(newHexValue);\r\n if ((hexVal.text.length > 6 || checkHex) && activeField == hexVal.name) {\r\n hexVal.text = lastVal;\r\n } else {\r\n if (hexVal.text.length < 6) {\r\n const leadingZero: number = 6 - hexVal.text.length;\r\n for (let i = 0; i < leadingZero; i++) {\r\n newHexValue = \"0\" + newHexValue;\r\n }\r\n }\r\n if (hexVal.text.length == 3) {\r\n const val: string[] = hexVal.text.split(\"\");\r\n newHexValue = val[0] + val[0] + val[1] + val[1] + val[2] + val[2];\r\n }\r\n newHexValue = \"#\" + newHexValue;\r\n if (activeField == hexVal.name) {\r\n lastVal = hexVal.text;\r\n updateValues(Color3.FromHexString(newHexValue), hexVal.name);\r\n }\r\n }\r\n });\r\n hexValueQuadrant.addControl(hexVal, 0, 1);\r\n\r\n if (options.savedColors && options.savedColors.length > 0) {\r\n updateSwatches(\"\", butSave!);\r\n }\r\n\r\n /**\r\n * Will update all values for InputText and ColorPicker controls based on the BABYLON.Color3 passed to this function.\r\n * Each InputText control and the ColorPicker control will be tested to see if they are the activeField and if they\r\n * are will receive no update. This is to prevent the input from the user being overwritten.\r\n * @param value\r\n * @param inputField\r\n */\r\n function updateValues(value: Color3, inputField: string) {\r\n activeField = inputField;\r\n const pickedColor: string = value.toHexString();\r\n newSwatch.background = pickedColor;\r\n if (rValInt.name != activeField) {\r\n rValInt.text = Math.floor(value.r * 255).toString();\r\n }\r\n if (gValInt.name != activeField) {\r\n gValInt.text = Math.floor(value.g * 255).toString();\r\n }\r\n if (bValInt.name != activeField) {\r\n bValInt.text = Math.floor(value.b * 255).toString();\r\n }\r\n if (rValDec.name != activeField) {\r\n rValDec.text = value.r.toString();\r\n }\r\n if (gValDec.name != activeField) {\r\n gValDec.text = value.g.toString();\r\n }\r\n if (bValDec.name != activeField) {\r\n bValDec.text = value.b.toString();\r\n }\r\n if (hexVal.name != activeField) {\r\n const minusPound: string[] = pickedColor.split(\"#\");\r\n hexVal.text = minusPound[1];\r\n }\r\n if (picker.name != activeField) {\r\n picker.value = value;\r\n }\r\n }\r\n\r\n // When the user enters an integer for R, G, or B we check to make sure it is a valid number and replace if not.\r\n function updateInt(field: InputText, channel: string) {\r\n let newValue: string = field.text;\r\n const checkVal: boolean = /[^0-9]/g.test(newValue);\r\n if (checkVal) {\r\n field.text = lastVal;\r\n return;\r\n } else {\r\n if (newValue != \"\") {\r\n if (Math.floor(parseInt(newValue)) < 0) {\r\n newValue = \"0\";\r\n } else if (Math.floor(parseInt(newValue)) > 255) {\r\n newValue = \"255\";\r\n } else if (isNaN(parseInt(newValue))) {\r\n newValue = \"0\";\r\n }\r\n }\r\n if (activeField == field.name) {\r\n lastVal = newValue;\r\n }\r\n }\r\n if (newValue != \"\") {\r\n newValue = parseInt(newValue).toString();\r\n field.text = newValue;\r\n const newSwatchRGB: Color3 = Color3.FromHexString(newSwatch.background);\r\n if (activeField == field.name) {\r\n if (channel == \"r\") {\r\n updateValues(new Color3(parseInt(newValue) / 255, newSwatchRGB.g, newSwatchRGB.b), field.name);\r\n } else if (channel == \"g\") {\r\n updateValues(new Color3(newSwatchRGB.r, parseInt(newValue) / 255, newSwatchRGB.b), field.name);\r\n } else {\r\n updateValues(new Color3(newSwatchRGB.r, newSwatchRGB.g, parseInt(newValue) / 255), field.name);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // When the user enters a float for R, G, or B we check to make sure it is a valid number and replace if not.\r\n function updateFloat(field: InputText, channel: string) {\r\n let newValue: string = field.text;\r\n const checkVal: boolean = /[^0-9.]/g.test(newValue);\r\n if (checkVal) {\r\n field.text = lastVal;\r\n return;\r\n } else {\r\n if (newValue != \"\" && newValue != \".\" && parseFloat(newValue) != 0) {\r\n if (parseFloat(newValue) < 0.0) {\r\n newValue = \"0.0\";\r\n } else if (parseFloat(newValue) > 1.0) {\r\n newValue = \"1.0\";\r\n } else if (isNaN(parseFloat(newValue))) {\r\n newValue = \"0.0\";\r\n }\r\n }\r\n if (activeField == field.name) {\r\n lastVal = newValue;\r\n }\r\n }\r\n if (newValue != \"\" && newValue != \".\" && parseFloat(newValue) != 0) {\r\n newValue = parseFloat(newValue).toString();\r\n field.text = newValue;\r\n } else {\r\n newValue = \"0.0\";\r\n }\r\n const newSwatchRGB = Color3.FromHexString(newSwatch.background);\r\n if (activeField == field.name) {\r\n if (channel == \"r\") {\r\n updateValues(new Color3(parseFloat(newValue), newSwatchRGB.g, newSwatchRGB.b), field.name);\r\n } else if (channel == \"g\") {\r\n updateValues(new Color3(newSwatchRGB.r, parseFloat(newValue), newSwatchRGB.b), field.name);\r\n } else {\r\n updateValues(new Color3(newSwatchRGB.r, newSwatchRGB.g, parseFloat(newValue)), field.name);\r\n }\r\n }\r\n }\r\n\r\n // Removes the current index from the savedColors array. Drawer can then be regenerated.\r\n function deleteSwatch(index: number) {\r\n if (options.savedColors) {\r\n options.savedColors.splice(index, 1);\r\n }\r\n if (options.savedColors && options.savedColors.length == 0) {\r\n setEditButtonVisibility(false);\r\n editSwatchMode = false;\r\n }\r\n }\r\n\r\n // Creates and styles an individual swatch when updateSwatches is called.\r\n function createSwatch() {\r\n if (options.savedColors && options.savedColors[swatchNumber]) {\r\n let icon: string;\r\n if (editSwatchMode) {\r\n icon = \"b\";\r\n } else {\r\n icon = \"\";\r\n }\r\n const swatch: Button = Button.CreateSimpleButton(\"Swatch_\" + swatchNumber, icon);\r\n swatch.fontFamily = \"coreglyphs\";\r\n const swatchColor: Color3 = Color3.FromHexString(options.savedColors[swatchNumber]);\r\n const swatchLuminence: number = swatchColor.r + swatchColor.g + swatchColor.b;\r\n\r\n // Set color of outline and textBlock based on luminance of the color swatch so feedback always visible\r\n if (swatchLuminence > luminanceLimit) {\r\n swatch.color = iconColorDark;\r\n } else {\r\n swatch.color = iconColorLight;\r\n }\r\n swatch.fontSize = Math.floor(swatchSize * 0.7);\r\n swatch.textBlock!.verticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER;\r\n swatch.height = swatch.width = swatchSize.toString() + \"px\";\r\n swatch.background = options.savedColors[swatchNumber];\r\n swatch.thickness = 2;\r\n const metadata = swatchNumber;\r\n swatch.pointerDownAnimation = () => {\r\n swatch.thickness = 4;\r\n };\r\n swatch.pointerUpAnimation = () => {\r\n swatch.thickness = 3;\r\n };\r\n swatch.pointerEnterAnimation = () => {\r\n swatch.thickness = 3;\r\n };\r\n swatch.pointerOutAnimation = () => {\r\n swatch.thickness = 2;\r\n };\r\n swatch.onPointerClickObservable.add(() => {\r\n if (!editSwatchMode) {\r\n if (options.savedColors) {\r\n updateValues(Color3.FromHexString(options.savedColors[metadata]), swatch.name!);\r\n }\r\n } else {\r\n deleteSwatch(metadata);\r\n updateSwatches(\"\", butSave);\r\n }\r\n });\r\n return swatch;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n // Mode switch to render button text and close symbols on swatch controls\r\n function editSwatches(mode?: boolean) {\r\n if (mode !== undefined) {\r\n editSwatchMode = mode;\r\n }\r\n let thisButton: Button;\r\n if (editSwatchMode) {\r\n for (let i = 0; i < swatchDrawer.children.length; i++) {\r\n thisButton = swatchDrawer.children[i] as Button;\r\n thisButton.textBlock!.text = \"b\";\r\n }\r\n if (butEdit !== undefined) {\r\n butEdit.textBlock!.text = \"Done\";\r\n }\r\n } else {\r\n for (let i = 0; i < swatchDrawer.children.length; i++) {\r\n thisButton = swatchDrawer.children[i] as Button;\r\n thisButton.textBlock!.text = \"\";\r\n }\r\n if (butEdit !== undefined) {\r\n butEdit.textBlock!.text = \"Edit\";\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * When Save Color button is pressed this function will first create a swatch drawer if one is not already\r\n * made. Then all controls are removed from the drawer and we step through the savedColors array and\r\n * creates one swatch per color. It will also set the height of the drawer control based on how many\r\n * saved colors there are and how many can be stored per row.\r\n * @param color\r\n * @param button\r\n */\r\n function updateSwatches(color: string, button: Button) {\r\n if (options.savedColors) {\r\n if (color != \"\") {\r\n options.savedColors.push(color);\r\n }\r\n swatchNumber = 0;\r\n swatchDrawer.clearControls();\r\n const rowCount: number = Math.ceil(options.savedColors.length / options.numSwatchesPerLine!);\r\n let gutterCount: number;\r\n if (rowCount == 0) {\r\n gutterCount = 0;\r\n } else {\r\n gutterCount = rowCount + 1;\r\n }\r\n if (swatchDrawer.rowCount != rowCount + gutterCount) {\r\n const currentRows: number = swatchDrawer.rowCount;\r\n for (let i = 0; i < currentRows; i++) {\r\n swatchDrawer.removeRowDefinition(0);\r\n }\r\n for (let i = 0; i < rowCount + gutterCount; i++) {\r\n if (i % 2) {\r\n swatchDrawer.addRowDefinition(swatchSize, true);\r\n } else {\r\n swatchDrawer.addRowDefinition(gutterSize, true);\r\n }\r\n }\r\n }\r\n swatchDrawer.height = (swatchSize * rowCount + gutterCount * gutterSize).toString() + \"px\";\r\n\r\n for (let y = 1, thisRow = 1; y < rowCount + gutterCount; y += 2, thisRow++) {\r\n // Determine number of buttons to create per row based on the button limit per row and number of saved colors\r\n let totalButtonsThisRow: number;\r\n if (options.savedColors.length > thisRow * options.numSwatchesPerLine!) {\r\n totalButtonsThisRow = options.numSwatchesPerLine!;\r\n } else {\r\n totalButtonsThisRow = options.savedColors.length - (thisRow - 1) * options.numSwatchesPerLine!;\r\n }\r\n const buttonIterations: number = Math.min(Math.max(totalButtonsThisRow, 0), options.numSwatchesPerLine!);\r\n for (let x = 0, w = 1; x < buttonIterations; x++) {\r\n if (x > options.numSwatchesPerLine!) {\r\n continue;\r\n }\r\n const swatch: Button | null = createSwatch();\r\n if (swatch != null) {\r\n swatchDrawer.addControl(swatch, y, w);\r\n w += 2;\r\n swatchNumber++;\r\n } else {\r\n continue;\r\n }\r\n }\r\n }\r\n if (options.savedColors.length >= options.swatchLimit!) {\r\n disableButton(button, true);\r\n } else {\r\n disableButton(button, false);\r\n }\r\n }\r\n }\r\n\r\n // Shows or hides edit swatches button depending on if there are saved swatches\r\n function setEditButtonVisibility(enableButton: boolean) {\r\n if (enableButton) {\r\n butEdit = Button.CreateSimpleButton(\"butEdit\", \"Edit\");\r\n butEdit.width = buttonWidth;\r\n butEdit.height = buttonHeight;\r\n butEdit.left = Math.floor(parseInt(buttonWidth) * 0.1).toString() + \"px\";\r\n butEdit.top = (parseFloat(butEdit.left) * -1).toString() + \"px\";\r\n butEdit.verticalAlignment = Control.VERTICAL_ALIGNMENT_BOTTOM;\r\n butEdit.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n butEdit.thickness = 2;\r\n butEdit.color = buttonColor;\r\n butEdit.fontSize = buttonFontSize;\r\n butEdit.background = buttonBackgroundColor;\r\n butEdit.onPointerEnterObservable.add(() => {\r\n butEdit.background = buttonBackgroundHoverColor;\r\n });\r\n butEdit.onPointerOutObservable.add(() => {\r\n butEdit.background = buttonBackgroundColor;\r\n });\r\n butEdit.pointerDownAnimation = () => {\r\n butEdit.background = buttonBackgroundClickColor;\r\n };\r\n butEdit.pointerUpAnimation = () => {\r\n butEdit.background = buttonBackgroundHoverColor;\r\n };\r\n butEdit.onPointerClickObservable.add(() => {\r\n if (editSwatchMode) {\r\n editSwatchMode = false;\r\n } else {\r\n editSwatchMode = true;\r\n }\r\n editSwatches();\r\n });\r\n pickerGrid.addControl(butEdit, 1, 0);\r\n } else {\r\n pickerGrid.removeControl(butEdit);\r\n }\r\n }\r\n\r\n // Called when the user hits the limit of saved colors in the drawer.\r\n function disableButton(button: Button, disabled: boolean) {\r\n if (disabled) {\r\n button.color = buttonDisabledColor;\r\n button.background = buttonDisabledBackgroundColor;\r\n } else {\r\n button.color = buttonColor;\r\n button.background = buttonBackgroundColor;\r\n }\r\n }\r\n\r\n // Passes last chosen color back to scene and kills dialog by removing from AdvancedDynamicTexture\r\n function closePicker(color: string) {\r\n if (options.savedColors && options.savedColors.length > 0) {\r\n resolve({\r\n savedColors: options.savedColors,\r\n pickedColor: color,\r\n });\r\n } else {\r\n resolve({\r\n pickedColor: color,\r\n });\r\n }\r\n advancedTexture.removeControl(dialogContainer);\r\n }\r\n });\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.ColorPicker\", ColorPicker);\r\n","import { Container } from \"./container\";\r\nimport { Control } from \"./control\";\r\nimport { type Measure } from \"../measure\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\n\r\n/** Class used to create 2D ellipse containers */\r\nexport class Ellipse extends Container {\r\n private _thickness = 1;\r\n\r\n /** Gets or sets border thickness */\r\n @serialize()\r\n public get thickness(): number {\r\n return this._thickness;\r\n }\r\n\r\n public set thickness(value: number) {\r\n if (this._thickness === value) {\r\n return;\r\n }\r\n\r\n this._thickness = value;\r\n this._markAsDirty();\r\n }\r\n\r\n private _arc = 1;\r\n\r\n /** Gets or sets arcing of the ellipse (ratio of the circumference between 0 and 1) */\r\n @serialize()\r\n public get arc(): number {\r\n return this._arc;\r\n }\r\n\r\n public set arc(value: number) {\r\n if (this._arc === value) {\r\n return;\r\n }\r\n\r\n this._arc = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Creates a new Ellipse\r\n * @param name defines the control name\r\n */\r\n constructor(public override name?: string) {\r\n super(name);\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"Ellipse\";\r\n }\r\n\r\n protected override _localDraw(context: ICanvasRenderingContext): void {\r\n context.save();\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio;\r\n context.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio;\r\n }\r\n\r\n Control.drawEllipse(\r\n this._currentMeasure.left + this._currentMeasure.width / 2,\r\n this._currentMeasure.top + this._currentMeasure.height / 2,\r\n this._currentMeasure.width / 2 - this._thickness / 2,\r\n this._currentMeasure.height / 2 - this._thickness / 2,\r\n this._arc,\r\n context\r\n );\r\n\r\n if (this._backgroundGradient || this._background) {\r\n context.fillStyle = this._getBackgroundColor(context);\r\n\r\n context.fill();\r\n }\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowBlur = 0;\r\n context.shadowOffsetX = 0;\r\n context.shadowOffsetY = 0;\r\n }\r\n\r\n if (this._thickness) {\r\n if (this.color) {\r\n context.strokeStyle = this.color;\r\n }\r\n context.lineWidth = this._thickness;\r\n\r\n context.stroke();\r\n }\r\n\r\n context.restore();\r\n }\r\n\r\n protected override _additionalProcessing(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n super._additionalProcessing(parentMeasure, context);\r\n\r\n this._measureForChildren.width -= 2 * this._thickness;\r\n this._measureForChildren.height -= 2 * this._thickness;\r\n this._measureForChildren.left += this._thickness;\r\n this._measureForChildren.top += this._thickness;\r\n }\r\n\r\n protected override _clipForChildren(context: ICanvasRenderingContext) {\r\n Control.drawEllipse(\r\n this._currentMeasure.left + this._currentMeasure.width / 2,\r\n this._currentMeasure.top + this._currentMeasure.height / 2,\r\n this._currentMeasure.width / 2,\r\n this._currentMeasure.height / 2,\r\n this._arc,\r\n context\r\n );\r\n\r\n context.clip();\r\n }\r\n\r\n public override _renderHighlightSpecific(context: ICanvasRenderingContext): void {\r\n Control.drawEllipse(\r\n this._currentMeasure.left + this._currentMeasure.width / 2,\r\n this._currentMeasure.top + this._currentMeasure.height / 2,\r\n this._currentMeasure.width / 2 - this._highlightLineWidth / 2,\r\n this._currentMeasure.height / 2 - this._highlightLineWidth / 2,\r\n this._arc,\r\n context\r\n );\r\n context.stroke();\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.Ellipse\", Ellipse);\r\n","import { type Vector2 } from \"core/Maths/math.vector\";\r\n\r\nimport { Button } from \"./button\";\r\nimport { type Control } from \"./control\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { type PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { type IFocusableControl } from \"./focusableControl\";\r\n\r\n/**\r\n * Class used to create a focusable button that can easily handle keyboard events\r\n * @since 5.0.0\r\n */\r\nexport class FocusableButton extends Button implements IFocusableControl {\r\n constructor(public override name?: string) {\r\n super(name);\r\n\r\n this._unfocusedColor = this.color;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: PointerInfoBase): boolean {\r\n if (!this.isReadOnly) {\r\n // Clicking on button should focus\r\n this.focus();\r\n }\r\n\r\n return super._onPointerDown(target, coordinates, pointerId, buttonIndex, pi);\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.FocusableButton\", FocusableButton);\r\n","import { type Nullable } from \"core/types\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { type Vector2 } from \"core/Maths/math.vector\";\r\n\r\nimport { Control } from \"./control\";\r\nimport { ValueAndUnit } from \"../valueAndUnit\";\r\nimport { type VirtualKeyboard } from \"./virtualKeyboard\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { type Measure } from \"../measure\";\r\nimport { InputText } from \"./inputText\";\r\nimport { type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\nimport { type PointerInfo, type PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { type IKeyboardEvent } from \"core/Events/deviceInputEvents\";\r\n\r\nimport { serialize } from \"core/Misc/decorators\";\r\n\r\n/**\r\n * Class used to create input text control\r\n */\r\nexport class InputTextArea extends InputText {\r\n private _textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n private _textVerticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\r\n\r\n private _prevText: string = this.text;\r\n\r\n private _lines: any[];\r\n private _lineSpacing: ValueAndUnit = new ValueAndUnit(0);\r\n private _maxHeight = new ValueAndUnit(1, ValueAndUnit.UNITMODE_PERCENTAGE, false);\r\n\r\n private _clipTextTop: number;\r\n private _clipTextLeft: number;\r\n\r\n private _cursorInfo: { globalStartIndex: number; globalEndIndex: number; relativeStartIndex: number; relativeEndIndex: number; currentLineIndex: number };\r\n private _highlightCursorInfo: { initialStartIndex: number; initialRelativeStartIndex: number; initialLineIndex: number };\r\n\r\n /**\r\n * An event triggered after the text was broken up into lines\r\n */\r\n public onLinesReadyObservable = new Observable<InputTextArea>();\r\n\r\n /** @internal */\r\n public override _connectedVirtualKeyboard: Nullable<VirtualKeyboard>;\r\n private _contextForBreakLines: ICanvasRenderingContext;\r\n private _clickedCoordinateX: Nullable<number>;\r\n private _clickedCoordinateY: Nullable<number>;\r\n\r\n private _availableWidth: number;\r\n private _availableHeight: number;\r\n\r\n private _scrollTop: Nullable<number>;\r\n\r\n private _autoStretchHeight: boolean;\r\n\r\n /** Gets or sets a boolean indicating if the control can auto stretch its height to adapt to the text */\r\n @serialize()\r\n public get autoStretchHeight(): boolean {\r\n return this._autoStretchHeight;\r\n }\r\n\r\n public set autoStretchHeight(value: boolean) {\r\n if (this._autoStretchHeight === value) {\r\n return;\r\n }\r\n\r\n this._autoStretchHeight = value;\r\n this._markAsDirty();\r\n }\r\n\r\n public override set height(value: string | number) {\r\n this.fixedRatioMasterIsWidth = false;\r\n\r\n if (this._height.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._height.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n\r\n this._autoStretchHeight = false;\r\n }\r\n\r\n @serialize()\r\n public get maxHeight(): string | number {\r\n return this._maxHeight.toString(this._host);\r\n }\r\n\r\n /** Gets the maximum width allowed by the control in pixels */\r\n public get maxHeightInPixels(): number {\r\n return this._maxHeight.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n\r\n public set maxHeight(value: string | number) {\r\n if (this._maxHeight.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._maxHeight.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new InputTextArea\r\n * @param name defines the control name\r\n * @param text defines the text of the control\r\n */\r\n constructor(\r\n public override name?: string,\r\n text: string = \"\"\r\n ) {\r\n super(name);\r\n\r\n this.text = text;\r\n\r\n this.isPointerBlocker = true;\r\n\r\n this.onLinesReadyObservable.add(() => this._updateCursorPosition());\r\n\r\n this._highlightCursorInfo = {\r\n initialStartIndex: -1,\r\n initialRelativeStartIndex: -1,\r\n initialLineIndex: -1,\r\n };\r\n\r\n this._cursorInfo = {\r\n globalStartIndex: 0,\r\n globalEndIndex: 0,\r\n relativeEndIndex: 0,\r\n relativeStartIndex: 0,\r\n currentLineIndex: 0,\r\n };\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"InputTextArea\";\r\n }\r\n\r\n /**\r\n * Handles the keyboard event\r\n * @param evt Defines the KeyboardEvent\r\n */\r\n public override processKeyboard(evt: IKeyboardEvent): void {\r\n if (this.isReadOnly) {\r\n return;\r\n }\r\n\r\n // process pressed key\r\n this.alternativeProcessKey(evt.code, evt.key, evt);\r\n\r\n this.onKeyboardEventProcessedObservable.notifyObservers(evt);\r\n }\r\n\r\n /**\r\n * Process the last keyboard input\r\n *\r\n * @param code The ascii input number\r\n * @param key The key string representation\r\n * @param evt The keyboard event emits with input\r\n * @internal\r\n */\r\n public alternativeProcessKey(code: string, key?: string, evt?: IKeyboardEvent) {\r\n //return if clipboard event keys (i.e -ctr/cmd + c,v,x)\r\n if (evt && (evt.ctrlKey || evt.metaKey) && (key === \"c\" || key === \"v\" || key === \"x\")) {\r\n return;\r\n }\r\n\r\n // Specific cases\r\n switch (code) {\r\n case \"Period\": //SLASH\r\n if (evt && evt.shiftKey) {\r\n evt.preventDefault();\r\n }\r\n break;\r\n case \"Backspace\": // BACKSPACE\r\n if (!this._isTextHighlightOn && this._cursorInfo.globalStartIndex > 0) {\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n this._cursorInfo.globalStartIndex--;\r\n }\r\n this._prevText = this._textWrapper.text;\r\n this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex);\r\n\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n\r\n if (evt) {\r\n evt.preventDefault();\r\n }\r\n\r\n this._blinkIsEven = false;\r\n this._isTextHighlightOn = false;\r\n\r\n this._textHasChanged();\r\n break;\r\n case \"Delete\": // DELETE\r\n if (!this._isTextHighlightOn && this._cursorInfo.globalEndIndex < this.text.length) {\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex + 1;\r\n }\r\n this._prevText = this._textWrapper.text;\r\n this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex);\r\n\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n\r\n if (evt) {\r\n evt.preventDefault();\r\n }\r\n\r\n this._blinkIsEven = false;\r\n this._isTextHighlightOn = false;\r\n\r\n this._textHasChanged();\r\n break;\r\n case \"NumpadEnter\": // NUMPAD ENTER\r\n case \"Enter\": // RETURN\r\n this._prevText = this._textWrapper.text;\r\n this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex, \"\\n\");\r\n this._cursorInfo.globalStartIndex++;\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n\r\n this._blinkIsEven = false;\r\n this._isTextHighlightOn = false;\r\n\r\n this._textHasChanged();\r\n return;\r\n case \"End\": // END\r\n this._cursorInfo.globalStartIndex = this.text.length;\r\n this._blinkIsEven = false;\r\n this._isTextHighlightOn = false;\r\n this._markAsDirty();\r\n return;\r\n case \"Home\": // HOME\r\n this._cursorInfo.globalStartIndex = 0;\r\n this._blinkIsEven = false;\r\n this._isTextHighlightOn = false;\r\n this._markAsDirty();\r\n return;\r\n case \"ArrowLeft\": // LEFT\r\n this._markAsDirty();\r\n\r\n if (evt && evt.shiftKey) {\r\n // shift + ctrl/cmd + <-\r\n if (evt.ctrlKey || evt.metaKey) {\r\n // Go to line's start by substract the relativeStartIndex to the globalStartIndex\r\n this._cursorInfo.globalStartIndex -= this._cursorInfo.relativeStartIndex;\r\n this._cursorInfo.globalEndIndex = this._highlightCursorInfo.initialStartIndex;\r\n }\r\n // store the starting point\r\n if (!this._isTextHighlightOn) {\r\n this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex;\r\n this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex;\r\n this._highlightCursorInfo.initialRelativeStartIndex = this._cursorInfo.relativeStartIndex;\r\n\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n this._cursorInfo.globalStartIndex--;\r\n this._isTextHighlightOn = true;\r\n } else {\r\n if (this._cursorInfo.globalEndIndex > this._highlightCursorInfo.initialStartIndex) {\r\n this._cursorInfo.globalEndIndex--;\r\n } else {\r\n this._cursorInfo.globalStartIndex--;\r\n }\r\n }\r\n this._blinkIsEven = true;\r\n evt.preventDefault();\r\n return;\r\n }\r\n\r\n if (this._isTextHighlightOn) {\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n } else if (evt && (evt.ctrlKey || evt.metaKey)) {\r\n // ctr + <-\r\n this._cursorInfo.globalStartIndex -= this._cursorInfo.relativeStartIndex;\r\n evt.preventDefault();\r\n } else if (this._cursorInfo.globalStartIndex > 0) {\r\n this._cursorInfo.globalStartIndex--;\r\n }\r\n\r\n // update the cursor\r\n this._blinkIsEven = false;\r\n this._isTextHighlightOn = false;\r\n return;\r\n case \"ArrowRight\": // RIGHT\r\n this._markAsDirty();\r\n\r\n if (evt && evt.shiftKey) {\r\n // shift + ctrl/cmd + ->\r\n if (evt.ctrlKey || evt.metaKey) {\r\n const rightDelta = this._lines[this._cursorInfo.currentLineIndex].text.length - this._cursorInfo.relativeEndIndex - 1;\r\n this._cursorInfo.globalEndIndex += rightDelta;\r\n this._cursorInfo.globalStartIndex = this._highlightCursorInfo.initialStartIndex;\r\n }\r\n // store the starting point\r\n if (!this._isTextHighlightOn) {\r\n this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex;\r\n this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex;\r\n this._highlightCursorInfo.initialRelativeStartIndex = this._cursorInfo.relativeStartIndex;\r\n\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n this._cursorInfo.globalEndIndex++;\r\n this._isTextHighlightOn = true;\r\n } else {\r\n if (this._cursorInfo.globalStartIndex < this._highlightCursorInfo.initialStartIndex) {\r\n this._cursorInfo.globalStartIndex++;\r\n } else {\r\n this._cursorInfo.globalEndIndex++;\r\n }\r\n }\r\n this._blinkIsEven = true;\r\n evt.preventDefault();\r\n return;\r\n }\r\n if (this._isTextHighlightOn) {\r\n this._cursorInfo.globalStartIndex = this._cursorInfo.globalEndIndex;\r\n } else if (evt && (evt.ctrlKey || evt.metaKey)) {\r\n //ctr + ->\r\n const rightDelta = this._lines[this._cursorInfo.currentLineIndex].text.length - this._cursorInfo.relativeEndIndex;\r\n this._cursorInfo.globalStartIndex += rightDelta;\r\n } else if (this._cursorInfo.globalStartIndex < this.text.length) {\r\n this._cursorInfo.globalStartIndex++;\r\n }\r\n\r\n // update the cursor\r\n this._blinkIsEven = false;\r\n this._isTextHighlightOn = false;\r\n return;\r\n case \"ArrowUp\": // UP\r\n // update the cursor\r\n this._blinkIsEven = false;\r\n\r\n if (evt) {\r\n if (evt.shiftKey) {\r\n if (!this._isTextHighlightOn) {\r\n this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex;\r\n this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex;\r\n this._highlightCursorInfo.initialRelativeStartIndex = this._cursorInfo.relativeStartIndex;\r\n }\r\n this._isTextHighlightOn = true;\r\n this._blinkIsEven = true;\r\n } else {\r\n this._isTextHighlightOn = false;\r\n }\r\n evt.preventDefault();\r\n }\r\n\r\n if (this._cursorInfo.currentLineIndex === 0) {\r\n // First line\r\n this._cursorInfo.globalStartIndex = 0;\r\n } else {\r\n const currentLine = this._lines[this._cursorInfo.currentLineIndex];\r\n const upperLine = this._lines[this._cursorInfo.currentLineIndex - 1];\r\n\r\n let tmpIndex: number;\r\n let relativeIndex: number;\r\n if (!this._isTextHighlightOn || this._cursorInfo.currentLineIndex < this._highlightCursorInfo.initialLineIndex) {\r\n tmpIndex = this._cursorInfo.globalStartIndex;\r\n relativeIndex = this._cursorInfo.relativeStartIndex;\r\n } else {\r\n tmpIndex = this._cursorInfo.globalEndIndex;\r\n relativeIndex = this._cursorInfo.relativeEndIndex;\r\n }\r\n\r\n const currentText = currentLine.text.substring(0, relativeIndex);\r\n const currentWidth = this._contextForBreakLines.measureText(currentText).width;\r\n\r\n let upperWidth = 0;\r\n let previousWidth = 0;\r\n\r\n tmpIndex -= relativeIndex; // Start of current line\r\n tmpIndex -= upperLine.text.length + upperLine.lineEnding.length; // Start of upper line\r\n let upperLineRelativeIndex = 0;\r\n\r\n while (upperWidth < currentWidth && upperLineRelativeIndex < upperLine.text.length) {\r\n tmpIndex++;\r\n upperLineRelativeIndex++;\r\n previousWidth = Math.abs(currentWidth - upperWidth);\r\n upperWidth = this._contextForBreakLines.measureText(upperLine.text.substring(0, upperLineRelativeIndex)).width;\r\n }\r\n\r\n // Find closest move\r\n if (Math.abs(currentWidth - upperWidth) > previousWidth && upperLineRelativeIndex > 0) {\r\n tmpIndex--;\r\n }\r\n\r\n if (!this._isTextHighlightOn) {\r\n this._cursorInfo.globalStartIndex = tmpIndex;\r\n } else if (this._cursorInfo.currentLineIndex <= this._highlightCursorInfo.initialLineIndex) {\r\n this._cursorInfo.globalStartIndex = tmpIndex;\r\n this._cursorInfo.globalEndIndex = this._highlightCursorInfo.initialStartIndex;\r\n this._cursorInfo.relativeEndIndex = this._highlightCursorInfo.initialRelativeStartIndex;\r\n } else {\r\n this._cursorInfo.globalEndIndex = tmpIndex;\r\n }\r\n }\r\n\r\n this._markAsDirty();\r\n return;\r\n case \"ArrowDown\": // DOWN\r\n // update the cursor\r\n this._blinkIsEven = false;\r\n\r\n if (evt) {\r\n if (evt.shiftKey) {\r\n if (!this._isTextHighlightOn) {\r\n this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex;\r\n this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex;\r\n this._highlightCursorInfo.initialRelativeStartIndex = this._cursorInfo.relativeStartIndex;\r\n }\r\n\r\n this._isTextHighlightOn = true;\r\n this._blinkIsEven = true;\r\n } else {\r\n this._isTextHighlightOn = false;\r\n }\r\n evt.preventDefault();\r\n }\r\n\r\n if (this._cursorInfo.currentLineIndex === this._lines.length - 1) {\r\n // Last line\r\n this._cursorInfo.globalStartIndex = this.text.length;\r\n } else {\r\n const currentLine = this._lines[this._cursorInfo.currentLineIndex];\r\n const underLine = this._lines[this._cursorInfo.currentLineIndex + 1];\r\n\r\n let tmpIndex: number;\r\n let relativeIndex: number;\r\n if (!this._isTextHighlightOn || this._cursorInfo.currentLineIndex < this._highlightCursorInfo.initialLineIndex) {\r\n tmpIndex = this._cursorInfo.globalStartIndex;\r\n relativeIndex = this._cursorInfo.relativeStartIndex;\r\n } else {\r\n tmpIndex = this._cursorInfo.globalEndIndex;\r\n relativeIndex = this._cursorInfo.relativeEndIndex;\r\n }\r\n\r\n const currentText = currentLine.text.substring(0, relativeIndex);\r\n const currentWidth = this._contextForBreakLines.measureText(currentText).width;\r\n\r\n let underWidth = 0;\r\n let previousWidth = 0;\r\n\r\n tmpIndex += currentLine.text.length - relativeIndex + currentLine.lineEnding.length; // Start of current line\r\n let underLineRelativeIndex = 0;\r\n\r\n while (underWidth < currentWidth && underLineRelativeIndex < underLine.text.length) {\r\n tmpIndex++;\r\n underLineRelativeIndex++;\r\n previousWidth = Math.abs(currentWidth - underWidth);\r\n underWidth = this._contextForBreakLines.measureText(underLine.text.substring(0, underLineRelativeIndex)).width;\r\n }\r\n\r\n // Find closest move\r\n if (Math.abs(currentWidth - underWidth) > previousWidth && underLineRelativeIndex > 0) {\r\n tmpIndex--;\r\n }\r\n\r\n if (!this._isTextHighlightOn) {\r\n this._cursorInfo.globalStartIndex = tmpIndex;\r\n } else if (this._cursorInfo.currentLineIndex < this._highlightCursorInfo.initialLineIndex) {\r\n this._cursorInfo.globalStartIndex = tmpIndex;\r\n if (this._cursorInfo.globalStartIndex > this._cursorInfo.globalEndIndex) {\r\n this._cursorInfo.globalEndIndex += this._cursorInfo.globalStartIndex;\r\n this._cursorInfo.globalStartIndex = this._cursorInfo.globalEndIndex - this._cursorInfo.globalStartIndex;\r\n this._cursorInfo.globalEndIndex -= this._cursorInfo.globalStartIndex;\r\n }\r\n } else {\r\n this._cursorInfo.globalEndIndex = tmpIndex;\r\n this._cursorInfo.globalStartIndex = this._highlightCursorInfo.initialStartIndex;\r\n }\r\n }\r\n\r\n this._markAsDirty();\r\n return;\r\n }\r\n\r\n // special case - select all. Use key instead of code to support all keyboard layouts\r\n if (key === \"a\" && evt && (evt.ctrlKey || evt.metaKey)) {\r\n this.selectAllText();\r\n evt.preventDefault();\r\n return;\r\n }\r\n\r\n // Printable characters\r\n if (key?.length === 1) {\r\n evt?.preventDefault();\r\n this._currentKey = key;\r\n this.onBeforeKeyAddObservable.notifyObservers(this);\r\n key = this._currentKey;\r\n if (this._addKey) {\r\n this._isTextHighlightOn = false;\r\n this._blinkIsEven = false;\r\n this._prevText = this._textWrapper.text;\r\n this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex, key);\r\n this._cursorInfo.globalStartIndex += key.length;\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n\r\n this._textHasChanged();\r\n }\r\n }\r\n }\r\n\r\n protected _parseLineWordWrap(line: string = \"\", width: number, context: ICanvasRenderingContext): { text: string; width: number; lineEnding: string }[] {\r\n const lines = [];\r\n const words = line.split(\" \");\r\n let lineWidth = 0;\r\n\r\n for (let n = 0; n < words.length; n++) {\r\n const testLine = n > 0 ? line + \" \" + words[n] : words[0];\r\n const metrics = context.measureText(testLine);\r\n const testWidth = metrics.width;\r\n if (testWidth > width) {\r\n if (n > 0) {\r\n // Avoid first word duplication if of too long\r\n lineWidth = context.measureText(line).width;\r\n lines.push({ text: line, width: lineWidth, lineEnding: \" \" });\r\n }\r\n\r\n line = words[n];\r\n\r\n let flushedLine = \"\";\r\n\r\n line.split(\"\").map((char) => {\r\n if (context.measureText(flushedLine + char).width > width) {\r\n lines.push({ text: flushedLine, width: context.measureText(flushedLine).width, lineEnding: \"\" });\r\n flushedLine = \"\";\r\n }\r\n flushedLine += char;\r\n });\r\n\r\n line = flushedLine;\r\n // Measure remaining characters\r\n lineWidth = context.measureText(line).width;\r\n } else {\r\n lineWidth = testWidth;\r\n line = testLine;\r\n }\r\n }\r\n lines.push({ text: line, width: lineWidth, lineEnding: \" \" });\r\n\r\n return lines;\r\n }\r\n\r\n protected _breakLines(refWidth: number, context: ICanvasRenderingContext): object[] {\r\n const lines: { text: string; width: number; lineEnding: string }[] = [];\r\n const _lines = (this.text || this.placeholderText).split(\"\\n\");\r\n\r\n if (this.clipContent) {\r\n for (const _line of _lines) {\r\n lines.push(...this._parseLineWordWrap(_line, refWidth, context));\r\n }\r\n } else {\r\n for (const _line of _lines) {\r\n lines.push(this._parseLine(_line, context));\r\n }\r\n }\r\n\r\n lines[lines.length - 1].lineEnding = \"\\n\";\r\n\r\n return lines;\r\n }\r\n\r\n protected _parseLine(line: string = \"\", context: ICanvasRenderingContext): { text: string; width: number; lineEnding: string } {\r\n return { text: line, width: context.measureText(line).width, lineEnding: \" \" };\r\n }\r\n\r\n /**\r\n * Processing of child right before the parent measurement update\r\n *\r\n * @param parentMeasure The parent measure\r\n * @param context The rendering canvas\r\n * @internal\r\n */\r\n protected override _preMeasure(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n if (!this._fontOffset || this._wasDirty) {\r\n this._fontOffset = Control._GetFontOffset(context.font, this._host.getScene()?.getEngine());\r\n }\r\n\r\n let text = this._beforeRenderText(this._textWrapper).text;\r\n\r\n // placeholder conditions and color setting\r\n if (!this.text && this._placeholderText) {\r\n text = this._placeholderText;\r\n }\r\n\r\n // measures the textlength -> this.measure.width\r\n this._textWidth = context.measureText(text).width;\r\n // we double up the margin width\r\n const marginWidth = this._margin.getValueInPixel(this._host, parentMeasure.width) * 2;\r\n\r\n if (this._autoStretchWidth) {\r\n const tmpLines = text.split(\"\\n\");\r\n const longerString = tmpLines.reduce((acc: string, val: string) => {\r\n const valueLength = context.measureText(val).width;\r\n const accLength = context.measureText(acc).width;\r\n return valueLength > accLength ? val : acc;\r\n }, \"\");\r\n\r\n const longerStringWidth = context.measureText(longerString).width;\r\n this.width = Math.min(this._maxWidth.getValueInPixel(this._host, parentMeasure.width), longerStringWidth + marginWidth) + \"px\";\r\n\r\n this.autoStretchWidth = true;\r\n }\r\n\r\n this._availableWidth = this._width.getValueInPixel(this._host, parentMeasure.width) - marginWidth;\r\n\r\n // Prepare lines\r\n this._lines = this._breakLines(this._availableWidth, context);\r\n // can we find a cleaner implementation here?\r\n this._contextForBreakLines = context;\r\n\r\n if (this._autoStretchHeight) {\r\n const textHeight = this._lines.length * this._fontOffset.height;\r\n const totalHeight = textHeight + this._margin.getValueInPixel(this._host, parentMeasure.height) * 2;\r\n this.height = Math.min(this._maxHeight.getValueInPixel(this._host, parentMeasure.height), totalHeight) + \"px\";\r\n\r\n this._autoStretchHeight = true;\r\n }\r\n\r\n const marginHeight = this._margin.getValueInPixel(this._host, parentMeasure.height) * 2;\r\n this._availableHeight = this._height.getValueInPixel(this._host, parentMeasure.height) - marginHeight;\r\n\r\n if (this._isFocused) {\r\n this._cursorInfo.currentLineIndex = 0;\r\n\r\n let lineLength = this._lines[this._cursorInfo.currentLineIndex].text.length + this._lines[this._cursorInfo.currentLineIndex].lineEnding.length;\r\n let tmpLength = 0;\r\n\r\n while (tmpLength + lineLength <= this._cursorInfo.globalStartIndex) {\r\n tmpLength += lineLength;\r\n\r\n if (this._cursorInfo.currentLineIndex < this._lines.length - 1) {\r\n this._cursorInfo.currentLineIndex++;\r\n lineLength = this._lines[this._cursorInfo.currentLineIndex].text.length + this._lines[this._cursorInfo.currentLineIndex].lineEnding.length;\r\n }\r\n }\r\n }\r\n }\r\n\r\n protected override _textHasChanged() {\r\n if (!this._prevText && this._textWrapper.text && this.placeholderText) {\r\n this._cursorInfo.currentLineIndex = 0;\r\n this._cursorInfo.globalStartIndex = 1;\r\n this._cursorInfo.globalEndIndex = 1;\r\n this._cursorInfo.relativeStartIndex = 1;\r\n this._cursorInfo.relativeEndIndex = 1;\r\n }\r\n super._textHasChanged();\r\n }\r\n\r\n private _computeScroll() {\r\n this._clipTextLeft = this._currentMeasure.left + this._margin.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n this._clipTextTop = this._currentMeasure.top + this._margin.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n\r\n if (this._isFocused && this._lines[this._cursorInfo.currentLineIndex].width > this._availableWidth) {\r\n const textLeft = this._clipTextLeft - this._lines[this._cursorInfo.currentLineIndex].width + this._availableWidth;\r\n\r\n if (!this._scrollLeft) {\r\n this._scrollLeft = textLeft;\r\n }\r\n } else {\r\n this._scrollLeft = this._clipTextLeft;\r\n }\r\n\r\n if (this._isFocused) {\r\n const selectedHeight = (this._cursorInfo.currentLineIndex + 1) * this._fontOffset.height;\r\n const textTop = this._clipTextTop - selectedHeight;\r\n\r\n if (!this._scrollTop) {\r\n this._scrollTop = textTop;\r\n }\r\n } else {\r\n this._scrollTop = this._clipTextTop;\r\n }\r\n }\r\n\r\n /**\r\n * Processing of child after the parent measurement update\r\n *\r\n * @internal\r\n */\r\n protected override _additionalProcessing(): void {\r\n // Flush the highlighted text each frame\r\n this.highlightedText = \"\";\r\n\r\n this.onLinesReadyObservable.notifyObservers(this);\r\n }\r\n\r\n private _drawText(text: string, textWidth: number, y: number, context: ICanvasRenderingContext): void {\r\n const width = this._currentMeasure.width;\r\n let x = this._scrollLeft as number;\r\n switch (this._textHorizontalAlignment) {\r\n case Control.HORIZONTAL_ALIGNMENT_LEFT:\r\n x += 0;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_RIGHT:\r\n x += width - textWidth;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_CENTER:\r\n x += (width - textWidth) / 2;\r\n break;\r\n }\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio;\r\n context.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio;\r\n }\r\n\r\n if (this.outlineWidth) {\r\n context.strokeText(text, this._currentMeasure.left + x, y);\r\n }\r\n context.fillText(text, x, y);\r\n }\r\n\r\n /**\r\n * Copy the text in the clipboard\r\n *\r\n * @param ev The clipboard event\r\n * @internal\r\n */\r\n protected override _onCopyText(ev: ClipboardEvent): void {\r\n this._isTextHighlightOn = false;\r\n //when write permission to clipbaord data is denied\r\n try {\r\n ev.clipboardData && ev.clipboardData.setData(\"text/plain\", this._highlightedText);\r\n } catch {} //pass\r\n this._host.clipboardData = this._highlightedText;\r\n }\r\n\r\n /**\r\n * Cut the text and copy it in the clipboard\r\n *\r\n * @param ev The clipboard event\r\n * @internal\r\n */\r\n protected override _onCutText(ev: ClipboardEvent): void {\r\n if (!this._highlightedText) {\r\n return;\r\n }\r\n //when write permission to clipbaord data is denied\r\n try {\r\n ev.clipboardData && ev.clipboardData.setData(\"text/plain\", this._highlightedText);\r\n } catch {} //pass\r\n\r\n this._host.clipboardData = this._highlightedText;\r\n this._prevText = this._textWrapper.text;\r\n this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex);\r\n\r\n this._textHasChanged();\r\n }\r\n\r\n /**\r\n * Paste the copied text from the clipboard\r\n *\r\n * @param ev The clipboard event\r\n * @internal\r\n */\r\n protected override _onPasteText(ev: ClipboardEvent): void {\r\n let data: string;\r\n if (ev.clipboardData && ev.clipboardData.types.indexOf(\"text/plain\") !== -1) {\r\n data = ev.clipboardData.getData(\"text/plain\");\r\n } else {\r\n //get the cached data; returns blank string by default\r\n data = this._host.clipboardData;\r\n }\r\n\r\n this._isTextHighlightOn = false;\r\n this._prevText = this._textWrapper.text;\r\n this._textWrapper.removePart(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex, data);\r\n\r\n const deltaIndex = data.length - (this._cursorInfo.globalEndIndex - this._cursorInfo.globalStartIndex);\r\n\r\n this._cursorInfo.globalStartIndex += deltaIndex;\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n this._clickedCoordinateX = null;\r\n this._clickedCoordinateY = null;\r\n\r\n super._textHasChanged();\r\n }\r\n\r\n public override _draw(context: ICanvasRenderingContext): void {\r\n this._computeScroll();\r\n\r\n this._scrollLeft = this._scrollLeft ?? 0;\r\n this._scrollTop = this._scrollTop ?? 0;\r\n\r\n context.save();\r\n\r\n this._applyStates(context);\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio;\r\n context.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio;\r\n }\r\n\r\n // Background\r\n if (this._isFocused) {\r\n if (this._focusedBackground) {\r\n context.fillStyle = this._isEnabled ? this._focusedBackground : this._disabledColor;\r\n\r\n context.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n } else if (this._background) {\r\n context.fillStyle = this._isEnabled ? this._background : this._disabledColor;\r\n\r\n context.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowBlur = 0;\r\n context.shadowOffsetX = 0;\r\n context.shadowOffsetY = 0;\r\n }\r\n\r\n // sets the color of the rectangle (border if background available)\r\n if (this.color) {\r\n context.fillStyle = this.color;\r\n }\r\n\r\n const height = this._currentMeasure.height;\r\n const width = this._currentMeasure.width;\r\n let rootY = 0;\r\n\r\n switch (this._textVerticalAlignment) {\r\n case Control.VERTICAL_ALIGNMENT_TOP:\r\n rootY = this._fontOffset.ascent;\r\n break;\r\n case Control.VERTICAL_ALIGNMENT_BOTTOM:\r\n rootY = height - this._fontOffset.height * (this._lines.length - 1) - this._fontOffset.descent;\r\n break;\r\n case Control.VERTICAL_ALIGNMENT_CENTER:\r\n rootY = this._fontOffset.ascent + (height - this._fontOffset.height * this._lines.length) / 2;\r\n break;\r\n }\r\n\r\n context.save();\r\n context.beginPath();\r\n context.fillStyle = this.fontStyle;\r\n if (!this._textWrapper.text && this.placeholderText) {\r\n context.fillStyle = this._placeholderColor;\r\n }\r\n // here we define the visible reactangle to clip it in next line\r\n context.rect(this._clipTextLeft, this._clipTextTop, this._availableWidth + 2, this._availableHeight + 2);\r\n context.clip();\r\n\r\n // Text\r\n rootY += this._scrollTop;\r\n\r\n for (let i = 0; i < this._lines.length; i++) {\r\n const line = this._lines[i];\r\n\r\n if (i !== 0 && this._lineSpacing.internalValue !== 0) {\r\n if (this._lineSpacing.isPixel) {\r\n rootY += this._lineSpacing.getValue(this._host);\r\n } else {\r\n rootY = rootY + this._lineSpacing.getValue(this._host) * this._height.getValueInPixel(this._host, this._cachedParentMeasure.height);\r\n }\r\n }\r\n\r\n this._drawText(line.text, line.width, rootY, context);\r\n rootY += this._fontOffset.height;\r\n }\r\n\r\n context.restore();\r\n\r\n // Cursor\r\n if (this._isFocused) {\r\n // Render cursor\r\n if (!this._blinkIsEven || this._isTextHighlightOn) {\r\n let cursorLeft =\r\n this._scrollLeft + context.measureText(this._lines[this._cursorInfo.currentLineIndex].text.substring(0, this._cursorInfo.relativeStartIndex)).width;\r\n\r\n if (cursorLeft < this._clipTextLeft) {\r\n this._scrollLeft += this._clipTextLeft - cursorLeft;\r\n cursorLeft = this._clipTextLeft;\r\n this._markAsDirty();\r\n } else if (cursorLeft > this._clipTextLeft + this._availableWidth) {\r\n this._scrollLeft += this._clipTextLeft + this._availableWidth - cursorLeft;\r\n cursorLeft = this._clipTextLeft + this._availableWidth;\r\n this._markAsDirty();\r\n }\r\n\r\n let cursorTop = this._scrollTop + this._cursorInfo.currentLineIndex * this._fontOffset.height; //cursorTop distance from top to cursor start\r\n\r\n if (cursorTop < this._clipTextTop) {\r\n this._scrollTop += this._clipTextTop - cursorTop;\r\n cursorTop = this._clipTextTop;\r\n this._markAsDirty();\r\n } else if (cursorTop + this._fontOffset.height > this._clipTextTop + this._availableHeight && this._availableHeight > this._fontOffset.height) {\r\n this._scrollTop += this._clipTextTop + this._availableHeight - cursorTop - this._fontOffset.height;\r\n cursorTop = this._clipTextTop + this._availableHeight - this._fontOffset.height;\r\n this._markAsDirty();\r\n }\r\n\r\n if (!this._isTextHighlightOn) {\r\n context.fillRect(cursorLeft, cursorTop, 2, this._fontOffset.height);\r\n }\r\n }\r\n\r\n this._resetBlinking();\r\n\r\n //show the highlighted text\r\n if (this._isTextHighlightOn) {\r\n clearTimeout(this._blinkTimeout);\r\n\r\n this._highlightedText = this.text.substring(this._cursorInfo.globalStartIndex, this._cursorInfo.globalEndIndex);\r\n\r\n context.globalAlpha = this._highlighterOpacity;\r\n context.fillStyle = this._textHighlightColor;\r\n\r\n const startLineIndex = Math.min(this._cursorInfo.currentLineIndex, this._highlightCursorInfo.initialLineIndex);\r\n const endLineIndex = Math.max(this._cursorInfo.currentLineIndex, this._highlightCursorInfo.initialLineIndex);\r\n\r\n let highlightRootY = this._scrollTop + startLineIndex * this._fontOffset.height;\r\n\r\n for (let i = startLineIndex; i <= endLineIndex; i++) {\r\n const line = this._lines[i];\r\n\r\n let highlightRootX = this._scrollLeft;\r\n switch (this._textHorizontalAlignment) {\r\n case Control.HORIZONTAL_ALIGNMENT_LEFT:\r\n highlightRootX += 0;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_RIGHT:\r\n highlightRootX += width - line.width;\r\n break;\r\n case Control.HORIZONTAL_ALIGNMENT_CENTER:\r\n highlightRootX += (width - line.width) / 2;\r\n break;\r\n }\r\n\r\n const begin = i === startLineIndex ? this._cursorInfo.relativeStartIndex : 0;\r\n const end = i === endLineIndex ? this._cursorInfo.relativeEndIndex : line.text.length;\r\n\r\n const leftOffsetWidth = context.measureText(line.text.substring(0, begin)).width;\r\n const selectedText = line.text.substring(begin, end);\r\n const hightlightWidth = context.measureText(selectedText).width;\r\n\r\n context.fillRect(highlightRootX + leftOffsetWidth, highlightRootY, hightlightWidth, this._fontOffset.height);\r\n\r\n highlightRootY += this._fontOffset.height;\r\n }\r\n\r\n if (this._cursorInfo.globalEndIndex === this._cursorInfo.globalStartIndex) {\r\n this._resetBlinking();\r\n }\r\n }\r\n }\r\n\r\n context.restore();\r\n\r\n // Border\r\n if (this._thickness) {\r\n if (this._isFocused) {\r\n if (this.focusedColor) {\r\n context.strokeStyle = this.focusedColor;\r\n }\r\n } else {\r\n if (this.color) {\r\n context.strokeStyle = this.color;\r\n }\r\n }\r\n\r\n context.lineWidth = this._thickness;\r\n\r\n context.strokeRect(\r\n this._currentMeasure.left + this._thickness / 2,\r\n this._currentMeasure.top + this._thickness / 2,\r\n this._currentMeasure.width - this._thickness,\r\n this._currentMeasure.height - this._thickness\r\n );\r\n }\r\n }\r\n\r\n private _resetBlinking() {\r\n clearTimeout(this._blinkTimeout);\r\n this._blinkTimeout = <any>setTimeout(() => {\r\n this._blinkIsEven = !this._blinkIsEven;\r\n this._markAsDirty();\r\n }, 500);\r\n }\r\n\r\n public override _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: PointerInfoBase): boolean {\r\n if (!super._onPointerDown(target, coordinates, pointerId, buttonIndex, pi)) {\r\n return false;\r\n }\r\n\r\n if (this.isReadOnly) {\r\n return true;\r\n }\r\n\r\n this._clickedCoordinateX = coordinates.x;\r\n this._clickedCoordinateY = coordinates.y;\r\n\r\n this._isTextHighlightOn = false;\r\n this._highlightedText = \"\";\r\n this._isPointerDown = true;\r\n this._host._capturingControl[pointerId] = this;\r\n if (this._host.focusedControl === this) {\r\n // Move cursor\r\n clearTimeout(this._blinkTimeout);\r\n this._markAsDirty();\r\n return true;\r\n }\r\n if (!this._isEnabled) {\r\n return false;\r\n }\r\n this._host.focusedControl = this;\r\n\r\n return true;\r\n }\r\n\r\n // for textselection\r\n public override _onPointerMove(target: Control, coordinates: Vector2, pointerId: number, pi: PointerInfoBase): void {\r\n // Avoid Chromium-like beahavior when this event is fired right after onPointerDown\r\n if (pi.event.movementX === 0 && pi.event.movementY === 0) {\r\n return;\r\n }\r\n\r\n if (this._host.focusedControl === this && this._isPointerDown && !this.isReadOnly) {\r\n this._clickedCoordinateX = coordinates.x;\r\n this._clickedCoordinateY = coordinates.y;\r\n\r\n if (!this._isTextHighlightOn) {\r\n this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex;\r\n this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex;\r\n this._highlightCursorInfo.initialRelativeStartIndex = this._cursorInfo.relativeStartIndex;\r\n\r\n this._isTextHighlightOn = true;\r\n }\r\n\r\n this._markAsDirty();\r\n }\r\n super._onPointerMove(target, coordinates, pointerId, pi);\r\n }\r\n\r\n /**\r\n * Apply the correct position of cursor according to current modification\r\n */\r\n private _updateCursorPosition() {\r\n if (!this._isFocused) {\r\n return;\r\n }\r\n\r\n if (!this._textWrapper.text && this.placeholderText) {\r\n this._cursorInfo.currentLineIndex = 0;\r\n this._cursorInfo.globalStartIndex = 0;\r\n this._cursorInfo.globalEndIndex = 0;\r\n this._cursorInfo.relativeStartIndex = 0;\r\n this._cursorInfo.relativeEndIndex = 0;\r\n } else {\r\n if (this._clickedCoordinateX && this._clickedCoordinateY) {\r\n if (!this._isTextHighlightOn) {\r\n this._cursorInfo = {\r\n globalStartIndex: 0,\r\n globalEndIndex: 0,\r\n relativeStartIndex: 0,\r\n relativeEndIndex: 0,\r\n currentLineIndex: 0,\r\n };\r\n }\r\n\r\n let globalIndex = 0;\r\n let relativeIndex = 0;\r\n\r\n const lastClickedCoordinateY = this._clickedCoordinateY - (this._scrollTop as number);\r\n\r\n const relativeCoordinateY = Math.floor(lastClickedCoordinateY / this._fontOffset.height);\r\n this._cursorInfo.currentLineIndex = Math.min(Math.max(relativeCoordinateY, 0), this._lines.length - 1);\r\n\r\n let currentSize = 0;\r\n\r\n const relativeXPosition = this._clickedCoordinateX - (this._scrollLeft ?? 0);\r\n\r\n let previousDist = 0;\r\n\r\n for (let index = 0; index < this._cursorInfo.currentLineIndex; index++) {\r\n const line = this._lines[index];\r\n globalIndex += line.text.length + line.lineEnding.length;\r\n }\r\n\r\n while (currentSize < relativeXPosition && this._lines[this._cursorInfo.currentLineIndex].text.length > relativeIndex) {\r\n relativeIndex++;\r\n previousDist = Math.abs(relativeXPosition - currentSize);\r\n currentSize = this._contextForBreakLines.measureText(this._lines[this._cursorInfo.currentLineIndex].text.substring(0, relativeIndex)).width;\r\n }\r\n\r\n // Find closest move\r\n if (Math.abs(relativeXPosition - currentSize) > previousDist && relativeIndex > 0) {\r\n relativeIndex--;\r\n }\r\n\r\n globalIndex += relativeIndex;\r\n\r\n if (!this._isTextHighlightOn) {\r\n this._cursorInfo.globalStartIndex = globalIndex;\r\n this._cursorInfo.relativeStartIndex = relativeIndex;\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n this._cursorInfo.relativeEndIndex = this._cursorInfo.relativeStartIndex;\r\n } else {\r\n if (globalIndex < this._highlightCursorInfo.initialStartIndex) {\r\n this._cursorInfo.globalStartIndex = globalIndex;\r\n this._cursorInfo.relativeStartIndex = relativeIndex;\r\n this._cursorInfo.globalEndIndex = this._highlightCursorInfo.initialStartIndex;\r\n this._cursorInfo.relativeEndIndex = this._highlightCursorInfo.initialRelativeStartIndex;\r\n } else {\r\n this._cursorInfo.globalStartIndex = this._highlightCursorInfo.initialStartIndex;\r\n this._cursorInfo.relativeStartIndex = this._highlightCursorInfo.initialRelativeStartIndex;\r\n this._cursorInfo.globalEndIndex = globalIndex;\r\n this._cursorInfo.relativeEndIndex = relativeIndex;\r\n }\r\n }\r\n\r\n // Avoid the caret during highlighting\r\n this._blinkIsEven = this._isTextHighlightOn;\r\n this._clickedCoordinateX = null;\r\n this._clickedCoordinateY = null;\r\n } else {\r\n // Standard behavior same as Current line is at least above the initial highlight index\r\n this._cursorInfo.relativeStartIndex = 0;\r\n this._cursorInfo.currentLineIndex = 0;\r\n\r\n let lineLength = this._lines[this._cursorInfo.currentLineIndex].text.length + this._lines[this._cursorInfo.currentLineIndex].lineEnding.length;\r\n let tmpLength = 0;\r\n\r\n while (tmpLength + lineLength <= this._cursorInfo.globalStartIndex) {\r\n tmpLength += lineLength;\r\n\r\n if (this._cursorInfo.currentLineIndex < this._lines.length - 1) {\r\n this._cursorInfo.currentLineIndex++;\r\n lineLength = this._lines[this._cursorInfo.currentLineIndex].text.length + this._lines[this._cursorInfo.currentLineIndex].lineEnding.length;\r\n }\r\n }\r\n\r\n this._cursorInfo.relativeStartIndex = this._cursorInfo.globalStartIndex - tmpLength;\r\n\r\n if (!this._isTextHighlightOn) {\r\n this._cursorInfo.relativeEndIndex = this._cursorInfo.relativeStartIndex;\r\n this._cursorInfo.globalEndIndex = this._cursorInfo.globalStartIndex;\r\n } else if (this._highlightCursorInfo.initialStartIndex !== -1 && this._cursorInfo.globalStartIndex >= this._highlightCursorInfo.initialStartIndex) {\r\n // Current line is at least below the initial highlight index\r\n while (tmpLength + lineLength <= this._cursorInfo.globalEndIndex) {\r\n tmpLength += lineLength;\r\n\r\n if (this._cursorInfo.currentLineIndex < this._lines.length - 1) {\r\n this._cursorInfo.currentLineIndex++;\r\n lineLength = this._lines[this._cursorInfo.currentLineIndex].text.length + this._lines[this._cursorInfo.currentLineIndex].lineEnding.length;\r\n }\r\n }\r\n\r\n this._cursorInfo.relativeEndIndex = this._cursorInfo.globalEndIndex - tmpLength;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Update all values of cursor information based on cursorIndex value\r\n *\r\n * @param offset The index to take care of\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected override _updateValueFromCursorIndex(offset: number) {\r\n // Override to avoid parent behavior during _onPointerMove\r\n }\r\n\r\n /**\r\n * Select the word immediatly under the cursor on double click\r\n *\r\n * @param _evt Pointer informations of double click\r\n * @internal\r\n */\r\n protected override _processDblClick(_evt: PointerInfo) {\r\n //pre-find the start and end index of the word under cursor, speeds up the rendering\r\n let moveLeft, moveRight;\r\n do {\r\n moveLeft = this._cursorInfo.globalStartIndex > 0 && this._textWrapper.isWord(this._cursorInfo.globalStartIndex - 1) ? --this._cursorInfo.globalStartIndex : 0;\r\n moveRight =\r\n this._cursorInfo.globalEndIndex < this._textWrapper.length && this._textWrapper.isWord(this._cursorInfo.globalEndIndex) ? ++this._cursorInfo.globalEndIndex : 0;\r\n } while (moveLeft || moveRight);\r\n\r\n this._highlightCursorInfo.initialLineIndex = this._cursorInfo.currentLineIndex;\r\n this._highlightCursorInfo.initialStartIndex = this._cursorInfo.globalStartIndex;\r\n\r\n this.onTextHighlightObservable.notifyObservers(this);\r\n\r\n this._isTextHighlightOn = true;\r\n this._blinkIsEven = true;\r\n this._markAsDirty();\r\n }\r\n\r\n /** @internal */\r\n public override selectAllText() {\r\n this._isTextHighlightOn = true;\r\n this._blinkIsEven = true;\r\n\r\n this._highlightCursorInfo = {\r\n initialStartIndex: 0,\r\n initialRelativeStartIndex: 0,\r\n initialLineIndex: 0,\r\n };\r\n\r\n this._cursorInfo = {\r\n globalStartIndex: 0,\r\n globalEndIndex: this._textWrapper.length,\r\n relativeEndIndex: this._lines[this._lines.length - 1].text.length,\r\n relativeStartIndex: 0,\r\n currentLineIndex: this._lines.length - 1,\r\n };\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n public override dispose() {\r\n super.dispose();\r\n\r\n this.onLinesReadyObservable.clear();\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.InputTextArea\", InputTextArea);\r\n","import { InputText } from \"./inputText\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { TextWrapper } from \"./textWrapper\";\r\n\r\n/**\r\n * Class used to create a password control\r\n */\r\nexport class InputPassword extends InputText {\r\n protected override _getTypeName(): string {\r\n return \"InputPassword\";\r\n }\r\n\r\n protected override _beforeRenderText(textWrapper: TextWrapper): TextWrapper {\r\n const pwdTextWrapper = new TextWrapper();\r\n let txt = \"\";\r\n for (let i = 0; i < textWrapper.length; i++) {\r\n txt += \"\\u2022\";\r\n }\r\n pwdTextWrapper.text = txt;\r\n return pwdTextWrapper;\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.InputPassword\", InputPassword);\r\n","import { type Nullable } from \"core/types\";\r\nimport { type Observer } from \"core/Misc/observable\";\r\nimport { Vector3, Matrix } from \"core/Maths/math.vector\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { type Scene } from \"core/scene\";\r\n\r\nimport { Control } from \"./control\";\r\nimport { ValueAndUnit } from \"../valueAndUnit\";\r\nimport { type Measure } from \"../measure\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\n\r\n/** Class used to render 2D lines */\r\nexport class Line extends Control {\r\n private _lineWidth = 1;\r\n /** @internal */\r\n public _x1 = new ValueAndUnit(0);\r\n /** @internal */\r\n public _y1 = new ValueAndUnit(0);\r\n /** @internal */\r\n public _x2 = new ValueAndUnit(0);\r\n /** @internal */\r\n public _y2 = new ValueAndUnit(0);\r\n private _dash = new Array<number>();\r\n private _connectedControl: Control;\r\n private _connectedControlDirtyObserver: Nullable<Observer<Control>>;\r\n\r\n /** Gets or sets the dash pattern */\r\n @serialize()\r\n public get dash(): Array<number> {\r\n return this._dash;\r\n }\r\n\r\n public set dash(value: Array<number>) {\r\n if (this._dash === value) {\r\n return;\r\n }\r\n\r\n this._dash = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the control connected with the line end */\r\n public get connectedControl(): Control {\r\n return this._connectedControl;\r\n }\r\n\r\n public set connectedControl(value: Control) {\r\n // Don't allow circular references, and no-op if the same control is assigned\r\n if (this._connectedControl === value || (value instanceof Line && value._connectedControl === (this as Control))) {\r\n return;\r\n }\r\n\r\n if (this._connectedControlDirtyObserver && this._connectedControl) {\r\n this._connectedControl.onDirtyObservable.remove(this._connectedControlDirtyObserver);\r\n this._connectedControlDirtyObserver = null;\r\n }\r\n\r\n if (value) {\r\n this._connectedControlDirtyObserver = value.onDirtyObservable.add(() => this._markAsDirty());\r\n }\r\n\r\n this._connectedControl = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets start coordinates on X axis */\r\n @serialize()\r\n public get x1(): string | number {\r\n return this._x1.toString(this._host);\r\n }\r\n\r\n public set x1(value: string | number) {\r\n if (this._x1.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._x1.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /** Gets or sets start coordinates on Y axis */\r\n @serialize()\r\n public get y1(): string | number {\r\n return this._y1.toString(this._host);\r\n }\r\n\r\n public set y1(value: string | number) {\r\n if (this._y1.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._y1.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /** Gets or sets end coordinates on X axis */\r\n @serialize()\r\n public get x2(): string | number {\r\n return this._x2.toString(this._host);\r\n }\r\n\r\n public set x2(value: string | number) {\r\n if (this._x2.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._x2.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /** Gets or sets end coordinates on Y axis */\r\n @serialize()\r\n public get y2(): string | number {\r\n return this._y2.toString(this._host);\r\n }\r\n\r\n public set y2(value: string | number) {\r\n if (this._y2.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._y2.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /** Gets or sets line width */\r\n @serialize()\r\n public get lineWidth(): number {\r\n return this._lineWidth;\r\n }\r\n\r\n public set lineWidth(value: number) {\r\n if (this._lineWidth === value) {\r\n return;\r\n }\r\n\r\n this._lineWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets horizontal alignment */\r\n public override set horizontalAlignment(value: number) {\r\n return;\r\n }\r\n\r\n /** Gets or sets vertical alignment */\r\n public override set verticalAlignment(value: number) {\r\n return;\r\n }\r\n\r\n /** @internal */\r\n public get _effectiveX2(): number {\r\n return (this._connectedControl ? this._connectedControl.centerX : 0) + this._x2.getValue(this._host);\r\n }\r\n\r\n /** @internal */\r\n public get _effectiveY2(): number {\r\n return (this._connectedControl ? this._connectedControl.centerY : 0) + this._y2.getValue(this._host);\r\n }\r\n\r\n /**\r\n * Creates a new Line\r\n * @param name defines the control name\r\n */\r\n constructor(public override name?: string) {\r\n super(name);\r\n\r\n this._automaticSize = true;\r\n\r\n this.isHitTestVisible = false;\r\n this._horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n this._verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"Line\";\r\n }\r\n\r\n public override _draw(context: ICanvasRenderingContext): void {\r\n context.save();\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio;\r\n context.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio;\r\n }\r\n\r\n this._applyStates(context);\r\n context.strokeStyle = this._getColor(context);\r\n context.lineWidth = this._lineWidth;\r\n context.setLineDash(this._dash);\r\n\r\n context.beginPath();\r\n context.moveTo(this._cachedParentMeasure.left + this._x1.getValue(this._host), this._cachedParentMeasure.top + this._y1.getValue(this._host));\r\n\r\n context.lineTo(this._cachedParentMeasure.left + this._effectiveX2, this._cachedParentMeasure.top + this._effectiveY2);\r\n context.stroke();\r\n\r\n context.restore();\r\n }\r\n\r\n public override _measure(): void {\r\n // Width / Height\r\n this._currentMeasure.width = Math.abs(this._x1.getValue(this._host) - this._effectiveX2) + this._lineWidth;\r\n this._currentMeasure.height = Math.abs(this._y1.getValue(this._host) - this._effectiveY2) + this._lineWidth;\r\n }\r\n\r\n public override _layout(parentMeasure: Measure, context: ICanvasRenderingContext): boolean {\r\n if (this._connectedControl) {\r\n // If we have a connected control, we need to let it layout first so we can ensure our layout math uses its latest position\r\n this._connectedControl._layout(parentMeasure, context);\r\n }\r\n return super._layout(parentMeasure, context);\r\n }\r\n\r\n protected override _computeAlignment(parentMeasure: Measure): void {\r\n this._currentMeasure.left = parentMeasure.left + Math.min(this._x1.getValue(this._host), this._effectiveX2) - this._lineWidth / 2;\r\n this._currentMeasure.top = parentMeasure.top + Math.min(this._y1.getValue(this._host), this._effectiveY2) - this._lineWidth / 2;\r\n }\r\n\r\n /**\r\n * Move one end of the line given 3D cartesian coordinates.\r\n * @param position Targeted world position\r\n * @param scene Scene\r\n * @param end (opt) Set to true to assign x2 and y2 coordinates of the line. Default assign to x1 and y1.\r\n */\r\n public override moveToVector3(position: Vector3, scene: Scene, end: boolean = false): void {\r\n if (!this._host || this.parent !== this._host._rootContainer) {\r\n Tools.Error(\"Cannot move a control to a vector3 if the control is not at root level\");\r\n return;\r\n }\r\n\r\n const globalViewport = this._host._getGlobalViewport();\r\n const projectedPosition = Vector3.Project(position, Matrix.IdentityReadOnly, scene.getTransformMatrix(), globalViewport);\r\n\r\n this._moveToProjectedPosition(projectedPosition, end);\r\n\r\n if (projectedPosition.z < 0 || projectedPosition.z > 1) {\r\n this.notRenderable = true;\r\n return;\r\n }\r\n this.notRenderable = false;\r\n }\r\n\r\n /**\r\n * Move one end of the line to a position in screen absolute space.\r\n * @param projectedPosition Position in screen absolute space (X, Y)\r\n * @param end (opt) Set to true to assign x2 and y2 coordinates of the line. Default assign to x1 and y1.\r\n */\r\n public override _moveToProjectedPosition(projectedPosition: Vector3, end: boolean = false): void {\r\n const x: string = projectedPosition.x + this._linkOffsetX.getValue(this._host) + \"px\";\r\n const y: string = projectedPosition.y + this._linkOffsetY.getValue(this._host) + \"px\";\r\n\r\n if (end) {\r\n this.x2 = x;\r\n this.y2 = y;\r\n this._x2.ignoreAdaptiveScaling = true;\r\n this._y2.ignoreAdaptiveScaling = true;\r\n } else {\r\n this.x1 = x;\r\n this.y1 = y;\r\n this._x1.ignoreAdaptiveScaling = true;\r\n this._y1.ignoreAdaptiveScaling = true;\r\n }\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.Line\", Line);\r\n","import { type Nullable } from \"core/types\";\r\nimport { type Observer } from \"core/Misc/observable\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { Epsilon } from \"core/Maths/math.constants\";\r\nimport { type Camera } from \"core/Cameras/camera\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\n\r\nimport { type MultiLine } from \"./controls/multiLine\";\r\nimport { ValueAndUnit } from \"./valueAndUnit\";\r\nimport { type Control } from \"./controls/control\";\r\n\r\n/**\r\n * Class used to store a point for a MultiLine object.\r\n * The point can be pure 2D coordinates, a mesh or a control\r\n */\r\nexport class MultiLinePoint {\r\n private _multiLine: MultiLine;\r\n\r\n private _x: ValueAndUnit;\r\n private _y: ValueAndUnit;\r\n private _control: Nullable<Control>;\r\n private _mesh: Nullable<AbstractMesh>;\r\n\r\n private _controlObserver: Nullable<Observer<Control>>;\r\n private _meshObserver: Nullable<Observer<Camera>>;\r\n\r\n /** @internal */\r\n public _point: Vector3;\r\n\r\n /**\r\n * Creates a new MultiLinePoint\r\n * @param multiLine defines the source MultiLine object\r\n */\r\n constructor(multiLine: MultiLine) {\r\n this._multiLine = multiLine;\r\n\r\n this._x = new ValueAndUnit(0);\r\n this._y = new ValueAndUnit(0);\r\n\r\n this._point = new Vector3(0, 0, 0);\r\n }\r\n\r\n /** Gets or sets x coordinate */\r\n public get x(): string | number {\r\n return this._x.toString(this._multiLine._host);\r\n }\r\n\r\n public set x(value: string | number) {\r\n if (this._x.toString(this._multiLine._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._x.fromString(value)) {\r\n this._multiLine._markAsDirty();\r\n }\r\n }\r\n\r\n /** Gets or sets y coordinate */\r\n public get y(): string | number {\r\n return this._y.toString(this._multiLine._host);\r\n }\r\n\r\n public set y(value: string | number) {\r\n if (this._y.toString(this._multiLine._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._y.fromString(value)) {\r\n this._multiLine._markAsDirty();\r\n }\r\n }\r\n\r\n /** Gets or sets the control associated with this point */\r\n public get control(): Nullable<Control> {\r\n return this._control;\r\n }\r\n\r\n public set control(value: Nullable<Control>) {\r\n if (this._control === value) {\r\n return;\r\n }\r\n\r\n if (this._control && this._controlObserver) {\r\n this._control.onDirtyObservable.remove(this._controlObserver);\r\n\r\n this._controlObserver = null;\r\n }\r\n\r\n this._control = value;\r\n\r\n if (this._control) {\r\n this._controlObserver = this._control.onDirtyObservable.add(this._multiLine.onPointUpdate);\r\n }\r\n\r\n this._multiLine._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the mesh associated with this point */\r\n public get mesh(): Nullable<AbstractMesh> {\r\n return this._mesh;\r\n }\r\n\r\n public set mesh(value: Nullable<AbstractMesh>) {\r\n if (this._mesh === value) {\r\n return;\r\n }\r\n\r\n if (this._mesh && this._meshObserver) {\r\n this._mesh.getScene().onAfterCameraRenderObservable.remove(this._meshObserver);\r\n }\r\n\r\n this._mesh = value;\r\n\r\n if (this._mesh) {\r\n this._meshObserver = this._mesh.getScene().onAfterCameraRenderObservable.add(this._multiLine.onPointUpdate);\r\n }\r\n\r\n this._multiLine._markAsDirty();\r\n }\r\n\r\n /** Resets links */\r\n public resetLinks(): void {\r\n this.control = null;\r\n this.mesh = null;\r\n }\r\n\r\n /**\r\n * Gets a translation vector with Z component\r\n * @returns the translation vector\r\n */\r\n public translate(): Vector3 {\r\n this._point = this._translatePoint();\r\n\r\n return this._point;\r\n }\r\n\r\n private _translatePoint(): Vector3 {\r\n if (this._mesh != null) {\r\n return this._multiLine._host.getProjectedPositionWithZ(this._mesh.getBoundingInfo().boundingSphere.center, this._mesh.getWorldMatrix());\r\n } else if (this._control != null) {\r\n return new Vector3(this._control.centerX, this._control.centerY, 1 - Epsilon);\r\n } else {\r\n const host: any = this._multiLine._host as any;\r\n\r\n const xValue: number = this._x.getValueInPixel(host, Number(host._canvas.width));\r\n const yValue: number = this._y.getValueInPixel(host, Number(host._canvas.height));\r\n\r\n return new Vector3(xValue, yValue, 1 - Epsilon);\r\n }\r\n }\r\n\r\n /** Release associated resources */\r\n public dispose(): void {\r\n this.resetLinks();\r\n }\r\n}\r\n","import { type Nullable } from \"core/types\";\r\nimport { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\n\r\nimport { Control } from \"./control\";\r\nimport { MultiLinePoint } from \"../multiLinePoint\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { type Vector3 } from \"core/Maths/math.vector\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\n\r\n/**\r\n * Class used to create multi line control\r\n */\r\nexport class MultiLine extends Control {\r\n private _lineWidth: number = 1;\r\n private _dash: number[];\r\n private _points: Nullable<MultiLinePoint>[];\r\n\r\n private _minX: Nullable<number>;\r\n private _minY: Nullable<number>;\r\n private _maxX: Nullable<number>;\r\n private _maxY: Nullable<number>;\r\n\r\n /**\r\n * Creates a new MultiLine\r\n * @param name defines the control name\r\n */\r\n constructor(public override name?: string) {\r\n super(name);\r\n\r\n this._automaticSize = true;\r\n this.isHitTestVisible = false;\r\n this._horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n this._verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\r\n\r\n this._dash = [];\r\n this._points = [];\r\n }\r\n\r\n /** Gets or sets dash pattern */\r\n @serialize()\r\n public get dash(): Array<number> {\r\n return this._dash;\r\n }\r\n\r\n public set dash(value: Array<number>) {\r\n if (this._dash === value) {\r\n return;\r\n }\r\n\r\n this._dash = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets point stored at specified index\r\n * @param index defines the index to look for\r\n * @returns the requested point if found\r\n */\r\n public getAt(index: number): MultiLinePoint {\r\n if (!this._points[index]) {\r\n this._points[index] = new MultiLinePoint(this);\r\n }\r\n\r\n return this._points[index];\r\n }\r\n\r\n /** Function called when a point is updated */\r\n public onPointUpdate = (): void => {\r\n this._markAsDirty();\r\n };\r\n\r\n /**\r\n * Adds new points to the point collection\r\n * @param items defines the list of items (mesh, control or 2d coordinates) to add\r\n * @returns the list of created MultiLinePoint\r\n */\r\n public add(...items: (AbstractMesh | Control | { x: string | number; y: string | number })[]): MultiLinePoint[] {\r\n return items.map((item) => this.push(item));\r\n }\r\n\r\n /**\r\n * Adds a new point to the point collection\r\n * @param item defines the item (mesh, control or 2d coordinates) to add\r\n * @returns the created MultiLinePoint\r\n */\r\n public push(item?: AbstractMesh | Control | { x: string | number; y: string | number }): MultiLinePoint {\r\n const point: MultiLinePoint = this.getAt(this._points.length);\r\n\r\n if (item == null) {\r\n return point;\r\n }\r\n\r\n if (item instanceof AbstractMesh) {\r\n point.mesh = item;\r\n } else if (item instanceof Control) {\r\n point.control = item;\r\n } else if (item.x != null && item.y != null) {\r\n point.x = item.x;\r\n point.y = item.y;\r\n }\r\n\r\n return point;\r\n }\r\n\r\n /**\r\n * Remove a specific value or point from the active point collection\r\n * @param value defines the value or point to remove\r\n */\r\n public remove(value: number | MultiLinePoint): void {\r\n let index: number;\r\n\r\n if (value instanceof MultiLinePoint) {\r\n index = this._points.indexOf(value);\r\n\r\n if (index === -1) {\r\n return;\r\n }\r\n } else {\r\n index = value;\r\n }\r\n\r\n const point: Nullable<MultiLinePoint> = this._points[index];\r\n\r\n if (!point) {\r\n return;\r\n }\r\n\r\n point.dispose();\r\n\r\n this._points.splice(index, 1);\r\n }\r\n\r\n /**\r\n * Resets this object to initial state (no point)\r\n */\r\n public reset(): void {\r\n while (this._points.length > 0) {\r\n this.remove(this._points.length - 1);\r\n }\r\n }\r\n\r\n /**\r\n * Resets all links\r\n */\r\n public resetLinks(): void {\r\n for (const point of this._points) {\r\n if (point != null) {\r\n point.resetLinks();\r\n }\r\n }\r\n }\r\n\r\n /** Gets or sets line width */\r\n public get lineWidth(): number {\r\n return this._lineWidth;\r\n }\r\n\r\n public set lineWidth(value: number) {\r\n if (this._lineWidth === value) {\r\n return;\r\n }\r\n\r\n this._lineWidth = value;\r\n this._markAsDirty();\r\n }\r\n\r\n public override set horizontalAlignment(value: number) {\r\n return;\r\n }\r\n\r\n public override set verticalAlignment(value: number) {\r\n return;\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"MultiLine\";\r\n }\r\n\r\n public override _draw(context: ICanvasRenderingContext): void {\r\n context.save();\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio;\r\n context.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio;\r\n }\r\n\r\n this._applyStates(context);\r\n\r\n context.strokeStyle = this.color;\r\n context.lineWidth = this._lineWidth;\r\n context.setLineDash(this._dash);\r\n\r\n context.beginPath();\r\n\r\n let first: boolean = true; //first index is not necessarily 0\r\n let previousPoint: Vector3;\r\n\r\n for (const point of this._points) {\r\n if (!point) {\r\n continue;\r\n }\r\n\r\n if (first) {\r\n context.moveTo(point._point.x, point._point.y);\r\n\r\n first = false;\r\n } else {\r\n if (point._point.z < 1 && previousPoint!.z < 1) {\r\n context.lineTo(point._point.x, point._point.y);\r\n } else {\r\n context.moveTo(point._point.x, point._point.y);\r\n }\r\n }\r\n previousPoint = point._point;\r\n }\r\n\r\n context.stroke();\r\n\r\n context.restore();\r\n }\r\n\r\n protected override _additionalProcessing(): void {\r\n this._minX = null;\r\n this._minY = null;\r\n this._maxX = null;\r\n this._maxY = null;\r\n\r\n for (const point of this._points) {\r\n if (!point) {\r\n continue;\r\n }\r\n\r\n point.translate();\r\n\r\n if (this._minX == null || point._point.x < this._minX) {\r\n this._minX = point._point.x;\r\n }\r\n if (this._minY == null || point._point.y < this._minY) {\r\n this._minY = point._point.y;\r\n }\r\n if (this._maxX == null || point._point.x > this._maxX) {\r\n this._maxX = point._point.x;\r\n }\r\n if (this._maxY == null || point._point.y > this._maxY) {\r\n this._maxY = point._point.y;\r\n }\r\n }\r\n\r\n if (this._minX == null) {\r\n this._minX = 0;\r\n }\r\n if (this._minY == null) {\r\n this._minY = 0;\r\n }\r\n if (this._maxX == null) {\r\n this._maxX = 0;\r\n }\r\n if (this._maxY == null) {\r\n this._maxY = 0;\r\n }\r\n }\r\n\r\n public override _measure(): void {\r\n if (this._minX == null || this._maxX == null || this._minY == null || this._maxY == null) {\r\n return;\r\n }\r\n\r\n this._currentMeasure.width = Math.abs(this._maxX - this._minX) + this._lineWidth;\r\n this._currentMeasure.height = Math.abs(this._maxY - this._minY) + this._lineWidth;\r\n }\r\n\r\n protected override _computeAlignment(): void {\r\n if (this._minX == null || this._minY == null) {\r\n return;\r\n }\r\n\r\n this._currentMeasure.left = this._minX - this._lineWidth / 2;\r\n this._currentMeasure.top = this._minY - this._lineWidth / 2;\r\n }\r\n\r\n public override dispose(): void {\r\n this.reset();\r\n\r\n super.dispose();\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.MultiLine\", MultiLine);\r\n","import { Observable } from \"core/Misc/observable\";\r\nimport { type Vector2 } from \"core/Maths/math.vector\";\r\n\r\nimport { Control } from \"./control\";\r\nimport { StackPanel } from \"./stackPanel\";\r\nimport { TextBlock } from \"./textBlock\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { type PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\n\r\n/**\r\n * Class used to create radio button controls\r\n */\r\nexport class RadioButton extends Control {\r\n private _isChecked = false;\r\n private _background = \"black\";\r\n private _checkSizeRatio = 0.8;\r\n private _thickness = 1;\r\n\r\n /** Gets or sets border thickness */\r\n @serialize()\r\n public get thickness(): number {\r\n return this._thickness;\r\n }\r\n\r\n public set thickness(value: number) {\r\n if (this._thickness === value) {\r\n return;\r\n }\r\n\r\n this._thickness = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets group name */\r\n @serialize()\r\n public group = \"\";\r\n\r\n /** Observable raised when isChecked is changed */\r\n public onIsCheckedChangedObservable = new Observable<boolean>();\r\n\r\n /** Gets or sets a value indicating the ratio between overall size and check size */\r\n @serialize()\r\n public get checkSizeRatio(): number {\r\n return this._checkSizeRatio;\r\n }\r\n\r\n public set checkSizeRatio(value: number) {\r\n value = Math.max(Math.min(1, value), 0);\r\n\r\n if (this._checkSizeRatio === value) {\r\n return;\r\n }\r\n\r\n this._checkSizeRatio = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets background color */\r\n @serialize()\r\n public get background(): string {\r\n return this._background;\r\n }\r\n\r\n public set background(value: string) {\r\n if (this._background === value) {\r\n return;\r\n }\r\n\r\n this._background = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the checkbox is checked or not */\r\n @serialize()\r\n public get isChecked(): boolean {\r\n return this._isChecked;\r\n }\r\n\r\n public set isChecked(value: boolean) {\r\n if (this._isChecked === value) {\r\n return;\r\n }\r\n\r\n this._isChecked = value;\r\n this._markAsDirty();\r\n\r\n this.onIsCheckedChangedObservable.notifyObservers(value);\r\n\r\n if (this._isChecked && this._host) {\r\n // Update all controls from same group\r\n this._host.executeOnAllControls((control) => {\r\n if (control === this) {\r\n return;\r\n }\r\n\r\n if ((<any>control).group === undefined) {\r\n return;\r\n }\r\n const childRadio = <RadioButton>control;\r\n if (childRadio.group === this.group) {\r\n childRadio.isChecked = false;\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new RadioButton\r\n * @param name defines the control name\r\n */\r\n constructor(public override name?: string) {\r\n super(name);\r\n\r\n this.isPointerBlocker = true;\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"RadioButton\";\r\n }\r\n\r\n public override _draw(context: ICanvasRenderingContext): void {\r\n context.save();\r\n\r\n this._applyStates(context);\r\n const actualWidth = this._currentMeasure.width - this._thickness;\r\n const actualHeight = this._currentMeasure.height - this._thickness;\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio;\r\n context.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio;\r\n }\r\n\r\n // Outer\r\n Control.drawEllipse(\r\n this._currentMeasure.left + this._currentMeasure.width / 2,\r\n this._currentMeasure.top + this._currentMeasure.height / 2,\r\n this._currentMeasure.width / 2 - this._thickness / 2,\r\n this._currentMeasure.height / 2 - this._thickness / 2,\r\n 1,\r\n context\r\n );\r\n\r\n context.fillStyle = this._isEnabled ? this._background : this._disabledColor;\r\n context.fill();\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowBlur = 0;\r\n context.shadowOffsetX = 0;\r\n context.shadowOffsetY = 0;\r\n }\r\n\r\n context.strokeStyle = this.color;\r\n context.lineWidth = this._thickness;\r\n\r\n context.stroke();\r\n\r\n // Inner\r\n if (this._isChecked) {\r\n context.fillStyle = this._isEnabled ? this.color : this._disabledColor;\r\n const offsetWidth = actualWidth * this._checkSizeRatio;\r\n const offseHeight = actualHeight * this._checkSizeRatio;\r\n\r\n Control.drawEllipse(\r\n this._currentMeasure.left + this._currentMeasure.width / 2,\r\n this._currentMeasure.top + this._currentMeasure.height / 2,\r\n offsetWidth / 2 - this._thickness / 2,\r\n offseHeight / 2 - this._thickness / 2,\r\n 1,\r\n context\r\n );\r\n\r\n context.fill();\r\n }\r\n context.restore();\r\n }\r\n\r\n // Events\r\n public override _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: PointerInfoBase): boolean {\r\n if (!super._onPointerDown(target, coordinates, pointerId, buttonIndex, pi)) {\r\n return false;\r\n }\r\n\r\n if (this.isReadOnly) {\r\n return true;\r\n }\r\n\r\n if (!this.isChecked) {\r\n this.isChecked = true;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Utility function to easily create a radio button with a header\r\n * @param title defines the label to use for the header\r\n * @param group defines the group to use for the radio button\r\n * @param isChecked defines the initial state of the radio button\r\n * @param onValueChanged defines the callback to call when value changes\r\n * @returns a StackPanel containing the radio button and a textBlock\r\n */\r\n public static AddRadioButtonWithHeader(title: string, group: string, isChecked: boolean, onValueChanged: (button: RadioButton, value: boolean) => void): StackPanel {\r\n const panel = new StackPanel();\r\n panel.isVertical = false;\r\n panel.height = \"30px\";\r\n\r\n const radio = new RadioButton();\r\n radio.width = \"20px\";\r\n radio.height = \"20px\";\r\n radio.isChecked = isChecked;\r\n radio.color = \"green\";\r\n radio.group = group;\r\n radio.onIsCheckedChangedObservable.add((value) => onValueChanged(radio, value));\r\n panel.addControl(radio);\r\n\r\n const header = new TextBlock();\r\n header.text = title;\r\n header.width = \"180px\";\r\n header.paddingLeft = \"5px\";\r\n header.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n header.color = \"white\";\r\n panel.addControl(header);\r\n\r\n return panel;\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.RadioButton\", RadioButton);\r\n","import { Observable } from \"core/Misc/observable\";\r\nimport { type Vector2 } from \"core/Maths/math.vector\";\r\n\r\nimport { Control } from \"../control\";\r\nimport { ValueAndUnit } from \"../../valueAndUnit\";\r\nimport { type PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\n/**\r\n * Class used to create slider controls\r\n */\r\nexport class BaseSlider extends Control {\r\n protected _thumbWidth = new ValueAndUnit(20, ValueAndUnit.UNITMODE_PIXEL, false);\r\n private _minimum = 0;\r\n private _maximum = 100;\r\n private _value = 50;\r\n private _isVertical = false;\r\n protected _barOffset = new ValueAndUnit(5, ValueAndUnit.UNITMODE_PIXEL, false);\r\n private _isThumbClamped = false;\r\n protected _displayThumb = true;\r\n private _step = 0;\r\n\r\n private _lastPointerDownId = -1;\r\n\r\n // Shared rendering info\r\n protected _effectiveBarOffset = 0;\r\n protected _renderLeft: number;\r\n protected _renderTop: number;\r\n protected _renderWidth: number;\r\n protected _renderHeight: number;\r\n protected _backgroundBoxLength: number;\r\n protected _backgroundBoxThickness: number;\r\n protected _effectiveThumbThickness: number;\r\n\r\n /** Observable raised when the slider value changes */\r\n public onValueChangedObservable = new Observable<number>();\r\n\r\n /** Gets or sets a boolean indicating if the thumb must be rendered */\r\n @serialize()\r\n public get displayThumb(): boolean {\r\n return this._displayThumb;\r\n }\r\n\r\n public set displayThumb(value: boolean) {\r\n if (this._displayThumb === value) {\r\n return;\r\n }\r\n\r\n this._displayThumb = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets a step to apply to values (0 by default) */\r\n @serialize()\r\n public get step(): number {\r\n return this._step;\r\n }\r\n\r\n public set step(value: number) {\r\n if (this._step === value) {\r\n return;\r\n }\r\n\r\n this._step = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets main bar offset (ie. the margin applied to the value bar) */\r\n @serialize()\r\n public get barOffset(): string | number {\r\n return this._barOffset.toString(this._host);\r\n }\r\n\r\n /** Gets main bar offset in pixels*/\r\n public get barOffsetInPixels(): number {\r\n return this._barOffset.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set barOffset(value: string | number) {\r\n if (this._barOffset.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._barOffset.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /** Gets or sets thumb width */\r\n @serialize()\r\n public get thumbWidth(): string | number {\r\n return this._thumbWidth.toString(this._host);\r\n }\r\n\r\n /** Gets thumb width in pixels */\r\n public get thumbWidthInPixels(): number {\r\n return this._thumbWidth.getValueInPixel(this._host, this._cachedParentMeasure.width);\r\n }\r\n\r\n public set thumbWidth(value: string | number) {\r\n if (this._thumbWidth.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._thumbWidth.fromString(value)) {\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /** Gets or sets minimum value */\r\n @serialize()\r\n public get minimum(): number {\r\n return this._minimum;\r\n }\r\n\r\n public set minimum(value: number) {\r\n if (this._minimum === value) {\r\n return;\r\n }\r\n\r\n this._minimum = value;\r\n this._markAsDirty();\r\n\r\n this.value = Math.max(Math.min(this.value, this._maximum), this._minimum);\r\n }\r\n\r\n /** Gets or sets maximum value */\r\n @serialize()\r\n public get maximum(): number {\r\n return this._maximum;\r\n }\r\n\r\n public set maximum(value: number) {\r\n if (this._maximum === value) {\r\n return;\r\n }\r\n\r\n this._maximum = value;\r\n this._markAsDirty();\r\n\r\n this.value = Math.max(Math.min(this.value, this._maximum), this._minimum);\r\n }\r\n\r\n /** Gets or sets current value */\r\n @serialize()\r\n public get value(): number {\r\n return this._value;\r\n }\r\n\r\n public set value(value: number) {\r\n value = Math.max(Math.min(value, this._maximum), this._minimum);\r\n\r\n if (this._value === value) {\r\n return;\r\n }\r\n\r\n this._value = value;\r\n this._markAsDirty();\r\n this.onValueChangedObservable.notifyObservers(this._value, undefined, this, this);\r\n }\r\n\r\n /**Gets or sets a boolean indicating if the slider should be vertical or horizontal */\r\n @serialize()\r\n public get isVertical(): boolean {\r\n return this._isVertical;\r\n }\r\n\r\n public set isVertical(value: boolean) {\r\n if (this._isVertical === value) {\r\n return;\r\n }\r\n\r\n this._isVertical = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets a value indicating if the thumb can go over main bar extends */\r\n @serialize()\r\n public get isThumbClamped(): boolean {\r\n return this._isThumbClamped;\r\n }\r\n\r\n public set isThumbClamped(value: boolean) {\r\n if (this._isThumbClamped === value) {\r\n return;\r\n }\r\n\r\n this._isThumbClamped = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Creates a new BaseSlider\r\n * @param name defines the control name\r\n */\r\n constructor(public override name?: string) {\r\n super(name);\r\n\r\n this.isPointerBlocker = true;\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"BaseSlider\";\r\n }\r\n\r\n protected _getThumbPosition() {\r\n if (this.isVertical) {\r\n return ((this.maximum - this.value) / (this.maximum - this.minimum)) * this._backgroundBoxLength;\r\n }\r\n\r\n return ((this.value - this.minimum) / (this.maximum - this.minimum)) * this._backgroundBoxLength;\r\n }\r\n\r\n protected _getThumbThickness(type: string): number {\r\n let thumbThickness = 0;\r\n switch (type) {\r\n case \"circle\":\r\n if (this._thumbWidth.isPixel) {\r\n thumbThickness = Math.max(this._thumbWidth.getValue(this._host), this._backgroundBoxThickness);\r\n } else {\r\n thumbThickness = this._backgroundBoxThickness * this._thumbWidth.getValue(this._host);\r\n }\r\n break;\r\n case \"rectangle\":\r\n if (this._thumbWidth.isPixel) {\r\n thumbThickness = Math.min(this._thumbWidth.getValue(this._host), this._backgroundBoxThickness);\r\n } else {\r\n thumbThickness = this._backgroundBoxThickness * this._thumbWidth.getValue(this._host);\r\n }\r\n }\r\n return thumbThickness;\r\n }\r\n\r\n protected _prepareRenderingData(type: string) {\r\n // Main bar\r\n this._effectiveBarOffset = 0;\r\n this._renderLeft = this._currentMeasure.left;\r\n this._renderTop = this._currentMeasure.top;\r\n this._renderWidth = this._currentMeasure.width;\r\n this._renderHeight = this._currentMeasure.height;\r\n\r\n this._backgroundBoxLength = Math.max(this._currentMeasure.width, this._currentMeasure.height);\r\n this._backgroundBoxThickness = Math.min(this._currentMeasure.width, this._currentMeasure.height);\r\n this._effectiveThumbThickness = this._getThumbThickness(type);\r\n\r\n if (this.displayThumb) {\r\n this._backgroundBoxLength -= this._effectiveThumbThickness;\r\n }\r\n //throw error when height is less than width for vertical slider\r\n if (this.isVertical && this._currentMeasure.height < this._currentMeasure.width) {\r\n Logger.Error(\"Height should be greater than width\");\r\n return;\r\n }\r\n if (this._barOffset.isPixel) {\r\n this._effectiveBarOffset = Math.min(this._barOffset.getValue(this._host), this._backgroundBoxThickness);\r\n } else {\r\n this._effectiveBarOffset = this._backgroundBoxThickness * this._barOffset.getValue(this._host);\r\n }\r\n\r\n this._backgroundBoxThickness -= this._effectiveBarOffset * 2;\r\n\r\n if (this.isVertical) {\r\n this._renderLeft += this._effectiveBarOffset;\r\n if (!this.isThumbClamped && this.displayThumb) {\r\n this._renderTop += this._effectiveThumbThickness / 2;\r\n }\r\n\r\n this._renderHeight = this._backgroundBoxLength;\r\n this._renderWidth = this._backgroundBoxThickness;\r\n } else {\r\n this._renderTop += this._effectiveBarOffset;\r\n if (!this.isThumbClamped && this.displayThumb) {\r\n this._renderLeft += this._effectiveThumbThickness / 2;\r\n }\r\n this._renderHeight = this._backgroundBoxThickness;\r\n this._renderWidth = this._backgroundBoxLength;\r\n }\r\n }\r\n\r\n // Events\r\n private _pointerIsDown = false;\r\n\r\n /**\r\n * @internal\r\n */\r\n protected _updateValueFromPointer(x: number, y: number): void {\r\n this._invertTransformMatrix.transformCoordinates(x, y, this._transformedPosition);\r\n x = this._transformedPosition.x;\r\n y = this._transformedPosition.y;\r\n\r\n let value: number;\r\n if (this._isVertical) {\r\n value = this._minimum + (1 - (y - this._currentMeasure.top) / this._currentMeasure.height) * (this._maximum - this._minimum);\r\n } else {\r\n value = this._minimum + ((x - this._currentMeasure.left) / this._currentMeasure.width) * (this._maximum - this._minimum);\r\n }\r\n this.value = this._step ? Math.round(value / this._step) * this._step : value;\r\n }\r\n\r\n public override _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: PointerInfoBase): boolean {\r\n if (!super._onPointerDown(target, coordinates, pointerId, buttonIndex, pi)) {\r\n return false;\r\n }\r\n\r\n if (this.isReadOnly) {\r\n return true;\r\n }\r\n\r\n this._pointerIsDown = true;\r\n\r\n this._updateValueFromPointer(coordinates.x, coordinates.y);\r\n this._host._capturingControl[pointerId] = this;\r\n this._lastPointerDownId = pointerId;\r\n return true;\r\n }\r\n\r\n public override _onPointerMove(target: Control, coordinates: Vector2, pointerId: number, pi: PointerInfoBase): void {\r\n // Only listen to pointer move events coming from the last pointer to click on the element (To support dual vr controller interaction)\r\n if (pointerId != this._lastPointerDownId) {\r\n return;\r\n }\r\n\r\n if (this._pointerIsDown && !this.isReadOnly) {\r\n this._updateValueFromPointer(coordinates.x, coordinates.y);\r\n }\r\n super._onPointerMove(target, coordinates, pointerId, pi);\r\n }\r\n\r\n public override _onPointerUp(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, notifyClick: boolean): void {\r\n this._pointerIsDown = false;\r\n\r\n delete this._host._capturingControl[pointerId];\r\n super._onPointerUp(target, coordinates, pointerId, buttonIndex, notifyClick);\r\n }\r\n\r\n public override _onCanvasBlur(): void {\r\n this._forcePointerUp();\r\n super._onCanvasBlur();\r\n }\r\n}\r\n","import { BaseSlider } from \"./baseSlider\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type BaseGradient } from \"../gradient/BaseGradient\";\r\nimport { type AdvancedDynamicTexture } from \"gui/2D/advancedDynamicTexture\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\n/**\r\n * Class used to create slider controls\r\n */\r\nexport class Slider extends BaseSlider {\r\n private _background = \"black\";\r\n private _borderColor = \"white\";\r\n private _thumbColor = \"\";\r\n private _isThumbCircle = false;\r\n protected _displayValueBar = true;\r\n private _backgroundGradient: Nullable<BaseGradient> = null;\r\n\r\n /** Gets or sets a boolean indicating if the value bar must be rendered */\r\n @serialize()\r\n public get displayValueBar(): boolean {\r\n return this._displayValueBar;\r\n }\r\n\r\n public set displayValueBar(value: boolean) {\r\n if (this._displayValueBar === value) {\r\n return;\r\n }\r\n\r\n this._displayValueBar = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets border color */\r\n @serialize()\r\n public get borderColor(): string {\r\n return this._borderColor;\r\n }\r\n\r\n public set borderColor(value: string) {\r\n if (this._borderColor === value) {\r\n return;\r\n }\r\n\r\n this._borderColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets background color */\r\n @serialize()\r\n public get background(): string {\r\n return this._background;\r\n }\r\n\r\n public set background(value: string) {\r\n if (this._background === value) {\r\n return;\r\n }\r\n\r\n this._background = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets background gradient */\r\n public get backgroundGradient(): Nullable<BaseGradient> {\r\n return this._backgroundGradient;\r\n }\r\n\r\n public set backgroundGradient(value: Nullable<BaseGradient>) {\r\n if (this._backgroundGradient === value) {\r\n return;\r\n }\r\n\r\n this._backgroundGradient = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets thumb's color */\r\n @serialize()\r\n public get thumbColor(): string {\r\n return this._thumbColor;\r\n }\r\n\r\n public set thumbColor(value: string) {\r\n if (this._thumbColor === value) {\r\n return;\r\n }\r\n\r\n this._thumbColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the thumb should be round or square */\r\n @serialize()\r\n public get isThumbCircle(): boolean {\r\n return this._isThumbCircle;\r\n }\r\n\r\n public set isThumbCircle(value: boolean) {\r\n if (this._isThumbCircle === value) {\r\n return;\r\n }\r\n\r\n this._isThumbCircle = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Creates a new Slider\r\n * @param name defines the control name\r\n */\r\n constructor(public override name?: string) {\r\n super(name);\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"Slider\";\r\n }\r\n\r\n protected _getBackgroundColor(context: ICanvasRenderingContext) {\r\n return this._backgroundGradient ? this._backgroundGradient.getCanvasGradient(context) : this._background;\r\n }\r\n\r\n public override _draw(context: ICanvasRenderingContext): void {\r\n context.save();\r\n\r\n this._applyStates(context);\r\n this._prepareRenderingData(this.isThumbCircle ? \"circle\" : \"rectangle\");\r\n let left = this._renderLeft;\r\n let top = this._renderTop;\r\n const width = this._renderWidth;\r\n const height = this._renderHeight;\r\n\r\n let radius: number;\r\n\r\n if (this.isThumbClamped && this.isThumbCircle) {\r\n if (this.isVertical) {\r\n top += this._effectiveThumbThickness / 2;\r\n } else {\r\n left += this._effectiveThumbThickness / 2;\r\n }\r\n\r\n radius = this._backgroundBoxThickness / 2;\r\n } else {\r\n radius = (this._effectiveThumbThickness - this._effectiveBarOffset) / 2;\r\n }\r\n radius = Math.max(0, radius);\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio;\r\n context.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio;\r\n }\r\n\r\n const thumbPosition = this._getThumbPosition();\r\n context.fillStyle = this._getBackgroundColor(context);\r\n\r\n if (this.isVertical) {\r\n if (this.isThumbClamped) {\r\n if (this.isThumbCircle) {\r\n context.beginPath();\r\n context.arc(left + this._backgroundBoxThickness / 2, top, radius, Math.PI, 2 * Math.PI);\r\n context.fill();\r\n context.fillRect(left, top, width, height);\r\n } else {\r\n context.fillRect(left, top, width, height + this._effectiveThumbThickness);\r\n }\r\n } else {\r\n context.fillRect(left, top, width, height);\r\n }\r\n } else {\r\n if (this.isThumbClamped) {\r\n if (this.isThumbCircle) {\r\n context.beginPath();\r\n context.arc(left + this._backgroundBoxLength, top + this._backgroundBoxThickness / 2, radius, 0, 2 * Math.PI);\r\n context.fill();\r\n context.fillRect(left, top, width, height);\r\n } else {\r\n context.fillRect(left, top, width + this._effectiveThumbThickness, height);\r\n }\r\n } else {\r\n context.fillRect(left, top, width, height);\r\n }\r\n }\r\n\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowBlur = 0;\r\n context.shadowOffsetX = 0;\r\n context.shadowOffsetY = 0;\r\n }\r\n\r\n // Value bar\r\n context.fillStyle = this._getColor(context);\r\n if (this._displayValueBar) {\r\n if (this.isVertical) {\r\n if (this.isThumbClamped) {\r\n if (this.isThumbCircle) {\r\n context.beginPath();\r\n context.arc(left + this._backgroundBoxThickness / 2, top + this._backgroundBoxLength, radius, 0, 2 * Math.PI);\r\n context.fill();\r\n context.fillRect(left, top + thumbPosition, width, height - thumbPosition);\r\n } else {\r\n context.fillRect(left, top + thumbPosition, width, height - thumbPosition + this._effectiveThumbThickness);\r\n }\r\n } else {\r\n context.fillRect(left, top + thumbPosition, width, height - thumbPosition);\r\n }\r\n } else {\r\n if (this.isThumbClamped) {\r\n if (this.isThumbCircle) {\r\n context.beginPath();\r\n context.arc(left, top + this._backgroundBoxThickness / 2, radius, 0, 2 * Math.PI);\r\n context.fill();\r\n context.fillRect(left, top, thumbPosition, height);\r\n } else {\r\n context.fillRect(left, top, thumbPosition, height);\r\n }\r\n } else {\r\n context.fillRect(left, top, thumbPosition, height);\r\n }\r\n }\r\n }\r\n\r\n // Thumb\r\n context.fillStyle = this._thumbColor || this._getColor(context);\r\n if (this.displayThumb) {\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowColor = this.shadowColor;\r\n context.shadowBlur = this.shadowBlur;\r\n context.shadowOffsetX = this.shadowOffsetX * this._host.idealRatio;\r\n context.shadowOffsetY = this.shadowOffsetY * this._host.idealRatio;\r\n }\r\n if (this._isThumbCircle) {\r\n context.beginPath();\r\n if (this.isVertical) {\r\n context.arc(left + this._backgroundBoxThickness / 2, top + thumbPosition, radius, 0, 2 * Math.PI);\r\n } else {\r\n context.arc(left + thumbPosition, top + this._backgroundBoxThickness / 2, radius, 0, 2 * Math.PI);\r\n }\r\n context.fill();\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowBlur = 0;\r\n context.shadowOffsetX = 0;\r\n context.shadowOffsetY = 0;\r\n }\r\n context.strokeStyle = this._borderColor;\r\n context.stroke();\r\n } else {\r\n if (this.isVertical) {\r\n context.fillRect(left - this._effectiveBarOffset, this._currentMeasure.top + thumbPosition, this._currentMeasure.width, this._effectiveThumbThickness);\r\n } else {\r\n context.fillRect(this._currentMeasure.left + thumbPosition, this._currentMeasure.top, this._effectiveThumbThickness, this._currentMeasure.height);\r\n }\r\n if (this.shadowBlur || this.shadowOffsetX || this.shadowOffsetY) {\r\n context.shadowBlur = 0;\r\n context.shadowOffsetX = 0;\r\n context.shadowOffsetY = 0;\r\n }\r\n context.strokeStyle = this._borderColor;\r\n if (this.isVertical) {\r\n context.strokeRect(left - this._effectiveBarOffset, this._currentMeasure.top + thumbPosition, this._currentMeasure.width, this._effectiveThumbThickness);\r\n } else {\r\n context.strokeRect(this._currentMeasure.left + thumbPosition, this._currentMeasure.top, this._effectiveThumbThickness, this._currentMeasure.height);\r\n }\r\n }\r\n }\r\n context.restore();\r\n }\r\n\r\n public override serialize(serializationObject: any) {\r\n super.serialize(serializationObject);\r\n\r\n if (this.backgroundGradient) {\r\n serializationObject.backgroundGradient = {};\r\n this.backgroundGradient.serialize(serializationObject.backgroundGradient);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public override _parseFromContent(serializedObject: any, host: AdvancedDynamicTexture) {\r\n super._parseFromContent(serializedObject, host);\r\n\r\n if (serializedObject.backgroundGradient) {\r\n const className = Tools.Instantiate(\"BABYLON.GUI.\" + serializedObject.backgroundGradient.className);\r\n this.backgroundGradient = new className();\r\n this.backgroundGradient!.parse(serializedObject.backgroundGradient);\r\n }\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.Slider\", Slider);\r\n","import { Rectangle } from \"./rectangle\";\r\nimport { StackPanel } from \"./stackPanel\";\r\nimport { Control } from \"./control\";\r\nimport { TextBlock } from \"./textBlock\";\r\nimport { Checkbox } from \"./checkbox\";\r\nimport { RadioButton } from \"./radioButton\";\r\nimport { Slider } from \"./sliders/slider\";\r\nimport { Container } from \"./container\";\r\n\r\n/** Class used to create a RadioGroup\r\n * which contains groups of radio buttons\r\n */\r\nexport class SelectorGroup {\r\n private _groupPanel = new StackPanel();\r\n private _selectors: StackPanel[] = [];\r\n private _groupHeader: TextBlock;\r\n\r\n /**\r\n * Creates a new SelectorGroup\r\n * @param name of group, used as a group heading\r\n */\r\n constructor(\r\n /** name of SelectorGroup */\r\n public name: string\r\n ) {\r\n this._groupPanel.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\r\n this._groupPanel.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n this._groupHeader = this._addGroupHeader(name);\r\n }\r\n\r\n /** Gets the groupPanel of the SelectorGroup */\r\n public get groupPanel(): StackPanel {\r\n return this._groupPanel;\r\n }\r\n\r\n /** Gets the selectors array */\r\n public get selectors(): StackPanel[] {\r\n return this._selectors;\r\n }\r\n\r\n /** Gets and sets the group header */\r\n public get header() {\r\n return this._groupHeader.text;\r\n }\r\n\r\n public set header(label: string) {\r\n if (this._groupHeader.text === \"label\") {\r\n return;\r\n }\r\n\r\n this._groupHeader.text = label;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n private _addGroupHeader(text: string): TextBlock {\r\n const groupHeading = new TextBlock(\"groupHead\", text);\r\n groupHeading.width = 0.9;\r\n groupHeading.height = \"30px\";\r\n groupHeading.textWrapping = true;\r\n groupHeading.color = \"black\";\r\n groupHeading.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n groupHeading.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n groupHeading.left = \"2px\";\r\n this._groupPanel.addControl(groupHeading);\r\n return groupHeading;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _getSelector(selectorNb: number) {\r\n if (selectorNb < 0 || selectorNb >= this._selectors.length) {\r\n return;\r\n }\r\n return this._selectors[selectorNb];\r\n }\r\n\r\n /** Removes the selector at the given position\r\n * @param selectorNb the position of the selector within the group\r\n */\r\n public removeSelector(selectorNb: number) {\r\n if (selectorNb < 0 || selectorNb >= this._selectors.length) {\r\n return;\r\n }\r\n this._groupPanel.removeControl(this._selectors[selectorNb]);\r\n this._selectors.splice(selectorNb, 1);\r\n }\r\n}\r\n\r\n/** Class used to create a CheckboxGroup\r\n * which contains groups of checkbox buttons\r\n */\r\nexport class CheckboxGroup extends SelectorGroup {\r\n /** Adds a checkbox as a control\r\n * @param text is the label for the selector\r\n * @param func is the function called when the Selector is checked\r\n * @param checked is true when Selector is checked\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public addCheckbox(text: string, func = (s: boolean) => {}, checked: boolean = false): void {\r\n checked = checked || false;\r\n const button = new Checkbox();\r\n button.width = \"20px\";\r\n button.height = \"20px\";\r\n button.color = \"#364249\";\r\n button.background = \"#CCCCCC\";\r\n button.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n\r\n button.onIsCheckedChangedObservable.add(function (state) {\r\n func(state);\r\n });\r\n\r\n const _selector = Control.AddHeader(button, text, \"200px\", { isHorizontal: true, controlFirst: true });\r\n _selector.height = \"30px\";\r\n _selector.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n _selector.left = \"4px\";\r\n\r\n this.groupPanel.addControl(_selector);\r\n this.selectors.push(_selector);\r\n button.isChecked = checked;\r\n\r\n if (this.groupPanel.parent && this.groupPanel.parent.parent) {\r\n button.color = (<SelectionPanel>this.groupPanel.parent.parent).buttonColor;\r\n button.background = (<SelectionPanel>this.groupPanel.parent.parent).buttonBackground;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setSelectorLabel(selectorNb: number, label: string) {\r\n (<TextBlock>this.selectors[selectorNb].children[1]).text = label;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setSelectorLabelColor(selectorNb: number, color: string) {\r\n (<TextBlock>this.selectors[selectorNb].children[1]).color = color;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setSelectorButtonColor(selectorNb: number, color: string) {\r\n this.selectors[selectorNb].children[0].color = color;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setSelectorButtonBackground(selectorNb: number, color: string) {\r\n (<Checkbox>this.selectors[selectorNb].children[0]).background = color;\r\n }\r\n}\r\n\r\n/** Class used to create a RadioGroup\r\n * which contains groups of radio buttons\r\n */\r\nexport class RadioGroup extends SelectorGroup {\r\n private _selectNb = 0;\r\n\r\n /** Adds a radio button as a control\r\n * @param label is the label for the selector\r\n * @param func is the function called when the Selector is checked\r\n * @param checked is true when Selector is checked\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public addRadio(label: string, func = (n: number) => {}, checked = false): void {\r\n const nb = this._selectNb++;\r\n const button = new RadioButton();\r\n button.name = label;\r\n button.width = \"20px\";\r\n button.height = \"20px\";\r\n button.color = \"#364249\";\r\n button.background = \"#CCCCCC\";\r\n button.group = this.name;\r\n button.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n\r\n button.onIsCheckedChangedObservable.add(function (state) {\r\n if (state) {\r\n func(nb);\r\n }\r\n });\r\n\r\n const _selector = Control.AddHeader(button, label, \"200px\", { isHorizontal: true, controlFirst: true });\r\n _selector.height = \"30px\";\r\n _selector.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n _selector.left = \"4px\";\r\n this.groupPanel.addControl(_selector);\r\n this.selectors.push(_selector);\r\n button.isChecked = checked;\r\n\r\n if (this.groupPanel.parent && this.groupPanel.parent.parent) {\r\n button.color = (<SelectionPanel>this.groupPanel.parent.parent).buttonColor;\r\n button.background = (<SelectionPanel>this.groupPanel.parent.parent).buttonBackground;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setSelectorLabel(selectorNb: number, label: string) {\r\n (<TextBlock>this.selectors[selectorNb].children[1]).text = label;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setSelectorLabelColor(selectorNb: number, color: string) {\r\n (<TextBlock>this.selectors[selectorNb].children[1]).color = color;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setSelectorButtonColor(selectorNb: number, color: string) {\r\n this.selectors[selectorNb].children[0].color = color;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setSelectorButtonBackground(selectorNb: number, color: string) {\r\n (<RadioButton>this.selectors[selectorNb].children[0]).background = color;\r\n }\r\n}\r\n\r\n/** Class used to create a SliderGroup\r\n * which contains groups of slider buttons\r\n */\r\nexport class SliderGroup extends SelectorGroup {\r\n /**\r\n * Adds a slider to the SelectorGroup\r\n * @param label is the label for the SliderBar\r\n * @param func is the function called when the Slider moves\r\n * @param unit is a string describing the units used, eg degrees or metres\r\n * @param min is the minimum value for the Slider\r\n * @param max is the maximum value for the Slider\r\n * @param value is the start value for the Slider between min and max\r\n * @param onValueChange is the function used to format the value displayed, eg radians to degrees\r\n */\r\n public addSlider(\r\n label: string,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n func = (v: number) => {},\r\n unit: string = \"Units\",\r\n min: number = 0,\r\n max: number = 0,\r\n value: number = 0,\r\n onValueChange = (v: number) => {\r\n return v | 0;\r\n }\r\n ): void {\r\n const button = new Slider();\r\n button.name = unit;\r\n button.value = value;\r\n button.minimum = min;\r\n button.maximum = max;\r\n button.width = 0.9;\r\n button.height = \"20px\";\r\n button.color = \"#364249\";\r\n button.background = \"#CCCCCC\";\r\n button.borderColor = \"black\";\r\n button.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n button.left = \"4px\";\r\n button.paddingBottom = \"4px\";\r\n\r\n button.onValueChangedObservable.add(function (value) {\r\n (<TextBlock>button.parent!.children[0]).text = button.parent!.children[0].name + \": \" + onValueChange(value) + \" \" + button.name;\r\n func(value);\r\n });\r\n\r\n const _selector = Control.AddHeader(button, label + \": \" + onValueChange(value) + \" \" + unit, \"30px\", { isHorizontal: false, controlFirst: false });\r\n _selector.height = \"60px\";\r\n _selector.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n _selector.left = \"4px\";\r\n _selector.children[0].name = label;\r\n this.groupPanel.addControl(_selector);\r\n this.selectors.push(_selector);\r\n\r\n if (this.groupPanel.parent && this.groupPanel.parent.parent) {\r\n button.color = (<SelectionPanel>this.groupPanel.parent.parent).buttonColor;\r\n button.background = (<SelectionPanel>this.groupPanel.parent.parent).buttonBackground;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setSelectorLabel(selectorNb: number, label: string) {\r\n this.selectors[selectorNb].children[0].name = label;\r\n (<TextBlock>this.selectors[selectorNb].children[0]).text =\r\n label + \": \" + (<Slider>this.selectors[selectorNb].children[1]).value + \" \" + this.selectors[selectorNb].children[1].name;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setSelectorLabelColor(selectorNb: number, color: string) {\r\n (<TextBlock>this.selectors[selectorNb].children[0]).color = color;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setSelectorButtonColor(selectorNb: number, color: string) {\r\n this.selectors[selectorNb].children[1].color = color;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setSelectorButtonBackground(selectorNb: number, color: string) {\r\n (<Slider>this.selectors[selectorNb].children[1]).background = color;\r\n }\r\n}\r\n\r\n/** Class used to hold the controls for the checkboxes, radio buttons and sliders\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/selector\r\n */\r\nexport class SelectionPanel extends Rectangle {\r\n private _panel: StackPanel;\r\n private _buttonColor: string = \"#364249\";\r\n private _buttonBackground: string = \"#CCCCCC\";\r\n private _headerColor: string = \"black\";\r\n private _barColor: string = \"white\";\r\n private _barHeight: string = \"2px\";\r\n private _spacerHeight: string = \"20px\";\r\n private _labelColor: string;\r\n private _groups: SelectorGroup[];\r\n private _bars: any[] = [];\r\n\r\n /**\r\n * Creates a new SelectionPanel\r\n * @param name of SelectionPanel\r\n * @param groups is an array of SelectionGroups\r\n */\r\n constructor(\r\n /** name of SelectionPanel */\r\n public override name: string,\r\n /** an array of SelectionGroups */\r\n public groups: SelectorGroup[] = []\r\n ) {\r\n super(name);\r\n this._groups = groups;\r\n this.thickness = 2;\r\n this._panel = new StackPanel();\r\n this._panel.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\r\n this._panel.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n this._panel.top = 5;\r\n this._panel.left = 5;\r\n this._panel.width = 0.95;\r\n if (groups.length > 0) {\r\n for (let i = 0; i < groups.length - 1; i++) {\r\n this._panel.addControl(groups[i].groupPanel);\r\n this._addSpacer();\r\n }\r\n this._panel.addControl(groups[groups.length - 1].groupPanel);\r\n }\r\n this.addControl(this._panel);\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"SelectionPanel\";\r\n }\r\n\r\n /** Gets the (stack) panel of the SelectionPanel */\r\n public get panel(): StackPanel {\r\n return this._panel;\r\n }\r\n\r\n /** Gets or sets the headerColor */\r\n public get headerColor(): string {\r\n return this._headerColor;\r\n }\r\n\r\n public set headerColor(color: string) {\r\n if (this._headerColor === color) {\r\n return;\r\n }\r\n this._headerColor = color;\r\n this._setHeaderColor();\r\n }\r\n\r\n private _setHeaderColor() {\r\n for (let i = 0; i < this._groups.length; i++) {\r\n this._groups[i].groupPanel.children[0].color = this._headerColor;\r\n }\r\n }\r\n\r\n /** Gets or sets the button color */\r\n public get buttonColor(): string {\r\n return this._buttonColor;\r\n }\r\n\r\n public set buttonColor(color: string) {\r\n if (this._buttonColor === color) {\r\n return;\r\n }\r\n\r\n this._buttonColor = color;\r\n this._setbuttonColor();\r\n }\r\n\r\n private _setbuttonColor() {\r\n for (let i = 0; i < this._groups.length; i++) {\r\n for (let j = 0; j < this._groups[i].selectors.length; j++) {\r\n (<CheckboxGroup | RadioGroup | SliderGroup>this._groups[i])._setSelectorButtonColor(j, this._buttonColor);\r\n }\r\n }\r\n }\r\n\r\n /** Gets or sets the label color */\r\n public get labelColor(): string {\r\n return this._labelColor;\r\n }\r\n\r\n public set labelColor(color: string) {\r\n if (this._labelColor === color) {\r\n return;\r\n }\r\n this._labelColor = color;\r\n this._setLabelColor();\r\n }\r\n\r\n private _setLabelColor() {\r\n for (let i = 0; i < this._groups.length; i++) {\r\n for (let j = 0; j < this._groups[i].selectors.length; j++) {\r\n (<CheckboxGroup | RadioGroup | SliderGroup>this._groups[i])._setSelectorLabelColor(j, this._labelColor);\r\n }\r\n }\r\n }\r\n\r\n /** Gets or sets the button background */\r\n public get buttonBackground(): string {\r\n return this._buttonBackground;\r\n }\r\n\r\n public set buttonBackground(color: string) {\r\n if (this._buttonBackground === color) {\r\n return;\r\n }\r\n\r\n this._buttonBackground = color;\r\n this._setButtonBackground();\r\n }\r\n\r\n private _setButtonBackground() {\r\n for (let i = 0; i < this._groups.length; i++) {\r\n for (let j = 0; j < this._groups[i].selectors.length; j++) {\r\n (<CheckboxGroup | RadioGroup | SliderGroup>this._groups[i])._setSelectorButtonBackground(j, this._buttonBackground);\r\n }\r\n }\r\n }\r\n\r\n /** Gets or sets the color of separator bar */\r\n public get barColor(): string {\r\n return this._barColor;\r\n }\r\n\r\n public set barColor(color: string) {\r\n if (this._barColor === color) {\r\n return;\r\n }\r\n\r\n this._barColor = color;\r\n this._setBarColor();\r\n }\r\n\r\n private _setBarColor() {\r\n for (let i = 0; i < this._bars.length; i++) {\r\n this._bars[i].children[0].background = this._barColor;\r\n }\r\n }\r\n\r\n /** Gets or sets the height of separator bar */\r\n public get barHeight(): string {\r\n return this._barHeight;\r\n }\r\n\r\n public set barHeight(value: string) {\r\n if (this._barHeight === value) {\r\n return;\r\n }\r\n\r\n this._barHeight = value;\r\n this._setBarHeight();\r\n }\r\n\r\n private _setBarHeight() {\r\n for (let i = 0; i < this._bars.length; i++) {\r\n this._bars[i].children[0].height = this._barHeight;\r\n }\r\n }\r\n\r\n /** Gets or sets the height of spacers*/\r\n public get spacerHeight(): string {\r\n return this._spacerHeight;\r\n }\r\n\r\n public set spacerHeight(value: string) {\r\n if (this._spacerHeight === value) {\r\n return;\r\n }\r\n\r\n this._spacerHeight = value;\r\n this._setSpacerHeight();\r\n }\r\n\r\n private _setSpacerHeight() {\r\n for (let i = 0; i < this._bars.length; i++) {\r\n this._bars[i].height = this._spacerHeight;\r\n }\r\n }\r\n\r\n /** Adds a bar between groups */\r\n private _addSpacer(): void {\r\n const separator = new Container();\r\n separator.width = 1;\r\n separator.height = this._spacerHeight;\r\n separator.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n\r\n const bar = new Rectangle();\r\n bar.width = 1;\r\n bar.height = this._barHeight;\r\n bar.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n bar.verticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER;\r\n bar.background = this._barColor;\r\n bar.color = \"transparent\";\r\n separator.addControl(bar);\r\n\r\n this._panel.addControl(separator);\r\n this._bars.push(separator);\r\n }\r\n\r\n /** Add a group to the selection panel\r\n * @param group is the selector group to add\r\n */\r\n public addGroup(group: SelectorGroup): void {\r\n if (this._groups.length > 0) {\r\n this._addSpacer();\r\n }\r\n this._panel.addControl(group.groupPanel);\r\n this._groups.push(group);\r\n group.groupPanel.children[0].color = this._headerColor;\r\n for (let j = 0; j < group.selectors.length; j++) {\r\n (<CheckboxGroup | RadioGroup | SliderGroup>group)._setSelectorButtonColor(j, this._buttonColor);\r\n (<CheckboxGroup | RadioGroup | SliderGroup>group)._setSelectorButtonBackground(j, this._buttonBackground);\r\n }\r\n }\r\n\r\n /** Remove the group from the given position\r\n * @param groupNb is the position of the group in the list\r\n */\r\n public removeGroup(groupNb: number): void {\r\n if (groupNb < 0 || groupNb >= this._groups.length) {\r\n return;\r\n }\r\n const group = this._groups[groupNb];\r\n this._panel.removeControl(group.groupPanel);\r\n this._groups.splice(groupNb, 1);\r\n if (groupNb < this._bars.length) {\r\n this._panel.removeControl(this._bars[groupNb]);\r\n this._bars.splice(groupNb, 1);\r\n }\r\n }\r\n\r\n /** Change a group header label\r\n * @param label is the new group header label\r\n * @param groupNb is the number of the group to relabel\r\n * */\r\n public setHeaderName(label: string, groupNb: number) {\r\n if (groupNb < 0 || groupNb >= this._groups.length) {\r\n return;\r\n }\r\n const group = this._groups[groupNb];\r\n (<TextBlock>group.groupPanel.children[0]).text = label;\r\n }\r\n\r\n /** Change selector label to the one given\r\n * @param label is the new selector label\r\n * @param groupNb is the number of the groupcontaining the selector\r\n * @param selectorNb is the number of the selector within a group to relabel\r\n * */\r\n public relabel(label: string, groupNb: number, selectorNb: number): void {\r\n if (groupNb < 0 || groupNb >= this._groups.length) {\r\n return;\r\n }\r\n const group = this._groups[groupNb];\r\n if (selectorNb < 0 || selectorNb >= group.selectors.length) {\r\n return;\r\n }\r\n (<CheckboxGroup | RadioGroup | SliderGroup>group)._setSelectorLabel(selectorNb, label);\r\n }\r\n\r\n /** For a given group position remove the selector at the given position\r\n * @param groupNb is the number of the group to remove the selector from\r\n * @param selectorNb is the number of the selector within the group\r\n */\r\n public removeFromGroupSelector(groupNb: number, selectorNb: number): void {\r\n if (groupNb < 0 || groupNb >= this._groups.length) {\r\n return;\r\n }\r\n const group = this._groups[groupNb];\r\n if (selectorNb < 0 || selectorNb >= group.selectors.length) {\r\n return;\r\n }\r\n group.removeSelector(selectorNb);\r\n }\r\n\r\n /** For a given group position of correct type add a checkbox button\r\n * @param groupNb is the number of the group to remove the selector from\r\n * @param label is the label for the selector\r\n * @param func is the function called when the Selector is checked\r\n * @param checked is true when Selector is checked\r\n */\r\n public addToGroupCheckbox(groupNb: number, label: string, func = () => {}, checked: boolean = false): void {\r\n if (groupNb < 0 || groupNb >= this._groups.length) {\r\n return;\r\n }\r\n const group = this._groups[groupNb];\r\n (<CheckboxGroup>group).addCheckbox(label, func, checked);\r\n }\r\n\r\n /** For a given group position of correct type add a radio button\r\n * @param groupNb is the number of the group to remove the selector from\r\n * @param label is the label for the selector\r\n * @param func is the function called when the Selector is checked\r\n * @param checked is true when Selector is checked\r\n */\r\n public addToGroupRadio(groupNb: number, label: string, func = () => {}, checked: boolean = false): void {\r\n if (groupNb < 0 || groupNb >= this._groups.length) {\r\n return;\r\n }\r\n const group = this._groups[groupNb];\r\n (<RadioGroup>group).addRadio(label, func, checked);\r\n }\r\n\r\n /**\r\n * For a given slider group add a slider\r\n * @param groupNb is the number of the group to add the slider to\r\n * @param label is the label for the Slider\r\n * @param func is the function called when the Slider moves\r\n * @param unit is a string describing the units used, eg degrees or metres\r\n * @param min is the minimum value for the Slider\r\n * @param max is the maximum value for the Slider\r\n * @param value is the start value for the Slider between min and max\r\n * @param onVal is the function used to format the value displayed, eg radians to degrees\r\n */\r\n public addToGroupSlider(\r\n groupNb: number,\r\n label: string,\r\n func = () => {},\r\n unit: string = \"Units\",\r\n min: number = 0,\r\n max: number = 0,\r\n value: number = 0,\r\n onVal = (v: number) => {\r\n return v | 0;\r\n }\r\n ): void {\r\n if (groupNb < 0 || groupNb >= this._groups.length) {\r\n return;\r\n }\r\n const group = this._groups[groupNb];\r\n (<SliderGroup>group).addSlider(label, func, unit, min, max, value, onVal);\r\n }\r\n}\r\n","import { Measure } from \"../../measure\";\r\nimport { Container } from \"../container\";\r\nimport { ValueAndUnit } from \"../../valueAndUnit\";\r\nimport { Control } from \"../control\";\r\nimport { type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\n\r\n/**\r\n * Class used to hold a the container for ScrollViewer\r\n * @internal\r\n */\r\nexport class _ScrollViewerWindow extends Container {\r\n public parentClientWidth: number;\r\n public parentClientHeight: number;\r\n\r\n private _freezeControls = false;\r\n private _parentMeasure: Measure;\r\n private _oldLeft: number | null;\r\n private _oldTop: number | null;\r\n\r\n public get freezeControls(): boolean {\r\n return this._freezeControls;\r\n }\r\n\r\n public set freezeControls(value: boolean) {\r\n if (this._freezeControls === value) {\r\n return;\r\n }\r\n\r\n if (!value) {\r\n this._restoreMeasures();\r\n }\r\n\r\n // trigger a full normal layout calculation to be sure all children have their measures up to date\r\n this._freezeControls = false;\r\n\r\n const textureSize = this.host.getSize();\r\n const renderWidth = textureSize.width;\r\n const renderHeight = textureSize.height;\r\n\r\n const context = this.host.getContext();\r\n\r\n const measure = new Measure(0, 0, renderWidth, renderHeight);\r\n\r\n this.host._numLayoutCalls = 0;\r\n\r\n this.host._rootContainer._layout(measure, context);\r\n\r\n // in freeze mode, prepare children measures accordingly\r\n if (value) {\r\n this._updateMeasures();\r\n if (this._useBuckets()) {\r\n this._makeBuckets();\r\n }\r\n }\r\n\r\n this._freezeControls = value;\r\n\r\n this.host.markAsDirty(); // redraw with the (new) current settings\r\n }\r\n\r\n private _bucketWidth: number = 0;\r\n private _bucketHeight: number = 0;\r\n private _buckets: { [key: number]: Array<Control> } = {};\r\n private _bucketLen: number;\r\n\r\n public get bucketWidth(): number {\r\n return this._bucketWidth;\r\n }\r\n\r\n public get bucketHeight(): number {\r\n return this._bucketHeight;\r\n }\r\n\r\n public setBucketSizes(width: number, height: number): void {\r\n this._bucketWidth = width;\r\n this._bucketHeight = height;\r\n\r\n if (this._useBuckets()) {\r\n if (this._freezeControls) {\r\n this._makeBuckets();\r\n }\r\n } else {\r\n this._buckets = {};\r\n }\r\n }\r\n\r\n private _useBuckets(): boolean {\r\n return this._bucketWidth > 0 && this._bucketHeight > 0;\r\n }\r\n\r\n private _makeBuckets(): void {\r\n this._buckets = {};\r\n this._bucketLen = Math.ceil(this.widthInPixels / this._bucketWidth);\r\n this._dispatchInBuckets(this._children);\r\n this._oldLeft = null;\r\n this._oldTop = null;\r\n }\r\n\r\n private _dispatchInBuckets(children: Control[]): void {\r\n for (let i = 0; i < children.length; ++i) {\r\n const child = children[i];\r\n\r\n const bStartX = Math.max(0, Math.floor((child._customData._origLeft - this._customData.origLeft) / this._bucketWidth)),\r\n bEndX = Math.floor((child._customData._origLeft - this._customData.origLeft + child._currentMeasure.width - 1) / this._bucketWidth),\r\n bEndY = Math.floor((child._customData._origTop - this._customData.origTop + child._currentMeasure.height - 1) / this._bucketHeight);\r\n let bStartY = Math.max(0, Math.floor((child._customData._origTop - this._customData.origTop) / this._bucketHeight));\r\n\r\n while (bStartY <= bEndY) {\r\n for (let x = bStartX; x <= bEndX; ++x) {\r\n const bucket = bStartY * this._bucketLen + x;\r\n let lstc = this._buckets[bucket];\r\n\r\n if (!lstc) {\r\n lstc = [];\r\n this._buckets[bucket] = lstc;\r\n }\r\n\r\n lstc.push(child);\r\n }\r\n bStartY++;\r\n }\r\n\r\n if (child instanceof Container && child._children.length > 0) {\r\n this._dispatchInBuckets(child._children);\r\n }\r\n }\r\n }\r\n\r\n // reset left and top measures for the window and all its children\r\n private _updateMeasures(): void {\r\n const left = this.leftInPixels | 0,\r\n top = this.topInPixels | 0;\r\n\r\n this._measureForChildren.left -= left;\r\n this._measureForChildren.top -= top;\r\n this._currentMeasure.left -= left;\r\n this._currentMeasure.top -= top;\r\n\r\n this._customData.origLeftForChildren = this._measureForChildren.left;\r\n this._customData.origTopForChildren = this._measureForChildren.top;\r\n this._customData.origLeft = this._currentMeasure.left;\r\n this._customData.origTop = this._currentMeasure.top;\r\n\r\n this._updateChildrenMeasures(this._children, left, top);\r\n }\r\n\r\n private _updateChildrenMeasures(children: Control[], left: number, top: number): void {\r\n for (let i = 0; i < children.length; ++i) {\r\n const child = children[i];\r\n\r\n child._currentMeasure.left -= left;\r\n child._currentMeasure.top -= top;\r\n\r\n child._customData._origLeft = child._currentMeasure.left; // save the original left and top values for each child\r\n child._customData._origTop = child._currentMeasure.top;\r\n\r\n if (child instanceof Container && child._children.length > 0) {\r\n this._updateChildrenMeasures(child._children, left, top);\r\n }\r\n }\r\n }\r\n\r\n private _restoreMeasures(): void {\r\n const left = this.leftInPixels | 0,\r\n top = this.topInPixels | 0;\r\n\r\n this._measureForChildren.left = this._customData.origLeftForChildren + left;\r\n this._measureForChildren.top = this._customData.origTopForChildren + top;\r\n this._currentMeasure.left = this._customData.origLeft + left;\r\n this._currentMeasure.top = this._customData.origTop + top;\r\n }\r\n\r\n /**\r\n * Creates a new ScrollViewerWindow\r\n * @param name of ScrollViewerWindow\r\n */\r\n constructor(name?: string) {\r\n super(name);\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"ScrollViewerWindow\";\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n protected override _additionalProcessing(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n super._additionalProcessing(parentMeasure, context);\r\n\r\n this._parentMeasure = parentMeasure;\r\n\r\n this._measureForChildren.left = this._currentMeasure.left;\r\n this._measureForChildren.top = this._currentMeasure.top;\r\n\r\n this._measureForChildren.width = parentMeasure.width;\r\n this._measureForChildren.height = parentMeasure.height;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _layout(parentMeasure: Measure, context: ICanvasRenderingContext): boolean {\r\n if (this._freezeControls) {\r\n this.invalidateRect(); // will trigger a redraw of the window\r\n return false;\r\n }\r\n\r\n return super._layout(parentMeasure, context);\r\n }\r\n\r\n private _scrollChildren(children: Control[], left: number, top: number): void {\r\n for (let i = 0; i < children.length; ++i) {\r\n const child = children[i];\r\n\r\n child._currentMeasure.left = child._customData._origLeft + left;\r\n child._currentMeasure.top = child._customData._origTop + top;\r\n child._isClipped = false; // clipping will be handled by _draw and the call to _intersectsRect()\r\n\r\n if (child instanceof Container && child._children.length > 0) {\r\n this._scrollChildren(child._children, left, top);\r\n }\r\n }\r\n }\r\n\r\n private _scrollChildrenWithBuckets(left: number, top: number, scrollLeft: number, scrollTop: number): void {\r\n const bStartX = Math.max(0, Math.floor(-left / this._bucketWidth)),\r\n bEndX = Math.floor((-left + this._parentMeasure.width - 1) / this._bucketWidth),\r\n bEndY = Math.floor((-top + this._parentMeasure.height - 1) / this._bucketHeight);\r\n let bStartY = Math.max(0, Math.floor(-top / this._bucketHeight));\r\n\r\n while (bStartY <= bEndY) {\r\n for (let x = bStartX; x <= bEndX; ++x) {\r\n const bucket = bStartY * this._bucketLen + x,\r\n lstc = this._buckets[bucket];\r\n\r\n if (lstc) {\r\n for (let i = 0; i < lstc.length; ++i) {\r\n const child = lstc[i];\r\n child._currentMeasure.left = child._customData._origLeft + scrollLeft;\r\n child._currentMeasure.top = child._customData._origTop + scrollTop;\r\n child._isClipped = false; // clipping will be handled by _draw and the call to _intersectsRect()\r\n }\r\n }\r\n }\r\n bStartY++;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _draw(context: ICanvasRenderingContext, invalidatedRectangle?: Measure): void {\r\n if (!this._freezeControls) {\r\n super._draw(context, invalidatedRectangle);\r\n return;\r\n }\r\n\r\n this._localDraw(context);\r\n\r\n if (this.clipChildren) {\r\n this._clipForChildren(context);\r\n }\r\n\r\n const left = this.leftInPixels | 0,\r\n top = this.topInPixels | 0;\r\n\r\n if (this._useBuckets()) {\r\n if (this._oldLeft !== null && this._oldTop !== null) {\r\n this._scrollChildrenWithBuckets(this._oldLeft, this._oldTop, left, top);\r\n this._scrollChildrenWithBuckets(left, top, left, top);\r\n } else {\r\n this._scrollChildren(this._children, left, top);\r\n }\r\n } else {\r\n this._scrollChildren(this._children, left, top);\r\n }\r\n\r\n this._oldLeft = left;\r\n this._oldTop = top;\r\n\r\n for (const child of this._children) {\r\n if (!child._intersectsRect(this._parentMeasure)) {\r\n continue;\r\n }\r\n child._render(context, this._parentMeasure);\r\n }\r\n }\r\n\r\n protected override _postMeasure(): void {\r\n if (this._freezeControls) {\r\n super._postMeasure();\r\n return;\r\n }\r\n\r\n let maxWidth = this.parentClientWidth;\r\n let maxHeight = this.parentClientHeight;\r\n for (const child of this.children) {\r\n if (!child.isVisible || child.notRenderable) {\r\n continue;\r\n }\r\n\r\n if (child.horizontalAlignment === Control.HORIZONTAL_ALIGNMENT_CENTER) {\r\n child._offsetLeft(this._currentMeasure.left - child._currentMeasure.left);\r\n }\r\n\r\n if (child.verticalAlignment === Control.VERTICAL_ALIGNMENT_CENTER) {\r\n child._offsetTop(this._currentMeasure.top - child._currentMeasure.top);\r\n }\r\n\r\n maxWidth = Math.max(maxWidth, child._currentMeasure.left - this._currentMeasure.left + child._currentMeasure.width + child.paddingRightInPixels);\r\n maxHeight = Math.max(maxHeight, child._currentMeasure.top - this._currentMeasure.top + child._currentMeasure.height + child.paddingBottomInPixels);\r\n }\r\n\r\n if (this._currentMeasure.width !== maxWidth) {\r\n this._width.updateInPlace(maxWidth, ValueAndUnit.UNITMODE_PIXEL);\r\n this._currentMeasure.width = maxWidth;\r\n this._rebuildLayout = true;\r\n this._isDirty = true;\r\n }\r\n\r\n if (this._currentMeasure.height !== maxHeight) {\r\n this._height.updateInPlace(maxHeight, ValueAndUnit.UNITMODE_PIXEL);\r\n this._currentMeasure.height = maxHeight;\r\n this._rebuildLayout = true;\r\n this._isDirty = true;\r\n }\r\n\r\n super._postMeasure();\r\n }\r\n}\r\n","import { type Vector2 } from \"core/Maths/math.vector\";\r\nimport { BaseSlider } from \"./baseSlider\";\r\nimport { type Control } from \"../control\";\r\nimport { Measure } from \"../../measure\";\r\nimport { type PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type BaseGradient } from \"../gradient/BaseGradient\";\r\nimport { type AdvancedDynamicTexture } from \"gui/2D/advancedDynamicTexture\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\n\r\n/**\r\n * Class used to create slider controls\r\n */\r\nexport class ScrollBar extends BaseSlider {\r\n private _background = \"black\";\r\n private _borderColor = \"white\";\r\n private _tempMeasure = new Measure(0, 0, 0, 0);\r\n private _invertScrollDirection = false;\r\n private _backgroundGradient: Nullable<BaseGradient> = null;\r\n\r\n /** Gets or sets border color */\r\n @serialize()\r\n public get borderColor(): string {\r\n return this._borderColor;\r\n }\r\n\r\n public set borderColor(value: string) {\r\n if (this._borderColor === value) {\r\n return;\r\n }\r\n\r\n this._borderColor = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets background color */\r\n @serialize()\r\n public get background(): string {\r\n return this._background;\r\n }\r\n\r\n public set background(value: string) {\r\n if (this._background === value) {\r\n return;\r\n }\r\n\r\n this._background = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets background gradient. Takes precedence over gradient. */\r\n public get backgroundGradient(): Nullable<BaseGradient> {\r\n return this._backgroundGradient;\r\n }\r\n\r\n public set backgroundGradient(value: Nullable<BaseGradient>) {\r\n if (this._backgroundGradient === value) {\r\n return;\r\n }\r\n\r\n this._backgroundGradient = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Inverts the scrolling direction (default: false) */\r\n @serialize()\r\n public get invertScrollDirection() {\r\n return this._invertScrollDirection;\r\n }\r\n\r\n public set invertScrollDirection(invert: boolean) {\r\n this._invertScrollDirection = invert;\r\n }\r\n\r\n /**\r\n * Creates a new Slider\r\n * @param name defines the control name\r\n */\r\n constructor(public override name?: string) {\r\n super(name);\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"Scrollbar\";\r\n }\r\n\r\n protected override _getThumbThickness(): number {\r\n let thumbThickness: number;\r\n if (this._thumbWidth.isPixel) {\r\n thumbThickness = this._thumbWidth.getValue(this._host);\r\n } else {\r\n thumbThickness = this._backgroundBoxThickness * this._thumbWidth.getValue(this._host);\r\n }\r\n return thumbThickness;\r\n }\r\n\r\n private _getBackgroundColor(context: ICanvasRenderingContext) {\r\n return this._backgroundGradient ? this._backgroundGradient.getCanvasGradient(context) : this._background;\r\n }\r\n\r\n public override _draw(context: ICanvasRenderingContext): void {\r\n context.save();\r\n\r\n this._applyStates(context);\r\n this._prepareRenderingData(\"rectangle\");\r\n const left = this._renderLeft;\r\n\r\n const thumbPosition = this._getThumbPosition();\r\n context.fillStyle = this._getBackgroundColor(context);\r\n\r\n context.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n\r\n // Value bar\r\n context.fillStyle = this._getColor(context);\r\n\r\n // Thumb\r\n if (this.isVertical) {\r\n this._tempMeasure.left = left - this._effectiveBarOffset;\r\n this._tempMeasure.top = this._currentMeasure.top + thumbPosition;\r\n this._tempMeasure.width = this._currentMeasure.width;\r\n this._tempMeasure.height = this._effectiveThumbThickness;\r\n } else {\r\n this._tempMeasure.left = this._currentMeasure.left + thumbPosition;\r\n this._tempMeasure.top = this._currentMeasure.top;\r\n this._tempMeasure.width = this._effectiveThumbThickness;\r\n this._tempMeasure.height = this._currentMeasure.height;\r\n }\r\n\r\n context.fillRect(this._tempMeasure.left, this._tempMeasure.top, this._tempMeasure.width, this._tempMeasure.height);\r\n\r\n context.restore();\r\n }\r\n\r\n private _first: boolean;\r\n private _originX: number;\r\n private _originY: number;\r\n\r\n /**\r\n * @internal\r\n */\r\n protected override _updateValueFromPointer(x: number, y: number): void {\r\n this._invertTransformMatrix.transformCoordinates(x, y, this._transformedPosition);\r\n x = this._transformedPosition.x;\r\n y = this._transformedPosition.y;\r\n\r\n const sign = this._invertScrollDirection ? -1 : 1;\r\n\r\n if (this._first) {\r\n this._first = false;\r\n this._originX = x;\r\n this._originY = y;\r\n\r\n // Check if move is required\r\n if (\r\n x < this._tempMeasure.left ||\r\n x > this._tempMeasure.left + this._tempMeasure.width ||\r\n y < this._tempMeasure.top ||\r\n y > this._tempMeasure.top + this._tempMeasure.height\r\n ) {\r\n if (this.isVertical) {\r\n this.value = this.minimum + (1 - (y - this._currentMeasure.top) / this._currentMeasure.height) * (this.maximum - this.minimum);\r\n } else {\r\n this.value = this.minimum + ((x - this._currentMeasure.left) / this._currentMeasure.width) * (this.maximum - this.minimum);\r\n }\r\n }\r\n }\r\n\r\n // Delta mode\r\n let delta: number;\r\n if (this.isVertical) {\r\n delta = -((y - this._originY) / (this._currentMeasure.height - this._effectiveThumbThickness));\r\n } else {\r\n delta = (x - this._originX) / (this._currentMeasure.width - this._effectiveThumbThickness);\r\n }\r\n\r\n this.value += sign * delta * (this.maximum - this.minimum);\r\n\r\n this._originX = x;\r\n this._originY = y;\r\n }\r\n\r\n public override _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: PointerInfoBase): boolean {\r\n this._first = true;\r\n\r\n return super._onPointerDown(target, coordinates, pointerId, buttonIndex, pi);\r\n }\r\n\r\n public override serialize(serializationObject: any) {\r\n super.serialize(serializationObject);\r\n\r\n if (this.backgroundGradient) {\r\n serializationObject.backgroundGradient = {};\r\n this.backgroundGradient.serialize(serializationObject.backgroundGradient);\r\n }\r\n }\r\n\r\n public override _parseFromContent(serializationObject: any, host: AdvancedDynamicTexture) {\r\n super._parseFromContent(serializationObject, host);\r\n\r\n if (serializationObject.backgroundGradient) {\r\n const className = Tools.Instantiate(\"BABYLON.GUI.\" + serializationObject.backgroundGradient.className);\r\n this.backgroundGradient = new className();\r\n this.backgroundGradient!.parse(serializationObject.backgroundGradient);\r\n }\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.Scrollbar\", ScrollBar);\r\n","import { type Vector2 } from \"core/Maths/math.vector\";\r\nimport { BaseSlider } from \"./baseSlider\";\r\nimport { type Control } from \"../control\";\r\nimport { type Image } from \"../image\";\r\nimport { Measure } from \"../../measure\";\r\nimport { type PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\n\r\n/**\r\n * Class used to create slider controls\r\n */\r\nexport class ImageScrollBar extends BaseSlider {\r\n private _backgroundBaseImage: Image;\r\n private _backgroundImage: Image;\r\n private _thumbImage: Image;\r\n private _thumbBaseImage: Image;\r\n private _thumbLength: number = 0.5;\r\n private _thumbHeight: number = 1;\r\n private _barImageHeight: number = 1;\r\n private _tempMeasure = new Measure(0, 0, 0, 0);\r\n private _invertScrollDirection = false;\r\n\r\n /** Number of 90° rotation to apply on the images when in vertical mode */\r\n @serialize()\r\n public num90RotationInVerticalMode = 1;\r\n\r\n /** Inverts the scrolling direction (default: false) */\r\n @serialize()\r\n public get invertScrollDirection() {\r\n return this._invertScrollDirection;\r\n }\r\n\r\n public set invertScrollDirection(invert: boolean) {\r\n this._invertScrollDirection = invert;\r\n }\r\n\r\n /**\r\n * Gets or sets the image used to render the background for horizontal bar\r\n */\r\n public get backgroundImage(): Image {\r\n return this._backgroundBaseImage;\r\n }\r\n\r\n public set backgroundImage(value: Image) {\r\n if (this._backgroundBaseImage === value) {\r\n return;\r\n }\r\n\r\n this._backgroundBaseImage = value;\r\n\r\n if (this.isVertical && this.num90RotationInVerticalMode !== 0) {\r\n if (!value.isLoaded) {\r\n value.onImageLoadedObservable.addOnce(() => {\r\n const rotatedValue = value._rotate90(this.num90RotationInVerticalMode, true);\r\n this._backgroundImage = rotatedValue;\r\n if (!rotatedValue.isLoaded) {\r\n rotatedValue.onImageLoadedObservable.addOnce(() => {\r\n this._markAsDirty();\r\n });\r\n }\r\n this._markAsDirty();\r\n });\r\n } else {\r\n this._backgroundImage = value._rotate90(this.num90RotationInVerticalMode, true);\r\n this._markAsDirty();\r\n }\r\n } else {\r\n this._backgroundImage = value;\r\n if (value && !value.isLoaded) {\r\n value.onImageLoadedObservable.addOnce(() => {\r\n this._markAsDirty();\r\n });\r\n }\r\n\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the image used to render the thumb\r\n */\r\n public get thumbImage(): Image {\r\n return this._thumbBaseImage;\r\n }\r\n\r\n public set thumbImage(value: Image) {\r\n if (this._thumbBaseImage === value) {\r\n return;\r\n }\r\n\r\n this._thumbBaseImage = value;\r\n\r\n if (this.isVertical && this.num90RotationInVerticalMode !== 0) {\r\n if (!value.isLoaded) {\r\n value.onImageLoadedObservable.addOnce(() => {\r\n const rotatedValue = value._rotate90(-this.num90RotationInVerticalMode, true);\r\n this._thumbImage = rotatedValue;\r\n if (!rotatedValue.isLoaded) {\r\n rotatedValue.onImageLoadedObservable.addOnce(() => {\r\n this._markAsDirty();\r\n });\r\n }\r\n this._markAsDirty();\r\n });\r\n } else {\r\n this._thumbImage = value._rotate90(-this.num90RotationInVerticalMode, true);\r\n this._markAsDirty();\r\n }\r\n } else {\r\n this._thumbImage = value;\r\n if (value && !value.isLoaded) {\r\n value.onImageLoadedObservable.addOnce(() => {\r\n this._markAsDirty();\r\n });\r\n }\r\n\r\n this._markAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the length of the thumb\r\n */\r\n public get thumbLength(): number {\r\n return this._thumbLength;\r\n }\r\n\r\n public set thumbLength(value: number) {\r\n if (this._thumbLength === value) {\r\n return;\r\n }\r\n\r\n this._thumbLength = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the height of the thumb\r\n */\r\n public get thumbHeight(): number {\r\n return this._thumbHeight;\r\n }\r\n\r\n public set thumbHeight(value: number) {\r\n if (this._thumbHeight === value) {\r\n return;\r\n }\r\n\r\n this._thumbHeight = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the height of the bar image\r\n */\r\n public get barImageHeight(): number {\r\n return this._barImageHeight;\r\n }\r\n\r\n public set barImageHeight(value: number) {\r\n if (this._barImageHeight === value) {\r\n return;\r\n }\r\n\r\n this._barImageHeight = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Creates a new ImageScrollBar\r\n * @param name defines the control name\r\n */\r\n constructor(public override name?: string) {\r\n super(name);\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"ImageScrollBar\";\r\n }\r\n\r\n protected override _getThumbThickness(): number {\r\n let thumbThickness: number;\r\n if (this._thumbWidth.isPixel) {\r\n thumbThickness = this._thumbWidth.getValue(this._host);\r\n } else {\r\n thumbThickness = this._backgroundBoxThickness * this._thumbWidth.getValue(this._host);\r\n }\r\n return thumbThickness;\r\n }\r\n\r\n public override _draw(context: ICanvasRenderingContext): void {\r\n context.save();\r\n\r\n this._applyStates(context);\r\n\r\n this._prepareRenderingData(\"rectangle\");\r\n const thumbPosition = this._getThumbPosition();\r\n const left = this._renderLeft;\r\n const top = this._renderTop;\r\n const width = this._renderWidth;\r\n const height = this._renderHeight;\r\n\r\n // Background\r\n if (this._backgroundImage) {\r\n this._tempMeasure.copyFromFloats(left, top, width, height);\r\n if (this.isVertical) {\r\n this._tempMeasure.copyFromFloats(left + width * (1 - this._barImageHeight) * 0.5, this._currentMeasure.top, width * this._barImageHeight, height);\r\n this._tempMeasure.height += this._effectiveThumbThickness;\r\n this._backgroundImage._currentMeasure.copyFrom(this._tempMeasure);\r\n } else {\r\n this._tempMeasure.copyFromFloats(this._currentMeasure.left, top + height * (1 - this._barImageHeight) * 0.5, width, height * this._barImageHeight);\r\n this._tempMeasure.width += this._effectiveThumbThickness;\r\n this._backgroundImage._currentMeasure.copyFrom(this._tempMeasure);\r\n }\r\n this._backgroundImage._draw(context);\r\n }\r\n\r\n // Thumb\r\n if (this.isVertical) {\r\n this._tempMeasure.copyFromFloats(\r\n left - this._effectiveBarOffset + this._currentMeasure.width * (1 - this._thumbHeight) * 0.5,\r\n this._currentMeasure.top + thumbPosition,\r\n this._currentMeasure.width * this._thumbHeight,\r\n this._effectiveThumbThickness\r\n );\r\n } else {\r\n this._tempMeasure.copyFromFloats(\r\n this._currentMeasure.left + thumbPosition,\r\n this._currentMeasure.top + this._currentMeasure.height * (1 - this._thumbHeight) * 0.5,\r\n this._effectiveThumbThickness,\r\n this._currentMeasure.height * this._thumbHeight\r\n );\r\n }\r\n\r\n if (this._thumbImage) {\r\n this._thumbImage._currentMeasure.copyFrom(this._tempMeasure);\r\n this._thumbImage._draw(context);\r\n }\r\n\r\n context.restore();\r\n }\r\n\r\n private _first: boolean;\r\n private _originX: number;\r\n private _originY: number;\r\n\r\n /**\r\n * @internal\r\n */\r\n protected override _updateValueFromPointer(x: number, y: number): void {\r\n this._invertTransformMatrix.transformCoordinates(x, y, this._transformedPosition);\r\n x = this._transformedPosition.x;\r\n y = this._transformedPosition.y;\r\n\r\n const sign = this._invertScrollDirection ? -1 : 1;\r\n\r\n if (this._first) {\r\n this._first = false;\r\n this._originX = x;\r\n this._originY = y;\r\n\r\n // Check if move is required\r\n if (\r\n x < this._tempMeasure.left ||\r\n x > this._tempMeasure.left + this._tempMeasure.width ||\r\n y < this._tempMeasure.top ||\r\n y > this._tempMeasure.top + this._tempMeasure.height\r\n ) {\r\n if (this.isVertical) {\r\n this.value = this.minimum + (1 - (y - this._currentMeasure.top) / this._currentMeasure.height) * (this.maximum - this.minimum);\r\n } else {\r\n this.value = this.minimum + ((x - this._currentMeasure.left) / this._currentMeasure.width) * (this.maximum - this.minimum);\r\n }\r\n }\r\n }\r\n\r\n // Delta mode\r\n let delta: number;\r\n if (this.isVertical) {\r\n delta = -((y - this._originY) / (this._currentMeasure.height - this._effectiveThumbThickness));\r\n } else {\r\n delta = (x - this._originX) / (this._currentMeasure.width - this._effectiveThumbThickness);\r\n }\r\n\r\n this.value += sign * delta * (this.maximum - this.minimum);\r\n\r\n this._originX = x;\r\n this._originY = y;\r\n }\r\n\r\n public override _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: PointerInfoBase): boolean {\r\n this._first = true;\r\n\r\n return super._onPointerDown(target, coordinates, pointerId, buttonIndex, pi);\r\n }\r\n}\r\n","import { type Nullable } from \"core/types\";\r\nimport { type Observer } from \"core/Misc/observable\";\r\nimport { type Vector2 } from \"core/Maths/math\";\r\nimport { Rectangle } from \"../rectangle\";\r\nimport { Grid } from \"../grid\";\r\nimport { type Image } from \"../image\";\r\nimport { Control } from \"../control\";\r\nimport { type Container } from \"../container\";\r\nimport { type Measure } from \"../../measure\";\r\nimport { type AdvancedDynamicTexture } from \"../../advancedDynamicTexture\";\r\nimport { _ScrollViewerWindow } from \"./scrollViewerWindow\";\r\nimport { ScrollBar } from \"../sliders/scrollBar\";\r\nimport { ImageScrollBar } from \"../sliders/imageScrollBar\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\n\r\n/**\r\n * Class used to hold a viewer window and sliders in a grid\r\n */\r\nexport class ScrollViewer extends Rectangle {\r\n private _grid: Grid;\r\n private _horizontalBarSpace: Rectangle;\r\n private _verticalBarSpace: Rectangle;\r\n private _dragSpace: Rectangle;\r\n private _horizontalBar: ScrollBar | ImageScrollBar;\r\n private _verticalBar: ScrollBar | ImageScrollBar;\r\n private _barColor: string;\r\n private _barBackground: string;\r\n private _barImage: Image;\r\n private _horizontalBarImage: Image;\r\n private _verticalBarImage: Image;\r\n private _barBackgroundImage: Image;\r\n private _horizontalBarBackgroundImage: Image;\r\n private _verticalBarBackgroundImage: Image;\r\n private _barSize: number = 20;\r\n private _window: _ScrollViewerWindow;\r\n private _pointerIsOver: boolean = false;\r\n private _wheelPrecision: number = 0.05;\r\n private _onWheelObserver: Nullable<Observer<Vector2>>;\r\n private _clientWidth: number;\r\n private _clientHeight: number;\r\n private _useImageBar: boolean;\r\n private _thumbLength: number = 0.5;\r\n private _thumbHeight: number = 1;\r\n private _barImageHeight: number = 1;\r\n private _horizontalBarImageHeight: number = 1;\r\n private _verticalBarImageHeight: number = 1;\r\n private _oldWindowContentsWidth: number = 0;\r\n private _oldWindowContentsHeight: number = 0;\r\n\r\n /**\r\n * Gets the horizontal scrollbar\r\n */\r\n public get horizontalBar(): ScrollBar | ImageScrollBar {\r\n return this._horizontalBar;\r\n }\r\n\r\n /**\r\n * Gets the vertical scrollbar\r\n */\r\n public get verticalBar(): ScrollBar | ImageScrollBar {\r\n return this._verticalBar;\r\n }\r\n\r\n /**\r\n * Adds a new control to the current container\r\n * @param control defines the control to add\r\n * @returns the current container\r\n */\r\n public override addControl(control: Nullable<Control>): Container {\r\n if (!control) {\r\n return this;\r\n }\r\n\r\n this._window.addControl(control);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes a control from the current container\r\n * @param control defines the control to remove\r\n * @returns the current container\r\n */\r\n public override removeControl(control: Control): Container {\r\n this._window.removeControl(control);\r\n return this;\r\n }\r\n\r\n /** Gets the list of children */\r\n public override get children(): Control[] {\r\n return this._window.children;\r\n }\r\n\r\n public override _flagDescendantsAsMatrixDirty(): void {\r\n for (const child of this._children) {\r\n child._markMatrixAsDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Freezes or unfreezes the controls in the window.\r\n * When controls are frozen, the scroll viewer can render a lot more quickly but updates to positions/sizes of controls\r\n * are not taken into account. If you want to change positions/sizes, unfreeze, perform the changes then freeze again\r\n */\r\n public get freezeControls(): boolean {\r\n return this._window.freezeControls;\r\n }\r\n\r\n public set freezeControls(value: boolean) {\r\n this._window.freezeControls = value;\r\n }\r\n\r\n /** Gets the bucket width */\r\n public get bucketWidth(): number {\r\n return this._window.bucketWidth;\r\n }\r\n\r\n /** Gets the bucket height */\r\n public get bucketHeight(): number {\r\n return this._window.bucketHeight;\r\n }\r\n\r\n /**\r\n * Sets the bucket sizes.\r\n * When freezeControls is true, setting a non-zero bucket size will improve performances by updating only\r\n * controls that are visible. The bucket sizes is used to subdivide (internally) the window area to smaller areas into which\r\n * controls are dispatched. So, the size should be roughly equals to the mean size of all the controls of\r\n * the window. To disable the usage of buckets, sets either width or height (or both) to 0.\r\n * Please note that using this option will raise the memory usage (the higher the bucket sizes, the less memory\r\n * used), that's why it is not enabled by default.\r\n * @param width width of the bucket\r\n * @param height height of the bucket\r\n */\r\n public setBucketSizes(width: number, height: number): void {\r\n this._window.setBucketSizes(width, height);\r\n }\r\n\r\n private _forceHorizontalBar: boolean = false;\r\n private _forceVerticalBar: boolean = false;\r\n\r\n /**\r\n * Forces the horizontal scroll bar to be displayed\r\n */\r\n public get forceHorizontalBar(): boolean {\r\n return this._forceHorizontalBar;\r\n }\r\n\r\n public set forceHorizontalBar(value: boolean) {\r\n this._grid.setRowDefinition(1, value ? this._barSize : 0, true);\r\n this._horizontalBar.isVisible = value;\r\n this._forceHorizontalBar = value;\r\n }\r\n\r\n /**\r\n * Forces the vertical scroll bar to be displayed\r\n */\r\n public get forceVerticalBar(): boolean {\r\n return this._forceVerticalBar;\r\n }\r\n\r\n public set forceVerticalBar(value: boolean) {\r\n this._grid.setColumnDefinition(1, value ? this._barSize : 0, true);\r\n this._verticalBar.isVisible = value;\r\n this._forceVerticalBar = value;\r\n }\r\n\r\n /**\r\n * Creates a new ScrollViewer\r\n * @param name of ScrollViewer\r\n * @param isImageBased\r\n */\r\n constructor(name?: string, isImageBased?: boolean) {\r\n super(name);\r\n\r\n this._useImageBar = isImageBased ? isImageBased : false;\r\n\r\n this.onDirtyObservable.add(() => {\r\n this._horizontalBarSpace.color = this.color;\r\n this._verticalBarSpace.color = this.color;\r\n this._dragSpace.color = this.color;\r\n });\r\n\r\n this.onPointerEnterObservable.add(() => {\r\n this._pointerIsOver = true;\r\n });\r\n\r\n this.onPointerOutObservable.add(() => {\r\n this._pointerIsOver = false;\r\n });\r\n\r\n this._grid = new Grid();\r\n if (this._useImageBar) {\r\n this._horizontalBar = new ImageScrollBar();\r\n this._verticalBar = new ImageScrollBar();\r\n } else {\r\n this._horizontalBar = new ScrollBar();\r\n this._verticalBar = new ScrollBar();\r\n }\r\n\r\n this._window = new _ScrollViewerWindow(\"scrollViewer_window\");\r\n this._window.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n this._window.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\r\n\r\n this._grid.addColumnDefinition(1);\r\n this._grid.addColumnDefinition(0, true);\r\n this._grid.addRowDefinition(1);\r\n this._grid.addRowDefinition(0, true);\r\n\r\n super.addControl(this._grid);\r\n this._grid.addControl(this._window, 0, 0);\r\n\r\n this._verticalBarSpace = new Rectangle();\r\n this._verticalBarSpace.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n this._verticalBarSpace.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\r\n this._verticalBarSpace.thickness = 1;\r\n this._grid.addControl(this._verticalBarSpace, 0, 1);\r\n this._addBar(this._verticalBar, this._verticalBarSpace, true, Math.PI);\r\n\r\n this._horizontalBarSpace = new Rectangle();\r\n this._horizontalBarSpace.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n this._horizontalBarSpace.verticalAlignment = Control.VERTICAL_ALIGNMENT_TOP;\r\n this._horizontalBarSpace.thickness = 1;\r\n this._grid.addControl(this._horizontalBarSpace, 1, 0);\r\n this._addBar(this._horizontalBar, this._horizontalBarSpace, false, 0);\r\n\r\n this._dragSpace = new Rectangle();\r\n this._dragSpace.thickness = 1;\r\n this._grid.addControl(this._dragSpace, 1, 1);\r\n\r\n this._grid.clipChildren = false;\r\n\r\n // Colors\r\n if (!this._useImageBar) {\r\n this.barColor = \"grey\";\r\n this.barBackground = \"transparent\";\r\n }\r\n }\r\n\r\n /** Reset the scroll viewer window to initial size */\r\n public resetWindow() {\r\n this._window.width = \"100%\";\r\n this._window.height = \"100%\";\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"ScrollViewer\";\r\n }\r\n\r\n private _buildClientSizes() {\r\n const ratio = this.host.idealRatio;\r\n\r\n this._window.parentClientWidth = this._currentMeasure.width - (this._verticalBar.isVisible || this.forceVerticalBar ? this._barSize * ratio : 0) - 2 * this.thickness;\r\n this._window.parentClientHeight = this._currentMeasure.height - (this._horizontalBar.isVisible || this.forceHorizontalBar ? this._barSize * ratio : 0) - 2 * this.thickness;\r\n\r\n this._clientWidth = this._window.parentClientWidth;\r\n this._clientHeight = this._window.parentClientHeight;\r\n }\r\n\r\n protected override _additionalProcessing(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n super._additionalProcessing(parentMeasure, context);\r\n\r\n this._buildClientSizes();\r\n }\r\n\r\n protected override _postMeasure(): void {\r\n super._postMeasure();\r\n\r\n this._updateScroller();\r\n\r\n this._setWindowPosition(false);\r\n }\r\n\r\n /**\r\n * Gets or sets the mouse wheel precision\r\n * from 0 to 1 with a default value of 0.05\r\n * */\r\n @serialize()\r\n public get wheelPrecision(): number {\r\n return this._wheelPrecision;\r\n }\r\n\r\n public set wheelPrecision(value: number) {\r\n if (this._wheelPrecision === value) {\r\n return;\r\n }\r\n\r\n if (value < 0) {\r\n value = 0;\r\n }\r\n\r\n if (value > 1) {\r\n value = 1;\r\n }\r\n\r\n this._wheelPrecision = value;\r\n }\r\n\r\n /** Gets or sets the scroll bar container background color */\r\n @serialize()\r\n public get scrollBackground(): string {\r\n return this._horizontalBarSpace.background;\r\n }\r\n\r\n public set scrollBackground(color: string) {\r\n if (this._horizontalBarSpace.background === color) {\r\n return;\r\n }\r\n this._horizontalBarSpace.background = color;\r\n this._verticalBarSpace.background = color;\r\n }\r\n\r\n /** Gets or sets the bar color */\r\n @serialize()\r\n public get barColor(): string {\r\n return this._barColor;\r\n }\r\n\r\n public set barColor(color: string) {\r\n if (this._barColor === color) {\r\n return;\r\n }\r\n\r\n this._barColor = color;\r\n this._horizontalBar.color = color;\r\n this._verticalBar.color = color;\r\n }\r\n\r\n /** Gets or sets the bar image */\r\n public get thumbImage(): Image {\r\n return this._barImage;\r\n }\r\n\r\n public set thumbImage(value: Image) {\r\n if (this._barImage === value) {\r\n return;\r\n }\r\n\r\n this._barImage = value;\r\n const hb = <ImageScrollBar>this._horizontalBar;\r\n const vb = <ImageScrollBar>this._verticalBar;\r\n hb.thumbImage = value;\r\n vb.thumbImage = value;\r\n }\r\n\r\n /** Gets or sets the horizontal bar image */\r\n public get horizontalThumbImage(): Image {\r\n return this._horizontalBarImage;\r\n }\r\n\r\n public set horizontalThumbImage(value: Image) {\r\n if (this._horizontalBarImage === value) {\r\n return;\r\n }\r\n\r\n this._horizontalBarImage = value;\r\n const hb = <ImageScrollBar>this._horizontalBar;\r\n hb.thumbImage = value;\r\n }\r\n\r\n /** Gets or sets the vertical bar image */\r\n public get verticalThumbImage(): Image {\r\n return this._verticalBarImage;\r\n }\r\n\r\n public set verticalThumbImage(value: Image) {\r\n if (this._verticalBarImage === value) {\r\n return;\r\n }\r\n\r\n this._verticalBarImage = value;\r\n const vb = <ImageScrollBar>this._verticalBar;\r\n vb.thumbImage = value;\r\n }\r\n\r\n /** Gets or sets the size of the bar */\r\n @serialize()\r\n public get barSize(): number {\r\n return this._barSize;\r\n }\r\n\r\n public set barSize(value: number) {\r\n if (this._barSize === value) {\r\n return;\r\n }\r\n\r\n this._barSize = value;\r\n this._markAsDirty();\r\n\r\n if (this._horizontalBar.isVisible) {\r\n this._grid.setRowDefinition(1, this._barSize, true);\r\n }\r\n if (this._verticalBar.isVisible) {\r\n this._grid.setColumnDefinition(1, this._barSize, true);\r\n }\r\n }\r\n\r\n /** Gets or sets the length of the thumb */\r\n public get thumbLength(): number {\r\n return this._thumbLength;\r\n }\r\n\r\n public set thumbLength(value: number) {\r\n if (this._thumbLength === value) {\r\n return;\r\n }\r\n if (value <= 0) {\r\n value = 0.1;\r\n }\r\n if (value > 1) {\r\n value = 1;\r\n }\r\n this._thumbLength = value;\r\n const hb = <ImageScrollBar>this._horizontalBar;\r\n const vb = <ImageScrollBar>this._verticalBar;\r\n hb.thumbLength = value;\r\n vb.thumbLength = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the height of the thumb */\r\n public get thumbHeight(): number {\r\n return this._thumbHeight;\r\n }\r\n\r\n public set thumbHeight(value: number) {\r\n if (this._thumbHeight === value) {\r\n return;\r\n }\r\n if (value <= 0) {\r\n value = 0.1;\r\n }\r\n if (value > 1) {\r\n value = 1;\r\n }\r\n this._thumbHeight = value;\r\n const hb = <ImageScrollBar>this._horizontalBar;\r\n const vb = <ImageScrollBar>this._verticalBar;\r\n hb.thumbHeight = value;\r\n vb.thumbHeight = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the height of the bar image */\r\n public get barImageHeight(): number {\r\n return this._barImageHeight;\r\n }\r\n\r\n public set barImageHeight(value: number) {\r\n if (this._barImageHeight === value) {\r\n return;\r\n }\r\n if (value <= 0) {\r\n value = 0.1;\r\n }\r\n if (value > 1) {\r\n value = 1;\r\n }\r\n this._barImageHeight = value;\r\n const hb = <ImageScrollBar>this._horizontalBar;\r\n const vb = <ImageScrollBar>this._verticalBar;\r\n hb.barImageHeight = value;\r\n vb.barImageHeight = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the height of the horizontal bar image */\r\n public get horizontalBarImageHeight(): number {\r\n return this._horizontalBarImageHeight;\r\n }\r\n\r\n public set horizontalBarImageHeight(value: number) {\r\n if (this._horizontalBarImageHeight === value) {\r\n return;\r\n }\r\n if (value <= 0) {\r\n value = 0.1;\r\n }\r\n if (value > 1) {\r\n value = 1;\r\n }\r\n this._horizontalBarImageHeight = value;\r\n const hb = <ImageScrollBar>this._horizontalBar;\r\n hb.barImageHeight = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the height of the vertical bar image */\r\n public get verticalBarImageHeight(): number {\r\n return this._verticalBarImageHeight;\r\n }\r\n\r\n public set verticalBarImageHeight(value: number) {\r\n if (this._verticalBarImageHeight === value) {\r\n return;\r\n }\r\n if (value <= 0) {\r\n value = 0.1;\r\n }\r\n if (value > 1) {\r\n value = 1;\r\n }\r\n this._verticalBarImageHeight = value;\r\n const vb = <ImageScrollBar>this._verticalBar;\r\n vb.barImageHeight = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the bar background */\r\n @serialize()\r\n public get barBackground(): string {\r\n return this._barBackground;\r\n }\r\n\r\n public set barBackground(color: string) {\r\n if (this._barBackground === color) {\r\n return;\r\n }\r\n\r\n this._barBackground = color;\r\n const hb = <ScrollBar>this._horizontalBar;\r\n const vb = <ScrollBar>this._verticalBar;\r\n hb.background = color;\r\n vb.background = color;\r\n this._dragSpace.background = color;\r\n }\r\n\r\n /** Gets or sets the bar background image */\r\n public get barImage(): Image {\r\n return this._barBackgroundImage;\r\n }\r\n\r\n public set barImage(value: Image) {\r\n this._barBackgroundImage = value;\r\n const hb = <ImageScrollBar>this._horizontalBar;\r\n const vb = <ImageScrollBar>this._verticalBar;\r\n hb.backgroundImage = value;\r\n vb.backgroundImage = value;\r\n }\r\n\r\n /** Gets or sets the horizontal bar background image */\r\n public get horizontalBarImage(): Image {\r\n return this._horizontalBarBackgroundImage;\r\n }\r\n\r\n public set horizontalBarImage(value: Image) {\r\n this._horizontalBarBackgroundImage = value;\r\n const hb = <ImageScrollBar>this._horizontalBar;\r\n hb.backgroundImage = value;\r\n }\r\n\r\n /** Gets or sets the vertical bar background image */\r\n public get verticalBarImage(): Image {\r\n return this._verticalBarBackgroundImage;\r\n }\r\n\r\n public set verticalBarImage(value: Image) {\r\n this._verticalBarBackgroundImage = value;\r\n const vb = <ImageScrollBar>this._verticalBar;\r\n vb.backgroundImage = value;\r\n }\r\n\r\n private _setWindowPosition(force = true): void {\r\n const ratio = this.host.idealRatio;\r\n const windowContentsWidth = this._window._currentMeasure.width;\r\n const windowContentsHeight = this._window._currentMeasure.height;\r\n\r\n if (!force && this._oldWindowContentsWidth === windowContentsWidth && this._oldWindowContentsHeight === windowContentsHeight) {\r\n return;\r\n }\r\n\r\n this._oldWindowContentsWidth = windowContentsWidth;\r\n this._oldWindowContentsHeight = windowContentsHeight;\r\n\r\n const _endLeft = this._clientWidth - windowContentsWidth;\r\n const _endTop = this._clientHeight - windowContentsHeight;\r\n\r\n const newLeft = (this._horizontalBar.value / ratio) * _endLeft + \"px\";\r\n const newTop = (this._verticalBar.value / ratio) * _endTop + \"px\";\r\n\r\n if (newLeft !== this._window.left) {\r\n this._window.left = newLeft;\r\n if (!this.freezeControls) {\r\n this._rebuildLayout = true;\r\n }\r\n }\r\n\r\n if (newTop !== this._window.top) {\r\n this._window.top = newTop;\r\n if (!this.freezeControls) {\r\n this._rebuildLayout = true;\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n private _updateScroller(): void {\r\n const windowContentsWidth = this._window._currentMeasure.width;\r\n const windowContentsHeight = this._window._currentMeasure.height;\r\n\r\n if (this._horizontalBar.isVisible && windowContentsWidth <= this._clientWidth && !this.forceHorizontalBar) {\r\n this._grid.setRowDefinition(1, 0, true);\r\n this._horizontalBar.isVisible = false;\r\n this._horizontalBar.value = 0;\r\n this._rebuildLayout = true;\r\n } else if (!this._horizontalBar.isVisible && (windowContentsWidth > this._clientWidth || this.forceHorizontalBar)) {\r\n this._grid.setRowDefinition(1, this._barSize, true);\r\n this._horizontalBar.isVisible = true;\r\n this._rebuildLayout = true;\r\n }\r\n\r\n if (this._verticalBar.isVisible && windowContentsHeight <= this._clientHeight && !this.forceVerticalBar) {\r\n this._grid.setColumnDefinition(1, 0, true);\r\n this._verticalBar.isVisible = false;\r\n this._verticalBar.value = 0;\r\n this._rebuildLayout = true;\r\n } else if (!this._verticalBar.isVisible && (windowContentsHeight > this._clientHeight || this.forceVerticalBar)) {\r\n this._grid.setColumnDefinition(1, this._barSize, true);\r\n this._verticalBar.isVisible = true;\r\n this._rebuildLayout = true;\r\n }\r\n\r\n this._buildClientSizes();\r\n\r\n const ratio = this.host.idealRatio;\r\n\r\n this._horizontalBar.thumbWidth = this._thumbLength * 0.9 * (this._clientWidth / ratio) + \"px\";\r\n this._verticalBar.thumbWidth = this._thumbLength * 0.9 * (this._clientHeight / ratio) + \"px\";\r\n }\r\n\r\n public override _link(host: AdvancedDynamicTexture): void {\r\n super._link(host);\r\n\r\n this._attachWheel();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n private _addBar(barControl: ScrollBar | ImageScrollBar, barContainer: Rectangle, isVertical: boolean, rotation: number) {\r\n barControl.paddingLeft = 0;\r\n barControl.width = \"100%\";\r\n barControl.height = \"100%\";\r\n barControl.barOffset = 0;\r\n barControl.value = 0;\r\n barControl.maximum = 1;\r\n barControl.horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;\r\n barControl.verticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER;\r\n barControl.isVertical = isVertical;\r\n barControl.rotation = rotation;\r\n barControl.isVisible = false;\r\n\r\n barContainer.addControl(barControl);\r\n\r\n barControl.onValueChangedObservable.add(() => {\r\n this._setWindowPosition();\r\n });\r\n }\r\n\r\n /** @internal */\r\n private _attachWheel() {\r\n if (!this._host || this._onWheelObserver) {\r\n return;\r\n }\r\n\r\n this._onWheelObserver = this.onWheelObservable.add((pi) => {\r\n if (!this._pointerIsOver || this.isReadOnly) {\r\n return;\r\n }\r\n if (this._verticalBar.isVisible == true) {\r\n if (pi.y < 0 && this._verticalBar.value > 0) {\r\n this._verticalBar.value -= this._wheelPrecision;\r\n } else if (pi.y > 0 && this._verticalBar.value < this._verticalBar.maximum) {\r\n this._verticalBar.value += this._wheelPrecision;\r\n }\r\n }\r\n if (this._horizontalBar.isVisible == true) {\r\n if (pi.x < 0 && this._horizontalBar.value < this._horizontalBar.maximum) {\r\n this._horizontalBar.value += this._wheelPrecision;\r\n } else if (pi.x > 0 && this._horizontalBar.value > 0) {\r\n this._horizontalBar.value -= this._wheelPrecision;\r\n }\r\n }\r\n });\r\n }\r\n\r\n public override _renderHighlightSpecific(context: ICanvasRenderingContext): void {\r\n if (!this.isHighlighted) {\r\n return;\r\n }\r\n\r\n super._renderHighlightSpecific(context);\r\n\r\n this._grid._renderHighlightSpecific(context);\r\n\r\n context.restore();\r\n }\r\n\r\n /** Releases associated resources */\r\n public override dispose() {\r\n this.onWheelObservable.remove(this._onWheelObserver);\r\n this._onWheelObserver = null;\r\n super.dispose();\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.ScrollViewer\", ScrollViewer);\r\n","import { type Nullable } from \"core/types\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { type Vector2 } from \"core/Maths/math.vector\";\r\n\r\nimport { Rectangle } from \"./rectangle\";\r\nimport { type Control } from \"./control\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { type PointerInfoBase } from \"core/Events/pointerEvents\";\r\n\r\n/**\r\n * Class used to create toggle buttons\r\n * @since 5.0.0\r\n */\r\nexport class ToggleButton extends Rectangle {\r\n /**\r\n * Function called to generate the toActive animation\r\n */\r\n public toActiveAnimation: () => void;\r\n\r\n /**\r\n * Function called to generate the toInactive animation\r\n */\r\n public toInactiveAnimation: () => void;\r\n\r\n /**\r\n * Function called to generate a pointer enter animation when the toggle button is active.\r\n */\r\n public pointerEnterActiveAnimation: () => void;\r\n /**\r\n * Function called to generate a pointer out animation when the toggle button is active.\r\n */\r\n public pointerOutActiveAnimation: () => void;\r\n /**\r\n * Function called to generate a pointer down animation when the toggle button is active.\r\n */\r\n public pointerDownActiveAnimation: () => void;\r\n /**\r\n * Function called to generate a pointer up animation when the toggle button is active.\r\n */\r\n public pointerUpActiveAnimation: () => void;\r\n\r\n /**\r\n * Function called to generate a pointer enter animation when the toggle button is inactive.\r\n */\r\n public pointerEnterInactiveAnimation: () => void;\r\n /**\r\n * Function called to generate a pointer out animation when the toggle button is inactive.\r\n */\r\n public pointerOutInactiveAnimation: () => void;\r\n /**\r\n * Function called to generate a pointer down animation when the toggle button is inactive.\r\n */\r\n public pointerDownInactiveAnimation: () => void;\r\n /**\r\n * Function called to generate a pointer up animation when the toggle button is inactive.\r\n */\r\n public pointerUpInactiveAnimation: () => void;\r\n\r\n /** Observable raised when isActive is changed */\r\n public onIsActiveChangedObservable = new Observable<boolean>();\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the toggle button will let internal controls handle picking instead of doing it directly using its bounding info\r\n */\r\n public override delegatePickingToChildren = false;\r\n\r\n private _group: string;\r\n /** Gets or sets group name this toggle button belongs to */\r\n public get group(): string {\r\n return this._group;\r\n }\r\n public set group(value: string) {\r\n if (this._group === value) {\r\n return;\r\n }\r\n\r\n this._group = value;\r\n }\r\n\r\n private _isActive = false;\r\n /** Gets or sets a boolean indicating if the toggle button is active or not */\r\n public get isActive(): boolean {\r\n return this._isActive;\r\n }\r\n public set isActive(value: boolean) {\r\n // Function modeled after radioButton.ts\r\n if (this._isActive === value) {\r\n return;\r\n }\r\n\r\n this._isActive = value;\r\n\r\n // Update the visual state based on the new value\r\n if (this._isActive) {\r\n this.toActiveAnimation?.();\r\n } else {\r\n this.toInactiveAnimation?.();\r\n }\r\n\r\n this._markAsDirty();\r\n\r\n this.onIsActiveChangedObservable.notifyObservers(value);\r\n\r\n if (this._isActive && this._host && this._group) {\r\n // A toggle button in a group can only have 1 active element at a given time.\r\n // If this toggle button has a group, set other toggle buttons in the group to inactive.\r\n this._host.executeOnAllControls((control) => {\r\n // Check for control type ToggleButton\r\n if (control.typeName === \"ToggleButton\") {\r\n // Don't do anything to this toggle button\r\n if (control === this) {\r\n return;\r\n }\r\n\r\n const childToggle = <ToggleButton>control;\r\n // If toggle button is in same group, set isActive to false\r\n if (childToggle.group === this.group) {\r\n childToggle.isActive = false;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new ToggleButton\r\n * @param name defines the control name\r\n * @param group defines the toggle group this toggle belongs to\r\n */\r\n constructor(\r\n public override name?: string,\r\n group?: string\r\n ) {\r\n super(name);\r\n this.group = group ?? \"\";\r\n\r\n this.thickness = 0;\r\n this.isPointerBlocker = true;\r\n\r\n let alphaStore: Nullable<number> = null;\r\n\r\n this.toActiveAnimation = () => {\r\n this.thickness = 1;\r\n };\r\n this.toInactiveAnimation = () => {\r\n this.thickness = 0;\r\n };\r\n\r\n this.pointerEnterActiveAnimation = () => {\r\n alphaStore = this.alpha;\r\n this.alpha -= 0.1;\r\n };\r\n\r\n this.pointerOutActiveAnimation = () => {\r\n if (alphaStore !== null) {\r\n this.alpha = alphaStore;\r\n }\r\n };\r\n\r\n this.pointerDownActiveAnimation = () => {\r\n this.scaleX -= 0.05;\r\n this.scaleY -= 0.05;\r\n };\r\n\r\n this.pointerUpActiveAnimation = () => {\r\n this.scaleX += 0.05;\r\n this.scaleY += 0.05;\r\n };\r\n\r\n this.pointerEnterInactiveAnimation = () => {\r\n alphaStore = this.alpha;\r\n this.alpha -= 0.1;\r\n };\r\n\r\n this.pointerOutInactiveAnimation = () => {\r\n if (alphaStore !== null) {\r\n this.alpha = alphaStore;\r\n }\r\n };\r\n\r\n this.pointerDownInactiveAnimation = () => {\r\n this.scaleX -= 0.05;\r\n this.scaleY -= 0.05;\r\n };\r\n\r\n this.pointerUpInactiveAnimation = () => {\r\n this.scaleX += 0.05;\r\n this.scaleY += 0.05;\r\n };\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"ToggleButton\";\r\n }\r\n\r\n // While being a container, the toggle button behaves like a control.\r\n /**\r\n * @internal\r\n */\r\n public override _processPicking(x: number, y: number, pi: PointerInfoBase, type: number, pointerId: number, buttonIndex: number, deltaX?: number, deltaY?: number): boolean {\r\n if (!this._isEnabled || !this.isHitTestVisible || !this.isVisible || this.notRenderable) {\r\n return false;\r\n }\r\n\r\n if (!super.contains(x, y)) {\r\n return false;\r\n }\r\n\r\n if (this.delegatePickingToChildren) {\r\n let contains = false;\r\n for (let index = this._children.length - 1; index >= 0; index--) {\r\n const child = this._children[index];\r\n if (child.isEnabled && child.isHitTestVisible && child.isVisible && !child.notRenderable && child.contains(x, y)) {\r\n contains = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!contains) {\r\n return false;\r\n }\r\n }\r\n\r\n this._processObservables(type, x, y, pi, pointerId, buttonIndex, deltaX, deltaY);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _onPointerEnter(target: Control, pi: PointerInfoBase): boolean {\r\n if (!super._onPointerEnter(target, pi)) {\r\n return false;\r\n }\r\n\r\n if (this.isReadOnly) {\r\n return true;\r\n }\r\n\r\n if (this._isActive) {\r\n if (this.pointerEnterActiveAnimation) {\r\n this.pointerEnterActiveAnimation();\r\n }\r\n } else {\r\n if (this.pointerEnterInactiveAnimation) {\r\n this.pointerEnterInactiveAnimation();\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _onPointerOut(target: Control, pi: PointerInfoBase, force = false): void {\r\n if (!this.isReadOnly) {\r\n if (this._isActive) {\r\n if (this.pointerOutActiveAnimation) {\r\n this.pointerOutActiveAnimation();\r\n }\r\n } else {\r\n if (this.pointerOutInactiveAnimation) {\r\n this.pointerOutInactiveAnimation();\r\n }\r\n }\r\n }\r\n\r\n super._onPointerOut(target, pi, force);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _onPointerDown(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, pi: PointerInfoBase): boolean {\r\n if (!super._onPointerDown(target, coordinates, pointerId, buttonIndex, pi)) {\r\n return false;\r\n }\r\n\r\n if (this.isReadOnly) {\r\n return true;\r\n }\r\n\r\n if (this._isActive) {\r\n if (this.pointerDownActiveAnimation) {\r\n this.pointerDownActiveAnimation();\r\n }\r\n } else {\r\n if (this.pointerDownInactiveAnimation) {\r\n this.pointerDownInactiveAnimation();\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _onPointerUp(target: Control, coordinates: Vector2, pointerId: number, buttonIndex: number, notifyClick: boolean, pi: PointerInfoBase): void {\r\n if (!this.isReadOnly) {\r\n if (this._isActive) {\r\n if (this.pointerUpActiveAnimation) {\r\n this.pointerUpActiveAnimation();\r\n }\r\n } else {\r\n if (this.pointerUpInactiveAnimation) {\r\n this.pointerUpInactiveAnimation();\r\n }\r\n }\r\n }\r\n\r\n super._onPointerUp(target, coordinates, pointerId, buttonIndex, notifyClick, pi);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GUI.ToggleButton\", ToggleButton);\r\n","import { type Nullable } from \"core/types\";\r\nimport { type Observer, Observable } from \"core/Misc/observable\";\r\n\r\nimport { StackPanel } from \"./stackPanel\";\r\nimport { Button } from \"./button\";\r\nimport { type Container } from \"./container\";\r\nimport { type TextBlock } from \"./textBlock\";\r\nimport { type InputText } from \"./inputText\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { type AdvancedDynamicTexture } from \"../advancedDynamicTexture\";\r\nimport { InputTextArea } from \"./inputTextArea\";\r\nimport { type Control } from \"./control\";\r\n\r\n/**\r\n * Class used to store key control properties\r\n */\r\nexport class KeyPropertySet {\r\n /** Width */\r\n width?: string;\r\n /** Height */\r\n height?: string;\r\n /** Left padding */\r\n paddingLeft?: string;\r\n /** Right padding */\r\n paddingRight?: string;\r\n /** Top padding */\r\n paddingTop?: string;\r\n /** Bottom padding */\r\n paddingBottom?: string;\r\n /** Foreground color */\r\n color?: string;\r\n /** Background color */\r\n background?: string;\r\n}\r\n\r\ntype ConnectedInputText = {\r\n input: InputText;\r\n onFocusObserver: Nullable<Observer<Control>>;\r\n onBlurObserver: Nullable<Observer<Control>>;\r\n};\r\n\r\n/**\r\n * Class used to create virtual keyboard\r\n */\r\nexport class VirtualKeyboard extends StackPanel {\r\n /** Observable raised when a key is pressed */\r\n public onKeyPressObservable = new Observable<string>();\r\n\r\n /** Gets or sets default key button width */\r\n public defaultButtonWidth = \"40px\";\r\n /** Gets or sets default key button height */\r\n public defaultButtonHeight = \"40px\";\r\n\r\n /** Gets or sets default key button left padding */\r\n public defaultButtonPaddingLeft = \"2px\";\r\n /** Gets or sets default key button right padding */\r\n public defaultButtonPaddingRight = \"2px\";\r\n /** Gets or sets default key button top padding */\r\n public defaultButtonPaddingTop = \"2px\";\r\n /** Gets or sets default key button bottom padding */\r\n public defaultButtonPaddingBottom = \"2px\";\r\n\r\n /** Gets or sets default key button foreground color */\r\n public defaultButtonColor = \"#DDD\";\r\n /** Gets or sets default key button background color */\r\n public defaultButtonBackground = \"#070707\";\r\n\r\n /** Gets or sets shift button foreground color */\r\n public shiftButtonColor = \"#7799FF\";\r\n /** Gets or sets shift button thickness*/\r\n public selectedShiftThickness = 1;\r\n\r\n /** Gets shift key state */\r\n public shiftState = 0;\r\n\r\n protected override _getTypeName(): string {\r\n return \"VirtualKeyboard\";\r\n }\r\n\r\n private _createKey(key: string, propertySet: Nullable<KeyPropertySet>) {\r\n const button = Button.CreateSimpleButton(key, key);\r\n\r\n button.width = propertySet && propertySet.width ? propertySet.width : this.defaultButtonWidth;\r\n button.height = propertySet && propertySet.height ? propertySet.height : this.defaultButtonHeight;\r\n button.color = propertySet && propertySet.color ? propertySet.color : this.defaultButtonColor;\r\n button.background = propertySet && propertySet.background ? propertySet.background : this.defaultButtonBackground;\r\n button.paddingLeft = propertySet && propertySet.paddingLeft ? propertySet.paddingLeft : this.defaultButtonPaddingLeft;\r\n button.paddingRight = propertySet && propertySet.paddingRight ? propertySet.paddingRight : this.defaultButtonPaddingRight;\r\n button.paddingTop = propertySet && propertySet.paddingTop ? propertySet.paddingTop : this.defaultButtonPaddingTop;\r\n button.paddingBottom = propertySet && propertySet.paddingBottom ? propertySet.paddingBottom : this.defaultButtonPaddingBottom;\r\n\r\n button.thickness = 0;\r\n button.isFocusInvisible = true;\r\n\r\n button.shadowColor = this.shadowColor;\r\n button.shadowBlur = this.shadowBlur;\r\n button.shadowOffsetX = this.shadowOffsetX;\r\n button.shadowOffsetY = this.shadowOffsetY;\r\n\r\n button.onPointerUpObservable.add(() => {\r\n this.onKeyPressObservable.notifyObservers(key);\r\n });\r\n\r\n return button;\r\n }\r\n\r\n /**\r\n * Adds a new row of keys\r\n * @param keys defines the list of keys to add\r\n * @param propertySets defines the associated property sets\r\n */\r\n public addKeysRow(keys: Array<string>, propertySets?: Array<KeyPropertySet>): void {\r\n const panel = new StackPanel();\r\n panel.isVertical = false;\r\n panel.isFocusInvisible = true;\r\n\r\n let maxKey: Nullable<Button> = null;\r\n for (let i = 0; i < keys.length; i++) {\r\n let properties = null;\r\n\r\n if (propertySets && propertySets.length === keys.length) {\r\n properties = propertySets[i];\r\n }\r\n\r\n const key = this._createKey(keys[i], properties);\r\n if (!maxKey || key.heightInPixels > maxKey.heightInPixels) {\r\n maxKey = key;\r\n }\r\n\r\n panel.addControl(key);\r\n }\r\n\r\n panel.height = maxKey ? maxKey.height : this.defaultButtonHeight;\r\n\r\n this.addControl(panel);\r\n }\r\n\r\n /**\r\n * Set the shift key to a specific state\r\n * @param shiftState defines the new shift state\r\n */\r\n public applyShiftState(shiftState: number): void {\r\n if (!this.children) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < this.children.length; i++) {\r\n const row = this.children[i];\r\n if (!row || !(<Container>row).children) {\r\n continue;\r\n }\r\n\r\n const rowContainer = <Container>row;\r\n for (let j = 0; j < rowContainer.children.length; j++) {\r\n const button = rowContainer.children[j] as Button;\r\n\r\n if (!button || !button.children[0]) {\r\n continue;\r\n }\r\n\r\n const buttonTblock = button.children[0] as TextBlock;\r\n\r\n if (buttonTblock.text === \"\\u21E7\") {\r\n button.color = shiftState ? this.shiftButtonColor : this.defaultButtonColor;\r\n button.thickness = shiftState > 1 ? this.selectedShiftThickness : 0;\r\n }\r\n\r\n buttonTblock.text = shiftState > 0 ? buttonTblock.text.toUpperCase() : buttonTblock.text.toLowerCase();\r\n }\r\n }\r\n }\r\n\r\n private _currentlyConnectedInputText: Nullable<InputText | InputTextArea> = null;\r\n private _connectedInputTexts: ConnectedInputText[] = [];\r\n private _onKeyPressObserver: Nullable<Observer<string>> = null;\r\n\r\n /** Gets the input text control currently attached to the keyboard */\r\n public get connectedInputText(): Nullable<InputText | InputTextArea> {\r\n return this._currentlyConnectedInputText;\r\n }\r\n\r\n /**\r\n * Connects the keyboard with an input text control\r\n *\r\n * @param input defines the target control\r\n */\r\n public connect(input: InputText): void {\r\n const inputTextAlreadyConnected = this._connectedInputTexts.some((a) => a.input === input);\r\n if (inputTextAlreadyConnected) {\r\n return;\r\n }\r\n\r\n if (this._onKeyPressObserver === null) {\r\n this._onKeyPressObserver = this.onKeyPressObservable.add((key) => {\r\n if (!this._currentlyConnectedInputText) {\r\n return;\r\n }\r\n\r\n this._currentlyConnectedInputText._host.focusedControl = this._currentlyConnectedInputText;\r\n\r\n switch (key) {\r\n case \"\\u21E7\":\r\n this.shiftState++;\r\n if (this.shiftState > 2) {\r\n this.shiftState = 0;\r\n }\r\n this.applyShiftState(this.shiftState);\r\n return;\r\n case \"\\u2190\":\r\n if (this._currentlyConnectedInputText instanceof InputTextArea) {\r\n this._currentlyConnectedInputText.alternativeProcessKey(\"Backspace\");\r\n } else {\r\n this._currentlyConnectedInputText.processKey(8);\r\n }\r\n return;\r\n case \"\\u21B5\":\r\n if (this._currentlyConnectedInputText instanceof InputTextArea) {\r\n this._currentlyConnectedInputText.alternativeProcessKey(\"Enter\");\r\n } else {\r\n this._currentlyConnectedInputText.processKey(13);\r\n }\r\n return;\r\n }\r\n if (this._currentlyConnectedInputText instanceof InputTextArea) {\r\n this._currentlyConnectedInputText.alternativeProcessKey(\"\", this.shiftState ? key.toUpperCase() : key);\r\n } else {\r\n this._currentlyConnectedInputText.processKey(-1, this.shiftState ? key.toUpperCase() : key);\r\n }\r\n\r\n if (this.shiftState === 1) {\r\n this.shiftState = 0;\r\n this.applyShiftState(this.shiftState);\r\n }\r\n });\r\n }\r\n\r\n this.isVisible = false;\r\n this._currentlyConnectedInputText = input;\r\n input._connectedVirtualKeyboard = this;\r\n\r\n // Events hooking\r\n const onFocusObserver: Nullable<Observer<Control>> = input.onFocusObservable.add(() => {\r\n this._currentlyConnectedInputText = input;\r\n input._connectedVirtualKeyboard = this;\r\n this.isVisible = true;\r\n });\r\n\r\n const onBlurObserver: Nullable<Observer<Control>> = input.onBlurObservable.add(() => {\r\n input._connectedVirtualKeyboard = null;\r\n this._currentlyConnectedInputText = null;\r\n this.isVisible = false;\r\n });\r\n\r\n this._connectedInputTexts.push({\r\n input,\r\n onBlurObserver,\r\n onFocusObserver,\r\n });\r\n }\r\n\r\n /**\r\n * Disconnects the keyboard from connected InputText controls\r\n *\r\n * @param input optionally defines a target control, otherwise all are disconnected\r\n */\r\n public disconnect(input?: InputText): void {\r\n if (input) {\r\n // .find not available on IE\r\n const filtered = this._connectedInputTexts.filter((a) => a.input === input);\r\n if (filtered.length === 1) {\r\n this._removeConnectedInputObservables(filtered[0]);\r\n\r\n this._connectedInputTexts = this._connectedInputTexts.filter((a) => a.input !== input);\r\n if (this._currentlyConnectedInputText === input) {\r\n this._currentlyConnectedInputText = null;\r\n }\r\n }\r\n } else {\r\n for (const connectedInputText of this._connectedInputTexts) {\r\n this._removeConnectedInputObservables(connectedInputText);\r\n }\r\n this._connectedInputTexts.length = 0;\r\n }\r\n\r\n if (this._connectedInputTexts.length === 0) {\r\n this._currentlyConnectedInputText = null;\r\n this.onKeyPressObservable.remove(this._onKeyPressObserver);\r\n this._onKeyPressObserver = null;\r\n }\r\n }\r\n\r\n private _removeConnectedInputObservables(connectedInputText: ConnectedInputText): void {\r\n connectedInputText.input._connectedVirtualKeyboard = null;\r\n connectedInputText.input.onFocusObservable.remove(connectedInputText.onFocusObserver);\r\n connectedInputText.input.onBlurObservable.remove(connectedInputText.onBlurObserver);\r\n }\r\n\r\n /**\r\n * Release all resources\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n\r\n this.disconnect();\r\n }\r\n\r\n // Statics\r\n\r\n /**\r\n * Creates a new keyboard using a default layout\r\n *\r\n * @param name defines control name\r\n * @returns a new VirtualKeyboard\r\n */\r\n public static CreateDefaultLayout(name?: string): VirtualKeyboard {\r\n const returnValue = new VirtualKeyboard(name);\r\n\r\n returnValue.addKeysRow([\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"0\", \"\\u2190\"]);\r\n returnValue.addKeysRow([\"q\", \"w\", \"e\", \"r\", \"t\", \"y\", \"u\", \"i\", \"o\", \"p\"]);\r\n returnValue.addKeysRow([\"a\", \"s\", \"d\", \"f\", \"g\", \"h\", \"j\", \"k\", \"l\", \";\", \"'\", \"\\u21B5\"]);\r\n returnValue.addKeysRow([\"\\u21E7\", \"z\", \"x\", \"c\", \"v\", \"b\", \"n\", \"m\", \",\", \".\", \"/\"]);\r\n returnValue.addKeysRow([\" \"], [{ width: \"200px\" }]);\r\n\r\n return returnValue;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _parseFromContent(serializedObject: any, host: AdvancedDynamicTexture) {\r\n super._parseFromContent(serializedObject, host);\r\n for (const row of this.children) {\r\n if (row.getClassName() === \"StackPanel\") {\r\n const stackPanel = row as StackPanel;\r\n for (const key of stackPanel.children) {\r\n if (key.getClassName() === \"Button\" && key.name) {\r\n key.onPointerUpObservable.add(() => {\r\n this.onKeyPressObservable.notifyObservers(key.name as string);\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GUI.VirtualKeyboard\", VirtualKeyboard);\r\n","import { Control } from \"./control\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\n\r\n/** Class used to render a grid */\r\nexport class DisplayGrid extends Control {\r\n private _cellWidth = 20;\r\n private _cellHeight = 20;\r\n\r\n private _minorLineTickness = 1;\r\n private _minorLineColor = \"DarkGray\";\r\n\r\n private _majorLineTickness = 2;\r\n private _majorLineColor = \"White\";\r\n\r\n private _majorLineFrequency = 5;\r\n\r\n private _background = \"Black\";\r\n\r\n private _displayMajorLines = true;\r\n private _displayMinorLines = true;\r\n\r\n /** Gets or sets a boolean indicating if minor lines must be rendered (true by default)) */\r\n @serialize()\r\n public get displayMinorLines(): boolean {\r\n return this._displayMinorLines;\r\n }\r\n\r\n public set displayMinorLines(value: boolean) {\r\n if (this._displayMinorLines === value) {\r\n return;\r\n }\r\n\r\n this._displayMinorLines = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets a boolean indicating if major lines must be rendered (true by default)) */\r\n @serialize()\r\n public get displayMajorLines(): boolean {\r\n return this._displayMajorLines;\r\n }\r\n\r\n public set displayMajorLines(value: boolean) {\r\n if (this._displayMajorLines === value) {\r\n return;\r\n }\r\n\r\n this._displayMajorLines = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets background color (Black by default) */\r\n @serialize()\r\n public get background(): string {\r\n return this._background;\r\n }\r\n\r\n public set background(value: string) {\r\n if (this._background === value) {\r\n return;\r\n }\r\n\r\n this._background = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the width of each cell (20 by default) */\r\n @serialize()\r\n public get cellWidth(): number {\r\n return this._cellWidth;\r\n }\r\n\r\n public set cellWidth(value: number) {\r\n this._cellWidth = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the height of each cell (20 by default) */\r\n @serialize()\r\n public get cellHeight(): number {\r\n return this._cellHeight;\r\n }\r\n\r\n public set cellHeight(value: number) {\r\n this._cellHeight = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the tickness of minor lines (1 by default) */\r\n @serialize()\r\n public get minorLineTickness(): number {\r\n return this._minorLineTickness;\r\n }\r\n\r\n public set minorLineTickness(value: number) {\r\n this._minorLineTickness = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the color of minor lines (DarkGray by default) */\r\n @serialize()\r\n public get minorLineColor(): string {\r\n return this._minorLineColor;\r\n }\r\n\r\n public set minorLineColor(value: string) {\r\n this._minorLineColor = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the tickness of major lines (2 by default) */\r\n @serialize()\r\n public get majorLineTickness(): number {\r\n return this._majorLineTickness;\r\n }\r\n\r\n public set majorLineTickness(value: number) {\r\n this._majorLineTickness = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the color of major lines (White by default) */\r\n @serialize()\r\n public get majorLineColor(): string {\r\n return this._majorLineColor;\r\n }\r\n\r\n public set majorLineColor(value: string) {\r\n this._majorLineColor = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /** Gets or sets the frequency of major lines (default is 1 every 5 minor lines)*/\r\n @serialize()\r\n public get majorLineFrequency(): number {\r\n return this._majorLineFrequency;\r\n }\r\n\r\n public set majorLineFrequency(value: number) {\r\n this._majorLineFrequency = value;\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Creates a new GridDisplayRectangle\r\n * @param name defines the control name\r\n */\r\n constructor(public override name?: string) {\r\n super(name);\r\n }\r\n\r\n public override _draw(context: ICanvasRenderingContext): void {\r\n context.save();\r\n\r\n this._applyStates(context);\r\n\r\n if (this._isEnabled) {\r\n if (this._background) {\r\n context.fillStyle = this._background;\r\n context.fillRect(this._currentMeasure.left, this._currentMeasure.top, this._currentMeasure.width, this._currentMeasure.height);\r\n }\r\n\r\n const cellCountX = this._currentMeasure.width / this._cellWidth;\r\n const cellCountY = this._currentMeasure.height / this._cellHeight;\r\n\r\n // Minor lines\r\n const left = this._currentMeasure.left + this._currentMeasure.width / 2;\r\n const top = this._currentMeasure.top + this._currentMeasure.height / 2;\r\n\r\n if (this._displayMinorLines) {\r\n context.strokeStyle = this._minorLineColor;\r\n context.lineWidth = this._minorLineTickness;\r\n\r\n for (let x = -cellCountX / 2 + 1; x < cellCountX / 2; x++) {\r\n const cellX = left + x * this.cellWidth;\r\n\r\n context.beginPath();\r\n context.moveTo(cellX, this._currentMeasure.top);\r\n context.lineTo(cellX, this._currentMeasure.top + this._currentMeasure.height);\r\n\r\n context.stroke();\r\n }\r\n\r\n for (let y = -cellCountY / 2 + 1; y < cellCountY / 2; y++) {\r\n const cellY = top + y * this.cellHeight;\r\n\r\n context.beginPath();\r\n context.moveTo(this._currentMeasure.left, cellY);\r\n context.lineTo(this._currentMeasure.left + this._currentMeasure.width, cellY);\r\n context.stroke();\r\n }\r\n }\r\n\r\n // Major lines\r\n if (this._displayMajorLines) {\r\n context.strokeStyle = this._majorLineColor;\r\n context.lineWidth = this._majorLineTickness;\r\n\r\n for (let x = -cellCountX / 2 + this._majorLineFrequency; x < cellCountX / 2; x += this._majorLineFrequency) {\r\n const cellX = left + x * this.cellWidth;\r\n\r\n context.beginPath();\r\n context.moveTo(cellX, this._currentMeasure.top);\r\n context.lineTo(cellX, this._currentMeasure.top + this._currentMeasure.height);\r\n context.stroke();\r\n }\r\n\r\n for (let y = -cellCountY / 2 + this._majorLineFrequency; y < cellCountY / 2; y += this._majorLineFrequency) {\r\n const cellY = top + y * this.cellHeight;\r\n context.moveTo(this._currentMeasure.left, cellY);\r\n context.lineTo(this._currentMeasure.left + this._currentMeasure.width, cellY);\r\n context.closePath();\r\n context.stroke();\r\n }\r\n }\r\n }\r\n\r\n context.restore();\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"DisplayGrid\";\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.DisplayGrid\", DisplayGrid);\r\n","import { BaseSlider } from \"./baseSlider\";\r\nimport { Measure } from \"../../measure\";\r\nimport { Image } from \"../image\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\nimport { type AdvancedDynamicTexture } from \"../../advancedDynamicTexture\";\r\n\r\n/**\r\n * Class used to create slider controls based on images\r\n */\r\nexport class ImageBasedSlider extends BaseSlider {\r\n private _backgroundImage: Image;\r\n private _thumbImage: Image;\r\n private _valueBarImage: Image;\r\n private _tempMeasure = new Measure(0, 0, 0, 0);\r\n\r\n @serialize()\r\n public override get displayThumb(): boolean {\r\n return this._displayThumb && this.thumbImage != null;\r\n }\r\n\r\n public override set displayThumb(value: boolean) {\r\n if (this._displayThumb === value) {\r\n return;\r\n }\r\n\r\n this._displayThumb = value;\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the image used to render the background\r\n */\r\n public get backgroundImage(): Image {\r\n return this._backgroundImage;\r\n }\r\n\r\n public set backgroundImage(value: Image) {\r\n if (this._backgroundImage === value) {\r\n return;\r\n }\r\n\r\n this._backgroundImage = value;\r\n\r\n if (value && !value.isLoaded) {\r\n value.onImageLoadedObservable.addOnce(() => this._markAsDirty());\r\n }\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the image used to render the value bar\r\n */\r\n public get valueBarImage(): Image {\r\n return this._valueBarImage;\r\n }\r\n\r\n public set valueBarImage(value: Image) {\r\n if (this._valueBarImage === value) {\r\n return;\r\n }\r\n\r\n this._valueBarImage = value;\r\n\r\n if (value && !value.isLoaded) {\r\n value.onImageLoadedObservable.addOnce(() => this._markAsDirty());\r\n }\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Gets or sets the image used to render the thumb\r\n */\r\n public get thumbImage(): Image {\r\n return this._thumbImage;\r\n }\r\n\r\n public set thumbImage(value: Image) {\r\n if (this._thumbImage === value) {\r\n return;\r\n }\r\n\r\n this._thumbImage = value;\r\n\r\n if (value && !value.isLoaded) {\r\n value.onImageLoadedObservable.addOnce(() => this._markAsDirty());\r\n }\r\n\r\n this._markAsDirty();\r\n }\r\n\r\n /**\r\n * Creates a new ImageBasedSlider\r\n * @param name defines the control name\r\n */\r\n constructor(public override name?: string) {\r\n super(name);\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"ImageBasedSlider\";\r\n }\r\n\r\n public override _draw(context: ICanvasRenderingContext): void {\r\n context.save();\r\n\r\n this._applyStates(context);\r\n\r\n this._prepareRenderingData(\"rectangle\");\r\n const thumbPosition = this._getThumbPosition();\r\n const left = this._renderLeft;\r\n const top = this._renderTop;\r\n const width = this._renderWidth;\r\n const height = this._renderHeight;\r\n\r\n // Background\r\n if (this._backgroundImage) {\r\n this._tempMeasure.copyFromFloats(left, top, width, height);\r\n if (this.isThumbClamped && this.displayThumb) {\r\n if (this.isVertical) {\r\n this._tempMeasure.height += this._effectiveThumbThickness;\r\n } else {\r\n this._tempMeasure.width += this._effectiveThumbThickness;\r\n }\r\n }\r\n this._backgroundImage._currentMeasure.copyFrom(this._tempMeasure);\r\n this._backgroundImage._draw(context);\r\n }\r\n\r\n // Bar\r\n if (this._valueBarImage) {\r\n if (this.isVertical) {\r\n if (this.isThumbClamped && this.displayThumb) {\r\n this._tempMeasure.copyFromFloats(left, top + thumbPosition, width, height - thumbPosition + this._effectiveThumbThickness);\r\n } else {\r\n this._tempMeasure.copyFromFloats(left, top + thumbPosition, width, height - thumbPosition);\r\n }\r\n } else {\r\n if (this.isThumbClamped && this.displayThumb) {\r\n this._tempMeasure.copyFromFloats(left, top, thumbPosition + this._effectiveThumbThickness / 2, height);\r\n } else {\r\n this._tempMeasure.copyFromFloats(left, top, thumbPosition, height);\r\n }\r\n }\r\n this._valueBarImage._currentMeasure.copyFrom(this._tempMeasure);\r\n this._valueBarImage._draw(context);\r\n }\r\n\r\n // Thumb\r\n if (this.displayThumb) {\r\n if (this.isVertical) {\r\n this._tempMeasure.copyFromFloats(\r\n left - this._effectiveBarOffset,\r\n this._currentMeasure.top + thumbPosition,\r\n this._currentMeasure.width,\r\n this._effectiveThumbThickness\r\n );\r\n } else {\r\n this._tempMeasure.copyFromFloats(this._currentMeasure.left + thumbPosition, this._currentMeasure.top, this._effectiveThumbThickness, this._currentMeasure.height);\r\n }\r\n\r\n this._thumbImage._currentMeasure.copyFrom(this._tempMeasure);\r\n this._thumbImage._draw(context);\r\n }\r\n\r\n context.restore();\r\n }\r\n\r\n /**\r\n * Serializes the current control\r\n * @param serializationObject defined the JSON serialized object\r\n */\r\n public override serialize(serializationObject: any) {\r\n super.serialize(serializationObject);\r\n const backgroundImage = {};\r\n const thumbImage = {};\r\n const valueBarImage = {};\r\n this.backgroundImage.serialize(backgroundImage);\r\n this.thumbImage.serialize(thumbImage);\r\n this.valueBarImage.serialize(valueBarImage);\r\n serializationObject.backgroundImage = backgroundImage;\r\n serializationObject.thumbImage = thumbImage;\r\n serializationObject.valueBarImage = valueBarImage;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _parseFromContent(serializedObject: any, host: AdvancedDynamicTexture) {\r\n super._parseFromContent(serializedObject, host);\r\n this.backgroundImage = Image.Parse(serializedObject.backgroundImage, host) as Image;\r\n this.thumbImage = Image.Parse(serializedObject.thumbImage, host) as Image;\r\n this.valueBarImage = Image.Parse(serializedObject.valueBarImage, host) as Image;\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.ImageBasedSlider\", ImageBasedSlider);\r\n","import { Control } from \"./control\";\r\nimport { StackPanel } from \"./stackPanel\";\r\nimport { TextBlock } from \"./textBlock\";\r\n\r\n/**\r\n * Forcing an export so that this code will execute\r\n * @internal\r\n */\r\nconst Name = \"Statics\";\r\n\r\nexport { Name as name };\r\n\r\n/**\r\n * Creates a stack panel that can be used to render headers\r\n * @param control defines the control to associate with the header\r\n * @param text defines the text of the header\r\n * @param size defines the size of the header\r\n * @param options defines options used to configure the header\r\n * @param options.isHorizontal\r\n * @param options.controlFirst\r\n * @returns a new StackPanel\r\n */\r\nControl.AddHeader = function (control: Control, text: string, size: string | number, options: { isHorizontal: boolean; controlFirst: boolean }): StackPanel {\r\n const panel = new StackPanel(\"panel\");\r\n const isHorizontal = options ? options.isHorizontal : true;\r\n const controlFirst = options ? options.controlFirst : true;\r\n\r\n panel.isVertical = !isHorizontal;\r\n\r\n const header = new TextBlock(\"header\");\r\n header.text = text;\r\n header.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n if (isHorizontal) {\r\n header.width = size;\r\n } else {\r\n header.height = size;\r\n }\r\n\r\n if (controlFirst) {\r\n panel.addControl(control);\r\n panel.addControl(header);\r\n header.paddingLeft = \"5px\";\r\n } else {\r\n panel.addControl(header);\r\n panel.addControl(control);\r\n header.paddingRight = \"5px\";\r\n }\r\n\r\n header.shadowBlur = control.shadowBlur;\r\n header.shadowColor = control.shadowColor;\r\n header.shadowOffsetX = control.shadowOffsetX;\r\n header.shadowOffsetY = control.shadowOffsetY;\r\n\r\n return panel;\r\n};\r\n","/*\r\n * Base Gradient class. Should not be used directly.\r\n */\r\n\r\nimport { type ICanvasGradient, type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\n\r\n/**\r\n * Type that represents a single stop on the gradient.\r\n */\r\nexport type GradientColorStop = {\r\n /**\r\n * Offset from the start where the color will be applied.\r\n */\r\n offset: number;\r\n /**\r\n * Color to be applied.\r\n */\r\n color: string;\r\n};\r\n\r\n/**\r\n * Class that serves as a base for all the gradients created from context.\r\n */\r\nexport abstract class BaseGradient {\r\n private _colorStops: GradientColorStop[] = [];\r\n\r\n private _canvasGradient: CanvasGradient;\r\n private _context: ICanvasRenderingContext;\r\n private _gradientDirty: boolean = true;\r\n\r\n /**\r\n * Overwritten by child classes to create the canvas gradient.\r\n * @param context\r\n */\r\n protected abstract _createCanvasGradient(context: ICanvasRenderingContext): ICanvasGradient;\r\n\r\n private _addColorStopsToCanvasGradient() {\r\n for (const stop of this._colorStops) {\r\n this._canvasGradient.addColorStop(stop.offset, stop.color);\r\n }\r\n }\r\n\r\n /**\r\n * If there are any changes or the context changed, regenerate the canvas gradient object. Else,\r\n * reuse the existing gradient.\r\n * @param context the context to create the gradient from\r\n * @returns the canvas gradient\r\n */\r\n public getCanvasGradient(context: ICanvasRenderingContext) {\r\n if (this._gradientDirty || this._context !== context) {\r\n this._context = context;\r\n this._canvasGradient = this._createCanvasGradient(context);\r\n this._addColorStopsToCanvasGradient();\r\n this._gradientDirty = false;\r\n }\r\n return this._canvasGradient;\r\n }\r\n\r\n /**\r\n * Adds a new color stop to the gradient.\r\n * @param offset the offset of the stop on the gradient. Should be between 0 and 1\r\n * @param color the color of the stop\r\n */\r\n public addColorStop(offset: number, color: string) {\r\n this._colorStops.push({ offset, color });\r\n this._gradientDirty = true;\r\n }\r\n\r\n /**\r\n * Removes an existing color stop with the specified offset from the gradient\r\n * @param offset the offset of the stop to be removed\r\n */\r\n public removeColorStop(offset: number) {\r\n this._colorStops = this._colorStops.filter((colorStop) => colorStop.offset !== offset);\r\n this._gradientDirty = true;\r\n }\r\n\r\n /**\r\n * Removes all color stops from the gradient\r\n */\r\n public clearColorStops() {\r\n this._colorStops = [];\r\n this._gradientDirty = true;\r\n }\r\n\r\n /**\r\n * Color stops of the gradient\r\n */\r\n public get colorStops() {\r\n return this._colorStops;\r\n }\r\n\r\n /**\r\n * @returns Type of the gradient\r\n */\r\n public getClassName() {\r\n return \"BaseGradient\";\r\n }\r\n\r\n /**\r\n * Serialize into a json object\r\n * @param serializationObject object to serialize into\r\n */\r\n public serialize(serializationObject: any) {\r\n serializationObject.colorStops = this._colorStops;\r\n serializationObject.className = this.getClassName();\r\n }\r\n\r\n /**\r\n * Parse from json object\r\n * @param serializationObject object to parse from\r\n */\r\n public parse(serializationObject: any) {\r\n this._colorStops = serializationObject.colorStops;\r\n }\r\n}\r\n","import { type ICanvasGradient, type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\nimport { BaseGradient } from \"./BaseGradient\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\n\r\n/**\r\n * Gradient along a line that connects two coordinates.\r\n * These coordinates are relative to the canvas' space, not to any control's space.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/createLinearGradient\r\n */\r\nexport class LinearGradient extends BaseGradient {\r\n private _x0: number;\r\n private _y0: number;\r\n private _x1: number;\r\n private _y1: number;\r\n\r\n /**\r\n * Creates a new linear gradient\r\n * @param x0\r\n * @param y0\r\n * @param x1\r\n * @param y1\r\n */\r\n constructor(x0?: number, y0?: number, x1?: number, y1?: number) {\r\n super();\r\n this._x0 = x0 ?? 0;\r\n this._y0 = y0 ?? 0;\r\n this._x1 = x1 ?? 0;\r\n this._y1 = y1 ?? 0;\r\n }\r\n\r\n protected _createCanvasGradient(context: ICanvasRenderingContext): ICanvasGradient {\r\n return context.createLinearGradient(this._x0, this._y0, this._x1, this._y1);\r\n }\r\n\r\n /** X axis coordinate of the starting point in the line */\r\n public get x0() {\r\n return this._x0;\r\n }\r\n\r\n /** X axis coordinate of the ending point in the line */\r\n public get x1() {\r\n return this._x1;\r\n }\r\n\r\n /** Y axis coordinate of the starting point in the line */\r\n public get y0() {\r\n return this._y0;\r\n }\r\n\r\n /** Y axis coordinate of the ending point in the line */\r\n public get y1() {\r\n return this._y1;\r\n }\r\n\r\n /**\r\n * Class name of the gradient\r\n * @returns the class name of the gradient\r\n */\r\n public override getClassName(): string {\r\n return \"LinearGradient\";\r\n }\r\n\r\n /**\r\n * Serializes this gradient\r\n * @param serializationObject the object to serialize to\r\n */\r\n public override serialize(serializationObject: any): void {\r\n super.serialize(serializationObject);\r\n serializationObject.x0 = this._x0;\r\n serializationObject.y0 = this._y0;\r\n serializationObject.x1 = this._x1;\r\n serializationObject.y1 = this._y1;\r\n }\r\n\r\n /**\r\n * Parses a gradient from a serialization object\r\n * @param serializationObject the object to parse from\r\n */\r\n public override parse(serializationObject: any): void {\r\n super.parse(serializationObject);\r\n this._x0 = serializationObject.x0;\r\n this._y0 = serializationObject.y0;\r\n this._x1 = serializationObject.x1;\r\n this._y1 = serializationObject.y1;\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.LinearGradient\", LinearGradient);\r\n","import { type ICanvasGradient, type ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\nimport { BaseGradient } from \"./BaseGradient\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\n\r\n/**\r\n * Gradient formed from two circles with their own centers and radius.\r\n * The coordinates of the circles centers are relative to the canvas' space, not to any control's space.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/createRadialGradient\r\n */\r\nexport class RadialGradient extends BaseGradient {\r\n private _x0: number;\r\n private _y0: number;\r\n private _r0: number;\r\n private _x1: number;\r\n private _y1: number;\r\n private _r1: number;\r\n\r\n /**\r\n * Creates a new radial gradient\r\n * @param x0 x coordinate of the first circle's center\r\n * @param y0 y coordinate of the first circle's center\r\n * @param r0 radius of the first circle\r\n * @param x1 x coordinate of the second circle's center\r\n * @param y1 y coordinate of the second circle's center\r\n * @param r1 radius of the second circle\r\n */\r\n constructor(x0?: number, y0?: number, r0?: number, x1?: number, y1?: number, r1?: number) {\r\n super();\r\n this._x0 = x0 ?? 0;\r\n this._y0 = y0 ?? 0;\r\n this._r0 = r0 ?? 0;\r\n this._x1 = x1 ?? 0;\r\n this._y1 = y1 ?? 0;\r\n this._r1 = r1 ?? 0;\r\n }\r\n\r\n protected _createCanvasGradient(context: ICanvasRenderingContext): ICanvasGradient {\r\n return context.createRadialGradient(this._x0, this._y0, this._r0, this._x1, this._y1, this._r1);\r\n }\r\n\r\n /** x coordinate of the first circle's center */\r\n public get x0() {\r\n return this._x0;\r\n }\r\n\r\n /** x coordinate of the second circle's center */\r\n public get x1() {\r\n return this._x1;\r\n }\r\n\r\n /** y coordinate of the first circle's center */\r\n public get y0() {\r\n return this._y0;\r\n }\r\n\r\n /** y coordinate of the second circle's center */\r\n public get y1() {\r\n return this._y1;\r\n }\r\n\r\n /** radius of the first circle */\r\n public get r0() {\r\n return this._r0;\r\n }\r\n\r\n /** radius of the second circle */\r\n public get r1() {\r\n return this._r1;\r\n }\r\n\r\n /**\r\n * Class name of the gradient\r\n * @returns the class name of the gradient\r\n */\r\n public override getClassName() {\r\n return \"RadialGradient\";\r\n }\r\n\r\n /**\r\n * Serializes this gradient\r\n * @param serializationObject the object to serialize to\r\n */\r\n public override serialize(serializationObject: any): void {\r\n super.serialize(serializationObject);\r\n serializationObject.x0 = this._x0;\r\n serializationObject.y0 = this._y0;\r\n serializationObject.r0 = this._r0;\r\n serializationObject.x1 = this._x1;\r\n serializationObject.y1 = this._y1;\r\n serializationObject.r1 = this._r1;\r\n }\r\n\r\n /**\r\n * Parses a gradient from a serialization object\r\n * @param serializationObject the object to parse from\r\n */\r\n public override parse(serializationObject: any): void {\r\n super.parse(serializationObject);\r\n this._x0 = serializationObject.x0;\r\n this._y0 = serializationObject.y0;\r\n this._r0 = serializationObject.r0;\r\n this._x1 = serializationObject.x1;\r\n this._y1 = serializationObject.y1;\r\n this._r1 = serializationObject.r1;\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.RadialGradient\", RadialGradient);\r\n","import { Observable } from \"core/Misc/observable\";\r\nimport { type IDisposable } from \"core/scene\";\r\nimport { type AdvancedDynamicTexture } from \"./advancedDynamicTexture\";\r\nimport { ValueAndUnit } from \"./valueAndUnit\";\r\n\r\n/**\r\n * Define a style used by control to automatically setup properties based on a template.\r\n * Only support font related properties so far\r\n */\r\nexport class Style implements IDisposable {\r\n private _fontFamily = \"Arial\";\r\n private _fontStyle = \"\";\r\n private _fontWeight = \"\";\r\n /** @internal */\r\n public _host: AdvancedDynamicTexture;\r\n /** @internal */\r\n public _fontSize = new ValueAndUnit(18, ValueAndUnit.UNITMODE_PIXEL, false);\r\n\r\n /**\r\n * Observable raised when the style values are changed\r\n */\r\n public onChangedObservable = new Observable<Style>();\r\n\r\n /**\r\n * Creates a new style object\r\n * @param host defines the AdvancedDynamicTexture which hosts this style\r\n */\r\n public constructor(host: AdvancedDynamicTexture) {\r\n this._host = host;\r\n }\r\n\r\n /**\r\n * Gets or sets the font size\r\n */\r\n public get fontSize(): string | number {\r\n return this._fontSize.toString(this._host);\r\n }\r\n\r\n public set fontSize(value: string | number) {\r\n if (this._fontSize.toString(this._host) === value) {\r\n return;\r\n }\r\n\r\n if (this._fontSize.fromString(value)) {\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the font family\r\n */\r\n public get fontFamily(): string {\r\n return this._fontFamily;\r\n }\r\n\r\n public set fontFamily(value: string) {\r\n if (this._fontFamily === value) {\r\n return;\r\n }\r\n\r\n this._fontFamily = value;\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Gets or sets the font style\r\n */\r\n public get fontStyle(): string {\r\n return this._fontStyle;\r\n }\r\n\r\n public set fontStyle(value: string) {\r\n if (this._fontStyle === value) {\r\n return;\r\n }\r\n\r\n this._fontStyle = value;\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n\r\n /** Gets or sets font weight */\r\n public get fontWeight(): string {\r\n return this._fontWeight;\r\n }\r\n\r\n public set fontWeight(value: string) {\r\n if (this._fontWeight === value) {\r\n return;\r\n }\r\n\r\n this._fontWeight = value;\r\n this.onChangedObservable.notifyObservers(this);\r\n }\r\n\r\n /** Dispose all associated resources */\r\n public dispose() {\r\n this.onChangedObservable.clear();\r\n }\r\n}\r\n","import { type Nullable } from \"core/types\";\r\nimport { type Observer, Observable } from \"core/Misc/observable\";\r\nimport { type Matrix, Vector2, Vector3, TmpVectors } from \"core/Maths/math.vector\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { type PointerInfoPre, type PointerInfo, type PointerInfoBase, PointerEventTypes } from \"core/Events/pointerEvents\";\r\nimport { ClipboardEventTypes, ClipboardInfo } from \"core/Events/clipboardEvents\";\r\nimport { type KeyboardInfoPre, KeyboardEventTypes } from \"core/Events/keyboardEvents\";\r\nimport { type Camera } from \"core/Cameras/camera\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { type IDynamicTextureOptions, DynamicTexture } from \"core/Materials/Textures/dynamicTexture\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { Layer } from \"core/Layers/layer\";\r\nimport { type Scene } from \"core/scene\";\r\n\r\nimport { Container } from \"./controls/container\";\r\nimport { Control } from \"./controls/control\";\r\nimport { Style } from \"./style\";\r\nimport { Measure } from \"./measure\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { Viewport } from \"core/Maths/math.viewport\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { WebRequest } from \"core/Misc/webRequest\";\r\nimport { type IPointerEvent, type IWheelEvent } from \"core/Events/deviceInputEvents\";\r\nimport { RandomGUID } from \"core/Misc/guid\";\r\nimport { GetClass } from \"core/Misc/typeStore\";\r\nimport { DecodeBase64ToBinary } from \"core/Misc/stringTools\";\r\n\r\nimport { type StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { type AbstractEngine } from \"core/Engines/abstractEngine\";\r\n\r\n/**\r\n * Interface used to define options to create an AdvancedDynamicTexture\r\n */\r\nexport interface IAdvancedDynamicTextureOptions extends IDynamicTextureOptions {\r\n /**\r\n * Indicates whether the ADT will be used autonomously. In this mode:\r\n * - _checkUpdate() is not called\r\n * - the layer is not rendered (so, the ADT is not visible)\r\n * It's up to the user to perform the required calls manually to update the ADT.\r\n */\r\n useStandalone?: boolean;\r\n}\r\n\r\n/**\r\n * Class used to create texture to support 2D GUI elements\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui\r\n */\r\nexport class AdvancedDynamicTexture extends DynamicTexture {\r\n /** Define the url to load snippets */\r\n public static SnippetUrl = Constants.SnippetUrl;\r\n\r\n /** Indicates if some optimizations can be performed in GUI GPU management (the downside is additional memory/GPU texture memory used) */\r\n public static AllowGPUOptimizations = true;\r\n\r\n /** Indicates whether the ADT is used autonomously */\r\n public readonly useStandalone: boolean = false;\r\n\r\n /** Snippet ID if the content was created from the snippet server */\r\n public snippetId: string;\r\n\r\n /** Observable that fires when the GUI is ready */\r\n public onGuiReadyObservable = new Observable<AdvancedDynamicTexture>();\r\n\r\n private _isDirty = false;\r\n private _renderObserver: Nullable<Observer<Camera>>;\r\n private _resizeObserver: Nullable<Observer<AbstractEngine>>;\r\n private _preKeyboardObserver: Nullable<Observer<KeyboardInfoPre>>;\r\n private _prePointerObserver: Nullable<Observer<PointerInfoPre>>;\r\n private _sceneRenderObserver: Nullable<Observer<Scene>>;\r\n private _pointerObserver: Nullable<Observer<PointerInfo>>;\r\n private _canvasPointerOutObserver: Nullable<Observer<PointerEvent>>;\r\n private _canvasBlurObserver: Nullable<Observer<AbstractEngine>>;\r\n private _controlAddedObserver: Nullable<Observer<Nullable<Control>>>;\r\n private _controlRemovedObserver: Nullable<Observer<Nullable<Control>>>;\r\n private _background: string;\r\n /** @internal */\r\n public _rootContainer = new Container(\"root\");\r\n /** @internal */\r\n public _lastPickedControl: Control;\r\n /** @internal */\r\n public _lastControlOver: { [pointerId: number]: Control } = {};\r\n /** @internal */\r\n public _lastControlDown: { [pointerId: number]: Control } = {};\r\n /** @internal */\r\n public _capturingControl: { [pointerId: number]: Control } = {};\r\n /** @internal */\r\n public _shouldBlockPointer: boolean;\r\n /** @internal */\r\n public _layerToDispose: Nullable<Layer>;\r\n /** @internal */\r\n public _linkedControls = new Array<Control>();\r\n /** @internal */\r\n public _isFullscreen = false;\r\n private _fullscreenViewport = new Viewport(0, 0, 1, 1);\r\n private _idealWidth = 0;\r\n private _idealHeight = 0;\r\n private _useSmallestIdeal: boolean = false;\r\n private _renderAtIdealSize = false;\r\n private _focusedControl: Nullable<Control>;\r\n private _blockNextFocusCheck = false;\r\n private _renderScale = 1;\r\n private _rootElement: Nullable<HTMLElement>;\r\n private _cursorChanged = false;\r\n private _defaultMousePointerId = 0;\r\n private _rootChildrenHaveChanged: boolean = false;\r\n private _adjustToEngineHardwareScalingLevel = false;\r\n\r\n /** @internal */\r\n public _capturedPointerIds = new Set<number>();\r\n\r\n /** @internal */\r\n public _numLayoutCalls = 0;\r\n /** Gets the number of layout calls made the last time the ADT has been rendered */\r\n public get numLayoutCalls(): number {\r\n return this._numLayoutCalls;\r\n }\r\n\r\n /** @internal */\r\n public _numRenderCalls = 0;\r\n /** Gets the number of render calls made the last time the ADT has been rendered */\r\n public get numRenderCalls(): number {\r\n return this._numRenderCalls;\r\n }\r\n\r\n /**\r\n * Define type to string to ensure compatibility across browsers\r\n * Safari doesn't support DataTransfer constructor\r\n */\r\n private _clipboardData: string = \"\";\r\n /**\r\n * Observable event triggered each time an clipboard event is received from the rendering canvas\r\n */\r\n public onClipboardObservable = new Observable<ClipboardInfo>();\r\n /**\r\n * Observable event triggered each time a pointer down is intercepted by a control\r\n */\r\n public onControlPickedObservable = new Observable<Control>();\r\n /**\r\n * Observable event triggered before layout is evaluated\r\n */\r\n public onBeginLayoutObservable = new Observable<AdvancedDynamicTexture>();\r\n /**\r\n * Observable event triggered after the layout was evaluated\r\n */\r\n public onEndLayoutObservable = new Observable<AdvancedDynamicTexture>();\r\n /**\r\n * Observable event triggered before the texture is rendered\r\n */\r\n public onBeginRenderObservable = new Observable<AdvancedDynamicTexture>();\r\n /**\r\n * Observable event triggered after the texture was rendered\r\n */\r\n public onEndRenderObservable = new Observable<AdvancedDynamicTexture>();\r\n /**\r\n * Gets or sets a boolean defining if alpha is stored as premultiplied\r\n */\r\n public premulAlpha = false;\r\n /**\r\n * Gets or sets a boolean indicating that the canvas must be reverted on Y when updating the texture\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public applyYInversionOnUpdate = true;\r\n\r\n /**\r\n * A boolean indicating whether or not the elements can be navigated to using the tab key.\r\n * Defaults to false.\r\n */\r\n public disableTabNavigation = false;\r\n\r\n /**\r\n * A boolean indicating whether controls can be picked/clicked on or not. Defaults to false.\r\n */\r\n public disablePicking = false;\r\n\r\n /**\r\n * If set to true, the POINTERTAP event type will be used for \"click\", instead of POINTERUP\r\n */\r\n public usePointerTapForClickEvent = false;\r\n\r\n /**\r\n * If set to true, the renderScale will be adjusted automatically to the engine's hardware scaling\r\n * If this is set to true, manually setting the renderScale will be ignored\r\n * This is useful when the engine's hardware scaling is set to a value other than 1\r\n */\r\n public get adjustToEngineHardwareScalingLevel(): boolean {\r\n return this._adjustToEngineHardwareScalingLevel;\r\n }\r\n\r\n public set adjustToEngineHardwareScalingLevel(value: boolean) {\r\n if (this._adjustToEngineHardwareScalingLevel === value) {\r\n return;\r\n }\r\n this._adjustToEngineHardwareScalingLevel = value;\r\n this._onResize();\r\n }\r\n /**\r\n * Gets or sets a number used to scale rendering size (2 means that the texture will be twice bigger).\r\n * Useful when you want more antialiasing\r\n */\r\n public get renderScale(): number {\r\n return this._renderScale;\r\n }\r\n public set renderScale(value: number) {\r\n if (value === this._renderScale) {\r\n return;\r\n }\r\n this._renderScale = value;\r\n this._onResize();\r\n }\r\n /** Gets or sets the background color */\r\n public get background(): string {\r\n return this._background;\r\n }\r\n public set background(value: string) {\r\n if (this._background === value) {\r\n return;\r\n }\r\n this._background = value;\r\n this.markAsDirty();\r\n }\r\n /**\r\n * Gets or sets the ideal width used to design controls.\r\n * The GUI will then rescale everything accordingly\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#adaptive-scaling\r\n */\r\n public get idealWidth(): number {\r\n return this._idealWidth;\r\n }\r\n public set idealWidth(value: number) {\r\n if (this._idealWidth === value) {\r\n return;\r\n }\r\n this._idealWidth = value;\r\n this.markAsDirty();\r\n this._rootContainer._markAllAsDirty();\r\n }\r\n /**\r\n * Gets or sets the ideal height used to design controls.\r\n * The GUI will then rescale everything accordingly\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#adaptive-scaling\r\n */\r\n public get idealHeight(): number {\r\n return this._idealHeight;\r\n }\r\n public set idealHeight(value: number) {\r\n if (this._idealHeight === value) {\r\n return;\r\n }\r\n this._idealHeight = value;\r\n this.markAsDirty();\r\n this._rootContainer._markAllAsDirty();\r\n }\r\n /**\r\n * Gets or sets a boolean indicating if the smallest ideal value must be used if idealWidth and idealHeight are both set\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#adaptive-scaling\r\n */\r\n public get useSmallestIdeal(): boolean {\r\n return this._useSmallestIdeal;\r\n }\r\n public set useSmallestIdeal(value: boolean) {\r\n if (this._useSmallestIdeal === value) {\r\n return;\r\n }\r\n this._useSmallestIdeal = value;\r\n this.markAsDirty();\r\n this._rootContainer._markAllAsDirty();\r\n }\r\n /**\r\n * Gets or sets a boolean indicating if adaptive scaling must be used\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#adaptive-scaling\r\n */\r\n public get renderAtIdealSize(): boolean {\r\n return this._renderAtIdealSize;\r\n }\r\n public set renderAtIdealSize(value: boolean) {\r\n if (this._renderAtIdealSize === value) {\r\n return;\r\n }\r\n this._renderAtIdealSize = value;\r\n this._onResize();\r\n }\r\n\r\n /**\r\n * Gets the ratio used when in \"ideal mode\"\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#adaptive-scaling\r\n * */\r\n public get idealRatio(): number {\r\n let rwidth: number = 0;\r\n let rheight: number = 0;\r\n\r\n if (this._idealWidth) {\r\n rwidth = this.getSize().width / this._idealWidth;\r\n }\r\n\r\n if (this._idealHeight) {\r\n rheight = this.getSize().height / this._idealHeight;\r\n }\r\n\r\n if (this._useSmallestIdeal && this._idealWidth && this._idealHeight) {\r\n return window.innerWidth < window.innerHeight ? rwidth : rheight;\r\n }\r\n\r\n if (this._idealWidth) {\r\n // horizontal\r\n return rwidth;\r\n }\r\n\r\n if (this._idealHeight) {\r\n // vertical\r\n return rheight;\r\n }\r\n\r\n return 1;\r\n }\r\n\r\n /**\r\n * Gets the underlying layer used to render the texture when in fullscreen mode\r\n */\r\n public get layer(): Nullable<Layer> {\r\n return this._layerToDispose;\r\n }\r\n /**\r\n * Gets the root container control\r\n */\r\n public get rootContainer(): Container {\r\n return this._rootContainer;\r\n }\r\n /**\r\n * Returns an array containing the root container.\r\n * This is mostly used to let the Inspector introspects the ADT\r\n * @returns an array containing the rootContainer\r\n */\r\n public getChildren(): Array<Container> {\r\n return [this._rootContainer];\r\n }\r\n /**\r\n * Will return all controls that are inside this texture\r\n * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered\r\n * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored\r\n * @returns all child controls\r\n */\r\n public getDescendants(directDescendantsOnly?: boolean, predicate?: (control: Control) => boolean): Control[] {\r\n return this._rootContainer.getDescendants(directDescendantsOnly, predicate);\r\n }\r\n\r\n /**\r\n * Will return all controls with the given type name\r\n * @param typeName defines the type name to search for\r\n * @returns an array of all controls found\r\n */\r\n public getControlsByType(typeName: string): Control[] {\r\n return this._rootContainer.getDescendants(false, (control) => control.typeName === typeName);\r\n }\r\n\r\n /**\r\n * Will return the first control with the given name\r\n * @param name defines the name to search for\r\n * @returns the first control found or null\r\n */\r\n public getControlByName(name: string): Nullable<Control> {\r\n return this._getControlByKey(\"name\", name);\r\n }\r\n\r\n private _getControlByKey(key: string, value: any): Nullable<Control> {\r\n return this._rootContainer.getDescendants().find((control) => control[key as keyof Control] === value) || null;\r\n }\r\n\r\n /**\r\n * Gets or sets the current focused control\r\n */\r\n public get focusedControl(): Nullable<Control> {\r\n return this._focusedControl;\r\n }\r\n public set focusedControl(control: Nullable<Control>) {\r\n if (this._focusedControl == control) {\r\n return;\r\n }\r\n if (this._focusedControl) {\r\n this._focusedControl.onBlur();\r\n }\r\n if (control) {\r\n control.onFocus();\r\n }\r\n this._focusedControl = control;\r\n }\r\n /**\r\n * Gets or sets a boolean indicating if the texture must be rendered in background or foreground when in fullscreen mode\r\n */\r\n public get isForeground(): boolean {\r\n if (!this.layer) {\r\n return true;\r\n }\r\n return !this.layer.isBackground;\r\n }\r\n public set isForeground(value: boolean) {\r\n if (!this.layer) {\r\n return;\r\n }\r\n if (this.layer.isBackground === !value) {\r\n return;\r\n }\r\n this.layer.isBackground = !value;\r\n }\r\n /**\r\n * Gets or set information about clipboardData\r\n */\r\n public get clipboardData(): string {\r\n return this._clipboardData;\r\n }\r\n public set clipboardData(value: string) {\r\n this._clipboardData = value;\r\n }\r\n\r\n /**\r\n * If this is set, even when a control is pointer blocker, some events can still be passed through to the scene.\r\n * Options from values are PointerEventTypes\r\n * POINTERDOWN, POINTERUP, POINTERMOVE, POINTERWHEEL, POINTERPICK, POINTERTAP, POINTERDOUBLETAP\r\n */\r\n public skipBlockEvents = 0;\r\n\r\n /**\r\n * If set to true, every scene render will trigger a pointer event for the GUI\r\n * if it is linked to a mesh or has controls linked to a mesh. This will allow\r\n * you to catch the pointer moving around the GUI due to camera or mesh movements,\r\n * but it has a performance cost.\r\n */\r\n public checkPointerEveryFrame = false;\r\n\r\n /**\r\n * Creates a new AdvancedDynamicTexture\r\n * @param name defines the name of the texture\r\n * @param options The options to be used when constructing the ADT\r\n */\r\n constructor(name: string, options?: IAdvancedDynamicTextureOptions);\r\n\r\n constructor(name: string, width?: number, height?: number, scene?: Nullable<Scene>, generateMipMaps?: boolean, samplingMode?: number, invertY?: boolean);\r\n\r\n /** @internal */\r\n constructor(\r\n name: string,\r\n widthOrOptions?: number | IAdvancedDynamicTextureOptions,\r\n _height = 0,\r\n scene?: Nullable<Scene>,\r\n generateMipMaps = false,\r\n samplingMode = Texture.NEAREST_SAMPLINGMODE,\r\n invertY = true\r\n ) {\r\n widthOrOptions = widthOrOptions ?? 0;\r\n\r\n const width = typeof widthOrOptions === \"object\" && widthOrOptions !== undefined ? (widthOrOptions.width ?? 0) : (widthOrOptions ?? 0);\r\n const height = typeof widthOrOptions === \"object\" && widthOrOptions !== undefined ? (widthOrOptions.height ?? 0) : _height;\r\n\r\n super(\r\n name,\r\n { width, height },\r\n typeof widthOrOptions === \"object\" && widthOrOptions !== undefined ? widthOrOptions : scene,\r\n generateMipMaps,\r\n samplingMode,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n invertY\r\n );\r\n\r\n scene = this.getScene();\r\n if (!scene || !this._texture) {\r\n return;\r\n }\r\n this.applyYInversionOnUpdate = invertY;\r\n this._rootElement = scene.getEngine().getInputElement();\r\n\r\n const adtOptions = widthOrOptions as IAdvancedDynamicTextureOptions;\r\n\r\n this.useStandalone = !!adtOptions?.useStandalone;\r\n\r\n if (!this.useStandalone) {\r\n this._renderObserver = scene.onBeforeCameraRenderObservable.add((camera: Camera) => this._checkUpdate(camera));\r\n }\r\n\r\n /** Whenever a control is added or removed to the root, we have to recheck the camera projection as it can have changed */\r\n this._controlAddedObserver = this._rootContainer.onControlAddedObservable.add((control) => {\r\n if (control) {\r\n this._rootChildrenHaveChanged = true;\r\n }\r\n });\r\n this._controlRemovedObserver = this._rootContainer.onControlRemovedObservable.add((control) => {\r\n if (control) {\r\n this._rootChildrenHaveChanged = true;\r\n }\r\n });\r\n this._preKeyboardObserver = scene.onPreKeyboardObservable.add((info) => {\r\n // check if tab is pressed\r\n if (!this.disableTabNavigation && info.type === KeyboardEventTypes.KEYDOWN && info.event.code === \"Tab\") {\r\n const forward = !info.event.shiftKey;\r\n if (\r\n (forward && this._focusProperties.index === this._focusProperties.total - 1) ||\r\n (!forward && this._focusProperties.index === 0 && this._focusProperties.total > 0)\r\n ) {\r\n this.focusedControl = null;\r\n this._focusProperties.index = 0;\r\n this._focusProperties.total = -1;\r\n return;\r\n }\r\n this._focusNextElement(forward);\r\n info.event.preventDefault();\r\n return;\r\n }\r\n if (!this._focusedControl) {\r\n return;\r\n }\r\n if (info.type === KeyboardEventTypes.KEYDOWN) {\r\n this._focusedControl.processKeyboard(info.event);\r\n }\r\n info.skipOnPointerObservable = true;\r\n });\r\n this._rootContainer._link(this);\r\n this.hasAlpha = true;\r\n if (!width || !height) {\r\n this._resizeObserver = scene.getEngine().onResizeObservable.add(() => this._onResize());\r\n this._onResize();\r\n }\r\n this._texture.isReady = true;\r\n }\r\n /**\r\n * Get the current class name of the texture useful for serialization or dynamic coding.\r\n * @returns \"AdvancedDynamicTexture\"\r\n */\r\n public override getClassName(): string {\r\n return \"AdvancedDynamicTexture\";\r\n }\r\n /**\r\n * Function used to execute a function on all controls\r\n * @param func defines the function to execute\r\n * @param container defines the container where controls belong. If null the root container will be used\r\n */\r\n public executeOnAllControls(func: (control: Control) => void, container?: Container) {\r\n if (!container) {\r\n container = this._rootContainer;\r\n }\r\n func(container);\r\n for (const child of container.children) {\r\n if ((<any>child).children) {\r\n this.executeOnAllControls(func, <Container>child);\r\n continue;\r\n }\r\n func(child);\r\n }\r\n }\r\n\r\n private _useInvalidateRectOptimization = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the InvalidateRect optimization should be turned on\r\n */\r\n public get useInvalidateRectOptimization(): boolean {\r\n return this._useInvalidateRectOptimization;\r\n }\r\n\r\n public set useInvalidateRectOptimization(value: boolean) {\r\n this._useInvalidateRectOptimization = value;\r\n }\r\n\r\n // Invalidated rectangle which is the combination of all invalidated controls after they have been rotated into absolute position\r\n private _invalidatedRectangle: Nullable<Measure> = null;\r\n /**\r\n * Invalidates a rectangle area on the gui texture\r\n * @param invalidMinX left most position of the rectangle to invalidate in the texture\r\n * @param invalidMinY top most position of the rectangle to invalidate in the texture\r\n * @param invalidMaxX right most position of the rectangle to invalidate in the texture\r\n * @param invalidMaxY bottom most position of the rectangle to invalidate in the texture\r\n */\r\n public invalidateRect(invalidMinX: number, invalidMinY: number, invalidMaxX: number, invalidMaxY: number) {\r\n if (!this._useInvalidateRectOptimization) {\r\n return;\r\n }\r\n if (!this._invalidatedRectangle) {\r\n this._invalidatedRectangle = new Measure(invalidMinX, invalidMinY, invalidMaxX - invalidMinX + 1, invalidMaxY - invalidMinY + 1);\r\n } else {\r\n // Compute intersection\r\n const maxX = Math.ceil(Math.max(this._invalidatedRectangle.left + this._invalidatedRectangle.width - 1, invalidMaxX));\r\n const maxY = Math.ceil(Math.max(this._invalidatedRectangle.top + this._invalidatedRectangle.height - 1, invalidMaxY));\r\n this._invalidatedRectangle.left = Math.floor(Math.min(this._invalidatedRectangle.left, invalidMinX));\r\n this._invalidatedRectangle.top = Math.floor(Math.min(this._invalidatedRectangle.top, invalidMinY));\r\n this._invalidatedRectangle.width = maxX - this._invalidatedRectangle.left + 1;\r\n this._invalidatedRectangle.height = maxY - this._invalidatedRectangle.top + 1;\r\n }\r\n }\r\n /**\r\n * Marks the texture as dirty forcing a complete update\r\n */\r\n public markAsDirty() {\r\n this._isDirty = true;\r\n }\r\n /**\r\n * Helper function used to create a new style\r\n * @returns a new style\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui#styles\r\n */\r\n public createStyle(): Style {\r\n return new Style(this);\r\n }\r\n /**\r\n * Adds a new control to the root container\r\n * @param control defines the control to add\r\n * @returns the current texture\r\n */\r\n public addControl(control: Control): AdvancedDynamicTexture {\r\n this._rootContainer.addControl(control);\r\n return this;\r\n }\r\n /**\r\n * Removes a control from the root container\r\n * @param control defines the control to remove\r\n * @returns the current texture\r\n */\r\n public removeControl(control: Control): AdvancedDynamicTexture {\r\n this._rootContainer.removeControl(control);\r\n return this;\r\n }\r\n /**\r\n * Moves overlapped controls towards a position where it is not overlapping anymore.\r\n * Please note that this method alters linkOffsetXInPixels and linkOffsetYInPixels.\r\n * @param overlapGroup the overlap group which will be processed or undefined to process all overlap groups\r\n * @param deltaStep the step size (speed) to reach the target non overlapping position (default 0.1)\r\n * @param repelFactor how much is the control repelled by other controls\r\n */\r\n public moveToNonOverlappedPosition(overlapGroup?: number | Control[], deltaStep = 1, repelFactor = 1) {\r\n let controlsForGroup: Control[];\r\n if (Array.isArray(overlapGroup)) {\r\n controlsForGroup = overlapGroup;\r\n } else {\r\n const descendants = this.getDescendants(true);\r\n // get only the controls with an overlapGroup property set\r\n // if the overlapGroup parameter is set, filter the controls and get only the controls belonging to that overlapGroup\r\n controlsForGroup = overlapGroup === undefined ? descendants.filter((c) => c.overlapGroup !== undefined) : descendants.filter((c) => c.overlapGroup === overlapGroup);\r\n }\r\n\r\n for (const control1 of controlsForGroup) {\r\n let velocity = Vector2.Zero();\r\n const center = new Vector2(control1.centerX, control1.centerY);\r\n\r\n for (const control2 of controlsForGroup) {\r\n if (control1 !== control2 && AdvancedDynamicTexture._Overlaps(control1, control2)) {\r\n // if the two controls overlaps get a direction vector from one control's center to another control's center\r\n const diff = center.subtract(new Vector2(control2.centerX, control2.centerY));\r\n const diffLength = diff.length();\r\n\r\n if (diffLength > 0) {\r\n // calculate the velocity\r\n velocity = velocity.add(diff.normalize().scale(repelFactor / diffLength));\r\n }\r\n }\r\n }\r\n\r\n if (velocity.length() > 0) {\r\n // move the control along the direction vector away from the overlapping control\r\n velocity = velocity.normalize().scale(deltaStep * (control1.overlapDeltaMultiplier ?? 1));\r\n control1.linkOffsetXInPixels += velocity.x;\r\n control1.linkOffsetYInPixels += velocity.y;\r\n }\r\n }\r\n }\r\n /**\r\n * Release all resources\r\n */\r\n public override dispose(): void {\r\n const scene = this.getScene();\r\n if (!scene) {\r\n return;\r\n }\r\n this._rootElement = null;\r\n scene.onBeforeCameraRenderObservable.remove(this._renderObserver);\r\n if (this._resizeObserver) {\r\n scene.getEngine().onResizeObservable.remove(this._resizeObserver);\r\n }\r\n if (this._prePointerObserver) {\r\n scene.onPrePointerObservable.remove(this._prePointerObserver);\r\n }\r\n if (this._sceneRenderObserver) {\r\n scene.onBeforeRenderObservable.remove(this._sceneRenderObserver);\r\n }\r\n if (this._pointerObserver) {\r\n scene.onPointerObservable.remove(this._pointerObserver);\r\n }\r\n if (this._preKeyboardObserver) {\r\n scene.onPreKeyboardObservable.remove(this._preKeyboardObserver);\r\n }\r\n if (this._canvasPointerOutObserver) {\r\n scene.getEngine().onCanvasPointerOutObservable.remove(this._canvasPointerOutObserver);\r\n }\r\n if (this._canvasBlurObserver) {\r\n scene.getEngine().onCanvasBlurObservable.remove(this._canvasBlurObserver);\r\n }\r\n if (this._controlAddedObserver) {\r\n this._rootContainer.onControlAddedObservable.remove(this._controlAddedObserver);\r\n }\r\n if (this._controlRemovedObserver) {\r\n this._rootContainer.onControlRemovedObservable.remove(this._controlRemovedObserver);\r\n }\r\n if (this._layerToDispose) {\r\n this._layerToDispose.texture = null;\r\n this._layerToDispose.dispose();\r\n this._layerToDispose = null;\r\n }\r\n this._rootContainer.dispose();\r\n this.onClipboardObservable.clear();\r\n this.onControlPickedObservable.clear();\r\n this.onBeginRenderObservable.clear();\r\n this.onEndRenderObservable.clear();\r\n this.onBeginLayoutObservable.clear();\r\n this.onEndLayoutObservable.clear();\r\n this.onGuiReadyObservable.clear();\r\n super.dispose();\r\n }\r\n\r\n private _alreadyRegisteredForRender = false;\r\n private _onResize(): void {\r\n const scene = this.getScene();\r\n if (!scene) {\r\n return;\r\n }\r\n // Check size\r\n const engine = scene.getEngine();\r\n if (this.adjustToEngineHardwareScalingLevel) {\r\n // force the renderScale to the engine's hardware scaling level\r\n this._renderScale = engine.getHardwareScalingLevel();\r\n // calculate the max renderScale, based on the max texture size of engine.getCaps().maxTextureSize (enforced by some mobile devices)\r\n this._renderScale =\r\n 1 / Math.max(this._renderScale, engine.getRenderWidth() / engine.getCaps().maxTextureSize, engine.getRenderHeight() / engine.getCaps().maxTextureSize);\r\n }\r\n const textureSize = this.getSize();\r\n let renderWidth = engine.getRenderWidth() * this._renderScale;\r\n let renderHeight = engine.getRenderHeight() * this._renderScale;\r\n\r\n if (this._renderAtIdealSize) {\r\n if (this._idealWidth) {\r\n renderHeight = (renderHeight * this._idealWidth) / renderWidth;\r\n renderWidth = this._idealWidth;\r\n } else if (this._idealHeight) {\r\n renderWidth = (renderWidth * this._idealHeight) / renderHeight;\r\n renderHeight = this._idealHeight;\r\n }\r\n }\r\n if (textureSize.width !== renderWidth || textureSize.height !== renderHeight) {\r\n this.scaleTo(renderWidth, renderHeight);\r\n if (this.adjustToEngineHardwareScalingLevel) {\r\n const engineRenderScale = 1 / engine.getHardwareScalingLevel();\r\n const scale = this._renderScale * engineRenderScale;\r\n this._rootContainer.scaleX = scale;\r\n this._rootContainer.scaleY = scale;\r\n this._rootContainer.widthInPixels = renderWidth / scale;\r\n this._rootContainer.heightInPixels = renderHeight / scale;\r\n }\r\n this.markAsDirty();\r\n if (this._idealWidth || this._idealHeight) {\r\n this._rootContainer._markAllAsDirty();\r\n }\r\n if (!this._alreadyRegisteredForRender) {\r\n this._alreadyRegisteredForRender = true;\r\n Tools.SetImmediate(() => {\r\n // We want to force an update so the texture can be set as ready\r\n this.update(this.applyYInversionOnUpdate, this.premulAlpha, AdvancedDynamicTexture.AllowGPUOptimizations);\r\n this._alreadyRegisteredForRender = false;\r\n });\r\n }\r\n }\r\n this.invalidateRect(0, 0, textureSize.width - 1, textureSize.height - 1);\r\n }\r\n /** @internal */\r\n public _getGlobalViewport(): Viewport {\r\n const size = this.getSize();\r\n const globalViewPort = this._fullscreenViewport.toGlobal(size.width, size.height);\r\n\r\n const targetX = Math.round(globalViewPort.width / this._rootContainer.scaleX);\r\n const targetY = Math.round(globalViewPort.height / this._rootContainer.scaleY);\r\n\r\n const scale = this._adjustToEngineHardwareScalingLevel ? this._renderScale / (this.getScene()?.getEngine().getHardwareScalingLevel() || 1) : 1;\r\n\r\n globalViewPort.x += (globalViewPort.width / scale - targetX) / 2;\r\n globalViewPort.y += (globalViewPort.height / scale - targetY) / 2;\r\n\r\n globalViewPort.width = targetX;\r\n globalViewPort.height = targetY;\r\n\r\n return globalViewPort;\r\n }\r\n /**\r\n * Get screen coordinates for a vector3\r\n * @param position defines the position to project\r\n * @param worldMatrix defines the world matrix to use\r\n * @returns the projected position\r\n */\r\n public getProjectedPosition(position: Vector3, worldMatrix: Matrix): Vector2 {\r\n const result = this.getProjectedPositionWithZ(position, worldMatrix);\r\n return new Vector2(result.x, result.y);\r\n }\r\n\r\n /**\r\n * Get screen coordinates for a vector3\r\n * @param position defines the position to project\r\n * @param worldMatrix defines the world matrix to use\r\n * @returns the projected position with Z\r\n */\r\n public getProjectedPositionWithZ(position: Vector3, worldMatrix: Matrix): Vector3 {\r\n const scene = this.getScene();\r\n if (!scene) {\r\n return Vector3.Zero();\r\n }\r\n const globalViewport = this._getGlobalViewport();\r\n const projectedPosition = Vector3.Project(position, worldMatrix, scene.getTransformMatrix(), globalViewport);\r\n return new Vector3(projectedPosition.x, projectedPosition.y, projectedPosition.z);\r\n }\r\n\r\n /** @internal */\r\n public _checkUpdate(camera: Nullable<Camera>, skipUpdate?: boolean): void {\r\n if (this._layerToDispose && camera) {\r\n if ((camera.layerMask & this._layerToDispose.layerMask) === 0) {\r\n return;\r\n }\r\n }\r\n if (this._isFullscreen && this._linkedControls.length) {\r\n const scene = this.getScene();\r\n if (!scene) {\r\n return;\r\n }\r\n const globalViewport = this._getGlobalViewport();\r\n for (const control of this._linkedControls) {\r\n if (!control.isVisible) {\r\n continue;\r\n }\r\n const mesh = control._linkedMesh as AbstractMesh;\r\n if (!mesh || mesh.isDisposed()) {\r\n Tools.SetImmediate(() => {\r\n control.linkWithMesh(null);\r\n });\r\n continue;\r\n }\r\n const position = mesh.getBoundingInfo ? mesh.getBoundingInfo().boundingSphere.center : (Vector3.ZeroReadOnly as Vector3);\r\n const projectedPosition = Vector3.Project(position, mesh.getWorldMatrix(), scene.getTransformMatrix(), globalViewport);\r\n if (projectedPosition.z < 0 || projectedPosition.z > 1) {\r\n control.notRenderable = true;\r\n continue;\r\n }\r\n control.notRenderable = false;\r\n if (this.useInvalidateRectOptimization) {\r\n control.invalidateRect();\r\n }\r\n\r\n control._moveToProjectedPosition(projectedPosition);\r\n }\r\n }\r\n if (!this._isDirty && !this._rootContainer.isDirty) {\r\n return;\r\n }\r\n this._isDirty = false;\r\n this._render(skipUpdate);\r\n if (!skipUpdate) {\r\n this.update(this.applyYInversionOnUpdate, this.premulAlpha, AdvancedDynamicTexture.AllowGPUOptimizations);\r\n }\r\n }\r\n\r\n private _clearMeasure = new Measure(0, 0, 0, 0);\r\n\r\n private _render(skipRender?: boolean): void {\r\n const textureSize = this.getSize();\r\n const renderWidth = textureSize.width;\r\n const renderHeight = textureSize.height;\r\n\r\n const context = this.getContext();\r\n context.font = \"18px Arial\";\r\n context.strokeStyle = \"white\";\r\n\r\n if (this.onGuiReadyObservable.hasObservers()) {\r\n this._checkGuiIsReady();\r\n }\r\n\r\n /** We have to recheck the camera projection in the case the root control's children have changed */\r\n if (this._rootChildrenHaveChanged) {\r\n const camera = this.getScene()?.activeCamera;\r\n if (camera) {\r\n this._rootChildrenHaveChanged = false;\r\n this._checkUpdate(camera, true);\r\n }\r\n }\r\n\r\n // Layout\r\n this.onBeginLayoutObservable.notifyObservers(this);\r\n const measure = new Measure(0, 0, renderWidth, renderHeight);\r\n this._numLayoutCalls = 0;\r\n this._rootContainer._layout(measure, context);\r\n this.onEndLayoutObservable.notifyObservers(this);\r\n this._isDirty = false; // Restoring the dirty state that could have been set by controls during layout processing\r\n\r\n if (skipRender) {\r\n return;\r\n }\r\n\r\n // Clear\r\n if (this._invalidatedRectangle) {\r\n this._clearMeasure.copyFrom(this._invalidatedRectangle);\r\n } else {\r\n this._clearMeasure.copyFromFloats(0, 0, renderWidth, renderHeight);\r\n }\r\n context.clearRect(this._clearMeasure.left, this._clearMeasure.top, this._clearMeasure.width, this._clearMeasure.height);\r\n if (this._background) {\r\n context.save();\r\n context.fillStyle = this._background;\r\n context.fillRect(this._clearMeasure.left, this._clearMeasure.top, this._clearMeasure.width, this._clearMeasure.height);\r\n context.restore();\r\n }\r\n\r\n // Render\r\n this.onBeginRenderObservable.notifyObservers(this);\r\n this._numRenderCalls = 0;\r\n this._rootContainer._render(context, this._invalidatedRectangle);\r\n this.onEndRenderObservable.notifyObservers(this);\r\n this._invalidatedRectangle = null;\r\n }\r\n /**\r\n * @internal\r\n */\r\n public _changeCursor(cursor: string) {\r\n if (this._rootElement) {\r\n this._rootElement.style.cursor = cursor;\r\n this._cursorChanged = true;\r\n }\r\n }\r\n /**\r\n * @internal\r\n */\r\n public _registerLastControlDown(control: Control, pointerId: number) {\r\n this._lastControlDown[pointerId] = control;\r\n this.onControlPickedObservable.notifyObservers(control);\r\n }\r\n private _doPicking(x: number, y: number, pi: Nullable<PointerInfoBase>, type: number, pointerId: number, buttonIndex: number, deltaX?: number, deltaY?: number): void {\r\n const scene = this.getScene();\r\n if (!scene || this.disablePicking) {\r\n return;\r\n }\r\n const engine = scene.getEngine();\r\n const textureSize = this.getSize();\r\n if (this._isFullscreen) {\r\n const camera = scene.cameraToUseForPointers || scene.activeCamera;\r\n if (!camera) {\r\n return;\r\n }\r\n const viewport = camera.viewport;\r\n x = x * (textureSize.width / (engine.getRenderWidth() * viewport.width));\r\n y = y * (textureSize.height / (engine.getRenderHeight() * viewport.height));\r\n }\r\n if (this._capturingControl[pointerId]) {\r\n if (this._capturingControl[pointerId].isPointerBlocker) {\r\n this._shouldBlockPointer = true;\r\n }\r\n this._capturingControl[pointerId]._processObservables(type, x, y, pi, pointerId, buttonIndex);\r\n return;\r\n }\r\n\r\n this._cursorChanged = false;\r\n if (!this._rootContainer._processPicking(x, y, pi, type, pointerId, buttonIndex, deltaX, deltaY)) {\r\n if (!scene.doNotHandleCursors) {\r\n this._changeCursor(\"\");\r\n }\r\n if (type === PointerEventTypes.POINTERMOVE) {\r\n if (this._lastControlOver[pointerId]) {\r\n this._lastControlOver[pointerId]._onPointerOut(this._lastControlOver[pointerId], pi);\r\n delete this._lastControlOver[pointerId];\r\n }\r\n }\r\n }\r\n\r\n if (!this._cursorChanged && !scene.doNotHandleCursors) {\r\n this._changeCursor(\"\");\r\n }\r\n this._manageFocus();\r\n }\r\n /**\r\n * @internal\r\n */\r\n public _cleanControlAfterRemovalFromList(list: { [pointerId: number]: Control }, control: Control) {\r\n for (const pointerId in list) {\r\n if (!Object.prototype.hasOwnProperty.call(list, pointerId)) {\r\n continue;\r\n }\r\n const lastControlOver = list[pointerId];\r\n if (lastControlOver === control) {\r\n delete list[pointerId];\r\n }\r\n }\r\n }\r\n /**\r\n * @internal\r\n */\r\n public _cleanControlAfterRemoval(control: Control) {\r\n this._cleanControlAfterRemovalFromList(this._lastControlDown, control);\r\n this._cleanControlAfterRemovalFromList(this._lastControlOver, control);\r\n }\r\n\r\n /**\r\n * This function will run a pointer event on this ADT and will trigger any pointer events on any controls\r\n * This will work on a fullscreen ADT only. For mesh based ADT, simulate pointer events using the scene directly.\r\n * @param x pointer X on the canvas for the picking\r\n * @param y pointer Y on the canvas for the picking\r\n * @param pi optional pointer information\r\n */\r\n public pick(x: number, y: number, pi: Nullable<PointerInfoPre> = null) {\r\n if (this._isFullscreen && this._scene) {\r\n this._translateToPicking(this._scene, new Viewport(0, 0, 0, 0), pi, x, y);\r\n }\r\n }\r\n\r\n private _translateToPicking(scene: Scene, tempViewport: Viewport, pi: Nullable<PointerInfoPre>, x: number = scene.pointerX, y: number = scene.pointerY) {\r\n const camera = scene.cameraToUseForPointers || scene.activeCamera;\r\n const engine = scene.getEngine();\r\n const originalCameraToUseForPointers = scene.cameraToUseForPointers;\r\n\r\n if (!camera) {\r\n tempViewport.x = 0;\r\n tempViewport.y = 0;\r\n tempViewport.width = engine.getRenderWidth();\r\n tempViewport.height = engine.getRenderHeight();\r\n } else {\r\n if (camera.rigCameras.length) {\r\n // rig camera - we need to find the camera to use for this event\r\n const rigViewport = new Viewport(0, 0, 1, 1);\r\n for (const rigCamera of camera.rigCameras) {\r\n // generate the viewport of this camera\r\n rigCamera.viewport.toGlobalToRef(engine.getRenderWidth(), engine.getRenderHeight(), rigViewport);\r\n const transformedX = x / engine.getHardwareScalingLevel() - rigViewport.x;\r\n const transformedY = y / engine.getHardwareScalingLevel() - (engine.getRenderHeight() - rigViewport.y - rigViewport.height);\r\n // check if the pointer is in the camera's viewport\r\n if (transformedX < 0 || transformedY < 0 || transformedX > rigViewport.width || transformedY > rigViewport.height) {\r\n // out of viewport - don't use this camera\r\n return;\r\n }\r\n // set the camera to use for pointers until this pointer loop is over\r\n scene.cameraToUseForPointers = rigCamera;\r\n // set the viewport\r\n tempViewport.x = rigViewport.x;\r\n tempViewport.y = rigViewport.y;\r\n tempViewport.width = rigViewport.width;\r\n tempViewport.height = rigViewport.height;\r\n }\r\n } else {\r\n camera.viewport.toGlobalToRef(engine.getRenderWidth(), engine.getRenderHeight(), tempViewport);\r\n }\r\n }\r\n\r\n const transformedX = x / engine.getHardwareScalingLevel() - tempViewport.x;\r\n const transformedY = y / engine.getHardwareScalingLevel() - (engine.getRenderHeight() - tempViewport.y - tempViewport.height);\r\n this._shouldBlockPointer = false;\r\n // Do picking modifies _shouldBlockPointer\r\n if (pi) {\r\n const pointerId = (pi.event as IPointerEvent).pointerId || this._defaultMousePointerId;\r\n this._doPicking(transformedX, transformedY, pi, pi.type, pointerId, pi.event.button, (<IWheelEvent>pi.event).deltaX, (<IWheelEvent>pi.event).deltaY);\r\n // Avoid overwriting a true skipOnPointerObservable to false\r\n if ((this._shouldBlockPointer && !(pi.type & this.skipBlockEvents)) || this._capturingControl[pointerId]) {\r\n pi.skipOnPointerObservable = true;\r\n }\r\n } else {\r\n this._doPicking(transformedX, transformedY, null, PointerEventTypes.POINTERMOVE, this._defaultMousePointerId, 0);\r\n }\r\n // if overridden by a rig camera - reset back to the original value\r\n scene.cameraToUseForPointers = originalCameraToUseForPointers;\r\n }\r\n\r\n /** Attach to all scene events required to support pointer events */\r\n public attach(): void {\r\n const scene = this.getScene();\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n const tempViewport = new Viewport(0, 0, 0, 0);\r\n\r\n this._prePointerObserver = scene.onPrePointerObservable.add((pi) => {\r\n if (\r\n scene.isPointerCaptured((<IPointerEvent>pi.event).pointerId) &&\r\n pi.type === PointerEventTypes.POINTERUP &&\r\n !this._capturedPointerIds.has((pi.event as IPointerEvent).pointerId)\r\n ) {\r\n return;\r\n }\r\n if (\r\n pi.type !== PointerEventTypes.POINTERMOVE &&\r\n pi.type !== PointerEventTypes.POINTERUP &&\r\n pi.type !== PointerEventTypes.POINTERDOWN &&\r\n pi.type !== PointerEventTypes.POINTERWHEEL &&\r\n pi.type !== PointerEventTypes.POINTERTAP\r\n ) {\r\n return;\r\n }\r\n\r\n if (pi.type === PointerEventTypes.POINTERMOVE) {\r\n // Avoid pointerMove events firing while the pointer is captured by the scene\r\n if (scene.isPointerCaptured((<IPointerEvent>pi.event).pointerId)) {\r\n return;\r\n }\r\n if ((pi.event as IPointerEvent).pointerId) {\r\n this._defaultMousePointerId = (pi.event as IPointerEvent).pointerId; // This is required to make sure we have the correct pointer ID for wheel\r\n }\r\n }\r\n this._translateToPicking(scene, tempViewport, pi);\r\n });\r\n this._attachPickingToSceneRender(scene, () => this._translateToPicking(scene, tempViewport, null), false);\r\n this._attachToOnPointerOut(scene);\r\n this._attachToOnBlur(scene);\r\n }\r\n\r\n private _focusProperties: { index: number; total: number } = { index: 0, total: -1 };\r\n\r\n private _focusNextElement(forward: boolean = true): void {\r\n // generate the order of tab-able controls\r\n const sortedTabbableControls: Control[] = [];\r\n this.executeOnAllControls((control) => {\r\n if (control.isFocusInvisible || !control.isVisible || control.tabIndex < 0) {\r\n return;\r\n }\r\n sortedTabbableControls.push(control);\r\n });\r\n // if no control is tab-able, return\r\n if (sortedTabbableControls.length === 0) {\r\n return;\r\n }\r\n sortedTabbableControls.sort((a, b) => {\r\n // if tabIndex is 0, put it in the end of the list, otherwise sort by tabIndex\r\n return a.tabIndex === 0 ? 1 : b.tabIndex === 0 ? -1 : a.tabIndex - b.tabIndex;\r\n });\r\n this._focusProperties.total = sortedTabbableControls.length;\r\n // if no control is focused, focus the first one\r\n let nextIndex: number;\r\n if (!this._focusedControl) {\r\n nextIndex = forward ? 0 : sortedTabbableControls.length - 1;\r\n } else {\r\n const currentIndex = sortedTabbableControls.indexOf(this._focusedControl);\r\n nextIndex = currentIndex + (forward ? 1 : -1);\r\n if (nextIndex < 0) {\r\n nextIndex = sortedTabbableControls.length - 1;\r\n } else if (nextIndex >= sortedTabbableControls.length) {\r\n nextIndex = 0;\r\n }\r\n }\r\n sortedTabbableControls[nextIndex].focus();\r\n this._focusProperties.index = nextIndex;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n private _onClipboardCopy = (rawEvt: Event) => {\r\n const evt = rawEvt as ClipboardEvent;\r\n const ev = new ClipboardInfo(ClipboardEventTypes.COPY, evt);\r\n this.onClipboardObservable.notifyObservers(ev);\r\n evt.preventDefault();\r\n };\r\n /**\r\n * @internal\r\n */\r\n private _onClipboardCut = (rawEvt: Event) => {\r\n const evt = rawEvt as ClipboardEvent;\r\n const ev = new ClipboardInfo(ClipboardEventTypes.CUT, evt);\r\n this.onClipboardObservable.notifyObservers(ev);\r\n evt.preventDefault();\r\n };\r\n /**\r\n * @internal\r\n */\r\n private _onClipboardPaste = (rawEvt: Event) => {\r\n const evt = rawEvt as ClipboardEvent;\r\n const ev = new ClipboardInfo(ClipboardEventTypes.PASTE, evt);\r\n this.onClipboardObservable.notifyObservers(ev);\r\n evt.preventDefault();\r\n };\r\n /**\r\n * Register the clipboard Events onto the canvas\r\n */\r\n public registerClipboardEvents(): void {\r\n self.addEventListener(\"copy\", this._onClipboardCopy, false);\r\n self.addEventListener(\"cut\", this._onClipboardCut, false);\r\n self.addEventListener(\"paste\", this._onClipboardPaste, false);\r\n }\r\n /**\r\n * Unregister the clipboard Events from the canvas\r\n */\r\n public unRegisterClipboardEvents(): void {\r\n self.removeEventListener(\"copy\", this._onClipboardCopy);\r\n self.removeEventListener(\"cut\", this._onClipboardCut);\r\n self.removeEventListener(\"paste\", this._onClipboardPaste);\r\n }\r\n\r\n /**\r\n * Transform uvs from mesh space to texture space, taking the texture into account\r\n * @param uv the uvs in mesh space\r\n * @returns the uvs in texture space\r\n */\r\n private _transformUvs(uv: Vector2): Vector2 {\r\n const textureMatrix = this.getTextureMatrix();\r\n let result;\r\n if (textureMatrix.isIdentityAs3x2()) {\r\n result = uv;\r\n } else {\r\n const homogeneousTextureMatrix = TmpVectors.Matrix[0];\r\n\r\n textureMatrix.getRowToRef(0, TmpVectors.Vector4[0]);\r\n textureMatrix.getRowToRef(1, TmpVectors.Vector4[1]);\r\n textureMatrix.getRowToRef(2, TmpVectors.Vector4[2]);\r\n\r\n const r0 = TmpVectors.Vector4[0];\r\n const r1 = TmpVectors.Vector4[1];\r\n const r2 = TmpVectors.Vector4[2];\r\n\r\n homogeneousTextureMatrix.setRowFromFloats(0, r0.x, r0.y, 0, 0);\r\n homogeneousTextureMatrix.setRowFromFloats(1, r1.x, r1.y, 0, 0);\r\n homogeneousTextureMatrix.setRowFromFloats(2, 0, 0, 1, 0);\r\n homogeneousTextureMatrix.setRowFromFloats(3, r2.x, r2.y, 0, 1);\r\n\r\n result = TmpVectors.Vector2[0];\r\n Vector2.TransformToRef(uv, homogeneousTextureMatrix, result);\r\n }\r\n\r\n // In wrap and mirror mode, the texture coordinate for coordinates more than 1 is the fractional part of the coordinate\r\n if (this.wrapU === Texture.WRAP_ADDRESSMODE || this.wrapU === Texture.MIRROR_ADDRESSMODE) {\r\n if (result.x > 1) {\r\n let fX = result.x - Math.trunc(result.x);\r\n // In mirror mode, the sign of the texture coordinate depends on the integer part -\r\n // odd integers means it is mirrored from the original coordinate\r\n if (this.wrapU === Texture.MIRROR_ADDRESSMODE && Math.trunc(result.x) % 2 === 1) {\r\n fX = 1 - fX;\r\n }\r\n result.x = fX;\r\n }\r\n }\r\n if (this.wrapV === Texture.WRAP_ADDRESSMODE || this.wrapV === Texture.MIRROR_ADDRESSMODE) {\r\n if (result.y > 1) {\r\n let fY = result.y - Math.trunc(result.y);\r\n if (this.wrapV === Texture.MIRROR_ADDRESSMODE && Math.trunc(result.y) % 2 === 1) {\r\n fY = 1 - fY;\r\n }\r\n result.y = fY;\r\n }\r\n }\r\n return result;\r\n }\r\n /**\r\n * Connect the texture to a hosting mesh to enable interactions\r\n * @param mesh defines the mesh to attach to\r\n * @param supportPointerMove defines a boolean indicating if pointer move events must be catched as well\r\n */\r\n public attachToMesh(mesh: AbstractMesh, supportPointerMove = true): void {\r\n const scene = this.getScene();\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n if (this._pointerObserver) {\r\n scene.onPointerObservable.remove(this._pointerObserver);\r\n }\r\n\r\n this._pointerObserver = scene.onPointerObservable.add((pi) => {\r\n if (\r\n pi.type !== PointerEventTypes.POINTERMOVE &&\r\n pi.type !== PointerEventTypes.POINTERUP &&\r\n pi.type !== PointerEventTypes.POINTERDOWN &&\r\n pi.type !== PointerEventTypes.POINTERWHEEL\r\n ) {\r\n return;\r\n }\r\n\r\n if (pi.type === PointerEventTypes.POINTERMOVE && (pi.event as IPointerEvent).pointerId) {\r\n this._defaultMousePointerId = (pi.event as IPointerEvent).pointerId; // This is required to make sure we have the correct pointer ID for wheel\r\n }\r\n\r\n const pointerId = (pi.event as IPointerEvent).pointerId || this._defaultMousePointerId;\r\n if (pi.pickInfo && pi.pickInfo.hit && pi.pickInfo.pickedMesh === mesh) {\r\n let uv = pi.pickInfo.getTextureCoordinates();\r\n if (uv) {\r\n uv = this._transformUvs(uv);\r\n const size = this.getSize();\r\n this._doPicking(\r\n uv.x * size.width,\r\n (this.applyYInversionOnUpdate ? 1.0 - uv.y : uv.y) * size.height,\r\n pi,\r\n pi.type,\r\n pointerId,\r\n pi.event.button,\r\n (<IWheelEvent>pi.event).deltaX,\r\n (<IWheelEvent>pi.event).deltaY\r\n );\r\n }\r\n } else if (pi.type === PointerEventTypes.POINTERUP) {\r\n if (this._lastControlDown[pointerId]) {\r\n this._lastControlDown[pointerId]._forcePointerUp(pointerId);\r\n }\r\n delete this._lastControlDown[pointerId];\r\n if (this.focusedControl) {\r\n const friendlyControls = this.focusedControl.keepsFocusWith();\r\n let canMoveFocus = true;\r\n if (friendlyControls) {\r\n for (const control of friendlyControls) {\r\n // Same host, no need to keep the focus\r\n if (this === control._host) {\r\n continue;\r\n }\r\n // Different hosts\r\n const otherHost = control._host;\r\n if (otherHost._lastControlOver[pointerId] && otherHost._lastControlOver[pointerId].isAscendant(control)) {\r\n canMoveFocus = false;\r\n break;\r\n }\r\n }\r\n }\r\n if (canMoveFocus) {\r\n this.focusedControl = null;\r\n }\r\n }\r\n } else if (pi.type === PointerEventTypes.POINTERMOVE) {\r\n if (this._lastControlOver[pointerId]) {\r\n this._lastControlOver[pointerId]._onPointerOut(this._lastControlOver[pointerId], pi, true);\r\n }\r\n delete this._lastControlOver[pointerId];\r\n }\r\n });\r\n mesh.enablePointerMoveEvents = supportPointerMove;\r\n this._attachPickingToSceneRender(\r\n scene,\r\n () => {\r\n const pointerId = this._defaultMousePointerId;\r\n const pick = scene?.pick(scene.pointerX, scene.pointerY);\r\n if (pick && pick.hit && pick.pickedMesh === mesh) {\r\n let uv = pick.getTextureCoordinates();\r\n if (uv) {\r\n uv = this._transformUvs(uv);\r\n const size = this.getSize();\r\n this._doPicking(uv.x * size.width, (this.applyYInversionOnUpdate ? 1.0 - uv.y : uv.y) * size.height, null, PointerEventTypes.POINTERMOVE, pointerId, 0);\r\n }\r\n } else {\r\n if (this._lastControlOver[pointerId]) {\r\n this._lastControlOver[pointerId]._onPointerOut(this._lastControlOver[pointerId], null, true);\r\n }\r\n delete this._lastControlOver[pointerId];\r\n }\r\n },\r\n true\r\n );\r\n this._attachToOnPointerOut(scene);\r\n this._attachToOnBlur(scene);\r\n }\r\n /**\r\n * Move the focus to a specific control\r\n * @param control defines the control which will receive the focus\r\n */\r\n public moveFocusToControl(control: Control): void {\r\n this.focusedControl = control;\r\n this._lastPickedControl = <any>control;\r\n this._blockNextFocusCheck = true;\r\n }\r\n private _manageFocus(): void {\r\n if (this._blockNextFocusCheck) {\r\n this._blockNextFocusCheck = false;\r\n this._lastPickedControl = <any>this._focusedControl;\r\n return;\r\n }\r\n // Focus management\r\n if (this._focusedControl) {\r\n if (this._focusedControl !== <any>this._lastPickedControl) {\r\n if (this._lastPickedControl.isFocusInvisible) {\r\n return;\r\n }\r\n this.focusedControl = null;\r\n }\r\n }\r\n }\r\n private _attachPickingToSceneRender(scene: Scene, pickFunction: () => void, forcePicking: boolean) {\r\n this._sceneRenderObserver = scene.onBeforeRenderObservable.add(() => {\r\n if (!this.checkPointerEveryFrame) {\r\n return;\r\n }\r\n if (this._linkedControls.length > 0 || forcePicking) {\r\n pickFunction();\r\n }\r\n });\r\n }\r\n private _attachToOnPointerOut(scene: Scene): void {\r\n this._canvasPointerOutObserver = scene.getEngine().onCanvasPointerOutObservable.add((pointerEvent) => {\r\n if (this._lastControlOver[pointerEvent.pointerId]) {\r\n this._lastControlOver[pointerEvent.pointerId]._onPointerOut(this._lastControlOver[pointerEvent.pointerId], null);\r\n }\r\n delete this._lastControlOver[pointerEvent.pointerId];\r\n if (this._lastControlDown[pointerEvent.pointerId] && this._lastControlDown[pointerEvent.pointerId] !== this._capturingControl[pointerEvent.pointerId]) {\r\n this._lastControlDown[pointerEvent.pointerId]._forcePointerUp(pointerEvent.pointerId);\r\n delete this._lastControlDown[pointerEvent.pointerId];\r\n }\r\n });\r\n }\r\n private _attachToOnBlur(scene: Scene): void {\r\n this._canvasBlurObserver = scene.getEngine().onCanvasBlurObservable.add(() => {\r\n Object.entries(this._lastControlDown).forEach(([, value]) => {\r\n value._onCanvasBlur();\r\n });\r\n this.focusedControl = null;\r\n this._lastControlDown = {};\r\n });\r\n }\r\n\r\n /**\r\n * Serializes the entire GUI system\r\n * @returns an object with the JSON serialized data\r\n */\r\n public serializeContent(): any {\r\n const size = this.getSize();\r\n const serializationObject = {\r\n root: {},\r\n width: size.width,\r\n height: size.height,\r\n };\r\n\r\n this._rootContainer.serialize(serializationObject.root);\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Recreate the content of the ADT from a JSON object\r\n * @param serializedObject define the JSON serialized object to restore from\r\n * @param scaleToSize defines whether to scale to texture to the saved size\r\n * @param urlRewriter defines an url rewriter to update urls before sending them to the controls\r\n */\r\n public parseSerializedObject(serializedObject: any, scaleToSize?: boolean, urlRewriter?: (url: string) => string) {\r\n this._rootContainer = Control.Parse(serializedObject.root, this, urlRewriter) as Container;\r\n if (scaleToSize) {\r\n const width = serializedObject.width;\r\n const height = serializedObject.height;\r\n if (typeof width === \"number\" && typeof height === \"number\" && width >= 0 && height >= 0) {\r\n this.scaleTo(width, height);\r\n } else {\r\n // scales the GUI to a default size if none was available in the serialized content\r\n this.scaleTo(1920, 1080);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clones the ADT. If no mesh is defined, the GUI will be considered as a fullscreen GUI\r\n * @param newName defines the name of the new ADT\r\n * @param attachToMesh defines if the new ADT should be attached to a mesh\r\n * @returns the clone of the ADT\r\n */\r\n public override clone(newName?: string, attachToMesh?: AbstractMesh): AdvancedDynamicTexture {\r\n const scene = this.getScene();\r\n\r\n if (!scene) {\r\n return this;\r\n }\r\n const size = this.getSize();\r\n const data = this.serializeContent();\r\n let clone;\r\n if (!this._isFullscreen) {\r\n if (attachToMesh) {\r\n clone = AdvancedDynamicTexture.CreateForMesh(attachToMesh, size.width, size.height);\r\n } else {\r\n clone = new AdvancedDynamicTexture(newName ?? \"Clone of \" + this.name, size.width, size.height, scene, !this.noMipmap, this.samplingMode);\r\n }\r\n } else {\r\n clone = AdvancedDynamicTexture.CreateFullscreenUI(newName ?? \"Clone of \" + this.name);\r\n }\r\n clone.parseSerializedObject(data);\r\n\r\n return clone;\r\n }\r\n\r\n /**\r\n * Recreate the content of the ADT from a JSON object\r\n * @param serializedObject define the JSON serialized object to restore from\r\n * @param scaleToSize defines whether to scale to texture to the saved size\r\n * @param urlRewriter defines an url rewriter to update urls before sending them to the controls\r\n * @deprecated Please use parseSerializedObject instead\r\n */\r\n public parseContent = this.parseSerializedObject;\r\n\r\n /**\r\n * Recreate the content of the ADT from a snippet saved by the GUI editor\r\n * @param snippetId defines the snippet to load\r\n * @param scaleToSize defines whether to scale to texture to the saved size\r\n * @param appendToAdt if provided the snippet will be appended to the adt. Otherwise a fullscreen ADT will be created.\r\n * @param urlRewriter defines an url rewriter to update urls before sending them to the controls\r\n * @returns a promise that will resolve on success\r\n */\r\n public static async ParseFromSnippetAsync(\r\n snippetId: string,\r\n scaleToSize?: boolean,\r\n appendToAdt?: AdvancedDynamicTexture,\r\n urlRewriter?: (url: string) => string\r\n ): Promise<AdvancedDynamicTexture> {\r\n const adt = appendToAdt ?? AdvancedDynamicTexture.CreateFullscreenUI(\"ADT from snippet\");\r\n if (snippetId === \"_BLANK\") {\r\n return adt;\r\n }\r\n\r\n const serialized = await AdvancedDynamicTexture._LoadURLContentAsync(AdvancedDynamicTexture.SnippetUrl + \"/\" + snippetId.replace(/#/g, \"/\"), true);\r\n adt.parseSerializedObject(serialized, scaleToSize, urlRewriter);\r\n return adt;\r\n }\r\n\r\n /**\r\n * Recreate the content of the ADT from a snippet saved by the GUI editor\r\n * @param snippetId defines the snippet to load\r\n * @param scaleToSize defines whether to scale to texture to the saved size\r\n * @param urlRewriter defines an url rewriter to update urls before sending them to the controls\r\n * @returns a promise that will resolve on success\r\n */\r\n public async parseFromSnippetAsync(snippetId: string, scaleToSize?: boolean, urlRewriter?: (url: string) => string): Promise<AdvancedDynamicTexture> {\r\n return await AdvancedDynamicTexture.ParseFromSnippetAsync(snippetId, scaleToSize, this, urlRewriter);\r\n }\r\n\r\n /**\r\n * Recreate the content of the ADT from a url json\r\n * @param url defines the url to load\r\n * @param scaleToSize defines whether to scale to texture to the saved size\r\n * @param appendToAdt if provided the snippet will be appended to the adt. Otherwise a fullscreen ADT will be created.\r\n * @param urlRewriter defines an url rewriter to update urls before sending them to the controls\r\n * @returns a promise that will resolve on success\r\n */\r\n public static async ParseFromFileAsync(\r\n url: string,\r\n scaleToSize?: boolean,\r\n appendToAdt?: AdvancedDynamicTexture,\r\n urlRewriter?: (url: string) => string\r\n ): Promise<AdvancedDynamicTexture> {\r\n const adt = appendToAdt ?? AdvancedDynamicTexture.CreateFullscreenUI(\"ADT from URL\");\r\n const serialized = await AdvancedDynamicTexture._LoadURLContentAsync(url);\r\n adt.parseSerializedObject(serialized, scaleToSize, urlRewriter);\r\n return adt;\r\n }\r\n\r\n /**\r\n * Recreate the content of the ADT from a url json\r\n * @param url defines the url to load\r\n * @param scaleToSize defines whether to scale to texture to the saved size\r\n * @param urlRewriter defines an url rewriter to update urls before sending them to the controls\r\n * @returns a promise that will resolve on success\r\n */\r\n public async parseFromURLAsync(url: string, scaleToSize?: boolean, urlRewriter?: (url: string) => string): Promise<AdvancedDynamicTexture> {\r\n return await AdvancedDynamicTexture.ParseFromFileAsync(url, scaleToSize, this, urlRewriter);\r\n }\r\n\r\n private static async _LoadURLContentAsync(url: string, snippet: boolean = false): Promise<any> {\r\n if (url === \"\") {\r\n throw new Error(\"No URL provided\");\r\n }\r\n\r\n return await new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n let gui;\r\n if (snippet) {\r\n const payload = JSON.parse(JSON.parse(request.responseText).jsonPayload);\r\n gui = payload.encodedGui ? new TextDecoder(\"utf-8\").decode(DecodeBase64ToBinary(payload.encodedGui)) : payload.gui;\r\n } else {\r\n gui = request.responseText;\r\n }\r\n const serializationObject = JSON.parse(gui);\r\n resolve(serializationObject);\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(\"Unable to load\");\r\n }\r\n }\r\n });\r\n request.open(\"GET\", url);\r\n request.send();\r\n });\r\n }\r\n\r\n // Statics\r\n /**\r\n * Compares two rectangle based controls for pixel overlap\r\n * @param control1 The first control to compare\r\n * @param control2 The second control to compare\r\n * @returns true if overlaps, otherwise false\r\n */\r\n private static _Overlaps(control1: Control, control2: Control) {\r\n return !(\r\n control1.centerX > control2.centerX + control2.widthInPixels ||\r\n control1.centerX + control1.widthInPixels < control2.centerX ||\r\n control1.centerY + control1.heightInPixels < control2.centerY ||\r\n control1.centerY > control2.centerY + control2.heightInPixels\r\n );\r\n }\r\n\r\n /**\r\n * Creates a new AdvancedDynamicTexture in projected mode (ie. attached to a mesh)\r\n * @param mesh defines the mesh which will receive the texture\r\n * @param width defines the texture width (1024 by default)\r\n * @param height defines the texture height (1024 by default)\r\n * @param supportPointerMove defines a boolean indicating if the texture must capture move events (true by default)\r\n * @param onlyAlphaTesting defines a boolean indicating that alpha blending will not be used (only alpha testing) (false by default)\r\n * @param invertY defines if the texture needs to be inverted on the y axis during loading (true by default)\r\n * @param materialSetupCallback defines a custom way of creating and setting up the material on the mesh\r\n * @param sampling defines the texture sampling mode (Texture.TRILINEAR_SAMPLINGMODE by default)\r\n * @returns a new AdvancedDynamicTexture\r\n */\r\n public static CreateForMesh(\r\n mesh: AbstractMesh,\r\n width = 1024,\r\n height = 1024,\r\n supportPointerMove = true,\r\n onlyAlphaTesting = false,\r\n invertY?: boolean,\r\n materialSetupCallback: (mesh: AbstractMesh, uniqueId: string, texture: AdvancedDynamicTexture, onlyAlphaTesting: boolean) => void = this._CreateMaterial,\r\n sampling = Texture.TRILINEAR_SAMPLINGMODE\r\n ): AdvancedDynamicTexture {\r\n // use a unique ID in name so serialization will work even if you create two ADTs for a single mesh\r\n const uniqueId = RandomGUID();\r\n const result = new AdvancedDynamicTexture(`AdvancedDynamicTexture for ${mesh.name} [${uniqueId}]`, width, height, mesh.getScene(), true, sampling, invertY);\r\n\r\n materialSetupCallback(mesh, uniqueId, result, onlyAlphaTesting);\r\n\r\n result.attachToMesh(mesh, supportPointerMove);\r\n return result;\r\n }\r\n\r\n private static _CreateMaterial(mesh: AbstractMesh, uniqueId: string, texture: AdvancedDynamicTexture, onlyAlphaTesting: boolean): void {\r\n const internalClassType = GetClass(\"BABYLON.StandardMaterial\");\r\n if (!internalClassType) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"StandardMaterial needs to be imported before as it contains a side-effect required by your code.\";\r\n }\r\n\r\n const material: StandardMaterial = new internalClassType(`AdvancedDynamicTextureMaterial for ${mesh.name} [${uniqueId}]`, mesh.getScene());\r\n material.backFaceCulling = false;\r\n material.diffuseColor = Color3.Black();\r\n material.specularColor = Color3.Black();\r\n if (onlyAlphaTesting) {\r\n material.diffuseTexture = texture;\r\n material.emissiveTexture = texture;\r\n texture.hasAlpha = true;\r\n } else {\r\n material.emissiveTexture = texture;\r\n material.opacityTexture = texture;\r\n }\r\n mesh.material = material;\r\n }\r\n\r\n /**\r\n * Creates a new AdvancedDynamicTexture in projected mode (ie. attached to a mesh) BUT do not create a new material for the mesh. You will be responsible for connecting the texture\r\n * @param mesh defines the mesh which will receive the texture\r\n * @param width defines the texture width (1024 by default)\r\n * @param height defines the texture height (1024 by default)\r\n * @param supportPointerMove defines a boolean indicating if the texture must capture move events (true by default)\r\n * @param invertY defines if the texture needs to be inverted on the y axis during loading (true by default)\r\n * @param sampling defines the texture sampling mode (Texture.TRILINEAR_SAMPLINGMODE by default)\r\n * @returns a new AdvancedDynamicTexture\r\n */\r\n public static CreateForMeshTexture(\r\n mesh: AbstractMesh,\r\n width = 1024,\r\n height = 1024,\r\n supportPointerMove = true,\r\n invertY?: boolean,\r\n sampling = Texture.TRILINEAR_SAMPLINGMODE\r\n ): AdvancedDynamicTexture {\r\n const result = new AdvancedDynamicTexture(mesh.name + \" AdvancedDynamicTexture\", width, height, mesh.getScene(), true, sampling, invertY);\r\n result.attachToMesh(mesh, supportPointerMove);\r\n return result;\r\n }\r\n /**\r\n * Creates a new AdvancedDynamicTexture in fullscreen mode.\r\n * In this mode the texture will rely on a layer for its rendering.\r\n * This allows it to be treated like any other layer.\r\n * As such, if you have a multi camera setup, you can set the layerMask on the GUI as well.\r\n * LayerMask is set through advancedTexture.layer.layerMask\r\n * @param name defines name for the texture\r\n * @param foreground defines a boolean indicating if the texture must be rendered in foreground (default is true)\r\n * @param sceneOrOptions defines the hosting scene or options (IAdvancedDynamicTextureOptions)\r\n * @param sampling defines the texture sampling mode (Texture.BILINEAR_SAMPLINGMODE by default)\r\n * @param adaptiveScaling defines whether to automatically scale root to match hardwarescaling (false by default)\r\n * @returns a new AdvancedDynamicTexture\r\n */\r\n public static CreateFullscreenUI(\r\n name: string,\r\n foreground: boolean = true,\r\n sceneOrOptions: Nullable<Scene> | IAdvancedDynamicTextureOptions = null,\r\n sampling = Texture.BILINEAR_SAMPLINGMODE,\r\n adaptiveScaling: boolean = false\r\n ): AdvancedDynamicTexture {\r\n const isScene = !sceneOrOptions || (sceneOrOptions as Scene)._isScene;\r\n const result = isScene\r\n ? new AdvancedDynamicTexture(name, 0, 0, sceneOrOptions as Scene, false, sampling)\r\n : new AdvancedDynamicTexture(name, sceneOrOptions as IAdvancedDynamicTextureOptions);\r\n // Display\r\n const resultScene = result.getScene();\r\n const layer = new Layer(name + \"_layer\", null, resultScene, !foreground);\r\n layer.texture = result;\r\n result._layerToDispose = layer;\r\n result._isFullscreen = true;\r\n\r\n if (result.useStandalone) {\r\n // Make sure the layer is not rendered by the layer component!\r\n layer.layerMask = 0;\r\n }\r\n\r\n result.adjustToEngineHardwareScalingLevel = adaptiveScaling;\r\n\r\n // Attach\r\n result.attach();\r\n return result;\r\n }\r\n\r\n /**\r\n * Scales the texture\r\n * @param ratio the scale factor to apply to both width and height\r\n */\r\n public override scale(ratio: number): void {\r\n super.scale(ratio);\r\n this.markAsDirty();\r\n }\r\n\r\n /**\r\n * Resizes the texture\r\n * @param width the new width\r\n * @param height the new height\r\n */\r\n public override scaleTo(width: number, height: number): void {\r\n super.scaleTo(width, height);\r\n this.markAsDirty();\r\n }\r\n\r\n private _checkGuiIsReady() {\r\n if (this.guiIsReady()) {\r\n this.onGuiReadyObservable.notifyObservers(this);\r\n\r\n this.onGuiReadyObservable.clear();\r\n }\r\n }\r\n\r\n /**\r\n * @returns true if all the GUI components are ready to render\r\n */\r\n public guiIsReady(): boolean {\r\n return this._rootContainer.isReady();\r\n }\r\n}\r\n","import { type Nullable } from \"core/types\";\r\nimport { type Observer } from \"core/Misc/observable\";\r\nimport { PerfCounter } from \"core/Misc/perfCounter\";\r\nimport { type IDisposable } from \"core/scene\";\r\n\r\nimport { type AdvancedDynamicTexture } from \"./advancedDynamicTexture\";\r\n\r\n/**\r\n * This class can be used to get instrumentation data from a AdvancedDynamicTexture object\r\n */\r\nexport class AdvancedDynamicTextureInstrumentation implements IDisposable {\r\n private _captureRenderTime = false;\r\n private _renderTime = new PerfCounter();\r\n\r\n private _captureLayoutTime = false;\r\n private _layoutTime = new PerfCounter();\r\n\r\n // Observers\r\n private _onBeginRenderObserver: Nullable<Observer<AdvancedDynamicTexture>> = null;\r\n private _onEndRenderObserver: Nullable<Observer<AdvancedDynamicTexture>> = null;\r\n private _onBeginLayoutObserver: Nullable<Observer<AdvancedDynamicTexture>> = null;\r\n private _onEndLayoutObserver: Nullable<Observer<AdvancedDynamicTexture>> = null;\r\n\r\n // Properties\r\n\r\n /**\r\n * Gets the perf counter used to capture render time\r\n */\r\n public get renderTimeCounter(): PerfCounter {\r\n return this._renderTime;\r\n }\r\n\r\n /**\r\n * Gets the perf counter used to capture layout time\r\n */\r\n public get layoutTimeCounter(): PerfCounter {\r\n return this._layoutTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the render time capture\r\n */\r\n public get captureRenderTime(): boolean {\r\n return this._captureRenderTime;\r\n }\r\n\r\n public set captureRenderTime(value: boolean) {\r\n if (value === this._captureRenderTime) {\r\n return;\r\n }\r\n\r\n this._captureRenderTime = value;\r\n\r\n if (value) {\r\n this._onBeginRenderObserver = this.texture.onBeginRenderObservable.add(() => {\r\n this._renderTime.beginMonitoring();\r\n });\r\n\r\n this._onEndRenderObserver = this.texture.onEndRenderObservable.add(() => {\r\n this._renderTime.endMonitoring(true);\r\n });\r\n } else {\r\n this.texture.onBeginRenderObservable.remove(this._onBeginRenderObserver);\r\n this._onBeginRenderObserver = null;\r\n this.texture.onEndRenderObservable.remove(this._onEndRenderObserver);\r\n this._onEndRenderObserver = null;\r\n }\r\n }\r\n\r\n /**\r\n * Enable or disable the layout time capture\r\n */\r\n public get captureLayoutTime(): boolean {\r\n return this._captureLayoutTime;\r\n }\r\n\r\n public set captureLayoutTime(value: boolean) {\r\n if (value === this._captureLayoutTime) {\r\n return;\r\n }\r\n\r\n this._captureLayoutTime = value;\r\n\r\n if (value) {\r\n this._onBeginLayoutObserver = this.texture.onBeginLayoutObservable.add(() => {\r\n this._layoutTime.beginMonitoring();\r\n });\r\n\r\n this._onEndLayoutObserver = this.texture.onEndLayoutObservable.add(() => {\r\n this._layoutTime.endMonitoring(true);\r\n });\r\n } else {\r\n this.texture.onBeginLayoutObservable.remove(this._onBeginLayoutObserver);\r\n this._onBeginLayoutObserver = null;\r\n this.texture.onEndLayoutObservable.remove(this._onEndLayoutObserver);\r\n this._onEndLayoutObserver = null;\r\n }\r\n }\r\n /**\r\n * Instantiates a new advanced dynamic texture instrumentation.\r\n * This class can be used to get instrumentation data from an AdvancedDynamicTexture object\r\n * @param texture Defines the AdvancedDynamicTexture to instrument\r\n */\r\n public constructor(\r\n /**\r\n * Define the instrumented AdvancedDynamicTexture.\r\n */\r\n public texture: AdvancedDynamicTexture\r\n ) {}\r\n\r\n /**\r\n * Dispose and release associated resources.\r\n */\r\n public dispose() {\r\n this.texture.onBeginRenderObservable.remove(this._onBeginRenderObserver);\r\n this._onBeginRenderObserver = null;\r\n this.texture.onEndRenderObservable.remove(this._onEndRenderObserver);\r\n this._onEndRenderObserver = null;\r\n this.texture.onBeginLayoutObservable.remove(this._onBeginLayoutObserver);\r\n this._onBeginLayoutObserver = null;\r\n this.texture.onEndLayoutObservable.remove(this._onEndLayoutObserver);\r\n this._onEndLayoutObserver = null;\r\n\r\n (<any>this.texture) = null;\r\n }\r\n}\r\n","import { type FrameGraphTextureHandle, type FrameGraph } from \"core/index\";\r\nimport { AdvancedDynamicTexture } from \"../advancedDynamicTexture\";\r\nimport { FrameGraphTask } from \"core/FrameGraph/frameGraphTask\";\r\n\r\n/**\r\n * Task that renders a GUI texture.\r\n */\r\nexport class FrameGraphGUITask extends FrameGraphTask {\r\n /**\r\n * The target texture to render the GUI to.\r\n */\r\n public targetTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The output texture of the task.\r\n * This is the same texture as the target texture, but the handles are different!\r\n */\r\n public readonly outputTexture: FrameGraphTextureHandle;\r\n\r\n public override get disabled() {\r\n return this._disabled;\r\n }\r\n\r\n public override set disabled(value: boolean) {\r\n this._disabled = value;\r\n this._adt.disablePicking = value;\r\n }\r\n\r\n /**\r\n * Gets the underlying advanced dynamic texture.\r\n */\r\n public get gui() {\r\n return this._adt;\r\n }\r\n\r\n protected _adt: AdvancedDynamicTexture;\r\n\r\n /**\r\n * Constructs a new GUI task.\r\n * @param name Name of the task\r\n * @param frameGraph Frame graph the task belongs to\r\n * @param adt The GUI texture. If not provided, a new fullscreen GUI will be created.\r\n */\r\n constructor(name: string, frameGraph: FrameGraph, adt?: AdvancedDynamicTexture) {\r\n super(name, frameGraph);\r\n\r\n if (adt) {\r\n if (!adt.useStandalone) {\r\n throw new Error(`AdvancedDynamicTexture \"${name}\": the texture must have been created with the useStandalone property set to true`);\r\n }\r\n } else {\r\n adt = AdvancedDynamicTexture.CreateFullscreenUI(name, undefined, { useStandalone: true, scene: frameGraph.scene });\r\n }\r\n this._adt = adt;\r\n\r\n this.outputTexture = this._frameGraph.textureManager.createDanglingHandle();\r\n }\r\n\r\n public override isReady() {\r\n return this._adt.guiIsReady() && this._adt._layerToDispose!.isReady();\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"FrameGraphGUITask\";\r\n }\r\n\r\n public record(): void {\r\n if (this.targetTexture === undefined) {\r\n throw new Error(\"FrameGraphGUITask: targetTexture is required\");\r\n }\r\n\r\n this._frameGraph.textureManager.resolveDanglingHandle(this.outputTexture, this.targetTexture);\r\n\r\n const pass = this._frameGraph.addRenderPass(this.name);\r\n\r\n pass.setRenderTarget(this.outputTexture);\r\n pass.setExecuteFunc((context) => {\r\n this._adt._checkUpdate(null);\r\n context.render(this._adt._layerToDispose!);\r\n });\r\n\r\n const passDisabled = this._frameGraph.addRenderPass(this.name + \"_disabled\", true);\r\n\r\n passDisabled.setRenderTarget(this.outputTexture);\r\n passDisabled.setExecuteFunc((_context) => {});\r\n }\r\n\r\n public override dispose(): void {\r\n this._adt.dispose();\r\n super.dispose();\r\n }\r\n}\r\n","import { NodeRenderGraphBlock } from \"core/FrameGraph/Node/nodeRenderGraphBlock\";\r\nimport { AdvancedDynamicTexture } from \"../advancedDynamicTexture\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { NodeRenderGraphBlockConnectionPointTypes } from \"core/FrameGraph/Node/Types/nodeRenderGraphTypes\";\r\nimport { type NodeRenderGraphConnectionPoint } from \"core/FrameGraph/Node/nodeRenderGraphBlockConnectionPoint\";\r\nimport { type NodeRenderGraphBuildState } from \"core/FrameGraph/Node/nodeRenderGraphBuildState\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { type FrameGraphTextureHandle } from \"core/FrameGraph/frameGraphTypes\";\r\nimport { FrameGraphGUITask } from \"./guiTask\";\r\nimport { type FrameGraph } from \"core/FrameGraph/frameGraph\";\r\n\r\n/**\r\n * Block that implements a fullscreen GUI for render graph\r\n */\r\nexport class NodeRenderGraphGUIBlock extends NodeRenderGraphBlock {\r\n protected override _frameGraphTask: FrameGraphGUITask;\r\n protected _gui: AdvancedDynamicTexture;\r\n\r\n /**\r\n * Gets the frame graph task associated with this block\r\n */\r\n public override get task() {\r\n return this._frameGraphTask;\r\n }\r\n\r\n /**\r\n * Gets the GUI texture used by this block\r\n */\r\n public get gui() {\r\n return this._frameGraphTask.gui;\r\n }\r\n\r\n /**\r\n * Create a new NodeRenderGraphGUIBlock\r\n * @param name defines the block name\r\n * @param frameGraph defines the hosting frame graph\r\n * @param scene defines the hosting scene\r\n */\r\n public constructor(name: string, frameGraph: FrameGraph, scene: Scene) {\r\n super(name, frameGraph, scene);\r\n\r\n this.registerInput(\"target\", NodeRenderGraphBlockConnectionPointTypes.Texture);\r\n this._addDependenciesInput();\r\n this.registerOutput(\"output\", NodeRenderGraphBlockConnectionPointTypes.BasedOnInput);\r\n\r\n this.target.addAcceptedConnectionPointTypes(NodeRenderGraphBlockConnectionPointTypes.TextureAll);\r\n this.output._typeConnectionSource = this.target;\r\n\r\n this._gui = AdvancedDynamicTexture.CreateFullscreenUI(this.name, undefined, {\r\n useStandalone: true,\r\n scene,\r\n });\r\n this._frameGraphTask = new FrameGraphGUITask(this.name, frameGraph, this._gui);\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public override getClassName() {\r\n return \"GUI.NodeRenderGraphGUIBlock\";\r\n }\r\n\r\n /**\r\n * Gets the target input component\r\n */\r\n public get target(): NodeRenderGraphConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the output component\r\n */\r\n public get output(): NodeRenderGraphConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n protected override _buildBlock(state: NodeRenderGraphBuildState) {\r\n super._buildBlock(state);\r\n\r\n this.output.value = this._frameGraphTask.outputTexture; // the value of the output connection point is the \"output\" texture of the task\r\n\r\n this._frameGraphTask.targetTexture = this.target.connectedPoint?.value as FrameGraphTextureHandle;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GUI.NodeRenderGraphGUIBlock\", NodeRenderGraphGUIBlock);\r\n","import { GetClass } from \"core/Misc/typeStore\";\r\nimport { type Nullable } from \"core/types\";\r\n\r\nconst XmlLoaderError = \"XmlLoader Exception : XML file is malformed or corrupted.\";\r\n\r\n/**\r\n * Class used to load GUI via XML.\r\n */\r\nexport class XmlLoader {\r\n private _nodes: any = {};\r\n\r\n private _nodeTypes: any = {\r\n element: 1,\r\n attribute: 2,\r\n text: 3,\r\n };\r\n\r\n private _isLoaded: boolean = false;\r\n\r\n private _objectAttributes: any = {\r\n textHorizontalAlignment: 1,\r\n textVerticalAlignment: 2,\r\n horizontalAlignment: 3,\r\n verticalAlignment: 4,\r\n stretch: 5,\r\n };\r\n\r\n private _rootNode: any;\r\n\r\n private _parentClass: any;\r\n\r\n /**\r\n * Create a new xml loader\r\n * @param parentClass Sets the class context. Used when the loader is instanced inside a class and not in a global context\r\n */\r\n constructor(parentClass: any = null) {\r\n if (parentClass) {\r\n this._parentClass = parentClass;\r\n }\r\n }\r\n\r\n private _getChainElement(attributeValue: any): any {\r\n let element: any = window;\r\n\r\n if (this._parentClass) {\r\n element = this._parentClass;\r\n }\r\n let value = attributeValue;\r\n value = value.split(\".\");\r\n\r\n for (let i = 0; i < value.length; i++) {\r\n element = element[value[i]];\r\n }\r\n return element;\r\n }\r\n\r\n private _getClassAttribute(attributeName: string): any {\r\n const attribute = attributeName.split(\".\");\r\n const className = GetClass(\"BABYLON.GUI.\" + attribute[0]);\r\n return className[attribute[1]];\r\n }\r\n\r\n private _createGuiElement(node: any, parent: any, linkParent: boolean = true): void {\r\n try {\r\n const className = GetClass(\"BABYLON.GUI.\" + node.nodeName);\r\n const guiNode = new className();\r\n\r\n if (parent && linkParent) {\r\n parent.addControl(guiNode);\r\n }\r\n\r\n for (let i = 0; i < node.attributes.length; i++) {\r\n if (node.attributes[i].name.toLowerCase().includes(\"datasource\")) {\r\n continue;\r\n }\r\n\r\n if (node.attributes[i].name.toLowerCase().includes(\"observable\")) {\r\n const element = this._getChainElement(node.attributes[i].value);\r\n guiNode[node.attributes[i].name].add(element);\r\n\r\n continue;\r\n } else if (node.attributes[i].name == \"linkWithMesh\") {\r\n if (this._parentClass) {\r\n guiNode.linkWithMesh(this._parentClass[node.attributes[i].value]);\r\n } else {\r\n guiNode.linkWithMesh(window[node.attributes[i].value]);\r\n }\r\n } else if (node.attributes[i].value.match(/{{.*}}/)) {\r\n const matches = node.attributes[i].value.match(/{{(.*)}}/);\r\n let element = this._getChainElement(matches[1]);\r\n if (!(node.attributes[i].value.startsWith(\"{{\") && node.attributes[i].value.endsWith(\"}}\"))) {\r\n element = (node.attributes[i].value as string).replace(/{{.*}}/, `${element}`);\r\n }\r\n guiNode[node.attributes[i].name] = element;\r\n } else if (!this._objectAttributes[node.attributes[i].name]) {\r\n if (node.attributes[i].value == \"true\" || node.attributes[i].value == \"false\") {\r\n guiNode[node.attributes[i].name] = node.attributes[i].value == \"true\";\r\n } else {\r\n guiNode[node.attributes[i].name] = !isNaN(Number(node.attributes[i].value)) ? Number(node.attributes[i].value) : node.attributes[i].value;\r\n }\r\n } else {\r\n guiNode[node.attributes[i].name] = this._getClassAttribute(node.attributes[i].value);\r\n }\r\n }\r\n\r\n if (!node.attributes.getNamedItem(\"id\")) {\r\n this._nodes[node.nodeName + Object.keys(this._nodes).length + \"_gen\"] = guiNode;\r\n return guiNode;\r\n }\r\n\r\n let id = node.attributes.getNamedItem(\"id\").value;\r\n if (id.startsWith(\"{{\") && id.endsWith(\"}}\")) {\r\n id = this._getChainElement(id.substring(2, id.length - 2));\r\n }\r\n\r\n if (!this._nodes[id]) {\r\n this._nodes[id] = guiNode;\r\n } else {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"XmlLoader Exception : Duplicate ID, every element should have an unique ID attribute\";\r\n }\r\n return guiNode;\r\n } catch (exception) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"XmlLoader Exception : Error parsing Control \" + node.nodeName + \",\" + exception + \".\";\r\n }\r\n }\r\n\r\n private _parseGrid(node: any, guiNode: any, parent: any): void {\r\n let width;\r\n let height;\r\n let columns;\r\n const rows = node.children;\r\n let cells;\r\n let isPixel: boolean;\r\n let cellNode;\r\n let rowNumber = -1;\r\n let columnNumber = -1;\r\n let totalColumnsNumber = 0;\r\n\r\n for (let i = 0; i < rows.length; i++) {\r\n if (rows[i].nodeType != this._nodeTypes.element) {\r\n continue;\r\n }\r\n if (rows[i].nodeName != \"Row\") {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"XmlLoader Exception : Expecting Row node, received \" + rows[i].nodeName;\r\n }\r\n rowNumber += 1;\r\n columns = rows[i].children;\r\n\r\n if (!rows[i].attributes.getNamedItem(\"height\")) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"XmlLoader Exception : Height must be defined for grid rows\";\r\n }\r\n height = Number(rows[i].attributes.getNamedItem(\"height\").nodeValue);\r\n isPixel = rows[i].attributes.getNamedItem(\"isPixel\") ? JSON.parse(rows[i].attributes.getNamedItem(\"isPixel\").nodeValue) : false;\r\n guiNode.addRowDefinition(height, isPixel);\r\n\r\n for (let j = 0; j < columns.length; j++) {\r\n if (columns[j].nodeType != this._nodeTypes.element) {\r\n continue;\r\n }\r\n if (columns[j].nodeName != \"Column\") {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"XmlLoader Exception : Expecting Column node, received \" + columns[j].nodeName;\r\n }\r\n columnNumber += 1;\r\n if (rowNumber > 0 && columnNumber > totalColumnsNumber) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"XmlLoader Exception : In the Grid element, the number of columns is defined in the first row, do not add more columns in the subsequent rows.\";\r\n }\r\n\r\n if (rowNumber == 0) {\r\n if (!columns[j].attributes.getNamedItem(\"width\")) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"XmlLoader Exception : Width must be defined for all the grid columns in the first row\";\r\n }\r\n width = Number(columns[j].attributes.getNamedItem(\"width\").nodeValue);\r\n isPixel = columns[j].attributes.getNamedItem(\"isPixel\") ? JSON.parse(columns[j].attributes.getNamedItem(\"isPixel\").nodeValue) : false;\r\n guiNode.addColumnDefinition(width, isPixel);\r\n }\r\n\r\n cells = columns[j].children;\r\n\r\n for (let k = 0; k < cells.length; k++) {\r\n if (cells[k].nodeType != this._nodeTypes.element) {\r\n continue;\r\n }\r\n cellNode = this._createGuiElement(cells[k], guiNode, false);\r\n guiNode.addControl(cellNode, rowNumber, columnNumber);\r\n if (cells[k].firstChild) {\r\n this._parseXml(cells[k].firstChild, cellNode);\r\n }\r\n }\r\n }\r\n if (rowNumber == 0) {\r\n totalColumnsNumber = columnNumber;\r\n }\r\n columnNumber = -1;\r\n }\r\n\r\n if (node.nextSibling) {\r\n this._parseXml(node.nextSibling, parent);\r\n }\r\n }\r\n\r\n private _parseElement(node: any, guiNode: any, parent: any): void {\r\n if (node.firstChild) {\r\n this._parseXml(node.firstChild, guiNode);\r\n }\r\n\r\n if (node.nextSibling) {\r\n this._parseXml(node.nextSibling, parent);\r\n }\r\n }\r\n\r\n private _prepareSourceElement(node: any, guiNode: any, variable: any, source: any, iterator: any): void {\r\n if (this._parentClass) {\r\n this._parentClass[variable] = source[iterator];\r\n } else {\r\n window[variable] = source[iterator];\r\n }\r\n\r\n if (node.firstChild) {\r\n this._parseXml(node.firstChild, guiNode, true);\r\n }\r\n }\r\n\r\n private _parseElementsFromSource(node: any, guiNode: any, parent: any): void {\r\n const dataSource = node.attributes.getNamedItem(\"dataSource\").value;\r\n\r\n if (!dataSource.includes(\" in \")) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"XmlLoader Exception : Malformed XML, Data Source must include an in\";\r\n } else {\r\n let isArray = true;\r\n const splittedSource = dataSource.split(\" in \");\r\n if (splittedSource.length < 2) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"XmlLoader Exception : Malformed XML, Data Source must have an iterator and a source\";\r\n }\r\n let source = splittedSource[1];\r\n if (source.startsWith(\"{\") && source.endsWith(\"}\")) {\r\n isArray = false;\r\n }\r\n\r\n if (!isArray || (source.startsWith(\"[\") && source.endsWith(\"]\"))) {\r\n source = source.substring(1, source.length - 1);\r\n }\r\n\r\n if (this._parentClass) {\r\n source = this._parentClass[source];\r\n } else {\r\n source = window[source];\r\n }\r\n\r\n if (isArray) {\r\n for (let i = 0; i < source.length; i++) {\r\n this._prepareSourceElement(node, guiNode, splittedSource[0], source, i);\r\n }\r\n } else {\r\n for (const i in source) {\r\n this._prepareSourceElement(node, guiNode, splittedSource[0], source, i);\r\n }\r\n }\r\n\r\n if (node.nextSibling) {\r\n this._parseXml(node.nextSibling, parent);\r\n }\r\n }\r\n }\r\n\r\n private _parseXml(node: any, parent: any, generated: boolean = false): void {\r\n if (node.nodeType != this._nodeTypes.element) {\r\n if (node.nextSibling) {\r\n this._parseXml(node.nextSibling, parent, generated);\r\n }\r\n return;\r\n }\r\n\r\n if (generated) {\r\n node.setAttribute(\"id\", parent.id + (parent._children.length + 1));\r\n }\r\n\r\n const guiNode = this._createGuiElement(node, parent);\r\n\r\n if (!this._rootNode) {\r\n this._rootNode = guiNode;\r\n }\r\n\r\n if (node.nodeName == \"Grid\") {\r\n this._parseGrid(node, guiNode, parent);\r\n } else if (!node.attributes.getNamedItem(\"dataSource\")) {\r\n this._parseElement(node, guiNode, parent);\r\n } else {\r\n this._parseElementsFromSource(node, guiNode, parent);\r\n }\r\n }\r\n\r\n /**\r\n * Gets if the loading has finished.\r\n * @returns whether the loading has finished or not\r\n */\r\n public isLoaded(): boolean {\r\n return this._isLoaded;\r\n }\r\n\r\n /**\r\n * Gets a loaded node / control by id.\r\n * @param id the Controls id set in the xml\r\n * @returns element of type Control\r\n */\r\n public getNodeById(id: string): any {\r\n return this._nodes[id];\r\n }\r\n\r\n /**\r\n * Gets all loaded nodes / controls\r\n * @returns Array of controls\r\n */\r\n public getNodes(): any {\r\n return this._nodes;\r\n }\r\n /**\r\n * Disposes the loaded layout\r\n */\r\n public dispose(): void {\r\n if (this._rootNode) {\r\n this._rootNode.dispose();\r\n this._rootNode = null;\r\n this._nodes = {};\r\n }\r\n }\r\n\r\n /**\r\n * Initiates the xml layout loading\r\n * @param xmlFile defines the xml layout to load\r\n * @param rootNode defines the node / control to use as a parent for the loaded layout controls.\r\n * @param onSuccess defines the callback called on layout load successfully.\r\n * @param onError defines the callback called on layout load failure.\r\n */\r\n public loadLayout(xmlFile: any, rootNode: any, onSuccess: Nullable<() => void> = null, onError: Nullable<(error: string) => void> = null): void {\r\n const xhttp = new XMLHttpRequest();\r\n xhttp.onload = () => {\r\n if (xhttp.readyState === 4 && xhttp.status === 200) {\r\n if (!xhttp.responseXML) {\r\n if (onError) {\r\n onError(XmlLoaderError);\r\n return;\r\n } else {\r\n throw XmlLoaderError;\r\n }\r\n }\r\n\r\n const xmlDoc = xhttp.responseXML.documentElement;\r\n this._parseXml(xmlDoc.firstChild, rootNode);\r\n this._isLoaded = true;\r\n\r\n if (onSuccess) {\r\n onSuccess();\r\n }\r\n }\r\n };\r\n\r\n xhttp.onerror = function () {\r\n if (onError) {\r\n onError(\"an error occurred during loading the layout\");\r\n }\r\n };\r\n\r\n xhttp.open(\"GET\", xmlFile, true);\r\n xhttp.send();\r\n }\r\n /**\r\n * Initiates the xml layout loading asynchronously\r\n * @param xmlFile defines the xml layout to load\r\n * @param rootNode defines the node / control to use as a parent for the loaded layout controls.\r\n * @returns Promise\r\n */\r\n public async loadLayoutAsync(xmlFile: any, rootNode: any): Promise<any> {\r\n return await new Promise((resolve: any, reject: any) => {\r\n this.loadLayout(xmlFile, rootNode, resolve, reject);\r\n });\r\n }\r\n}\r\n","import { Vector3 } from \"core/Maths/math.vector\";\r\n\r\n/**\r\n * Class used to transport Vector3 information for pointer events\r\n */\r\nexport class Vector3WithInfo extends Vector3 {\r\n /**\r\n * Creates a new Vector3WithInfo\r\n * @param source defines the vector3 data to transport\r\n * @param buttonIndex defines the current mouse button index\r\n */\r\n public constructor(\r\n source: Vector3,\r\n /** defines the current mouse button index */\r\n public buttonIndex: number = 0\r\n ) {\r\n super(source.x, source.y, source.z);\r\n }\r\n}\r\n","import { type Nullable } from \"core/types\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { PointerEventTypes } from \"core/Events/pointerEvents\";\r\nimport { type TransformNode } from \"core/Meshes/transformNode\";\r\nimport { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { type IBehaviorAware, type Behavior } from \"core/Behaviors/behavior\";\r\nimport { type IDisposable, type Scene } from \"core/scene\";\r\n\r\nimport { type GUI3DManager } from \"../gui3DManager\";\r\nimport { Vector3WithInfo } from \"../vector3WithInfo\";\r\nimport { type Container3D } from \"./container3D\";\r\n\r\nimport { type TouchButton3D } from \"./touchButton3D\";\r\n\r\n/**\r\n * Class used as base class for controls\r\n */\r\nexport class Control3D implements IDisposable, IBehaviorAware<Control3D> {\r\n private _node: Nullable<TransformNode>;\r\n private _downCount = 0;\r\n private _enterCount = -1;\r\n private _downPointerIds: { [id: number]: number } = {}; // Store number of pointer downs per ID, from near and far interactions\r\n\r\n protected _isVisible = true;\r\n\r\n /** @internal */\r\n public _host: GUI3DManager;\r\n /** @internal */\r\n public _isScaledByManager = false;\r\n\r\n private _position?: Vector3;\r\n private _scaling?: Vector3;\r\n\r\n /** Gets or sets the control position in world space */\r\n public get position(): Vector3 {\r\n if (!this._node) {\r\n this._position = this._position || Vector3.Zero();\r\n return this._position;\r\n }\r\n\r\n return this._node.position;\r\n }\r\n\r\n public set position(value: Vector3) {\r\n this._position = value;\r\n if (!this._node) {\r\n return;\r\n }\r\n\r\n this._node.position = this._position;\r\n }\r\n\r\n /** Gets or sets the control scaling in world space */\r\n public get scaling(): Vector3 {\r\n if (!this._node) {\r\n this._scaling = this._scaling || new Vector3(1, 1, 1);\r\n return this._scaling;\r\n }\r\n\r\n return this._node.scaling;\r\n }\r\n\r\n public set scaling(value: Vector3) {\r\n this._scaling = value;\r\n if (!this._node) {\r\n return;\r\n }\r\n\r\n this._isScaledByManager = false;\r\n this._node.scaling = this._scaling;\r\n }\r\n\r\n /** Callback used to start pointer enter animation */\r\n public pointerEnterAnimation: () => void;\r\n /** Callback used to start pointer out animation */\r\n public pointerOutAnimation: () => void;\r\n /** Callback used to start pointer down animation */\r\n public pointerDownAnimation: () => void;\r\n /** Callback used to start pointer up animation */\r\n public pointerUpAnimation: () => void;\r\n\r\n /**\r\n * An event triggered when the pointer moves over the control\r\n */\r\n public onPointerMoveObservable = new Observable<Vector3>();\r\n\r\n /**\r\n * An event triggered when the pointer moves out of the control\r\n */\r\n public onPointerOutObservable = new Observable<Control3D>();\r\n\r\n /**\r\n * An event triggered when the pointer taps the control\r\n */\r\n public onPointerDownObservable = new Observable<Vector3WithInfo>();\r\n\r\n /**\r\n * An event triggered when pointer is up\r\n */\r\n public onPointerUpObservable = new Observable<Vector3WithInfo>();\r\n\r\n /**\r\n * An event triggered when a control is clicked on (with a mouse)\r\n */\r\n public onPointerClickObservable = new Observable<Vector3WithInfo>();\r\n\r\n /**\r\n * An event triggered when pointer enters the control\r\n */\r\n public onPointerEnterObservable = new Observable<Control3D>();\r\n\r\n /**\r\n * Gets or sets the parent container\r\n */\r\n public parent: Nullable<Container3D>;\r\n\r\n // Behaviors\r\n private _behaviors = new Array<Behavior<Control3D>>();\r\n\r\n /**\r\n * Gets the list of attached behaviors\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors\r\n */\r\n public get behaviors(): Behavior<Control3D>[] {\r\n return this._behaviors;\r\n }\r\n\r\n /**\r\n * Attach a behavior to the control\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors\r\n * @param behavior defines the behavior to attach\r\n * @returns the current control\r\n */\r\n public addBehavior(behavior: Behavior<Control3D>): Control3D {\r\n const index = this._behaviors.indexOf(behavior);\r\n\r\n if (index !== -1) {\r\n return this;\r\n }\r\n\r\n behavior.init();\r\n const scene = this._host.scene;\r\n if (scene.isLoading) {\r\n // We defer the attach when the scene will be loaded\r\n scene.onDataLoadedObservable.addOnce(() => {\r\n behavior.attach(this);\r\n });\r\n } else {\r\n behavior.attach(this);\r\n }\r\n this._behaviors.push(behavior);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remove an attached behavior\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors\r\n * @param behavior defines the behavior to attach\r\n * @returns the current control\r\n */\r\n public removeBehavior(behavior: Behavior<Control3D>): Control3D {\r\n const index = this._behaviors.indexOf(behavior);\r\n\r\n if (index === -1) {\r\n return this;\r\n }\r\n\r\n this._behaviors[index].detach();\r\n this._behaviors.splice(index, 1);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets an attached behavior by name\r\n * @param name defines the name of the behavior to look for\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors\r\n * @returns null if behavior was not found else the requested behavior\r\n */\r\n public getBehaviorByName(name: string): Nullable<Behavior<Control3D>> {\r\n for (const behavior of this._behaviors) {\r\n if (behavior.name === name) {\r\n return behavior;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the control is visible */\r\n public get isVisible(): boolean {\r\n return this._isVisible;\r\n }\r\n\r\n public set isVisible(value: boolean) {\r\n if (this._isVisible === value) {\r\n return;\r\n }\r\n\r\n this._isVisible = value;\r\n\r\n const mesh = this.mesh;\r\n if (mesh) {\r\n mesh.setEnabled(value);\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new control\r\n * @param name defines the control name\r\n */\r\n constructor(\r\n /** Defines the control name */\r\n public name?: string\r\n ) {}\r\n\r\n /**\r\n * Gets a string representing the class name\r\n */\r\n public get typeName(): string {\r\n return this._getTypeName();\r\n }\r\n\r\n /**\r\n * Get the current class name of the control.\r\n * @returns current class name\r\n */\r\n public getClassName(): string {\r\n return this._getTypeName();\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"Control3D\";\r\n }\r\n\r\n /**\r\n * Gets the transform node used by this control\r\n */\r\n public get node(): Nullable<TransformNode> {\r\n return this._node;\r\n }\r\n\r\n /**\r\n * Gets the mesh used to render this control\r\n */\r\n public get mesh(): Nullable<AbstractMesh> {\r\n if (this._node instanceof AbstractMesh) {\r\n return this._node;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Link the control as child of the given node\r\n * @param node defines the node to link to. Use null to unlink the control\r\n * @returns the current control\r\n */\r\n public linkToTransformNode(node: Nullable<TransformNode>): Control3D {\r\n if (this._node) {\r\n this._node.parent = node;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _prepareNode(scene: Scene): void {\r\n if (!this._node) {\r\n this._node = this._createNode(scene);\r\n\r\n if (!this.node) {\r\n return;\r\n }\r\n if (this._position) {\r\n this.node.position = this._position;\r\n }\r\n if (this._scaling) {\r\n this.node.scaling = this._scaling;\r\n }\r\n this._injectGUI3DReservedDataStore(this.node).control = this; // Store the control on the reservedDataStore field in order to get it when picking\r\n\r\n const mesh = this.mesh;\r\n if (mesh) {\r\n mesh.isPickable = true;\r\n\r\n this._affectMaterial(mesh);\r\n }\r\n }\r\n }\r\n\r\n protected _injectGUI3DReservedDataStore(node: TransformNode): any {\r\n node.reservedDataStore = node.reservedDataStore ?? {};\r\n node.reservedDataStore.GUI3D = node.reservedDataStore.GUI3D ?? {};\r\n return node.reservedDataStore.GUI3D;\r\n }\r\n\r\n /**\r\n * Node creation.\r\n * Can be overriden by children\r\n * @param scene defines the scene where the node must be attached\r\n * @returns the attached node or null if none. Must return a Mesh or AbstractMesh if there is an attached visible object\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _createNode(scene: Scene): Nullable<TransformNode> {\r\n // Do nothing by default\r\n return null;\r\n }\r\n\r\n /**\r\n * Affect a material to the given mesh\r\n * @param mesh defines the mesh which will represent the control\r\n */\r\n protected _affectMaterial(mesh: AbstractMesh) {\r\n mesh.material = null;\r\n }\r\n\r\n private _isTouchButton3D(control: Control3D): control is TouchButton3D {\r\n return (control as TouchButton3D)._generatePointerEventType !== undefined;\r\n }\r\n\r\n // Pointers\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerMove(target: Control3D, coordinates: Vector3): void {\r\n this.onPointerMoveObservable.notifyObservers(coordinates, -1, target, this);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerEnter(target: Control3D): boolean {\r\n if (this._enterCount === -1) {\r\n // -1 is for touch input, we are now sure we are with a mouse or pencil\r\n this._enterCount = 0;\r\n }\r\n\r\n this._enterCount++;\r\n\r\n if (this._enterCount > 1) {\r\n return false;\r\n }\r\n\r\n this.onPointerEnterObservable.notifyObservers(this, -1, target, this);\r\n\r\n if (this.pointerEnterAnimation) {\r\n this.pointerEnterAnimation();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerOut(target: Control3D): void {\r\n this._enterCount--;\r\n\r\n if (this._enterCount > 0) {\r\n return;\r\n }\r\n\r\n this._enterCount = 0;\r\n\r\n this.onPointerOutObservable.notifyObservers(this, -1, target, this);\r\n\r\n if (this.pointerOutAnimation) {\r\n this.pointerOutAnimation();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerDown(target: Control3D, coordinates: Vector3, pointerId: number, buttonIndex: number): boolean {\r\n this._downCount++;\r\n this._downPointerIds[pointerId] = this._downPointerIds[pointerId] + 1 || 1;\r\n\r\n if (this._downCount !== 1) {\r\n return false;\r\n }\r\n\r\n this.onPointerDownObservable.notifyObservers(new Vector3WithInfo(coordinates, buttonIndex), -1, target, this);\r\n\r\n if (this.pointerDownAnimation) {\r\n this.pointerDownAnimation();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _onPointerUp(target: Control3D, coordinates: Vector3, pointerId: number, buttonIndex: number, notifyClick: boolean): void {\r\n this._downCount--;\r\n this._downPointerIds[pointerId]--;\r\n\r\n if (this._downPointerIds[pointerId] <= 0) {\r\n delete this._downPointerIds[pointerId];\r\n }\r\n\r\n if (this._downCount < 0) {\r\n // Handle if forcePointerUp was called prior to this\r\n this._downCount = 0;\r\n return;\r\n }\r\n\r\n if (this._downCount == 0) {\r\n if (notifyClick && (this._enterCount > 0 || this._enterCount === -1)) {\r\n this.onPointerClickObservable.notifyObservers(new Vector3WithInfo(coordinates, buttonIndex), -1, target, this);\r\n }\r\n this.onPointerUpObservable.notifyObservers(new Vector3WithInfo(coordinates, buttonIndex), -1, target, this);\r\n\r\n if (this.pointerUpAnimation) {\r\n this.pointerUpAnimation();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public forcePointerUp(pointerId: Nullable<number> = null) {\r\n if (pointerId !== null) {\r\n this._onPointerUp(this, Vector3.Zero(), pointerId, 0, true);\r\n } else {\r\n for (const key in this._downPointerIds) {\r\n this._onPointerUp(this, Vector3.Zero(), +key, 0, true);\r\n }\r\n if (this._downCount > 0) {\r\n this._downCount = 1;\r\n this._onPointerUp(this, Vector3.Zero(), 0, 0, true);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _processObservables(type: number, pickedPoint: Vector3, originMeshPosition: Nullable<Vector3>, pointerId: number, buttonIndex: number): boolean {\r\n if (this._isTouchButton3D(this) && originMeshPosition) {\r\n type = this._generatePointerEventType(type, originMeshPosition, this._downCount);\r\n }\r\n\r\n if (type === PointerEventTypes.POINTERMOVE) {\r\n this._onPointerMove(this, pickedPoint);\r\n\r\n const previousControlOver = this._host._lastControlOver[pointerId];\r\n if (previousControlOver && previousControlOver !== this) {\r\n previousControlOver._onPointerOut(this);\r\n }\r\n\r\n if (previousControlOver !== this) {\r\n this._onPointerEnter(this);\r\n }\r\n\r\n this._host._lastControlOver[pointerId] = this;\r\n return true;\r\n }\r\n\r\n if (type === PointerEventTypes.POINTERDOWN) {\r\n this._onPointerDown(this, pickedPoint, pointerId, buttonIndex);\r\n this._host._lastControlDown[pointerId] = this;\r\n this._host._lastPickedControl = this;\r\n return true;\r\n }\r\n\r\n if (type === PointerEventTypes.POINTERUP || type === PointerEventTypes.POINTERDOUBLETAP) {\r\n if (this._host._lastControlDown[pointerId]) {\r\n this._host._lastControlDown[pointerId]._onPointerUp(this, pickedPoint, pointerId, buttonIndex, true);\r\n }\r\n delete this._host._lastControlDown[pointerId];\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /** @internal */\r\n public _disposeNode(): void {\r\n if (this._node) {\r\n this._node.dispose();\r\n this._node = null;\r\n }\r\n }\r\n\r\n /**\r\n * Releases all associated resources\r\n */\r\n public dispose() {\r\n this.onPointerDownObservable.clear();\r\n this.onPointerEnterObservable.clear();\r\n this.onPointerMoveObservable.clear();\r\n this.onPointerOutObservable.clear();\r\n this.onPointerUpObservable.clear();\r\n this.onPointerClickObservable.clear();\r\n\r\n this._disposeNode();\r\n\r\n // Behaviors\r\n for (const behavior of this._behaviors) {\r\n behavior.detach();\r\n }\r\n }\r\n}\r\n","import { type Control } from \"../../2D/controls/control\";\r\nimport { AdvancedDynamicTexture } from \"../../2D/advancedDynamicTexture\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { Control3D } from \"./control3D\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\n\r\n/**\r\n * The base class for controls that display content\r\n */\r\nexport class ContentDisplay3D extends Control3D {\r\n private _content: Control;\r\n protected _facadeTexture: Nullable<AdvancedDynamicTexture>;\r\n protected _contentResolution: number | { width: number; height: number } = 512;\r\n protected _contentScaleRatio = 2;\r\n protected _contentScaleRatioY?: number;\r\n\r\n /**\r\n * Gets or sets the GUI 2D content used to display the button's facade\r\n */\r\n public get content(): Control {\r\n return this._content;\r\n }\r\n\r\n public set content(value: Control) {\r\n this._content = value;\r\n\r\n if (!value || !this._host || !this._host.utilityLayer) {\r\n return;\r\n }\r\n\r\n if (!this._facadeTexture) {\r\n const width = typeof this._contentResolution === \"number\" ? this._contentResolution : this._contentResolution.width;\r\n const height = typeof this._contentResolution === \"number\" ? this._contentResolution : this._contentResolution.height;\r\n this._facadeTexture = new AdvancedDynamicTexture(\"Facade\", width, height, this._host.utilityLayer.utilityLayerScene, true, Texture.TRILINEAR_SAMPLINGMODE);\r\n this._setFacadeTextureScaling();\r\n this._facadeTexture.premulAlpha = true;\r\n } else {\r\n this._facadeTexture.rootContainer.clearControls();\r\n }\r\n\r\n this._facadeTexture.addControl(value);\r\n\r\n this._applyFacade(this._facadeTexture);\r\n }\r\n\r\n protected _setFacadeTextureScaling() {\r\n if (this._facadeTexture) {\r\n if (typeof this._contentResolution !== \"number\") {\r\n this._contentScaleRatioY = (this._contentResolution.height / this._contentResolution.width) * this._contentScaleRatio;\r\n }\r\n this._facadeTexture.rootContainer.scaleX = this._contentScaleRatio;\r\n this._facadeTexture.rootContainer.scaleY = this._contentScaleRatioY ?? this._contentScaleRatio;\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the texture resolution used to render content (512 by default)\r\n */\r\n public get contentResolution(): number | { width: number; height: number } {\r\n return this._contentResolution;\r\n }\r\n\r\n public set contentResolution(value: number | { width: number; height: number }) {\r\n const incomingWidth = typeof value === \"number\" ? value : value.width;\r\n const incomingHeight = typeof value === \"number\" ? value : value.height;\r\n const currentWidth = typeof this._contentResolution === \"number\" ? this._contentResolution : this._contentResolution.width;\r\n const currentHeight = typeof this._contentResolution === \"number\" ? this._contentResolution : this._contentResolution.height;\r\n if (incomingWidth === currentWidth && incomingHeight === currentHeight) {\r\n return;\r\n }\r\n\r\n this._contentResolution = value;\r\n this._resetContent();\r\n }\r\n\r\n protected _disposeFacadeTexture() {\r\n if (this._facadeTexture) {\r\n this._facadeTexture.dispose();\r\n this._facadeTexture = null;\r\n }\r\n }\r\n\r\n protected _resetContent() {\r\n this._disposeFacadeTexture();\r\n this.content = this._content;\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 // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _applyFacade(facadeTexture: AdvancedDynamicTexture) {}\r\n}\r\n","import { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { ContentDisplay3D } from \"./contentDisplay3D\";\r\n\r\n/**\r\n * Class used as a root to all buttons\r\n */\r\nexport class AbstractButton3D extends ContentDisplay3D {\r\n /**\r\n * Creates a new button\r\n * @param name defines the control name\r\n */\r\n constructor(name?: string) {\r\n super(name);\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"AbstractButton3D\";\r\n }\r\n\r\n // Mesh association\r\n protected override _createNode(scene: Scene): TransformNode {\r\n return new TransformNode(\"button\" + this.name, scene);\r\n }\r\n}\r\n","import { Vector4 } from \"core/Maths/math.vector\";\r\nimport { type TransformNode } from \"core/Meshes/transformNode\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { CreateBox } from \"core/Meshes/Builders/boxBuilder\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { type Scene } from \"core/scene\";\r\n\r\nimport { AbstractButton3D } from \"./abstractButton3D\";\r\nimport { type AdvancedDynamicTexture } from \"../../2D/advancedDynamicTexture\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\n\r\n/**\r\n * Options used to create a button in 3D\r\n */\r\nexport interface IButton3DCreationOptions {\r\n /**\r\n * Width of the button. Default: 1\r\n */\r\n width?: number;\r\n\r\n /**\r\n * Height of the button. Default: 1\r\n */\r\n height?: number;\r\n\r\n /**\r\n * Depth of the button. Default: 0.08\r\n */\r\n depth?: number;\r\n}\r\n\r\n/**\r\n * Class used to create a button in 3D\r\n */\r\nexport class Button3D extends AbstractButton3D {\r\n /** @internal */\r\n protected _currentMaterial: Material;\r\n\r\n protected _options: IButton3DCreationOptions;\r\n protected _height: number;\r\n protected _depth: number;\r\n\r\n /**\r\n * Creates a new button\r\n * @param name defines the control name\r\n * @param options defines the options used to create the button\r\n */\r\n constructor(name?: string, options?: IButton3DCreationOptions) {\r\n super(name);\r\n\r\n this._options = {\r\n width: 1,\r\n height: 1,\r\n depth: 0.08,\r\n ...options,\r\n };\r\n\r\n // Default animations\r\n\r\n this.pointerEnterAnimation = () => {\r\n if (!this.mesh) {\r\n return;\r\n }\r\n (<StandardMaterial>this._currentMaterial).emissiveColor = Color3.Red();\r\n };\r\n\r\n this.pointerOutAnimation = () => {\r\n (<StandardMaterial>this._currentMaterial).emissiveColor = Color3.Black();\r\n };\r\n\r\n this.pointerDownAnimation = () => {\r\n if (!this.mesh) {\r\n return;\r\n }\r\n\r\n this.mesh.scaling.scaleInPlace(0.95);\r\n };\r\n\r\n this.pointerUpAnimation = () => {\r\n if (!this.mesh) {\r\n return;\r\n }\r\n\r\n this.mesh.scaling.scaleInPlace(1.0 / 0.95);\r\n };\r\n }\r\n\r\n /**\r\n * Apply the facade texture (created from the content property).\r\n * @param facadeTexture defines the AdvancedDynamicTexture to use\r\n */\r\n protected override _applyFacade(facadeTexture: AdvancedDynamicTexture) {\r\n (<any>this._currentMaterial).emissiveTexture = facadeTexture;\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"Button3D\";\r\n }\r\n\r\n // Mesh association\r\n protected override _createNode(scene: Scene): TransformNode {\r\n const faceUV = new Array(6);\r\n\r\n for (let i = 0; i < 6; i++) {\r\n faceUV[i] = new Vector4(0, 0, 0, 0);\r\n }\r\n if (scene.useRightHandedSystem) {\r\n // Flip the u on the texture\r\n faceUV[0].copyFromFloats(1, 0, 0, 1);\r\n } else {\r\n faceUV[1].copyFromFloats(0, 0, 1, 1);\r\n }\r\n\r\n const mesh = CreateBox(\r\n this.name + \"_rootMesh\",\r\n {\r\n width: this._options.width,\r\n height: this._options.height,\r\n depth: this._options.depth,\r\n faceUV: faceUV,\r\n wrap: true,\r\n },\r\n scene\r\n );\r\n\r\n this._contentScaleRatioY = (this._contentScaleRatio * this._options.width!) / this._options.height!;\r\n this._setFacadeTextureScaling();\r\n\r\n return mesh;\r\n }\r\n\r\n protected override _affectMaterial(mesh: AbstractMesh) {\r\n const material = new StandardMaterial(this.name + \"Material\", mesh.getScene());\r\n material.specularColor = Color3.Black();\r\n\r\n mesh.material = material;\r\n this._currentMaterial = material;\r\n\r\n this._resetContent();\r\n }\r\n\r\n /**\r\n * Releases all associated resources\r\n */\r\n public override dispose() {\r\n super.dispose();\r\n\r\n this._disposeFacadeTexture();\r\n\r\n if (this._currentMaterial) {\r\n this._currentMaterial.dispose();\r\n }\r\n }\r\n}\r\n","import { type Nullable } from \"core/types\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { type Scene } from \"core/scene\";\r\n\r\nimport { Control3D } from \"./control3D\";\r\n\r\n/**\r\n * Class used to create containers for controls\r\n */\r\nexport class Container3D extends Control3D {\r\n private _blockLayout = false;\r\n\r\n /**\r\n * Gets the list of child controls\r\n */\r\n protected _children = new Array<Control3D>();\r\n\r\n /**\r\n * Gets the list of child controls\r\n */\r\n public get children(): Array<Control3D> {\r\n return this._children;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the layout must be blocked (default is false).\r\n * This is helpful to optimize layout operation when adding multiple children in a row\r\n */\r\n public get blockLayout(): boolean {\r\n return this._blockLayout;\r\n }\r\n\r\n public set blockLayout(value: boolean) {\r\n if (this._blockLayout === value) {\r\n return;\r\n }\r\n\r\n this._blockLayout = value;\r\n\r\n if (!this._blockLayout) {\r\n this._arrangeChildren();\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new container\r\n * @param name defines the container name\r\n */\r\n constructor(name?: string) {\r\n super(name);\r\n }\r\n\r\n /**\r\n * Force the container to update the layout. Please note that it will not take blockLayout property in account\r\n * @returns the current container\r\n */\r\n public updateLayout(): Container3D {\r\n this._arrangeChildren();\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the given control is in the children of this control\r\n * @param control defines the control to check\r\n * @returns true if the control is in the child list\r\n */\r\n public containsControl(control: Control3D): boolean {\r\n return this._children.indexOf(control) !== -1;\r\n }\r\n\r\n /**\r\n * Adds a control to the children of this control\r\n * @param control defines the control to add\r\n * @returns the current container\r\n */\r\n public addControl(control: Control3D): Container3D {\r\n const index = this._children.indexOf(control);\r\n\r\n if (index !== -1) {\r\n return this;\r\n }\r\n control.parent = this;\r\n control._host = this._host;\r\n\r\n this._children.push(control);\r\n\r\n if (this._host.utilityLayer) {\r\n control._prepareNode(this._host.utilityLayer.utilityLayerScene);\r\n\r\n if (control.node) {\r\n control.node.parent = this.node;\r\n }\r\n\r\n if (!this.blockLayout) {\r\n this._arrangeChildren();\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * This function will be called everytime a new control is added\r\n */\r\n protected _arrangeChildren() {}\r\n\r\n protected override _createNode(scene: Scene): Nullable<TransformNode> {\r\n return new TransformNode(\"ContainerNode\", scene);\r\n }\r\n\r\n /**\r\n * Removes a control from the children of this control\r\n * @param control defines the control to remove\r\n * @returns the current container\r\n */\r\n public removeControl(control: Control3D): Container3D {\r\n const index = this._children.indexOf(control);\r\n\r\n if (index !== -1) {\r\n this._children.splice(index, 1);\r\n\r\n control.parent = null;\r\n control._disposeNode();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"Container3D\";\r\n }\r\n\r\n /**\r\n * Releases all associated resources\r\n */\r\n public override dispose() {\r\n for (const control of this._children) {\r\n control.dispose();\r\n }\r\n\r\n this._children.length = 0;\r\n\r\n super.dispose();\r\n }\r\n\r\n /** Control rotation will remain unchanged */\r\n public static readonly UNSET_ORIENTATION = 0;\r\n\r\n /** Control will rotate to make it look at sphere central axis */\r\n public static readonly FACEORIGIN_ORIENTATION = 1;\r\n\r\n /** Control will rotate to make it look back at sphere central axis */\r\n public static readonly FACEORIGINREVERSED_ORIENTATION = 2;\r\n\r\n /** Control will rotate to look at z axis (0, 0, 1) */\r\n public static readonly FACEFORWARD_ORIENTATION = 3;\r\n\r\n /** Control will rotate to look at negative z axis (0, 0, -1) */\r\n public static readonly FACEFORWARDREVERSED_ORIENTATION = 4;\r\n}\r\n","import { Tools } from \"core/Misc/tools\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { type int } from \"core/types\";\r\n\r\nimport { Container3D } from \"./container3D\";\r\nimport { type Control3D } from \"./control3D\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\n\r\n/**\r\n * Abstract class used to create a container panel deployed on the surface of a volume\r\n */\r\nexport abstract class VolumeBasedPanel extends Container3D {\r\n private _columns = 10;\r\n private _rows = 0;\r\n private _rowThenColum = true;\r\n\r\n private _orientation = Container3D.FACEORIGIN_ORIENTATION;\r\n\r\n protected _cellWidth: number;\r\n protected _cellHeight: number;\r\n\r\n /**\r\n * Gets or sets the distance between elements\r\n */\r\n public margin = 0;\r\n\r\n /**\r\n * Gets or sets the orientation to apply to all controls (BABYLON.Container3D.FaceOriginReversedOrientation by default)\r\n * | Value | Type | Description |\r\n * | ----- | ----------------------------------- | ----------- |\r\n * | 0 | UNSET_ORIENTATION | Control rotation will remain unchanged |\r\n * | 1 | FACEORIGIN_ORIENTATION | Control will rotate to make it look at sphere central axis |\r\n * | 2 | FACEORIGINREVERSED_ORIENTATION | Control will rotate to make it look back at sphere central axis |\r\n * | 3 | FACEFORWARD_ORIENTATION | Control will rotate to look at z axis (0, 0, 1) |\r\n * | 4 | FACEFORWARDREVERSED_ORIENTATION | Control will rotate to look at negative z axis (0, 0, -1) |\r\n */\r\n public get orientation(): number {\r\n return this._orientation;\r\n }\r\n\r\n public set orientation(value: number) {\r\n if (this._orientation === value) {\r\n return;\r\n }\r\n\r\n this._orientation = value;\r\n\r\n Tools.SetImmediate(() => {\r\n this._arrangeChildren();\r\n });\r\n }\r\n\r\n /**\r\n * Gets or sets the number of columns requested (10 by default).\r\n * The panel will automatically compute the number of rows based on number of child controls.\r\n */\r\n public get columns(): int {\r\n return this._columns;\r\n }\r\n\r\n public set columns(value: int) {\r\n if (this._columns === value) {\r\n return;\r\n }\r\n\r\n this._columns = value;\r\n this._rowThenColum = true;\r\n\r\n Tools.SetImmediate(() => {\r\n this._arrangeChildren();\r\n });\r\n }\r\n\r\n /**\r\n * Gets or sets a the number of rows requested.\r\n * The panel will automatically compute the number of columns based on number of child controls.\r\n */\r\n public get rows(): int {\r\n return this._rows;\r\n }\r\n\r\n public set rows(value: int) {\r\n if (this._rows === value) {\r\n return;\r\n }\r\n\r\n this._rows = value;\r\n this._rowThenColum = false;\r\n\r\n Tools.SetImmediate(() => {\r\n this._arrangeChildren();\r\n });\r\n }\r\n\r\n /**\r\n * Creates new VolumeBasedPanel\r\n * @param name\r\n */\r\n public constructor(name?: string) {\r\n super(name);\r\n }\r\n\r\n protected override _arrangeChildren() {\r\n this._cellWidth = 0;\r\n this._cellHeight = 0;\r\n let rows: number;\r\n let columns: number;\r\n let controlCount = 0;\r\n // Measure\r\n for (const child of this._children) {\r\n if (!child.mesh) {\r\n continue;\r\n }\r\n\r\n controlCount++;\r\n child.mesh.computeWorldMatrix(true);\r\n const extendSize = child.mesh.getBoundingInfo().boundingBox.extendSize;\r\n // to be safe, check descendants\r\n const descendants = child.mesh.getDescendants(false);\r\n for (const descendant of descendants) {\r\n descendant.computeWorldMatrix(true);\r\n const casted = descendant as AbstractMesh;\r\n if (typeof casted.getBoundingInfo === \"function\") {\r\n const extendSizeChild = casted.getBoundingInfo().boundingBox.extendSize;\r\n extendSize.x = Math.max(extendSize.x, extendSizeChild.x);\r\n extendSize.y = Math.max(extendSize.y, extendSizeChild.y);\r\n extendSize.z = Math.max(extendSize.z, extendSizeChild.z);\r\n }\r\n }\r\n\r\n this._cellWidth = Math.max(this._cellWidth, extendSize.x * 2);\r\n this._cellHeight = Math.max(this._cellHeight, extendSize.y * 2);\r\n }\r\n\r\n this._cellWidth += this.margin * 2;\r\n this._cellHeight += this.margin * 2;\r\n\r\n // Arrange\r\n if (this._rowThenColum) {\r\n columns = this._columns;\r\n rows = Math.ceil(controlCount / this._columns);\r\n } else {\r\n rows = this._rows;\r\n columns = Math.ceil(controlCount / this._rows);\r\n }\r\n\r\n const startOffsetX = columns * 0.5 * this._cellWidth;\r\n const startOffsetY = rows * 0.5 * this._cellHeight;\r\n const nodeGrid = [];\r\n let cellCounter = 0;\r\n\r\n if (this._rowThenColum) {\r\n for (let r = 0; r < rows; r++) {\r\n for (let c = 0; c < columns; c++) {\r\n nodeGrid.push(new Vector3(c * this._cellWidth - startOffsetX + this._cellWidth / 2, r * this._cellHeight - startOffsetY + this._cellHeight / 2, 0));\r\n cellCounter++;\r\n if (cellCounter > controlCount) {\r\n break;\r\n }\r\n }\r\n }\r\n } else {\r\n for (let c = 0; c < columns; c++) {\r\n for (let r = 0; r < rows; r++) {\r\n nodeGrid.push(new Vector3(c * this._cellWidth - startOffsetX + this._cellWidth / 2, r * this._cellHeight - startOffsetY + this._cellHeight / 2, 0));\r\n cellCounter++;\r\n if (cellCounter > controlCount) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n cellCounter = 0;\r\n for (const child of this._children) {\r\n if (!child.mesh) {\r\n continue;\r\n }\r\n\r\n this._mapGridNode(child, nodeGrid[cellCounter]);\r\n\r\n cellCounter++;\r\n }\r\n\r\n this._finalProcessing();\r\n }\r\n\r\n /** Child classes must implement this function to provide correct control positioning */\r\n protected abstract _mapGridNode(control: Control3D, nodePosition: Vector3): void;\r\n\r\n /** Child classes can implement this function to provide additional processing */\r\n protected _finalProcessing() {}\r\n}\r\n","import { Tools } from \"core/Misc/tools\";\r\nimport { Matrix, TmpVectors, Vector3 } from \"core/Maths/math.vector\";\r\nimport { type float } from \"core/types\";\r\n\r\nimport { VolumeBasedPanel } from \"./volumeBasedPanel\";\r\nimport { type Control3D } from \"./control3D\";\r\nimport { Container3D } from \"./container3D\";\r\nimport { Axis, Space } from \"core/Maths/math.axis\";\r\n\r\n/**\r\n * Class used to create a container panel deployed on the surface of a cylinder\r\n */\r\nexport class CylinderPanel extends VolumeBasedPanel {\r\n private _radius = 5.0;\r\n\r\n /**\r\n * Gets or sets the radius of the cylinder where to project controls (5 by default)\r\n */\r\n public get radius(): float {\r\n return this._radius;\r\n }\r\n\r\n public set radius(value: float) {\r\n if (this._radius === value) {\r\n return;\r\n }\r\n\r\n this._radius = value;\r\n\r\n Tools.SetImmediate(() => {\r\n this._arrangeChildren();\r\n });\r\n }\r\n\r\n protected _mapGridNode(control: Control3D, nodePosition: Vector3) {\r\n const mesh = control.mesh;\r\n\r\n if (!mesh) {\r\n return;\r\n }\r\n const newPos = this._cylindricalMapping(nodePosition);\r\n control.position = newPos;\r\n\r\n switch (this.orientation) {\r\n case Container3D.FACEORIGIN_ORIENTATION:\r\n mesh.lookAt(new Vector3(2 * newPos.x, newPos.y, 2 * newPos.z));\r\n break;\r\n case Container3D.FACEORIGINREVERSED_ORIENTATION:\r\n mesh.lookAt(new Vector3(-newPos.x, newPos.y, -newPos.z));\r\n break;\r\n case Container3D.FACEFORWARD_ORIENTATION:\r\n break;\r\n case Container3D.FACEFORWARDREVERSED_ORIENTATION:\r\n mesh.rotate(Axis.Y, Math.PI, Space.LOCAL);\r\n break;\r\n }\r\n }\r\n\r\n private _cylindricalMapping(source: Vector3) {\r\n const newPos = new Vector3(0, source.y, this._radius);\r\n\r\n const yAngle = source.x / this._radius;\r\n\r\n Matrix.RotationYawPitchRollToRef(yAngle, 0, 0, TmpVectors.Matrix[0]);\r\n\r\n return Vector3.TransformNormal(newPos, TmpVectors.Matrix[0]);\r\n }\r\n}\r\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"fluentVertexShader\";\nconst shader = `precision highp float;attribute vec3 position;attribute vec3 normal;attribute vec2 uv;uniform mat4 world;uniform mat4 viewProjection;varying vec2 vUV;\n#ifdef BORDER\nvarying vec2 scaleInfo;uniform float borderWidth;uniform vec3 scaleFactor;\n#endif\n#ifdef HOVERLIGHT\nvarying vec3 worldPosition;\n#endif\nvoid main(void) {vUV=uv;\n#ifdef BORDER\nvec3 scale=scaleFactor;float minScale=min(min(scale.x,scale.y),scale.z);float maxScale=max(max(scale.x,scale.y),scale.z);float minOverMiddleScale=minScale/(scale.x+scale.y+scale.z-minScale-maxScale);float areaYZ=scale.y*scale.z;float areaXZ=scale.x*scale.z;float areaXY=scale.x*scale.y;float scaledBorderWidth=borderWidth; \nif (abs(normal.x)==1.0) \n{scale.x=scale.y;scale.y=scale.z;if (areaYZ>areaXZ && areaYZ>areaXY)\n{scaledBorderWidth*=minOverMiddleScale;}}\nelse if (abs(normal.y)==1.0) \n{scale.x=scale.z;if (areaXZ>areaXY && areaXZ>areaYZ)\n{scaledBorderWidth*=minOverMiddleScale;}}\nelse \n{if (areaXY>areaYZ && areaXY>areaXZ)\n{scaledBorderWidth*=minOverMiddleScale;}}\nfloat scaleRatio=min(scale.x,scale.y)/max(scale.x,scale.y);if (scale.x>scale.y)\n{scaleInfo.x=1.0-(scaledBorderWidth*scaleRatio);scaleInfo.y=1.0-scaledBorderWidth;}\nelse\n{scaleInfo.x=1.0-scaledBorderWidth;scaleInfo.y=1.0-(scaledBorderWidth*scaleRatio);} \n#endif \nvec4 worldPos=world*vec4(position,1.0);\n#ifdef HOVERLIGHT\nworldPosition=worldPos.xyz;\n#endif\ngl_Position=viewProjection*worldPos;}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const fluentVertexShader = { name, shader };\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"fluentPixelShader\";\nconst shader = `precision highp float;varying vec2 vUV;uniform vec4 albedoColor;\n#ifdef INNERGLOW\nuniform vec4 innerGlowColor;\n#endif\n#ifdef BORDER\nvarying vec2 scaleInfo;uniform float edgeSmoothingValue;uniform float borderMinValue;\n#endif\n#ifdef HOVERLIGHT\nvarying vec3 worldPosition;uniform vec3 hoverPosition;uniform vec4 hoverColor;uniform float hoverRadius;\n#endif\n#ifdef TEXTURE\nuniform sampler2D albedoSampler;uniform mat4 textureMatrix;vec2 finalUV;\n#endif\nvoid main(void) {vec3 albedo=albedoColor.rgb;float alpha=albedoColor.a;\n#ifdef TEXTURE\nfinalUV=vec2(textureMatrix*vec4(vUV,1.0,0.0));albedo=texture2D(albedoSampler,finalUV).rgb;\n#endif\n#ifdef HOVERLIGHT\nfloat pointToHover=(1.0-clamp(length(hoverPosition-worldPosition)/hoverRadius,0.,1.))*hoverColor.a;albedo=clamp(albedo+hoverColor.rgb*pointToHover,0.,1.);\n#else\nfloat pointToHover=1.0;\n#endif\n#ifdef BORDER \nfloat borderPower=10.0;float inverseBorderPower=1.0/borderPower;vec3 borderColor=albedo*borderPower;vec2 distanceToEdge;distanceToEdge.x=abs(vUV.x-0.5)*2.0;distanceToEdge.y=abs(vUV.y-0.5)*2.0;float borderValue=max(smoothstep(scaleInfo.x-edgeSmoothingValue,scaleInfo.x+edgeSmoothingValue,distanceToEdge.x),\nsmoothstep(scaleInfo.y-edgeSmoothingValue,scaleInfo.y+edgeSmoothingValue,distanceToEdge.y));borderColor=borderColor*borderValue*max(borderMinValue*inverseBorderPower,pointToHover); \nalbedo+=borderColor;alpha=max(alpha,borderValue);\n#endif\n#ifdef INNERGLOW\nvec2 uvGlow=(vUV-vec2(0.5,0.5))*(innerGlowColor.a*2.0);uvGlow=uvGlow*uvGlow;uvGlow=uvGlow*uvGlow;albedo+=mix(vec3(0.0,0.0,0.0),innerGlowColor.rgb,uvGlow.x+uvGlow.y); \n#endif\ngl_FragColor=vec4(albedo,alpha);}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const fluentPixelShader = { name, shader };\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type Nullable } from \"core/types\";\r\nimport { serializeAsColor4, serializeAsVector3, serializeAsTexture, serialize, expandToProperty, serializeAsColor3 } from \"core/Misc/decorators\";\r\nimport { SerializationHelper } from \"core/Misc/decorators.serialization\";\r\nimport { type Matrix, Vector3, TmpVectors } from \"core/Maths/math.vector\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { type IEffectCreationOptions } from \"core/Materials/effect\";\r\nimport { PushMaterial } from \"core/Materials/pushMaterial\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { type SubMesh } from \"core/Meshes/subMesh\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\n\r\nimport \"./shaders/fluent.vertex\";\r\nimport \"./shaders/fluent.fragment\";\r\nimport { PrepareUniformsAndSamplersList } from \"core/Materials/materialHelper.functions\";\r\n\r\n/** @internal */\r\nexport class FluentMaterialDefines extends MaterialDefines {\r\n public INNERGLOW = false;\r\n public BORDER = false;\r\n public HOVERLIGHT = false;\r\n public TEXTURE = false;\r\n\r\n constructor() {\r\n super();\r\n this.rebuild();\r\n }\r\n}\r\n\r\n/**\r\n * Class used to render controls with fluent design\r\n */\r\nexport class FluentMaterial extends PushMaterial {\r\n /**\r\n * Gets or sets inner glow intensity. A value of 0 means no glow (default is 0.5)\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public innerGlowColorIntensity = 0.5;\r\n\r\n /**\r\n * Gets or sets the inner glow color (white by default)\r\n */\r\n @serializeAsColor3()\r\n public innerGlowColor = new Color3(1.0, 1.0, 1.0);\r\n\r\n /**\r\n * Gets or sets the albedo color (Default is Color3(0.3, 0.35, 0.4))\r\n */\r\n @serializeAsColor3()\r\n public albedoColor = new Color3(0.3, 0.35, 0.4);\r\n\r\n /**\r\n * Gets or sets a boolean indicating if borders must be rendered (default is false)\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public renderBorders = false;\r\n\r\n /**\r\n * Gets or sets border width (default is 0.5)\r\n */\r\n @serialize()\r\n public borderWidth = 0.5;\r\n\r\n /**\r\n * Gets or sets a value indicating the smoothing value applied to border edges (0.02 by default)\r\n */\r\n @serialize()\r\n public edgeSmoothingValue = 0.02;\r\n\r\n /**\r\n * Gets or sets the minimum value that can be applied to border width (default is 0.1)\r\n */\r\n @serialize()\r\n public borderMinValue = 0.1;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if hover light must be rendered (default is false)\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public renderHoverLight = false;\r\n\r\n /**\r\n * Gets or sets the radius used to render the hover light (default is 0.01)\r\n */\r\n @serialize()\r\n public hoverRadius = 0.01;\r\n\r\n /**\r\n * Gets or sets the color used to render the hover light (default is Color4(0.3, 0.3, 0.3, 1.0))\r\n */\r\n @serializeAsColor4()\r\n public hoverColor = new Color4(0.3, 0.3, 0.3, 1.0);\r\n\r\n /**\r\n * Gets or sets the hover light position in world space (default is Vector3.Zero())\r\n */\r\n @serializeAsVector3()\r\n public hoverPosition = Vector3.Zero();\r\n\r\n @serializeAsTexture(\"albedoTexture\")\r\n private _albedoTexture: Nullable<BaseTexture>;\r\n\r\n /** Gets or sets the texture to use for albedo color */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesAndMiscDirty\")\r\n public albedoTexture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Creates a new Fluent material\r\n * @param name defines the name of the material\r\n * @param scene defines the hosting scene\r\n */\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene);\r\n }\r\n\r\n public override needAlphaBlending(): boolean {\r\n return this.alpha !== 1.0;\r\n }\r\n\r\n public override needAlphaTesting(): boolean {\r\n return false;\r\n }\r\n\r\n public override getAlphaTestTexture(): Nullable<BaseTexture> {\r\n return null;\r\n }\r\n\r\n public override isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n const drawWrapper = subMesh._drawWrapper;\r\n\r\n if (this.isFrozen) {\r\n if (drawWrapper.effect && drawWrapper._wasPreviouslyReady) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n subMesh.materialDefines = new FluentMaterialDefines();\r\n }\r\n\r\n const scene = this.getScene();\r\n const defines = <FluentMaterialDefines>subMesh.materialDefines;\r\n if (!this.checkReadyOnEveryCall && subMesh.effect) {\r\n if (defines._renderId === scene.getRenderId()) {\r\n return true;\r\n }\r\n }\r\n\r\n if (defines._areTexturesDirty) {\r\n defines.INNERGLOW = this.innerGlowColorIntensity > 0;\r\n defines.BORDER = this.renderBorders;\r\n defines.HOVERLIGHT = this.renderHoverLight;\r\n\r\n if (this._albedoTexture) {\r\n if (!this._albedoTexture.isReadyOrNotBlocking()) {\r\n return false;\r\n } else {\r\n defines.TEXTURE = true;\r\n }\r\n } else {\r\n defines.TEXTURE = false;\r\n }\r\n }\r\n\r\n const engine = scene.getEngine();\r\n // Get correct effect\r\n if (defines.isDirty) {\r\n defines.markAsProcessed();\r\n scene.resetCachedMaterial();\r\n\r\n //Attributes\r\n const attribs = [VertexBuffer.PositionKind];\r\n attribs.push(VertexBuffer.NormalKind);\r\n attribs.push(VertexBuffer.UVKind);\r\n\r\n const shaderName = \"fluent\";\r\n\r\n const uniforms = [\r\n \"world\",\r\n \"viewProjection\",\r\n \"innerGlowColor\",\r\n \"albedoColor\",\r\n \"borderWidth\",\r\n \"edgeSmoothingValue\",\r\n \"scaleFactor\",\r\n \"borderMinValue\",\r\n \"hoverColor\",\r\n \"hoverPosition\",\r\n \"hoverRadius\",\r\n \"textureMatrix\",\r\n ];\r\n\r\n const samplers = [\"albedoSampler\"];\r\n const uniformBuffers: string[] = [];\r\n\r\n PrepareUniformsAndSamplersList(<IEffectCreationOptions>{\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: defines,\r\n maxSimultaneousLights: 4,\r\n });\r\n\r\n const join = defines.toString();\r\n subMesh.setEffect(\r\n scene.getEngine().createEffect(\r\n shaderName,\r\n <IEffectCreationOptions>{\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: join,\r\n fallbacks: null,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n indexParameters: { maxSimultaneousLights: 4 },\r\n },\r\n engine\r\n ),\r\n defines,\r\n this._materialContext\r\n );\r\n }\r\n\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n\r\n return true;\r\n }\r\n\r\n public override bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const scene = this.getScene();\r\n\r\n const defines = <FluentMaterialDefines>subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n this._activeEffect = effect;\r\n\r\n // Matrices\r\n this.bindOnlyWorldMatrix(world);\r\n this._activeEffect.setMatrix(\"viewProjection\", scene.getTransformMatrix());\r\n\r\n if (this._mustRebind(scene, effect, subMesh)) {\r\n this._activeEffect.setColor4(\"albedoColor\", this.albedoColor, this.alpha);\r\n\r\n if (defines.INNERGLOW) {\r\n this._activeEffect.setColor4(\"innerGlowColor\", this.innerGlowColor, this.innerGlowColorIntensity);\r\n }\r\n\r\n if (defines.BORDER) {\r\n this._activeEffect.setFloat(\"borderWidth\", this.borderWidth);\r\n this._activeEffect.setFloat(\"edgeSmoothingValue\", this.edgeSmoothingValue);\r\n this._activeEffect.setFloat(\"borderMinValue\", this.borderMinValue);\r\n\r\n mesh.getBoundingInfo().boundingBox.extendSize.multiplyToRef(mesh.scaling, TmpVectors.Vector3[0]);\r\n this._activeEffect.setVector3(\"scaleFactor\", TmpVectors.Vector3[0]);\r\n }\r\n\r\n if (defines.HOVERLIGHT) {\r\n this._activeEffect.setDirectColor4(\"hoverColor\", this.hoverColor);\r\n this._activeEffect.setFloat(\"hoverRadius\", this.hoverRadius);\r\n this._activeEffect.setVector3(\"hoverPosition\", this.hoverPosition);\r\n }\r\n\r\n if (defines.TEXTURE && this._albedoTexture) {\r\n this._activeEffect.setTexture(\"albedoSampler\", this._albedoTexture);\r\n const matrix = this._albedoTexture.getTextureMatrix();\r\n this._activeEffect.setMatrix(\"textureMatrix\", matrix);\r\n }\r\n }\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n public override getActiveTextures(): BaseTexture[] {\r\n const activeTextures = super.getActiveTextures();\r\n\r\n return activeTextures;\r\n }\r\n\r\n public override hasTexture(texture: BaseTexture): boolean {\r\n if (super.hasTexture(texture)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public override dispose(forceDisposeEffect?: boolean): void {\r\n super.dispose(forceDisposeEffect);\r\n }\r\n\r\n public override clone(name: string): FluentMaterial {\r\n return SerializationHelper.Clone(() => new FluentMaterial(name, this.getScene()), this);\r\n }\r\n\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.customType = \"BABYLON.GUI.FluentMaterial\";\r\n return serializationObject;\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"FluentMaterial\";\r\n }\r\n\r\n // Statics\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): FluentMaterial {\r\n return SerializationHelper.Parse(() => new FluentMaterial(source.name, scene), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GUI.FluentMaterial\", FluentMaterial);\r\n","import { type Scene } from \"core/scene\";\r\nimport { type Vector3 } from \"core/Maths/math.vector\";\r\nimport { type TransformNode } from \"core/Meshes/transformNode\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type Control3D } from \"./control3D\";\r\nimport { VolumeBasedPanel } from \"./volumeBasedPanel\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { CreateBox } from \"core/Meshes/Builders/boxBuilder\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { FluentMaterial } from \"../materials/fluent/fluentMaterial\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { type Observer } from \"core/Misc/observable\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { type Container3D } from \"./container3D\";\r\nimport { type TouchHolographicButton } from \"./touchHolographicButton\";\r\n\r\n/**\r\n * Simple menu that can contain holographic buttons\r\n */\r\nexport class TouchHolographicMenu extends VolumeBasedPanel {\r\n protected _backPlate: Mesh;\r\n private _backPlateMaterial: FluentMaterial;\r\n private _pickedPointObserver: Nullable<Observer<Nullable<Vector3>>>;\r\n\r\n private _currentMin: Nullable<Vector3>;\r\n private _currentMax: Nullable<Vector3>;\r\n\r\n private _backPlateMargin = 1.25;\r\n\r\n /**\r\n * Scale for the buttons added to the menu\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected static MENU_BUTTON_SCALE: number = 1;\r\n\r\n /**\r\n * Gets or sets the margin size of the backplate in button size units.\r\n * Setting this to 1, will make the backPlate margin the size of 1 button\r\n */\r\n public get backPlateMargin(): number {\r\n return this._backPlateMargin;\r\n }\r\n\r\n public set backPlateMargin(value: number) {\r\n this._backPlateMargin = value;\r\n\r\n if (this._children.length >= 1) {\r\n for (const control of this.children) {\r\n this._updateCurrentMinMax(control.position);\r\n }\r\n\r\n this._updateMargins();\r\n }\r\n }\r\n\r\n protected override _createNode(scene: Scene): Nullable<TransformNode> {\r\n const node = new Mesh(`menu_${this.name}`, scene);\r\n\r\n this._backPlate = CreateBox(\"backPlate\" + this.name, { size: 1 }, scene);\r\n this._backPlate.parent = node;\r\n\r\n return node;\r\n }\r\n\r\n protected override _affectMaterial(mesh: AbstractMesh) {\r\n this._backPlateMaterial = new FluentMaterial(this.name + \"backPlateMaterial\", mesh.getScene());\r\n this._backPlateMaterial.albedoColor = new Color3(0.08, 0.15, 0.55);\r\n this._backPlateMaterial.renderBorders = true;\r\n this._backPlateMaterial.renderHoverLight = true;\r\n\r\n this._pickedPointObserver = this._host.onPickedPointChangedObservable.add((pickedPoint) => {\r\n if (pickedPoint) {\r\n this._backPlateMaterial.hoverPosition = 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._backPlate.material = this._backPlateMaterial;\r\n }\r\n\r\n protected _mapGridNode(control: Control3D, nodePosition: Vector3) {\r\n // Simple plane mapping for the menu\r\n const mesh = control.mesh;\r\n\r\n if (!mesh) {\r\n return;\r\n }\r\n\r\n control.position = nodePosition.clone();\r\n\r\n this._updateCurrentMinMax(nodePosition);\r\n }\r\n\r\n protected override _finalProcessing() {\r\n this._updateMargins();\r\n }\r\n\r\n private _updateCurrentMinMax(nodePosition: Vector3) {\r\n if (!this._currentMin) {\r\n this._currentMin = nodePosition.clone();\r\n this._currentMax = nodePosition.clone();\r\n }\r\n\r\n this._currentMin.minimizeInPlace(nodePosition);\r\n this._currentMax!.maximizeInPlace(nodePosition);\r\n }\r\n\r\n private _updateMargins() {\r\n if (this._children.length > 0) {\r\n this._currentMin!.addInPlaceFromFloats(-this._cellWidth / 2, -this._cellHeight / 2, 0);\r\n this._currentMax!.addInPlaceFromFloats(this._cellWidth / 2, this._cellHeight / 2, 0);\r\n const extendSize = this._currentMax!.subtract(this._currentMin!);\r\n\r\n // Also add a % margin\r\n this._backPlate.scaling.x = extendSize.x + this._cellWidth * this.backPlateMargin;\r\n this._backPlate.scaling.y = extendSize.y + this._cellHeight * this.backPlateMargin;\r\n this._backPlate.scaling.z = 0.001;\r\n\r\n for (let i = 0; i < this._children.length; i++) {\r\n this._children[i].position.subtractInPlace(this._currentMin!).subtractInPlace(extendSize.scale(0.5));\r\n this._children[i].position.z -= 0.01;\r\n }\r\n }\r\n\r\n this._currentMin = null;\r\n this._currentMax = null;\r\n }\r\n\r\n /**\r\n * Creates a holographic menu GUI 3D control\r\n * @param name name of the menu\r\n */\r\n constructor(name?: string) {\r\n super(name);\r\n }\r\n\r\n /**\r\n * Adds a button to the menu.\r\n * Please note that the back material of the button will be set to transparent as it is attached to the menu.\r\n *\r\n * @param button Button to add\r\n * @returns This menu\r\n */\r\n public addButton(button: TouchHolographicButton): TouchHolographicMenu {\r\n // Block updating the layout until the button is resized (which has to happen after node creation)\r\n const wasLayoutBlocked = this.blockLayout;\r\n if (!wasLayoutBlocked) {\r\n this.blockLayout = true;\r\n }\r\n\r\n super.addControl(button);\r\n\r\n button.isBackplateVisible = false;\r\n button.scaling.scaleInPlace(TouchHolographicMenu.MENU_BUTTON_SCALE);\r\n\r\n // Unblocking the layout triggers the pending layout update that uses the size of the buttons to determine the size of the backing mesh\r\n if (!wasLayoutBlocked) {\r\n this.blockLayout = false;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * This method should not be used directly. It is inherited from `Container3D`.\r\n * Please use `addButton` instead.\r\n * @param _control the control to add\r\n * @returns the current container\r\n */\r\n public override addControl(_control: Control3D): Container3D {\r\n Logger.Warn(\"TouchHolographicMenu can only contain buttons. Please use the method `addButton` instead.\");\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Disposes the menu\r\n */\r\n public override dispose() {\r\n super.dispose();\r\n\r\n this._host.onPickedPointChangedObservable.remove(this._pickedPointObserver);\r\n }\r\n}\r\n","import { type Scene } from \"core/scene\";\r\nimport { type TransformNode } from \"core/Meshes/transformNode\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { TouchHolographicMenu } from \"./touchHolographicMenu\";\r\nimport { HandConstraintBehavior } from \"core/Behaviors/Meshes/handConstraintBehavior\";\r\nimport { type WebXRExperienceHelper } from \"core/XR/webXRExperienceHelper\";\r\n\r\n/**\r\n * Hand menu that displays buttons and floats around the hand.\r\n * @since 5.0.0\r\n */\r\nexport class HandMenu extends TouchHolographicMenu {\r\n private _handConstraintBehavior: HandConstraintBehavior;\r\n\r\n /**\r\n * The hand constraint behavior setting the transformation of this node\r\n */\r\n public get handConstraintBehavior() {\r\n return this._handConstraintBehavior;\r\n }\r\n\r\n protected override _createNode(scene: Scene): Nullable<TransformNode> {\r\n const node = super._createNode(scene)! as Mesh;\r\n\r\n this._handConstraintBehavior.attach(node);\r\n\r\n return node;\r\n }\r\n\r\n /**\r\n * Creates a hand menu GUI 3D control\r\n * @param xr the WebXRExperienceHelper used to link this control to the enabled WebXRHandTracking feature\r\n * @param name name of the hand menu\r\n */\r\n constructor(xr: WebXRExperienceHelper, name?: string) {\r\n super(name);\r\n\r\n this._handConstraintBehavior = new HandConstraintBehavior();\r\n this._handConstraintBehavior.linkToXRExperience(xr);\r\n this.backPlateMargin = 0.15;\r\n this.rows = 3;\r\n }\r\n\r\n /**\r\n * Disposes the hand menu\r\n */\r\n public override dispose() {\r\n super.dispose();\r\n\r\n this._handConstraintBehavior.detach();\r\n }\r\n}\r\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"fluentBackplatePixelShader\";\nconst shader = `uniform vec3 cameraPosition;varying vec3 vPosition;varying vec3 vNormal;varying vec2 vUV;varying vec3 vTangent;varying vec3 vBinormal;varying vec4 vColor;varying vec4 vExtra1;varying vec4 vExtra2;varying vec4 vExtra3;uniform float _Radius_;uniform float _Line_Width_;uniform bool _Absolute_Sizes_;uniform float _Filter_Width_;uniform vec4 _Base_Color_;uniform vec4 _Line_Color_;uniform float _Radius_Top_Left_;uniform float _Radius_Top_Right_;uniform float _Radius_Bottom_Left_;uniform float _Radius_Bottom_Right_;uniform vec3 _Blob_Position_;uniform float _Blob_Intensity_;uniform float _Blob_Near_Size_;uniform float _Blob_Far_Size_;uniform float _Blob_Near_Distance_;uniform float _Blob_Far_Distance_;uniform float _Blob_Fade_Length_;uniform float _Blob_Pulse_;uniform float _Blob_Fade_;uniform sampler2D _Blob_Texture_;uniform vec3 _Blob_Position_2_;uniform float _Blob_Near_Size_2_;uniform float _Blob_Pulse_2_;uniform float _Blob_Fade_2_;uniform float _Rate_;uniform vec4 _Highlight_Color_;uniform float _Highlight_Width_;uniform vec4 _Highlight_Transform_;uniform float _Highlight_;uniform float _Iridescence_Intensity_;uniform float _Iridescence_Edge_Intensity_;uniform float _Angle_;uniform float _Fade_Out_;uniform bool _Reflected_;uniform float _Frequency_;uniform float _Vertical_Offset_;uniform sampler2D _Iridescent_Map_;uniform bool _Use_Global_Left_Index_;uniform bool _Use_Global_Right_Index_;uniform vec4 Global_Left_Index_Tip_Position;uniform vec4 Global_Right_Index_Tip_Position;void Round_Rect_Fragment_B31(\nfloat Radius,\nfloat Line_Width,\nvec4 Line_Color,\nfloat Filter_Width,\nvec2 UV,\nfloat Line_Visibility,\nvec4 Rect_Parms,\nvec4 Fill_Color,\nout vec4 Color)\n{float d=length(max(abs(UV)-Rect_Parms.xy,0.0));float dx=max(fwidth(d)*Filter_Width,0.00001);float g=min(Rect_Parms.z,Rect_Parms.w);float dgrad=max(fwidth(g)*Filter_Width,0.00001);float Inside_Rect=clamp(g/dgrad,0.0,1.0);float inner=clamp((d+dx*0.5-max(Radius-Line_Width,d-dx*0.5))/dx,0.0,1.0);Color=clamp(mix(Fill_Color,Line_Color,inner),0.0,1.0)*Inside_Rect;}\nvoid Blob_Fragment_B71(\nsampler2D Blob_Texture,\nvec4 Blob_Info1,\nvec4 Blob_Info2,\nout vec4 Blob_Color)\n{float k1=dot(Blob_Info1.xy,Blob_Info1.xy);float k2=dot(Blob_Info2.xy,Blob_Info2.xy);vec3 closer=k1<k2 ? vec3(k1,Blob_Info1.z,Blob_Info1.w) : vec3(k2,Blob_Info2.z,Blob_Info2.w);Blob_Color=closer.z*texture(Blob_Texture,vec2(vec2(sqrt(closer.x),closer.y).x,1.0-vec2(sqrt(closer.x),closer.y).y))*clamp(1.0-closer.x,0.0,1.0);}\nvoid Line_Fragment_B48(\nvec4 Base_Color,\nvec4 Highlight_Color,\nfloat Highlight_Width,\nvec3 Line_Vertex,\nfloat Highlight,\nout vec4 Line_Color)\n{float k2=1.0-clamp(abs(Line_Vertex.y/Highlight_Width),0.0,1.0);Line_Color=mix(Base_Color,Highlight_Color,Highlight*k2);}\nvoid Scale_RGB_B54(\nvec4 Color,\nfloat Scalar,\nout vec4 Result)\n{Result=vec4(Scalar,Scalar,Scalar,1)*Color;}\nvoid Conditional_Float_B38(\nbool Which,\nfloat If_True,\nfloat If_False,\nout float Result)\n{Result=Which ? If_True : If_False;}\nvoid main()\n{float R_Q72;float G_Q72;float B_Q72;float A_Q72;R_Q72=vColor.r; G_Q72=vColor.g; B_Q72=vColor.b; A_Q72=vColor.a;vec4 Blob_Color_Q71;\n#if BLOB_ENABLE\nfloat k1=dot(vExtra2.xy,vExtra2.xy);float k2=dot(vExtra3.xy,vExtra3.xy);vec3 closer=k1<k2 ? vec3(k1,vExtra2.z,vExtra2.w) : vec3(k2,vExtra3.z,vExtra3.w);Blob_Color_Q71=closer.z*texture(_Blob_Texture_,vec2(vec2(sqrt(closer.x),closer.y).x,1.0-vec2(sqrt(closer.x),closer.y).y))*clamp(1.0-closer.x,0.0,1.0);\n#else\nBlob_Color_Q71=vec4(0,0,0,0);\n#endif\nvec4 Line_Color_Q48;Line_Fragment_B48(_Line_Color_,_Highlight_Color_,_Highlight_Width_,vTangent,_Highlight_,Line_Color_Q48);float X_Q67;float Y_Q67;X_Q67=vUV.x;Y_Q67=vUV.y;vec3 Incident_Q66=normalize(vPosition-cameraPosition);vec3 Reflected_Q60=reflect(Incident_Q66,vBinormal);float Product_Q63=Y_Q67*_Vertical_Offset_;float Dot_Q68=dot(Incident_Q66, Reflected_Q60);float Dot_Q57=dot(vNormal, Incident_Q66);float Result_Q38;Conditional_Float_B38(_Reflected_,Dot_Q68,Dot_Q57,Result_Q38);float Product_Q64=Result_Q38*_Frequency_;float Sum_Q69=Product_Q64+1.0;float Product_Q70=Sum_Q69*0.5;float Sum_Q62=Product_Q63+Product_Q70;float FractF_Q59=fract(Sum_Q62);vec2 Vec2_Q65=vec2(FractF_Q59,0.5);vec4 Color_Q58;\n#if IRIDESCENT_MAP_ENABLE\nColor_Q58=texture(_Iridescent_Map_,Vec2_Q65);\n#else\nColor_Q58=vec4(0,0,0,0);\n#endif\nvec4 Result_Q54;Scale_RGB_B54(Color_Q58,_Iridescence_Edge_Intensity_,Result_Q54);vec4 Result_Q55;Scale_RGB_B54(Color_Q58,_Iridescence_Intensity_,Result_Q55);vec4 Base_And_Iridescent_Q53;Base_And_Iridescent_Q53=Line_Color_Q48+vec4(Result_Q54.rgb,0.0);vec4 Base_And_Iridescent_Q56;Base_And_Iridescent_Q56=_Base_Color_+vec4(Result_Q55.rgb,0.0);vec4 Result_Q52=Base_And_Iridescent_Q53; Result_Q52.a=1.0;vec4 Result_Q35=Blob_Color_Q71+(1.0-Blob_Color_Q71.a)*Base_And_Iridescent_Q56;vec4 Color_Q31;Round_Rect_Fragment_B31(R_Q72,G_Q72,Result_Q52,_Filter_Width_,vUV,1.0,vExtra1,Result_Q35,Color_Q31);vec4 Result_Q47=_Fade_Out_*Color_Q31;vec4 Out_Color=Result_Q47;float Clip_Threshold=0.001;bool To_sRGB=false;gl_FragColor=Out_Color;}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const fluentBackplatePixelShader = { name, shader };\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"fluentBackplateVertexShader\";\nconst shader = `uniform mat4 world;uniform mat4 viewProjection;uniform vec3 cameraPosition;attribute vec3 position;attribute vec3 normal;\n#ifdef TANGENT\nattribute vec3 tangent;\n#else\nconst vec3 tangent=vec3(0.);\n#endif\nuniform float _Radius_;uniform float _Line_Width_;uniform bool _Absolute_Sizes_;uniform float _Filter_Width_;uniform vec4 _Base_Color_;uniform vec4 _Line_Color_;uniform float _Radius_Top_Left_;uniform float _Radius_Top_Right_;uniform float _Radius_Bottom_Left_;uniform float _Radius_Bottom_Right_;uniform vec3 _Blob_Position_;uniform float _Blob_Intensity_;uniform float _Blob_Near_Size_;uniform float _Blob_Far_Size_;uniform float _Blob_Near_Distance_;uniform float _Blob_Far_Distance_;uniform float _Blob_Fade_Length_;uniform float _Blob_Pulse_;uniform float _Blob_Fade_;uniform sampler2D _Blob_Texture_;uniform vec3 _Blob_Position_2_;uniform float _Blob_Near_Size_2_;uniform float _Blob_Pulse_2_;uniform float _Blob_Fade_2_;uniform float _Rate_;uniform vec4 _Highlight_Color_;uniform float _Highlight_Width_;uniform vec4 _Highlight_Transform_;uniform float _Highlight_;uniform float _Iridescence_Intensity_;uniform float _Iridescence_Edge_Intensity_;uniform float _Angle_;uniform float _Fade_Out_;uniform bool _Reflected_;uniform float _Frequency_;uniform float _Vertical_Offset_;uniform sampler2D _Iridescent_Map_;uniform bool _Use_Global_Left_Index_;uniform bool _Use_Global_Right_Index_;uniform vec4 Global_Left_Index_Tip_Position;uniform vec4 Global_Right_Index_Tip_Position;varying vec3 vPosition;varying vec3 vNormal;varying vec2 vUV;varying vec3 vTangent;varying vec3 vBinormal;varying vec4 vColor;varying vec4 vExtra1;varying vec4 vExtra2;varying vec4 vExtra3;void Object_To_World_Pos_B115(\nvec3 Pos_Object,\nout vec3 Pos_World)\n{Pos_World=(world*vec4(Pos_Object,1.0)).xyz;}\nvoid PickDir_B140(\nfloat Degrees,\nvec3 DirX,\nvec3 DirY,\nout vec3 Dir)\n{float a=Degrees*3.14159/180.0;Dir=cos(a)*DirX+sin(a)*DirY;}\nvoid Round_Rect_Vertex_B139(\nvec2 UV,\nfloat Radius,\nfloat Margin,\nfloat Anisotropy,\nfloat Gradient1,\nfloat Gradient2,\nout vec2 Rect_UV,\nout vec4 Rect_Parms,\nout vec2 Scale_XY,\nout vec2 Line_UV)\n{Scale_XY=vec2(Anisotropy,1.0);Line_UV=(UV-vec2(0.5,0.5));Rect_UV=Line_UV*Scale_XY;Rect_Parms.xy=Scale_XY*0.5-vec2(Radius,Radius)-vec2(Margin,Margin);Rect_Parms.z=Gradient1; \nRect_Parms.w=Gradient2;}\nvoid Line_Vertex_B135(\nvec2 Scale_XY,\nvec2 UV,\nfloat Time,\nfloat Rate,\nvec4 Highlight_Transform,\nout vec3 Line_Vertex)\n{float angle2=(Rate*Time)*2.0*3.1416;float sinAngle2=sin(angle2);float cosAngle2=cos(angle2);vec2 xformUV=UV*Highlight_Transform.xy+Highlight_Transform.zw;Line_Vertex.x=0.0;Line_Vertex.y=cosAngle2*xformUV.x-sinAngle2*xformUV.y;Line_Vertex.z=0.0; }\nvoid Blob_Vertex_B180(\nvec3 Position,\nvec3 Normal,\nvec3 Tangent,\nvec3 Bitangent,\nvec3 Blob_Position,\nfloat Intensity,\nfloat Blob_Near_Size,\nfloat Blob_Far_Size,\nfloat Blob_Near_Distance,\nfloat Blob_Far_Distance,\nfloat Blob_Fade_Length,\nfloat Blob_Pulse,\nfloat Blob_Fade,\nout vec4 Blob_Info)\n{vec3 blob=Blob_Position;vec3 delta=blob-Position;float dist=dot(Normal,delta);float lerpValue=clamp((abs(dist)-Blob_Near_Distance)/(Blob_Far_Distance-Blob_Near_Distance),0.0,1.0);float fadeValue=1.0-clamp((abs(dist)-Blob_Far_Distance)/Blob_Fade_Length,0.0,1.0);float size=Blob_Near_Size+(Blob_Far_Size-Blob_Near_Size)*lerpValue;vec2 blobXY=vec2(dot(delta,Tangent),dot(delta,Bitangent))/(0.0001+size);float Fade=fadeValue*Intensity*Blob_Fade;float Distance=(lerpValue*0.5+0.5)*(1.0-Blob_Pulse);Blob_Info=vec4(blobXY.x,blobXY.y,Distance,Fade);}\nvoid Move_Verts_B129(\nfloat Anisotropy,\nvec3 P,\nfloat Radius,\nout vec3 New_P,\nout vec2 New_UV,\nout float Radial_Gradient,\nout vec3 Radial_Dir)\n{vec2 UV=P.xy*2.0+0.5;vec2 center=clamp(UV,0.0,1.0);vec2 delta=UV-center;vec2 r2=2.0*vec2(Radius/Anisotropy,Radius);New_UV=center+r2*(UV-2.0*center+0.5);New_P=vec3(New_UV-0.5,P.z);Radial_Gradient=1.0-length(delta)*2.0;Radial_Dir=vec3(delta*r2,0.0);}\nvoid Object_To_World_Dir_B132(\nvec3 Dir_Object,\nout vec3 Binormal_World,\nout vec3 Binormal_World_N,\nout float Binormal_Length)\n{Binormal_World=(world*vec4(Dir_Object,0.0)).xyz;Binormal_Length=length(Binormal_World);Binormal_World_N=Binormal_World/Binormal_Length;}\nvoid RelativeOrAbsoluteDetail_B147(\nfloat Nominal_Radius,\nfloat Nominal_LineWidth,\nbool Absolute_Measurements,\nfloat Height,\nout float Radius,\nout float Line_Width)\n{float scale=Absolute_Measurements ? 1.0/Height : 1.0;Radius=Nominal_Radius*scale;Line_Width=Nominal_LineWidth*scale;}\nvoid Edge_AA_Vertex_B130(\nvec3 Position_World,\nvec3 Position_Object,\nvec3 Normal_Object,\nvec3 Eye,\nfloat Radial_Gradient,\nvec3 Radial_Dir,\nvec3 Tangent,\nout float Gradient1,\nout float Gradient2)\n{vec3 I=(Eye-Position_World);vec3 T=(world* vec4(Tangent,0.0)).xyz;float g=(dot(T,I)<0.0) ? 0.0 : 1.0;if (Normal_Object.z==0.0) { \nGradient1=Position_Object.z>0.0 ? g : 1.0;Gradient2=Position_Object.z>0.0 ? 1.0 : g;} else {Gradient1=g+(1.0-g)*(Radial_Gradient);Gradient2=1.0;}}\nvoid Pick_Radius_B144(\nfloat Radius,\nfloat Radius_Top_Left,\nfloat Radius_Top_Right,\nfloat Radius_Bottom_Left,\nfloat Radius_Bottom_Right,\nvec3 Position,\nout float Result)\n{bool whichY=Position.y>0.0;Result=Position.x<0.0 ? (whichY ? Radius_Top_Left : Radius_Bottom_Left) : (whichY ? Radius_Top_Right : Radius_Bottom_Right);Result*=Radius;}\nvoid main()\n{vec3 Nrm_World_Q128;Nrm_World_Q128=normalize((world*vec4(normal,0.0)).xyz);vec3 Tangent_World_Q131;vec3 Tangent_World_N_Q131;float Tangent_Length_Q131;Tangent_World_Q131=(world*vec4(vec3(1,0,0),0.0)).xyz;Tangent_Length_Q131=length(Tangent_World_Q131);Tangent_World_N_Q131=Tangent_World_Q131/Tangent_Length_Q131;vec3 Binormal_World_Q132;vec3 Binormal_World_N_Q132;float Binormal_Length_Q132;Object_To_World_Dir_B132(vec3(0,1,0),Binormal_World_Q132,Binormal_World_N_Q132,Binormal_Length_Q132);float Anisotropy_Q133=Tangent_Length_Q131/Binormal_Length_Q132;vec3 Result_Q177;Result_Q177=mix(_Blob_Position_,Global_Left_Index_Tip_Position.xyz,float(_Use_Global_Left_Index_));vec3 Result_Q178;Result_Q178=mix(_Blob_Position_2_,Global_Right_Index_Tip_Position.xyz,float(_Use_Global_Right_Index_));float Result_Q144;Pick_Radius_B144(_Radius_,_Radius_Top_Left_,_Radius_Top_Right_,_Radius_Bottom_Left_,_Radius_Bottom_Right_,position,Result_Q144);vec3 Dir_Q140;PickDir_B140(_Angle_,Tangent_World_N_Q131,Binormal_World_N_Q132,Dir_Q140);float Radius_Q147;float Line_Width_Q147;RelativeOrAbsoluteDetail_B147(Result_Q144,_Line_Width_,_Absolute_Sizes_,Binormal_Length_Q132,Radius_Q147,Line_Width_Q147);vec4 Out_Color_Q145=vec4(Radius_Q147,Line_Width_Q147,0,1);vec3 New_P_Q129;vec2 New_UV_Q129;float Radial_Gradient_Q129;vec3 Radial_Dir_Q129;Move_Verts_B129(Anisotropy_Q133,position,Radius_Q147,New_P_Q129,New_UV_Q129,Radial_Gradient_Q129,Radial_Dir_Q129);vec3 Pos_World_Q115;Object_To_World_Pos_B115(New_P_Q129,Pos_World_Q115);vec4 Blob_Info_Q180;\n#if BLOB_ENABLE\nBlob_Vertex_B180(Pos_World_Q115,Nrm_World_Q128,Tangent_World_N_Q131,Binormal_World_N_Q132,Result_Q177,_Blob_Intensity_,_Blob_Near_Size_,_Blob_Far_Size_,_Blob_Near_Distance_,_Blob_Far_Distance_,_Blob_Fade_Length_,_Blob_Pulse_,_Blob_Fade_,Blob_Info_Q180);\n#else\nBlob_Info_Q180=vec4(0,0,0,0);\n#endif\nvec4 Blob_Info_Q181;\n#if BLOB_ENABLE_2\nBlob_Vertex_B180(Pos_World_Q115,Nrm_World_Q128,Tangent_World_N_Q131,Binormal_World_N_Q132,Result_Q178,_Blob_Intensity_,_Blob_Near_Size_2_,_Blob_Far_Size_,_Blob_Near_Distance_,_Blob_Far_Distance_,_Blob_Fade_Length_,_Blob_Pulse_2_,_Blob_Fade_2_,Blob_Info_Q181);\n#else\nBlob_Info_Q181=vec4(0,0,0,0);\n#endif\nfloat Gradient1_Q130;float Gradient2_Q130;\n#if SMOOTH_EDGES\nEdge_AA_Vertex_B130(Pos_World_Q115,position,normal,cameraPosition,Radial_Gradient_Q129,Radial_Dir_Q129,tangent,Gradient1_Q130,Gradient2_Q130);\n#else\nGradient1_Q130=1.0;Gradient2_Q130=1.0;\n#endif\nvec2 Rect_UV_Q139;vec4 Rect_Parms_Q139;vec2 Scale_XY_Q139;vec2 Line_UV_Q139;Round_Rect_Vertex_B139(New_UV_Q129,Radius_Q147,0.0,Anisotropy_Q133,Gradient1_Q130,Gradient2_Q130,Rect_UV_Q139,Rect_Parms_Q139,Scale_XY_Q139,Line_UV_Q139);vec3 Line_Vertex_Q135;Line_Vertex_B135(Scale_XY_Q139,Line_UV_Q139,0.0,_Rate_,_Highlight_Transform_,Line_Vertex_Q135);vec3 Position=Pos_World_Q115;vec3 Normal=Dir_Q140;vec2 UV=Rect_UV_Q139;vec3 Tangent=Line_Vertex_Q135;vec3 Binormal=Nrm_World_Q128;vec4 Color=Out_Color_Q145;vec4 Extra1=Rect_Parms_Q139;vec4 Extra2=Blob_Info_Q180;vec4 Extra3=Blob_Info_Q181;gl_Position=viewProjection*vec4(Position,1);vPosition=Position;vNormal=Normal;vUV=UV;vTangent=Tangent;vBinormal=Binormal;vColor=Color;vExtra1=Extra1;vExtra2=Extra2;vExtra3=Extra3;}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const fluentBackplateVertexShader = { name, shader };\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type Nullable } from \"core/types\";\r\nimport { serialize, serializeAsVector3 } from \"core/Misc/decorators\";\r\nimport { SerializationHelper } from \"core/Misc/decorators.serialization\";\r\nimport { type Matrix, Vector3, Vector4 } from \"core/Maths/math.vector\";\r\nimport { type IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { type IEffectCreationOptions } from \"core/Materials/effect\";\r\nimport { PushMaterial } from \"core/Materials/pushMaterial\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { type SubMesh } from \"core/Meshes/subMesh\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { Color4 } from \"core/Maths/math.color\";\r\nimport { EffectFallbacks } from \"core/Materials/effectFallbacks\";\r\nimport { Constants } from \"core/Engines/constants\";\r\n\r\nimport \"./shaders/fluentBackplate.fragment\";\r\nimport \"./shaders/fluentBackplate.vertex\";\r\nimport { HandleFallbacksForShadows, PrepareAttributesForInstances, PrepareDefinesForAttributes, PrepareUniformsAndSamplersList } from \"core/Materials/materialHelper.functions\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\n/** @internal */\r\nclass FluentBackplateMaterialDefines extends MaterialDefines {\r\n public BLOB_ENABLE = true;\r\n public BLOB_ENABLE_2 = true;\r\n public SMOOTH_EDGES = true;\r\n public IRIDESCENT_MAP_ENABLE = true;\r\n\r\n constructor() {\r\n super();\r\n this._needNormals = true;\r\n this.rebuild();\r\n }\r\n}\r\n\r\n/**\r\n * Class used to render square buttons with fluent design\r\n */\r\nexport class FluentBackplateMaterial extends PushMaterial {\r\n /**\r\n * URL pointing to the texture used to define the coloring for the fluent blob effect.\r\n */\r\n public static BLOB_TEXTURE_URL = \"https://assets.babylonjs.com/core/MRTK/mrtk-fluent-backplate-blob.png\";\r\n\r\n /**\r\n * URL pointing to the texture used to define iridescent map.\r\n */\r\n public static IM_TEXTURE_URL = \"https://assets.babylonjs.com/core/MRTK/mrtk-fluent-backplate-iridescence.png\";\r\n\r\n private _blobTexture: Texture;\r\n private _iridescentMap: Texture;\r\n\r\n /**\r\n * Gets or sets the corner radius on the backplate. Best to keep this value between 0.01 and 0.5. Default is 0.03.\r\n */\r\n @serialize()\r\n public radius = 0.03;\r\n\r\n /**\r\n * Gets or sets the line width of the backplate.\r\n */\r\n @serialize()\r\n public lineWidth = 0.01;\r\n\r\n /**\r\n * Gets or sets whether to use absolute sizes when calculating effects on the backplate.\r\n * Since desktop and VR/AR have different relative sizes, it's usually best to keep this false.\r\n */\r\n @serialize()\r\n public absoluteSizes = false;\r\n\r\n /** @internal */\r\n public _filterWidth = 1;\r\n\r\n /**\r\n * Gets or sets the base color of the backplate.\r\n */\r\n @serialize()\r\n public baseColor = new Color4(0.0392157, 0.0666667, 0.207843, 1);\r\n\r\n /**\r\n * Gets or sets the line color of the backplate.\r\n */\r\n @serialize()\r\n public lineColor = new Color4(0.14902, 0.133333, 0.384314, 1);\r\n\r\n /**\r\n * Gets or sets the intensity of the fluent hover glow effect.\r\n */\r\n @serialize()\r\n public blobIntensity = 0.98;\r\n\r\n /**\r\n * Gets or sets the far size of the fluent hover glow effect.\r\n */\r\n @serialize()\r\n public blobFarSize = 0.04;\r\n\r\n /**\r\n * Gets or sets the distance considered \"near\" to the backplate, which controls the size of the fluent hover glow effect (see blobNearSize).\r\n */\r\n @serialize()\r\n public blobNearDistance = 0;\r\n\r\n /**\r\n * Gets or sets the distance considered \"far\" from the backplate, which controls the size of the fluent hover glow effect (see blobFarSize).\r\n */\r\n @serialize()\r\n public blobFarDistance = 0.08;\r\n\r\n /**\r\n * Gets or sets the length of the fluent hover glow effect fade.\r\n */\r\n @serialize()\r\n public blobFadeLength = 0.08;\r\n\r\n /**\r\n * Gets or sets the size of the fluent hover glow effect when the left pointer is considered \"near\" to the backplate (see blobNearDistance).\r\n */\r\n @serialize()\r\n public blobNearSize = 0.22;\r\n\r\n /**\r\n * Gets or sets the progress of the fluent hover glow effect selection animation corresponding to the left pointer (0.0 - 1.0).\r\n */\r\n @serialize()\r\n public blobPulse = 0;\r\n\r\n /**\r\n * Gets or sets the opacity of the fluent hover glow effect corresponding to the left pointer (0.0 - 1.0). Default is 0.\r\n */\r\n @serialize()\r\n public blobFade = 0;\r\n\r\n /**\r\n * Gets or sets the size of the fluent hover glow effect when the right pointer is considered \"near\" to the backplate (see blobNearDistance).\r\n */\r\n @serialize()\r\n public blobNearSize2 = 0.22;\r\n\r\n /**\r\n * Gets or sets the progress of the fluent hover glow effect selection animation corresponding to the right pointer (0.0 - 1.0).\r\n */\r\n @serialize()\r\n public blobPulse2 = 0;\r\n\r\n /**\r\n * Gets or sets the opacity of the fluent hover glow effect corresponding to the right pointer (0.0 - 1.0). Default is 0.\r\n */\r\n @serialize()\r\n public blobFade2 = 0;\r\n\r\n /** @internal */\r\n public _rate = 0.135;\r\n\r\n /**\r\n * Gets or sets the color of the highlights on the backplate line.\r\n */\r\n @serialize()\r\n public highlightColor = new Color4(0.98, 0.98, 0.98, 1);\r\n\r\n /**\r\n * Gets or sets the width of the highlights on the backplate line.\r\n */\r\n @serialize()\r\n public highlightWidth = 0.25;\r\n\r\n /** @internal */\r\n public _highlightTransform = new Vector4(1, 1, 0, 0);\r\n\r\n /** @internal */\r\n public _highlight = 1;\r\n\r\n /**\r\n * Gets or sets the intensity of the iridescence effect.\r\n */\r\n @serialize()\r\n public iridescenceIntensity = 0;\r\n\r\n /**\r\n * Gets or sets the intensity of the iridescence effect on the backplate edges.\r\n */\r\n @serialize()\r\n public iridescenceEdgeIntensity = 1;\r\n\r\n /** @internal */\r\n public _angle = -45;\r\n\r\n /**\r\n * Gets or sets the opacity of the backplate (0.0 - 1.0).\r\n */\r\n @serialize()\r\n public fadeOut = 1;\r\n\r\n /** @internal */\r\n public _reflected = true;\r\n\r\n /** @internal */\r\n public _frequency = 1;\r\n\r\n /** @internal */\r\n public _verticalOffset = 0;\r\n\r\n /**\r\n * Gets or sets the world-space position of the tip of the left index finger.\r\n */\r\n @serializeAsVector3()\r\n public globalLeftIndexTipPosition = Vector3.Zero();\r\n private _globalLeftIndexTipPosition4 = Vector4.Zero();\r\n\r\n /**\r\n * Gets or sets the world-space position of the tip of the right index finger.\r\n */\r\n @serializeAsVector3()\r\n public globalRightIndexTipPosition = Vector3.Zero();\r\n private _globalRightIndexTipPosition4 = Vector4.Zero();\r\n\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene);\r\n this.alphaMode = Constants.ALPHA_DISABLE;\r\n this.backFaceCulling = false;\r\n const blobTextureUrl = Tools.GetAssetUrl(FluentBackplateMaterial.BLOB_TEXTURE_URL);\r\n const iridescentMapUrl = Tools.GetAssetUrl(FluentBackplateMaterial.IM_TEXTURE_URL);\r\n this._blobTexture = new Texture(blobTextureUrl, this.getScene(), true, false, Texture.NEAREST_SAMPLINGMODE);\r\n this._iridescentMap = new Texture(iridescentMapUrl, this.getScene(), true, false, Texture.NEAREST_SAMPLINGMODE);\r\n }\r\n\r\n public override needAlphaBlending(): boolean {\r\n return false;\r\n }\r\n\r\n public override needAlphaTesting(): boolean {\r\n return false;\r\n }\r\n\r\n public override getAlphaTestTexture(): Nullable<BaseTexture> {\r\n return null;\r\n }\r\n\r\n public override isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n const drawWrapper = subMesh._drawWrapper;\r\n\r\n if (this.isFrozen) {\r\n if (drawWrapper.effect && drawWrapper._wasPreviouslyReady) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!this._blobTexture.isReady() || !this._iridescentMap.isReady()) {\r\n return false;\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n subMesh.materialDefines = new FluentBackplateMaterialDefines();\r\n }\r\n\r\n const defines = <FluentBackplateMaterialDefines>subMesh.materialDefines;\r\n const scene = this.getScene();\r\n\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n // Attribs\r\n PrepareDefinesForAttributes(mesh, defines, false, false);\r\n\r\n // Get correct effect\r\n if (defines.isDirty) {\r\n defines.markAsProcessed();\r\n\r\n scene.resetCachedMaterial();\r\n\r\n // Fallbacks\r\n const fallbacks = new EffectFallbacks();\r\n if (defines.FOG) {\r\n fallbacks.addFallback(1, \"FOG\");\r\n }\r\n\r\n HandleFallbacksForShadows(defines, fallbacks);\r\n\r\n defines.IMAGEPROCESSINGPOSTPROCESS = scene.imageProcessingConfiguration.applyByPostProcess;\r\n\r\n //Attributes\r\n const attribs = [VertexBuffer.PositionKind];\r\n\r\n if (defines.NORMAL) {\r\n attribs.push(VertexBuffer.NormalKind);\r\n }\r\n\r\n if (defines.UV1) {\r\n attribs.push(VertexBuffer.UVKind);\r\n }\r\n\r\n if (defines.UV2) {\r\n attribs.push(VertexBuffer.UV2Kind);\r\n }\r\n\r\n if (defines.VERTEXCOLOR) {\r\n attribs.push(VertexBuffer.ColorKind);\r\n }\r\n\r\n if (defines.TANGENT) {\r\n attribs.push(VertexBuffer.TangentKind);\r\n }\r\n\r\n PrepareAttributesForInstances(attribs, defines);\r\n\r\n // Legacy browser patch\r\n const shaderName = \"fluentBackplate\";\r\n const join = defines.toString();\r\n\r\n const uniforms = [\r\n \"world\",\r\n \"viewProjection\",\r\n \"cameraPosition\",\r\n \"_Radius_\",\r\n \"_Line_Width_\",\r\n \"_Absolute_Sizes_\",\r\n \"_Filter_Width_\",\r\n \"_Base_Color_\",\r\n \"_Line_Color_\",\r\n \"_Radius_Top_Left_\",\r\n \"_Radius_Top_Right_\",\r\n \"_Radius_Bottom_Left_\",\r\n \"_Radius_Bottom_Right_\",\r\n \"_Blob_Position_\",\r\n \"_Blob_Intensity_\",\r\n \"_Blob_Near_Size_\",\r\n \"_Blob_Far_Size_\",\r\n \"_Blob_Near_Distance_\",\r\n \"_Blob_Far_Distance_\",\r\n \"_Blob_Fade_Length_\",\r\n \"_Blob_Pulse_\",\r\n \"_Blob_Fade_\",\r\n \"_Blob_Texture_\",\r\n \"_Blob_Position_2_\",\r\n \"_Blob_Near_Size_2_\",\r\n \"_Blob_Pulse_2_\",\r\n \"_Blob_Fade_2_\",\r\n \"_Rate_\",\r\n \"_Highlight_Color_\",\r\n \"_Highlight_Width_\",\r\n \"_Highlight_Transform_\",\r\n \"_Highlight_\",\r\n \"_Iridescence_Intensity_\",\r\n \"_Iridescence_Edge_Intensity_\",\r\n \"_Angle_\",\r\n \"_Fade_Out_\",\r\n \"_Reflected_\",\r\n \"_Frequency_\",\r\n \"_Vertical_Offset_\",\r\n \"_Iridescent_Map_\",\r\n \"_Use_Global_Left_Index_\",\r\n \"_Use_Global_Right_Index_\",\r\n \"Global_Left_Index_Tip_Position\",\r\n \"Global_Right_Index_Tip_Position\",\r\n ];\r\n const samplers: string[] = [\"_Blob_Texture_\", \"_Iridescent_Map_\"];\r\n const uniformBuffers: string[] = [];\r\n\r\n PrepareUniformsAndSamplersList(<IEffectCreationOptions>{\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: defines,\r\n maxSimultaneousLights: 4,\r\n });\r\n\r\n subMesh.setEffect(\r\n scene.getEngine().createEffect(\r\n shaderName,\r\n <IEffectCreationOptions>{\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: join,\r\n fallbacks: fallbacks,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n indexParameters: { maxSimultaneousLights: 4 },\r\n },\r\n engine\r\n ),\r\n defines,\r\n this._materialContext\r\n );\r\n }\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n\r\n return true;\r\n }\r\n\r\n public override bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const defines = <FluentBackplateMaterialDefines>subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n\r\n this._activeEffect = effect;\r\n\r\n // Matrices\r\n this.bindOnlyWorldMatrix(world);\r\n this._activeEffect.setMatrix(\"viewProjection\", this.getScene().getTransformMatrix());\r\n this._activeEffect.setVector3(\"cameraPosition\", this.getScene().activeCamera?.position ?? Vector3.ZeroReadOnly);\r\n\r\n // \"Round Rect\"\r\n this._activeEffect.setFloat(\"_Radius_\", this.radius);\r\n this._activeEffect.setFloat(\"_Line_Width_\", this.lineWidth);\r\n this._activeEffect.setFloat(\"_Absolute_Sizes_\", this.absoluteSizes ? 1.0 : 0.0);\r\n this._activeEffect.setFloat(\"_Filter_Width_\", this._filterWidth);\r\n this._activeEffect.setDirectColor4(\"_Base_Color_\", this.baseColor);\r\n this._activeEffect.setDirectColor4(\"_Line_Color_\", this.lineColor);\r\n\r\n // \"Radii Multipliers\"\r\n this._activeEffect.setFloat(\"_Radius_Top_Left_\", 1);\r\n this._activeEffect.setFloat(\"_Radius_Top_Right_\", 1.0);\r\n this._activeEffect.setFloat(\"_Radius_Bottom_Left_\", 1.0);\r\n this._activeEffect.setFloat(\"_Radius_Bottom_Right_\", 1.0);\r\n\r\n // \"Blob\"\r\n //define BLOB_ENABLE true;\r\n this._activeEffect.setFloat(\"_Blob_Intensity_\", this.blobIntensity);\r\n this._activeEffect.setFloat(\"_Blob_Near_Size_\", this.blobNearSize);\r\n this._activeEffect.setFloat(\"_Blob_Far_Size_\", this.blobFarSize);\r\n this._activeEffect.setFloat(\"_Blob_Near_Distance_\", this.blobNearDistance);\r\n this._activeEffect.setFloat(\"_Blob_Far_Distance_\", this.blobFarDistance);\r\n this._activeEffect.setFloat(\"_Blob_Fade_Length_\", this.blobFadeLength);\r\n this._activeEffect.setFloat(\"_Blob_Pulse_\", this.blobPulse);\r\n this._activeEffect.setFloat(\"_Blob_Fade_\", this.blobFade);\r\n\r\n // \"Blob Texture\"\r\n this._activeEffect.setTexture(\"_Blob_Texture_\", this._blobTexture);\r\n\r\n // \"Blob 2\"\r\n //define BLOB_ENABLE_2 true;\r\n this._activeEffect.setFloat(\"_Blob_Near_Size_2_\", this.blobNearSize2);\r\n this._activeEffect.setFloat(\"_Blob_Pulse_2_\", this.blobPulse2);\r\n this._activeEffect.setFloat(\"_Blob_Fade_2_\", this.blobFade2);\r\n\r\n // \"Line Highlight\"\r\n this._activeEffect.setFloat(\"_Rate_\", this._rate);\r\n this._activeEffect.setDirectColor4(\"_Highlight_Color_\", this.highlightColor);\r\n this._activeEffect.setFloat(\"_Highlight_Width_\", this.highlightWidth);\r\n this._activeEffect.setVector4(\"_Highlight_Transform_\", this._highlightTransform);\r\n this._activeEffect.setFloat(\"_Highlight_\", this._highlight);\r\n\r\n // \"Iridescence\"\r\n this._activeEffect.setFloat(\"_Iridescence_Intensity_\", this.iridescenceIntensity);\r\n this._activeEffect.setFloat(\"_Iridescence_Edge_Intensity_\", this.iridescenceEdgeIntensity);\r\n this._activeEffect.setFloat(\"_Angle_\", this._angle);\r\n\r\n // \"Fade\"\r\n this._activeEffect.setFloat(\"_Fade_Out_\", this.fadeOut);\r\n\r\n // \"Antialiasing\"\r\n //define SMOOTH_EDGES true;\r\n\r\n // \"ChooseAngle\"\r\n this._activeEffect.setFloat(\"_Reflected_\", this._reflected ? 1.0 : 0.0);\r\n\r\n // \"Multiply\"\r\n this._activeEffect.setFloat(\"_Frequency_\", this._frequency);\r\n this._activeEffect.setFloat(\"_Vertical_Offset_\", this._verticalOffset);\r\n\r\n // \"Color Texture\"\r\n //define IRIDESCENT_MAP_ENABLE true;\r\n this._activeEffect.setTexture(\"_Iridescent_Map_\", this._iridescentMap);\r\n\r\n // \"Global\"\r\n this._activeEffect.setFloat(\"_Use_Global_Left_Index_\", 1.0);\r\n this._activeEffect.setFloat(\"_Use_Global_Right_Index_\", 1.0);\r\n\r\n this._globalLeftIndexTipPosition4.set(this.globalLeftIndexTipPosition.x, this.globalLeftIndexTipPosition.y, this.globalLeftIndexTipPosition.z, 1.0);\r\n this._activeEffect.setVector4(\"Global_Left_Index_Tip_Position\", this._globalLeftIndexTipPosition4);\r\n\r\n this._globalRightIndexTipPosition4.set(this.globalRightIndexTipPosition.x, this.globalRightIndexTipPosition.y, this.globalRightIndexTipPosition.z, 1.0);\r\n this._activeEffect.setVector4(\"Global_Right_Index_Tip_Position\", this._globalRightIndexTipPosition4);\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n /**\r\n * Get the list of animatables in the material.\r\n * @returns the list of animatables object used in the material\r\n */\r\n public override getAnimatables(): IAnimatable[] {\r\n return [];\r\n }\r\n\r\n public override dispose(forceDisposeEffect?: boolean): void {\r\n super.dispose(forceDisposeEffect);\r\n\r\n this._blobTexture.dispose();\r\n this._iridescentMap.dispose();\r\n }\r\n\r\n public override clone(name: string): FluentBackplateMaterial {\r\n return SerializationHelper.Clone(() => new FluentBackplateMaterial(name, this.getScene()), this);\r\n }\r\n\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.customType = \"BABYLON.FluentBackplateMaterial\";\r\n return serializationObject;\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"FluentBackplateMaterial\";\r\n }\r\n\r\n // Statics\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): FluentBackplateMaterial {\r\n return SerializationHelper.Parse(() => new FluentBackplateMaterial(source.name, scene), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GUI.FluentBackplateMaterial\", FluentBackplateMaterial);\r\n","import { type TransformNode } from \"core/Meshes/transformNode\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { CreateBox } from \"core/Meshes/Builders/boxBuilder\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { FluentBackplateMaterial } from \"../materials/fluentBackplate/fluentBackplateMaterial\";\r\nimport { Control3D } from \"./control3D\";\r\nimport { SceneLoader } from \"core/Loading/sceneLoader\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\n/**\r\n * Class used to create a holographic backplate in 3D\r\n * @since 5.0.0\r\n */\r\nexport class HolographicBackplate extends Control3D {\r\n /**\r\n * Base Url for the button model.\r\n */\r\n public static MODEL_BASE_URL: string = \"https://assets.babylonjs.com/core/MRTK/\";\r\n /**\r\n * File name for the button model.\r\n */\r\n public static MODEL_FILENAME: string = \"mrtk-fluent-backplate.glb\";\r\n\r\n private _model: AbstractMesh;\r\n private _material: FluentBackplateMaterial;\r\n\r\n /**\r\n * Rendering ground id of the backplate mesh.\r\n */\r\n public set renderingGroupId(id: number) {\r\n this._model.renderingGroupId = id;\r\n }\r\n public get renderingGroupId(): number {\r\n return this._model.renderingGroupId;\r\n }\r\n\r\n /**\r\n * Gets the material used by the backplate\r\n */\r\n public get material(): FluentBackplateMaterial {\r\n return this._material;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this backplate shares its material with other HolographicBackplates\r\n */\r\n public get shareMaterials(): boolean {\r\n return this._shareMaterials;\r\n }\r\n\r\n /**\r\n * Creates a new holographic backplate\r\n * @param name defines the control name\r\n * @param _shareMaterials\r\n */\r\n constructor(\r\n name?: string,\r\n private _shareMaterials = true\r\n ) {\r\n super(name);\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"HolographicBackplate\";\r\n }\r\n\r\n // Mesh association\r\n protected override _createNode(scene: Scene): TransformNode {\r\n const collisionMesh = CreateBox(\r\n (this.name ?? \"HolographicBackplate\") + \"_CollisionMesh\",\r\n {\r\n width: 1.0,\r\n height: 1.0,\r\n depth: 1.0,\r\n },\r\n scene\r\n );\r\n collisionMesh.isPickable = true;\r\n collisionMesh.visibility = 0;\r\n const baseUrl = Tools.GetAssetUrl(HolographicBackplate.MODEL_BASE_URL);\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n SceneLoader.ImportMeshAsync(undefined, baseUrl, HolographicBackplate.MODEL_FILENAME, scene).then((result) => {\r\n const importedModel = result.meshes[1];\r\n importedModel.name = `${this.name}_frontPlate`;\r\n importedModel.isPickable = false;\r\n importedModel.parent = collisionMesh;\r\n if (this._material) {\r\n importedModel.material = this._material;\r\n }\r\n this._model = importedModel;\r\n });\r\n\r\n return collisionMesh;\r\n }\r\n\r\n private _createMaterial(mesh: Mesh) {\r\n this._material = new FluentBackplateMaterial(this.name + \" Material\", mesh.getScene());\r\n }\r\n\r\n protected override _affectMaterial(mesh: Mesh) {\r\n // Back\r\n if (this._shareMaterials) {\r\n if (!this._host._touchSharedMaterials[\"fluentBackplateMaterial\"]) {\r\n this._createMaterial(mesh);\r\n this._host._touchSharedMaterials[\"fluentBackplateMaterial\"] = this._material;\r\n } else {\r\n this._material = this._host._touchSharedMaterials[\"fluentBackplateMaterial\"] as FluentBackplateMaterial;\r\n }\r\n } else {\r\n this._createMaterial(mesh);\r\n }\r\n }\r\n\r\n /**\r\n * Releases all associated resources\r\n */\r\n public override dispose() {\r\n super.dispose(); // will dispose main mesh ie. back plate\r\n\r\n if (!this.shareMaterials) {\r\n this._material.dispose();\r\n }\r\n\r\n this._model.dispose();\r\n }\r\n}\r\n","import { Button3D } from \"./button3D\";\r\n\r\nimport { type Nullable } from \"core/types\";\r\nimport { type Observer } from \"core/Misc/observable\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { type TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { CreatePlane } from \"core/Meshes/Builders/planeBuilder\";\r\nimport { CreateBox } from \"core/Meshes/Builders/boxBuilder\";\r\nimport { FadeInOutBehavior } from \"core/Behaviors/Meshes/fadeInOutBehavior\";\r\nimport { type Scene } from \"core/scene\";\r\n\r\nimport { FluentMaterial } from \"../materials/fluent/fluentMaterial\";\r\nimport { StackPanel } from \"../../2D/controls/stackPanel\";\r\nimport { Image } from \"../../2D/controls/image\";\r\nimport { TextBlock } from \"../../2D/controls/textBlock\";\r\nimport { AdvancedDynamicTexture } from \"../../2D/advancedDynamicTexture\";\r\nimport { type Control3D } from \"./control3D\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { IsDocumentAvailable } from \"core/Misc/domManagement\";\r\n\r\n/**\r\n * Class used to create a holographic button in 3D\r\n */\r\nexport class HolographicButton extends Button3D {\r\n private _backPlate: Mesh;\r\n private _textPlate: Mesh;\r\n private _frontPlate: Mesh;\r\n private _text: string;\r\n private _imageUrl: string;\r\n private _shareMaterials = true;\r\n private _frontMaterial: FluentMaterial;\r\n private _backMaterial: FluentMaterial;\r\n private _plateMaterial: StandardMaterial;\r\n private _pickedPointObserver: Nullable<Observer<Nullable<Vector3>>>;\r\n\r\n // Tooltip\r\n private _tooltipFade: Nullable<FadeInOutBehavior>;\r\n private _tooltipTextBlock: Nullable<TextBlock>;\r\n private _tooltipTexture: Nullable<AdvancedDynamicTexture>;\r\n private _tooltipMesh: Nullable<Mesh>;\r\n private _tooltipHoverObserver: Nullable<Observer<Control3D>>;\r\n private _tooltipOutObserver: Nullable<Observer<Control3D>>;\r\n\r\n private _disposeTooltip() {\r\n this._tooltipFade = null;\r\n if (this._tooltipTextBlock) {\r\n this._tooltipTextBlock.dispose();\r\n }\r\n if (this._tooltipTexture) {\r\n this._tooltipTexture.dispose();\r\n }\r\n if (this._tooltipMesh) {\r\n this._tooltipMesh.dispose();\r\n }\r\n this.onPointerEnterObservable.remove(this._tooltipHoverObserver);\r\n this.onPointerOutObservable.remove(this._tooltipOutObserver);\r\n }\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._textPlate.renderingGroupId = id;\r\n this._frontPlate.renderingGroupId = id;\r\n\r\n if (this._tooltipMesh) {\r\n this._tooltipMesh.renderingGroupId = id;\r\n }\r\n }\r\n public get renderingGroupId(): number {\r\n return this._backPlate.renderingGroupId;\r\n }\r\n\r\n /**\r\n * Text to be displayed on the tooltip shown when hovering on the button. When set to null tooltip is disabled. (Default: null)\r\n */\r\n public set tooltipText(text: Nullable<string>) {\r\n if (!text) {\r\n this._disposeTooltip();\r\n return;\r\n }\r\n if (!this._tooltipFade) {\r\n const rightHandedScene = this._backPlate._scene.useRightHandedSystem;\r\n // Create tooltip with mesh and text\r\n this._tooltipMesh = CreatePlane(\"\", { size: 1 }, this._backPlate._scene);\r\n const tooltipBackground = CreatePlane(\"\", { size: 1, sideOrientation: Mesh.DOUBLESIDE }, this._backPlate._scene);\r\n const mat = new StandardMaterial(\"\", this._backPlate._scene);\r\n mat.diffuseColor = Color3.FromHexString(\"#212121\");\r\n tooltipBackground.material = mat;\r\n tooltipBackground.isPickable = false;\r\n this._tooltipMesh.addChild(tooltipBackground);\r\n tooltipBackground.position = Vector3.Forward(rightHandedScene).scale(0.05);\r\n this._tooltipMesh.scaling.y = 1 / 3;\r\n this._tooltipMesh.position = Vector3.Up().scale(0.7).add(Vector3.Forward(rightHandedScene).scale(-0.15));\r\n this._tooltipMesh.isPickable = false;\r\n this._tooltipMesh.parent = this._backPlate;\r\n\r\n // Create text texture for the tooltip\r\n this._tooltipTexture = AdvancedDynamicTexture.CreateForMesh(this._tooltipMesh);\r\n this._tooltipTextBlock = new TextBlock();\r\n this._tooltipTextBlock.scaleY = 3;\r\n this._tooltipTextBlock.color = \"white\";\r\n this._tooltipTextBlock.fontSize = 130;\r\n this._tooltipTexture.addControl(this._tooltipTextBlock);\r\n\r\n // Add hover action to tooltip\r\n this._tooltipFade = new FadeInOutBehavior();\r\n this._tooltipFade.delay = 500;\r\n this._tooltipMesh.addBehavior(this._tooltipFade);\r\n this._tooltipHoverObserver = this.onPointerEnterObservable.add(() => {\r\n if (this._tooltipFade) {\r\n this._tooltipFade.fadeIn(true);\r\n }\r\n });\r\n this._tooltipOutObserver = this.onPointerOutObservable.add(() => {\r\n if (this._tooltipFade) {\r\n this._tooltipFade.fadeIn(false);\r\n }\r\n });\r\n }\r\n if (this._tooltipTextBlock) {\r\n this._tooltipTextBlock.text = text;\r\n }\r\n }\r\n\r\n public get tooltipText() {\r\n if (this._tooltipTextBlock) {\r\n return this._tooltipTextBlock.text;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets or sets text for the button\r\n */\r\n public get text(): string {\r\n return this._text;\r\n }\r\n\r\n public set text(value: string) {\r\n if (this._text === value) {\r\n return;\r\n }\r\n\r\n this._text = value;\r\n this._rebuildContent();\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 }\r\n\r\n /**\r\n * Gets the back material used by this button\r\n */\r\n public get backMaterial(): FluentMaterial {\r\n return this._backMaterial;\r\n }\r\n\r\n /**\r\n * Gets the front material used by this button\r\n */\r\n public get frontMaterial(): FluentMaterial {\r\n return this._frontMaterial;\r\n }\r\n\r\n /**\r\n * Gets the plate material used by this button\r\n */\r\n public get plateMaterial(): StandardMaterial {\r\n return this._plateMaterial;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this button shares its material with other HolographicButtons\r\n */\r\n public get shareMaterials(): boolean {\r\n return this._shareMaterials;\r\n }\r\n\r\n /**\r\n * Creates a new button\r\n * @param name defines the control name\r\n * @param shareMaterials\r\n */\r\n constructor(name?: string, shareMaterials = true) {\r\n super(name);\r\n\r\n this._shareMaterials = shareMaterials;\r\n\r\n // Default animations\r\n this.pointerEnterAnimation = () => {\r\n if (!this.mesh) {\r\n return;\r\n }\r\n this._frontPlate.setEnabled(true);\r\n };\r\n\r\n this.pointerOutAnimation = () => {\r\n if (!this.mesh) {\r\n return;\r\n }\r\n this._frontPlate.setEnabled(false);\r\n };\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"HolographicButton\";\r\n }\r\n\r\n private _rebuildContent(): void {\r\n this._disposeFacadeTexture();\r\n\r\n const panel = new StackPanel();\r\n panel.isVertical = true;\r\n\r\n if (IsDocumentAvailable() && !!document.createElement) {\r\n if (this._imageUrl) {\r\n const image = new Image();\r\n image.source = this._imageUrl;\r\n image.paddingTop = \"40px\";\r\n image.height = \"180px\";\r\n image.width = \"100px\";\r\n image.paddingBottom = \"40px\";\r\n panel.addControl(image);\r\n }\r\n }\r\n\r\n if (this._text) {\r\n const text = new TextBlock();\r\n text.text = this._text;\r\n text.color = \"white\";\r\n text.height = \"30px\";\r\n text.fontSize = 24;\r\n panel.addControl(text);\r\n }\r\n\r\n if (this._frontPlate) {\r\n this.content = panel;\r\n }\r\n }\r\n\r\n // Mesh association\r\n protected override _createNode(scene: Scene): TransformNode {\r\n this._backPlate = CreateBox(\r\n this.name + \"BackMesh\",\r\n {\r\n width: 1.0,\r\n height: 1.0,\r\n depth: 0.08,\r\n },\r\n scene\r\n );\r\n\r\n this._frontPlate = CreateBox(\r\n this.name + \"FrontMesh\",\r\n {\r\n width: 1.0,\r\n height: 1.0,\r\n depth: 0.08,\r\n },\r\n scene\r\n );\r\n\r\n this._frontPlate.parent = this._backPlate;\r\n this._frontPlate.position = Vector3.Forward(scene.useRightHandedSystem).scale(-0.08);\r\n this._frontPlate.isPickable = false;\r\n this._frontPlate.setEnabled(false);\r\n\r\n this._textPlate = <Mesh>super._createNode(scene);\r\n this._textPlate.parent = this._backPlate;\r\n this._textPlate.position = Vector3.Forward(scene.useRightHandedSystem).scale(-0.08);\r\n this._textPlate.isPickable = false;\r\n\r\n return this._backPlate;\r\n }\r\n\r\n protected override _applyFacade(facadeTexture: AdvancedDynamicTexture) {\r\n this._plateMaterial.emissiveTexture = facadeTexture;\r\n this._plateMaterial.opacityTexture = facadeTexture;\r\n }\r\n\r\n private _createBackMaterial(mesh: Mesh) {\r\n this._backMaterial = new FluentMaterial(this.name + \"Back Material\", mesh.getScene());\r\n this._backMaterial.renderHoverLight = true;\r\n this._pickedPointObserver = this._host.onPickedPointChangedObservable.add((pickedPoint) => {\r\n if (pickedPoint) {\r\n this._backMaterial.hoverPosition = pickedPoint;\r\n this._backMaterial.hoverColor.a = 1.0;\r\n } else {\r\n this._backMaterial.hoverColor.a = 0;\r\n }\r\n });\r\n }\r\n\r\n private _createFrontMaterial(mesh: Mesh) {\r\n this._frontMaterial = new FluentMaterial(this.name + \"Front Material\", mesh.getScene());\r\n this._frontMaterial.innerGlowColorIntensity = 0; // No inner glow\r\n this._frontMaterial.alpha = 0.5; // Additive\r\n this._frontMaterial.renderBorders = true;\r\n }\r\n\r\n private _createPlateMaterial(mesh: Mesh) {\r\n this._plateMaterial = new StandardMaterial(this.name + \"Plate Material\", mesh.getScene());\r\n this._plateMaterial.specularColor = Color3.Black();\r\n }\r\n\r\n protected override _affectMaterial(mesh: Mesh) {\r\n // Back\r\n if (this._shareMaterials) {\r\n if (!this._host._sharedMaterials[\"backFluentMaterial\"]) {\r\n this._createBackMaterial(mesh);\r\n this._host._sharedMaterials[\"backFluentMaterial\"] = this._backMaterial;\r\n } else {\r\n this._backMaterial = this._host._sharedMaterials[\"backFluentMaterial\"] as FluentMaterial;\r\n }\r\n\r\n // Front\r\n if (!this._host._sharedMaterials[\"frontFluentMaterial\"]) {\r\n this._createFrontMaterial(mesh);\r\n this._host._sharedMaterials[\"frontFluentMaterial\"] = this._frontMaterial;\r\n } else {\r\n this._frontMaterial = this._host._sharedMaterials[\"frontFluentMaterial\"] as FluentMaterial;\r\n }\r\n } else {\r\n this._createBackMaterial(mesh);\r\n this._createFrontMaterial(mesh);\r\n }\r\n\r\n this._createPlateMaterial(mesh);\r\n this._backPlate.material = this._backMaterial;\r\n this._frontPlate.material = this._frontMaterial;\r\n this._textPlate.material = this._plateMaterial;\r\n\r\n this._rebuildContent();\r\n }\r\n\r\n /**\r\n * Releases all associated resources\r\n */\r\n public override dispose() {\r\n super.dispose(); // will dispose main mesh ie. back plate\r\n\r\n this._disposeTooltip();\r\n\r\n if (!this.shareMaterials) {\r\n this._backMaterial.dispose();\r\n this._frontMaterial.dispose();\r\n this._plateMaterial.dispose();\r\n\r\n if (this._pickedPointObserver) {\r\n this._host.onPickedPointChangedObservable.remove(this._pickedPointObserver);\r\n this._pickedPointObserver = null;\r\n }\r\n }\r\n }\r\n}\r\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"fluentButtonPixelShader\";\nconst shader = `uniform vec3 cameraPosition;varying vec3 vPosition;varying vec3 vNormal;varying vec2 vUV;varying vec3 vTangent;varying vec3 vBinormal;varying vec4 vColor;varying vec4 vExtra1;uniform float _Edge_Width_;uniform vec4 _Edge_Color_;uniform bool _Relative_Width_;uniform float _Proximity_Max_Intensity_;uniform float _Proximity_Far_Distance_;uniform float _Proximity_Near_Radius_;uniform float _Proximity_Anisotropy_;uniform float _Selection_Fuzz_;uniform float _Selected_;uniform float _Selection_Fade_;uniform float _Selection_Fade_Size_;uniform float _Selected_Distance_;uniform float _Selected_Fade_Length_;uniform bool _Blob_Enable_;uniform vec3 _Blob_Position_;uniform float _Blob_Intensity_;uniform float _Blob_Near_Size_;uniform float _Blob_Far_Size_;uniform float _Blob_Near_Distance_;uniform float _Blob_Far_Distance_;uniform float _Blob_Fade_Length_;uniform float _Blob_Inner_Fade_;uniform float _Blob_Pulse_;uniform float _Blob_Fade_;uniform sampler2D _Blob_Texture_;uniform bool _Blob_Enable_2_;uniform vec3 _Blob_Position_2_;uniform float _Blob_Near_Size_2_;uniform float _Blob_Inner_Fade_2_;uniform float _Blob_Pulse_2_;uniform float _Blob_Fade_2_;uniform vec3 _Active_Face_Dir_;uniform vec3 _Active_Face_Up_;uniform bool Enable_Fade;uniform float _Fade_Width_;uniform bool _Smooth_Active_Face_;uniform bool _Show_Frame_;uniform bool _Use_Blob_Texture_;uniform bool Use_Global_Left_Index;uniform bool Use_Global_Right_Index;uniform vec4 Global_Left_Index_Tip_Position;uniform vec4 Global_Right_Index_Tip_Position;uniform vec4 Global_Left_Thumb_Tip_Position;uniform vec4 Global_Right_Thumb_Tip_Position;uniform float Global_Left_Index_Tip_Proximity;uniform float Global_Right_Index_Tip_Proximity;void Holo_Edge_Fragment_B35(\nvec4 Edges,\nfloat Edge_Width,\nout float NotEdge)\n{vec2 c=vec2(min(Edges.r,Edges.g),min(Edges.b,Edges.a));vec2 df=fwidth(c)*Edge_Width;vec2 g=clamp(c/df,0.0,1.0);NotEdge=g.x*g.y;}\nvoid Blob_Fragment_B39(\nvec2 UV,\nvec3 Blob_Info,\nsampler2D Blob_Texture,\nout vec4 Blob_Color)\n{float k=dot(UV,UV);Blob_Color=Blob_Info.y*texture(Blob_Texture,vec2(vec2(sqrt(k),Blob_Info.x).x,1.0-vec2(sqrt(k),Blob_Info.x).y))*(1.0-clamp(k,0.0,1.0));}\nvec2 FilterStep(vec2 Edge,vec2 X)\n{vec2 dX=max(fwidth(X),vec2(0.00001,0.00001));return clamp( (X+dX-max(Edge,X-dX))/(dX*2.0),0.0,1.0);}\nvoid Wireframe_Fragment_B59(\nvec3 Widths,\nvec2 UV,\nfloat Proximity,\nvec4 Edge_Color,\nout vec4 Wireframe)\n{vec2 c=min(UV,vec2(1.0,1.0)-UV);vec2 g=FilterStep(Widths.xy*0.5,c); \nWireframe=(1.0-min(g.x,g.y))*Proximity*Edge_Color;}\nvoid Proximity_B53(\nvec3 Proximity_Center,\nvec3 Proximity_Center_2,\nfloat Proximity_Max_Intensity,\nfloat Proximity_Near_Radius,\nvec3 Position,\nvec3 Show_Selection,\nvec4 Extra1,\nfloat Dist_To_Face,\nfloat Intensity,\nout float Proximity)\n{vec2 delta1=Extra1.xy;vec2 delta2=Extra1.zw;float d2=sqrt(min(dot(delta1,delta1),dot(delta2,delta2))+Dist_To_Face*Dist_To_Face);Proximity=Intensity*Proximity_Max_Intensity*(1.0-clamp(d2/Proximity_Near_Radius,0.0,1.0))*(1.0-Show_Selection.x)+Show_Selection.x;}\nvoid To_XYZ_B46(\nvec3 Vec3,\nout float X,\nout float Y,\nout float Z)\n{X=Vec3.x;Y=Vec3.y;Z=Vec3.z;}\nvoid main()\n{float NotEdge_Q35;\n#if ENABLE_FADE\nHolo_Edge_Fragment_B35(vColor,_Fade_Width_,NotEdge_Q35);\n#else\nNotEdge_Q35=1.0;\n#endif\nvec4 Blob_Color_Q39;float k=dot(vUV,vUV);vec2 blobTextureCoord=vec2(vec2(sqrt(k),vTangent.x).x,1.0-vec2(sqrt(k),vTangent.x).y);vec4 blobColor=mix(vec4(1.0,1.0,1.0,1.0)*step(1.0-vTangent.x,clamp(sqrt(k)+0.1,0.0,1.0)),texture(_Blob_Texture_,blobTextureCoord),float(_Use_Blob_Texture_));Blob_Color_Q39=vTangent.y*blobColor*(1.0-clamp(k,0.0,1.0));float Is_Quad_Q24;Is_Quad_Q24=vNormal.z;vec3 Blob_Position_Q41= mix(_Blob_Position_,Global_Left_Index_Tip_Position.xyz,float(Use_Global_Left_Index));vec3 Blob_Position_Q42= mix(_Blob_Position_2_,Global_Right_Index_Tip_Position.xyz,float(Use_Global_Right_Index));float X_Q46;float Y_Q46;float Z_Q46;To_XYZ_B46(vBinormal,X_Q46,Y_Q46,Z_Q46);float Proximity_Q53;Proximity_B53(Blob_Position_Q41,Blob_Position_Q42,_Proximity_Max_Intensity_,_Proximity_Near_Radius_,vPosition,vBinormal,vExtra1,Y_Q46,Z_Q46,Proximity_Q53);vec4 Wireframe_Q59;Wireframe_Fragment_B59(vNormal,vUV,Proximity_Q53,_Edge_Color_,Wireframe_Q59);vec4 Wire_Or_Blob_Q23=mix(Wireframe_Q59,Blob_Color_Q39,Is_Quad_Q24);vec4 Result_Q22;Result_Q22=mix(Wire_Or_Blob_Q23,vec4(0.3,0.3,0.3,0.3),float(_Show_Frame_));vec4 Final_Color_Q37=NotEdge_Q35*Result_Q22;vec4 Out_Color=Final_Color_Q37;float Clip_Threshold=0.0;bool To_sRGB=false;gl_FragColor=Out_Color;}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const fluentButtonPixelShader = { name, shader };\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"fluentButtonVertexShader\";\nconst shader = `uniform mat4 world;uniform mat4 viewProjection;uniform vec3 cameraPosition;attribute vec3 position;attribute vec3 normal;attribute vec2 uv;attribute vec3 tangent;attribute vec4 color;uniform float _Edge_Width_;uniform vec4 _Edge_Color_;uniform float _Proximity_Max_Intensity_;uniform float _Proximity_Far_Distance_;uniform float _Proximity_Near_Radius_;uniform float _Proximity_Anisotropy_;uniform float _Selection_Fuzz_;uniform float _Selected_;uniform float _Selection_Fade_;uniform float _Selection_Fade_Size_;uniform float _Selected_Distance_;uniform float _Selected_Fade_Length_;uniform bool _Blob_Enable_;uniform vec3 _Blob_Position_;uniform float _Blob_Intensity_;uniform float _Blob_Near_Size_;uniform float _Blob_Far_Size_;uniform float _Blob_Near_Distance_;uniform float _Blob_Far_Distance_;uniform float _Blob_Fade_Length_;uniform float _Blob_Inner_Fade_;uniform float _Blob_Pulse_;uniform float _Blob_Fade_;uniform sampler2D _Blob_Texture_;uniform bool _Blob_Enable_2_;uniform vec3 _Blob_Position_2_;uniform float _Blob_Near_Size_2_;uniform float _Blob_Inner_Fade_2_;uniform float _Blob_Pulse_2_;uniform float _Blob_Fade_2_;uniform vec3 _Active_Face_Dir_;uniform vec3 _Active_Face_Up_;uniform bool _Enable_Fade_;uniform float _Fade_Width_;uniform bool _Smooth_Active_Face_;uniform bool _Show_Frame_;uniform bool Use_Global_Left_Index;uniform bool Use_Global_Right_Index;uniform vec4 Global_Left_Index_Tip_Position;uniform vec4 Global_Right_Index_Tip_Position;uniform vec4 Global_Left_Thumb_Tip_Position;uniform vec4 Global_Right_Thumb_Tip_Position;uniform float Global_Left_Index_Tip_Proximity;uniform float Global_Right_Index_Tip_Proximity;varying vec3 vPosition;varying vec3 vNormal;varying vec2 vUV;varying vec3 vTangent;varying vec3 vBinormal;varying vec4 vColor;varying vec4 vExtra1;void Blob_Vertex_B47(\nvec3 Position,\nvec3 Normal,\nvec3 Tangent,\nvec3 Bitangent,\nvec3 Blob_Position,\nfloat Intensity,\nfloat Blob_Near_Size,\nfloat Blob_Far_Size,\nfloat Blob_Near_Distance,\nfloat Blob_Far_Distance,\nvec4 Vx_Color,\nvec2 UV,\nvec3 Face_Center,\nvec2 Face_Size,\nvec2 In_UV,\nfloat Blob_Fade_Length,\nfloat Selection_Fade,\nfloat Selection_Fade_Size,\nfloat Inner_Fade,\nvec3 Active_Face_Center,\nfloat Blob_Pulse,\nfloat Blob_Fade,\nfloat Blob_Enabled,\nout vec3 Out_Position,\nout vec2 Out_UV,\nout vec3 Blob_Info)\n{float blobSize,fadeIn;vec3 Hit_Position;Blob_Info=vec3(0.0,0.0,0.0);float Hit_Distance=dot(Blob_Position-Face_Center,Normal);Hit_Position=Blob_Position-Hit_Distance*Normal;float absD=abs(Hit_Distance);float lerpVal=clamp((absD-Blob_Near_Distance)/(Blob_Far_Distance-Blob_Near_Distance),0.0,1.0);fadeIn=1.0-clamp((absD-Blob_Far_Distance)/Blob_Fade_Length,0.0,1.0);float innerFade=1.0-clamp(-Hit_Distance/Inner_Fade,0.0,1.0);float farClip=clamp(1.0-step(Blob_Far_Distance+Blob_Fade_Length,absD),0.0,1.0);float size=mix(Blob_Near_Size,Blob_Far_Size,lerpVal)*farClip;blobSize=mix(size,Selection_Fade_Size,Selection_Fade)*innerFade*Blob_Enabled;Blob_Info.x=lerpVal*0.5+0.5;Blob_Info.y=fadeIn*Intensity*(1.0-Selection_Fade)*Blob_Fade;Blob_Info.x*=(1.0-Blob_Pulse);vec3 delta=Hit_Position-Face_Center;vec2 blobCenterXY=vec2(dot(delta,Tangent),dot(delta,Bitangent));vec2 quadUVin=2.0*UV-1.0; \nvec2 blobXY=blobCenterXY+quadUVin*blobSize;vec2 blobClipped=clamp(blobXY,-Face_Size*0.5,Face_Size*0.5);vec2 blobUV=(blobClipped-blobCenterXY)/max(blobSize,0.0001)*2.0;vec3 blobCorner=Face_Center+blobClipped.x*Tangent+blobClipped.y*Bitangent;Out_Position=mix(Position,blobCorner,Vx_Color.rrr);Out_UV=mix(In_UV,blobUV,Vx_Color.rr);}\nvec2 ProjectProximity(\nvec3 blobPosition,\nvec3 position,\nvec3 center,\nvec3 dir,\nvec3 xdir,\nvec3 ydir,\nout float vdistance\n)\n{vec3 delta=blobPosition-position;vec2 xy=vec2(dot(delta,xdir),dot(delta,ydir));vdistance=abs(dot(delta,dir));return xy;}\nvoid Proximity_Vertex_B66(\nvec3 Blob_Position,\nvec3 Blob_Position_2,\nvec3 Active_Face_Center,\nvec3 Active_Face_Dir,\nvec3 Position,\nfloat Proximity_Far_Distance,\nfloat Relative_Scale,\nfloat Proximity_Anisotropy,\nvec3 Up,\nout vec4 Extra1,\nout float Distance_To_Face,\nout float Intensity)\n{vec3 Active_Face_Dir_X=normalize(cross(Active_Face_Dir,Up));vec3 Active_Face_Dir_Y=cross(Active_Face_Dir,Active_Face_Dir_X);float distz1,distz2;Extra1.xy=ProjectProximity(Blob_Position,Position,Active_Face_Center,Active_Face_Dir,Active_Face_Dir_X*Proximity_Anisotropy,Active_Face_Dir_Y,distz1)/Relative_Scale;Extra1.zw=ProjectProximity(Blob_Position_2,Position,Active_Face_Center,Active_Face_Dir,Active_Face_Dir_X*Proximity_Anisotropy,Active_Face_Dir_Y,distz2)/Relative_Scale;Distance_To_Face=dot(Active_Face_Dir,Position-Active_Face_Center);Intensity=1.0-clamp(min(distz1,distz2)/Proximity_Far_Distance,0.0,1.0);}\nvoid Holo_Edge_Vertex_B44(\nvec3 Incident,\nvec3 Normal,\nvec2 UV,\nvec3 Tangent,\nvec3 Bitangent,\nbool Smooth_Active_Face,\nfloat Active,\nout vec4 Holo_Edges)\n{float NdotI=dot(Incident,Normal);vec2 flip=(UV-vec2(0.5,0.5));float udot=dot(Incident,Tangent)*flip.x*NdotI;float uval=1.0-float(udot>0.0);float vdot=-dot(Incident,Bitangent)*flip.y*NdotI;float vval=1.0-float(vdot>0.0);float Smooth_And_Active=step(1.0,float(Smooth_Active_Face && Active>0.0));uval=mix(uval,max(1.0,uval),Smooth_And_Active); \nvval=mix(vval,max(1.0,vval),Smooth_And_Active);Holo_Edges=vec4(1.0,1.0,1.0,1.0)-vec4(uval*UV.x,uval*(1.0-UV.x),vval*UV.y,vval*(1.0-UV.y));}\nvoid Object_To_World_Pos_B13(\nvec3 Pos_Object,\nout vec3 Pos_World)\n{Pos_World=(world*vec4(Pos_Object,1.0)).xyz;}\nvoid Choose_Blob_B38(\nvec4 Vx_Color,\nvec3 Position1,\nvec3 Position2,\nbool Blob_Enable_1,\nbool Blob_Enable_2,\nfloat Near_Size_1,\nfloat Near_Size_2,\nfloat Blob_Inner_Fade_1,\nfloat Blob_Inner_Fade_2,\nfloat Blob_Pulse_1,\nfloat Blob_Pulse_2,\nfloat Blob_Fade_1,\nfloat Blob_Fade_2,\nout vec3 Position,\nout float Near_Size,\nout float Inner_Fade,\nout float Blob_Enable,\nout float Fade,\nout float Pulse)\n{Position=Position1*(1.0-Vx_Color.g)+Vx_Color.g*Position2;float b1=float(Blob_Enable_1);float b2=float(Blob_Enable_2);Blob_Enable=b1+(b2-b1)*Vx_Color.g;Pulse=Blob_Pulse_1*(1.0-Vx_Color.g)+Vx_Color.g*Blob_Pulse_2;Fade=Blob_Fade_1*(1.0-Vx_Color.g)+Vx_Color.g*Blob_Fade_2;Near_Size=Near_Size_1*(1.0-Vx_Color.g)+Vx_Color.g*Near_Size_2;Inner_Fade=Blob_Inner_Fade_1*(1.0-Vx_Color.g)+Vx_Color.g*Blob_Inner_Fade_2;}\nvoid Wireframe_Vertex_B51(\nvec3 Position,\nvec3 Normal,\nvec3 Tangent,\nvec3 Bitangent,\nfloat Edge_Width,\nvec2 Face_Size,\nout vec3 Wire_Vx_Pos,\nout vec2 UV,\nout vec2 Widths)\n{Widths.xy=Edge_Width/Face_Size;float x=dot(Position,Tangent);float y=dot(Position,Bitangent);float dx=0.5-abs(x);float newx=(0.5-dx*Widths.x*2.0)*sign(x);float dy=0.5-abs(y);float newy=(0.5-dy*Widths.y*2.0)*sign(y);Wire_Vx_Pos=Normal*0.5+newx*Tangent+newy*Bitangent;UV.x=dot(Wire_Vx_Pos,Tangent)+0.5;UV.y=dot(Wire_Vx_Pos,Bitangent)+0.5;}\nvec2 ramp2(vec2 start,vec2 end,vec2 x)\n{return clamp((x-start)/(end-start),vec2(0.0,0.0),vec2(1.0,1.0));}\nfloat computeSelection(\nvec3 blobPosition,\nvec3 normal,\nvec3 tangent,\nvec3 bitangent,\nvec3 faceCenter,\nvec2 faceSize,\nfloat selectionFuzz,\nfloat farDistance,\nfloat fadeLength\n)\n{vec3 delta=blobPosition-faceCenter;float absD=abs(dot(delta,normal));float fadeIn=1.0-clamp((absD-farDistance)/fadeLength,0.0,1.0);vec2 blobCenterXY=vec2(dot(delta,tangent),dot(delta,bitangent));vec2 innerFace=faceSize*(1.0-selectionFuzz)*0.5;vec2 selectPulse=ramp2(-faceSize*0.5,-innerFace,blobCenterXY)-ramp2(innerFace,faceSize*0.5,blobCenterXY);return selectPulse.x*selectPulse.y*fadeIn;}\nvoid Selection_Vertex_B48(\nvec3 Blob_Position,\nvec3 Blob_Position_2,\nvec3 Face_Center,\nvec2 Face_Size,\nvec3 Normal,\nvec3 Tangent,\nvec3 Bitangent,\nfloat Selection_Fuzz,\nfloat Selected,\nfloat Far_Distance,\nfloat Fade_Length,\nvec3 Active_Face_Dir,\nout float Show_Selection)\n{float select1=computeSelection(Blob_Position,Normal,Tangent,Bitangent,Face_Center,Face_Size,Selection_Fuzz,Far_Distance,Fade_Length);float select2=computeSelection(Blob_Position_2,Normal,Tangent,Bitangent,Face_Center,Face_Size,Selection_Fuzz,Far_Distance,Fade_Length);float Active=max(0.0,dot(Active_Face_Dir,Normal));Show_Selection=mix(max(select1,select2),1.0,Selected)*Active;}\nvoid Proximity_Visibility_B54(\nfloat Selection,\nvec3 Proximity_Center,\nvec3 Proximity_Center_2,\nfloat Input_Width,\nfloat Proximity_Far_Distance,\nfloat Proximity_Radius,\nvec3 Active_Face_Center,\nvec3 Active_Face_Dir,\nout float Width)\n{vec3 boxEdges=(world*vec4(vec3(0.5,0.5,0.5),0.0)).xyz;float boxMaxSize=length(boxEdges);float d1=dot(Proximity_Center-Active_Face_Center,Active_Face_Dir);vec3 blob1=Proximity_Center-d1*Active_Face_Dir;float d2=dot(Proximity_Center_2-Active_Face_Center,Active_Face_Dir);vec3 blob2=Proximity_Center_2-d2*Active_Face_Dir;vec3 delta1=blob1-Active_Face_Center;vec3 delta2=blob2-Active_Face_Center;float dist1=dot(delta1,delta1);float dist2=dot(delta2,delta2);float nearestProxDist=sqrt(min(dist1,dist2));Width=Input_Width*(1.0-step(boxMaxSize+Proximity_Radius,nearestProxDist))*(1.0-step(Proximity_Far_Distance,min(d1,d2))*(1.0-step(0.0001,Selection)));}\nvoid Object_To_World_Dir_B67(\nvec3 Dir_Object,\nout vec3 Dir_World)\n{Dir_World=(world*vec4(Dir_Object,0.0)).xyz;}\nvoid main()\n{vec3 Active_Face_Center_Q49;Active_Face_Center_Q49=(world*vec4(_Active_Face_Dir_*0.5,1.0)).xyz;vec3 Blob_Position_Q41= mix(_Blob_Position_,Global_Left_Index_Tip_Position.xyz,float(Use_Global_Left_Index));vec3 Blob_Position_Q42= mix(_Blob_Position_2_,Global_Right_Index_Tip_Position.xyz,float(Use_Global_Right_Index));vec3 Active_Face_Dir_Q64=normalize((world*vec4(_Active_Face_Dir_,0.0)).xyz);float Relative_Scale_Q57;\n#if RELATIVE_WIDTH\nRelative_Scale_Q57=length((world*vec4(vec3(0,1,0),0.0)).xyz);\n#else\nRelative_Scale_Q57=1.0;\n#endif\nvec3 Tangent_World_Q30;Tangent_World_Q30=(world*vec4(tangent,0.0)).xyz;vec3 Binormal_World_Q31;Binormal_World_Q31=(world*vec4((cross(normal,tangent)),0.0)).xyz;vec3 Normal_World_Q60;Normal_World_Q60=(world*vec4(normal,0.0)).xyz;vec3 Result_Q18=0.5*normal;vec3 Dir_World_Q67;Object_To_World_Dir_B67(_Active_Face_Up_,Dir_World_Q67);float Product_Q56=_Edge_Width_*Relative_Scale_Q57;vec3 Normal_World_N_Q29=normalize(Normal_World_Q60);vec3 Tangent_World_N_Q28=normalize(Tangent_World_Q30);vec3 Binormal_World_N_Q32=normalize(Binormal_World_Q31);vec3 Position_Q38;float Near_Size_Q38;float Inner_Fade_Q38;float Blob_Enable_Q38;float Fade_Q38;float Pulse_Q38;Choose_Blob_B38(color,Blob_Position_Q41,Blob_Position_Q42,_Blob_Enable_,_Blob_Enable_2_,_Blob_Near_Size_,_Blob_Near_Size_2_,_Blob_Inner_Fade_,_Blob_Inner_Fade_2_,_Blob_Pulse_,_Blob_Pulse_2_,_Blob_Fade_,_Blob_Fade_2_,Position_Q38,Near_Size_Q38,Inner_Fade_Q38,Blob_Enable_Q38,Fade_Q38,Pulse_Q38);vec3 Face_Center_Q33;Face_Center_Q33=(world*vec4(Result_Q18,1.0)).xyz;vec2 Face_Size_Q50=vec2(length(Tangent_World_Q30),length(Binormal_World_Q31));float Show_Selection_Q48;Selection_Vertex_B48(Blob_Position_Q41,Blob_Position_Q42,Face_Center_Q33,Face_Size_Q50,Normal_World_N_Q29,Tangent_World_N_Q28,Binormal_World_N_Q32,_Selection_Fuzz_,_Selected_,_Selected_Distance_,_Selected_Fade_Length_,Active_Face_Dir_Q64,Show_Selection_Q48);vec3 Normalized_Q72=normalize(Dir_World_Q67);float Active_Q34=max(0.0,dot(Active_Face_Dir_Q64,Normal_World_N_Q29));float Width_Q54;Proximity_Visibility_B54(Show_Selection_Q48,Blob_Position_Q41,Blob_Position_Q42,Product_Q56,_Proximity_Far_Distance_,_Proximity_Near_Radius_,Active_Face_Center_Q49,Active_Face_Dir_Q64,Width_Q54);vec3 Wire_Vx_Pos_Q51;vec2 UV_Q51;vec2 Widths_Q51;Wireframe_Vertex_B51(position,normal,tangent,(cross(normal,tangent)),Width_Q54,Face_Size_Q50,Wire_Vx_Pos_Q51,UV_Q51,Widths_Q51);vec3 Vec3_Q27=vec3(Widths_Q51.x,Widths_Q51.y,color.r);vec3 Pos_World_Q13;Object_To_World_Pos_B13(Wire_Vx_Pos_Q51,Pos_World_Q13);vec3 Incident_Q36=normalize(Pos_World_Q13-cameraPosition);vec3 Out_Position_Q47;vec2 Out_UV_Q47;vec3 Blob_Info_Q47;Blob_Vertex_B47(Pos_World_Q13,Normal_World_N_Q29,Tangent_World_N_Q28,Binormal_World_N_Q32,Position_Q38,_Blob_Intensity_,Near_Size_Q38,_Blob_Far_Size_,_Blob_Near_Distance_,_Blob_Far_Distance_,color,uv,Face_Center_Q33,Face_Size_Q50,UV_Q51,_Blob_Fade_Length_,_Selection_Fade_,_Selection_Fade_Size_,Inner_Fade_Q38,Active_Face_Center_Q49,Pulse_Q38,Fade_Q38,Blob_Enable_Q38,Out_Position_Q47,Out_UV_Q47,Blob_Info_Q47);vec4 Extra1_Q66;float Distance_To_Face_Q66;float Intensity_Q66;Proximity_Vertex_B66(Blob_Position_Q41,Blob_Position_Q42,Active_Face_Center_Q49,Active_Face_Dir_Q64,Pos_World_Q13,_Proximity_Far_Distance_,Relative_Scale_Q57,_Proximity_Anisotropy_,Normalized_Q72,Extra1_Q66,Distance_To_Face_Q66,Intensity_Q66);vec4 Holo_Edges_Q44;Holo_Edge_Vertex_B44(Incident_Q36,Normal_World_N_Q29,uv,Tangent_World_Q30,Binormal_World_Q31,_Smooth_Active_Face_,Active_Q34,Holo_Edges_Q44);vec3 Vec3_Q19=vec3(Show_Selection_Q48,Distance_To_Face_Q66,Intensity_Q66);vec3 Position=Out_Position_Q47;vec2 UV=Out_UV_Q47;vec3 Tangent=Blob_Info_Q47;vec3 Binormal=Vec3_Q19;vec3 Normal=Vec3_Q27;vec4 Extra1=Extra1_Q66;vec4 Color=Holo_Edges_Q44;gl_Position=viewProjection*vec4(Position,1);vPosition=Position;vNormal=Normal;vUV=UV;vTangent=Tangent;vBinormal=Binormal;vColor=Color;vExtra1=Extra1;}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const fluentButtonVertexShader = { name, shader };\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type Nullable } from \"core/types\";\r\nimport { serializeAsColor4, serializeAsVector3, serialize } from \"core/Misc/decorators\";\r\nimport { SerializationHelper } from \"core/Misc/decorators.serialization\";\r\nimport { type Matrix, Vector3, Vector4 } from \"core/Maths/math.vector\";\r\nimport { type IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { type IEffectCreationOptions } from \"core/Materials/effect\";\r\nimport { PushMaterial } from \"core/Materials/pushMaterial\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { type SubMesh } from \"core/Meshes/subMesh\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\nimport { EffectFallbacks } from \"core/Materials/effectFallbacks\";\r\nimport { Constants } from \"core/Engines/constants\";\r\n\r\nimport \"./shaders/fluentButton.fragment\";\r\nimport \"./shaders/fluentButton.vertex\";\r\nimport { HandleFallbacksForShadows, PrepareAttributesForInstances, PrepareDefinesForAttributes, PrepareUniformsAndSamplersList } from \"core/Materials/materialHelper.functions\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\n/** @internal */\r\nclass FluentButtonMaterialDefines extends MaterialDefines {\r\n public RELATIVE_WIDTH = true;\r\n public ENABLE_FADE = true;\r\n\r\n constructor() {\r\n super();\r\n this._needNormals = true;\r\n this._needUVs = true;\r\n this.rebuild();\r\n }\r\n}\r\n\r\n/**\r\n * Class used to render square buttons with fluent design\r\n * @since 5.0.0\r\n */\r\nexport class FluentButtonMaterial extends PushMaterial {\r\n /**\r\n * URL pointing to the texture used to define the coloring for the fluent blob effect.\r\n */\r\n public static BLOB_TEXTURE_URL = \"https://assets.babylonjs.com/core/MRTK/mrtk-fluent-button-blob.png\";\r\n\r\n /**\r\n * Gets or sets the width of the glowing edge, relative to the scale of the button.\r\n * (Default is 4% of the height).\r\n */\r\n @serialize()\r\n public edgeWidth = 0.04;\r\n\r\n /**\r\n * Gets or sets the color of the glowing edge.\r\n */\r\n @serializeAsColor4()\r\n public edgeColor = new Color4(0.592157, 0.592157, 0.592157, 1.0);\r\n\r\n /**\r\n * Gets or sets the maximum intensity of the proximity light.\r\n */\r\n @serialize()\r\n public proximityMaxIntensity = 0.45;\r\n\r\n /**\r\n * Gets or sets the maximum distance for the proximity light (Default is 16mm).\r\n */\r\n @serialize()\r\n public proximityFarDistance = 0.16;\r\n\r\n /**\r\n * Gets or sets the radius of the proximity light when near to the surface.\r\n */\r\n @serialize()\r\n public proximityNearRadius = 1.5;\r\n\r\n /**\r\n * Gets or sets the anisotropy of the proximity light.\r\n */\r\n @serialize()\r\n public proximityAnisotropy = 1;\r\n\r\n /**\r\n * Gets or sets the amount of fuzzing in the selection focus.\r\n */\r\n @serialize()\r\n public selectionFuzz = 0.5;\r\n\r\n /**\r\n * Gets or sets an override value to display the button as selected.\r\n */\r\n @serialize()\r\n public selected = 0;\r\n\r\n /**\r\n * Gets or sets a value to manually fade the blob size.\r\n */\r\n @serialize()\r\n public selectionFade = 0;\r\n\r\n /**\r\n * Gets or sets a value to manually shrink the blob size as it fades (see selectionFade).\r\n */\r\n @serialize()\r\n public selectionFadeSize = 0.3;\r\n\r\n /**\r\n * Gets or sets the distance from the button the cursor should be for the button\r\n * to appear selected (Default is 8cm).\r\n */\r\n @serialize()\r\n public selectedDistance = 0.08;\r\n\r\n /**\r\n * Gets or sets the fall-off distance for the selection fade (Default is 8cm).\r\n */\r\n @serialize()\r\n public selectedFadeLength = 0.08;\r\n\r\n /**\r\n * Gets or sets the intensity of the luminous blob (Ranges 0-1, default is 0.5).\r\n */\r\n @serialize()\r\n public blobIntensity = 0.5;\r\n\r\n /**\r\n * The size of the blob when the pointer is at the blobFarDistance (Default is 5cm).\r\n */\r\n @serialize()\r\n public blobFarSize = 0.05;\r\n\r\n /**\r\n * The distance at which the pointer is considered near. See [left|right]BlobNearSize. (Default is 0cm).\r\n */\r\n @serialize()\r\n public blobNearDistance = 0;\r\n\r\n /**\r\n * The distance at which the pointer is considered far. See [left|right]BlobFarSize. (Default is 8cm).\r\n */\r\n @serialize()\r\n public blobFarDistance = 0.08;\r\n\r\n /**\r\n * The distance over which the blob intensity fades from full to none (Default is 8cm).\r\n */\r\n @serialize()\r\n public blobFadeLength = 0.08;\r\n\r\n /**\r\n * Gets or sets whether the blob corresponding to the left index finger is enabled.\r\n */\r\n @serialize()\r\n public leftBlobEnable = true;\r\n\r\n /**\r\n * Gets or sets the size of the left blob when the left pointer is considered near. See blobNearDistance. (Default is 2.5cm).\r\n */\r\n @serialize()\r\n public leftBlobNearSize = 0.025;\r\n\r\n /**\r\n * Gets or sets the progress of the pulse animation on the left blob (Ranges 0-1).\r\n */\r\n @serialize()\r\n public leftBlobPulse = 0;\r\n\r\n /**\r\n * Gets or sets the fade factor on the left blob.\r\n */\r\n @serialize()\r\n public leftBlobFade = 1;\r\n\r\n /**\r\n * Gets or sets the inner fade on the left blob;\r\n */\r\n @serialize()\r\n public leftBlobInnerFade = 0.01;\r\n\r\n /**\r\n * Gets or sets whether the blob corresponding to the right index finger is enabled.\r\n */\r\n @serialize()\r\n public rightBlobEnable = true;\r\n\r\n /**\r\n * Gets or sets the size of the right blob when the right pointer is considered near. See blobNearDistance. (Default is 2.5cm).\r\n */\r\n @serialize()\r\n public rightBlobNearSize = 0.025;\r\n\r\n /**\r\n * Gets or sets the progress of the pulse animation on the right blob (Ranges 0-1).\r\n */\r\n @serialize()\r\n public rightBlobPulse = 0;\r\n\r\n /**\r\n * Gets or sets the fade factor on the right blob.\r\n */\r\n @serialize()\r\n public rightBlobFade = 1;\r\n\r\n /**\r\n * Gets or sets the inner fade on the right blob;\r\n */\r\n @serialize()\r\n public rightBlobInnerFade = 0.01;\r\n\r\n /**\r\n * Gets or sets the direction of the active face before the world transform is applied.\r\n * This should almost always be set to -z.\r\n */\r\n @serializeAsVector3()\r\n public activeFaceDir = new Vector3(0, 0, -1);\r\n\r\n /**\r\n * Gets or sets the button's up direction before the world transform is applied.\r\n * This should almost always be set to +y.\r\n */\r\n @serializeAsVector3()\r\n public activeFaceUp = new Vector3(0, 1, 0);\r\n\r\n /**\r\n * Gets or sets whether the edge fade effect is enabled.\r\n */\r\n @serialize()\r\n public enableFade = true;\r\n\r\n /**\r\n * Gets or sets a value corresponding to the width of the edge fade effect (Default 1.5).\r\n */\r\n @serialize()\r\n public fadeWidth = 1.5;\r\n\r\n /**\r\n * Gets or sets whether the active face is smoothly interpolated.\r\n */\r\n @serialize()\r\n public smoothActiveFace = true;\r\n\r\n /**\r\n * Gets or sets whether the frame of the fluent button model is visible.\r\n * This is usually only enabled for debugging purposes.\r\n */\r\n @serialize()\r\n public showFrame = false;\r\n\r\n /**\r\n * Gets or sets whether the blob color texture is used for the proximity\r\n * light effect. This is usually only disabled for debugging purposes.\r\n */\r\n @serialize()\r\n public useBlobTexture = true;\r\n\r\n /**\r\n * Gets or sets the world-space position of the tip of the left index finger.\r\n */\r\n @serializeAsVector3()\r\n public globalLeftIndexTipPosition = Vector3.Zero();\r\n\r\n /**\r\n * Gets or sets the world-space position of the tip of the right index finger.\r\n */\r\n @serializeAsVector3()\r\n public globalRightIndexTipPosition = Vector3.Zero();\r\n\r\n private _blobTexture: Texture;\r\n\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene);\r\n this.alphaMode = Constants.ALPHA_ADD;\r\n this.disableDepthWrite = true;\r\n this.backFaceCulling = false;\r\n const blobTextureUrl = Tools.GetAssetUrl(FluentButtonMaterial.BLOB_TEXTURE_URL);\r\n this._blobTexture = new Texture(blobTextureUrl, this.getScene(), true, false, Texture.NEAREST_SAMPLINGMODE);\r\n }\r\n\r\n public override needAlphaBlending(): boolean {\r\n return true;\r\n }\r\n\r\n public override needAlphaTesting(): boolean {\r\n return true;\r\n }\r\n\r\n public override getAlphaTestTexture(): Nullable<BaseTexture> {\r\n return null;\r\n }\r\n\r\n // Methods\r\n public override isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n const drawWrapper = subMesh._drawWrapper;\r\n\r\n if (this.isFrozen) {\r\n if (drawWrapper.effect && drawWrapper._wasPreviouslyReady) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n subMesh.materialDefines = new FluentButtonMaterialDefines();\r\n }\r\n\r\n const defines = <FluentButtonMaterialDefines>subMesh.materialDefines;\r\n const scene = this.getScene();\r\n\r\n if (!this._blobTexture.isReady()) {\r\n return false;\r\n }\r\n\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n // Attribs\r\n PrepareDefinesForAttributes(mesh, defines, true, false);\r\n\r\n // Get correct effect\r\n if (defines.isDirty) {\r\n defines.markAsProcessed();\r\n\r\n scene.resetCachedMaterial();\r\n\r\n // Fallbacks\r\n const fallbacks = new EffectFallbacks();\r\n if (defines.FOG) {\r\n fallbacks.addFallback(1, \"FOG\");\r\n }\r\n\r\n HandleFallbacksForShadows(defines, fallbacks);\r\n\r\n defines.IMAGEPROCESSINGPOSTPROCESS = scene.imageProcessingConfiguration.applyByPostProcess;\r\n\r\n //Attributes\r\n const attribs = [VertexBuffer.PositionKind];\r\n\r\n if (defines.NORMAL) {\r\n attribs.push(VertexBuffer.NormalKind);\r\n }\r\n\r\n if (defines.UV1) {\r\n attribs.push(VertexBuffer.UVKind);\r\n }\r\n\r\n if (defines.UV2) {\r\n attribs.push(VertexBuffer.UV2Kind);\r\n }\r\n\r\n if (defines.VERTEXCOLOR) {\r\n attribs.push(VertexBuffer.ColorKind);\r\n }\r\n\r\n if (defines.TANGENT) {\r\n attribs.push(VertexBuffer.TangentKind);\r\n }\r\n\r\n PrepareAttributesForInstances(attribs, defines);\r\n\r\n // Legacy browser patch\r\n const shaderName = \"fluentButton\";\r\n const join = defines.toString();\r\n\r\n const uniforms = [\r\n \"world\",\r\n \"viewProjection\",\r\n \"cameraPosition\",\r\n\r\n \"_Edge_Width_\",\r\n \"_Edge_Color_\",\r\n \"_Relative_Width_\",\r\n \"_Proximity_Max_Intensity_\",\r\n \"_Proximity_Far_Distance_\",\r\n \"_Proximity_Near_Radius_\",\r\n \"_Proximity_Anisotropy_\",\r\n \"_Selection_Fuzz_\",\r\n \"_Selected_\",\r\n \"_Selection_Fade_\",\r\n \"_Selection_Fade_Size_\",\r\n \"_Selected_Distance_\",\r\n \"_Selected_Fade_Length_\",\r\n \"_Blob_Enable_\",\r\n \"_Blob_Position_\",\r\n \"_Blob_Intensity_\",\r\n \"_Blob_Near_Size_\",\r\n \"_Blob_Far_Size_\",\r\n \"_Blob_Near_Distance_\",\r\n \"_Blob_Far_Distance_\",\r\n \"_Blob_Fade_Length_\",\r\n \"_Blob_Inner_Fade_\",\r\n \"_Blob_Pulse_\",\r\n \"_Blob_Fade_\",\r\n \"_Blob_Texture_\",\r\n \"_Blob_Enable_2_\",\r\n \"_Blob_Position_2_\",\r\n \"_Blob_Near_Size_2_\",\r\n \"_Blob_Inner_Fade_2_\",\r\n \"_Blob_Pulse_2_\",\r\n \"_Blob_Fade_2_\",\r\n \"_Active_Face_Dir_\",\r\n \"_Active_Face_Up_\",\r\n \"_Enable_Fade_\",\r\n \"_Fade_Width_\",\r\n \"_Smooth_Active_Face_\",\r\n \"_Show_Frame_\",\r\n \"_Use_Blob_Texture_\",\r\n\r\n \"Use_Global_Left_Index\",\r\n \"Use_Global_Right_Index\",\r\n \"Global_Left_Index_Tip_Position\",\r\n \"Global_Right_Index_Tip_Position\",\r\n \"Global_Left_Thumb_Tip_Position\",\r\n \"Global_Right_Thumb_Tip_Position\",\r\n \"Global_Left_Index_Tip_Proximity\",\r\n \"Global_Right_Index_Tip_Proximity\",\r\n ];\r\n const samplers: string[] = [\"_Blob_Texture_\"];\r\n const uniformBuffers: string[] = [];\r\n\r\n PrepareUniformsAndSamplersList(<IEffectCreationOptions>{\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: defines,\r\n maxSimultaneousLights: 4,\r\n });\r\n\r\n subMesh.setEffect(\r\n scene.getEngine().createEffect(\r\n shaderName,\r\n <IEffectCreationOptions>{\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: join,\r\n fallbacks: fallbacks,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n indexParameters: { maxSimultaneousLights: 4 },\r\n },\r\n engine\r\n ),\r\n defines,\r\n this._materialContext\r\n );\r\n }\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n\r\n return true;\r\n }\r\n\r\n public override bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const scene = this.getScene();\r\n\r\n const defines = <FluentButtonMaterialDefines>subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n\r\n this._activeEffect = effect;\r\n\r\n // Matrices\r\n this.bindOnlyWorldMatrix(world);\r\n this._activeEffect.setMatrix(\"viewProjection\", scene.getTransformMatrix());\r\n this._activeEffect.setVector3(\"cameraPosition\", scene.activeCamera!.position);\r\n\r\n // \"Blob Texture\"\r\n this._activeEffect.setTexture(\"_Blob_Texture_\", this._blobTexture);\r\n\r\n // \"Wireframe\"\r\n this._activeEffect.setFloat(\"_Edge_Width_\", this.edgeWidth);\r\n this._activeEffect.setColor4(\"_Edge_Color_\", new Color3(this.edgeColor.r, this.edgeColor.g, this.edgeColor.b), this.edgeColor.a);\r\n //define _Relative_Width_ true;\r\n\r\n // \"Proximity\"\r\n this._activeEffect.setFloat(\"_Proximity_Max_Intensity_\", this.proximityMaxIntensity);\r\n this._activeEffect.setFloat(\"_Proximity_Far_Distance_\", this.proximityFarDistance);\r\n this._activeEffect.setFloat(\"_Proximity_Near_Radius_\", this.proximityNearRadius);\r\n this._activeEffect.setFloat(\"_Proximity_Anisotropy_\", this.proximityAnisotropy);\r\n\r\n // \"Selection\"\r\n this._activeEffect.setFloat(\"_Selection_Fuzz_\", this.selectionFuzz);\r\n this._activeEffect.setFloat(\"_Selected_\", this.selected);\r\n this._activeEffect.setFloat(\"_Selection_Fade_\", this.selectionFade);\r\n this._activeEffect.setFloat(\"_Selection_Fade_Size_\", this.selectionFadeSize);\r\n this._activeEffect.setFloat(\"_Selected_Distance_\", this.selectedDistance);\r\n this._activeEffect.setFloat(\"_Selected_Fade_Length_\", this.selectedFadeLength);\r\n\r\n // \"Blob\"\r\n this._activeEffect.setFloat(\"_Blob_Enable_\", this.leftBlobEnable ? 1.0 : 0.0);\r\n this._activeEffect.setFloat(\"_Blob_Intensity_\", this.blobIntensity);\r\n this._activeEffect.setFloat(\"_Blob_Near_Size_\", this.leftBlobNearSize);\r\n this._activeEffect.setFloat(\"_Blob_Far_Size_\", this.blobFarSize);\r\n this._activeEffect.setFloat(\"_Blob_Near_Distance_\", this.blobNearDistance);\r\n this._activeEffect.setFloat(\"_Blob_Far_Distance_\", this.blobFarDistance);\r\n this._activeEffect.setFloat(\"_Blob_Fade_Length_\", this.blobFadeLength);\r\n this._activeEffect.setFloat(\"_Blob_Inner_Fade_\", this.leftBlobInnerFade);\r\n this._activeEffect.setFloat(\"_Blob_Pulse_\", this.leftBlobPulse);\r\n this._activeEffect.setFloat(\"_Blob_Fade_\", this.leftBlobFade);\r\n\r\n // \"Blob 2\"\r\n this._activeEffect.setFloat(\"_Blob_Enable_2_\", this.rightBlobEnable ? 1.0 : 0.0);\r\n this._activeEffect.setFloat(\"_Blob_Near_Size_2_\", this.rightBlobNearSize);\r\n this._activeEffect.setFloat(\"_Blob_Inner_Fade_2_\", this.rightBlobInnerFade);\r\n this._activeEffect.setFloat(\"_Blob_Pulse_2_\", this.rightBlobPulse);\r\n this._activeEffect.setFloat(\"_Blob_Fade_2_\", this.rightBlobFade);\r\n\r\n // \"Active Face\"\r\n this._activeEffect.setVector3(\"_Active_Face_Dir_\", this.activeFaceDir);\r\n this._activeEffect.setVector3(\"_Active_Face_Up_\", this.activeFaceUp);\r\n\r\n // \"Hololens Edge Fade\"\r\n //define _Enable_Fade_ true;\r\n this._activeEffect.setFloat(\"_Fade_Width_\", this.fadeWidth);\r\n this._activeEffect.setFloat(\"_Smooth_Active_Face_\", this.smoothActiveFace ? 1.0 : 0.0);\r\n\r\n // \"Debug\"\r\n this._activeEffect.setFloat(\"_Show_Frame_\", this.showFrame ? 1.0 : 0.0);\r\n this._activeEffect.setFloat(\"_Use_Blob_Texture_\", this.useBlobTexture ? 1.0 : 0.0);\r\n\r\n // Global inputs\r\n this._activeEffect.setFloat(\"Use_Global_Left_Index\", 1.0);\r\n this._activeEffect.setFloat(\"Use_Global_Right_Index\", 1.0);\r\n\r\n this._activeEffect.setVector4(\r\n \"Global_Left_Index_Tip_Position\",\r\n new Vector4(this.globalLeftIndexTipPosition.x, this.globalLeftIndexTipPosition.y, this.globalLeftIndexTipPosition.z, 1.0)\r\n );\r\n this._activeEffect.setVector4(\r\n \"Global_Right_Index_Tip_Position\",\r\n new Vector4(this.globalRightIndexTipPosition.x, this.globalRightIndexTipPosition.y, this.globalRightIndexTipPosition.z, 1.0)\r\n );\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n /**\r\n * Get the list of animatables in the material.\r\n * @returns the list of animatables object used in the material\r\n */\r\n public override getAnimatables(): IAnimatable[] {\r\n return [];\r\n }\r\n\r\n public override dispose(forceDisposeEffect?: boolean): void {\r\n super.dispose(forceDisposeEffect);\r\n }\r\n\r\n public override clone(name: string): FluentButtonMaterial {\r\n return SerializationHelper.Clone(() => new FluentButtonMaterial(name, this.getScene()), this);\r\n }\r\n\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.customType = \"BABYLON.FluentButtonMaterial\";\r\n return serializationObject;\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"FluentButtonMaterial\";\r\n }\r\n\r\n // Statics\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): FluentButtonMaterial {\r\n return SerializationHelper.Parse(() => new FluentButtonMaterial(source.name, scene), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GUI.FluentButtonMaterial\", FluentButtonMaterial);\r\n","// Assumptions: absolute position of button mesh is inside the mesh\r\n\r\nimport { Vector3, TmpVectors } from \"core/Maths/math.vector\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { PointerEventTypes } from \"core/Events/pointerEvents\";\r\nimport { type TransformNode } from \"core/Meshes/transformNode\";\r\nimport { type Scene } from \"core/scene\";\r\n\r\nimport { Observable } from \"core/Misc/observable\";\r\n\r\nimport { Button3D } from \"./button3D\";\r\n\r\n/**\r\n * Class used to create a touchable button in 3D\r\n */\r\nexport class TouchButton3D extends Button3D {\r\n private _collisionMesh: Mesh;\r\n\r\n // 'front' direction. If Vector3.Zero, there is no front and all directions of interaction are accepted\r\n private _collidableFrontDirection: Vector3;\r\n private _isNearPressed = false;\r\n private _interactionSurfaceHeight = 0;\r\n\r\n private _isToggleButton = false;\r\n private _toggleState = false;\r\n private _toggleButtonCallback = () => {\r\n this._onToggle(!this._toggleState);\r\n };\r\n\r\n /**\r\n * An event triggered when the button is toggled. Only fired if 'isToggleButton' is true\r\n */\r\n public onToggleObservable = new Observable<boolean>();\r\n\r\n /**\r\n * Creates a new touchable button\r\n * @param name defines the control name\r\n * @param collisionMesh mesh to track collisions with\r\n */\r\n constructor(name?: string, collisionMesh?: Mesh) {\r\n super(name);\r\n\r\n this.collidableFrontDirection = Vector3.Zero();\r\n\r\n if (collisionMesh) {\r\n this.collisionMesh = collisionMesh;\r\n }\r\n }\r\n\r\n /**\r\n * Whether the current interaction is caused by near interaction or not\r\n */\r\n public get isActiveNearInteraction() {\r\n return this._isNearPressed;\r\n }\r\n\r\n /**\r\n * Sets the front-facing direction of the button. Pass in Vector3.Zero to allow interactions from any direction\r\n * @param frontWorldDir the forward direction of the button\r\n */\r\n public set collidableFrontDirection(frontWorldDir: Vector3) {\r\n this._collidableFrontDirection = frontWorldDir.normalize();\r\n\r\n if (this._collisionMesh) {\r\n const invert = TmpVectors.Matrix[0];\r\n\r\n invert.copyFrom(this._collisionMesh.getWorldMatrix());\r\n invert.invert();\r\n Vector3.TransformNormalToRef(this._collidableFrontDirection, invert, this._collidableFrontDirection);\r\n this._collidableFrontDirection.normalize();\r\n }\r\n }\r\n\r\n /**\r\n * Returns the front-facing direction of the button, or Vector3.Zero if there is no 'front'\r\n */\r\n public get collidableFrontDirection() {\r\n if (this._collisionMesh) {\r\n // Update the front direction to reflect any rotations of the collision mesh\r\n const transformedDirection = TmpVectors.Vector3[0];\r\n Vector3.TransformNormalToRef(this._collidableFrontDirection, this._collisionMesh.getWorldMatrix(), transformedDirection);\r\n\r\n return transformedDirection.normalize();\r\n }\r\n\r\n return this._collidableFrontDirection;\r\n }\r\n\r\n /**\r\n * Sets the mesh used for testing input collision\r\n * @param collisionMesh the new collision mesh for the button\r\n */\r\n public set collisionMesh(collisionMesh: Mesh) {\r\n // Remove the GUI3DManager's data from the previous collision mesh's reserved data store, and reset interactability\r\n if (this._collisionMesh) {\r\n this._collisionMesh.isNearPickable = false;\r\n if (this._collisionMesh.reservedDataStore?.GUI3D) {\r\n this._collisionMesh.reservedDataStore.GUI3D = {};\r\n }\r\n\r\n const meshes = this._collisionMesh.getChildMeshes();\r\n for (const mesh of meshes) {\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 const meshes = this._collisionMesh.getChildMeshes();\r\n for (const mesh of meshes) {\r\n this._injectGUI3DReservedDataStore(mesh).control = this;\r\n mesh.isNearPickable = true;\r\n }\r\n this.collidableFrontDirection = collisionMesh.forward;\r\n }\r\n\r\n /**\r\n * Setter for if this TouchButton3D should be treated as a toggle button\r\n * @param value If this TouchHolographicButton should act like a toggle button\r\n */\r\n public set isToggleButton(value: boolean) {\r\n if (value === this._isToggleButton) {\r\n return;\r\n }\r\n\r\n this._isToggleButton = value;\r\n\r\n if (value) {\r\n this.onPointerUpObservable.add(this._toggleButtonCallback);\r\n } else {\r\n this.onPointerUpObservable.removeCallback(this._toggleButtonCallback);\r\n\r\n // Safety check, reset the button if it's toggled on but no longer a toggle button\r\n if (this._toggleState) {\r\n this._onToggle(false);\r\n }\r\n }\r\n }\r\n public get isToggleButton() {\r\n return this._isToggleButton;\r\n }\r\n\r\n /**\r\n * A public entrypoint to set the toggle state of the TouchHolographicButton. Only works if 'isToggleButton' is true\r\n * @param newState The new state to set the TouchHolographicButton's toggle state to\r\n */\r\n public set isToggled(newState: boolean) {\r\n if (this._isToggleButton && this._toggleState !== newState) {\r\n this._onToggle(newState);\r\n }\r\n }\r\n public get isToggled() {\r\n return this._toggleState;\r\n }\r\n\r\n protected _onToggle(newState: boolean) {\r\n this._toggleState = newState;\r\n this.onToggleObservable.notifyObservers(newState);\r\n }\r\n\r\n // Returns true if the collidable is in front of the button, or if the button has no front direction\r\n private _isInteractionInFrontOfButton(collidablePos: Vector3) {\r\n return this._getInteractionHeight(collidablePos, this._collisionMesh.getAbsolutePosition()) > 0;\r\n }\r\n\r\n /**\r\n * Get the height of the touchPoint from the collidable part of the button\r\n * @param touchPoint the point to compare to the button, in absolute position\r\n * @returns the depth of the touch point into the front of the button\r\n */\r\n public getPressDepth(touchPoint: Vector3) {\r\n if (!this._isNearPressed) {\r\n return 0;\r\n }\r\n const interactionHeight = this._getInteractionHeight(touchPoint, this._collisionMesh.getAbsolutePosition());\r\n return this._interactionSurfaceHeight - interactionHeight;\r\n }\r\n\r\n // Returns true if the collidable is in front of the button, or if the button has no front direction\r\n protected _getInteractionHeight(interactionPos: Vector3, basePos: Vector3) {\r\n const frontDir = this.collidableFrontDirection;\r\n if (frontDir.length() === 0) {\r\n // The button has no front, just return the distance to the base\r\n return Vector3.Distance(interactionPos, basePos);\r\n }\r\n const d = Vector3.Dot(basePos, frontDir);\r\n const abc = Vector3.Dot(interactionPos, frontDir);\r\n\r\n return abc - d;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _generatePointerEventType(providedType: number, nearMeshPosition: Vector3, activeInteractionCount: number): number {\r\n if (providedType === PointerEventTypes.POINTERDOWN || providedType === PointerEventTypes.POINTERMOVE) {\r\n if (!this._isInteractionInFrontOfButton(nearMeshPosition)) {\r\n // Near interaction mesh is behind the button, don't send a pointer down\r\n return PointerEventTypes.POINTERMOVE;\r\n } else {\r\n this._isNearPressed = true;\r\n this._interactionSurfaceHeight = this._getInteractionHeight(nearMeshPosition, this._collisionMesh.getAbsolutePosition());\r\n }\r\n }\r\n if (providedType === PointerEventTypes.POINTERUP) {\r\n if (activeInteractionCount == 0) {\r\n // We get the release for the down we swallowed earlier, swallow as well\r\n return PointerEventTypes.POINTERMOVE;\r\n } else {\r\n this._isNearPressed = false;\r\n }\r\n }\r\n\r\n return providedType;\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"TouchButton3D\";\r\n }\r\n\r\n // Mesh association\r\n protected override _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 override dispose() {\r\n super.dispose();\r\n\r\n // Clean up toggle observables\r\n this.onPointerUpObservable.removeCallback(this._toggleButtonCallback);\r\n this.onToggleObservable.clear();\r\n\r\n if (this._collisionMesh) {\r\n this._collisionMesh.dispose();\r\n }\r\n }\r\n}\r\n","import { type Nullable } from \"core/types\";\r\nimport { type Observer } from \"core/Misc/observable\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { CreatePlane } from \"core/Meshes/Builders/planeBuilder\";\r\nimport { CreateBox } from \"core/Meshes/Builders/boxBuilder\";\r\nimport { FadeInOutBehavior } from \"core/Behaviors/Meshes/fadeInOutBehavior\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { FluentMaterial } from \"../materials/fluent/fluentMaterial\";\r\nimport { FluentButtonMaterial } from \"../materials/fluentButton/fluentButtonMaterial\";\r\nimport { StackPanel } from \"../../2D/controls/stackPanel\";\r\nimport { Image } from \"../../2D/controls/image\";\r\nimport { TextBlock } from \"../../2D/controls/textBlock\";\r\nimport { AdvancedDynamicTexture } from \"../../2D/advancedDynamicTexture\";\r\nimport { type Control3D } from \"./control3D\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { TouchButton3D } from \"./touchButton3D\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { SceneLoader } from \"core/Loading/sceneLoader\";\r\nimport { IsDocumentAvailable } from \"core/Misc/domManagement\";\r\nimport { Scalar } from \"core/Maths/math.scalar\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\n/**\r\n * Class used to create a holographic button in 3D\r\n * @since 5.0.0\r\n */\r\nexport class TouchHolographicButton extends TouchButton3D {\r\n /**\r\n * Base Url for the button model.\r\n */\r\n public static MODEL_BASE_URL: string = \"https://assets.babylonjs.com/core/MRTK/\";\r\n /**\r\n * File name for the button model.\r\n */\r\n public static MODEL_FILENAME: string = \"mrtk-fluent-button.glb\";\r\n\r\n private _backPlate: Mesh;\r\n private _textPlate: Mesh;\r\n private _frontPlate: AbstractMesh;\r\n private _text: string;\r\n private _imageUrl: string;\r\n private _shareMaterials = true;\r\n private _isBackplateVisible = true;\r\n private _frontMaterial: FluentButtonMaterial;\r\n private _backMaterial: FluentMaterial;\r\n private _plateMaterial: StandardMaterial;\r\n private _pickedPointObserver: Nullable<Observer<Nullable<Vector3>>>;\r\n private _pointerHoverObserver: Nullable<Observer<Vector3>>;\r\n private _frontPlateDepth = 0.5;\r\n private _backPlateDepth = 0.04;\r\n private _backplateColor = new Color3(0.08, 0.15, 0.55);\r\n private _backplateToggledColor = new Color3(0.25, 0.4, 0.95);\r\n\r\n // Tooltip\r\n private _tooltipFade: Nullable<FadeInOutBehavior>;\r\n private _tooltipTextBlock: Nullable<TextBlock>;\r\n private _tooltipTexture: Nullable<AdvancedDynamicTexture>;\r\n private _tooltipMesh: Nullable<Mesh>;\r\n private _tooltipHoverObserver: Nullable<Observer<Control3D>>;\r\n private _tooltipOutObserver: Nullable<Observer<Control3D>>;\r\n\r\n private _disposeTooltip() {\r\n this._tooltipFade = null;\r\n if (this._tooltipTextBlock) {\r\n this._tooltipTextBlock.dispose();\r\n }\r\n if (this._tooltipTexture) {\r\n this._tooltipTexture.dispose();\r\n }\r\n if (this._tooltipMesh) {\r\n this._tooltipMesh.dispose();\r\n }\r\n this.onPointerEnterObservable.remove(this._tooltipHoverObserver);\r\n this.onPointerOutObservable.remove(this._tooltipOutObserver);\r\n }\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._textPlate.renderingGroupId = id;\r\n this._frontPlate.renderingGroupId = id;\r\n\r\n if (this._tooltipMesh) {\r\n this._tooltipMesh.renderingGroupId = id;\r\n }\r\n }\r\n public get renderingGroupId(): number {\r\n return this._backPlate.renderingGroupId;\r\n }\r\n\r\n /**\r\n * Gets the mesh used to render this control\r\n */\r\n public override get mesh(): Nullable<AbstractMesh> {\r\n return this._backPlate as AbstractMesh;\r\n }\r\n\r\n /**\r\n * Text to be displayed on the tooltip shown when hovering on the button. When set to null tooltip is disabled. (Default: null)\r\n */\r\n public set tooltipText(text: Nullable<string>) {\r\n if (!text) {\r\n this._disposeTooltip();\r\n return;\r\n }\r\n if (!this._tooltipFade) {\r\n const rightHandedScene = this._backPlate._scene.useRightHandedSystem;\r\n // Create tooltip with mesh and text\r\n this._tooltipMesh = CreatePlane(\"\", { size: 1 }, this._backPlate._scene);\r\n const tooltipBackground = CreatePlane(\"\", { size: 1, sideOrientation: Mesh.DOUBLESIDE }, this._backPlate._scene);\r\n const mat = new StandardMaterial(\"\", this._backPlate._scene);\r\n mat.diffuseColor = Color3.FromHexString(\"#212121\");\r\n tooltipBackground.material = mat;\r\n tooltipBackground.isPickable = false;\r\n this._tooltipMesh.addChild(tooltipBackground);\r\n tooltipBackground.position = Vector3.Forward(rightHandedScene).scale(0.05);\r\n this._tooltipMesh.scaling.y = 1 / 3;\r\n this._tooltipMesh.position = Vector3.Up().scale(0.7).add(Vector3.Forward(rightHandedScene).scale(-0.15));\r\n this._tooltipMesh.isPickable = false;\r\n this._tooltipMesh.parent = this._backPlate;\r\n\r\n // Create text texture for the tooltip\r\n this._tooltipTexture = AdvancedDynamicTexture.CreateForMesh(this._tooltipMesh);\r\n this._tooltipTextBlock = new TextBlock();\r\n this._tooltipTextBlock.scaleY = 3;\r\n this._tooltipTextBlock.color = \"white\";\r\n this._tooltipTextBlock.fontSize = 130;\r\n this._tooltipTexture.addControl(this._tooltipTextBlock);\r\n\r\n // Add hover action to tooltip\r\n this._tooltipFade = new FadeInOutBehavior();\r\n this._tooltipFade.delay = 500;\r\n this._tooltipMesh.addBehavior(this._tooltipFade);\r\n this._tooltipHoverObserver = this.onPointerEnterObservable.add(() => {\r\n if (this._tooltipFade) {\r\n this._tooltipFade.fadeIn(true);\r\n }\r\n });\r\n this._tooltipOutObserver = this.onPointerOutObservable.add(() => {\r\n if (this._tooltipFade) {\r\n this._tooltipFade.fadeIn(false);\r\n }\r\n });\r\n }\r\n if (this._tooltipTextBlock) {\r\n this._tooltipTextBlock.text = text;\r\n }\r\n }\r\n\r\n public get tooltipText() {\r\n if (this._tooltipTextBlock) {\r\n return this._tooltipTextBlock.text;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets or sets text for the button\r\n */\r\n public get text(): string {\r\n return this._text;\r\n }\r\n\r\n public set text(value: string) {\r\n if (this._text === value) {\r\n return;\r\n }\r\n\r\n this._text = value;\r\n this._rebuildContent();\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 }\r\n\r\n /**\r\n * Gets the back material used by this button\r\n */\r\n public get backMaterial(): FluentMaterial {\r\n return this._backMaterial;\r\n }\r\n\r\n /**\r\n * Gets the front material used by this button\r\n */\r\n public get frontMaterial(): FluentButtonMaterial {\r\n return this._frontMaterial;\r\n }\r\n\r\n /**\r\n * Gets the plate material used by this button\r\n */\r\n public get plateMaterial(): StandardMaterial {\r\n return this._plateMaterial;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this button shares its material with other HolographicButtons\r\n */\r\n public get shareMaterials(): boolean {\r\n return this._shareMaterials;\r\n }\r\n\r\n /**\r\n * Sets whether the backplate is visible or hidden. Hiding the backplate is not recommended without some sort of replacement\r\n */\r\n public set isBackplateVisible(isVisible: boolean) {\r\n if (this.mesh && !!this._backMaterial) {\r\n if (isVisible && !this._isBackplateVisible) {\r\n this._backPlate.visibility = 1;\r\n } else if (!isVisible && this._isBackplateVisible) {\r\n this._backPlate.visibility = 0;\r\n }\r\n }\r\n\r\n this._isBackplateVisible = isVisible;\r\n }\r\n\r\n /**\r\n * Creates a new button\r\n * @param name defines the control name\r\n * @param shareMaterials\r\n */\r\n constructor(name?: string, shareMaterials = true) {\r\n super(name);\r\n\r\n this._shareMaterials = shareMaterials;\r\n\r\n this.pointerEnterAnimation = () => {\r\n this._frontMaterial.leftBlobEnable = true;\r\n this._frontMaterial.rightBlobEnable = true;\r\n };\r\n\r\n this.pointerOutAnimation = () => {\r\n this._frontMaterial.leftBlobEnable = false;\r\n this._frontMaterial.rightBlobEnable = false;\r\n };\r\n\r\n this.pointerDownAnimation = () => {\r\n if (this._frontPlate && !this.isActiveNearInteraction) {\r\n this._frontPlate.scaling.z = this._frontPlateDepth * 0.2;\r\n this._frontPlate.position = Vector3.Forward(this._frontPlate._scene.useRightHandedSystem).scale((this._frontPlateDepth - 0.2 * this._frontPlateDepth) / 2);\r\n this._textPlate.position = Vector3.Forward(this._textPlate._scene.useRightHandedSystem).scale(-(this._backPlateDepth + 0.2 * this._frontPlateDepth) / 2);\r\n }\r\n };\r\n this.pointerUpAnimation = () => {\r\n if (this._frontPlate) {\r\n this._frontPlate.scaling.z = this._frontPlateDepth;\r\n this._frontPlate.position = Vector3.Forward(this._frontPlate._scene.useRightHandedSystem).scale((this._frontPlateDepth - this._frontPlateDepth) / 2);\r\n this._textPlate.position = Vector3.Forward(this._textPlate._scene.useRightHandedSystem).scale(-(this._backPlateDepth + this._frontPlateDepth) / 2);\r\n }\r\n };\r\n\r\n this.onPointerMoveObservable.add((position) => {\r\n if (this._frontPlate && this.isActiveNearInteraction) {\r\n const scale = Vector3.Zero();\r\n if (this._backPlate.getWorldMatrix().decompose(scale, undefined, undefined)) {\r\n let interactionHeight = this._getInteractionHeight(position, this._backPlate.getAbsolutePosition()) / scale.z;\r\n interactionHeight = Scalar.Clamp(interactionHeight - this._backPlateDepth / 2, 0.2 * this._frontPlateDepth, this._frontPlateDepth);\r\n\r\n this._frontPlate.scaling.z = interactionHeight;\r\n this._frontPlate.position = Vector3.Forward(this._frontPlate._scene.useRightHandedSystem).scale((this._frontPlateDepth - interactionHeight) / 2);\r\n this._textPlate.position = Vector3.Forward(this._textPlate._scene.useRightHandedSystem).scale(-(this._backPlateDepth + interactionHeight) / 2);\r\n }\r\n }\r\n });\r\n\r\n this._pointerHoverObserver = this.onPointerMoveObservable.add((hoverPosition: Vector3) => {\r\n this._frontMaterial.globalLeftIndexTipPosition = hoverPosition;\r\n });\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"TouchHolographicButton\";\r\n }\r\n\r\n private _rebuildContent(): void {\r\n this._disposeFacadeTexture();\r\n\r\n const panel = new StackPanel();\r\n panel.isVertical = true;\r\n\r\n if (IsDocumentAvailable() && !!document.createElement) {\r\n if (this._imageUrl) {\r\n const image = new Image();\r\n image.source = this._imageUrl;\r\n image.paddingTop = \"40px\";\r\n image.height = \"180px\";\r\n image.width = \"100px\";\r\n image.paddingBottom = \"40px\";\r\n panel.addControl(image);\r\n }\r\n }\r\n\r\n if (this._text) {\r\n const text = new TextBlock();\r\n text.text = this._text;\r\n text.color = \"white\";\r\n text.height = \"30px\";\r\n text.fontSize = 24;\r\n panel.addControl(text);\r\n }\r\n\r\n this.content = panel;\r\n }\r\n\r\n // Mesh association\r\n protected override _createNode(scene: Scene): TransformNode {\r\n this.name = this.name ?? \"TouchHolographicButton\";\r\n const collisionMesh = CreateBox(\r\n `${this.name}_collisionMesh`,\r\n {\r\n width: 1.0,\r\n height: 1.0,\r\n depth: this._frontPlateDepth,\r\n },\r\n scene\r\n );\r\n collisionMesh.isPickable = true;\r\n collisionMesh.isNearPickable = true;\r\n collisionMesh.visibility = 0;\r\n collisionMesh.position = Vector3.Forward(scene.useRightHandedSystem).scale(-this._frontPlateDepth / 2);\r\n const baseUrl = Tools.GetAssetUrl(TouchHolographicButton.MODEL_BASE_URL);\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n SceneLoader.ImportMeshAsync(undefined, baseUrl, TouchHolographicButton.MODEL_FILENAME, scene).then((result) => {\r\n const alphaMesh = CreateBox(\r\n `${this.name}_alphaMesh`,\r\n {\r\n width: 1.0,\r\n height: 1.0,\r\n depth: 1.0,\r\n },\r\n scene\r\n );\r\n alphaMesh.isPickable = false;\r\n alphaMesh.material = new StandardMaterial(`${this.name}_alphaMesh_material`, scene);\r\n alphaMesh.material.alpha = 0.15;\r\n\r\n const importedFrontPlate = result.meshes[1];\r\n importedFrontPlate.name = `${this.name}_frontPlate`;\r\n importedFrontPlate.isPickable = false;\r\n importedFrontPlate.scaling.z = this._frontPlateDepth;\r\n alphaMesh.parent = importedFrontPlate;\r\n importedFrontPlate.parent = collisionMesh;\r\n if (this._frontMaterial) {\r\n importedFrontPlate.material = this._frontMaterial;\r\n }\r\n this._frontPlate = importedFrontPlate;\r\n });\r\n\r\n this._backPlate = CreateBox(\r\n `${this.name}_backPlate`,\r\n {\r\n width: 1.0,\r\n height: 1.0,\r\n depth: this._backPlateDepth,\r\n },\r\n scene\r\n );\r\n\r\n this._backPlate.position = Vector3.Forward(scene.useRightHandedSystem).scale(this._backPlateDepth / 2);\r\n this._backPlate.isPickable = false;\r\n\r\n this._textPlate = <Mesh>super._createNode(scene);\r\n this._textPlate.name = `${this.name}_textPlate`;\r\n this._textPlate.isPickable = false;\r\n this._textPlate.position = Vector3.Forward(scene.useRightHandedSystem).scale(-this._frontPlateDepth / 2);\r\n\r\n this._backPlate.addChild(collisionMesh);\r\n this._backPlate.addChild(this._textPlate);\r\n\r\n const tn = new TransformNode(`${this.name}_root`, scene);\r\n this._backPlate.setParent(tn);\r\n\r\n this.collisionMesh = collisionMesh;\r\n this.collidableFrontDirection = this._backPlate.forward.negate(); // Mesh is facing the wrong way\r\n\r\n return tn;\r\n }\r\n\r\n protected override _applyFacade(facadeTexture: AdvancedDynamicTexture) {\r\n this._plateMaterial.emissiveTexture = facadeTexture;\r\n this._plateMaterial.opacityTexture = facadeTexture;\r\n this._plateMaterial.diffuseColor = new Color3(0.4, 0.4, 0.4);\r\n }\r\n\r\n private _createBackMaterial(mesh: Mesh) {\r\n this._backMaterial = new FluentMaterial(this.name + \"backPlateMaterial\", mesh.getScene());\r\n this._backMaterial.albedoColor = this._backplateColor;\r\n this._backMaterial.renderBorders = true;\r\n this._backMaterial.renderHoverLight = false;\r\n }\r\n\r\n private _createFrontMaterial(mesh: Mesh) {\r\n this._frontMaterial = new FluentButtonMaterial(this.name + \"Front Material\", mesh.getScene());\r\n }\r\n\r\n private _createPlateMaterial(mesh: Mesh) {\r\n this._plateMaterial = new StandardMaterial(this.name + \"Plate Material\", mesh.getScene());\r\n this._plateMaterial.specularColor = Color3.Black();\r\n }\r\n\r\n protected override _onToggle(newState: boolean) {\r\n if (this._backMaterial) {\r\n if (newState) {\r\n this._backMaterial.albedoColor = this._backplateToggledColor;\r\n } else {\r\n this._backMaterial.albedoColor = this._backplateColor;\r\n }\r\n }\r\n\r\n super._onToggle(newState);\r\n }\r\n\r\n protected override _affectMaterial(mesh: Mesh) {\r\n if (this._shareMaterials) {\r\n // Back\r\n if (!this._host._touchSharedMaterials[\"backFluentMaterial\"]) {\r\n this._createBackMaterial(mesh);\r\n this._host._touchSharedMaterials[\"backFluentMaterial\"] = this._backMaterial;\r\n } else {\r\n this._backMaterial = this._host._touchSharedMaterials[\"backFluentMaterial\"] as FluentMaterial;\r\n }\r\n\r\n // Front\r\n if (!this._host._touchSharedMaterials[\"frontFluentMaterial\"]) {\r\n this._createFrontMaterial(mesh);\r\n this._host._touchSharedMaterials[\"frontFluentMaterial\"] = this._frontMaterial;\r\n } else {\r\n this._frontMaterial = this._host._touchSharedMaterials[\"frontFluentMaterial\"] as FluentButtonMaterial;\r\n }\r\n } else {\r\n this._createBackMaterial(mesh);\r\n this._createFrontMaterial(mesh);\r\n }\r\n\r\n this._createPlateMaterial(mesh);\r\n this._backPlate.material = this._backMaterial;\r\n this._textPlate.material = this._plateMaterial;\r\n\r\n if (!this._isBackplateVisible) {\r\n this._backPlate.visibility = 0;\r\n }\r\n if (this._frontPlate) {\r\n this._frontPlate.material = this._frontMaterial;\r\n }\r\n\r\n this._rebuildContent();\r\n }\r\n\r\n /**\r\n * Releases all associated resources\r\n */\r\n public override dispose() {\r\n super.dispose(); // will dispose main mesh ie. back plate\r\n\r\n this._disposeTooltip();\r\n this.onPointerMoveObservable.remove(this._pointerHoverObserver);\r\n\r\n if (!this.shareMaterials) {\r\n this._backMaterial.dispose();\r\n this._frontMaterial.dispose();\r\n this._plateMaterial.dispose();\r\n\r\n if (this._pickedPointObserver) {\r\n this._host.onPickedPointChangedObservable.remove(this._pickedPointObserver);\r\n this._pickedPointObserver = null;\r\n }\r\n }\r\n }\r\n}\r\n","import { type Behavior } from \"core/Behaviors/behavior\";\r\nimport { FollowBehavior } from \"core/Behaviors/Meshes/followBehavior\";\r\nimport { SixDofDragBehavior } from \"core/Behaviors/Meshes/sixDofDragBehavior\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { type Observer } from \"core/Misc/observable\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { SurfaceMagnetismBehavior } from \"core/Behaviors/Meshes/surfaceMagnetismBehavior\";\r\nimport { type Vector3 } from \"core/Maths/math.vector\";\r\nimport { type PickingInfo } from \"core/Collisions/pickingInfo\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\n\r\n/**\r\n * Default behavior for 3D UI elements.\r\n * Handles a FollowBehavior, SixDofBehavior and SurfaceMagnetismBehavior\r\n * @since 5.0.0\r\n */\r\nexport class DefaultBehavior implements Behavior<Mesh> {\r\n private _scene: Scene;\r\n private _followBehavior: FollowBehavior;\r\n private _sixDofDragBehavior: SixDofDragBehavior;\r\n private _surfaceMagnetismBehavior: SurfaceMagnetismBehavior;\r\n private _onBeforeRenderObserver: Nullable<Observer<Scene>>;\r\n private _onDragObserver: Nullable<Observer<{ delta: Vector3; position: Vector3; pickInfo: PickingInfo }>>;\r\n\r\n /**\r\n * Instantiates the default behavior\r\n */\r\n constructor() {\r\n this._followBehavior = new FollowBehavior();\r\n this._sixDofDragBehavior = new SixDofDragBehavior();\r\n this._surfaceMagnetismBehavior = new SurfaceMagnetismBehavior();\r\n }\r\n\r\n /**\r\n * Attached node of this behavior\r\n */\r\n public attachedNode: Nullable<Mesh>;\r\n\r\n /**\r\n * The name of the behavior\r\n */\r\n public get name(): string {\r\n return \"Default\";\r\n }\r\n\r\n /**\r\n * The follow behavior\r\n */\r\n public get followBehavior(): FollowBehavior {\r\n return this._followBehavior;\r\n }\r\n\r\n /**\r\n * The six DoF drag behavior\r\n */\r\n public get sixDofDragBehavior(): SixDofDragBehavior {\r\n return this._sixDofDragBehavior;\r\n }\r\n\r\n /**\r\n * The surface magnetism behavior\r\n */\r\n public get surfaceMagnetismBehavior(): SurfaceMagnetismBehavior {\r\n return this._surfaceMagnetismBehavior;\r\n }\r\n\r\n /**\r\n * Enables the follow behavior\r\n */\r\n public followBehaviorEnabled: boolean = false;\r\n\r\n /**\r\n * Enables the six DoF drag behavior\r\n */\r\n public sixDofDragBehaviorEnabled: boolean = true;\r\n\r\n /**\r\n * Enables the surface magnetism behavior\r\n */\r\n public surfaceMagnetismBehaviorEnabled: boolean = true;\r\n\r\n /**\r\n * Initializes the behavior\r\n */\r\n public init() {}\r\n\r\n /**\r\n * Attaches the default behavior\r\n * @param ownerMesh The top level mesh\r\n * @param draggablesMeshes Descendant meshes that can be used for dragging the owner mesh\r\n * @param sceneUnderstandingMeshes Meshes from the scene understanding that will be used for surface magnetism\r\n */\r\n public attach(ownerMesh: Mesh, draggablesMeshes?: Mesh[], sceneUnderstandingMeshes?: AbstractMesh[]): void {\r\n this._scene = ownerMesh.getScene();\r\n this.attachedNode = ownerMesh;\r\n\r\n this._addObservables();\r\n // Since our observables are bound before the child behaviors', ours are called first\r\n this._followBehavior.attach(ownerMesh);\r\n this._sixDofDragBehavior.attach(ownerMesh);\r\n this._sixDofDragBehavior.draggableMeshes = draggablesMeshes || null;\r\n this._sixDofDragBehavior.faceCameraOnDragStart = true;\r\n this._surfaceMagnetismBehavior.attach(ownerMesh, this._scene);\r\n if (sceneUnderstandingMeshes) {\r\n this._surfaceMagnetismBehavior.meshes = sceneUnderstandingMeshes;\r\n }\r\n\r\n // We disable this behavior because we will handle pose changing event manually with sixDofDragBehavior\r\n this._surfaceMagnetismBehavior.enabled = false;\r\n }\r\n\r\n /**\r\n * Detaches the behavior from the mesh\r\n */\r\n public detach(): void {\r\n this.attachedNode = null;\r\n this._removeObservables();\r\n this._followBehavior.detach();\r\n this._sixDofDragBehavior.detach();\r\n this._surfaceMagnetismBehavior.detach();\r\n }\r\n\r\n private _addObservables() {\r\n this._onBeforeRenderObserver = this._scene.onBeforeRenderObservable.add(() => {\r\n this._followBehavior._enabled = !this._sixDofDragBehavior.isMoving && this.followBehaviorEnabled;\r\n });\r\n this._onDragObserver = this._sixDofDragBehavior.onDragObservable.add((event: { pickInfo: PickingInfo }) => {\r\n this._sixDofDragBehavior.disableMovement = this._surfaceMagnetismBehavior.findAndUpdateTarget(event.pickInfo);\r\n });\r\n }\r\n\r\n private _removeObservables() {\r\n this._scene.onBeforeRenderObservable.remove(this._onBeforeRenderObserver);\r\n this._sixDofDragBehavior.onDragObservable.remove(this._onDragObserver);\r\n }\r\n}\r\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"handleVertexShader\";\nconst shader = `precision highp float;attribute vec3 position;uniform vec3 positionOffset;uniform mat4 worldViewProjection;uniform float scale;void main(void) {vec4 vPos=vec4((vec3(position)+positionOffset)*scale,1.0);gl_Position=worldViewProjection*vPos;}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const handleVertexShader = { name, shader };\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"handlePixelShader\";\nconst shader = `uniform vec3 color;void main(void) {gl_FragColor=vec4(color,1.0);}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const handlePixelShader = { name, shader };\n","import { type Scene } from \"core/scene\";\r\nimport { CreateBox } from \"core/Meshes/Builders/boxBuilder\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { HandleMaterial } from \"../materials/handle/handleMaterial\";\r\nimport { type SlateGizmo } from \"./slateGizmo\";\r\nimport { BaseSixDofDragBehavior } from \"core/Behaviors/Meshes/baseSixDofDragBehavior\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type Observer } from \"core/Misc/observable\";\r\n\r\n/**\r\n * State of the handle regarding user interaction\r\n */\r\nexport const enum HandleState {\r\n /**\r\n * Handle is idle\r\n */\r\n IDLE = 0,\r\n /**\r\n * Handle is hovered\r\n */\r\n HOVER = 1,\r\n /**\r\n * Handle is dragged\r\n */\r\n DRAG = 2,\r\n}\r\n\r\n/**\r\n * Base class for SlateGizmo handles\r\n */\r\nexport abstract class GizmoHandle {\r\n protected _scene: Scene;\r\n protected _state: HandleState = HandleState.IDLE;\r\n protected _materials: HandleMaterial[] = [];\r\n\r\n private _dragStartObserver: Nullable<Observer<any>>;\r\n private _draggingObserver: Nullable<Observer<any>>;\r\n private _dragEndObserver: Nullable<Observer<any>>;\r\n /**\r\n * @internal\r\n */\r\n public _dragBehavior: BaseSixDofDragBehavior;\r\n\r\n /**\r\n * The current state of the handle\r\n */\r\n public get state(): HandleState {\r\n return this._state;\r\n }\r\n\r\n private _gizmo: SlateGizmo;\r\n\r\n /**\r\n * Returns the gizmo carrying this handle\r\n */\r\n public get gizmo() {\r\n return this._gizmo;\r\n }\r\n\r\n /**\r\n * Sets hover state\r\n */\r\n public set hover(value: boolean) {\r\n if (value) {\r\n this._state |= HandleState.HOVER;\r\n } else {\r\n this._state &= ~HandleState.HOVER;\r\n }\r\n\r\n this._updateMaterial();\r\n }\r\n /**\r\n * Sets drag state\r\n */\r\n public set drag(value: boolean) {\r\n if (value) {\r\n this._state |= HandleState.DRAG;\r\n } else {\r\n this._state &= ~HandleState.DRAG;\r\n }\r\n\r\n this._updateMaterial();\r\n }\r\n\r\n /**\r\n * Node of this handle\r\n */\r\n public node: TransformNode;\r\n\r\n /**\r\n * Creates a handle for a SlateGizmo\r\n * @param gizmo associated SlateGizmo\r\n * @param scene scene\r\n */\r\n constructor(gizmo: SlateGizmo, scene: Scene) {\r\n this._scene = scene;\r\n this._gizmo = gizmo;\r\n\r\n this.node = this.createNode();\r\n this.node.reservedDataStore = {\r\n handle: this,\r\n };\r\n }\r\n\r\n protected _createMaterial(positionOffset?: Vector3) {\r\n const mat = new HandleMaterial(\"handle\", this._scene);\r\n if (positionOffset) {\r\n mat._positionOffset = positionOffset;\r\n }\r\n return mat;\r\n }\r\n\r\n private _updateMaterial() {\r\n const state = this._state;\r\n for (const mat of this._materials) {\r\n mat.hover = false;\r\n mat.drag = false;\r\n }\r\n\r\n if (state & HandleState.DRAG) {\r\n for (const mat of this._materials) {\r\n mat.drag = true;\r\n }\r\n } else if (state & HandleState.HOVER) {\r\n for (const mat of this._materials) {\r\n mat.hover = true;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Binds callbacks from dragging interaction\r\n * @param dragStartFn Function to call on drag start\r\n * @param dragFn Function to call on drag\r\n * @param dragEndFn Function to call on drag end\r\n */\r\n public setDragBehavior(dragStartFn: (event: { position: Vector3 }) => void, dragFn: (event: { position: Vector3 }) => void, dragEndFn: () => void) {\r\n const dragBehavior = new BaseSixDofDragBehavior();\r\n\r\n this._dragBehavior = dragBehavior;\r\n\r\n this._dragStartObserver = dragBehavior.onDragStartObservable.add(dragStartFn);\r\n this._draggingObserver = dragBehavior.onDragObservable.add(dragFn);\r\n this._dragEndObserver = dragBehavior.onDragEndObservable.add(dragEndFn);\r\n\r\n this._dragBehavior.attach(this.node);\r\n }\r\n\r\n /**\r\n * Creates the meshes and parent node of the handle\r\n * Should be overridden by child classes\r\n * @returns created node\r\n */\r\n public abstract createNode(): TransformNode;\r\n\r\n /**\r\n * Disposes the handle\r\n */\r\n public dispose() {\r\n this._dragBehavior.onDragStartObservable.remove(this._dragStartObserver);\r\n this._dragBehavior.onDragObservable.remove(this._draggingObserver);\r\n this._dragBehavior.onDragEndObservable.remove(this._dragEndObserver);\r\n\r\n this._dragBehavior.detach();\r\n\r\n for (const material of this._materials) {\r\n material.dispose();\r\n }\r\n this.node.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * Side handle class that rotates the slate\r\n */\r\nexport class SideHandle extends GizmoHandle {\r\n /**\r\n * Creates the meshes and parent node of the handle\r\n * @returns created node\r\n */\r\n public createNode() {\r\n // Create a simple vertical rectangle\r\n const verticalBox = CreateBox(\"sideVert\", { width: 1, height: 10, depth: 0.1 }, this._scene);\r\n const sideNode = new TransformNode(\"side\", this._scene);\r\n verticalBox.parent = sideNode;\r\n\r\n const mat = this._createMaterial();\r\n verticalBox.material = mat;\r\n verticalBox.isNearGrabbable = true;\r\n this._materials.push(mat);\r\n\r\n return sideNode;\r\n }\r\n}\r\n\r\n/**\r\n * Corner handle that resizes the slate\r\n */\r\nexport class CornerHandle extends GizmoHandle {\r\n /**\r\n * Creates the meshes and parent node of the handle\r\n * @returns created node\r\n */\r\n public createNode() {\r\n // Create 2 boxes making a bottom left corner\r\n const horizontalBox = CreateBox(\"angleHor\", { width: 3, height: 1, depth: 0.1 }, this._scene);\r\n const verticalBox = CreateBox(\"angleVert\", { width: 1, height: 3, depth: 0.1 }, this._scene);\r\n\r\n const angleNode = new TransformNode(\"angle\", this._scene);\r\n horizontalBox.parent = angleNode;\r\n verticalBox.parent = angleNode;\r\n\r\n horizontalBox.material = this._createMaterial(new Vector3(1, 0, 0));\r\n verticalBox.material = this._createMaterial(new Vector3(0, 1, 0));\r\n verticalBox.isNearGrabbable = true;\r\n horizontalBox.isNearGrabbable = true;\r\n\r\n this._materials.push(horizontalBox.material as HandleMaterial);\r\n this._materials.push(verticalBox.material as HandleMaterial);\r\n return angleNode;\r\n }\r\n}\r\n","import { ShaderMaterial } from \"core/Materials/shaderMaterial\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type Observer } from \"core/Misc/observable\";\r\nimport { Color3, TmpColors } from \"core/Maths/math.color\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\n\r\nimport \"./shaders/handle.vertex\";\r\nimport \"./shaders/handle.fragment\";\r\n\r\n/**\r\n * Class used to render gizmo handles with fluent design\r\n */\r\nexport class HandleMaterial extends ShaderMaterial {\r\n private _hover: boolean = false;\r\n private _drag: boolean = false;\r\n private _onBeforeRender: Nullable<Observer<Scene>>;\r\n private _color: Color3 = new Color3();\r\n private _scale: number = 1;\r\n private _targetColor: Color3;\r\n private _targetScale: number;\r\n private _lastTick = -1;\r\n\r\n /**\r\n * Is the material indicating hovering state\r\n */\r\n public get hover(): boolean {\r\n return this._hover;\r\n }\r\n\r\n public set hover(b: boolean) {\r\n this._hover = b;\r\n\r\n this._updateInterpolationTarget();\r\n }\r\n\r\n /**\r\n * Is the material indicating drag state\r\n */\r\n public get drag(): boolean {\r\n return this._drag;\r\n }\r\n\r\n public set drag(b: boolean) {\r\n this._drag = b;\r\n\r\n this._updateInterpolationTarget();\r\n }\r\n\r\n /**\r\n * Length of animation\r\n */\r\n public animationLength: number = 100;\r\n\r\n /**\r\n * Color of the handle when hovered\r\n */\r\n public hoverColor: Color3 = new Color3(0, 0.467, 0.84);\r\n\r\n /**\r\n * Color of the handle when idle\r\n */\r\n public baseColor: Color3 = new Color3(1, 1, 1);\r\n\r\n /**\r\n * Scale of the handle when hovered\r\n */\r\n public hoverScale: number = 0.75;\r\n\r\n /**\r\n * Scale of the handle when idle\r\n */\r\n public baseScale: number = 0.35;\r\n\r\n /**\r\n * Scale of the handle when dragged\r\n */\r\n public dragScale: number = 0.55;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _positionOffset: Vector3 = Vector3.Zero();\r\n\r\n /**\r\n * Creates a handle material\r\n * @param name Name of the material\r\n * @param scene Scene\r\n */\r\n constructor(name: string, scene: Scene) {\r\n super(name, scene, \"handle\", {\r\n attributes: [\"position\"],\r\n uniforms: [\"worldViewProjection\", \"color\", \"scale\", \"positionOffset\"],\r\n needAlphaBlending: false,\r\n needAlphaTesting: false,\r\n });\r\n\r\n this._updateInterpolationTarget();\r\n\r\n // Register callback for scene after render\r\n this._lastTick = Date.now();\r\n this._onBeforeRender = this.getScene().onBeforeRenderObservable.add(() => {\r\n const tick = Date.now();\r\n const delta = tick - this._lastTick;\r\n\r\n const scaleDiff = this._targetScale - this._scale;\r\n const colorDiff = TmpColors.Color3[0].copyFrom(this._targetColor).subtractToRef(this._color, TmpColors.Color3[0]);\r\n\r\n this._scale = this._scale + (scaleDiff * delta) / this.animationLength;\r\n colorDiff.scaleToRef(delta / this.animationLength, colorDiff);\r\n this._color.addToRef(colorDiff, this._color);\r\n\r\n this.setColor3(\"color\", this._color);\r\n this.setFloat(\"scale\", this._scale);\r\n this.setVector3(\"positionOffset\", this._positionOffset);\r\n\r\n this._lastTick = tick;\r\n });\r\n }\r\n\r\n private _updateInterpolationTarget() {\r\n if (this.drag) {\r\n this._targetColor = this.hoverColor;\r\n this._targetScale = this.dragScale;\r\n } else if (this.hover) {\r\n this._targetColor = this.hoverColor;\r\n this._targetScale = this.hoverScale;\r\n } else {\r\n this._targetColor = this.baseColor;\r\n this._targetScale = this.baseScale;\r\n }\r\n }\r\n\r\n /**\r\n * Disposes the handle material\r\n */\r\n public override dispose() {\r\n super.dispose();\r\n this.getScene().onBeforeRenderObservable.remove(this._onBeforeRender);\r\n }\r\n}\r\n","import { Gizmo } from \"core/Gizmos/gizmo\";\r\nimport { Epsilon } from \"core/Maths/math.constants\";\r\nimport { Matrix, Quaternion, TmpVectors, Vector3 } from \"core/Maths/math.vector\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { type Observer } from \"core/Misc/observable\";\r\nimport { PivotTools } from \"core/Misc/pivotTools\";\r\nimport { type UtilityLayerRenderer } from \"core/Rendering/utilityLayerRenderer\";\r\nimport { type Nullable } from \"core/types\";\r\n\r\nimport { type HolographicSlate } from \"../controls/holographicSlate\";\r\nimport { type GizmoHandle, CornerHandle, SideHandle } from \"./gizmoHandle\";\r\n\r\n// Mask contains the influence of the drag offset vectors on dimensions or origin of the slate\r\n// Mask vector is multiplied to the offset vector\r\ntype HandleMasks = {\r\n dimensions: Vector3;\r\n origin: Vector3;\r\n};\r\n\r\n/**\r\n * Gizmo to resize 2D slates\r\n */\r\nexport class SlateGizmo extends Gizmo {\r\n private _boundingDimensions = new Vector3(0, 0, 0);\r\n private _pickedPointObserver: Nullable<Observer<Nullable<AbstractMesh>>>;\r\n private _renderObserver: Nullable<Observer<Scene>> = null;\r\n\r\n private _tmpQuaternion = new Quaternion();\r\n private _tmpVector = new Vector3(0, 0, 0);\r\n\r\n // Ordered bl, br, tr, tl\r\n private _corners: CornerHandle[] = [];\r\n // Ordered left, bottom, right, top\r\n private _sides: SideHandle[] = [];\r\n private _handlesParent: TransformNode;\r\n private _handleHovered: Nullable<GizmoHandle>;\r\n private _handleDragged: Nullable<GizmoHandle>;\r\n\r\n private _boundingBoxGizmo = {\r\n min: new Vector3(),\r\n max: new Vector3(),\r\n };\r\n\r\n /**\r\n * Value we use to offset handles from mesh\r\n */\r\n private _margin = 0.35;\r\n private _handleSize = 0.075;\r\n private _attachedSlate: Nullable<HolographicSlate> = null;\r\n private _existingSlateScale = new Vector3();\r\n /**\r\n * If set, the handles will increase in size based on the distance away from the camera to have a consistent screen size (Default: true)\r\n */\r\n public fixedScreenSize = false;\r\n /**\r\n * The distance away from the object which the draggable meshes should appear world sized when fixedScreenSize is set to true (default: 10)\r\n */\r\n public fixedScreenSizeDistanceFactor = 10;\r\n\r\n /**\r\n * The slate attached to this gizmo\r\n */\r\n public set attachedSlate(control: Nullable<HolographicSlate>) {\r\n if (control) {\r\n this.attachedMesh = control.mesh;\r\n this.updateBoundingBox();\r\n\r\n this._pickedPointObserver = control._host.onPickingObservable.add((pickedMesh) => {\r\n if (this._handleHovered && (!pickedMesh || pickedMesh.parent !== this._handleHovered.node)) {\r\n this._handleHovered.hover = false;\r\n this._handleHovered = null;\r\n }\r\n\r\n if (pickedMesh && pickedMesh.parent && pickedMesh.parent.reservedDataStore && pickedMesh.parent.reservedDataStore.handle) {\r\n const handle = pickedMesh.parent.reservedDataStore.handle as GizmoHandle;\r\n if (handle.gizmo === this) {\r\n this._handleHovered = handle;\r\n this._handleHovered.hover = true;\r\n }\r\n }\r\n });\r\n } else if (this._attachedSlate) {\r\n this._attachedSlate._host.onPickingObservable.remove(this._pickedPointObserver);\r\n }\r\n this._attachedSlate = control;\r\n }\r\n\r\n public get attachedSlate(): Nullable<HolographicSlate> {\r\n return this._attachedSlate;\r\n }\r\n\r\n constructor(utilityLayer?: UtilityLayerRenderer) {\r\n super(utilityLayer);\r\n\r\n this._createNode();\r\n this.updateScale = false;\r\n\r\n this._renderObserver = this.gizmoLayer.originalScene.onBeforeRenderObservable.add(() => {\r\n // Only update the bounding box if scaling has changed\r\n if (this.attachedMesh && !this._existingSlateScale.equals(this.attachedMesh.scaling)) {\r\n this.updateBoundingBox();\r\n }\r\n });\r\n }\r\n\r\n private _createNode() {\r\n this._handlesParent = new TransformNode(\"handlesParent\", this.gizmoLayer.utilityLayerScene);\r\n this._handlesParent.rotationQuaternion = Quaternion.Identity();\r\n\r\n const masksCorners = [\r\n {\r\n dimensions: new Vector3(-1, -1, 0),\r\n origin: new Vector3(1, 0, 0),\r\n },\r\n {\r\n dimensions: new Vector3(1, -1, 0),\r\n origin: new Vector3(0, 0, 0),\r\n },\r\n {\r\n dimensions: new Vector3(1, 1, 0),\r\n origin: new Vector3(0, 1, 0),\r\n },\r\n {\r\n dimensions: new Vector3(-1, 1, 0),\r\n origin: new Vector3(1, 1, 0),\r\n },\r\n ];\r\n\r\n for (let i = 0; i < 4; i++) {\r\n const corner = new CornerHandle(this, this.gizmoLayer.utilityLayerScene);\r\n this._corners.push(corner);\r\n corner.node.rotation.z = (Math.PI / 2) * i;\r\n\r\n corner.node.parent = this._handlesParent;\r\n this._assignDragBehaviorCorners(\r\n corner,\r\n (originStart: Vector3, dimensionsStart: Vector3, offset: Vector3, masks: HandleMasks) => this._moveHandle(originStart, dimensionsStart, offset, masks, true),\r\n masksCorners[i]\r\n );\r\n }\r\n\r\n for (let i = 0; i < 4; i++) {\r\n const side = new SideHandle(this, this.gizmoLayer.utilityLayerScene);\r\n this._sides.push(side);\r\n side.node.rotation.z = (Math.PI / 2) * i;\r\n side.node.parent = this._handlesParent;\r\n this._assignDragBehaviorSides(side, i % 2 === 0 ? new Vector3(0, 1, 0) : new Vector3(1, 0, 0));\r\n }\r\n\r\n this._handlesParent.parent = this._rootMesh;\r\n }\r\n\r\n private _keepAspectRatio(vector: Vector3, aspectRatio: number, invertDiagonal: boolean = false) {\r\n const axis = TmpVectors.Vector3[0];\r\n axis.copyFromFloats(aspectRatio, 1, 0).normalize();\r\n if (invertDiagonal) {\r\n axis.y *= -1;\r\n }\r\n const dot = Vector3.Dot(vector, axis);\r\n vector.copyFrom(axis).scaleInPlace(dot);\r\n }\r\n\r\n private _clampDimensions(vector: Vector3, dimensions: Vector3, mask: Vector3, keepAspectRatio: boolean = false) {\r\n const impact = TmpVectors.Vector3[0];\r\n impact.copyFrom(vector).multiplyInPlace(mask);\r\n\r\n const clampedDimensions = TmpVectors.Vector3[1];\r\n clampedDimensions.copyFromFloats(\r\n Math.max(this._attachedSlate!.minDimensions.x, impact.x + dimensions.x),\r\n Math.max(this._attachedSlate!.minDimensions.y, impact.y + dimensions.y),\r\n 0\r\n );\r\n\r\n if (keepAspectRatio) {\r\n // Extra logic to ensure the ratio is maintained when the vector has been clamped\r\n const ratio = dimensions.x / dimensions.y;\r\n clampedDimensions.x = Math.max(clampedDimensions.x, clampedDimensions.y * ratio);\r\n clampedDimensions.y = Math.max(clampedDimensions.y, clampedDimensions.x / ratio);\r\n }\r\n\r\n // Calculating the real impact of vector on clamped dimensions\r\n impact.copyFrom(clampedDimensions).subtractInPlace(dimensions);\r\n\r\n vector.x = Math.sign(vector.x) * Math.abs(impact.x);\r\n vector.y = Math.sign(vector.y) * Math.abs(impact.y);\r\n }\r\n\r\n private _moveHandle(originStart: Vector3, dimensionsStart: Vector3, offset: Vector3, masks: HandleMasks, isCorner: boolean) {\r\n if (!this._attachedSlate) {\r\n return;\r\n }\r\n\r\n if (isCorner) {\r\n const aspectRatio = dimensionsStart.x / dimensionsStart.y;\r\n this._keepAspectRatio(offset, aspectRatio, masks.dimensions.x * masks.dimensions.y < 0);\r\n }\r\n this._clampDimensions(offset, dimensionsStart, masks.dimensions, isCorner);\r\n\r\n const offsetOriginMasked = TmpVectors.Vector3[0];\r\n const offsetDimensionsMasked = TmpVectors.Vector3[1];\r\n offsetOriginMasked.copyFrom(offset).multiplyInPlace(masks.origin);\r\n offsetDimensionsMasked.copyFrom(offset).multiplyInPlace(masks.dimensions);\r\n\r\n this._attachedSlate.origin.copyFrom(originStart).addInPlace(offsetOriginMasked);\r\n this._attachedSlate.dimensions.set(dimensionsStart.x + offsetDimensionsMasked.x, dimensionsStart.y + offsetDimensionsMasked.y);\r\n }\r\n\r\n private _assignDragBehaviorCorners(\r\n handle: GizmoHandle,\r\n moveFn: (originStart: Vector3, dimensionsStart: Vector3, offset: Vector3, masks: HandleMasks) => void,\r\n masks: HandleMasks\r\n ) {\r\n const dimensionsStart = new Vector3();\r\n const originStart = new Vector3();\r\n const dragOrigin = new Vector3();\r\n const toObjectFrame = new Matrix();\r\n const dragPlaneNormal = new Vector3();\r\n\r\n const projectToRef = (position: Vector3, normal: Vector3, origin: Vector3, ref: Vector3) => {\r\n // Projects on the plane with its normal and origin\r\n position.subtractToRef(origin, TmpVectors.Vector3[0]);\r\n const dot = Vector3.Dot(TmpVectors.Vector3[0], normal);\r\n TmpVectors.Vector3[1].copyFrom(normal).scaleInPlace(dot);\r\n TmpVectors.Vector3[0].subtractInPlace(TmpVectors.Vector3[1]);\r\n TmpVectors.Vector3[0].addToRef(origin, ref);\r\n };\r\n\r\n const dragStart = (event: { position: Vector3 }) => {\r\n if (this.attachedSlate && this.attachedMesh) {\r\n dimensionsStart.set(this.attachedSlate.dimensions.x, this.attachedSlate.dimensions.y, Epsilon);\r\n originStart.copyFrom(this.attachedSlate.origin);\r\n dragOrigin.copyFrom(event.position);\r\n toObjectFrame.copyFrom(this.attachedMesh.computeWorldMatrix(true));\r\n toObjectFrame.invert();\r\n this.attachedSlate._followButton.isToggled = false;\r\n Vector3.TransformNormalToRef(Vector3.Forward(), this.attachedMesh.getWorldMatrix(), dragPlaneNormal);\r\n dragPlaneNormal.normalize();\r\n\r\n if (this._handleHovered) {\r\n this._handleDragged = this._handleHovered;\r\n this._handleDragged.drag = true;\r\n }\r\n }\r\n };\r\n\r\n const dragging = (event: { position: Vector3 }) => {\r\n if (this.attachedSlate && this.attachedMesh) {\r\n projectToRef(event.position, dragPlaneNormal, dragOrigin, this._tmpVector);\r\n this._tmpVector.subtractInPlace(dragOrigin);\r\n Vector3.TransformNormalToRef(this._tmpVector, toObjectFrame, this._tmpVector);\r\n\r\n moveFn(originStart, dimensionsStart, this._tmpVector, masks);\r\n this.attachedSlate._positionElements();\r\n this.updateBoundingBox();\r\n }\r\n };\r\n\r\n const dragEnd = () => {\r\n if (this.attachedSlate && this.attachedNode) {\r\n this.attachedSlate._updatePivot();\r\n\r\n if (this._handleDragged) {\r\n this._handleDragged.drag = false;\r\n this._handleDragged = null;\r\n }\r\n }\r\n };\r\n\r\n handle.setDragBehavior(dragStart, dragging, dragEnd);\r\n }\r\n\r\n private _assignDragBehaviorSides(handle: GizmoHandle, dragPlaneNormal: Vector3) {\r\n const quaternionOrigin = new Quaternion();\r\n const dragOrigin = new Vector3();\r\n const directionOrigin = new Vector3();\r\n const worldPivot = new Vector3();\r\n const worldPlaneNormal = new Vector3();\r\n\r\n const dragStart = (event: { position: Vector3 }) => {\r\n if (this.attachedSlate && this.attachedMesh) {\r\n quaternionOrigin.copyFrom(this.attachedMesh.rotationQuaternion!);\r\n dragOrigin.copyFrom(event.position);\r\n worldPivot.copyFrom(this.attachedMesh.getAbsolutePivotPoint());\r\n directionOrigin.copyFrom(dragOrigin).subtractInPlace(worldPivot).normalize();\r\n this.attachedSlate._followButton.isToggled = false;\r\n Vector3.TransformNormalToRef(dragPlaneNormal, this.attachedMesh.getWorldMatrix(), worldPlaneNormal);\r\n worldPlaneNormal.normalize();\r\n\r\n if (this._handleHovered) {\r\n this._handleDragged = this._handleHovered;\r\n this._handleDragged.drag = true;\r\n }\r\n }\r\n };\r\n\r\n const dragging = (event: { position: Vector3 }) => {\r\n if (this.attachedSlate && this.attachedMesh) {\r\n this._tmpVector.copyFrom(event.position);\r\n this._tmpVector.subtractInPlace(worldPivot);\r\n this._tmpVector.normalize();\r\n\r\n const angle = -Vector3.GetAngleBetweenVectorsOnPlane(this._tmpVector, directionOrigin, worldPlaneNormal);\r\n Quaternion.RotationAxisToRef(dragPlaneNormal, angle, this._tmpQuaternion);\r\n quaternionOrigin.multiplyToRef(this._tmpQuaternion, this.attachedMesh.rotationQuaternion!);\r\n }\r\n };\r\n\r\n const dragEnd = () => {\r\n if (this.attachedSlate && this.attachedNode) {\r\n this.attachedSlate._updatePivot();\r\n\r\n if (this._handleDragged) {\r\n this._handleDragged.drag = false;\r\n this._handleDragged = null;\r\n }\r\n }\r\n };\r\n\r\n handle.setDragBehavior(dragStart, dragging, dragEnd);\r\n }\r\n\r\n protected override _attachedNodeChanged(value: Nullable<AbstractMesh>) {\r\n if (value) {\r\n this.updateBoundingBox();\r\n }\r\n }\r\n\r\n /**\r\n * Updates the bounding box information for the gizmo\r\n */\r\n public updateBoundingBox() {\r\n if (this.attachedMesh) {\r\n PivotTools._RemoveAndStorePivotPoint(this.attachedMesh);\r\n\r\n // Store original parent\r\n const originalParent = this.attachedMesh.parent;\r\n this.attachedMesh.setParent(null);\r\n\r\n this._update();\r\n\r\n // Rotate based on axis\r\n if (!this.attachedMesh.rotationQuaternion) {\r\n this.attachedMesh.rotationQuaternion = Quaternion.RotationYawPitchRoll(this.attachedMesh.rotation.y, this.attachedMesh.rotation.x, this.attachedMesh.rotation.z);\r\n }\r\n\r\n // Store original position and reset mesh to origin before computing the bounding box\r\n this._tmpQuaternion.copyFrom(this.attachedMesh.rotationQuaternion);\r\n this._tmpVector.copyFrom(this.attachedMesh.position);\r\n this.attachedMesh.rotationQuaternion.set(0, 0, 0, 1);\r\n this.attachedMesh.position.set(0, 0, 0);\r\n\r\n // Update bounding dimensions/positions\r\n const boundingMinMax = this.attachedMesh.getHierarchyBoundingVectors();\r\n boundingMinMax.max.subtractToRef(boundingMinMax.min, this._boundingDimensions);\r\n this._boundingBoxGizmo.min = boundingMinMax.min;\r\n this._boundingBoxGizmo.max = boundingMinMax.max;\r\n\r\n // Update handles of the gizmo\r\n this._updateHandlesPosition();\r\n this._updateHandlesScaling();\r\n\r\n // Restore position/rotation values\r\n this.attachedMesh.rotationQuaternion.copyFrom(this._tmpQuaternion);\r\n this.attachedMesh.position.copyFrom(this._tmpVector);\r\n\r\n PivotTools._RestorePivotPoint(this.attachedMesh);\r\n\r\n // Restore original parent\r\n this.attachedMesh.setParent(originalParent);\r\n this.attachedMesh.computeWorldMatrix(true);\r\n\r\n this._existingSlateScale.copyFrom(this.attachedMesh.scaling);\r\n }\r\n }\r\n\r\n private _updateHandlesPosition() {\r\n const min = this._boundingBoxGizmo.min.clone();\r\n const max = this._boundingBoxGizmo.max.clone();\r\n\r\n const handleScaling = this._corners[0].node.scaling.length();\r\n min.x -= this._margin * handleScaling;\r\n min.y -= this._margin * handleScaling;\r\n max.x += this._margin * handleScaling;\r\n max.y += this._margin * handleScaling;\r\n\r\n const center = min.add(max).scaleInPlace(0.5);\r\n\r\n this._corners[0].node.position.copyFromFloats(min.x, min.y, 0);\r\n this._corners[1].node.position.copyFromFloats(max.x, min.y, 0);\r\n this._corners[2].node.position.copyFromFloats(max.x, max.y, 0);\r\n this._corners[3].node.position.copyFromFloats(min.x, max.y, 0);\r\n\r\n this._sides[0].node.position.copyFromFloats(min.x, center.y, 0);\r\n this._sides[1].node.position.copyFromFloats(center.x, min.y, 0);\r\n this._sides[2].node.position.copyFromFloats(max.x, center.y, 0);\r\n this._sides[3].node.position.copyFromFloats(center.x, max.y, 0);\r\n }\r\n\r\n private _updateHandlesScaling() {\r\n if (this._attachedSlate && this._attachedSlate.mesh) {\r\n const scaledWidth = this._attachedSlate.mesh.scaling.x * this._attachedSlate.dimensions.x;\r\n const scaledHeight = this._attachedSlate.mesh.scaling.y * this._attachedSlate.dimensions.y;\r\n const scale = Math.min(scaledWidth, scaledHeight) * this._handleSize;\r\n for (let index = 0; index < this._corners.length; index++) {\r\n this._corners[index].node.scaling.setAll(scale);\r\n }\r\n for (let index = 0; index < this._sides.length; index++) {\r\n this._sides[index].node.scaling.setAll(scale);\r\n }\r\n }\r\n }\r\n\r\n protected override _update() {\r\n super._update();\r\n\r\n if (!this.gizmoLayer.utilityLayerScene.activeCamera) {\r\n return;\r\n }\r\n\r\n if (this._attachedSlate && this._attachedSlate.mesh) {\r\n if (this.fixedScreenSize) {\r\n this._attachedSlate.mesh.absolutePosition.subtractToRef(this.gizmoLayer.utilityLayerScene.activeCamera.position, this._tmpVector);\r\n const distanceFromCamera = (this._handleSize * this._tmpVector.length()) / this.fixedScreenSizeDistanceFactor;\r\n for (let i = 0; i < this._corners.length; i++) {\r\n this._corners[i].node.scaling.set(distanceFromCamera, distanceFromCamera, distanceFromCamera);\r\n }\r\n for (let i = 0; i < this._sides.length; i++) {\r\n this._sides[i].node.scaling.set(distanceFromCamera, distanceFromCamera, distanceFromCamera);\r\n }\r\n }\r\n this._updateHandlesPosition();\r\n }\r\n }\r\n\r\n public override dispose() {\r\n this.gizmoLayer.originalScene.onBeforeRenderObservable.remove(this._renderObserver);\r\n\r\n // Will dispose rootMesh and all descendants\r\n super.dispose();\r\n\r\n for (const corner of this._corners) {\r\n corner.dispose();\r\n }\r\n\r\n for (const side of this._sides) {\r\n side.dispose();\r\n }\r\n }\r\n}\r\n","import { ContentDisplay3D } from \"./contentDisplay3D\";\r\nimport { type 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 \"core/Behaviors/Meshes/pointerDragBehavior\";\r\nimport { type Texture } from \"core/Materials/Textures/texture\";\r\nimport { Vector4 } from \"core/Maths/math\";\r\nimport { Epsilon } from \"core/Maths/math.constants\";\r\nimport { Scalar } from \"core/Maths/math.scalar\";\r\nimport { type Matrix, Quaternion, Vector2, Vector3 } from \"core/Maths/math.vector\";\r\nimport { Viewport } from \"core/Maths/math.viewport\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { CreateBox } from \"core/Meshes/Builders/boxBuilder\";\r\nimport { CreatePlane } from \"core/Meshes/Builders/planeBuilder\";\r\nimport { type TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { VertexData } from \"core/Meshes/mesh.vertexData\";\r\nimport { type Observer } from \"core/Misc/observable\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { Tools } from \"core/Misc/tools\";\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/core/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 /**\r\n * If true, the content will be scaled to fit the dimensions of the slate\r\n */\r\n public fitContentToDimensions = false;\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 /** @internal */\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 /** @internal */\r\n public _followButton: TouchHolographicButton;\r\n protected _closeButton: TouchHolographicButton;\r\n protected override _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 } 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 override _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 override _getTypeName(): string {\r\n return \"HolographicSlate\";\r\n }\r\n\r\n /**\r\n * @internal\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.copyFromFloats(this.dimensions.x - this.titleBarHeight / 2, -this.titleBarHeight / 2, 0).addInPlace(this.origin);\r\n followButton.position.copyFromFloats(this.dimensions.x - (3 * this.titleBarHeight) / 2, -this.titleBarHeight / 2, 0).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\r\n .copyFromFloats(this.dimensions.x / 2 - this.titleBarHeight, -(this.titleBarHeight / 2), rightHandScene ? Epsilon : -Epsilon)\r\n .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\r\n .copyFromFloats(this.dimensions.x / 2, -(this.titleBarHeight + this.titleBarMargin + contentPlateHeight / 2), rightHandScene ? -Epsilon : Epsilon)\r\n .addInPlace(this.origin);\r\n\r\n // Update the title's AdvancedDynamicTexture scale to avoid visual stretching\r\n this._titleTextComponent.host.scaleTo(\r\n (HolographicSlate._DEFAULT_TEXT_RESOLUTION_Y * titleBarTitle.scaling.x) / titleBarTitle.scaling.y,\r\n HolographicSlate._DEFAULT_TEXT_RESOLUTION_Y\r\n );\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.fitContentToDimensions ? this._contentScaleRatio : (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 = 0; // 1 - this._contentViewport.height / this._contentViewport.width;\r\n this._contentScaleRatio = 1;\r\n }\r\n\r\n /**\r\n * @internal\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 override _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 const 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 } 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 const baseUrl = Tools.GetAssetUrl(HolographicSlate.ASSETS_BASE_URL);\r\n this._followButton.imageUrl = baseUrl + HolographicSlate.FOLLOW_ICON_FILENAME;\r\n this._closeButton.imageUrl = baseUrl + 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 if (this.fitContentToDimensions) {\r\n return;\r\n }\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 override _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 /**\r\n * @internal\r\n */\r\n public override _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 // only if position was not yet set!\r\n if (this.node.position.equalsToFloats(0, 0, 0)) {\r\n this.node.position.copyFrom(camera.position).subtractInPlace(backward).subtractInPlace(pivot);\r\n }\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 override 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","import { type TransformNode } from \"core/Meshes/transformNode\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { type Scene } from \"core/scene\";\r\n\r\nimport { Button3D } from \"./button3D\";\r\n\r\n/**\r\n * Class used to create an interactable object. It's a 3D button using a mesh coming from the current scene\r\n */\r\nexport class MeshButton3D extends Button3D {\r\n /** @internal */\r\n protected _currentMesh: Mesh;\r\n\r\n /**\r\n * Creates a new 3D button based on a mesh\r\n * @param mesh mesh to become a 3D button\r\n * @param name defines the control name\r\n */\r\n constructor(mesh: Mesh, name?: string) {\r\n super(name);\r\n this._currentMesh = mesh;\r\n\r\n /**\r\n * Provides a default behavior on hover/out & up/down\r\n * Override those function to create your own desired behavior specific to your mesh\r\n */\r\n this.pointerEnterAnimation = () => {\r\n if (!this.mesh) {\r\n return;\r\n }\r\n this.mesh.scaling.scaleInPlace(1.1);\r\n };\r\n\r\n this.pointerOutAnimation = () => {\r\n if (!this.mesh) {\r\n return;\r\n }\r\n this.mesh.scaling.scaleInPlace(1.0 / 1.1);\r\n };\r\n\r\n this.pointerDownAnimation = () => {\r\n if (!this.mesh) {\r\n return;\r\n }\r\n this.mesh.scaling.scaleInPlace(0.95);\r\n };\r\n\r\n this.pointerUpAnimation = () => {\r\n if (!this.mesh) {\r\n return;\r\n }\r\n this.mesh.scaling.scaleInPlace(1.0 / 0.95);\r\n };\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"MeshButton3D\";\r\n }\r\n\r\n // Mesh association\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected override _createNode(scene: Scene): TransformNode {\r\n const meshes = this._currentMesh.getChildMeshes();\r\n\r\n for (const mesh of meshes) {\r\n this._injectGUI3DReservedDataStore(mesh).control = this;\r\n }\r\n return this._currentMesh;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected override _affectMaterial(mesh: AbstractMesh) {}\r\n}\r\n","import { type Scene } from \"core/scene\";\r\nimport { type TransformNode } from \"core/Meshes/transformNode\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { TouchHolographicButton } from \"./touchHolographicButton\";\r\nimport { DefaultBehavior } from \"../behaviors/defaultBehavior\";\r\nimport { TouchHolographicMenu } from \"./touchHolographicMenu\";\r\nimport { type Observer } from \"core/Misc/observable\";\r\nimport { type Vector3 } from \"core/Maths/math.vector\";\r\nimport { type PickingInfo } from \"core/Collisions/pickingInfo\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\n/**\r\n * NearMenu that displays buttons and follows the camera\r\n * @since 5.0.0\r\n */\r\nexport class NearMenu extends TouchHolographicMenu {\r\n /**\r\n * Base Url for the assets.\r\n */\r\n private static _ASSETS_BASE_URL: string = \"https://assets.babylonjs.com/core/MRTK/\";\r\n /**\r\n * File name for the close icon.\r\n */\r\n private static _PIN_ICON_FILENAME: string = \"IconPin.png\";\r\n\r\n private _pinButton: TouchHolographicButton;\r\n private _dragObserver: Nullable<\r\n Observer<{\r\n delta: Vector3;\r\n position: Vector3;\r\n pickInfo: PickingInfo;\r\n }>\r\n >;\r\n\r\n private _defaultBehavior: DefaultBehavior;\r\n /**\r\n * Regroups all mesh behaviors for the near menu\r\n */\r\n public get defaultBehavior(): DefaultBehavior {\r\n return this._defaultBehavior;\r\n }\r\n\r\n private _isPinned: boolean = false;\r\n /**\r\n * Indicates if the near menu is world-pinned\r\n */\r\n public get isPinned(): boolean {\r\n return this._isPinned;\r\n }\r\n\r\n public set isPinned(value: boolean) {\r\n // Tell the pin button to toggle if this was called manually, for clean state control\r\n if (this._pinButton.isToggled !== value) {\r\n this._pinButton.isToggled = value;\r\n return;\r\n }\r\n\r\n this._isPinned = value;\r\n\r\n if (value) {\r\n this._defaultBehavior.followBehaviorEnabled = false;\r\n } else {\r\n this._defaultBehavior.followBehaviorEnabled = true;\r\n }\r\n }\r\n\r\n private _createPinButton(parent: TransformNode) {\r\n const control = new TouchHolographicButton(\"pin\" + this.name, false);\r\n const baseUrl = Tools.GetAssetUrl(NearMenu._ASSETS_BASE_URL);\r\n control.imageUrl = baseUrl + NearMenu._PIN_ICON_FILENAME;\r\n control.parent = this;\r\n control._host = this._host;\r\n control.isToggleButton = true;\r\n control.onToggleObservable.add((newState) => {\r\n this.isPinned = newState;\r\n });\r\n\r\n if (this._host.utilityLayer) {\r\n control._prepareNode(this._host.utilityLayer.utilityLayerScene);\r\n control.scaling.scaleInPlace(TouchHolographicMenu.MENU_BUTTON_SCALE);\r\n\r\n if (control.node) {\r\n control.node.parent = parent;\r\n }\r\n }\r\n\r\n return control;\r\n }\r\n\r\n protected override _createNode(scene: Scene): Nullable<TransformNode> {\r\n const node = super._createNode(scene)! as Mesh;\r\n\r\n this._pinButton = this._createPinButton(node);\r\n this.isPinned = false;\r\n\r\n this._defaultBehavior.attach(node, [this._backPlate]);\r\n this._defaultBehavior.followBehavior.ignoreCameraPitchAndRoll = true;\r\n this._defaultBehavior.followBehavior.pitchOffset = -15;\r\n this._defaultBehavior.followBehavior.minimumDistance = 0.3;\r\n this._defaultBehavior.followBehavior.defaultDistance = 0.4;\r\n this._defaultBehavior.followBehavior.maximumDistance = 0.6;\r\n\r\n this._backPlate.isNearGrabbable = true;\r\n node.isVisible = false;\r\n\r\n return node;\r\n }\r\n\r\n protected override _finalProcessing() {\r\n super._finalProcessing();\r\n\r\n this._pinButton.position.copyFromFloats((this._backPlate.scaling.x + TouchHolographicMenu.MENU_BUTTON_SCALE) / 2, this._backPlate.scaling.y / 2, 0);\r\n }\r\n\r\n /**\r\n * Creates a near menu GUI 3D control\r\n * @param name name of the near menu\r\n */\r\n constructor(name?: string) {\r\n super(name);\r\n\r\n this._defaultBehavior = new DefaultBehavior();\r\n this._dragObserver = this._defaultBehavior.sixDofDragBehavior.onDragObservable.add(() => {\r\n this.isPinned = true;\r\n });\r\n\r\n this.backPlateMargin = 1;\r\n }\r\n\r\n /**\r\n * Disposes the near menu\r\n */\r\n public override dispose() {\r\n super.dispose();\r\n\r\n this._defaultBehavior.sixDofDragBehavior.onDragObservable.remove(this._dragObserver);\r\n this._defaultBehavior.detach();\r\n }\r\n}\r\n","import { TmpVectors, Vector3 } from \"core/Maths/math.vector\";\r\n\r\nimport { Container3D } from \"./container3D\";\r\nimport { type Control3D } from \"./control3D\";\r\nimport { VolumeBasedPanel } from \"./volumeBasedPanel\";\r\n\r\n/**\r\n * Class used to create a container panel deployed on the surface of a plane\r\n */\r\nexport class PlanePanel extends VolumeBasedPanel {\r\n protected _mapGridNode(control: Control3D, nodePosition: Vector3) {\r\n const mesh = control.mesh;\r\n\r\n if (!mesh) {\r\n return;\r\n }\r\n\r\n control.position = nodePosition.clone();\r\n const target = TmpVectors.Vector3[0];\r\n\r\n target.copyFrom(nodePosition);\r\n\r\n switch (this.orientation) {\r\n case Container3D.FACEORIGIN_ORIENTATION:\r\n case Container3D.FACEFORWARD_ORIENTATION:\r\n target.addInPlace(new Vector3(0, 0, 1));\r\n mesh.lookAt(target);\r\n break;\r\n case Container3D.FACEFORWARDREVERSED_ORIENTATION:\r\n case Container3D.FACEORIGINREVERSED_ORIENTATION:\r\n target.addInPlace(new Vector3(0, 0, -1));\r\n mesh.lookAt(target);\r\n break;\r\n }\r\n }\r\n}\r\n","import { Tools } from \"core/Misc/tools\";\r\nimport { TmpVectors, Vector3 } from \"core/Maths/math.vector\";\r\nimport { type float } from \"core/types\";\r\n\r\nimport { VolumeBasedPanel } from \"./volumeBasedPanel\";\r\nimport { type Control3D } from \"./control3D\";\r\nimport { Container3D } from \"./container3D\";\r\n\r\n/**\r\n * Class used to create a container panel where items get randomized planar mapping\r\n */\r\nexport class ScatterPanel extends VolumeBasedPanel {\r\n private _iteration = 100.0;\r\n\r\n /**\r\n * Gets or sets the number of iteration to use to scatter the controls (100 by default)\r\n */\r\n public get iteration(): float {\r\n return this._iteration;\r\n }\r\n\r\n public set iteration(value: float) {\r\n if (this._iteration === value) {\r\n return;\r\n }\r\n\r\n this._iteration = value;\r\n\r\n Tools.SetImmediate(() => {\r\n this._arrangeChildren();\r\n });\r\n }\r\n\r\n protected _mapGridNode(control: Control3D, nodePosition: Vector3) {\r\n const mesh = control.mesh;\r\n const newPos = this._scatterMapping(nodePosition);\r\n\r\n if (!mesh) {\r\n return;\r\n }\r\n\r\n switch (this.orientation) {\r\n case Container3D.FACEORIGIN_ORIENTATION:\r\n case Container3D.FACEFORWARD_ORIENTATION:\r\n mesh.lookAt(new Vector3(0, 0, 1));\r\n break;\r\n case Container3D.FACEFORWARDREVERSED_ORIENTATION:\r\n case Container3D.FACEORIGINREVERSED_ORIENTATION:\r\n mesh.lookAt(new Vector3(0, 0, -1));\r\n break;\r\n }\r\n\r\n control.position = newPos;\r\n }\r\n\r\n private _scatterMapping(source: Vector3): Vector3 {\r\n source.x = (1.0 - Math.random() * 2.0) * this._cellWidth;\r\n source.y = (1.0 - Math.random() * 2.0) * this._cellHeight;\r\n\r\n return source;\r\n }\r\n\r\n protected override _finalProcessing() {\r\n const meshes = [];\r\n for (const child of this._children) {\r\n if (!child.mesh) {\r\n continue;\r\n }\r\n\r\n meshes.push(child.mesh);\r\n }\r\n\r\n for (let count = 0; count < this._iteration; count++) {\r\n meshes.sort((a, b) => {\r\n const distance1 = a.position.lengthSquared();\r\n const distance2 = b.position.lengthSquared();\r\n\r\n if (distance1 < distance2) {\r\n return 1;\r\n } else if (distance1 > distance2) {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n });\r\n\r\n const radiusPaddingSquared = Math.pow(this.margin, 2.0);\r\n const cellSize = Math.max(this._cellWidth, this._cellHeight);\r\n const difference2D = TmpVectors.Vector2[0];\r\n const difference = TmpVectors.Vector3[0];\r\n\r\n for (let i = 0; i < meshes.length - 1; i++) {\r\n for (let j = i + 1; j < meshes.length; j++) {\r\n if (i != j) {\r\n meshes[j].position.subtractToRef(meshes[i].position, difference);\r\n\r\n // Ignore Z axis\r\n difference2D.x = difference.x;\r\n difference2D.y = difference.y;\r\n const combinedRadius = cellSize;\r\n let distance = difference2D.lengthSquared() - radiusPaddingSquared;\r\n const minSeparation = Math.min(distance, radiusPaddingSquared);\r\n distance -= minSeparation;\r\n\r\n if (distance < Math.pow(combinedRadius, 2.0)) {\r\n difference2D.normalize();\r\n difference.scaleInPlace((combinedRadius - Math.sqrt(distance)) * 0.5);\r\n meshes[j].position.addInPlace(difference);\r\n meshes[i].position.subtractInPlace(difference);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"mrdlSliderBarPixelShader\";\nconst shader = `uniform vec3 cameraPosition;varying vec3 vPosition;varying vec3 vNormal;varying vec2 vUV;varying vec3 vTangent;varying vec3 vBinormal;varying vec4 vColor;varying vec4 vExtra1;varying vec4 vExtra2;varying vec4 vExtra3;uniform float _Radius_;uniform float _Bevel_Front_;uniform float _Bevel_Front_Stretch_;uniform float _Bevel_Back_;uniform float _Bevel_Back_Stretch_;uniform float _Radius_Top_Left_;uniform float _Radius_Top_Right_;uniform float _Radius_Bottom_Left_;uniform float _Radius_Bottom_Right_;uniform bool _Bulge_Enabled_;uniform float _Bulge_Height_;uniform float _Bulge_Radius_;uniform float _Sun_Intensity_;uniform float _Sun_Theta_;uniform float _Sun_Phi_;uniform float _Indirect_Diffuse_;uniform vec4 _Albedo_;uniform float _Specular_;uniform float _Shininess_;uniform float _Sharpness_;uniform float _Subsurface_;uniform vec4 _Left_Color_;uniform vec4 _Right_Color_;uniform float _Reflection_;uniform float _Front_Reflect_;uniform float _Edge_Reflect_;uniform float _Power_;uniform vec4 _Sky_Color_;uniform vec4 _Horizon_Color_;uniform vec4 _Ground_Color_;uniform float _Horizon_Power_;uniform sampler2D _Reflection_Map_;uniform sampler2D _Indirect_Environment_;uniform float _Width_;uniform float _Fuzz_;uniform float _Min_Fuzz_;uniform float _Clip_Fade_;uniform float _Hue_Shift_;uniform float _Saturation_Shift_;uniform float _Value_Shift_;uniform vec3 _Blob_Position_;uniform float _Blob_Intensity_;uniform float _Blob_Near_Size_;uniform float _Blob_Far_Size_;uniform float _Blob_Near_Distance_;uniform float _Blob_Far_Distance_;uniform float _Blob_Fade_Length_;uniform float _Blob_Pulse_;uniform float _Blob_Fade_;uniform sampler2D _Blob_Texture_;uniform vec3 _Blob_Position_2_;uniform float _Blob_Near_Size_2_;uniform float _Blob_Pulse_2_;uniform float _Blob_Fade_2_;uniform vec3 _Left_Index_Pos_;uniform vec3 _Right_Index_Pos_;uniform vec3 _Left_Index_Middle_Pos_;uniform vec3 _Right_Index_Middle_Pos_;uniform sampler2D _Decal_;uniform vec2 _Decal_Scale_XY_;uniform bool _Decal_Front_Only_;uniform float _Rim_Intensity_;uniform sampler2D _Rim_Texture_;uniform float _Rim_Hue_Shift_;uniform float _Rim_Saturation_Shift_;uniform float _Rim_Value_Shift_;uniform float _Iridescence_Intensity_;uniform sampler2D _Iridescence_Texture_;uniform bool Use_Global_Left_Index;uniform bool Use_Global_Right_Index;uniform vec4 Global_Left_Index_Tip_Position;uniform vec4 Global_Right_Index_Tip_Position;uniform vec4 Global_Left_Thumb_Tip_Position;uniform vec4 Global_Right_Thumb_Tip_Position;uniform vec4 Global_Left_Index_Middle_Position;uniform vec4 Global_Right_Index_Middle_Position;uniform float Global_Left_Index_Tip_Proximity;uniform float Global_Right_Index_Tip_Proximity;void Blob_Fragment_B30(\nsampler2D Blob_Texture,\nvec4 Blob_Info1,\nvec4 Blob_Info2,\nout vec4 Blob_Color)\n{float k1=dot(Blob_Info1.xy,Blob_Info1.xy);float k2=dot(Blob_Info2.xy,Blob_Info2.xy);vec3 closer=k1<k2 ? vec3(k1,Blob_Info1.z,Blob_Info1.w) : vec3(k2,Blob_Info2.z,Blob_Info2.w);Blob_Color=closer.z*texture(Blob_Texture,vec2(vec2(sqrt(closer.x),closer.y).x,1.0-vec2(sqrt(closer.x),closer.y).y))*clamp(1.0-closer.x,0.0,1.0);}\nvoid FastLinearTosRGB_B42(\nvec4 Linear,\nout vec4 sRGB)\n{sRGB.rgb=sqrt(clamp(Linear.rgb,0.0,1.0));sRGB.a=Linear.a;}\nvoid Scale_RGB_B59(\nvec4 Color,\nfloat Scalar,\nout vec4 Result)\n{Result=vec4(Scalar,Scalar,Scalar,1)*Color;}\nvoid Fragment_Main_B121(\nfloat Sun_Intensity,\nfloat Sun_Theta,\nfloat Sun_Phi,\nvec3 Normal,\nvec4 Albedo,\nfloat Fresnel_Reflect,\nfloat Shininess,\nvec3 Incident,\nvec4 Horizon_Color,\nvec4 Sky_Color,\nvec4 Ground_Color,\nfloat Indirect_Diffuse,\nfloat Specular,\nfloat Horizon_Power,\nfloat Reflection,\nvec4 Reflection_Sample,\nvec4 Indirect_Sample,\nfloat Sharpness,\nfloat SSS,\nfloat Subsurface,\nvec4 Translucence,\nvec4 Rim_Light,\nvec4 Iridescence,\nout vec4 Result)\n{float theta=Sun_Theta*2.0*3.14159;float phi=Sun_Phi*3.14159;vec3 lightDir= vec3(cos(phi)*cos(theta),sin(phi),cos(phi)*sin(theta));float NdotL=max(dot(lightDir,Normal),0.0);vec3 R=reflect(Incident,Normal);float RdotL=max(0.0,dot(R,lightDir));float specular=pow(RdotL,Shininess);specular=mix(specular,smoothstep(0.495*Sharpness,1.0-0.495*Sharpness,specular),Sharpness);vec4 gi=mix(Ground_Color,Sky_Color,Normal.y*0.5+0.5);Result=((Sun_Intensity*NdotL+Indirect_Sample*Indirect_Diffuse+Translucence)*(1.0+SSS*Subsurface))*Albedo*(1.0-Fresnel_Reflect)+(Sun_Intensity*specular*Specular+Fresnel_Reflect*Reflection*Reflection_Sample)+Fresnel_Reflect*Rim_Light+Iridescence;}\nvoid Bulge_B79(\nbool Enabled,\nvec3 Normal,\nvec3 Tangent,\nfloat Bulge_Height,\nvec4 UV,\nfloat Bulge_Radius,\nvec3 ButtonN,\nout vec3 New_Normal)\n{vec2 xy=clamp(UV.xy*2.0,vec2(-1,-1),vec2(1,1));vec3 B=(cross(Normal,Tangent));float k=-clamp(1.0-length(xy)/Bulge_Radius,0.0,1.0)*Bulge_Height;k=sin(k*3.14159*0.5);k*=smoothstep(0.9998,0.9999,abs(dot(ButtonN,Normal)));New_Normal=Normal*sqrt(1.0-k*k)+(xy.x*Tangent+xy.y*B)*k;New_Normal=Enabled ? New_Normal : Normal;}\nvoid SSS_B77(\nvec3 ButtonN,\nvec3 Normal,\nvec3 Incident,\nout float Result)\n{float NdotI=abs(dot(Normal,Incident));float BdotI=abs(dot(ButtonN,Incident));Result=(abs(NdotI-BdotI)); }\nvoid FingerOcclusion_B67(\nfloat Width,\nfloat DistToCenter,\nfloat Fuzz,\nfloat Min_Fuzz,\nvec3 Position,\nvec3 Forward,\nvec3 Nearest,\nfloat Fade_Out,\nout float NotInShadow)\n{float d=dot((Nearest-Position),Forward);float sh=smoothstep(Width*0.5,Width*0.5+Fuzz*max(d,0.0)+Min_Fuzz,DistToCenter);NotInShadow=1.0-(1.0-sh)*smoothstep(-Fade_Out,0.0,d);}\nvoid FingerOcclusion_B68(\nfloat Width,\nfloat DistToCenter,\nfloat Fuzz,\nfloat Min_Fuzz,\nvec3 Position,\nvec3 Forward,\nvec3 Nearest,\nfloat Fade_Out,\nout float NotInShadow)\n{float d=dot((Nearest-Position),Forward);float sh=smoothstep(Width*0.5,Width*0.5+Fuzz*max(d,0.0)+Min_Fuzz,DistToCenter);NotInShadow=1.0-(1.0-sh)*smoothstep(-Fade_Out,0.0,d);}\nvoid Scale_Color_B91(\nvec4 Color,\nfloat Scalar,\nout vec4 Result)\n{Result=Scalar*Color;}\nvoid From_HSV_B73(\nfloat Hue,\nfloat Saturation,\nfloat Value,\nfloat Alpha,\nout vec4 Color)\n{vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(vec3(Hue,Hue,Hue)+K.xyz)*6.0-K.www);Color.rgb=Value*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),Saturation);Color.a=Alpha;}\nvoid Fast_Fresnel_B122(\nfloat Front_Reflect,\nfloat Edge_Reflect,\nfloat Power,\nvec3 Normal,\nvec3 Incident,\nout float Transmit,\nout float Reflect)\n{float d=max(-dot(Incident,Normal),0.0);Reflect=Front_Reflect+(Edge_Reflect-Front_Reflect)*pow(.01-d,Power);Transmit=1.0-Reflect;}\nvoid Mapped_Environment_B51(\nsampler2D Reflected_Environment,\nsampler2D Indirect_Environment,\nvec3 Dir,\nout vec4 Reflected_Color,\nout vec4 Indirect_Diffuse)\n{Reflected_Color=texture(Reflected_Environment,vec2(atan(Dir.z,Dir.x)/3.14159*0.5,asin(Dir.y)/3.14159+0.5));Indirect_Diffuse=texture(Indirect_Environment,vec2(atan(Dir.z,Dir.x)/3.14159*0.5,asin(Dir.y)/3.14159+0.5));}\nvec4 SampleEnv_Bid50(vec3 D,vec4 S,vec4 H,vec4 G,float exponent)\n{float k=pow(abs(D.y),exponent);vec4 C;if (D.y>0.0) {C=mix(H,S,k);} else {C=mix(H,G,k); }\nreturn C;}\nvoid Sky_Environment_B50(\nvec3 Normal,\nvec3 Reflected,\nvec4 Sky_Color,\nvec4 Horizon_Color,\nvec4 Ground_Color,\nfloat Horizon_Power,\nout vec4 Reflected_Color,\nout vec4 Indirect_Color)\n{Reflected_Color=SampleEnv_Bid50(Reflected,Sky_Color,Horizon_Color,Ground_Color,Horizon_Power);Indirect_Color=mix(Ground_Color,Sky_Color,Normal.y*0.5+0.5);}\nvoid Min_Segment_Distance_B65(\nvec3 P0,\nvec3 P1,\nvec3 Q0,\nvec3 Q1,\nout vec3 NearP,\nout vec3 NearQ,\nout float Distance)\n{vec3 u=P1-P0;vec3 v=Q1-Q0;vec3 w=P0-Q0;float a=dot(u,u);float b=dot(u,v);float c=dot(v,v);float d=dot(u,w);float e=dot(v,w);float D=a*c-b*b;float sD=D;float tD=D;float sc,sN,tc,tN;if (D<0.00001) {sN=0.0;sD=1.0;tN=e;tD=c;} else {sN=(b*e-c*d);tN=(a*e-b*d);if (sN<0.0) {sN=0.0;tN=e;tD=c;} else if (sN>sD) {sN=sD;tN=e+b;tD=c;}}\nif (tN<0.0) {tN=0.0;if (-d<0.0) {sN=0.0;} else if (-d>a) {sN=sD;} else {sN=-d;sD=a;}} else if (tN>tD) {tN=tD;if ((-d+b)<0.0) {sN=0.0;} else if ((-d+b)>a) {sN=sD;} else {sN=(-d+b);sD=a;}}\nsc=abs(sN)<0.000001 ? 0.0 : sN/sD;tc=abs(tN)<0.000001 ? 0.0 : tN/tD;NearP=P0+sc*u;NearQ=Q0+tc*v;Distance=distance(NearP,NearQ);}\nvoid To_XYZ_B74(\nvec3 Vec3,\nout float X,\nout float Y,\nout float Z)\n{X=Vec3.x;Y=Vec3.y;Z=Vec3.z;}\nvoid Finger_Positions_B64(\nvec3 Left_Index_Pos,\nvec3 Right_Index_Pos,\nvec3 Left_Index_Middle_Pos,\nvec3 Right_Index_Middle_Pos,\nout vec3 Left_Index,\nout vec3 Right_Index,\nout vec3 Left_Index_Middle,\nout vec3 Right_Index_Middle)\n{Left_Index= (Use_Global_Left_Index ? Global_Left_Index_Tip_Position.xyz : Left_Index_Pos);Right_Index= (Use_Global_Right_Index ? Global_Right_Index_Tip_Position.xyz : Right_Index_Pos);Left_Index_Middle= (Use_Global_Left_Index ? Global_Left_Index_Middle_Position.xyz : Left_Index_Middle_Pos);Right_Index_Middle= (Use_Global_Right_Index ? Global_Right_Index_Middle_Position.xyz : Right_Index_Middle_Pos);}\nvoid VaryHSV_B108(\nvec3 HSV_In,\nfloat Hue_Shift,\nfloat Saturation_Shift,\nfloat Value_Shift,\nout vec3 HSV_Out)\n{HSV_Out=vec3(fract(HSV_In.x+Hue_Shift),clamp(HSV_In.y+Saturation_Shift,0.0,1.0),clamp(HSV_In.z+Value_Shift,0.0,1.0));}\nvoid Remap_Range_B114(\nfloat In_Min,\nfloat In_Max,\nfloat Out_Min,\nfloat Out_Max,\nfloat In,\nout float Out)\n{Out=mix(Out_Min,Out_Max,clamp((In-In_Min)/(In_Max-In_Min),0.0,1.0));}\nvoid To_HSV_B75(\nvec4 Color,\nout float Hue,\nout float Saturation,\nout float Value,\nout float Alpha,\nout vec3 HSV)\n{vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=Color.g<Color.b ? vec4(Color.bg,K.wz) : vec4(Color.gb,K.xy);vec4 q=Color.r<p.x ? vec4(p.xyw,Color.r) : vec4(Color.r,p.yzx);float d=q.x-min(q.w,q.y);float e=1.0e-10;Hue=abs(q.z+(q.w-q.y)/(6.0*d+e));Saturation=d/(q.x+e);Value=q.x;Alpha=Color.a;HSV=vec3(Hue,Saturation,Value);}\nvoid Code_B110(\nfloat X,\nout float Result)\n{Result=(acos(X)/3.14159-0.5)*2.0;}\nvoid Rim_Light_B132(\nvec3 Front,\nvec3 Normal,\nvec3 Incident,\nfloat Rim_Intensity,\nsampler2D Texture,\nout vec4 Result)\n{vec3 R=reflect(Incident,Normal);float RdotF=dot(R,Front);float RdotL=sqrt(1.0-RdotF*RdotF);vec2 UV=vec2(R.y*0.5+0.5,0.5);vec4 Color=texture(Texture,UV);Result=Color;}\nvoid main()\n{vec4 Blob_Color_Q30;\n#if BLOB_ENABLE\nBlob_Fragment_B30(_Blob_Texture_,vExtra2,vExtra3,Blob_Color_Q30);\n#else\nBlob_Color_Q30=vec4(0,0,0,0);\n#endif\nvec3 Incident_Q39=normalize(vPosition-cameraPosition);vec3 Normalized_Q38=normalize(vNormal);vec3 Normalized_Q71=normalize(vTangent);vec4 Color_Q83;\n#if DECAL_ENABLE\nColor_Q83=texture(_Decal_,vUV);\n#else\nColor_Q83=vec4(0,0,0,0);\n#endif\nfloat X_Q90;float Y_Q90;float Z_Q90;float W_Q90;X_Q90=vExtra1.x;Y_Q90=vExtra1.y;Z_Q90=vExtra1.z;W_Q90=vExtra1.w;vec4 Linear_Q43;Linear_Q43.rgb=clamp(_Sky_Color_.rgb*_Sky_Color_.rgb,0.0,1.0);Linear_Q43.a=_Sky_Color_.a;vec4 Linear_Q44;Linear_Q44.rgb=clamp(_Horizon_Color_.rgb*_Horizon_Color_.rgb,0.0,1.0);Linear_Q44.a=_Horizon_Color_.a;vec4 Linear_Q45;Linear_Q45.rgb=clamp(_Ground_Color_.rgb*_Ground_Color_.rgb,0.0,1.0);Linear_Q45.a=_Ground_Color_.a;vec3 Left_Index_Q64;vec3 Right_Index_Q64;vec3 Left_Index_Middle_Q64;vec3 Right_Index_Middle_Q64;Finger_Positions_B64(_Left_Index_Pos_,_Right_Index_Pos_,_Left_Index_Middle_Pos_,_Right_Index_Middle_Pos_,Left_Index_Q64,Right_Index_Q64,Left_Index_Middle_Q64,Right_Index_Middle_Q64);vec4 Linear_Q46;Linear_Q46.rgb=clamp(_Albedo_.rgb*_Albedo_.rgb,0.0,1.0);Linear_Q46.a=_Albedo_.a;vec3 Normalized_Q107=normalize(vBinormal);vec3 Incident_Q70=normalize(vPosition-cameraPosition);vec3 New_Normal_Q79;Bulge_B79(_Bulge_Enabled_,Normalized_Q38,Normalized_Q71,_Bulge_Height_,vColor,_Bulge_Radius_,vBinormal,New_Normal_Q79);float Result_Q77;SSS_B77(vBinormal,New_Normal_Q79,Incident_Q39,Result_Q77);vec4 Result_Q91;Scale_Color_B91(Color_Q83,X_Q90,Result_Q91);float Transmit_Q122;float Reflect_Q122;Fast_Fresnel_B122(_Front_Reflect_,_Edge_Reflect_,_Power_,New_Normal_Q79,Incident_Q39,Transmit_Q122,Reflect_Q122);float Product_Q125=Y_Q90*Y_Q90;vec3 NearP_Q65;vec3 NearQ_Q65;float Distance_Q65;Min_Segment_Distance_B65(Left_Index_Q64,Left_Index_Middle_Q64,vPosition,cameraPosition,NearP_Q65,NearQ_Q65,Distance_Q65);vec3 NearP_Q63;vec3 NearQ_Q63;float Distance_Q63;Min_Segment_Distance_B65(Right_Index_Q64,Right_Index_Middle_Q64,vPosition,cameraPosition,NearP_Q63,NearQ_Q63,Distance_Q63);vec3 Reflected_Q47=reflect(Incident_Q39,New_Normal_Q79);vec4 Product_Q103=Linear_Q46*vec4(1,1,1,1);vec4 Result_Q132;Rim_Light_B132(Normalized_Q107,Normalized_Q38,Incident_Q70,_Rim_Intensity_,_Rim_Texture_,Result_Q132);float Dot_Q72=dot(Incident_Q70, Normalized_Q71);float MaxAB_Q123=max(Reflect_Q122,Product_Q125);float NotInShadow_Q67;\n#if OCCLUSION_ENABLED\nFingerOcclusion_B67(_Width_,Distance_Q65,_Fuzz_,_Min_Fuzz_,vPosition,vBinormal,NearP_Q65,_Clip_Fade_,NotInShadow_Q67);\n#else\nNotInShadow_Q67=1.0;\n#endif\nfloat NotInShadow_Q68;\n#if OCCLUSION_ENABLED\nFingerOcclusion_B68(_Width_,Distance_Q63,_Fuzz_,_Min_Fuzz_,vPosition,vBinormal,NearP_Q63,_Clip_Fade_,NotInShadow_Q68);\n#else\nNotInShadow_Q68=1.0;\n#endif\nvec4 Reflected_Color_Q51;vec4 Indirect_Diffuse_Q51;\n#if ENV_ENABLE\nMapped_Environment_B51(_Reflection_Map_,_Indirect_Environment_,Reflected_Q47,Reflected_Color_Q51,Indirect_Diffuse_Q51);\n#else\nReflected_Color_Q51=vec4(0,0,0,1);Indirect_Diffuse_Q51=vec4(0,0,0,1);\n#endif\nvec4 Reflected_Color_Q50;vec4 Indirect_Color_Q50;\n#if SKY_ENABLED\nSky_Environment_B50(New_Normal_Q79,Reflected_Q47,Linear_Q43,Linear_Q44,Linear_Q45,_Horizon_Power_,Reflected_Color_Q50,Indirect_Color_Q50);\n#else\nReflected_Color_Q50=vec4(0,0,0,1);Indirect_Color_Q50=vec4(0,0,0,1);\n#endif\nfloat Hue_Q75;float Saturation_Q75;float Value_Q75;float Alpha_Q75;vec3 HSV_Q75;To_HSV_B75(Product_Q103,Hue_Q75,Saturation_Q75,Value_Q75,Alpha_Q75,HSV_Q75);float Hue_Q127;float Saturation_Q127;float Value_Q127;float Alpha_Q127;vec3 HSV_Q127;To_HSV_B75(Result_Q132,Hue_Q127,Saturation_Q127,Value_Q127,Alpha_Q127,HSV_Q127);float Result_Q110;Code_B110(Dot_Q72,Result_Q110);float AbsA_Q76=abs(Result_Q110);float MinAB_Q58=min(NotInShadow_Q67,NotInShadow_Q68);vec4 Sum_Q48=Reflected_Color_Q51+Reflected_Color_Q50;vec4 Sum_Q49=Indirect_Diffuse_Q51+Indirect_Color_Q50;vec3 HSV_Out_Q126;VaryHSV_B108(HSV_Q127,_Rim_Hue_Shift_,_Rim_Saturation_Shift_,_Rim_Value_Shift_,HSV_Out_Q126);float Out_Q114;Remap_Range_B114(-1.0,1.0,0.0,1.0,Result_Q110,Out_Q114);float Product_Q106;Product_Q106=AbsA_Q76*_Hue_Shift_;float X_Q128;float Y_Q128;float Z_Q128;To_XYZ_B74(HSV_Out_Q126,X_Q128,Y_Q128,Z_Q128);vec2 Vec2_Q112=vec2(Out_Q114,0.5);vec3 HSV_Out_Q108;VaryHSV_B108(HSV_Q75,Product_Q106,_Saturation_Shift_,_Value_Shift_,HSV_Out_Q108);vec4 Color_Q129;From_HSV_B73(X_Q128,Y_Q128,Z_Q128,0.0,Color_Q129);vec4 Color_Q111;\n#if IRIDESCENCE_ENABLED\nColor_Q111=texture(_Iridescence_Texture_,Vec2_Q112);\n#else\nColor_Q111=vec4(0,0,0,0);\n#endif\nfloat X_Q74;float Y_Q74;float Z_Q74;To_XYZ_B74(HSV_Out_Q108,X_Q74,Y_Q74,Z_Q74);vec4 Result_Q131=_Rim_Intensity_*Color_Q129;vec4 Result_Q113=_Iridescence_Intensity_*Color_Q111;vec4 Color_Q73;From_HSV_B73(X_Q74,Y_Q74,Z_Q74,0.0,Color_Q73);vec4 Result_Q84=Result_Q91+(1.0-Result_Q91.a)*Color_Q73;vec4 Result_Q121;Fragment_Main_B121(_Sun_Intensity_,_Sun_Theta_,_Sun_Phi_,New_Normal_Q79,Result_Q84,MaxAB_Q123,_Shininess_,Incident_Q39,_Horizon_Color_,_Sky_Color_,_Ground_Color_,_Indirect_Diffuse_,_Specular_,_Horizon_Power_,_Reflection_,Sum_Q48,Sum_Q49,_Sharpness_,Result_Q77,_Subsurface_,vec4(0,0,0,0),Result_Q131,Result_Q113,Result_Q121);vec4 Result_Q59;Scale_RGB_B59(Result_Q121,MinAB_Q58,Result_Q59);vec4 sRGB_Q42;FastLinearTosRGB_B42(Result_Q59,sRGB_Q42);vec4 Result_Q31=Blob_Color_Q30+(1.0-Blob_Color_Q30.a)*sRGB_Q42;vec4 Result_Q40=Result_Q31; Result_Q40.a=1.0;vec4 Out_Color=Result_Q40;float Clip_Threshold=0.001;bool To_sRGB=false;gl_FragColor=Out_Color;}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const mrdlSliderBarPixelShader = { name, shader };\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"mrdlSliderBarVertexShader\";\nconst shader = `uniform mat4 world;uniform mat4 viewProjection;uniform vec3 cameraPosition;attribute vec3 position;attribute vec3 normal;attribute vec2 uv;\n#ifdef TANGENT\nattribute vec3 tangent;\n#else\nconst vec3 tangent=vec3(0.);\n#endif\nuniform float _Radius_;uniform float _Bevel_Front_;uniform float _Bevel_Front_Stretch_;uniform float _Bevel_Back_;uniform float _Bevel_Back_Stretch_;uniform float _Radius_Top_Left_;uniform float _Radius_Top_Right_;uniform float _Radius_Bottom_Left_;uniform float _Radius_Bottom_Right_;uniform bool _Bulge_Enabled_;uniform float _Bulge_Height_;uniform float _Bulge_Radius_;uniform float _Sun_Intensity_;uniform float _Sun_Theta_;uniform float _Sun_Phi_;uniform float _Indirect_Diffuse_;uniform vec4 _Albedo_;uniform float _Specular_;uniform float _Shininess_;uniform float _Sharpness_;uniform float _Subsurface_;uniform vec4 _Left_Color_;uniform vec4 _Right_Color_;uniform float _Reflection_;uniform float _Front_Reflect_;uniform float _Edge_Reflect_;uniform float _Power_;uniform vec4 _Sky_Color_;uniform vec4 _Horizon_Color_;uniform vec4 _Ground_Color_;uniform float _Horizon_Power_;uniform sampler2D _Reflection_Map_;uniform sampler2D _Indirect_Environment_;uniform float _Width_;uniform float _Fuzz_;uniform float _Min_Fuzz_;uniform float _Clip_Fade_;uniform float _Hue_Shift_;uniform float _Saturation_Shift_;uniform float _Value_Shift_;uniform vec3 _Blob_Position_;uniform float _Blob_Intensity_;uniform float _Blob_Near_Size_;uniform float _Blob_Far_Size_;uniform float _Blob_Near_Distance_;uniform float _Blob_Far_Distance_;uniform float _Blob_Fade_Length_;uniform float _Blob_Pulse_;uniform float _Blob_Fade_;uniform sampler2D _Blob_Texture_;uniform vec3 _Blob_Position_2_;uniform float _Blob_Near_Size_2_;uniform float _Blob_Pulse_2_;uniform float _Blob_Fade_2_;uniform vec3 _Left_Index_Pos_;uniform vec3 _Right_Index_Pos_;uniform vec3 _Left_Index_Middle_Pos_;uniform vec3 _Right_Index_Middle_Pos_;uniform sampler2D _Decal_;uniform vec2 _Decal_Scale_XY_;uniform bool _Decal_Front_Only_;uniform float _Rim_Intensity_;uniform sampler2D _Rim_Texture_;uniform float _Rim_Hue_Shift_;uniform float _Rim_Saturation_Shift_;uniform float _Rim_Value_Shift_;uniform float _Iridescence_Intensity_;uniform sampler2D _Iridescence_Texture_;uniform bool Use_Global_Left_Index;uniform bool Use_Global_Right_Index;uniform vec4 Global_Left_Index_Tip_Position;uniform vec4 Global_Right_Index_Tip_Position;uniform vec4 Global_Left_Thumb_Tip_Position;uniform vec4 Global_Right_Thumb_Tip_Position;uniform float Global_Left_Index_Tip_Proximity;uniform float Global_Right_Index_Tip_Proximity;varying vec3 vPosition;varying vec3 vNormal;varying vec2 vUV;varying vec3 vTangent;varying vec3 vBinormal;varying vec4 vColor;varying vec4 vExtra1;varying vec4 vExtra2;varying vec4 vExtra3;void Object_To_World_Pos_B12(\nvec3 Pos_Object,\nout vec3 Pos_World)\n{Pos_World=(world*vec4(Pos_Object,1.0)).xyz;}\nvoid Object_To_World_Normal_B32(\nvec3 Nrm_Object,\nout vec3 Nrm_World)\n{Nrm_World=(vec4(Nrm_Object,0.0)).xyz;}\nvoid Blob_Vertex_B23(\nvec3 Position,\nvec3 Normal,\nvec3 Tangent,\nvec3 Bitangent,\nvec3 Blob_Position,\nfloat Intensity,\nfloat Blob_Near_Size,\nfloat Blob_Far_Size,\nfloat Blob_Near_Distance,\nfloat Blob_Far_Distance,\nfloat Blob_Fade_Length,\nfloat Blob_Pulse,\nfloat Blob_Fade,\nout vec4 Blob_Info)\n{vec3 blob= (Use_Global_Left_Index ? Global_Left_Index_Tip_Position.xyz : Blob_Position);vec3 delta=blob-Position;float dist=dot(Normal,delta);float lerpValue=clamp((abs(dist)-Blob_Near_Distance)/(Blob_Far_Distance-Blob_Near_Distance),0.0,1.0);float fadeValue=1.0-clamp((abs(dist)-Blob_Far_Distance)/Blob_Fade_Length,0.0,1.0);float size=Blob_Near_Size+(Blob_Far_Size-Blob_Near_Size)*lerpValue;vec2 blobXY=vec2(dot(delta,Tangent),dot(delta,Bitangent))/(0.0001+size);float Fade=fadeValue*Intensity*Blob_Fade;float Distance=(lerpValue*0.5+0.5)*(1.0-Blob_Pulse);Blob_Info=vec4(blobXY.x,blobXY.y,Distance,Fade);}\nvoid Blob_Vertex_B24(\nvec3 Position,\nvec3 Normal,\nvec3 Tangent,\nvec3 Bitangent,\nvec3 Blob_Position,\nfloat Intensity,\nfloat Blob_Near_Size,\nfloat Blob_Far_Size,\nfloat Blob_Near_Distance,\nfloat Blob_Far_Distance,\nfloat Blob_Fade_Length,\nfloat Blob_Pulse,\nfloat Blob_Fade,\nout vec4 Blob_Info)\n{vec3 blob= (Use_Global_Right_Index ? Global_Right_Index_Tip_Position.xyz : Blob_Position);vec3 delta=blob-Position;float dist=dot(Normal,delta);float lerpValue=clamp((abs(dist)-Blob_Near_Distance)/(Blob_Far_Distance-Blob_Near_Distance),0.0,1.0);float fadeValue=1.0-clamp((abs(dist)-Blob_Far_Distance)/Blob_Fade_Length,0.0,1.0);float size=Blob_Near_Size+(Blob_Far_Size-Blob_Near_Size)*lerpValue;vec2 blobXY=vec2(dot(delta,Tangent),dot(delta,Bitangent))/(0.0001+size);float Fade=fadeValue*Intensity*Blob_Fade;float Distance=(lerpValue*0.5+0.5)*(1.0-Blob_Pulse);Blob_Info=vec4(blobXY.x,blobXY.y,Distance,Fade);}\nvoid Move_Verts_B130(\nfloat Anisotropy,\nvec3 P,\nfloat Radius,\nfloat Bevel,\nvec3 Normal_Object,\nfloat ScaleZ,\nfloat Stretch,\nout vec3 New_P,\nout vec2 New_UV,\nout float Radial_Gradient,\nout vec3 Radial_Dir,\nout vec3 New_Normal)\n{vec2 UV=P.xy*2.0+0.5;vec2 center=clamp(UV,0.0,1.0);vec2 delta=UV-center;float deltad=(length(delta)*2.0);float f=(Bevel+(Radius-Bevel)*Stretch)/Radius;float innerd=clamp(deltad*2.0,0.0,1.0);float outerd=clamp(deltad*2.0-1.0,0.0,1.0);float bevelAngle=outerd*3.14159*0.5;float sinb=sin(bevelAngle);float cosb=cos(bevelAngle);float beveld=(1.0-f)*innerd+f*sinb;float br=outerd;vec2 r2=2.0*vec2(Radius/Anisotropy,Radius);float dir=P.z<0.0001 ? 1.0 : -1.0;New_UV=center+r2*((0.5-center)+normalize(delta+vec2(0.0,0.000001))*beveld*0.5);New_P=vec3(New_UV-0.5,P.z+dir*(1.0-cosb)*Bevel*ScaleZ);Radial_Gradient=clamp((deltad-0.5)*2.0,0.0,1.0);Radial_Dir=vec3(delta*r2,0.0);vec3 beveledNormal=cosb*Normal_Object+sinb*vec3(delta.x,delta.y,0.0);New_Normal=Normal_Object.z==0.0 ? Normal_Object : beveledNormal;}\nvoid Object_To_World_Dir_B60(\nvec3 Dir_Object,\nout vec3 Normal_World,\nout vec3 Normal_World_N,\nout float Normal_Length)\n{Normal_World=(world*vec4(Dir_Object,0.0)).xyz;Normal_Length=length(Normal_World);Normal_World_N=Normal_World/Normal_Length;}\nvoid To_XYZ_B78(\nvec3 Vec3,\nout float X,\nout float Y,\nout float Z)\n{X=Vec3.x;Y=Vec3.y;Z=Vec3.z;}\nvoid Conditional_Float_B93(\nbool Which,\nfloat If_True,\nfloat If_False,\nout float Result)\n{Result=Which ? If_True : If_False;}\nvoid Object_To_World_Dir_B28(\nvec3 Dir_Object,\nout vec3 Binormal_World,\nout vec3 Binormal_World_N,\nout float Binormal_Length)\n{Binormal_World=(world*vec4(Dir_Object,0.0)).xyz;Binormal_Length=length(Binormal_World);Binormal_World_N=Binormal_World/Binormal_Length;}\nvoid Pick_Radius_B69(\nfloat Radius,\nfloat Radius_Top_Left,\nfloat Radius_Top_Right,\nfloat Radius_Bottom_Left,\nfloat Radius_Bottom_Right,\nvec3 Position,\nout float Result)\n{bool whichY=Position.y>0.0;Result=Position.x<0.0 ? (whichY ? Radius_Top_Left : Radius_Bottom_Left) : (whichY ? Radius_Top_Right : Radius_Bottom_Right);Result*=Radius;}\nvoid Conditional_Float_B36(\nbool Which,\nfloat If_True,\nfloat If_False,\nout float Result)\n{Result=Which ? If_True : If_False;}\nvoid Greater_Than_B37(\nfloat Left,\nfloat Right,\nout bool Not_Greater_Than,\nout bool Greater_Than)\n{Greater_Than=Left>Right;Not_Greater_Than=!Greater_Than;}\nvoid Remap_Range_B105(\nfloat In_Min,\nfloat In_Max,\nfloat Out_Min,\nfloat Out_Max,\nfloat In,\nout float Out)\n{Out=mix(Out_Min,Out_Max,clamp((In-In_Min)/(In_Max-In_Min),0.0,1.0));}\nvoid main()\n{vec2 XY_Q85;XY_Q85=(uv-vec2(0.5,0.5))*_Decal_Scale_XY_+vec2(0.5,0.5);vec3 Tangent_World_Q27;vec3 Tangent_World_N_Q27;float Tangent_Length_Q27;Tangent_World_Q27=(world*vec4(vec3(1,0,0),0.0)).xyz;Tangent_Length_Q27=length(Tangent_World_Q27);Tangent_World_N_Q27=Tangent_World_Q27/Tangent_Length_Q27;vec3 Normal_World_Q60;vec3 Normal_World_N_Q60;float Normal_Length_Q60;Object_To_World_Dir_B60(vec3(0,0,1),Normal_World_Q60,Normal_World_N_Q60,Normal_Length_Q60);float X_Q78;float Y_Q78;float Z_Q78;To_XYZ_B78(position,X_Q78,Y_Q78,Z_Q78);vec3 Nrm_World_Q26;Nrm_World_Q26=normalize((world*vec4(normal,0.0)).xyz);vec3 Binormal_World_Q28;vec3 Binormal_World_N_Q28;float Binormal_Length_Q28;Object_To_World_Dir_B28(vec3(0,1,0),Binormal_World_Q28,Binormal_World_N_Q28,Binormal_Length_Q28);float Anisotropy_Q29=Tangent_Length_Q27/Binormal_Length_Q28;float Result_Q69;Pick_Radius_B69(_Radius_,_Radius_Top_Left_,_Radius_Top_Right_,_Radius_Bottom_Left_,_Radius_Bottom_Right_,position,Result_Q69);float Anisotropy_Q53=Binormal_Length_Q28/Normal_Length_Q60;bool Not_Greater_Than_Q37;bool Greater_Than_Q37;Greater_Than_B37(Z_Q78,0.0,Not_Greater_Than_Q37,Greater_Than_Q37);vec4 Linear_Q101;Linear_Q101.rgb=clamp(_Left_Color_.rgb*_Left_Color_.rgb,0.0,1.0);Linear_Q101.a=_Left_Color_.a;vec4 Linear_Q102;Linear_Q102.rgb=clamp(_Right_Color_.rgb*_Right_Color_.rgb,0.0,1.0);Linear_Q102.a=_Right_Color_.a;vec3 Difference_Q61=vec3(0,0,0)-Normal_World_N_Q60;vec4 Out_Color_Q34=vec4(X_Q78,Y_Q78,Z_Q78,1);float Result_Q36;Conditional_Float_B36(Greater_Than_Q37,_Bevel_Back_,_Bevel_Front_,Result_Q36);float Result_Q94;Conditional_Float_B36(Greater_Than_Q37,_Bevel_Back_Stretch_,_Bevel_Front_Stretch_,Result_Q94);vec3 New_P_Q130;vec2 New_UV_Q130;float Radial_Gradient_Q130;vec3 Radial_Dir_Q130;vec3 New_Normal_Q130;Move_Verts_B130(Anisotropy_Q29,position,Result_Q69,Result_Q36,normal,Anisotropy_Q53,Result_Q94,New_P_Q130,New_UV_Q130,Radial_Gradient_Q130,Radial_Dir_Q130,New_Normal_Q130);float X_Q98;float Y_Q98;X_Q98=New_UV_Q130.x;Y_Q98=New_UV_Q130.y;vec3 Pos_World_Q12;Object_To_World_Pos_B12(New_P_Q130,Pos_World_Q12);vec3 Nrm_World_Q32;Object_To_World_Normal_B32(New_Normal_Q130,Nrm_World_Q32);vec4 Blob_Info_Q23;\n#if BLOB_ENABLE\nBlob_Vertex_B23(Pos_World_Q12,Nrm_World_Q26,Tangent_World_N_Q27,Binormal_World_N_Q28,_Blob_Position_,_Blob_Intensity_,_Blob_Near_Size_,_Blob_Far_Size_,_Blob_Near_Distance_,_Blob_Far_Distance_,_Blob_Fade_Length_,_Blob_Pulse_,_Blob_Fade_,Blob_Info_Q23);\n#else\nBlob_Info_Q23=vec4(0,0,0,0);\n#endif\nvec4 Blob_Info_Q24;\n#if BLOB_ENABLE_2\nBlob_Vertex_B24(Pos_World_Q12,Nrm_World_Q26,Tangent_World_N_Q27,Binormal_World_N_Q28,_Blob_Position_2_,_Blob_Intensity_,_Blob_Near_Size_2_,_Blob_Far_Size_,_Blob_Near_Distance_,_Blob_Far_Distance_,_Blob_Fade_Length_,_Blob_Pulse_2_,_Blob_Fade_2_,Blob_Info_Q24);\n#else\nBlob_Info_Q24=vec4(0,0,0,0);\n#endif\nfloat Out_Q105;Remap_Range_B105(0.0,1.0,0.0,1.0,X_Q98,Out_Q105);float X_Q86;float Y_Q86;float Z_Q86;To_XYZ_B78(Nrm_World_Q32,X_Q86,Y_Q86,Z_Q86);vec4 Color_At_T_Q97=mix(Linear_Q101,Linear_Q102,Out_Q105);float Minus_F_Q87=-Z_Q86;float R_Q99;float G_Q99;float B_Q99;float A_Q99;R_Q99=Color_At_T_Q97.r; G_Q99=Color_At_T_Q97.g; B_Q99=Color_At_T_Q97.b; A_Q99=Color_At_T_Q97.a;float ClampF_Q88=clamp(0.0,Minus_F_Q87,1.0);float Result_Q93;Conditional_Float_B93(_Decal_Front_Only_,ClampF_Q88,1.0,Result_Q93);vec4 Vec4_Q89=vec4(Result_Q93,Radial_Gradient_Q130,G_Q99,B_Q99);vec3 Position=Pos_World_Q12;vec3 Normal=Nrm_World_Q32;vec2 UV=XY_Q85;vec3 Tangent=Tangent_World_N_Q27;vec3 Binormal=Difference_Q61;vec4 Color=Out_Color_Q34;vec4 Extra1=Vec4_Q89;vec4 Extra2=Blob_Info_Q23;vec4 Extra3=Blob_Info_Q24;gl_Position=viewProjection*vec4(Position,1);vPosition=Position;vNormal=Normal;vUV=UV;vTangent=Tangent;vBinormal=Binormal;vColor=Color;vExtra1=Extra1;vExtra2=Extra2;vExtra3=Extra3;}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const mrdlSliderBarVertexShader = { name, shader };\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type Nullable } from \"core/types\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { SerializationHelper } from \"core/Misc/decorators.serialization\";\r\nimport { type Matrix, Vector2, Vector3, Vector4 } from \"core/Maths/math.vector\";\r\nimport { type IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { type IEffectCreationOptions } from \"core/Materials/effect\";\r\nimport { PushMaterial } from \"core/Materials/pushMaterial\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { type SubMesh } from \"core/Meshes/subMesh\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { Color4 } from \"core/Maths/math.color\";\r\nimport { EffectFallbacks } from \"core/Materials/effectFallbacks\";\r\nimport { Constants } from \"core/Engines/constants\";\r\n\r\nimport \"./shaders/mrdlSliderBar.fragment\";\r\nimport \"./shaders/mrdlSliderBar.vertex\";\r\nimport { HandleFallbacksForShadows, PrepareAttributesForInstances, PrepareDefinesForAttributes, PrepareUniformsAndSamplersList } from \"core/Materials/materialHelper.functions\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\n/** @internal */\r\nclass MRDLSliderBarMaterialDefines extends MaterialDefines {\r\n /*\r\n \"SKY_ENABLED\", \"BLOB_ENABLE_2\", \"IRIDESCENCE_ENABLED\"\r\n */\r\n public SKY_ENABLED = true;\r\n public BLOB_ENABLE_2 = true;\r\n public IRIDESCENCE_ENABLED = true;\r\n\r\n constructor() {\r\n super();\r\n this._needNormals = true;\r\n this._needUVs = true;\r\n this.rebuild();\r\n }\r\n}\r\n\r\n/**\r\n * Class used to render Slider Bar material with MRDL\r\n */\r\nexport class MRDLSliderBarMaterial extends PushMaterial {\r\n /**\r\n * URL pointing to the texture used to define the coloring for the Iridescent Map effect.\r\n */\r\n public static BLUE_GRADIENT_TEXTURE_URL = \"https://assets.babylonjs.com/core/MRTK/MRDL/mrtk-mrdl-blue-gradient.png\";\r\n private _blueGradientTexture: Texture;\r\n private _decalTexture: Texture;\r\n private _reflectionMapTexture: Texture;\r\n private _indirectEnvTexture: Texture;\r\n\r\n /**\r\n * Gets or sets the corner Radius on the slider bar.\r\n */\r\n @serialize()\r\n public radius = 0.6;\r\n\r\n /**\r\n * Gets or sets the Bevel Front on the slider bar.\r\n */\r\n @serialize()\r\n public bevelFront = 0.6;\r\n\r\n /**\r\n * Gets or sets the Bevel Front Stretch on the slider bar.\r\n */\r\n @serialize()\r\n public bevelFrontStretch = 0.077;\r\n\r\n /**\r\n * Gets or sets the Bevel Back on the slider bar.\r\n */\r\n @serialize()\r\n public bevelBack = 0;\r\n\r\n /**\r\n * Gets or sets the Bevel Back Stretch on the slider bar.\r\n */\r\n @serialize()\r\n public bevelBackStretch = 0;\r\n\r\n /**\r\n * Gets or sets the top left Radii Multiplier.\r\n */\r\n @serialize()\r\n public radiusTopLeft = 1.0;\r\n\r\n /**\r\n * Gets or sets the top left Radii Multiplier.\r\n */\r\n @serialize()\r\n public radiusTopRight = 1.0;\r\n\r\n /**\r\n * Gets or sets the top left Radii Multiplier.\r\n */\r\n @serialize()\r\n public radiusBottomLeft = 1.0;\r\n\r\n /**\r\n * Gets or sets the top left Radii Multiplier.\r\n */\r\n @serialize()\r\n public radiusBottomRight = 1.0;\r\n\r\n /**\r\n * Gets or sets whether Bulge is enabled.\r\n * Default is false.\r\n */\r\n @serialize()\r\n public bulgeEnabled = false;\r\n\r\n /**\r\n * Gets or sets the Bulge Height.\r\n */\r\n @serialize()\r\n public bulgeHeight = -0.323;\r\n\r\n /**\r\n * Gets or sets the Bulge Radius.\r\n */\r\n @serialize()\r\n public bulgeRadius = 0.73;\r\n\r\n /**\r\n * Gets or sets the Sun Intensity.\r\n */\r\n @serialize()\r\n public sunIntensity = 1.102;\r\n\r\n /**\r\n * Gets or sets the Sun Theta.\r\n */\r\n @serialize()\r\n public sunTheta = 0.76;\r\n\r\n /**\r\n * Gets or sets the Sun Phi.\r\n */\r\n @serialize()\r\n public sunPhi = 0.526;\r\n\r\n /**\r\n * Gets or sets the Indirect Diffuse.\r\n */\r\n @serialize()\r\n public indirectDiffuse = 0.658;\r\n\r\n /**\r\n * Gets or sets the base albedo.\r\n */\r\n @serialize()\r\n public albedo = new Color4(0.0117647, 0.505882, 0.996078, 1);\r\n\r\n /**\r\n * Gets or sets the Specular value.\r\n */\r\n @serialize()\r\n public specular = 0;\r\n\r\n /**\r\n * Gets or sets the Shininess value.\r\n */\r\n @serialize()\r\n public shininess = 10;\r\n\r\n /**\r\n * Gets or sets the Sharpness value.\r\n */\r\n @serialize()\r\n public sharpness = 0;\r\n\r\n /**\r\n * Gets or sets the Subsurface value.\r\n */\r\n @serialize()\r\n public subsurface = 0;\r\n\r\n /**\r\n * Gets or sets the left gradient color.\r\n */\r\n @serialize()\r\n public leftGradientColor = new Color4(0.0117647, 0.505882, 0.996078, 1);\r\n\r\n /**\r\n * Gets or sets the right gradient color.\r\n */\r\n @serialize()\r\n public rightGradientColor = new Color4(0.0117647, 0.505882, 0.996078, 1);\r\n\r\n /**\r\n * Gets or sets the reflection value.\r\n */\r\n @serialize()\r\n public reflection = 0.749;\r\n\r\n /**\r\n * Gets or sets the front reflect value.\r\n */\r\n @serialize()\r\n public frontReflect = 0;\r\n\r\n /**\r\n * Gets or sets the edge reflect value.\r\n */\r\n @serialize()\r\n public edgeReflect = 0.09;\r\n\r\n /**\r\n * Gets or sets the power value.\r\n */\r\n @serialize()\r\n public power = 8.13;\r\n\r\n /**\r\n * Gets or sets the sky color.\r\n */\r\n @serialize()\r\n public skyColor = new Color4(0.0117647, 0.964706, 0.996078, 1);\r\n\r\n /**\r\n * Gets or sets the horizon color.\r\n */\r\n @serialize()\r\n public horizonColor = new Color4(0.0117647, 0.333333, 0.996078, 1);\r\n\r\n /**\r\n * Gets or sets the ground color.\r\n */\r\n @serialize()\r\n public groundColor = new Color4(0, 0.254902, 0.996078, 1);\r\n\r\n /**\r\n * Gets or sets the horizon power value.\r\n */\r\n @serialize()\r\n public horizonPower = 1;\r\n\r\n /**\r\n * Gets or sets the finger occlusion width value.\r\n */\r\n @serialize()\r\n public width = 0.02;\r\n\r\n /**\r\n * Gets or sets the finger occlusion fuzz value.\r\n */\r\n @serialize()\r\n public fuzz = 0.5;\r\n\r\n /**\r\n * Gets or sets the minimum finger occlusion fuzz value.\r\n */\r\n @serialize()\r\n public minFuzz = 0.001;\r\n\r\n /**\r\n * Gets or sets the finger occlusion clip fade value.\r\n */\r\n @serialize()\r\n public clipFade = 0.01;\r\n\r\n /**\r\n * Gets or sets the hue shift value.\r\n */\r\n @serialize()\r\n public hueShift = 0;\r\n\r\n /**\r\n * Gets or sets the saturation shift value.\r\n */\r\n @serialize()\r\n public saturationShift = 0;\r\n\r\n /**\r\n * Gets or sets the value shift.\r\n */\r\n @serialize()\r\n public valueShift = 0;\r\n\r\n /**\r\n * Gets or sets the position of the hover glow effect.\r\n */\r\n @serialize()\r\n public blobPosition = new Vector3(0, 0, 0.1);\r\n\r\n /**\r\n * Gets or sets the intensity of the hover glow effect.\r\n */\r\n @serialize()\r\n public blobIntensity = 0.5;\r\n\r\n /**\r\n * Gets or sets the near size of the hover glow effect.\r\n */\r\n @serialize()\r\n public blobNearSize = 0.01;\r\n /**\r\n * Gets or sets the far size of the hover glow effect.\r\n */\r\n @serialize()\r\n public blobFarSize = 0.03;\r\n\r\n /**\r\n * Gets or sets the distance considered \"near\" to the mesh, which controls the size of the hover glow effect (see blobNearSize).\r\n */\r\n @serialize()\r\n public blobNearDistance = 0;\r\n\r\n /**\r\n * Gets or sets the distance considered \"far\" from the mesh, which controls the size of the hover glow effect (see blobFarSize).\r\n */\r\n @serialize()\r\n public blobFarDistance = 0.08;\r\n\r\n /**\r\n * Gets or sets the length of the hover glow effect fade.\r\n */\r\n @serialize()\r\n public blobFadeLength = 0.576;\r\n\r\n /**\r\n * Gets or sets the progress of the hover glow effect selection animation corresponding to the left pointer (0.0 - 1.0).\r\n */\r\n @serialize()\r\n public blobPulse = 0;\r\n\r\n /**\r\n * Gets or sets the opacity of the hover glow effect corresponding to the left pointer (0.0 - 1.0). Default is 0.\r\n */\r\n @serialize()\r\n public blobFade = 1;\r\n\r\n /**\r\n * Gets or sets the position of the hover glow effect.\r\n */\r\n @serialize()\r\n public blobPosition2 = new Vector3(0.2, 0, 0.1);\r\n\r\n /**\r\n * Gets or sets the size of the hover glow effect when the right pointer is considered \"near\" to the mesh (see blobNearDistance).\r\n */\r\n @serialize()\r\n public blobNearSize2 = 0.01;\r\n\r\n /**\r\n * Gets or sets the progress of the hover glow effect selection animation corresponding to the right pointer (0.0 - 1.0).\r\n */\r\n @serialize()\r\n public blobPulse2 = 0;\r\n\r\n /**\r\n * Gets or sets the opacity of the hover glow effect corresponding to the right pointer (0.0 - 1.0). Default is 1.\r\n */\r\n @serialize()\r\n public blobFade2 = 1;\r\n\r\n /**\r\n * Gets or sets the texture of the hover glow effect.\r\n */\r\n @serialize()\r\n public blobTexture = new Texture(\"\", this.getScene());\r\n\r\n /**\r\n * Gets or sets the finger position for left index.\r\n */\r\n @serialize()\r\n public leftIndexPosition = new Vector3(0, 0, 1);\r\n\r\n /**\r\n * Gets or sets the finger position for right index.\r\n */\r\n @serialize()\r\n public rightIndexPosition = new Vector3(-1, -1, -1);\r\n\r\n /**\r\n * Gets or sets the finger position for left index middle position.\r\n */\r\n @serialize()\r\n public leftIndexMiddlePosition = new Vector3(0, 0, 0);\r\n\r\n /**\r\n * Gets or sets the finger position for right index middle position.\r\n */\r\n @serialize()\r\n public rightIndexMiddlePosition = new Vector3(0, 0, 0);\r\n\r\n /**\r\n * Gets or sets the Decal Scle for XY.\r\n */\r\n @serialize()\r\n public decalScaleXY = new Vector2(1.5, 1.5);\r\n\r\n /**\r\n * Gets or sets decalFrontOnly\r\n * Default is true\r\n */\r\n @serialize()\r\n public decalFrontOnly = true;\r\n\r\n /**\r\n * Gets or sets the Rim Light intensity.\r\n */\r\n @serialize()\r\n public rimIntensity = 0.287;\r\n\r\n /**\r\n * Gets or sets the Rim Light hue shift value.\r\n */\r\n @serialize()\r\n public rimHueShift = 0;\r\n\r\n /**\r\n * Gets or sets the Rim Light saturation shift value.\r\n */\r\n @serialize()\r\n public rimSaturationShift = 0;\r\n\r\n /**\r\n * Gets or sets the Rim Light value shift.\r\n */\r\n @serialize()\r\n public rimValueShift = -1;\r\n\r\n /**\r\n * Gets or sets the intensity of the iridescence effect.\r\n */\r\n @serialize()\r\n public iridescenceIntensity = 0;\r\n\r\n /**\r\n * @internal\r\n */\r\n public useGlobalLeftIndex = 1.0;\r\n\r\n /**\r\n * @internal\r\n */\r\n public useGlobalRightIndex = 1.0;\r\n\r\n /**\r\n * @internal\r\n */\r\n public globalLeftIndexTipProximity = 0.0;\r\n\r\n /**\r\n * @internal\r\n */\r\n public globalRightIndexTipProximity = 0.0;\r\n\r\n /**\r\n * @internal\r\n */\r\n public globalLeftIndexTipPosition = new Vector4(0.5, 0.0, -0.55, 1.0);\r\n\r\n /**\r\n * @internal\r\n */\r\n public globaRightIndexTipPosition = new Vector4(0.0, 0.0, 0.0, 1.0);\r\n\r\n /**\r\n * @internal\r\n */\r\n public globalLeftThumbTipPosition = new Vector4(0.5, 0.0, -0.55, 1.0);\r\n\r\n /**\r\n * @internal\r\n */\r\n public globalRightThumbTipPosition = new Vector4(0.0, 0.0, 0.0, 1.0);\r\n\r\n /**\r\n * @internal\r\n */\r\n public globalLeftIndexMiddlePosition = new Vector4(0.5, 0.0, -0.55, 1.0);\r\n\r\n /**\r\n * @internal\r\n */\r\n public globalRightIndexMiddlePosition = new Vector4(0.0, 0.0, 0.0, 1.0);\r\n\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene);\r\n this.alphaMode = Constants.ALPHA_DISABLE;\r\n this.backFaceCulling = false;\r\n const textureUrl = Tools.GetAssetUrl(MRDLSliderBarMaterial.BLUE_GRADIENT_TEXTURE_URL);\r\n this._blueGradientTexture = new Texture(textureUrl, this.getScene(), true, false, Texture.NEAREST_SAMPLINGMODE);\r\n this._decalTexture = new Texture(\"\", this.getScene());\r\n this._reflectionMapTexture = new Texture(\"\", this.getScene());\r\n this._indirectEnvTexture = new Texture(\"\", this.getScene());\r\n }\r\n\r\n public override needAlphaBlending(): boolean {\r\n return false;\r\n }\r\n\r\n public override needAlphaTesting(): boolean {\r\n return false;\r\n }\r\n\r\n public override getAlphaTestTexture(): Nullable<BaseTexture> {\r\n return null;\r\n }\r\n\r\n // Methods\r\n public override isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n const drawWrapper = subMesh._drawWrapper;\r\n\r\n if (this.isFrozen) {\r\n if (drawWrapper.effect && drawWrapper._wasPreviouslyReady) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n subMesh.materialDefines = new MRDLSliderBarMaterialDefines();\r\n }\r\n\r\n const defines = <MRDLSliderBarMaterialDefines>subMesh.materialDefines;\r\n const scene = this.getScene();\r\n\r\n if (!this._blueGradientTexture.isReady()) {\r\n return false;\r\n }\r\n\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n // Attribs\r\n PrepareDefinesForAttributes(mesh, defines, false, false);\r\n\r\n // Get correct effect\r\n if (defines.isDirty) {\r\n defines.markAsProcessed();\r\n\r\n scene.resetCachedMaterial();\r\n\r\n // Fallbacks\r\n const fallbacks = new EffectFallbacks();\r\n if (defines.FOG) {\r\n fallbacks.addFallback(1, \"FOG\");\r\n }\r\n\r\n HandleFallbacksForShadows(defines, fallbacks);\r\n\r\n defines.IMAGEPROCESSINGPOSTPROCESS = scene.imageProcessingConfiguration.applyByPostProcess;\r\n\r\n //Attributes\r\n const attribs = [VertexBuffer.PositionKind];\r\n\r\n if (defines.NORMAL) {\r\n attribs.push(VertexBuffer.NormalKind);\r\n }\r\n\r\n if (defines.UV1) {\r\n attribs.push(VertexBuffer.UVKind);\r\n }\r\n\r\n if (defines.UV2) {\r\n attribs.push(VertexBuffer.UV2Kind);\r\n }\r\n\r\n if (defines.VERTEXCOLOR) {\r\n attribs.push(VertexBuffer.ColorKind);\r\n }\r\n\r\n if (defines.TANGENT) {\r\n attribs.push(VertexBuffer.TangentKind);\r\n }\r\n\r\n PrepareAttributesForInstances(attribs, defines);\r\n\r\n // Legacy browser patch\r\n const shaderName = \"mrdlSliderBar\";\r\n const join = defines.toString();\r\n\r\n const uniforms = [\r\n \"world\",\r\n \"viewProjection\",\r\n \"cameraPosition\",\r\n \"_Radius_\",\r\n \"_Bevel_Front_\",\r\n \"_Bevel_Front_Stretch_\",\r\n \"_Bevel_Back_\",\r\n \"_Bevel_Back_Stretch_\",\r\n \"_Radius_Top_Left_\",\r\n \"_Radius_Top_Right_\",\r\n \"_Radius_Bottom_Left_\",\r\n \"_Radius_Bottom_Right_\",\r\n \"_Bulge_Enabled_\",\r\n \"_Bulge_Height_\",\r\n \"_Bulge_Radius_\",\r\n \"_Sun_Intensity_\",\r\n \"_Sun_Theta_\",\r\n \"_Sun_Phi_\",\r\n \"_Indirect_Diffuse_\",\r\n \"_Albedo_\",\r\n \"_Specular_\",\r\n \"_Shininess_\",\r\n \"_Sharpness_\",\r\n \"_Subsurface_\",\r\n \"_Left_Color_\",\r\n \"_Right_Color_\",\r\n \"_Reflection_\",\r\n \"_Front_Reflect_\",\r\n \"_Edge_Reflect_\",\r\n \"_Power_\",\r\n \"_Sky_Color_\",\r\n \"_Horizon_Color_\",\r\n \"_Ground_Color_\",\r\n \"_Horizon_Power_\",\r\n \"_Reflection_Map_\",\r\n \"_Indirect_Environment_\",\r\n \"_Width_\",\r\n \"_Fuzz_\",\r\n \"_Min_Fuzz_\",\r\n \"_Clip_Fade_\",\r\n \"_Hue_Shift_\",\r\n \"_Saturation_Shift_\",\r\n \"_Value_Shift_\",\r\n \"_Blob_Position_\",\r\n \"_Blob_Intensity_\",\r\n \"_Blob_Near_Size_\",\r\n \"_Blob_Far_Size_\",\r\n \"_Blob_Near_Distance_\",\r\n \"_Blob_Far_Distance_\",\r\n \"_Blob_Fade_Length_\",\r\n \"_Blob_Pulse_\",\r\n \"_Blob_Fade_\",\r\n \"_Blob_Texture_\",\r\n \"_Blob_Position_2_\",\r\n \"_Blob_Near_Size_2_\",\r\n \"_Blob_Pulse_2_\",\r\n \"_Blob_Fade_2_\",\r\n \"_Left_Index_Pos_\",\r\n \"_Right_Index_Pos_\",\r\n \"_Left_Index_Middle_Pos_\",\r\n \"_Right_Index_Middle_Pos_\",\r\n \"_Decal_\",\r\n \"_Decal_Scale_XY_\",\r\n \"_Decal_Front_Only_\",\r\n \"_Rim_Intensity_\",\r\n \"_Rim_Texture_\",\r\n \"_Rim_Hue_Shift_\",\r\n \"_Rim_Saturation_Shift_\",\r\n \"_Rim_Value_Shift_\",\r\n \"_Iridescence_Intensity_\",\r\n \"_Iridescence_Texture_\",\r\n \"Use_Global_Left_Index\",\r\n \"Use_Global_Right_Index\",\r\n \"Global_Left_Index_Tip_Position\",\r\n \"Global_Right_Index_Tip_Position\",\r\n \"Global_Left_Thumb_Tip_Position\",\r\n \"Global_Right_Thumb_Tip_Position\",\r\n \"Global_Left_Index_Middle_Position;\",\r\n \"Global_Right_Index_Middle_Position\",\r\n \"Global_Left_Index_Tip_Proximity\",\r\n \"Global_Right_Index_Tip_Proximity\",\r\n ];\r\n const samplers: string[] = [\"_Rim_Texture_\", \"_Iridescence_Texture_\"];\r\n const uniformBuffers: string[] = [];\r\n\r\n PrepareUniformsAndSamplersList(<IEffectCreationOptions>{\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: defines,\r\n maxSimultaneousLights: 4,\r\n });\r\n\r\n subMesh.setEffect(\r\n scene.getEngine().createEffect(\r\n shaderName,\r\n <IEffectCreationOptions>{\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: join,\r\n fallbacks: fallbacks,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n indexParameters: { maxSimultaneousLights: 4 },\r\n },\r\n engine\r\n ),\r\n defines,\r\n this._materialContext\r\n );\r\n }\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n\r\n return true;\r\n }\r\n\r\n public override bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const defines = <MRDLSliderBarMaterialDefines>subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n\r\n this._activeEffect = effect;\r\n\r\n // Matrices\r\n this.bindOnlyWorldMatrix(world);\r\n this._activeEffect.setMatrix(\"viewProjection\", this.getScene().getTransformMatrix());\r\n this._activeEffect.setVector3(\"cameraPosition\", this.getScene().activeCamera!.position);\r\n\r\n // \"Round Rect\"\r\n this._activeEffect.setFloat(\"_Radius_\", this.radius);\r\n this._activeEffect.setFloat(\"_Bevel_Front_\", this.bevelFront);\r\n this._activeEffect.setFloat(\"_Bevel_Front_Stretch_\", this.bevelFrontStretch);\r\n this._activeEffect.setFloat(\"_Bevel_Back_\", this.bevelBack);\r\n this._activeEffect.setFloat(\"_Bevel_Back_Stretch_\", this.bevelBackStretch);\r\n\r\n // \"Radii Multipliers\"\r\n this._activeEffect.setFloat(\"_Radius_Top_Left_\", this.radiusTopLeft);\r\n this._activeEffect.setFloat(\"_Radius_Top_Right_\", this.radiusTopRight);\r\n this._activeEffect.setFloat(\"_Radius_Bottom_Left_\", this.radiusBottomLeft);\r\n this._activeEffect.setFloat(\"_Radius_Bottom_Right_\", this.radiusBottomRight);\r\n\r\n // \"Bulge\"\r\n this._activeEffect.setFloat(\"_Bulge_Enabled_\", this.bulgeEnabled ? 1.0 : 0.0);\r\n this._activeEffect.setFloat(\"_Bulge_Height_\", this.bulgeHeight);\r\n this._activeEffect.setFloat(\"_Bulge_Radius_\", this.bulgeRadius);\r\n\r\n // \"Sun\"\r\n this._activeEffect.setFloat(\"_Sun_Intensity_\", this.sunIntensity);\r\n this._activeEffect.setFloat(\"_Sun_Theta_\", this.sunTheta);\r\n this._activeEffect.setFloat(\"_Sun_Phi_\", this.sunPhi);\r\n this._activeEffect.setFloat(\"_Indirect_Diffuse_\", this.indirectDiffuse);\r\n\r\n // \"Diffuse And Specular\"\r\n this._activeEffect.setDirectColor4(\"_Albedo_\", this.albedo);\r\n this._activeEffect.setFloat(\"_Specular_\", this.specular);\r\n this._activeEffect.setFloat(\"_Shininess_\", this.shininess);\r\n this._activeEffect.setFloat(\"_Sharpness_\", this.sharpness);\r\n this._activeEffect.setFloat(\"_Subsurface_\", this.subsurface);\r\n\r\n // \"Gradient\"\r\n this._activeEffect.setDirectColor4(\"_Left_Color_\", this.leftGradientColor);\r\n this._activeEffect.setDirectColor4(\"_Right_Color_\", this.rightGradientColor);\r\n\r\n // \"Reflection\"\r\n this._activeEffect.setFloat(\"_Reflection_\", this.reflection);\r\n this._activeEffect.setFloat(\"_Front_Reflect_\", this.frontReflect);\r\n this._activeEffect.setFloat(\"_Edge_Reflect_\", this.edgeReflect);\r\n this._activeEffect.setFloat(\"_Power_\", this.power);\r\n\r\n // \"Sky Environment\"\r\n //define SKY_ENABLED true;\r\n this._activeEffect.setDirectColor4(\"_Sky_Color_\", this.skyColor);\r\n this._activeEffect.setDirectColor4(\"_Horizon_Color_\", this.horizonColor);\r\n this._activeEffect.setDirectColor4(\"_Ground_Color_\", this.groundColor);\r\n this._activeEffect.setFloat(\"_Horizon_Power_\", this.horizonPower);\r\n\r\n // \"Mapped Environment\"\r\n //define ENV_ENABLE false;\r\n this._activeEffect.setTexture(\"_Reflection_Map_\", this._reflectionMapTexture);\r\n this._activeEffect.setTexture(\"_Indirect_Environment_\", this._indirectEnvTexture);\r\n\r\n // \"FingerOcclusion\"\r\n //define OCCLUSION_ENABLED false;\r\n this._activeEffect.setFloat(\"_Width_\", this.width);\r\n this._activeEffect.setFloat(\"_Fuzz_\", this.fuzz);\r\n this._activeEffect.setFloat(\"_Min_Fuzz_\", this.minFuzz);\r\n this._activeEffect.setFloat(\"_Clip_Fade_\", this.clipFade);\r\n\r\n // \"View Based Color Shift\"\r\n this._activeEffect.setFloat(\"_Hue_Shift_\", this.hueShift);\r\n this._activeEffect.setFloat(\"_Saturation_Shift_\", this.saturationShift);\r\n this._activeEffect.setFloat(\"_Value_Shift_\", this.valueShift);\r\n\r\n // \"Blob\"\r\n //define BLOB_ENABLE false;\r\n this._activeEffect.setVector3(\"_Blob_Position_\", this.blobPosition);\r\n this._activeEffect.setFloat(\"_Blob_Intensity_\", this.blobIntensity);\r\n this._activeEffect.setFloat(\"_Blob_Near_Size_\", this.blobNearSize);\r\n this._activeEffect.setFloat(\"_Blob_Far_Size_\", this.blobFarSize);\r\n this._activeEffect.setFloat(\"_Blob_Near_Distance_\", this.blobNearDistance);\r\n this._activeEffect.setFloat(\"_Blob_Far_Distance_\", this.blobFarDistance);\r\n this._activeEffect.setFloat(\"_Blob_Fade_Length_\", this.blobFadeLength);\r\n this._activeEffect.setFloat(\"_Blob_Pulse_\", this.blobPulse);\r\n this._activeEffect.setFloat(\"_Blob_Fade_\", this.blobFade);\r\n\r\n // \"Blob Texture\"\r\n this._activeEffect.setTexture(\"_Blob_Texture_\", this.blobTexture);\r\n\r\n // \"Blob 2\"\r\n //define BLOB_ENABLE_2 true;\r\n this._activeEffect.setVector3(\"_Blob_Position_2_\", this.blobPosition2);\r\n this._activeEffect.setFloat(\"_Blob_Near_Size_2_\", this.blobNearSize2);\r\n this._activeEffect.setFloat(\"_Blob_Pulse_2_\", this.blobPulse2);\r\n this._activeEffect.setFloat(\"_Blob_Fade_2_\", this.blobFade2);\r\n\r\n // \"Finger Positions\"\r\n this._activeEffect.setVector3(\"_Left_Index_Pos_\", this.leftIndexPosition);\r\n this._activeEffect.setVector3(\"_Right_Index_Pos_\", this.rightIndexPosition);\r\n this._activeEffect.setVector3(\"_Left_Index_Middle_Pos_\", this.leftIndexMiddlePosition);\r\n this._activeEffect.setVector3(\"_Right_Index_Middle_Pos_\", this.rightIndexMiddlePosition);\r\n\r\n // \"Decal Texture\"\r\n //define DECAL_ENABLE false;\r\n this._activeEffect.setTexture(\"_Decal_\", this._decalTexture);\r\n this._activeEffect.setVector2(\"_Decal_Scale_XY_\", this.decalScaleXY);\r\n this._activeEffect.setFloat(\"_Decal_Front_Only_\", this.decalFrontOnly ? 1.0 : 0.0);\r\n\r\n // \"Rim Light\"\r\n this._activeEffect.setFloat(\"_Rim_Intensity_\", this.rimIntensity);\r\n this._activeEffect.setTexture(\"_Rim_Texture_\", this._blueGradientTexture);\r\n this._activeEffect.setFloat(\"_Rim_Hue_Shift_\", this.rimHueShift);\r\n this._activeEffect.setFloat(\"_Rim_Saturation_Shift_\", this.rimSaturationShift);\r\n this._activeEffect.setFloat(\"_Rim_Value_Shift_\", this.rimValueShift);\r\n\r\n // \"Iridescence\"\r\n //define IRIDESCENCE_ENABLED true;\r\n this._activeEffect.setFloat(\"_Iridescence_Intensity_\", this.iridescenceIntensity);\r\n this._activeEffect.setTexture(\"_Iridescence_Texture_\", this._blueGradientTexture);\r\n\r\n // Global inputs\r\n this._activeEffect.setFloat(\"Use_Global_Left_Index\", this.useGlobalLeftIndex);\r\n this._activeEffect.setFloat(\"Use_Global_Right_Index\", this.useGlobalRightIndex);\r\n\r\n this._activeEffect.setVector4(\"Global_Left_Index_Tip_Position\", this.globalLeftIndexTipPosition);\r\n this._activeEffect.setVector4(\"Global_Right_Index_Tip_Position\", this.globaRightIndexTipPosition);\r\n\r\n this._activeEffect.setVector4(\"Global_Left_Thumb_Tip_Position\", this.globalLeftThumbTipPosition);\r\n this._activeEffect.setVector4(\"Global_Right_Thumb_Tip_Position\", this.globalRightThumbTipPosition);\r\n\r\n this._activeEffect.setVector4(\"Global_Left_Index_Middle_Position\", this.globalLeftIndexMiddlePosition);\r\n this._activeEffect.setVector4(\"Global_Right_Index_Middle_Position\", this.globalRightIndexMiddlePosition);\r\n\r\n this._activeEffect.setFloat(\"Global_Left_Index_Tip_Proximity\", this.globalLeftIndexTipProximity);\r\n this._activeEffect.setFloat(\"Global_Right_Index_Tip_Proximity\", this.globalRightIndexTipProximity);\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n /**\r\n * Get the list of animatables in the material.\r\n * @returns the list of animatables object used in the material\r\n */\r\n public override getAnimatables(): IAnimatable[] {\r\n return [];\r\n }\r\n\r\n public override dispose(forceDisposeEffect?: boolean): void {\r\n super.dispose(forceDisposeEffect);\r\n this._reflectionMapTexture.dispose();\r\n this._indirectEnvTexture.dispose();\r\n this._blueGradientTexture.dispose();\r\n this._decalTexture.dispose();\r\n }\r\n\r\n public override clone(name: string): MRDLSliderBarMaterial {\r\n return SerializationHelper.Clone(() => new MRDLSliderBarMaterial(name, this.getScene()), this);\r\n }\r\n\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.customType = \"BABYLON.MRDLSliderBarMaterial\";\r\n return serializationObject;\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"MRDLSliderBarMaterial\";\r\n }\r\n\r\n // Statics\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): MRDLSliderBarMaterial {\r\n return SerializationHelper.Parse(() => new MRDLSliderBarMaterial(source.name, scene), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GUI.MRDLSliderBarMaterial\", MRDLSliderBarMaterial);\r\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"mrdlSliderThumbPixelShader\";\nconst shader = `uniform vec3 cameraPosition;varying vec3 vPosition;varying vec3 vNormal;varying vec2 vUV;varying vec3 vTangent;varying vec3 vBinormal;varying vec4 vColor;varying vec4 vExtra1;varying vec4 vExtra2;varying vec4 vExtra3;uniform float _Radius_;uniform float _Bevel_Front_;uniform float _Bevel_Front_Stretch_;uniform float _Bevel_Back_;uniform float _Bevel_Back_Stretch_;uniform float _Radius_Top_Left_;uniform float _Radius_Top_Right_;uniform float _Radius_Bottom_Left_;uniform float _Radius_Bottom_Right_;uniform bool _Bulge_Enabled_;uniform float _Bulge_Height_;uniform float _Bulge_Radius_;uniform float _Sun_Intensity_;uniform float _Sun_Theta_;uniform float _Sun_Phi_;uniform float _Indirect_Diffuse_;uniform vec4 _Albedo_;uniform float _Specular_;uniform float _Shininess_;uniform float _Sharpness_;uniform float _Subsurface_;uniform vec4 _Left_Color_;uniform vec4 _Right_Color_;uniform float _Reflection_;uniform float _Front_Reflect_;uniform float _Edge_Reflect_;uniform float _Power_;uniform vec4 _Sky_Color_;uniform vec4 _Horizon_Color_;uniform vec4 _Ground_Color_;uniform float _Horizon_Power_;uniform sampler2D _Reflection_Map_;uniform sampler2D _Indirect_Environment_;uniform float _Width_;uniform float _Fuzz_;uniform float _Min_Fuzz_;uniform float _Clip_Fade_;uniform float _Hue_Shift_;uniform float _Saturation_Shift_;uniform float _Value_Shift_;uniform vec3 _Blob_Position_;uniform float _Blob_Intensity_;uniform float _Blob_Near_Size_;uniform float _Blob_Far_Size_;uniform float _Blob_Near_Distance_;uniform float _Blob_Far_Distance_;uniform float _Blob_Fade_Length_;uniform float _Blob_Pulse_;uniform float _Blob_Fade_;uniform sampler2D _Blob_Texture_;uniform vec3 _Blob_Position_2_;uniform float _Blob_Near_Size_2_;uniform float _Blob_Pulse_2_;uniform float _Blob_Fade_2_;uniform vec3 _Left_Index_Pos_;uniform vec3 _Right_Index_Pos_;uniform vec3 _Left_Index_Middle_Pos_;uniform vec3 _Right_Index_Middle_Pos_;uniform sampler2D _Decal_;uniform vec2 _Decal_Scale_XY_;uniform bool _Decal_Front_Only_;uniform float _Rim_Intensity_;uniform sampler2D _Rim_Texture_;uniform float _Rim_Hue_Shift_;uniform float _Rim_Saturation_Shift_;uniform float _Rim_Value_Shift_;uniform float _Iridescence_Intensity_;uniform sampler2D _Iridescence_Texture_;uniform bool Use_Global_Left_Index;uniform bool Use_Global_Right_Index;uniform vec4 Global_Left_Index_Tip_Position;uniform vec4 Global_Right_Index_Tip_Position;uniform vec4 Global_Left_Thumb_Tip_Position;uniform vec4 Global_Right_Thumb_Tip_Position;uniform vec4 Global_Left_Index_Middle_Position;uniform vec4 Global_Right_Index_Middle_Position;uniform float Global_Left_Index_Tip_Proximity;uniform float Global_Right_Index_Tip_Proximity;void Blob_Fragment_B180(\nsampler2D Blob_Texture,\nvec4 Blob_Info1,\nvec4 Blob_Info2,\nout vec4 Blob_Color)\n{float k1=dot(Blob_Info1.xy,Blob_Info1.xy);float k2=dot(Blob_Info2.xy,Blob_Info2.xy);vec3 closer=k1<k2 ? vec3(k1,Blob_Info1.z,Blob_Info1.w) : vec3(k2,Blob_Info2.z,Blob_Info2.w);Blob_Color=closer.z*texture(Blob_Texture,vec2(vec2(sqrt(closer.x),closer.y).x,1.0-vec2(sqrt(closer.x),closer.y).y))*clamp(1.0-closer.x,0.0,1.0);}\nvoid FastLinearTosRGB_B192(\nvec4 Linear,\nout vec4 sRGB)\n{sRGB.rgb=sqrt(clamp(Linear.rgb,0.0,1.0));sRGB.a=Linear.a;}\nvoid Scale_RGB_B209(\nvec4 Color,\nfloat Scalar,\nout vec4 Result)\n{Result=vec4(Scalar,Scalar,Scalar,1)*Color;}\nvoid Fragment_Main_B271(\nfloat Sun_Intensity,\nfloat Sun_Theta,\nfloat Sun_Phi,\nvec3 Normal,\nvec4 Albedo,\nfloat Fresnel_Reflect,\nfloat Shininess,\nvec3 Incident,\nvec4 Horizon_Color,\nvec4 Sky_Color,\nvec4 Ground_Color,\nfloat Indirect_Diffuse,\nfloat Specular,\nfloat Horizon_Power,\nfloat Reflection,\nvec4 Reflection_Sample,\nvec4 Indirect_Sample,\nfloat Sharpness,\nfloat SSS,\nfloat Subsurface,\nvec4 Translucence,\nvec4 Rim_Light,\nvec4 Iridescence,\nout vec4 Result)\n{float theta=Sun_Theta*2.0*3.14159;float phi=Sun_Phi*3.14159;vec3 lightDir= vec3(cos(phi)*cos(theta),sin(phi),cos(phi)*sin(theta));float NdotL=max(dot(lightDir,Normal),0.0);vec3 R=reflect(Incident,Normal);float RdotL=max(0.0,dot(R,lightDir));float specular=pow(RdotL,Shininess);specular=mix(specular,smoothstep(0.495*Sharpness,1.0-0.495*Sharpness,specular),Sharpness);vec4 gi=mix(Ground_Color,Sky_Color,Normal.y*0.5+0.5);Result=((Sun_Intensity*NdotL+Indirect_Sample*Indirect_Diffuse+Translucence)*(1.0+SSS*Subsurface))*Albedo*(1.0-Fresnel_Reflect)+(Sun_Intensity*specular*Specular+Fresnel_Reflect*Reflection*Reflection_Sample)+Fresnel_Reflect*Rim_Light+Iridescence;}\nvoid Bulge_B229(\nbool Enabled,\nvec3 Normal,\nvec3 Tangent,\nfloat Bulge_Height,\nvec4 UV,\nfloat Bulge_Radius,\nvec3 ButtonN,\nout vec3 New_Normal)\n{vec2 xy=clamp(UV.xy*2.0,vec2(-1,-1),vec2(1,1));vec3 B=(cross(Normal,Tangent));float k=-clamp(1.0-length(xy)/Bulge_Radius,0.0,1.0)*Bulge_Height;k=sin(k*3.14159*0.5);k*=smoothstep(0.9998,0.9999,abs(dot(ButtonN,Normal)));New_Normal=Normal*sqrt(1.0-k*k)+(xy.x*Tangent+xy.y*B)*k;New_Normal=Enabled ? New_Normal : Normal;}\nvoid SSS_B227(\nvec3 ButtonN,\nvec3 Normal,\nvec3 Incident,\nout float Result)\n{float NdotI=abs(dot(Normal,Incident));float BdotI=abs(dot(ButtonN,Incident));Result=(abs(NdotI-BdotI)); }\nvoid FingerOcclusion_B217(\nfloat Width,\nfloat DistToCenter,\nfloat Fuzz,\nfloat Min_Fuzz,\nvec3 Position,\nvec3 Forward,\nvec3 Nearest,\nfloat Fade_Out,\nout float NotInShadow)\n{float d=dot((Nearest-Position),Forward);float sh=smoothstep(Width*0.5,Width*0.5+Fuzz*max(d,0.0)+Min_Fuzz,DistToCenter);NotInShadow=1.0-(1.0-sh)*smoothstep(-Fade_Out,0.0,d);}\nvoid FingerOcclusion_B218(\nfloat Width,\nfloat DistToCenter,\nfloat Fuzz,\nfloat Min_Fuzz,\nvec3 Position,\nvec3 Forward,\nvec3 Nearest,\nfloat Fade_Out,\nout float NotInShadow)\n{float d=dot((Nearest-Position),Forward);float sh=smoothstep(Width*0.5,Width*0.5+Fuzz*max(d,0.0)+Min_Fuzz,DistToCenter);NotInShadow=1.0-(1.0-sh)*smoothstep(-Fade_Out,0.0,d);}\nvoid Scale_Color_B241(\nvec4 Color,\nfloat Scalar,\nout vec4 Result)\n{Result=Scalar*Color;}\nvoid From_HSV_B223(\nfloat Hue,\nfloat Saturation,\nfloat Value,\nfloat Alpha,\nout vec4 Color)\n{vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(vec3(Hue,Hue,Hue)+K.xyz)*6.0-K.www);Color.rgb=Value*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),Saturation);Color.a=Alpha;}\nvoid Fast_Fresnel_B272(\nfloat Front_Reflect,\nfloat Edge_Reflect,\nfloat Power,\nvec3 Normal,\nvec3 Incident,\nout float Transmit,\nout float Reflect)\n{float d=max(-dot(Incident,Normal),0.0);Reflect=Front_Reflect+(Edge_Reflect-Front_Reflect)*pow(1.0-d,Power);Transmit=1.0-Reflect;}\nvoid Mapped_Environment_B201(\nsampler2D Reflected_Environment,\nsampler2D Indirect_Environment,\nvec3 Dir,\nout vec4 Reflected_Color,\nout vec4 Indirect_Diffuse)\n{Reflected_Color=texture(Reflected_Environment,vec2(atan(Dir.z,Dir.x)/3.14159*0.5,asin(Dir.y)/3.14159+0.5));Indirect_Diffuse=texture(Indirect_Environment,vec2(atan(Dir.z,Dir.x)/3.14159*0.5,asin(Dir.y)/3.14159+0.5));}\nvec4 SampleEnv_Bid200(vec3 D,vec4 S,vec4 H,vec4 G,float exponent)\n{float k=pow(abs(D.y),exponent);vec4 C;if (D.y>0.0) {C=mix(H,S,k);} else {C=mix(H,G,k); }\nreturn C;}\nvoid Sky_Environment_B200(\nvec3 Normal,\nvec3 Reflected,\nvec4 Sky_Color,\nvec4 Horizon_Color,\nvec4 Ground_Color,\nfloat Horizon_Power,\nout vec4 Reflected_Color,\nout vec4 Indirect_Color)\n{Reflected_Color=SampleEnv_Bid200(Reflected,Sky_Color,Horizon_Color,Ground_Color,Horizon_Power);Indirect_Color=mix(Ground_Color,Sky_Color,Normal.y*0.5+0.5);}\nvoid Min_Segment_Distance_B215(\nvec3 P0,\nvec3 P1,\nvec3 Q0,\nvec3 Q1,\nout vec3 NearP,\nout vec3 NearQ,\nout float Distance)\n{vec3 u=P1-P0;vec3 v=Q1-Q0;vec3 w=P0-Q0;float a=dot(u,u);float b=dot(u,v);float c=dot(v,v);float d=dot(u,w);float e=dot(v,w);float D=a*c-b*b;float sD=D;float tD=D;float sc,sN,tc,tN;if (D<0.00001) {sN=0.0;sD=1.0;tN=e;tD=c;} else {sN=(b*e-c*d);tN=(a*e-b*d);if (sN<0.0) {sN=0.0;tN=e;tD=c;} else if (sN>sD) {sN=sD;tN=e+b;tD=c;}}\nif (tN<0.0) {tN=0.0;if (-d<0.0) {sN=0.0;} else if (-d>a) {sN=sD;} else {sN=-d;sD=a;}} else if (tN>tD) {tN=tD;if ((-d+b)<0.0) {sN=0.0;} else if ((-d+b)>a) {sN=sD;} else {sN=(-d+b);sD=a;}}\nsc=abs(sN)<0.000001 ? 0.0 : sN/sD;tc=abs(tN)<0.000001 ? 0.0 : tN/tD;NearP=P0+sc*u;NearQ=Q0+tc*v;Distance=distance(NearP,NearQ);}\nvoid To_XYZ_B224(\nvec3 Vec3,\nout float X,\nout float Y,\nout float Z)\n{X=Vec3.x;Y=Vec3.y;Z=Vec3.z;}\nvoid Finger_Positions_B214(\nvec3 Left_Index_Pos,\nvec3 Right_Index_Pos,\nvec3 Left_Index_Middle_Pos,\nvec3 Right_Index_Middle_Pos,\nout vec3 Left_Index,\nout vec3 Right_Index,\nout vec3 Left_Index_Middle,\nout vec3 Right_Index_Middle)\n{Left_Index= (Use_Global_Left_Index ? Global_Left_Index_Tip_Position.xyz : Left_Index_Pos);Right_Index= (Use_Global_Right_Index ? Global_Right_Index_Tip_Position.xyz : Right_Index_Pos);Left_Index_Middle= (Use_Global_Left_Index ? Global_Left_Index_Middle_Position.xyz : Left_Index_Middle_Pos);Right_Index_Middle= (Use_Global_Right_Index ? Global_Right_Index_Middle_Position.xyz : Right_Index_Middle_Pos);}\nvoid VaryHSV_B258(\nvec3 HSV_In,\nfloat Hue_Shift,\nfloat Saturation_Shift,\nfloat Value_Shift,\nout vec3 HSV_Out)\n{HSV_Out=vec3(fract(HSV_In.x+Hue_Shift),clamp(HSV_In.y+Saturation_Shift,0.0,1.0),clamp(HSV_In.z+Value_Shift,0.0,1.0));}\nvoid Remap_Range_B264(\nfloat In_Min,\nfloat In_Max,\nfloat Out_Min,\nfloat Out_Max,\nfloat In,\nout float Out)\n{Out=mix(Out_Min,Out_Max,clamp((In-In_Min)/(In_Max-In_Min),0.0,1.0));}\nvoid To_HSV_B225(\nvec4 Color,\nout float Hue,\nout float Saturation,\nout float Value,\nout float Alpha,\nout vec3 HSV)\n{vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=Color.g<Color.b ? vec4(Color.bg,K.wz) : vec4(Color.gb,K.xy);vec4 q=Color.r<p.x ? vec4(p.xyw,Color.r) : vec4(Color.r,p.yzx);float d=q.x-min(q.w,q.y);float e=1.0e-10;Hue=abs(q.z+(q.w-q.y)/(6.0*d+e));Saturation=d/(q.x+e);Value=q.x;Alpha=Color.a;HSV=vec3(Hue,Saturation,Value);}\nvoid Code_B260(\nfloat X,\nout float Result)\n{Result=(acos(X)/3.14159-0.5)*2.0;}\nvoid Rim_Light_B282(\nvec3 Front,\nvec3 Normal,\nvec3 Incident,\nfloat Rim_Intensity,\nsampler2D Texture,\nout vec4 Result)\n{vec3 R=reflect(Incident,Normal);float RdotF=dot(R,Front);float RdotL=sqrt(1.0-RdotF*RdotF);vec2 UV=vec2(R.y*0.5+0.5,0.5);vec4 Color=texture(Texture,UV);Result=Color;}\nvoid main()\n{vec4 Blob_Color_Q180;\n#if BLOB_ENABLE\nBlob_Fragment_B180(_Blob_Texture_,vExtra2,vExtra3,Blob_Color_Q180);\n#else\nBlob_Color_Q180=vec4(0,0,0,0);\n#endif\nvec3 Incident_Q189=normalize(vPosition-cameraPosition);vec3 Normalized_Q188=normalize(vNormal);vec3 Normalized_Q221=normalize(vTangent);vec4 Color_Q233;\n#if DECAL_ENABLE\nColor_Q233=texture(_Decal_,vUV);\n#else\nColor_Q233=vec4(0,0,0,0);\n#endif\nfloat X_Q240;float Y_Q240;float Z_Q240;float W_Q240;X_Q240=vExtra1.x;Y_Q240=vExtra1.y;Z_Q240=vExtra1.z;W_Q240=vExtra1.w;vec4 Linear_Q193;Linear_Q193.rgb=clamp(_Sky_Color_.rgb*_Sky_Color_.rgb,0.0,1.0);Linear_Q193.a=_Sky_Color_.a;vec4 Linear_Q194;Linear_Q194.rgb=clamp(_Horizon_Color_.rgb*_Horizon_Color_.rgb,0.0,1.0);Linear_Q194.a=_Horizon_Color_.a;vec4 Linear_Q195;Linear_Q195.rgb=clamp(_Ground_Color_.rgb*_Ground_Color_.rgb,0.0,1.0);Linear_Q195.a=_Ground_Color_.a;vec3 Left_Index_Q214;vec3 Right_Index_Q214;vec3 Left_Index_Middle_Q214;vec3 Right_Index_Middle_Q214;Finger_Positions_B214(_Left_Index_Pos_,_Right_Index_Pos_,_Left_Index_Middle_Pos_,_Right_Index_Middle_Pos_,Left_Index_Q214,Right_Index_Q214,Left_Index_Middle_Q214,Right_Index_Middle_Q214);vec4 Linear_Q196;Linear_Q196.rgb=clamp(_Albedo_.rgb*_Albedo_.rgb,0.0,1.0);Linear_Q196.a=_Albedo_.a;vec3 Normalized_Q257=normalize(vBinormal);vec3 Incident_Q220=normalize(vPosition-cameraPosition);vec3 New_Normal_Q229;Bulge_B229(_Bulge_Enabled_,Normalized_Q188,Normalized_Q221,_Bulge_Height_,vColor,_Bulge_Radius_,vBinormal,New_Normal_Q229);float Result_Q227;SSS_B227(vBinormal,New_Normal_Q229,Incident_Q189,Result_Q227);vec4 Result_Q241;Scale_Color_B241(Color_Q233,X_Q240,Result_Q241);float Transmit_Q272;float Reflect_Q272;Fast_Fresnel_B272(_Front_Reflect_,_Edge_Reflect_,_Power_,New_Normal_Q229,Incident_Q189,Transmit_Q272,Reflect_Q272);float Product_Q275=Y_Q240*Y_Q240;vec3 NearP_Q215;vec3 NearQ_Q215;float Distance_Q215;Min_Segment_Distance_B215(Left_Index_Q214,Left_Index_Middle_Q214,vPosition,cameraPosition,NearP_Q215,NearQ_Q215,Distance_Q215);vec3 NearP_Q213;vec3 NearQ_Q213;float Distance_Q213;Min_Segment_Distance_B215(Right_Index_Q214,Right_Index_Middle_Q214,vPosition,cameraPosition,NearP_Q213,NearQ_Q213,Distance_Q213);vec3 Reflected_Q197=reflect(Incident_Q189,New_Normal_Q229);vec4 Product_Q253=Linear_Q196*vec4(1,1,1,1);vec4 Result_Q282;Rim_Light_B282(Normalized_Q257,Normalized_Q188,Incident_Q220,_Rim_Intensity_,_Rim_Texture_,Result_Q282);float Dot_Q222=dot(Incident_Q220, Normalized_Q221);float MaxAB_Q273=max(Reflect_Q272,Product_Q275);float NotInShadow_Q217;\n#if OCCLUSION_ENABLED\nFingerOcclusion_B217(_Width_,Distance_Q215,_Fuzz_,_Min_Fuzz_,vPosition,vBinormal,NearP_Q215,_Clip_Fade_,NotInShadow_Q217);\n#else\nNotInShadow_Q217=1.0;\n#endif\nfloat NotInShadow_Q218;\n#if OCCLUSION_ENABLED\nFingerOcclusion_B218(_Width_,Distance_Q213,_Fuzz_,_Min_Fuzz_,vPosition,vBinormal,NearP_Q213,_Clip_Fade_,NotInShadow_Q218);\n#else\nNotInShadow_Q218=1.0;\n#endif\nvec4 Reflected_Color_Q201;vec4 Indirect_Diffuse_Q201;\n#if ENV_ENABLE\nMapped_Environment_B201(_Reflection_Map_,_Indirect_Environment_,Reflected_Q197,Reflected_Color_Q201,Indirect_Diffuse_Q201);\n#else\nReflected_Color_Q201=vec4(0,0,0,1);Indirect_Diffuse_Q201=vec4(0,0,0,1);\n#endif\nvec4 Reflected_Color_Q200;vec4 Indirect_Color_Q200;\n#if SKY_ENABLED\nSky_Environment_B200(New_Normal_Q229,Reflected_Q197,Linear_Q193,Linear_Q194,Linear_Q195,_Horizon_Power_,Reflected_Color_Q200,Indirect_Color_Q200);\n#else\nReflected_Color_Q200=vec4(0,0,0,1);Indirect_Color_Q200=vec4(0,0,0,1);\n#endif\nfloat Hue_Q225;float Saturation_Q225;float Value_Q225;float Alpha_Q225;vec3 HSV_Q225;To_HSV_B225(Product_Q253,Hue_Q225,Saturation_Q225,Value_Q225,Alpha_Q225,HSV_Q225);float Hue_Q277;float Saturation_Q277;float Value_Q277;float Alpha_Q277;vec3 HSV_Q277;To_HSV_B225(Result_Q282,Hue_Q277,Saturation_Q277,Value_Q277,Alpha_Q277,HSV_Q277);float Result_Q260;Code_B260(Dot_Q222,Result_Q260);float AbsA_Q226=abs(Result_Q260);float MinAB_Q208=min(NotInShadow_Q217,NotInShadow_Q218);vec4 Sum_Q198=Reflected_Color_Q201+Reflected_Color_Q200;vec4 Sum_Q199=Indirect_Diffuse_Q201+Indirect_Color_Q200;vec3 HSV_Out_Q276;VaryHSV_B258(HSV_Q277,_Rim_Hue_Shift_,_Rim_Saturation_Shift_,_Rim_Value_Shift_,HSV_Out_Q276);float Out_Q264;Remap_Range_B264(-1.0,1.0,0.0,1.0,Result_Q260,Out_Q264);float Product_Q256;Product_Q256=AbsA_Q226*_Hue_Shift_;float X_Q278;float Y_Q278;float Z_Q278;To_XYZ_B224(HSV_Out_Q276,X_Q278,Y_Q278,Z_Q278);vec2 Vec2_Q262=vec2(Out_Q264,0.5);vec3 HSV_Out_Q258;VaryHSV_B258(HSV_Q225,Product_Q256,_Saturation_Shift_,_Value_Shift_,HSV_Out_Q258);vec4 Color_Q279;From_HSV_B223(X_Q278,Y_Q278,Z_Q278,0.0,Color_Q279);vec4 Color_Q261;\n#if IRIDESCENCE_ENABLED\nColor_Q261=texture(_Iridescence_Texture_,Vec2_Q262);\n#else\nColor_Q261=vec4(0,0,0,0);\n#endif\nfloat X_Q224;float Y_Q224;float Z_Q224;To_XYZ_B224(HSV_Out_Q258,X_Q224,Y_Q224,Z_Q224);vec4 Result_Q281=_Rim_Intensity_*Color_Q279;vec4 Result_Q263=_Iridescence_Intensity_*Color_Q261;vec4 Color_Q223;From_HSV_B223(X_Q224,Y_Q224,Z_Q224,0.0,Color_Q223);vec4 Result_Q234=Result_Q241+(1.0-Result_Q241.a)*Color_Q223;vec4 Result_Q271;Fragment_Main_B271(_Sun_Intensity_,_Sun_Theta_,_Sun_Phi_,New_Normal_Q229,Result_Q234,MaxAB_Q273,_Shininess_,Incident_Q189,_Horizon_Color_,_Sky_Color_,_Ground_Color_,_Indirect_Diffuse_,_Specular_,_Horizon_Power_,_Reflection_,Sum_Q198,Sum_Q199,_Sharpness_,Result_Q227,_Subsurface_,vec4(0,0,0,0),Result_Q281,Result_Q263,Result_Q271);vec4 Result_Q209;Scale_RGB_B209(Result_Q271,MinAB_Q208,Result_Q209);vec4 sRGB_Q192;FastLinearTosRGB_B192(Result_Q209,sRGB_Q192);vec4 Result_Q181=Blob_Color_Q180+(1.0-Blob_Color_Q180.a)*sRGB_Q192;vec4 Result_Q190=Result_Q181; Result_Q190.a=1.0;vec4 Out_Color=Result_Q190;float Clip_Threshold=0.001;bool To_sRGB=false;gl_FragColor=Out_Color;}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const mrdlSliderThumbPixelShader = { name, shader };\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"mrdlSliderThumbVertexShader\";\nconst shader = `uniform mat4 world;uniform mat4 viewProjection;uniform vec3 cameraPosition;attribute vec3 position;attribute vec3 normal;attribute vec2 uv;\n#ifdef TANGENT\nattribute vec3 tangent;\n#else\nconst vec3 tangent=vec3(0.);\n#endif\nuniform float _Radius_;uniform float _Bevel_Front_;uniform float _Bevel_Front_Stretch_;uniform float _Bevel_Back_;uniform float _Bevel_Back_Stretch_;uniform float _Radius_Top_Left_;uniform float _Radius_Top_Right_;uniform float _Radius_Bottom_Left_;uniform float _Radius_Bottom_Right_;uniform bool _Bulge_Enabled_;uniform float _Bulge_Height_;uniform float _Bulge_Radius_;uniform float _Sun_Intensity_;uniform float _Sun_Theta_;uniform float _Sun_Phi_;uniform float _Indirect_Diffuse_;uniform vec4 _Albedo_;uniform float _Specular_;uniform float _Shininess_;uniform float _Sharpness_;uniform float _Subsurface_;uniform vec4 _Left_Color_;uniform vec4 _Right_Color_;uniform float _Reflection_;uniform float _Front_Reflect_;uniform float _Edge_Reflect_;uniform float _Power_;uniform vec4 _Sky_Color_;uniform vec4 _Horizon_Color_;uniform vec4 _Ground_Color_;uniform float _Horizon_Power_;uniform sampler2D _Reflection_Map_;uniform sampler2D _Indirect_Environment_;uniform float _Width_;uniform float _Fuzz_;uniform float _Min_Fuzz_;uniform float _Clip_Fade_;uniform float _Hue_Shift_;uniform float _Saturation_Shift_;uniform float _Value_Shift_;uniform vec3 _Blob_Position_;uniform float _Blob_Intensity_;uniform float _Blob_Near_Size_;uniform float _Blob_Far_Size_;uniform float _Blob_Near_Distance_;uniform float _Blob_Far_Distance_;uniform float _Blob_Fade_Length_;uniform float _Blob_Pulse_;uniform float _Blob_Fade_;uniform sampler2D _Blob_Texture_;uniform vec3 _Blob_Position_2_;uniform float _Blob_Near_Size_2_;uniform float _Blob_Pulse_2_;uniform float _Blob_Fade_2_;uniform vec3 _Left_Index_Pos_;uniform vec3 _Right_Index_Pos_;uniform vec3 _Left_Index_Middle_Pos_;uniform vec3 _Right_Index_Middle_Pos_;uniform sampler2D _Decal_;uniform vec2 _Decal_Scale_XY_;uniform bool _Decal_Front_Only_;uniform float _Rim_Intensity_;uniform sampler2D _Rim_Texture_;uniform float _Rim_Hue_Shift_;uniform float _Rim_Saturation_Shift_;uniform float _Rim_Value_Shift_;uniform float _Iridescence_Intensity_;uniform sampler2D _Iridescence_Texture_;uniform bool Use_Global_Left_Index;uniform bool Use_Global_Right_Index;uniform vec4 Global_Left_Index_Tip_Position;uniform vec4 Global_Right_Index_Tip_Position;uniform vec4 Global_Left_Thumb_Tip_Position;uniform vec4 Global_Right_Thumb_Tip_Position;uniform float Global_Left_Index_Tip_Proximity;uniform float Global_Right_Index_Tip_Proximity;varying vec3 vPosition;varying vec3 vNormal;varying vec2 vUV;varying vec3 vTangent;varying vec3 vBinormal;varying vec4 vColor;varying vec4 vExtra1;varying vec4 vExtra2;varying vec4 vExtra3;void Object_To_World_Pos_B162(\nvec3 Pos_Object,\nout vec3 Pos_World)\n{Pos_World=(world*vec4(Pos_Object,1.0)).xyz;}\nvoid Object_To_World_Normal_B182(\nvec3 Nrm_Object,\nout vec3 Nrm_World)\n{Nrm_World=(vec4(Nrm_Object,0.0)).xyz;}\nvoid Blob_Vertex_B173(\nvec3 Position,\nvec3 Normal,\nvec3 Tangent,\nvec3 Bitangent,\nvec3 Blob_Position,\nfloat Intensity,\nfloat Blob_Near_Size,\nfloat Blob_Far_Size,\nfloat Blob_Near_Distance,\nfloat Blob_Far_Distance,\nfloat Blob_Fade_Length,\nfloat Blob_Pulse,\nfloat Blob_Fade,\nout vec4 Blob_Info)\n{vec3 blob= (Use_Global_Left_Index ? Global_Left_Index_Tip_Position.xyz : Blob_Position);vec3 delta=blob-Position;float dist=dot(Normal,delta);float lerpValue=clamp((abs(dist)-Blob_Near_Distance)/(Blob_Far_Distance-Blob_Near_Distance),0.0,1.0);float fadeValue=1.0-clamp((abs(dist)-Blob_Far_Distance)/Blob_Fade_Length,0.0,1.0);float size=Blob_Near_Size+(Blob_Far_Size-Blob_Near_Size)*lerpValue;vec2 blobXY=vec2(dot(delta,Tangent),dot(delta,Bitangent))/(0.0001+size);float Fade=fadeValue*Intensity*Blob_Fade;float Distance=(lerpValue*0.5+0.5)*(1.0-Blob_Pulse);Blob_Info=vec4(blobXY.x,blobXY.y,Distance,Fade);}\nvoid Blob_Vertex_B174(\nvec3 Position,\nvec3 Normal,\nvec3 Tangent,\nvec3 Bitangent,\nvec3 Blob_Position,\nfloat Intensity,\nfloat Blob_Near_Size,\nfloat Blob_Far_Size,\nfloat Blob_Near_Distance,\nfloat Blob_Far_Distance,\nfloat Blob_Fade_Length,\nfloat Blob_Pulse,\nfloat Blob_Fade,\nout vec4 Blob_Info)\n{vec3 blob= (Use_Global_Right_Index ? Global_Right_Index_Tip_Position.xyz : Blob_Position);vec3 delta=blob-Position;float dist=dot(Normal,delta);float lerpValue=clamp((abs(dist)-Blob_Near_Distance)/(Blob_Far_Distance-Blob_Near_Distance),0.0,1.0);float fadeValue=1.0-clamp((abs(dist)-Blob_Far_Distance)/Blob_Fade_Length,0.0,1.0);float size=Blob_Near_Size+(Blob_Far_Size-Blob_Near_Size)*lerpValue;vec2 blobXY=vec2(dot(delta,Tangent),dot(delta,Bitangent))/(0.0001+size);float Fade=fadeValue*Intensity*Blob_Fade;float Distance=(lerpValue*0.5+0.5)*(1.0-Blob_Pulse);Blob_Info=vec4(blobXY.x,blobXY.y,Distance,Fade);}\nvoid Move_Verts_B280(\nfloat Anisotropy,\nvec3 P,\nfloat Radius,\nfloat Bevel,\nvec3 Normal_Object,\nfloat ScaleZ,\nfloat Stretch,\nout vec3 New_P,\nout vec2 New_UV,\nout float Radial_Gradient,\nout vec3 Radial_Dir,\nout vec3 New_Normal)\n{vec2 UV=P.xy*2.0+0.5;vec2 center=clamp(UV,0.0,1.0);vec2 delta=UV-center;float deltad=(length(delta)*2.0);float f=(Bevel+(Radius-Bevel)*Stretch)/Radius;float innerd=clamp(deltad*2.0,0.0,1.0);float outerd=clamp(deltad*2.0-1.0,0.0,1.0);float bevelAngle=outerd*3.14159*0.5;float sinb=sin(bevelAngle);float cosb=cos(bevelAngle);float beveld=(1.0-f)*innerd+f*sinb;float br=outerd;vec2 r2=2.0*vec2(Radius/Anisotropy,Radius);float dir=P.z<0.0001 ? 1.0 : -1.0;New_UV=center+r2*((0.5-center)+normalize(delta+vec2(0.0,0.000001))*beveld*0.5);New_P=vec3(New_UV-0.5,P.z+dir*(1.0-cosb)*Bevel*ScaleZ);Radial_Gradient=clamp((deltad-0.5)*2.0,0.0,1.0);Radial_Dir=vec3(delta*r2,0.0);vec3 beveledNormal=cosb*Normal_Object+sinb*vec3(delta.x,delta.y,0.0);New_Normal=Normal_Object.z==0.0 ? Normal_Object : beveledNormal;}\nvoid Object_To_World_Dir_B210(\nvec3 Dir_Object,\nout vec3 Normal_World,\nout vec3 Normal_World_N,\nout float Normal_Length)\n{Normal_World=(world*vec4(Dir_Object,0.0)).xyz;Normal_Length=length(Normal_World);Normal_World_N=Normal_World/Normal_Length;}\nvoid To_XYZ_B228(\nvec3 Vec3,\nout float X,\nout float Y,\nout float Z)\n{X=Vec3.x;Y=Vec3.y;Z=Vec3.z;}\nvoid Conditional_Float_B243(\nbool Which,\nfloat If_True,\nfloat If_False,\nout float Result)\n{Result=Which ? If_True : If_False;}\nvoid Object_To_World_Dir_B178(\nvec3 Dir_Object,\nout vec3 Binormal_World,\nout vec3 Binormal_World_N,\nout float Binormal_Length)\n{Binormal_World=(world*vec4(Dir_Object,0.0)).xyz;Binormal_Length=length(Binormal_World);Binormal_World_N=Binormal_World/Binormal_Length;}\nvoid Pick_Radius_B219(\nfloat Radius,\nfloat Radius_Top_Left,\nfloat Radius_Top_Right,\nfloat Radius_Bottom_Left,\nfloat Radius_Bottom_Right,\nvec3 Position,\nout float Result)\n{bool whichY=Position.y>0.0;Result=Position.x<0.0 ? (whichY ? Radius_Top_Left : Radius_Bottom_Left) : (whichY ? Radius_Top_Right : Radius_Bottom_Right);Result*=Radius;}\nvoid Conditional_Float_B186(\nbool Which,\nfloat If_True,\nfloat If_False,\nout float Result)\n{Result=Which ? If_True : If_False;}\nvoid Greater_Than_B187(\nfloat Left,\nfloat Right,\nout bool Not_Greater_Than,\nout bool Greater_Than)\n{Greater_Than=Left>Right;Not_Greater_Than=!Greater_Than;}\nvoid Remap_Range_B255(\nfloat In_Min,\nfloat In_Max,\nfloat Out_Min,\nfloat Out_Max,\nfloat In,\nout float Out)\n{Out=mix(Out_Min,Out_Max,clamp((In-In_Min)/(In_Max-In_Min),0.0,1.0));}\nvoid main()\n{vec2 XY_Q235;XY_Q235=(uv-vec2(0.5,0.5))*_Decal_Scale_XY_+vec2(0.5,0.5);vec3 Tangent_World_Q177;vec3 Tangent_World_N_Q177;float Tangent_Length_Q177;Tangent_World_Q177=(world*vec4(vec3(1,0,0),0.0)).xyz;Tangent_Length_Q177=length(Tangent_World_Q177);Tangent_World_N_Q177=Tangent_World_Q177/Tangent_Length_Q177;vec3 Normal_World_Q210;vec3 Normal_World_N_Q210;float Normal_Length_Q210;Object_To_World_Dir_B210(vec3(0,0,1),Normal_World_Q210,Normal_World_N_Q210,Normal_Length_Q210);float X_Q228;float Y_Q228;float Z_Q228;To_XYZ_B228(position,X_Q228,Y_Q228,Z_Q228);vec3 Nrm_World_Q176;Nrm_World_Q176=normalize((world*vec4(normal,0.0)).xyz);vec3 Binormal_World_Q178;vec3 Binormal_World_N_Q178;float Binormal_Length_Q178;Object_To_World_Dir_B178(vec3(0,1,0),Binormal_World_Q178,Binormal_World_N_Q178,Binormal_Length_Q178);float Anisotropy_Q179=Tangent_Length_Q177/Binormal_Length_Q178;float Result_Q219;Pick_Radius_B219(_Radius_,_Radius_Top_Left_,_Radius_Top_Right_,_Radius_Bottom_Left_,_Radius_Bottom_Right_,position,Result_Q219);float Anisotropy_Q203=Binormal_Length_Q178/Normal_Length_Q210;bool Not_Greater_Than_Q187;bool Greater_Than_Q187;Greater_Than_B187(Z_Q228,0.0,Not_Greater_Than_Q187,Greater_Than_Q187);vec4 Linear_Q251;Linear_Q251.rgb=clamp(_Left_Color_.rgb*_Left_Color_.rgb,0.0,1.0);Linear_Q251.a=_Left_Color_.a;vec4 Linear_Q252;Linear_Q252.rgb=clamp(_Right_Color_.rgb*_Right_Color_.rgb,0.0,1.0);Linear_Q252.a=_Right_Color_.a;vec3 Difference_Q211=vec3(0,0,0)-Normal_World_N_Q210;vec4 Out_Color_Q184=vec4(X_Q228,Y_Q228,Z_Q228,1);float Result_Q186;Conditional_Float_B186(Greater_Than_Q187,_Bevel_Back_,_Bevel_Front_,Result_Q186);float Result_Q244;Conditional_Float_B186(Greater_Than_Q187,_Bevel_Back_Stretch_,_Bevel_Front_Stretch_,Result_Q244);vec3 New_P_Q280;vec2 New_UV_Q280;float Radial_Gradient_Q280;vec3 Radial_Dir_Q280;vec3 New_Normal_Q280;Move_Verts_B280(Anisotropy_Q179,position,Result_Q219,Result_Q186,normal,Anisotropy_Q203,Result_Q244,New_P_Q280,New_UV_Q280,Radial_Gradient_Q280,Radial_Dir_Q280,New_Normal_Q280);float X_Q248;float Y_Q248;X_Q248=New_UV_Q280.x;Y_Q248=New_UV_Q280.y;vec3 Pos_World_Q162;Object_To_World_Pos_B162(New_P_Q280,Pos_World_Q162);vec3 Nrm_World_Q182;Object_To_World_Normal_B182(New_Normal_Q280,Nrm_World_Q182);vec4 Blob_Info_Q173;\n#if BLOB_ENABLE\nBlob_Vertex_B173(Pos_World_Q162,Nrm_World_Q176,Tangent_World_N_Q177,Binormal_World_N_Q178,_Blob_Position_,_Blob_Intensity_,_Blob_Near_Size_,_Blob_Far_Size_,_Blob_Near_Distance_,_Blob_Far_Distance_,_Blob_Fade_Length_,_Blob_Pulse_,_Blob_Fade_,Blob_Info_Q173);\n#else\nBlob_Info_Q173=vec4(0,0,0,0);\n#endif\nvec4 Blob_Info_Q174;\n#if BLOB_ENABLE_2\nBlob_Vertex_B174(Pos_World_Q162,Nrm_World_Q176,Tangent_World_N_Q177,Binormal_World_N_Q178,_Blob_Position_2_,_Blob_Intensity_,_Blob_Near_Size_2_,_Blob_Far_Size_,_Blob_Near_Distance_,_Blob_Far_Distance_,_Blob_Fade_Length_,_Blob_Pulse_2_,_Blob_Fade_2_,Blob_Info_Q174);\n#else\nBlob_Info_Q174=vec4(0,0,0,0);\n#endif\nfloat Out_Q255;Remap_Range_B255(0.0,1.0,0.0,1.0,X_Q248,Out_Q255);float X_Q236;float Y_Q236;float Z_Q236;To_XYZ_B228(Nrm_World_Q182,X_Q236,Y_Q236,Z_Q236);vec4 Color_At_T_Q247=mix(Linear_Q251,Linear_Q252,Out_Q255);float Minus_F_Q237=-Z_Q236;float R_Q249;float G_Q249;float B_Q249;float A_Q249;R_Q249=Color_At_T_Q247.r; G_Q249=Color_At_T_Q247.g; B_Q249=Color_At_T_Q247.b; A_Q249=Color_At_T_Q247.a;float ClampF_Q238=clamp(0.0,Minus_F_Q237,1.0);float Result_Q243;Conditional_Float_B243(_Decal_Front_Only_,ClampF_Q238,1.0,Result_Q243);vec4 Vec4_Q239=vec4(Result_Q243,Radial_Gradient_Q280,G_Q249,B_Q249);vec3 Position=Pos_World_Q162;vec3 Normal=Nrm_World_Q182;vec2 UV=XY_Q235;vec3 Tangent=Tangent_World_N_Q177;vec3 Binormal=Difference_Q211;vec4 Color=Out_Color_Q184;vec4 Extra1=Vec4_Q239;vec4 Extra2=Blob_Info_Q173;vec4 Extra3=Blob_Info_Q174;gl_Position=viewProjection*vec4(Position,1);vPosition=Position;vNormal=Normal;vUV=UV;vTangent=Tangent;vBinormal=Binormal;vColor=Color;vExtra1=Extra1;vExtra2=Extra2;vExtra3=Extra3;}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const mrdlSliderThumbVertexShader = { name, shader };\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type Nullable } from \"core/types\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { SerializationHelper } from \"core/Misc/decorators.serialization\";\r\nimport { type Matrix, Vector2, Vector3, Vector4 } from \"core/Maths/math.vector\";\r\nimport { type IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { type IEffectCreationOptions } from \"core/Materials/effect\";\r\nimport { PushMaterial } from \"core/Materials/pushMaterial\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { type SubMesh } from \"core/Meshes/subMesh\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { Color4 } from \"core/Maths/math.color\";\r\nimport { EffectFallbacks } from \"core/Materials/effectFallbacks\";\r\nimport { Constants } from \"core/Engines/constants\";\r\n\r\nimport \"./shaders/mrdlSliderThumb.fragment\";\r\nimport \"./shaders/mrdlSliderThumb.vertex\";\r\nimport { HandleFallbacksForShadows, PrepareAttributesForInstances, PrepareDefinesForAttributes, PrepareUniformsAndSamplersList } from \"core/Materials/materialHelper.functions\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\n/** @internal */\r\nclass MRDLSliderThumbMaterialDefines extends MaterialDefines {\r\n /*\r\n \"SKY_ENABLED\", \"BLOB_ENABLE_2\", \"IRIDESCENCE_ENABLED\"\r\n */\r\n public SKY_ENABLED = true;\r\n public BLOB_ENABLE_2 = true;\r\n public IRIDESCENCE_ENABLED = true;\r\n\r\n constructor() {\r\n super();\r\n this._needNormals = true;\r\n this._needUVs = true;\r\n this.rebuild();\r\n }\r\n}\r\n\r\n/**\r\n * Class used to render Slider Thumb material with MRDL\r\n */\r\nexport class MRDLSliderThumbMaterial extends PushMaterial {\r\n /**\r\n * URL pointing to the texture used to define the coloring for the Iridescent Map effect.\r\n */\r\n public static BLUE_GRADIENT_TEXTURE_URL = \"https://assets.babylonjs.com/core/MRTK/MRDL/mrtk-mrdl-blue-gradient.png\";\r\n private _blueGradientTexture: Texture;\r\n private _decalTexture: Texture;\r\n private _reflectionMapTexture: Texture;\r\n private _indirectEnvTexture: Texture;\r\n\r\n /**\r\n * Gets or sets the corner Radius on the slider thumb.\r\n */\r\n @serialize()\r\n public radius = 0.157;\r\n\r\n /**\r\n * Gets or sets the Bevel Front on the slider thumb.\r\n */\r\n @serialize()\r\n public bevelFront = 0.065;\r\n\r\n /**\r\n * Gets or sets the Bevel Front Stretch on the slider thumb.\r\n */\r\n @serialize()\r\n public bevelFrontStretch = 0.077;\r\n\r\n /**\r\n * Gets or sets the Bevel Back on the slider thumb.\r\n */\r\n @serialize()\r\n public bevelBack = 0.031;\r\n\r\n /**\r\n * Gets or sets the Bevel Back Stretch on the slider thumb.\r\n */\r\n @serialize()\r\n public bevelBackStretch = 0;\r\n\r\n /**\r\n * Gets or sets the top left Radii Multiplier.\r\n */\r\n @serialize()\r\n public radiusTopLeft = 1.0;\r\n\r\n /**\r\n * Gets or sets the top left Radii Multiplier.\r\n */\r\n @serialize()\r\n public radiusTopRight = 1.0;\r\n\r\n /**\r\n * Gets or sets the top left Radii Multiplier.\r\n */\r\n @serialize()\r\n public radiusBottomLeft = 1.0;\r\n\r\n /**\r\n * Gets or sets the top left Radii Multiplier.\r\n */\r\n @serialize()\r\n public radiusBottomRight = 1.0;\r\n\r\n /**\r\n * Gets or sets whether Bulge is enabled.\r\n * Default is false.\r\n */\r\n @serialize()\r\n public bulgeEnabled = false;\r\n\r\n /**\r\n * Gets or sets the Bulge Height.\r\n */\r\n @serialize()\r\n public bulgeHeight = -0.323;\r\n\r\n /**\r\n * Gets or sets the Bulge Radius.\r\n */\r\n @serialize()\r\n public bulgeRadius = 0.73;\r\n\r\n /**\r\n * Gets or sets the Sun Intensity.\r\n */\r\n @serialize()\r\n public sunIntensity = 2;\r\n\r\n /**\r\n * Gets or sets the Sun Theta.\r\n */\r\n @serialize()\r\n public sunTheta = 0.937;\r\n\r\n /**\r\n * Gets or sets the Sun Phi.\r\n */\r\n @serialize()\r\n public sunPhi = 0.555;\r\n\r\n /**\r\n * Gets or sets the Indirect Diffuse.\r\n */\r\n @serialize()\r\n public indirectDiffuse = 1;\r\n\r\n /**\r\n * Gets or sets the base albedo.\r\n */\r\n @serialize()\r\n public albedo = new Color4(0.0117647, 0.505882, 0.996078, 1);\r\n\r\n /**\r\n * Gets or sets the Specular value.\r\n */\r\n @serialize()\r\n public specular = 0;\r\n\r\n /**\r\n * Gets or sets the Shininess value.\r\n */\r\n @serialize()\r\n public shininess = 10;\r\n\r\n /**\r\n * Gets or sets the Sharpness value.\r\n */\r\n @serialize()\r\n public sharpness = 0;\r\n\r\n /**\r\n * Gets or sets the Subsurface value.\r\n */\r\n @serialize()\r\n public subsurface = 0.31;\r\n\r\n /**\r\n * Gets or sets the left gradient color.\r\n */\r\n @serialize()\r\n public leftGradientColor = new Color4(0.0117647, 0.505882, 0.996078, 1);\r\n\r\n /**\r\n * Gets or sets the right gradient color.\r\n */\r\n @serialize()\r\n public rightGradientColor = new Color4(0.0117647, 0.505882, 0.996078, 1);\r\n\r\n /**\r\n * Gets or sets the reflection value.\r\n */\r\n @serialize()\r\n public reflection = 0.749;\r\n\r\n /**\r\n * Gets or sets the front reflect value.\r\n */\r\n @serialize()\r\n public frontReflect = 0;\r\n\r\n /**\r\n * Gets or sets the edge reflect value.\r\n */\r\n @serialize()\r\n public edgeReflect = 0.09;\r\n\r\n /**\r\n * Gets or sets the power value.\r\n */\r\n @serialize()\r\n public power = 8.1;\r\n\r\n /**\r\n * Gets or sets the sky color.\r\n */\r\n @serialize()\r\n public skyColor = new Color4(0.0117647, 0.960784, 0.996078, 1);\r\n\r\n /**\r\n * Gets or sets the horizon color.\r\n */\r\n @serialize()\r\n public horizonColor = new Color4(0.0117647, 0.333333, 0.996078, 1);\r\n\r\n /**\r\n * Gets or sets the ground color.\r\n */\r\n @serialize()\r\n public groundColor = new Color4(0, 0.254902, 0.996078, 1);\r\n\r\n /**\r\n * Gets or sets the horizon power value.\r\n */\r\n @serialize()\r\n public horizonPower = 1;\r\n\r\n /**\r\n * Gets or sets the finger occlusion width value.\r\n */\r\n @serialize()\r\n public width = 0.02;\r\n\r\n /**\r\n * Gets or sets the finger occlusion fuzz value.\r\n */\r\n @serialize()\r\n public fuzz = 0.5;\r\n\r\n /**\r\n * Gets or sets the minimum finger occlusion fuzz value.\r\n */\r\n @serialize()\r\n public minFuzz = 0.001;\r\n\r\n /**\r\n * Gets or sets the finger occlusion clip fade value.\r\n */\r\n @serialize()\r\n public clipFade = 0.01;\r\n\r\n /**\r\n * Gets or sets the hue shift value.\r\n */\r\n @serialize()\r\n public hueShift = 0;\r\n\r\n /**\r\n * Gets or sets the saturation shift value.\r\n */\r\n @serialize()\r\n public saturationShift = 0;\r\n\r\n /**\r\n * Gets or sets the value shift.\r\n */\r\n @serialize()\r\n public valueShift = 0;\r\n\r\n /**\r\n * Gets or sets the position of the hover glow effect.\r\n */\r\n @serialize()\r\n public blobPosition = new Vector3(0, 0, 0.1);\r\n\r\n /**\r\n * Gets or sets the intensity of the hover glow effect.\r\n */\r\n @serialize()\r\n public blobIntensity = 0.5;\r\n\r\n /**\r\n * Gets or sets the near size of the hover glow effect.\r\n */\r\n @serialize()\r\n public blobNearSize = 0.01;\r\n\r\n /**\r\n * Gets or sets the far size of the hover glow effect.\r\n */\r\n @serialize()\r\n public blobFarSize = 0.03;\r\n\r\n /**\r\n * Gets or sets the distance considered \"near\" to the mesh, which controls the size of the hover glow effect (see blobNearSize).\r\n */\r\n @serialize()\r\n public blobNearDistance = 0;\r\n\r\n /**\r\n * Gets or sets the distance considered \"far\" from the mesh, which controls the size of the hover glow effect (see blobFarSize).\r\n */\r\n @serialize()\r\n public blobFarDistance = 0.08;\r\n\r\n /**\r\n * Gets or sets the length of the hover glow effect fade.\r\n */\r\n @serialize()\r\n public blobFadeLength = 0.576;\r\n\r\n /**\r\n * Gets or sets the progress of the hover glow effect selection animation corresponding to the left pointer (0.0 - 1.0).\r\n */\r\n @serialize()\r\n public blobPulse = 0;\r\n\r\n /**\r\n * Gets or sets the opacity of the hover glow effect corresponding to the left pointer (0.0 - 1.0). Default is 0.\r\n */\r\n @serialize()\r\n public blobFade = 1;\r\n\r\n /**\r\n * Gets or sets the position of the hover glow effect.\r\n */\r\n @serialize()\r\n public blobPosition2 = new Vector3(0.2, 0, 0.1);\r\n\r\n /**\r\n * Gets or sets the size of the hover glow effect when the right pointer is considered \"near\" to the mesh (see blobNearDistance).\r\n */\r\n @serialize()\r\n public blobNearSize2 = 0.01;\r\n\r\n /**\r\n * Gets or sets the progress of the hover glow effect selection animation corresponding to the right pointer (0.0 - 1.0).\r\n */\r\n @serialize()\r\n public blobPulse2 = 0;\r\n\r\n /**\r\n * Gets or sets the opacity of the hover glow effect corresponding to the right pointer (0.0 - 1.0). Default is 1.\r\n */\r\n @serialize()\r\n public blobFade2 = 1;\r\n\r\n /**\r\n * Gets or sets the texture of the hover glow effect.\r\n */\r\n @serialize()\r\n public blobTexture = new Texture(\"\", this.getScene());\r\n\r\n /**\r\n * Gets or sets the finger position for left index.\r\n */\r\n @serialize()\r\n public leftIndexPosition = new Vector3(0, 0, 1);\r\n\r\n /**\r\n * Gets or sets the finger position for right index.\r\n */\r\n @serialize()\r\n public rightIndexPosition = new Vector3(-1, -1, -1);\r\n\r\n /**\r\n * Gets or sets the finger position for left index middle position.\r\n */\r\n @serialize()\r\n public leftIndexMiddlePosition = new Vector3(0, 0, 0);\r\n\r\n /**\r\n * Gets or sets the finger position for right index middle position.\r\n */\r\n @serialize()\r\n public rightIndexMiddlePosition = new Vector3(0, 0, 0);\r\n\r\n /**\r\n * Gets or sets the Decal Scale for XY.\r\n */\r\n @serialize()\r\n public decalScaleXY = new Vector2(1.5, 1.5);\r\n\r\n /**\r\n * Gets or sets decalFrontOnly\r\n * Default is true\r\n */\r\n @serialize()\r\n public decalFrontOnly = true;\r\n\r\n /**\r\n * Gets or sets the Rim Light intensity.\r\n */\r\n @serialize()\r\n public rimIntensity = 0.287;\r\n\r\n /**\r\n * Gets or sets the Rim Light hue shift value.\r\n */\r\n @serialize()\r\n public rimHueShift = 0;\r\n\r\n /**\r\n * Gets or sets the Rim Light saturation shift value.\r\n */\r\n @serialize()\r\n public rimSaturationShift = 0;\r\n\r\n /**\r\n * Gets or sets the Rim Light value shift.\r\n */\r\n @serialize()\r\n public rimValueShift = -1;\r\n\r\n /**\r\n * Gets or sets the intensity of the iridescence effect.\r\n */\r\n @serialize()\r\n public iridescenceIntensity = 0;\r\n\r\n /**\r\n * @internal\r\n */\r\n public useGlobalLeftIndex = 1.0;\r\n\r\n /**\r\n * @internal\r\n */\r\n public useGlobalRightIndex = 1.0;\r\n\r\n /**\r\n * @internal\r\n */\r\n public globalLeftIndexTipProximity = 0.0;\r\n\r\n /**\r\n * @internal\r\n */\r\n public globalRightIndexTipProximity = 0.0;\r\n\r\n /**\r\n * @internal\r\n */\r\n public globalLeftIndexTipPosition = new Vector4(0.5, 0.0, -0.55, 1.0);\r\n\r\n /**\r\n * @internal\r\n */\r\n public globaRightIndexTipPosition = new Vector4(0.0, 0.0, 0.0, 1.0);\r\n\r\n /**\r\n * @internal\r\n */\r\n public globalLeftThumbTipPosition = new Vector4(0.5, 0.0, -0.55, 1.0);\r\n\r\n /**\r\n * @internal\r\n */\r\n public globalRightThumbTipPosition = new Vector4(0.0, 0.0, 0.0, 1.0);\r\n\r\n /**\r\n * @internal\r\n */\r\n public globalLeftIndexMiddlePosition = new Vector4(0.5, 0.0, -0.55, 1.0);\r\n\r\n /**\r\n * @internal\r\n */\r\n public globalRightIndexMiddlePosition = new Vector4(0.0, 0.0, 0.0, 1.0);\r\n\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene);\r\n this.alphaMode = Constants.ALPHA_DISABLE;\r\n this.backFaceCulling = false;\r\n const textureUrl = Tools.GetAssetUrl(MRDLSliderThumbMaterial.BLUE_GRADIENT_TEXTURE_URL);\r\n this._blueGradientTexture = new Texture(textureUrl, scene, true, false, Texture.NEAREST_SAMPLINGMODE);\r\n this._decalTexture = new Texture(\"\", this.getScene());\r\n this._reflectionMapTexture = new Texture(\"\", this.getScene());\r\n this._indirectEnvTexture = new Texture(\"\", this.getScene());\r\n }\r\n\r\n public override needAlphaBlending(): boolean {\r\n return false;\r\n }\r\n\r\n public override needAlphaTesting(): boolean {\r\n return false;\r\n }\r\n\r\n public override getAlphaTestTexture(): Nullable<BaseTexture> {\r\n return null;\r\n }\r\n\r\n // Methods\r\n public override isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n const drawWrapper = subMesh._drawWrapper;\r\n\r\n if (this.isFrozen) {\r\n if (drawWrapper.effect && drawWrapper._wasPreviouslyReady) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n subMesh.materialDefines = new MRDLSliderThumbMaterialDefines();\r\n }\r\n\r\n const defines = <MRDLSliderThumbMaterialDefines>subMesh.materialDefines;\r\n const scene = this.getScene();\r\n\r\n if (!this._blueGradientTexture.isReady()) {\r\n return false;\r\n }\r\n\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n // Attribs\r\n PrepareDefinesForAttributes(mesh, defines, false, false);\r\n\r\n // Get correct effect\r\n if (defines.isDirty) {\r\n defines.markAsProcessed();\r\n\r\n scene.resetCachedMaterial();\r\n\r\n // Fallbacks\r\n const fallbacks = new EffectFallbacks();\r\n if (defines.FOG) {\r\n fallbacks.addFallback(1, \"FOG\");\r\n }\r\n\r\n HandleFallbacksForShadows(defines, fallbacks);\r\n\r\n defines.IMAGEPROCESSINGPOSTPROCESS = scene.imageProcessingConfiguration.applyByPostProcess;\r\n\r\n //Attributes\r\n const attribs = [VertexBuffer.PositionKind];\r\n\r\n if (defines.NORMAL) {\r\n attribs.push(VertexBuffer.NormalKind);\r\n }\r\n\r\n if (defines.UV1) {\r\n attribs.push(VertexBuffer.UVKind);\r\n }\r\n\r\n if (defines.UV2) {\r\n attribs.push(VertexBuffer.UV2Kind);\r\n }\r\n\r\n if (defines.VERTEXCOLOR) {\r\n attribs.push(VertexBuffer.ColorKind);\r\n }\r\n\r\n if (defines.TANGENT) {\r\n attribs.push(VertexBuffer.TangentKind);\r\n }\r\n\r\n PrepareAttributesForInstances(attribs, defines);\r\n\r\n // Legacy browser patch\r\n const shaderName = \"mrdlSliderThumb\";\r\n const join = defines.toString();\r\n\r\n const uniforms = [\r\n \"world\",\r\n \"viewProjection\",\r\n \"cameraPosition\",\r\n \"_Radius_\",\r\n \"_Bevel_Front_\",\r\n \"_Bevel_Front_Stretch_\",\r\n \"_Bevel_Back_\",\r\n \"_Bevel_Back_Stretch_\",\r\n \"_Radius_Top_Left_\",\r\n \"_Radius_Top_Right_\",\r\n \"_Radius_Bottom_Left_\",\r\n \"_Radius_Bottom_Right_\",\r\n \"_Bulge_Enabled_\",\r\n \"_Bulge_Height_\",\r\n \"_Bulge_Radius_\",\r\n \"_Sun_Intensity_\",\r\n \"_Sun_Theta_\",\r\n \"_Sun_Phi_\",\r\n \"_Indirect_Diffuse_\",\r\n \"_Albedo_\",\r\n \"_Specular_\",\r\n \"_Shininess_\",\r\n \"_Sharpness_\",\r\n \"_Subsurface_\",\r\n \"_Left_Color_\",\r\n \"_Right_Color_\",\r\n \"_Reflection_\",\r\n \"_Front_Reflect_\",\r\n \"_Edge_Reflect_\",\r\n \"_Power_\",\r\n \"_Sky_Color_\",\r\n \"_Horizon_Color_\",\r\n \"_Ground_Color_\",\r\n \"_Horizon_Power_\",\r\n \"_Reflection_Map_\",\r\n \"_Indirect_Environment_\",\r\n \"_Width_\",\r\n \"_Fuzz_\",\r\n \"_Min_Fuzz_\",\r\n \"_Clip_Fade_\",\r\n \"_Hue_Shift_\",\r\n \"_Saturation_Shift_\",\r\n \"_Value_Shift_\",\r\n \"_Blob_Position_\",\r\n \"_Blob_Intensity_\",\r\n \"_Blob_Near_Size_\",\r\n \"_Blob_Far_Size_\",\r\n \"_Blob_Near_Distance_\",\r\n \"_Blob_Far_Distance_\",\r\n \"_Blob_Fade_Length_\",\r\n \"_Blob_Pulse_\",\r\n \"_Blob_Fade_\",\r\n \"_Blob_Texture_\",\r\n \"_Blob_Position_2_\",\r\n \"_Blob_Near_Size_2_\",\r\n \"_Blob_Pulse_2_\",\r\n \"_Blob_Fade_2_\",\r\n \"_Left_Index_Pos_\",\r\n \"_Right_Index_Pos_\",\r\n \"_Left_Index_Middle_Pos_\",\r\n \"_Right_Index_Middle_Pos_\",\r\n \"_Decal_\",\r\n \"_Decal_Scale_XY_\",\r\n \"_Decal_Front_Only_\",\r\n \"_Rim_Intensity_\",\r\n \"_Rim_Texture_\",\r\n \"_Rim_Hue_Shift_\",\r\n \"_Rim_Saturation_Shift_\",\r\n \"_Rim_Value_Shift_\",\r\n \"_Iridescence_Intensity_\",\r\n \"_Iridescence_Texture_\",\r\n \"Use_Global_Left_Index\",\r\n \"Use_Global_Right_Index\",\r\n \"Global_Left_Index_Tip_Position\",\r\n \"Global_Right_Index_Tip_Position\",\r\n \"Global_Left_Thumb_Tip_Position\",\r\n \"Global_Right_Thumb_Tip_Position\",\r\n \"Global_Left_Index_Middle_Position;\",\r\n \"Global_Right_Index_Middle_Position\",\r\n \"Global_Left_Index_Tip_Proximity\",\r\n \"Global_Right_Index_Tip_Proximity\",\r\n ];\r\n const samplers: string[] = [\"_Rim_Texture_\", \"_Iridescence_Texture_\"];\r\n const uniformBuffers: string[] = [];\r\n\r\n PrepareUniformsAndSamplersList(<IEffectCreationOptions>{\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: defines,\r\n maxSimultaneousLights: 4,\r\n });\r\n\r\n subMesh.setEffect(\r\n scene.getEngine().createEffect(\r\n shaderName,\r\n <IEffectCreationOptions>{\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: join,\r\n fallbacks: fallbacks,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n indexParameters: { maxSimultaneousLights: 4 },\r\n },\r\n engine\r\n ),\r\n defines\r\n );\r\n }\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n\r\n return true;\r\n }\r\n\r\n public override bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const defines = <MRDLSliderThumbMaterialDefines>subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n\r\n this._activeEffect = effect;\r\n\r\n // Matrices\r\n this.bindOnlyWorldMatrix(world);\r\n this._activeEffect.setMatrix(\"viewProjection\", this.getScene().getTransformMatrix());\r\n this._activeEffect.setVector3(\"cameraPosition\", this.getScene().activeCamera!.position);\r\n\r\n // \"Round Rect\"\r\n this._activeEffect.setFloat(\"_Radius_\", this.radius);\r\n this._activeEffect.setFloat(\"_Bevel_Front_\", this.bevelFront);\r\n this._activeEffect.setFloat(\"_Bevel_Front_Stretch_\", this.bevelFrontStretch);\r\n this._activeEffect.setFloat(\"_Bevel_Back_\", this.bevelBack);\r\n this._activeEffect.setFloat(\"_Bevel_Back_Stretch_\", this.bevelBackStretch);\r\n\r\n // \"Radii Multipliers\"\r\n this._activeEffect.setFloat(\"_Radius_Top_Left_\", this.radiusTopLeft);\r\n this._activeEffect.setFloat(\"_Radius_Top_Right_\", this.radiusTopRight);\r\n this._activeEffect.setFloat(\"_Radius_Bottom_Left_\", this.radiusBottomLeft);\r\n this._activeEffect.setFloat(\"_Radius_Bottom_Right_\", this.radiusBottomRight);\r\n\r\n // \"Bulge\"\r\n this._activeEffect.setFloat(\"_Bulge_Enabled_\", this.bulgeEnabled ? 1.0 : 0.0);\r\n this._activeEffect.setFloat(\"_Bulge_Height_\", this.bulgeHeight);\r\n this._activeEffect.setFloat(\"_Bulge_Radius_\", this.bulgeRadius);\r\n\r\n // \"Sun\"\r\n this._activeEffect.setFloat(\"_Sun_Intensity_\", this.sunIntensity);\r\n this._activeEffect.setFloat(\"_Sun_Theta_\", this.sunTheta);\r\n this._activeEffect.setFloat(\"_Sun_Phi_\", this.sunPhi);\r\n this._activeEffect.setFloat(\"_Indirect_Diffuse_\", this.indirectDiffuse);\r\n\r\n // \"Diffuse And Specular\"\r\n this._activeEffect.setDirectColor4(\"_Albedo_\", this.albedo);\r\n this._activeEffect.setFloat(\"_Specular_\", this.specular);\r\n this._activeEffect.setFloat(\"_Shininess_\", this.shininess);\r\n this._activeEffect.setFloat(\"_Sharpness_\", this.sharpness);\r\n this._activeEffect.setFloat(\"_Subsurface_\", this.subsurface);\r\n\r\n // \"Gradient\"\r\n this._activeEffect.setDirectColor4(\"_Left_Color_\", this.leftGradientColor);\r\n this._activeEffect.setDirectColor4(\"_Right_Color_\", this.rightGradientColor);\r\n\r\n // \"Reflection\"\r\n this._activeEffect.setFloat(\"_Reflection_\", this.reflection);\r\n this._activeEffect.setFloat(\"_Front_Reflect_\", this.frontReflect);\r\n this._activeEffect.setFloat(\"_Edge_Reflect_\", this.edgeReflect);\r\n this._activeEffect.setFloat(\"_Power_\", this.power);\r\n\r\n // \"Sky Environment\"\r\n //define SKY_ENABLED true;\r\n this._activeEffect.setDirectColor4(\"_Sky_Color_\", this.skyColor);\r\n this._activeEffect.setDirectColor4(\"_Horizon_Color_\", this.horizonColor);\r\n this._activeEffect.setDirectColor4(\"_Ground_Color_\", this.groundColor);\r\n this._activeEffect.setFloat(\"_Horizon_Power_\", this.horizonPower);\r\n\r\n // \"Mapped Environment\"\r\n //define ENV_ENABLE false;\r\n this._activeEffect.setTexture(\"_Reflection_Map_\", this._reflectionMapTexture);\r\n this._activeEffect.setTexture(\"_Indirect_Environment_\", this._indirectEnvTexture);\r\n\r\n // \"FingerOcclusion\"\r\n //define OCCLUSION_ENABLED false;\r\n this._activeEffect.setFloat(\"_Width_\", this.width);\r\n this._activeEffect.setFloat(\"_Fuzz_\", this.fuzz);\r\n this._activeEffect.setFloat(\"_Min_Fuzz_\", this.minFuzz);\r\n this._activeEffect.setFloat(\"_Clip_Fade_\", this.clipFade);\r\n\r\n // \"View Based Color Shift\"\r\n this._activeEffect.setFloat(\"_Hue_Shift_\", this.hueShift);\r\n this._activeEffect.setFloat(\"_Saturation_Shift_\", this.saturationShift);\r\n this._activeEffect.setFloat(\"_Value_Shift_\", this.valueShift);\r\n\r\n // \"Blob\"\r\n //define BLOB_ENABLE false;\r\n this._activeEffect.setVector3(\"_Blob_Position_\", this.blobPosition);\r\n this._activeEffect.setFloat(\"_Blob_Intensity_\", this.blobIntensity);\r\n this._activeEffect.setFloat(\"_Blob_Near_Size_\", this.blobNearSize);\r\n this._activeEffect.setFloat(\"_Blob_Far_Size_\", this.blobFarSize);\r\n this._activeEffect.setFloat(\"_Blob_Near_Distance_\", this.blobNearDistance);\r\n this._activeEffect.setFloat(\"_Blob_Far_Distance_\", this.blobFarDistance);\r\n this._activeEffect.setFloat(\"_Blob_Fade_Length_\", this.blobFadeLength);\r\n this._activeEffect.setFloat(\"_Blob_Pulse_\", this.blobPulse);\r\n this._activeEffect.setFloat(\"_Blob_Fade_\", this.blobFade);\r\n\r\n // \"Blob Texture\"\r\n this._activeEffect.setTexture(\"_Blob_Texture_\", this.blobTexture);\r\n\r\n // \"Blob 2\"\r\n //define BLOB_ENABLE_2 true;\r\n this._activeEffect.setVector3(\"_Blob_Position_2_\", this.blobPosition2);\r\n this._activeEffect.setFloat(\"_Blob_Near_Size_2_\", this.blobNearSize2);\r\n this._activeEffect.setFloat(\"_Blob_Pulse_2_\", this.blobPulse2);\r\n this._activeEffect.setFloat(\"_Blob_Fade_2_\", this.blobFade2);\r\n\r\n // \"Finger Positions\"\r\n this._activeEffect.setVector3(\"_Left_Index_Pos_\", this.leftIndexPosition);\r\n this._activeEffect.setVector3(\"_Right_Index_Pos_\", this.rightIndexPosition);\r\n this._activeEffect.setVector3(\"_Left_Index_Middle_Pos_\", this.leftIndexMiddlePosition);\r\n this._activeEffect.setVector3(\"_Right_Index_Middle_Pos_\", this.rightIndexMiddlePosition);\r\n\r\n // \"Decal Texture\"\r\n //define DECAL_ENABLE false;\r\n this._activeEffect.setTexture(\"_Decal_\", this._decalTexture);\r\n this._activeEffect.setVector2(\"_Decal_Scale_XY_\", this.decalScaleXY);\r\n this._activeEffect.setFloat(\"_Decal_Front_Only_\", this.decalFrontOnly ? 1.0 : 0.0);\r\n\r\n // \"Rim Light\"\r\n this._activeEffect.setFloat(\"_Rim_Intensity_\", this.rimIntensity);\r\n this._activeEffect.setTexture(\"_Rim_Texture_\", this._blueGradientTexture);\r\n this._activeEffect.setFloat(\"_Rim_Hue_Shift_\", this.rimHueShift);\r\n this._activeEffect.setFloat(\"_Rim_Saturation_Shift_\", this.rimSaturationShift);\r\n this._activeEffect.setFloat(\"_Rim_Value_Shift_\", this.rimValueShift);\r\n\r\n // \"Iridescence\"\r\n //define IRIDESCENCE_ENABLED true;\r\n this._activeEffect.setFloat(\"_Iridescence_Intensity_\", this.iridescenceIntensity);\r\n this._activeEffect.setTexture(\"_Iridescence_Texture_\", this._blueGradientTexture);\r\n\r\n // Global inputs\r\n this._activeEffect.setFloat(\"Use_Global_Left_Index\", this.useGlobalLeftIndex);\r\n this._activeEffect.setFloat(\"Use_Global_Right_Index\", this.useGlobalRightIndex);\r\n\r\n this._activeEffect.setVector4(\"Global_Left_Index_Tip_Position\", this.globalLeftIndexTipPosition);\r\n this._activeEffect.setVector4(\"Global_Right_Index_Tip_Position\", this.globaRightIndexTipPosition);\r\n\r\n this._activeEffect.setVector4(\"Global_Left_Thumb_Tip_Position\", this.globalLeftThumbTipPosition);\r\n this._activeEffect.setVector4(\"Global_Right_Thumb_Tip_Position\", this.globalRightThumbTipPosition);\r\n\r\n this._activeEffect.setVector4(\"Global_Left_Index_Middle_Position\", this.globalLeftIndexMiddlePosition);\r\n this._activeEffect.setVector4(\"Global_Right_Index_Middle_Position\", this.globalRightIndexMiddlePosition);\r\n\r\n this._activeEffect.setFloat(\"Global_Left_Index_Tip_Proximity\", this.globalLeftIndexTipProximity);\r\n this._activeEffect.setFloat(\"Global_Right_Index_Tip_Proximity\", this.globalRightIndexTipProximity);\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n /**\r\n * Get the list of animatables in the material.\r\n * @returns the list of animatables object used in the material\r\n */\r\n public override getAnimatables(): IAnimatable[] {\r\n return [];\r\n }\r\n\r\n public override dispose(forceDisposeEffect?: boolean): void {\r\n super.dispose(forceDisposeEffect);\r\n this._reflectionMapTexture.dispose();\r\n this._indirectEnvTexture.dispose();\r\n this._blueGradientTexture.dispose();\r\n this._decalTexture.dispose();\r\n }\r\n\r\n public override clone(name: string): MRDLSliderThumbMaterial {\r\n return SerializationHelper.Clone(() => new MRDLSliderThumbMaterial(name, this.getScene()), this);\r\n }\r\n\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.customType = \"BABYLON.MRDLSliderThumbMaterial\";\r\n return serializationObject;\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"MRDLSliderThumbMaterial\";\r\n }\r\n\r\n // Statics\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): MRDLSliderThumbMaterial {\r\n return SerializationHelper.Parse(() => new MRDLSliderThumbMaterial(source.name, scene), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GUI.MRDLSliderThumbMaterial\", MRDLSliderThumbMaterial);\r\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"mrdlBackplatePixelShader\";\nconst shader = `uniform vec3 cameraPosition;varying vec3 vPosition;varying vec3 vNormal;varying vec2 vUV;varying vec3 vTangent;varying vec3 vBinormal;varying vec4 vExtra1;varying vec4 vExtra2;uniform float _Radius_;uniform float _Line_Width_;uniform bool _Absolute_Sizes_;uniform float _Filter_Width_;uniform vec4 _Base_Color_;uniform vec4 _Line_Color_;uniform float _Radius_Top_Left_;uniform float _Radius_Top_Right_;uniform float _Radius_Bottom_Left_;uniform float _Radius_Bottom_Right_;uniform float _Rate_;uniform vec4 _Highlight_Color_;uniform float _Highlight_Width_;uniform vec4 _Highlight_Transform_;uniform float _Highlight_;uniform float _Iridescence_Intensity_;uniform float _Iridescence_Edge_Intensity_;uniform vec4 _Iridescence_Tint_;uniform sampler2D _Iridescent_Map_;uniform float _Angle_;uniform bool _Reflected_;uniform float _Frequency_;uniform float _Vertical_Offset_;uniform vec4 _Gradient_Color_;uniform vec4 _Top_Left_;uniform vec4 _Top_Right_;uniform vec4 _Bottom_Left_;uniform vec4 _Bottom_Right_;uniform float _Edge_Width_;uniform float _Edge_Power_;uniform float _Line_Gradient_Blend_;uniform float _Fade_Out_;void FastLinearTosRGB_B353(\nvec4 Linear,\nout vec4 sRGB)\n{sRGB.rgb=sqrt(clamp(Linear.rgb,0.0,1.0));sRGB.a=Linear.a;}\nvoid Round_Rect_Fragment_B332(\nfloat Radius,\nfloat Line_Width,\nvec4 Line_Color,\nfloat Filter_Width,\nvec2 UV,\nfloat Line_Visibility,\nvec4 Rect_Parms,\nvec4 Fill_Color,\nout vec4 Color)\n{float d=length(max(abs(UV)-Rect_Parms.xy,0.0));float dx=max(fwidth(d)*Filter_Width,0.00001);float g=min(Rect_Parms.z,Rect_Parms.w);float dgrad=max(fwidth(g)*Filter_Width,0.00001);float Inside_Rect=clamp(g/dgrad,0.0,1.0);float inner=clamp((d+dx*0.5-max(Radius-Line_Width,d-dx*0.5))/dx,0.0,1.0);Color=clamp(mix(Fill_Color,Line_Color,inner),0.0,1.0)*Inside_Rect;}\nvoid Iridescence_B343(\nvec3 Position,\nvec3 Normal,\nvec2 UV,\nvec3 Axis,\nvec3 Eye,\nvec4 Tint,\nsampler2D Texture,\nbool Reflected,\nfloat Frequency,\nfloat Vertical_Offset,\nout vec4 Color)\n{vec3 i=normalize(Position-Eye);vec3 r=reflect(i,Normal);float idota=dot(i,Axis);float idotr=dot(i,r);float x=Reflected ? idotr : idota;vec2 xy;xy.x=fract((x*Frequency+1.0)*0.5+UV.y*Vertical_Offset);xy.y=0.5;Color=texture(Texture,xy);Color.rgb*=Tint.rgb;}\nvoid Scale_RGB_B346(\nvec4 Color,\nfloat Scalar,\nout vec4 Result)\n{Result=vec4(Scalar,Scalar,Scalar,1)*Color;}\nvoid Scale_RGB_B344(\nfloat Scalar,\nvec4 Color,\nout vec4 Result)\n{Result=vec4(Scalar,Scalar,Scalar,1)*Color;}\nvoid Line_Fragment_B362(\nvec4 Base_Color,\nvec4 Highlight_Color,\nfloat Highlight_Width,\nvec3 Line_Vertex,\nfloat Highlight,\nout vec4 Line_Color)\n{float k2=1.0-clamp(abs(Line_Vertex.y/Highlight_Width),0.0,1.0);Line_Color=mix(Base_Color,Highlight_Color,Highlight*k2);}\nvoid Edge_B356(\nvec4 RectParms,\nfloat Radius,\nfloat Line_Width,\nvec2 UV,\nfloat Edge_Width,\nfloat Edge_Power,\nout float Result)\n{float d=length(max(abs(UV)-RectParms.xy,0.0));float edge=1.0-clamp((1.0-d/(Radius-Line_Width))/Edge_Width,0.0,1.0);Result=pow(edge,Edge_Power);}\nvoid Gradient_B355(\nvec4 Gradient_Color,\nvec4 Top_Left,\nvec4 Top_Right,\nvec4 Bottom_Left,\nvec4 Bottom_Right,\nvec2 UV,\nout vec4 Result)\n{vec3 top=Top_Left.rgb+(Top_Right.rgb-Top_Left.rgb)*UV.x;vec3 bottom=Bottom_Left.rgb+(Bottom_Right.rgb-Bottom_Left.rgb)*UV.x;Result.rgb=Gradient_Color.rgb*(bottom+(top-bottom)*UV.y);Result.a=1.0;}\nvoid main()\n{float X_Q338;float Y_Q338;float Z_Q338;float W_Q338;X_Q338=vExtra2.x;Y_Q338=vExtra2.y;Z_Q338=vExtra2.z;W_Q338=vExtra2.w;vec4 Color_Q343;\n#if IRIDESCENCE_ENABLE\nIridescence_B343(vPosition,vNormal,vUV,vBinormal,cameraPosition,_Iridescence_Tint_,_Iridescent_Map_,_Reflected_,_Frequency_,_Vertical_Offset_,Color_Q343);\n#else\nColor_Q343=vec4(0,0,0,0);\n#endif\nvec4 Result_Q344;Scale_RGB_B344(_Iridescence_Intensity_,Color_Q343,Result_Q344);vec4 Line_Color_Q362;Line_Fragment_B362(_Line_Color_,_Highlight_Color_,_Highlight_Width_,vTangent,_Highlight_,Line_Color_Q362);float Result_Q356;\n#if EDGE_ONLY\nEdge_B356(vExtra1,Z_Q338,W_Q338,vUV,_Edge_Width_,_Edge_Power_,Result_Q356);\n#else\nResult_Q356=1.0;\n#endif\nvec2 Vec2_Q339=vec2(X_Q338,Y_Q338);vec4 Result_Q355;Gradient_B355(_Gradient_Color_,_Top_Left_,_Top_Right_,_Bottom_Left_,_Bottom_Right_,Vec2_Q339,Result_Q355);vec4 Linear_Q348;Linear_Q348.rgb=clamp(Result_Q355.rgb*Result_Q355.rgb,0.0,1.0);Linear_Q348.a=Result_Q355.a;vec4 Result_Q346;Scale_RGB_B346(Linear_Q348,Result_Q356,Result_Q346);vec4 Sum_Q345=Result_Q346+Result_Q344;vec4 Color_At_T_Q347=mix(Line_Color_Q362,Result_Q346,_Line_Gradient_Blend_);vec4 Base_And_Iridescent_Q350;Base_And_Iridescent_Q350=_Base_Color_+vec4(Sum_Q345.rgb,0.0);vec4 Sum_Q349=Color_At_T_Q347+_Iridescence_Edge_Intensity_*Color_Q343;vec4 Result_Q351=Sum_Q349; Result_Q351.a=1.0;vec4 Color_Q332;Round_Rect_Fragment_B332(Z_Q338,W_Q338,Result_Q351,_Filter_Width_,vUV,1.0,vExtra1,Base_And_Iridescent_Q350,Color_Q332);vec4 Result_Q354=_Fade_Out_*Color_Q332;vec4 sRGB_Q353;FastLinearTosRGB_B353(Result_Q354,sRGB_Q353);vec4 Out_Color=sRGB_Q353;float Clip_Threshold=0.001;bool To_sRGB=false;gl_FragColor=Out_Color;}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const mrdlBackplatePixelShader = { name, shader };\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"mrdlBackplateVertexShader\";\nconst shader = `uniform mat4 world;uniform mat4 viewProjection;uniform vec3 cameraPosition;attribute vec3 position;attribute vec3 normal;attribute vec3 tangent;uniform float _Radius_;uniform float _Line_Width_;uniform bool _Absolute_Sizes_;uniform float _Filter_Width_;uniform vec4 _Base_Color_;uniform vec4 _Line_Color_;uniform float _Radius_Top_Left_;uniform float _Radius_Top_Right_;uniform float _Radius_Bottom_Left_;uniform float _Radius_Bottom_Right_;uniform float _Rate_;uniform vec4 _Highlight_Color_;uniform float _Highlight_Width_;uniform vec4 _Highlight_Transform_;uniform float _Highlight_;uniform float _Iridescence_Intensity_;uniform float _Iridescence_Edge_Intensity_;uniform vec4 _Iridescence_Tint_;uniform sampler2D _Iridescent_Map_;uniform float _Angle_;uniform bool _Reflected_;uniform float _Frequency_;uniform float _Vertical_Offset_;uniform vec4 _Gradient_Color_;uniform vec4 _Top_Left_;uniform vec4 _Top_Right_;uniform vec4 _Bottom_Left_;uniform vec4 _Bottom_Right_;uniform float _Edge_Width_;uniform float _Edge_Power_;uniform float _Line_Gradient_Blend_;uniform float _Fade_Out_;varying vec3 vPosition;varying vec3 vNormal;varying vec2 vUV;varying vec3 vTangent;varying vec3 vBinormal;varying vec4 vExtra1;varying vec4 vExtra2;void Object_To_World_Pos_B314(\nvec3 Pos_Object,\nout vec3 Pos_World)\n{Pos_World=(world*vec4(Pos_Object,1.0)).xyz;}\nvoid Round_Rect_Vertex_B357(\nvec2 UV,\nfloat Radius,\nfloat Margin,\nfloat Anisotropy,\nfloat Gradient1,\nfloat Gradient2,\nvec3 Normal,\nvec4 Color_Scale_Translate,\nout vec2 Rect_UV,\nout vec4 Rect_Parms,\nout vec2 Scale_XY,\nout vec2 Line_UV,\nout vec2 Color_UV_Info)\n{Scale_XY=vec2(Anisotropy,1.0);Line_UV=(UV-vec2(0.5,0.5));Rect_UV=Line_UV*Scale_XY;Rect_Parms.xy=Scale_XY*0.5-vec2(Radius,Radius)-vec2(Margin,Margin);Rect_Parms.z=Gradient1; \nRect_Parms.w=Gradient2;Color_UV_Info=(Line_UV+vec2(0.5,0.5))*Color_Scale_Translate.xy+Color_Scale_Translate.zw;}\nvoid Line_Vertex_B333(\nvec2 Scale_XY,\nvec2 UV,\nfloat Time,\nfloat Rate,\nvec4 Highlight_Transform,\nout vec3 Line_Vertex)\n{float angle2=(Rate*Time)*2.0*3.1416;float sinAngle2=sin(angle2);float cosAngle2=cos(angle2);vec2 xformUV=UV*Highlight_Transform.xy+Highlight_Transform.zw;Line_Vertex.x=0.0;Line_Vertex.y=cosAngle2*xformUV.x-sinAngle2*xformUV.y;Line_Vertex.z=0.0; }\nvoid PickDir_B334(\nfloat Degrees,\nvec3 DirX,\nvec3 DirY,\nout vec3 Dir)\n{float a=Degrees*3.14159/180.0;Dir=cos(a)*DirX+sin(a)*DirY;}\nvoid Move_Verts_B327(\nfloat Anisotropy,\nvec3 P,\nfloat Radius,\nout vec3 New_P,\nout vec2 New_UV,\nout float Radial_Gradient,\nout vec3 Radial_Dir)\n{vec2 UV=P.xy*2.0+0.5;vec2 center=clamp(UV,0.0,1.0);vec2 delta=UV-center;vec2 r2=2.0*vec2(Radius/Anisotropy,Radius);New_UV=center+r2*(UV-2.0*center+0.5);New_P=vec3(New_UV-0.5,P.z);Radial_Gradient=1.0-length(delta)*2.0;Radial_Dir=vec3(delta*r2,0.0);}\nvoid Pick_Radius_B336(\nfloat Radius,\nfloat Radius_Top_Left,\nfloat Radius_Top_Right,\nfloat Radius_Bottom_Left,\nfloat Radius_Bottom_Right,\nvec3 Position,\nout float Result)\n{bool whichY=Position.y>0.0;Result=Position.x<0.0 ? (whichY ? Radius_Top_Left : Radius_Bottom_Left) : (whichY ? Radius_Top_Right : Radius_Bottom_Right);Result*=Radius;}\nvoid Edge_AA_Vertex_B328(\nvec3 Position_World,\nvec3 Position_Object,\nvec3 Normal_Object,\nvec3 Eye,\nfloat Radial_Gradient,\nvec3 Radial_Dir,\nvec3 Tangent,\nout float Gradient1,\nout float Gradient2)\n{vec3 I=(Eye-Position_World);vec3 T=(vec4(Tangent,0.0)).xyz;float g=(dot(T,I)<0.0) ? 0.0 : 1.0;if (Normal_Object.z==0.0) { \nGradient1=Position_Object.z>0.0 ? g : 1.0;Gradient2=Position_Object.z>0.0 ? 1.0 : g;} else {Gradient1=g+(1.0-g)*(Radial_Gradient);Gradient2=1.0;}}\nvoid Object_To_World_Dir_B330(\nvec3 Dir_Object,\nout vec3 Binormal_World,\nout vec3 Binormal_World_N,\nout float Binormal_Length)\n{Binormal_World=(world*vec4(Dir_Object,0.0)).xyz;Binormal_Length=length(Binormal_World);Binormal_World_N=Binormal_World/Binormal_Length;}\nvoid RelativeOrAbsoluteDetail_B341(\nfloat Nominal_Radius,\nfloat Nominal_LineWidth,\nbool Absolute_Measurements,\nfloat Height,\nout float Radius,\nout float Line_Width)\n{float scale=Absolute_Measurements ? 1.0/Height : 1.0;Radius=Nominal_Radius*scale;Line_Width=Nominal_LineWidth*scale;}\nvoid main()\n{vec3 Nrm_World_Q326;Nrm_World_Q326=normalize((world*vec4(normal,0.0)).xyz);vec3 Tangent_World_Q329;vec3 Tangent_World_N_Q329;float Tangent_Length_Q329;Tangent_World_Q329=(world*vec4(vec3(1,0,0),0.0)).xyz;Tangent_Length_Q329=length(Tangent_World_Q329);Tangent_World_N_Q329=Tangent_World_Q329/Tangent_Length_Q329;vec3 Binormal_World_Q330;vec3 Binormal_World_N_Q330;float Binormal_Length_Q330;Object_To_World_Dir_B330(vec3(0,1,0),Binormal_World_Q330,Binormal_World_N_Q330,Binormal_Length_Q330);float Radius_Q341;float Line_Width_Q341;RelativeOrAbsoluteDetail_B341(_Radius_,_Line_Width_,_Absolute_Sizes_,Binormal_Length_Q330,Radius_Q341,Line_Width_Q341);vec3 Dir_Q334;PickDir_B334(_Angle_,Tangent_World_N_Q329,Binormal_World_N_Q330,Dir_Q334);float Result_Q336;Pick_Radius_B336(Radius_Q341,_Radius_Top_Left_,_Radius_Top_Right_,_Radius_Bottom_Left_,_Radius_Bottom_Right_,position,Result_Q336);float Anisotropy_Q331=Tangent_Length_Q329/Binormal_Length_Q330;vec4 Out_Color_Q337=vec4(Result_Q336,Line_Width_Q341,0,1);vec3 New_P_Q327;vec2 New_UV_Q327;float Radial_Gradient_Q327;vec3 Radial_Dir_Q327;Move_Verts_B327(Anisotropy_Q331,position,Result_Q336,New_P_Q327,New_UV_Q327,Radial_Gradient_Q327,Radial_Dir_Q327);vec3 Pos_World_Q314;Object_To_World_Pos_B314(New_P_Q327,Pos_World_Q314);float Gradient1_Q328;float Gradient2_Q328;\n#if SMOOTH_EDGES\nEdge_AA_Vertex_B328(Pos_World_Q314,position,normal,cameraPosition,Radial_Gradient_Q327,Radial_Dir_Q327,tangent,Gradient1_Q328,Gradient2_Q328);\n#else\nGradient1_Q328=1.0;Gradient2_Q328=1.0;\n#endif\nvec2 Rect_UV_Q357;vec4 Rect_Parms_Q357;vec2 Scale_XY_Q357;vec2 Line_UV_Q357;vec2 Color_UV_Info_Q357;Round_Rect_Vertex_B357(New_UV_Q327,Result_Q336,0.0,Anisotropy_Q331,Gradient1_Q328,Gradient2_Q328,normal,vec4(1,1,0,0),Rect_UV_Q357,Rect_Parms_Q357,Scale_XY_Q357,Line_UV_Q357,Color_UV_Info_Q357);vec3 Line_Vertex_Q333;Line_Vertex_B333(Scale_XY_Q357,Line_UV_Q357,(20.0),_Rate_,_Highlight_Transform_,Line_Vertex_Q333);float X_Q359;float Y_Q359;X_Q359=Color_UV_Info_Q357.x;Y_Q359=Color_UV_Info_Q357.y;vec4 Vec4_Q358=vec4(X_Q359,Y_Q359,Result_Q336,Line_Width_Q341);vec3 Position=Pos_World_Q314;vec3 Normal=Nrm_World_Q326;vec2 UV=Rect_UV_Q357;vec3 Tangent=Line_Vertex_Q333;vec3 Binormal=Dir_Q334;vec4 Color=Out_Color_Q337;vec4 Extra1=Rect_Parms_Q357;vec4 Extra2=Vec4_Q358;vec4 Extra3=vec4(0,0,0,0);gl_Position=viewProjection*vec4(Position,1);vPosition=Position;vNormal=Normal;vUV=UV;vTangent=Tangent;vBinormal=Binormal;vExtra1=Extra1;vExtra2=Extra2;}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const mrdlBackplateVertexShader = { name, shader };\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type Nullable } from \"core/types\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { SerializationHelper } from \"core/Misc/decorators.serialization\";\r\nimport { type Matrix, Vector4 } from \"core/Maths/math.vector\";\r\nimport { type IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { type IEffectCreationOptions } from \"core/Materials/effect\";\r\nimport { PushMaterial } from \"core/Materials/pushMaterial\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { type SubMesh } from \"core/Meshes/subMesh\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { Color4 } from \"core/Maths/math.color\";\r\nimport { EffectFallbacks } from \"core/Materials/effectFallbacks\";\r\nimport { Constants } from \"core/Engines/constants\";\r\n\r\nimport \"./shaders/mrdlBackplate.fragment\";\r\nimport \"./shaders/mrdlBackplate.vertex\";\r\nimport { HandleFallbacksForShadows, PrepareAttributesForInstances, PrepareDefinesForAttributes, PrepareUniformsAndSamplersList } from \"core/Materials/materialHelper.functions\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\n/** @internal */\r\nclass MRDLBackplateMaterialDefines extends MaterialDefines {\r\n /*\r\n \"IRIDESCENCE_ENABLE\", \"SMOOTH_EDGES\"\r\n */\r\n public IRIDESCENCE_ENABLE = true;\r\n public SMOOTH_EDGES = true;\r\n\r\n constructor() {\r\n super();\r\n this._needNormals = true;\r\n this.rebuild();\r\n }\r\n}\r\n\r\n/**\r\n * Class used to render backplate material with MRDL\r\n */\r\nexport class MRDLBackplateMaterial extends PushMaterial {\r\n /**\r\n * URL pointing to the texture used to define the coloring for the Iridescent Map effect.\r\n */\r\n public static IRIDESCENT_MAP_TEXTURE_URL = \"https://assets.babylonjs.com/core/MRTK/MRDL/mrtk-mrdl-backplate-iridescence.png\";\r\n private _iridescentMapTexture: Texture;\r\n\r\n /**\r\n * Gets or sets the corner radius on the backplate. If this value is changed, update the lineWidth to match.\r\n */\r\n @serialize()\r\n public radius = 0.3;\r\n\r\n /**\r\n * Gets or sets the line width of the backplate.\r\n */\r\n @serialize()\r\n public lineWidth = 0.003;\r\n\r\n /**\r\n * Gets or sets whether to use absolute sizes when calculating effects on the backplate.\r\n * Since desktop and VR/AR have different relative sizes, it's usually best to keep this false.\r\n */\r\n @serialize()\r\n public absoluteSizes = false;\r\n\r\n /** @internal */\r\n public _filterWidth = 1;\r\n\r\n /**\r\n * Gets or sets the base color of the backplate.\r\n */\r\n @serialize()\r\n public baseColor = new Color4(0, 0, 0, 1);\r\n\r\n /**\r\n * Gets or sets the line color of the backplate.\r\n */\r\n @serialize()\r\n public lineColor = new Color4(0.2, 0.262745, 0.4, 1);\r\n\r\n /**\r\n * Gets or sets the top left Radii Multiplier.\r\n */\r\n @serialize()\r\n public radiusTopLeft = 1.0;\r\n\r\n /**\r\n * Gets or sets the top left Radii Multiplier.\r\n */\r\n @serialize()\r\n public radiusTopRight = 1.0;\r\n\r\n /**\r\n * Gets or sets the top left Radii Multiplier.\r\n */\r\n @serialize()\r\n public radiusBottomLeft = 1.0;\r\n\r\n /**\r\n * Gets or sets the top left Radii Multiplier.\r\n */\r\n @serialize()\r\n public radiusBottomRight = 1.0;\r\n\r\n /** @internal */\r\n public _rate = 0;\r\n\r\n /**\r\n * Gets or sets the color of the highlights on the backplate line.\r\n */\r\n @serialize()\r\n public highlightColor = new Color4(0.239216, 0.435294, 0.827451, 1);\r\n\r\n /**\r\n * Gets or sets the width of the highlights on the backplate line.\r\n */\r\n @serialize()\r\n public highlightWidth = 0;\r\n\r\n /** @internal */\r\n public _highlightTransform = new Vector4(1, 1, 0, 0);\r\n\r\n /** @internal */\r\n public _highlight = 1;\r\n\r\n /**\r\n * Gets or sets the intensity of the iridescence effect.\r\n */\r\n @serialize()\r\n public iridescenceIntensity = 0.45;\r\n\r\n /**\r\n * Gets or sets the intensity of the iridescence effect on the backplate edges.\r\n */\r\n @serialize()\r\n public iridescenceEdgeIntensity = 1;\r\n\r\n /**\r\n * Gets or sets the Tint of the iridescence effect on the backplate.\r\n */\r\n @serialize()\r\n public iridescenceTint = new Color4(1, 1, 1, 1);\r\n\r\n /** @internal */\r\n public _angle = -45;\r\n\r\n /**\r\n * Gets or sets the opacity of the backplate (0.0 - 1.0).\r\n */\r\n @serialize()\r\n public fadeOut = 1;\r\n\r\n /** @internal */\r\n public _reflected = true;\r\n\r\n /** @internal */\r\n public _frequency = 1;\r\n\r\n /** @internal */\r\n public _verticalOffset = 0;\r\n\r\n /**\r\n * Gets or sets the gradient color effect on the backplate.\r\n */\r\n @serialize()\r\n public gradientColor = new Color4(0.74902, 0.74902, 0.74902, 1);\r\n\r\n /**\r\n * Gets or sets the top left gradient color effect on the backplate.\r\n */\r\n @serialize()\r\n public topLeftGradientColor = new Color4(0.00784314, 0.294118, 0.580392, 1);\r\n\r\n /**\r\n * Gets or sets the top right gradient color effect on the backplate.\r\n */\r\n @serialize()\r\n public topRightGradientColor = new Color4(0.305882, 0, 1, 1);\r\n\r\n /**\r\n * Gets or sets the bottom left gradient color effect on the backplate.\r\n */\r\n @serialize()\r\n public bottomLeftGradientColor = new Color4(0.133333, 0.258824, 0.992157, 1);\r\n\r\n /**\r\n * Gets or sets the bottom right gradient color effect on the backplate.\r\n */\r\n @serialize()\r\n public bottomRightGradientColor = new Color4(0.176471, 0.176471, 0.619608, 1);\r\n\r\n /**\r\n * Gets or sets the edge width of the backplate.\r\n */\r\n @serialize()\r\n public edgeWidth = 0.5;\r\n\r\n /**\r\n * Gets or sets the edge width of the backplate.\r\n */\r\n @serialize()\r\n public edgePower = 1;\r\n\r\n /**\r\n * Gets or sets the edge width of the backplate.\r\n */\r\n @serialize()\r\n public edgeLineGradientBlend = 0.5;\r\n\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene);\r\n this.alphaMode = Constants.ALPHA_DISABLE;\r\n this.backFaceCulling = false;\r\n const textureUrl = Tools.GetAssetUrl(MRDLBackplateMaterial.IRIDESCENT_MAP_TEXTURE_URL);\r\n this._iridescentMapTexture = new Texture(textureUrl, this.getScene(), true, false, Texture.NEAREST_SAMPLINGMODE);\r\n }\r\n\r\n public override needAlphaBlending(): boolean {\r\n return false;\r\n }\r\n\r\n public override needAlphaTesting(): boolean {\r\n return false;\r\n }\r\n\r\n public override getAlphaTestTexture(): Nullable<BaseTexture> {\r\n return null;\r\n }\r\n\r\n // Methods\r\n public override isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n const drawWrapper = subMesh._drawWrapper;\r\n\r\n if (this.isFrozen) {\r\n if (drawWrapper.effect && drawWrapper._wasPreviouslyReady) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n subMesh.materialDefines = new MRDLBackplateMaterialDefines();\r\n }\r\n\r\n const defines = <MRDLBackplateMaterialDefines>subMesh.materialDefines;\r\n const scene = this.getScene();\r\n\r\n if (!this._iridescentMapTexture.isReady()) {\r\n return false;\r\n }\r\n\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n // Attribs\r\n PrepareDefinesForAttributes(mesh, defines, false, false);\r\n\r\n // Get correct effect\r\n if (defines.isDirty) {\r\n defines.markAsProcessed();\r\n\r\n scene.resetCachedMaterial();\r\n\r\n // Fallbacks\r\n const fallbacks = new EffectFallbacks();\r\n if (defines.FOG) {\r\n fallbacks.addFallback(1, \"FOG\");\r\n }\r\n\r\n HandleFallbacksForShadows(defines, fallbacks);\r\n\r\n defines.IMAGEPROCESSINGPOSTPROCESS = scene.imageProcessingConfiguration.applyByPostProcess;\r\n\r\n //Attributes\r\n const attribs = [VertexBuffer.PositionKind];\r\n\r\n if (defines.NORMAL) {\r\n attribs.push(VertexBuffer.NormalKind);\r\n }\r\n\r\n if (defines.UV1) {\r\n attribs.push(VertexBuffer.UVKind);\r\n }\r\n\r\n if (defines.UV2) {\r\n attribs.push(VertexBuffer.UV2Kind);\r\n }\r\n\r\n if (defines.VERTEXCOLOR) {\r\n attribs.push(VertexBuffer.ColorKind);\r\n }\r\n\r\n if (defines.TANGENT) {\r\n attribs.push(VertexBuffer.TangentKind);\r\n }\r\n\r\n PrepareAttributesForInstances(attribs, defines);\r\n\r\n // Legacy browser patch\r\n const shaderName = \"mrdlBackplate\";\r\n const join = defines.toString();\r\n\r\n const uniforms = [\r\n \"world\",\r\n \"viewProjection\",\r\n \"cameraPosition\",\r\n \"_Radius_\",\r\n \"_Line_Width_\",\r\n \"_Absolute_Sizes_\",\r\n \"_Filter_Width_\",\r\n \"_Base_Color_\",\r\n \"_Line_Color_\",\r\n \"_Radius_Top_Left_\",\r\n \"_Radius_Top_Right_\",\r\n \"_Radius_Bottom_Left_\",\r\n \"_Radius_Bottom_Right_\",\r\n \"_Rate_\",\r\n \"_Highlight_Color_\",\r\n \"_Highlight_Width_\",\r\n \"_Highlight_Transform_\",\r\n \"_Highlight_\",\r\n \"_Iridescence_Intensity_\",\r\n \"_Iridescence_Edge_Intensity_\",\r\n \"_Iridescence_Tint_\",\r\n \"_Iridescent_Map_\",\r\n \"_Angle_\",\r\n \"_Reflected_\",\r\n \"_Frequency_\",\r\n \"_Vertical_Offset_\",\r\n \"_Gradient_Color_\",\r\n \"_Top_Left_\",\r\n \"_Top_Right_\",\r\n \"_Bottom_Left_\",\r\n \"_Bottom_Right_\",\r\n \"_Edge_Width_\",\r\n \"_Edge_Power_\",\r\n \"_Line_Gradient_Blend_\",\r\n \"_Fade_Out_\",\r\n ];\r\n const samplers: string[] = [\"_Iridescent_Map_\"];\r\n const uniformBuffers: string[] = [];\r\n\r\n PrepareUniformsAndSamplersList(<IEffectCreationOptions>{\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: defines,\r\n maxSimultaneousLights: 4,\r\n });\r\n\r\n subMesh.setEffect(\r\n scene.getEngine().createEffect(\r\n shaderName,\r\n <IEffectCreationOptions>{\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: join,\r\n fallbacks: fallbacks,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n indexParameters: { maxSimultaneousLights: 4 },\r\n },\r\n engine\r\n ),\r\n defines\r\n );\r\n }\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n\r\n return true;\r\n }\r\n\r\n public override bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const defines = <MRDLBackplateMaterialDefines>subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n\r\n this._activeEffect = effect;\r\n\r\n // Matrices\r\n this.bindOnlyWorldMatrix(world);\r\n this._activeEffect.setMatrix(\"viewProjection\", this.getScene().getTransformMatrix());\r\n this._activeEffect.setVector3(\"cameraPosition\", this.getScene().activeCamera!.position);\r\n\r\n // \"Round Rect\"\r\n this._activeEffect.setFloat(\"_Radius_\", this.radius);\r\n this._activeEffect.setFloat(\"_Line_Width_\", this.lineWidth);\r\n this._activeEffect.setFloat(\"_Absolute_Sizes_\", this.absoluteSizes ? 1.0 : 0.0);\r\n this._activeEffect.setFloat(\"_Filter_Width_\", this._filterWidth);\r\n this._activeEffect.setDirectColor4(\"_Base_Color_\", this.baseColor);\r\n this._activeEffect.setDirectColor4(\"_Line_Color_\", this.lineColor);\r\n\r\n // \"Radii Multipliers\"\r\n this._activeEffect.setFloat(\"_Radius_Top_Left_\", this.radiusTopLeft);\r\n this._activeEffect.setFloat(\"_Radius_Top_Right_\", this.radiusTopRight);\r\n this._activeEffect.setFloat(\"_Radius_Bottom_Left_\", this.radiusBottomLeft);\r\n this._activeEffect.setFloat(\"_Radius_Bottom_Right_\", this.radiusBottomRight);\r\n\r\n // \"Line Highlight\"\r\n this._activeEffect.setFloat(\"_Rate_\", this._rate);\r\n this._activeEffect.setDirectColor4(\"_Highlight_Color_\", this.highlightColor);\r\n this._activeEffect.setFloat(\"_Highlight_Width_\", this.highlightWidth);\r\n this._activeEffect.setVector4(\"_Highlight_Transform_\", this._highlightTransform);\r\n this._activeEffect.setFloat(\"_Highlight_\", this._highlight);\r\n\r\n // \"Iridescence\"\r\n //define IRIDESCENCE_ENABLE true;\r\n this._activeEffect.setFloat(\"_Iridescence_Intensity_\", this.iridescenceIntensity);\r\n this._activeEffect.setFloat(\"_Iridescence_Edge_Intensity_\", this.iridescenceEdgeIntensity);\r\n this._activeEffect.setDirectColor4(\"_Iridescence_Tint_\", this.iridescenceTint);\r\n this._activeEffect.setTexture(\"_Iridescent_Map_\", this._iridescentMapTexture);\r\n this._activeEffect.setFloat(\"_Angle_\", this._angle);\r\n this._activeEffect.setFloat(\"_Reflected_\", this._reflected ? 1.0 : 0.0);\r\n this._activeEffect.setFloat(\"_Frequency_\", this._frequency);\r\n this._activeEffect.setFloat(\"_Vertical_Offset_\", this._verticalOffset);\r\n\r\n // \"Gradient\"\r\n this._activeEffect.setDirectColor4(\"_Gradient_Color_\", this.gradientColor);\r\n this._activeEffect.setDirectColor4(\"_Top_Left_\", this.topLeftGradientColor);\r\n this._activeEffect.setDirectColor4(\"_Top_Right_\", this.topRightGradientColor);\r\n this._activeEffect.setDirectColor4(\"_Bottom_Left_\", this.bottomLeftGradientColor);\r\n this._activeEffect.setDirectColor4(\"_Bottom_Right_\", this.bottomRightGradientColor);\r\n //define EDGE_ONLY false;\r\n this._activeEffect.setFloat(\"_Edge_Width_\", this.edgeWidth);\r\n this._activeEffect.setFloat(\"_Edge_Power_\", this.edgePower);\r\n this._activeEffect.setFloat(\"_Line_Gradient_Blend_\", this.edgeLineGradientBlend);\r\n\r\n // \"Fade\"\r\n this._activeEffect.setFloat(\"_Fade_Out_\", this.fadeOut);\r\n\r\n // \"Antialiasing\"\r\n //define SMOOTH_EDGES true;\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n /**\r\n * Get the list of animatables in the material.\r\n * @returns the list of animatables object used in the material\r\n */\r\n public override getAnimatables(): IAnimatable[] {\r\n return [];\r\n }\r\n\r\n public override dispose(forceDisposeEffect?: boolean): void {\r\n super.dispose(forceDisposeEffect);\r\n }\r\n\r\n public override clone(name: string): MRDLBackplateMaterial {\r\n return SerializationHelper.Clone(() => new MRDLBackplateMaterial(name, this.getScene()), this);\r\n }\r\n\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.customType = \"BABYLON.MRDLBackplateMaterial\";\r\n return serializationObject;\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"MRDLBackplateMaterial\";\r\n }\r\n\r\n // Statics\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): MRDLBackplateMaterial {\r\n return SerializationHelper.Parse(() => new MRDLBackplateMaterial(source.name, scene), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GUI.MRDLBackplateMaterial\", MRDLBackplateMaterial);\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type Nullable } from \"core/types\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { type TransformNode } from \"core/Meshes/transformNode\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { Control3D } from \"./control3D\";\r\nimport { CreateBox } from \"core/Meshes/Builders/boxBuilder\";\r\nimport { PointerDragBehavior } from \"core/Behaviors/Meshes/pointerDragBehavior\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { SceneLoader } from \"core/Loading/sceneLoader\";\r\nimport { MRDLSliderBarMaterial } from \"../materials/mrdl/mrdlSliderBarMaterial\";\r\nimport { MRDLSliderThumbMaterial } from \"../materials/mrdl/mrdlSliderThumbMaterial\";\r\nimport { MRDLBackplateMaterial } from \"../materials/mrdl/mrdlBackplateMaterial\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\nconst SLIDER_MIN: number = 0;\r\nconst SLIDER_MAX: number = 100;\r\nconst SLIDER_VAL: number = 50;\r\nconst SLIDER_STEP: number = 0;\r\nconst SLIDER_SCALING: number = 1.0;\r\nconst SLIDER_MARGIN: number = 0.2;\r\n\r\n/**\r\n * Class used to create a slider in 3D\r\n */\r\nexport class Slider3D extends Control3D {\r\n /**\r\n * Base Url for the models.\r\n */\r\n public static MODEL_BASE_URL: string = \"https://assets.babylonjs.com/core/MRTK/\";\r\n\r\n /**\r\n * File name for the 8x4 model.\r\n */\r\n public static MODEL_FILENAME: string = \"mrtk-fluent-backplate.glb\";\r\n\r\n private _sliderBackplate: AbstractMesh;\r\n private _sliderBackplateMaterial: MRDLBackplateMaterial;\r\n private _sliderBarMaterial: MRDLSliderBarMaterial;\r\n private _sliderThumbMaterial: MRDLSliderThumbMaterial;\r\n private _sliderThumb: AbstractMesh;\r\n private _sliderBar: AbstractMesh;\r\n private _sliderBackplateVisible: boolean;\r\n\r\n private _minimum: number;\r\n private _maximum: number;\r\n private _value: number;\r\n private _step: number;\r\n\r\n private _draggedPosition: number;\r\n\r\n /** Observable raised when the sldier value changes */\r\n public onValueChangedObservable = new Observable<number>();\r\n\r\n /**\r\n * Creates a new slider\r\n * @param name defines the control name\r\n * @param sliderBackplateVisible defines if the control has a backplate, default is false\r\n */\r\n constructor(name?: string, sliderBackplateVisible?: boolean) {\r\n super(name);\r\n this._sliderBackplateVisible = sliderBackplateVisible || false;\r\n\r\n this._minimum = SLIDER_MIN;\r\n this._maximum = SLIDER_MAX;\r\n this._step = SLIDER_STEP;\r\n this._value = SLIDER_VAL;\r\n }\r\n\r\n /**\r\n * Gets the mesh used to render this control\r\n */\r\n public override get mesh(): Nullable<AbstractMesh> {\r\n if (this.node) {\r\n return this._sliderThumb;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /** Gets or sets minimum value */\r\n public get minimum(): number {\r\n return this._minimum;\r\n }\r\n\r\n public set minimum(value: number) {\r\n if (this._minimum === value) {\r\n return;\r\n }\r\n\r\n this._minimum = Math.max(value, SLIDER_MIN);\r\n this._value = Math.max(Math.min(this._value, this._maximum), this._minimum);\r\n }\r\n\r\n /** Gets or sets maximum value */\r\n public get maximum(): number {\r\n return this._maximum;\r\n }\r\n\r\n public set maximum(value: number) {\r\n if (this._maximum === value) {\r\n return;\r\n }\r\n\r\n this._maximum = Math.max(value, this._minimum);\r\n this._value = Math.max(Math.min(this._value, this._maximum), this._minimum);\r\n }\r\n\r\n /** Gets or sets step value */\r\n public get step(): number {\r\n return this._step;\r\n }\r\n\r\n public set step(value: number) {\r\n if (this._step === value) {\r\n return;\r\n }\r\n\r\n this._step = Math.max(Math.min(value, this._maximum - this._minimum), SLIDER_STEP);\r\n }\r\n\r\n /** Gets or sets current value */\r\n public get value(): number {\r\n return this._value;\r\n }\r\n\r\n public set value(value: number) {\r\n if (this._value === value) {\r\n return;\r\n }\r\n\r\n this._value = Math.max(Math.min(value, this._maximum), this._minimum);\r\n if (this._sliderThumb) {\r\n this._sliderThumb.position.x = this._convertToPosition(this.value);\r\n }\r\n this.onValueChangedObservable.notifyObservers(this._value);\r\n }\r\n\r\n protected get start(): number {\r\n if (!this.node) {\r\n return -SLIDER_SCALING / 2;\r\n }\r\n\r\n return this._sliderBar.position.x - this._sliderBar.scaling.x / 2;\r\n }\r\n\r\n protected get end(): number {\r\n if (!this.node) {\r\n return SLIDER_SCALING / 2;\r\n }\r\n\r\n return this._sliderBar.position.x + this._sliderBar.scaling.x / 2;\r\n }\r\n\r\n /**\r\n * Gets the slider bar material used by this control\r\n */\r\n public get sliderBarMaterial(): MRDLSliderBarMaterial {\r\n return this._sliderBarMaterial;\r\n }\r\n\r\n /**\r\n * Gets the slider thumb material used by this control\r\n */\r\n public get sliderThumbMaterial(): MRDLSliderThumbMaterial {\r\n return this._sliderThumbMaterial;\r\n }\r\n\r\n /**\r\n * Gets the slider backplate material used by this control\r\n */\r\n public get sliderBackplateMaterial(): MRDLBackplateMaterial {\r\n return this._sliderBackplateMaterial;\r\n }\r\n\r\n /**\r\n * Gets the slider bar mesh used by this control\r\n */\r\n public get sliderBar(): AbstractMesh {\r\n return this._sliderBar;\r\n }\r\n\r\n /**\r\n * Gets the slider thumb mesh used by this control\r\n */\r\n public get sliderThumb(): AbstractMesh {\r\n return this._sliderThumb;\r\n }\r\n\r\n /**\r\n * Gets the slider backplate mesh used by this control\r\n */\r\n public get sliderBackplate(): AbstractMesh {\r\n return this._sliderBackplate;\r\n }\r\n\r\n /** Sets a boolean indicating if the control is visible */\r\n public override set isVisible(value: boolean) {\r\n if (this._isVisible === value) {\r\n return;\r\n }\r\n\r\n this._isVisible = value;\r\n\r\n this.node?.setEnabled(value);\r\n }\r\n\r\n // Mesh association\r\n protected override _createNode(scene: Scene): TransformNode {\r\n const sliderBackplate = CreateBox(\r\n `${this.name}_sliderbackplate`,\r\n {\r\n width: 1.0,\r\n height: 1.0,\r\n depth: 1.0,\r\n },\r\n scene\r\n );\r\n sliderBackplate.isPickable = false;\r\n sliderBackplate.visibility = 0;\r\n sliderBackplate.scaling = new Vector3(1, 0.5, 0.8);\r\n const baseUrl = Tools.GetAssetUrl(Slider3D.MODEL_BASE_URL);\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n SceneLoader.ImportMeshAsync(undefined, baseUrl, Slider3D.MODEL_FILENAME, scene).then((result) => {\r\n // make all meshes not pickable. Required meshes' pickable state will be set later.\r\n for (const m of result.meshes) {\r\n m.isPickable = false;\r\n }\r\n const sliderBackplateModel = result.meshes[1];\r\n const sliderBarModel = result.meshes[1].clone(`${this.name}_sliderbar`, sliderBackplate);\r\n const sliderThumbModel = result.meshes[1].clone(`${this.name}_sliderthumb`, sliderBackplate);\r\n sliderBackplateModel.visibility = 0;\r\n\r\n if (this._sliderBackplateVisible) {\r\n sliderBackplateModel.visibility = 1;\r\n sliderBackplateModel.name = `${this.name}_sliderbackplate`;\r\n sliderBackplateModel.scaling.x = 1;\r\n sliderBackplateModel.scaling.z = 0.2;\r\n sliderBackplateModel.parent = sliderBackplate;\r\n if (this._sliderBackplateMaterial) {\r\n sliderBackplateModel.material = this._sliderBackplateMaterial;\r\n }\r\n this._sliderBackplate = sliderBackplateModel;\r\n }\r\n\r\n if (sliderBarModel) {\r\n sliderBarModel.parent = sliderBackplate;\r\n sliderBarModel.position.z = -0.1;\r\n sliderBarModel.scaling = new Vector3(SLIDER_SCALING - SLIDER_MARGIN, 0.04, 0.3);\r\n if (this._sliderBarMaterial) {\r\n sliderBarModel.material = this._sliderBarMaterial;\r\n }\r\n this._sliderBar = sliderBarModel;\r\n }\r\n\r\n if (sliderThumbModel) {\r\n sliderThumbModel.parent = sliderBackplate;\r\n sliderThumbModel.isPickable = true;\r\n sliderThumbModel.position.z = -0.115;\r\n sliderThumbModel.scaling = new Vector3(0.025, 0.3, 0.6);\r\n sliderThumbModel.position.x = this._convertToPosition(this.value);\r\n sliderThumbModel.addBehavior(this._createBehavior());\r\n if (this._sliderThumbMaterial) {\r\n sliderThumbModel.material = this._sliderThumbMaterial;\r\n }\r\n this._sliderThumb = sliderThumbModel;\r\n }\r\n\r\n this._injectGUI3DReservedDataStore(sliderBackplate).control = this;\r\n const meshes = sliderBackplate.getChildMeshes();\r\n for (const mesh of meshes) {\r\n this._injectGUI3DReservedDataStore(mesh).control = this;\r\n }\r\n });\r\n\r\n this._affectMaterial(sliderBackplate);\r\n return sliderBackplate;\r\n }\r\n\r\n protected override _affectMaterial(mesh: AbstractMesh) {\r\n this._sliderBackplateMaterial = this._sliderBackplateMaterial ?? new MRDLBackplateMaterial(`${this.name}_sliderbackplate_material`, mesh.getScene());\r\n this._sliderBarMaterial = this._sliderBarMaterial ?? new MRDLSliderBarMaterial(`${this.name}_sliderbar_material`, mesh.getScene());\r\n this._sliderThumbMaterial = this._sliderThumbMaterial ?? new MRDLSliderThumbMaterial(`${this.name}_sliderthumb_material`, mesh.getScene());\r\n }\r\n\r\n private _createBehavior(): PointerDragBehavior {\r\n const pointerDragBehavior = new PointerDragBehavior({ dragAxis: Vector3.Right() });\r\n pointerDragBehavior.moveAttached = false;\r\n\r\n pointerDragBehavior.onDragStartObservable.add(() => {\r\n this._draggedPosition = this._sliderThumb.position.x;\r\n });\r\n\r\n pointerDragBehavior.onDragObservable.add((event) => {\r\n this._draggedPosition += event.dragDistance / this.scaling.x;\r\n this.value = this._convertToValue(this._draggedPosition);\r\n });\r\n\r\n return pointerDragBehavior;\r\n }\r\n\r\n private _convertToPosition(value: number): number {\r\n const position = ((value - this.minimum) / (this.maximum - this.minimum)) * (this.end - this.start) + this.start;\r\n return Math.min(Math.max(position, this.start), this.end);\r\n }\r\n\r\n private _convertToValue(position: number): number {\r\n let value = ((position - this.start) / (this.end - this.start)) * (this.maximum - this.minimum);\r\n value = this.step ? Math.round(value / this.step) * this.step : value;\r\n\r\n return Math.max(Math.min(this.minimum + value, this._maximum), this._minimum);\r\n }\r\n\r\n /**\r\n * Releases all associated resources\r\n */\r\n public override dispose() {\r\n super.dispose();\r\n this._sliderBar?.dispose();\r\n this._sliderThumb?.dispose();\r\n this._sliderBarMaterial?.dispose();\r\n this._sliderThumbMaterial?.dispose();\r\n this._sliderBackplate?.dispose();\r\n this._sliderBackplateMaterial?.dispose();\r\n }\r\n}\r\n","import { Tools } from \"core/Misc/tools\";\r\nimport { Matrix, TmpVectors, Vector3 } from \"core/Maths/math.vector\";\r\nimport { type float } from \"core/types\";\r\n\r\nimport { VolumeBasedPanel } from \"./volumeBasedPanel\";\r\nimport { type Control3D } from \"./control3D\";\r\nimport { Container3D } from \"./container3D\";\r\nimport { Axis, Space } from \"core/Maths/math.axis\";\r\n\r\n/**\r\n * Class used to create a container panel deployed on the surface of a sphere\r\n */\r\nexport class SpherePanel extends VolumeBasedPanel {\r\n private _radius = 5.0;\r\n\r\n /**\r\n * Gets or sets the radius of the sphere where to project controls (5 by default)\r\n */\r\n public get radius(): float {\r\n return this._radius;\r\n }\r\n\r\n public set radius(value: float) {\r\n if (this._radius === value) {\r\n return;\r\n }\r\n\r\n this._radius = value;\r\n\r\n Tools.SetImmediate(() => {\r\n this._arrangeChildren();\r\n });\r\n }\r\n\r\n protected _mapGridNode(control: Control3D, nodePosition: Vector3) {\r\n const mesh = control.mesh;\r\n\r\n if (!mesh) {\r\n return;\r\n }\r\n\r\n const newPos = this._sphericalMapping(nodePosition);\r\n control.position = newPos;\r\n\r\n switch (this.orientation) {\r\n case Container3D.FACEORIGIN_ORIENTATION:\r\n mesh.lookAt(new Vector3(2 * newPos.x, 2 * newPos.y, 2 * newPos.z));\r\n break;\r\n case Container3D.FACEORIGINREVERSED_ORIENTATION:\r\n mesh.lookAt(new Vector3(-newPos.x, -newPos.y, -newPos.z));\r\n break;\r\n case Container3D.FACEFORWARD_ORIENTATION:\r\n break;\r\n case Container3D.FACEFORWARDREVERSED_ORIENTATION:\r\n mesh.rotate(Axis.Y, Math.PI, Space.LOCAL);\r\n break;\r\n }\r\n }\r\n\r\n private _sphericalMapping(source: Vector3) {\r\n const newPos = new Vector3(0, 0, this._radius);\r\n\r\n const xAngle = source.y / this._radius;\r\n const yAngle = -(source.x / this._radius);\r\n\r\n Matrix.RotationYawPitchRollToRef(yAngle, xAngle, 0, TmpVectors.Matrix[0]);\r\n\r\n return Vector3.TransformNormal(newPos, TmpVectors.Matrix[0]);\r\n }\r\n}\r\n","import { Tools } from \"core/Misc/tools\";\r\nimport { Matrix, TmpVectors, Vector3 } from \"core/Maths/math.vector\";\r\n\r\nimport { Container3D } from \"./container3D\";\r\n\r\n/**\r\n * Class used to create a stack panel in 3D on XY plane\r\n */\r\nexport class StackPanel3D extends Container3D {\r\n private _isVertical = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the stack panel is vertical or horizontal (horizontal by default)\r\n */\r\n public get isVertical(): boolean {\r\n return this._isVertical;\r\n }\r\n\r\n public set isVertical(value: boolean) {\r\n if (this._isVertical === value) {\r\n return;\r\n }\r\n\r\n this._isVertical = value;\r\n\r\n Tools.SetImmediate(() => {\r\n this._arrangeChildren();\r\n });\r\n }\r\n\r\n /**\r\n * Gets or sets the distance between elements\r\n */\r\n public margin = 0.1;\r\n\r\n /**\r\n * Creates new StackPanel\r\n * @param isVertical\r\n */\r\n public constructor(isVertical = false) {\r\n super();\r\n\r\n this._isVertical = isVertical;\r\n }\r\n\r\n protected override _arrangeChildren() {\r\n let width = 0;\r\n let height = 0;\r\n let controlCount = 0;\r\n const extendSizes = [];\r\n\r\n const currentInverseWorld = Matrix.Invert(this.node!.computeWorldMatrix(true));\r\n\r\n // Measure\r\n for (const child of this._children) {\r\n if (!child.mesh) {\r\n continue;\r\n }\r\n\r\n controlCount++;\r\n child.mesh.computeWorldMatrix(true);\r\n child.mesh.getWorldMatrix().multiplyToRef(currentInverseWorld, TmpVectors.Matrix[0]);\r\n\r\n const boundingBox = child.mesh.getBoundingInfo().boundingBox;\r\n const extendSize = Vector3.TransformNormal(boundingBox.extendSize, TmpVectors.Matrix[0]);\r\n extendSizes.push(extendSize);\r\n\r\n if (this._isVertical) {\r\n height += extendSize.y;\r\n } else {\r\n width += extendSize.x;\r\n }\r\n }\r\n\r\n if (this._isVertical) {\r\n height += ((controlCount - 1) * this.margin) / 2;\r\n } else {\r\n width += ((controlCount - 1) * this.margin) / 2;\r\n }\r\n\r\n // Arrange\r\n let offset: number;\r\n if (this._isVertical) {\r\n offset = -height;\r\n } else {\r\n offset = -width;\r\n }\r\n\r\n let index = 0;\r\n for (const child of this._children) {\r\n if (!child.mesh) {\r\n continue;\r\n }\r\n controlCount--;\r\n const extendSize = extendSizes[index++];\r\n\r\n if (this._isVertical) {\r\n child.position.y = offset + extendSize.y;\r\n child.position.x = 0;\r\n offset += extendSize.y * 2;\r\n } else {\r\n child.position.x = offset + extendSize.x;\r\n child.position.y = 0;\r\n offset += extendSize.x * 2;\r\n }\r\n\r\n offset += controlCount > 0 ? this.margin : 0;\r\n }\r\n }\r\n}\r\n","import { type TransformNode } from \"core/Meshes/transformNode\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\n\r\nimport { TouchButton3D } from \"./touchButton3D\";\r\n\r\n/**\r\n * Class used to create an interactable object. It's a touchable 3D button using a mesh coming from the current scene\r\n * @since 5.0.0\r\n */\r\nexport class TouchMeshButton3D extends TouchButton3D {\r\n /** @internal */\r\n protected _currentMesh: Mesh;\r\n\r\n /**\r\n * Creates a new 3D button based on a mesh\r\n * @param mesh mesh to become a 3D button. By default this is also the mesh for near interaction collision checking\r\n * @param name defines the control name\r\n */\r\n constructor(mesh: Mesh, name?: string) {\r\n super(name, mesh);\r\n\r\n this._currentMesh = mesh;\r\n\r\n /**\r\n * Provides a default behavior on hover/out & up/down\r\n * Override those function to create your own desired behavior specific to your mesh\r\n */\r\n this.pointerEnterAnimation = () => {\r\n if (!this.mesh) {\r\n return;\r\n }\r\n this.mesh.scaling.scaleInPlace(1.1);\r\n };\r\n\r\n this.pointerOutAnimation = () => {\r\n if (!this.mesh) {\r\n return;\r\n }\r\n this.mesh.scaling.scaleInPlace(1.0 / 1.1);\r\n };\r\n\r\n this.pointerDownAnimation = () => {\r\n if (!this.mesh) {\r\n return;\r\n }\r\n this.mesh.scaling.scaleInPlace(0.95);\r\n };\r\n\r\n this.pointerUpAnimation = () => {\r\n if (!this.mesh) {\r\n return;\r\n }\r\n this.mesh.scaling.scaleInPlace(1.0 / 0.95);\r\n };\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"TouchMeshButton3D\";\r\n }\r\n\r\n // Mesh association\r\n protected override _createNode(): TransformNode {\r\n const meshes = this._currentMesh.getChildMeshes();\r\n\r\n for (const mesh of meshes) {\r\n this._injectGUI3DReservedDataStore(mesh).control = this;\r\n }\r\n\r\n return this._currentMesh;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected override _affectMaterial(mesh: AbstractMesh) {}\r\n}\r\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"mrdlBackglowPixelShader\";\nconst shader = `uniform vec3 cameraPosition;varying vec3 vNormal;varying vec2 vUV;uniform float _Bevel_Radius_;uniform float _Line_Width_;uniform bool _Absolute_Sizes_;uniform float _Tuning_Motion_;uniform float _Motion_;uniform float _Max_Intensity_;uniform float _Intensity_Fade_In_Exponent_;uniform float _Outer_Fuzz_Start_;uniform float _Outer_Fuzz_End_;uniform vec4 _Color_;uniform vec4 _Inner_Color_;uniform float _Blend_Exponent_;uniform float _Falloff_;uniform float _Bias_;float BiasFunc(float b,float v) {return pow(v,log(clamp(b,0.001,0.999))/log(0.5));}\nvoid Fuzzy_Round_Rect_B33(\nfloat Size_X,\nfloat Size_Y,\nfloat Radius_X,\nfloat Radius_Y,\nfloat Line_Width,\nvec2 UV,\nfloat Outer_Fuzz,\nfloat Max_Outer_Fuzz,\nout float Rect_Distance,\nout float Inner_Distance)\n{vec2 halfSize=vec2(Size_X,Size_Y)*0.5;vec2 r=max(min(vec2(Radius_X,Radius_Y),halfSize),vec2(0.001,0.001));float radius=min(r.x,r.y)-Max_Outer_Fuzz;vec2 v=abs(UV);vec2 nearestp=min(v,halfSize-r);float d=distance(nearestp,v);Inner_Distance=clamp(1.0-(radius-d)/Line_Width,0.0,1.0);Rect_Distance=clamp(1.0-(d-radius)/Outer_Fuzz,0.0,1.0)*Inner_Distance;}\nvoid main()\n{float X_Q42;float Y_Q42;X_Q42=vNormal.x;Y_Q42=vNormal.y;float MaxAB_Q24=max(_Tuning_Motion_,_Motion_);float Sqrt_F_Q27=sqrt(MaxAB_Q24);float Power_Q43=pow(MaxAB_Q24,_Intensity_Fade_In_Exponent_);float Value_At_T_Q26=mix(_Outer_Fuzz_Start_,_Outer_Fuzz_End_,Sqrt_F_Q27);float Product_Q23=_Max_Intensity_*Power_Q43;float Rect_Distance_Q33;float Inner_Distance_Q33;Fuzzy_Round_Rect_B33(X_Q42,Y_Q42,_Bevel_Radius_,_Bevel_Radius_,_Line_Width_,vUV,Value_At_T_Q26,_Outer_Fuzz_Start_,Rect_Distance_Q33,Inner_Distance_Q33);float Power_Q44=pow(Inner_Distance_Q33,_Blend_Exponent_);float Result_Q45=pow(BiasFunc(_Bias_,Rect_Distance_Q33),_Falloff_);vec4 Color_At_T_Q25=mix(_Inner_Color_,_Color_,Power_Q44);float Product_Q22=Result_Q45*Product_Q23;vec4 Result_Q28=Product_Q22*Color_At_T_Q25;vec4 Out_Color=Result_Q28;float Clip_Threshold=0.0;gl_FragColor=Out_Color;}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const mrdlBackglowPixelShader = { name, shader };\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"mrdlBackglowVertexShader\";\nconst shader = `uniform mat4 world;uniform mat4 viewProjection;uniform vec3 cameraPosition;attribute vec3 position;attribute vec3 normal;attribute vec2 uv;attribute vec3 tangent;uniform float _Bevel_Radius_;uniform float _Line_Width_;uniform bool _Absolute_Sizes_;uniform float _Tuning_Motion_;uniform float _Motion_;uniform float _Max_Intensity_;uniform float _Intensity_Fade_In_Exponent_;uniform float _Outer_Fuzz_Start_;uniform float _Outer_Fuzz_End_;uniform vec4 _Color_;uniform vec4 _Inner_Color_;uniform float _Blend_Exponent_;uniform float _Falloff_;uniform float _Bias_;varying vec3 vNormal;varying vec2 vUV;void main()\n{vec3 Dir_World_Q41=(world*vec4(tangent,0.0)).xyz;vec3 Dir_World_Q40=(world*vec4((cross(normal,tangent)),0.0)).xyz;float MaxAB_Q24=max(_Tuning_Motion_,_Motion_);float Length_Q16=length(Dir_World_Q41);float Length_Q17=length(Dir_World_Q40);bool Greater_Than_Q37=MaxAB_Q24>0.0;vec3 Sizes_Q35;vec2 XY_Q35;Sizes_Q35=(_Absolute_Sizes_ ? vec3(Length_Q16,Length_Q17,0) : vec3(Length_Q16/Length_Q17,1,0));XY_Q35=(uv-vec2(0.5,0.5))*Sizes_Q35.xy;vec3 Result_Q38=Greater_Than_Q37 ? position : vec3(0,0,0);vec3 Pos_World_Q39=(world*vec4(Result_Q38,1.0)).xyz;vec3 Position=Pos_World_Q39;vec3 Normal=Sizes_Q35;vec2 UV=XY_Q35;vec3 Tangent=vec3(0,0,0);vec3 Binormal=vec3(0,0,0);vec4 Color=vec4(1,1,1,1);gl_Position=viewProjection*vec4(Position,1);vNormal=Normal;vUV=UV;}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const mrdlBackglowVertexShader = { name, shader };\n","import { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { type IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { type IEffectCreationOptions } from \"core/Materials/effect\";\r\nimport { type Matrix } from \"core/Maths/math.vector\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type SubMesh } from \"core/Meshes/subMesh\";\r\n\r\nimport { Color4 } from \"core/Maths/math.color\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { EffectFallbacks } from \"core/Materials/effectFallbacks\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { PushMaterial } from \"core/Materials/pushMaterial\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { SerializationHelper } from \"core/Misc/decorators.serialization\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\n\r\nimport \"./shaders/mrdlBackglow.fragment\";\r\nimport \"./shaders/mrdlBackglow.vertex\";\r\nimport { HandleFallbacksForShadows, PrepareAttributesForInstances, PrepareDefinesForAttributes, PrepareUniformsAndSamplersList } from \"core/Materials/materialHelper.functions\";\r\n\r\n/** @hidden */\r\nclass MRDLBackglowMaterialDefines extends MaterialDefines {\r\n constructor() {\r\n super();\r\n this._needNormals = true;\r\n this._needUVs = true;\r\n this.rebuild();\r\n }\r\n}\r\n\r\nexport class MRDLBackglowMaterial extends PushMaterial {\r\n /**\r\n * Gets or sets the bevel radius on the backglow. If this value is changed, update the lineWidth to match.\r\n */\r\n @serialize()\r\n public bevelRadius = 0.16;\r\n\r\n /**\r\n * Gets or sets the line width of the backglow.\r\n */\r\n @serialize()\r\n public lineWidth = 0.16;\r\n\r\n /**\r\n * Gets or sets whether to use absolute sizes when calculating effects on the backglow.\r\n * Since desktop and VR/AR have different relative sizes, it's usually best to keep this false.\r\n */\r\n @serialize()\r\n public absoluteSizes = false;\r\n\r\n /**\r\n * Gets or sets the tuning motion of the backglow.\r\n */\r\n @serialize()\r\n public tuningMotion = 0.0;\r\n\r\n /**\r\n * Gets or sets the motion of the backglow.\r\n */\r\n @serialize()\r\n public motion = 1.0;\r\n\r\n /**\r\n * Gets or sets the maximum intensity of the backglow.\r\n */\r\n @serialize()\r\n public maxIntensity = 0.7;\r\n\r\n /**\r\n * Gets or sets the fade-in exponent of the intensity of the backglow.\r\n */\r\n @serialize()\r\n public intensityFadeInExponent = 2.0;\r\n\r\n /**\r\n * Gets or sets the start of the outer fuzz effect on the backglow.\r\n */\r\n @serialize()\r\n public outerFuzzStart = 0.04;\r\n\r\n /**\r\n * Gets or sets the end of the outer fuzz effect on the backglow.\r\n */\r\n @serialize()\r\n public outerFuzzEnd = 0.04;\r\n\r\n /**\r\n * Gets or sets the color of the backglow.\r\n */\r\n @serialize()\r\n public color: Color4 = new Color4(0.682353, 0.698039, 1, 1);\r\n\r\n /**\r\n * Gets or sets the inner color of the backglow.\r\n */\r\n @serialize()\r\n public innerColor: Color4 = new Color4(0.356863, 0.392157, 0.796078, 1);\r\n\r\n /**\r\n * Gets or sets the blend exponent of the backglow.\r\n */\r\n @serialize()\r\n public blendExponent = 1.5;\r\n\r\n /**\r\n * Gets or sets the falloff of the backglow.\r\n */\r\n @serialize()\r\n public falloff = 2.0;\r\n\r\n /**\r\n * Gets or sets the bias of the backglow.\r\n */\r\n @serialize()\r\n public bias = 0.5;\r\n\r\n constructor(name: string, scene: Scene) {\r\n super(name, scene);\r\n this.alphaMode = Constants.ALPHA_ADD;\r\n this.disableDepthWrite = true;\r\n this.backFaceCulling = false;\r\n }\r\n\r\n public override needAlphaBlending(): boolean {\r\n return true;\r\n }\r\n\r\n public override needAlphaTesting(): boolean {\r\n return false;\r\n }\r\n\r\n public override getAlphaTestTexture(): Nullable<BaseTexture> {\r\n return null;\r\n }\r\n\r\n // Methods\r\n public override isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n const drawWrapper = subMesh._drawWrapper;\r\n\r\n if (this.isFrozen) {\r\n if (drawWrapper.effect && drawWrapper._wasPreviouslyReady) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n subMesh.materialDefines = new MRDLBackglowMaterialDefines();\r\n }\r\n\r\n const defines = <MRDLBackglowMaterialDefines>subMesh.materialDefines;\r\n const scene = this.getScene();\r\n\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n // Attribs\r\n PrepareDefinesForAttributes(mesh, defines, false, false);\r\n\r\n // Get correct effect\r\n if (defines.isDirty) {\r\n defines.markAsProcessed();\r\n\r\n scene.resetCachedMaterial();\r\n\r\n // Fallbacks\r\n const fallbacks = new EffectFallbacks();\r\n if (defines.FOG) {\r\n fallbacks.addFallback(1, \"FOG\");\r\n }\r\n\r\n HandleFallbacksForShadows(defines, fallbacks);\r\n\r\n defines.IMAGEPROCESSINGPOSTPROCESS = scene.imageProcessingConfiguration.applyByPostProcess;\r\n\r\n //Attributes\r\n const attribs = [VertexBuffer.PositionKind];\r\n\r\n if (defines.NORMAL) {\r\n attribs.push(VertexBuffer.NormalKind);\r\n }\r\n\r\n if (defines.UV1) {\r\n attribs.push(VertexBuffer.UVKind);\r\n }\r\n\r\n if (defines.UV2) {\r\n attribs.push(VertexBuffer.UV2Kind);\r\n }\r\n\r\n if (defines.VERTEXCOLOR) {\r\n attribs.push(VertexBuffer.ColorKind);\r\n }\r\n\r\n if (defines.TANGENT) {\r\n attribs.push(VertexBuffer.TangentKind);\r\n }\r\n\r\n PrepareAttributesForInstances(attribs, defines);\r\n\r\n // Legacy browser patch\r\n const shaderName = \"mrdlBackglow\";\r\n const join = defines.toString();\r\n\r\n const uniforms = [\r\n \"world\",\r\n \"worldView\",\r\n \"worldViewProjection\",\r\n \"view\",\r\n \"projection\",\r\n \"viewProjection\",\r\n \"cameraPosition\",\r\n \"_Bevel_Radius_\",\r\n \"_Line_Width_\",\r\n \"_Absolute_Sizes_\",\r\n \"_Tuning_Motion_\",\r\n \"_Motion_\",\r\n \"_Max_Intensity_\",\r\n \"_Intensity_Fade_In_Exponent_\",\r\n \"_Outer_Fuzz_Start_\",\r\n \"_Outer_Fuzz_End_\",\r\n \"_Color_\",\r\n \"_Inner_Color_\",\r\n \"_Blend_Exponent_\",\r\n \"_Falloff_\",\r\n \"_Bias_\",\r\n ];\r\n const samplers: string[] = [];\r\n const uniformBuffers: string[] = [];\r\n\r\n PrepareUniformsAndSamplersList(<IEffectCreationOptions>{\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: defines,\r\n maxSimultaneousLights: 4,\r\n });\r\n\r\n subMesh.setEffect(\r\n scene.getEngine().createEffect(\r\n shaderName,\r\n <IEffectCreationOptions>{\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: join,\r\n fallbacks: fallbacks,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n indexParameters: { maxSimultaneousLights: 4 },\r\n },\r\n engine\r\n ),\r\n defines\r\n );\r\n }\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n\r\n return true;\r\n }\r\n\r\n public override bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const scene = this.getScene();\r\n\r\n const defines = <MRDLBackglowMaterialDefines>subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n\r\n this._activeEffect = effect;\r\n\r\n // Matrices\r\n this.bindOnlyWorldMatrix(world);\r\n this._activeEffect.setMatrix(\"viewProjection\", scene.getTransformMatrix());\r\n this._activeEffect.setVector3(\"cameraPosition\", scene.activeCamera!.position);\r\n\r\n // \"Rounded Rectangle\"\r\n this._activeEffect.setFloat(\"_Bevel_Radius_\", this.bevelRadius);\r\n this._activeEffect.setFloat(\"_Line_Width_\", this.lineWidth);\r\n this._activeEffect.setFloat(\"_Absolute_Sizes_\", this.absoluteSizes ? 1.0 : 0.0);\r\n\r\n // \"Animation\"\r\n this._activeEffect.setFloat(\"_Tuning_Motion_\", this.tuningMotion);\r\n this._activeEffect.setFloat(\"_Motion_\", this.motion);\r\n this._activeEffect.setFloat(\"_Max_Intensity_\", this.maxIntensity);\r\n this._activeEffect.setFloat(\"_Intensity_Fade_In_Exponent_\", this.intensityFadeInExponent);\r\n this._activeEffect.setFloat(\"_Outer_Fuzz_Start_\", this.outerFuzzStart);\r\n this._activeEffect.setFloat(\"_Outer_Fuzz_End_\", this.outerFuzzEnd);\r\n\r\n // \"Color\"\r\n this._activeEffect.setDirectColor4(\"_Color_\", this.color);\r\n this._activeEffect.setDirectColor4(\"_Inner_Color_\", this.innerColor);\r\n this._activeEffect.setFloat(\"_Blend_Exponent_\", this.blendExponent);\r\n\r\n // \"Inner Transition\"\r\n this._activeEffect.setFloat(\"_Falloff_\", this.falloff);\r\n this._activeEffect.setFloat(\"_Bias_\", this.bias);\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n /**\r\n * Get the list of animatables in the material.\r\n * @returns the list of animatables object used in the material\r\n */\r\n public override getAnimatables(): IAnimatable[] {\r\n return [];\r\n }\r\n\r\n public override dispose(forceDisposeEffect?: boolean): void {\r\n super.dispose(forceDisposeEffect);\r\n }\r\n\r\n public override clone(name: string): MRDLBackglowMaterial {\r\n return SerializationHelper.Clone(() => new MRDLBackglowMaterial(name, this.getScene()), this);\r\n }\r\n\r\n public override serialize(): unknown {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n serializationObject.customType = \"BABYLON.MRDLBackglowMaterial\";\r\n return serializationObject;\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"MRDLBackglowMaterial\";\r\n }\r\n\r\n // Statics\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): MRDLBackglowMaterial {\r\n return SerializationHelper.Parse(() => new MRDLBackglowMaterial(source.name, scene), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GUI.MRDLBackglowMaterial\", MRDLBackglowMaterial);\r\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"mrdlFrontplatePixelShader\";\nconst shader = `uniform vec3 cameraPosition;varying vec3 vNormal;varying vec2 vUV;varying vec3 vTangent;varying vec4 vExtra1;varying vec4 vExtra2;varying vec4 vExtra3;uniform float _Radius_;uniform float _Line_Width_;uniform bool _Relative_To_Height_;uniform float _Filter_Width_;uniform vec4 _Edge_Color_;uniform float _Fade_Out_;uniform bool _Smooth_Edges_;uniform bool _Blob_Enable_;uniform vec3 _Blob_Position_;uniform float _Blob_Intensity_;uniform float _Blob_Near_Size_;uniform float _Blob_Far_Size_;uniform float _Blob_Near_Distance_;uniform float _Blob_Far_Distance_;uniform float _Blob_Fade_Length_;uniform float _Blob_Inner_Fade_;uniform float _Blob_Pulse_;uniform float _Blob_Fade_;uniform float _Blob_Pulse_Max_Size_;uniform bool _Blob_Enable_2_;uniform vec3 _Blob_Position_2_;uniform float _Blob_Near_Size_2_;uniform float _Blob_Inner_Fade_2_;uniform float _Blob_Pulse_2_;uniform float _Blob_Fade_2_;uniform float _Gaze_Intensity_;uniform float _Gaze_Focus_;uniform sampler2D _Blob_Texture_;uniform float _Selection_Fuzz_;uniform float _Selected_;uniform float _Selection_Fade_;uniform float _Selection_Fade_Size_;uniform float _Selected_Distance_;uniform float _Selected_Fade_Length_;uniform float _Proximity_Max_Intensity_;uniform float _Proximity_Far_Distance_;uniform float _Proximity_Near_Radius_;uniform float _Proximity_Anisotropy_;uniform bool _Use_Global_Left_Index_;uniform bool _Use_Global_Right_Index_;uniform vec4 Global_Left_Index_Tip_Position;uniform vec4 Global_Right_Index_Tip_Position;void Scale_Color_B54(\nvec4 Color,\nfloat Scalar,\nout vec4 Result)\n{Result=Scalar*Color;}\nvoid Scale_RGB_B50(\nvec4 Color,\nfloat Scalar,\nout vec4 Result)\n{Result=vec4(Scalar,Scalar,Scalar,1)*Color;}\nvoid Proximity_Fragment_B51(\nfloat Proximity_Max_Intensity,\nfloat Proximity_Near_Radius,\nvec4 Deltas,\nfloat Show_Selection,\nfloat Distance_Fade1,\nfloat Distance_Fade2,\nfloat Strength,\nout float Proximity)\n{float proximity1=(1.0-clamp(length(Deltas.xy)/Proximity_Near_Radius,0.0,1.0))*Distance_Fade1;float proximity2=(1.0-clamp(length(Deltas.zw)/Proximity_Near_Radius,0.0,1.0))*Distance_Fade2;Proximity=Strength*(Proximity_Max_Intensity*max(proximity1,proximity2) *(1.0-Show_Selection)+Show_Selection);}\nvoid Blob_Fragment_B56(\nvec2 UV,\nvec3 Blob_Info,\nsampler2D Blob_Texture,\nout vec4 Blob_Color)\n{float k=dot(UV,UV);Blob_Color=Blob_Info.y*texture(Blob_Texture,vec2(vec2(sqrt(k),Blob_Info.x).x,1.0-vec2(sqrt(k),Blob_Info.x).y))*(1.0-clamp(k,0.0,1.0));}\nvoid Round_Rect_Fragment_B61(\nfloat Radius,\nvec4 Line_Color,\nfloat Filter_Width,\nfloat Line_Visibility,\nvec4 Fill_Color,\nbool Smooth_Edges,\nvec4 Rect_Parms,\nout float Inside_Rect)\n{float d=length(max(abs(Rect_Parms.zw)-Rect_Parms.xy,0.0));float dx=max(fwidth(d)*Filter_Width,0.00001);Inside_Rect=Smooth_Edges ? clamp((Radius-d)/dx,0.0,1.0) : 1.0-step(Radius,d);}\nvoid main()\n{float Is_Quad_Q53;Is_Quad_Q53=vNormal.z;vec4 Blob_Color_Q56;Blob_Fragment_B56(vUV,vTangent,_Blob_Texture_,Blob_Color_Q56);float X_Q52;float Y_Q52;float Z_Q52;float W_Q52;X_Q52=vExtra3.x;Y_Q52=vExtra3.y;Z_Q52=vExtra3.z;W_Q52=vExtra3.w;float Proximity_Q51;Proximity_Fragment_B51(_Proximity_Max_Intensity_,_Proximity_Near_Radius_,vExtra2,X_Q52,Y_Q52,Z_Q52,1.0,Proximity_Q51);float Inside_Rect_Q61;Round_Rect_Fragment_B61(W_Q52,vec4(1,1,1,1),_Filter_Width_,1.0,vec4(0,0,0,0),_Smooth_Edges_,vExtra1,Inside_Rect_Q61);vec4 Result_Q50;Scale_RGB_B50(_Edge_Color_,Proximity_Q51,Result_Q50);vec4 Result_Q47=Inside_Rect_Q61*Blob_Color_Q56;vec4 Color_At_T_Q48=mix(Result_Q50,Result_Q47,Is_Quad_Q53);vec4 Result_Q54;Scale_Color_B54(Color_At_T_Q48,_Fade_Out_,Result_Q54);vec4 Out_Color=Result_Q54;float Clip_Threshold=0.001;bool To_sRGB=false;gl_FragColor=Out_Color;}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const mrdlFrontplatePixelShader = { name, shader };\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"mrdlFrontplateVertexShader\";\nconst shader = `uniform mat4 world;uniform mat4 viewProjection;uniform vec3 cameraPosition;attribute vec3 position;attribute vec3 normal;attribute vec2 uv;attribute vec3 tangent;attribute vec4 color;uniform float _Radius_;uniform float _Line_Width_;uniform bool _Relative_To_Height_;uniform float _Filter_Width_;uniform vec4 _Edge_Color_;uniform float _Fade_Out_;uniform bool _Smooth_Edges_;uniform bool _Blob_Enable_;uniform vec3 _Blob_Position_;uniform float _Blob_Intensity_;uniform float _Blob_Near_Size_;uniform float _Blob_Far_Size_;uniform float _Blob_Near_Distance_;uniform float _Blob_Far_Distance_;uniform float _Blob_Fade_Length_;uniform float _Blob_Inner_Fade_;uniform float _Blob_Pulse_;uniform float _Blob_Fade_;uniform float _Blob_Pulse_Max_Size_;uniform bool _Blob_Enable_2_;uniform vec3 _Blob_Position_2_;uniform float _Blob_Near_Size_2_;uniform float _Blob_Inner_Fade_2_;uniform float _Blob_Pulse_2_;uniform float _Blob_Fade_2_;uniform float _Gaze_Intensity_;uniform float _Gaze_Focus_;uniform sampler2D _Blob_Texture_;uniform float _Selection_Fuzz_;uniform float _Selected_;uniform float _Selection_Fade_;uniform float _Selection_Fade_Size_;uniform float _Selected_Distance_;uniform float _Selected_Fade_Length_;uniform float _Proximity_Max_Intensity_;uniform float _Proximity_Far_Distance_;uniform float _Proximity_Near_Radius_;uniform float _Proximity_Anisotropy_;uniform bool _Use_Global_Left_Index_;uniform bool _Use_Global_Right_Index_;uniform vec4 Global_Left_Index_Tip_Position;uniform vec4 Global_Right_Index_Tip_Position;varying vec3 vNormal;varying vec2 vUV;varying vec3 vTangent;varying vec4 vExtra1;varying vec4 vExtra2;varying vec4 vExtra3;void Blob_Vertex_B40(\nvec3 Position,\nvec3 Normal,\nvec3 Tangent,\nvec3 Bitangent,\nvec3 Blob_Position,\nfloat Intensity,\nfloat Blob_Near_Size,\nfloat Blob_Far_Size,\nfloat Blob_Near_Distance,\nfloat Blob_Far_Distance,\nvec4 Vx_Color,\nvec2 UV,\nvec3 Face_Center,\nvec2 Face_Size,\nvec2 In_UV,\nfloat Blob_Fade_Length,\nfloat Selection_Fade,\nfloat Selection_Fade_Size,\nfloat Inner_Fade,\nfloat Blob_Pulse,\nfloat Blob_Fade,\nfloat Blob_Enabled,\nfloat DistanceOffset,\nout vec3 Out_Position,\nout vec2 Out_UV,\nout vec3 Blob_Info,\nout vec2 Blob_Relative_UV)\n{float blobSize,fadeIn;vec3 Hit_Position;Blob_Info=vec3(0.0,0.0,0.0);float Hit_Distance=dot(Blob_Position-Face_Center,Normal)+DistanceOffset*Blob_Far_Distance;Hit_Position=Blob_Position-Hit_Distance*Normal;float absD=abs(Hit_Distance);float lerpVal=clamp((absD-Blob_Near_Distance)/(Blob_Far_Distance-Blob_Near_Distance),0.0,1.0);fadeIn=1.0-clamp((absD-Blob_Far_Distance)/Blob_Fade_Length,0.0,1.0);float innerFade=1.0-clamp(-Hit_Distance/Inner_Fade,0.0,1.0);float farClip=clamp(1.0-step(Blob_Far_Distance+Blob_Fade_Length,absD),0.0,1.0);float size=mix(Blob_Near_Size,Blob_Far_Size,lerpVal)*farClip;blobSize=mix(size,Selection_Fade_Size,Selection_Fade)*innerFade*Blob_Enabled;Blob_Info.x=lerpVal*0.5+0.5;Blob_Info.y=fadeIn*Intensity*(1.0-Selection_Fade)*Blob_Fade;Blob_Info.x*=(1.0-Blob_Pulse);vec3 delta=Hit_Position-Face_Center;vec2 blobCenterXY=vec2(dot(delta,Tangent),dot(delta,Bitangent));vec2 quadUVin=2.0*UV-1.0; \nvec2 blobXY=blobCenterXY+quadUVin*blobSize;vec2 blobClipped=clamp(blobXY,-Face_Size*0.5,Face_Size*0.5);vec2 blobUV=(blobClipped-blobCenterXY)/max(blobSize,0.0001)*2.0;vec3 blobCorner=Face_Center+blobClipped.x*Tangent+blobClipped.y*Bitangent;Out_Position=mix(Position,blobCorner,Vx_Color.rrr);Out_UV=mix(In_UV,blobUV,Vx_Color.rr);Blob_Relative_UV=blobClipped/Face_Size.y;}\nvoid Round_Rect_Vertex_B36(\nvec2 UV,\nvec3 Tangent,\nvec3 Binormal,\nfloat Radius,\nfloat Anisotropy,\nvec2 Blob_Center_UV,\nout vec2 Rect_UV,\nout vec2 Scale_XY,\nout vec4 Rect_Parms)\n{Scale_XY=vec2(Anisotropy,1.0);Rect_UV=(UV-vec2(0.5,0.5))*Scale_XY;Rect_Parms.xy=Scale_XY*0.5-vec2(Radius,Radius);Rect_Parms.zw=Blob_Center_UV;}\nvec2 ProjectProximity(\nvec3 blobPosition,\nvec3 position,\nvec3 center,\nvec3 dir,\nvec3 xdir,\nvec3 ydir,\nout float vdistance\n)\n{vec3 delta=blobPosition-position;vec2 xy=vec2(dot(delta,xdir),dot(delta,ydir));vdistance=abs(dot(delta,dir));return xy;}\nvoid Proximity_Vertex_B33(\nvec3 Blob_Position,\nvec3 Blob_Position_2,\nvec3 Face_Center,\nvec3 Position,\nfloat Proximity_Far_Distance,\nfloat Relative_Scale,\nfloat Proximity_Anisotropy,\nvec3 Normal,\nvec3 Tangent,\nvec3 Binormal,\nout vec4 Extra,\nout float Distance_To_Face,\nout float Distance_Fade1,\nout float Distance_Fade2)\n{float distz1,distz2;Extra.xy=ProjectProximity(Blob_Position,Position,Face_Center,Normal,Tangent*Proximity_Anisotropy,Binormal,distz1)/Relative_Scale;Extra.zw=ProjectProximity(Blob_Position_2,Position,Face_Center,Normal,Tangent*Proximity_Anisotropy,Binormal,distz2)/Relative_Scale;Distance_To_Face=dot(Normal,Position-Face_Center);Distance_Fade1=1.0-clamp(distz1/Proximity_Far_Distance,0.0,1.0);Distance_Fade2=1.0-clamp(distz2/Proximity_Far_Distance,0.0,1.0);}\nvoid Object_To_World_Pos_B12(\nvec3 Pos_Object,\nout vec3 Pos_World)\n{Pos_World=(world*vec4(Pos_Object,1.0)).xyz;}\nvoid Choose_Blob_B27(\nvec4 Vx_Color,\nvec3 Position1,\nvec3 Position2,\nbool Blob_Enable_1,\nbool Blob_Enable_2,\nfloat Near_Size_1,\nfloat Near_Size_2,\nfloat Blob_Inner_Fade_1,\nfloat Blob_Inner_Fade_2,\nfloat Blob_Pulse_1,\nfloat Blob_Pulse_2,\nfloat Blob_Fade_1,\nfloat Blob_Fade_2,\nout vec3 Position,\nout float Near_Size,\nout float Inner_Fade,\nout float Blob_Enable,\nout float Fade,\nout float Pulse)\n{Position=Position1*(1.0-Vx_Color.g)+Vx_Color.g*Position2;float b1=Blob_Enable_1 ? 1.0 : 0.0;float b2=Blob_Enable_2 ? 1.0 : 0.0;Blob_Enable=b1+(b2-b1)*Vx_Color.g;Pulse=Blob_Pulse_1*(1.0-Vx_Color.g)+Vx_Color.g*Blob_Pulse_2;Fade=Blob_Fade_1*(1.0-Vx_Color.g)+Vx_Color.g*Blob_Fade_2;Near_Size=Near_Size_1*(1.0-Vx_Color.g)+Vx_Color.g*Near_Size_2;Inner_Fade=Blob_Inner_Fade_1*(1.0-Vx_Color.g)+Vx_Color.g*Blob_Inner_Fade_2;}\nvoid Move_Verts_B32(\nvec2 UV,\nfloat Radius,\nfloat Anisotropy,\nfloat Line_Width,\nfloat Visible,\nout vec3 New_P,\nout vec2 New_UV)\n{vec2 xy=2.0*UV-vec2(0.5,0.5);vec2 center=clamp(xy,0.0,1.0);vec2 delta=2.0*(xy-center);float deltaLength=length(delta);vec2 aniso=vec2(1.0/Anisotropy,1.0);center=(center-vec2(0.5,0.5))*(1.0-2.0*Radius*aniso);New_UV=vec2((2.0-2.0*deltaLength)*Visible,0.0);float deltaRadius= (Radius-Line_Width*New_UV.x);New_P.xy=(center+deltaRadius/deltaLength *aniso*delta);New_P.z=0.0;}\nvoid Object_To_World_Dir_B14(\nvec3 Dir_Object,\nout vec3 Binormal_World)\n{Binormal_World=(world*vec4(Dir_Object,0.0)).xyz;}\nvoid Proximity_Visibility_B55(\nfloat Selection,\nvec3 Proximity_Center,\nvec3 Proximity_Center_2,\nfloat Proximity_Far_Distance,\nfloat Proximity_Radius,\nvec3 Face_Center,\nvec3 Normal,\nvec2 Face_Size,\nfloat Gaze,\nout float Width)\n{float boxMaxSize=length(Face_Size)*0.5;float d1=dot(Proximity_Center-Face_Center,Normal);vec3 blob1=Proximity_Center-d1*Normal;float d2=dot(Proximity_Center_2-Face_Center,Normal);vec3 blob2=Proximity_Center_2-d2*Normal;vec3 delta1=blob1-Face_Center;vec3 delta2=blob2-Face_Center;float dist1=dot(delta1,delta1);float dist2=dot(delta2,delta2);float nearestProxDist=sqrt(min(dist1,dist2));Width=(1.0-step(boxMaxSize+Proximity_Radius,nearestProxDist))*(1.0-step(Proximity_Far_Distance,min(d1,d2))*(1.0-step(0.0001,Selection)));Width=max(Gaze,Width);}\nvec2 ramp2(vec2 start,vec2 end,vec2 x)\n{return clamp((x-start)/(end-start),vec2(0.0,0.0),vec2(1.0,1.0));}\nfloat computeSelection(\nvec3 blobPosition,\nvec3 normal,\nvec3 tangent,\nvec3 bitangent,\nvec3 faceCenter,\nvec2 faceSize,\nfloat selectionFuzz,\nfloat farDistance,\nfloat fadeLength\n)\n{vec3 delta=blobPosition-faceCenter;float absD=abs(dot(delta,normal));float fadeIn=1.0-clamp((absD-farDistance)/fadeLength,0.0,1.0);vec2 blobCenterXY=vec2(dot(delta,tangent),dot(delta,bitangent));vec2 innerFace=faceSize*(1.0-selectionFuzz)*0.5;vec2 selectPulse=ramp2(-faceSize*0.5,-innerFace,blobCenterXY)-ramp2(innerFace,faceSize*0.5,blobCenterXY);return selectPulse.x*selectPulse.y*fadeIn;}\nvoid Selection_Vertex_B31(\nvec3 Blob_Position,\nvec3 Blob_Position_2,\nvec3 Face_Center,\nvec2 Face_Size,\nvec3 Normal,\nvec3 Tangent,\nvec3 Bitangent,\nfloat Selection_Fuzz,\nfloat Selected,\nfloat Far_Distance,\nfloat Fade_Length,\nvec3 Active_Face_Dir,\nout float Show_Selection)\n{float select1=computeSelection(Blob_Position,Normal,Tangent,Bitangent,Face_Center,Face_Size,Selection_Fuzz,Far_Distance,Fade_Length);float select2=computeSelection(Blob_Position_2,Normal,Tangent,Bitangent,Face_Center,Face_Size,Selection_Fuzz,Far_Distance,Fade_Length);Show_Selection=mix(max(select1,select2),1.0,Selected);}\nvoid main()\n{vec3 Vec3_Q29=vec3(vec2(0,0).x,vec2(0,0).y,color.r);vec3 Nrm_World_Q24;Nrm_World_Q24=normalize((world*vec4(normal,0.0)).xyz);vec3 Face_Center_Q30;Face_Center_Q30=(world*vec4(vec3(0,0,0),1.0)).xyz;vec3 Tangent_World_Q13;Tangent_World_Q13=(world*vec4(tangent,0.0)).xyz;vec3 Result_Q42;Result_Q42=_Use_Global_Left_Index_ ? Global_Left_Index_Tip_Position.xyz : _Blob_Position_;vec3 Result_Q43;Result_Q43=_Use_Global_Right_Index_ ? Global_Right_Index_Tip_Position.xyz : _Blob_Position_2_;float Value_At_T_Q58=mix(_Blob_Near_Size_,_Blob_Pulse_Max_Size_,_Blob_Pulse_);float Value_At_T_Q59=mix(_Blob_Near_Size_2_,_Blob_Pulse_Max_Size_,_Blob_Pulse_2_);vec3 Cross_Q70=cross(normal,tangent);float Product_Q45=_Gaze_Intensity_*_Gaze_Focus_;float Step_Q46=step(0.0001,Product_Q45);vec3 Tangent_World_N_Q15=normalize(Tangent_World_Q13);vec3 Position_Q27;float Near_Size_Q27;float Inner_Fade_Q27;float Blob_Enable_Q27;float Fade_Q27;float Pulse_Q27;Choose_Blob_B27(color,Result_Q42,Result_Q43,_Blob_Enable_,_Blob_Enable_2_,Value_At_T_Q58,Value_At_T_Q59,_Blob_Inner_Fade_,_Blob_Inner_Fade_2_,_Blob_Pulse_,_Blob_Pulse_2_,_Blob_Fade_,_Blob_Fade_2_,Position_Q27,Near_Size_Q27,Inner_Fade_Q27,Blob_Enable_Q27,Fade_Q27,Pulse_Q27);vec3 Binormal_World_Q14;Object_To_World_Dir_B14(Cross_Q70,Binormal_World_Q14);float Anisotropy_Q21=length(Tangent_World_Q13)/length(Binormal_World_Q14);vec3 Binormal_World_N_Q16=normalize(Binormal_World_Q14);vec2 Face_Size_Q35;float ScaleY_Q35;Face_Size_Q35=vec2(length(Tangent_World_Q13),length(Binormal_World_Q14));ScaleY_Q35=Face_Size_Q35.y;float Out_Radius_Q38;float Out_Line_Width_Q38;Out_Radius_Q38=_Relative_To_Height_ ? _Radius_ : _Radius_/ScaleY_Q35;Out_Line_Width_Q38=_Relative_To_Height_ ? _Line_Width_ : _Line_Width_/ScaleY_Q35;float Show_Selection_Q31;Selection_Vertex_B31(Result_Q42,Result_Q43,Face_Center_Q30,Face_Size_Q35,Nrm_World_Q24,Tangent_World_N_Q15,Binormal_World_N_Q16,_Selection_Fuzz_,_Selected_,_Selected_Distance_,_Selected_Fade_Length_,vec3(0,0,-1),Show_Selection_Q31);float MaxAB_Q41=max(Show_Selection_Q31,Product_Q45);float Width_Q55;Proximity_Visibility_B55(Show_Selection_Q31,Result_Q42,Result_Q43,_Proximity_Far_Distance_,_Proximity_Near_Radius_,Face_Center_Q30,Nrm_World_Q24,Face_Size_Q35,Step_Q46,Width_Q55);vec3 New_P_Q32;vec2 New_UV_Q32;Move_Verts_B32(uv,Out_Radius_Q38,Anisotropy_Q21,Out_Line_Width_Q38,Width_Q55,New_P_Q32,New_UV_Q32);vec3 Pos_World_Q12;Object_To_World_Pos_B12(New_P_Q32,Pos_World_Q12);vec3 Out_Position_Q40;vec2 Out_UV_Q40;vec3 Blob_Info_Q40;vec2 Blob_Relative_UV_Q40;Blob_Vertex_B40(Pos_World_Q12,Nrm_World_Q24,Tangent_World_N_Q15,Binormal_World_N_Q16,Position_Q27,_Blob_Intensity_,Near_Size_Q27,_Blob_Far_Size_,_Blob_Near_Distance_,_Blob_Far_Distance_,color,uv,Face_Center_Q30,Face_Size_Q35,New_UV_Q32,_Blob_Fade_Length_,_Selection_Fade_,_Selection_Fade_Size_,Inner_Fade_Q27,Pulse_Q27,Fade_Q27,Blob_Enable_Q27,0.0,Out_Position_Q40,Out_UV_Q40,Blob_Info_Q40,Blob_Relative_UV_Q40);vec2 Rect_UV_Q36;vec2 Scale_XY_Q36;vec4 Rect_Parms_Q36;Round_Rect_Vertex_B36(New_UV_Q32,Tangent_World_Q13,Binormal_World_Q14,Out_Radius_Q38,Anisotropy_Q21,Blob_Relative_UV_Q40,Rect_UV_Q36,Scale_XY_Q36,Rect_Parms_Q36);vec4 Extra_Q33;float Distance_To_Face_Q33;float Distance_Fade1_Q33;float Distance_Fade2_Q33;Proximity_Vertex_B33(Result_Q42,Result_Q43,Face_Center_Q30,Pos_World_Q12,_Proximity_Far_Distance_,1.0,_Proximity_Anisotropy_,Nrm_World_Q24,Tangent_World_N_Q15,Binormal_World_N_Q16,Extra_Q33,Distance_To_Face_Q33,Distance_Fade1_Q33,Distance_Fade2_Q33);vec4 Vec4_Q37=vec4(MaxAB_Q41,Distance_Fade1_Q33,Distance_Fade2_Q33,Out_Radius_Q38);vec3 Position=Out_Position_Q40;vec3 Normal=Vec3_Q29;vec2 UV=Out_UV_Q40;vec3 Tangent=Blob_Info_Q40;vec3 Binormal=vec3(0,0,0);vec4 Color=vec4(1,1,1,1);vec4 Extra1=Rect_Parms_Q36;vec4 Extra2=Extra_Q33;vec4 Extra3=Vec4_Q37;gl_Position=viewProjection*vec4(Position,1);vNormal=Normal;vUV=UV;vTangent=Tangent;vExtra1=Extra1;vExtra2=Extra2;vExtra3=Extra3;}`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const mrdlFrontplateVertexShader = { name, shader };\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { type IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { type IEffectCreationOptions } from \"core/Materials/effect\";\r\nimport { type Matrix, Vector3 } from \"core/Maths/math.vector\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type SubMesh } from \"core/Meshes/subMesh\";\r\n\r\nimport { Color4 } from \"core/Maths/math.color\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { EffectFallbacks } from \"core/Materials/effectFallbacks\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { PushMaterial } from \"core/Materials/pushMaterial\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { SerializationHelper } from \"core/Misc/decorators.serialization\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\n\r\nimport \"./shaders/mrdlFrontplate.fragment\";\r\nimport \"./shaders/mrdlFrontplate.vertex\";\r\nimport { HandleFallbacksForShadows, PrepareAttributesForInstances, PrepareDefinesForAttributes, PrepareUniformsAndSamplersList } from \"core/Materials/materialHelper.functions\";\r\n\r\n/** @hidden */\r\nclass MRDLFrontplateMaterialDefines extends MaterialDefines {\r\n /**\r\n * Sets default value for \"SMOOTH_EDGES\"\r\n */\r\n public SMOOTH_EDGES = true;\r\n\r\n constructor() {\r\n super();\r\n this._needNormals = true;\r\n this._needUVs = true;\r\n this.rebuild();\r\n }\r\n}\r\n\r\nexport class MRDLFrontplateMaterial extends PushMaterial {\r\n /**\r\n * Gets or sets the corner radius on the frontplate. If this value is changed, update the lineWidth to match.\r\n */\r\n @serialize()\r\n public radius = 0.12;\r\n\r\n /**\r\n * Gets or sets the line width of the frontplate.\r\n */\r\n @serialize()\r\n public lineWidth = 0.01;\r\n\r\n /**\r\n * Gets or sets whether the scale is relative to the frontplate height.\r\n */\r\n @serialize()\r\n public relativeToHeight = false;\r\n\r\n /** @hidden */\r\n public _filterWidth = 1.0;\r\n\r\n /**\r\n * Gets or sets the edge color of the frontplate.\r\n */\r\n @serialize()\r\n public edgeColor: Color4 = new Color4(0.53, 0.53, 0.53, 1);\r\n\r\n /**\r\n * Gets or sets whether to enable blob effects on the frontplate.\r\n */\r\n @serialize()\r\n public blobEnable = true;\r\n\r\n /**\r\n * Gets or sets the blob position on the frontplate.\r\n */\r\n @serialize()\r\n public blobPosition: Vector3 = new Vector3(100, 100, 100);\r\n\r\n /**\r\n * Gets or sets the blob intensity of the frontplate.\r\n */\r\n @serialize()\r\n public blobIntensity = 0.5;\r\n\r\n /**\r\n * Gets or sets the blob near size of the frontplate.\r\n */\r\n @serialize()\r\n public blobNearSize = 0.032;\r\n\r\n /**\r\n * Gets or sets the blob far size of the frontplate.\r\n */\r\n @serialize()\r\n public blobFarSize = 0.048;\r\n\r\n /**\r\n * Gets or sets the blob near distance of the frontplate.\r\n */\r\n @serialize()\r\n public blobNearDistance = 0.008;\r\n\r\n /**\r\n * Gets or sets the blob far distance of the frontplate.\r\n */\r\n @serialize()\r\n public blobFarDistance = 0.064;\r\n\r\n /**\r\n * Gets or sets the blob fade length of the frontplate.\r\n */\r\n @serialize()\r\n public blobFadeLength = 0.04;\r\n\r\n /**\r\n * Gets or sets the blob inner fade of the frontplate.\r\n */\r\n @serialize()\r\n public blobInnerFade = 0.01;\r\n\r\n /**\r\n * Gets or sets the blob pulse of the frontplate.\r\n */\r\n @serialize()\r\n public blobPulse = 0.0;\r\n\r\n /**\r\n * Gets or sets the blob fade effect on the frontplate.\r\n */\r\n @serialize()\r\n public blobFade = 1.0;\r\n\r\n /**\r\n * Gets or sets the maximum size of the blob pulse on the frontplate.\r\n */\r\n @serialize()\r\n public blobPulseMaxSize = 0.05;\r\n\r\n /**\r\n * Gets or sets whether to enable extra blob effects of the frontplate.\r\n */\r\n @serialize()\r\n public blobEnable2 = true;\r\n\r\n /**\r\n * Gets or sets blob2 position of the frontplate.\r\n */\r\n @serialize()\r\n public blobPosition2: Vector3 = new Vector3(10, 10.1, -0.6);\r\n\r\n /**\r\n * Gets or sets the blob2 near size of the frontplate.\r\n */\r\n @serialize()\r\n public blobNearSize2 = 0.008;\r\n\r\n /**\r\n * Gets or sets the blob2 inner fade of the frontplate.\r\n */\r\n @serialize()\r\n public blobInnerFade2 = 0.1;\r\n\r\n /**\r\n * Gets or sets the blob2 pulse of the frontplate.\r\n */\r\n @serialize()\r\n public blobPulse2 = 0.0;\r\n\r\n /**\r\n * Gets or sets the blob2 fade effect on the frontplate.\r\n */\r\n @serialize()\r\n public blobFade2 = 1.0;\r\n\r\n /**\r\n * Gets or sets the gaze intensity of the frontplate.\r\n */\r\n @serialize()\r\n public gazeIntensity = 0.8;\r\n\r\n /**\r\n * Gets or sets the gaze focus of the frontplate.\r\n */\r\n @serialize()\r\n public gazeFocus = 0.0;\r\n\r\n /**\r\n * Gets or sets the selection fuzz of the frontplate.\r\n */\r\n @serialize()\r\n public selectionFuzz = 0.5;\r\n\r\n /**\r\n * Gets or sets the fade intensity of the frontplate.\r\n */\r\n @serialize()\r\n public selected = 1.0;\r\n\r\n /**\r\n * Gets or sets the selection fade intensity of the frontplate.\r\n */\r\n @serialize()\r\n public selectionFade = 0.2;\r\n\r\n /**\r\n * Gets or sets the selection fade size of the frontplate.\r\n */\r\n @serialize()\r\n public selectionFadeSize = 0.0;\r\n\r\n /**\r\n * Gets or sets the selected distance of the frontplate.\r\n */\r\n @serialize()\r\n public selectedDistance = 0.08;\r\n\r\n /**\r\n * Gets or sets the selected fade length of the frontplate.\r\n */\r\n @serialize()\r\n public selectedFadeLength = 0.08;\r\n\r\n /**\r\n * Gets or sets the proximity maximum intensity of the frontplate.\r\n */\r\n @serialize()\r\n public proximityMaxIntensity = 0.45;\r\n\r\n /**\r\n * Gets or sets the proximity far distance of the frontplate.\r\n */\r\n @serialize()\r\n public proximityFarDistance = 0.16;\r\n\r\n /**\r\n * Gets or sets the proximity near radius of the frontplate.\r\n */\r\n @serialize()\r\n public proximityNearRadius = 0.016;\r\n\r\n /**\r\n * Gets or sets the proximity anisotropy of the frontplate.\r\n */\r\n @serialize()\r\n public proximityAnisotropy = 1.0;\r\n\r\n /**\r\n * Gets or sets whether to use global left index on the frontplate.\r\n */\r\n @serialize()\r\n public useGlobalLeftIndex = true;\r\n\r\n /**\r\n * Gets or sets whether to use global right index of the frontplate.\r\n */\r\n @serialize()\r\n public useGlobalRightIndex = true;\r\n\r\n /**\r\n * URL pointing to the texture used to define the coloring for the BLOB.\r\n */\r\n public static BLOB_TEXTURE_URL = \"\";\r\n\r\n /**\r\n * Gets or sets the opacity of the frontplate (0.0 - 1.0).\r\n */\r\n public fadeOut = 1.0;\r\n\r\n private _blobTexture: Texture;\r\n\r\n constructor(name: string, scene: Scene) {\r\n super(name, scene);\r\n this.alphaMode = Constants.ALPHA_ADD;\r\n this.disableDepthWrite = true;\r\n this.backFaceCulling = false;\r\n this._blobTexture = new Texture(MRDLFrontplateMaterial.BLOB_TEXTURE_URL, scene, true, false, Texture.NEAREST_SAMPLINGMODE);\r\n }\r\n\r\n public override needAlphaBlending(): boolean {\r\n return true;\r\n }\r\n\r\n public override needAlphaTesting(): boolean {\r\n return false;\r\n }\r\n\r\n public override getAlphaTestTexture(): Nullable<BaseTexture> {\r\n return null;\r\n }\r\n\r\n // Methods\r\n public override isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n const drawWrapper = subMesh._drawWrapper;\r\n\r\n if (this.isFrozen) {\r\n if (drawWrapper.effect && drawWrapper._wasPreviouslyReady) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n subMesh.materialDefines = new MRDLFrontplateMaterialDefines();\r\n }\r\n\r\n const defines = <MRDLFrontplateMaterialDefines>subMesh.materialDefines;\r\n const scene = this.getScene();\r\n\r\n if (MRDLFrontplateMaterial.BLOB_TEXTURE_URL !== \"\" && !this._blobTexture.isReady()) {\r\n return false;\r\n }\r\n\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n // Attribs\r\n PrepareDefinesForAttributes(mesh, defines, false, false);\r\n\r\n // Get correct effect\r\n if (defines.isDirty) {\r\n defines.markAsProcessed();\r\n\r\n scene.resetCachedMaterial();\r\n\r\n // Fallbacks\r\n const fallbacks = new EffectFallbacks();\r\n if (defines.FOG) {\r\n fallbacks.addFallback(1, \"FOG\");\r\n }\r\n\r\n HandleFallbacksForShadows(defines, fallbacks);\r\n\r\n defines.IMAGEPROCESSINGPOSTPROCESS = scene.imageProcessingConfiguration.applyByPostProcess;\r\n\r\n //Attributes\r\n const attribs = [VertexBuffer.PositionKind];\r\n\r\n if (defines.NORMAL) {\r\n attribs.push(VertexBuffer.NormalKind);\r\n }\r\n\r\n if (defines.UV1) {\r\n attribs.push(VertexBuffer.UVKind);\r\n }\r\n\r\n if (defines.UV2) {\r\n attribs.push(VertexBuffer.UV2Kind);\r\n }\r\n\r\n if (defines.VERTEXCOLOR) {\r\n attribs.push(VertexBuffer.ColorKind);\r\n }\r\n\r\n if (defines.TANGENT) {\r\n attribs.push(VertexBuffer.TangentKind);\r\n }\r\n\r\n PrepareAttributesForInstances(attribs, defines);\r\n\r\n // Legacy browser patch\r\n const shaderName = \"mrdlFrontplate\";\r\n const join = defines.toString();\r\n\r\n const uniforms = [\r\n \"world\",\r\n \"worldView\",\r\n \"worldViewProjection\",\r\n \"view\",\r\n \"projection\",\r\n \"viewProjection\",\r\n \"cameraPosition\",\r\n \"_Radius_\",\r\n \"_Line_Width_\",\r\n \"_Relative_To_Height_\",\r\n \"_Filter_Width_\",\r\n \"_Edge_Color_\",\r\n \"_Fade_Out_\",\r\n \"_Smooth_Edges_\",\r\n \"_Blob_Enable_\",\r\n \"_Blob_Position_\",\r\n \"_Blob_Intensity_\",\r\n \"_Blob_Near_Size_\",\r\n \"_Blob_Far_Size_\",\r\n \"_Blob_Near_Distance_\",\r\n \"_Blob_Far_Distance_\",\r\n \"_Blob_Fade_Length_\",\r\n \"_Blob_Inner_Fade_\",\r\n \"_Blob_Pulse_\",\r\n \"_Blob_Fade_\",\r\n \"_Blob_Pulse_Max_Size_\",\r\n \"_Blob_Enable_2_\",\r\n \"_Blob_Position_2_\",\r\n \"_Blob_Near_Size_2_\",\r\n \"_Blob_Inner_Fade_2_\",\r\n \"_Blob_Pulse_2_\",\r\n \"_Blob_Fade_2_\",\r\n \"_Gaze_Intensity_\",\r\n \"_Gaze_Focus_\",\r\n \"_Blob_Texture_\",\r\n \"_Selection_Fuzz_\",\r\n \"_Selected_\",\r\n \"_Selection_Fade_\",\r\n \"_Selection_Fade_Size_\",\r\n \"_Selected_Distance_\",\r\n \"_Selected_Fade_Length_\",\r\n \"_Proximity_Max_Intensity_\",\r\n \"_Proximity_Far_Distance_\",\r\n \"_Proximity_Near_Radius_\",\r\n \"_Proximity_Anisotropy_\",\r\n \"Global_Left_Index_Tip_Position\",\r\n \"Global_Right_Index_Tip_Position\",\r\n \"_Use_Global_Left_Index_\",\r\n \"_Use_Global_Right_Index_\",\r\n ];\r\n const samplers: string[] = [];\r\n const uniformBuffers: string[] = [];\r\n\r\n PrepareUniformsAndSamplersList(<IEffectCreationOptions>{\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: defines,\r\n maxSimultaneousLights: 4,\r\n });\r\n\r\n subMesh.setEffect(\r\n scene.getEngine().createEffect(\r\n shaderName,\r\n <IEffectCreationOptions>{\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: join,\r\n fallbacks: fallbacks,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n indexParameters: { maxSimultaneousLights: 4 },\r\n },\r\n engine\r\n ),\r\n defines\r\n );\r\n }\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n\r\n return true;\r\n }\r\n\r\n public override bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const scene = this.getScene();\r\n\r\n const defines = <MRDLFrontplateMaterialDefines>subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n\r\n this._activeEffect = effect;\r\n\r\n // Matrices\r\n this.bindOnlyWorldMatrix(world);\r\n this._activeEffect.setMatrix(\"viewProjection\", scene.getTransformMatrix());\r\n this._activeEffect.setVector3(\"cameraPosition\", scene.activeCamera!.position);\r\n\r\n // \"Round Rect\"\r\n this._activeEffect.setFloat(\"_Radius_\", this.radius);\r\n this._activeEffect.setFloat(\"_Line_Width_\", this.lineWidth);\r\n this._activeEffect.setFloat(\"_Relative_To_Height_\", this.relativeToHeight ? 1.0 : 0.0);\r\n this._activeEffect.setFloat(\"_Filter_Width_\", this._filterWidth);\r\n this._activeEffect.setDirectColor4(\"_Edge_Color_\", this.edgeColor);\r\n\r\n // \"Fade\"\r\n this._activeEffect.setFloat(\"_Fade_Out_\", this.fadeOut);\r\n\r\n // \"Blob\"\r\n this._activeEffect.setFloat(\"_Blob_Enable_\", this.blobEnable ? 1.0 : 0.0);\r\n this._activeEffect.setVector3(\"_Blob_Position_\", this.blobPosition);\r\n this._activeEffect.setFloat(\"_Blob_Intensity_\", this.blobIntensity);\r\n this._activeEffect.setFloat(\"_Blob_Near_Size_\", this.blobNearSize);\r\n this._activeEffect.setFloat(\"_Blob_Far_Size_\", this.blobFarSize);\r\n this._activeEffect.setFloat(\"_Blob_Near_Distance_\", this.blobNearDistance);\r\n this._activeEffect.setFloat(\"_Blob_Far_Distance_\", this.blobFarDistance);\r\n this._activeEffect.setFloat(\"_Blob_Fade_Length_\", this.blobFadeLength);\r\n this._activeEffect.setFloat(\"_Blob_Inner_Fade_\", this.blobInnerFade);\r\n this._activeEffect.setFloat(\"_Blob_Pulse_\", this.blobPulse);\r\n this._activeEffect.setFloat(\"_Blob_Fade_\", this.blobFade);\r\n this._activeEffect.setFloat(\"_Blob_Pulse_Max_Size_\", this.blobPulseMaxSize);\r\n\r\n // \"Blob 2\"\r\n this._activeEffect.setFloat(\"_Blob_Enable_2_\", this.blobEnable2 ? 1.0 : 0.0);\r\n this._activeEffect.setVector3(\"_Blob_Position_2_\", this.blobPosition2);\r\n this._activeEffect.setFloat(\"_Blob_Near_Size_2_\", this.blobNearSize2);\r\n this._activeEffect.setFloat(\"_Blob_Inner_Fade_2_\", this.blobInnerFade2);\r\n this._activeEffect.setFloat(\"_Blob_Pulse_2_\", this.blobPulse2);\r\n this._activeEffect.setFloat(\"_Blob_Fade_2_\", this.blobFade2);\r\n\r\n // \"Gaze\"\r\n this._activeEffect.setFloat(\"_Gaze_Intensity_\", this.gazeIntensity);\r\n this._activeEffect.setFloat(\"_Gaze_Focus_\", this.gazeFocus);\r\n\r\n // \"Blob Texture\"\r\n this._activeEffect.setTexture(\"_Blob_Texture_\", this._blobTexture);\r\n\r\n // \"Selection\"\r\n this._activeEffect.setFloat(\"_Selection_Fuzz_\", this.selectionFuzz);\r\n this._activeEffect.setFloat(\"_Selected_\", this.selected);\r\n this._activeEffect.setFloat(\"_Selection_Fade_\", this.selectionFade);\r\n this._activeEffect.setFloat(\"_Selection_Fade_Size_\", this.selectionFadeSize);\r\n this._activeEffect.setFloat(\"_Selected_Distance_\", this.selectedDistance);\r\n this._activeEffect.setFloat(\"_Selected_Fade_Length_\", this.selectedFadeLength);\r\n\r\n // \"Proximity\"\r\n this._activeEffect.setFloat(\"_Proximity_Max_Intensity_\", this.proximityMaxIntensity);\r\n this._activeEffect.setFloat(\"_Proximity_Far_Distance_\", this.proximityFarDistance);\r\n this._activeEffect.setFloat(\"_Proximity_Near_Radius_\", this.proximityNearRadius);\r\n this._activeEffect.setFloat(\"_Proximity_Anisotropy_\", this.proximityAnisotropy);\r\n\r\n // \"Global\"\r\n this._activeEffect.setFloat(\"_Use_Global_Left_Index_\", this.useGlobalLeftIndex ? 1.0 : 0.0);\r\n this._activeEffect.setFloat(\"_Use_Global_Right_Index_\", this.useGlobalRightIndex ? 1.0 : 0.0);\r\n\r\n // \"Antialiasing\"\r\n //define SMOOTH_EDGES true;\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n /**\r\n * Get the list of animatables in the material.\r\n * @returns the list of animatables object used in the material\r\n */\r\n public override getAnimatables(): IAnimatable[] {\r\n return [];\r\n }\r\n\r\n public override dispose(forceDisposeEffect?: boolean): void {\r\n super.dispose(forceDisposeEffect);\r\n }\r\n\r\n public override clone(name: string): MRDLFrontplateMaterial {\r\n return SerializationHelper.Clone(() => new MRDLFrontplateMaterial(name, this.getScene()), this);\r\n }\r\n\r\n public override serialize(): unknown {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n serializationObject.customType = \"BABYLON.MRDLFrontplateMaterial\";\r\n return serializationObject;\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"MRDLFrontplateMaterial\";\r\n }\r\n\r\n // Statics\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): MRDLFrontplateMaterial {\r\n return SerializationHelper.Parse(() => new MRDLFrontplateMaterial(source.name, scene), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GUI.MRDLFrontplateMaterial\", MRDLFrontplateMaterial);\r\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"mrdlInnerquadPixelShader\";\nconst shader = `uniform vec3 cameraPosition;varying vec2 vUV;varying vec3 vTangent;uniform vec4 _Color_;uniform float _Radius_;uniform bool _Fixed_Radius_;uniform float _Filter_Width_;uniform float _Glow_Fraction_;uniform float _Glow_Max_;uniform float _Glow_Falloff_;float FilterStep_Bid194(float edge,float x,float filterWidth)\n{float dx=max(1.0E-5,fwidth(x)*filterWidth);return max((x+dx*0.5-max(edge,x-dx*0.5))/dx,0.0);}\nvoid Round_Rect_B194(\nfloat Size_X,\nfloat Size_Y,\nfloat Radius,\nvec4 Rect_Color,\nfloat Filter_Width,\nvec2 UV,\nfloat Glow_Fraction,\nfloat Glow_Max,\nfloat Glow_Falloff,\nout vec4 Color)\n{vec2 halfSize=vec2(Size_X,Size_Y)*0.5;vec2 r=max(min(vec2(Radius,Radius),halfSize),vec2(0.01,0.01));vec2 v=abs(UV);vec2 nearestp=min(v,halfSize-r);vec2 delta=(v-nearestp)/max(vec2(0.01,0.01),r);float Distance=length(delta);float insideRect=1.0-FilterStep_Bid194(1.0-Glow_Fraction,Distance,Filter_Width);float glow=clamp((1.0-Distance)/Glow_Fraction,0.0,1.0);glow=pow(glow,Glow_Falloff);Color=Rect_Color*max(insideRect,glow*Glow_Max);}\nvoid main()\n{float X_Q192;float Y_Q192;float Z_Q192;X_Q192=vTangent.x;Y_Q192=vTangent.y;Z_Q192=vTangent.z;vec4 Color_Q194;Round_Rect_B194(X_Q192,1.0,Y_Q192,_Color_,_Filter_Width_,vUV,_Glow_Fraction_,_Glow_Max_,_Glow_Falloff_,Color_Q194);vec4 Out_Color=Color_Q194;float Clip_Threshold=0.0;gl_FragColor=Out_Color;}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const mrdlInnerquadPixelShader = { name, shader };\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"mrdlInnerquadVertexShader\";\nconst shader = `uniform mat4 world;uniform mat4 viewProjection;uniform vec3 cameraPosition;attribute vec3 position;attribute vec3 normal;attribute vec2 uv;attribute vec3 tangent;attribute vec4 color;uniform vec4 _Color_;uniform float _Radius_;uniform bool _Fixed_Radius_;uniform float _Filter_Width_;uniform float _Glow_Fraction_;uniform float _Glow_Max_;uniform float _Glow_Falloff_;varying vec2 vUV;varying vec3 vTangent;void main()\n{vec3 Pos_World_Q189;Pos_World_Q189=(world*vec4(position,1.0)).xyz;vec3 Dir_World_Q190;Dir_World_Q190=(world*vec4(tangent,0.0)).xyz;vec3 Dir_World_Q191;Dir_World_Q191=(world*vec4((cross(normal,tangent)),0.0)).xyz;float Length_Q180=length(Dir_World_Q190);float Length_Q181=length(Dir_World_Q191);float Quotient_Q184=Length_Q180/Length_Q181;float Quotient_Q195=_Radius_/Length_Q181;vec2 Result_Q193;Result_Q193=vec2((uv.x-0.5)*Length_Q180/Length_Q181,(uv.y-0.5));float Result_Q198=_Fixed_Radius_ ? Quotient_Q195 : _Radius_;vec3 Vec3_Q183=vec3(Quotient_Q184,Result_Q198,0);vec3 Position=Pos_World_Q189;vec3 Normal=vec3(0,0,0);vec2 UV=Result_Q193;vec3 Tangent=Vec3_Q183;vec3 Binormal=vec3(0,0,0);vec4 Color=color;gl_Position=viewProjection*vec4(Position,1);vUV=UV;vTangent=Tangent;}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStore[name]) {\n ShaderStore.ShadersStore[name] = shader;\n}\n/** @internal */\nexport const mrdlInnerquadVertexShader = { name, shader };\n","import { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { type IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { type IEffectCreationOptions } from \"core/Materials/effect\";\r\nimport { type Matrix } from \"core/Maths/math.vector\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type SubMesh } from \"core/Meshes/subMesh\";\r\n\r\nimport { Color4 } from \"core/Maths/math.color\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { EffectFallbacks } from \"core/Materials/effectFallbacks\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { PushMaterial } from \"core/Materials/pushMaterial\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { SerializationHelper } from \"core/Misc/decorators.serialization\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\n\r\nimport \"./shaders/mrdlInnerquad.fragment\";\r\nimport \"./shaders/mrdlInnerquad.vertex\";\r\nimport { HandleFallbacksForShadows, PrepareAttributesForInstances, PrepareDefinesForAttributes, PrepareUniformsAndSamplersList } from \"core/Materials/materialHelper.functions\";\r\n\r\nclass MRDLInnerquadMaterialDefines extends MaterialDefines {\r\n constructor() {\r\n super();\r\n this._needNormals = true;\r\n this._needUVs = true;\r\n this.rebuild();\r\n }\r\n}\r\n\r\nexport class MRDLInnerquadMaterial extends PushMaterial {\r\n /**\r\n * Gets or sets the color of the innerquad.\r\n */\r\n @serialize()\r\n public color: Color4 = new Color4(1, 1, 1, 0.05);\r\n /**\r\n * Gets or sets the corner radius on the innerquad. If this value is changed, update the lineWidth to match.\r\n */\r\n @serialize()\r\n public radius = 0.12;\r\n\r\n /**\r\n * Gets or sets whether the radius of the innerquad should be fixed.\r\n */\r\n @serialize()\r\n public fixedRadius = true;\r\n\r\n /** @hidden */\r\n public _filterWidth = 1.0;\r\n\r\n /**\r\n * Gets or sets the glow fraction of the innerquad.\r\n */\r\n @serialize()\r\n public glowFraction = 0.0;\r\n\r\n /**\r\n * Gets or sets the maximum glow intensity of the innerquad.\r\n */\r\n @serialize()\r\n public glowMax = 0.5;\r\n\r\n /**\r\n * Gets or sets the glow falloff effect of the innerquad.\r\n */\r\n @serialize()\r\n public glowFalloff = 2.0;\r\n\r\n constructor(name: string, scene: Scene) {\r\n super(name, scene);\r\n this.alphaMode = Constants.ALPHA_COMBINE;\r\n this.backFaceCulling = false;\r\n }\r\n\r\n public override needAlphaBlending(): boolean {\r\n return true;\r\n }\r\n\r\n public override needAlphaTesting(): boolean {\r\n return false;\r\n }\r\n\r\n public override getAlphaTestTexture(): Nullable<BaseTexture> {\r\n return null;\r\n }\r\n\r\n // Methods\r\n public override isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n const drawWrapper = subMesh._drawWrapper;\r\n\r\n if (this.isFrozen) {\r\n if (drawWrapper.effect && drawWrapper._wasPreviouslyReady) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines) {\r\n subMesh.materialDefines = new MRDLInnerquadMaterialDefines();\r\n }\r\n\r\n const defines = <MRDLInnerquadMaterialDefines>subMesh.materialDefines;\r\n const scene = this.getScene();\r\n\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n // Attribs\r\n PrepareDefinesForAttributes(mesh, defines, true, false);\r\n\r\n // Get correct effect\r\n if (defines.isDirty) {\r\n defines.markAsProcessed();\r\n\r\n scene.resetCachedMaterial();\r\n\r\n // Fallbacks\r\n const fallbacks = new EffectFallbacks();\r\n if (defines.FOG) {\r\n fallbacks.addFallback(1, \"FOG\");\r\n }\r\n\r\n HandleFallbacksForShadows(defines, fallbacks);\r\n\r\n defines.IMAGEPROCESSINGPOSTPROCESS = scene.imageProcessingConfiguration.applyByPostProcess;\r\n\r\n //Attributes\r\n const attribs = [VertexBuffer.PositionKind];\r\n\r\n if (defines.NORMAL) {\r\n attribs.push(VertexBuffer.NormalKind);\r\n }\r\n\r\n if (defines.UV1) {\r\n attribs.push(VertexBuffer.UVKind);\r\n }\r\n\r\n if (defines.UV2) {\r\n attribs.push(VertexBuffer.UV2Kind);\r\n }\r\n\r\n if (defines.VERTEXCOLOR) {\r\n attribs.push(VertexBuffer.ColorKind);\r\n }\r\n\r\n if (defines.TANGENT) {\r\n attribs.push(VertexBuffer.TangentKind);\r\n }\r\n\r\n PrepareAttributesForInstances(attribs, defines);\r\n\r\n // Legacy browser patch\r\n const shaderName = \"mrdlInnerquad\";\r\n const join = defines.toString();\r\n\r\n const uniforms = [\r\n \"world\",\r\n \"worldView\",\r\n \"worldViewProjection\",\r\n \"view\",\r\n \"projection\",\r\n \"viewProjection\",\r\n \"cameraPosition\",\r\n \"_Color_\",\r\n \"_Radius_\",\r\n \"_Fixed_Radius_\",\r\n \"_Filter_Width_\",\r\n \"_Glow_Fraction_\",\r\n \"_Glow_Max_\",\r\n \"_Glow_Falloff_\",\r\n ];\r\n const samplers: string[] = [];\r\n const uniformBuffers: string[] = [];\r\n\r\n PrepareUniformsAndSamplersList(<IEffectCreationOptions>{\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: defines,\r\n maxSimultaneousLights: 4,\r\n });\r\n\r\n subMesh.setEffect(\r\n scene.getEngine().createEffect(\r\n shaderName,\r\n <IEffectCreationOptions>{\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: join,\r\n fallbacks: fallbacks,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n indexParameters: { maxSimultaneousLights: 4 },\r\n },\r\n engine\r\n ),\r\n defines\r\n );\r\n }\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n\r\n return true;\r\n }\r\n\r\n public override bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const scene = this.getScene();\r\n\r\n const defines = <MRDLInnerquadMaterialDefines>subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n\r\n this._activeEffect = effect;\r\n\r\n // Matrices\r\n this.bindOnlyWorldMatrix(world);\r\n this._activeEffect.setMatrix(\"viewProjection\", scene.getTransformMatrix());\r\n this._activeEffect.setVector3(\"cameraPosition\", scene.activeCamera!.position);\r\n\r\n // \"Color\"\r\n this._activeEffect.setDirectColor4(\"_Color_\", this.color);\r\n\r\n // \"Shape\"\r\n this._activeEffect.setFloat(\"_Radius_\", this.radius);\r\n this._activeEffect.setFloat(\"_Fixed_Radius_\", this.fixedRadius ? 1.0 : 0.0);\r\n this._activeEffect.setFloat(\"_Filter_Width_\", this._filterWidth);\r\n\r\n // \"Glow\"\r\n this._activeEffect.setFloat(\"_Glow_Fraction_\", this.glowFraction);\r\n this._activeEffect.setFloat(\"_Glow_Max_\", this.glowMax);\r\n this._activeEffect.setFloat(\"_Glow_Falloff_\", this.glowFalloff);\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n /**\r\n * Get the list of animatables in the material.\r\n * @returns the list of animatables object used in the material\r\n */\r\n public override getAnimatables(): IAnimatable[] {\r\n return [];\r\n }\r\n\r\n public override dispose(forceDisposeEffect?: boolean): void {\r\n super.dispose(forceDisposeEffect);\r\n }\r\n\r\n public override clone(name: string): MRDLInnerquadMaterial {\r\n return SerializationHelper.Clone(() => new MRDLInnerquadMaterial(name, this.getScene()), this);\r\n }\r\n\r\n public override serialize(): unknown {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n serializationObject.customType = \"BABYLON.MRDLInnerquadMaterial\";\r\n return serializationObject;\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"MRDLInnerquadMaterial\";\r\n }\r\n\r\n // Statics\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): MRDLInnerquadMaterial {\r\n return SerializationHelper.Parse(() => new MRDLInnerquadMaterial(source.name, scene), source, scene, rootUrl);\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.GUI.MRDLInnerquadMaterial\", MRDLInnerquadMaterial);\r\n","import { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { type Control3D } from \"../control3D\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type Observer } from \"core/Misc/observable\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type Vector3WithInfo } from \"../../vector3WithInfo\";\r\n\r\nimport { AdvancedDynamicTexture } from \"../../../2D/advancedDynamicTexture\";\r\nimport { Animation } from \"core/Animations/animation\";\r\nimport { AnimationGroup } from \"core/Animations/animationGroup\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\nimport { Control } from \"../../../2D/controls/control\";\r\nimport { CreatePlane } from \"core/Meshes/Builders/planeBuilder\";\r\nimport { CreateBox } from \"core/Meshes/Builders/boxBuilder\";\r\nimport { IsDocumentAvailable } from \"core/Misc/domManagement\";\r\nimport { FadeInOutBehavior } from \"core/Behaviors/Meshes/fadeInOutBehavior\";\r\nimport { Grid } from \"../../../2D/controls/grid\";\r\nimport { Image } from \"../../../2D/controls/image\";\r\nimport { MRDLBackglowMaterial } from \"../../materials/mrdl/mrdlBackglowMaterial\";\r\nimport { MRDLBackplateMaterial } from \"../../materials/mrdl/mrdlBackplateMaterial\";\r\nimport { MRDLFrontplateMaterial } from \"../../materials/mrdl/mrdlFrontplateMaterial\";\r\nimport { MRDLInnerquadMaterial } from \"../../materials/mrdl/mrdlInnerquadMaterial\";\r\nimport { Rectangle } from \"../../../2D/controls/rectangle\";\r\nimport { SceneLoader } from \"core/Loading/sceneLoader\";\r\nimport { StackPanel } from \"../../../2D/controls/stackPanel\";\r\nimport { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { TextBlock } from \"../../../2D/controls/textBlock\";\r\nimport { TouchButton3D } from \"../touchButton3D\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\n/**\r\n * Class used to create the mrtkv3 button\r\n */\r\nexport class TouchHolographicButton extends TouchButton3D {\r\n /**\r\n * Base Url for the frontplate model.\r\n */\r\n public static MRTK_ASSET_BASE_URL = \"https://assets.babylonjs.com/core/MRTK/\";\r\n\r\n /**\r\n * File name for the frontplate model.\r\n */\r\n public static FRONTPLATE_MODEL_FILENAME = \"mrtk-fluent-frontplate.glb\";\r\n\r\n /**\r\n * File name for the backplate model.\r\n */\r\n public static BACKPLATE_MODEL_FILENAME = \"mrtk-fluent-backplate.glb\";\r\n\r\n /**\r\n * File name for the backglow model.\r\n */\r\n public static BACKGLOW_MODEL_FILENAME = \"mrtk-fluent-button.glb\";\r\n\r\n /**\r\n * File name for the innerquad model.\r\n */\r\n public static INNERQUAD_MODEL_FILENAME = \"SlateProximity.glb\";\r\n\r\n /**\r\n * Gets or sets the horizontal scaling for the button.\r\n */\r\n public width = 1;\r\n\r\n /**\r\n * Gets or sets the vertical scaling for the button.\r\n */\r\n public height = 1;\r\n\r\n /**\r\n * Gets or sets the bevel radius for the button.\r\n */\r\n public radius = 0.14;\r\n\r\n /**\r\n * Gets or sets the font size of the button text in pixels.\r\n * This is only adjustable for a button with width to height ratio greater than 1.\r\n */\r\n public textSizeInPixels = 18;\r\n\r\n /**\r\n * Gets or sets the size of the button image in pixels.\r\n * This is only adjustable for a button with width to height ratio greater than 1.\r\n */\r\n public imageSizeInPixels = 40;\r\n\r\n /**\r\n * Gets or sets the color of the button plate.\r\n */\r\n public plateMaterialColor = new Color3(0.4, 0.4, 0.4);\r\n\r\n // Shared variables for meshes\r\n /**\r\n * Gets or sets the depth of the button's front plate.\r\n * This variable determines the z scaling and z position for some of the button's meshes.\r\n */\r\n public frontPlateDepth = 0.2;\r\n\r\n /**\r\n * Gets or sets the depth of the button's back plate.\r\n * This variable determines the z scaling and z position for some of the button's meshes.\r\n */\r\n public backPlateDepth = 0.04;\r\n\r\n /**\r\n * Gets or sets the offset value for button's back glow.\r\n * This variable determines the x, y scaling of the button's meshes.\r\n */\r\n public backGlowOffset = 0.1;\r\n\r\n /**\r\n * Gets or sets the value that determines the z scaling and z position for the innerQuad and BackGlow meshes.\r\n */\r\n public flatPlaneDepth = 0.001;\r\n\r\n /**\r\n * Gets or sets the radius for FrontMaterial and innerQuadMaterial.\r\n */\r\n public innerQuadRadius = this.radius - 0.04;\r\n\r\n /**\r\n * Gets or sets the color for innerQuadMaterial.\r\n */\r\n public innerQuadColor = new Color4(0, 0, 0, 0);\r\n\r\n /**\r\n * Gets or sets the color for innerQuadMaterial for when it is toggled.\r\n */\r\n public innerQuadToggledColor = new Color4(0.5197843, 0.6485234, 0.9607843, 0.6);\r\n\r\n /**\r\n * Gets or sets the color for innerQuadMaterial for when it is hovered.\r\n */\r\n public innerQuadHoverColor = new Color4(1, 1, 1, 0.05);\r\n\r\n /**\r\n * Gets or sets the color for innerQuadMaterial for when it is toggled and hovered.\r\n */\r\n public innerQuadToggledHoverColor = new Color4(0.5197843, 0.6485234, 0.9607843, 1);\r\n\r\n // Meshes\r\n private _backPlate: AbstractMesh;\r\n private _textPlate: Mesh;\r\n private _frontPlate: AbstractMesh;\r\n private _backGlow: AbstractMesh;\r\n private _innerQuad: AbstractMesh;\r\n private _collisionPlate: AbstractMesh;\r\n private _frontPlateCollisionMesh: AbstractMesh;\r\n private _isBackplateVisible = true;\r\n\r\n // Content\r\n private _text: string;\r\n private _subtext: string;\r\n private _imageUrl: string;\r\n\r\n // Materials\r\n private _shareMaterials = true;\r\n private _frontMaterial: MRDLFrontplateMaterial;\r\n private _backMaterial: MRDLBackplateMaterial;\r\n private _backGlowMaterial: MRDLBackglowMaterial;\r\n private _innerQuadMaterial: MRDLInnerquadMaterial;\r\n private _plateMaterial: StandardMaterial;\r\n\r\n // Events\r\n private _pickedPointObserver: Nullable<Observer<Nullable<Vector3>>>;\r\n private _pointerClickObserver: Nullable<Observer<Vector3WithInfo>>;\r\n private _pointerEnterObserver: Nullable<Observer<Control3D>>;\r\n private _pointerOutObserver: Nullable<Observer<Control3D>>;\r\n private _toggleObserver: Nullable<Observer<boolean>>;\r\n\r\n // Tooltip\r\n private _tooltipFade: Nullable<FadeInOutBehavior>;\r\n private _tooltipTextBlock: Nullable<TextBlock>;\r\n private _tooltipTexture: Nullable<AdvancedDynamicTexture>;\r\n private _tooltipMesh: Nullable<Mesh>;\r\n private _tooltipHoverObserver: Nullable<Observer<Control3D>>;\r\n private _tooltipOutObserver: Nullable<Observer<Control3D>>;\r\n\r\n private _disposeTooltip() {\r\n this._tooltipFade = null;\r\n if (this._tooltipTextBlock) {\r\n this._tooltipTextBlock.dispose();\r\n }\r\n if (this._tooltipTexture) {\r\n this._tooltipTexture.dispose();\r\n }\r\n if (this._tooltipMesh) {\r\n this._tooltipMesh.dispose();\r\n }\r\n this.onPointerEnterObservable.remove(this._tooltipHoverObserver);\r\n this.onPointerOutObservable.remove(this._tooltipOutObserver);\r\n }\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._textPlate.renderingGroupId = id;\r\n this._frontPlate.renderingGroupId = id;\r\n this._backGlow.renderingGroupId = id;\r\n this._innerQuad.renderingGroupId = id;\r\n\r\n if (this._tooltipMesh) {\r\n this._tooltipMesh.renderingGroupId = id;\r\n }\r\n }\r\n public get renderingGroupId(): number {\r\n return this._backPlate.renderingGroupId;\r\n }\r\n\r\n /**\r\n * Gets the mesh used to render this control\r\n */\r\n public override get mesh(): Nullable<AbstractMesh> {\r\n return this._backPlate;\r\n }\r\n\r\n /**\r\n * Text to be displayed on the tooltip shown when hovering on the button. When set to null tooltip is disabled. (Default: null)\r\n * Set this property after adding the button to the GUI3DManager\r\n */\r\n public set tooltipText(text: Nullable<string>) {\r\n if (!text) {\r\n this._disposeTooltip();\r\n return;\r\n }\r\n if (!this._tooltipFade) {\r\n const rightHandedScene = this._backPlate._scene.useRightHandedSystem;\r\n // Create tooltip with mesh and text\r\n this._tooltipMesh = CreatePlane(\"\", { size: 1 }, this._backPlate._scene);\r\n this._tooltipMesh.position = Vector3.Down().scale(0.7).add(Vector3.Forward(rightHandedScene).scale(-0.15));\r\n this._tooltipMesh.isPickable = false;\r\n this._tooltipMesh.parent = this._frontPlateCollisionMesh;\r\n\r\n // Create text texture for the tooltip\r\n this._tooltipTexture = AdvancedDynamicTexture.CreateForMesh(this._tooltipMesh);\r\n const tooltipBackground = new Rectangle();\r\n tooltipBackground.height = 0.25;\r\n tooltipBackground.width = 0.8;\r\n tooltipBackground.cornerRadius = 25;\r\n tooltipBackground.color = \"#ffffff\";\r\n tooltipBackground.thickness = 20;\r\n tooltipBackground.background = \"#060668\";\r\n this._tooltipTexture.addControl(tooltipBackground);\r\n\r\n this._tooltipTextBlock = new TextBlock();\r\n this._tooltipTextBlock.color = \"white\";\r\n this._tooltipTextBlock.fontSize = 100;\r\n this._tooltipTexture.addControl(this._tooltipTextBlock);\r\n\r\n // Add hover action to tooltip\r\n this._tooltipFade = new FadeInOutBehavior();\r\n this._tooltipFade.delay = 500;\r\n this._tooltipMesh.addBehavior(this._tooltipFade);\r\n this._tooltipHoverObserver = this.onPointerEnterObservable.add(() => {\r\n if (this._tooltipFade) {\r\n this._tooltipFade.fadeIn(true);\r\n }\r\n });\r\n this._tooltipOutObserver = this.onPointerOutObservable.add(() => {\r\n if (this._tooltipFade) {\r\n this._tooltipFade.fadeIn(false);\r\n }\r\n });\r\n }\r\n if (this._tooltipTextBlock) {\r\n this._tooltipTextBlock.text = text;\r\n }\r\n }\r\n\r\n public get tooltipText() {\r\n return this._tooltipTextBlock?.text || null;\r\n }\r\n\r\n /**\r\n * Gets or sets text for the button\r\n */\r\n public get text(): string {\r\n return this._text;\r\n }\r\n\r\n public set text(value: string) {\r\n if (this._text === value) {\r\n return;\r\n }\r\n\r\n this._text = value;\r\n this._rebuildContent();\r\n }\r\n\r\n /**\r\n * Gets or sets subtext for a button with larger width\r\n */\r\n public get subtext(): string {\r\n return this._subtext;\r\n }\r\n\r\n public set subtext(value: string) {\r\n if (this._subtext === value) {\r\n return;\r\n }\r\n\r\n this._subtext = value;\r\n this._rebuildContent();\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 }\r\n\r\n /**\r\n * Gets the back material used by this button\r\n */\r\n public get backMaterial(): MRDLBackplateMaterial {\r\n return this._backMaterial;\r\n }\r\n\r\n /**\r\n * Gets the front material used by this button\r\n */\r\n public get frontMaterial(): MRDLFrontplateMaterial {\r\n return this._frontMaterial;\r\n }\r\n\r\n /**\r\n * Gets the back glow material used by this button\r\n */\r\n public get backGlowMaterial(): MRDLBackglowMaterial {\r\n return this._backGlowMaterial;\r\n }\r\n\r\n /**\r\n * Gets the inner quad material used by this button\r\n */\r\n public get innerQuadMaterial(): MRDLInnerquadMaterial {\r\n return this._innerQuadMaterial;\r\n }\r\n\r\n /**\r\n * Gets the plate material used by this button\r\n */\r\n public get plateMaterial(): StandardMaterial {\r\n return this._plateMaterial;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this button shares its material with other V3 Buttons\r\n */\r\n public get shareMaterials(): boolean {\r\n return this._shareMaterials;\r\n }\r\n\r\n /**\r\n * Sets whether the backplate is visible or hidden. Hiding the backplate is not recommended without some sort of replacement\r\n */\r\n public set isBackplateVisible(isVisible: boolean) {\r\n if (this.mesh && this._backMaterial) {\r\n if (isVisible && !this._isBackplateVisible) {\r\n this._backPlate.visibility = 1;\r\n } else if (!isVisible && this._isBackplateVisible) {\r\n this._backPlate.visibility = 0;\r\n }\r\n }\r\n\r\n this._isBackplateVisible = isVisible;\r\n }\r\n\r\n /**\r\n * Creates a new button\r\n * @param name defines the control name\r\n * @param shareMaterials\r\n */\r\n constructor(name?: string, shareMaterials = true) {\r\n super(name);\r\n\r\n this._shareMaterials = shareMaterials;\r\n\r\n this.pointerEnterAnimation = () => {\r\n if (this._frontPlate && this._textPlate && !this.isToggleButton) {\r\n this._performEnterExitAnimation(1);\r\n }\r\n\r\n if (this.isToggleButton && this._innerQuadMaterial) {\r\n if (this.isToggled) {\r\n this._innerQuadMaterial.color = this.innerQuadToggledHoverColor;\r\n } else {\r\n this._innerQuadMaterial.color = this.innerQuadHoverColor;\r\n }\r\n }\r\n };\r\n\r\n this.pointerOutAnimation = () => {\r\n if (this._frontPlate && this._textPlate && !this.isToggleButton) {\r\n this._performEnterExitAnimation(-0.8);\r\n }\r\n\r\n if (this.isToggleButton && this._innerQuadMaterial) {\r\n this._onToggle(this.isToggled);\r\n }\r\n };\r\n\r\n this.pointerDownAnimation = () => {\r\n // Do nothing\r\n };\r\n\r\n this.pointerUpAnimation = () => {\r\n // Do nothing\r\n };\r\n\r\n this._pointerClickObserver = this.onPointerClickObservable.add(() => {\r\n if (this._frontPlate && this._backGlow && !this.isActiveNearInteraction) {\r\n this._performClickAnimation();\r\n }\r\n\r\n if (this.isToggleButton && this._innerQuadMaterial) {\r\n this._onToggle(this.isToggled);\r\n }\r\n });\r\n\r\n this._pointerEnterObserver = this.onPointerEnterObservable.add(() => {\r\n this.pointerEnterAnimation();\r\n });\r\n\r\n this._pointerOutObserver = this.onPointerOutObservable.add(() => {\r\n this.pointerOutAnimation();\r\n });\r\n\r\n this._toggleObserver = this.onToggleObservable.add((isToggled) => {\r\n if (isToggled) {\r\n this._innerQuadMaterial.color = this.innerQuadToggledColor;\r\n } else {\r\n this._innerQuadMaterial.color = this.innerQuadColor;\r\n }\r\n });\r\n }\r\n\r\n protected override _getTypeName(): string {\r\n return \"TouchHolographicButton\";\r\n }\r\n\r\n private _rebuildContent(): void {\r\n let content: Control;\r\n\r\n if (this._getAspectRatio() <= 1) {\r\n // align text and image vertically\r\n content = this._alignContentVertically();\r\n } else {\r\n // align text and image horizontally\r\n content = this._alignContentHorizontally();\r\n }\r\n\r\n this.content = content;\r\n }\r\n\r\n private _getAspectRatio() {\r\n return this.width / this.height;\r\n }\r\n\r\n private _alignContentVertically() {\r\n const panel = new StackPanel();\r\n panel.isVertical = true;\r\n\r\n if (IsDocumentAvailable() && !!document.createElement) {\r\n if (this._imageUrl) {\r\n const image = new Image();\r\n image.source = this._imageUrl;\r\n image.heightInPixels = 180;\r\n image.widthInPixels = 100;\r\n image.paddingTopInPixels = 40;\r\n image.paddingBottomInPixels = 40;\r\n panel.addControl(image);\r\n }\r\n }\r\n\r\n if (this._text) {\r\n const text = new TextBlock();\r\n text.text = this._text;\r\n text.color = \"white\";\r\n text.heightInPixels = 30;\r\n text.fontSize = 24;\r\n panel.addControl(text);\r\n }\r\n\r\n return panel;\r\n }\r\n\r\n private _alignContentHorizontally() {\r\n let totalPanelWidthInPixels = 240;\r\n const padding = 15;\r\n\r\n const contentContainer = new Rectangle();\r\n contentContainer.widthInPixels = totalPanelWidthInPixels;\r\n contentContainer.heightInPixels = totalPanelWidthInPixels;\r\n contentContainer.color = \"transparent\";\r\n contentContainer.setPaddingInPixels(padding, padding, padding, padding);\r\n totalPanelWidthInPixels -= padding * 2;\r\n\r\n const panel = new StackPanel();\r\n panel.isVertical = false;\r\n panel.scaleY = this._getAspectRatio();\r\n\r\n if (IsDocumentAvailable() && !!document.createElement) {\r\n if (this._imageUrl) {\r\n const imageContainer = new Rectangle(`${this.name}_image`);\r\n imageContainer.widthInPixels = this.imageSizeInPixels;\r\n imageContainer.heightInPixels = this.imageSizeInPixels;\r\n imageContainer.color = \"transparent\";\r\n totalPanelWidthInPixels -= this.imageSizeInPixels;\r\n\r\n const image = new Image();\r\n image.source = this._imageUrl;\r\n\r\n imageContainer.addControl(image);\r\n panel.addControl(imageContainer);\r\n }\r\n }\r\n\r\n if (this._text) {\r\n const text = new TextBlock(`${this.name}_text`);\r\n text.text = this._text;\r\n text.color = \"white\";\r\n text.fontSize = this.textSizeInPixels;\r\n text.widthInPixels = totalPanelWidthInPixels;\r\n\r\n if (this._imageUrl) {\r\n text.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n text.paddingLeftInPixels = padding;\r\n }\r\n\r\n if (this._subtext) {\r\n const textContainer = new Grid();\r\n textContainer.addColumnDefinition(1);\r\n textContainer.addRowDefinition(0.5);\r\n textContainer.addRowDefinition(0.5);\r\n textContainer.widthInPixels = totalPanelWidthInPixels;\r\n textContainer.heightInPixels = 45;\r\n\r\n const subtext = new TextBlock(`${this.name}_subtext`);\r\n subtext.text = this._subtext;\r\n subtext.color = \"#EEEEEEAB\";\r\n subtext.fontSize = this.textSizeInPixels * 0.75;\r\n subtext.fontWeight = \"600\";\r\n\r\n if (this._imageUrl) {\r\n subtext.textHorizontalAlignment = Control.HORIZONTAL_ALIGNMENT_LEFT;\r\n subtext.paddingLeftInPixels = padding;\r\n }\r\n\r\n textContainer.addControl(text, 0);\r\n textContainer.addControl(subtext, 1);\r\n panel.addControl(textContainer);\r\n } else {\r\n panel.addControl(text);\r\n }\r\n }\r\n\r\n contentContainer.addControl(panel);\r\n return contentContainer;\r\n }\r\n\r\n // Mesh association\r\n protected override _createNode(scene: Scene): TransformNode {\r\n this.name = this.name ?? \"TouchHolographicButton\";\r\n\r\n const backPlateMesh = this._createBackPlate(scene);\r\n const collisionMesh = this._createFrontPlate(scene);\r\n const innerQuadMesh = this._createInnerQuad(scene);\r\n const backGlowMesh = this._createBackGlow(scene);\r\n\r\n this._frontPlateCollisionMesh = collisionMesh;\r\n this._textPlate = <Mesh>super._createNode(scene);\r\n this._textPlate.name = `${this.name}_textPlate`;\r\n this._textPlate.isPickable = false;\r\n this._textPlate.scaling.x = this.width;\r\n this._textPlate.parent = collisionMesh;\r\n\r\n this._backPlate = backPlateMesh;\r\n this._backPlate.position = Vector3.Forward(scene.useRightHandedSystem).scale(this.backPlateDepth / 2);\r\n this._backPlate.isPickable = false;\r\n\r\n this._backPlate.addChild(collisionMesh);\r\n this._backPlate.addChild(innerQuadMesh);\r\n\r\n if (backGlowMesh) {\r\n this._backPlate.addChild(backGlowMesh);\r\n }\r\n\r\n const tn = new TransformNode(`${this.name}_root`, scene);\r\n this._backPlate.setParent(tn);\r\n\r\n this.collisionMesh = collisionMesh;\r\n this.collidableFrontDirection = this._backPlate.forward.negate(); // Mesh is facing the wrong way\r\n\r\n return tn;\r\n }\r\n\r\n private _createBackPlate(scene: Scene) {\r\n const backPlateMesh = CreateBox(`${this.name}_backPlate`, {}, scene);\r\n backPlateMesh.isPickable = false;\r\n backPlateMesh.visibility = 0;\r\n backPlateMesh.scaling.z = 0.2;\r\n const baseUrl = Tools.GetAssetUrl(TouchHolographicButton.MRTK_ASSET_BASE_URL);\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n SceneLoader.ImportMeshAsync(undefined, baseUrl, TouchHolographicButton.BACKPLATE_MODEL_FILENAME, scene).then((result) => {\r\n const backPlateModel = result.meshes[1];\r\n backPlateModel.visibility = 0;\r\n\r\n if (this._isBackplateVisible) {\r\n backPlateModel.visibility = 1;\r\n backPlateModel.name = `${this.name}_backPlate`;\r\n backPlateModel.isPickable = false;\r\n backPlateModel.scaling.x = this.width;\r\n backPlateModel.scaling.y = this.height;\r\n backPlateModel.parent = backPlateMesh;\r\n }\r\n\r\n if (this._backMaterial) {\r\n backPlateModel.material = this._backMaterial;\r\n }\r\n\r\n this._backPlate = backPlateModel;\r\n });\r\n\r\n return backPlateMesh;\r\n }\r\n\r\n private _createFrontPlate(scene: Scene) {\r\n const collisionMesh = CreateBox(\r\n `${this.name}_frontPlate`,\r\n {\r\n width: this.width,\r\n height: this.height,\r\n depth: this.frontPlateDepth,\r\n },\r\n scene\r\n );\r\n collisionMesh.isPickable = true;\r\n collisionMesh.isNearPickable = true;\r\n collisionMesh.visibility = 0;\r\n collisionMesh.position = Vector3.Forward(scene.useRightHandedSystem).scale((this.backPlateDepth - this.frontPlateDepth) / 2);\r\n const baseUrl = Tools.GetAssetUrl(TouchHolographicButton.MRTK_ASSET_BASE_URL);\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n SceneLoader.ImportMeshAsync(undefined, baseUrl, TouchHolographicButton.FRONTPLATE_MODEL_FILENAME, scene).then((result) => {\r\n const collisionPlate = CreateBox(\r\n `${this.name}_collisionPlate`,\r\n {\r\n width: this.width,\r\n height: this.height,\r\n },\r\n scene\r\n );\r\n collisionPlate.isPickable = false;\r\n collisionPlate.scaling.z = this.frontPlateDepth;\r\n collisionPlate.visibility = 0;\r\n collisionPlate.parent = collisionMesh;\r\n this._collisionPlate = collisionPlate;\r\n\r\n const frontPlateModel = result.meshes[1];\r\n frontPlateModel.name = `${this.name}_frontPlate`;\r\n frontPlateModel.isPickable = false;\r\n frontPlateModel.scaling.x = this.width - this.backGlowOffset;\r\n frontPlateModel.scaling.y = this.height - this.backGlowOffset;\r\n frontPlateModel.position = Vector3.Forward(scene.useRightHandedSystem).scale(-0.5);\r\n frontPlateModel.parent = collisionPlate;\r\n\r\n if (this.isToggleButton) {\r\n frontPlateModel.visibility = 0;\r\n }\r\n\r\n if (this._frontMaterial) {\r\n frontPlateModel.material = this._frontMaterial;\r\n }\r\n\r\n this._textPlate.scaling.x = 1;\r\n this._textPlate.parent = frontPlateModel;\r\n this._frontPlate = frontPlateModel;\r\n });\r\n\r\n return collisionMesh;\r\n }\r\n\r\n private _createInnerQuad(scene: Scene) {\r\n const innerQuadMesh = CreateBox(`${this.name}_innerQuad`, {}, scene);\r\n innerQuadMesh.isPickable = false;\r\n innerQuadMesh.visibility = 0;\r\n innerQuadMesh.scaling.z = this.flatPlaneDepth;\r\n innerQuadMesh.position.z += this.backPlateDepth / 2 - this.flatPlaneDepth;\r\n\r\n const baseUrl = Tools.GetAssetUrl(TouchHolographicButton.MRTK_ASSET_BASE_URL);\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n SceneLoader.ImportMeshAsync(undefined, baseUrl, TouchHolographicButton.INNERQUAD_MODEL_FILENAME, scene).then((result) => {\r\n const innerQuadModel = result.meshes[1];\r\n innerQuadModel.name = `${this.name}_innerQuad`;\r\n innerQuadModel.isPickable = false;\r\n innerQuadModel.scaling.x = this.width - this.backGlowOffset;\r\n innerQuadModel.scaling.y = this.height - this.backGlowOffset;\r\n innerQuadModel.parent = innerQuadMesh;\r\n\r\n if (this._innerQuadMaterial) {\r\n innerQuadModel.material = this._innerQuadMaterial;\r\n }\r\n\r\n this._innerQuad = innerQuadModel;\r\n });\r\n\r\n return innerQuadMesh;\r\n }\r\n\r\n private _createBackGlow(scene: Scene) {\r\n if (this.isToggleButton) {\r\n return;\r\n }\r\n\r\n const backGlowMesh = CreateBox(`${this.name}_backGlow`, {}, scene);\r\n backGlowMesh.isPickable = false;\r\n backGlowMesh.visibility = 0;\r\n backGlowMesh.scaling.z = this.flatPlaneDepth;\r\n backGlowMesh.position.z += this.backPlateDepth / 2 - this.flatPlaneDepth * 2;\r\n\r\n const baseUrl = Tools.GetAssetUrl(TouchHolographicButton.MRTK_ASSET_BASE_URL);\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n SceneLoader.ImportMeshAsync(undefined, baseUrl, TouchHolographicButton.BACKGLOW_MODEL_FILENAME, scene).then((result) => {\r\n const backGlowModel = result.meshes[1];\r\n backGlowModel.name = `${this.name}_backGlow`;\r\n backGlowModel.isPickable = false;\r\n backGlowModel.scaling.x = this.width - this.backGlowOffset;\r\n backGlowModel.scaling.y = this.height - this.backGlowOffset;\r\n backGlowModel.parent = backGlowMesh;\r\n\r\n if (this._backGlowMaterial) {\r\n backGlowModel.material = this._backGlowMaterial;\r\n }\r\n\r\n this._backGlow = backGlowModel;\r\n });\r\n\r\n return backGlowMesh;\r\n }\r\n\r\n protected override _applyFacade(facadeTexture: AdvancedDynamicTexture) {\r\n this._plateMaterial.emissiveTexture = facadeTexture;\r\n this._plateMaterial.opacityTexture = facadeTexture;\r\n this._plateMaterial.diffuseColor = this.plateMaterialColor;\r\n }\r\n\r\n private _performClickAnimation() {\r\n const frameRate = 60;\r\n const animationGroup = new AnimationGroup(\"Click Animation Group\");\r\n\r\n const animations = [\r\n {\r\n name: \"backGlowMotion\",\r\n mesh: this._backGlow,\r\n property: \"material.motion\",\r\n keys: [\r\n {\r\n frame: 0,\r\n values: [0, 0, 0],\r\n },\r\n {\r\n frame: 20,\r\n values: [1, 0.0144, 0.0144],\r\n },\r\n {\r\n frame: 40,\r\n values: [0.0027713229489760476, 0, 0],\r\n },\r\n {\r\n frame: 45,\r\n values: [0.0027713229489760476],\r\n },\r\n ],\r\n },\r\n {\r\n name: \"_collisionPlateZSlide\",\r\n mesh: this._collisionPlate,\r\n property: \"position.z\",\r\n keys: [\r\n {\r\n frame: 0,\r\n values: [0.0, 0.0, 0.0],\r\n },\r\n {\r\n frame: 20,\r\n values: [Vector3.Forward(this._collisionPlate._scene.useRightHandedSystem).scale(this.frontPlateDepth / 2).z, 0.0, 0.0],\r\n },\r\n {\r\n frame: 40,\r\n values: [0.0, 0.005403332496794331],\r\n },\r\n {\r\n frame: 45,\r\n values: [0.0],\r\n },\r\n ],\r\n },\r\n {\r\n name: \"_collisionPlateZScale\",\r\n mesh: this._collisionPlate,\r\n property: \"scaling.z\",\r\n keys: [\r\n {\r\n frame: 0,\r\n values: [this.frontPlateDepth, 0.0, 0.0],\r\n },\r\n {\r\n frame: 20,\r\n values: [this.backPlateDepth, 0.0, 0.0],\r\n },\r\n {\r\n frame: 40,\r\n values: [this.frontPlateDepth, 0.0054],\r\n },\r\n {\r\n frame: 45,\r\n values: [this.frontPlateDepth],\r\n },\r\n ],\r\n },\r\n ];\r\n\r\n for (const animation of animations) {\r\n const anim = new Animation(animation.name, animation.property, frameRate, Animation.ANIMATIONTYPE_FLOAT, Animation.ANIMATIONLOOPMODE_CYCLE);\r\n const animkeyFrames = [];\r\n\r\n for (const key of animation.keys) {\r\n animkeyFrames.push({\r\n frame: key.frame,\r\n value: key.values[0],\r\n inTangent: key.values[1],\r\n outTangent: key.values[2],\r\n interpolation: key.values[3],\r\n });\r\n }\r\n\r\n anim.setKeys(animkeyFrames);\r\n\r\n if (!animation.mesh) {\r\n continue;\r\n }\r\n\r\n animationGroup.addTargetedAnimation(anim, animation.mesh);\r\n }\r\n\r\n animationGroup.normalize(0, 45);\r\n animationGroup.speedRatio = 1;\r\n\r\n animationGroup.play();\r\n }\r\n\r\n private _performEnterExitAnimation(speedRatio: number) {\r\n const frameRate = 60;\r\n const animationGroup = new AnimationGroup(\"Enter Exit Animation Group\");\r\n\r\n const animations = [\r\n {\r\n name: \"frontPlateFadeOut\",\r\n mesh: this._frontPlate,\r\n property: \"material.fadeOut\",\r\n keys: [\r\n {\r\n frame: 0,\r\n values: [0, 0, 0.025045314830017686, 0],\r\n },\r\n {\r\n frame: 40,\r\n values: [1.00205599570012, 0.025045314830017686, 0, 0],\r\n },\r\n ],\r\n },\r\n {\r\n name: \"textPlateZSlide\",\r\n mesh: this._textPlate,\r\n property: \"position.z\",\r\n keys: [\r\n {\r\n frame: 0,\r\n values: [0, 0.0, 0.0],\r\n },\r\n {\r\n frame: 40,\r\n values: [Vector3.Forward(this._textPlate._scene.useRightHandedSystem).scale(-0.15).z, 0.0, 0.0],\r\n },\r\n ],\r\n },\r\n ];\r\n\r\n for (const animation of animations) {\r\n const anim = new Animation(animation.name, animation.property, frameRate, Animation.ANIMATIONTYPE_FLOAT, Animation.ANIMATIONLOOPMODE_CYCLE);\r\n const animkeyFrames = [];\r\n\r\n for (const key of animation.keys) {\r\n animkeyFrames.push({\r\n frame: key.frame,\r\n value: key.values[0],\r\n inTangent: key.values[1],\r\n outTangent: key.values[2],\r\n interpolation: key.values[3],\r\n });\r\n }\r\n\r\n anim.setKeys(animkeyFrames);\r\n\r\n if (!animation.mesh) {\r\n continue;\r\n }\r\n\r\n animationGroup.addTargetedAnimation(anim, animation.mesh);\r\n }\r\n\r\n animationGroup.normalize(0, 45);\r\n animationGroup.speedRatio = speedRatio;\r\n\r\n animationGroup.play();\r\n }\r\n\r\n private _createBackMaterial(mesh: Mesh) {\r\n this._backMaterial = this._backMaterial ?? new MRDLBackplateMaterial(this.name + \"backPlateMaterial\", mesh.getScene());\r\n this._backMaterial.absoluteSizes = true;\r\n this._backMaterial.radius = this.radius;\r\n this._backMaterial.lineWidth = 0.02;\r\n }\r\n\r\n private _createFrontMaterial(mesh: Mesh) {\r\n this._frontMaterial = this._frontMaterial ?? new MRDLFrontplateMaterial(this.name + \"Front Material\", mesh.getScene());\r\n this.frontMaterial.radius = this.innerQuadRadius;\r\n this.frontMaterial.fadeOut = 0.0;\r\n }\r\n\r\n private _createBackGlowMaterial(mesh: Mesh) {\r\n const glowRadius = this.radius + 0.04;\r\n this._backGlowMaterial = this._backGlowMaterial ?? new MRDLBackglowMaterial(this.name + \"Back Glow Material\", mesh.getScene());\r\n this._backGlowMaterial.bevelRadius = glowRadius;\r\n this._backGlowMaterial.lineWidth = glowRadius;\r\n this._backGlowMaterial.motion = 0.0;\r\n }\r\n\r\n private _createInnerQuadMaterial(mesh: Mesh) {\r\n this._innerQuadMaterial = this._innerQuadMaterial ?? new MRDLInnerquadMaterial(\"inner_quad\", mesh.getScene());\r\n this._innerQuadMaterial.radius = this.innerQuadRadius;\r\n\r\n if (this.isToggleButton) {\r\n this._innerQuadMaterial.color = this.innerQuadColor;\r\n }\r\n }\r\n\r\n private _createPlateMaterial(mesh: Mesh) {\r\n this._plateMaterial = this._plateMaterial ?? new StandardMaterial(this.name + \"Plate Material\", mesh.getScene());\r\n this._plateMaterial.specularColor = Color3.Black();\r\n }\r\n\r\n protected override _onToggle(newState: boolean) {\r\n super._onToggle(newState);\r\n }\r\n\r\n protected override _affectMaterial(mesh: Mesh) {\r\n if (this._shareMaterials) {\r\n // Back\r\n if (!this._host._touchSharedMaterials[\"mrdlBackplateMaterial\"]) {\r\n this._createBackMaterial(mesh);\r\n this._host._touchSharedMaterials[\"mrdlBackplateMaterial\"] = this._backMaterial;\r\n } else {\r\n this._backMaterial = this._host._touchSharedMaterials[\"mrdlBackplateMaterial\"] as MRDLBackplateMaterial;\r\n }\r\n\r\n // Front\r\n if (!this._host._touchSharedMaterials[\"mrdlFrontplateMaterial\"]) {\r\n this._createFrontMaterial(mesh);\r\n this._host._touchSharedMaterials[\"mrdlFrontplateMaterial\"] = this._frontMaterial;\r\n } else {\r\n this._frontMaterial = this._host._touchSharedMaterials[\"mrdlFrontplateMaterial\"] as MRDLFrontplateMaterial;\r\n }\r\n\r\n // Back glow\r\n if (!this._host._touchSharedMaterials[\"mrdlBackglowMaterial\"]) {\r\n this._createBackGlowMaterial(mesh);\r\n this._host._touchSharedMaterials[\"mrdlBackglowMaterial\"] = this._backGlowMaterial;\r\n } else {\r\n this._backGlowMaterial = this._host._touchSharedMaterials[\"mrdlBackglowMaterial\"] as MRDLBackglowMaterial;\r\n }\r\n\r\n // Inner quad\r\n if (!this._host._touchSharedMaterials[\"mrdlInnerQuadMaterial\"]) {\r\n this._createInnerQuadMaterial(mesh);\r\n this._host._touchSharedMaterials[\"mrdlInnerQuadMaterial\"] = this._innerQuadMaterial;\r\n } else {\r\n this._innerQuadMaterial = this._host._touchSharedMaterials[\"mrdlInnerQuadMaterial\"] as MRDLInnerquadMaterial;\r\n }\r\n } else {\r\n this._createBackMaterial(mesh);\r\n this._createFrontMaterial(mesh);\r\n this._createBackGlowMaterial(mesh);\r\n this._createInnerQuadMaterial(mesh);\r\n }\r\n\r\n this._createPlateMaterial(mesh);\r\n this._backPlate.material = this._backMaterial;\r\n this._textPlate.material = this._plateMaterial;\r\n\r\n if (!this._isBackplateVisible) {\r\n this._backPlate.visibility = 0;\r\n }\r\n\r\n if (this._frontPlate) {\r\n this._frontPlate.material = this._frontMaterial;\r\n }\r\n\r\n if (this._backGlow) {\r\n this._backGlow.material = this._backGlowMaterial;\r\n }\r\n\r\n if (this._innerQuad) {\r\n this._innerQuad.material = this._innerQuadMaterial;\r\n }\r\n\r\n this._rebuildContent();\r\n }\r\n\r\n /**\r\n * Releases all associated resources\r\n */\r\n public override dispose() {\r\n super.dispose(); // will dispose main mesh ie. back plate\r\n\r\n this._disposeTooltip();\r\n this.onPointerClickObservable.remove(this._pointerClickObserver);\r\n this.onPointerEnterObservable.remove(this._pointerEnterObserver);\r\n this.onPointerOutObservable.remove(this._pointerOutObserver);\r\n this.onToggleObservable.remove(this._toggleObserver);\r\n\r\n if (!this.shareMaterials) {\r\n this._backMaterial.dispose();\r\n this._frontMaterial.dispose();\r\n this._plateMaterial.dispose();\r\n this._backGlowMaterial.dispose();\r\n this._innerQuadMaterial.dispose();\r\n\r\n if (this._pickedPointObserver) {\r\n this._host.onPickedPointChangedObservable.remove(this._pickedPointObserver);\r\n this._pickedPointObserver = null;\r\n }\r\n }\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type Nullable } from \"core/types\";\r\nimport { type Observer, Observable } from \"core/Misc/observable\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { type PointerInfo, PointerEventTypes } from \"core/Events/pointerEvents\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { HemisphericLight } from \"core/Lights/hemisphericLight\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { UtilityLayerRenderer } from \"core/Rendering/utilityLayerRenderer\";\r\nimport { EngineStore } from \"core/Engines/engineStore\";\r\nimport { type IDisposable, type Scene } from \"core/scene\";\r\n\r\nimport { Container3D } from \"./controls/container3D\";\r\nimport { type Control3D } from \"./controls/control3D\";\r\nimport { type IPointerEvent } from \"core/Events/deviceInputEvents\";\r\n\r\n/**\r\n * Class used to manage 3D user interface\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/gui/gui3D\r\n */\r\nexport class GUI3DManager implements IDisposable {\r\n private _scene: Scene;\r\n private _sceneDisposeObserver: Nullable<Observer<Scene>>;\r\n private _utilityLayer: Nullable<UtilityLayerRenderer>;\r\n private _rootContainer: Container3D;\r\n private _pointerObserver: Nullable<Observer<PointerInfo>>;\r\n private _pointerOutObserver: Nullable<Observer<number>>;\r\n private _customControlScaling = 1.0;\r\n /** @internal */\r\n public _lastPickedControl: Control3D;\r\n /** @internal */\r\n public _lastControlOver: { [pointerId: number]: Control3D } = {};\r\n /** @internal */\r\n public _lastControlDown: { [pointerId: number]: Control3D } = {};\r\n\r\n protected static MRTK_REALISTIC_SCALING: number = 0.032;\r\n\r\n /**\r\n * Observable raised when the point picked by the pointer events changed\r\n */\r\n public onPickedPointChangedObservable = new Observable<Nullable<Vector3>>();\r\n\r\n /**\r\n * Observable raised when a picking happens\r\n */\r\n public onPickingObservable = new Observable<Nullable<AbstractMesh>>();\r\n\r\n // Shared resources\r\n /** @internal */\r\n public _sharedMaterials: { [key: string]: Material } = {};\r\n\r\n /** @internal */\r\n public _touchSharedMaterials: { [key: string]: Material } = {};\r\n\r\n /** Gets the hosting scene */\r\n public get scene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n /** Gets associated utility layer */\r\n public get utilityLayer(): Nullable<UtilityLayerRenderer> {\r\n return this._utilityLayer;\r\n }\r\n\r\n /** Gets the scaling for all UI elements owned by this manager */\r\n public get controlScaling() {\r\n return this._customControlScaling;\r\n }\r\n\r\n /** Sets the scaling adjustment for all UI elements owned by this manager */\r\n public set controlScaling(newScale: number) {\r\n if (this._customControlScaling !== newScale && newScale > 0) {\r\n const scaleRatio = newScale / this._customControlScaling;\r\n this._customControlScaling = newScale;\r\n\r\n for (const control of this._rootContainer.children) {\r\n control.scaling.scaleInPlace(scaleRatio);\r\n\r\n if (newScale !== 1) {\r\n control._isScaledByManager = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Gets if controls attached to this manager are realistically sized, based on the fact that 1 unit length is 1 meter */\r\n public get useRealisticScaling() {\r\n return this.controlScaling === GUI3DManager.MRTK_REALISTIC_SCALING;\r\n }\r\n\r\n /** Sets if controls attached to this manager are realistically sized, based on the fact that 1 unit length is 1 meter */\r\n public set useRealisticScaling(newValue: boolean) {\r\n this.controlScaling = newValue ? GUI3DManager.MRTK_REALISTIC_SCALING : 1;\r\n }\r\n\r\n /**\r\n * Creates a new GUI3DManager\r\n * @param scene\r\n */\r\n public constructor(scene?: Scene) {\r\n this._scene = scene || EngineStore.LastCreatedScene!;\r\n this._sceneDisposeObserver = this._scene.onDisposeObservable.add(() => {\r\n this._sceneDisposeObserver = null;\r\n this._utilityLayer = null;\r\n this.dispose();\r\n });\r\n\r\n this._utilityLayer = UtilityLayerRenderer._CreateDefaultUtilityLayerFromScene(this._scene);\r\n this._utilityLayer.onlyCheckPointerDownEvents = false;\r\n this._utilityLayer.pickUtilitySceneFirst = false;\r\n this._utilityLayer.mainSceneTrackerPredicate = (mesh: Nullable<AbstractMesh>) => {\r\n return mesh && mesh.reservedDataStore?.GUI3D?.control?._node;\r\n };\r\n\r\n // Root\r\n this._rootContainer = new Container3D(\"RootContainer\");\r\n this._rootContainer._host = this;\r\n const utilityLayerScene = this._utilityLayer.utilityLayerScene;\r\n\r\n // Events\r\n this._pointerOutObserver = this._utilityLayer.onPointerOutObservable.add((pointerId) => {\r\n this._handlePointerOut(pointerId, true);\r\n });\r\n\r\n this._pointerObserver = utilityLayerScene.onPointerObservable.add((pi) => {\r\n this._doPicking(pi);\r\n });\r\n\r\n // Scene\r\n this._utilityLayer.utilityLayerScene.autoClear = false;\r\n this._utilityLayer.utilityLayerScene.autoClearDepthAndStencil = false;\r\n new HemisphericLight(\"hemi\", Vector3.Up(), this._utilityLayer.utilityLayerScene);\r\n }\r\n\r\n private _handlePointerOut(pointerId: number, isPointerUp: boolean) {\r\n const previousControlOver = this._lastControlOver[pointerId];\r\n if (previousControlOver) {\r\n previousControlOver._onPointerOut(previousControlOver);\r\n delete this._lastControlOver[pointerId];\r\n }\r\n\r\n if (isPointerUp) {\r\n if (this._lastControlDown[pointerId]) {\r\n this._lastControlDown[pointerId].forcePointerUp();\r\n delete this._lastControlDown[pointerId];\r\n }\r\n }\r\n\r\n this.onPickedPointChangedObservable.notifyObservers(null);\r\n }\r\n\r\n private _doPicking(pi: PointerInfo): boolean {\r\n if (!this._utilityLayer || !this._utilityLayer.shouldRender || !this._utilityLayer.utilityLayerScene.activeCamera) {\r\n return false;\r\n }\r\n\r\n const pointerEvent = <IPointerEvent>pi.event;\r\n\r\n const pointerId = pointerEvent.pointerId || 0;\r\n const buttonIndex = pointerEvent.button;\r\n\r\n const pickingInfo = pi.pickInfo;\r\n if (pickingInfo) {\r\n this.onPickingObservable.notifyObservers(pickingInfo.pickedMesh);\r\n }\r\n\r\n if (!pickingInfo || !pickingInfo.hit) {\r\n this._handlePointerOut(pointerId, pi.type === PointerEventTypes.POINTERUP);\r\n return false;\r\n }\r\n\r\n if (pickingInfo.pickedPoint) {\r\n this.onPickedPointChangedObservable.notifyObservers(pickingInfo.pickedPoint);\r\n }\r\n\r\n const control = <Control3D>pickingInfo.pickedMesh!.reservedDataStore?.GUI3D?.control;\r\n if (!!control && !control._processObservables(pi.type, pickingInfo.pickedPoint!, pickingInfo.originMesh?.position || null, pointerId, buttonIndex)) {\r\n if (pi.type === PointerEventTypes.POINTERMOVE) {\r\n if (this._lastControlOver[pointerId]) {\r\n this._lastControlOver[pointerId]._onPointerOut(this._lastControlOver[pointerId]);\r\n }\r\n\r\n delete this._lastControlOver[pointerId];\r\n }\r\n }\r\n\r\n if (pi.type === PointerEventTypes.POINTERUP) {\r\n if (this._lastControlDown[pointerEvent.pointerId]) {\r\n this._lastControlDown[pointerEvent.pointerId].forcePointerUp();\r\n delete this._lastControlDown[pointerEvent.pointerId];\r\n }\r\n\r\n if (pointerEvent.pointerType === \"touch\" || (pointerEvent.pointerType === \"xr\" && this._scene.getEngine().hostInformation.isMobile)) {\r\n this._handlePointerOut(pointerId, false);\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Gets the root container\r\n */\r\n public get rootContainer(): Container3D {\r\n return this._rootContainer;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the given control is in the root child list\r\n * @param control defines the control to check\r\n * @returns true if the control is in the root child list\r\n */\r\n public containsControl(control: Control3D): boolean {\r\n return this._rootContainer.containsControl(control);\r\n }\r\n\r\n /**\r\n * Adds a control to the root child list\r\n * @param control defines the control to add\r\n * @returns the current manager\r\n */\r\n public addControl(control: Control3D): GUI3DManager {\r\n this._rootContainer.addControl(control);\r\n if (this._customControlScaling !== 1) {\r\n control.scaling.scaleInPlace(this._customControlScaling);\r\n control._isScaledByManager = true;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes a control from the root child list\r\n * @param control defines the control to remove\r\n * @returns the current container\r\n */\r\n public removeControl(control: Control3D): GUI3DManager {\r\n this._rootContainer.removeControl(control);\r\n if (control._isScaledByManager) {\r\n control.scaling.scaleInPlace(1 / this._customControlScaling);\r\n control._isScaledByManager = false;\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Releases all associated resources\r\n */\r\n public dispose() {\r\n this._rootContainer.dispose();\r\n\r\n for (const materialName in this._sharedMaterials) {\r\n if (!Object.prototype.hasOwnProperty.call(this._sharedMaterials, materialName)) {\r\n continue;\r\n }\r\n\r\n this._sharedMaterials[materialName].dispose();\r\n }\r\n\r\n this._sharedMaterials = {};\r\n\r\n for (const materialName in this._touchSharedMaterials) {\r\n if (!Object.prototype.hasOwnProperty.call(this._touchSharedMaterials, materialName)) {\r\n continue;\r\n }\r\n\r\n this._touchSharedMaterials[materialName].dispose();\r\n }\r\n\r\n this._touchSharedMaterials = {};\r\n\r\n if (this._pointerOutObserver && this._utilityLayer) {\r\n this._utilityLayer.onPointerOutObservable.remove(this._pointerOutObserver);\r\n this._pointerOutObserver = null;\r\n }\r\n\r\n this.onPickedPointChangedObservable.clear();\r\n this.onPickingObservable.clear();\r\n\r\n const utilityLayerScene = this._utilityLayer ? this._utilityLayer.utilityLayerScene : null;\r\n\r\n if (utilityLayerScene) {\r\n if (this._pointerObserver) {\r\n utilityLayerScene.onPointerObservable.remove(this._pointerObserver);\r\n this._pointerObserver = null;\r\n }\r\n }\r\n if (this._scene) {\r\n if (this._sceneDisposeObserver) {\r\n this._scene.onDisposeObservable.remove(this._sceneDisposeObserver);\r\n this._sceneDisposeObserver = null;\r\n }\r\n }\r\n\r\n if (this._utilityLayer) {\r\n this._utilityLayer.dispose();\r\n }\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-restricted-imports */\r\nimport * as GUI from \"gui/index\";\r\n\r\n/**\r\n * Legacy support, defining window.BABYLON.GUI (global variable).\r\n *\r\n * This is the entry point for the UMD module.\r\n * The entry point for a future ESM package should be index.ts\r\n */\r\nconst GlobalObject = typeof global !== \"undefined\" ? global : typeof window !== \"undefined\" ? window : undefined;\r\nif (typeof GlobalObject !== \"undefined\") {\r\n (<any>GlobalObject).BABYLON = (<any>GlobalObject).BABYLON || {};\r\n if (!(<any>GlobalObject).BABYLON.GUI) {\r\n (<any>GlobalObject).BABYLON.GUI = GUI;\r\n }\r\n}\r\n\r\nexport * from \"gui/index\";\r\n"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","TypeError","String","__","this","constructor","create","__assign","assign","t","s","i","n","arguments","length","apply","__decorate","decorators","target","key","desc","c","r","getOwnPropertyDescriptor","Reflect","decorate","defineProperty","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","__generator","body","f","y","_","label","sent","trys","ops","g","Iterator","verb","Symbol","iterator","v","op","pop","push","SuppressedError","ValueAndUnit","unit","negativeValueAllowed","UNITMODE_PIXEL","_value","_unit","ignoreAdaptiveScaling","onChangedObservable","Observable","_originalUnit","get","UNITMODE_PERCENTAGE","set","notifyObservers","getValueInPixel","host","refValue","isPixel","getValue","updateInPlace","width","height","idealWidth","Math","ceil","getSize","idealHeight","useSmallestIdeal","window","innerWidth","innerHeight","toString","decimals","percentage","toFixed","pixels","fromString","source","match","_Regex","exec","sourceValue","parseFloat","sourceUnit","_UNITMODE_PERCENTAGE","_UNITMODE_PIXEL","TmpRect","Vector2","TmpRect2","TmpV1","TmpV2","Measure","left","top","copyFrom","other","copyFromFloats","CombineToRef","a","min","right","max","bottom","addAndTransformToRef","transform","addX","addY","addWidth","addHeight","Number","MAX_VALUE","transformCoordinates","x","floor","transformToRef","isEqualsTo","Empty","Vector2WithInfo","_super","buttonIndex","_this","Matrix2D","m00","m01","m10","m11","m20","m21","m","Float32Array","fromValues","determinant","invertToRef","l0","l1","l2","l3","l4","l5","det","Epsilon","detDiv","det4","det5","multiplyToRef","r0","r1","r2","r3","r4","r5","Identity","IdentityToRef","TranslationToRef","ScalingToRef","RotationToRef","angle","sin","cos","ComposeToRef","tx","ty","scaleX","scaleY","parentMatrix","_TempPreTranslationMatrix","_TempScalingMatrix","_TempRotationMatrix","_TempPostTranslationMatrix","_TempCompose0","_TempCompose1","_TempCompose2","MathTools","Round","precision","DefaultRoundingPrecision","round","Control","name","_alpha","_alphaSet","_zIndex","_currentMeasure","_tempPaddingMeasure","_fontFamily","_fontStyle","_fontWeight","_fontSize","_width","_height","_color","_style","_horizontalAlignment","HORIZONTAL_ALIGNMENT_CENTER","_verticalAlignment","VERTICAL_ALIGNMENT_CENTER","_isDirty","_wasDirty","_tempParentMeasure","_prevCurrentMeasureTransformedIntoGlobalSpace","_cachedParentMeasure","_descendantsOnlyPadding","_paddingLeft","_paddingRight","_paddingTop","_paddingBottom","_left","_top","_scaleX","_scaleY","_rotation","_transformCenterX","_transformCenterY","_transformMatrix","_invertTransformMatrix","_transformedPosition","Zero","_isMatrixDirty","_isVisible","_isHighlighted","_highlightColor","_highlightLineWidth","_fontSet","_dummyVector2","_downCount","_enterCount","_doNotRender","_downPointerIds","_evaluatedMeasure","_evaluatedParentMeasure","_isEnabled","_disabledColor","_disabledColorItem","_isReadOnly","_gradient","_rebuildLayout","onEnabledStateChangedObservable","_customData","_isClipped","_automaticSize","metadata","isHitTestVisible","isPointerBlocker","isFocusInvisible","_clipChildren","_clipContent","useBitmapCache","_shadowOffsetX","_shadowOffsetY","_shadowBlur","_previousShadowBlur","_shadowColor","hoverCursor","_linkOffsetX","_linkOffsetY","_accessibilityTag","onAccessibilityTagChangedObservable","onWheelObservable","onPointerMoveObservable","onPointerOutObservable","onPointerDownObservable","onPointerUpObservable","onPointerClickObservable","onEnterPressedObservable","onPointerEnterObservable","onDirtyObservable","onBeforeDrawObservable","onAfterDrawObservable","onDisposeObservable","onIsVisibleChangedObservable","isSerializable","_fixedRatio","_fixedRatioMasterIsWidth","animations","_focusedColor","tabIndex","_isFocused","_unfocusedColor","onFocusObservable","onBlurObservable","onKeyboardEventProcessedObservable","_tmpMeasureA","_markAsDirty","_getTypeName","getClassName","_host","_fontOffset","offset","_markMatrixAsDirty","isNaN","_resetFontCache","remove","_styleObserver","add","isPercentage","fontSizeToUse","fontSize","zIndex","parent","_reOrderControl","_linkedMesh","paddingLeft","paddingLeftInPixels","paddingRight","paddingRightInPixels","paddingTop","paddingTopInPixels","paddingBottom","paddingBottomInPixels","linkOffsetX","linkOffsetY","recursivelyFirePointerOut","control","pointer","_lastControlOver","_onPointerOut","undefined","children","_i","_a","child","onBlur","focusedColor","color","onFocus","keepsFocusWith","focus","moveFocusToControl","blur","focusedControl","processKeyboard","evt","getAscendantOfClass","className","markAsDirty","force","markAllAsDirty","_markAllAsDirty","isAscendant","container","getLocalCoordinates","globalCoordinates","getLocalCoordinatesToRef","getParentLocalCoordinates","moveToVector3","position","scene","_rootContainer","horizontalAlignment","HORIZONTAL_ALIGNMENT_LEFT","verticalAlignment","VERTICAL_ALIGNMENT_TOP","globalViewport","_getGlobalViewport","projectedPosition","Vector3","Project","Matrix","IdentityReadOnly","getTransformMatrix","_moveToProjectedPosition","z","notRenderable","Tools","Error","getDescendantsToRef","results","directDescendantsOnly","predicate","getDescendants","linkWithMesh","mesh","index","_linkedControls","indexOf","splice","setPadding","setPaddingInPixels","oldLeft","oldTop","parentMeasure","_processMeasures","getContext","newLeft","newTop","abs","_offsetLeft","_offsetTop","_flagDescendantsAsMatrixDirty","_intersectsRect","rect","context","_transform","_computeAdditionalOffsetX","_computeAdditionalOffsetY","invalidateRect","useInvalidateRectOptimization","shadowOffsetX","idealRatio","shadowOffsetY","shadowBlur","leftShadowOffset","rightShadowOffset","topShadowOffset","bottomShadowOffset","offsetX","offsetY","_font","_prepareFont","_link","uniqueId","getScene","getUniqueId","translate","rotate","scale","_cachedOffsetX","_cachedOffsetY","_renderHighlight","isHighlighted","save","strokeStyle","lineWidth","_renderHighlightSpecific","restore","strokeRect","_getColor","gradient","getCanvasGradient","_applyStates","_isFontSizeInPercentage","font","fillStyle","AllowAlphaInheritance","globalAlpha","renderToIntermediateTexture","alpha","_layout","isDirty","isVisible","_numLayoutCalls","_paddingLeftInPixels","_paddingTopInPixels","_paddingRightInPixels","_paddingBottomInPixels","rebuildCount","Logger","concat","_evaluateClippingState","descendantsOnlyPadding","_preMeasure","_measure","_postMeasure","_computeAlignment","_additionalProcessing","hasObservers","clipChildren","parentWidth","parentHeight","HORIZONTAL_ALIGNMENT_RIGHT","VERTICAL_ALIGNMENT_BOTTOM","_clipForChildren","_clip","invalidatedRectangle","beginPath","_ClipMeasure","intersection","clip","_render","_numRenderCalls","clipContent","_cacheData","putImageData","_draw","getImageData","contains","_shouldBlockPointer","_processPicking","pi","type","pointerId","deltaX","deltaY","_processObservables","_onPointerMove","coordinates","_onPointerEnter","canNotify","_onPointerDown","rootContainer","_capturedPointerIds","event","_onPointerUp","notifyClick","canNotifyClick","usePointerTapForClickEvent","delete","_onPointerPick","_forcePointerUp","_onWheelScroll","_onCanvasBlur","PointerEventTypes","POINTERMOVE","previousControlOver","POINTERDOWN","_registerLastControlDown","_lastPickedControl","POINTERUP","_lastControlDown","POINTERWHEEL","POINTERTAP","_getStyleProperty","propName","defaultValue","prop","fontSizeInPixels","_GetFontOffset","_b","getEngine","descendants_1","isDimensionFullyDefined","dim","getDimension","clone","serialization","serialize","cloned","Instantiate","parse","serializedObject","urlRewriter","_urlRewriter","SerializationHelper","Parse","_parseFromContent","serializationObject","allowCanvas","Serialize","fontFamily","fontWeight","fontStyle","AppendSerializedAnimations","animationIndex","parsedAnimation","internalClass","GetClass","autoAnimate","beginAnimation","autoAnimateFrom","autoAnimateTo","autoAnimateLoop","autoAnimateSpeed","fixedRatioMasterIsWidth","dispose","clear","removeControl","_HORIZONTAL_ALIGNMENT_LEFT","_HORIZONTAL_ALIGNMENT_RIGHT","_HORIZONTAL_ALIGNMENT_CENTER","_VERTICAL_ALIGNMENT_TOP","_VERTICAL_ALIGNMENT_BOTTOM","_VERTICAL_ALIGNMENT_CENTER","engineToUse","_FontHeightSizes","engine","EngineStore","LastCreatedEngine","getFontOffset","controlType","newControl","drawEllipse","arc","PI","closePath","isReady","AddHeader","RegisterClass","Container","_children","_measureForChildren","_background","_backgroundGradient","_adaptWidthToChildren","_adaptHeightToChildren","_renderToIntermediateTexture","_intermediateTexture","delegatePickingToChildren","logLayoutCycleErrors","maxLayoutCycle","onControlAddedObservable","onControlRemovedObservable","_inverseTransformMatrix","_inverseMeasure","isReadOnly","getChildByName","getChildByType","typeName","containsControl","addControl","clearControls","children_1","slice","_cleanControlAfterRemoval","linkedMesh","wasAdded","_getBackgroundColor","_localDraw","shadowColor","fillRect","_beforeLayout","scaleTo","DynamicTexture","Texture","NEAREST_SAMPLINGMODE","Constants","TEXTUREFORMAT_RGBA","hasAlpha","computedWidth","computedHeight","_c","adaptWidthToChildren","adaptHeightToChildren","renderToIntermediateTextureThisDraw","contextToDrawTo","clearRect","drawImage","canvas","item","contains_1","isEnabled","_changeCursor","_getAdaptDimTo","backgroundGradient","childSerializationObject","childData","TextWrapping","Rectangle","_thickness","_cornerRadius","_cachedRadius","additionalWidth","thickness","additionalHeight","_getRectangleFill","_drawRoundedRect","fill","stroke","moveTo","lineTo","TextBlock","text","_text","_textWrapping","_textHorizontalAlignment","_textVerticalAlignment","_resizeToFit","_lineSpacing","_outlineWidth","_outlineColor","_underline","_lineThrough","_wordDivider","_forceResizeWidth","_applyOutlineToUnderline","onTextChangedObservable","onLinesReadyObservable","reuseHTMLForWordWrapping","_linesTemp","_htmlElement","_lines","_breakLines","maxLineWidth","line","newWidth","newHeight","internalValue","lineSpacing","_drawText","textWidth","outlineWidth","strokeText","fillText","_drawLine","xFrom","yFrom","xTo","yTo","applyOutlineToUnderline","currentStroke","_renderLines","outlineColor","lineJoin","miterLimit","refWidth","refHeight","_parseHTMLText","split","_lines_1","_line","_parseLineWordWrap","_lines_2","_parseLineEllipsis","_d","_lines_3","_parseLineWordWrapEllipsis","_e","_lines_4","_parseLine","lines","document","createElement","appendChild","htmlElement","textContent","style","visibility","adjustWordWrappingHTMLElement","textNode","childNodes","range","createRange","idx","textContent_1","setStart","setEnd","lineIndex","getClientRects","_getTextMetricsWidth","measureText","_getCharsToRemove","lineLength","diff","charWidth","removeChars","characters","from","join","textMetrics","actualBoundingBoxLeft","actualBoundingBoxRight","words","wordSplittingFunction","testLine","testWidth","_computeHeightForLinesOf","lastLine","currentLine","linesToRemove","rootY","ascent","descent","lineCount","resizeToFit","computeExpectedHeight","widthInPixels","createCanvas","heightInPixels","Image","url","_workingCanvas","_loaded","_stretch","STRETCH_FILL","_source","_autoScale","_sourceLeft","_sourceTop","_sourceWidth","_sourceHeight","_svgAttributesComputationCompleted","_isSVG","_cellWidth","_cellHeight","_cellId","_populateNinePatchSlicesFromImage","_imageDataCache","data","onImageLoadedObservable","onSVGAttributesComputedObservable","isLoaded","_detectPointerOnOpaqueOnly","_sliceLeft","_sliceRight","_sliceTop","_sliceBottom","_imageWidth","_imageHeight","_extractNinePatchSliceDataFromImage","synchronizeSizeWithContent","_rotate90","preserveProperties","_domImage","dataUrl","toDataURL","rotatedImage","_handleRotationForSVGImage","srcImage","dstImage","_rotate90SourceProperties","addOnce","srcLeft","sourceLeft","srcTop","sourceTop","srcWidth","domImage","srcHeight","dstLeft","dstTop","dstWidth","sourceWidth","dstHeight","sourceHeight","mult","imageData","_onImageLoaded","onload","_removeCacheUsage","_svgCheck","SourceImgCache","has","cachedData","img","timesUsed","loaded","waitingForLoadCallback","bind","createCanvasImage","imgElement","addedToDom","endsWith","getRenderingCanvas","parentNode","waitingCallback","SetCorsBehavior","SetReferrerPolicyBehavior","referrerPolicy","src","ResetImageCache","removeChild","_sanitizeSVG","svgString","doc","DOMParser","parseFromString","dangerousAttrs","forEach","tag","elements","getElementsByTagName","sanitizeElement","el","attributes","attr","name_1","some","regex","test","removeAttribute","trim","toLowerCase","startsWith","documentElement","XMLSerializer","serializeToString","SVGSVGElement","search","lastIndexOf","svgsrc_1","elemid_1","svgExist_1","querySelector","svgDoc","contentDocument","vb","getAttribute","docwidth","docheight","getElementById","_getSVGAttribs","addEventListener","svgImage","svgobj","svgsrc","elemid","elem","vbWidth","vbHeight","elemBbox","getBBox","elemMatrixA","elemMatrixD","elemMatrixE","elemMatrixF","consolidatedTransform","baseVal","consolidate","mainMatrix","matrix","STRETCH_NONE","STRETCH_UNIFORM","STRETCH_NINE_PATCH","STRETCH_EXTEND","_prepareWorkingCanvasForOpaqueDetection","_drawImage","sx","sy","sw","sh","tw","th","getTransform","workingCanvasContext","ttx","tty","setTransform","cellId","rowCount","naturalWidth","cellWidth","column","row","cellHeight","hRatio","vRatio","ratio","centerX","centerY","_renderNinePatch","leftWidth","topHeight","bottomHeight","rightWidth","centerWidth","centerHeight","leftWidthAdjusted","topHeightAdjusted","bottomHeightAdjusted","rightWidthAdjusted","targetCenterWidth","targetCenterHeight","centerLeftOffset","centerTopOffset","rightOffset","bottomOffset","sliceLeft","Map","Button","alphaStore","pointerEnterAnimation","pointerOutAnimation","pointerDownAnimation","pointerUpAnimation","_image","_textBlock","textBlockName","imageName","CreateImageButton","imageUrl","textBlock","textWrapping","textHorizontalAlignment","iconImage","stretch","CreateImageOnlyButton","CreateSimpleButton","CreateImageWithCenterTextButton","StackPanel","_isVertical","_manualWidth","_manualHeight","_doNotTrackManualChanges","_spacing","ignoreLayoutWarnings","isVertical","stackWidth","stackHeight","childrenCount","scaledSpacing","top_1","Warn","panelWidthChanged","panelHeightChanged","previousHeight","previousWidth","_getManualDim","manualWidth","manualHeight","Checkbox","_isChecked","_checkSizeRatio","onIsCheckedChangedObservable","actualWidth","actualHeight","offsetWidth","offsetHeight","isChecked","AddCheckBoxWithHeader","title","onValueChanged","panel","checkbox","header","TextWrapper","_characters","txt","removePart","idxStart","idxEnd","insertTxt","newCharacters","to","pack","ar","l","__spreadArray","charAt","substr","temp","substring","isWord","rWord","InputText","_placeholderText","_focusedBackground","_placeholderColor","_margin","_autoStretchWidth","_maxWidth","_blinkIsEven","_cursorOffset","_deadKey","_addKey","_currentKey","_isTextHighlightOn","_textHighlightColor","_highlighterOpacity","_highlightedText","_startHighlightIndex","_endHighlightIndex","_cursorIndex","_onFocusSelectAll","_isPointerDown","promptMessage","disableMobilePrompt","onBeforeKeyAddObservable","onTextHighlightObservable","onTextCopyObservable","onTextCutObservable","onTextPasteObservable","highlighterOpacity","flag","_textWrapper","valueAsString","_textHasChanged","autoStretchWidth","_scrollLeft","clearTimeout","_blinkTimeout","unRegisterClipboardEvents","_onClipboardObserver","onClipboardObservable","_onPointerDblTapObserver","onPointerObservable","_focusedBy","prompt","registerClipboardEvents","clipboardInfo","ClipboardEventTypes","COPY","_onCopyText","CUT","_onCutText","PASTE","_onPasteText","pointerInfo","POINTERDOUBLETAP","_processDblClick","selectAllText","_connectedVirtualKeyboard","processKey","keyCode","ctrlKey","metaKey","preventDefault","isTextHighlightOn","deletePosition","shiftKey","insertPosition","_updateValueFromCursorIndex","moveLeft","moveRight","_clickedCoordinate","ev","clipboardData","setData","types","getData","clipTextLeft","_beforeRenderText","_textWidth","marginWidth","availableWidth","textLeft","absoluteCursorPosition","currentSize","previousDist","cursorOffsetText","cursorOffsetWidth","cursorLeft","setTimeout","highlightCursorOffsetWidth","highlightCursorLeft","_capturingControl","pointerType","textWrapper","Grid","_rowDefinitions","_rowDefinitionObservers","_columnDefinitions","_columnDefinitionObservers","_cells","_childControls","getRowDefinition","getColumnDefinition","addRowDefinition","addColumnDefinition","columnCount","setRowDefinition","current","setColumnDefinition","getChildrenAt","cell","getChildCellInfo","_tag","_removeCell","childIndex","_offsetCell","previousKey","removeColumnDefinition","removeRowDefinition","goodContainer","_getGridDefinitions","definitionCallback","widths","heights","lefts","tops","globalWidthPercentage","availableHeight","globalHeightPercentage","rowDefinition","columnDefinition","_f","_g","parseInt","leftInPixels","topInPixels","columns","rows","tags","cd","rd","columnValue","rowValue","cellInfo","rowNumber","columnNumber","ColorPicker","Color3","Red","_tmpColor","_pointerStartedOnSquare","_pointerStartedOnWheel","_squareLeft","_squareTop","_squareSize","_h","_s","_v","_lastPointerDownId","onValueChangedObservable","_pointerIsDown","size","equals","toHSVToRef","_Epsilon","_updateSquareProps","radius","squareSize","sqrt","_drawGradientSquare","hueValue","lgh","createLinearGradient","addColorStop","lgv","_drawCircle","_createColorWheelCanvas","image","maxDistSq","innerRadius","minDistSq","distSq","dist","ang","atan2","HSVtoRGBToRef","alphaAmount","alphaRatio","wheelThickness","_colorWheelCanvas","cx","cy","_updateValueFromPointer","_isPointOnSquare","_isPointOnWheel","dx","dy","ShowPickerDialogAsync","advancedTexture","options","pickerWidth","pickerHeight","headerHeight","lastColor","swatchLimit","numSwatchesPerLine","buttonFontSize","butEdit","swatchNumber","swatchDrawer","butSave","lastVal","activeField","drawerMaxRows","rawSwatchSize","gutterSize","colGutters","swatchSize","drawerMaxSize","containerSize","buttonColor","buttonBackgroundColor","buttonBackgroundHoverColor","buttonBackgroundClickColor","luminanceLimitColor","FromHexString","luminanceLimit","inputFieldLabels","inputTextBackgroundColor","inputTextColor","editSwatchMode","dialogContainer","savedColors","topRow","background","gutterCount","initialRows","pickerPanel","panelHead","pickerPanelRows","closeButton","headerColor3","closeIconColor","toHexString","textVerticalAlignment","closePicker","currentSwatch","dialogBody","dialogBodyCols","pickerGrid","picker","editSwatches","updateValues","pickerBodyRight","pickerBodyRightRows","pickerSwatchesButtons","pickerButtonsCol","pickerSwatches","pickeSwatchesRows","activeSwatches","labelTextSize","labelWidth","labelHeight","newText","newSwatch","swatchOutline","currentText","buttonGrid","buttonGridRows","buttonWidth","buttonHeight","butOK","butCancel","disableButton","setEditButtonVisibility","updateSwatches","pickerColorValues","currentColor","rgbValuesQuadrant","labelText_1","rValInt","updateInt","gValInt","bValInt","rValDec","updateFloat","gValDec","bValDec","hexValueQuadrant","labelText","hexVal","minusPound","inputField","pickedColor","minusPound_1","field","channel","newValue","newSwatchRGB","createSwatch","icon","swatch_1","swatchColor","swatchLuminence","metadata_1","mode","button","currentRows","thisRow","totalButtonsThisRow","buttonIterations","w","swatch","enableButton","disabled","val","newHexValue","checkHex","leadingZero","Ellipse","_arc","FocusableButton","InputTextArea","_prevText","_maxHeight","_updateCursorPosition","_highlightCursorInfo","initialStartIndex","initialRelativeStartIndex","initialLineIndex","_cursorInfo","globalStartIndex","globalEndIndex","relativeEndIndex","relativeStartIndex","currentLineIndex","_autoStretchHeight","alternativeProcessKey","code","rightDelta","upperLine","tmpIndex","relativeIndex","currentWidth","_contextForBreakLines","upperWidth","lineEnding","upperLineRelativeIndex","underLine","underWidth","underLineRelativeIndex","flushedLine_1","map","char","placeholderText","longerString","reduce","acc","longerStringWidth","_availableWidth","totalHeight","marginHeight","_availableHeight","tmpLength","_computeScroll","_clipTextLeft","_clipTextTop","selectedHeight","textTop","_scrollTop","highlightedText","deltaIndex","_clickedCoordinateX","_clickedCoordinateY","cursorTop","_resetBlinking","startLineIndex","endLineIndex","highlightRootY","highlightRootX","begin","end","leftOffsetWidth","selectedText","hightlightWidth","movementX","movementY","globalIndex","lastClickedCoordinateY","relativeCoordinateY","relativeXPosition","_evt","InputPassword","pwdTextWrapper","Line","_lineWidth","_x1","_y1","_x2","_y2","_dash","_connectedControl","_connectedControlDirtyObserver","setLineDash","_effectiveX2","_effectiveY2","x2","y2","x1","y1","MultiLinePoint","multiLine","_multiLine","_x","_y","_point","_control","_controlObserver","onPointUpdate","_mesh","_meshObserver","onAfterCameraRenderObservable","resetLinks","_translatePoint","getProjectedPositionWithZ","getBoundingInfo","boundingSphere","center","getWorldMatrix","xValue","_canvas","yValue","MultiLine","_points","getAt","items","point","AbstractMesh","reset","previousPoint","first","_minX","_minY","_maxX","_maxY","RadioButton","group","executeOnAllControls","childRadio","offseHeight","AddRadioButtonWithHeader","radio","BaseSlider","_thumbWidth","_minimum","_maximum","_barOffset","_isThumbClamped","_displayThumb","_step","_effectiveBarOffset","_getThumbPosition","maximum","minimum","_backgroundBoxLength","_getThumbThickness","thumbThickness","_backgroundBoxThickness","_prepareRenderingData","_renderLeft","_renderTop","_renderWidth","_renderHeight","_effectiveThumbThickness","displayThumb","isThumbClamped","Slider","_borderColor","_thumbColor","_isThumbCircle","_displayValueBar","isThumbCircle","thumbPosition","SelectorGroup","_groupPanel","_selectors","_groupHeader","_addGroupHeader","groupHeading","_getSelector","selectorNb","removeSelector","CheckboxGroup","addCheckbox","func","checked","state","_selector","isHorizontal","controlFirst","groupPanel","selectors","buttonBackground","_setSelectorLabel","_setSelectorLabelColor","_setSelectorButtonColor","_setSelectorButtonBackground","RadioGroup","_selectNb","addRadio","nb","SliderGroup","addSlider","onValueChange","borderColor","SelectionPanel","groups","_buttonColor","_buttonBackground","_headerColor","_barColor","_barHeight","_spacerHeight","_bars","_groups","_panel","_addSpacer","_setHeaderColor","_setbuttonColor","j","_labelColor","_setLabelColor","_setButtonBackground","_setBarColor","_setBarHeight","_setSpacerHeight","separator","bar","addGroup","removeGroup","groupNb","setHeaderName","relabel","removeFromGroupSelector","addToGroupCheckbox","addToGroupRadio","addToGroupSlider","onVal","_ScrollViewerWindow","_freezeControls","_bucketWidth","_bucketHeight","_buckets","_restoreMeasures","textureSize","renderWidth","renderHeight","measure","_updateMeasures","_useBuckets","_makeBuckets","setBucketSizes","_bucketLen","_dispatchInBuckets","_oldLeft","_oldTop","bStartX","_origLeft","origLeft","bEndX","bEndY","_origTop","origTop","bStartY","bucket","lstc","origLeftForChildren","origTopForChildren","_updateChildrenMeasures","_parentMeasure","_scrollChildren","_scrollChildrenWithBuckets","scrollLeft","scrollTop","maxWidth","parentClientWidth","maxHeight","parentClientHeight","ScrollBar","_tempMeasure","_invertScrollDirection","invert","delta","sign","_first","_originX","_originY","ImageScrollBar","_thumbLength","_thumbHeight","_barImageHeight","num90RotationInVerticalMode","_backgroundBaseImage","_backgroundImage","rotatedValue","_thumbBaseImage","_thumbImage","ScrollViewer","isImageBased","_barSize","_pointerIsOver","_wheelPrecision","_horizontalBarImageHeight","_verticalBarImageHeight","_oldWindowContentsWidth","_oldWindowContentsHeight","_forceHorizontalBar","_forceVerticalBar","_useImageBar","_horizontalBarSpace","_verticalBarSpace","_dragSpace","_grid","_horizontalBar","_verticalBar","_window","_addBar","barColor","barBackground","freezeControls","bucketWidth","bucketHeight","resetWindow","_buildClientSizes","forceVerticalBar","forceHorizontalBar","_clientWidth","_clientHeight","_updateScroller","_setWindowPosition","_barImage","hb","thumbImage","_horizontalBarImage","_verticalBarImage","thumbLength","thumbHeight","barImageHeight","_barBackground","_barBackgroundImage","backgroundImage","_horizontalBarBackgroundImage","_verticalBarBackgroundImage","windowContentsWidth","windowContentsHeight","_endLeft","_endTop","thumbWidth","_attachWheel","barControl","barContainer","rotation","barOffset","_onWheelObserver","ToggleButton","onIsActiveChangedObservable","_isActive","toActiveAnimation","toInactiveAnimation","pointerEnterActiveAnimation","pointerOutActiveAnimation","pointerDownActiveAnimation","pointerUpActiveAnimation","pointerEnterInactiveAnimation","pointerOutInactiveAnimation","pointerDownInactiveAnimation","pointerUpInactiveAnimation","_group","childToggle","isActive","KeyPropertySet","VirtualKeyboard","onKeyPressObservable","defaultButtonWidth","defaultButtonHeight","defaultButtonPaddingLeft","defaultButtonPaddingRight","defaultButtonPaddingTop","defaultButtonPaddingBottom","defaultButtonColor","defaultButtonBackground","shiftButtonColor","selectedShiftThickness","shiftState","_currentlyConnectedInputText","_connectedInputTexts","_onKeyPressObserver","_createKey","propertySet","addKeysRow","keys","propertySets","maxKey","properties","applyShiftState","rowContainer","buttonTblock","toUpperCase","connect","input","onFocusObserver","onBlurObserver","disconnect","filtered","filter","_removeConnectedInputObservables","connectedInputText","CreateDefaultLayout","returnValue","DisplayGrid","_minorLineTickness","_minorLineColor","_majorLineTickness","_majorLineColor","_majorLineFrequency","_displayMajorLines","_displayMinorLines","cellCountX","cellCountY","cellX","cellY","ImageBasedSlider","_valueBarImage","valueBarImage","Name","BaseGradient","_colorStops","_gradientDirty","_addColorStopsToCanvasGradient","stop_1","_canvasGradient","_context","_createCanvasGradient","removeColorStop","colorStop","clearColorStops","colorStops","LinearGradient","x0","y0","_x0","_y0","RadialGradient","_r0","_r1","createRadialGradient","Style","AdvancedDynamicTexture","widthOrOptions","generateMipMaps","samplingMode","invertY","useStandalone","onGuiReadyObservable","_isFullscreen","_fullscreenViewport","Viewport","_idealWidth","_idealHeight","_useSmallestIdeal","_renderAtIdealSize","_blockNextFocusCheck","_renderScale","_cursorChanged","_defaultMousePointerId","_rootChildrenHaveChanged","_adjustToEngineHardwareScalingLevel","Set","_clipboardData","onControlPickedObservable","onBeginLayoutObservable","onEndLayoutObservable","onBeginRenderObservable","onEndRenderObservable","premulAlpha","applyYInversionOnUpdate","disableTabNavigation","disablePicking","skipBlockEvents","checkPointerEveryFrame","_useInvalidateRectOptimization","_invalidatedRectangle","_alreadyRegisteredForRender","_clearMeasure","_focusProperties","total","_onClipboardCopy","rawEvt","ClipboardInfo","_onClipboardCut","_onClipboardPaste","parseContent","parseSerializedObject","_texture","_rootElement","getInputElement","adtOptions","_renderObserver","onBeforeCameraRenderObservable","camera","_checkUpdate","_controlAddedObserver","_controlRemovedObserver","_preKeyboardObserver","onPreKeyboardObservable","info","KeyboardEventTypes","KEYDOWN","forward","_focusNextElement","_focusedControl","skipOnPointerObservable","_resizeObserver","onResizeObservable","_onResize","rwidth","rheight","_layerToDispose","getChildren","getControlsByType","getControlByName","_getControlByKey","find","layer","isBackground","invalidMinX","invalidMinY","invalidMaxX","invalidMaxY","maxX","maxY","createStyle","moveToNonOverlappedPosition","overlapGroup","deltaStep","repelFactor","controlsForGroup","isArray","descendants","controlsForGroup_1","control1","velocity","controlsForGroup_2","control2","_Overlaps","subtract","diffLength","normalize","overlapDeltaMultiplier","linkOffsetXInPixels","linkOffsetYInPixels","_prePointerObserver","onPrePointerObservable","_sceneRenderObserver","onBeforeRenderObservable","_pointerObserver","_canvasPointerOutObserver","onCanvasPointerOutObservable","_canvasBlurObserver","onCanvasBlurObservable","texture","adjustToEngineHardwareScalingLevel","getHardwareScalingLevel","getRenderWidth","getCaps","maxTextureSize","getRenderHeight","engineRenderScale","SetImmediate","update","AllowGPUOptimizations","globalViewPort","toGlobal","targetX","targetY","getProjectedPosition","worldMatrix","skipUpdate","layerMask","isDisposed","ZeroReadOnly","this_1","skipRender","_checkGuiIsReady","activeCamera","cursor","_doPicking","cameraToUseForPointers","viewport","doNotHandleCursors","_manageFocus","_cleanControlAfterRemovalFromList","list","pick","_scene","_translateToPicking","tempViewport","pointerX","pointerY","originalCameraToUseForPointers","rigCameras","rigViewport","rigCamera","toGlobalToRef","transformedX_1","transformedY_1","transformedX","transformedY","attach","isPointerCaptured","_attachPickingToSceneRender","_attachToOnPointerOut","_attachToOnBlur","nextIndex","sortedTabbableControls","sort","self","removeEventListener","_transformUvs","uv","textureMatrix","getTextureMatrix","isIdentityAs3x2","homogeneousTextureMatrix","TmpVectors","getRowToRef","Vector4","setRowFromFloats","TransformToRef","wrapU","WRAP_ADDRESSMODE","MIRROR_ADDRESSMODE","fX","trunc","wrapV","fY","attachToMesh","supportPointerMove","pickInfo","hit","pickedMesh","getTextureCoordinates","friendlyControls","canMoveFocus","friendlyControls_1","otherHost","enablePointerMoveEvents","pickFunction","forcePicking","pointerEvent","entries","serializeContent","root","scaleToSize","newName","CreateFullscreenUI","CreateForMesh","noMipmap","ParseFromSnippetAsync","snippetId","appendToAdt","adt","_LoadURLContentAsync","SnippetUrl","replace","serialized","parseFromSnippetAsync","ParseFromFileAsync","parseFromURLAsync","url_1","snippet","request","WebRequest","readyState","status","gui","payload","JSON","responseText","jsonPayload","encodedGui","TextDecoder","decode","DecodeBase64ToBinary","open","send","onlyAlphaTesting","materialSetupCallback","sampling","_CreateMaterial","TRILINEAR_SAMPLINGMODE","RandomGUID","internalClassType","material","backFaceCulling","diffuseColor","Black","specularColor","diffuseTexture","emissiveTexture","opacityTexture","CreateForMeshTexture","foreground","sceneOrOptions","adaptiveScaling","BILINEAR_SAMPLINGMODE","_isScene","resultScene","Layer","guiIsReady","AdvancedDynamicTextureInstrumentation","_captureRenderTime","_renderTime","PerfCounter","_captureLayoutTime","_layoutTime","_onBeginRenderObserver","_onEndRenderObserver","_onBeginLayoutObserver","_onEndLayoutObserver","beginMonitoring","endMonitoring","FrameGraphGUITask","frameGraph","_adt","outputTexture","_frameGraph","textureManager","createDanglingHandle","_disabled","record","targetTexture","resolveDanglingHandle","pass","addRenderPass","setRenderTarget","setExecuteFunc","render","passDisabled","FrameGraphTask","NodeRenderGraphGUIBlock","registerInput","NodeRenderGraphBlockConnectionPointTypes","_addDependenciesInput","registerOutput","BasedOnInput","addAcceptedConnectionPointTypes","TextureAll","output","_typeConnectionSource","_gui","_frameGraphTask","_inputs","_outputs","_buildBlock","connectedPoint","NodeRenderGraphBlock","XmlLoaderError","XmlLoader","parentClass","_nodes","_nodeTypes","element","attribute","_isLoaded","_objectAttributes","_parentClass","_getChainElement","attributeValue","_getClassAttribute","attributeName","_createGuiElement","node","linkParent","guiNode","nodeName","includes","matches","getNamedItem","id","exception","_parseGrid","cells","cellNode","totalColumnsNumber","nodeType","nodeValue","k","firstChild","_parseXml","nextSibling","_parseElement","_prepareSourceElement","variable","_parseElementsFromSource","dataSource","splittedSource","generated","setAttribute","_rootNode","getNodeById","getNodes","loadLayout","xmlFile","rootNode","onSuccess","onError","xhttp","XMLHttpRequest","responseXML","xmlDoc","onerror","loadLayoutAsync","Vector3WithInfo","Control3D","_isScaledByManager","_behaviors","_node","_position","scaling","_scaling","addBehavior","behavior","init","isLoading","onDataLoadedObservable","removeBehavior","detach","getBehaviorByName","setEnabled","linkToTransformNode","_prepareNode","_createNode","_injectGUI3DReservedDataStore","isPickable","_affectMaterial","reservedDataStore","GUI3D","_isTouchButton3D","_generatePointerEventType","forcePointerUp","pickedPoint","originMeshPosition","_disposeNode","ContentDisplay3D","_contentResolution","_contentScaleRatio","_content","utilityLayer","_facadeTexture","utilityLayerScene","_setFacadeTextureScaling","_applyFacade","_contentScaleRatioY","incomingWidth","incomingHeight","currentHeight","_resetContent","_disposeFacadeTexture","content","facadeTexture","AbstractButton3D","TransformNode","Button3D","_options","depth","_currentMaterial","emissiveColor","scaleInPlace","faceUV","useRightHandedSystem","CreateBox","wrap","StandardMaterial","Container3D","_blockLayout","_arrangeChildren","updateLayout","blockLayout","UNSET_ORIENTATION","FACEORIGIN_ORIENTATION","FACEORIGINREVERSED_ORIENTATION","FACEFORWARD_ORIENTATION","FACEFORWARDREVERSED_ORIENTATION","VolumeBasedPanel","_columns","_rows","_rowThenColum","_orientation","margin","controlCount","computeWorldMatrix","extendSize","boundingBox","descendant","casted","extendSizeChild","startOffsetX","startOffsetY","nodeGrid","cellCounter","_mapGridNode","_finalProcessing","CylinderPanel","_radius","nodePosition","newPos","_cylindricalMapping","orientation","lookAt","Axis","Y","yAngle","RotationYawPitchRollToRef","TransformNormal","ShaderStore","ShadersStore","FluentMaterialDefines","INNERGLOW","BORDER","HOVERLIGHT","TEXTURE","rebuild","MaterialDefines","FluentMaterial","innerGlowColorIntensity","innerGlowColor","albedoColor","renderBorders","borderWidth","edgeSmoothingValue","borderMinValue","renderHoverLight","hoverRadius","hoverColor","Color4","hoverPosition","needAlphaBlending","needAlphaTesting","getAlphaTestTexture","isReadyForSubMesh","subMesh","drawWrapper","_drawWrapper","isFrozen","effect","_wasPreviouslyReady","materialDefines","defines","checkReadyOnEveryCall","_renderId","getRenderId","_areTexturesDirty","_albedoTexture","isReadyOrNotBlocking","markAsProcessed","resetCachedMaterial","attribs","VertexBuffer","PositionKind","NormalKind","UVKind","uniforms","samplers","uniformBuffers","PrepareUniformsAndSamplersList","uniformsNames","uniformBuffersNames","maxSimultaneousLights","setEffect","createEffect","fallbacks","onCompiled","indexParameters","_materialContext","bindForSubMesh","world","_activeEffect","bindOnlyWorldMatrix","setMatrix","_mustRebind","setColor4","setFloat","setVector3","setDirectColor4","setTexture","_afterBind","getActiveTextures","hasTexture","forceDisposeEffect","Clone","customType","rootUrl","expandToProperty","serializeAsColor3","serializeAsColor4","serializeAsVector3","serializeAsTexture","PushMaterial","TouchHolographicMenu","_backPlateMargin","_updateCurrentMinMax","_updateMargins","Mesh","_backPlate","_backPlateMaterial","_pickedPointObserver","onPickedPointChangedObservable","_currentMin","_currentMax","minimizeInPlace","maximizeInPlace","addInPlaceFromFloats","backPlateMargin","subtractInPlace","addButton","wasLayoutBlocked","isBackplateVisible","MENU_BUTTON_SCALE","HandMenu","xr","_handConstraintBehavior","HandConstraintBehavior","linkToXRExperience","FluentBackplateMaterialDefines","BLOB_ENABLE","BLOB_ENABLE_2","SMOOTH_EDGES","IRIDESCENT_MAP_ENABLE","_needNormals","FluentBackplateMaterial","absoluteSizes","_filterWidth","baseColor","lineColor","blobIntensity","blobFarSize","blobNearDistance","blobFarDistance","blobFadeLength","blobNearSize","blobPulse","blobFade","blobNearSize2","blobPulse2","blobFade2","_rate","highlightColor","highlightWidth","_highlightTransform","_highlight","iridescenceIntensity","iridescenceEdgeIntensity","_angle","fadeOut","_reflected","_frequency","_verticalOffset","globalLeftIndexTipPosition","_globalLeftIndexTipPosition4","globalRightIndexTipPosition","_globalRightIndexTipPosition4","alphaMode","ALPHA_DISABLE","blobTextureUrl","GetAssetUrl","BLOB_TEXTURE_URL","iridescentMapUrl","IM_TEXTURE_URL","_blobTexture","_iridescentMap","_isReadyForSubMesh","PrepareDefinesForAttributes","EffectFallbacks","FOG","addFallback","HandleFallbacksForShadows","IMAGEPROCESSINGPOSTPROCESS","imageProcessingConfiguration","applyByPostProcess","NORMAL","UV1","UV2","UV2Kind","VERTEXCOLOR","ColorKind","TANGENT","TangentKind","PrepareAttributesForInstances","setVector4","getAnimatables","HolographicBackplate","_shareMaterials","_model","renderingGroupId","_material","collisionMesh","baseUrl","MODEL_BASE_URL","SceneLoader","ImportMeshAsync","MODEL_FILENAME","importedModel","meshes","_createMaterial","_touchSharedMaterials","shareMaterials","HolographicButton","_frontPlate","_disposeTooltip","_tooltipFade","_tooltipTextBlock","_tooltipTexture","_tooltipMesh","_tooltipHoverObserver","_tooltipOutObserver","_textPlate","rightHandedScene","CreatePlane","tooltipBackground","sideOrientation","DOUBLESIDE","mat","addChild","Forward","Up","FadeInOutBehavior","delay","fadeIn","_rebuildContent","_imageUrl","_backMaterial","_frontMaterial","_plateMaterial","IsDocumentAvailable","_createBackMaterial","_createFrontMaterial","_createPlateMaterial","_sharedMaterials","FluentButtonMaterialDefines","RELATIVE_WIDTH","ENABLE_FADE","_needUVs","FluentButtonMaterial","edgeWidth","edgeColor","proximityMaxIntensity","proximityFarDistance","proximityNearRadius","proximityAnisotropy","selectionFuzz","selected","selectionFade","selectionFadeSize","selectedDistance","selectedFadeLength","leftBlobEnable","leftBlobNearSize","leftBlobPulse","leftBlobFade","leftBlobInnerFade","rightBlobEnable","rightBlobNearSize","rightBlobPulse","rightBlobFade","rightBlobInnerFade","activeFaceDir","activeFaceUp","enableFade","fadeWidth","smoothActiveFace","showFrame","useBlobTexture","ALPHA_ADD","disableDepthWrite","TouchButton3D","_isNearPressed","_interactionSurfaceHeight","_isToggleButton","_toggleState","_toggleButtonCallback","_onToggle","onToggleObservable","collidableFrontDirection","_collisionMesh","transformedDirection","TransformNormalToRef","_collidableFrontDirection","frontWorldDir","isNearPickable","meshes_1","getChildMeshes","meshes_2","removeCallback","newState","_isInteractionInFrontOfButton","collidablePos","_getInteractionHeight","getAbsolutePosition","getPressDepth","touchPoint","interactionHeight","interactionPos","basePos","frontDir","Distance","Dot","providedType","nearMeshPosition","activeInteractionCount","TouchHolographicButton","_isBackplateVisible","_frontPlateDepth","_backPlateDepth","_backplateColor","_backplateToggledColor","isActiveNearInteraction","decompose","Scalar","Clamp","_pointerHoverObserver","alphaMesh","importedFrontPlate","tn","setParent","negate","DefaultBehavior","followBehaviorEnabled","sixDofDragBehaviorEnabled","surfaceMagnetismBehaviorEnabled","_followBehavior","FollowBehavior","_sixDofDragBehavior","SixDofDragBehavior","_surfaceMagnetismBehavior","SurfaceMagnetismBehavior","ownerMesh","draggablesMeshes","sceneUnderstandingMeshes","attachedNode","_addObservables","draggableMeshes","faceCameraOnDragStart","enabled","_removeObservables","_onBeforeRenderObserver","_enabled","isMoving","_onDragObserver","onDragObservable","disableMovement","findAndUpdateTarget","HandleState","HandleMaterial","_hover","_drag","_scale","_lastTick","animationLength","hoverScale","baseScale","dragScale","_positionOffset","_updateInterpolationTarget","Date","now","_onBeforeRender","tick","scaleDiff","_targetScale","colorDiff","TmpColors","_targetColor","subtractToRef","scaleToRef","addToRef","setColor3","drag","hover","ShaderMaterial","GizmoHandle","gizmo","_state","_materials","_gizmo","createNode","handle","_updateMaterial","positionOffset","setDragBehavior","dragStartFn","dragFn","dragEndFn","dragBehavior","BaseSixDofDragBehavior","_dragBehavior","_dragStartObserver","onDragStartObservable","_draggingObserver","_dragEndObserver","onDragEndObservable","SideHandle","verticalBox","sideNode","isNearGrabbable","CornerHandle","horizontalBox","angleNode","SlateGizmo","_boundingDimensions","_tmpQuaternion","Quaternion","_tmpVector","_corners","_sides","_boundingBoxGizmo","_handleSize","_attachedSlate","_existingSlateScale","fixedScreenSize","fixedScreenSizeDistanceFactor","updateScale","gizmoLayer","originalScene","attachedMesh","updateBoundingBox","onPickingObservable","_handleHovered","_handlesParent","rotationQuaternion","masksCorners","dimensions","origin","corner","_assignDragBehaviorCorners","originStart","dimensionsStart","masks","_moveHandle","side","_assignDragBehaviorSides","_rootMesh","_keepAspectRatio","vector","aspectRatio","invertDiagonal","axis","dot","_clampDimensions","mask","keepAspectRatio","impact","multiplyInPlace","clampedDimensions","minDimensions","isCorner","offsetOriginMasked","offsetDimensionsMasked","addInPlace","moveFn","dragOrigin","toObjectFrame","dragPlaneNormal","attachedSlate","_followButton","isToggled","_handleDragged","normal","ref","projectToRef","_positionElements","_updatePivot","quaternionOrigin","directionOrigin","worldPivot","worldPlaneNormal","getAbsolutePivotPoint","GetAngleBetweenVectorsOnPlane","RotationAxisToRef","_attachedNodeChanged","PivotTools","_RemoveAndStorePivotPoint","originalParent","_update","RotationYawPitchRoll","boundingMinMax","getHierarchyBoundingVectors","_updateHandlesPosition","_updateHandlesScaling","_RestorePivotPoint","handleScaling","scaledWidth","scaledHeight","setAll","absolutePosition","distanceFromCamera","Gizmo","HolographicSlate","titleBarMargin","_dimensions","_titleBarHeight","_titleText","fitContentToDimensions","defaultDimensions","isToggleButton","_closeButton","_contentViewport","_contentDragBehavior","PointerDragBehavior","_defaultBehavior","newRatio","_titleBar","_titleBarTitle","_contentPlate","_titleTextComponent","_contentMaterial","albedoTexture","_resetContentPositionAndZoom","_applyContentViewport","_addControl","followButton","titleBar","titleBarTitle","contentPlate","backPlate","titleBarHeight","contentPlateHeight","rightHandScene","_DEFAULT_TEXT_RESOLUTION_Y","tex","uScale","vScale","uOffset","vOffset","TransformCoordinatesToRef","setPivotPoint","origin2","VertexData","BACKSIDE","frontUVs","FRONTSIDE","_attachContentPlateBehavior","ASSETS_BASE_URL","FOLLOW_ICON_FILENAME","CLOSE_ICON_FILENAME","followBehavior","recenter","moveAttached","useObjectOrientationForDragging","updateDragPlane","startViewport","worldDimensions","upWorld","rightWorld","projectedOffset","dragPlanePoint","_titleBarMaterial","sixDofDragBehavior","_positionChangedObserver","onPositionChangedObservable","resetDefaultAspectAndPose","resetAspect","backward","Backward","pivot","equalsToFloats","FromLookDirectionLH","MeshButton3D","_currentMesh","NearMenu","_isPinned","_dragObserver","isPinned","_pinButton","_createPinButton","_ASSETS_BASE_URL","_PIN_ICON_FILENAME","ignoreCameraPitchAndRoll","pitchOffset","minimumDistance","defaultDistance","maximumDistance","PlanePanel","ScatterPanel","_iteration","_scatterMapping","random","count","distance1","lengthSquared","distance2","radiusPaddingSquared","pow","cellSize","difference2D","difference","combinedRadius","distance","MRDLSliderBarMaterialDefines","SKY_ENABLED","IRIDESCENCE_ENABLED","MRDLSliderBarMaterial","bevelFront","bevelFrontStretch","bevelBack","bevelBackStretch","radiusTopLeft","radiusTopRight","radiusBottomLeft","radiusBottomRight","bulgeEnabled","bulgeHeight","bulgeRadius","sunIntensity","sunTheta","sunPhi","indirectDiffuse","albedo","specular","shininess","sharpness","subsurface","leftGradientColor","rightGradientColor","reflection","frontReflect","edgeReflect","power","skyColor","horizonColor","groundColor","horizonPower","fuzz","minFuzz","clipFade","hueShift","saturationShift","valueShift","blobPosition","blobPosition2","blobTexture","leftIndexPosition","rightIndexPosition","leftIndexMiddlePosition","rightIndexMiddlePosition","decalScaleXY","decalFrontOnly","rimIntensity","rimHueShift","rimSaturationShift","rimValueShift","useGlobalLeftIndex","useGlobalRightIndex","globalLeftIndexTipProximity","globalRightIndexTipProximity","globaRightIndexTipPosition","globalLeftThumbTipPosition","globalRightThumbTipPosition","globalLeftIndexMiddlePosition","globalRightIndexMiddlePosition","textureUrl","BLUE_GRADIENT_TEXTURE_URL","_blueGradientTexture","_decalTexture","_reflectionMapTexture","_indirectEnvTexture","setVector2","MRDLSliderThumbMaterialDefines","MRDLSliderThumbMaterial","MRDLBackplateMaterialDefines","IRIDESCENCE_ENABLE","MRDLBackplateMaterial","iridescenceTint","gradientColor","topLeftGradientColor","topRightGradientColor","bottomLeftGradientColor","bottomRightGradientColor","edgePower","edgeLineGradientBlend","IRIDESCENT_MAP_TEXTURE_URL","_iridescentMapTexture","Slider3D","sliderBackplateVisible","_sliderBackplateVisible","_sliderThumb","_convertToPosition","_sliderBar","SLIDER_SCALING","_sliderBarMaterial","_sliderThumbMaterial","_sliderBackplateMaterial","_sliderBackplate","sliderBackplate","sliderBackplateModel","sliderBarModel","sliderThumbModel","_createBehavior","pointerDragBehavior","dragAxis","Right","_draggedPosition","dragDistance","_convertToValue","start","SpherePanel","_sphericalMapping","xAngle","StackPanel3D","extendSizes","currentInverseWorld","Invert","TouchMeshButton3D","MRDLBackglowMaterialDefines","MRDLBackglowMaterial","bevelRadius","tuningMotion","motion","maxIntensity","intensityFadeInExponent","outerFuzzStart","outerFuzzEnd","innerColor","blendExponent","falloff","bias","MRDLFrontplateMaterialDefines","MRDLFrontplateMaterial","relativeToHeight","blobEnable","blobInnerFade","blobPulseMaxSize","blobEnable2","blobInnerFade2","gazeIntensity","gazeFocus","MRDLInnerquadMaterialDefines","MRDLInnerquadMaterial","fixedRadius","glowFraction","glowMax","glowFalloff","ALPHA_COMBINE","textSizeInPixels","imageSizeInPixels","plateMaterialColor","frontPlateDepth","backPlateDepth","backGlowOffset","flatPlaneDepth","innerQuadRadius","innerQuadColor","innerQuadToggledColor","innerQuadHoverColor","innerQuadToggledHoverColor","_performEnterExitAnimation","_innerQuadMaterial","_pointerClickObserver","_backGlow","_performClickAnimation","_pointerEnterObserver","_pointerOutObserver","_toggleObserver","_innerQuad","Down","_frontPlateCollisionMesh","cornerRadius","_subtext","_backGlowMaterial","_getAspectRatio","_alignContentVertically","_alignContentHorizontally","totalPanelWidthInPixels","padding","contentContainer","imageContainer","textContainer","subtext","backPlateMesh","_createBackPlate","_createFrontPlate","innerQuadMesh","_createInnerQuad","backGlowMesh","_createBackGlow","MRTK_ASSET_BASE_URL","BACKPLATE_MODEL_FILENAME","backPlateModel","FRONTPLATE_MODEL_FILENAME","collisionPlate","_collisionPlate","frontPlateModel","INNERQUAD_MODEL_FILENAME","innerQuadModel","BACKGLOW_MODEL_FILENAME","backGlowModel","animationGroup","AnimationGroup","animations_1","property","frame","values","animation","anim","Animation","ANIMATIONTYPE_FLOAT","ANIMATIONLOOPMODE_CYCLE","animkeyFrames","inTangent","outTangent","interpolation","setKeys","addTargetedAnimation","speedRatio","play","animations_2","frontMaterial","_createBackGlowMaterial","glowRadius","_createInnerQuadMaterial","GUI3DManager","_customControlScaling","LastCreatedScene","_sceneDisposeObserver","_utilityLayer","UtilityLayerRenderer","_CreateDefaultUtilityLayerFromScene","onlyCheckPointerDownEvents","pickUtilitySceneFirst","mainSceneTrackerPredicate","_handlePointerOut","autoClear","autoClearDepthAndStencil","HemisphericLight","newScale","scaleRatio","controlScaling","MRTK_REALISTIC_SCALING","isPointerUp","shouldRender","pickingInfo","originMesh","hostInformation","isMobile","materialName","GlobalObject","global","BABYLON","GUI"],"mappings":"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","x_google_ignoreList":[0]}
|