babylonjs-gui 5.0.0-rc.7 → 5.0.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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"babylon.gui.min.js","mappings":"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","sources":["webpack://BABYLON.GUI/webpack/universalModuleDefinition","webpack://BABYLON.GUI/external umd {\"root\":\"BABYLON\",\"commonjs\":\"babylonjs\",\"commonjs2\":\"babylonjs\",\"amd\":\"babylonjs\"}","webpack://BABYLON.GUI/webpack/bootstrap","webpack://BABYLON.GUI/webpack/runtime/define property getters","webpack://BABYLON.GUI/webpack/runtime/global","webpack://BABYLON.GUI/webpack/runtime/hasOwnProperty shorthand","webpack://BABYLON.GUI/webpack/runtime/make namespace object","webpack://BABYLON.GUI/../../../../node_modules/tslib/tslib.es6.js","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/valueAndUnit.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/measure.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/math2D.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/control.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/container.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/rectangle.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/textBlock.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/image.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/button.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/stackPanel.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/checkbox.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/textWrapper.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/inputText.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/grid.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/colorpicker.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/ellipse.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/focusableButton.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/inputPassword.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/line.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/multiLinePoint.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/multiLine.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/radioButton.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/sliders/baseSlider.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/sliders/slider.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/selector.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/scrollViewers/scrollViewerWindow.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/sliders/scrollBar.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/sliders/imageScrollBar.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/scrollViewers/scrollViewer.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/toggleButton.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/virtualKeyboard.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/displayGrid.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/sliders/imageBasedSlider.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/controls/statics.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/style.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/advancedDynamicTexture.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/adtInstrumentation.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/2D/xmlLoader.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/vector3WithInfo.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/controls/control3D.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/controls/contentDisplay3D.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/controls/abstractButton3D.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/controls/button3D.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/controls/container3D.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/controls/volumeBasedPanel.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/controls/cylinderPanel.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/materials/fluent/shaders/fluent.vertex.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/materials/fluent/shaders/fluent.fragment.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/materials/fluent/fluentMaterial.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/controls/holographicButton.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/materials/fluentButton/shaders/fluentButton.fragment.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/materials/fluentButton/shaders/fluentButton.vertex.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/materials/fluentButton/fluentButtonMaterial.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/controls/touchButton3D.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/controls/touchHolographicButton.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/behaviors/defaultBehavior.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/materials/handle/shaders/handle.vertex.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/materials/handle/shaders/handle.fragment.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/gizmos/gizmoHandle.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/materials/handle/handleMaterial.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/gizmos/slateGizmo.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/materials/fluentBackplate/shaders/fluentBackplate.fragment.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/materials/fluentBackplate/shaders/fluentBackplate.vertex.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/materials/fluentBackplate/fluentBackplateMaterial.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/controls/holographicSlate.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/controls/touchHolographicMenu.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/controls/handMenu.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/controls/meshButton3D.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/controls/nearMenu.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/controls/planePanel.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/controls/scatterPanel.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/materials/mrdl/shaders/mrdlSliderBar.fragment.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/materials/mrdl/shaders/mrdlSliderBar.vertex.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/materials/mrdl/mrdlSliderBarMaterial.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/materials/mrdl/shaders/mrdlSliderThumb.fragment.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/materials/mrdl/shaders/mrdlSliderThumb.vertex.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/materials/mrdl/mrdlSliderThumbMaterial.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/materials/mrdl/shaders/mrdlBackplate.fragment.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/materials/mrdl/shaders/mrdlBackplate.vertex.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/materials/mrdl/mrdlBackplateMaterial.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/controls/slider3D.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/controls/spherePanel.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/controls/stackPanel3D.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/controls/touchMeshButton3D.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/controls/holographicBackplate.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/3D/gui3DManager.ts","webpack://BABYLON.GUI/../../../lts/gui/generated/legacy/legacy.ts","webpack://BABYLON.GUI/./src/index.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"babylonjs\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"babylonjs-gui\", [\"babylonjs\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"babylonjs-gui\"] = factory(require(\"babylonjs\"));\n\telse\n\t\troot[\"BABYLON\"] = root[\"BABYLON\"] || {}, root[\"BABYLON\"][\"GUI\"] = factory(root[\"BABYLON\"]);\n})((typeof self !== \"undefined\" ? self : typeof global !== \"undefined\" ? global : this), function(__WEBPACK_EXTERNAL_MODULE__520__) {\nreturn ","module.exports = __WEBPACK_EXTERNAL_MODULE__520__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/*! *****************************************************************************\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 */\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 __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;\r\n return g = { next: verb(0), \"throw\": verb(1), \"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 (_) 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 Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\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 = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\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: n === \"return\" } : 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\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\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","import { Observable } from \"core/Misc/observable\";\r\nimport { 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/how_to/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 = (this._value * host.getSize().width) / host.idealWidth;\r\n }\r\n\r\n if (host.idealHeight) {\r\n height = (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 { 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 { 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","/* eslint-disable @typescript-eslint/naming-convention */\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport { Nullable } from \"core/types\";\r\nimport { Observable, Observer } from \"core/Misc/observable\";\r\nimport { Vector2, Vector3, Matrix } from \"core/Maths/math.vector\";\r\nimport { PointerEventTypes, PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Scene } from \"core/scene\";\r\n\r\nimport { Container } from \"./container\";\r\nimport { AdvancedDynamicTexture } from \"../advancedDynamicTexture\";\r\nimport { ValueAndUnit } from \"../valueAndUnit\";\r\nimport { Measure } from \"../measure\";\r\nimport { Style } from \"../style\";\r\nimport { Matrix2D, Vector2WithInfo } from \"../math2D\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { SerializationHelper, serialize } from \"core/Misc/decorators\";\r\nimport { ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\nimport { EngineStore } from \"core/Engines/engineStore\";\r\n\r\n/**\r\n * Root class used for all 2D controls\r\n * @see https://doc.babylonjs.com/how_to/gui#controls\r\n */\r\nexport class Control {\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 /** @hidden */\r\n public _host: AdvancedDynamicTexture;\r\n /** Gets or sets the control parent */\r\n public parent: Nullable<Container>;\r\n /** @hidden */\r\n public _currentMeasure = Measure.Empty();\r\n /** @hidden */\r\n public _tempPaddingMeasure = Measure.Empty();\r\n private _fontFamily = \"Arial\";\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 /** @hidden */\r\n public _width = new ValueAndUnit(1, ValueAndUnit.UNITMODE_PERCENTAGE, false);\r\n /** @hidden */\r\n public _height = new ValueAndUnit(1, ValueAndUnit.UNITMODE_PERCENTAGE, false);\r\n /** @hidden */\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 /** @hidden */\r\n protected _horizontalAlignment = Control.HORIZONTAL_ALIGNMENT_CENTER;\r\n /** @hidden */\r\n protected _verticalAlignment = Control.VERTICAL_ALIGNMENT_CENTER;\r\n /** @hidden */\r\n protected _isDirty = true;\r\n /** @hidden */\r\n protected _wasDirty = false;\r\n /** @hidden */\r\n public _tempParentMeasure = Measure.Empty();\r\n /** @hidden */\r\n public _prevCurrentMeasureTransformedIntoGlobalSpace = Measure.Empty();\r\n /** @hidden */\r\n protected _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 /** @hidden */\r\n public _left = new ValueAndUnit(0);\r\n /** @hidden */\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 /** @hidden */\r\n public _transformMatrix = Matrix2D.Identity();\r\n /** @hidden */\r\n protected _invertTransformMatrix = Matrix2D.Identity();\r\n /** @hidden */\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 /** @hidden */\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 /** @hidden */\r\n protected _rebuildLayout = false;\r\n\r\n /** @hidden */\r\n public _customData: any = {};\r\n\r\n /** @hidden */\r\n public _isClipped = false;\r\n\r\n /** @hidden */\r\n public _automaticSize = false;\r\n\r\n /** @hidden */\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 */\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 /**\r\n * Gets or sets 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 @serialize()\r\n public clipChildren = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that control content must be clipped\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 @serialize()\r\n public clipContent = true;\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 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 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 /** @hidden */\r\n protected _linkOffsetX = new ValueAndUnit(0);\r\n /** @hidden */\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 * 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 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 * 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 * 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/how_to/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/how_to/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/how_to/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/how_to/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/how_to/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/how_to/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/how_to/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 /**\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 fixedRatio = 0;\r\n\r\n private _fixedRatioMasterIsWidth = true;\r\n\r\n /**\r\n * Gets or sets control width\r\n * @see https://doc.babylonjs.com/how_to/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/how_to/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/how_to/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/how_to/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/how_to/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 /** @hidden */\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 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\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/how_to/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/how_to/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 /** @hidden */\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/how_to/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/how_to/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 /** @hidden */\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/how_to/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/how_to/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 /** @hidden */\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/how_to/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/how_to/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 /** @hidden */\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/how_to/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/how_to/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/how_to/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/how_to/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/how_to/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/how_to/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/how_to/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/how_to/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 (control as Container).children.forEach(recursivelyFirePointerOut);\r\n }\r\n };\r\n recursivelyFirePointerOut(this);\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/how_to/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 // 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 /** @hidden */\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 /** @hidden */\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.Identity(), 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 * @return all child controls\r\n */\r\n public getDescendants(directDescendantsOnly?: boolean, predicate?: (control: Control) => boolean): Control[] {\r\n const results = new Array<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/how_to/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/how_to/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/how_to/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 * @param projectedPosition\r\n * @hidden\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 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 * @param offset\r\n * @hidden\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 * @param offset\r\n * @hidden\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 /** @hidden */\r\n public _markMatrixAsDirty(): void {\r\n this._isMatrixDirty = true;\r\n this._flagDescendantsAsMatrixDirty();\r\n }\r\n\r\n /** @hidden */\r\n public _flagDescendantsAsMatrixDirty(): void {\r\n // No child\r\n }\r\n\r\n /**\r\n * @param rect\r\n * @param context\r\n * @hidden\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 /** @hidden */\r\n protected _computeAdditionnalOffsetX() {\r\n return 0;\r\n }\r\n\r\n /** @hidden */\r\n protected _computeAdditionnalOffsetY() {\r\n return 0;\r\n }\r\n\r\n /** @hidden */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected 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;\r\n const shadowOffsetY = this.shadowOffsetY;\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._computeAdditionnalOffsetX();\r\n const offsetY = this._computeAdditionnalOffsetY();\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 * @param force\r\n * @hidden\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 /** @hidden */\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 * @param host\r\n * @hidden\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 * @param context\r\n * @hidden\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 * @param context\r\n * @hidden\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 * @param context\r\n * @hidden\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 /**\r\n * @param context\r\n * @hidden\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) {\r\n context.fillStyle = this._color;\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 * @param parentMeasure\r\n * @param context\r\n * @hidden\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 this._applyStates(context);\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 < 3);\r\n\r\n if (rebuildCount >= 3) {\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 * @param parentMeasure\r\n * @param context\r\n * @hidden\r\n */\r\n protected _processMeasures(parentMeasure: Measure, context: ICanvasRenderingContext): void {\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 this._computeAlignment(this._tempPaddingMeasure, context);\r\n\r\n // Convert to int values\r\n this._currentMeasure.left = this._currentMeasure.left | 0;\r\n this._currentMeasure.top = this._currentMeasure.top | 0;\r\n this._currentMeasure.width = this._currentMeasure.width | 0;\r\n this._currentMeasure.height = this._currentMeasure.height | 0;\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\r\n protected _evaluateClippingState(parentMeasure: Measure) {\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 /** @hidden */\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 * @param parentMeasure\r\n * @param context\r\n * @hidden\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 * @param parentMeasure\r\n * @param context\r\n * @hidden\r\n */\r\n protected _preMeasure(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * @param parentMeasure\r\n * @param context\r\n * @hidden\r\n */\r\n protected _additionalProcessing(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * @param context\r\n * @hidden\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;\r\n const shadowOffsetY = this.shadowOffsetY;\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 * @param context\r\n * @param invalidatedRectangle\r\n * @hidden\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 * @param context\r\n * @param invalidatedRectangle\r\n * @hidden\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 * @param x\r\n * @param y\r\n * @param pi\r\n * @param type\r\n * @param pointerId\r\n * @param buttonIndex\r\n * @param deltaX\r\n * @param deltaY\r\n * @hidden\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 * @param target\r\n * @param coordinates\r\n * @param pointerId\r\n * @param pi\r\n * @hidden\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) {\r\n this.parent._onPointerMove(target, coordinates, pointerId, pi);\r\n }\r\n }\r\n\r\n /**\r\n * @param target\r\n * @param pi\r\n * @hidden\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) {\r\n this.parent._onPointerEnter(target, pi);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @param target\r\n * @param pi\r\n * @param force\r\n * @hidden\r\n */\r\n public _onPointerOut(target: Control, pi: Nullable<PointerInfoBase>, force = false): void {\r\n if (!force && (!this._isEnabled || target === this)) {\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) {\r\n this.parent._onPointerOut(target, pi, force);\r\n }\r\n }\r\n\r\n /**\r\n * @param target\r\n * @param coordinates\r\n * @param pointerId\r\n * @param buttonIndex\r\n * @param pi\r\n * @hidden\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._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) {\r\n this.parent._onPointerDown(target, coordinates, pointerId, buttonIndex, pi);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @param target\r\n * @param coordinates\r\n * @param pointerId\r\n * @param buttonIndex\r\n * @param notifyClick\r\n * @param pi\r\n * @hidden\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 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) {\r\n this.parent._onPointerUp(target, coordinates, pointerId, buttonIndex, canNotifyClick, pi);\r\n }\r\n }\r\n\r\n /**\r\n * @param pointerId\r\n * @hidden\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 as number, 0, true);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @param deltaX\r\n * @param deltaY\r\n * @hidden\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 /** @hidden */\r\n public _onCanvasBlur(): void {}\r\n\r\n /**\r\n * @param type\r\n * @param x\r\n * @param y\r\n * @param pi\r\n * @param pointerId\r\n * @param buttonIndex\r\n * @param deltaX\r\n * @param deltaY\r\n * @hidden\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 }\r\n\r\n 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 }\r\n\r\n 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 delete this._host._lastControlDown[pointerId];\r\n return true;\r\n }\r\n\r\n 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 }\r\n\r\n return false;\r\n }\r\n\r\n private _prepareFont() {\r\n if (!this._font && !this._fontSet) {\r\n return;\r\n }\r\n\r\n if (this._style) {\r\n this._font = this._style.fontStyle + \" \" + this._style.fontWeight + \" \" + this.fontSizeInPixels + \"px \" + this._style.fontFamily;\r\n } else {\r\n this._font = this._fontStyle + \" \" + this._fontWeight + \" \" + this.fontSizeInPixels + \"px \" + this._fontFamily;\r\n }\r\n\r\n this._fontOffset = Control._GetFontOffset(this._font);\r\n\r\n //children need to be refreshed\r\n this.getDescendants().forEach((child) => child._markAllAsDirty());\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 serialize(serializationObject: any) {\r\n SerializationHelper.Serialize(this, serializationObject);\r\n serializationObject.name = this.name;\r\n serializationObject.className = this.getClassName();\r\n\r\n if (this._font) {\r\n serializationObject.fontFamily = this._fontFamily;\r\n serializationObject.fontSize = this.fontSize;\r\n serializationObject.fontWeight = this.fontWeight;\r\n serializationObject.fontStyle = this.fontStyle;\r\n }\r\n }\r\n\r\n /**\r\n * @param serializedObject\r\n * @param host\r\n * @hidden\r\n */\r\n public _parseFromContent(serializedObject: any, host: AdvancedDynamicTexture) {\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\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 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 * @param font\r\n * @hidden\r\n */\r\n public static _GetFontOffset(font: string): { 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 = 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 * @returns a new Control\r\n */\r\n public static Parse(serializedObject: any, host: AdvancedDynamicTexture): Control {\r\n const controlType = Tools.Instantiate(\"BABYLON.GUI.\" + serializedObject.className);\r\n const control = SerializationHelper.Parse(() => new controlType(), serializedObject, null);\r\n\r\n control.name = serializedObject.name;\r\n\r\n control._parseFromContent(serializedObject, host);\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 * @param x\r\n * @param y\r\n * @param width\r\n * @param height\r\n * @param context\r\n * @hidden\r\n */\r\n protected static drawEllipse(x: number, y: number, width: number, height: 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);\r\n context.closePath();\r\n\r\n context.scale(1 / width, 1 / height);\r\n context.translate(-x, -y);\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.Control\", Control);\r\n","import { 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 { AdvancedDynamicTexture } from \"../advancedDynamicTexture\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { 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\n\r\n/**\r\n * Root class for 2D containers\r\n * @see https://doc.babylonjs.com/how_to/gui#containers\r\n */\r\nexport class Container extends Control {\r\n /** @hidden */\r\n public _children = new Array<Control>();\r\n /** @hidden */\r\n protected _measureForChildren = Measure.Empty();\r\n /** @hidden */\r\n protected _background = \"\";\r\n /** @hidden */\r\n protected _adaptWidthToChildren = false;\r\n /** @hidden */\r\n protected _adaptHeightToChildren = false;\r\n /** @hidden */\r\n protected _renderToIntermediateTexture: boolean = false;\r\n /** @hidden */\r\n protected _intermediateTexture: Nullable<DynamicTexture> = null;\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._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._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 the list of children */\r\n public get children(): Control[] {\r\n return this._children;\r\n }\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 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 name?: string) {\r\n super(name);\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"Container\";\r\n }\r\n\r\n public _flagDescendantsAsMatrixDirty(): void {\r\n for (const child of this.children) {\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.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 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 return this;\r\n }\r\n\r\n /**\r\n * @param control\r\n * @hidden\r\n */\r\n public _reOrderControl(control: Control): void {\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 this._markAsDirty();\r\n }\r\n\r\n /**\r\n * @param offset\r\n * @hidden\r\n */\r\n public _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 * @param offset\r\n * @hidden\r\n */\r\n public _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 /** @hidden */\r\n public _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 /**\r\n * @param context\r\n * @hidden\r\n */\r\n protected _localDraw(context: ICanvasRenderingContext): void {\r\n if (this._background) {\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;\r\n context.shadowOffsetY = this.shadowOffsetY;\r\n }\r\n\r\n context.fillStyle = this._background;\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 * @param host\r\n * @hidden\r\n */\r\n public _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 /** @hidden */\r\n protected _beforeLayout() {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * @param parentMeasure\r\n * @param context\r\n * @hidden\r\n */\r\n protected _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 * @param parentMeasure\r\n * @param context\r\n * @hidden\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 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 (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 if (this.adaptWidthToChildren && computedWidth >= 0) {\r\n computedWidth += this.paddingLeftInPixels + this.paddingRightInPixels;\r\n if (this.width !== computedWidth + \"px\") {\r\n this.parent?._markAsDirty();\r\n this.width = computedWidth + \"px\";\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 if (this.height !== computedHeight + \"px\") {\r\n this.parent?._markAsDirty();\r\n this.height = computedHeight + \"px\";\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 (rebuildCount >= 3 && 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 _postMeasure() {\r\n // Do nothing by default\r\n }\r\n\r\n /**\r\n * @param context\r\n * @param invalidatedRectangle\r\n * @hidden\r\n */\r\n public _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 contextToDrawTo.clearRect(invalidatedRectangle.left, invalidatedRectangle.top, invalidatedRectangle.width, invalidatedRectangle.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 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 * @param x\r\n * @param y\r\n * @param pi\r\n * @param type\r\n * @param pointerId\r\n * @param buttonIndex\r\n * @param deltaX\r\n * @param deltaY\r\n * @hidden\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 || !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 // 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 * @param parentMeasure\r\n * @param context\r\n * @hidden\r\n */\r\n protected _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 /**\r\n * Serializes the current control\r\n * @param serializationObject defined the JSON serialized object\r\n */\r\n public serialize(serializationObject: any) {\r\n super.serialize(serializationObject);\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 const childSerializationObject = {};\r\n child.serialize(childSerializationObject);\r\n serializationObject.children.push(childSerializationObject);\r\n }\r\n }\r\n\r\n /** Releases associated resources */\r\n public 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 * @param serializedObject\r\n * @param host\r\n * @hidden\r\n */\r\n public _parseFromContent(serializedObject: any, host: AdvancedDynamicTexture) {\r\n super._parseFromContent(serializedObject, host);\r\n this._link(host);\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));\r\n }\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.Container\", Container);\r\n","import { Container } from \"./container\";\r\nimport { Measure } from \"../measure\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { 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;\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 angle */\r\n @serialize()\r\n public get cornerRadius(): number {\r\n return this._cornerRadius;\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 === value) {\r\n return;\r\n }\r\n\r\n this._cornerRadius = value;\r\n this._markAsDirty();\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 name?: string) {\r\n super(name);\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"Rectangle\";\r\n }\r\n\r\n /** @hidden */\r\n protected _computeAdditionnalOffsetX() {\r\n if (this._cornerRadius) {\r\n // Take in account the aliasing\r\n return 1;\r\n }\r\n return 0;\r\n }\r\n\r\n /** @hidden */\r\n protected _computeAdditionnalOffsetY() {\r\n if (this._cornerRadius) {\r\n // Take in account the aliasing\r\n return 1;\r\n }\r\n return 0;\r\n }\r\n\r\n protected _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;\r\n context.shadowOffsetY = this.shadowOffsetY;\r\n }\r\n\r\n if (this._background) {\r\n context.fillStyle = this.typeName === \"Button\" ? (this.isEnabled ? this._background : this.disabledColor) : this._background;\r\n\r\n if (this._cornerRadius) {\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) {\r\n context.strokeStyle = this.color;\r\n }\r\n context.lineWidth = this._thickness;\r\n\r\n if (this._cornerRadius) {\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 _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 const radius = Math.min(height / 2 - 2, Math.min(width / 2 - 2, this._cornerRadius));\r\n\r\n context.beginPath();\r\n context.moveTo(x + radius, y);\r\n context.lineTo(x + width - radius, y);\r\n context.quadraticCurveTo(x + width, y, x + width, y + radius);\r\n context.lineTo(x + width, y + height - radius);\r\n context.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\r\n context.lineTo(x + radius, y + height);\r\n context.quadraticCurveTo(x, y + height, x, y + height - radius);\r\n context.lineTo(x, y + radius);\r\n context.quadraticCurveTo(x, y, x + radius, y);\r\n context.closePath();\r\n }\r\n\r\n protected _clipForChildren(context: ICanvasRenderingContext) {\r\n if (this._cornerRadius) {\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 { Measure } from \"../measure\";\r\nimport { ValueAndUnit } from \"../valueAndUnit\";\r\nimport { Control } from \"./control\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { Nullable } from \"core/types\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { ICanvasRenderingContext } 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 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,\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 /**\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 * 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 an boolean indicating that the TextBlock will be resized to fit container\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 an boolean indicating that the TextBlock will be resized to fit container\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 * 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 * 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 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 _getTypeName(): string {\r\n return \"TextBlock\";\r\n }\r\n\r\n protected _processMeasures(parentMeasure: Measure, context: ICanvasRenderingContext): void {\r\n if (!this._fontOffset || this.isDirty) {\r\n this._fontOffset = Control._GetFontOffset(context.font);\r\n }\r\n super._processMeasures(parentMeasure, context);\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 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) {\r\n const newWidth = (this._paddingLeftInPixels + this._paddingRightInPixels + maxLineWidth) | 0;\r\n if (newWidth !== this._width.internalValue) {\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 = 0;\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 context.shadowOffsetX = this.shadowOffsetX;\r\n context.shadowOffsetY = this.shadowOffsetY;\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 context.beginPath();\r\n context.lineWidth = Math.round(this.fontSizeInPixels * 0.05);\r\n context.moveTo(this._currentMeasure.left + x, y + 3);\r\n context.lineTo(this._currentMeasure.left + x + textWidth, y + 3);\r\n context.stroke();\r\n context.closePath();\r\n }\r\n\r\n if (this._lineThrough) {\r\n context.beginPath();\r\n context.lineWidth = Math.round(this.fontSizeInPixels * 0.05);\r\n context.moveTo(this._currentMeasure.left + x, y - this.fontSizeInPixels / 3);\r\n context.lineTo(this._currentMeasure.left + x + textWidth, y - this.fontSizeInPixels / 3);\r\n context.stroke();\r\n context.closePath();\r\n }\r\n }\r\n\r\n /**\r\n * @param context\r\n * @hidden\r\n */\r\n public _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 _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 protected _breakLines(refWidth: number, refHeight: number, context: ICanvasRenderingContext): object[] {\r\n const lines = [];\r\n const _lines = this.text.split(\"\\n\");\r\n\r\n if (this._textWrapping === TextWrapping.Ellipsis) {\r\n for (const _line of _lines) {\r\n lines.push(this._parseLineEllipsis(_line, refWidth, context));\r\n }\r\n } else if (this._textWrapping === TextWrapping.WordWrap) {\r\n for (const _line of _lines) {\r\n lines.push(...this._parseLineWordWrap(_line, refWidth, context));\r\n }\r\n } else if (this._textWrapping === TextWrapping.WordWrapEllipsis) {\r\n for (const _line of _lines) {\r\n lines.push(...this._parseLineWordWrapEllipsis(_line, refWidth, refHeight!, 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 return lines;\r\n }\r\n\r\n protected _parseLine(line: string = \"\", context: ICanvasRenderingContext): object {\r\n const textMetrics = context.measureText(line);\r\n const lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);\r\n return { text: line, width: lineWidth };\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 textMetrics = context.measureText(line);\r\n let lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);\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 textMetrics = context.measureText(line + \"…\");\r\n lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);\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 textMetrics = context.measureText(line);\r\n lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);\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 protected _parseLineWordWrap(line: string = \"\", width: number, context: ICanvasRenderingContext): object[] {\r\n const lines = [];\r\n const words = this.wordSplittingFunction ? this.wordSplittingFunction(line) : line.split(\" \");\r\n let textMetrics = context.measureText(line);\r\n let lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);\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 = Math.abs(metrics.actualBoundingBoxLeft) + Math.abs(metrics.actualBoundingBoxRight);\r\n if (testWidth > width && n > 0) {\r\n lines.push({ text: line, width: lineWidth });\r\n line = words[n];\r\n textMetrics = context.measureText(line);\r\n lineWidth = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight);\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 + 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 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 = 0;\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 /**\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._applyStates(context);\r\n if (!this._fontOffset) {\r\n this._fontOffset = Control._GetFontOffset(context.font);\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 dispose(): void {\r\n super.dispose();\r\n\r\n this.onTextChangedObservable.clear();\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.TextBlock\", TextBlock);\r\n","import { 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 { Measure } from \"../measure\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { ICanvas, ICanvasRenderingContext, 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 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>;\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 * 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 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 /**\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/how_to/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 * @param n\r\n * @param preserveProperties\r\n * @hidden\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 * Gets or sets image source url\r\n */\r\n public set source(value: Nullable<string>) {\r\n if (this._source === value) {\r\n return;\r\n }\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 (!engine) {\r\n throw new Error(\"Invalid engine. Unable to create a canvas.\");\r\n }\r\n this._domImage = engine.createCanvasImage();\r\n\r\n this._domImage.onload = () => {\r\n this._onImageLoaded();\r\n };\r\n if (value) {\r\n Tools.SetCorsBehavior(value, this._domImage);\r\n this._domImage.src = value;\r\n }\r\n }\r\n\r\n /**\r\n * Checks for svg document with icon id present\r\n * @param value\r\n */\r\n private _svgCheck(value: string): string {\r\n if (window.SVGSVGElement && value.search(/.svg#/gi) !== -1 && value.indexOf(\"#\") === value.lastIndexOf(\"#\")) {\r\n this._isSVG = true;\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 vb_width = Number(vb.split(\" \")[2]);\r\n const vb_height = Number(vb.split(\" \")[3]);\r\n const elem_bbox = elem.getBBox();\r\n let elem_matrix_a = 1;\r\n let elem_matrix_d = 1;\r\n let elem_matrix_e = 0;\r\n let elem_matrix_f = 0;\r\n const mainMatrix = elem.transform.baseVal.consolidate()!.matrix;\r\n if (elem.transform && elem.transform.baseVal.consolidate()) {\r\n elem_matrix_a = mainMatrix.a;\r\n elem_matrix_d = mainMatrix.d;\r\n elem_matrix_e = mainMatrix.e;\r\n elem_matrix_f = mainMatrix.f;\r\n }\r\n\r\n // compute source coordinates and dimensions\r\n this.sourceLeft = ((elem_matrix_a * elem_bbox.x + elem_matrix_e) * docwidth) / vb_width;\r\n this.sourceTop = ((elem_matrix_d * elem_bbox.y + elem_matrix_f) * docheight) / vb_height;\r\n this.sourceWidth = elem_bbox.width * elem_matrix_a * (docwidth / vb_width);\r\n this.sourceHeight = elem_bbox.height * elem_matrix_d * (docheight / vb_height);\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/how_to/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/how_to/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/how_to/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(public name?: string, url: Nullable<string> = null) {\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 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 _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 _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 canvas = this._workingCanvas!;\r\n context = canvas.getContext(\"2d\")!;\r\n\r\n context.drawImage(this._domImage, sx, sy, sw, sh, tx - this._currentMeasure.left, ty - this._currentMeasure.top, tw, th);\r\n }\r\n\r\n public _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;\r\n context.shadowOffsetY = this.shadowOffsetY;\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);\r\n break;\r\n }\r\n }\r\n\r\n context.restore();\r\n }\r\n\r\n private _renderNinePatch(context: ICanvasRenderingContext): void {\r\n const leftWidth = this._sliceLeft;\r\n const topHeight = this._sliceTop;\r\n const bottomHeight = this._imageHeight - this._sliceBottom;\r\n const rightWidth = this._imageWidth - this._sliceRight;\r\n const centerWidth = this._sliceRight - this._sliceLeft;\r\n const centerHeight = this._sliceBottom - this._sliceTop;\r\n const targetCenterWidth = this._currentMeasure.width - rightWidth - leftWidth + 2;\r\n const targetCenterHeight = this._currentMeasure.height - bottomHeight - topHeight + 2;\r\n const centerLeftOffset = this._currentMeasure.left + leftWidth - 1;\r\n const centerTopOffset = this._currentMeasure.top + topHeight - 1;\r\n const rightOffset = this._currentMeasure.left + this._currentMeasure.width - rightWidth;\r\n const bottomOffset = this._currentMeasure.top + this._currentMeasure.height - bottomHeight;\r\n\r\n //Top Left\r\n this._drawImage(context, 0, 0, leftWidth, topHeight, this._currentMeasure.left, this._currentMeasure.top, leftWidth, topHeight);\r\n //Top\r\n this._drawImage(context, this._sliceLeft, 0, centerWidth, topHeight, centerLeftOffset, this._currentMeasure.top, targetCenterWidth, topHeight);\r\n //Top Right\r\n this._drawImage(context, this.sliceRight, 0, rightWidth, topHeight, rightOffset, this._currentMeasure.top, rightWidth, topHeight);\r\n //Left\r\n this._drawImage(context, 0, this._sliceTop, leftWidth, centerHeight, this._currentMeasure.left, centerTopOffset, leftWidth, targetCenterHeight);\r\n // Center\r\n this._drawImage(context, this._sliceLeft, this._sliceTop, centerWidth, centerHeight, centerLeftOffset, centerTopOffset, targetCenterWidth, targetCenterHeight);\r\n //Right\r\n this._drawImage(context, this._sliceRight, this._sliceTop, rightWidth, centerHeight, rightOffset, centerTopOffset, rightWidth, targetCenterHeight);\r\n //Bottom Left\r\n this._drawImage(context, 0, this._sliceBottom, leftWidth, bottomHeight, this._currentMeasure.left, bottomOffset, leftWidth, bottomHeight);\r\n //Bottom\r\n this._drawImage(context, this.sliceLeft, this._sliceBottom, centerWidth, bottomHeight, centerLeftOffset, bottomOffset, targetCenterWidth, bottomHeight);\r\n //Bottom Right\r\n this._drawImage(context, this._sliceRight, this._sliceBottom, rightWidth, bottomHeight, rightOffset, bottomOffset, rightWidth, bottomHeight);\r\n }\r\n\r\n public dispose() {\r\n super.dispose();\r\n this.onImageLoadedObservable.clear();\r\n this.onSVGAttributesComputedObservable.clear();\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 { Nullable } from \"core/types\";\r\nimport { 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 { PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { AdvancedDynamicTexture } from \"../advancedDynamicTexture\";\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 /**\r\n * Gets or sets a boolean indicating that the button will let internal controls handle picking instead of doing it directly using its bounding info\r\n */\r\n public delegatePickingToChildren = false;\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 image 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 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 _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 * @param x\r\n * @param y\r\n * @param pi\r\n * @param type\r\n * @param pointerId\r\n * @param buttonIndex\r\n * @param deltaX\r\n * @param deltaY\r\n * @hidden\r\n */\r\n public _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 * @param target\r\n * @param pi\r\n * @hidden\r\n */\r\n public _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 * @param target\r\n * @param pi\r\n * @param force\r\n * @hidden\r\n */\r\n public _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 * @param target\r\n * @param coordinates\r\n * @param pointerId\r\n * @param buttonIndex\r\n * @param pi\r\n * @hidden\r\n */\r\n public _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 /**\r\n * @param target\r\n * @param coordinates\r\n * @param pointerId\r\n * @param buttonIndex\r\n * @param notifyClick\r\n * @param pi\r\n * @hidden\r\n */\r\n public _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 */\r\n public serialize(serializationObject: any) {\r\n super.serialize(serializationObject);\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 * @param serializedObject\r\n * @param host\r\n * @hidden\r\n */\r\n public _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 { Tools } from \"core/Misc/tools\";\r\n\r\nimport { Container } from \"./container\";\r\nimport { Measure } from \"../measure\";\r\nimport { Control } from \"./control\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { AdvancedDynamicTexture } from \"../advancedDynamicTexture\";\r\nimport { ICanvasRenderingContext } from \"core/Engines/ICanvas\";\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 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 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 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 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 name?: string) {\r\n super(name);\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"StackPanel\";\r\n }\r\n\r\n /**\r\n * @param parentMeasure\r\n * @param context\r\n * @hidden\r\n */\r\n protected _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 _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 _postMeasure(): void {\r\n let stackWidth = 0;\r\n let stackHeight = 0;\r\n const childrenCount = this._children.length;\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 if (child.top !== stackHeight + \"px\") {\r\n child.top = stackHeight + \"px\";\r\n this._rebuildLayout = true;\r\n child._top.ignoreAdaptiveScaling = true;\r\n }\r\n\r\n if (child._height.isPercentage && !child._automaticSize) {\r\n if (!this.ignoreLayoutWarnings) {\r\n Tools.Warn(`Control (Name:${child.name}, UniqueId:${child.uniqueId}) is using height in percentage mode inside a vertical StackPanel`);\r\n }\r\n } else {\r\n stackHeight += child._currentMeasure.height + child._paddingTopInPixels + child._paddingBottomInPixels + (index < childrenCount - 1 ? this._spacing : 0);\r\n }\r\n } else {\r\n if (child.left !== stackWidth + \"px\") {\r\n child.left = stackWidth + \"px\";\r\n this._rebuildLayout = true;\r\n child._left.ignoreAdaptiveScaling = true;\r\n }\r\n\r\n if (child._width.isPercentage && !child._automaticSize) {\r\n if (!this.ignoreLayoutWarnings) {\r\n Tools.Warn(`Control (Name:${child.name}, UniqueId:${child.uniqueId}) is using width in percentage mode inside a horizontal StackPanel`);\r\n }\r\n } else {\r\n stackWidth += child._currentMeasure.width + child._paddingLeftInPixels + child._paddingRightInPixels + (index < childrenCount - 1 ? this._spacing : 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._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._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 /**\r\n * Serializes the current control\r\n * @param serializationObject defined the JSON serialized object\r\n */\r\n public serialize(serializationObject: any) {\r\n super.serialize(serializationObject);\r\n serializationObject.manualWidth = this._manualWidth;\r\n serializationObject.manualHeight = this._manualHeight;\r\n }\r\n\r\n /**\r\n * @param serializedObject\r\n * @param host\r\n * @hidden\r\n */\r\n public _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 { 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 { PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { 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 name?: string) {\r\n super(name);\r\n this.isPointerBlocker = true;\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"Checkbox\";\r\n }\r\n\r\n /**\r\n * @param context\r\n * @hidden\r\n */\r\n public _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;\r\n context.shadowOffsetY = this.shadowOffsetY;\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 context.fillStyle = this._isEnabled ? this.color : 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 * @param target\r\n * @param coordinates\r\n * @param pointerId\r\n * @param buttonIndex\r\n * @param pi\r\n * @hidden\r\n */\r\n public _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","/** @hidden */\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.substr(from, length);\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 { Nullable } from \"core/types\";\r\nimport { Observable, Observer } from \"core/Misc/observable\";\r\nimport { Vector2 } from \"core/Maths/math.vector\";\r\nimport { ClipboardEventTypes, ClipboardInfo } from \"core/Events/clipboardEvents\";\r\nimport { PointerInfo, PointerEventTypes, PointerInfoBase } from \"core/Events/pointerEvents\";\r\n\r\nimport { Control } from \"./control\";\r\nimport { IFocusableControl } from \"./focusableControl\";\r\nimport { ValueAndUnit } from \"../valueAndUnit\";\r\nimport { VirtualKeyboard } from \"./virtualKeyboard\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { TextWrapper } from \"./textWrapper\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { IKeyboardEvent, IPointerEvent } from \"core/Events/deviceInputEvents\";\r\nimport { 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 implements IFocusableControl {\r\n private _textWrapper: TextWrapper;\r\n private _placeholderText = \"\";\r\n private _background = \"#222222\";\r\n private _focusedBackground = \"#000000\";\r\n private _focusedColor = \"white\";\r\n private _placeholderColor = \"gray\";\r\n private _thickness = 1;\r\n private _margin = new ValueAndUnit(10, ValueAndUnit.UNITMODE_PIXEL);\r\n private _autoStretchWidth = true;\r\n private _maxWidth = new ValueAndUnit(1, ValueAndUnit.UNITMODE_PERCENTAGE, false);\r\n private _isFocused = false;\r\n /** the type of device that most recently focused the input: \"mouse\", \"touch\" or \"pen\" */\r\n private _focusedBy: string;\r\n private _blinkTimeout: number;\r\n private _blinkIsEven = false;\r\n private _cursorOffset = 0;\r\n private _scrollLeft: Nullable<number>;\r\n private _textWidth: number;\r\n private _clickedCoordinate: Nullable<number>;\r\n private _deadKey = false;\r\n private _addKey = true;\r\n private _currentKey = \"\";\r\n private _isTextHighlightOn = false;\r\n private _textHighlightColor = \"#d5e0ff\";\r\n private _highligherOpacity = 0.4;\r\n private _highlightedText = \"\";\r\n private _startHighlightIndex = 0;\r\n private _endHighlightIndex = 0;\r\n private _cursorIndex = -1;\r\n private _onFocusSelectAll = false;\r\n private _isPointerDown = false;\r\n private _onClipboardObserver: Nullable<Observer<ClipboardInfo>>;\r\n private _onPointerDblTapObserver: Nullable<Observer<PointerInfo>>;\r\n\r\n /** @hidden */\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 /** 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 control gets the focus */\r\n public onFocusObservable = new Observable<InputText>();\r\n /** Observable raised when the control loses the focus */\r\n public onBlurObservable = 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 /** Observable raised when a key event was processed */\r\n public onKeyboardEventProcessedObservable = new Observable<IKeyboardEvent>();\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 /** Gets or sets the text highlighter transparency; default: 0.4 */\r\n @serialize()\r\n public get highligherOpacity(): number {\r\n return this._highligherOpacity;\r\n }\r\n\r\n public set highligherOpacity(value: number) {\r\n if (this._highligherOpacity === value) {\r\n return;\r\n }\r\n this._highligherOpacity = value;\r\n this._markAsDirty();\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 @serialize()\r\n public get focusedColor(): string {\r\n return this._focusedColor;\r\n }\r\n\r\n public 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 flag */\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 private _textHasChanged(): void {\r\n this._markAsDirty();\r\n this.onTextChangedObservable.notifyObservers(this);\r\n }\r\n\r\n /** Gets or sets control width */\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 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 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(public name?: string, text: string = \"\") {\r\n super(name);\r\n\r\n this.text = text;\r\n this.isPointerBlocker = true;\r\n }\r\n\r\n /** @hidden */\r\n public 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 /** @hidden */\r\n public 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);\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 /**\r\n * Function to focus an inputText programmatically\r\n */\r\n public focus() {\r\n this._host.moveFocusToControl(this);\r\n }\r\n\r\n /**\r\n * Function to unfocus an inputText programmatically\r\n */\r\n public blur() {\r\n this._host.focusedControl = null;\r\n }\r\n\r\n protected _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 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 * @param keyCode\r\n * @param key\r\n * @param evt\r\n * @hidden\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.substr(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 case 222: // Dead\r\n if (evt) {\r\n //add support for single and double quotes\r\n if (evt.code == \"Quote\") {\r\n if (evt.shiftKey) {\r\n keyCode = 34;\r\n key = '\"';\r\n } else {\r\n keyCode = 39;\r\n key = \"'\";\r\n }\r\n } else {\r\n evt.preventDefault();\r\n this._cursorIndex = -1;\r\n this.deadKey = true;\r\n }\r\n } else {\r\n this._cursorIndex = -1;\r\n this.deadKey = true;\r\n }\r\n break;\r\n }\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) {\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 += 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 }\r\n }\r\n }\r\n\r\n /**\r\n * @param offset\r\n * @hidden\r\n */\r\n private _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 * @param evt\r\n * @hidden\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _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 this.onTextHighlightObservable.notifyObservers(this);\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 /** @hidden */\r\n private _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 processKeyboard(evt: IKeyboardEvent): void {\r\n // process pressed key\r\n this.processKey(evt.keyCode, evt.key, evt);\r\n\r\n this.onKeyboardEventProcessedObservable.notifyObservers(evt);\r\n }\r\n\r\n /**\r\n * @param ev\r\n * @hidden\r\n */\r\n private _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 * @param ev\r\n * @hidden\r\n */\r\n private _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 * @param ev\r\n * @hidden\r\n */\r\n private _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 _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;\r\n context.shadowOffsetY = this.shadowOffsetY;\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);\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 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._highligherOpacity;\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 _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 _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 _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 public 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 { Nullable } from \"core/types\";\r\n\r\nimport { Container } from \"./container\";\r\nimport { ValueAndUnit } from \"../valueAndUnit\";\r\nimport { Control } from \"./control\";\r\nimport { Measure } from \"../measure\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\nimport { AdvancedDynamicTexture } from \"../advancedDynamicTexture\";\r\nimport { Observer } from \"core/Misc/observable\";\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 * 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 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 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 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 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 name?: string) {\r\n super(name);\r\n }\r\n\r\n protected _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 = (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 = (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 _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.left = lefts[y] + \"px\";\r\n cell.top = tops[x] + \"px\";\r\n cell.width = widths[y] + \"px\";\r\n cell.height = heights[x] + \"px\";\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 _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 _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 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 = [];\r\n this._rowDefinitions = [];\r\n this._columnDefinitionObservers = [];\r\n this._columnDefinitions = [];\r\n this._cells = {};\r\n this._childControls = [];\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 serialize(serializationObject: any) {\r\n super.serialize(serializationObject);\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 this.children.forEach((child) => {\r\n serializationObject.tags.push(child._tag);\r\n });\r\n }\r\n\r\n /**\r\n * @param serializedObject\r\n * @param host\r\n * @hidden\r\n */\r\n public _parseFromContent(serializedObject: any, host: AdvancedDynamicTexture) {\r\n super._parseFromContent(serializedObject, host);\r\n const children: Control[] = [];\r\n this.children.forEach((child) => {\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 { Vector2 } from \"core/Maths/math.vector\";\r\n\r\nimport { Control } from \"./control\";\r\nimport { 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 { 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 { PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { ICanvas, 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);\r\n }\r\n\r\n /**\r\n * Gets or sets control width\r\n * @see https://doc.babylonjs.com/how_to/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 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/how_to/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 /** Gets or sets control height */\r\n public 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 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 _getTypeName(): string {\r\n return \"ColorPicker\";\r\n }\r\n\r\n /**\r\n * @param parentMeasure\r\n * @hidden\r\n */\r\n protected _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 let alphaRatio = (dist - innerRadius) / (radius - innerRadius);\r\n\r\n //apply less alpha to bigger color pickers\r\n let alphaAmount = 0.2;\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 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 * @param context\r\n * @hidden\r\n */\r\n public _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;\r\n context.shadowOffsetY = this.shadowOffsetY;\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 _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 _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 _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 _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 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 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(<string>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(<string>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 { Measure } from \"../measure\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { 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 /**\r\n * Creates a new Ellipse\r\n * @param name defines the control name\r\n */\r\n constructor(public name?: string) {\r\n super(name);\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"Ellipse\";\r\n }\r\n\r\n protected _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;\r\n context.shadowOffsetY = this.shadowOffsetY;\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 context\r\n );\r\n\r\n if (this._background) {\r\n context.fillStyle = this._background;\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 _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 _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 context\r\n );\r\n\r\n context.clip();\r\n }\r\n\r\n public _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 context\r\n );\r\n context.stroke();\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.Ellipse\", Ellipse);\r\n","import { Nullable } from \"core/types\";\r\nimport { Vector2 } from \"core/Maths/math.vector\";\r\n\r\nimport { Button } from \"./button\";\r\nimport { Control } from \"./control\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { IFocusableControl } from \"./focusableControl\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { IKeyboardEvent } from \"core/Events/deviceInputEvents\";\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 /** Highlight color when button is focused */\r\n public focusedColor: Nullable<string> = null;\r\n private _isFocused = false;\r\n private _unfocusedColor: Nullable<string> = null;\r\n\r\n /** Observable raised when the control gets the focus */\r\n public onFocusObservable = new Observable<Button>();\r\n /** Observable raised when the control loses the focus */\r\n public onBlurObservable = new Observable<Button>();\r\n /** Observable raised when a key event was processed */\r\n public onKeyboardEventProcessedObservable = new Observable<IKeyboardEvent>();\r\n\r\n constructor(public name?: string) {\r\n super(name);\r\n\r\n this._unfocusedColor = this.color;\r\n }\r\n\r\n /** @hidden */\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 /** @hidden */\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 this.onKeyboardEventProcessedObservable.notifyObservers(evt, -1, this);\r\n }\r\n\r\n /**\r\n * @param target\r\n * @param coordinates\r\n * @param pointerId\r\n * @param buttonIndex\r\n * @param pi\r\n * @hidden\r\n */\r\n public _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\n /** @hidden */\r\n public displose() {\r\n super.dispose();\r\n\r\n this.onBlurObservable.clear();\r\n this.onFocusObservable.clear();\r\n this.onKeyboardEventProcessedObservable.clear();\r\n }\r\n}\r\nRegisterClass(\"BABYLON.GUI.FocusableButton\", FocusableButton);\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 _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 { Nullable } from \"core/types\";\r\nimport { Observer } from \"core/Misc/observable\";\r\nimport { Vector3, Matrix } from \"core/Maths/math.vector\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { Scene } from \"core/scene\";\r\n\r\nimport { Control } from \"./control\";\r\nimport { ValueAndUnit } from \"../valueAndUnit\";\r\nimport { Measure } from \"../measure\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { 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 private _x1 = new ValueAndUnit(0);\r\n private _y1 = new ValueAndUnit(0);\r\n private _x2 = new ValueAndUnit(0);\r\n private _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 if (this._connectedControl === value) {\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 set horizontalAlignment(value: number) {\r\n return;\r\n }\r\n\r\n /** Gets or sets vertical alignment */\r\n public set verticalAlignment(value: number) {\r\n return;\r\n }\r\n\r\n private get _effectiveX2(): number {\r\n return (this._connectedControl ? this._connectedControl.centerX : 0) + this._x2.getValue(this._host);\r\n }\r\n\r\n private 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 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 _getTypeName(): string {\r\n return \"Line\";\r\n }\r\n\r\n public _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;\r\n context.shadowOffsetY = this.shadowOffsetY;\r\n }\r\n\r\n this._applyStates(context);\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 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 _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 protected _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 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.Identity(), 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 _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 { Nullable } from \"core/types\";\r\nimport { Observer } from \"core/Misc/observable\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { Epsilon } from \"core/Maths/math.constants\";\r\nimport { Camera } from \"core/Cameras/camera\";\r\nimport { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\n\r\nimport { MultiLine } from \"./controls/multiLine\";\r\nimport { ValueAndUnit } from \"./valueAndUnit\";\r\nimport { 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 /** @hidden */\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 { 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 { Vector3 } from \"core/Maths/math.vector\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { 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 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] as MultiLinePoint;\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 this._points.forEach((point) => {\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 set horizontalAlignment(value: number) {\r\n return;\r\n }\r\n\r\n public set verticalAlignment(value: number) {\r\n return;\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"MultiLine\";\r\n }\r\n\r\n public _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;\r\n context.shadowOffsetY = this.shadowOffsetY;\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 this._points.forEach((point) => {\r\n if (!point) {\r\n return;\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 _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 this._points.forEach((point) => {\r\n if (!point) {\r\n return;\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 _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 _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 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 { 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 { PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { 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 name?: string) {\r\n super(name);\r\n\r\n this.isPointerBlocker = true;\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"RadioButton\";\r\n }\r\n\r\n public _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;\r\n context.shadowOffsetY = this.shadowOffsetY;\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 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 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 _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 { Vector2 } from \"core/Maths/math.vector\";\r\n\r\nimport { Control } from \"../control\";\r\nimport { ValueAndUnit } from \"../../valueAndUnit\";\r\nimport { PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { serialize } from \"core/Misc/decorators\";\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);\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 name?: string) {\r\n super(name);\r\n\r\n this.isPointerBlocker = true;\r\n }\r\n\r\n protected _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 console.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 * @param x\r\n * @param y\r\n * @hidden\r\n */\r\n protected _updateValueFromPointer(x: number, y: number): void {\r\n if (this.rotation != 0) {\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\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 _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 _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\r\n super._onPointerMove(target, coordinates, pointerId, pi);\r\n }\r\n\r\n public _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 _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 { ICanvasRenderingContext } from \"core/Engines/ICanvas\";\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\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 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 name?: string) {\r\n super(name);\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"Slider\";\r\n }\r\n\r\n public _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 = 0;\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\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;\r\n context.shadowOffsetY = this.shadowOffsetY;\r\n }\r\n\r\n const thumbPosition = this._getThumbPosition();\r\n context.fillStyle = this._background;\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.color;\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.color;\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;\r\n context.shadowOffsetY = this.shadowOffsetY;\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\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[] = new Array();\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 * @param text\r\n * @hidden\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 * @param selectorNb\r\n * @hidden\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 * @param selectorNb\r\n * @param label\r\n * @hidden\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 * @param selectorNb\r\n * @param color\r\n * @hidden\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 * @param selectorNb\r\n * @param color\r\n * @hidden\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 * @param selectorNb\r\n * @param color\r\n * @hidden\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 * @param selectorNb\r\n * @param label\r\n * @hidden\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 * @param selectorNb\r\n * @param color\r\n * @hidden\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 * @param selectorNb\r\n * @param color\r\n * @hidden\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 * @param selectorNb\r\n * @param color\r\n * @hidden\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 * @param selectorNb\r\n * @param label\r\n * @hidden\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 * @param selectorNb\r\n * @param color\r\n * @hidden\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 * @param selectorNb\r\n * @param color\r\n * @hidden\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 * @param selectorNb\r\n * @param color\r\n * @hidden\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/how_to/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[] = new Array();\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 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 _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 { ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\n\r\n/**\r\n * Class used to hold a the container for ScrollViewer\r\n * @hidden\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 _getTypeName(): string {\r\n return \"ScrollViewerWindow\";\r\n }\r\n\r\n /**\r\n * @param parentMeasure\r\n * @param context\r\n * @hidden\r\n */\r\n protected _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 * @param parentMeasure\r\n * @param context\r\n * @hidden\r\n */\r\n public _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 * @param context\r\n * @param invalidatedRectangle\r\n * @hidden\r\n */\r\n public _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 _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 { Vector2 } from \"core/Maths/math.vector\";\r\nimport { BaseSlider } from \"./baseSlider\";\r\nimport { Control } from \"../control\";\r\nimport { Measure } from \"../../measure\";\r\nimport { PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { ICanvasRenderingContext } from \"core/Engines/ICanvas\";\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\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 /**\r\n * Creates a new Slider\r\n * @param name defines the control name\r\n */\r\n constructor(public name?: string) {\r\n super(name);\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"Scrollbar\";\r\n }\r\n\r\n protected _getThumbThickness(): number {\r\n let thumbThickness = 0;\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 _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._background;\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.color;\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 * @param x\r\n * @param y\r\n * @hidden\r\n */\r\n protected _updateValueFromPointer(x: number, y: number): void {\r\n if (this.rotation != 0) {\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\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 = 0;\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 += delta * (this.maximum - this.minimum);\r\n\r\n this._originX = x;\r\n this._originY = y;\r\n }\r\n\r\n public _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 { Vector2 } from \"core/Maths/math.vector\";\r\nimport { BaseSlider } from \"./baseSlider\";\r\nimport { Control } from \"../control\";\r\nimport { Image } from \"../image\";\r\nimport { Measure } from \"../../measure\";\r\nimport { PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { serialize } from \"core/Misc/decorators\";\r\nimport { 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\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 /**\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._thumbLength === 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 name?: string) {\r\n super(name);\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"ImageScrollBar\";\r\n }\r\n\r\n protected _getThumbThickness(): number {\r\n let thumbThickness = 0;\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 _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 * @param x\r\n * @param y\r\n * @hidden\r\n */\r\n protected _updateValueFromPointer(x: number, y: number): void {\r\n if (this.rotation != 0) {\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\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 = 0;\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 += delta * (this.maximum - this.minimum);\r\n\r\n this._originX = x;\r\n this._originY = y;\r\n }\r\n\r\n public _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 { Nullable } from \"core/types\";\r\nimport { Observer } from \"core/Misc/observable\";\r\nimport { Vector2 } from \"core/Maths/math\";\r\nimport { Rectangle } from \"../rectangle\";\r\nimport { Grid } from \"../grid\";\r\nimport { Image } from \"../image\";\r\nimport { Control } from \"../control\";\r\nimport { Container } from \"../container\";\r\nimport { Measure } from \"../../measure\";\r\nimport { 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 { ICanvasRenderingContext } from \"core/Engines/ICanvas\";\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 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 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 get children(): Control[] {\r\n return this._window.children;\r\n }\r\n\r\n public _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 // 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 _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 _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 _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 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 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 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 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 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 /** @hidden */\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 _link(host: AdvancedDynamicTexture): void {\r\n super._link(host);\r\n\r\n this._attachWheel();\r\n }\r\n\r\n /**\r\n * @param barControl\r\n * @param barContainer\r\n * @param isVertical\r\n * @param rotation\r\n * @hidden\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 /** @hidden */\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 _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 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 { Nullable } from \"core/types\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { Vector2 } from \"core/Maths/math.vector\";\r\n\r\nimport { Rectangle } from \"./rectangle\";\r\nimport { Control } from \"./control\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\r\nimport { 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 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(public name?: string, group?: string) {\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 _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 * @param x\r\n * @param y\r\n * @param pi\r\n * @param type\r\n * @param pointerId\r\n * @param buttonIndex\r\n * @param deltaX\r\n * @param deltaY\r\n * @hidden\r\n */\r\n public _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 * @param target\r\n * @param pi\r\n * @hidden\r\n */\r\n public _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 * @param target\r\n * @param pi\r\n * @param force\r\n * @hidden\r\n */\r\n public _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 * @param target\r\n * @param coordinates\r\n * @param pointerId\r\n * @param buttonIndex\r\n * @param pi\r\n * @hidden\r\n */\r\n public _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 * @param target\r\n * @param coordinates\r\n * @param pointerId\r\n * @param buttonIndex\r\n * @param notifyClick\r\n * @param pi\r\n * @hidden\r\n */\r\n public _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 { Nullable } from \"core/types\";\r\nimport { Observable, Observer } from \"core/Misc/observable\";\r\n\r\nimport { StackPanel } from \"./stackPanel\";\r\nimport { Button } from \"./button\";\r\nimport { Container } from \"./container\";\r\nimport { TextBlock } from \"./textBlock\";\r\nimport { InputText } from \"./inputText\";\r\nimport { RegisterClass } from \"core/Misc/typeStore\";\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<InputText>>;\r\n onBlurObserver: Nullable<Observer<InputText>>;\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 _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 button_tblock = button.children[0] as TextBlock;\r\n\r\n if (button_tblock.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 button_tblock.text = shiftState > 0 ? button_tblock.text.toUpperCase() : button_tblock.text.toLowerCase();\r\n }\r\n }\r\n }\r\n\r\n private _currentlyConnectedInputText: Nullable<InputText> = 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> {\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 this._currentlyConnectedInputText.processKey(8);\r\n return;\r\n case \"\\u21B5\":\r\n this._currentlyConnectedInputText.processKey(13);\r\n return;\r\n }\r\n this._currentlyConnectedInputText.processKey(-1, this.shiftState ? key.toUpperCase() : key);\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<InputText>> = 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<InputText>> = 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 this._connectedInputTexts.forEach((connectedInputText: ConnectedInputText) => {\r\n this._removeConnectedInputObservables(connectedInputText);\r\n });\r\n this._connectedInputTexts = [];\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 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\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 { 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 name?: string) {\r\n super(name);\r\n }\r\n\r\n public _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 _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 { ICanvasRenderingContext } from \"core/Engines/ICanvas\";\r\nimport { 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 get displayThumb(): boolean {\r\n return this._displayThumb && this.thumbImage != null;\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 /**\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 name?: string) {\r\n super(name);\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"ImageBasedSlider\";\r\n }\r\n\r\n public _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 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 * @param serializedObject\r\n * @param host\r\n * @hidden\r\n */\r\n public _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 * @hidden\r\n */\r\nconst name = \"Statics\";\r\n\r\nexport { 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","import { Observable } from \"core/Misc/observable\";\r\nimport { IDisposable } from \"core/scene\";\r\nimport { 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 /** @hidden */\r\n public _host: AdvancedDynamicTexture;\r\n /** @hidden */\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 { Nullable } from \"core/types\";\r\nimport { Observable, Observer } from \"core/Misc/observable\";\r\nimport { Vector2, Vector3, Matrix } from \"core/Maths/math.vector\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { PointerInfoPre, PointerInfo, PointerEventTypes, PointerInfoBase } from \"core/Events/pointerEvents\";\r\nimport { ClipboardEventTypes, ClipboardInfo } from \"core/Events/clipboardEvents\";\r\nimport { KeyboardInfoPre, KeyboardEventTypes } from \"core/Events/keyboardEvents\";\r\nimport { Camera } from \"core/Cameras/camera\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { DynamicTexture } from \"core/Materials/Textures/dynamicTexture\";\r\nimport { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { Layer } from \"core/Layers/layer\";\r\nimport { Engine } from \"core/Engines/engine\";\r\nimport { Scene } from \"core/scene\";\r\n\r\nimport { Container } from \"./controls/container\";\r\nimport { Control } from \"./controls/control\";\r\nimport { IFocusableControl } from \"./controls/focusableControl\";\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 { IPointerEvent, IWheelEvent } from \"core/Events/deviceInputEvents\";\r\nimport { RandomGUID } from \"core/Misc/guid\";\r\nimport { GetClass } from \"core/Misc/typeStore\";\r\n\r\ndeclare type StandardMaterial = import(\"core/Materials/standardMaterial\").StandardMaterial;\r\n\r\n/**\r\n * Class used to create texture to support 2D GUI elements\r\n * @see https://doc.babylonjs.com/how_to/gui\r\n */\r\nexport class AdvancedDynamicTexture extends DynamicTexture {\r\n /** Define the Uurl to load snippets */\r\n public static SnippetUrl = \"https://snippet.babylonjs.com\";\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 /** Snippet ID if the content was created from the snippet server */\r\n public snippetId: string;\r\n\r\n private _isDirty = false;\r\n private _renderObserver: Nullable<Observer<Camera>>;\r\n private _resizeObserver: Nullable<Observer<Engine>>;\r\n private _preKeyboardObserver: Nullable<Observer<KeyboardInfoPre>>;\r\n private _pointerMoveObserver: 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<Engine>>;\r\n private _background: string;\r\n /** @hidden */\r\n public _rootContainer = new Container(\"root\");\r\n /** @hidden */\r\n public _lastPickedControl: Control;\r\n /** @hidden */\r\n public _lastControlOver: { [pointerId: number]: Control } = {};\r\n /** @hidden */\r\n public _lastControlDown: { [pointerId: number]: Control } = {};\r\n /** @hidden */\r\n public _capturingControl: { [pointerId: number]: Control } = {};\r\n /** @hidden */\r\n public _shouldBlockPointer: boolean;\r\n /** @hidden */\r\n public _layerToDispose: Nullable<Layer>;\r\n /** @hidden */\r\n public _linkedControls = new Array<Control>();\r\n private _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<IFocusableControl>;\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\r\n /** @hidden */\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 /** @hidden */\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 public applyYInversionOnUpdate = true;\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/how_to/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/how_to/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/how_to/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/how_to/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/how_to/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 * @return 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 * @return 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<IFocusableControl> {\r\n return this._focusedControl;\r\n }\r\n public set focusedControl(control: Nullable<IFocusableControl>) {\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 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 * Creates a new AdvancedDynamicTexture\r\n * @param name defines the name of the texture\r\n * @param width defines the width of the texture\r\n * @param height defines the height of the texture\r\n * @param scene defines the hosting scene\r\n * @param generateMipMaps defines a boolean indicating if mipmaps must be generated (false by default)\r\n * @param samplingMode defines the texture sampling mode (Texture.NEAREST_SAMPLINGMODE 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 */\r\n constructor(name: string, width = 0, height = 0, scene?: Nullable<Scene>, generateMipMaps = false, samplingMode = Texture.NEAREST_SAMPLINGMODE, invertY = true) {\r\n super(name, { width: width, height: height }, scene, generateMipMaps, samplingMode, Constants.TEXTUREFORMAT_RGBA, invertY);\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 this._renderObserver = scene.onBeforeCameraRenderObservable.add((camera: Camera) => this._checkUpdate(camera));\r\n this._preKeyboardObserver = scene.onPreKeyboardObservable.add((info) => {\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 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/how_to/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 controlsForGroup.forEach((control1) => {\r\n let velocity = Vector2.Zero();\r\n const center = new Vector2(control1.centerX, control1.centerY);\r\n\r\n controlsForGroup.forEach((control2) => {\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 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._pointerMoveObserver) {\r\n scene.onPrePointerObservable.remove(this._pointerMoveObserver);\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._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 super.dispose();\r\n }\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 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 this.markAsDirty();\r\n if (this._idealWidth || this._idealHeight) {\r\n this._rootContainer._markAllAsDirty();\r\n }\r\n }\r\n this.invalidateRect(0, 0, textureSize.width - 1, textureSize.height - 1);\r\n }\r\n /** @hidden */\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 * (1 / this.rootContainer.scaleX));\r\n const targetY = Math.round(globalViewPort.height * (1 / this.rootContainer.scaleY));\r\n\r\n globalViewPort.x += (globalViewPort.width - targetX) / 2;\r\n globalViewPort.y += (globalViewPort.height - 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 private _checkUpdate(camera: Camera): void {\r\n if (this._layerToDispose) {\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\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();\r\n this.update(this.applyYInversionOnUpdate, this.premulAlpha, AdvancedDynamicTexture.AllowGPUOptimizations);\r\n }\r\n\r\n private _clearMeasure = new Measure(0, 0, 0, 0);\r\n\r\n private _render(): 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 // 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 // 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 * @param cursor\r\n * @hidden\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 * @param control\r\n * @param pointerId\r\n * @hidden\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) {\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 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 * @param list\r\n * @param control\r\n * @hidden\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 * @param control\r\n * @hidden\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 private _translateToPicking(scene: Scene, tempViewport: Viewport, pi: Nullable<PointerInfoPre>) {\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 camera.rigCameras.forEach((rigCamera) => {\r\n // generate the viewport of this camera\r\n rigCamera.viewport.toGlobalToRef(engine.getRenderWidth(), engine.getRenderHeight(), rigViewport);\r\n const x = scene.pointerX / engine.getHardwareScalingLevel() - rigViewport.x;\r\n const y = scene.pointerY / engine.getHardwareScalingLevel() - (engine.getRenderHeight() - rigViewport.y - rigViewport.height);\r\n // check if the pointer is in the camera's viewport\r\n if (x < 0 || y < 0 || x > rigViewport.width || y > 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 x = scene.pointerX / engine.getHardwareScalingLevel() - tempViewport.x;\r\n const y = scene.pointerY / 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(x, y, 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) {\r\n pi.skipOnPointerObservable = this._shouldBlockPointer;\r\n }\r\n } else {\r\n this._doPicking(x, y, 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._pointerMoveObserver = scene.onPrePointerObservable.add((pi) => {\r\n if (scene.isPointerCaptured((<IPointerEvent>pi.event).pointerId)) {\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 ) {\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 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 /**\r\n * @param rawEvt\r\n * @hidden\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 * @param rawEvt\r\n * @hidden\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 * @param rawEvt\r\n * @hidden\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 * 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 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 const uv = pi.pickInfo.getTextureCoordinates();\r\n if (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 const uv = pick.getTextureCoordinates();\r\n if (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: IFocusableControl): 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();\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 */\r\n public parseContent(serializedObject: any, scaleToSize?: boolean) {\r\n this._rootContainer = Control.Parse(serializedObject.root, this) 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 * 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 * @returns a promise that will resolve on success\r\n */\r\n public parseFromSnippetAsync(snippetId: string, scaleToSize?: boolean): Promise<void> {\r\n if (snippetId === \"_BLANK\") {\r\n return Promise.resolve();\r\n }\r\n\r\n return 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 const snippet = JSON.parse(JSON.parse(request.responseText).jsonPayload);\r\n const serializationObject = JSON.parse(snippet.gui);\r\n\r\n this.parseContent(serializationObject, scaleToSize);\r\n this.snippetId = snippetId;\r\n\r\n resolve();\r\n } else {\r\n reject(\"Unable to load the snippet \" + snippetId);\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", AdvancedDynamicTexture.SnippetUrl + \"/\" + snippetId.replace(/#/g, \"/\"));\r\n request.send();\r\n });\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 * @returns a promise that will resolve on success\r\n */\r\n public parseFromURLAsync(url: string, scaleToSize?: boolean): Promise<void> {\r\n if (url === \"\") {\r\n return Promise.resolve();\r\n }\r\n\r\n return 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 const gui = request.responseText;\r\n const serializationObject = JSON.parse(gui);\r\n this.parseContent(serializationObject, scaleToSize);\r\n\r\n resolve();\r\n } else {\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 * @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 ): 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(\r\n `AdvancedDynamicTexture for ${mesh.name} [${uniqueId}]`,\r\n width,\r\n height,\r\n mesh.getScene(),\r\n true,\r\n Texture.TRILINEAR_SAMPLINGMODE,\r\n invertY\r\n );\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 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 * @returns a new AdvancedDynamicTexture\r\n */\r\n public static CreateForMeshTexture(mesh: AbstractMesh, width = 1024, height = 1024, supportPointerMove = true, invertY?: boolean): AdvancedDynamicTexture {\r\n const result = new AdvancedDynamicTexture(mesh.name + \" AdvancedDynamicTexture\", width, height, mesh.getScene(), true, Texture.TRILINEAR_SAMPLINGMODE, 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 scene defines the hosting scene\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 scene: Nullable<Scene> = null,\r\n sampling = Texture.BILINEAR_SAMPLINGMODE,\r\n adaptiveScaling: boolean = false\r\n ): AdvancedDynamicTexture {\r\n const result = new AdvancedDynamicTexture(name, 0, 0, scene, false, sampling);\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 (adaptiveScaling && resultScene) {\r\n const newScale = 1 / resultScene.getEngine().getHardwareScalingLevel();\r\n result._rootContainer.scaleX = newScale;\r\n result._rootContainer.scaleY = newScale;\r\n }\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 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 scaleTo(width: number, height: number): void {\r\n super.scaleTo(width, height);\r\n this.markAsDirty();\r\n }\r\n}\r\n\r\nexport { IFocusableControl };\r\n","import { Nullable } from \"core/types\";\r\nimport { Observer } from \"core/Misc/observable\";\r\nimport { PerfCounter } from \"core/Misc/perfCounter\";\r\nimport { IDisposable } from \"core/scene\";\r\n\r\nimport { 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 { GetClass } from \"core/Misc/typeStore\";\r\nimport { 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.startsWith(\"{{\") && node.attributes[i].value.endsWith(\"}}\")) {\r\n const element = this._getChainElement(node.attributes[i].value.substring(2, node.attributes[i].value.length - 2));\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 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 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 = false;\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 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 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 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 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 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 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 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 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 { 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 { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { IBehaviorAware, Behavior } from \"core/Behaviors/behavior\";\r\nimport { IDisposable, Scene } from \"core/scene\";\r\n\r\nimport { GUI3DManager } from \"../gui3DManager\";\r\nimport { Vector3WithInfo } from \"../vector3WithInfo\";\r\nimport { Container3D } from \"./container3D\";\r\n\r\ndeclare type TouchButton3D = import(\"./touchButton3D\").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 /** @hidden */\r\n public _host: GUI3DManager;\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 private _isVisible = true;\r\n /** @hidden */\r\n public _isScaledByManager = false;\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 return Vector3.Zero();\r\n }\r\n\r\n return this._node.position;\r\n }\r\n\r\n public set position(value: Vector3) {\r\n if (!this._node) {\r\n return;\r\n }\r\n\r\n this._node.position = value;\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 return new Vector3(1, 1, 1);\r\n }\r\n\r\n return this._node.scaling;\r\n }\r\n\r\n public set scaling(value: Vector3) {\r\n if (!this._node) {\r\n return;\r\n }\r\n\r\n this._isScaledByManager = false;\r\n this._node.scaling = value;\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/behaviour\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/behaviour\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/behaviour\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/behaviour\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 as AbstractMesh;\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 * @param scene\r\n * @hidden*\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 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 * @param target\r\n * @param coordinates\r\n * @hidden\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 * @param target\r\n * @hidden\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 * @param target\r\n * @hidden\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 * @param target\r\n * @param coordinates\r\n * @param pointerId\r\n * @param buttonIndex\r\n * @hidden\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 * @param target\r\n * @param coordinates\r\n * @param pointerId\r\n * @param buttonIndex\r\n * @param notifyClick\r\n * @hidden\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 * @param pointerId\r\n * @hidden\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 as number, 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 * @param type\r\n * @param pickedPoint\r\n * @param originMeshPosition\r\n * @param pointerId\r\n * @param buttonIndex\r\n * @hidden\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 /** @hidden */\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 { Control } from \"../../2D/controls/control\";\r\nimport { AdvancedDynamicTexture } from \"../../2D/advancedDynamicTexture\";\r\nimport { 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 private _facadeTexture: Nullable<AdvancedDynamicTexture>;\r\n protected _contentResolution = 512;\r\n protected _contentScaleRatio = 2;\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 this._facadeTexture = new AdvancedDynamicTexture(\r\n \"Facade\",\r\n this._contentResolution,\r\n this._contentResolution,\r\n this._host.utilityLayer.utilityLayerScene,\r\n true,\r\n Texture.TRILINEAR_SAMPLINGMODE\r\n );\r\n this._facadeTexture.rootContainer.scaleX = this._contentScaleRatio;\r\n this._facadeTexture.rootContainer.scaleY = this._contentScaleRatio;\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 /**\r\n * Gets or sets the texture resolution used to render content (512 by default)\r\n */\r\n public get contentResolution(): number {\r\n return this._contentResolution;\r\n }\r\n\r\n public set contentResolution(value: number) {\r\n if (this._contentResolution === value) {\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 { 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 _getTypeName(): string {\r\n return \"AbstractButton3D\";\r\n }\r\n\r\n // Mesh association\r\n protected _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 { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { CreateBox } from \"core/Meshes/Builders/boxBuilder\";\r\nimport { Material } from \"core/Materials/material\";\r\nimport { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { Scene } from \"core/scene\";\r\n\r\nimport { AbstractButton3D } from \"./abstractButton3D\";\r\nimport { AdvancedDynamicTexture } from \"../../2D/advancedDynamicTexture\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\n\r\n/**\r\n * Class used to create a button in 3D\r\n */\r\nexport class Button3D extends AbstractButton3D {\r\n /** @hidden */\r\n protected _currentMaterial: Material;\r\n\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 // 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 _applyFacade(facadeTexture: AdvancedDynamicTexture) {\r\n (<any>this._currentMaterial).emissiveTexture = facadeTexture;\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"Button3D\";\r\n }\r\n\r\n // Mesh association\r\n protected _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: 1.0,\r\n height: 1.0,\r\n depth: 0.08,\r\n faceUV: faceUV,\r\n wrap: true,\r\n },\r\n scene\r\n );\r\n\r\n return mesh;\r\n }\r\n\r\n protected _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 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 { Nullable } from \"core/types\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { 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 _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 _getTypeName(): string {\r\n return \"Container3D\";\r\n }\r\n\r\n /**\r\n * Releases all associated resources\r\n */\r\n public dispose() {\r\n for (const control of this._children) {\r\n control.dispose();\r\n }\r\n\r\n this._children = [];\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 { Matrix, Vector3, TmpVectors } from \"core/Maths/math.vector\";\r\nimport { int } from \"core/types\";\r\n\r\nimport { Container3D } from \"./container3D\";\r\nimport { Control3D } from \"./control3D\";\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 _arrangeChildren() {\r\n this._cellWidth = 0;\r\n this._cellHeight = 0;\r\n let rows = 0;\r\n let columns = 0;\r\n let controlCount = 0;\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, Tmp.Matrix[0]);\r\n\r\n const boundingBox = child.mesh.getHierarchyBoundingVectors();\r\n const extendSize = TmpVectors.Vector3[0];\r\n const diff = TmpVectors.Vector3[1];\r\n\r\n boundingBox.max.subtractToRef(boundingBox.min, diff);\r\n\r\n diff.scaleInPlace(0.5);\r\n\r\n Vector3.TransformNormalToRef(diff, currentInverseWorld, extendSize);\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 { float } from \"core/types\";\r\n\r\nimport { VolumeBasedPanel } from \"./volumeBasedPanel\";\r\nimport { 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;\rattribute vec3 position;\rattribute vec3 normal;\rattribute vec2 uv;\runiform mat4 world;\runiform mat4 viewProjection;\rvarying vec2 vUV;\r#ifdef BORDER\nvarying vec2 scaleInfo;\runiform float borderWidth;\runiform vec3 scaleFactor;\r#endif\n#ifdef HOVERLIGHT\nvarying vec3 worldPosition;\r#endif\nvoid main(void) {\rvUV=uv;\r#ifdef BORDER\nvec3 scale=scaleFactor;\rfloat minScale=min(min(scale.x,scale.y),scale.z);\rfloat maxScale=max(max(scale.x,scale.y),scale.z);\rfloat minOverMiddleScale=minScale/(scale.x+scale.y+scale.z-minScale-maxScale);\rfloat areaYZ=scale.y*scale.z;\rfloat areaXZ=scale.x*scale.z;\rfloat areaXY=scale.x*scale.y;\rfloat scaledBorderWidth=borderWidth; \rif (abs(normal.x)==1.0) \r{\rscale.x=scale.y;\rscale.y=scale.z;\rif (areaYZ>areaXZ && areaYZ>areaXY)\r{\rscaledBorderWidth*=minOverMiddleScale;\r}\r}\relse if (abs(normal.y)==1.0) \r{\rscale.x=scale.z;\rif (areaXZ>areaXY && areaXZ>areaYZ)\r{\rscaledBorderWidth*=minOverMiddleScale;\r}\r}\relse \r{\rif (areaXY>areaYZ && areaXY>areaXZ)\r{\rscaledBorderWidth*=minOverMiddleScale;\r}\r}\rfloat scaleRatio=min(scale.x,scale.y)/max(scale.x,scale.y);\rif (scale.x>scale.y)\r{\rscaleInfo.x=1.0-(scaledBorderWidth*scaleRatio);\rscaleInfo.y=1.0-scaledBorderWidth;\r}\relse\r{\rscaleInfo.x=1.0-scaledBorderWidth;\rscaleInfo.y=1.0-(scaledBorderWidth*scaleRatio);\r} \r#endif \nvec4 worldPos=world*vec4(position,1.0);\r#ifdef HOVERLIGHT\nworldPosition=worldPos.xyz;\r#endif\ngl_Position=viewProjection*worldPos;\r}\r`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @hidden */\nexport const fluentVertexShader = { name, shader };\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"fluentPixelShader\";\nconst shader = `precision highp float;\rvarying vec2 vUV;\runiform vec4 albedoColor;\r#ifdef INNERGLOW\nuniform vec4 innerGlowColor;\r#endif\n#ifdef BORDER\nvarying vec2 scaleInfo;\runiform float edgeSmoothingValue;\runiform float borderMinValue;\r#endif\n#ifdef HOVERLIGHT\nvarying vec3 worldPosition;\runiform vec3 hoverPosition;\runiform vec4 hoverColor;\runiform float hoverRadius;\r#endif\n#ifdef TEXTURE\nuniform sampler2D albedoSampler;\runiform mat4 textureMatrix;\rvec2 finalUV;\r#endif\nvoid main(void) {\rvec3 albedo=albedoColor.rgb;\rfloat alpha=albedoColor.a;\r#ifdef TEXTURE\nfinalUV=vec2(textureMatrix*vec4(vUV,1.0,0.0));\ralbedo=texture2D(albedoSampler,finalUV).rgb;\r#endif\n#ifdef HOVERLIGHT\nfloat pointToHover=(1.0-clamp(length(hoverPosition-worldPosition)/hoverRadius,0.,1.))*hoverColor.a;\ralbedo=clamp(albedo+hoverColor.rgb*pointToHover,0.,1.);\r#else\nfloat pointToHover=1.0;\r#endif\n#ifdef BORDER \nfloat borderPower=10.0;\rfloat inverseBorderPower=1.0/borderPower;\rvec3 borderColor=albedo*borderPower;\rvec2 distanceToEdge;\rdistanceToEdge.x=abs(vUV.x-0.5)*2.0;\rdistanceToEdge.y=abs(vUV.y-0.5)*2.0;\rfloat borderValue=max(smoothstep(scaleInfo.x-edgeSmoothingValue,scaleInfo.x+edgeSmoothingValue,distanceToEdge.x),\rsmoothstep(scaleInfo.y-edgeSmoothingValue,scaleInfo.y+edgeSmoothingValue,distanceToEdge.y));\rborderColor=borderColor*borderValue*max(borderMinValue*inverseBorderPower,pointToHover); \ralbedo+=borderColor;\ralpha=max(alpha,borderValue);\r#endif\n#ifdef INNERGLOW\nvec2 uvGlow=(vUV-vec2(0.5,0.5))*(innerGlowColor.a*2.0);\ruvGlow=uvGlow*uvGlow;\ruvGlow=uvGlow*uvGlow;\ralbedo+=mix(vec3(0.0,0.0,0.0),innerGlowColor.rgb,uvGlow.x+uvGlow.y); \r#endif\ngl_FragColor=vec4(albedo,alpha);\r}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @hidden */\nexport const fluentPixelShader = { name, shader };\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { Nullable } from \"core/types\";\r\nimport { serializeAsColor4, serializeAsVector3, serializeAsTexture, serialize, expandToProperty, serializeAsColor3, SerializationHelper } from \"core/Misc/decorators\";\r\nimport { Vector3, Matrix, TmpVectors } from \"core/Maths/math.vector\";\r\nimport { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { IEffectCreationOptions } from \"core/Materials/effect\";\r\nimport { MaterialHelper } from \"core/Materials/materialHelper\";\r\nimport { PushMaterial } from \"core/Materials/pushMaterial\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { SubMesh } from \"core/Meshes/subMesh\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { 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\n\r\n/** @hidden */\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 1.0)\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 needAlphaBlending(): boolean {\r\n return this.alpha !== 1.0;\r\n }\r\n\r\n public needAlphaTesting(): boolean {\r\n return false;\r\n }\r\n\r\n public getAlphaTestTexture(): Nullable<BaseTexture> {\r\n return null;\r\n }\r\n\r\n public isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n if (this.isFrozen) {\r\n if (subMesh.effect && subMesh.effect._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 = new Array<string>();\r\n\r\n MaterialHelper.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 subMesh.effect._wasPreviouslyReady = true;\r\n\r\n return true;\r\n }\r\n\r\n public 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)) {\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);\r\n }\r\n\r\n public getActiveTextures(): BaseTexture[] {\r\n const activeTextures = super.getActiveTextures();\r\n\r\n return activeTextures;\r\n }\r\n\r\n public 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 dispose(forceDisposeEffect?: boolean): void {\r\n super.dispose(forceDisposeEffect);\r\n }\r\n\r\n public clone(name: string): FluentMaterial {\r\n return SerializationHelper.Clone(() => new FluentMaterial(name, this.getScene()), this);\r\n }\r\n\r\n public 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 getClassName(): string {\r\n return \"FluentMaterial\";\r\n }\r\n\r\n // Statics\r\n public static 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 { Button3D } from \"./button3D\";\r\n\r\nimport { Nullable } from \"core/types\";\r\nimport { 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 { 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 { Control3D } from \"./control3D\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { DomManagement } 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 _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 (DomManagement.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 _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 _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 _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 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;\rvarying vec3 vPosition;\rvarying vec3 vNormal;\rvarying vec2 vUV;\rvarying vec3 vTangent;\rvarying vec3 vBinormal;\rvarying vec4 vColor;\rvarying vec4 vExtra1;\runiform float _Edge_Width_;\runiform vec4 _Edge_Color_;\runiform bool _Relative_Width_;\runiform float _Proximity_Max_Intensity_;\runiform float _Proximity_Far_Distance_;\runiform float _Proximity_Near_Radius_;\runiform float _Proximity_Anisotropy_;\runiform float _Selection_Fuzz_;\runiform float _Selected_;\runiform float _Selection_Fade_;\runiform float _Selection_Fade_Size_;\runiform float _Selected_Distance_;\runiform float _Selected_Fade_Length_;\runiform bool _Blob_Enable_;\runiform vec3 _Blob_Position_;\runiform float _Blob_Intensity_;\runiform float _Blob_Near_Size_;\runiform float _Blob_Far_Size_;\runiform float _Blob_Near_Distance_;\runiform float _Blob_Far_Distance_;\runiform float _Blob_Fade_Length_;\runiform float _Blob_Inner_Fade_;\runiform float _Blob_Pulse_;\runiform float _Blob_Fade_;\runiform sampler2D _Blob_Texture_;\runiform bool _Blob_Enable_2_;\runiform vec3 _Blob_Position_2_;\runiform float _Blob_Near_Size_2_;\runiform float _Blob_Inner_Fade_2_;\runiform float _Blob_Pulse_2_;\runiform float _Blob_Fade_2_;\runiform vec3 _Active_Face_Dir_;\runiform vec3 _Active_Face_Up_;\runiform bool Enable_Fade;\runiform float _Fade_Width_;\runiform bool _Smooth_Active_Face_;\runiform bool _Show_Frame_;\runiform bool _Use_Blob_Texture_;\runiform bool Use_Global_Left_Index;\runiform bool Use_Global_Right_Index;\runiform vec4 Global_Left_Index_Tip_Position;\runiform vec4 Global_Right_Index_Tip_Position;\runiform vec4 Global_Left_Thumb_Tip_Position;\runiform vec4 Global_Right_Thumb_Tip_Position;\runiform float Global_Left_Index_Tip_Proximity;\runiform float Global_Right_Index_Tip_Proximity;\rvoid Holo_Edge_Fragment_B35(\rvec4 Edges,\rfloat Edge_Width,\rout float NotEdge)\r{\rvec2 c=vec2(min(Edges.r,Edges.g),min(Edges.b,Edges.a));\rvec2 df=fwidth(c)*Edge_Width;\rvec2 g=clamp(c/df,0.0,1.0);\rNotEdge=g.x*g.y;\r}\rvoid Blob_Fragment_B39(\rvec2 UV,\rvec3 Blob_Info,\rsampler2D Blob_Texture,\rout vec4 Blob_Color)\r{\rfloat k=dot(UV,UV);\rBlob_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));\r}\rvec2 FilterStep(vec2 Edge,vec2 X)\r{\rvec2 dX=max(fwidth(X),vec2(0.00001,0.00001));\rreturn clamp( (X+dX-max(Edge,X-dX))/(dX*2.0),0.0,1.0);\r}\rvoid Wireframe_Fragment_B59(\rvec3 Widths,\rvec2 UV,\rfloat Proximity,\rvec4 Edge_Color,\rout vec4 Wireframe)\r{\rvec2 c=min(UV,vec2(1.0,1.0)-UV);\rvec2 g=FilterStep(Widths.xy*0.5,c); \rWireframe=(1.0-min(g.x,g.y))*Proximity*Edge_Color;\r}\rvoid Proximity_B53(\rvec3 Proximity_Center,\rvec3 Proximity_Center_2,\rfloat Proximity_Max_Intensity,\rfloat Proximity_Near_Radius,\rvec3 Position,\rvec3 Show_Selection,\rvec4 Extra1,\rfloat Dist_To_Face,\rfloat Intensity,\rout float Proximity)\r{\rvec2 delta1=Extra1.xy;\rvec2 delta2=Extra1.zw;\rfloat d2=sqrt(min(dot(delta1,delta1),dot(delta2,delta2))+Dist_To_Face*Dist_To_Face);\rProximity=Intensity*Proximity_Max_Intensity*(1.0-clamp(d2/Proximity_Near_Radius,0.0,1.0))*(1.0-Show_Selection.x)+Show_Selection.x;\r}\rvoid To_XYZ_B46(\rvec3 Vec3,\rout float X,\rout float Y,\rout float Z)\r{\rX=Vec3.x;\rY=Vec3.y;\rZ=Vec3.z;\r}\rvoid main()\r{\rfloat NotEdge_Q35;\r#if ENABLE_FADE\nHolo_Edge_Fragment_B35(vColor,_Fade_Width_,NotEdge_Q35);\r#else\nNotEdge_Q35=1.0;\r#endif\nvec4 Blob_Color_Q39;\rfloat k=dot(vUV,vUV);\rvec2 blobTextureCoord=vec2(vec2(sqrt(k),vTangent.x).x,1.0-vec2(sqrt(k),vTangent.x).y);\rvec4 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_));\rBlob_Color_Q39=vTangent.y*blobColor*(1.0-clamp(k,0.0,1.0));\rfloat Is_Quad_Q24;\rIs_Quad_Q24=vNormal.z;\rvec3 Blob_Position_Q41= mix(_Blob_Position_,Global_Left_Index_Tip_Position.xyz,float(Use_Global_Left_Index));\rvec3 Blob_Position_Q42= mix(_Blob_Position_2_,Global_Right_Index_Tip_Position.xyz,float(Use_Global_Right_Index));\rfloat X_Q46;\rfloat Y_Q46;\rfloat Z_Q46;\rTo_XYZ_B46(vBinormal,X_Q46,Y_Q46,Z_Q46);\rfloat Proximity_Q53;\rProximity_B53(Blob_Position_Q41,Blob_Position_Q42,_Proximity_Max_Intensity_,_Proximity_Near_Radius_,vPosition,vBinormal,vExtra1,Y_Q46,Z_Q46,Proximity_Q53);\rvec4 Wireframe_Q59;\rWireframe_Fragment_B59(vNormal,vUV,Proximity_Q53,_Edge_Color_,Wireframe_Q59);\rvec4 Wire_Or_Blob_Q23=mix(Wireframe_Q59,Blob_Color_Q39,Is_Quad_Q24);\rvec4 Result_Q22;\rResult_Q22=mix(Wire_Or_Blob_Q23,vec4(0.3,0.3,0.3,0.3),float(_Show_Frame_));\rvec4 Final_Color_Q37=NotEdge_Q35*Result_Q22;\rvec4 Out_Color=Final_Color_Q37;\rfloat Clip_Threshold=0.0;\rbool To_sRGB=false;\rgl_FragColor=Out_Color;\r}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @hidden */\nexport const fluentButtonPixelShader = { name, shader };\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"fluentButtonVertexShader\";\nconst shader = `uniform mat4 world;\runiform mat4 viewProjection;\runiform vec3 cameraPosition;\rattribute vec3 position;\rattribute vec3 normal;\rattribute vec2 uv;\rattribute vec3 tangent;\rattribute vec4 color;\runiform float _Edge_Width_;\runiform vec4 _Edge_Color_;\runiform float _Proximity_Max_Intensity_;\runiform float _Proximity_Far_Distance_;\runiform float _Proximity_Near_Radius_;\runiform float _Proximity_Anisotropy_;\runiform float _Selection_Fuzz_;\runiform float _Selected_;\runiform float _Selection_Fade_;\runiform float _Selection_Fade_Size_;\runiform float _Selected_Distance_;\runiform float _Selected_Fade_Length_;\runiform bool _Blob_Enable_;\runiform vec3 _Blob_Position_;\runiform float _Blob_Intensity_;\runiform float _Blob_Near_Size_;\runiform float _Blob_Far_Size_;\runiform float _Blob_Near_Distance_;\runiform float _Blob_Far_Distance_;\runiform float _Blob_Fade_Length_;\runiform float _Blob_Inner_Fade_;\runiform float _Blob_Pulse_;\runiform float _Blob_Fade_;\runiform sampler2D _Blob_Texture_;\runiform bool _Blob_Enable_2_;\runiform vec3 _Blob_Position_2_;\runiform float _Blob_Near_Size_2_;\runiform float _Blob_Inner_Fade_2_;\runiform float _Blob_Pulse_2_;\runiform float _Blob_Fade_2_;\runiform vec3 _Active_Face_Dir_;\runiform vec3 _Active_Face_Up_;\runiform bool _Enable_Fade_;\runiform float _Fade_Width_;\runiform bool _Smooth_Active_Face_;\runiform bool _Show_Frame_;\runiform bool Use_Global_Left_Index;\runiform bool Use_Global_Right_Index;\runiform vec4 Global_Left_Index_Tip_Position;\runiform vec4 Global_Right_Index_Tip_Position;\runiform vec4 Global_Left_Thumb_Tip_Position;\runiform vec4 Global_Right_Thumb_Tip_Position;\runiform float Global_Left_Index_Tip_Proximity;\runiform float Global_Right_Index_Tip_Proximity;\rvarying vec3 vPosition;\rvarying vec3 vNormal;\rvarying vec2 vUV;\rvarying vec3 vTangent;\rvarying vec3 vBinormal;\rvarying vec4 vColor;\rvarying vec4 vExtra1;\rvoid Blob_Vertex_B47(\rvec3 Position,\rvec3 Normal,\rvec3 Tangent,\rvec3 Bitangent,\rvec3 Blob_Position,\rfloat Intensity,\rfloat Blob_Near_Size,\rfloat Blob_Far_Size,\rfloat Blob_Near_Distance,\rfloat Blob_Far_Distance,\rvec4 Vx_Color,\rvec2 UV,\rvec3 Face_Center,\rvec2 Face_Size,\rvec2 In_UV,\rfloat Blob_Fade_Length,\rfloat Selection_Fade,\rfloat Selection_Fade_Size,\rfloat Inner_Fade,\rvec3 Active_Face_Center,\rfloat Blob_Pulse,\rfloat Blob_Fade,\rfloat Blob_Enabled,\rout vec3 Out_Position,\rout vec2 Out_UV,\rout vec3 Blob_Info)\r{\rfloat blobSize,fadeIn;\rvec3 Hit_Position;\rBlob_Info=vec3(0.0,0.0,0.0);\rfloat Hit_Distance=dot(Blob_Position-Face_Center,Normal);\rHit_Position=Blob_Position-Hit_Distance*Normal;\rfloat absD=abs(Hit_Distance);\rfloat lerpVal=clamp((absD-Blob_Near_Distance)/(Blob_Far_Distance-Blob_Near_Distance),0.0,1.0);\rfadeIn=1.0-clamp((absD-Blob_Far_Distance)/Blob_Fade_Length,0.0,1.0);\rfloat innerFade=1.0-clamp(-Hit_Distance/Inner_Fade,0.0,1.0);\rfloat farClip=clamp(1.0-step(Blob_Far_Distance+Blob_Fade_Length,absD),0.0,1.0);\rfloat size=mix(Blob_Near_Size,Blob_Far_Size,lerpVal)*farClip;\rblobSize=mix(size,Selection_Fade_Size,Selection_Fade)*innerFade*Blob_Enabled;\rBlob_Info.x=lerpVal*0.5+0.5;\rBlob_Info.y=fadeIn*Intensity*(1.0-Selection_Fade)*Blob_Fade;\rBlob_Info.x*=(1.0-Blob_Pulse);\rvec3 delta=Hit_Position-Face_Center;\rvec2 blobCenterXY=vec2(dot(delta,Tangent),dot(delta,Bitangent));\rvec2 quadUVin=2.0*UV-1.0; \rvec2 blobXY=blobCenterXY+quadUVin*blobSize;\rvec2 blobClipped=clamp(blobXY,-Face_Size*0.5,Face_Size*0.5);\rvec2 blobUV=(blobClipped-blobCenterXY)/max(blobSize,0.0001)*2.0;\rvec3 blobCorner=Face_Center+blobClipped.x*Tangent+blobClipped.y*Bitangent;\rOut_Position=mix(Position,blobCorner,Vx_Color.rrr);\rOut_UV=mix(In_UV,blobUV,Vx_Color.rr);\r}\rvec2 ProjectProximity(\rvec3 blobPosition,\rvec3 position,\rvec3 center,\rvec3 dir,\rvec3 xdir,\rvec3 ydir,\rout float vdistance\r)\r{\rvec3 delta=blobPosition-position;\rvec2 xy=vec2(dot(delta,xdir),dot(delta,ydir));\rvdistance=abs(dot(delta,dir));\rreturn xy;\r}\rvoid Proximity_Vertex_B66(\rvec3 Blob_Position,\rvec3 Blob_Position_2,\rvec3 Active_Face_Center,\rvec3 Active_Face_Dir,\rvec3 Position,\rfloat Proximity_Far_Distance,\rfloat Relative_Scale,\rfloat Proximity_Anisotropy,\rvec3 Up,\rout vec4 Extra1,\rout float Distance_To_Face,\rout float Intensity)\r{\rvec3 Active_Face_Dir_X=normalize(cross(Active_Face_Dir,Up));\rvec3 Active_Face_Dir_Y=cross(Active_Face_Dir,Active_Face_Dir_X);\rfloat distz1,distz2;\rExtra1.xy=ProjectProximity(Blob_Position,Position,Active_Face_Center,Active_Face_Dir,Active_Face_Dir_X*Proximity_Anisotropy,Active_Face_Dir_Y,distz1)/Relative_Scale;\rExtra1.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;\rDistance_To_Face=dot(Active_Face_Dir,Position-Active_Face_Center);\rIntensity=1.0-clamp(min(distz1,distz2)/Proximity_Far_Distance,0.0,1.0);\r}\rvoid Holo_Edge_Vertex_B44(\rvec3 Incident,\rvec3 Normal,\rvec2 UV,\rvec3 Tangent,\rvec3 Bitangent,\rbool Smooth_Active_Face,\rfloat Active,\rout vec4 Holo_Edges)\r{\rfloat NdotI=dot(Incident,Normal);\rvec2 flip=(UV-vec2(0.5,0.5));\rfloat udot=dot(Incident,Tangent)*flip.x*NdotI;\rfloat uval=1.0-float(udot>0.0);\rfloat vdot=-dot(Incident,Bitangent)*flip.y*NdotI;\rfloat vval=1.0-float(vdot>0.0);\rfloat Smooth_And_Active=step(1.0,float(Smooth_Active_Face && Active>0.0));\ruval=mix(uval,max(1.0,uval),Smooth_And_Active); \rvval=mix(vval,max(1.0,vval),Smooth_And_Active);\rHolo_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));\r}\rvoid Object_To_World_Pos_B13(\rvec3 Pos_Object,\rout vec3 Pos_World)\r{\rPos_World=(world*vec4(Pos_Object,1.0)).xyz;\r}\rvoid Choose_Blob_B38(\rvec4 Vx_Color,\rvec3 Position1,\rvec3 Position2,\rbool Blob_Enable_1,\rbool Blob_Enable_2,\rfloat Near_Size_1,\rfloat Near_Size_2,\rfloat Blob_Inner_Fade_1,\rfloat Blob_Inner_Fade_2,\rfloat Blob_Pulse_1,\rfloat Blob_Pulse_2,\rfloat Blob_Fade_1,\rfloat Blob_Fade_2,\rout vec3 Position,\rout float Near_Size,\rout float Inner_Fade,\rout float Blob_Enable,\rout float Fade,\rout float Pulse)\r{\rPosition=Position1*(1.0-Vx_Color.g)+Vx_Color.g*Position2;\rfloat b1=float(Blob_Enable_1);\rfloat b2=float(Blob_Enable_2);\rBlob_Enable=b1+(b2-b1)*Vx_Color.g;\rPulse=Blob_Pulse_1*(1.0-Vx_Color.g)+Vx_Color.g*Blob_Pulse_2;\rFade=Blob_Fade_1*(1.0-Vx_Color.g)+Vx_Color.g*Blob_Fade_2;\rNear_Size=Near_Size_1*(1.0-Vx_Color.g)+Vx_Color.g*Near_Size_2;\rInner_Fade=Blob_Inner_Fade_1*(1.0-Vx_Color.g)+Vx_Color.g*Blob_Inner_Fade_2;\r}\rvoid Wireframe_Vertex_B51(\rvec3 Position,\rvec3 Normal,\rvec3 Tangent,\rvec3 Bitangent,\rfloat Edge_Width,\rvec2 Face_Size,\rout vec3 Wire_Vx_Pos,\rout vec2 UV,\rout vec2 Widths)\r{\rWidths.xy=Edge_Width/Face_Size;\rfloat x=dot(Position,Tangent);\rfloat y=dot(Position,Bitangent);\rfloat dx=0.5-abs(x);\rfloat newx=(0.5-dx*Widths.x*2.0)*sign(x);\rfloat dy=0.5-abs(y);\rfloat newy=(0.5-dy*Widths.y*2.0)*sign(y);\rWire_Vx_Pos=Normal*0.5+newx*Tangent+newy*Bitangent;\rUV.x=dot(Wire_Vx_Pos,Tangent)+0.5;\rUV.y=dot(Wire_Vx_Pos,Bitangent)+0.5;\r}\rvec2 ramp2(vec2 start,vec2 end,vec2 x)\r{\rreturn clamp((x-start)/(end-start),vec2(0.0,0.0),vec2(1.0,1.0));\r}\rfloat computeSelection(\rvec3 blobPosition,\rvec3 normal,\rvec3 tangent,\rvec3 bitangent,\rvec3 faceCenter,\rvec2 faceSize,\rfloat selectionFuzz,\rfloat farDistance,\rfloat fadeLength\r)\r{\rvec3 delta=blobPosition-faceCenter;\rfloat absD=abs(dot(delta,normal));\rfloat fadeIn=1.0-clamp((absD-farDistance)/fadeLength,0.0,1.0);\rvec2 blobCenterXY=vec2(dot(delta,tangent),dot(delta,bitangent));\rvec2 innerFace=faceSize*(1.0-selectionFuzz)*0.5;\rvec2 selectPulse=ramp2(-faceSize*0.5,-innerFace,blobCenterXY)-ramp2(innerFace,faceSize*0.5,blobCenterXY);\rreturn selectPulse.x*selectPulse.y*fadeIn;\r}\rvoid Selection_Vertex_B48(\rvec3 Blob_Position,\rvec3 Blob_Position_2,\rvec3 Face_Center,\rvec2 Face_Size,\rvec3 Normal,\rvec3 Tangent,\rvec3 Bitangent,\rfloat Selection_Fuzz,\rfloat Selected,\rfloat Far_Distance,\rfloat Fade_Length,\rvec3 Active_Face_Dir,\rout float Show_Selection)\r{\rfloat select1=computeSelection(Blob_Position,Normal,Tangent,Bitangent,Face_Center,Face_Size,Selection_Fuzz,Far_Distance,Fade_Length);\rfloat select2=computeSelection(Blob_Position_2,Normal,Tangent,Bitangent,Face_Center,Face_Size,Selection_Fuzz,Far_Distance,Fade_Length);\rfloat Active=max(0.0,dot(Active_Face_Dir,Normal));\rShow_Selection=mix(max(select1,select2),1.0,Selected)*Active;\r}\rvoid Proximity_Visibility_B54(\rfloat Selection,\rvec3 Proximity_Center,\rvec3 Proximity_Center_2,\rfloat Input_Width,\rfloat Proximity_Far_Distance,\rfloat Proximity_Radius,\rvec3 Active_Face_Center,\rvec3 Active_Face_Dir,\rout float Width)\r{\rvec3 boxEdges=(world*vec4(vec3(0.5,0.5,0.5),0.0)).xyz;\rfloat boxMaxSize=length(boxEdges);\rfloat d1=dot(Proximity_Center-Active_Face_Center,Active_Face_Dir);\rvec3 blob1=Proximity_Center-d1*Active_Face_Dir;\rfloat d2=dot(Proximity_Center_2-Active_Face_Center,Active_Face_Dir);\rvec3 blob2=Proximity_Center_2-d2*Active_Face_Dir;\rvec3 delta1=blob1-Active_Face_Center;\rvec3 delta2=blob2-Active_Face_Center;\rfloat dist1=dot(delta1,delta1);\rfloat dist2=dot(delta2,delta2);\rfloat nearestProxDist=sqrt(min(dist1,dist2));\rWidth=Input_Width*(1.0-step(boxMaxSize+Proximity_Radius,nearestProxDist))*(1.0-step(Proximity_Far_Distance,min(d1,d2))*(1.0-step(0.0001,Selection)));\r}\rvoid Object_To_World_Dir_B67(\rvec3 Dir_Object,\rout vec3 Dir_World)\r{\rDir_World=(world*vec4(Dir_Object,0.0)).xyz;\r}\rvoid main()\r{\rvec3 Active_Face_Center_Q49;\rActive_Face_Center_Q49=(world*vec4(_Active_Face_Dir_*0.5,1.0)).xyz;\rvec3 Blob_Position_Q41= mix(_Blob_Position_,Global_Left_Index_Tip_Position.xyz,float(Use_Global_Left_Index));\rvec3 Blob_Position_Q42= mix(_Blob_Position_2_,Global_Right_Index_Tip_Position.xyz,float(Use_Global_Right_Index));\rvec3 Active_Face_Dir_Q64=normalize((world*vec4(_Active_Face_Dir_,0.0)).xyz);\rfloat Relative_Scale_Q57;\r#if RELATIVE_WIDTH\nRelative_Scale_Q57=length((world*vec4(vec3(0,1,0),0.0)).xyz);\r#else\nRelative_Scale_Q57=1.0;\r#endif\nvec3 Tangent_World_Q30;\rTangent_World_Q30=(world*vec4(tangent,0.0)).xyz;\rvec3 Binormal_World_Q31;\rBinormal_World_Q31=(world*vec4((cross(normal,tangent)),0.0)).xyz;\rvec3 Normal_World_Q60;\rNormal_World_Q60=(world*vec4(normal,0.0)).xyz;\rvec3 Result_Q18=0.5*normal;\rvec3 Dir_World_Q67;\rObject_To_World_Dir_B67(_Active_Face_Up_,Dir_World_Q67);\rfloat Product_Q56=_Edge_Width_*Relative_Scale_Q57;\rvec3 Normal_World_N_Q29=normalize(Normal_World_Q60);\rvec3 Tangent_World_N_Q28=normalize(Tangent_World_Q30);\rvec3 Binormal_World_N_Q32=normalize(Binormal_World_Q31);\rvec3 Position_Q38;\rfloat Near_Size_Q38;\rfloat Inner_Fade_Q38;\rfloat Blob_Enable_Q38;\rfloat Fade_Q38;\rfloat Pulse_Q38;\rChoose_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);\rvec3 Face_Center_Q33;\rFace_Center_Q33=(world*vec4(Result_Q18,1.0)).xyz;\rvec2 Face_Size_Q50=vec2(length(Tangent_World_Q30),length(Binormal_World_Q31));\rfloat Show_Selection_Q48;\rSelection_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);\rvec3 Normalized_Q72=normalize(Dir_World_Q67);\rfloat Active_Q34=max(0.0,dot(Active_Face_Dir_Q64,Normal_World_N_Q29));\rfloat Width_Q54;\rProximity_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);\rvec3 Wire_Vx_Pos_Q51;\rvec2 UV_Q51;\rvec2 Widths_Q51;\rWireframe_Vertex_B51(position,normal,tangent,(cross(normal,tangent)),Width_Q54,Face_Size_Q50,Wire_Vx_Pos_Q51,UV_Q51,Widths_Q51);\rvec3 Vec3_Q27=vec3(Widths_Q51.x,Widths_Q51.y,color.r);\rvec3 Pos_World_Q13;\rObject_To_World_Pos_B13(Wire_Vx_Pos_Q51,Pos_World_Q13);\rvec3 Incident_Q36=normalize(Pos_World_Q13-cameraPosition);\rvec3 Out_Position_Q47;\rvec2 Out_UV_Q47;\rvec3 Blob_Info_Q47;\rBlob_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);\rvec4 Extra1_Q66;\rfloat Distance_To_Face_Q66;\rfloat Intensity_Q66;\rProximity_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);\rvec4 Holo_Edges_Q44;\rHolo_Edge_Vertex_B44(Incident_Q36,Normal_World_N_Q29,uv,Tangent_World_Q30,Binormal_World_Q31,_Smooth_Active_Face_,Active_Q34,Holo_Edges_Q44);\rvec3 Vec3_Q19=vec3(Show_Selection_Q48,Distance_To_Face_Q66,Intensity_Q66);\rvec3 Position=Out_Position_Q47;\rvec2 UV=Out_UV_Q47;\rvec3 Tangent=Blob_Info_Q47;\rvec3 Binormal=Vec3_Q19;\rvec3 Normal=Vec3_Q27;\rvec4 Extra1=Extra1_Q66;\rvec4 Color=Holo_Edges_Q44;\rgl_Position=viewProjection*vec4(Position,1);\rvPosition=Position;\rvNormal=Normal;\rvUV=UV;\rvTangent=Tangent;\rvBinormal=Binormal;\rvColor=Color;\rvExtra1=Extra1;\r}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @hidden */\nexport const fluentButtonVertexShader = { name, shader };\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { Nullable } from \"core/types\";\r\nimport { serializeAsColor4, serializeAsVector3, serialize, SerializationHelper } from \"core/Misc/decorators\";\r\nimport { Matrix, Vector3, Vector4 } from \"core/Maths/math.vector\";\r\nimport { IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { MaterialHelper } from \"core/Materials/materialHelper\";\r\nimport { IEffectCreationOptions } from \"core/Materials/effect\";\r\nimport { PushMaterial } from \"core/Materials/pushMaterial\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { SubMesh } from \"core/Meshes/subMesh\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { 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\n\r\n/** @hidden */\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/meshes/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\r\n this._blobTexture = new Texture(FluentButtonMaterial.BLOB_TEXTURE_URL, this.getScene(), true, false, Texture.NEAREST_SAMPLINGMODE);\r\n }\r\n\r\n public needAlphaBlending(): boolean {\r\n return true;\r\n }\r\n\r\n public needAlphaTesting(): boolean {\r\n return true;\r\n }\r\n\r\n public getAlphaTestTexture(): Nullable<BaseTexture> {\r\n return null;\r\n }\r\n\r\n // Methods\r\n public isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n if (this.isFrozen) {\r\n if (subMesh.effect && subMesh.effect._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._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n // Attribs\r\n MaterialHelper.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 MaterialHelper.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 MaterialHelper.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 = new Array<string>();\r\n\r\n MaterialHelper.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 subMesh.effect._wasPreviouslyReady = true;\r\n\r\n return true;\r\n }\r\n\r\n public 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);\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 getAnimatables(): IAnimatable[] {\r\n return [];\r\n }\r\n\r\n public dispose(forceDisposeEffect?: boolean): void {\r\n super.dispose(forceDisposeEffect);\r\n }\r\n\r\n public clone(name: string): FluentButtonMaterial {\r\n return SerializationHelper.Clone(() => new FluentButtonMaterial(name, this.getScene()), this);\r\n }\r\n\r\n public 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 getClassName(): string {\r\n return \"FluentButtonMaterial\";\r\n }\r\n\r\n // Statics\r\n public static 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 { Mesh } from \"core/Meshes/mesh\";\r\nimport { PointerEventTypes } from \"core/Events/pointerEvents\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Scene } from \"core/scene\";\r\n\r\nimport { Observable } from \"core/Misc/observable\";\r\n\r\nimport { Button3D } from \"./button3D\";\r\n\r\n/**\r\n * Class used to create a touchable button in 3D\r\n */\r\nexport class TouchButton3D extends Button3D {\r\n private _collisionMesh: Mesh;\r\n\r\n // 'front' direction. If Vector3.Zero, there is no front and all directions of interaction are accepted\r\n private _collidableFrontDirection: Vector3;\r\n private _isNearPressed = false;\r\n private _interactionSurfaceHeight = 0;\r\n\r\n private _isToggleButton = false;\r\n private _toggleState = false;\r\n private _toggleButtonCallback = () => {\r\n this._onToggle(!this._toggleState);\r\n };\r\n\r\n /**\r\n * An event triggered when the button is toggled. Only fired if 'isToggleButton' is true\r\n */\r\n public onToggleObservable = new Observable<boolean>();\r\n\r\n /**\r\n * Creates a new touchable button\r\n * @param name defines the control name\r\n * @param collisionMesh mesh to track collisions with\r\n */\r\n constructor(name?: string, collisionMesh?: Mesh) {\r\n super(name);\r\n\r\n this.collidableFrontDirection = Vector3.Zero();\r\n\r\n if (collisionMesh) {\r\n this.collisionMesh = collisionMesh;\r\n }\r\n }\r\n\r\n /**\r\n * Whether the current interaction is caused by near interaction or not\r\n */\r\n public get isActiveNearInteraction() {\r\n return this._isNearPressed;\r\n }\r\n\r\n /**\r\n * Sets the front-facing direction of the button. Pass in Vector3.Zero to allow interactions from any direction\r\n * @param frontWorldDir the forward direction of the button\r\n */\r\n public set collidableFrontDirection(frontWorldDir: Vector3) {\r\n this._collidableFrontDirection = frontWorldDir.normalize();\r\n\r\n if (this._collisionMesh) {\r\n const invert = TmpVectors.Matrix[0];\r\n\r\n invert.copyFrom(this._collisionMesh.getWorldMatrix());\r\n invert.invert();\r\n Vector3.TransformNormalToRef(this._collidableFrontDirection, invert, this._collidableFrontDirection);\r\n this._collidableFrontDirection.normalize();\r\n }\r\n }\r\n\r\n /**\r\n * Returns the front-facing direction of the button, or Vector3.Zero if there is no 'front'\r\n */\r\n public get collidableFrontDirection() {\r\n if (this._collisionMesh) {\r\n // Update the front direction to reflect any rotations of the collision mesh\r\n const transformedDirection = TmpVectors.Vector3[0];\r\n Vector3.TransformNormalToRef(this._collidableFrontDirection, this._collisionMesh.getWorldMatrix(), transformedDirection);\r\n\r\n return transformedDirection.normalize();\r\n }\r\n\r\n return this._collidableFrontDirection;\r\n }\r\n\r\n /**\r\n * Sets the mesh used for testing input collision\r\n * @param collisionMesh the new collision mesh for the button\r\n */\r\n public set collisionMesh(collisionMesh: Mesh) {\r\n // Remove the GUI3DManager's data from the previous collision mesh's reserved data store, and reset interactability\r\n if (this._collisionMesh) {\r\n this._collisionMesh.isNearPickable = false;\r\n if (this._collisionMesh.reservedDataStore?.GUI3D) {\r\n this._collisionMesh.reservedDataStore.GUI3D = {};\r\n }\r\n\r\n this._collisionMesh.getChildMeshes().forEach((mesh) => {\r\n mesh.isNearPickable = false;\r\n if (mesh.reservedDataStore?.GUI3D) {\r\n mesh.reservedDataStore.GUI3D = {};\r\n }\r\n });\r\n }\r\n\r\n this._collisionMesh = collisionMesh;\r\n this._injectGUI3DReservedDataStore(this._collisionMesh).control = this;\r\n this._collisionMesh.isNearPickable = true;\r\n\r\n this._collisionMesh.getChildMeshes().forEach((mesh) => {\r\n this._injectGUI3DReservedDataStore(mesh).control = this;\r\n mesh.isNearPickable = true;\r\n });\r\n this.collidableFrontDirection = collisionMesh.forward;\r\n }\r\n\r\n /**\r\n * Setter for if this TouchButton3D should be treated as a toggle button\r\n * @param value If this TouchHolographicButton should act like a toggle button\r\n */\r\n public set isToggleButton(value: boolean) {\r\n if (value === this._isToggleButton) {\r\n return;\r\n }\r\n\r\n this._isToggleButton = value;\r\n\r\n if (value) {\r\n this.onPointerUpObservable.add(this._toggleButtonCallback);\r\n } else {\r\n this.onPointerUpObservable.removeCallback(this._toggleButtonCallback);\r\n\r\n // Safety check, reset the button if it's toggled on but no longer a toggle button\r\n if (this._toggleState) {\r\n this._onToggle(false);\r\n }\r\n }\r\n }\r\n public get isToggleButton() {\r\n return this._isToggleButton;\r\n }\r\n\r\n /**\r\n * A public entrypoint to set the toggle state of the TouchHolographicButton. Only works if 'isToggleButton' is true\r\n * @param newState The new state to set the TouchHolographicButton's toggle state to\r\n */\r\n public set isToggled(newState: boolean) {\r\n if (this._isToggleButton && this._toggleState !== newState) {\r\n this._onToggle(newState);\r\n }\r\n }\r\n public get isToggled() {\r\n return this._toggleState;\r\n }\r\n\r\n protected _onToggle(newState: boolean) {\r\n this._toggleState = newState;\r\n this.onToggleObservable.notifyObservers(newState);\r\n }\r\n\r\n // Returns true if the collidable is in front of the button, or if the button has no front direction\r\n private _isInteractionInFrontOfButton(collidablePos: Vector3) {\r\n return this._getInteractionHeight(collidablePos, this._collisionMesh.getAbsolutePosition()) > 0;\r\n }\r\n\r\n /**\r\n * Get the height of the touchPoint from the collidable part of the button\r\n * @param touchPoint the point to compare to the button, in absolute position\r\n * @returns the depth of the touch point into the front of the button\r\n */\r\n public getPressDepth(touchPoint: Vector3) {\r\n if (!this._isNearPressed) {\r\n return 0;\r\n }\r\n const interactionHeight = this._getInteractionHeight(touchPoint, this._collisionMesh.getAbsolutePosition());\r\n return this._interactionSurfaceHeight - interactionHeight;\r\n }\r\n\r\n // Returns true if the collidable is in front of the button, or if the button has no front direction\r\n protected _getInteractionHeight(interactionPos: Vector3, basePos: Vector3) {\r\n const frontDir = this.collidableFrontDirection;\r\n if (frontDir.length() === 0) {\r\n // The button has no front, just return the distance to the base\r\n return Vector3.Distance(interactionPos, basePos);\r\n }\r\n const d = Vector3.Dot(basePos, frontDir);\r\n const abc = Vector3.Dot(interactionPos, frontDir);\r\n\r\n return abc - d;\r\n }\r\n\r\n /**\r\n * @param providedType\r\n * @param nearMeshPosition\r\n * @param activeInteractionCount\r\n * @hidden\r\n */\r\n public _generatePointerEventType(providedType: number, nearMeshPosition: Vector3, activeInteractionCount: number): number {\r\n if (providedType === PointerEventTypes.POINTERDOWN) {\r\n if (!this._isInteractionInFrontOfButton(nearMeshPosition)) {\r\n // Near interaction mesh is behind the button, don't send a pointer down\r\n return PointerEventTypes.POINTERMOVE;\r\n } else {\r\n this._isNearPressed = true;\r\n this._interactionSurfaceHeight = this._getInteractionHeight(nearMeshPosition, this._collisionMesh.getAbsolutePosition());\r\n }\r\n }\r\n if (providedType === PointerEventTypes.POINTERUP) {\r\n if (activeInteractionCount == 0) {\r\n // We get the release for the down we swallowed earlier, swallow as well\r\n return PointerEventTypes.POINTERMOVE;\r\n } else {\r\n this._isNearPressed = false;\r\n }\r\n }\r\n\r\n return providedType;\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"TouchButton3D\";\r\n }\r\n\r\n // Mesh association\r\n protected _createNode(scene: Scene): TransformNode {\r\n return super._createNode(scene);\r\n }\r\n\r\n /**\r\n * Releases all associated resources\r\n */\r\n public dispose() {\r\n super.dispose();\r\n\r\n // Clean up toggle observables\r\n this.onPointerUpObservable.removeCallback(this._toggleButtonCallback);\r\n this.onToggleObservable.clear();\r\n\r\n if (this._collisionMesh) {\r\n this._collisionMesh.dispose();\r\n }\r\n }\r\n}\r\n","import { Nullable } from \"core/types\";\r\nimport { 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 { 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 { Control3D } from \"./control3D\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { TouchButton3D } from \"./touchButton3D\";\r\nimport { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { SceneLoader } from \"core/Loading/sceneLoader\";\r\nimport { DomManagement } from \"core/Misc/domManagement\";\r\nimport { Scalar } from \"core/Maths/math.scalar\";\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/meshes/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 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 _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 (DomManagement.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 _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\r\n SceneLoader.ImportMeshAsync(undefined, TouchHolographicButton.MODEL_BASE_URL, 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 _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 _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 _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 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 { Behavior } from \"core/Behaviors/behavior\";\r\nimport { FollowBehavior } from \"core/Behaviors/Meshes/followBehavior\";\r\nimport { SixDofDragBehavior } from \"core/Behaviors/Meshes/sixDofDragBehavior\";\r\nimport { Scene } from \"core/scene\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { Observer } from \"core/Misc/observable\";\r\nimport { Nullable } from \"core/types\";\r\nimport { SurfaceMagnetismBehavior } from \"core/Behaviors/Meshes/surfaceMagnetismBehavior\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { PickingInfo } from \"core/Collisions/pickingInfo\";\r\nimport { 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;\rattribute vec3 position;\runiform vec3 positionOffset;\runiform mat4 worldViewProjection;\runiform float scale;\rvoid main(void) {\rvec4 vPos=vec4((vec3(position)+positionOffset)*scale,1.0);\rgl_Position=worldViewProjection*vPos;\r}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @hidden */\nexport const handleVertexShader = { name, shader };\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"handlePixelShader\";\nconst shader = `uniform vec3 color;\rvoid main(void) {\rgl_FragColor=vec4(color,1.0);\r}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @hidden */\nexport const handlePixelShader = { name, shader };\n","import { 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 { SlateGizmo } from \"./slateGizmo\";\r\nimport { BaseSixDofDragBehavior } from \"core/Behaviors/Meshes/baseSixDofDragBehavior\";\r\nimport { Nullable } from \"core/types\";\r\nimport { Observer } from \"core/Misc/observable\";\r\n\r\n/**\r\n * State of the handle regarding user interaction\r\n */\r\nexport 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 * @hidden\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 { Scene } from \"core/scene\";\r\nimport { Nullable } from \"core/types\";\r\nimport { 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 * @hidden\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 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 { Scene } from \"core/scene\";\r\nimport { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Observer } from \"core/Misc/observable\";\r\nimport { PivotTools } from \"core/Misc/pivotTools\";\r\nimport { UtilityLayerRenderer } from \"core/Rendering/utilityLayerRenderer\";\r\nimport { Nullable } from \"core/types\";\r\n\r\nimport { HolographicSlate } from \"../controls/holographicSlate\";\r\nimport { CornerHandle, GizmoHandle, SideHandle } from \"./gizmoHandle\";\r\n\r\n// Mask contains the influence of the drag offset vectors on dimensions or origin of the slate\r\n// Mask vector is multiplied to the offset vector\r\ntype HandleMasks = {\r\n dimensions: Vector3;\r\n origin: Vector3;\r\n};\r\n\r\n/**\r\n * Gizmo to resize 2D slates\r\n */\r\nexport class SlateGizmo extends Gizmo {\r\n private _boundingDimensions = new Vector3(0, 0, 0);\r\n private _pickedPointObserver: Nullable<Observer<Nullable<AbstractMesh>>>;\r\n private _renderObserver: Nullable<Observer<Scene>> = null;\r\n\r\n private _tmpQuaternion = new Quaternion();\r\n private _tmpVector = new Vector3(0, 0, 0);\r\n\r\n // Ordered bl, br, tr, tl\r\n private _corners: CornerHandle[] = [];\r\n // Ordered left, bottom, right, top\r\n private _sides: SideHandle[] = [];\r\n private _handlesParent: TransformNode;\r\n private _handleHovered: Nullable<GizmoHandle>;\r\n private _handleDragged: Nullable<GizmoHandle>;\r\n\r\n private _boundingBoxGizmo = {\r\n min: new Vector3(),\r\n max: new Vector3(),\r\n };\r\n\r\n /**\r\n * Value we use to offset handles from mesh\r\n */\r\n private _margin = 0.35;\r\n private _handleSize = 0.075;\r\n private _attachedSlate: Nullable<HolographicSlate> = null;\r\n private _existingSlateScale = new Vector3();\r\n /**\r\n * If set, the handles will increase in size based on the distance away from the camera to have a consistent screen size (Default: true)\r\n */\r\n public fixedScreenSize = false;\r\n /**\r\n * The distance away from the object which the draggable meshes should appear world sized when fixedScreenSize is set to true (default: 10)\r\n */\r\n public fixedScreenSizeDistanceFactor = 10;\r\n\r\n /**\r\n * The slate attached to this gizmo\r\n */\r\n public set attachedSlate(control: Nullable<HolographicSlate>) {\r\n if (control) {\r\n this.attachedMesh = control.mesh;\r\n this.updateBoundingBox();\r\n\r\n this._pickedPointObserver = control._host.onPickingObservable.add((pickedMesh) => {\r\n if (this._handleHovered && (!pickedMesh || pickedMesh.parent !== this._handleHovered.node)) {\r\n this._handleHovered.hover = false;\r\n this._handleHovered = null;\r\n }\r\n\r\n if (pickedMesh && pickedMesh.parent && pickedMesh.parent.reservedDataStore && pickedMesh.parent.reservedDataStore.handle) {\r\n const handle = pickedMesh.parent.reservedDataStore.handle as GizmoHandle;\r\n if (handle.gizmo === this) {\r\n this._handleHovered = handle;\r\n this._handleHovered.hover = true;\r\n }\r\n }\r\n });\r\n } else if (this._attachedSlate) {\r\n this._attachedSlate._host.onPickingObservable.remove(this._pickedPointObserver);\r\n }\r\n this._attachedSlate = control;\r\n }\r\n\r\n public get attachedSlate(): Nullable<HolographicSlate> {\r\n return this._attachedSlate;\r\n }\r\n\r\n constructor(utilityLayer?: UtilityLayerRenderer) {\r\n super(utilityLayer);\r\n\r\n this._createNode();\r\n this.updateScale = false;\r\n\r\n this._renderObserver = this.gizmoLayer.originalScene.onBeforeRenderObservable.add(() => {\r\n // Only update the bounding box if scaling has changed\r\n if (this.attachedMesh && !this._existingSlateScale.equals(this.attachedMesh.scaling)) {\r\n this.updateBoundingBox();\r\n }\r\n });\r\n }\r\n\r\n private _createNode() {\r\n this._handlesParent = new TransformNode(\"handlesParent\", this.gizmoLayer.utilityLayerScene);\r\n this._handlesParent.rotationQuaternion = Quaternion.Identity();\r\n\r\n const masksCorners = [\r\n {\r\n dimensions: new Vector3(-1, -1, 0),\r\n origin: new Vector3(1, 0, 0),\r\n },\r\n {\r\n dimensions: new Vector3(1, -1, 0),\r\n origin: new Vector3(0, 0, 0),\r\n },\r\n {\r\n dimensions: new Vector3(1, 1, 0),\r\n origin: new Vector3(0, 1, 0),\r\n },\r\n {\r\n dimensions: new Vector3(-1, 1, 0),\r\n origin: new Vector3(1, 1, 0),\r\n },\r\n ];\r\n\r\n for (let i = 0; i < 4; i++) {\r\n const corner = new CornerHandle(this, this.gizmoLayer.utilityLayerScene);\r\n this._corners.push(corner);\r\n corner.node.rotation.z = (Math.PI / 2) * i;\r\n\r\n corner.node.parent = this._handlesParent;\r\n this._assignDragBehaviorCorners(\r\n corner,\r\n (originStart: Vector3, dimensionsStart: Vector3, offset: Vector3, masks: HandleMasks) => this._moveHandle(originStart, dimensionsStart, offset, masks, true),\r\n masksCorners[i]\r\n );\r\n }\r\n\r\n for (let i = 0; i < 4; i++) {\r\n const side = new SideHandle(this, this.gizmoLayer.utilityLayerScene);\r\n this._sides.push(side);\r\n side.node.rotation.z = (Math.PI / 2) * i;\r\n side.node.parent = this._handlesParent;\r\n this._assignDragBehaviorSides(side, i % 2 === 0 ? new Vector3(0, 1, 0) : new Vector3(1, 0, 0));\r\n }\r\n\r\n this._handlesParent.parent = this._rootMesh;\r\n }\r\n\r\n private _keepAspectRatio(vector: Vector3, aspectRatio: number, invertDiagonal: boolean = false) {\r\n const axis = TmpVectors.Vector3[0];\r\n axis.copyFromFloats(aspectRatio, 1, 0).normalize();\r\n if (invertDiagonal) {\r\n axis.y *= -1;\r\n }\r\n const dot = Vector3.Dot(vector, axis);\r\n vector.copyFrom(axis).scaleInPlace(dot);\r\n }\r\n\r\n private _clampDimensions(vector: Vector3, dimensions: Vector3, mask: Vector3, keepAspectRatio: boolean = false) {\r\n const impact = TmpVectors.Vector3[0];\r\n impact.copyFrom(vector).multiplyInPlace(mask);\r\n\r\n const clampedDimensions = TmpVectors.Vector3[1];\r\n clampedDimensions.copyFromFloats(\r\n Math.max(this._attachedSlate!.minDimensions.x, impact.x + dimensions.x),\r\n Math.max(this._attachedSlate!.minDimensions.y, impact.y + dimensions.y),\r\n 0\r\n );\r\n\r\n if (keepAspectRatio) {\r\n // Extra logic to ensure the ratio is maintained when the vector has been clamped\r\n const ratio = dimensions.x / dimensions.y;\r\n clampedDimensions.x = Math.max(clampedDimensions.x, clampedDimensions.y * ratio);\r\n clampedDimensions.y = Math.max(clampedDimensions.y, clampedDimensions.x / ratio);\r\n }\r\n\r\n // Calculating the real impact of vector on clamped dimensions\r\n impact.copyFrom(clampedDimensions).subtractInPlace(dimensions);\r\n\r\n vector.x = Math.sign(vector.x) * Math.abs(impact.x);\r\n vector.y = Math.sign(vector.y) * Math.abs(impact.y);\r\n }\r\n\r\n private _moveHandle(originStart: Vector3, dimensionsStart: Vector3, offset: Vector3, masks: HandleMasks, isCorner: boolean) {\r\n if (!this._attachedSlate) {\r\n return;\r\n }\r\n\r\n if (isCorner) {\r\n const aspectRatio = dimensionsStart.x / dimensionsStart.y;\r\n this._keepAspectRatio(offset, aspectRatio, masks.dimensions.x * masks.dimensions.y < 0);\r\n }\r\n this._clampDimensions(offset, dimensionsStart, masks.dimensions, isCorner);\r\n\r\n const offsetOriginMasked = TmpVectors.Vector3[0];\r\n const offsetDimensionsMasked = TmpVectors.Vector3[1];\r\n offsetOriginMasked.copyFrom(offset).multiplyInPlace(masks.origin);\r\n offsetDimensionsMasked.copyFrom(offset).multiplyInPlace(masks.dimensions);\r\n\r\n this._attachedSlate.origin.copyFrom(originStart).addInPlace(offsetOriginMasked);\r\n this._attachedSlate.dimensions.set(dimensionsStart.x + offsetDimensionsMasked.x, dimensionsStart.y + offsetDimensionsMasked.y);\r\n }\r\n\r\n private _assignDragBehaviorCorners(\r\n handle: GizmoHandle,\r\n moveFn: (originStart: Vector3, dimensionsStart: Vector3, offset: Vector3, masks: HandleMasks) => void,\r\n masks: HandleMasks\r\n ) {\r\n const dimensionsStart = new Vector3();\r\n const originStart = new Vector3();\r\n const dragOrigin = new Vector3();\r\n const toObjectFrame = new Matrix();\r\n const dragPlaneNormal = new Vector3();\r\n\r\n const projectToRef = (position: Vector3, normal: Vector3, origin: Vector3, ref: Vector3) => {\r\n // Projects on the plane with its normal and origin\r\n position.subtractToRef(origin, TmpVectors.Vector3[0]);\r\n const dot = Vector3.Dot(TmpVectors.Vector3[0], normal);\r\n TmpVectors.Vector3[1].copyFrom(normal).scaleInPlace(dot);\r\n TmpVectors.Vector3[0].subtractInPlace(TmpVectors.Vector3[1]);\r\n TmpVectors.Vector3[0].addToRef(origin, ref);\r\n };\r\n\r\n const dragStart = (event: { position: Vector3 }) => {\r\n if (this.attachedSlate && this.attachedMesh) {\r\n dimensionsStart.set(this.attachedSlate.dimensions.x, this.attachedSlate.dimensions.y, Epsilon);\r\n originStart.copyFrom(this.attachedSlate.origin);\r\n dragOrigin.copyFrom(event.position);\r\n toObjectFrame.copyFrom(this.attachedMesh.computeWorldMatrix(true));\r\n toObjectFrame.invert();\r\n this.attachedSlate._followButton.isToggled = false;\r\n Vector3.TransformNormalToRef(Vector3.Forward(), this.attachedMesh.getWorldMatrix(), dragPlaneNormal);\r\n dragPlaneNormal.normalize();\r\n\r\n if (this._handleHovered) {\r\n this._handleDragged = this._handleHovered;\r\n this._handleDragged.drag = true;\r\n }\r\n }\r\n };\r\n\r\n const dragging = (event: { position: Vector3 }) => {\r\n if (this.attachedSlate && this.attachedMesh) {\r\n projectToRef(event.position, dragPlaneNormal, dragOrigin, this._tmpVector);\r\n this._tmpVector.subtractInPlace(dragOrigin);\r\n Vector3.TransformNormalToRef(this._tmpVector, toObjectFrame, this._tmpVector);\r\n\r\n moveFn(originStart, dimensionsStart, this._tmpVector, masks);\r\n this.attachedSlate._positionElements();\r\n this.updateBoundingBox();\r\n }\r\n };\r\n\r\n const dragEnd = () => {\r\n if (this.attachedSlate && this.attachedNode) {\r\n this.attachedSlate._updatePivot();\r\n\r\n if (this._handleDragged) {\r\n this._handleDragged.drag = false;\r\n this._handleDragged = null;\r\n }\r\n }\r\n };\r\n\r\n handle.setDragBehavior(dragStart, dragging, dragEnd);\r\n }\r\n\r\n private _assignDragBehaviorSides(handle: GizmoHandle, dragPlaneNormal: Vector3) {\r\n 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 _attachedNodeChanged(value: Nullable<AbstractMesh>) {\r\n if (value) {\r\n this.updateBoundingBox();\r\n }\r\n }\r\n\r\n /**\r\n * Updates the bounding box information for the gizmo\r\n */\r\n public updateBoundingBox() {\r\n if (this.attachedMesh) {\r\n PivotTools._RemoveAndStorePivotPoint(this.attachedMesh);\r\n\r\n // Store original parent\r\n const originalParent = this.attachedMesh.parent;\r\n this.attachedMesh.setParent(null);\r\n\r\n this._update();\r\n\r\n // Rotate based on axis\r\n if (!this.attachedMesh.rotationQuaternion) {\r\n this.attachedMesh.rotationQuaternion = Quaternion.RotationYawPitchRoll(this.attachedMesh.rotation.y, this.attachedMesh.rotation.x, this.attachedMesh.rotation.z);\r\n }\r\n\r\n // Store original position and reset mesh to origin before computing the bounding box\r\n this._tmpQuaternion.copyFrom(this.attachedMesh.rotationQuaternion);\r\n this._tmpVector.copyFrom(this.attachedMesh.position);\r\n this.attachedMesh.rotationQuaternion.set(0, 0, 0, 1);\r\n this.attachedMesh.position.set(0, 0, 0);\r\n\r\n // Update bounding dimensions/positions\r\n const boundingMinMax = this.attachedMesh.getHierarchyBoundingVectors();\r\n boundingMinMax.max.subtractToRef(boundingMinMax.min, this._boundingDimensions);\r\n this._boundingBoxGizmo.min = boundingMinMax.min;\r\n this._boundingBoxGizmo.max = boundingMinMax.max;\r\n\r\n // Update handles of the gizmo\r\n this._updateHandlesPosition();\r\n this._updateHandlesScaling();\r\n\r\n // Restore position/rotation values\r\n this.attachedMesh.rotationQuaternion.copyFrom(this._tmpQuaternion);\r\n this.attachedMesh.position.copyFrom(this._tmpVector);\r\n\r\n PivotTools._RestorePivotPoint(this.attachedMesh);\r\n\r\n // Restore original parent\r\n this.attachedMesh.setParent(originalParent);\r\n this.attachedMesh.computeWorldMatrix(true);\r\n\r\n this._existingSlateScale.copyFrom(this.attachedMesh.scaling);\r\n }\r\n }\r\n\r\n private _updateHandlesPosition() {\r\n const min = this._boundingBoxGizmo.min.clone();\r\n const max = this._boundingBoxGizmo.max.clone();\r\n\r\n const handleScaling = this._corners[0].node.scaling.length();\r\n min.x -= this._margin * handleScaling;\r\n min.y -= this._margin * handleScaling;\r\n max.x += this._margin * handleScaling;\r\n max.y += this._margin * handleScaling;\r\n\r\n const center = min.add(max).scaleInPlace(0.5);\r\n\r\n this._corners[0].node.position.copyFromFloats(min.x, min.y, 0);\r\n this._corners[1].node.position.copyFromFloats(max.x, min.y, 0);\r\n this._corners[2].node.position.copyFromFloats(max.x, max.y, 0);\r\n this._corners[3].node.position.copyFromFloats(min.x, max.y, 0);\r\n\r\n this._sides[0].node.position.copyFromFloats(min.x, center.y, 0);\r\n this._sides[1].node.position.copyFromFloats(center.x, min.y, 0);\r\n this._sides[2].node.position.copyFromFloats(max.x, center.y, 0);\r\n this._sides[3].node.position.copyFromFloats(center.x, max.y, 0);\r\n }\r\n\r\n private _updateHandlesScaling() {\r\n if (this._attachedSlate && this._attachedSlate.mesh) {\r\n const scaledWidth = this._attachedSlate.mesh.scaling.x * this._attachedSlate.dimensions.x;\r\n const scaledHeight = this._attachedSlate.mesh.scaling.y * this._attachedSlate.dimensions.y;\r\n const scale = Math.min(scaledWidth, scaledHeight) * this._handleSize;\r\n for (let index = 0; index < this._corners.length; index++) {\r\n this._corners[index].node.scaling.setAll(scale);\r\n }\r\n for (let index = 0; index < this._sides.length; index++) {\r\n this._sides[index].node.scaling.setAll(scale);\r\n }\r\n }\r\n }\r\n\r\n protected _update() {\r\n super._update();\r\n\r\n if (!this.gizmoLayer.utilityLayerScene.activeCamera) {\r\n return;\r\n }\r\n\r\n if (this._attachedSlate && this._attachedSlate.mesh) {\r\n if (this.fixedScreenSize) {\r\n this._attachedSlate.mesh.absolutePosition.subtractToRef(this.gizmoLayer.utilityLayerScene.activeCamera.position, this._tmpVector);\r\n 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 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","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"fluentBackplatePixelShader\";\nconst shader = `uniform vec3 cameraPosition;\rvarying vec3 vPosition;\rvarying vec3 vNormal;\rvarying vec2 vUV;\rvarying vec3 vTangent;\rvarying vec3 vBinormal;\rvarying vec4 vColor;\rvarying vec4 vExtra1;\rvarying vec4 vExtra2;\rvarying vec4 vExtra3;\runiform float _Radius_;\runiform float _Line_Width_;\runiform bool _Absolute_Sizes_;\runiform float _Filter_Width_;\runiform vec4 _Base_Color_;\runiform vec4 _Line_Color_;\runiform float _Radius_Top_Left_;\runiform float _Radius_Top_Right_;\runiform float _Radius_Bottom_Left_;\runiform float _Radius_Bottom_Right_;\runiform vec3 _Blob_Position_;\runiform float _Blob_Intensity_;\runiform float _Blob_Near_Size_;\runiform float _Blob_Far_Size_;\runiform float _Blob_Near_Distance_;\runiform float _Blob_Far_Distance_;\runiform float _Blob_Fade_Length_;\runiform float _Blob_Pulse_;\runiform float _Blob_Fade_;\runiform sampler2D _Blob_Texture_;\runiform vec3 _Blob_Position_2_;\runiform float _Blob_Near_Size_2_;\runiform float _Blob_Pulse_2_;\runiform float _Blob_Fade_2_;\runiform float _Rate_;\runiform vec4 _Highlight_Color_;\runiform float _Highlight_Width_;\runiform vec4 _Highlight_Transform_;\runiform float _Highlight_;\runiform float _Iridescence_Intensity_;\runiform float _Iridescence_Edge_Intensity_;\runiform float _Angle_;\runiform float _Fade_Out_;\runiform bool _Reflected_;\runiform float _Frequency_;\runiform float _Vertical_Offset_;\runiform sampler2D _Iridescent_Map_;\runiform bool _Use_Global_Left_Index_;\runiform bool _Use_Global_Right_Index_;\runiform vec4 Global_Left_Index_Tip_Position;\runiform vec4 Global_Right_Index_Tip_Position;\rvoid Round_Rect_Fragment_B31(\rfloat Radius,\rfloat Line_Width,\rvec4 Line_Color,\rfloat Filter_Width,\rvec2 UV,\rfloat Line_Visibility,\rvec4 Rect_Parms,\rvec4 Fill_Color,\rout vec4 Color)\r{\rfloat d=length(max(abs(UV)-Rect_Parms.xy,0.0));\rfloat dx=max(fwidth(d)*Filter_Width,0.00001);\rfloat g=min(Rect_Parms.z,Rect_Parms.w);\rfloat dgrad=max(fwidth(g)*Filter_Width,0.00001);\rfloat Inside_Rect=clamp(g/dgrad,0.0,1.0);\rfloat inner=clamp((d+dx*0.5-max(Radius-Line_Width,d-dx*0.5))/dx,0.0,1.0);\rColor=clamp(mix(Fill_Color,Line_Color,inner),0.0,1.0)*Inside_Rect;\r}\rvoid Blob_Fragment_B71(\rsampler2D Blob_Texture,\rvec4 Blob_Info1,\rvec4 Blob_Info2,\rout vec4 Blob_Color)\r{\rfloat k1=dot(Blob_Info1.xy,Blob_Info1.xy);\rfloat k2=dot(Blob_Info2.xy,Blob_Info2.xy);\rvec3 closer=k1<k2 ? vec3(k1,Blob_Info1.z,Blob_Info1.w) : vec3(k2,Blob_Info2.z,Blob_Info2.w);\rBlob_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);\r}\rvoid Line_Fragment_B48(\rvec4 Base_Color,\rvec4 Highlight_Color,\rfloat Highlight_Width,\rvec3 Line_Vertex,\rfloat Highlight,\rout vec4 Line_Color)\r{\rfloat k2=1.0-clamp(abs(Line_Vertex.y/Highlight_Width),0.0,1.0);\rLine_Color=mix(Base_Color,Highlight_Color,Highlight*k2);\r}\rvoid Scale_RGB_B54(\rvec4 Color,\rfloat Scalar,\rout vec4 Result)\r{\rResult=vec4(Scalar,Scalar,Scalar,1)*Color;\r}\rvoid Conditional_Float_B38(\rbool Which,\rfloat If_True,\rfloat If_False,\rout float Result)\r{\rResult=Which ? If_True : If_False;\r}\rvoid main()\r{\rfloat R_Q72;\rfloat G_Q72;\rfloat B_Q72;\rfloat A_Q72;\rR_Q72=vColor.r; G_Q72=vColor.g; B_Q72=vColor.b; A_Q72=vColor.a;\rvec4 Blob_Color_Q71;\r#if BLOB_ENABLE\nfloat k1=dot(vExtra2.xy,vExtra2.xy);\rfloat k2=dot(vExtra3.xy,vExtra3.xy);\rvec3 closer=k1<k2 ? vec3(k1,vExtra2.z,vExtra2.w) : vec3(k2,vExtra3.z,vExtra3.w);\rBlob_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);\r#else\nBlob_Color_Q71=vec4(0,0,0,0);\r#endif\nvec4 Line_Color_Q48;\rLine_Fragment_B48(_Line_Color_,_Highlight_Color_,_Highlight_Width_,vTangent,_Highlight_,Line_Color_Q48);\rfloat X_Q67;\rfloat Y_Q67;\rX_Q67=vUV.x;\rY_Q67=vUV.y;\rvec3 Incident_Q66=normalize(vPosition-cameraPosition);\rvec3 Reflected_Q60=reflect(Incident_Q66,vBinormal);\rfloat Product_Q63=Y_Q67*_Vertical_Offset_;\rfloat Dot_Q68=dot(Incident_Q66, Reflected_Q60);\rfloat Dot_Q57=dot(vNormal, Incident_Q66);\rfloat Result_Q38;\rConditional_Float_B38(_Reflected_,Dot_Q68,Dot_Q57,Result_Q38);\rfloat Product_Q64=Result_Q38*_Frequency_;\rfloat Sum_Q69=Product_Q64+1.0;\rfloat Product_Q70=Sum_Q69*0.5;\rfloat Sum_Q62=Product_Q63+Product_Q70;\rfloat FractF_Q59=fract(Sum_Q62);\rvec2 Vec2_Q65=vec2(FractF_Q59,0.5);\rvec4 Color_Q58;\r#if IRIDESCENT_MAP_ENABLE\nColor_Q58=texture(_Iridescent_Map_,Vec2_Q65);\r#else\nColor_Q58=vec4(0,0,0,0);\r#endif\nvec4 Result_Q54;\rScale_RGB_B54(Color_Q58,_Iridescence_Edge_Intensity_,Result_Q54);\rvec4 Result_Q55;\rScale_RGB_B54(Color_Q58,_Iridescence_Intensity_,Result_Q55);\rvec4 Base_And_Iridescent_Q53;\rBase_And_Iridescent_Q53=Line_Color_Q48+vec4(Result_Q54.rgb,0.0);\rvec4 Base_And_Iridescent_Q56;\rBase_And_Iridescent_Q56=_Base_Color_+vec4(Result_Q55.rgb,0.0);\rvec4 Result_Q52=Base_And_Iridescent_Q53; Result_Q52.a=1.0;\rvec4 Result_Q35=Blob_Color_Q71+(1.0-Blob_Color_Q71.a)*Base_And_Iridescent_Q56;\rvec4 Color_Q31;\rRound_Rect_Fragment_B31(R_Q72,G_Q72,Result_Q52,_Filter_Width_,vUV,1.0,vExtra1,Result_Q35,Color_Q31);\rvec4 Result_Q47=_Fade_Out_*Color_Q31;\rvec4 Out_Color=Result_Q47;\rfloat Clip_Threshold=0.001;\rbool To_sRGB=false;\rgl_FragColor=Out_Color;\r}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @hidden */\nexport const fluentBackplatePixelShader = { name, shader };\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"fluentBackplateVertexShader\";\nconst shader = `uniform mat4 world;\runiform mat4 viewProjection;\runiform vec3 cameraPosition;\rattribute vec3 position;\rattribute vec3 normal;\r#ifdef TANGENT\nattribute vec3 tangent;\r#else\nconst vec3 tangent=vec3(0.);\r#endif\nuniform float _Radius_;\runiform float _Line_Width_;\runiform bool _Absolute_Sizes_;\runiform float _Filter_Width_;\runiform vec4 _Base_Color_;\runiform vec4 _Line_Color_;\runiform float _Radius_Top_Left_;\runiform float _Radius_Top_Right_;\runiform float _Radius_Bottom_Left_;\runiform float _Radius_Bottom_Right_;\runiform vec3 _Blob_Position_;\runiform float _Blob_Intensity_;\runiform float _Blob_Near_Size_;\runiform float _Blob_Far_Size_;\runiform float _Blob_Near_Distance_;\runiform float _Blob_Far_Distance_;\runiform float _Blob_Fade_Length_;\runiform float _Blob_Pulse_;\runiform float _Blob_Fade_;\runiform sampler2D _Blob_Texture_;\runiform vec3 _Blob_Position_2_;\runiform float _Blob_Near_Size_2_;\runiform float _Blob_Pulse_2_;\runiform float _Blob_Fade_2_;\runiform float _Rate_;\runiform vec4 _Highlight_Color_;\runiform float _Highlight_Width_;\runiform vec4 _Highlight_Transform_;\runiform float _Highlight_;\runiform float _Iridescence_Intensity_;\runiform float _Iridescence_Edge_Intensity_;\runiform float _Angle_;\runiform float _Fade_Out_;\runiform bool _Reflected_;\runiform float _Frequency_;\runiform float _Vertical_Offset_;\runiform sampler2D _Iridescent_Map_;\runiform bool _Use_Global_Left_Index_;\runiform bool _Use_Global_Right_Index_;\runiform vec4 Global_Left_Index_Tip_Position;\runiform vec4 Global_Right_Index_Tip_Position;\rvarying vec3 vPosition;\rvarying vec3 vNormal;\rvarying vec2 vUV;\rvarying vec3 vTangent;\rvarying vec3 vBinormal;\rvarying vec4 vColor;\rvarying vec4 vExtra1;\rvarying vec4 vExtra2;\rvarying vec4 vExtra3;\rvoid Object_To_World_Pos_B115(\rvec3 Pos_Object,\rout vec3 Pos_World)\r{\rPos_World=(world*vec4(Pos_Object,1.0)).xyz;\r}\rvoid PickDir_B140(\rfloat Degrees,\rvec3 DirX,\rvec3 DirY,\rout vec3 Dir)\r{\rfloat a=Degrees*3.14159/180.0;\rDir=cos(a)*DirX+sin(a)*DirY;\r}\rvoid Round_Rect_Vertex_B139(\rvec2 UV,\rfloat Radius,\rfloat Margin,\rfloat Anisotropy,\rfloat Gradient1,\rfloat Gradient2,\rout vec2 Rect_UV,\rout vec4 Rect_Parms,\rout vec2 Scale_XY,\rout vec2 Line_UV)\r{\rScale_XY=vec2(Anisotropy,1.0);\rLine_UV=(UV-vec2(0.5,0.5));\rRect_UV=Line_UV*Scale_XY;\rRect_Parms.xy=Scale_XY*0.5-vec2(Radius,Radius)-vec2(Margin,Margin);\rRect_Parms.z=Gradient1; \rRect_Parms.w=Gradient2;\r}\rvoid Line_Vertex_B135(\rvec2 Scale_XY,\rvec2 UV,\rfloat Time,\rfloat Rate,\rvec4 Highlight_Transform,\rout vec3 Line_Vertex)\r{\rfloat angle2=(Rate*Time)*2.0*3.1416;\rfloat sinAngle2=sin(angle2);\rfloat cosAngle2=cos(angle2);\rvec2 xformUV=UV*Highlight_Transform.xy+Highlight_Transform.zw;\rLine_Vertex.x=0.0;\rLine_Vertex.y=cosAngle2*xformUV.x-sinAngle2*xformUV.y;\rLine_Vertex.z=0.0; \r}\rvoid Blob_Vertex_B180(\rvec3 Position,\rvec3 Normal,\rvec3 Tangent,\rvec3 Bitangent,\rvec3 Blob_Position,\rfloat Intensity,\rfloat Blob_Near_Size,\rfloat Blob_Far_Size,\rfloat Blob_Near_Distance,\rfloat Blob_Far_Distance,\rfloat Blob_Fade_Length,\rfloat Blob_Pulse,\rfloat Blob_Fade,\rout vec4 Blob_Info)\r{\rvec3 blob=Blob_Position;\rvec3 delta=blob-Position;\rfloat dist=dot(Normal,delta);\rfloat lerpValue=clamp((abs(dist)-Blob_Near_Distance)/(Blob_Far_Distance-Blob_Near_Distance),0.0,1.0);\rfloat fadeValue=1.0-clamp((abs(dist)-Blob_Far_Distance)/Blob_Fade_Length,0.0,1.0);\rfloat size=Blob_Near_Size+(Blob_Far_Size-Blob_Near_Size)*lerpValue;\rvec2 blobXY=vec2(dot(delta,Tangent),dot(delta,Bitangent))/(0.0001+size);\rfloat Fade=fadeValue*Intensity*Blob_Fade;\rfloat Distance=(lerpValue*0.5+0.5)*(1.0-Blob_Pulse);\rBlob_Info=vec4(blobXY.x,blobXY.y,Distance,Fade);\r}\rvoid Move_Verts_B129(\rfloat Anisotropy,\rvec3 P,\rfloat Radius,\rout vec3 New_P,\rout vec2 New_UV,\rout float Radial_Gradient,\rout vec3 Radial_Dir)\r{\rvec2 UV=P.xy*2.0+0.5;\rvec2 center=clamp(UV,0.0,1.0);\rvec2 delta=UV-center;\rvec2 r2=2.0*vec2(Radius/Anisotropy,Radius);\rNew_UV=center+r2*(UV-2.0*center+0.5);\rNew_P=vec3(New_UV-0.5,P.z);\rRadial_Gradient=1.0-length(delta)*2.0;\rRadial_Dir=vec3(delta*r2,0.0);\r}\rvoid Object_To_World_Dir_B132(\rvec3 Dir_Object,\rout vec3 Binormal_World,\rout vec3 Binormal_World_N,\rout float Binormal_Length)\r{\rBinormal_World=(world*vec4(Dir_Object,0.0)).xyz;\rBinormal_Length=length(Binormal_World);\rBinormal_World_N=Binormal_World/Binormal_Length;\r}\rvoid RelativeOrAbsoluteDetail_B147(\rfloat Nominal_Radius,\rfloat Nominal_LineWidth,\rbool Absolute_Measurements,\rfloat Height,\rout float Radius,\rout float Line_Width)\r{\rfloat scale=Absolute_Measurements ? 1.0/Height : 1.0;\rRadius=Nominal_Radius*scale;\rLine_Width=Nominal_LineWidth*scale;\r}\rvoid Edge_AA_Vertex_B130(\rvec3 Position_World,\rvec3 Position_Object,\rvec3 Normal_Object,\rvec3 Eye,\rfloat Radial_Gradient,\rvec3 Radial_Dir,\rvec3 Tangent,\rout float Gradient1,\rout float Gradient2)\r{\rvec3 I=(Eye-Position_World);\rvec3 T=(world* vec4(Tangent,0.0)).xyz;\rfloat g=(dot(T,I)<0.0) ? 0.0 : 1.0;\rif (Normal_Object.z==0.0) { \rGradient1=Position_Object.z>0.0 ? g : 1.0;\rGradient2=Position_Object.z>0.0 ? 1.0 : g;\r} else {\rGradient1=g+(1.0-g)*(Radial_Gradient);\rGradient2=1.0;\r}\r}\rvoid Pick_Radius_B144(\rfloat Radius,\rfloat Radius_Top_Left,\rfloat Radius_Top_Right,\rfloat Radius_Bottom_Left,\rfloat Radius_Bottom_Right,\rvec3 Position,\rout float Result)\r{\rbool whichY=Position.y>0.0;\rResult=Position.x<0.0 ? (whichY ? Radius_Top_Left : Radius_Bottom_Left) : (whichY ? Radius_Top_Right : Radius_Bottom_Right);\rResult*=Radius;\r}\rvoid main()\r{\rvec3 Nrm_World_Q128;\rNrm_World_Q128=normalize((world*vec4(normal,0.0)).xyz);\rvec3 Tangent_World_Q131;\rvec3 Tangent_World_N_Q131;\rfloat Tangent_Length_Q131;\rTangent_World_Q131=(world*vec4(vec3(1,0,0),0.0)).xyz;\rTangent_Length_Q131=length(Tangent_World_Q131);\rTangent_World_N_Q131=Tangent_World_Q131/Tangent_Length_Q131;\rvec3 Binormal_World_Q132;\rvec3 Binormal_World_N_Q132;\rfloat Binormal_Length_Q132;\rObject_To_World_Dir_B132(vec3(0,1,0),Binormal_World_Q132,Binormal_World_N_Q132,Binormal_Length_Q132);\rfloat Anisotropy_Q133=Tangent_Length_Q131/Binormal_Length_Q132;\rvec3 Result_Q177;\rResult_Q177=mix(_Blob_Position_,Global_Left_Index_Tip_Position.xyz,float(_Use_Global_Left_Index_));\rvec3 Result_Q178;\rResult_Q178=mix(_Blob_Position_2_,Global_Right_Index_Tip_Position.xyz,float(_Use_Global_Right_Index_));\rfloat Result_Q144;\rPick_Radius_B144(_Radius_,_Radius_Top_Left_,_Radius_Top_Right_,_Radius_Bottom_Left_,_Radius_Bottom_Right_,position,Result_Q144);\rvec3 Dir_Q140;\rPickDir_B140(_Angle_,Tangent_World_N_Q131,Binormal_World_N_Q132,Dir_Q140);\rfloat Radius_Q147;\rfloat Line_Width_Q147;\rRelativeOrAbsoluteDetail_B147(Result_Q144,_Line_Width_,_Absolute_Sizes_,Binormal_Length_Q132,Radius_Q147,Line_Width_Q147);\rvec4 Out_Color_Q145=vec4(Radius_Q147,Line_Width_Q147,0,1);\rvec3 New_P_Q129;\rvec2 New_UV_Q129;\rfloat Radial_Gradient_Q129;\rvec3 Radial_Dir_Q129;\rMove_Verts_B129(Anisotropy_Q133,position,Radius_Q147,New_P_Q129,New_UV_Q129,Radial_Gradient_Q129,Radial_Dir_Q129);\rvec3 Pos_World_Q115;\rObject_To_World_Pos_B115(New_P_Q129,Pos_World_Q115);\rvec4 Blob_Info_Q180;\r#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);\r#else\nBlob_Info_Q180=vec4(0,0,0,0);\r#endif\nvec4 Blob_Info_Q181;\r#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);\r#else\nBlob_Info_Q181=vec4(0,0,0,0);\r#endif\nfloat Gradient1_Q130;\rfloat Gradient2_Q130;\r#if SMOOTH_EDGES\nEdge_AA_Vertex_B130(Pos_World_Q115,position,normal,cameraPosition,Radial_Gradient_Q129,Radial_Dir_Q129,tangent,Gradient1_Q130,Gradient2_Q130);\r#else\nGradient1_Q130=1.0;\rGradient2_Q130=1.0;\r#endif\nvec2 Rect_UV_Q139;\rvec4 Rect_Parms_Q139;\rvec2 Scale_XY_Q139;\rvec2 Line_UV_Q139;\rRound_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);\rvec3 Line_Vertex_Q135;\rLine_Vertex_B135(Scale_XY_Q139,Line_UV_Q139,0.0,_Rate_,_Highlight_Transform_,Line_Vertex_Q135);\rvec3 Position=Pos_World_Q115;\rvec3 Normal=Dir_Q140;\rvec2 UV=Rect_UV_Q139;\rvec3 Tangent=Line_Vertex_Q135;\rvec3 Binormal=Nrm_World_Q128;\rvec4 Color=Out_Color_Q145;\rvec4 Extra1=Rect_Parms_Q139;\rvec4 Extra2=Blob_Info_Q180;\rvec4 Extra3=Blob_Info_Q181;\rgl_Position=viewProjection*vec4(Position,1);\rvPosition=Position;\rvNormal=Normal;\rvUV=UV;\rvTangent=Tangent;\rvBinormal=Binormal;\rvColor=Color;\rvExtra1=Extra1;\rvExtra2=Extra2;\rvExtra3=Extra3;\r}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @hidden */\nexport const fluentBackplateVertexShader = { name, shader };\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { Nullable } from \"core/types\";\r\nimport { SerializationHelper, serialize, serializeAsVector3 } from \"core/Misc/decorators\";\r\nimport { Matrix, Vector3, Vector4 } from \"core/Maths/math.vector\";\r\nimport { IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { MaterialHelper } from \"core/Materials/materialHelper\";\r\nimport { IEffectCreationOptions } from \"core/Materials/effect\";\r\nimport { PushMaterial } from \"core/Materials/pushMaterial\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { SubMesh } from \"core/Meshes/subMesh\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { 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\n\r\n/** @hidden */\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/meshes/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/meshes/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 /** @hidden */\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 /** @hidden */\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 /** @hidden */\r\n public _highlightTransform = new Vector4(1, 1, 0, 0);\r\n\r\n /** @hidden */\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 /** @hidden */\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 /** @hidden */\r\n public _reflected = true;\r\n\r\n /** @hidden */\r\n public _frequency = 1;\r\n\r\n /** @hidden */\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\r\n this._blobTexture = new Texture(FluentBackplateMaterial.BLOB_TEXTURE_URL, this.getScene(), true, false, Texture.NEAREST_SAMPLINGMODE);\r\n this._iridescentMap = new Texture(FluentBackplateMaterial.IM_TEXTURE_URL, this.getScene(), true, false, Texture.NEAREST_SAMPLINGMODE);\r\n }\r\n\r\n public needAlphaBlending(): boolean {\r\n return false;\r\n }\r\n\r\n public needAlphaTesting(): boolean {\r\n return false;\r\n }\r\n\r\n public getAlphaTestTexture(): Nullable<BaseTexture> {\r\n return null;\r\n }\r\n\r\n public isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n if (this.isFrozen) {\r\n if (subMesh.effect && subMesh.effect._wasPreviouslyReady) {\r\n return true;\r\n }\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 MaterialHelper.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 MaterialHelper.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 MaterialHelper.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 = new Array<string>();\r\n\r\n MaterialHelper.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 subMesh.effect._wasPreviouslyReady = true;\r\n\r\n return true;\r\n }\r\n\r\n public 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);\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 getAnimatables(): IAnimatable[] {\r\n return [];\r\n }\r\n\r\n public 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 clone(name: string): FluentBackplateMaterial {\r\n return SerializationHelper.Clone(() => new FluentBackplateMaterial(name, this.getScene()), this);\r\n }\r\n\r\n public 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 getClassName(): string {\r\n return \"FluentBackplateMaterial\";\r\n }\r\n\r\n // Statics\r\n public static 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 { ContentDisplay3D } from \"./contentDisplay3D\";\r\nimport { Control3D } from \"./control3D\";\r\nimport { TouchHolographicButton } from \"./touchHolographicButton\";\r\nimport { AdvancedDynamicTexture } from \"../../2D/advancedDynamicTexture\";\r\nimport { Control } from \"../../2D/controls/control\";\r\nimport { TextBlock, TextWrapping } from \"../../2D/controls/textBlock\";\r\nimport { DefaultBehavior } from \"../behaviors/defaultBehavior\";\r\nimport { SlateGizmo } from \"../gizmos/slateGizmo\";\r\nimport { FluentMaterial } from \"../materials/fluent/fluentMaterial\";\r\nimport { FluentBackplateMaterial } from \"../materials/fluentBackplate/fluentBackplateMaterial\";\r\nimport { PointerDragBehavior } from \"core/Behaviors/Meshes/pointerDragBehavior\";\r\nimport { 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 { Matrix, Quaternion, Vector2, Vector3 } from \"core/Maths/math.vector\";\r\nimport { Viewport } from \"core/Maths/math.viewport\";\r\nimport { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { CreateBox } from \"core/Meshes/Builders/boxBuilder\";\r\nimport { CreatePlane } from \"core/Meshes/Builders/planeBuilder\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { VertexData } from \"core/Meshes/mesh.vertexData\";\r\nimport { Observer } from \"core/Misc/observable\";\r\nimport { Scene } from \"core/scene\";\r\nimport { Nullable } from \"core/types\";\r\n\r\n/**\r\n * Class used to create a holographic slate\r\n * @since 5.0.0\r\n */\r\nexport class HolographicSlate extends ContentDisplay3D {\r\n /**\r\n * Base Url for the assets.\r\n */\r\n public static ASSETS_BASE_URL: string = \"https://assets.babylonjs.com/meshes/MRTK/\";\r\n /**\r\n * File name for the close icon.\r\n */\r\n public static CLOSE_ICON_FILENAME: string = \"IconClose.png\";\r\n /**\r\n * File name for the close icon.\r\n */\r\n public static FOLLOW_ICON_FILENAME: string = \"IconFollowMe.png\";\r\n\r\n private static _DEFAULT_TEXT_RESOLUTION_Y = 102.4;\r\n\r\n /**\r\n * Margin between title bar and contentplate\r\n */\r\n public titleBarMargin = 0.005;\r\n\r\n /**\r\n * Origin in local coordinates (top left corner)\r\n */\r\n public origin = new Vector3(0, 0, 0);\r\n\r\n private _dimensions = new Vector2(21.875, 12.5);\r\n private _titleBarHeight = 0.625;\r\n\r\n private _titleBarMaterial: FluentBackplateMaterial;\r\n private _backMaterial: FluentBackplateMaterial;\r\n private _contentMaterial: FluentMaterial;\r\n private _pickedPointObserver: Nullable<Observer<Nullable<Vector3>>>;\r\n private _positionChangedObserver: Nullable<Observer<{ position: Vector3 }>>;\r\n\r\n private _titleText = \"\";\r\n private _titleTextComponent: TextBlock;\r\n\r\n private _contentViewport: Viewport;\r\n private _contentDragBehavior: PointerDragBehavior;\r\n\r\n private _defaultBehavior: DefaultBehavior;\r\n /**\r\n * Regroups all mesh behaviors for the slate\r\n */\r\n public get defaultBehavior(): DefaultBehavior {\r\n return this._defaultBehavior;\r\n }\r\n\r\n /** @hidden */\r\n public _gizmo: SlateGizmo;\r\n\r\n protected _titleBar: Mesh;\r\n protected _titleBarTitle: Mesh;\r\n protected _contentPlate: Mesh;\r\n protected _backPlate: Mesh;\r\n /** @hidden */\r\n public _followButton: TouchHolographicButton;\r\n protected _closeButton: TouchHolographicButton;\r\n protected _contentScaleRatio = 1;\r\n\r\n /**\r\n * 2D dimensions of the slate\r\n */\r\n public get dimensions() {\r\n return this._dimensions;\r\n }\r\n public set dimensions(value) {\r\n //clamp, respecting ratios\r\n let scale = 1.0;\r\n if (value.x < this.minDimensions.x || value.y < this.minDimensions.y) {\r\n const newRatio = value.x / value.y;\r\n const minRatio = this.minDimensions.x / this.minDimensions.y;\r\n if (minRatio > newRatio) {\r\n // We just need to make sure the x-val is greater than the min\r\n scale = this.minDimensions.x / value.x;\r\n } else {\r\n // We just need to make sure the y-val is greater than the min\r\n scale = this.minDimensions.y / value.y;\r\n }\r\n }\r\n\r\n this._dimensions.copyFrom(value).scaleInPlace(scale);\r\n this._updatePivot();\r\n this._positionElements();\r\n }\r\n\r\n /**\r\n * Minimum dimensions of the slate\r\n */\r\n public minDimensions = new Vector2(15.625, 6.25);\r\n\r\n /**\r\n * Default dimensions of the slate\r\n */\r\n public readonly defaultDimensions = this._dimensions.clone();\r\n\r\n /**\r\n * Height of the title bar component\r\n */\r\n public get titleBarHeight() {\r\n return this._titleBarHeight;\r\n }\r\n public set titleBarHeight(value) {\r\n this._titleBarHeight = value;\r\n }\r\n\r\n /**\r\n * Rendering ground id of all the meshes\r\n */\r\n public set renderingGroupId(id: number) {\r\n this._titleBar.renderingGroupId = id;\r\n this._titleBarTitle.renderingGroupId = id;\r\n this._contentPlate.renderingGroupId = id;\r\n this._backPlate.renderingGroupId = id;\r\n }\r\n public get renderingGroupId(): number {\r\n return this._titleBar.renderingGroupId;\r\n }\r\n\r\n /**\r\n * The title text displayed at the top of the slate\r\n */\r\n public set title(title: string) {\r\n this._titleText = title;\r\n if (this._titleTextComponent) {\r\n this._titleTextComponent.text = title;\r\n }\r\n }\r\n public get title() {\r\n return this._titleText;\r\n }\r\n\r\n /**\r\n * Creates a new slate\r\n * @param name defines the control name\r\n */\r\n constructor(name?: string) {\r\n super(name);\r\n\r\n this._followButton = new TouchHolographicButton(\"followButton\" + this.name);\r\n this._followButton.isToggleButton = true;\r\n this._closeButton = new TouchHolographicButton(\"closeButton\" + this.name);\r\n\r\n this._contentViewport = new Viewport(0, 0, 1, 1);\r\n this._contentDragBehavior = new PointerDragBehavior({\r\n dragPlaneNormal: new Vector3(0, 0, -1),\r\n });\r\n }\r\n\r\n /**\r\n * Apply the facade texture (created from the content property).\r\n * This function can be overloaded by child classes\r\n * @param facadeTexture defines the AdvancedDynamicTexture to use\r\n */\r\n protected _applyFacade(facadeTexture: AdvancedDynamicTexture) {\r\n this._contentMaterial.albedoTexture = facadeTexture;\r\n this._resetContentPositionAndZoom();\r\n this._applyContentViewport();\r\n\r\n facadeTexture.attachToMesh(this._contentPlate, true);\r\n }\r\n\r\n private _addControl(control: Control3D): void {\r\n control._host = this._host;\r\n if (this._host.utilityLayer) {\r\n control._prepareNode(this._host.utilityLayer.utilityLayerScene);\r\n }\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"HolographicSlate\";\r\n }\r\n\r\n /**\r\n * @hidden\r\n */\r\n public _positionElements() {\r\n const followButton = this._followButton;\r\n const closeButton = this._closeButton;\r\n const titleBar = this._titleBar;\r\n const titleBarTitle = this._titleBarTitle;\r\n const contentPlate = this._contentPlate;\r\n const backPlate = this._backPlate;\r\n\r\n if (followButton && closeButton && titleBar) {\r\n closeButton.scaling.setAll(this.titleBarHeight);\r\n followButton.scaling.setAll(this.titleBarHeight);\r\n closeButton.position.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._contentScaleRatio / this._contentViewport.width) * this._contentViewport.height;\r\n tex.uOffset = this._contentViewport.x;\r\n tex.vOffset = this._contentViewport.y;\r\n }\r\n }\r\n\r\n private _resetContentPositionAndZoom() {\r\n this._contentViewport.x = 0;\r\n this._contentViewport.y = 1 - this._contentViewport.height / this._contentViewport.width;\r\n this._contentScaleRatio = 1;\r\n }\r\n\r\n /**\r\n * @hidden\r\n */\r\n public _updatePivot() {\r\n if (!this.mesh) {\r\n return;\r\n }\r\n\r\n // Update pivot point so it is at the center of geometry\r\n // As origin is topleft corner in 2D, dimensions are calculated towards bottom right corner, thus y axis is downwards\r\n const center = new Vector3(this.dimensions.x * 0.5, -this.dimensions.y * 0.5, Epsilon);\r\n center.addInPlace(this.origin);\r\n center.z = 0;\r\n\r\n const origin = new Vector3(0, 0, 0);\r\n Vector3.TransformCoordinatesToRef(origin, this.mesh.computeWorldMatrix(true), origin);\r\n this.mesh.setPivotPoint(center);\r\n const origin2 = new Vector3(0, 0, 0);\r\n Vector3.TransformCoordinatesToRef(origin2, this.mesh.computeWorldMatrix(true), origin2);\r\n this.mesh.position.addInPlace(origin).subtractInPlace(origin2);\r\n }\r\n\r\n // Mesh association\r\n protected _createNode(scene: Scene): TransformNode {\r\n const node = new Mesh(\"slate_\" + this.name, scene);\r\n\r\n this._titleBar = CreateBox(\"titleBar_\" + this.name, { size: 1 }, scene);\r\n this._titleBarTitle = CreatePlane(\"titleText_\" + this.name, { size: 1 }, scene);\r\n this._titleBarTitle.parent = node;\r\n this._titleBarTitle.isPickable = false;\r\n\r\n 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\r\n this._followButton.imageUrl = HolographicSlate.ASSETS_BASE_URL + HolographicSlate.FOLLOW_ICON_FILENAME;\r\n this._closeButton.imageUrl = HolographicSlate.ASSETS_BASE_URL + HolographicSlate.CLOSE_ICON_FILENAME;\r\n\r\n this._followButton.isBackplateVisible = false;\r\n this._closeButton.isBackplateVisible = false;\r\n\r\n this._followButton.onToggleObservable.add((isToggled) => {\r\n this._defaultBehavior.followBehaviorEnabled = isToggled;\r\n if (this._defaultBehavior.followBehaviorEnabled) {\r\n this._defaultBehavior.followBehavior.recenter();\r\n }\r\n });\r\n\r\n this._closeButton.onPointerClickObservable.add(() => {\r\n this.dispose();\r\n });\r\n\r\n node.rotationQuaternion = Quaternion.Identity();\r\n node.isVisible = false;\r\n\r\n return node;\r\n }\r\n\r\n private _attachContentPlateBehavior() {\r\n this._contentDragBehavior.attach(this._contentPlate);\r\n this._contentDragBehavior.moveAttached = false;\r\n this._contentDragBehavior.useObjectOrientationForDragging = true;\r\n this._contentDragBehavior.updateDragPlane = false;\r\n\r\n const origin = new Vector3();\r\n const worldDimensions = new Vector3();\r\n const upWorld = new Vector3();\r\n const rightWorld = new Vector3();\r\n const projectedOffset = new Vector2();\r\n let startViewport: Viewport;\r\n let worldMatrix: Matrix;\r\n\r\n this._contentDragBehavior.onDragStartObservable.add((event) => {\r\n if (!this.node) {\r\n return;\r\n }\r\n startViewport = this._contentViewport.clone();\r\n worldMatrix = this.node.computeWorldMatrix(true);\r\n\r\n origin.copyFrom(event.dragPlanePoint);\r\n worldDimensions.set(this.dimensions.x, this.dimensions.y, Epsilon);\r\n worldDimensions.y -= this.titleBarHeight + this.titleBarMargin;\r\n Vector3.TransformNormalToRef(worldDimensions, worldMatrix, worldDimensions);\r\n upWorld.copyFromFloats(0, 1, 0);\r\n Vector3.TransformNormalToRef(upWorld, worldMatrix, upWorld);\r\n rightWorld.copyFromFloats(1, 0, 0);\r\n Vector3.TransformNormalToRef(rightWorld, worldMatrix, rightWorld);\r\n upWorld.normalize();\r\n upWorld.scaleInPlace(1 / Vector3.Dot(upWorld, worldDimensions));\r\n rightWorld.normalize();\r\n rightWorld.scaleInPlace(1 / Vector3.Dot(rightWorld, worldDimensions));\r\n });\r\n\r\n const offset = new Vector3();\r\n this._contentDragBehavior.onDragObservable.add((event) => {\r\n offset.copyFrom(event.dragPlanePoint);\r\n offset.subtractInPlace(origin);\r\n projectedOffset.copyFromFloats(Vector3.Dot(offset, rightWorld), Vector3.Dot(offset, upWorld));\r\n\r\n // By default, content takes full width available and height is cropped to keep aspect ratio\r\n this._contentViewport.x = Scalar.Clamp(startViewport.x - offset.x, 0, 1 - this._contentViewport.width * this._contentScaleRatio);\r\n this._contentViewport.y = Scalar.Clamp(startViewport.y - offset.y, 0, 1 - this._contentViewport.height * this._contentScaleRatio);\r\n this._applyContentViewport();\r\n });\r\n }\r\n\r\n protected _affectMaterial(mesh: AbstractMesh) {\r\n // TODO share materials\r\n this._titleBarMaterial = new FluentBackplateMaterial(`${this.name} plateMaterial`, mesh.getScene());\r\n\r\n this._contentMaterial = new FluentMaterial(`${this.name} contentMaterial`, mesh.getScene());\r\n this._contentMaterial.renderBorders = true;\r\n\r\n this._backMaterial = new FluentBackplateMaterial(`${this.name} backPlate`, mesh.getScene());\r\n this._backMaterial.lineWidth = Epsilon;\r\n this._backMaterial.radius = 0.005;\r\n this._backMaterial.backFaceCulling = true;\r\n\r\n this._titleBar.material = this._titleBarMaterial;\r\n this._contentPlate.material = this._contentMaterial;\r\n this._backPlate.material = this._backMaterial;\r\n\r\n this._resetContent();\r\n this._applyContentViewport();\r\n }\r\n\r\n /**\r\n * @param scene\r\n * @hidden*\r\n */\r\n public _prepareNode(scene: Scene): void {\r\n super._prepareNode(scene);\r\n this._gizmo = new SlateGizmo(this._host.utilityLayer!);\r\n this._gizmo.attachedSlate = this;\r\n this._defaultBehavior = new DefaultBehavior();\r\n this._defaultBehavior.attach(this.node as Mesh, [this._titleBar]);\r\n this._defaultBehavior.sixDofDragBehavior.onDragStartObservable.add(() => {\r\n this._followButton.isToggled = false;\r\n });\r\n\r\n this._positionChangedObserver = this._defaultBehavior.sixDofDragBehavior.onPositionChangedObservable.add(() => {\r\n this._gizmo.updateBoundingBox();\r\n });\r\n\r\n this._updatePivot();\r\n this.resetDefaultAspectAndPose(false);\r\n }\r\n\r\n /**\r\n * Resets the aspect and pose of the slate so it is right in front of the active camera, facing towards it.\r\n * @param resetAspect Should the slate's dimensions/aspect ratio be reset as well\r\n */\r\n public resetDefaultAspectAndPose(resetAspect: boolean = true) {\r\n if (!this._host || !this._host.utilityLayer || !this.node) {\r\n return;\r\n }\r\n const scene = this._host.utilityLayer.utilityLayerScene;\r\n const camera = scene.activeCamera;\r\n if (camera) {\r\n const worldMatrix = camera.getWorldMatrix();\r\n const backward = Vector3.TransformNormal(Vector3.Backward(scene.useRightHandedSystem), worldMatrix);\r\n this.origin.setAll(0);\r\n this._gizmo.updateBoundingBox();\r\n const pivot = this.node.getAbsolutePivotPoint();\r\n this.node.position.copyFrom(camera.position).subtractInPlace(backward).subtractInPlace(pivot);\r\n this.node.rotationQuaternion = Quaternion.FromLookDirectionLH(backward, new Vector3(0, 1, 0));\r\n\r\n if (resetAspect) {\r\n this.dimensions = this.defaultDimensions;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Releases all associated resources\r\n */\r\n public dispose() {\r\n super.dispose();\r\n this._titleBarMaterial.dispose();\r\n this._contentMaterial.dispose();\r\n\r\n this._titleBar.dispose();\r\n this._titleBarTitle.dispose();\r\n this._contentPlate.dispose();\r\n this._backPlate.dispose();\r\n\r\n this._followButton.dispose();\r\n this._closeButton.dispose();\r\n\r\n this._host.onPickedPointChangedObservable.remove(this._pickedPointObserver);\r\n this._defaultBehavior.sixDofDragBehavior.onPositionChangedObservable.remove(this._positionChangedObserver);\r\n\r\n this._defaultBehavior.detach();\r\n this._gizmo.dispose();\r\n this._contentDragBehavior.detach();\r\n }\r\n}\r\n","import { Scene } from \"core/scene\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Nullable } from \"core/types\";\r\nimport { 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 { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { FluentMaterial } from \"../materials/fluent/fluentMaterial\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Observer } from \"core/Misc/observable\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { Container3D } from \"./container3D\";\r\nimport { 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 this.children.forEach((control) => {\r\n this._updateCurrentMinMax(control.position);\r\n });\r\n\r\n this._updateMargins();\r\n }\r\n }\r\n\r\n protected _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 _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 _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\r\n * @returns\r\n */\r\n public 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 dispose() {\r\n super.dispose();\r\n\r\n this._host.onPickedPointChangedObservable.remove(this._pickedPointObserver);\r\n }\r\n}\r\n","import { Scene } from \"core/scene\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Nullable } from \"core/types\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { TouchHolographicMenu } from \"./touchHolographicMenu\";\r\nimport { HandConstraintBehavior } from \"core/Behaviors/Meshes/handConstraintBehavior\";\r\nimport { 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 _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 dispose() {\r\n super.dispose();\r\n\r\n this._handConstraintBehavior.detach();\r\n }\r\n}\r\n","import { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { 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 /** @hidden */\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 _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 _createNode(scene: Scene): TransformNode {\r\n this._currentMesh.getChildMeshes().forEach((mesh) => {\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 _affectMaterial(mesh: AbstractMesh) {}\r\n}\r\n","import { Scene } from \"core/scene\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Nullable } from \"core/types\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { TouchHolographicButton } from \"./touchHolographicButton\";\r\nimport { DefaultBehavior } from \"../behaviors/defaultBehavior\";\r\nimport { TouchHolographicMenu } from \"./touchHolographicMenu\";\r\nimport { Observer } from \"core/Misc/observable\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { PickingInfo } from \"core/Collisions/pickingInfo\";\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/meshes/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 control.imageUrl = NearMenu._ASSETS_BASE_URL + 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 _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 _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 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 { 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 { float } from \"core/types\";\r\n\r\nimport { VolumeBasedPanel } from \"./volumeBasedPanel\";\r\nimport { 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 _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;\rvarying vec3 vPosition;\rvarying vec3 vNormal;\rvarying vec2 vUV;\rvarying vec3 vTangent;\rvarying vec3 vBinormal;\rvarying vec4 vColor;\rvarying vec4 vExtra1;\rvarying vec4 vExtra2;\rvarying vec4 vExtra3;\runiform float _Radius_;\runiform float _Bevel_Front_;\runiform float _Bevel_Front_Stretch_;\runiform float _Bevel_Back_;\runiform float _Bevel_Back_Stretch_;\runiform float _Radius_Top_Left_;\runiform float _Radius_Top_Right_;\runiform float _Radius_Bottom_Left_;\runiform float _Radius_Bottom_Right_;\runiform bool _Bulge_Enabled_;\runiform float _Bulge_Height_;\runiform float _Bulge_Radius_;\runiform float _Sun_Intensity_;\runiform float _Sun_Theta_;\runiform float _Sun_Phi_;\runiform float _Indirect_Diffuse_;\runiform vec4 _Albedo_;\runiform float _Specular_;\runiform float _Shininess_;\runiform float _Sharpness_;\runiform float _Subsurface_;\runiform vec4 _Left_Color_;\runiform vec4 _Right_Color_;\runiform float _Reflection_;\runiform float _Front_Reflect_;\runiform float _Edge_Reflect_;\runiform float _Power_;\runiform vec4 _Sky_Color_;\runiform vec4 _Horizon_Color_;\runiform vec4 _Ground_Color_;\runiform float _Horizon_Power_;\runiform sampler2D _Reflection_Map_;\runiform sampler2D _Indirect_Environment_;\runiform float _Width_;\runiform float _Fuzz_;\runiform float _Min_Fuzz_;\runiform float _Clip_Fade_;\runiform float _Hue_Shift_;\runiform float _Saturation_Shift_;\runiform float _Value_Shift_;\runiform vec3 _Blob_Position_;\runiform float _Blob_Intensity_;\runiform float _Blob_Near_Size_;\runiform float _Blob_Far_Size_;\runiform float _Blob_Near_Distance_;\runiform float _Blob_Far_Distance_;\runiform float _Blob_Fade_Length_;\runiform float _Blob_Pulse_;\runiform float _Blob_Fade_;\runiform sampler2D _Blob_Texture_;\runiform vec3 _Blob_Position_2_;\runiform float _Blob_Near_Size_2_;\runiform float _Blob_Pulse_2_;\runiform float _Blob_Fade_2_;\runiform vec3 _Left_Index_Pos_;\runiform vec3 _Right_Index_Pos_;\runiform vec3 _Left_Index_Middle_Pos_;\runiform vec3 _Right_Index_Middle_Pos_;\runiform sampler2D _Decal_;\runiform vec2 _Decal_Scale_XY_;\runiform bool _Decal_Front_Only_;\runiform float _Rim_Intensity_;\runiform sampler2D _Rim_Texture_;\runiform float _Rim_Hue_Shift_;\runiform float _Rim_Saturation_Shift_;\runiform float _Rim_Value_Shift_;\runiform float _Iridescence_Intensity_;\runiform sampler2D _Iridescence_Texture_;\runiform bool Use_Global_Left_Index;\runiform bool Use_Global_Right_Index;\runiform vec4 Global_Left_Index_Tip_Position;\runiform vec4 Global_Right_Index_Tip_Position;\runiform vec4 Global_Left_Thumb_Tip_Position;\runiform vec4 Global_Right_Thumb_Tip_Position;\runiform vec4 Global_Left_Index_Middle_Position;\runiform vec4 Global_Right_Index_Middle_Position;\runiform float Global_Left_Index_Tip_Proximity;\runiform float Global_Right_Index_Tip_Proximity;\rvoid Blob_Fragment_B30(\rsampler2D Blob_Texture,\rvec4 Blob_Info1,\rvec4 Blob_Info2,\rout vec4 Blob_Color)\r{\rfloat k1=dot(Blob_Info1.xy,Blob_Info1.xy);\rfloat k2=dot(Blob_Info2.xy,Blob_Info2.xy);\rvec3 closer=k1<k2 ? vec3(k1,Blob_Info1.z,Blob_Info1.w) : vec3(k2,Blob_Info2.z,Blob_Info2.w);\rBlob_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);\r}\rvoid FastLinearTosRGB_B42(\rvec4 Linear,\rout vec4 sRGB)\r{\rsRGB.rgb=sqrt(clamp(Linear.rgb,0.0,1.0));\rsRGB.a=Linear.a;\r}\rvoid Scale_RGB_B59(\rvec4 Color,\rfloat Scalar,\rout vec4 Result)\r{\rResult=vec4(Scalar,Scalar,Scalar,1)*Color;\r}\rvoid Fragment_Main_B121(\rfloat Sun_Intensity,\rfloat Sun_Theta,\rfloat Sun_Phi,\rvec3 Normal,\rvec4 Albedo,\rfloat Fresnel_Reflect,\rfloat Shininess,\rvec3 Incident,\rvec4 Horizon_Color,\rvec4 Sky_Color,\rvec4 Ground_Color,\rfloat Indirect_Diffuse,\rfloat Specular,\rfloat Horizon_Power,\rfloat Reflection,\rvec4 Reflection_Sample,\rvec4 Indirect_Sample,\rfloat Sharpness,\rfloat SSS,\rfloat Subsurface,\rvec4 Translucence,\rvec4 Rim_Light,\rvec4 Iridescence,\rout vec4 Result)\r{\rfloat theta=Sun_Theta*2.0*3.14159;\rfloat phi=Sun_Phi*3.14159;\rvec3 lightDir= vec3(cos(phi)*cos(theta),sin(phi),cos(phi)*sin(theta));\rfloat NdotL=max(dot(lightDir,Normal),0.0);\rvec3 R=reflect(Incident,Normal);\rfloat RdotL=max(0.0,dot(R,lightDir));\rfloat specular=pow(RdotL,Shininess);\rspecular=mix(specular,smoothstep(0.495*Sharpness,1.0-0.495*Sharpness,specular),Sharpness);\rvec4 gi=mix(Ground_Color,Sky_Color,Normal.y*0.5+0.5);\rResult=((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;\r}\rvoid Bulge_B79(\rbool Enabled,\rvec3 Normal,\rvec3 Tangent,\rfloat Bulge_Height,\rvec4 UV,\rfloat Bulge_Radius,\rvec3 ButtonN,\rout vec3 New_Normal)\r{\rvec2 xy=clamp(UV.xy*2.0,vec2(-1,-1),vec2(1,1));\rvec3 B=(cross(Normal,Tangent));\rfloat k=-clamp(1.0-length(xy)/Bulge_Radius,0.0,1.0)*Bulge_Height;\rk=sin(k*3.14159*0.5);\rk*=smoothstep(0.9998,0.9999,abs(dot(ButtonN,Normal)));\rNew_Normal=Normal*sqrt(1.0-k*k)+(xy.x*Tangent+xy.y*B)*k;\rNew_Normal=Enabled ? New_Normal : Normal;\r}\rvoid SSS_B77(\rvec3 ButtonN,\rvec3 Normal,\rvec3 Incident,\rout float Result)\r{\rfloat NdotI=abs(dot(Normal,Incident));\rfloat BdotI=abs(dot(ButtonN,Incident));\rResult=(abs(NdotI-BdotI)); \r}\rvoid FingerOcclusion_B67(\rfloat Width,\rfloat DistToCenter,\rfloat Fuzz,\rfloat Min_Fuzz,\rvec3 Position,\rvec3 Forward,\rvec3 Nearest,\rfloat Fade_Out,\rout float NotInShadow)\r{\rfloat d=dot((Nearest-Position),Forward);\rfloat sh=smoothstep(Width*0.5,Width*0.5+Fuzz*max(d,0.0)+Min_Fuzz,DistToCenter);\rNotInShadow=1.0-(1.0-sh)*smoothstep(-Fade_Out,0.0,d);\r}\rvoid FingerOcclusion_B68(\rfloat Width,\rfloat DistToCenter,\rfloat Fuzz,\rfloat Min_Fuzz,\rvec3 Position,\rvec3 Forward,\rvec3 Nearest,\rfloat Fade_Out,\rout float NotInShadow)\r{\rfloat d=dot((Nearest-Position),Forward);\rfloat sh=smoothstep(Width*0.5,Width*0.5+Fuzz*max(d,0.0)+Min_Fuzz,DistToCenter);\rNotInShadow=1.0-(1.0-sh)*smoothstep(-Fade_Out,0.0,d);\r}\rvoid Scale_Color_B91(\rvec4 Color,\rfloat Scalar,\rout vec4 Result)\r{\rResult=Scalar*Color;\r}\rvoid From_HSV_B73(\rfloat Hue,\rfloat Saturation,\rfloat Value,\rfloat Alpha,\rout vec4 Color)\r{\rvec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);\rvec3 p=abs(fract(vec3(Hue,Hue,Hue)+K.xyz)*6.0-K.www);\rColor.rgb=Value*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),Saturation);\rColor.a=Alpha;\r}\rvoid Fast_Fresnel_B122(\rfloat Front_Reflect,\rfloat Edge_Reflect,\rfloat Power,\rvec3 Normal,\rvec3 Incident,\rout float Transmit,\rout float Reflect)\r{\rfloat d=max(-dot(Incident,Normal),0.0);\rReflect=Front_Reflect+(Edge_Reflect-Front_Reflect)*pow(.01-d,Power);\rTransmit=1.0-Reflect;\r}\rvoid Mapped_Environment_B51(\rsampler2D Reflected_Environment,\rsampler2D Indirect_Environment,\rvec3 Dir,\rout vec4 Reflected_Color,\rout vec4 Indirect_Diffuse)\r{\rReflected_Color=texture(Reflected_Environment,vec2(atan(Dir.z,Dir.x)/3.14159*0.5,asin(Dir.y)/3.14159+0.5));\rIndirect_Diffuse=texture(Indirect_Environment,vec2(atan(Dir.z,Dir.x)/3.14159*0.5,asin(Dir.y)/3.14159+0.5));\r}\rvec4 SampleEnv_Bid50(vec3 D,vec4 S,vec4 H,vec4 G,float exponent)\r{\rfloat k=pow(abs(D.y),exponent);\rvec4 C;\rif (D.y>0.0) {\rC=mix(H,S,k);\r} else {\rC=mix(H,G,k); \r}\rreturn C;\r}\rvoid Sky_Environment_B50(\rvec3 Normal,\rvec3 Reflected,\rvec4 Sky_Color,\rvec4 Horizon_Color,\rvec4 Ground_Color,\rfloat Horizon_Power,\rout vec4 Reflected_Color,\rout vec4 Indirect_Color)\r{\rReflected_Color=SampleEnv_Bid50(Reflected,Sky_Color,Horizon_Color,Ground_Color,Horizon_Power);\rIndirect_Color=mix(Ground_Color,Sky_Color,Normal.y*0.5+0.5);\r}\rvoid Min_Segment_Distance_B65(\rvec3 P0,\rvec3 P1,\rvec3 Q0,\rvec3 Q1,\rout vec3 NearP,\rout vec3 NearQ,\rout float Distance)\r{\rvec3 u=P1-P0;\rvec3 v=Q1-Q0;\rvec3 w=P0-Q0;\rfloat a=dot(u,u);\rfloat b=dot(u,v);\rfloat c=dot(v,v);\rfloat d=dot(u,w);\rfloat e=dot(v,w);\rfloat D=a*c-b*b;\rfloat sD=D;\rfloat tD=D;\rfloat sc,sN,tc,tN;\rif (D<0.00001) {\rsN=0.0;\rsD=1.0;\rtN=e;\rtD=c;\r} else {\rsN=(b*e-c*d);\rtN=(a*e-b*d);\rif (sN<0.0) {\rsN=0.0;\rtN=e;\rtD=c;\r} else if (sN>sD) {\rsN=sD;\rtN=e+b;\rtD=c;\r}\r}\rif (tN<0.0) {\rtN=0.0;\rif (-d<0.0) {\rsN=0.0;\r} else if (-d>a) {\rsN=sD;\r} else {\rsN=-d;\rsD=a;\r}\r} else if (tN>tD) {\rtN=tD;\rif ((-d+b)<0.0) {\rsN=0.0;\r} else if ((-d+b)>a) {\rsN=sD;\r} else {\rsN=(-d+b);\rsD=a;\r}\r}\rsc=abs(sN)<0.000001 ? 0.0 : sN/sD;\rtc=abs(tN)<0.000001 ? 0.0 : tN/tD;\rNearP=P0+sc*u;\rNearQ=Q0+tc*v;\rDistance=distance(NearP,NearQ);\r}\rvoid To_XYZ_B74(\rvec3 Vec3,\rout float X,\rout float Y,\rout float Z)\r{\rX=Vec3.x;\rY=Vec3.y;\rZ=Vec3.z;\r}\rvoid Finger_Positions_B64(\rvec3 Left_Index_Pos,\rvec3 Right_Index_Pos,\rvec3 Left_Index_Middle_Pos,\rvec3 Right_Index_Middle_Pos,\rout vec3 Left_Index,\rout vec3 Right_Index,\rout vec3 Left_Index_Middle,\rout vec3 Right_Index_Middle)\r{\rLeft_Index= (Use_Global_Left_Index ? Global_Left_Index_Tip_Position.xyz : Left_Index_Pos);\rRight_Index= (Use_Global_Right_Index ? Global_Right_Index_Tip_Position.xyz : Right_Index_Pos);\rLeft_Index_Middle= (Use_Global_Left_Index ? Global_Left_Index_Middle_Position.xyz : Left_Index_Middle_Pos);\rRight_Index_Middle= (Use_Global_Right_Index ? Global_Right_Index_Middle_Position.xyz : Right_Index_Middle_Pos);\r}\rvoid VaryHSV_B108(\rvec3 HSV_In,\rfloat Hue_Shift,\rfloat Saturation_Shift,\rfloat Value_Shift,\rout vec3 HSV_Out)\r{\rHSV_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));\r}\rvoid Remap_Range_B114(\rfloat In_Min,\rfloat In_Max,\rfloat Out_Min,\rfloat Out_Max,\rfloat In,\rout float Out)\r{\rOut=mix(Out_Min,Out_Max,clamp((In-In_Min)/(In_Max-In_Min),0.0,1.0));\r}\rvoid To_HSV_B75(\rvec4 Color,\rout float Hue,\rout float Saturation,\rout float Value,\rout float Alpha,\rout vec3 HSV)\r{\rvec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);\rvec4 p=Color.g<Color.b ? vec4(Color.bg,K.wz) : vec4(Color.gb,K.xy);\rvec4 q=Color.r<p.x ? vec4(p.xyw,Color.r) : vec4(Color.r,p.yzx);\rfloat d=q.x-min(q.w,q.y);\rfloat e=1.0e-10;\rHue=abs(q.z+(q.w-q.y)/(6.0*d+e));\rSaturation=d/(q.x+e);\rValue=q.x;\rAlpha=Color.a;\rHSV=vec3(Hue,Saturation,Value);\r}\rvoid Code_B110(\rfloat X,\rout float Result)\r{\rResult=(acos(X)/3.14159-0.5)*2.0;\r}\rvoid Rim_Light_B132(\rvec3 Front,\rvec3 Normal,\rvec3 Incident,\rfloat Rim_Intensity,\rsampler2D Texture,\rout vec4 Result)\r{\rvec3 R=reflect(Incident,Normal);\rfloat RdotF=dot(R,Front);\rfloat RdotL=sqrt(1.0-RdotF*RdotF);\rvec2 UV=vec2(R.y*0.5+0.5,0.5);\rvec4 Color=texture(Texture,UV);\rResult=Color;\r}\rvoid main()\r{\rvec4 Blob_Color_Q30;\r#if BLOB_ENABLE\nBlob_Fragment_B30(_Blob_Texture_,vExtra2,vExtra3,Blob_Color_Q30);\r#else\nBlob_Color_Q30=vec4(0,0,0,0);\r#endif\nvec3 Incident_Q39=normalize(vPosition-cameraPosition);\rvec3 Normalized_Q38=normalize(vNormal);\rvec3 Normalized_Q71=normalize(vTangent);\rvec4 Color_Q83;\r#if DECAL_ENABLE\nColor_Q83=texture(_Decal_,vUV);\r#else\nColor_Q83=vec4(0,0,0,0);\r#endif\nfloat X_Q90;\rfloat Y_Q90;\rfloat Z_Q90;\rfloat W_Q90;\rX_Q90=vExtra1.x;\rY_Q90=vExtra1.y;\rZ_Q90=vExtra1.z;\rW_Q90=vExtra1.w;\rvec4 Linear_Q43;\rLinear_Q43.rgb=clamp(_Sky_Color_.rgb*_Sky_Color_.rgb,0.0,1.0);\rLinear_Q43.a=_Sky_Color_.a;\rvec4 Linear_Q44;\rLinear_Q44.rgb=clamp(_Horizon_Color_.rgb*_Horizon_Color_.rgb,0.0,1.0);\rLinear_Q44.a=_Horizon_Color_.a;\rvec4 Linear_Q45;\rLinear_Q45.rgb=clamp(_Ground_Color_.rgb*_Ground_Color_.rgb,0.0,1.0);\rLinear_Q45.a=_Ground_Color_.a;\rvec3 Left_Index_Q64;\rvec3 Right_Index_Q64;\rvec3 Left_Index_Middle_Q64;\rvec3 Right_Index_Middle_Q64;\rFinger_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);\rvec4 Linear_Q46;\rLinear_Q46.rgb=clamp(_Albedo_.rgb*_Albedo_.rgb,0.0,1.0);\rLinear_Q46.a=_Albedo_.a;\rvec3 Normalized_Q107=normalize(vBinormal);\rvec3 Incident_Q70=normalize(vPosition-cameraPosition);\rvec3 New_Normal_Q79;\rBulge_B79(_Bulge_Enabled_,Normalized_Q38,Normalized_Q71,_Bulge_Height_,vColor,_Bulge_Radius_,vBinormal,New_Normal_Q79);\rfloat Result_Q77;\rSSS_B77(vBinormal,New_Normal_Q79,Incident_Q39,Result_Q77);\rvec4 Result_Q91;\rScale_Color_B91(Color_Q83,X_Q90,Result_Q91);\rfloat Transmit_Q122;\rfloat Reflect_Q122;\rFast_Fresnel_B122(_Front_Reflect_,_Edge_Reflect_,_Power_,New_Normal_Q79,Incident_Q39,Transmit_Q122,Reflect_Q122);\rfloat Product_Q125=Y_Q90*Y_Q90;\rvec3 NearP_Q65;\rvec3 NearQ_Q65;\rfloat Distance_Q65;\rMin_Segment_Distance_B65(Left_Index_Q64,Left_Index_Middle_Q64,vPosition,cameraPosition,NearP_Q65,NearQ_Q65,Distance_Q65);\rvec3 NearP_Q63;\rvec3 NearQ_Q63;\rfloat Distance_Q63;\rMin_Segment_Distance_B65(Right_Index_Q64,Right_Index_Middle_Q64,vPosition,cameraPosition,NearP_Q63,NearQ_Q63,Distance_Q63);\rvec3 Reflected_Q47=reflect(Incident_Q39,New_Normal_Q79);\rvec4 Product_Q103=Linear_Q46*vec4(1,1,1,1);\rvec4 Result_Q132;\rRim_Light_B132(Normalized_Q107,Normalized_Q38,Incident_Q70,_Rim_Intensity_,_Rim_Texture_,Result_Q132);\rfloat Dot_Q72=dot(Incident_Q70, Normalized_Q71);\rfloat MaxAB_Q123=max(Reflect_Q122,Product_Q125);\rfloat NotInShadow_Q67;\r#if OCCLUSION_ENABLED\nFingerOcclusion_B67(_Width_,Distance_Q65,_Fuzz_,_Min_Fuzz_,vPosition,vBinormal,NearP_Q65,_Clip_Fade_,NotInShadow_Q67);\r#else\nNotInShadow_Q67=1.0;\r#endif\nfloat NotInShadow_Q68;\r#if OCCLUSION_ENABLED\nFingerOcclusion_B68(_Width_,Distance_Q63,_Fuzz_,_Min_Fuzz_,vPosition,vBinormal,NearP_Q63,_Clip_Fade_,NotInShadow_Q68);\r#else\nNotInShadow_Q68=1.0;\r#endif\nvec4 Reflected_Color_Q51;\rvec4 Indirect_Diffuse_Q51;\r#if ENV_ENABLE\nMapped_Environment_B51(_Reflection_Map_,_Indirect_Environment_,Reflected_Q47,Reflected_Color_Q51,Indirect_Diffuse_Q51);\r#else\nReflected_Color_Q51=vec4(0,0,0,1);\rIndirect_Diffuse_Q51=vec4(0,0,0,1);\r#endif\nvec4 Reflected_Color_Q50;\rvec4 Indirect_Color_Q50;\r#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);\r#else\nReflected_Color_Q50=vec4(0,0,0,1);\rIndirect_Color_Q50=vec4(0,0,0,1);\r#endif\nfloat Hue_Q75;\rfloat Saturation_Q75;\rfloat Value_Q75;\rfloat Alpha_Q75;\rvec3 HSV_Q75;\rTo_HSV_B75(Product_Q103,Hue_Q75,Saturation_Q75,Value_Q75,Alpha_Q75,HSV_Q75);\rfloat Hue_Q127;\rfloat Saturation_Q127;\rfloat Value_Q127;\rfloat Alpha_Q127;\rvec3 HSV_Q127;\rTo_HSV_B75(Result_Q132,Hue_Q127,Saturation_Q127,Value_Q127,Alpha_Q127,HSV_Q127);\rfloat Result_Q110;\rCode_B110(Dot_Q72,Result_Q110);\rfloat AbsA_Q76=abs(Result_Q110);\rfloat MinAB_Q58=min(NotInShadow_Q67,NotInShadow_Q68);\rvec4 Sum_Q48=Reflected_Color_Q51+Reflected_Color_Q50;\rvec4 Sum_Q49=Indirect_Diffuse_Q51+Indirect_Color_Q50;\rvec3 HSV_Out_Q126;\rVaryHSV_B108(HSV_Q127,_Rim_Hue_Shift_,_Rim_Saturation_Shift_,_Rim_Value_Shift_,HSV_Out_Q126);\rfloat Out_Q114;\rRemap_Range_B114(-1.0,1.0,0.0,1.0,Result_Q110,Out_Q114);\rfloat Product_Q106;\rProduct_Q106=AbsA_Q76*_Hue_Shift_;\rfloat X_Q128;\rfloat Y_Q128;\rfloat Z_Q128;\rTo_XYZ_B74(HSV_Out_Q126,X_Q128,Y_Q128,Z_Q128);\rvec2 Vec2_Q112=vec2(Out_Q114,0.5);\rvec3 HSV_Out_Q108;\rVaryHSV_B108(HSV_Q75,Product_Q106,_Saturation_Shift_,_Value_Shift_,HSV_Out_Q108);\rvec4 Color_Q129;\rFrom_HSV_B73(X_Q128,Y_Q128,Z_Q128,0.0,Color_Q129);\rvec4 Color_Q111;\r#if IRIDESCENCE_ENABLED\nColor_Q111=texture(_Iridescence_Texture_,Vec2_Q112);\r#else\nColor_Q111=vec4(0,0,0,0);\r#endif\nfloat X_Q74;\rfloat Y_Q74;\rfloat Z_Q74;\rTo_XYZ_B74(HSV_Out_Q108,X_Q74,Y_Q74,Z_Q74);\rvec4 Result_Q131=_Rim_Intensity_*Color_Q129;\rvec4 Result_Q113=_Iridescence_Intensity_*Color_Q111;\rvec4 Color_Q73;\rFrom_HSV_B73(X_Q74,Y_Q74,Z_Q74,0.0,Color_Q73);\rvec4 Result_Q84=Result_Q91+(1.0-Result_Q91.a)*Color_Q73;\rvec4 Result_Q121;\rFragment_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);\rvec4 Result_Q59;\rScale_RGB_B59(Result_Q121,MinAB_Q58,Result_Q59);\rvec4 sRGB_Q42;\rFastLinearTosRGB_B42(Result_Q59,sRGB_Q42);\rvec4 Result_Q31=Blob_Color_Q30+(1.0-Blob_Color_Q30.a)*sRGB_Q42;\rvec4 Result_Q40=Result_Q31; Result_Q40.a=1.0;\rvec4 Out_Color=Result_Q40;\rfloat Clip_Threshold=0.001;\rbool To_sRGB=false;\rgl_FragColor=Out_Color;\r}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @hidden */\nexport const mrdlSliderBarPixelShader = { name, shader };\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"mrdlSliderBarVertexShader\";\nconst shader = `uniform mat4 world;\runiform mat4 viewProjection;\runiform vec3 cameraPosition;\rattribute vec3 position;\rattribute vec3 normal;\rattribute vec2 uv;\r#ifdef TANGENT\nattribute vec3 tangent;\r#else\nconst vec3 tangent=vec3(0.);\r#endif\nuniform float _Radius_;\runiform float _Bevel_Front_;\runiform float _Bevel_Front_Stretch_;\runiform float _Bevel_Back_;\runiform float _Bevel_Back_Stretch_;\runiform float _Radius_Top_Left_;\runiform float _Radius_Top_Right_;\runiform float _Radius_Bottom_Left_;\runiform float _Radius_Bottom_Right_;\runiform bool _Bulge_Enabled_;\runiform float _Bulge_Height_;\runiform float _Bulge_Radius_;\runiform float _Sun_Intensity_;\runiform float _Sun_Theta_;\runiform float _Sun_Phi_;\runiform float _Indirect_Diffuse_;\runiform vec4 _Albedo_;\runiform float _Specular_;\runiform float _Shininess_;\runiform float _Sharpness_;\runiform float _Subsurface_;\runiform vec4 _Left_Color_;\runiform vec4 _Right_Color_;\runiform float _Reflection_;\runiform float _Front_Reflect_;\runiform float _Edge_Reflect_;\runiform float _Power_;\runiform vec4 _Sky_Color_;\runiform vec4 _Horizon_Color_;\runiform vec4 _Ground_Color_;\runiform float _Horizon_Power_;\runiform sampler2D _Reflection_Map_;\runiform sampler2D _Indirect_Environment_;\runiform float _Width_;\runiform float _Fuzz_;\runiform float _Min_Fuzz_;\runiform float _Clip_Fade_;\runiform float _Hue_Shift_;\runiform float _Saturation_Shift_;\runiform float _Value_Shift_;\runiform vec3 _Blob_Position_;\runiform float _Blob_Intensity_;\runiform float _Blob_Near_Size_;\runiform float _Blob_Far_Size_;\runiform float _Blob_Near_Distance_;\runiform float _Blob_Far_Distance_;\runiform float _Blob_Fade_Length_;\runiform float _Blob_Pulse_;\runiform float _Blob_Fade_;\runiform sampler2D _Blob_Texture_;\runiform vec3 _Blob_Position_2_;\runiform float _Blob_Near_Size_2_;\runiform float _Blob_Pulse_2_;\runiform float _Blob_Fade_2_;\runiform vec3 _Left_Index_Pos_;\runiform vec3 _Right_Index_Pos_;\runiform vec3 _Left_Index_Middle_Pos_;\runiform vec3 _Right_Index_Middle_Pos_;\runiform sampler2D _Decal_;\runiform vec2 _Decal_Scale_XY_;\runiform bool _Decal_Front_Only_;\runiform float _Rim_Intensity_;\runiform sampler2D _Rim_Texture_;\runiform float _Rim_Hue_Shift_;\runiform float _Rim_Saturation_Shift_;\runiform float _Rim_Value_Shift_;\runiform float _Iridescence_Intensity_;\runiform sampler2D _Iridescence_Texture_;\runiform bool Use_Global_Left_Index;\runiform bool Use_Global_Right_Index;\runiform vec4 Global_Left_Index_Tip_Position;\runiform vec4 Global_Right_Index_Tip_Position;\runiform vec4 Global_Left_Thumb_Tip_Position;\runiform vec4 Global_Right_Thumb_Tip_Position;\runiform float Global_Left_Index_Tip_Proximity;\runiform float Global_Right_Index_Tip_Proximity;\rvarying vec3 vPosition;\rvarying vec3 vNormal;\rvarying vec2 vUV;\rvarying vec3 vTangent;\rvarying vec3 vBinormal;\rvarying vec4 vColor;\rvarying vec4 vExtra1;\rvarying vec4 vExtra2;\rvarying vec4 vExtra3;\rvoid Object_To_World_Pos_B12(\rvec3 Pos_Object,\rout vec3 Pos_World)\r{\rPos_World=(world*vec4(Pos_Object,1.0)).xyz;\r}\rvoid Object_To_World_Normal_B32(\rvec3 Nrm_Object,\rout vec3 Nrm_World)\r{\rNrm_World=(vec4(Nrm_Object,0.0)).xyz;\r}\rvoid Blob_Vertex_B23(\rvec3 Position,\rvec3 Normal,\rvec3 Tangent,\rvec3 Bitangent,\rvec3 Blob_Position,\rfloat Intensity,\rfloat Blob_Near_Size,\rfloat Blob_Far_Size,\rfloat Blob_Near_Distance,\rfloat Blob_Far_Distance,\rfloat Blob_Fade_Length,\rfloat Blob_Pulse,\rfloat Blob_Fade,\rout vec4 Blob_Info)\r{\rvec3 blob= (Use_Global_Left_Index ? Global_Left_Index_Tip_Position.xyz : Blob_Position);\rvec3 delta=blob-Position;\rfloat dist=dot(Normal,delta);\rfloat lerpValue=clamp((abs(dist)-Blob_Near_Distance)/(Blob_Far_Distance-Blob_Near_Distance),0.0,1.0);\rfloat fadeValue=1.0-clamp((abs(dist)-Blob_Far_Distance)/Blob_Fade_Length,0.0,1.0);\rfloat size=Blob_Near_Size+(Blob_Far_Size-Blob_Near_Size)*lerpValue;\rvec2 blobXY=vec2(dot(delta,Tangent),dot(delta,Bitangent))/(0.0001+size);\rfloat Fade=fadeValue*Intensity*Blob_Fade;\rfloat Distance=(lerpValue*0.5+0.5)*(1.0-Blob_Pulse);\rBlob_Info=vec4(blobXY.x,blobXY.y,Distance,Fade);\r}\rvoid Blob_Vertex_B24(\rvec3 Position,\rvec3 Normal,\rvec3 Tangent,\rvec3 Bitangent,\rvec3 Blob_Position,\rfloat Intensity,\rfloat Blob_Near_Size,\rfloat Blob_Far_Size,\rfloat Blob_Near_Distance,\rfloat Blob_Far_Distance,\rfloat Blob_Fade_Length,\rfloat Blob_Pulse,\rfloat Blob_Fade,\rout vec4 Blob_Info)\r{\rvec3 blob= (Use_Global_Right_Index ? Global_Right_Index_Tip_Position.xyz : Blob_Position);\rvec3 delta=blob-Position;\rfloat dist=dot(Normal,delta);\rfloat lerpValue=clamp((abs(dist)-Blob_Near_Distance)/(Blob_Far_Distance-Blob_Near_Distance),0.0,1.0);\rfloat fadeValue=1.0-clamp((abs(dist)-Blob_Far_Distance)/Blob_Fade_Length,0.0,1.0);\rfloat size=Blob_Near_Size+(Blob_Far_Size-Blob_Near_Size)*lerpValue;\rvec2 blobXY=vec2(dot(delta,Tangent),dot(delta,Bitangent))/(0.0001+size);\rfloat Fade=fadeValue*Intensity*Blob_Fade;\rfloat Distance=(lerpValue*0.5+0.5)*(1.0-Blob_Pulse);\rBlob_Info=vec4(blobXY.x,blobXY.y,Distance,Fade);\r}\rvoid Move_Verts_B130(\rfloat Anisotropy,\rvec3 P,\rfloat Radius,\rfloat Bevel,\rvec3 Normal_Object,\rfloat ScaleZ,\rfloat Stretch,\rout vec3 New_P,\rout vec2 New_UV,\rout float Radial_Gradient,\rout vec3 Radial_Dir,\rout vec3 New_Normal)\r{\rvec2 UV=P.xy*2.0+0.5;\rvec2 center=clamp(UV,0.0,1.0);\rvec2 delta=UV-center;\rfloat deltad=(length(delta)*2.0);\rfloat f=(Bevel+(Radius-Bevel)*Stretch)/Radius;\rfloat innerd=clamp(deltad*2.0,0.0,1.0);\rfloat outerd=clamp(deltad*2.0-1.0,0.0,1.0);\rfloat bevelAngle=outerd*3.14159*0.5;\rfloat sinb=sin(bevelAngle);\rfloat cosb=cos(bevelAngle);\rfloat beveld=(1.0-f)*innerd+f*sinb;\rfloat br=outerd;\rvec2 r2=2.0*vec2(Radius/Anisotropy,Radius);\rfloat dir=P.z<0.0001 ? 1.0 : -1.0;\rNew_UV=center+r2*((0.5-center)+normalize(delta+vec2(0.0,0.000001))*beveld*0.5);\rNew_P=vec3(New_UV-0.5,P.z+dir*(1.0-cosb)*Bevel*ScaleZ);\rRadial_Gradient=clamp((deltad-0.5)*2.0,0.0,1.0);\rRadial_Dir=vec3(delta*r2,0.0);\rvec3 beveledNormal=cosb*Normal_Object+sinb*vec3(delta.x,delta.y,0.0);\rNew_Normal=Normal_Object.z==0.0 ? Normal_Object : beveledNormal;\r}\rvoid Object_To_World_Dir_B60(\rvec3 Dir_Object,\rout vec3 Normal_World,\rout vec3 Normal_World_N,\rout float Normal_Length)\r{\rNormal_World=(world*vec4(Dir_Object,0.0)).xyz;\rNormal_Length=length(Normal_World);\rNormal_World_N=Normal_World/Normal_Length;\r}\rvoid To_XYZ_B78(\rvec3 Vec3,\rout float X,\rout float Y,\rout float Z)\r{\rX=Vec3.x;\rY=Vec3.y;\rZ=Vec3.z;\r}\rvoid Conditional_Float_B93(\rbool Which,\rfloat If_True,\rfloat If_False,\rout float Result)\r{\rResult=Which ? If_True : If_False;\r}\rvoid Object_To_World_Dir_B28(\rvec3 Dir_Object,\rout vec3 Binormal_World,\rout vec3 Binormal_World_N,\rout float Binormal_Length)\r{\rBinormal_World=(world*vec4(Dir_Object,0.0)).xyz;\rBinormal_Length=length(Binormal_World);\rBinormal_World_N=Binormal_World/Binormal_Length;\r}\rvoid Pick_Radius_B69(\rfloat Radius,\rfloat Radius_Top_Left,\rfloat Radius_Top_Right,\rfloat Radius_Bottom_Left,\rfloat Radius_Bottom_Right,\rvec3 Position,\rout float Result)\r{\rbool whichY=Position.y>0.0;\rResult=Position.x<0.0 ? (whichY ? Radius_Top_Left : Radius_Bottom_Left) : (whichY ? Radius_Top_Right : Radius_Bottom_Right);\rResult*=Radius;\r}\rvoid Conditional_Float_B36(\rbool Which,\rfloat If_True,\rfloat If_False,\rout float Result)\r{\rResult=Which ? If_True : If_False;\r}\rvoid Greater_Than_B37(\rfloat Left,\rfloat Right,\rout bool Not_Greater_Than,\rout bool Greater_Than)\r{\rGreater_Than=Left>Right;\rNot_Greater_Than=!Greater_Than;\r}\rvoid Remap_Range_B105(\rfloat In_Min,\rfloat In_Max,\rfloat Out_Min,\rfloat Out_Max,\rfloat In,\rout float Out)\r{\rOut=mix(Out_Min,Out_Max,clamp((In-In_Min)/(In_Max-In_Min),0.0,1.0));\r}\rvoid main()\r{\rvec2 XY_Q85;\rXY_Q85=(uv-vec2(0.5,0.5))*_Decal_Scale_XY_+vec2(0.5,0.5);\rvec3 Tangent_World_Q27;\rvec3 Tangent_World_N_Q27;\rfloat Tangent_Length_Q27;\rTangent_World_Q27=(world*vec4(vec3(1,0,0),0.0)).xyz;\rTangent_Length_Q27=length(Tangent_World_Q27);\rTangent_World_N_Q27=Tangent_World_Q27/Tangent_Length_Q27;\rvec3 Normal_World_Q60;\rvec3 Normal_World_N_Q60;\rfloat Normal_Length_Q60;\rObject_To_World_Dir_B60(vec3(0,0,1),Normal_World_Q60,Normal_World_N_Q60,Normal_Length_Q60);\rfloat X_Q78;\rfloat Y_Q78;\rfloat Z_Q78;\rTo_XYZ_B78(position,X_Q78,Y_Q78,Z_Q78);\rvec3 Nrm_World_Q26;\rNrm_World_Q26=normalize((world*vec4(normal,0.0)).xyz);\rvec3 Binormal_World_Q28;\rvec3 Binormal_World_N_Q28;\rfloat Binormal_Length_Q28;\rObject_To_World_Dir_B28(vec3(0,1,0),Binormal_World_Q28,Binormal_World_N_Q28,Binormal_Length_Q28);\rfloat Anisotropy_Q29=Tangent_Length_Q27/Binormal_Length_Q28;\rfloat Result_Q69;\rPick_Radius_B69(_Radius_,_Radius_Top_Left_,_Radius_Top_Right_,_Radius_Bottom_Left_,_Radius_Bottom_Right_,position,Result_Q69);\rfloat Anisotropy_Q53=Binormal_Length_Q28/Normal_Length_Q60;\rbool Not_Greater_Than_Q37;\rbool Greater_Than_Q37;\rGreater_Than_B37(Z_Q78,0.0,Not_Greater_Than_Q37,Greater_Than_Q37);\rvec4 Linear_Q101;\rLinear_Q101.rgb=clamp(_Left_Color_.rgb*_Left_Color_.rgb,0.0,1.0);\rLinear_Q101.a=_Left_Color_.a;\rvec4 Linear_Q102;\rLinear_Q102.rgb=clamp(_Right_Color_.rgb*_Right_Color_.rgb,0.0,1.0);\rLinear_Q102.a=_Right_Color_.a;\rvec3 Difference_Q61=vec3(0,0,0)-Normal_World_N_Q60;\rvec4 Out_Color_Q34=vec4(X_Q78,Y_Q78,Z_Q78,1);\rfloat Result_Q36;\rConditional_Float_B36(Greater_Than_Q37,_Bevel_Back_,_Bevel_Front_,Result_Q36);\rfloat Result_Q94;\rConditional_Float_B36(Greater_Than_Q37,_Bevel_Back_Stretch_,_Bevel_Front_Stretch_,Result_Q94);\rvec3 New_P_Q130;\rvec2 New_UV_Q130;\rfloat Radial_Gradient_Q130;\rvec3 Radial_Dir_Q130;\rvec3 New_Normal_Q130;\rMove_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);\rfloat X_Q98;\rfloat Y_Q98;\rX_Q98=New_UV_Q130.x;\rY_Q98=New_UV_Q130.y;\rvec3 Pos_World_Q12;\rObject_To_World_Pos_B12(New_P_Q130,Pos_World_Q12);\rvec3 Nrm_World_Q32;\rObject_To_World_Normal_B32(New_Normal_Q130,Nrm_World_Q32);\rvec4 Blob_Info_Q23;\r#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);\r#else\nBlob_Info_Q23=vec4(0,0,0,0);\r#endif\nvec4 Blob_Info_Q24;\r#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);\r#else\nBlob_Info_Q24=vec4(0,0,0,0);\r#endif\nfloat Out_Q105;\rRemap_Range_B105(0.0,1.0,0.0,1.0,X_Q98,Out_Q105);\rfloat X_Q86;\rfloat Y_Q86;\rfloat Z_Q86;\rTo_XYZ_B78(Nrm_World_Q32,X_Q86,Y_Q86,Z_Q86);\rvec4 Color_At_T_Q97=mix(Linear_Q101,Linear_Q102,Out_Q105);\rfloat Minus_F_Q87=-Z_Q86;\rfloat R_Q99;\rfloat G_Q99;\rfloat B_Q99;\rfloat A_Q99;\rR_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;\rfloat ClampF_Q88=clamp(0.0,Minus_F_Q87,1.0);\rfloat Result_Q93;\rConditional_Float_B93(_Decal_Front_Only_,ClampF_Q88,1.0,Result_Q93);\rvec4 Vec4_Q89=vec4(Result_Q93,Radial_Gradient_Q130,G_Q99,B_Q99);\rvec3 Position=Pos_World_Q12;\rvec3 Normal=Nrm_World_Q32;\rvec2 UV=XY_Q85;\rvec3 Tangent=Tangent_World_N_Q27;\rvec3 Binormal=Difference_Q61;\rvec4 Color=Out_Color_Q34;\rvec4 Extra1=Vec4_Q89;\rvec4 Extra2=Blob_Info_Q23;\rvec4 Extra3=Blob_Info_Q24;\rgl_Position=viewProjection*vec4(Position,1);\rvPosition=Position;\rvNormal=Normal;\rvUV=UV;\rvTangent=Tangent;\rvBinormal=Binormal;\rvColor=Color;\rvExtra1=Extra1;\rvExtra2=Extra2;\rvExtra3=Extra3;\r}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @hidden */\nexport const mrdlSliderBarVertexShader = { name, shader };\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { Nullable } from \"core/types\";\r\nimport { SerializationHelper, serialize } from \"core/Misc/decorators\";\r\nimport { Matrix, Vector2, Vector3, Vector4 } from \"core/Maths/math.vector\";\r\nimport { IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { MaterialHelper } from \"core/Materials/materialHelper\";\r\nimport { IEffectCreationOptions } from \"core/Materials/effect\";\r\nimport { PushMaterial } from \"core/Materials/pushMaterial\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { SubMesh } from \"core/Meshes/subMesh\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { 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\n\r\n/** @hidden */\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/meshes/MRTK/MRDL/mrtk-mrdl-blue-gradient.png\";\r\n private _blueGradientTexture: 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 * @hidden\r\n */\r\n public useGlobalLeftIndex = 1.0;\r\n\r\n /**\r\n * @hidden\r\n */\r\n public useGlobalRightIndex = 1.0;\r\n\r\n /**\r\n * @hidden\r\n */\r\n public globalLeftIndexTipProximity = 0.0;\r\n\r\n /**\r\n * @hidden\r\n */\r\n public globalRightIndexTipProximity = 0.0;\r\n\r\n /**\r\n * @hidden\r\n */\r\n public globalLeftIndexTipPosition = new Vector4(0.5, 0.0, -0.55, 1.0);\r\n\r\n /**\r\n * @hidden\r\n */\r\n public globaRightIndexTipPosition = new Vector4(0.0, 0.0, 0.0, 1.0);\r\n\r\n /**\r\n * @hidden\r\n */\r\n public globalLeftThumbTipPosition = new Vector4(0.5, 0.0, -0.55, 1.0);\r\n\r\n /**\r\n * @hidden\r\n */\r\n public globalRightThumbTipPosition = new Vector4(0.0, 0.0, 0.0, 1.0);\r\n\r\n /**\r\n * @hidden\r\n */\r\n public globalLeftIndexMiddlePosition = new Vector4(0.5, 0.0, -0.55, 1.0);\r\n\r\n /**\r\n * @hidden\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 this._blueGradientTexture = new Texture(MRDLSliderBarMaterial.BLUE_GRADIENT_TEXTURE_URL, this.getScene(), true, false, Texture.NEAREST_SAMPLINGMODE);\r\n }\r\n\r\n public needAlphaBlending(): boolean {\r\n return false;\r\n }\r\n\r\n public needAlphaTesting(): boolean {\r\n return false;\r\n }\r\n\r\n public getAlphaTestTexture(): Nullable<BaseTexture> {\r\n return null;\r\n }\r\n\r\n // Methods\r\n public isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n if (this.isFrozen) {\r\n if (subMesh.effect && subMesh.effect._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._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n // Attribs\r\n MaterialHelper.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 MaterialHelper.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 MaterialHelper.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 = new Array<string>();\r\n\r\n MaterialHelper.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 subMesh.effect._wasPreviouslyReady = true;\r\n\r\n return true;\r\n }\r\n\r\n public 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_\", new Texture(\"\", this.getScene()));\r\n this._activeEffect.setTexture(\"_Indirect_Environment_\", new Texture(\"\", this.getScene()));\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_\", new Texture(\"\", this.getScene()));\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);\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 getAnimatables(): IAnimatable[] {\r\n return [];\r\n }\r\n\r\n public dispose(forceDisposeEffect?: boolean): void {\r\n super.dispose(forceDisposeEffect);\r\n }\r\n\r\n public clone(name: string): MRDLSliderBarMaterial {\r\n return SerializationHelper.Clone(() => new MRDLSliderBarMaterial(name, this.getScene()), this);\r\n }\r\n\r\n public 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 getClassName(): string {\r\n return \"MRDLSliderBarMaterial\";\r\n }\r\n\r\n // Statics\r\n public static 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;\rvarying vec3 vPosition;\rvarying vec3 vNormal;\rvarying vec2 vUV;\rvarying vec3 vTangent;\rvarying vec3 vBinormal;\rvarying vec4 vColor;\rvarying vec4 vExtra1;\rvarying vec4 vExtra2;\rvarying vec4 vExtra3;\runiform float _Radius_;\runiform float _Bevel_Front_;\runiform float _Bevel_Front_Stretch_;\runiform float _Bevel_Back_;\runiform float _Bevel_Back_Stretch_;\runiform float _Radius_Top_Left_;\runiform float _Radius_Top_Right_;\runiform float _Radius_Bottom_Left_;\runiform float _Radius_Bottom_Right_;\runiform bool _Bulge_Enabled_;\runiform float _Bulge_Height_;\runiform float _Bulge_Radius_;\runiform float _Sun_Intensity_;\runiform float _Sun_Theta_;\runiform float _Sun_Phi_;\runiform float _Indirect_Diffuse_;\runiform vec4 _Albedo_;\runiform float _Specular_;\runiform float _Shininess_;\runiform float _Sharpness_;\runiform float _Subsurface_;\runiform vec4 _Left_Color_;\runiform vec4 _Right_Color_;\runiform float _Reflection_;\runiform float _Front_Reflect_;\runiform float _Edge_Reflect_;\runiform float _Power_;\runiform vec4 _Sky_Color_;\runiform vec4 _Horizon_Color_;\runiform vec4 _Ground_Color_;\runiform float _Horizon_Power_;\runiform sampler2D _Reflection_Map_;\runiform sampler2D _Indirect_Environment_;\runiform float _Width_;\runiform float _Fuzz_;\runiform float _Min_Fuzz_;\runiform float _Clip_Fade_;\runiform float _Hue_Shift_;\runiform float _Saturation_Shift_;\runiform float _Value_Shift_;\runiform vec3 _Blob_Position_;\runiform float _Blob_Intensity_;\runiform float _Blob_Near_Size_;\runiform float _Blob_Far_Size_;\runiform float _Blob_Near_Distance_;\runiform float _Blob_Far_Distance_;\runiform float _Blob_Fade_Length_;\runiform float _Blob_Pulse_;\runiform float _Blob_Fade_;\runiform sampler2D _Blob_Texture_;\runiform vec3 _Blob_Position_2_;\runiform float _Blob_Near_Size_2_;\runiform float _Blob_Pulse_2_;\runiform float _Blob_Fade_2_;\runiform vec3 _Left_Index_Pos_;\runiform vec3 _Right_Index_Pos_;\runiform vec3 _Left_Index_Middle_Pos_;\runiform vec3 _Right_Index_Middle_Pos_;\runiform sampler2D _Decal_;\runiform vec2 _Decal_Scale_XY_;\runiform bool _Decal_Front_Only_;\runiform float _Rim_Intensity_;\runiform sampler2D _Rim_Texture_;\runiform float _Rim_Hue_Shift_;\runiform float _Rim_Saturation_Shift_;\runiform float _Rim_Value_Shift_;\runiform float _Iridescence_Intensity_;\runiform sampler2D _Iridescence_Texture_;\runiform bool Use_Global_Left_Index;\runiform bool Use_Global_Right_Index;\runiform vec4 Global_Left_Index_Tip_Position;\runiform vec4 Global_Right_Index_Tip_Position;\runiform vec4 Global_Left_Thumb_Tip_Position;\runiform vec4 Global_Right_Thumb_Tip_Position;\runiform vec4 Global_Left_Index_Middle_Position;\runiform vec4 Global_Right_Index_Middle_Position;\runiform float Global_Left_Index_Tip_Proximity;\runiform float Global_Right_Index_Tip_Proximity;\rvoid Blob_Fragment_B180(\rsampler2D Blob_Texture,\rvec4 Blob_Info1,\rvec4 Blob_Info2,\rout vec4 Blob_Color)\r{\rfloat k1=dot(Blob_Info1.xy,Blob_Info1.xy);\rfloat k2=dot(Blob_Info2.xy,Blob_Info2.xy);\rvec3 closer=k1<k2 ? vec3(k1,Blob_Info1.z,Blob_Info1.w) : vec3(k2,Blob_Info2.z,Blob_Info2.w);\rBlob_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);\r}\rvoid FastLinearTosRGB_B192(\rvec4 Linear,\rout vec4 sRGB)\r{\rsRGB.rgb=sqrt(clamp(Linear.rgb,0.0,1.0));\rsRGB.a=Linear.a;\r}\rvoid Scale_RGB_B209(\rvec4 Color,\rfloat Scalar,\rout vec4 Result)\r{\rResult=vec4(Scalar,Scalar,Scalar,1)*Color;\r}\rvoid Fragment_Main_B271(\rfloat Sun_Intensity,\rfloat Sun_Theta,\rfloat Sun_Phi,\rvec3 Normal,\rvec4 Albedo,\rfloat Fresnel_Reflect,\rfloat Shininess,\rvec3 Incident,\rvec4 Horizon_Color,\rvec4 Sky_Color,\rvec4 Ground_Color,\rfloat Indirect_Diffuse,\rfloat Specular,\rfloat Horizon_Power,\rfloat Reflection,\rvec4 Reflection_Sample,\rvec4 Indirect_Sample,\rfloat Sharpness,\rfloat SSS,\rfloat Subsurface,\rvec4 Translucence,\rvec4 Rim_Light,\rvec4 Iridescence,\rout vec4 Result)\r{\rfloat theta=Sun_Theta*2.0*3.14159;\rfloat phi=Sun_Phi*3.14159;\rvec3 lightDir= vec3(cos(phi)*cos(theta),sin(phi),cos(phi)*sin(theta));\rfloat NdotL=max(dot(lightDir,Normal),0.0);\rvec3 R=reflect(Incident,Normal);\rfloat RdotL=max(0.0,dot(R,lightDir));\rfloat specular=pow(RdotL,Shininess);\rspecular=mix(specular,smoothstep(0.495*Sharpness,1.0-0.495*Sharpness,specular),Sharpness);\rvec4 gi=mix(Ground_Color,Sky_Color,Normal.y*0.5+0.5);\rResult=((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;\r}\rvoid Bulge_B229(\rbool Enabled,\rvec3 Normal,\rvec3 Tangent,\rfloat Bulge_Height,\rvec4 UV,\rfloat Bulge_Radius,\rvec3 ButtonN,\rout vec3 New_Normal)\r{\rvec2 xy=clamp(UV.xy*2.0,vec2(-1,-1),vec2(1,1));\rvec3 B=(cross(Normal,Tangent));\rfloat k=-clamp(1.0-length(xy)/Bulge_Radius,0.0,1.0)*Bulge_Height;\rk=sin(k*3.14159*0.5);\rk*=smoothstep(0.9998,0.9999,abs(dot(ButtonN,Normal)));\rNew_Normal=Normal*sqrt(1.0-k*k)+(xy.x*Tangent+xy.y*B)*k;\rNew_Normal=Enabled ? New_Normal : Normal;\r}\rvoid SSS_B227(\rvec3 ButtonN,\rvec3 Normal,\rvec3 Incident,\rout float Result)\r{\rfloat NdotI=abs(dot(Normal,Incident));\rfloat BdotI=abs(dot(ButtonN,Incident));\rResult=(abs(NdotI-BdotI)); \r}\rvoid FingerOcclusion_B217(\rfloat Width,\rfloat DistToCenter,\rfloat Fuzz,\rfloat Min_Fuzz,\rvec3 Position,\rvec3 Forward,\rvec3 Nearest,\rfloat Fade_Out,\rout float NotInShadow)\r{\rfloat d=dot((Nearest-Position),Forward);\rfloat sh=smoothstep(Width*0.5,Width*0.5+Fuzz*max(d,0.0)+Min_Fuzz,DistToCenter);\rNotInShadow=1.0-(1.0-sh)*smoothstep(-Fade_Out,0.0,d);\r}\rvoid FingerOcclusion_B218(\rfloat Width,\rfloat DistToCenter,\rfloat Fuzz,\rfloat Min_Fuzz,\rvec3 Position,\rvec3 Forward,\rvec3 Nearest,\rfloat Fade_Out,\rout float NotInShadow)\r{\rfloat d=dot((Nearest-Position),Forward);\rfloat sh=smoothstep(Width*0.5,Width*0.5+Fuzz*max(d,0.0)+Min_Fuzz,DistToCenter);\rNotInShadow=1.0-(1.0-sh)*smoothstep(-Fade_Out,0.0,d);\r}\rvoid Scale_Color_B241(\rvec4 Color,\rfloat Scalar,\rout vec4 Result)\r{\rResult=Scalar*Color;\r}\rvoid From_HSV_B223(\rfloat Hue,\rfloat Saturation,\rfloat Value,\rfloat Alpha,\rout vec4 Color)\r{\rvec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);\rvec3 p=abs(fract(vec3(Hue,Hue,Hue)+K.xyz)*6.0-K.www);\rColor.rgb=Value*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),Saturation);\rColor.a=Alpha;\r}\rvoid Fast_Fresnel_B272(\rfloat Front_Reflect,\rfloat Edge_Reflect,\rfloat Power,\rvec3 Normal,\rvec3 Incident,\rout float Transmit,\rout float Reflect)\r{\rfloat d=max(-dot(Incident,Normal),0.0);\rReflect=Front_Reflect+(Edge_Reflect-Front_Reflect)*pow(1.0-d,Power);\rTransmit=1.0-Reflect;\r}\rvoid Mapped_Environment_B201(\rsampler2D Reflected_Environment,\rsampler2D Indirect_Environment,\rvec3 Dir,\rout vec4 Reflected_Color,\rout vec4 Indirect_Diffuse)\r{\rReflected_Color=texture(Reflected_Environment,vec2(atan(Dir.z,Dir.x)/3.14159*0.5,asin(Dir.y)/3.14159+0.5));\rIndirect_Diffuse=texture(Indirect_Environment,vec2(atan(Dir.z,Dir.x)/3.14159*0.5,asin(Dir.y)/3.14159+0.5));\r}\rvec4 SampleEnv_Bid200(vec3 D,vec4 S,vec4 H,vec4 G,float exponent)\r{\rfloat k=pow(abs(D.y),exponent);\rvec4 C;\rif (D.y>0.0) {\rC=mix(H,S,k);\r} else {\rC=mix(H,G,k); \r}\rreturn C;\r}\rvoid Sky_Environment_B200(\rvec3 Normal,\rvec3 Reflected,\rvec4 Sky_Color,\rvec4 Horizon_Color,\rvec4 Ground_Color,\rfloat Horizon_Power,\rout vec4 Reflected_Color,\rout vec4 Indirect_Color)\r{\rReflected_Color=SampleEnv_Bid200(Reflected,Sky_Color,Horizon_Color,Ground_Color,Horizon_Power);\rIndirect_Color=mix(Ground_Color,Sky_Color,Normal.y*0.5+0.5);\r}\rvoid Min_Segment_Distance_B215(\rvec3 P0,\rvec3 P1,\rvec3 Q0,\rvec3 Q1,\rout vec3 NearP,\rout vec3 NearQ,\rout float Distance)\r{\rvec3 u=P1-P0;\rvec3 v=Q1-Q0;\rvec3 w=P0-Q0;\rfloat a=dot(u,u);\rfloat b=dot(u,v);\rfloat c=dot(v,v);\rfloat d=dot(u,w);\rfloat e=dot(v,w);\rfloat D=a*c-b*b;\rfloat sD=D;\rfloat tD=D;\rfloat sc,sN,tc,tN;\rif (D<0.00001) {\rsN=0.0;\rsD=1.0;\rtN=e;\rtD=c;\r} else {\rsN=(b*e-c*d);\rtN=(a*e-b*d);\rif (sN<0.0) {\rsN=0.0;\rtN=e;\rtD=c;\r} else if (sN>sD) {\rsN=sD;\rtN=e+b;\rtD=c;\r}\r}\rif (tN<0.0) {\rtN=0.0;\rif (-d<0.0) {\rsN=0.0;\r} else if (-d>a) {\rsN=sD;\r} else {\rsN=-d;\rsD=a;\r}\r} else if (tN>tD) {\rtN=tD;\rif ((-d+b)<0.0) {\rsN=0.0;\r} else if ((-d+b)>a) {\rsN=sD;\r} else {\rsN=(-d+b);\rsD=a;\r}\r}\rsc=abs(sN)<0.000001 ? 0.0 : sN/sD;\rtc=abs(tN)<0.000001 ? 0.0 : tN/tD;\rNearP=P0+sc*u;\rNearQ=Q0+tc*v;\rDistance=distance(NearP,NearQ);\r}\rvoid To_XYZ_B224(\rvec3 Vec3,\rout float X,\rout float Y,\rout float Z)\r{\rX=Vec3.x;\rY=Vec3.y;\rZ=Vec3.z;\r}\rvoid Finger_Positions_B214(\rvec3 Left_Index_Pos,\rvec3 Right_Index_Pos,\rvec3 Left_Index_Middle_Pos,\rvec3 Right_Index_Middle_Pos,\rout vec3 Left_Index,\rout vec3 Right_Index,\rout vec3 Left_Index_Middle,\rout vec3 Right_Index_Middle)\r{\rLeft_Index= (Use_Global_Left_Index ? Global_Left_Index_Tip_Position.xyz : Left_Index_Pos);\rRight_Index= (Use_Global_Right_Index ? Global_Right_Index_Tip_Position.xyz : Right_Index_Pos);\rLeft_Index_Middle= (Use_Global_Left_Index ? Global_Left_Index_Middle_Position.xyz : Left_Index_Middle_Pos);\rRight_Index_Middle= (Use_Global_Right_Index ? Global_Right_Index_Middle_Position.xyz : Right_Index_Middle_Pos);\r}\rvoid VaryHSV_B258(\rvec3 HSV_In,\rfloat Hue_Shift,\rfloat Saturation_Shift,\rfloat Value_Shift,\rout vec3 HSV_Out)\r{\rHSV_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));\r}\rvoid Remap_Range_B264(\rfloat In_Min,\rfloat In_Max,\rfloat Out_Min,\rfloat Out_Max,\rfloat In,\rout float Out)\r{\rOut=mix(Out_Min,Out_Max,clamp((In-In_Min)/(In_Max-In_Min),0.0,1.0));\r}\rvoid To_HSV_B225(\rvec4 Color,\rout float Hue,\rout float Saturation,\rout float Value,\rout float Alpha,\rout vec3 HSV)\r{\rvec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);\rvec4 p=Color.g<Color.b ? vec4(Color.bg,K.wz) : vec4(Color.gb,K.xy);\rvec4 q=Color.r<p.x ? vec4(p.xyw,Color.r) : vec4(Color.r,p.yzx);\rfloat d=q.x-min(q.w,q.y);\rfloat e=1.0e-10;\rHue=abs(q.z+(q.w-q.y)/(6.0*d+e));\rSaturation=d/(q.x+e);\rValue=q.x;\rAlpha=Color.a;\rHSV=vec3(Hue,Saturation,Value);\r}\rvoid Code_B260(\rfloat X,\rout float Result)\r{\rResult=(acos(X)/3.14159-0.5)*2.0;\r}\rvoid Rim_Light_B282(\rvec3 Front,\rvec3 Normal,\rvec3 Incident,\rfloat Rim_Intensity,\rsampler2D Texture,\rout vec4 Result)\r{\rvec3 R=reflect(Incident,Normal);\rfloat RdotF=dot(R,Front);\rfloat RdotL=sqrt(1.0-RdotF*RdotF);\rvec2 UV=vec2(R.y*0.5+0.5,0.5);\rvec4 Color=texture(Texture,UV);\rResult=Color;\r}\rvoid main()\r{\rvec4 Blob_Color_Q180;\r#if BLOB_ENABLE\nBlob_Fragment_B180(_Blob_Texture_,vExtra2,vExtra3,Blob_Color_Q180);\r#else\nBlob_Color_Q180=vec4(0,0,0,0);\r#endif\nvec3 Incident_Q189=normalize(vPosition-cameraPosition);\rvec3 Normalized_Q188=normalize(vNormal);\rvec3 Normalized_Q221=normalize(vTangent);\rvec4 Color_Q233;\r#if DECAL_ENABLE\nColor_Q233=texture(_Decal_,vUV);\r#else\nColor_Q233=vec4(0,0,0,0);\r#endif\nfloat X_Q240;\rfloat Y_Q240;\rfloat Z_Q240;\rfloat W_Q240;\rX_Q240=vExtra1.x;\rY_Q240=vExtra1.y;\rZ_Q240=vExtra1.z;\rW_Q240=vExtra1.w;\rvec4 Linear_Q193;\rLinear_Q193.rgb=clamp(_Sky_Color_.rgb*_Sky_Color_.rgb,0.0,1.0);\rLinear_Q193.a=_Sky_Color_.a;\rvec4 Linear_Q194;\rLinear_Q194.rgb=clamp(_Horizon_Color_.rgb*_Horizon_Color_.rgb,0.0,1.0);\rLinear_Q194.a=_Horizon_Color_.a;\rvec4 Linear_Q195;\rLinear_Q195.rgb=clamp(_Ground_Color_.rgb*_Ground_Color_.rgb,0.0,1.0);\rLinear_Q195.a=_Ground_Color_.a;\rvec3 Left_Index_Q214;\rvec3 Right_Index_Q214;\rvec3 Left_Index_Middle_Q214;\rvec3 Right_Index_Middle_Q214;\rFinger_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);\rvec4 Linear_Q196;\rLinear_Q196.rgb=clamp(_Albedo_.rgb*_Albedo_.rgb,0.0,1.0);\rLinear_Q196.a=_Albedo_.a;\rvec3 Normalized_Q257=normalize(vBinormal);\rvec3 Incident_Q220=normalize(vPosition-cameraPosition);\rvec3 New_Normal_Q229;\rBulge_B229(_Bulge_Enabled_,Normalized_Q188,Normalized_Q221,_Bulge_Height_,vColor,_Bulge_Radius_,vBinormal,New_Normal_Q229);\rfloat Result_Q227;\rSSS_B227(vBinormal,New_Normal_Q229,Incident_Q189,Result_Q227);\rvec4 Result_Q241;\rScale_Color_B241(Color_Q233,X_Q240,Result_Q241);\rfloat Transmit_Q272;\rfloat Reflect_Q272;\rFast_Fresnel_B272(_Front_Reflect_,_Edge_Reflect_,_Power_,New_Normal_Q229,Incident_Q189,Transmit_Q272,Reflect_Q272);\rfloat Product_Q275=Y_Q240*Y_Q240;\rvec3 NearP_Q215;\rvec3 NearQ_Q215;\rfloat Distance_Q215;\rMin_Segment_Distance_B215(Left_Index_Q214,Left_Index_Middle_Q214,vPosition,cameraPosition,NearP_Q215,NearQ_Q215,Distance_Q215);\rvec3 NearP_Q213;\rvec3 NearQ_Q213;\rfloat Distance_Q213;\rMin_Segment_Distance_B215(Right_Index_Q214,Right_Index_Middle_Q214,vPosition,cameraPosition,NearP_Q213,NearQ_Q213,Distance_Q213);\rvec3 Reflected_Q197=reflect(Incident_Q189,New_Normal_Q229);\rvec4 Product_Q253=Linear_Q196*vec4(1,1,1,1);\rvec4 Result_Q282;\rRim_Light_B282(Normalized_Q257,Normalized_Q188,Incident_Q220,_Rim_Intensity_,_Rim_Texture_,Result_Q282);\rfloat Dot_Q222=dot(Incident_Q220, Normalized_Q221);\rfloat MaxAB_Q273=max(Reflect_Q272,Product_Q275);\rfloat NotInShadow_Q217;\r#if OCCLUSION_ENABLED\nFingerOcclusion_B217(_Width_,Distance_Q215,_Fuzz_,_Min_Fuzz_,vPosition,vBinormal,NearP_Q215,_Clip_Fade_,NotInShadow_Q217);\r#else\nNotInShadow_Q217=1.0;\r#endif\nfloat NotInShadow_Q218;\r#if OCCLUSION_ENABLED\nFingerOcclusion_B218(_Width_,Distance_Q213,_Fuzz_,_Min_Fuzz_,vPosition,vBinormal,NearP_Q213,_Clip_Fade_,NotInShadow_Q218);\r#else\nNotInShadow_Q218=1.0;\r#endif\nvec4 Reflected_Color_Q201;\rvec4 Indirect_Diffuse_Q201;\r#if ENV_ENABLE\nMapped_Environment_B201(_Reflection_Map_,_Indirect_Environment_,Reflected_Q197,Reflected_Color_Q201,Indirect_Diffuse_Q201);\r#else\nReflected_Color_Q201=vec4(0,0,0,1);\rIndirect_Diffuse_Q201=vec4(0,0,0,1);\r#endif\nvec4 Reflected_Color_Q200;\rvec4 Indirect_Color_Q200;\r#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);\r#else\nReflected_Color_Q200=vec4(0,0,0,1);\rIndirect_Color_Q200=vec4(0,0,0,1);\r#endif\nfloat Hue_Q225;\rfloat Saturation_Q225;\rfloat Value_Q225;\rfloat Alpha_Q225;\rvec3 HSV_Q225;\rTo_HSV_B225(Product_Q253,Hue_Q225,Saturation_Q225,Value_Q225,Alpha_Q225,HSV_Q225);\rfloat Hue_Q277;\rfloat Saturation_Q277;\rfloat Value_Q277;\rfloat Alpha_Q277;\rvec3 HSV_Q277;\rTo_HSV_B225(Result_Q282,Hue_Q277,Saturation_Q277,Value_Q277,Alpha_Q277,HSV_Q277);\rfloat Result_Q260;\rCode_B260(Dot_Q222,Result_Q260);\rfloat AbsA_Q226=abs(Result_Q260);\rfloat MinAB_Q208=min(NotInShadow_Q217,NotInShadow_Q218);\rvec4 Sum_Q198=Reflected_Color_Q201+Reflected_Color_Q200;\rvec4 Sum_Q199=Indirect_Diffuse_Q201+Indirect_Color_Q200;\rvec3 HSV_Out_Q276;\rVaryHSV_B258(HSV_Q277,_Rim_Hue_Shift_,_Rim_Saturation_Shift_,_Rim_Value_Shift_,HSV_Out_Q276);\rfloat Out_Q264;\rRemap_Range_B264(-1.0,1.0,0.0,1.0,Result_Q260,Out_Q264);\rfloat Product_Q256;\rProduct_Q256=AbsA_Q226*_Hue_Shift_;\rfloat X_Q278;\rfloat Y_Q278;\rfloat Z_Q278;\rTo_XYZ_B224(HSV_Out_Q276,X_Q278,Y_Q278,Z_Q278);\rvec2 Vec2_Q262=vec2(Out_Q264,0.5);\rvec3 HSV_Out_Q258;\rVaryHSV_B258(HSV_Q225,Product_Q256,_Saturation_Shift_,_Value_Shift_,HSV_Out_Q258);\rvec4 Color_Q279;\rFrom_HSV_B223(X_Q278,Y_Q278,Z_Q278,0.0,Color_Q279);\rvec4 Color_Q261;\r#if IRIDESCENCE_ENABLED\nColor_Q261=texture(_Iridescence_Texture_,Vec2_Q262);\r#else\nColor_Q261=vec4(0,0,0,0);\r#endif\nfloat X_Q224;\rfloat Y_Q224;\rfloat Z_Q224;\rTo_XYZ_B224(HSV_Out_Q258,X_Q224,Y_Q224,Z_Q224);\rvec4 Result_Q281=_Rim_Intensity_*Color_Q279;\rvec4 Result_Q263=_Iridescence_Intensity_*Color_Q261;\rvec4 Color_Q223;\rFrom_HSV_B223(X_Q224,Y_Q224,Z_Q224,0.0,Color_Q223);\rvec4 Result_Q234=Result_Q241+(1.0-Result_Q241.a)*Color_Q223;\rvec4 Result_Q271;\rFragment_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);\rvec4 Result_Q209;\rScale_RGB_B209(Result_Q271,MinAB_Q208,Result_Q209);\rvec4 sRGB_Q192;\rFastLinearTosRGB_B192(Result_Q209,sRGB_Q192);\rvec4 Result_Q181=Blob_Color_Q180+(1.0-Blob_Color_Q180.a)*sRGB_Q192;\rvec4 Result_Q190=Result_Q181; Result_Q190.a=1.0;\rvec4 Out_Color=Result_Q190;\rfloat Clip_Threshold=0.001;\rbool To_sRGB=false;\rgl_FragColor=Out_Color;\r}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @hidden */\nexport const mrdlSliderThumbPixelShader = { name, shader };\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"mrdlSliderThumbVertexShader\";\nconst shader = `uniform mat4 world;\runiform mat4 viewProjection;\runiform vec3 cameraPosition;\rattribute vec3 position;\rattribute vec3 normal;\rattribute vec2 uv;\r#ifdef TANGENT\nattribute vec3 tangent;\r#else\nconst vec3 tangent=vec3(0.);\r#endif\nuniform float _Radius_;\runiform float _Bevel_Front_;\runiform float _Bevel_Front_Stretch_;\runiform float _Bevel_Back_;\runiform float _Bevel_Back_Stretch_;\runiform float _Radius_Top_Left_;\runiform float _Radius_Top_Right_;\runiform float _Radius_Bottom_Left_;\runiform float _Radius_Bottom_Right_;\runiform bool _Bulge_Enabled_;\runiform float _Bulge_Height_;\runiform float _Bulge_Radius_;\runiform float _Sun_Intensity_;\runiform float _Sun_Theta_;\runiform float _Sun_Phi_;\runiform float _Indirect_Diffuse_;\runiform vec4 _Albedo_;\runiform float _Specular_;\runiform float _Shininess_;\runiform float _Sharpness_;\runiform float _Subsurface_;\runiform vec4 _Left_Color_;\runiform vec4 _Right_Color_;\runiform float _Reflection_;\runiform float _Front_Reflect_;\runiform float _Edge_Reflect_;\runiform float _Power_;\runiform vec4 _Sky_Color_;\runiform vec4 _Horizon_Color_;\runiform vec4 _Ground_Color_;\runiform float _Horizon_Power_;\runiform sampler2D _Reflection_Map_;\runiform sampler2D _Indirect_Environment_;\runiform float _Width_;\runiform float _Fuzz_;\runiform float _Min_Fuzz_;\runiform float _Clip_Fade_;\runiform float _Hue_Shift_;\runiform float _Saturation_Shift_;\runiform float _Value_Shift_;\runiform vec3 _Blob_Position_;\runiform float _Blob_Intensity_;\runiform float _Blob_Near_Size_;\runiform float _Blob_Far_Size_;\runiform float _Blob_Near_Distance_;\runiform float _Blob_Far_Distance_;\runiform float _Blob_Fade_Length_;\runiform float _Blob_Pulse_;\runiform float _Blob_Fade_;\runiform sampler2D _Blob_Texture_;\runiform vec3 _Blob_Position_2_;\runiform float _Blob_Near_Size_2_;\runiform float _Blob_Pulse_2_;\runiform float _Blob_Fade_2_;\runiform vec3 _Left_Index_Pos_;\runiform vec3 _Right_Index_Pos_;\runiform vec3 _Left_Index_Middle_Pos_;\runiform vec3 _Right_Index_Middle_Pos_;\runiform sampler2D _Decal_;\runiform vec2 _Decal_Scale_XY_;\runiform bool _Decal_Front_Only_;\runiform float _Rim_Intensity_;\runiform sampler2D _Rim_Texture_;\runiform float _Rim_Hue_Shift_;\runiform float _Rim_Saturation_Shift_;\runiform float _Rim_Value_Shift_;\runiform float _Iridescence_Intensity_;\runiform sampler2D _Iridescence_Texture_;\runiform bool Use_Global_Left_Index;\runiform bool Use_Global_Right_Index;\runiform vec4 Global_Left_Index_Tip_Position;\runiform vec4 Global_Right_Index_Tip_Position;\runiform vec4 Global_Left_Thumb_Tip_Position;\runiform vec4 Global_Right_Thumb_Tip_Position;\runiform float Global_Left_Index_Tip_Proximity;\runiform float Global_Right_Index_Tip_Proximity;\rvarying vec3 vPosition;\rvarying vec3 vNormal;\rvarying vec2 vUV;\rvarying vec3 vTangent;\rvarying vec3 vBinormal;\rvarying vec4 vColor;\rvarying vec4 vExtra1;\rvarying vec4 vExtra2;\rvarying vec4 vExtra3;\rvoid Object_To_World_Pos_B162(\rvec3 Pos_Object,\rout vec3 Pos_World)\r{\rPos_World=(world*vec4(Pos_Object,1.0)).xyz;\r}\rvoid Object_To_World_Normal_B182(\rvec3 Nrm_Object,\rout vec3 Nrm_World)\r{\rNrm_World=(vec4(Nrm_Object,0.0)).xyz;\r}\rvoid Blob_Vertex_B173(\rvec3 Position,\rvec3 Normal,\rvec3 Tangent,\rvec3 Bitangent,\rvec3 Blob_Position,\rfloat Intensity,\rfloat Blob_Near_Size,\rfloat Blob_Far_Size,\rfloat Blob_Near_Distance,\rfloat Blob_Far_Distance,\rfloat Blob_Fade_Length,\rfloat Blob_Pulse,\rfloat Blob_Fade,\rout vec4 Blob_Info)\r{\rvec3 blob= (Use_Global_Left_Index ? Global_Left_Index_Tip_Position.xyz : Blob_Position);\rvec3 delta=blob-Position;\rfloat dist=dot(Normal,delta);\rfloat lerpValue=clamp((abs(dist)-Blob_Near_Distance)/(Blob_Far_Distance-Blob_Near_Distance),0.0,1.0);\rfloat fadeValue=1.0-clamp((abs(dist)-Blob_Far_Distance)/Blob_Fade_Length,0.0,1.0);\rfloat size=Blob_Near_Size+(Blob_Far_Size-Blob_Near_Size)*lerpValue;\rvec2 blobXY=vec2(dot(delta,Tangent),dot(delta,Bitangent))/(0.0001+size);\rfloat Fade=fadeValue*Intensity*Blob_Fade;\rfloat Distance=(lerpValue*0.5+0.5)*(1.0-Blob_Pulse);\rBlob_Info=vec4(blobXY.x,blobXY.y,Distance,Fade);\r}\rvoid Blob_Vertex_B174(\rvec3 Position,\rvec3 Normal,\rvec3 Tangent,\rvec3 Bitangent,\rvec3 Blob_Position,\rfloat Intensity,\rfloat Blob_Near_Size,\rfloat Blob_Far_Size,\rfloat Blob_Near_Distance,\rfloat Blob_Far_Distance,\rfloat Blob_Fade_Length,\rfloat Blob_Pulse,\rfloat Blob_Fade,\rout vec4 Blob_Info)\r{\rvec3 blob= (Use_Global_Right_Index ? Global_Right_Index_Tip_Position.xyz : Blob_Position);\rvec3 delta=blob-Position;\rfloat dist=dot(Normal,delta);\rfloat lerpValue=clamp((abs(dist)-Blob_Near_Distance)/(Blob_Far_Distance-Blob_Near_Distance),0.0,1.0);\rfloat fadeValue=1.0-clamp((abs(dist)-Blob_Far_Distance)/Blob_Fade_Length,0.0,1.0);\rfloat size=Blob_Near_Size+(Blob_Far_Size-Blob_Near_Size)*lerpValue;\rvec2 blobXY=vec2(dot(delta,Tangent),dot(delta,Bitangent))/(0.0001+size);\rfloat Fade=fadeValue*Intensity*Blob_Fade;\rfloat Distance=(lerpValue*0.5+0.5)*(1.0-Blob_Pulse);\rBlob_Info=vec4(blobXY.x,blobXY.y,Distance,Fade);\r}\rvoid Move_Verts_B280(\rfloat Anisotropy,\rvec3 P,\rfloat Radius,\rfloat Bevel,\rvec3 Normal_Object,\rfloat ScaleZ,\rfloat Stretch,\rout vec3 New_P,\rout vec2 New_UV,\rout float Radial_Gradient,\rout vec3 Radial_Dir,\rout vec3 New_Normal)\r{\rvec2 UV=P.xy*2.0+0.5;\rvec2 center=clamp(UV,0.0,1.0);\rvec2 delta=UV-center;\rfloat deltad=(length(delta)*2.0);\rfloat f=(Bevel+(Radius-Bevel)*Stretch)/Radius;\rfloat innerd=clamp(deltad*2.0,0.0,1.0);\rfloat outerd=clamp(deltad*2.0-1.0,0.0,1.0);\rfloat bevelAngle=outerd*3.14159*0.5;\rfloat sinb=sin(bevelAngle);\rfloat cosb=cos(bevelAngle);\rfloat beveld=(1.0-f)*innerd+f*sinb;\rfloat br=outerd;\rvec2 r2=2.0*vec2(Radius/Anisotropy,Radius);\rfloat dir=P.z<0.0001 ? 1.0 : -1.0;\rNew_UV=center+r2*((0.5-center)+normalize(delta+vec2(0.0,0.000001))*beveld*0.5);\rNew_P=vec3(New_UV-0.5,P.z+dir*(1.0-cosb)*Bevel*ScaleZ);\rRadial_Gradient=clamp((deltad-0.5)*2.0,0.0,1.0);\rRadial_Dir=vec3(delta*r2,0.0);\rvec3 beveledNormal=cosb*Normal_Object+sinb*vec3(delta.x,delta.y,0.0);\rNew_Normal=Normal_Object.z==0.0 ? Normal_Object : beveledNormal;\r}\rvoid Object_To_World_Dir_B210(\rvec3 Dir_Object,\rout vec3 Normal_World,\rout vec3 Normal_World_N,\rout float Normal_Length)\r{\rNormal_World=(world*vec4(Dir_Object,0.0)).xyz;\rNormal_Length=length(Normal_World);\rNormal_World_N=Normal_World/Normal_Length;\r}\rvoid To_XYZ_B228(\rvec3 Vec3,\rout float X,\rout float Y,\rout float Z)\r{\rX=Vec3.x;\rY=Vec3.y;\rZ=Vec3.z;\r}\rvoid Conditional_Float_B243(\rbool Which,\rfloat If_True,\rfloat If_False,\rout float Result)\r{\rResult=Which ? If_True : If_False;\r}\rvoid Object_To_World_Dir_B178(\rvec3 Dir_Object,\rout vec3 Binormal_World,\rout vec3 Binormal_World_N,\rout float Binormal_Length)\r{\rBinormal_World=(world*vec4(Dir_Object,0.0)).xyz;\rBinormal_Length=length(Binormal_World);\rBinormal_World_N=Binormal_World/Binormal_Length;\r}\rvoid Pick_Radius_B219(\rfloat Radius,\rfloat Radius_Top_Left,\rfloat Radius_Top_Right,\rfloat Radius_Bottom_Left,\rfloat Radius_Bottom_Right,\rvec3 Position,\rout float Result)\r{\rbool whichY=Position.y>0.0;\rResult=Position.x<0.0 ? (whichY ? Radius_Top_Left : Radius_Bottom_Left) : (whichY ? Radius_Top_Right : Radius_Bottom_Right);\rResult*=Radius;\r}\rvoid Conditional_Float_B186(\rbool Which,\rfloat If_True,\rfloat If_False,\rout float Result)\r{\rResult=Which ? If_True : If_False;\r}\rvoid Greater_Than_B187(\rfloat Left,\rfloat Right,\rout bool Not_Greater_Than,\rout bool Greater_Than)\r{\rGreater_Than=Left>Right;\rNot_Greater_Than=!Greater_Than;\r}\rvoid Remap_Range_B255(\rfloat In_Min,\rfloat In_Max,\rfloat Out_Min,\rfloat Out_Max,\rfloat In,\rout float Out)\r{\rOut=mix(Out_Min,Out_Max,clamp((In-In_Min)/(In_Max-In_Min),0.0,1.0));\r}\rvoid main()\r{\rvec2 XY_Q235;\rXY_Q235=(uv-vec2(0.5,0.5))*_Decal_Scale_XY_+vec2(0.5,0.5);\rvec3 Tangent_World_Q177;\rvec3 Tangent_World_N_Q177;\rfloat Tangent_Length_Q177;\rTangent_World_Q177=(world*vec4(vec3(1,0,0),0.0)).xyz;\rTangent_Length_Q177=length(Tangent_World_Q177);\rTangent_World_N_Q177=Tangent_World_Q177/Tangent_Length_Q177;\rvec3 Normal_World_Q210;\rvec3 Normal_World_N_Q210;\rfloat Normal_Length_Q210;\rObject_To_World_Dir_B210(vec3(0,0,1),Normal_World_Q210,Normal_World_N_Q210,Normal_Length_Q210);\rfloat X_Q228;\rfloat Y_Q228;\rfloat Z_Q228;\rTo_XYZ_B228(position,X_Q228,Y_Q228,Z_Q228);\rvec3 Nrm_World_Q176;\rNrm_World_Q176=normalize((world*vec4(normal,0.0)).xyz);\rvec3 Binormal_World_Q178;\rvec3 Binormal_World_N_Q178;\rfloat Binormal_Length_Q178;\rObject_To_World_Dir_B178(vec3(0,1,0),Binormal_World_Q178,Binormal_World_N_Q178,Binormal_Length_Q178);\rfloat Anisotropy_Q179=Tangent_Length_Q177/Binormal_Length_Q178;\rfloat Result_Q219;\rPick_Radius_B219(_Radius_,_Radius_Top_Left_,_Radius_Top_Right_,_Radius_Bottom_Left_,_Radius_Bottom_Right_,position,Result_Q219);\rfloat Anisotropy_Q203=Binormal_Length_Q178/Normal_Length_Q210;\rbool Not_Greater_Than_Q187;\rbool Greater_Than_Q187;\rGreater_Than_B187(Z_Q228,0.0,Not_Greater_Than_Q187,Greater_Than_Q187);\rvec4 Linear_Q251;\rLinear_Q251.rgb=clamp(_Left_Color_.rgb*_Left_Color_.rgb,0.0,1.0);\rLinear_Q251.a=_Left_Color_.a;\rvec4 Linear_Q252;\rLinear_Q252.rgb=clamp(_Right_Color_.rgb*_Right_Color_.rgb,0.0,1.0);\rLinear_Q252.a=_Right_Color_.a;\rvec3 Difference_Q211=vec3(0,0,0)-Normal_World_N_Q210;\rvec4 Out_Color_Q184=vec4(X_Q228,Y_Q228,Z_Q228,1);\rfloat Result_Q186;\rConditional_Float_B186(Greater_Than_Q187,_Bevel_Back_,_Bevel_Front_,Result_Q186);\rfloat Result_Q244;\rConditional_Float_B186(Greater_Than_Q187,_Bevel_Back_Stretch_,_Bevel_Front_Stretch_,Result_Q244);\rvec3 New_P_Q280;\rvec2 New_UV_Q280;\rfloat Radial_Gradient_Q280;\rvec3 Radial_Dir_Q280;\rvec3 New_Normal_Q280;\rMove_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);\rfloat X_Q248;\rfloat Y_Q248;\rX_Q248=New_UV_Q280.x;\rY_Q248=New_UV_Q280.y;\rvec3 Pos_World_Q162;\rObject_To_World_Pos_B162(New_P_Q280,Pos_World_Q162);\rvec3 Nrm_World_Q182;\rObject_To_World_Normal_B182(New_Normal_Q280,Nrm_World_Q182);\rvec4 Blob_Info_Q173;\r#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);\r#else\nBlob_Info_Q173=vec4(0,0,0,0);\r#endif\nvec4 Blob_Info_Q174;\r#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);\r#else\nBlob_Info_Q174=vec4(0,0,0,0);\r#endif\nfloat Out_Q255;\rRemap_Range_B255(0.0,1.0,0.0,1.0,X_Q248,Out_Q255);\rfloat X_Q236;\rfloat Y_Q236;\rfloat Z_Q236;\rTo_XYZ_B228(Nrm_World_Q182,X_Q236,Y_Q236,Z_Q236);\rvec4 Color_At_T_Q247=mix(Linear_Q251,Linear_Q252,Out_Q255);\rfloat Minus_F_Q237=-Z_Q236;\rfloat R_Q249;\rfloat G_Q249;\rfloat B_Q249;\rfloat A_Q249;\rR_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;\rfloat ClampF_Q238=clamp(0.0,Minus_F_Q237,1.0);\rfloat Result_Q243;\rConditional_Float_B243(_Decal_Front_Only_,ClampF_Q238,1.0,Result_Q243);\rvec4 Vec4_Q239=vec4(Result_Q243,Radial_Gradient_Q280,G_Q249,B_Q249);\rvec3 Position=Pos_World_Q162;\rvec3 Normal=Nrm_World_Q182;\rvec2 UV=XY_Q235;\rvec3 Tangent=Tangent_World_N_Q177;\rvec3 Binormal=Difference_Q211;\rvec4 Color=Out_Color_Q184;\rvec4 Extra1=Vec4_Q239;\rvec4 Extra2=Blob_Info_Q173;\rvec4 Extra3=Blob_Info_Q174;\rgl_Position=viewProjection*vec4(Position,1);\rvPosition=Position;\rvNormal=Normal;\rvUV=UV;\rvTangent=Tangent;\rvBinormal=Binormal;\rvColor=Color;\rvExtra1=Extra1;\rvExtra2=Extra2;\rvExtra3=Extra3;\r}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @hidden */\nexport const mrdlSliderThumbVertexShader = { name, shader };\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { Nullable } from \"core/types\";\r\nimport { SerializationHelper, serialize } from \"core/Misc/decorators\";\r\nimport { Matrix, Vector2, Vector3, Vector4 } from \"core/Maths/math.vector\";\r\nimport { IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { MaterialHelper } from \"core/Materials/materialHelper\";\r\nimport { IEffectCreationOptions } from \"core/Materials/effect\";\r\nimport { PushMaterial } from \"core/Materials/pushMaterial\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { SubMesh } from \"core/Meshes/subMesh\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { 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\n\r\n/** @hidden */\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/meshes/MRTK/MRDL/mrtk-mrdl-blue-gradient.png\";\r\n private _blueGradientTexture: 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 * @hidden\r\n */\r\n public useGlobalLeftIndex = 1.0;\r\n\r\n /**\r\n * @hidden\r\n */\r\n public useGlobalRightIndex = 1.0;\r\n\r\n /**\r\n * @hidden\r\n */\r\n public globalLeftIndexTipProximity = 0.0;\r\n\r\n /**\r\n * @hidden\r\n */\r\n public globalRightIndexTipProximity = 0.0;\r\n\r\n /**\r\n * @hidden\r\n */\r\n public globalLeftIndexTipPosition = new Vector4(0.5, 0.0, -0.55, 1.0);\r\n\r\n /**\r\n * @hidden\r\n */\r\n public globaRightIndexTipPosition = new Vector4(0.0, 0.0, 0.0, 1.0);\r\n\r\n /**\r\n * @hidden\r\n */\r\n public globalLeftThumbTipPosition = new Vector4(0.5, 0.0, -0.55, 1.0);\r\n\r\n /**\r\n * @hidden\r\n */\r\n public globalRightThumbTipPosition = new Vector4(0.0, 0.0, 0.0, 1.0);\r\n\r\n /**\r\n * @hidden\r\n */\r\n public globalLeftIndexMiddlePosition = new Vector4(0.5, 0.0, -0.55, 1.0);\r\n\r\n /**\r\n * @hidden\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 this._blueGradientTexture = new Texture(MRDLSliderThumbMaterial.BLUE_GRADIENT_TEXTURE_URL, scene, true, false, Texture.NEAREST_SAMPLINGMODE);\r\n }\r\n\r\n public needAlphaBlending(): boolean {\r\n return false;\r\n }\r\n\r\n public needAlphaTesting(): boolean {\r\n return false;\r\n }\r\n\r\n public getAlphaTestTexture(): Nullable<BaseTexture> {\r\n return null;\r\n }\r\n\r\n // Methods\r\n public isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n if (this.isFrozen) {\r\n if (subMesh.effect && subMesh.effect._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._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n // Attribs\r\n MaterialHelper.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 MaterialHelper.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 MaterialHelper.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 = new Array<string>();\r\n\r\n MaterialHelper.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 subMesh.effect._wasPreviouslyReady = true;\r\n\r\n return true;\r\n }\r\n\r\n public 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_\", new Texture(\"\", this.getScene()));\r\n this._activeEffect.setTexture(\"_Indirect_Environment_\", new Texture(\"\", this.getScene()));\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_\", new Texture(\"\", this.getScene()));\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);\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 getAnimatables(): IAnimatable[] {\r\n return [];\r\n }\r\n\r\n public dispose(forceDisposeEffect?: boolean): void {\r\n super.dispose(forceDisposeEffect);\r\n }\r\n\r\n public clone(name: string): MRDLSliderThumbMaterial {\r\n return SerializationHelper.Clone(() => new MRDLSliderThumbMaterial(name, this.getScene()), this);\r\n }\r\n\r\n public 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 getClassName(): string {\r\n return \"MRDLSliderThumbMaterial\";\r\n }\r\n\r\n // Statics\r\n public static 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;\rvarying vec3 vPosition;\rvarying vec3 vNormal;\rvarying vec2 vUV;\rvarying vec3 vTangent;\rvarying vec3 vBinormal;\rvarying vec4 vExtra1;\rvarying vec4 vExtra2;\runiform float _Radius_;\runiform float _Line_Width_;\runiform bool _Absolute_Sizes_;\runiform float _Filter_Width_;\runiform vec4 _Base_Color_;\runiform vec4 _Line_Color_;\runiform float _Radius_Top_Left_;\runiform float _Radius_Top_Right_;\runiform float _Radius_Bottom_Left_;\runiform float _Radius_Bottom_Right_;\runiform float _Rate_;\runiform vec4 _Highlight_Color_;\runiform float _Highlight_Width_;\runiform vec4 _Highlight_Transform_;\runiform float _Highlight_;\runiform float _Iridescence_Intensity_;\runiform float _Iridescence_Edge_Intensity_;\runiform vec4 _Iridescence_Tint_;\runiform sampler2D _Iridescent_Map_;\runiform float _Angle_;\runiform bool _Reflected_;\runiform float _Frequency_;\runiform float _Vertical_Offset_;\runiform vec4 _Gradient_Color_;\runiform vec4 _Top_Left_;\runiform vec4 _Top_Right_;\runiform vec4 _Bottom_Left_;\runiform vec4 _Bottom_Right_;\runiform float _Edge_Width_;\runiform float _Edge_Power_;\runiform float _Line_Gradient_Blend_;\runiform float _Fade_Out_;\rvoid FastLinearTosRGB_B353(\rvec4 Linear,\rout vec4 sRGB)\r{\rsRGB.rgb=sqrt(clamp(Linear.rgb,0.0,1.0));\rsRGB.a=Linear.a;\r}\rvoid Round_Rect_Fragment_B332(\rfloat Radius,\rfloat Line_Width,\rvec4 Line_Color,\rfloat Filter_Width,\rvec2 UV,\rfloat Line_Visibility,\rvec4 Rect_Parms,\rvec4 Fill_Color,\rout vec4 Color)\r{\rfloat d=length(max(abs(UV)-Rect_Parms.xy,0.0));\rfloat dx=max(fwidth(d)*Filter_Width,0.00001);\rfloat g=min(Rect_Parms.z,Rect_Parms.w);\rfloat dgrad=max(fwidth(g)*Filter_Width,0.00001);\rfloat Inside_Rect=clamp(g/dgrad,0.0,1.0);\rfloat inner=clamp((d+dx*0.5-max(Radius-Line_Width,d-dx*0.5))/dx,0.0,1.0);\rColor=clamp(mix(Fill_Color,Line_Color,inner),0.0,1.0)*Inside_Rect;\r}\rvoid Iridescence_B343(\rvec3 Position,\rvec3 Normal,\rvec2 UV,\rvec3 Axis,\rvec3 Eye,\rvec4 Tint,\rsampler2D Texture,\rbool Reflected,\rfloat Frequency,\rfloat Vertical_Offset,\rout vec4 Color)\r{\rvec3 i=normalize(Position-Eye);\rvec3 r=reflect(i,Normal);\rfloat idota=dot(i,Axis);\rfloat idotr=dot(i,r);\rfloat x=Reflected ? idotr : idota;\rvec2 xy;\rxy.x=fract((x*Frequency+1.0)*0.5+UV.y*Vertical_Offset);\rxy.y=0.5;\rColor=texture(Texture,xy);\rColor.rgb*=Tint.rgb;\r}\rvoid Scale_RGB_B346(\rvec4 Color,\rfloat Scalar,\rout vec4 Result)\r{\rResult=vec4(Scalar,Scalar,Scalar,1)*Color;\r}\rvoid Scale_RGB_B344(\rfloat Scalar,\rvec4 Color,\rout vec4 Result)\r{\rResult=vec4(Scalar,Scalar,Scalar,1)*Color;\r}\rvoid Line_Fragment_B362(\rvec4 Base_Color,\rvec4 Highlight_Color,\rfloat Highlight_Width,\rvec3 Line_Vertex,\rfloat Highlight,\rout vec4 Line_Color)\r{\rfloat k2=1.0-clamp(abs(Line_Vertex.y/Highlight_Width),0.0,1.0);\rLine_Color=mix(Base_Color,Highlight_Color,Highlight*k2);\r}\rvoid Edge_B356(\rvec4 RectParms,\rfloat Radius,\rfloat Line_Width,\rvec2 UV,\rfloat Edge_Width,\rfloat Edge_Power,\rout float Result)\r{\rfloat d=length(max(abs(UV)-RectParms.xy,0.0));\rfloat edge=1.0-clamp((1.0-d/(Radius-Line_Width))/Edge_Width,0.0,1.0);\rResult=pow(edge,Edge_Power);\r}\rvoid Gradient_B355(\rvec4 Gradient_Color,\rvec4 Top_Left,\rvec4 Top_Right,\rvec4 Bottom_Left,\rvec4 Bottom_Right,\rvec2 UV,\rout vec4 Result)\r{\rvec3 top=Top_Left.rgb+(Top_Right.rgb-Top_Left.rgb)*UV.x;\rvec3 bottom=Bottom_Left.rgb+(Bottom_Right.rgb-Bottom_Left.rgb)*UV.x;\rResult.rgb=Gradient_Color.rgb*(bottom+(top-bottom)*UV.y);\rResult.a=1.0;\r}\rvoid main()\r{\rfloat X_Q338;\rfloat Y_Q338;\rfloat Z_Q338;\rfloat W_Q338;\rX_Q338=vExtra2.x;\rY_Q338=vExtra2.y;\rZ_Q338=vExtra2.z;\rW_Q338=vExtra2.w;\rvec4 Color_Q343;\r#if IRIDESCENCE_ENABLE\nIridescence_B343(vPosition,vNormal,vUV,vBinormal,cameraPosition,_Iridescence_Tint_,_Iridescent_Map_,_Reflected_,_Frequency_,_Vertical_Offset_,Color_Q343);\r#else\nColor_Q343=vec4(0,0,0,0);\r#endif\nvec4 Result_Q344;\rScale_RGB_B344(_Iridescence_Intensity_,Color_Q343,Result_Q344);\rvec4 Line_Color_Q362;\rLine_Fragment_B362(_Line_Color_,_Highlight_Color_,_Highlight_Width_,vTangent,_Highlight_,Line_Color_Q362);\rfloat Result_Q356;\r#if EDGE_ONLY\nEdge_B356(vExtra1,Z_Q338,W_Q338,vUV,_Edge_Width_,_Edge_Power_,Result_Q356);\r#else\nResult_Q356=1.0;\r#endif\nvec2 Vec2_Q339=vec2(X_Q338,Y_Q338);\rvec4 Result_Q355;\rGradient_B355(_Gradient_Color_,_Top_Left_,_Top_Right_,_Bottom_Left_,_Bottom_Right_,Vec2_Q339,Result_Q355);\rvec4 Linear_Q348;\rLinear_Q348.rgb=clamp(Result_Q355.rgb*Result_Q355.rgb,0.0,1.0);\rLinear_Q348.a=Result_Q355.a;\rvec4 Result_Q346;\rScale_RGB_B346(Linear_Q348,Result_Q356,Result_Q346);\rvec4 Sum_Q345=Result_Q346+Result_Q344;\rvec4 Color_At_T_Q347=mix(Line_Color_Q362,Result_Q346,_Line_Gradient_Blend_);\rvec4 Base_And_Iridescent_Q350;\rBase_And_Iridescent_Q350=_Base_Color_+vec4(Sum_Q345.rgb,0.0);\rvec4 Sum_Q349=Color_At_T_Q347+_Iridescence_Edge_Intensity_*Color_Q343;\rvec4 Result_Q351=Sum_Q349; Result_Q351.a=1.0;\rvec4 Color_Q332;\rRound_Rect_Fragment_B332(Z_Q338,W_Q338,Result_Q351,_Filter_Width_,vUV,1.0,vExtra1,Base_And_Iridescent_Q350,Color_Q332);\rvec4 Result_Q354=_Fade_Out_*Color_Q332;\rvec4 sRGB_Q353;\rFastLinearTosRGB_B353(Result_Q354,sRGB_Q353);\rvec4 Out_Color=sRGB_Q353;\rfloat Clip_Threshold=0.001;\rbool To_sRGB=false;\rgl_FragColor=Out_Color;\r}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @hidden */\nexport const mrdlBackplatePixelShader = { name, shader };\n","// Do not edit.\nimport { ShaderStore } from \"core/Engines/shaderStore\";\n\nconst name = \"mrdlBackplateVertexShader\";\nconst shader = `uniform mat4 world;\runiform mat4 viewProjection;\runiform vec3 cameraPosition;\rattribute vec3 position;\rattribute vec3 normal;\rattribute vec3 tangent;\runiform float _Radius_;\runiform float _Line_Width_;\runiform bool _Absolute_Sizes_;\runiform float _Filter_Width_;\runiform vec4 _Base_Color_;\runiform vec4 _Line_Color_;\runiform float _Radius_Top_Left_;\runiform float _Radius_Top_Right_;\runiform float _Radius_Bottom_Left_;\runiform float _Radius_Bottom_Right_;\runiform float _Rate_;\runiform vec4 _Highlight_Color_;\runiform float _Highlight_Width_;\runiform vec4 _Highlight_Transform_;\runiform float _Highlight_;\runiform float _Iridescence_Intensity_;\runiform float _Iridescence_Edge_Intensity_;\runiform vec4 _Iridescence_Tint_;\runiform sampler2D _Iridescent_Map_;\runiform float _Angle_;\runiform bool _Reflected_;\runiform float _Frequency_;\runiform float _Vertical_Offset_;\runiform vec4 _Gradient_Color_;\runiform vec4 _Top_Left_;\runiform vec4 _Top_Right_;\runiform vec4 _Bottom_Left_;\runiform vec4 _Bottom_Right_;\runiform float _Edge_Width_;\runiform float _Edge_Power_;\runiform float _Line_Gradient_Blend_;\runiform float _Fade_Out_;\rvarying vec3 vPosition;\rvarying vec3 vNormal;\rvarying vec2 vUV;\rvarying vec3 vTangent;\rvarying vec3 vBinormal;\rvarying vec4 vExtra1;\rvarying vec4 vExtra2;\rvoid Object_To_World_Pos_B314(\rvec3 Pos_Object,\rout vec3 Pos_World)\r{\rPos_World=(world*vec4(Pos_Object,1.0)).xyz;\r}\rvoid Round_Rect_Vertex_B357(\rvec2 UV,\rfloat Radius,\rfloat Margin,\rfloat Anisotropy,\rfloat Gradient1,\rfloat Gradient2,\rvec3 Normal,\rvec4 Color_Scale_Translate,\rout vec2 Rect_UV,\rout vec4 Rect_Parms,\rout vec2 Scale_XY,\rout vec2 Line_UV,\rout vec2 Color_UV_Info)\r{\rScale_XY=vec2(Anisotropy,1.0);\rLine_UV=(UV-vec2(0.5,0.5));\rRect_UV=Line_UV*Scale_XY;\rRect_Parms.xy=Scale_XY*0.5-vec2(Radius,Radius)-vec2(Margin,Margin);\rRect_Parms.z=Gradient1; \rRect_Parms.w=Gradient2;\rColor_UV_Info=(Line_UV+vec2(0.5,0.5))*Color_Scale_Translate.xy+Color_Scale_Translate.zw;\r}\rvoid Line_Vertex_B333(\rvec2 Scale_XY,\rvec2 UV,\rfloat Time,\rfloat Rate,\rvec4 Highlight_Transform,\rout vec3 Line_Vertex)\r{\rfloat angle2=(Rate*Time)*2.0*3.1416;\rfloat sinAngle2=sin(angle2);\rfloat cosAngle2=cos(angle2);\rvec2 xformUV=UV*Highlight_Transform.xy+Highlight_Transform.zw;\rLine_Vertex.x=0.0;\rLine_Vertex.y=cosAngle2*xformUV.x-sinAngle2*xformUV.y;\rLine_Vertex.z=0.0; \r}\rvoid PickDir_B334(\rfloat Degrees,\rvec3 DirX,\rvec3 DirY,\rout vec3 Dir)\r{\rfloat a=Degrees*3.14159/180.0;\rDir=cos(a)*DirX+sin(a)*DirY;\r}\rvoid Move_Verts_B327(\rfloat Anisotropy,\rvec3 P,\rfloat Radius,\rout vec3 New_P,\rout vec2 New_UV,\rout float Radial_Gradient,\rout vec3 Radial_Dir)\r{\rvec2 UV=P.xy*2.0+0.5;\rvec2 center=clamp(UV,0.0,1.0);\rvec2 delta=UV-center;\rvec2 r2=2.0*vec2(Radius/Anisotropy,Radius);\rNew_UV=center+r2*(UV-2.0*center+0.5);\rNew_P=vec3(New_UV-0.5,P.z);\rRadial_Gradient=1.0-length(delta)*2.0;\rRadial_Dir=vec3(delta*r2,0.0);\r}\rvoid Pick_Radius_B336(\rfloat Radius,\rfloat Radius_Top_Left,\rfloat Radius_Top_Right,\rfloat Radius_Bottom_Left,\rfloat Radius_Bottom_Right,\rvec3 Position,\rout float Result)\r{\rbool whichY=Position.y>0.0;\rResult=Position.x<0.0 ? (whichY ? Radius_Top_Left : Radius_Bottom_Left) : (whichY ? Radius_Top_Right : Radius_Bottom_Right);\rResult*=Radius;\r}\rvoid Edge_AA_Vertex_B328(\rvec3 Position_World,\rvec3 Position_Object,\rvec3 Normal_Object,\rvec3 Eye,\rfloat Radial_Gradient,\rvec3 Radial_Dir,\rvec3 Tangent,\rout float Gradient1,\rout float Gradient2)\r{\rvec3 I=(Eye-Position_World);\rvec3 T=(vec4(Tangent,0.0)).xyz;\rfloat g=(dot(T,I)<0.0) ? 0.0 : 1.0;\rif (Normal_Object.z==0.0) { \rGradient1=Position_Object.z>0.0 ? g : 1.0;\rGradient2=Position_Object.z>0.0 ? 1.0 : g;\r} else {\rGradient1=g+(1.0-g)*(Radial_Gradient);\rGradient2=1.0;\r}\r}\rvoid Object_To_World_Dir_B330(\rvec3 Dir_Object,\rout vec3 Binormal_World,\rout vec3 Binormal_World_N,\rout float Binormal_Length)\r{\rBinormal_World=(world*vec4(Dir_Object,0.0)).xyz;\rBinormal_Length=length(Binormal_World);\rBinormal_World_N=Binormal_World/Binormal_Length;\r}\rvoid RelativeOrAbsoluteDetail_B341(\rfloat Nominal_Radius,\rfloat Nominal_LineWidth,\rbool Absolute_Measurements,\rfloat Height,\rout float Radius,\rout float Line_Width)\r{\rfloat scale=Absolute_Measurements ? 1.0/Height : 1.0;\rRadius=Nominal_Radius*scale;\rLine_Width=Nominal_LineWidth*scale;\r}\rvoid main()\r{\rvec3 Nrm_World_Q326;\rNrm_World_Q326=normalize((world*vec4(normal,0.0)).xyz);\rvec3 Tangent_World_Q329;\rvec3 Tangent_World_N_Q329;\rfloat Tangent_Length_Q329;\rTangent_World_Q329=(world*vec4(vec3(1,0,0),0.0)).xyz;\rTangent_Length_Q329=length(Tangent_World_Q329);\rTangent_World_N_Q329=Tangent_World_Q329/Tangent_Length_Q329;\rvec3 Binormal_World_Q330;\rvec3 Binormal_World_N_Q330;\rfloat Binormal_Length_Q330;\rObject_To_World_Dir_B330(vec3(0,1,0),Binormal_World_Q330,Binormal_World_N_Q330,Binormal_Length_Q330);\rfloat Radius_Q341;\rfloat Line_Width_Q341;\rRelativeOrAbsoluteDetail_B341(_Radius_,_Line_Width_,_Absolute_Sizes_,Binormal_Length_Q330,Radius_Q341,Line_Width_Q341);\rvec3 Dir_Q334;\rPickDir_B334(_Angle_,Tangent_World_N_Q329,Binormal_World_N_Q330,Dir_Q334);\rfloat Result_Q336;\rPick_Radius_B336(Radius_Q341,_Radius_Top_Left_,_Radius_Top_Right_,_Radius_Bottom_Left_,_Radius_Bottom_Right_,position,Result_Q336);\rfloat Anisotropy_Q331=Tangent_Length_Q329/Binormal_Length_Q330;\rvec4 Out_Color_Q337=vec4(Result_Q336,Line_Width_Q341,0,1);\rvec3 New_P_Q327;\rvec2 New_UV_Q327;\rfloat Radial_Gradient_Q327;\rvec3 Radial_Dir_Q327;\rMove_Verts_B327(Anisotropy_Q331,position,Result_Q336,New_P_Q327,New_UV_Q327,Radial_Gradient_Q327,Radial_Dir_Q327);\rvec3 Pos_World_Q314;\rObject_To_World_Pos_B314(New_P_Q327,Pos_World_Q314);\rfloat Gradient1_Q328;\rfloat Gradient2_Q328;\r#if SMOOTH_EDGES\nEdge_AA_Vertex_B328(Pos_World_Q314,position,normal,cameraPosition,Radial_Gradient_Q327,Radial_Dir_Q327,tangent,Gradient1_Q328,Gradient2_Q328);\r#else\nGradient1_Q328=1.0;\rGradient2_Q328=1.0;\r#endif\nvec2 Rect_UV_Q357;\rvec4 Rect_Parms_Q357;\rvec2 Scale_XY_Q357;\rvec2 Line_UV_Q357;\rvec2 Color_UV_Info_Q357;\rRound_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);\rvec3 Line_Vertex_Q333;\rLine_Vertex_B333(Scale_XY_Q357,Line_UV_Q357,(20.0),_Rate_,_Highlight_Transform_,Line_Vertex_Q333);\rfloat X_Q359;\rfloat Y_Q359;\rX_Q359=Color_UV_Info_Q357.x;\rY_Q359=Color_UV_Info_Q357.y;\rvec4 Vec4_Q358=vec4(X_Q359,Y_Q359,Result_Q336,Line_Width_Q341);\rvec3 Position=Pos_World_Q314;\rvec3 Normal=Nrm_World_Q326;\rvec2 UV=Rect_UV_Q357;\rvec3 Tangent=Line_Vertex_Q333;\rvec3 Binormal=Dir_Q334;\rvec4 Color=Out_Color_Q337;\rvec4 Extra1=Rect_Parms_Q357;\rvec4 Extra2=Vec4_Q358;\rvec4 Extra3=vec4(0,0,0,0);\rgl_Position=viewProjection*vec4(Position,1);\rvPosition=Position;\rvNormal=Normal;\rvUV=UV;\rvTangent=Tangent;\rvBinormal=Binormal;\rvExtra1=Extra1;\rvExtra2=Extra2;\r}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @hidden */\nexport const mrdlBackplateVertexShader = { name, shader };\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { Nullable } from \"core/types\";\r\nimport { SerializationHelper, serialize } from \"core/Misc/decorators\";\r\nimport { Matrix, Vector4 } from \"core/Maths/math.vector\";\r\nimport { IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { MaterialHelper } from \"core/Materials/materialHelper\";\r\nimport { IEffectCreationOptions } from \"core/Materials/effect\";\r\nimport { PushMaterial } from \"core/Materials/pushMaterial\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { SubMesh } from \"core/Meshes/subMesh\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { 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\n\r\n/** @hidden */\r\nclass MRDLBackplateMaterialDefines extends MaterialDefines {\r\n /*\r\n \"IRIDESCENCE_ENABLE\", \"SMOOTH_EDGES\"\r\n */\r\n public IRIDESCENCE_ENABLED = 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/meshes/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 /** @hidden */\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 /** @hidden */\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 /** @hidden */\r\n public _highlightTransform = new Vector4(1, 1, 0, 0);\r\n\r\n /** @hidden */\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 /** @hidden */\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 /** @hidden */\r\n public _reflected = true;\r\n\r\n /** @hidden */\r\n public _frequency = 1;\r\n\r\n /** @hidden */\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\r\n this._iridescentMapTexture = new Texture(MRDLBackplateMaterial.IRIDESCENT_MAP_TEXTURE_URL, this.getScene(), true, false, Texture.NEAREST_SAMPLINGMODE);\r\n }\r\n\r\n public needAlphaBlending(): boolean {\r\n return false;\r\n }\r\n\r\n public needAlphaTesting(): boolean {\r\n return false;\r\n }\r\n\r\n public getAlphaTestTexture(): Nullable<BaseTexture> {\r\n return null;\r\n }\r\n\r\n // Methods\r\n public isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n if (this.isFrozen) {\r\n if (subMesh.effect && subMesh.effect._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._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n\r\n // Attribs\r\n MaterialHelper.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 MaterialHelper.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 MaterialHelper.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[] = [];\r\n const uniformBuffers = new Array<string>();\r\n\r\n MaterialHelper.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 subMesh.effect._wasPreviouslyReady = true;\r\n\r\n return true;\r\n }\r\n\r\n public 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);\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 getAnimatables(): IAnimatable[] {\r\n return [];\r\n }\r\n\r\n public dispose(forceDisposeEffect?: boolean): void {\r\n super.dispose(forceDisposeEffect);\r\n }\r\n\r\n public clone(name: string): MRDLBackplateMaterial {\r\n return SerializationHelper.Clone(() => new MRDLBackplateMaterial(name, this.getScene()), this);\r\n }\r\n\r\n public 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 getClassName(): string {\r\n return \"MRDLBackplateMaterial\";\r\n }\r\n\r\n // Statics\r\n public static 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 { Nullable } from \"core/types\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { 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 { 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\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/meshes/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 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 // Mesh association\r\n protected _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\r\n SceneLoader.ImportMeshAsync(undefined, Slider3D.MODEL_BASE_URL, Slider3D.MODEL_FILENAME, scene).then((result) => {\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.isPickable = false;\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 sliderBarModel.isPickable = false;\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\r\n this._affectMaterial(sliderBackplate);\r\n return sliderBackplate;\r\n }\r\n\r\n protected _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 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 { float } from \"core/types\";\r\n\r\nimport { VolumeBasedPanel } from \"./volumeBasedPanel\";\r\nimport { 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 _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 { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { 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 /** @hidden */\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 _getTypeName(): string {\r\n return \"TouchMeshButton3D\";\r\n }\r\n\r\n // Mesh association\r\n protected _createNode(): TransformNode {\r\n this._currentMesh.getChildMeshes().forEach((mesh) => {\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 _affectMaterial(mesh: AbstractMesh) {}\r\n}\r\n","import { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { CreateBox } from \"core/Meshes/Builders/boxBuilder\";\r\nimport { 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 { AbstractMesh } from \"core/Meshes/abstractMesh\";\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/meshes/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(name?: string, private _shareMaterials = true) {\r\n super(name);\r\n }\r\n\r\n protected _getTypeName(): string {\r\n return \"HolographicBackplate\";\r\n }\r\n\r\n // Mesh association\r\n protected _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\r\n SceneLoader.ImportMeshAsync(undefined, HolographicBackplate.MODEL_BASE_URL, 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 _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 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","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { Nullable } from \"core/types\";\r\nimport { Observable, Observer } from \"core/Misc/observable\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { PointerInfo, PointerEventTypes } from \"core/Events/pointerEvents\";\r\nimport { Material } from \"core/Materials/material\";\r\nimport { HemisphericLight } from \"core/Lights/hemisphericLight\";\r\nimport { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { UtilityLayerRenderer } from \"core/Rendering/utilityLayerRenderer\";\r\nimport { EngineStore } from \"core/Engines/engineStore\";\r\nimport { IDisposable, Scene } from \"core/scene\";\r\n\r\nimport { Container3D } from \"./controls/container3D\";\r\nimport { Control3D } from \"./controls/control3D\";\r\nimport { 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/how_to/gui3d\r\n */\r\nexport class GUI3DManager implements IDisposable {\r\n private _scene: Scene;\r\n private _sceneDisposeObserver: Nullable<Observer<Scene>>;\r\n private _utilityLayer: Nullable<UtilityLayerRenderer>;\r\n private _rootContainer: Container3D;\r\n private _pointerObserver: Nullable<Observer<PointerInfo>>;\r\n private _pointerOutObserver: Nullable<Observer<number>>;\r\n private _customControlScaling = 1.0;\r\n /** @hidden */\r\n public _lastPickedControl: Control3D;\r\n /** @hidden */\r\n public _lastControlOver: { [pointerId: number]: Control3D } = {};\r\n /** @hidden */\r\n public _lastControlDown: { [pointerId: number]: Control3D } = {};\r\n\r\n protected static MRTK_REALISTIC_SCALING: number = 0.032;\r\n\r\n /**\r\n * Observable raised when the point picked by the pointer events changed\r\n */\r\n public onPickedPointChangedObservable = new Observable<Nullable<Vector3>>();\r\n\r\n /**\r\n * Observable raised when a picking happens\r\n */\r\n public onPickingObservable = new Observable<Nullable<AbstractMesh>>();\r\n\r\n // Shared resources\r\n /** @hidden */\r\n public _sharedMaterials: { [key: string]: Material } = {};\r\n\r\n /** @hidden */\r\n public _touchSharedMaterials: { [key: string]: Material } = {};\r\n\r\n /** Gets the hosting scene */\r\n public get scene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n /** Gets associated utility layer */\r\n public get utilityLayer(): Nullable<UtilityLayerRenderer> {\r\n return this._utilityLayer;\r\n }\r\n\r\n /** Gets the scaling for all UI elements owned by this manager */\r\n public get controlScaling() {\r\n return this._customControlScaling;\r\n }\r\n\r\n /** Sets the scaling adjustment for all UI elements owned by this manager */\r\n public set controlScaling(newScale: number) {\r\n if (this._customControlScaling !== newScale && newScale > 0) {\r\n const scaleRatio = newScale / this._customControlScaling;\r\n this._customControlScaling = newScale;\r\n\r\n this._rootContainer.children.forEach((control: Control3D) => {\r\n control.scaling.scaleInPlace(scaleRatio);\r\n\r\n if (newScale !== 1) {\r\n control._isScaledByManager = true;\r\n }\r\n });\r\n }\r\n }\r\n\r\n /** Gets if controls attached to this manager are realistically sized, based on the fact that 1 unit length is 1 meter */\r\n public get useRealisticScaling() {\r\n return this.controlScaling === GUI3DManager.MRTK_REALISTIC_SCALING;\r\n }\r\n\r\n /** Sets if controls attached to this manager are realistically sized, based on the fact that 1 unit length is 1 meter */\r\n public set useRealisticScaling(newValue: boolean) {\r\n this.controlScaling = newValue ? GUI3DManager.MRTK_REALISTIC_SCALING : 1;\r\n }\r\n\r\n /**\r\n * Creates a new GUI3DManager\r\n * @param scene\r\n */\r\n public constructor(scene?: Scene) {\r\n this._scene = scene || EngineStore.LastCreatedScene!;\r\n this._sceneDisposeObserver = this._scene.onDisposeObservable.add(() => {\r\n this._sceneDisposeObserver = null;\r\n this._utilityLayer = null;\r\n this.dispose();\r\n });\r\n\r\n this._utilityLayer = UtilityLayerRenderer._CreateDefaultUtilityLayerFromScene(this._scene);\r\n this._utilityLayer.onlyCheckPointerDownEvents = false;\r\n this._utilityLayer.pickUtilitySceneFirst = false;\r\n this._utilityLayer.mainSceneTrackerPredicate = (mesh: Nullable<AbstractMesh>) => {\r\n return mesh && mesh.reservedDataStore?.GUI3D?.control?._node;\r\n };\r\n\r\n // Root\r\n this._rootContainer = new Container3D(\"RootContainer\");\r\n this._rootContainer._host = this;\r\n 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\") {\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","import * 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 (<any>globalObject).BABYLON.GUI = GUI;\r\n}\r\n\r\nexport * from \"gui/index\";\r\n","import * as gui from \"gui/legacy/legacy\";\r\n\r\nexport { gui };\r\nexport default gui;\r\n"],"names":["root","factory","exports","module","require","define","amd","self","global","this","__WEBPACK_EXTERNAL_MODULE__520__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","d","definition","key","o","Object","defineProperty","enumerable","get","g","globalThis","Function","e","window","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","extendStatics","b","setPrototypeOf","__proto__","Array","p","__extends","TypeError","String","__","constructor","create","__decorate","decorators","target","desc","c","arguments","length","getOwnPropertyDescriptor","Reflect","decorate","i","unit","negativeValueAllowed","ValueAndUnit","UNITMODE_PIXEL","_value","_unit","ignoreAdaptiveScaling","onChangedObservable","Observable","_originalUnit","UNITMODE_PERCENTAGE","notifyObservers","getValueInPixel","host","refValue","isPixel","getValue","updateInPlace","width","height","idealWidth","getSize","idealHeight","useSmallestIdeal","innerWidth","innerHeight","toString","decimals","percentage","toFixed","pixels","fromString","source","match","_Regex","exec","sourceValue","parseFloat","sourceUnit","_UNITMODE_PERCENTAGE","_UNITMODE_PIXEL","tmpRect","Vector2","tmpRect2","tmpV1","tmpV2","left","top","copyFrom","other","copyFromFloats","CombineToRef","a","result","Math","min","right","max","bottom","addAndTransformToRef","transform","addX","addY","addWidth","addHeight","Number","MAX_VALUE","transformCoordinates","x","y","floor","ceil","transformToRef","isEqualsTo","Empty","Measure","buttonIndex","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","Matrix2D","IdentityToRef","TranslationToRef","ScalingToRef","RotationToRef","angle","s","sin","cos","ComposeToRef","tx","ty","scaleX","scaleY","parentMatrix","_TempPreTranslationMatrix","_TempScalingMatrix","_TempRotationMatrix","_TempPostTranslationMatrix","_TempCompose0","_TempCompose1","_TempCompose2","name","_alpha","_alphaSet","_zIndex","_currentMeasure","_tempPaddingMeasure","_fontFamily","_fontStyle","_fontWeight","_fontSize","_width","_height","_color","_style","_horizontalAlignment","Control","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","_isMatrixDirty","_isVisible","_isHighlighted","_highlightColor","_highlightLineWidth","_fontSet","_dummyVector2","_downCount","_enterCount","_doNotRender","_downPointerIds","_evaluatedMeasure","_evaluatedParentMeasure","_isEnabled","_disabledColor","_disabledColorItem","_isReadOnly","_rebuildLayout","_customData","_isClipped","_automaticSize","metadata","isHitTestVisible","isPointerBlocker","isFocusInvisible","clipChildren","clipContent","useBitmapCache","_shadowOffsetX","_shadowOffsetY","_shadowBlur","_previousShadowBlur","_shadowColor","hoverCursor","_linkOffsetX","_linkOffsetY","onWheelObservable","onPointerMoveObservable","onPointerOutObservable","onPointerDownObservable","onPointerUpObservable","onPointerClickObservable","onPointerEnterObservable","onDirtyObservable","onBeforeDrawObservable","onAfterDrawObservable","onDisposeObservable","fixedRatio","_fixedRatioMasterIsWidth","_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","children","forEach","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","Matrix","getTransformMatrix","_moveToProjectedPosition","z","notRenderable","Tools","getDescendantsToRef","results","directDescendantsOnly","predicate","getDescendants","linkWithMesh","mesh","index","_linkedControls","indexOf","splice","push","setPadding","setPaddingInPixels","oldLeft","oldTop","parentMeasure","_processMeasures","getContext","newLeft","newTop","abs","_offsetLeft","_offsetTop","_flagDescendantsAsMatrixDirty","_intersectsRect","rect","context","_transform","_computeAdditionnalOffsetX","_computeAdditionnalOffsetY","invalidateRect","useInvalidateRectOptimization","shadowOffsetX","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","_applyStates","_isFontSizeInPercentage","font","fillStyle","AllowAlphaInheritance","globalAlpha","renderToIntermediateTexture","alpha","_layout","isDirty","isVisible","_numLayoutCalls","_paddingLeftInPixels","_paddingTopInPixels","_paddingRightInPixels","_paddingBottomInPixels","rebuildCount","Logger","_evaluateClippingState","descendantsOnlyPadding","_preMeasure","_measure","_computeAlignment","_additionalProcessing","hasObservers","parentWidth","parentHeight","HORIZONTAL_ALIGNMENT_RIGHT","VERTICAL_ALIGNMENT_BOTTOM","_clipForChildren","_clip","invalidatedRectangle","beginPath","_ClipMeasure","intersection","clip","_render","_numRenderCalls","_cacheData","putImageData","_draw","getImageData","contains","_shouldBlockPointer","_processPicking","pi","type","pointerId","deltaX","deltaY","_processObservables","_onPointerMove","coordinates","_onPointerEnter","canNotify","_onPointerDown","Vector2WithInfo","_onPointerUp","notifyClick","canNotifyClick","_forcePointerUp","_onWheelScroll","_onCanvasBlur","PointerEventTypes","previousControlOver","_registerLastControlDown","_lastPickedControl","_lastControlDown","fontStyle","fontWeight","fontSizeInPixels","fontFamily","_GetFontOffset","child","serialize","serializationObject","SerializationHelper","_parseFromContent","serializedObject","dispose","clear","removeControl","_HORIZONTAL_ALIGNMENT_LEFT","_HORIZONTAL_ALIGNMENT_RIGHT","_HORIZONTAL_ALIGNMENT_CENTER","_VERTICAL_ALIGNMENT_TOP","_VERTICAL_ALIGNMENT_BOTTOM","_VERTICAL_ALIGNMENT_CENTER","_FontHeightSizes","engine","EngineStore","Error","getFontOffset","Parse","controlType","drawEllipse","arc","PI","closePath","AddHeader","RegisterClass","_children","_measureForChildren","_background","_adaptWidthToChildren","_adaptHeightToChildren","_renderToIntermediateTexture","_intermediateTexture","logLayoutCycleErrors","maxLayoutCycle","isReadOnly","getChildByName","getChildByType","typeName","containsControl","addControl","clearControls","slice","_cleanControlAfterRemoval","wasAdded","_localDraw","shadowColor","fillRect","_beforeLayout","scaleTo","DynamicTexture","Texture","Constants","hasAlpha","computedWidth","computedHeight","adaptWidthToChildren","adaptHeightToChildren","_postMeasure","renderToIntermediateTextureThisDraw","contextToDrawTo","clearRect","drawImage","canvas","item","_changeCursor","childSerializationObject","childData","Container","TextWrapping","_thickness","_cornerRadius","isEnabled","disabledColor","_drawRoundedRect","fill","color","stroke","radius","moveTo","lineTo","quadraticCurveTo","Rectangle","text","_text","_textWrapping","Clip","_textHorizontalAlignment","_textVerticalAlignment","_resizeToFit","_lineSpacing","_outlineWidth","_outlineColor","_underline","_lineThrough","onTextChangedObservable","onLinesReadyObservable","_lines","_breakLines","maxLineWidth","line","newWidth","internalValue","newHeight","lineSpacing","_drawText","textWidth","outlineWidth","strokeText","fillText","round","_renderLines","outlineColor","lineJoin","miterLimit","refWidth","refHeight","lines","split","Ellipsis","_line","_parseLineEllipsis","WordWrap","_parseLineWordWrap","WordWrapEllipsis","_parseLineWordWrapEllipsis","_parseLine","textMetrics","measureText","actualBoundingBoxLeft","actualBoundingBoxRight","_getCharsToRemove","lineLength","diff","charWidth","removeChars","characters","from","join","words","wordSplittingFunction","n","testLine","metrics","testWidth","_computeHeightForLinesOf","lastLine","currentLine","linesToRemove","pop","rootY","ascent","descent","lineCount","computeExpectedHeight","widthInPixels","createCanvas","heightInPixels","TextBlock","url","_workingCanvas","_loaded","_stretch","Image","STRETCH_FILL","_autoScale","_sourceLeft","_sourceTop","_sourceWidth","_sourceHeight","_svgAttributesComputationCompleted","_isSVG","_cellWidth","_cellHeight","_cellId","_populateNinePatchSlicesFromImage","_imageDataCache","data","onImageLoadedObservable","onSVGAttributesComputedObservable","_detectPointerOnOpaqueOnly","_sliceLeft","_sliceRight","_sliceTop","_sliceBottom","_imageWidth","_imageHeight","_extractNinePatchSliceDataFromImage","synchronizeSizeWithContent","_rotate90","preserveProperties","_domImage","getEngine","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","_source","_svgCheck","createCanvasImage","src","SVGSVGElement","search","lastIndexOf","document","body","querySelector","svgDoc","contentDocument","documentElement","vb","getAttribute","docwidth","docheight","getElementById","_getSVGAttribs","addEventListener","svgImage","createElement","appendChild","svgobj","svgsrc","elemid","elem","vb_width","vb_height","elem_bbox","getBBox","elem_matrix_a","elem_matrix_d","elem_matrix_e","elem_matrix_f","mainMatrix","baseVal","consolidate","matrix","f","STRETCH_NONE","STRETCH_UNIFORM","STRETCH_NINE_PATCH","STRETCH_EXTEND","_prepareWorkingCanvasForOpaqueDetection","_drawImage","sx","sy","sw","sh","tw","th","cellId","rowCount","naturalWidth","cellWidth","column","row","cellHeight","hRatio","vRatio","ratio","centerX","centerY","_renderNinePatch","leftWidth","topHeight","bottomHeight","rightWidth","centerWidth","centerHeight","targetCenterWidth","targetCenterHeight","centerLeftOffset","centerTopOffset","rightOffset","bottomOffset","sliceRight","sliceLeft","delegatePickingToChildren","thickness","alphaStore","pointerEnterAnimation","pointerOutAnimation","pointerDownAnimation","pointerUpAnimation","_image","_textBlock","textBlockName","imageName","CreateImageButton","imageUrl","textBlock","textWrapping","textHorizontalAlignment","iconImage","stretch","CreateImageOnlyButton","CreateSimpleButton","CreateImageWithCenterTextButton","Button","_isVertical","_manualWidth","_manualHeight","_doNotTrackManualChanges","_spacing","ignoreLayoutWarnings","isVertical","stackWidth","stackHeight","childrenCount","panelWidthChanged","panelHeightChanged","previousHeight","previousWidth","manualWidth","manualHeight","StackPanel","_isChecked","_checkSizeRatio","onIsCheckedChangedObservable","actualWidth","actualHeight","offsetWidth","offsetHeight","isChecked","AddCheckBoxWithHeader","title","onValueChanged","panel","checkbox","Checkbox","header","_characters","txt","removePart","idxStart","idxEnd","insertTxt","newCharacters","to","pack","ar","l","concat","charAt","idx","substr","temp","substring","isWord","rWord","_placeholderText","_focusedBackground","_focusedColor","_placeholderColor","_margin","_autoStretchWidth","_maxWidth","_isFocused","_blinkIsEven","_cursorOffset","_deadKey","_addKey","_currentKey","_isTextHighlightOn","_textHighlightColor","_highligherOpacity","_highlightedText","_startHighlightIndex","_endHighlightIndex","_cursorIndex","_onFocusSelectAll","_isPointerDown","promptMessage","disableMobilePrompt","onBeforeKeyAddObservable","onFocusObservable","onBlurObservable","onTextHighlightObservable","onTextCopyObservable","onTextCutObservable","onTextPasteObservable","onKeyboardEventProcessedObservable","flag","_textWrapper","valueAsString","TextWrapper","_textHasChanged","autoStretchWidth","onBlur","_scrollLeft","clearTimeout","_blinkTimeout","unRegisterClipboardEvents","_onClipboardObserver","onClipboardObservable","_onPointerDblTapObserver","onPointerObservable","onFocus","_focusedBy","prompt","focusedControl","registerClipboardEvents","clipboardInfo","ClipboardEventTypes","_onCopyText","event","_onCutText","_onPasteText","pointerInfo","_processDblClick","_selectAllText","focus","moveFocusToControl","blur","keepsFocusWith","_connectedVirtualKeyboard","processKey","keyCode","evt","ctrlKey","metaKey","preventDefault","deletePosition","shiftKey","code","deadKey","insertPosition","_updateValueFromCursorIndex","moveLeft","moveRight","_clickedCoordinate","processKeyboard","ev","clipboardData","setData","types","getData","clipTextLeft","_beforeRenderText","_textWidth","marginWidth","availableWidth","textLeft","absoluteCursorPosition","currentSize","previousDist","cursorOffsetText","cursorOffsetWidth","cursorLeft","setTimeout","highlightCursorOffsetWidth","highlightCursorLeft","focusedColor","_capturingControl","pointerType","textWrapper","InputText","_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","parseInt","columns","rows","tags","cd","rd","columnValue","rowValue","cellInfo","rowNumber","columnNumber","Grid","Color3","_tmpColor","_pointerStartedOnSquare","_pointerStartedOnWheel","_squareLeft","_squareTop","_squareSize","_h","_s","_v","_lastPointerDownId","onValueChangedObservable","_pointerIsDown","size","equals","toHSVToRef","ColorPicker","_Epsilon","_updateSquareProps","squareSize","sqrt","_drawGradientSquare","hueValue","lgh","createLinearGradient","addColorStop","lgv","_drawCircle","_createColorWheelCanvas","image","maxDistSq","innerRadius","minDistSq","distSq","dist","ang","atan2","alphaRatio","alphaAmount","wheelThickness","_colorWheelCanvas","cx","cy","_updateValueFromPointer","_isPointOnSquare","_isPointOnWheel","dx","dy","ShowPickerDialogAsync","advancedTexture","options","Promise","resolve","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","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","rValInt","updateInt","gValInt","bValInt","rValDec","updateFloat","gValDec","bValDec","hexValueQuadrant","labelText","hexVal","minusPound","inputField","pickedColor","field","channel","newValue","test","newSwatchRGB","createSwatch","icon","swatchColor","swatchLuminence","mode","button","currentRows","thisRow","totalButtonsThisRow","buttonIterations","w","swatch","enableButton","disabled","val","newHexValue","checkHex","leadingZero","Ellipse","_unfocusedColor","displose","FocusableButton","pwdTextWrapper","InputPassword","_lineWidth","_x1","_y1","_x2","_y2","_dash","_connectedControl","_connectedControlDirtyObserver","setLineDash","_effectiveX2","_effectiveY2","end","x2","y2","x1","y1","Line","multiLine","_multiLine","_x","_y","_point","_control","_controlObserver","onPointUpdate","_mesh","_meshObserver","onAfterCameraRenderObservable","resetLinks","_translatePoint","getProjectedPositionWithZ","getBoundingInfo","boundingSphere","center","getWorldMatrix","xValue","_canvas","yValue","_points","getAt","MultiLinePoint","items","map","point","AbstractMesh","reset","previousPoint","first","_minX","_minY","_maxX","_maxY","MultiLine","group","executeOnAllControls","childRadio","offseHeight","AddRadioButtonWithHeader","radio","RadioButton","_thumbWidth","_minimum","_maximum","_barOffset","_isThumbClamped","_displayThumb","_step","_effectiveBarOffset","_getThumbPosition","maximum","minimum","_backgroundBoxLength","_getThumbThickness","thumbThickness","_backgroundBoxThickness","_prepareRenderingData","_renderLeft","_renderTop","_renderWidth","_renderHeight","_effectiveThumbThickness","displayThumb","console","error","isThumbClamped","rotation","_borderColor","_thumbColor","_isThumbCircle","_displayValueBar","isThumbCircle","thumbPosition","BaseSlider","Slider","_groupPanel","_selectors","_groupHeader","_addGroupHeader","label","groupHeading","_getSelector","selectorNb","removeSelector","addCheckbox","func","checked","state","_selector","isHorizontal","controlFirst","groupPanel","selectors","buttonBackground","_setSelectorLabel","_setSelectorLabelColor","_setSelectorButtonColor","_setSelectorButtonBackground","SelectorGroup","_selectNb","addRadio","nb","addSlider","onValueChange","v","borderColor","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","_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","leftInPixels","topInPixels","origLeftForChildren","origTopForChildren","_updateChildrenMeasures","_parentMeasure","_scrollChildren","_scrollChildrenWithBuckets","scrollLeft","scrollTop","maxWidth","parentClientWidth","maxHeight","parentClientHeight","_tempMeasure","_first","_originX","_originY","delta","_thumbLength","_thumbHeight","_barImageHeight","num90RotationInVerticalMode","_backgroundBaseImage","isLoaded","_backgroundImage","rotatedValue","_thumbBaseImage","_thumbImage","isImageBased","_barSize","_pointerIsOver","_wheelPrecision","_horizontalBarImageHeight","_verticalBarImageHeight","_oldWindowContentsWidth","_oldWindowContentsHeight","_forceHorizontalBar","_forceVerticalBar","_useImageBar","_horizontalBarSpace","_verticalBarSpace","_dragSpace","_grid","_horizontalBar","ImageScrollBar","_verticalBar","ScrollBar","_window","_ScrollViewerWindow","_addBar","barColor","barBackground","freezeControls","bucketWidth","bucketHeight","resetWindow","_buildClientSizes","idealRatio","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","barOffset","_onWheelObserver","ScrollViewer","onIsActiveChangedObservable","_isActive","toActiveAnimation","toInactiveAnimation","pointerEnterActiveAnimation","pointerOutActiveAnimation","pointerDownActiveAnimation","pointerUpActiveAnimation","pointerEnterInactiveAnimation","pointerOutInactiveAnimation","pointerDownInactiveAnimation","pointerUpInactiveAnimation","_group","childToggle","isActive","ToggleButton","onKeyPressObservable","defaultButtonWidth","defaultButtonHeight","defaultButtonPaddingLeft","defaultButtonPaddingRight","defaultButtonPaddingTop","defaultButtonPaddingBottom","defaultButtonColor","defaultButtonBackground","shiftButtonColor","selectedShiftThickness","shiftState","_currentlyConnectedInputText","_connectedInputTexts","_onKeyPressObserver","_createKey","propertySet","addKeysRow","keys","propertySets","maxKey","properties","applyShiftState","rowContainer","button_tblock","toUpperCase","toLowerCase","connect","input","some","onFocusObserver","onBlurObserver","disconnect","filtered","filter","_removeConnectedInputObservables","connectedInputText","CreateDefaultLayout","returnValue","VirtualKeyboard","_minorLineTickness","_minorLineColor","_majorLineTickness","_majorLineColor","_majorLineFrequency","_displayMajorLines","_displayMinorLines","cellCountX","cellCountY","cellX","cellY","DisplayGrid","_valueBarImage","valueBarImage","ImageBasedSlider","generateMipMaps","samplingMode","invertY","_isFullscreen","_fullscreenViewport","Viewport","_idealWidth","_idealHeight","_useSmallestIdeal","_renderAtIdealSize","_blockNextFocusCheck","_renderScale","_cursorChanged","_defaultMousePointerId","_clipboardData","onControlPickedObservable","onBeginLayoutObservable","onEndLayoutObservable","onBeginRenderObservable","onEndRenderObservable","premulAlpha","applyYInversionOnUpdate","checkPointerEveryFrame","_useInvalidateRectOptimization","_invalidatedRectangle","_clearMeasure","_onClipboardCopy","rawEvt","ClipboardInfo","_onClipboardCut","_onClipboardPaste","_texture","_rootElement","getInputElement","_renderObserver","onBeforeCameraRenderObservable","camera","_checkUpdate","_preKeyboardObserver","onPreKeyboardObservable","info","_focusedControl","KeyboardEventTypes","skipOnPointerObservable","_resizeObserver","onResizeObservable","_onResize","isReady","rwidth","rheight","_layerToDispose","getChildren","getControlsByType","getControlByName","_getControlByKey","find","layer","isBackground","invalidMinX","invalidMinY","invalidMaxX","invalidMaxY","maxX","maxY","createStyle","Style","moveToNonOverlappedPosition","overlapGroup","deltaStep","repelFactor","controlsForGroup","isArray","descendants","control1","velocity","control2","AdvancedDynamicTexture","_Overlaps","subtract","diffLength","normalize","overlapDeltaMultiplier","linkOffsetXInPixels","linkOffsetYInPixels","_pointerMoveObserver","onPrePointerObservable","_sceneRenderObserver","onBeforeRenderObservable","_pointerObserver","_canvasPointerOutObserver","onCanvasPointerOutObservable","_canvasBlurObserver","onCanvasBlurObservable","texture","getRenderWidth","getRenderHeight","globalViewPort","toGlobal","targetX","rootContainer","targetY","getProjectedPosition","worldMatrix","layerMask","isDisposed","update","AllowGPUOptimizations","cursor","style","_doPicking","cameraToUseForPointers","activeCamera","viewport","doNotHandleCursors","_manageFocus","_cleanControlAfterRemovalFromList","list","_translateToPicking","tempViewport","originalCameraToUseForPointers","rigCameras","rigCamera","toGlobalToRef","pointerX","getHardwareScalingLevel","pointerY","attach","isPointerCaptured","_attachPickingToSceneRender","_attachToOnPointerOut","_attachToOnBlur","removeEventListener","attachToMesh","supportPointerMove","pickInfo","hit","pickedMesh","uv","getTextureCoordinates","friendlyControls","canMoveFocus","otherHost","enablePointerMoveEvents","pick","pickFunction","forcePicking","pointerEvent","entries","serializeContent","parseContent","scaleToSize","parseFromSnippetAsync","snippetId","reject","request","WebRequest","readyState","status","snippet","JSON","parse","responseText","jsonPayload","gui","open","SnippetUrl","replace","send","parseFromURLAsync","CreateForMesh","onlyAlphaTesting","materialSetupCallback","_CreateMaterial","RandomGUID","internalClassType","GetClass","material","backFaceCulling","diffuseColor","specularColor","diffuseTexture","emissiveTexture","opacityTexture","CreateForMeshTexture","CreateFullscreenUI","foreground","sampling","adaptiveScaling","resultScene","Layer","newScale","_captureRenderTime","_renderTime","PerfCounter","_captureLayoutTime","_layoutTime","_onBeginRenderObserver","_onEndRenderObserver","_onBeginLayoutObserver","_onEndLayoutObserver","beginMonitoring","endMonitoring","XmlLoaderError","parentClass","_nodes","_nodeTypes","element","attribute","_isLoaded","_objectAttributes","_parentClass","_getChainElement","attributeValue","_getClassAttribute","attributeName","_createGuiElement","node","linkParent","guiNode","nodeName","attributes","includes","startsWith","endsWith","getNamedItem","id","exception","_parseGrid","cells","cellNode","totalColumnsNumber","nodeType","nodeValue","k","firstChild","_parseXml","nextSibling","_parseElement","_prepareSourceElement","variable","iterator","_parseElementsFromSource","dataSource","splittedSource","generated","setAttribute","_rootNode","getNodeById","getNodes","loadLayout","xmlFile","rootNode","onSuccess","onError","xhttp","XMLHttpRequest","responseXML","xmlDoc","onerror","loadLayoutAsync","thisArg","_arguments","generator","t","_","sent","trys","ops","next","verb","op","done","step","P","fulfilled","rejected","then","apply","_isScaledByManager","_behaviors","_node","scaling","addBehavior","behavior","init","isLoading","onDataLoadedObservable","removeBehavior","detach","getBehaviorByName","setEnabled","linkToTransformNode","_prepareNode","_createNode","_injectGUI3DReservedDataStore","isPickable","_affectMaterial","reservedDataStore","GUI3D","_isTouchButton3D","_generatePointerEventType","Vector3WithInfo","forcePointerUp","pickedPoint","originMeshPosition","_disposeNode","_contentResolution","_contentScaleRatio","_content","utilityLayer","_facadeTexture","utilityLayerScene","_applyFacade","_resetContent","_disposeFacadeTexture","content","facadeTexture","Control3D","TransformNode","ContentDisplay3D","_currentMaterial","emissiveColor","scaleInPlace","faceUV","Vector4","useRightHandedSystem","CreateBox","depth","wrap","StandardMaterial","AbstractButton3D","_blockLayout","_arrangeChildren","updateLayout","blockLayout","UNSET_ORIENTATION","FACEORIGIN_ORIENTATION","FACEORIGINREVERSED_ORIENTATION","FACEFORWARD_ORIENTATION","FACEFORWARDREVERSED_ORIENTATION","_columns","_rows","_rowThenColum","_orientation","Container3D","margin","controlCount","currentInverseWorld","computeWorldMatrix","boundingBox","getHierarchyBoundingVectors","extendSize","TmpVectors","subtractToRef","startOffsetX","startOffsetY","nodeGrid","cellCounter","_mapGridNode","_finalProcessing","_radius","nodePosition","newPos","_cylindricalMapping","orientation","lookAt","Axis","Space","yAngle","VolumeBasedPanel","INNERGLOW","BORDER","HOVERLIGHT","TEXTURE","rebuild","MaterialDefines","innerGlowColorIntensity","innerGlowColor","albedoColor","renderBorders","borderWidth","edgeSmoothingValue","borderMinValue","renderHoverLight","hoverRadius","hoverColor","Color4","hoverPosition","needAlphaBlending","needAlphaTesting","getAlphaTestTexture","isReadyForSubMesh","subMesh","isFrozen","effect","_wasPreviouslyReady","materialDefines","FluentMaterialDefines","defines","checkReadyOnEveryCall","_renderId","getRenderId","_areTexturesDirty","_albedoTexture","isReadyOrNotBlocking","markAsProcessed","resetCachedMaterial","attribs","VertexBuffer","uniforms","samplers","uniformBuffers","MaterialHelper","uniformsNames","uniformBuffersNames","maxSimultaneousLights","setEffect","createEffect","fallbacks","onCompiled","indexParameters","_materialContext","bindForSubMesh","world","_activeEffect","bindOnlyWorldMatrix","setMatrix","_mustRebind","setColor4","setFloat","setVector3","setDirectColor4","setTexture","getTextureMatrix","_afterBind","getActiveTextures","hasTexture","forceDisposeEffect","clone","FluentMaterial","customType","rootUrl","expandToProperty","serializeAsColor3","serializeAsColor4","serializeAsVector3","serializeAsTexture","PushMaterial","shareMaterials","_shareMaterials","_frontPlate","_disposeTooltip","_tooltipFade","_tooltipTextBlock","_tooltipTexture","_tooltipMesh","_tooltipHoverObserver","_tooltipOutObserver","_backPlate","renderingGroupId","_textPlate","rightHandedScene","_scene","CreatePlane","tooltipBackground","sideOrientation","Mesh","mat","addChild","FadeInOutBehavior","delay","fadeIn","_rebuildContent","_imageUrl","_backMaterial","_frontMaterial","_plateMaterial","DomManagement","_createBackMaterial","_pickedPointObserver","onPickedPointChangedObservable","_createFrontMaterial","_createPlateMaterial","_sharedMaterials","Button3D","RELATIVE_WIDTH","ENABLE_FADE","_needNormals","_needUVs","edgeWidth","edgeColor","proximityMaxIntensity","proximityFarDistance","proximityNearRadius","proximityAnisotropy","selectionFuzz","selected","selectionFade","selectionFadeSize","selectedDistance","selectedFadeLength","blobIntensity","blobFarSize","blobNearDistance","blobFarDistance","blobFadeLength","leftBlobEnable","leftBlobNearSize","leftBlobPulse","leftBlobFade","leftBlobInnerFade","rightBlobEnable","rightBlobNearSize","rightBlobPulse","rightBlobFade","rightBlobInnerFade","activeFaceDir","activeFaceUp","enableFade","fadeWidth","smoothActiveFace","showFrame","useBlobTexture","globalLeftIndexTipPosition","globalRightIndexTipPosition","alphaMode","disableDepthWrite","_blobTexture","FluentButtonMaterial","BLOB_TEXTURE_URL","FluentButtonMaterialDefines","_isReadyForSubMesh","EffectFallbacks","FOG","addFallback","IMAGEPROCESSINGPOSTPROCESS","imageProcessingConfiguration","applyByPostProcess","NORMAL","UV1","UV2","VERTEXCOLOR","TANGENT","setVector4","getAnimatables","collisionMesh","_isNearPressed","_interactionSurfaceHeight","_isToggleButton","_toggleState","_toggleButtonCallback","_onToggle","onToggleObservable","collidableFrontDirection","_collisionMesh","transformedDirection","_collidableFrontDirection","frontWorldDir","invert","isNearPickable","getChildMeshes","forward","removeCallback","newState","_isInteractionInFrontOfButton","collidablePos","_getInteractionHeight","getAbsolutePosition","getPressDepth","touchPoint","interactionHeight","interactionPos","basePos","frontDir","providedType","nearMeshPosition","activeInteractionCount","_isBackplateVisible","_frontPlateDepth","_backPlateDepth","_backplateColor","_backplateToggledColor","isActiveNearInteraction","decompose","Scalar","_pointerHoverObserver","visibility","SceneLoader","TouchHolographicButton","MODEL_BASE_URL","MODEL_FILENAME","alphaMesh","importedFrontPlate","meshes","tn","setParent","negate","_touchSharedMaterials","TouchButton3D","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","_hover","_drag","_scale","_lastTick","animationLength","baseColor","hoverScale","baseScale","dragScale","_positionOffset","_updateInterpolationTarget","Date","now","_onBeforeRender","tick","scaleDiff","_targetScale","colorDiff","TmpColors","_targetColor","scaleToRef","addToRef","setColor3","drag","hover","ShaderMaterial","gizmo","_state","IDLE","_materials","_gizmo","createNode","handle","HOVER","_updateMaterial","DRAG","_createMaterial","positionOffset","HandleMaterial","setDragBehavior","dragStartFn","dragFn","dragEndFn","dragBehavior","BaseSixDofDragBehavior","_dragBehavior","_dragStartObserver","onDragStartObservable","_draggingObserver","_dragEndObserver","onDragEndObservable","verticalBox","sideNode","isNearGrabbable","GizmoHandle","horizontalBox","angleNode","_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","CornerHandle","_assignDragBehaviorCorners","originStart","dimensionsStart","masks","_moveHandle","side","SideHandle","_assignDragBehaviorSides","_rootMesh","_keepAspectRatio","vector","aspectRatio","invertDiagonal","axis","dot","_clampDimensions","mask","keepAspectRatio","impact","multiplyInPlace","clampedDimensions","minDimensions","subtractInPlace","sign","isCorner","offsetOriginMasked","offsetDimensionsMasked","addInPlace","set","moveFn","dragOrigin","toObjectFrame","dragPlaneNormal","attachedSlate","_followButton","isToggled","_handleDragged","normal","ref","projectToRef","_positionElements","_updatePivot","quaternionOrigin","directionOrigin","worldPivot","worldPlaneNormal","getAbsolutePivotPoint","_attachedNodeChanged","PivotTools","originalParent","_update","boundingMinMax","_updateHandlesPosition","_updateHandlesScaling","handleScaling","scaledWidth","scaledHeight","setAll","absolutePosition","distanceFromCamera","Gizmo","BLOB_ENABLE","BLOB_ENABLE_2","SMOOTH_EDGES","IRIDESCENT_MAP_ENABLE","absoluteSizes","_filterWidth","lineColor","blobNearSize","blobPulse","blobFade","blobNearSize2","blobPulse2","blobFade2","_rate","highlightColor","highlightWidth","_highlightTransform","_highlight","iridescenceIntensity","iridescenceEdgeIntensity","_angle","fadeOut","_reflected","_frequency","_verticalOffset","_globalLeftIndexTipPosition4","_globalRightIndexTipPosition4","FluentBackplateMaterial","_iridescentMap","IM_TEXTURE_URL","FluentBackplateMaterialDefines","titleBarMargin","_dimensions","_titleBarHeight","_titleText","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","HolographicSlate","_DEFAULT_TEXT_RESOLUTION_Y","tex","uScale","vScale","uOffset","vOffset","setPivotPoint","origin2","adt","VertexData","frontUVs","_attachContentPlateBehavior","ASSETS_BASE_URL","FOLLOW_ICON_FILENAME","CLOSE_ICON_FILENAME","isBackplateVisible","followBehavior","recenter","moveAttached","useObjectOrientationForDragging","updateDragPlane","startViewport","worldDimensions","upWorld","rightWorld","projectedOffset","dragPlanePoint","_titleBarMaterial","SlateGizmo","DefaultBehavior","sixDofDragBehavior","_positionChangedObserver","onPositionChangedObservable","resetDefaultAspectAndPose","resetAspect","backward","pivot","_backPlateMargin","_updateCurrentMinMax","_updateMargins","_backPlateMaterial","_currentMin","_currentMax","minimizeInPlace","maximizeInPlace","addInPlaceFromFloats","backPlateMargin","addButton","wasLayoutBlocked","TouchHolographicMenu","MENU_BUTTON_SCALE","xr","_handConstraintBehavior","HandConstraintBehavior","linkToXRExperience","_currentMesh","_isPinned","_dragObserver","isPinned","_pinButton","_createPinButton","NearMenu","_ASSETS_BASE_URL","_PIN_ICON_FILENAME","ignoreCameraPitchAndRoll","pitchOffset","minimumDistance","defaultDistance","maximumDistance","_iteration","_scatterMapping","random","count","sort","distance1","lengthSquared","distance2","radiusPaddingSquared","pow","cellSize","difference2D","difference","combinedRadius","distance","SKY_ENABLED","IRIDESCENCE_ENABLED","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","_blueGradientTexture","MRDLSliderBarMaterial","BLUE_GRADIENT_TEXTURE_URL","MRDLSliderBarMaterialDefines","setVector2","MRDLSliderThumbMaterial","MRDLSliderThumbMaterialDefines","iridescenceTint","gradientColor","topLeftGradientColor","topRightGradientColor","bottomLeftGradientColor","bottomRightGradientColor","edgePower","edgeLineGradientBlend","_iridescentMapTexture","MRDLBackplateMaterial","IRIDESCENT_MAP_TEXTURE_URL","MRDLBackplateMaterialDefines","sliderBackplateVisible","_sliderBackplateVisible","_sliderThumb","_convertToPosition","_sliderBar","SLIDER_SCALING","_sliderBarMaterial","_sliderThumbMaterial","_sliderBackplateMaterial","sliderBackplate","Slider3D","sliderBackplateModel","sliderBarModel","sliderThumbModel","_sliderBackplate","_createBehavior","pointerDragBehavior","dragAxis","_draggedPosition","dragDistance","_convertToValue","start","_sphericalMapping","xAngle","extendSizes","_model","_material","HolographicBackplate","importedModel","_customControlScaling","_sceneDisposeObserver","_utilityLayer","UtilityLayerRenderer","onlyCheckPointerDownEvents","pickUtilitySceneFirst","mainSceneTrackerPredicate","_pointerOutObserver","_handlePointerOut","autoClear","autoClearDepthAndStencil","HemisphericLight","controlScaling","GUI3DManager","MRTK_REALISTIC_SCALING","isPointerUp","shouldRender","pickingInfo","originMesh","materialName","globalObject","BABYLON","GUI"],"sourceRoot":""}