babylonjs-loaders 9.6.2 → 9.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/babylon.bvhFileLoader.js +2 -0
- package/babylon.bvhFileLoader.js.map +1 -0
- package/babylon.glTF1FileLoader.js +2 -0
- package/babylon.glTF1FileLoader.js.map +1 -0
- package/babylon.glTF2FileLoader.js +2 -0
- package/babylon.glTF2FileLoader.js.map +1 -0
- package/babylon.glTF2FileLoader.min.js +1 -1
- package/babylon.glTF2FileLoader.min.js.map +1 -1
- package/babylon.glTFFileLoader.js +2 -0
- package/babylon.glTFFileLoader.js.map +1 -0
- package/babylon.glTFFileLoader.min.js +1 -1
- package/babylon.glTFFileLoader.min.js.map +1 -1
- package/babylon.objFileLoader.js +2 -0
- package/babylon.objFileLoader.js.map +1 -0
- package/babylon.stlFileLoader.js +2 -0
- package/babylon.stlFileLoader.js.map +1 -0
- package/babylonjs.loaders.d.ts +69 -3
- package/babylonjs.loaders.js +1 -1
- package/babylonjs.loaders.js.map +1 -1
- package/babylonjs.loaders.min.js +1 -1
- package/babylonjs.loaders.min.js.map +1 -1
- package/babylonjs.loaders.module.d.ts +138 -6
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"babylon.glTFFileLoader.min.js","sources":["file:///home/vsts/work/1/s/node_modules/tslib/tslib.es6.js","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/glTFValidation.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/glTFFileLoader.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/glTFFileLoader.metadata.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/1.0/glTFLoaderInterfaces.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/legacy/legacy-glTF.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/1.0/glTFLoaderUtils.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/1.0/glTFLoader.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/1.0/glTFBinaryExtension.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/1.0/glTFMaterialsCommonExtension.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/legacy/legacy-glTF1.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/gltfPathToObjectConverter.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/objectModelMapping.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/glTFLoaderExtensionRegistry.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/glTFLoader.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_lights_image_based.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_meshopt_compression.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_texture_webp.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_texture_avif.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_lights_ies.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_draco_mesh_compression.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_lights_punctual.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_lights_area.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_unlit.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_clearcoat.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_coat.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_iridescence.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_anisotropy.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_emissive_strength.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_sheen.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_fuzz.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_specular.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_ior.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_variants.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_transmission.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_volume.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_volume_scatter.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_dispersion.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_diffuse_roughness.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_mesh_quantization.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_texture_basisu.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_texture_transform.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_xmp_json_ld.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/glTFLoaderAnimation.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_animation_pointer.data.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_animation_pointer.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/MSFT_audio_emitter.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/MSFT_lod.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/MSFT_minecraftMesh.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/MSFT_sRGBFactors.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity/declarationMapper.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphParser.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_node_visibility.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_node_selectability.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_node_hoverability.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/ExtrasAsMetadata.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity/flowGraphGLTFDataProvider.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/openpbrMaterialLoadingAdapter.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/glTF/2.0/pbrMaterialLoadingAdapter.ts","file:///home/vsts/work/1/s/packages/dev/loaders/src/legacy/legacy-glTF2.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","/* eslint-disable github/no-then */\r\n/* eslint-disable no-restricted-syntax */\r\n/* eslint-disable @typescript-eslint/promise-function-async */\r\nimport type * as GLTF2 from \"babylonjs-gltf2interface\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ndeclare let GLTFValidator: GLTF2.IGLTFValidator;\r\n\r\n// WorkerGlobalScope\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ndeclare function importScripts(...urls: string[]): void;\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ndeclare function postMessage(message: any, transfer?: any[]): void;\r\n\r\nfunction ValidateAsync(\r\n data: string | Uint8Array,\r\n rootUrl: string,\r\n fileName: string,\r\n getExternalResource: (uri: string) => Promise<Uint8Array>\r\n): Promise<GLTF2.IGLTFValidationResults> {\r\n const options: GLTF2.IGLTFValidationOptions = {\r\n externalResourceFunction: getExternalResource,\r\n };\r\n\r\n if (fileName) {\r\n options.uri = rootUrl === \"file:\" ? fileName : rootUrl + fileName;\r\n }\r\n\r\n return ArrayBuffer.isView(data) ? GLTFValidator.validateBytes(data, options) : GLTFValidator.validateString(data, options);\r\n}\r\n\r\n/**\r\n * The worker function that gets converted to a blob url to pass into a worker.\r\n */\r\nfunction WorkerFunc(): void {\r\n const pendingExternalResources: Array<{ resolve: (data: any) => void; reject: (reason: any) => void }> = [];\r\n\r\n onmessage = (message) => {\r\n const data = message.data;\r\n switch (data.id) {\r\n case \"init\": {\r\n importScripts(data.url);\r\n break;\r\n }\r\n case \"validate\": {\r\n ValidateAsync(\r\n data.data,\r\n data.rootUrl,\r\n data.fileName,\r\n (uri) =>\r\n new Promise((resolve, reject) => {\r\n const index = pendingExternalResources.length;\r\n pendingExternalResources.push({ resolve, reject });\r\n postMessage({ id: \"getExternalResource\", index: index, uri: uri });\r\n })\r\n ).then(\r\n (value) => {\r\n postMessage({ id: \"validate.resolve\", value: value });\r\n },\r\n (reason) => {\r\n postMessage({ id: \"validate.reject\", reason: reason });\r\n }\r\n );\r\n break;\r\n }\r\n case \"getExternalResource.resolve\": {\r\n pendingExternalResources[data.index].resolve(data.value);\r\n break;\r\n }\r\n case \"getExternalResource.reject\": {\r\n pendingExternalResources[data.index].reject(data.reason);\r\n break;\r\n }\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Configuration for glTF validation\r\n */\r\nexport interface IGLTFValidationConfiguration {\r\n /**\r\n * The url of the glTF validator.\r\n */\r\n url: string;\r\n}\r\n\r\n/**\r\n * glTF validation\r\n */\r\nexport class GLTFValidation {\r\n /**\r\n * The configuration. Defaults to `{ url: \"https://cdn.babylonjs.com/gltf_validator.js\" }`.\r\n */\r\n public static Configuration: IGLTFValidationConfiguration = {\r\n url: `${Tools._DefaultCdnUrl}/gltf_validator.js`,\r\n };\r\n\r\n private static _LoadScriptPromise: Promise<void>;\r\n\r\n /**\r\n * The most recent validation results.\r\n * @internal - Used for back-compat in Sandbox with Inspector V2.\r\n */\r\n public static _LastResults: Nullable<GLTF2.IGLTFValidationResults> = null;\r\n\r\n /**\r\n * Validate a glTF asset using the glTF-Validator.\r\n * @param data The JSON of a glTF or the array buffer of a binary glTF\r\n * @param rootUrl The root url for the glTF\r\n * @param fileName The file name for the glTF\r\n * @param getExternalResource The callback to get external resources for the glTF validator\r\n * @returns A promise that resolves with the glTF validation results once complete\r\n */\r\n public static ValidateAsync(\r\n data: string | Uint8Array,\r\n rootUrl: string,\r\n fileName: string,\r\n getExternalResource: (uri: string) => Promise<Uint8Array>\r\n ): Promise<GLTF2.IGLTFValidationResults> {\r\n if (typeof Worker === \"function\") {\r\n return new Promise((resolve, reject) => {\r\n const workerContent = `${ValidateAsync}(${WorkerFunc})()`;\r\n const workerBlobUrl = URL.createObjectURL(new Blob([workerContent], { type: \"application/javascript\" }));\r\n const worker = new Worker(workerBlobUrl);\r\n\r\n const onError = (error: ErrorEvent) => {\r\n worker.removeEventListener(\"error\", onError);\r\n worker.removeEventListener(\"message\", onMessage);\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(error);\r\n };\r\n\r\n const onMessage = (message: MessageEvent) => {\r\n const data = message.data;\r\n switch (data.id) {\r\n case \"getExternalResource\": {\r\n getExternalResource(data.uri).then(\r\n (value) => {\r\n worker.postMessage({ id: \"getExternalResource.resolve\", index: data.index, value: value }, [value.buffer]);\r\n },\r\n (reason) => {\r\n worker.postMessage({ id: \"getExternalResource.reject\", index: data.index, reason: reason });\r\n }\r\n );\r\n break;\r\n }\r\n case \"validate.resolve\": {\r\n worker.removeEventListener(\"error\", onError);\r\n worker.removeEventListener(\"message\", onMessage);\r\n GLTFValidation._LastResults = data.value;\r\n resolve(data.value);\r\n worker.terminate();\r\n break;\r\n }\r\n case \"validate.reject\": {\r\n worker.removeEventListener(\"error\", onError);\r\n worker.removeEventListener(\"message\", onMessage);\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(data.reason);\r\n worker.terminate();\r\n }\r\n }\r\n };\r\n\r\n worker.addEventListener(\"error\", onError);\r\n worker.addEventListener(\"message\", onMessage);\r\n\r\n worker.postMessage({ id: \"init\", url: Tools.GetBabylonScriptURL(this.Configuration.url) });\r\n\r\n if (ArrayBuffer.isView(data)) {\r\n // Slice the data to avoid copying the whole array buffer.\r\n const slicedData = data.slice();\r\n worker.postMessage({ id: \"validate\", data: slicedData, rootUrl: rootUrl, fileName: fileName }, [slicedData.buffer]);\r\n } else {\r\n worker.postMessage({ id: \"validate\", data: data, rootUrl: rootUrl, fileName: fileName });\r\n }\r\n });\r\n } else {\r\n if (!this._LoadScriptPromise) {\r\n this._LoadScriptPromise = Tools.LoadBabylonScriptAsync(this.Configuration.url);\r\n }\r\n\r\n return this._LoadScriptPromise.then(() => {\r\n return ValidateAsync(data, rootUrl, fileName, getExternalResource);\r\n });\r\n }\r\n }\r\n}\r\n","/* eslint-disable github/no-then */\r\n/* eslint-disable @typescript-eslint/no-floating-promises */\r\n/* eslint-disable @typescript-eslint/prefer-promise-reject-errors */\r\n/* eslint-disable no-restricted-syntax */\r\n/* eslint-disable @typescript-eslint/promise-function-async */\r\n/* eslint-disable @typescript-eslint/no-unused-vars */\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type * as GLTF2 from \"babylonjs-gltf2interface\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type Observer, Observable } from \"core/Misc/observable\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { type Camera } from \"core/Cameras/camera\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport {\r\n type ISceneLoaderPluginFactory,\r\n type ISceneLoaderPluginAsync,\r\n type ISceneLoaderProgressEvent,\r\n type ISceneLoaderAsyncResult,\r\n type SceneLoaderPluginOptions,\r\n RegisterSceneLoaderPlugin,\r\n} from \"core/Loading/sceneLoader\";\r\nimport { AssetContainer } from \"core/assetContainer\";\r\nimport { type Scene, type IDisposable } from \"core/scene\";\r\nimport { type WebRequest } from \"core/Misc/webRequest\";\r\nimport { type IFileRequest } from \"core/Misc/fileRequest\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { type IDataBuffer, DataReader } from \"core/Misc/dataReader\";\r\nimport { GLTFValidation } from \"./glTFValidation\";\r\nimport { GLTFFileLoaderMetadata, GLTFMagicBase64Encoded } from \"./glTFFileLoader.metadata\";\r\nimport { type LoadFileError, DecodeBase64UrlToBinary } from \"core/Misc/fileTools\";\r\nimport { RuntimeError, ErrorCodes } from \"core/Misc/error\";\r\nimport { type TransformNode } from \"core/Meshes/transformNode\";\r\nimport { type MorphTargetManager } from \"core/Morph/morphTargetManager\";\r\n\r\n/**\r\n * Defines options for glTF loader extensions. This interface is extended by specific extensions.\r\n */\r\nexport interface GLTFLoaderExtensionOptions extends Record<string, Record<string, unknown> | undefined> {}\r\n\r\ndeclare module \"core/Loading/sceneLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc\r\n export interface SceneLoaderPluginOptions {\r\n /**\r\n * Defines options for the glTF loader.\r\n */\r\n [GLTFFileLoaderMetadata.name]: Partial<GLTFLoaderOptions>;\r\n }\r\n}\r\n\r\ninterface IFileRequestInfo extends IFileRequest {\r\n _lengthComputable?: boolean;\r\n _loaded?: number;\r\n _total?: number;\r\n}\r\n\r\nfunction readAsync(arrayBuffer: ArrayBuffer, byteOffset: number, byteLength: number): Promise<Uint8Array> {\r\n try {\r\n return Promise.resolve(new Uint8Array(arrayBuffer, byteOffset, byteLength));\r\n } catch (e) {\r\n return Promise.reject(e);\r\n }\r\n}\r\n\r\nfunction readViewAsync(arrayBufferView: ArrayBufferView, byteOffset: number, byteLength: number): Promise<Uint8Array> {\r\n try {\r\n if (byteOffset < 0 || byteOffset >= arrayBufferView.byteLength) {\r\n throw new RangeError(\"Offset is out of range.\");\r\n }\r\n\r\n if (byteOffset + byteLength > arrayBufferView.byteLength) {\r\n throw new RangeError(\"Length is out of range.\");\r\n }\r\n\r\n return Promise.resolve(new Uint8Array(arrayBufferView.buffer, arrayBufferView.byteOffset + byteOffset, byteLength));\r\n } catch (e) {\r\n return Promise.reject(e);\r\n }\r\n}\r\n\r\n/**\r\n * Mode that determines the coordinate system to use.\r\n */\r\nexport enum GLTFLoaderCoordinateSystemMode {\r\n /**\r\n * Automatically convert the glTF right-handed data to the appropriate system based on the current coordinate system mode of the scene.\r\n */\r\n AUTO,\r\n\r\n /**\r\n * Sets the useRightHandedSystem flag on the scene.\r\n */\r\n FORCE_RIGHT_HANDED,\r\n}\r\n\r\n/**\r\n * Mode that determines what animations will start.\r\n */\r\nexport enum GLTFLoaderAnimationStartMode {\r\n /**\r\n * No animation will start.\r\n */\r\n NONE,\r\n\r\n /**\r\n * The first animation will start.\r\n */\r\n FIRST,\r\n\r\n /**\r\n * All animations will start.\r\n */\r\n ALL,\r\n}\r\n\r\n/**\r\n * Interface that contains the data for the glTF asset.\r\n */\r\nexport interface IGLTFLoaderData {\r\n /**\r\n * The object that represents the glTF JSON.\r\n */\r\n json: object;\r\n\r\n /**\r\n * The BIN chunk of a binary glTF.\r\n */\r\n bin: Nullable<IDataBuffer>;\r\n}\r\n\r\n/**\r\n * Interface for extending the loader.\r\n */\r\nexport interface IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n readonly name: string;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n enabled: boolean;\r\n\r\n /**\r\n * Defines the order of this extension.\r\n * The loader sorts the extensions using these values when loading.\r\n */\r\n order?: number;\r\n}\r\n\r\n/**\r\n * Loader state.\r\n */\r\nexport enum GLTFLoaderState {\r\n /**\r\n * The asset is loading.\r\n */\r\n LOADING,\r\n\r\n /**\r\n * The asset is ready for rendering.\r\n */\r\n READY,\r\n\r\n /**\r\n * The asset is completely loaded.\r\n */\r\n COMPLETE,\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFLoader extends IDisposable {\r\n importMeshAsync: (\r\n meshesNames: string | readonly string[] | null | undefined,\r\n scene: Scene,\r\n container: Nullable<AssetContainer>,\r\n data: IGLTFLoaderData,\r\n rootUrl: string,\r\n onProgress?: (event: ISceneLoaderProgressEvent) => void,\r\n fileName?: string\r\n ) => Promise<ISceneLoaderAsyncResult>;\r\n loadAsync: (scene: Scene, data: IGLTFLoaderData, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName?: string) => Promise<void>;\r\n}\r\n\r\n/**\r\n * Adds default/implicit options to extension specific options.\r\n */\r\ntype DefaultExtensionOptions<BaseExtensionOptions> = {\r\n /**\r\n * Defines if the extension is enabled\r\n */\r\n enabled?: boolean;\r\n} & BaseExtensionOptions;\r\n\r\n/**\r\n * This class contains all the concrete (not abstract) glTF options, excluding callbacks.\r\n * The purpose of this class is to make it easy to provide a way to mutate the default\r\n * loader options (see the GLTFLoaderDefaultOptions instance below) without duplicating\r\n * all the options in yet another object. Since this class is instantiated for the default\r\n * options object, abstract properties and callbacks are not included, it's more just\r\n * flag-type options.\r\n */\r\nclass GLTFLoaderBaseOptions {\r\n /**\r\n * Defines if the loader should always compute the bounding boxes of meshes and not use the min/max values from the position accessor. Defaults to false.\r\n */\r\n public alwaysComputeBoundingBox = false;\r\n\r\n /**\r\n * Defines if the loader should always compute the nearest common ancestor of the skeleton joints instead of using `skin.skeleton`. Defaults to false.\r\n * Set this to true if loading assets with invalid `skin.skeleton` values.\r\n */\r\n public alwaysComputeSkeletonRootNode = false;\r\n\r\n /**\r\n * The animation start mode. Defaults to FIRST.\r\n */\r\n public animationStartMode = GLTFLoaderAnimationStartMode.FIRST;\r\n\r\n /**\r\n * Defines if the loader should compile materials before raising the success callback. Defaults to false.\r\n */\r\n public compileMaterials = false;\r\n\r\n /**\r\n * Defines if the loader should compile shadow generators before raising the success callback. Defaults to false.\r\n */\r\n public compileShadowGenerators = false;\r\n\r\n /**\r\n * The coordinate system mode. Defaults to AUTO.\r\n */\r\n public coordinateSystemMode = GLTFLoaderCoordinateSystemMode.AUTO;\r\n\r\n /**\r\n * Defines if the loader should create instances when multiple glTF nodes point to the same glTF mesh. Defaults to true.\r\n */\r\n public createInstances = true;\r\n\r\n /**\r\n * If true, load all materials defined in the file, even if not used by any mesh. Defaults to false.\r\n */\r\n public loadAllMaterials = false;\r\n\r\n /**\r\n * Defines if the loader should load morph targets. Defaults to true.\r\n */\r\n public loadMorphTargets = true;\r\n\r\n /**\r\n * Defines if the loader should load node animations. Defaults to true.\r\n * NOTE: The animation of this node will still load if the node is also a joint of a skin and `loadSkins` is true.\r\n */\r\n public loadNodeAnimations = true;\r\n\r\n /**\r\n * If true, load only the materials defined in the file. Defaults to false.\r\n */\r\n public loadOnlyMaterials = false;\r\n\r\n /**\r\n * Defines if the loader should load skins. Defaults to true.\r\n */\r\n public loadSkins = true;\r\n\r\n /**\r\n * If true, do not load any materials defined in the file. Defaults to false.\r\n */\r\n public skipMaterials = false;\r\n\r\n /**\r\n * When loading glTF animations, which are defined in seconds, target them to this FPS. Defaults to 60.\r\n */\r\n public targetFps = 60;\r\n\r\n /**\r\n * Defines if the Alpha blended materials are only applied as coverage.\r\n * If false, (default) The luminance of each pixel will reduce its opacity to simulate the behaviour of most physical materials.\r\n * If true, no extra effects are applied to transparent pixels.\r\n */\r\n public transparencyAsCoverage = false;\r\n\r\n /**\r\n * Defines if the loader should also compile materials with clip planes. Defaults to false.\r\n */\r\n public useClipPlane = false;\r\n\r\n /**\r\n * If true, the loader will derive the name for Babylon textures from the glTF texture name, image name, or image url. Defaults to false.\r\n * Note that it is possible for multiple Babylon textures to share the same name when the Babylon textures load from the same glTF texture or image.\r\n */\r\n public useGltfTextureNames = false;\r\n\r\n /**\r\n * Defines if the loader should use range requests when load binary glTF files from HTTP.\r\n * Enabling will disable offline support and glTF validator.\r\n * Defaults to false.\r\n */\r\n public useRangeRequests = false;\r\n\r\n /**\r\n * If true, load the color (gamma encoded) textures into sRGB buffers (if supported by the GPU), which will yield more accurate results when sampling the texture. Defaults to true.\r\n */\r\n public useSRGBBuffers = true;\r\n\r\n /**\r\n * Defines if the loader should validate the asset.\r\n */\r\n public validate = false;\r\n\r\n /**\r\n * Load the glTF files using the OpenPBR material.\r\n * @experimental\r\n */\r\n public useOpenPBR = false;\r\n\r\n /**\r\n * If true, the loader will not use the transmission helper when loading materials with transmission.\r\n */\r\n public dontUseTransmissionHelper = false;\r\n}\r\n\r\n/**\r\n * The default GLTF loader options.\r\n * Override the properties of this object to globally change the default loader options.\r\n * To specify options for a specific load call, pass those options into the associated load function.\r\n */\r\nexport const GLTFLoaderDefaultOptions = new GLTFLoaderBaseOptions();\r\n\r\nabstract class GLTFLoaderOptions extends GLTFLoaderBaseOptions {\r\n // eslint-disable-next-line babylonjs/available\r\n protected copyFrom(options?: Partial<Readonly<GLTFLoaderOptions>>) {\r\n if (options) {\r\n this.alwaysComputeBoundingBox = options.alwaysComputeBoundingBox ?? this.alwaysComputeBoundingBox;\r\n this.alwaysComputeSkeletonRootNode = options.alwaysComputeSkeletonRootNode ?? this.alwaysComputeSkeletonRootNode;\r\n this.animationStartMode = options.animationStartMode ?? this.animationStartMode;\r\n this.capturePerformanceCounters = options.capturePerformanceCounters ?? this.capturePerformanceCounters;\r\n this.compileMaterials = options.compileMaterials ?? this.compileMaterials;\r\n this.compileShadowGenerators = options.compileShadowGenerators ?? this.compileShadowGenerators;\r\n this.coordinateSystemMode = options.coordinateSystemMode ?? this.coordinateSystemMode;\r\n this.createInstances = options.createInstances ?? this.createInstances;\r\n this.customRootNode = options.customRootNode;\r\n this.extensionOptions = options.extensionOptions ?? this.extensionOptions;\r\n this.loadAllMaterials = options.loadAllMaterials ?? this.loadAllMaterials;\r\n this.loadMorphTargets = options.loadMorphTargets ?? this.loadMorphTargets;\r\n this.loadNodeAnimations = options.loadNodeAnimations ?? this.loadNodeAnimations;\r\n this.loadOnlyMaterials = options.loadOnlyMaterials ?? this.loadOnlyMaterials;\r\n this.loadSkins = options.loadSkins ?? this.loadSkins;\r\n this.loggingEnabled = options.loggingEnabled ?? this.loggingEnabled;\r\n this.onCameraLoaded = options.onCameraLoaded;\r\n this.onMaterialLoaded = options.onMaterialLoaded;\r\n this.onMeshLoaded = options.onMeshLoaded;\r\n this.onParsed = options.onParsed;\r\n this.onSkinLoaded = options.onSkinLoaded;\r\n this.onTextureLoaded = options.onTextureLoaded;\r\n this.onValidated = options.onValidated;\r\n this.preprocessUrlAsync = options.preprocessUrlAsync ?? this.preprocessUrlAsync;\r\n this.skipMaterials = options.skipMaterials ?? this.skipMaterials;\r\n this.targetFps = options.targetFps ?? this.targetFps;\r\n this.transparencyAsCoverage = options.transparencyAsCoverage ?? this.transparencyAsCoverage;\r\n this.useClipPlane = options.useClipPlane ?? this.useClipPlane;\r\n this.useGltfTextureNames = options.useGltfTextureNames ?? this.useGltfTextureNames;\r\n this.useOpenPBR = options.useOpenPBR ?? this.useOpenPBR;\r\n this.useRangeRequests = options.useRangeRequests ?? this.useRangeRequests;\r\n this.useSRGBBuffers = options.useSRGBBuffers ?? this.useSRGBBuffers;\r\n this.validate = options.validate ?? this.validate;\r\n this.dontUseTransmissionHelper = options.dontUseTransmissionHelper ?? this.dontUseTransmissionHelper;\r\n }\r\n }\r\n\r\n // --------------\r\n // Common options\r\n // --------------\r\n\r\n /**\r\n * Raised when the asset has been parsed\r\n */\r\n public abstract onParsed?: ((loaderData: IGLTFLoaderData) => void) | undefined;\r\n\r\n // ----------\r\n // V2 options\r\n // ----------\r\n\r\n /**\r\n * Defines if the loader should capture performance counters.\r\n */\r\n public abstract capturePerformanceCounters: boolean;\r\n\r\n /**\r\n * Defines the node to use as the root of the hierarchy when loading the scene (default: undefined). If not defined, a root node will be automatically created.\r\n * You can also pass null if you don't want a root node to be created.\r\n */\r\n public customRootNode?: Nullable<TransformNode>;\r\n\r\n /**\r\n * Defines options for glTF extensions.\r\n */\r\n public extensionOptions: {\r\n // NOTE: This type is doing two things:\r\n // 1. Adding an implicit 'enabled' property to the options for each extension.\r\n // 2. Creating a mapped type of all the options of all the extensions to make it just look like a consolidated plain object in intellisense for the user.\r\n [Extension in keyof GLTFLoaderExtensionOptions]?: {\r\n [Option in keyof DefaultExtensionOptions<GLTFLoaderExtensionOptions[Extension]>]: DefaultExtensionOptions<GLTFLoaderExtensionOptions[Extension]>[Option];\r\n };\r\n } = {};\r\n\r\n /**\r\n * If true, enable logging for the loader. Defaults to false.\r\n */\r\n public abstract loggingEnabled: boolean;\r\n\r\n /**\r\n * Callback raised when the loader creates a camera after parsing the glTF properties of the camera.\r\n */\r\n public abstract onCameraLoaded?: (camera: Camera) => void;\r\n\r\n /**\r\n * Callback raised when the loader creates a material after parsing the glTF properties of the material.\r\n */\r\n public abstract onMaterialLoaded?: (material: Material) => void;\r\n\r\n /**\r\n * Callback raised when the loader creates a mesh after parsing the glTF properties of the mesh.\r\n * Note that the callback is called as soon as the mesh object is created, meaning some data may not have been setup yet for this mesh (vertex data, morph targets, material, ...)\r\n */\r\n public abstract onMeshLoaded?: (mesh: AbstractMesh) => void;\r\n\r\n /**\r\n * Callback raised when the loader creates a skin after parsing the glTF properties of the skin node.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/importers/glTF/glTFSkinning#ignoring-the-transform-of-the-skinned-mesh\r\n */\r\n public abstract onSkinLoaded?: (node: TransformNode, skinnedNode: TransformNode) => void;\r\n\r\n /**\r\n * Callback raised when the loader creates a texture after parsing the glTF properties of the texture.\r\n */\r\n public abstract onTextureLoaded?: (texture: BaseTexture) => void;\r\n\r\n /**\r\n * Callback raised after the asset is validated.\r\n */\r\n public abstract onValidated?: (results: GLTF2.IGLTFValidationResults) => void;\r\n\r\n /**\r\n * Function called before loading a url referenced by the asset.\r\n * @param url url referenced by the asset\r\n * @returns Async url to load\r\n */\r\n public preprocessUrlAsync = (url: string) => Promise.resolve(url);\r\n}\r\n\r\n/**\r\n * File loader for loading glTF files into a scene.\r\n */\r\nexport class GLTFFileLoader extends GLTFLoaderOptions implements IDisposable, ISceneLoaderPluginAsync, ISceneLoaderPluginFactory {\r\n /** @internal */\r\n public static _CreateGLTF1Loader: (parent: GLTFFileLoader) => IGLTFLoader;\r\n\r\n /** @internal */\r\n public static _CreateGLTF2Loader: (parent: GLTFFileLoader) => IGLTFLoader;\r\n\r\n /**\r\n * Creates a new glTF file loader.\r\n * @param options The options for the loader\r\n */\r\n public constructor(options?: Partial<Readonly<GLTFLoaderOptions>>) {\r\n super();\r\n this.copyFrom(Object.assign({ ...GLTFLoaderDefaultOptions }, options));\r\n }\r\n\r\n // --------------------\r\n // Begin Common options\r\n // --------------------\r\n\r\n /**\r\n * Raised when the asset has been parsed\r\n */\r\n public onParsedObservable = new Observable<IGLTFLoaderData>();\r\n\r\n private _onParsedObserver: Nullable<Observer<IGLTFLoaderData>>;\r\n\r\n /**\r\n * Raised when the asset has been parsed\r\n */\r\n public set onParsed(callback: ((loaderData: IGLTFLoaderData) => void) | undefined) {\r\n if (this._onParsedObserver) {\r\n this.onParsedObservable.remove(this._onParsedObserver);\r\n }\r\n if (callback) {\r\n this._onParsedObserver = this.onParsedObservable.add(callback);\r\n }\r\n }\r\n\r\n // ------------------\r\n // End Common options\r\n // ------------------\r\n\r\n // ----------------\r\n // Begin V1 options\r\n // ----------------\r\n\r\n /**\r\n * Set this property to false to disable incremental loading which delays the loader from calling the success callback until after loading the meshes and shaders.\r\n * Textures always loads asynchronously. For example, the success callback can compute the bounding information of the loaded meshes when incremental loading is disabled.\r\n * Defaults to true.\r\n * @internal\r\n */\r\n public static IncrementalLoading = true;\r\n\r\n /**\r\n * Set this property to true in order to work with homogeneous coordinates, available with some converters and exporters.\r\n * Defaults to false. See https://en.wikipedia.org/wiki/Homogeneous_coordinates.\r\n * @internal\r\n */\r\n public static HomogeneousCoordinates = false;\r\n\r\n // --------------\r\n // End V1 options\r\n // --------------\r\n\r\n /**\r\n * Observable raised when the loader creates a mesh after parsing the glTF properties of the mesh.\r\n * Note that the observable is raised as soon as the mesh object is created, meaning some data may not have been setup yet for this mesh (vertex data, morph targets, material, ...)\r\n */\r\n public readonly onMeshLoadedObservable = new Observable<AbstractMesh>();\r\n\r\n private _onMeshLoadedObserver: Nullable<Observer<AbstractMesh>>;\r\n\r\n /**\r\n * Callback raised when the loader creates a mesh after parsing the glTF properties of the mesh.\r\n * Note that the callback is called as soon as the mesh object is created, meaning some data may not have been setup yet for this mesh (vertex data, morph targets, material, ...)\r\n */\r\n public set onMeshLoaded(callback: ((mesh: AbstractMesh) => void) | undefined) {\r\n if (this._onMeshLoadedObserver) {\r\n this.onMeshLoadedObservable.remove(this._onMeshLoadedObserver);\r\n }\r\n if (callback) {\r\n this._onMeshLoadedObserver = this.onMeshLoadedObservable.add(callback);\r\n }\r\n }\r\n\r\n /**\r\n * Observable raised when the loader creates a skin after parsing the glTF properties of the skin node.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/importers/glTF/glTFSkinning#ignoring-the-transform-of-the-skinned-mesh\r\n * @param node - the transform node that corresponds to the original glTF skin node used for animations\r\n * @param skinnedNode - the transform node that is the skinned mesh itself or the parent of the skinned meshes\r\n */\r\n public readonly onSkinLoadedObservable = new Observable<{ node: TransformNode; skinnedNode: TransformNode }>();\r\n\r\n private _onSkinLoadedObserver: Nullable<Observer<{ node: TransformNode; skinnedNode: TransformNode }>>;\r\n\r\n /**\r\n * Callback raised when the loader creates a skin after parsing the glTF properties of the skin node.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/importers/glTF/glTFSkinning#ignoring-the-transform-of-the-skinned-mesh\r\n */\r\n public set onSkinLoaded(callback: ((node: TransformNode, skinnedNode: TransformNode) => void) | undefined) {\r\n if (this._onSkinLoadedObserver) {\r\n this.onSkinLoadedObservable.remove(this._onSkinLoadedObserver);\r\n }\r\n if (callback) {\r\n this._onSkinLoadedObserver = this.onSkinLoadedObservable.add((data) => callback(data.node, data.skinnedNode));\r\n }\r\n }\r\n\r\n /**\r\n * Observable raised when the loader creates a texture after parsing the glTF properties of the texture.\r\n */\r\n public readonly onTextureLoadedObservable = new Observable<BaseTexture>();\r\n\r\n private _onTextureLoadedObserver: Nullable<Observer<BaseTexture>>;\r\n\r\n /**\r\n * Callback raised when the loader creates a texture after parsing the glTF properties of the texture.\r\n */\r\n public set onTextureLoaded(callback: ((texture: BaseTexture) => void) | undefined) {\r\n if (this._onTextureLoadedObserver) {\r\n this.onTextureLoadedObservable.remove(this._onTextureLoadedObserver);\r\n }\r\n if (callback) {\r\n this._onTextureLoadedObserver = this.onTextureLoadedObservable.add(callback);\r\n }\r\n }\r\n\r\n /**\r\n * Observable raised when the loader creates a material after parsing the glTF properties of the material.\r\n */\r\n public readonly onMaterialLoadedObservable = new Observable<Material>();\r\n\r\n private _onMaterialLoadedObserver: Nullable<Observer<Material>>;\r\n\r\n /**\r\n * Callback raised when the loader creates a material after parsing the glTF properties of the material.\r\n */\r\n public set onMaterialLoaded(callback: ((material: Material) => void) | undefined) {\r\n if (this._onMaterialLoadedObserver) {\r\n this.onMaterialLoadedObservable.remove(this._onMaterialLoadedObserver);\r\n }\r\n if (callback) {\r\n this._onMaterialLoadedObserver = this.onMaterialLoadedObservable.add(callback);\r\n }\r\n }\r\n\r\n /**\r\n * Observable raised when the loader creates a camera after parsing the glTF properties of the camera.\r\n */\r\n public readonly onCameraLoadedObservable = new Observable<Camera>();\r\n\r\n private _onCameraLoadedObserver: Nullable<Observer<Camera>>;\r\n\r\n /**\r\n * Callback raised when the loader creates a camera after parsing the glTF properties of the camera.\r\n */\r\n public set onCameraLoaded(callback: ((camera: Camera) => void) | undefined) {\r\n if (this._onCameraLoadedObserver) {\r\n this.onCameraLoadedObservable.remove(this._onCameraLoadedObserver);\r\n }\r\n if (callback) {\r\n this._onCameraLoadedObserver = this.onCameraLoadedObservable.add(callback);\r\n }\r\n }\r\n\r\n /**\r\n * Observable raised when the asset is completely loaded, immediately before the loader is disposed.\r\n * For assets with LODs, raised when all of the LODs are complete.\r\n * For assets without LODs, raised when the model is complete, immediately after the loader resolves the returned promise.\r\n */\r\n public readonly onCompleteObservable = new Observable<void>();\r\n\r\n private _onCompleteObserver: Nullable<Observer<void>>;\r\n\r\n /**\r\n * Callback raised when the asset is completely loaded, immediately before the loader is disposed.\r\n * For assets with LODs, raised when all of the LODs are complete.\r\n * For assets without LODs, raised when the model is complete, immediately after the loader resolves the returned promise.\r\n */\r\n public set onComplete(callback: () => void) {\r\n if (this._onCompleteObserver) {\r\n this.onCompleteObservable.remove(this._onCompleteObserver);\r\n }\r\n this._onCompleteObserver = this.onCompleteObservable.add(callback);\r\n }\r\n\r\n /**\r\n * Observable raised when an error occurs.\r\n */\r\n public readonly onErrorObservable = new Observable<any>();\r\n\r\n private _onErrorObserver: Nullable<Observer<any>>;\r\n\r\n /**\r\n * Callback raised when an error occurs.\r\n */\r\n public set onError(callback: (reason: any) => void) {\r\n if (this._onErrorObserver) {\r\n this.onErrorObservable.remove(this._onErrorObserver);\r\n }\r\n this._onErrorObserver = this.onErrorObservable.add(callback);\r\n }\r\n\r\n /**\r\n * Observable raised after the loader is disposed.\r\n */\r\n public readonly onDisposeObservable = new Observable<void>();\r\n\r\n private _onDisposeObserver: Nullable<Observer<void>>;\r\n\r\n /**\r\n * Callback raised after the loader is disposed.\r\n */\r\n public set onDispose(callback: () => void) {\r\n if (this._onDisposeObserver) {\r\n this.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\r\n }\r\n\r\n /**\r\n * Observable raised after a loader extension is created.\r\n * Set additional options for a loader extension in this event.\r\n */\r\n public readonly onExtensionLoadedObservable = new Observable<IGLTFLoaderExtension>();\r\n\r\n private _onExtensionLoadedObserver: Nullable<Observer<IGLTFLoaderExtension>>;\r\n\r\n /**\r\n * Callback raised after a loader extension is created.\r\n */\r\n public set onExtensionLoaded(callback: (extension: IGLTFLoaderExtension) => void) {\r\n if (this._onExtensionLoadedObserver) {\r\n this.onExtensionLoadedObservable.remove(this._onExtensionLoadedObserver);\r\n }\r\n this._onExtensionLoadedObserver = this.onExtensionLoadedObservable.add(callback);\r\n }\r\n\r\n /**\r\n * Defines if the loader logging is enabled.\r\n */\r\n public get loggingEnabled(): boolean {\r\n return this._loggingEnabled;\r\n }\r\n\r\n public set loggingEnabled(value: boolean) {\r\n if (this._loggingEnabled === value) {\r\n return;\r\n }\r\n\r\n this._loggingEnabled = value;\r\n\r\n if (this._loggingEnabled) {\r\n this._log = this._logEnabled;\r\n } else {\r\n this._log = this._logDisabled;\r\n }\r\n }\r\n\r\n /**\r\n * Defines if the loader should capture performance counters.\r\n */\r\n public get capturePerformanceCounters(): boolean {\r\n return this._capturePerformanceCounters;\r\n }\r\n\r\n public set capturePerformanceCounters(value: boolean) {\r\n if (this._capturePerformanceCounters === value) {\r\n return;\r\n }\r\n\r\n this._capturePerformanceCounters = value;\r\n\r\n if (this._capturePerformanceCounters) {\r\n this._startPerformanceCounter = this._startPerformanceCounterEnabled;\r\n this._endPerformanceCounter = this._endPerformanceCounterEnabled;\r\n } else {\r\n this._startPerformanceCounter = this._startPerformanceCounterDisabled;\r\n this._endPerformanceCounter = this._endPerformanceCounterDisabled;\r\n }\r\n }\r\n\r\n /**\r\n * Observable raised after validation when validate is set to true. The event data is the result of the validation.\r\n */\r\n public readonly onValidatedObservable = new Observable<GLTF2.IGLTFValidationResults>();\r\n\r\n private _onValidatedObserver: Nullable<Observer<GLTF2.IGLTFValidationResults>>;\r\n\r\n /**\r\n * Callback raised after the asset is validated.\r\n */\r\n public set onValidated(callback: (results: GLTF2.IGLTFValidationResults) => void) {\r\n if (this._onValidatedObserver) {\r\n this.onValidatedObservable.remove(this._onValidatedObserver);\r\n }\r\n this._onValidatedObserver = this.onValidatedObservable.add(callback);\r\n }\r\n\r\n private _loader: Nullable<IGLTFLoader> = null;\r\n private _state: Nullable<GLTFLoaderState> = null;\r\n private _progressCallback?: (event: ISceneLoaderProgressEvent) => void;\r\n private _requests = new Array<IFileRequestInfo>();\r\n\r\n /**\r\n * Name of the loader (\"gltf\")\r\n */\r\n public readonly name = GLTFFileLoaderMetadata.name;\r\n\r\n /** @internal */\r\n public readonly extensions = GLTFFileLoaderMetadata.extensions;\r\n\r\n /**\r\n * Disposes the loader, releases resources during load, and cancels any outstanding requests.\r\n */\r\n public dispose(): void {\r\n if (this._loader) {\r\n this._loader.dispose();\r\n this._loader = null;\r\n }\r\n\r\n for (const request of this._requests) {\r\n request.abort();\r\n }\r\n\r\n this._requests.length = 0;\r\n\r\n delete this._progressCallback;\r\n\r\n this.preprocessUrlAsync = (url) => Promise.resolve(url);\r\n\r\n this.onMeshLoadedObservable.clear();\r\n this.onSkinLoadedObservable.clear();\r\n this.onTextureLoadedObservable.clear();\r\n this.onMaterialLoadedObservable.clear();\r\n this.onCameraLoadedObservable.clear();\r\n this.onCompleteObservable.clear();\r\n this.onExtensionLoadedObservable.clear();\r\n\r\n this.onDisposeObservable.notifyObservers(undefined);\r\n this.onDisposeObservable.clear();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public loadFile(\r\n scene: Scene,\r\n fileOrUrl: File | string | ArrayBufferView,\r\n rootUrl: string,\r\n onSuccess: (data: unknown, responseURL?: string) => void,\r\n onProgress?: (ev: ISceneLoaderProgressEvent) => void,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest, exception?: LoadFileError) => void,\r\n name?: string\r\n ): Nullable<IFileRequest> {\r\n if (ArrayBuffer.isView(fileOrUrl)) {\r\n this._loadBinary(scene, fileOrUrl, rootUrl, onSuccess, onError, name);\r\n return null;\r\n }\r\n\r\n this._progressCallback = onProgress;\r\n\r\n const fileName = (fileOrUrl as File).name || Tools.GetFilename(fileOrUrl as string);\r\n\r\n if (useArrayBuffer) {\r\n if (this.useRangeRequests) {\r\n if (this.validate) {\r\n Logger.Warn(\"glTF validation is not supported when range requests are enabled\");\r\n }\r\n\r\n const fileRequest: IFileRequest = {\r\n abort: () => {},\r\n onCompleteObservable: new Observable<IFileRequest>(),\r\n };\r\n\r\n const dataBuffer = {\r\n readAsync: (byteOffset: number, byteLength: number) => {\r\n return new Promise<ArrayBufferView>((resolve, reject) => {\r\n this._loadFile(\r\n scene,\r\n fileOrUrl,\r\n (data) => {\r\n resolve(new Uint8Array(data as ArrayBuffer));\r\n },\r\n true,\r\n (error) => {\r\n reject(error);\r\n },\r\n (webRequest) => {\r\n webRequest.setRequestHeader(\"Range\", `bytes=${byteOffset}-${byteOffset + byteLength - 1}`);\r\n }\r\n );\r\n });\r\n },\r\n byteLength: 0,\r\n };\r\n\r\n this._unpackBinaryAsync(new DataReader(dataBuffer)).then(\r\n (loaderData) => {\r\n fileRequest.onCompleteObservable.notifyObservers(fileRequest);\r\n onSuccess(loaderData);\r\n },\r\n onError ? (error) => onError(undefined, error) : undefined\r\n );\r\n\r\n return fileRequest;\r\n }\r\n\r\n return this._loadFile(\r\n scene,\r\n fileOrUrl,\r\n (data) => {\r\n this._validate(scene, new Uint8Array(data as ArrayBuffer, 0, (data as ArrayBuffer).byteLength), rootUrl, fileName);\r\n this._unpackBinaryAsync(\r\n new DataReader({\r\n readAsync: (byteOffset, byteLength) => readAsync(data as ArrayBuffer, byteOffset, byteLength),\r\n byteLength: (data as ArrayBuffer).byteLength,\r\n })\r\n ).then(\r\n (loaderData) => {\r\n onSuccess(loaderData);\r\n },\r\n onError ? (error) => onError(undefined, error) : undefined\r\n );\r\n },\r\n true,\r\n onError\r\n );\r\n } else {\r\n return this._loadFile(\r\n scene,\r\n fileOrUrl,\r\n (data) => {\r\n try {\r\n this._validate(scene, data as string, rootUrl, fileName);\r\n onSuccess({ json: this._parseJson(data as string) });\r\n } catch {\r\n if (onError) {\r\n onError();\r\n }\r\n }\r\n },\r\n false,\r\n onError\r\n );\r\n }\r\n }\r\n\r\n private _loadBinary(\r\n scene: Scene,\r\n data: ArrayBufferView,\r\n rootUrl: string,\r\n onSuccess: (data: unknown, responseURL?: string) => void,\r\n onError?: (request?: WebRequest, exception?: LoadFileError) => void,\r\n fileName?: string\r\n ): void {\r\n this._validate(scene, new Uint8Array(data.buffer, data.byteOffset, data.byteLength), rootUrl, fileName);\r\n this._unpackBinaryAsync(\r\n new DataReader({\r\n readAsync: (byteOffset, byteLength) => readViewAsync(data, byteOffset, byteLength),\r\n byteLength: data.byteLength,\r\n })\r\n ).then(\r\n (loaderData) => {\r\n onSuccess(loaderData);\r\n },\r\n onError ? (error) => onError(undefined, error) : undefined\r\n );\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public importMeshAsync(\r\n meshesNames: string | readonly string[] | null | undefined,\r\n scene: Scene,\r\n data: IGLTFLoaderData,\r\n rootUrl: string,\r\n onProgress?: (event: ISceneLoaderProgressEvent) => void,\r\n fileName?: string\r\n ): Promise<ISceneLoaderAsyncResult> {\r\n return Promise.resolve().then(() => {\r\n this.onParsedObservable.notifyObservers(data);\r\n this.onParsedObservable.clear();\r\n\r\n this._log(`Loading ${fileName || \"\"}`);\r\n this._loader = this._getLoader(data);\r\n return this._loader.importMeshAsync(meshesNames, scene, null, data, rootUrl, onProgress, fileName);\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public loadAsync(scene: Scene, data: IGLTFLoaderData, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName?: string): Promise<void> {\r\n return Promise.resolve().then(() => {\r\n this.onParsedObservable.notifyObservers(data);\r\n this.onParsedObservable.clear();\r\n\r\n this._log(`Loading ${fileName || \"\"}`);\r\n this._loader = this._getLoader(data);\r\n return this._loader.loadAsync(scene, data, rootUrl, onProgress, fileName);\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public loadAssetContainerAsync(\r\n scene: Scene,\r\n data: IGLTFLoaderData,\r\n rootUrl: string,\r\n onProgress?: (event: ISceneLoaderProgressEvent) => void,\r\n fileName?: string\r\n ): Promise<AssetContainer> {\r\n return Promise.resolve().then(() => {\r\n this.onParsedObservable.notifyObservers(data);\r\n this.onParsedObservable.clear();\r\n\r\n this._log(`Loading ${fileName || \"\"}`);\r\n this._loader = this._getLoader(data);\r\n\r\n // Prepare the asset container.\r\n const container = new AssetContainer(scene);\r\n\r\n // Get materials/textures when loading to add to container\r\n const materials: Array<Material> = [];\r\n this.onMaterialLoadedObservable.add((material) => {\r\n materials.push(material);\r\n });\r\n const textures: Array<BaseTexture> = [];\r\n this.onTextureLoadedObservable.add((texture) => {\r\n textures.push(texture);\r\n });\r\n const cameras: Array<Camera> = [];\r\n this.onCameraLoadedObservable.add((camera) => {\r\n cameras.push(camera);\r\n });\r\n\r\n const morphTargetManagers: Array<MorphTargetManager> = [];\r\n this.onMeshLoadedObservable.add((mesh) => {\r\n if (mesh.morphTargetManager) {\r\n morphTargetManagers.push(mesh.morphTargetManager);\r\n }\r\n });\r\n\r\n return this._loader.importMeshAsync(null, scene, container, data, rootUrl, onProgress, fileName).then((result) => {\r\n Array.prototype.push.apply(container.geometries, result.geometries);\r\n Array.prototype.push.apply(container.meshes, result.meshes);\r\n Array.prototype.push.apply(container.particleSystems, result.particleSystems);\r\n Array.prototype.push.apply(container.skeletons, result.skeletons);\r\n Array.prototype.push.apply(container.animationGroups, result.animationGroups);\r\n Array.prototype.push.apply(container.materials, materials);\r\n Array.prototype.push.apply(container.textures, textures);\r\n Array.prototype.push.apply(container.lights, result.lights);\r\n Array.prototype.push.apply(container.transformNodes, result.transformNodes);\r\n Array.prototype.push.apply(container.cameras, cameras);\r\n Array.prototype.push.apply(container.morphTargetManagers, morphTargetManagers);\r\n return container;\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public canDirectLoad(data: string): boolean {\r\n return GLTFFileLoaderMetadata.canDirectLoad(data);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public directLoad(scene: Scene, data: string): Promise<object> {\r\n if (\r\n data.startsWith(\"base64,\" + GLTFMagicBase64Encoded) || // this is technically incorrect, but will continue to support for backcompat.\r\n data.startsWith(\";base64,\" + GLTFMagicBase64Encoded) ||\r\n data.startsWith(\"application/octet-stream;base64,\" + GLTFMagicBase64Encoded) ||\r\n data.startsWith(\"model/gltf-binary;base64,\" + GLTFMagicBase64Encoded)\r\n ) {\r\n const arrayBuffer = DecodeBase64UrlToBinary(data);\r\n\r\n this._validate(scene, new Uint8Array(arrayBuffer, 0, arrayBuffer.byteLength));\r\n return this._unpackBinaryAsync(\r\n new DataReader({\r\n readAsync: (byteOffset, byteLength) => readAsync(arrayBuffer, byteOffset, byteLength),\r\n byteLength: arrayBuffer.byteLength,\r\n })\r\n );\r\n }\r\n\r\n this._validate(scene, data);\r\n return Promise.resolve({ json: this._parseJson(data) });\r\n }\r\n\r\n /**\r\n * The callback that allows custom handling of the root url based on the response url.\r\n * @param rootUrl the original root url\r\n * @param responseURL the response url if available\r\n * @returns the new root url\r\n */\r\n public rewriteRootURL?(rootUrl: string, responseURL?: string): string;\r\n\r\n /** @internal */\r\n public createPlugin(options: SceneLoaderPluginOptions): ISceneLoaderPluginAsync {\r\n return new GLTFFileLoader(options[GLTFFileLoaderMetadata.name]);\r\n }\r\n\r\n /**\r\n * The loader state or null if the loader is not active.\r\n */\r\n public get loaderState(): Nullable<GLTFLoaderState> {\r\n return this._state;\r\n }\r\n\r\n /**\r\n * Observable raised when the loader state changes.\r\n */\r\n public onLoaderStateChangedObservable = new Observable<Nullable<GLTFLoaderState>>();\r\n\r\n /**\r\n * Returns a promise that resolves when the asset is completely loaded.\r\n * @returns a promise that resolves when the asset is completely loaded.\r\n */\r\n public whenCompleteAsync(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n this.onCompleteObservable.addOnce(() => {\r\n resolve();\r\n });\r\n this.onErrorObservable.addOnce((reason) => {\r\n reject(reason);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _setState(state: GLTFLoaderState): void {\r\n if (this._state === state) {\r\n return;\r\n }\r\n\r\n this._state = state;\r\n this.onLoaderStateChangedObservable.notifyObservers(this._state);\r\n this._log(GLTFLoaderState[this._state]);\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _loadFile(\r\n scene: Scene,\r\n fileOrUrl: File | string,\r\n onSuccess: (data: string | ArrayBuffer) => void,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest) => void,\r\n onOpened?: (request: WebRequest) => void\r\n ): IFileRequest {\r\n const request = scene._loadFile(\r\n fileOrUrl,\r\n onSuccess,\r\n (event) => {\r\n this._onProgress(event, request);\r\n },\r\n true,\r\n useArrayBuffer,\r\n onError,\r\n onOpened\r\n ) as IFileRequestInfo;\r\n request.onCompleteObservable.add(() => {\r\n // Force the length computable to be true since we can guarantee the data is loaded.\r\n request._lengthComputable = true;\r\n request._total = request._loaded;\r\n });\r\n this._requests.push(request);\r\n return request;\r\n }\r\n\r\n private _onProgress(event: ProgressEvent, request: IFileRequestInfo): void {\r\n if (!this._progressCallback) {\r\n return;\r\n }\r\n\r\n request._lengthComputable = event.lengthComputable;\r\n request._loaded = event.loaded;\r\n request._total = event.total;\r\n\r\n let lengthComputable = true;\r\n let loaded = 0;\r\n let total = 0;\r\n for (const request of this._requests) {\r\n if (request._lengthComputable === undefined || request._loaded === undefined || request._total === undefined) {\r\n return;\r\n }\r\n\r\n lengthComputable = lengthComputable && request._lengthComputable;\r\n loaded += request._loaded;\r\n total += request._total;\r\n }\r\n\r\n this._progressCallback({\r\n lengthComputable: lengthComputable,\r\n loaded: loaded,\r\n total: lengthComputable ? total : 0,\r\n });\r\n }\r\n\r\n private _validate(scene: Scene, data: string | Uint8Array, rootUrl = \"\", fileName = \"\"): void {\r\n if (!this.validate) {\r\n return;\r\n }\r\n\r\n this._startPerformanceCounter(\"Validate JSON\");\r\n GLTFValidation.ValidateAsync(data, rootUrl, fileName, (uri) => {\r\n return this.preprocessUrlAsync(rootUrl + uri).then((url) => {\r\n return scene._loadFileAsync(url, undefined, true, true).then((data) => {\r\n return new Uint8Array(data, 0, data.byteLength);\r\n });\r\n });\r\n }).then(\r\n (result) => {\r\n this._endPerformanceCounter(\"Validate JSON\");\r\n this.onValidatedObservable.notifyObservers(result);\r\n this.onValidatedObservable.clear();\r\n },\r\n (reason) => {\r\n this._endPerformanceCounter(\"Validate JSON\");\r\n Tools.Warn(`Failed to validate: ${reason.message}`);\r\n this.onValidatedObservable.clear();\r\n }\r\n );\r\n }\r\n\r\n private _getLoader(loaderData: IGLTFLoaderData): IGLTFLoader {\r\n const asset = (<any>loaderData.json).asset || {};\r\n\r\n this._log(`Asset version: ${asset.version}`);\r\n asset.minVersion && this._log(`Asset minimum version: ${asset.minVersion}`);\r\n asset.generator && this._log(`Asset generator: ${asset.generator}`);\r\n\r\n const version = GLTFFileLoader._parseVersion(asset.version);\r\n if (!version) {\r\n throw new Error(\"Invalid version: \" + asset.version);\r\n }\r\n\r\n if (asset.minVersion !== undefined) {\r\n const minVersion = GLTFFileLoader._parseVersion(asset.minVersion);\r\n if (!minVersion) {\r\n throw new Error(\"Invalid minimum version: \" + asset.minVersion);\r\n }\r\n\r\n if (GLTFFileLoader._compareVersion(minVersion, { major: 2, minor: 0 }) > 0) {\r\n throw new Error(\"Incompatible minimum version: \" + asset.minVersion);\r\n }\r\n }\r\n\r\n const createLoaders: { [key: number]: (parent: GLTFFileLoader) => IGLTFLoader } = {\r\n 1: GLTFFileLoader._CreateGLTF1Loader,\r\n 2: GLTFFileLoader._CreateGLTF2Loader,\r\n };\r\n\r\n const createLoader = createLoaders[version.major];\r\n if (!createLoader) {\r\n throw new Error(\"Unsupported version: \" + asset.version);\r\n }\r\n\r\n return createLoader(this);\r\n }\r\n\r\n private _parseJson(json: string): object {\r\n this._startPerformanceCounter(\"Parse JSON\");\r\n this._log(`JSON length: ${json.length}`);\r\n const parsed = JSON.parse(json);\r\n this._endPerformanceCounter(\"Parse JSON\");\r\n return parsed;\r\n }\r\n\r\n private _unpackBinaryAsync(dataReader: DataReader): Promise<IGLTFLoaderData> {\r\n this._startPerformanceCounter(\"Unpack Binary\");\r\n\r\n // Read magic + version + length + json length + json format\r\n return dataReader.loadAsync(20).then(() => {\r\n const Binary = {\r\n Magic: 0x46546c67,\r\n };\r\n\r\n const magic = dataReader.readUint32();\r\n if (magic !== Binary.Magic) {\r\n throw new RuntimeError(\"Unexpected magic: \" + magic, ErrorCodes.GLTFLoaderUnexpectedMagicError);\r\n }\r\n\r\n const version = dataReader.readUint32();\r\n\r\n if (this.loggingEnabled) {\r\n this._log(`Binary version: ${version}`);\r\n }\r\n\r\n const length = dataReader.readUint32();\r\n if (!this.useRangeRequests && length !== dataReader.buffer.byteLength) {\r\n Logger.Warn(`Length in header does not match actual data length: ${length} != ${dataReader.buffer.byteLength}`);\r\n }\r\n\r\n let unpacked: Promise<IGLTFLoaderData>;\r\n switch (version) {\r\n case 1: {\r\n unpacked = this._unpackBinaryV1Async(dataReader, length);\r\n break;\r\n }\r\n case 2: {\r\n unpacked = this._unpackBinaryV2Async(dataReader, length);\r\n break;\r\n }\r\n default: {\r\n throw new Error(\"Unsupported version: \" + version);\r\n }\r\n }\r\n\r\n this._endPerformanceCounter(\"Unpack Binary\");\r\n\r\n return unpacked;\r\n });\r\n }\r\n\r\n private _unpackBinaryV1Async(dataReader: DataReader, length: number): Promise<IGLTFLoaderData> {\r\n const ContentFormat = {\r\n JSON: 0,\r\n };\r\n\r\n const contentLength = dataReader.readUint32();\r\n const contentFormat = dataReader.readUint32();\r\n\r\n if (contentFormat !== ContentFormat.JSON) {\r\n throw new Error(`Unexpected content format: ${contentFormat}`);\r\n }\r\n\r\n const bodyLength = length - dataReader.byteOffset;\r\n\r\n const data: IGLTFLoaderData = { json: this._parseJson(dataReader.readString(contentLength)), bin: null };\r\n if (bodyLength !== 0) {\r\n const startByteOffset = dataReader.byteOffset;\r\n data.bin = {\r\n readAsync: (byteOffset, byteLength) => dataReader.buffer.readAsync(startByteOffset + byteOffset, byteLength),\r\n byteLength: bodyLength,\r\n };\r\n }\r\n\r\n return Promise.resolve(data);\r\n }\r\n\r\n private _unpackBinaryV2Async(dataReader: DataReader, length: number): Promise<IGLTFLoaderData> {\r\n const ChunkFormat = {\r\n JSON: 0x4e4f534a,\r\n BIN: 0x004e4942,\r\n };\r\n\r\n // Read the JSON chunk header.\r\n const chunkLength = dataReader.readUint32();\r\n const chunkFormat = dataReader.readUint32();\r\n if (chunkFormat !== ChunkFormat.JSON) {\r\n throw new Error(\"First chunk format is not JSON\");\r\n }\r\n\r\n // Bail if there are no other chunks.\r\n if (dataReader.byteOffset + chunkLength === length) {\r\n return dataReader.loadAsync(chunkLength).then(() => {\r\n return { json: this._parseJson(dataReader.readString(chunkLength)), bin: null };\r\n });\r\n }\r\n\r\n // Read the JSON chunk and the length and type of the next chunk.\r\n return dataReader.loadAsync(chunkLength + 8).then(() => {\r\n const data: IGLTFLoaderData = { json: this._parseJson(dataReader.readString(chunkLength)), bin: null };\r\n\r\n const readAsync = (): Promise<IGLTFLoaderData> => {\r\n const chunkLength = dataReader.readUint32();\r\n const chunkFormat = dataReader.readUint32();\r\n\r\n switch (chunkFormat) {\r\n case ChunkFormat.JSON: {\r\n throw new Error(\"Unexpected JSON chunk\");\r\n }\r\n case ChunkFormat.BIN: {\r\n const startByteOffset = dataReader.byteOffset;\r\n data.bin = {\r\n readAsync: (byteOffset, byteLength) => dataReader.buffer.readAsync(startByteOffset + byteOffset, byteLength),\r\n byteLength: chunkLength,\r\n };\r\n dataReader.skipBytes(chunkLength);\r\n break;\r\n }\r\n default: {\r\n // ignore unrecognized chunkFormat\r\n dataReader.skipBytes(chunkLength);\r\n break;\r\n }\r\n }\r\n\r\n if (dataReader.byteOffset !== length) {\r\n return dataReader.loadAsync(8).then(readAsync);\r\n }\r\n\r\n return Promise.resolve(data);\r\n };\r\n\r\n return readAsync();\r\n });\r\n }\r\n\r\n private static _parseVersion(version: string): Nullable<{ major: number; minor: number }> {\r\n if (version === \"1.0\" || version === \"1.0.1\") {\r\n return {\r\n major: 1,\r\n minor: 0,\r\n };\r\n }\r\n\r\n const match = (version + \"\").match(/^(\\d+)\\.(\\d+)/);\r\n if (!match) {\r\n return null;\r\n }\r\n\r\n return {\r\n major: parseInt(match[1]),\r\n minor: parseInt(match[2]),\r\n };\r\n }\r\n\r\n private static _compareVersion(a: { major: number; minor: number }, b: { major: number; minor: number }): number {\r\n if (a.major > b.major) {\r\n return 1;\r\n }\r\n if (a.major < b.major) {\r\n return -1;\r\n }\r\n if (a.minor > b.minor) {\r\n return 1;\r\n }\r\n if (a.minor < b.minor) {\r\n return -1;\r\n }\r\n return 0;\r\n }\r\n\r\n private static readonly _logSpaces = \" \";\r\n private _logIndentLevel = 0;\r\n private _loggingEnabled = false;\r\n\r\n /** @internal */\r\n public _log = this._logDisabled;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _logOpen(message: string): void {\r\n this._log(message);\r\n this._logIndentLevel++;\r\n }\r\n\r\n /** @internal */\r\n public _logClose(): void {\r\n --this._logIndentLevel;\r\n }\r\n\r\n private _logEnabled(message: string): void {\r\n const spaces = GLTFFileLoader._logSpaces.substring(0, this._logIndentLevel * 2);\r\n Logger.Log(`${spaces}${message}`);\r\n }\r\n\r\n private _logDisabled(message: string): void {}\r\n\r\n private _capturePerformanceCounters = false;\r\n\r\n /** @internal */\r\n public _startPerformanceCounter = this._startPerformanceCounterDisabled;\r\n\r\n /** @internal */\r\n public _endPerformanceCounter = this._endPerformanceCounterDisabled;\r\n\r\n private _startPerformanceCounterEnabled(counterName: string): void {\r\n Tools.StartPerformanceCounter(counterName);\r\n }\r\n\r\n private _startPerformanceCounterDisabled(counterName: string): void {}\r\n\r\n private _endPerformanceCounterEnabled(counterName: string): void {\r\n Tools.EndPerformanceCounter(counterName);\r\n }\r\n\r\n private _endPerformanceCounterDisabled(counterName: string): void {}\r\n}\r\n\r\nRegisterSceneLoaderPlugin(new GLTFFileLoader());\r\n","import { type ISceneLoaderPluginExtensions, type ISceneLoaderPluginMetadata } from \"core/index\";\r\n\r\nexport const GLTFMagicBase64Encoded = \"Z2xURg\"; // \"glTF\" base64 encoded (without the quotes!)\r\n\r\nexport const GLTFFileLoaderMetadata = {\r\n name: \"gltf\",\r\n\r\n extensions: {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n \".gltf\": { isBinary: false, mimeType: \"model/gltf+json\" },\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n \".glb\": { isBinary: true, mimeType: \"model/gltf-binary\" },\r\n } as const satisfies ISceneLoaderPluginExtensions,\r\n\r\n canDirectLoad(data: string): boolean {\r\n return (\r\n (data.indexOf(\"asset\") !== -1 && data.indexOf(\"version\") !== -1) ||\r\n data.startsWith(\"data:base64,\" + GLTFMagicBase64Encoded) || // this is technically incorrect, but will continue to support for backcompat.\r\n data.startsWith(\"data:;base64,\" + GLTFMagicBase64Encoded) ||\r\n data.startsWith(\"data:application/octet-stream;base64,\" + GLTFMagicBase64Encoded) ||\r\n data.startsWith(\"data:model/gltf-binary;base64,\" + GLTFMagicBase64Encoded)\r\n );\r\n },\r\n} as const satisfies ISceneLoaderPluginMetadata;\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type AssetContainer } from \"core/assetContainer\";\r\nimport { type Bone } from \"core/Bones/bone\";\r\nimport { type Skeleton } from \"core/Bones/skeleton\";\r\nimport { type Texture } from \"core/Materials/Textures/texture\";\r\nimport { type Node } from \"core/node\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type Nullable } from \"core/types\";\r\n\r\n/**\r\n * Enums\r\n * @internal\r\n */\r\nexport enum EComponentType {\r\n BYTE = 5120,\r\n UNSIGNED_BYTE = 5121,\r\n SHORT = 5122,\r\n UNSIGNED_SHORT = 5123,\r\n FLOAT = 5126,\r\n}\r\n\r\n/** @internal */\r\nexport enum EShaderType {\r\n FRAGMENT = 35632,\r\n VERTEX = 35633,\r\n}\r\n\r\n/** @internal */\r\nexport enum EParameterType {\r\n BYTE = 5120,\r\n UNSIGNED_BYTE = 5121,\r\n SHORT = 5122,\r\n UNSIGNED_SHORT = 5123,\r\n INT = 5124,\r\n UNSIGNED_INT = 5125,\r\n FLOAT = 5126,\r\n FLOAT_VEC2 = 35664,\r\n FLOAT_VEC3 = 35665,\r\n FLOAT_VEC4 = 35666,\r\n INT_VEC2 = 35667,\r\n INT_VEC3 = 35668,\r\n INT_VEC4 = 35669,\r\n BOOL = 35670,\r\n BOOL_VEC2 = 35671,\r\n BOOL_VEC3 = 35672,\r\n BOOL_VEC4 = 35673,\r\n FLOAT_MAT2 = 35674,\r\n FLOAT_MAT3 = 35675,\r\n FLOAT_MAT4 = 35676,\r\n SAMPLER_2D = 35678,\r\n}\r\n\r\n/** @internal */\r\nexport enum ETextureWrapMode {\r\n CLAMP_TO_EDGE = 33071,\r\n MIRRORED_REPEAT = 33648,\r\n REPEAT = 10497,\r\n}\r\n\r\n/** @internal */\r\nexport enum ETextureFilterType {\r\n NEAREST = 9728,\r\n LINEAR = 9728,\r\n NEAREST_MIPMAP_NEAREST = 9984,\r\n LINEAR_MIPMAP_NEAREST = 9985,\r\n NEAREST_MIPMAP_LINEAR = 9986,\r\n LINEAR_MIPMAP_LINEAR = 9987,\r\n}\r\n\r\n/** @internal */\r\nexport enum ETextureFormat {\r\n ALPHA = 6406,\r\n RGB = 6407,\r\n RGBA = 6408,\r\n LUMINANCE = 6409,\r\n LUMINANCE_ALPHA = 6410,\r\n}\r\n\r\n/** @internal */\r\nexport enum ECullingType {\r\n FRONT = 1028,\r\n BACK = 1029,\r\n FRONT_AND_BACK = 1032,\r\n}\r\n\r\n/** @internal */\r\nexport enum EBlendingFunction {\r\n ZERO = 0,\r\n ONE = 1,\r\n SRC_COLOR = 768,\r\n ONE_MINUS_SRC_COLOR = 769,\r\n DST_COLOR = 774,\r\n ONE_MINUS_DST_COLOR = 775,\r\n SRC_ALPHA = 770,\r\n ONE_MINUS_SRC_ALPHA = 771,\r\n DST_ALPHA = 772,\r\n ONE_MINUS_DST_ALPHA = 773,\r\n CONSTANT_COLOR = 32769,\r\n ONE_MINUS_CONSTANT_COLOR = 32770,\r\n CONSTANT_ALPHA = 32771,\r\n ONE_MINUS_CONSTANT_ALPHA = 32772,\r\n SRC_ALPHA_SATURATE = 776,\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFProperty {\r\n extensions?: { [key: string]: any };\r\n extras?: object;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFChildRootProperty extends IGLTFProperty {\r\n name?: string;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFAccessor extends IGLTFChildRootProperty {\r\n bufferView: string;\r\n byteOffset: number;\r\n byteStride: number;\r\n count: number;\r\n type: string;\r\n componentType: EComponentType;\r\n\r\n max?: number[];\r\n min?: number[];\r\n name?: string;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFBufferView extends IGLTFChildRootProperty {\r\n buffer: string;\r\n byteOffset: number;\r\n byteLength: number;\r\n byteStride: number;\r\n\r\n target?: number;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFBuffer extends IGLTFChildRootProperty {\r\n uri: string;\r\n\r\n byteLength?: number;\r\n type?: string;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFShader extends IGLTFChildRootProperty {\r\n uri: string;\r\n type: EShaderType;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFProgram extends IGLTFChildRootProperty {\r\n attributes: string[];\r\n fragmentShader: string;\r\n vertexShader: string;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFTechniqueParameter {\r\n type: number;\r\n\r\n count?: number;\r\n semantic?: string;\r\n node?: string;\r\n value?: number | boolean | string | Array<any>;\r\n source?: string;\r\n\r\n babylonValue?: any;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFTechniqueCommonProfile {\r\n lightingModel: string;\r\n texcoordBindings: object;\r\n\r\n parameters?: Array<any>;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFTechniqueStatesFunctions {\r\n blendColor?: number[];\r\n blendEquationSeparate?: number[];\r\n blendFuncSeparate?: number[];\r\n colorMask: boolean[];\r\n cullFace: number[];\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFTechniqueStates {\r\n enable: number[];\r\n functions: IGLTFTechniqueStatesFunctions;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFTechnique extends IGLTFChildRootProperty {\r\n parameters: { [key: string]: IGLTFTechniqueParameter };\r\n program: string;\r\n\r\n attributes: { [key: string]: string };\r\n uniforms: { [key: string]: string };\r\n states: IGLTFTechniqueStates;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFMaterial extends IGLTFChildRootProperty {\r\n technique?: string;\r\n values: string[];\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFMeshPrimitive extends IGLTFProperty {\r\n attributes: { [key: string]: string };\r\n indices: string;\r\n material: string;\r\n\r\n mode?: number;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFMesh extends IGLTFChildRootProperty {\r\n primitives: IGLTFMeshPrimitive[];\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFImage extends IGLTFChildRootProperty {\r\n uri: string;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFSampler extends IGLTFChildRootProperty {\r\n magFilter?: number;\r\n minFilter?: number;\r\n wrapS?: number;\r\n wrapT?: number;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFTexture extends IGLTFChildRootProperty {\r\n sampler: string;\r\n source: string;\r\n\r\n format?: ETextureFormat;\r\n internalFormat?: ETextureFormat;\r\n target?: number;\r\n type?: number;\r\n\r\n // Babylon.js values (optimize)\r\n babylonTexture?: Texture;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFAmbienLight {\r\n color?: number[];\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFDirectionalLight {\r\n color?: number[];\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFPointLight {\r\n color?: number[];\r\n constantAttenuation?: number;\r\n linearAttenuation?: number;\r\n quadraticAttenuation?: number;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFSpotLight {\r\n color?: number[];\r\n constantAttenuation?: number;\r\n fallOfAngle?: number;\r\n fallOffExponent?: number;\r\n linearAttenuation?: number;\r\n quadraticAttenuation?: number;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFLight extends IGLTFChildRootProperty {\r\n type: string;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFCameraOrthographic {\r\n xmag: number;\r\n ymag: number;\r\n zfar: number;\r\n znear: number;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFCameraPerspective {\r\n aspectRatio: number;\r\n yfov: number;\r\n zfar: number;\r\n znear: number;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFCamera extends IGLTFChildRootProperty {\r\n type: string;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFAnimationChannelTarget {\r\n id: string;\r\n path: string;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFAnimationChannel {\r\n sampler: string;\r\n target: IGLTFAnimationChannelTarget;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFAnimationSampler {\r\n input: string;\r\n output: string;\r\n\r\n interpolation?: string;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFAnimation extends IGLTFChildRootProperty {\r\n channels?: IGLTFAnimationChannel[];\r\n parameters?: { [key: string]: string };\r\n samplers?: { [key: string]: IGLTFAnimationSampler };\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFNodeInstanceSkin {\r\n skeletons: string[];\r\n skin: string;\r\n meshes: string[];\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFSkins extends IGLTFChildRootProperty {\r\n bindShapeMatrix: number[];\r\n inverseBindMatrices: string;\r\n jointNames: string[];\r\n\r\n babylonSkeleton?: Skeleton;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFNode extends IGLTFChildRootProperty {\r\n camera?: string;\r\n children: string[];\r\n skin?: string;\r\n jointName?: string;\r\n light?: string;\r\n matrix: number[];\r\n mesh?: string;\r\n meshes?: string[];\r\n rotation?: number[];\r\n scale?: number[];\r\n translation?: number[];\r\n\r\n // Babylon.js values (optimize)\r\n babylonNode?: Node;\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFScene extends IGLTFChildRootProperty {\r\n nodes: string[];\r\n}\r\n\r\n/** @internal */\r\nexport interface IGLTFRuntime {\r\n extensions: { [key: string]: any };\r\n accessors: { [key: string]: IGLTFAccessor };\r\n buffers: { [key: string]: IGLTFBuffer };\r\n bufferViews: { [key: string]: IGLTFBufferView };\r\n meshes: { [key: string]: IGLTFMesh };\r\n lights: { [key: string]: IGLTFLight };\r\n cameras: { [key: string]: IGLTFCamera };\r\n nodes: { [key: string]: IGLTFNode };\r\n images: { [key: string]: IGLTFImage };\r\n textures: { [key: string]: IGLTFTexture };\r\n shaders: { [key: string]: IGLTFShader };\r\n programs: { [key: string]: IGLTFProgram };\r\n samplers: { [key: string]: IGLTFSampler };\r\n techniques: { [key: string]: IGLTFTechnique };\r\n materials: { [key: string]: IGLTFMaterial };\r\n animations: { [key: string]: IGLTFAnimation };\r\n skins: { [key: string]: IGLTFSkins };\r\n\r\n currentScene?: object;\r\n scenes: { [key: string]: IGLTFScene }; // v1.1\r\n\r\n extensionsUsed: string[];\r\n extensionsRequired?: string[]; // v1.1\r\n\r\n buffersCount: number;\r\n shaderscount: number;\r\n\r\n scene: Scene;\r\n rootUrl: string;\r\n\r\n loadedBufferCount: number;\r\n loadedBufferViews: { [name: string]: ArrayBufferView };\r\n\r\n loadedShaderCount: number;\r\n\r\n importOnlyMeshes: boolean;\r\n importMeshesNames?: string[];\r\n\r\n dummyNodes: Node[];\r\n\r\n assetContainer: Nullable<AssetContainer>;\r\n}\r\n\r\n/** @internal */\r\nexport interface INodeToRoot {\r\n bone: Bone;\r\n node: IGLTFNode;\r\n id: string;\r\n}\r\n\r\n/** @internal */\r\nexport interface IJointNode {\r\n node: IGLTFNode;\r\n id: string;\r\n}\r\n","import * as FileLoader from \"loaders/glTF/glTFFileLoader\";\r\nimport * as Validation from \"loaders/glTF/glTFValidation\";\r\n\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 for (const key in FileLoader) {\r\n (<any>GlobalObject).BABYLON[key] = (<any>FileLoader)[key];\r\n }\r\n for (const key in Validation) {\r\n (<any>GlobalObject).BABYLON[key] = (<any>Validation)[key];\r\n }\r\n}\r\n\r\nexport * from \"loaders/glTF/glTFFileLoader\";\r\nexport * from \"loaders/glTF/glTFValidation\";\r\n","import {\r\n type IGLTFTechniqueParameter,\r\n type IGLTFAccessor,\r\n type IGLTFRuntime,\r\n type IGLTFBufferView,\r\n EParameterType,\r\n ETextureWrapMode,\r\n ETextureFilterType,\r\n EComponentType,\r\n} from \"./glTFLoaderInterfaces\";\r\n\r\nimport { type Nullable } from \"core/types\";\r\nimport { Vector2, Vector3, Vector4, Matrix } from \"core/Maths/math.vector\";\r\nimport { Color4 } from \"core/Maths/math.color\";\r\nimport { Effect } from \"core/Materials/effect\";\r\nimport { ShaderMaterial } from \"core/Materials/shaderMaterial\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { type Node } from \"core/node\";\r\nimport { type Scene } from \"core/scene\";\r\n\r\n/**\r\n * Utils functions for GLTF\r\n * @internal\r\n * @deprecated\r\n */\r\nexport class GLTFUtils {\r\n /**\r\n * Sets the given \"parameter\" matrix\r\n * @param scene the Scene object\r\n * @param source the source node where to pick the matrix\r\n * @param parameter the GLTF technique parameter\r\n * @param uniformName the name of the shader's uniform\r\n * @param shaderMaterial the shader material\r\n */\r\n public static SetMatrix(scene: Scene, source: Node, parameter: IGLTFTechniqueParameter, uniformName: string, shaderMaterial: ShaderMaterial | Effect): void {\r\n let mat: Nullable<Matrix> = null;\r\n\r\n if (parameter.semantic === \"MODEL\") {\r\n mat = source.getWorldMatrix();\r\n } else if (parameter.semantic === \"PROJECTION\") {\r\n mat = scene.getProjectionMatrix();\r\n } else if (parameter.semantic === \"VIEW\") {\r\n mat = scene.getViewMatrix();\r\n } else if (parameter.semantic === \"MODELVIEWINVERSETRANSPOSE\") {\r\n mat = Matrix.Transpose(source.getWorldMatrix().multiply(scene.getViewMatrix()).invert());\r\n } else if (parameter.semantic === \"MODELVIEW\") {\r\n mat = source.getWorldMatrix().multiply(scene.getViewMatrix());\r\n } else if (parameter.semantic === \"MODELVIEWPROJECTION\") {\r\n mat = source.getWorldMatrix().multiply(scene.getTransformMatrix());\r\n } else if (parameter.semantic === \"MODELINVERSE\") {\r\n mat = source.getWorldMatrix().invert();\r\n } else if (parameter.semantic === \"VIEWINVERSE\") {\r\n mat = scene.getViewMatrix().invert();\r\n } else if (parameter.semantic === \"PROJECTIONINVERSE\") {\r\n mat = scene.getProjectionMatrix().invert();\r\n } else if (parameter.semantic === \"MODELVIEWINVERSE\") {\r\n mat = source.getWorldMatrix().multiply(scene.getViewMatrix()).invert();\r\n } else if (parameter.semantic === \"MODELVIEWPROJECTIONINVERSE\") {\r\n mat = source.getWorldMatrix().multiply(scene.getTransformMatrix()).invert();\r\n } else if (parameter.semantic === \"MODELINVERSETRANSPOSE\") {\r\n mat = Matrix.Transpose(source.getWorldMatrix().invert());\r\n }\r\n\r\n if (mat) {\r\n switch (parameter.type) {\r\n case EParameterType.FLOAT_MAT2:\r\n shaderMaterial.setMatrix2x2(uniformName, Matrix.GetAsMatrix2x2(mat));\r\n break;\r\n case EParameterType.FLOAT_MAT3:\r\n shaderMaterial.setMatrix3x3(uniformName, Matrix.GetAsMatrix3x3(mat));\r\n break;\r\n case EParameterType.FLOAT_MAT4:\r\n shaderMaterial.setMatrix(uniformName, mat);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets the given \"parameter\" matrix\r\n * @param shaderMaterial the shader material\r\n * @param uniform the name of the shader's uniform\r\n * @param value the value of the uniform\r\n * @param type the uniform's type (EParameterType FLOAT, VEC2, VEC3 or VEC4)\r\n * @returns true if set, else false\r\n */\r\n public static SetUniform(shaderMaterial: ShaderMaterial | Effect, uniform: string, value: any, type: number): boolean {\r\n switch (type) {\r\n case EParameterType.FLOAT:\r\n shaderMaterial.setFloat(uniform, value);\r\n return true;\r\n case EParameterType.FLOAT_VEC2:\r\n shaderMaterial.setVector2(uniform, Vector2.FromArray(value));\r\n return true;\r\n case EParameterType.FLOAT_VEC3:\r\n shaderMaterial.setVector3(uniform, Vector3.FromArray(value));\r\n return true;\r\n case EParameterType.FLOAT_VEC4:\r\n shaderMaterial.setVector4(uniform, Vector4.FromArray(value));\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Returns the wrap mode of the texture\r\n * @param mode the mode value\r\n * @returns the wrap mode (TEXTURE_WRAP_ADDRESSMODE, MIRROR_ADDRESSMODE or CLAMP_ADDRESSMODE)\r\n */\r\n public static GetWrapMode(mode: number): number {\r\n switch (mode) {\r\n case ETextureWrapMode.CLAMP_TO_EDGE:\r\n return Texture.CLAMP_ADDRESSMODE;\r\n case ETextureWrapMode.MIRRORED_REPEAT:\r\n return Texture.MIRROR_ADDRESSMODE;\r\n case ETextureWrapMode.REPEAT:\r\n return Texture.WRAP_ADDRESSMODE;\r\n default:\r\n return Texture.WRAP_ADDRESSMODE;\r\n }\r\n }\r\n\r\n /**\r\n * Returns the byte stride giving an accessor\r\n * @param accessor the GLTF accessor objet\r\n * @returns the byte stride\r\n */\r\n public static GetByteStrideFromType(accessor: IGLTFAccessor): number {\r\n // Needs this function since \"byteStride\" isn't requiered in glTF format\r\n const type = accessor.type;\r\n\r\n switch (type) {\r\n case \"VEC2\":\r\n return 2;\r\n case \"VEC3\":\r\n return 3;\r\n case \"VEC4\":\r\n return 4;\r\n case \"MAT2\":\r\n return 4;\r\n case \"MAT3\":\r\n return 9;\r\n case \"MAT4\":\r\n return 16;\r\n default:\r\n return 1;\r\n }\r\n }\r\n\r\n /**\r\n * Returns the texture filter mode giving a mode value\r\n * @param mode the filter mode value\r\n * @returns the filter mode (TODO - needs to be a type?)\r\n */\r\n public static GetTextureFilterMode(mode: number): number {\r\n switch (mode) {\r\n case ETextureFilterType.LINEAR:\r\n case ETextureFilterType.LINEAR_MIPMAP_NEAREST:\r\n case ETextureFilterType.LINEAR_MIPMAP_LINEAR:\r\n return Texture.TRILINEAR_SAMPLINGMODE;\r\n case ETextureFilterType.NEAREST:\r\n case ETextureFilterType.NEAREST_MIPMAP_NEAREST:\r\n return Texture.NEAREST_SAMPLINGMODE;\r\n default:\r\n return Texture.BILINEAR_SAMPLINGMODE;\r\n }\r\n }\r\n\r\n public static GetBufferFromBufferView(\r\n gltfRuntime: IGLTFRuntime,\r\n bufferView: IGLTFBufferView,\r\n byteOffset: number,\r\n byteLength: number,\r\n componentType: EComponentType\r\n ): ArrayBufferView {\r\n byteOffset = bufferView.byteOffset + byteOffset;\r\n\r\n const loadedBufferView = gltfRuntime.loadedBufferViews[bufferView.buffer];\r\n if (byteOffset + byteLength > loadedBufferView.byteLength) {\r\n throw new Error(\"Buffer access is out of range\");\r\n }\r\n\r\n const buffer = loadedBufferView.buffer;\r\n byteOffset += loadedBufferView.byteOffset;\r\n\r\n switch (componentType) {\r\n case EComponentType.BYTE:\r\n return new Int8Array(buffer, byteOffset, byteLength);\r\n case EComponentType.UNSIGNED_BYTE:\r\n return new Uint8Array(buffer, byteOffset, byteLength);\r\n case EComponentType.SHORT:\r\n return new Int16Array(buffer, byteOffset, byteLength);\r\n case EComponentType.UNSIGNED_SHORT:\r\n return new Uint16Array(buffer, byteOffset, byteLength);\r\n default:\r\n return new Float32Array(buffer, byteOffset, byteLength);\r\n }\r\n }\r\n\r\n /**\r\n * Returns a buffer from its accessor\r\n * @param gltfRuntime the GLTF runtime\r\n * @param accessor the GLTF accessor\r\n * @returns an array buffer view\r\n */\r\n public static GetBufferFromAccessor(gltfRuntime: IGLTFRuntime, accessor: IGLTFAccessor): any {\r\n const bufferView: IGLTFBufferView = gltfRuntime.bufferViews[accessor.bufferView];\r\n const byteLength = accessor.count * GLTFUtils.GetByteStrideFromType(accessor);\r\n return GLTFUtils.GetBufferFromBufferView(gltfRuntime, bufferView, accessor.byteOffset, byteLength, accessor.componentType);\r\n }\r\n\r\n /**\r\n * Decodes a buffer view into a string\r\n * @param view the buffer view\r\n * @returns a string\r\n */\r\n public static DecodeBufferToText(view: ArrayBufferView): string {\r\n let result = \"\";\r\n const length = view.byteLength;\r\n\r\n for (let i = 0; i < length; ++i) {\r\n result += String.fromCharCode((<any>view)[i]);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Returns the default material of gltf. Related to\r\n * https://github.com/KhronosGroup/glTF/tree/master/specification/1.0#appendix-a-default-material\r\n * @param scene the Babylon.js scene\r\n * @returns the default Babylon material\r\n */\r\n public static GetDefaultMaterial(scene: Scene): ShaderMaterial {\r\n if (!GLTFUtils._DefaultMaterial) {\r\n Effect.ShadersStore[\"GLTFDefaultMaterialVertexShader\"] = [\r\n \"precision highp float;\",\r\n \"\",\r\n \"uniform mat4 worldView;\",\r\n \"uniform mat4 projection;\",\r\n \"\",\r\n \"attribute vec3 position;\",\r\n \"\",\r\n \"void main(void)\",\r\n \"{\",\r\n \" gl_Position = projection * worldView * vec4(position, 1.0);\",\r\n \"}\",\r\n ].join(\"\\n\");\r\n\r\n Effect.ShadersStore[\"GLTFDefaultMaterialPixelShader\"] = [\r\n \"precision highp float;\",\r\n \"\",\r\n \"uniform vec4 u_emission;\",\r\n \"\",\r\n \"void main(void)\",\r\n \"{\",\r\n \" gl_FragColor = u_emission;\",\r\n \"}\",\r\n ].join(\"\\n\");\r\n\r\n const shaderPath = {\r\n vertex: \"GLTFDefaultMaterial\",\r\n fragment: \"GLTFDefaultMaterial\",\r\n };\r\n\r\n const options = {\r\n attributes: [\"position\"],\r\n uniforms: [\"worldView\", \"projection\", \"u_emission\"],\r\n samplers: new Array<string>(),\r\n needAlphaBlending: false,\r\n };\r\n\r\n GLTFUtils._DefaultMaterial = new ShaderMaterial(\"GLTFDefaultMaterial\", scene, shaderPath, options);\r\n GLTFUtils._DefaultMaterial.setColor4(\"u_emission\", new Color4(0.5, 0.5, 0.5, 1.0));\r\n }\r\n\r\n return GLTFUtils._DefaultMaterial;\r\n }\r\n\r\n // The GLTF default material\r\n private static _DefaultMaterial: Nullable<ShaderMaterial> = null;\r\n}\r\n","/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport {\r\n type IGLTFRuntime,\r\n type IGLTFTechniqueParameter,\r\n type IGLTFAnimation,\r\n type IGLTFAnimationSampler,\r\n type IGLTFNode,\r\n type IGLTFSkins,\r\n type INodeToRoot,\r\n type IJointNode,\r\n type IGLTFMesh,\r\n type IGLTFAccessor,\r\n type IGLTFLight,\r\n type IGLTFAmbienLight,\r\n type IGLTFDirectionalLight,\r\n type IGLTFPointLight,\r\n type IGLTFSpotLight,\r\n type IGLTFCamera,\r\n type IGLTFCameraPerspective,\r\n type IGLTFScene,\r\n type IGLTFTechnique,\r\n type IGLTFMaterial,\r\n type IGLTFProgram,\r\n type IGLTFBuffer,\r\n type IGLTFTexture,\r\n type IGLTFImage,\r\n type IGLTFSampler,\r\n type IGLTFShader,\r\n type IGLTFTechniqueStates,\r\n EParameterType,\r\n ETextureFilterType,\r\n ECullingType,\r\n EBlendingFunction,\r\n EShaderType,\r\n} from \"./glTFLoaderInterfaces\";\r\n\r\nimport { type FloatArray, type Nullable } from \"core/types\";\r\nimport { Quaternion, Vector3, Matrix } from \"core/Maths/math.vector\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { Camera } from \"core/Cameras/camera\";\r\nimport { FreeCamera } from \"core/Cameras/freeCamera\";\r\nimport { Animation } from \"core/Animations/animation\";\r\nimport { Bone } from \"core/Bones/bone\";\r\nimport { Skeleton } from \"core/Bones/skeleton\";\r\nimport { Effect } from \"core/Materials/effect\";\r\nimport { Material } from \"core/Materials/material\";\r\nimport { MultiMaterial } from \"core/Materials/multiMaterial\";\r\nimport { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { ShaderMaterial } from \"core/Materials/shaderMaterial\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { type Node } from \"core/node\";\r\nimport { VertexData } from \"core/Meshes/mesh.vertexData\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { Geometry } from \"core/Meshes/geometry\";\r\nimport { SubMesh } from \"core/Meshes/subMesh\";\r\nimport { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { HemisphericLight } from \"core/Lights/hemisphericLight\";\r\nimport { DirectionalLight } from \"core/Lights/directionalLight\";\r\nimport { PointLight } from \"core/Lights/pointLight\";\r\nimport { SpotLight } from \"core/Lights/spotLight\";\r\nimport { type ISceneLoaderAsyncResult, type ISceneLoaderProgressEvent } from \"core/Loading/sceneLoader\";\r\nimport { type Scene } from \"core/scene\";\r\n\r\nimport { GLTFUtils } from \"./glTFLoaderUtils\";\r\nimport { type IGLTFLoader, type IGLTFLoaderData, GLTFFileLoader } from \"../glTFFileLoader\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { type AssetContainer } from \"core/assetContainer\";\r\nimport { GetBlobBufferSource } from \"core/Buffers/bufferUtils\";\r\n\r\n/**\r\n * Tokenizer. Used for shaders compatibility\r\n * Automatically map world, view, projection, worldViewProjection, attributes and so on\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nenum ETokenType {\r\n IDENTIFIER = 1,\r\n\r\n UNKNOWN = 2,\r\n END_OF_INPUT = 3,\r\n}\r\n\r\nclass Tokenizer {\r\n private _toParse: string;\r\n private _pos: number = 0;\r\n private _maxPos: number;\r\n\r\n public currentToken: ETokenType = ETokenType.UNKNOWN;\r\n public currentIdentifier: string = \"\";\r\n public currentString: string = \"\";\r\n public isLetterOrDigitPattern: RegExp = /^[a-zA-Z0-9]+$/;\r\n\r\n constructor(toParse: string) {\r\n this._toParse = toParse;\r\n this._maxPos = toParse.length;\r\n }\r\n\r\n public getNextToken(): ETokenType {\r\n if (this.isEnd()) {\r\n return ETokenType.END_OF_INPUT;\r\n }\r\n\r\n this.currentString = this.read();\r\n this.currentToken = ETokenType.UNKNOWN;\r\n\r\n if (this.currentString === \"_\" || this.isLetterOrDigitPattern.test(this.currentString)) {\r\n this.currentToken = ETokenType.IDENTIFIER;\r\n this.currentIdentifier = this.currentString;\r\n while (!this.isEnd() && (this.isLetterOrDigitPattern.test((this.currentString = this.peek())) || this.currentString === \"_\")) {\r\n this.currentIdentifier += this.currentString;\r\n this.forward();\r\n }\r\n }\r\n\r\n return this.currentToken;\r\n }\r\n\r\n public peek(): string {\r\n return this._toParse[this._pos];\r\n }\r\n\r\n public read(): string {\r\n return this._toParse[this._pos++];\r\n }\r\n\r\n public forward(): void {\r\n this._pos++;\r\n }\r\n\r\n public isEnd(): boolean {\r\n return this._pos >= this._maxPos;\r\n }\r\n}\r\n\r\n/**\r\n * Values\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst glTFTransforms = [\"MODEL\", \"VIEW\", \"PROJECTION\", \"MODELVIEW\", \"MODELVIEWPROJECTION\", \"JOINTMATRIX\"];\r\nconst BabylonTransforms = [\"world\", \"view\", \"projection\", \"worldView\", \"worldViewProjection\", \"mBones\"];\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst glTFAnimationPaths = [\"translation\", \"rotation\", \"scale\"];\r\nconst BabylonAnimationPaths = [\"position\", \"rotationQuaternion\", \"scaling\"];\r\n\r\n/**\r\n * Parse\r\n * @param parsedBuffers\r\n * @param gltfRuntime\r\n */\r\nconst ParseBuffers = (parsedBuffers: any, gltfRuntime: IGLTFRuntime) => {\r\n for (const buf in parsedBuffers) {\r\n const parsedBuffer = parsedBuffers[buf];\r\n gltfRuntime.buffers[buf] = parsedBuffer;\r\n gltfRuntime.buffersCount++;\r\n }\r\n};\r\n\r\nconst ParseShaders = (parsedShaders: any, gltfRuntime: IGLTFRuntime) => {\r\n for (const sha in parsedShaders) {\r\n const parsedShader = parsedShaders[sha];\r\n gltfRuntime.shaders[sha] = parsedShader;\r\n gltfRuntime.shaderscount++;\r\n }\r\n};\r\n\r\nconst ParseObject = (parsedObjects: any, runtimeProperty: string, gltfRuntime: IGLTFRuntime) => {\r\n for (const object in parsedObjects) {\r\n const parsedObject = parsedObjects[object];\r\n (<any>gltfRuntime)[runtimeProperty][object] = parsedObject;\r\n }\r\n};\r\n\r\n/**\r\n * Utils\r\n * @param buffer\r\n */\r\nconst NormalizeUVs = (buffer: any) => {\r\n if (!buffer) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < buffer.length / 2; i++) {\r\n buffer[i * 2 + 1] = 1.0 - buffer[i * 2 + 1];\r\n }\r\n};\r\n\r\nconst GetAttribute = (attributeParameter: IGLTFTechniqueParameter): Nullable<string> => {\r\n if (attributeParameter.semantic === \"NORMAL\") {\r\n return \"normal\";\r\n } else if (attributeParameter.semantic === \"POSITION\") {\r\n return \"position\";\r\n } else if (attributeParameter.semantic === \"JOINT\") {\r\n return \"matricesIndices\";\r\n } else if (attributeParameter.semantic === \"WEIGHT\") {\r\n return \"matricesWeights\";\r\n } else if (attributeParameter.semantic === \"COLOR\") {\r\n return \"color\";\r\n } else if (attributeParameter.semantic && attributeParameter.semantic.indexOf(\"TEXCOORD_\") !== -1) {\r\n const channel = Number(attributeParameter.semantic.split(\"_\")[1]);\r\n return \"uv\" + (channel === 0 ? \"\" : channel + 1);\r\n }\r\n\r\n return null;\r\n};\r\n\r\n/**\r\n * Loads and creates animations\r\n * @param gltfRuntime\r\n */\r\nconst LoadAnimations = (gltfRuntime: IGLTFRuntime) => {\r\n for (const anim in gltfRuntime.animations) {\r\n const animation: IGLTFAnimation = gltfRuntime.animations[anim];\r\n\r\n if (!animation.channels || !animation.samplers) {\r\n continue;\r\n }\r\n\r\n let lastAnimation: Nullable<Animation> = null;\r\n\r\n for (let i = 0; i < animation.channels.length; i++) {\r\n // Get parameters and load buffers\r\n const channel = animation.channels[i];\r\n const sampler: IGLTFAnimationSampler = animation.samplers[channel.sampler];\r\n\r\n if (!sampler) {\r\n continue;\r\n }\r\n\r\n let inputData: Nullable<string>;\r\n let outputData: Nullable<string>;\r\n\r\n if (animation.parameters) {\r\n inputData = animation.parameters[sampler.input];\r\n outputData = animation.parameters[sampler.output];\r\n } else {\r\n inputData = sampler.input;\r\n outputData = sampler.output;\r\n }\r\n\r\n const bufferInput = GLTFUtils.GetBufferFromAccessor(gltfRuntime, gltfRuntime.accessors[inputData]);\r\n const bufferOutput = GLTFUtils.GetBufferFromAccessor(gltfRuntime, gltfRuntime.accessors[outputData]);\r\n\r\n const targetId = channel.target.id;\r\n let targetNode: any = gltfRuntime.scene.getNodeById(targetId);\r\n\r\n if (targetNode === null) {\r\n targetNode = gltfRuntime.scene.getNodeByName(targetId);\r\n }\r\n\r\n if (targetNode === null) {\r\n Tools.Warn(\"Creating animation named \" + anim + \". But cannot find node named \" + targetId + \" to attach to\");\r\n continue;\r\n }\r\n\r\n const isBone = targetNode instanceof Bone;\r\n\r\n // Get target path (position, rotation or scaling)\r\n let targetPath = channel.target.path;\r\n const targetPathIndex = glTFAnimationPaths.indexOf(targetPath);\r\n\r\n if (targetPathIndex !== -1) {\r\n targetPath = BabylonAnimationPaths[targetPathIndex];\r\n }\r\n\r\n // Determine animation type\r\n let animationType = Animation.ANIMATIONTYPE_MATRIX;\r\n\r\n if (!isBone) {\r\n if (targetPath === \"rotationQuaternion\") {\r\n animationType = Animation.ANIMATIONTYPE_QUATERNION;\r\n targetNode.rotationQuaternion = new Quaternion();\r\n } else {\r\n animationType = Animation.ANIMATIONTYPE_VECTOR3;\r\n }\r\n }\r\n\r\n // Create animation and key frames\r\n let babylonAnimation: Nullable<Animation> = null;\r\n const keys = [];\r\n let arrayOffset = 0;\r\n let modifyKey = false;\r\n\r\n if (isBone && lastAnimation && lastAnimation.getKeys().length === bufferInput.length) {\r\n babylonAnimation = lastAnimation;\r\n modifyKey = true;\r\n }\r\n\r\n if (!modifyKey) {\r\n gltfRuntime.scene._blockEntityCollection = !!gltfRuntime.assetContainer;\r\n babylonAnimation = new Animation(anim, isBone ? \"_matrix\" : targetPath, 1, animationType, Animation.ANIMATIONLOOPMODE_CYCLE);\r\n gltfRuntime.scene._blockEntityCollection = false;\r\n }\r\n\r\n // For each frame\r\n for (let j = 0; j < bufferInput.length; j++) {\r\n let value: any;\r\n\r\n if (targetPath === \"rotationQuaternion\") {\r\n // VEC4\r\n value = Quaternion.FromArray([bufferOutput[arrayOffset], bufferOutput[arrayOffset + 1], bufferOutput[arrayOffset + 2], bufferOutput[arrayOffset + 3]]);\r\n arrayOffset += 4;\r\n } else {\r\n // Position and scaling are VEC3\r\n value = Vector3.FromArray([bufferOutput[arrayOffset], bufferOutput[arrayOffset + 1], bufferOutput[arrayOffset + 2]]);\r\n arrayOffset += 3;\r\n }\r\n\r\n if (isBone) {\r\n const bone = <Bone>targetNode;\r\n let translation = Vector3.Zero();\r\n let rotationQuaternion = new Quaternion();\r\n let scaling = Vector3.Zero();\r\n\r\n // Warning on decompose\r\n let mat = bone.getBaseMatrix();\r\n\r\n if (modifyKey && lastAnimation) {\r\n mat = lastAnimation.getKeys()[j].value;\r\n }\r\n\r\n mat.decompose(scaling, rotationQuaternion, translation);\r\n\r\n if (targetPath === \"position\") {\r\n translation = value;\r\n } else if (targetPath === \"rotationQuaternion\") {\r\n rotationQuaternion = value;\r\n } else {\r\n scaling = value;\r\n }\r\n\r\n value = Matrix.Compose(scaling, rotationQuaternion, translation);\r\n }\r\n\r\n if (!modifyKey) {\r\n keys.push({\r\n frame: bufferInput[j],\r\n value: value,\r\n });\r\n } else if (lastAnimation) {\r\n lastAnimation.getKeys()[j].value = value;\r\n }\r\n }\r\n\r\n // Finish\r\n if (!modifyKey && babylonAnimation) {\r\n babylonAnimation.setKeys(keys);\r\n targetNode.animations.push(babylonAnimation);\r\n }\r\n\r\n lastAnimation = babylonAnimation;\r\n\r\n gltfRuntime.scene.stopAnimation(targetNode);\r\n gltfRuntime.scene.beginAnimation(targetNode, 0, bufferInput[bufferInput.length - 1], true, 1.0);\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * @returns the bones transformation matrix\r\n * @param node\r\n */\r\nconst ConfigureBoneTransformation = (node: IGLTFNode): Matrix => {\r\n let mat: Nullable<Matrix>;\r\n\r\n if (node.translation || node.rotation || node.scale) {\r\n const scale = Vector3.FromArray(node.scale || [1, 1, 1]);\r\n const rotation = Quaternion.FromArray(node.rotation || [0, 0, 0, 1]);\r\n const position = Vector3.FromArray(node.translation || [0, 0, 0]);\r\n\r\n mat = Matrix.Compose(scale, rotation, position);\r\n } else {\r\n mat = Matrix.FromArray(node.matrix);\r\n }\r\n\r\n return mat;\r\n};\r\n\r\n/**\r\n * Returns the parent bone\r\n * @param gltfRuntime\r\n * @param skins\r\n * @param jointName\r\n * @param newSkeleton\r\n * @returns the parent bone\r\n */\r\nconst GetParentBone = (gltfRuntime: IGLTFRuntime, skins: IGLTFSkins, jointName: string, newSkeleton: Skeleton): Nullable<Bone> => {\r\n // Try to find\r\n for (let i = 0; i < newSkeleton.bones.length; i++) {\r\n if (newSkeleton.bones[i].name === jointName) {\r\n return newSkeleton.bones[i];\r\n }\r\n }\r\n\r\n // Not found, search in gltf nodes\r\n const nodes = gltfRuntime.nodes;\r\n for (const nde in nodes) {\r\n const node: IGLTFNode = nodes[nde];\r\n\r\n if (!node.jointName) {\r\n continue;\r\n }\r\n\r\n const children = node.children;\r\n for (let i = 0; i < children.length; i++) {\r\n const child: IGLTFNode = gltfRuntime.nodes[children[i]];\r\n if (!child.jointName) {\r\n continue;\r\n }\r\n\r\n if (child.jointName === jointName) {\r\n const mat = ConfigureBoneTransformation(node);\r\n const bone = new Bone(node.name || \"\", newSkeleton, GetParentBone(gltfRuntime, skins, node.jointName, newSkeleton), mat);\r\n bone.id = nde;\r\n return bone;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n};\r\n\r\n/**\r\n * Returns the appropriate root node\r\n * @param nodesToRoot\r\n * @param id\r\n * @returns the root node\r\n */\r\nconst GetNodeToRoot = (nodesToRoot: INodeToRoot[], id: string): Nullable<Bone> => {\r\n for (let i = 0; i < nodesToRoot.length; i++) {\r\n const nodeToRoot = nodesToRoot[i];\r\n\r\n for (let j = 0; j < nodeToRoot.node.children.length; j++) {\r\n const child = nodeToRoot.node.children[j];\r\n if (child === id) {\r\n return nodeToRoot.bone;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n};\r\n\r\n/**\r\n * Returns the node with the joint name\r\n * @param gltfRuntime\r\n * @param jointName\r\n * @returns the node with the joint name\r\n */\r\nconst GetJointNode = (gltfRuntime: IGLTFRuntime, jointName: string): Nullable<IJointNode> => {\r\n const nodes = gltfRuntime.nodes;\r\n let node: IGLTFNode = nodes[jointName];\r\n if (node) {\r\n return {\r\n node: node,\r\n id: jointName,\r\n };\r\n }\r\n\r\n for (const nde in nodes) {\r\n node = nodes[nde];\r\n if (node.jointName === jointName) {\r\n return {\r\n node: node,\r\n id: nde,\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n};\r\n\r\n/**\r\n * Checks if a nodes is in joints\r\n * @param skins\r\n * @param id\r\n * @returns true if the node is in joints, else false\r\n */\r\nconst NodeIsInJoints = (skins: IGLTFSkins, id: string): boolean => {\r\n for (let i = 0; i < skins.jointNames.length; i++) {\r\n if (skins.jointNames[i] === id) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n};\r\n\r\n/**\r\n * Fills the nodes to root for bones and builds hierarchy\r\n * @param gltfRuntime\r\n * @param newSkeleton\r\n * @param skins\r\n * @param nodesToRoot\r\n */\r\nconst GetNodesToRoot = (gltfRuntime: IGLTFRuntime, newSkeleton: Skeleton, skins: IGLTFSkins, nodesToRoot: INodeToRoot[]) => {\r\n // Creates nodes for root\r\n for (const nde in gltfRuntime.nodes) {\r\n const node: IGLTFNode = gltfRuntime.nodes[nde];\r\n const id = nde;\r\n\r\n if (!node.jointName || NodeIsInJoints(skins, node.jointName)) {\r\n continue;\r\n }\r\n\r\n // Create node to root bone\r\n const mat = ConfigureBoneTransformation(node);\r\n const bone = new Bone(node.name || \"\", newSkeleton, null, mat);\r\n bone.id = id;\r\n nodesToRoot.push({ bone: bone, node: node, id: id });\r\n }\r\n\r\n // Parenting\r\n for (let i = 0; i < nodesToRoot.length; i++) {\r\n const nodeToRoot = nodesToRoot[i];\r\n const children = nodeToRoot.node.children;\r\n\r\n for (let j = 0; j < children.length; j++) {\r\n let child: Nullable<INodeToRoot> = null;\r\n\r\n for (let k = 0; k < nodesToRoot.length; k++) {\r\n if (nodesToRoot[k].id === children[j]) {\r\n child = nodesToRoot[k];\r\n break;\r\n }\r\n }\r\n\r\n if (child) {\r\n (<any>child.bone)._parent = nodeToRoot.bone;\r\n nodeToRoot.bone.children.push(child.bone);\r\n }\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Imports a skeleton\r\n * @param gltfRuntime\r\n * @param skins\r\n * @param mesh\r\n * @param newSkeleton\r\n * @returns the bone name\r\n */\r\nconst ImportSkeleton = (gltfRuntime: IGLTFRuntime, skins: IGLTFSkins, mesh: Mesh, newSkeleton: Skeleton | undefined): Skeleton => {\r\n if (!newSkeleton) {\r\n newSkeleton = new Skeleton(skins.name || \"\", \"\", gltfRuntime.scene);\r\n }\r\n\r\n if (!skins.babylonSkeleton) {\r\n return newSkeleton;\r\n }\r\n\r\n // Find the root bones\r\n const nodesToRoot: INodeToRoot[] = [];\r\n const nodesToRootToAdd: Bone[] = [];\r\n\r\n GetNodesToRoot(gltfRuntime, newSkeleton, skins, nodesToRoot);\r\n newSkeleton.bones = [];\r\n\r\n // Joints\r\n for (let i = 0; i < skins.jointNames.length; i++) {\r\n const jointNode = GetJointNode(gltfRuntime, skins.jointNames[i]);\r\n\r\n if (!jointNode) {\r\n continue;\r\n }\r\n\r\n const node = jointNode.node;\r\n\r\n if (!node) {\r\n Tools.Warn(\"Joint named \" + skins.jointNames[i] + \" does not exist\");\r\n continue;\r\n }\r\n\r\n const id = jointNode.id;\r\n\r\n // Optimize, if the bone already exists...\r\n const existingBone = gltfRuntime.scene.getBoneById(id);\r\n if (existingBone) {\r\n newSkeleton.bones.push(existingBone);\r\n continue;\r\n }\r\n\r\n // Search for parent bone\r\n let foundBone: boolean;\r\n let parentBone: Nullable<Bone> = null;\r\n\r\n for (let j = 0; j < i; j++) {\r\n const jointNode = GetJointNode(gltfRuntime, skins.jointNames[j]);\r\n\r\n if (!jointNode) {\r\n continue;\r\n }\r\n\r\n const joint: IGLTFNode = jointNode.node;\r\n\r\n if (!joint) {\r\n Tools.Warn(\"Joint named \" + skins.jointNames[j] + \" does not exist when looking for parent\");\r\n continue;\r\n }\r\n\r\n const children = joint.children;\r\n if (!children) {\r\n continue;\r\n }\r\n foundBone = false;\r\n\r\n for (let k = 0; k < children.length; k++) {\r\n if (children[k] === id) {\r\n parentBone = GetParentBone(gltfRuntime, skins, skins.jointNames[j], newSkeleton);\r\n foundBone = true;\r\n break;\r\n }\r\n }\r\n\r\n if (foundBone) {\r\n break;\r\n }\r\n }\r\n\r\n // Create bone\r\n const mat = ConfigureBoneTransformation(node);\r\n\r\n if (!parentBone && nodesToRoot.length > 0) {\r\n parentBone = GetNodeToRoot(nodesToRoot, id);\r\n\r\n if (parentBone) {\r\n if (nodesToRootToAdd.indexOf(parentBone) === -1) {\r\n nodesToRootToAdd.push(parentBone);\r\n }\r\n }\r\n }\r\n\r\n const bone = new Bone(node.jointName || \"\", newSkeleton, parentBone, mat);\r\n bone.id = id;\r\n }\r\n\r\n // Polish\r\n const bones = newSkeleton.bones;\r\n newSkeleton.bones = [];\r\n\r\n for (let i = 0; i < skins.jointNames.length; i++) {\r\n const jointNode = GetJointNode(gltfRuntime, skins.jointNames[i]);\r\n\r\n if (!jointNode) {\r\n continue;\r\n }\r\n\r\n for (let j = 0; j < bones.length; j++) {\r\n if (bones[j].id === jointNode.id) {\r\n newSkeleton.bones.push(bones[j]);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n newSkeleton.prepare();\r\n\r\n // Finish\r\n for (let i = 0; i < nodesToRootToAdd.length; i++) {\r\n newSkeleton.bones.push(nodesToRootToAdd[i]);\r\n }\r\n\r\n return newSkeleton;\r\n};\r\n\r\n/**\r\n * Imports a mesh and its geometries\r\n * @param gltfRuntime\r\n * @param node\r\n * @param meshes\r\n * @param id\r\n * @param newMesh\r\n * @returns the new mesh\r\n */\r\nconst ImportMesh = (gltfRuntime: IGLTFRuntime, node: IGLTFNode, meshes: string[], id: string, newMesh: Mesh): Mesh => {\r\n if (!newMesh) {\r\n gltfRuntime.scene._blockEntityCollection = !!gltfRuntime.assetContainer;\r\n newMesh = new Mesh(node.name || \"\", gltfRuntime.scene);\r\n newMesh._parentContainer = gltfRuntime.assetContainer;\r\n gltfRuntime.scene._blockEntityCollection = false;\r\n newMesh.id = id;\r\n }\r\n\r\n if (!node.babylonNode) {\r\n return newMesh;\r\n }\r\n\r\n const subMaterials: Material[] = [];\r\n\r\n let vertexData: Nullable<VertexData> = null;\r\n const verticesStarts: number[] = [];\r\n const verticesCounts: number[] = [];\r\n const indexStarts: number[] = [];\r\n const indexCounts: number[] = [];\r\n\r\n for (let meshIndex = 0; meshIndex < meshes.length; meshIndex++) {\r\n const meshId = meshes[meshIndex];\r\n const mesh: IGLTFMesh = gltfRuntime.meshes[meshId];\r\n\r\n if (!mesh) {\r\n continue;\r\n }\r\n\r\n // Positions, normals and UVs\r\n for (let i = 0; i < mesh.primitives.length; i++) {\r\n // Temporary vertex data\r\n const tempVertexData = new VertexData();\r\n\r\n const primitive = mesh.primitives[i];\r\n if (primitive.mode !== 4) {\r\n // continue;\r\n }\r\n\r\n const attributes = primitive.attributes;\r\n let accessor: Nullable<IGLTFAccessor>;\r\n let buffer: any;\r\n\r\n // Set positions, normal and uvs\r\n for (const semantic in attributes) {\r\n // Link accessor and buffer view\r\n accessor = gltfRuntime.accessors[attributes[semantic]];\r\n buffer = GLTFUtils.GetBufferFromAccessor(gltfRuntime, accessor);\r\n\r\n if (semantic === \"NORMAL\") {\r\n tempVertexData.normals = new Float32Array(buffer.length);\r\n (<Float32Array>tempVertexData.normals).set(buffer);\r\n } else if (semantic === \"POSITION\") {\r\n if (GLTFFileLoader.HomogeneousCoordinates) {\r\n tempVertexData.positions = new Float32Array(buffer.length - buffer.length / 4);\r\n\r\n for (let j = 0; j < buffer.length; j += 4) {\r\n tempVertexData.positions[j] = buffer[j];\r\n tempVertexData.positions[j + 1] = buffer[j + 1];\r\n tempVertexData.positions[j + 2] = buffer[j + 2];\r\n }\r\n } else {\r\n tempVertexData.positions = new Float32Array(buffer.length);\r\n (<Float32Array>tempVertexData.positions).set(buffer);\r\n }\r\n\r\n verticesCounts.push(tempVertexData.positions.length);\r\n } else if (semantic.indexOf(\"TEXCOORD_\") !== -1) {\r\n const channel = Number(semantic.split(\"_\")[1]);\r\n const uvKind = VertexBuffer.UVKind + (channel === 0 ? \"\" : channel + 1);\r\n const uvs = new Float32Array(buffer.length);\r\n (<Float32Array>uvs).set(buffer);\r\n NormalizeUVs(uvs);\r\n tempVertexData.set(uvs, uvKind);\r\n } else if (semantic === \"JOINT\") {\r\n tempVertexData.matricesIndices = new Float32Array(buffer.length);\r\n (<Float32Array>tempVertexData.matricesIndices).set(buffer);\r\n } else if (semantic === \"WEIGHT\") {\r\n tempVertexData.matricesWeights = new Float32Array(buffer.length);\r\n (<Float32Array>tempVertexData.matricesWeights).set(buffer);\r\n } else if (semantic === \"COLOR\") {\r\n tempVertexData.colors = new Float32Array(buffer.length);\r\n (<Float32Array>tempVertexData.colors).set(buffer);\r\n }\r\n }\r\n\r\n // Indices\r\n accessor = gltfRuntime.accessors[primitive.indices];\r\n if (accessor) {\r\n buffer = GLTFUtils.GetBufferFromAccessor(gltfRuntime, accessor);\r\n\r\n tempVertexData.indices = new Int32Array(buffer.length);\r\n tempVertexData.indices.set(buffer);\r\n indexCounts.push(tempVertexData.indices.length);\r\n } else {\r\n // Set indices on the fly\r\n const indices: number[] = [];\r\n for (let j = 0; j < (<FloatArray>tempVertexData.positions).length / 3; j++) {\r\n indices.push(j);\r\n }\r\n\r\n tempVertexData.indices = new Int32Array(indices);\r\n indexCounts.push(tempVertexData.indices.length);\r\n }\r\n\r\n if (!vertexData) {\r\n vertexData = tempVertexData;\r\n } else {\r\n vertexData.merge(tempVertexData);\r\n }\r\n\r\n // Sub material\r\n const material = gltfRuntime.scene.getMaterialById(primitive.material);\r\n\r\n subMaterials.push(material === null ? GLTFUtils.GetDefaultMaterial(gltfRuntime.scene) : material);\r\n\r\n // Update vertices start and index start\r\n verticesStarts.push(verticesStarts.length === 0 ? 0 : verticesStarts[verticesStarts.length - 1] + verticesCounts[verticesCounts.length - 2]);\r\n indexStarts.push(indexStarts.length === 0 ? 0 : indexStarts[indexStarts.length - 1] + indexCounts[indexCounts.length - 2]);\r\n }\r\n }\r\n let material: StandardMaterial | MultiMaterial;\r\n gltfRuntime.scene._blockEntityCollection = !!gltfRuntime.assetContainer;\r\n if (subMaterials.length > 1) {\r\n material = new MultiMaterial(\"multimat\" + id, gltfRuntime.scene);\r\n material.subMaterials = subMaterials;\r\n } else {\r\n material = new StandardMaterial(\"multimat\" + id, gltfRuntime.scene);\r\n }\r\n\r\n if (subMaterials.length === 1) {\r\n material = subMaterials[0] as StandardMaterial;\r\n }\r\n\r\n material._parentContainer = gltfRuntime.assetContainer;\r\n\r\n if (!newMesh.material) {\r\n newMesh.material = material;\r\n }\r\n\r\n // Apply geometry\r\n new Geometry(id, gltfRuntime.scene, vertexData!, false, newMesh);\r\n newMesh.computeWorldMatrix(true);\r\n\r\n gltfRuntime.scene._blockEntityCollection = false;\r\n\r\n // Apply submeshes\r\n newMesh.subMeshes = [];\r\n let index = 0;\r\n for (let meshIndex = 0; meshIndex < meshes.length; meshIndex++) {\r\n const meshId = meshes[meshIndex];\r\n const mesh: IGLTFMesh = gltfRuntime.meshes[meshId];\r\n\r\n if (!mesh) {\r\n continue;\r\n }\r\n\r\n for (let i = 0; i < mesh.primitives.length; i++) {\r\n if (mesh.primitives[i].mode !== 4) {\r\n //continue;\r\n }\r\n\r\n SubMesh.AddToMesh(index, verticesStarts[index], verticesCounts[index], indexStarts[index], indexCounts[index], newMesh, newMesh, true);\r\n index++;\r\n }\r\n }\r\n\r\n // Finish\r\n return newMesh;\r\n};\r\n\r\n/**\r\n * Configure node transformation from position, rotation and scaling\r\n * @param newNode\r\n * @param position\r\n * @param rotation\r\n * @param scaling\r\n */\r\nconst ConfigureNode = (newNode: any, position: Vector3, rotation: Quaternion, scaling: Vector3) => {\r\n if (newNode.position) {\r\n newNode.position = position;\r\n }\r\n\r\n if (newNode.rotationQuaternion || newNode.rotation) {\r\n newNode.rotationQuaternion = rotation;\r\n }\r\n\r\n if (newNode.scaling) {\r\n newNode.scaling = scaling;\r\n }\r\n};\r\n\r\n/**\r\n * Configures node from transformation matrix\r\n * @param newNode\r\n * @param node\r\n */\r\nconst ConfigureNodeFromMatrix = (newNode: Mesh, node: IGLTFNode) => {\r\n if (node.matrix) {\r\n const position = new Vector3(0, 0, 0);\r\n const rotation = new Quaternion();\r\n const scaling = new Vector3(0, 0, 0);\r\n const mat = Matrix.FromArray(node.matrix);\r\n mat.decompose(scaling, rotation, position);\r\n\r\n ConfigureNode(newNode, position, rotation, scaling);\r\n } else if (node.translation && node.rotation && node.scale) {\r\n ConfigureNode(newNode, Vector3.FromArray(node.translation), Quaternion.FromArray(node.rotation), Vector3.FromArray(node.scale));\r\n }\r\n\r\n newNode.computeWorldMatrix(true);\r\n};\r\n\r\n/**\r\n * Imports a node\r\n * @param gltfRuntime\r\n * @param node\r\n * @param id\r\n * @returns the newly imported node\r\n */\r\nconst ImportNode = (gltfRuntime: IGLTFRuntime, node: IGLTFNode, id: string): Nullable<Node> => {\r\n let lastNode: Nullable<Node> = null;\r\n\r\n if (gltfRuntime.importOnlyMeshes && (node.skin || node.meshes)) {\r\n if (gltfRuntime.importMeshesNames && gltfRuntime.importMeshesNames.length > 0 && gltfRuntime.importMeshesNames.indexOf(node.name || \"\") === -1) {\r\n return null;\r\n }\r\n }\r\n\r\n // Meshes\r\n if (node.skin) {\r\n if (node.meshes) {\r\n const skin: IGLTFSkins = gltfRuntime.skins[node.skin];\r\n\r\n const newMesh = ImportMesh(gltfRuntime, node, node.meshes, id, <Mesh>node.babylonNode);\r\n newMesh.skeleton = gltfRuntime.scene.getLastSkeletonById(node.skin);\r\n\r\n if (newMesh.skeleton === null) {\r\n newMesh.skeleton = ImportSkeleton(gltfRuntime, skin, newMesh, skin.babylonSkeleton);\r\n\r\n if (!skin.babylonSkeleton) {\r\n skin.babylonSkeleton = newMesh.skeleton;\r\n }\r\n }\r\n\r\n lastNode = newMesh;\r\n }\r\n } else if (node.meshes) {\r\n /**\r\n * Improve meshes property\r\n */\r\n const newMesh = ImportMesh(gltfRuntime, node, node.mesh ? [node.mesh] : node.meshes, id, <Mesh>node.babylonNode);\r\n lastNode = newMesh;\r\n }\r\n // Lights\r\n else if (node.light && !node.babylonNode && !gltfRuntime.importOnlyMeshes) {\r\n const light: IGLTFLight = gltfRuntime.lights[node.light];\r\n\r\n if (light) {\r\n if (light.type === \"ambient\") {\r\n const ambienLight: IGLTFAmbienLight = (<any>light)[light.type];\r\n const hemiLight = new HemisphericLight(node.light, Vector3.Zero(), gltfRuntime.scene);\r\n hemiLight.name = node.name || \"\";\r\n\r\n if (ambienLight.color) {\r\n hemiLight.diffuse = Color3.FromArray(ambienLight.color);\r\n }\r\n\r\n lastNode = hemiLight;\r\n } else if (light.type === \"directional\") {\r\n const directionalLight: IGLTFDirectionalLight = (<any>light)[light.type];\r\n const dirLight = new DirectionalLight(node.light, Vector3.Zero(), gltfRuntime.scene);\r\n dirLight.name = node.name || \"\";\r\n\r\n if (directionalLight.color) {\r\n dirLight.diffuse = Color3.FromArray(directionalLight.color);\r\n }\r\n\r\n lastNode = dirLight;\r\n } else if (light.type === \"point\") {\r\n const pointLight: IGLTFPointLight = (<any>light)[light.type];\r\n const ptLight = new PointLight(node.light, Vector3.Zero(), gltfRuntime.scene);\r\n ptLight.name = node.name || \"\";\r\n\r\n if (pointLight.color) {\r\n ptLight.diffuse = Color3.FromArray(pointLight.color);\r\n }\r\n\r\n lastNode = ptLight;\r\n } else if (light.type === \"spot\") {\r\n const spotLight: IGLTFSpotLight = (<any>light)[light.type];\r\n const spLight = new SpotLight(node.light, Vector3.Zero(), Vector3.Zero(), 0, 0, gltfRuntime.scene);\r\n spLight.name = node.name || \"\";\r\n\r\n if (spotLight.color) {\r\n spLight.diffuse = Color3.FromArray(spotLight.color);\r\n }\r\n\r\n if (spotLight.fallOfAngle) {\r\n spLight.angle = spotLight.fallOfAngle;\r\n }\r\n\r\n if (spotLight.fallOffExponent) {\r\n spLight.exponent = spotLight.fallOffExponent;\r\n }\r\n\r\n lastNode = spLight;\r\n }\r\n }\r\n }\r\n // Cameras\r\n else if (node.camera && !node.babylonNode && !gltfRuntime.importOnlyMeshes) {\r\n const camera: IGLTFCamera = gltfRuntime.cameras[node.camera];\r\n\r\n if (camera) {\r\n gltfRuntime.scene._blockEntityCollection = !!gltfRuntime.assetContainer;\r\n if (camera.type === \"orthographic\") {\r\n const orthoCamera = new FreeCamera(node.camera, Vector3.Zero(), gltfRuntime.scene, false);\r\n\r\n orthoCamera.name = node.name || \"\";\r\n orthoCamera.mode = Camera.ORTHOGRAPHIC_CAMERA;\r\n orthoCamera.attachControl();\r\n\r\n lastNode = orthoCamera;\r\n\r\n orthoCamera._parentContainer = gltfRuntime.assetContainer;\r\n } else if (camera.type === \"perspective\") {\r\n const perspectiveCamera: IGLTFCameraPerspective = (<any>camera)[camera.type];\r\n const persCamera = new FreeCamera(node.camera, Vector3.Zero(), gltfRuntime.scene, false);\r\n\r\n persCamera.name = node.name || \"\";\r\n persCamera.attachControl();\r\n\r\n if (!perspectiveCamera.aspectRatio) {\r\n perspectiveCamera.aspectRatio = gltfRuntime.scene.getEngine().getRenderWidth() / gltfRuntime.scene.getEngine().getRenderHeight();\r\n }\r\n\r\n if (perspectiveCamera.znear && perspectiveCamera.zfar) {\r\n persCamera.maxZ = perspectiveCamera.zfar;\r\n persCamera.minZ = perspectiveCamera.znear;\r\n }\r\n\r\n lastNode = persCamera;\r\n persCamera._parentContainer = gltfRuntime.assetContainer;\r\n }\r\n\r\n gltfRuntime.scene._blockEntityCollection = false;\r\n }\r\n }\r\n\r\n // Empty node\r\n if (!node.jointName) {\r\n if (node.babylonNode) {\r\n return node.babylonNode;\r\n } else if (lastNode === null) {\r\n gltfRuntime.scene._blockEntityCollection = !!gltfRuntime.assetContainer;\r\n const dummy = new Mesh(node.name || \"\", gltfRuntime.scene);\r\n dummy._parentContainer = gltfRuntime.assetContainer;\r\n gltfRuntime.scene._blockEntityCollection = false;\r\n node.babylonNode = dummy;\r\n lastNode = dummy;\r\n }\r\n }\r\n\r\n if (lastNode !== null) {\r\n if (node.matrix && lastNode instanceof Mesh) {\r\n ConfigureNodeFromMatrix(lastNode, node);\r\n } else {\r\n const translation = node.translation || [0, 0, 0];\r\n const rotation = node.rotation || [0, 0, 0, 1];\r\n const scale = node.scale || [1, 1, 1];\r\n ConfigureNode(lastNode, Vector3.FromArray(translation), Quaternion.FromArray(rotation), Vector3.FromArray(scale));\r\n }\r\n\r\n lastNode.updateCache(true);\r\n node.babylonNode = lastNode;\r\n }\r\n\r\n return lastNode;\r\n};\r\n\r\n/**\r\n * Traverses nodes and creates them\r\n * @param gltfRuntime\r\n * @param id\r\n * @param parent\r\n * @param meshIncluded\r\n */\r\nconst TraverseNodes = (gltfRuntime: IGLTFRuntime, id: string, parent: Nullable<Node>, meshIncluded: boolean = false) => {\r\n const node: IGLTFNode = gltfRuntime.nodes[id];\r\n let newNode: Nullable<Node> = null;\r\n\r\n if (gltfRuntime.importOnlyMeshes && !meshIncluded && gltfRuntime.importMeshesNames) {\r\n if (gltfRuntime.importMeshesNames.indexOf(node.name || \"\") !== -1 || gltfRuntime.importMeshesNames.length === 0) {\r\n meshIncluded = true;\r\n } else {\r\n meshIncluded = false;\r\n }\r\n } else {\r\n meshIncluded = true;\r\n }\r\n\r\n if (!node.jointName && meshIncluded) {\r\n newNode = ImportNode(gltfRuntime, node, id);\r\n\r\n if (newNode !== null) {\r\n newNode.id = id;\r\n newNode.parent = parent;\r\n }\r\n }\r\n\r\n if (node.children) {\r\n for (let i = 0; i < node.children.length; i++) {\r\n TraverseNodes(gltfRuntime, node.children[i], newNode, meshIncluded);\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * do stuff after buffers, shaders are loaded (e.g. hook up materials, load animations, etc.)\r\n * @param gltfRuntime\r\n */\r\nconst PostLoad = (gltfRuntime: IGLTFRuntime) => {\r\n // Nodes\r\n let currentScene: IGLTFScene = <IGLTFScene>gltfRuntime.currentScene;\r\n\r\n if (currentScene) {\r\n for (let i = 0; i < currentScene.nodes.length; i++) {\r\n TraverseNodes(gltfRuntime, currentScene.nodes[i], null);\r\n }\r\n } else {\r\n for (const thing in gltfRuntime.scenes) {\r\n currentScene = gltfRuntime.scenes[thing];\r\n\r\n for (let i = 0; i < currentScene.nodes.length; i++) {\r\n TraverseNodes(gltfRuntime, currentScene.nodes[i], null);\r\n }\r\n }\r\n }\r\n\r\n // Set animations\r\n LoadAnimations(gltfRuntime);\r\n\r\n for (let i = 0; i < gltfRuntime.scene.skeletons.length; i++) {\r\n const skeleton = gltfRuntime.scene.skeletons[i];\r\n gltfRuntime.scene.beginAnimation(skeleton, 0, Number.MAX_VALUE, true, 1.0);\r\n }\r\n};\r\n\r\n/**\r\n * onBind shaderrs callback to set uniforms and matrices\r\n * @param mesh\r\n * @param gltfRuntime\r\n * @param unTreatedUniforms\r\n * @param shaderMaterial\r\n * @param technique\r\n * @param material\r\n * @param onSuccess\r\n */\r\nconst OnBindShaderMaterial = (\r\n mesh: AbstractMesh,\r\n gltfRuntime: IGLTFRuntime,\r\n unTreatedUniforms: { [key: string]: IGLTFTechniqueParameter },\r\n shaderMaterial: ShaderMaterial,\r\n technique: IGLTFTechnique,\r\n material: IGLTFMaterial,\r\n onSuccess: (shaderMaterial: ShaderMaterial) => void\r\n) => {\r\n const materialValues = material.values || technique.parameters;\r\n\r\n for (const unif in unTreatedUniforms) {\r\n const uniform: IGLTFTechniqueParameter = unTreatedUniforms[unif];\r\n const type = uniform.type;\r\n\r\n if (type === EParameterType.FLOAT_MAT2 || type === EParameterType.FLOAT_MAT3 || type === EParameterType.FLOAT_MAT4) {\r\n if (uniform.semantic && !uniform.source && !uniform.node) {\r\n GLTFUtils.SetMatrix(gltfRuntime.scene, mesh, uniform, unif, shaderMaterial.getEffect());\r\n } else if (uniform.semantic && (uniform.source || uniform.node)) {\r\n let source = gltfRuntime.scene.getNodeByName(uniform.source || uniform.node || \"\");\r\n if (source === null) {\r\n source = gltfRuntime.scene.getNodeById(uniform.source || uniform.node || \"\");\r\n }\r\n if (source === null) {\r\n continue;\r\n }\r\n\r\n GLTFUtils.SetMatrix(gltfRuntime.scene, source, uniform, unif, shaderMaterial.getEffect());\r\n }\r\n } else {\r\n const value = (<any>materialValues)[technique.uniforms[unif]];\r\n if (!value) {\r\n continue;\r\n }\r\n\r\n if (type === EParameterType.SAMPLER_2D) {\r\n const texture = gltfRuntime.textures[material.values ? value : uniform.value].babylonTexture;\r\n\r\n if (texture === null || texture === undefined) {\r\n continue;\r\n }\r\n\r\n shaderMaterial.getEffect().setTexture(unif, texture);\r\n } else {\r\n GLTFUtils.SetUniform(shaderMaterial.getEffect(), unif, value, type);\r\n }\r\n }\r\n }\r\n\r\n onSuccess(shaderMaterial);\r\n};\r\n\r\n/**\r\n * Prepare uniforms to send the only one time\r\n * Loads the appropriate textures\r\n * @param gltfRuntime\r\n * @param shaderMaterial\r\n * @param technique\r\n * @param material\r\n */\r\nconst PrepareShaderMaterialUniforms = (\r\n gltfRuntime: IGLTFRuntime,\r\n shaderMaterial: ShaderMaterial,\r\n technique: IGLTFTechnique,\r\n material: IGLTFMaterial,\r\n unTreatedUniforms: { [key: string]: IGLTFTechniqueParameter }\r\n) => {\r\n const materialValues = material.values || technique.parameters;\r\n const techniqueUniforms = technique.uniforms;\r\n\r\n /**\r\n * Prepare values here (not matrices)\r\n */\r\n for (const unif in unTreatedUniforms) {\r\n const uniform: IGLTFTechniqueParameter = unTreatedUniforms[unif];\r\n const type = uniform.type;\r\n let value = (<any>materialValues)[techniqueUniforms[unif]];\r\n\r\n if (value === undefined) {\r\n // In case the value is the same for all materials\r\n value = <any>uniform.value;\r\n }\r\n\r\n if (!value) {\r\n continue;\r\n }\r\n\r\n const onLoadTexture = (uniformName: Nullable<string>) => {\r\n return (texture: Texture) => {\r\n if (uniform.value && uniformName) {\r\n // Static uniform\r\n shaderMaterial.setTexture(uniformName, texture);\r\n delete unTreatedUniforms[uniformName];\r\n }\r\n };\r\n };\r\n\r\n // Texture (sampler2D)\r\n if (type === EParameterType.SAMPLER_2D) {\r\n GLTFLoaderExtension.LoadTextureAsync(gltfRuntime, material.values ? value : uniform.value, onLoadTexture(unif), () => onLoadTexture(null));\r\n }\r\n // Others\r\n else {\r\n if (uniform.value && GLTFUtils.SetUniform(shaderMaterial, unif, material.values ? value : uniform.value, type)) {\r\n // Static uniform\r\n delete unTreatedUniforms[unif];\r\n }\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Shader compilation failed\r\n * @param program\r\n * @param shaderMaterial\r\n * @param onError\r\n * @returns callback when shader is compiled\r\n */\r\nconst OnShaderCompileError = (program: IGLTFProgram, shaderMaterial: ShaderMaterial, onError: (message: string) => void) => {\r\n return (effect: Effect, error: string) => {\r\n shaderMaterial.dispose(true);\r\n onError(\"Cannot compile program named \" + program.name + \". Error: \" + error + \". Default material will be applied\");\r\n };\r\n};\r\n\r\n/**\r\n * Shader compilation success\r\n * @param gltfRuntime\r\n * @param shaderMaterial\r\n * @param technique\r\n * @param material\r\n * @param unTreatedUniforms\r\n * @param onSuccess\r\n * @returns callback when shader is compiled\r\n */\r\nconst OnShaderCompileSuccess = (\r\n gltfRuntime: IGLTFRuntime,\r\n shaderMaterial: ShaderMaterial,\r\n technique: IGLTFTechnique,\r\n material: IGLTFMaterial,\r\n unTreatedUniforms: { [key: string]: IGLTFTechniqueParameter },\r\n onSuccess: (shaderMaterial: ShaderMaterial) => void\r\n) => {\r\n return (_: Effect) => {\r\n PrepareShaderMaterialUniforms(gltfRuntime, shaderMaterial, technique, material, unTreatedUniforms);\r\n\r\n shaderMaterial.onBind = (mesh: AbstractMesh) => {\r\n OnBindShaderMaterial(mesh, gltfRuntime, unTreatedUniforms, shaderMaterial, technique, material, onSuccess);\r\n };\r\n };\r\n};\r\n\r\n/**\r\n * Returns the appropriate uniform if already handled by babylon\r\n * @param tokenizer\r\n * @param technique\r\n * @param unTreatedUniforms\r\n * @returns the name of the uniform handled by babylon\r\n */\r\nconst ParseShaderUniforms = (tokenizer: Tokenizer, technique: IGLTFTechnique, unTreatedUniforms: { [key: string]: IGLTFTechniqueParameter }): string => {\r\n for (const unif in technique.uniforms) {\r\n const uniform = technique.uniforms[unif];\r\n const uniformParameter: IGLTFTechniqueParameter = technique.parameters[uniform];\r\n\r\n if (tokenizer.currentIdentifier === unif) {\r\n if (uniformParameter.semantic && !uniformParameter.source && !uniformParameter.node) {\r\n const transformIndex = glTFTransforms.indexOf(uniformParameter.semantic);\r\n\r\n if (transformIndex !== -1) {\r\n delete unTreatedUniforms[unif];\r\n return BabylonTransforms[transformIndex];\r\n }\r\n }\r\n }\r\n }\r\n\r\n return tokenizer.currentIdentifier;\r\n};\r\n\r\n/**\r\n * All shaders loaded. Create materials one by one\r\n * @param gltfRuntime\r\n */\r\nconst ImportMaterials = (gltfRuntime: IGLTFRuntime) => {\r\n // Create materials\r\n for (const mat in gltfRuntime.materials) {\r\n GLTFLoaderExtension.LoadMaterialAsync(\r\n gltfRuntime,\r\n mat,\r\n () => {},\r\n () => {}\r\n );\r\n }\r\n};\r\n\r\n/**\r\n * Implementation of the base glTF spec\r\n * @internal\r\n */\r\nexport class GLTFLoaderBase {\r\n public static CreateRuntime(parsedData: any, scene: Scene, rootUrl: string): IGLTFRuntime {\r\n const gltfRuntime: IGLTFRuntime = {\r\n extensions: {},\r\n accessors: {},\r\n buffers: {},\r\n bufferViews: {},\r\n meshes: {},\r\n lights: {},\r\n cameras: {},\r\n nodes: {},\r\n images: {},\r\n textures: {},\r\n shaders: {},\r\n programs: {},\r\n samplers: {},\r\n techniques: {},\r\n materials: {},\r\n animations: {},\r\n skins: {},\r\n extensionsUsed: [],\r\n\r\n scenes: {},\r\n\r\n buffersCount: 0,\r\n shaderscount: 0,\r\n\r\n scene: scene,\r\n rootUrl: rootUrl,\r\n\r\n loadedBufferCount: 0,\r\n loadedBufferViews: {},\r\n\r\n loadedShaderCount: 0,\r\n\r\n importOnlyMeshes: false,\r\n\r\n dummyNodes: [],\r\n\r\n assetContainer: null,\r\n };\r\n\r\n // Parse\r\n if (parsedData.extensions) {\r\n ParseObject(parsedData.extensions, \"extensions\", gltfRuntime);\r\n }\r\n\r\n if (parsedData.extensionsUsed) {\r\n ParseObject(parsedData.extensionsUsed, \"extensionsUsed\", gltfRuntime);\r\n }\r\n\r\n if (parsedData.buffers) {\r\n ParseBuffers(parsedData.buffers, gltfRuntime);\r\n }\r\n\r\n if (parsedData.bufferViews) {\r\n ParseObject(parsedData.bufferViews, \"bufferViews\", gltfRuntime);\r\n }\r\n\r\n if (parsedData.accessors) {\r\n ParseObject(parsedData.accessors, \"accessors\", gltfRuntime);\r\n }\r\n\r\n if (parsedData.meshes) {\r\n ParseObject(parsedData.meshes, \"meshes\", gltfRuntime);\r\n }\r\n\r\n if (parsedData.lights) {\r\n ParseObject(parsedData.lights, \"lights\", gltfRuntime);\r\n }\r\n\r\n if (parsedData.cameras) {\r\n ParseObject(parsedData.cameras, \"cameras\", gltfRuntime);\r\n }\r\n\r\n if (parsedData.nodes) {\r\n ParseObject(parsedData.nodes, \"nodes\", gltfRuntime);\r\n }\r\n\r\n if (parsedData.images) {\r\n ParseObject(parsedData.images, \"images\", gltfRuntime);\r\n }\r\n\r\n if (parsedData.textures) {\r\n ParseObject(parsedData.textures, \"textures\", gltfRuntime);\r\n }\r\n\r\n if (parsedData.shaders) {\r\n ParseShaders(parsedData.shaders, gltfRuntime);\r\n }\r\n\r\n if (parsedData.programs) {\r\n ParseObject(parsedData.programs, \"programs\", gltfRuntime);\r\n }\r\n\r\n if (parsedData.samplers) {\r\n ParseObject(parsedData.samplers, \"samplers\", gltfRuntime);\r\n }\r\n\r\n if (parsedData.techniques) {\r\n ParseObject(parsedData.techniques, \"techniques\", gltfRuntime);\r\n }\r\n\r\n if (parsedData.materials) {\r\n ParseObject(parsedData.materials, \"materials\", gltfRuntime);\r\n }\r\n\r\n if (parsedData.animations) {\r\n ParseObject(parsedData.animations, \"animations\", gltfRuntime);\r\n }\r\n\r\n if (parsedData.skins) {\r\n ParseObject(parsedData.skins, \"skins\", gltfRuntime);\r\n }\r\n\r\n if (parsedData.scenes) {\r\n gltfRuntime.scenes = parsedData.scenes;\r\n }\r\n\r\n if (parsedData.scene && parsedData.scenes) {\r\n gltfRuntime.currentScene = parsedData.scenes[parsedData.scene];\r\n }\r\n\r\n return gltfRuntime;\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n public static LoadBufferAsync(\r\n gltfRuntime: IGLTFRuntime,\r\n id: string,\r\n onSuccess: (buffer: ArrayBufferView) => void,\r\n onError: (message: string) => void,\r\n onProgress?: () => void\r\n ): void {\r\n const buffer: IGLTFBuffer = gltfRuntime.buffers[id];\r\n\r\n if (Tools.IsBase64(buffer.uri)) {\r\n setTimeout(() => onSuccess(new Uint8Array(Tools.DecodeBase64(buffer.uri))));\r\n } else {\r\n Tools.LoadFile(\r\n gltfRuntime.rootUrl + buffer.uri,\r\n (data) => onSuccess(new Uint8Array(data as ArrayBuffer)),\r\n onProgress,\r\n undefined,\r\n true,\r\n (request) => {\r\n if (request) {\r\n onError(request.status + \" \" + request.statusText);\r\n }\r\n }\r\n );\r\n }\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n public static LoadTextureBufferAsync(gltfRuntime: IGLTFRuntime, id: string, onSuccess: (buffer: Nullable<ArrayBufferView>) => void, onError: (message: string) => void): void {\r\n const texture: IGLTFTexture = gltfRuntime.textures[id];\r\n\r\n if (!texture || !texture.source) {\r\n onError(\"\");\r\n return;\r\n }\r\n\r\n if (texture.babylonTexture) {\r\n onSuccess(null);\r\n return;\r\n }\r\n\r\n const source: IGLTFImage = gltfRuntime.images[texture.source];\r\n\r\n if (Tools.IsBase64(source.uri)) {\r\n setTimeout(() => onSuccess(new Uint8Array(Tools.DecodeBase64(source.uri))));\r\n } else {\r\n Tools.LoadFile(\r\n gltfRuntime.rootUrl + source.uri,\r\n (data) => onSuccess(new Uint8Array(data as ArrayBuffer)),\r\n undefined,\r\n undefined,\r\n true,\r\n (request) => {\r\n if (request) {\r\n onError(request.status + \" \" + request.statusText);\r\n }\r\n }\r\n );\r\n }\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n public static CreateTextureAsync(gltfRuntime: IGLTFRuntime, id: string, buffer: Nullable<ArrayBufferView>, onSuccess: (texture: Texture) => void): void {\r\n const texture: IGLTFTexture = gltfRuntime.textures[id];\r\n\r\n if (texture.babylonTexture) {\r\n onSuccess(texture.babylonTexture);\r\n return;\r\n }\r\n\r\n const sampler: IGLTFSampler = gltfRuntime.samplers[texture.sampler];\r\n\r\n const createMipMaps =\r\n sampler.minFilter === ETextureFilterType.NEAREST_MIPMAP_NEAREST ||\r\n sampler.minFilter === ETextureFilterType.NEAREST_MIPMAP_LINEAR ||\r\n sampler.minFilter === ETextureFilterType.LINEAR_MIPMAP_NEAREST ||\r\n sampler.minFilter === ETextureFilterType.LINEAR_MIPMAP_LINEAR;\r\n\r\n const samplingMode = Texture.BILINEAR_SAMPLINGMODE;\r\n const blob = buffer == null ? new Blob() : new Blob([GetBlobBufferSource(buffer)]);\r\n const blobURL = URL.createObjectURL(blob);\r\n const revokeBlobURL = () => URL.revokeObjectURL(blobURL);\r\n const newTexture = new Texture(blobURL, gltfRuntime.scene, !createMipMaps, true, samplingMode, revokeBlobURL, revokeBlobURL);\r\n if (sampler.wrapS !== undefined) {\r\n newTexture.wrapU = GLTFUtils.GetWrapMode(sampler.wrapS);\r\n }\r\n if (sampler.wrapT !== undefined) {\r\n newTexture.wrapV = GLTFUtils.GetWrapMode(sampler.wrapT);\r\n }\r\n newTexture.name = id;\r\n\r\n texture.babylonTexture = newTexture;\r\n onSuccess(newTexture);\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n public static LoadShaderStringAsync(gltfRuntime: IGLTFRuntime, id: string, onSuccess: (shaderString: string | ArrayBuffer) => void, onError?: (message: string) => void): void {\r\n const shader: IGLTFShader = gltfRuntime.shaders[id];\r\n\r\n if (Tools.IsBase64(shader.uri)) {\r\n const shaderString = atob(shader.uri.split(\",\")[1]);\r\n if (onSuccess) {\r\n onSuccess(shaderString);\r\n }\r\n } else {\r\n Tools.LoadFile(gltfRuntime.rootUrl + shader.uri, onSuccess, undefined, undefined, false, (request) => {\r\n if (request && onError) {\r\n onError(request.status + \" \" + request.statusText);\r\n }\r\n });\r\n }\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n public static LoadMaterialAsync(gltfRuntime: IGLTFRuntime, id: string, onSuccess: (material: Material) => void, onError: (message: string) => void): void {\r\n const material: IGLTFMaterial = gltfRuntime.materials[id];\r\n if (!material.technique) {\r\n if (onError) {\r\n onError(\"No technique found.\");\r\n }\r\n return;\r\n }\r\n\r\n const technique: IGLTFTechnique = gltfRuntime.techniques[material.technique];\r\n if (!technique) {\r\n gltfRuntime.scene._blockEntityCollection = !!gltfRuntime.assetContainer;\r\n const defaultMaterial = new StandardMaterial(id, gltfRuntime.scene);\r\n defaultMaterial._parentContainer = gltfRuntime.assetContainer;\r\n gltfRuntime.scene._blockEntityCollection = false;\r\n defaultMaterial.diffuseColor = new Color3(0.5, 0.5, 0.5);\r\n defaultMaterial.sideOrientation = Material.CounterClockWiseSideOrientation;\r\n onSuccess(defaultMaterial);\r\n return;\r\n }\r\n\r\n const program: IGLTFProgram = gltfRuntime.programs[technique.program];\r\n const states: IGLTFTechniqueStates = technique.states;\r\n\r\n const vertexShader: string = Effect.ShadersStore[program.vertexShader + \"VertexShader\"];\r\n const pixelShader: string = Effect.ShadersStore[program.fragmentShader + \"PixelShader\"];\r\n let newVertexShader = \"\";\r\n let newPixelShader = \"\";\r\n\r\n const vertexTokenizer = new Tokenizer(vertexShader);\r\n const pixelTokenizer = new Tokenizer(pixelShader);\r\n\r\n const unTreatedUniforms: { [key: string]: IGLTFTechniqueParameter } = {};\r\n const uniforms: string[] = [];\r\n const attributes: string[] = [];\r\n const samplers: string[] = [];\r\n\r\n // Fill uniform, sampler2D and attributes\r\n for (const unif in technique.uniforms) {\r\n const uniform = technique.uniforms[unif];\r\n const uniformParameter: IGLTFTechniqueParameter = technique.parameters[uniform];\r\n\r\n unTreatedUniforms[unif] = uniformParameter;\r\n\r\n if (uniformParameter.semantic && !uniformParameter.node && !uniformParameter.source) {\r\n const transformIndex = glTFTransforms.indexOf(uniformParameter.semantic);\r\n if (transformIndex !== -1) {\r\n uniforms.push(BabylonTransforms[transformIndex]);\r\n delete unTreatedUniforms[unif];\r\n } else {\r\n uniforms.push(unif);\r\n }\r\n } else if (uniformParameter.type === EParameterType.SAMPLER_2D) {\r\n samplers.push(unif);\r\n } else {\r\n uniforms.push(unif);\r\n }\r\n }\r\n\r\n for (const attr in technique.attributes) {\r\n const attribute = technique.attributes[attr];\r\n const attributeParameter: IGLTFTechniqueParameter = technique.parameters[attribute];\r\n\r\n if (attributeParameter.semantic) {\r\n const name = GetAttribute(attributeParameter);\r\n if (name) {\r\n attributes.push(name);\r\n }\r\n }\r\n }\r\n\r\n // Configure vertex shader\r\n while (!vertexTokenizer.isEnd() && vertexTokenizer.getNextToken()) {\r\n const tokenType = vertexTokenizer.currentToken;\r\n\r\n if (tokenType !== ETokenType.IDENTIFIER) {\r\n newVertexShader += vertexTokenizer.currentString;\r\n continue;\r\n }\r\n\r\n let foundAttribute = false;\r\n\r\n for (const attr in technique.attributes) {\r\n const attribute = technique.attributes[attr];\r\n const attributeParameter: IGLTFTechniqueParameter = technique.parameters[attribute];\r\n\r\n if (vertexTokenizer.currentIdentifier === attr && attributeParameter.semantic) {\r\n newVertexShader += GetAttribute(attributeParameter);\r\n foundAttribute = true;\r\n break;\r\n }\r\n }\r\n\r\n if (foundAttribute) {\r\n continue;\r\n }\r\n\r\n newVertexShader += ParseShaderUniforms(vertexTokenizer, technique, unTreatedUniforms);\r\n }\r\n\r\n // Configure pixel shader\r\n while (!pixelTokenizer.isEnd() && pixelTokenizer.getNextToken()) {\r\n const tokenType = pixelTokenizer.currentToken;\r\n\r\n if (tokenType !== ETokenType.IDENTIFIER) {\r\n newPixelShader += pixelTokenizer.currentString;\r\n continue;\r\n }\r\n\r\n newPixelShader += ParseShaderUniforms(pixelTokenizer, technique, unTreatedUniforms);\r\n }\r\n\r\n // Create shader material\r\n const shaderPath = {\r\n vertex: program.vertexShader + id,\r\n fragment: program.fragmentShader + id,\r\n };\r\n\r\n const options = {\r\n attributes: attributes,\r\n uniforms: uniforms,\r\n samplers: samplers,\r\n needAlphaBlending: states && states.enable && states.enable.indexOf(3042) !== -1,\r\n };\r\n\r\n Effect.ShadersStore[program.vertexShader + id + \"VertexShader\"] = newVertexShader;\r\n Effect.ShadersStore[program.fragmentShader + id + \"PixelShader\"] = newPixelShader;\r\n\r\n const shaderMaterial = new ShaderMaterial(id, gltfRuntime.scene, shaderPath, options);\r\n shaderMaterial.onError = OnShaderCompileError(program, shaderMaterial, onError);\r\n shaderMaterial.onCompiled = OnShaderCompileSuccess(gltfRuntime, shaderMaterial, technique, material, unTreatedUniforms, onSuccess);\r\n shaderMaterial.sideOrientation = Material.CounterClockWiseSideOrientation;\r\n\r\n if (states && states.functions) {\r\n const functions = states.functions;\r\n if (functions.cullFace && functions.cullFace[0] !== ECullingType.BACK) {\r\n shaderMaterial.backFaceCulling = false;\r\n }\r\n\r\n const blendFunc = functions.blendFuncSeparate;\r\n if (blendFunc) {\r\n if (\r\n blendFunc[0] === EBlendingFunction.SRC_ALPHA &&\r\n blendFunc[1] === EBlendingFunction.ONE_MINUS_SRC_ALPHA &&\r\n blendFunc[2] === EBlendingFunction.ONE &&\r\n blendFunc[3] === EBlendingFunction.ONE\r\n ) {\r\n shaderMaterial.alphaMode = Constants.ALPHA_COMBINE;\r\n } else if (\r\n blendFunc[0] === EBlendingFunction.ONE &&\r\n blendFunc[1] === EBlendingFunction.ONE &&\r\n blendFunc[2] === EBlendingFunction.ZERO &&\r\n blendFunc[3] === EBlendingFunction.ONE\r\n ) {\r\n shaderMaterial.alphaMode = Constants.ALPHA_ONEONE;\r\n } else if (\r\n blendFunc[0] === EBlendingFunction.SRC_ALPHA &&\r\n blendFunc[1] === EBlendingFunction.ONE &&\r\n blendFunc[2] === EBlendingFunction.ZERO &&\r\n blendFunc[3] === EBlendingFunction.ONE\r\n ) {\r\n shaderMaterial.alphaMode = Constants.ALPHA_ADD;\r\n } else if (\r\n blendFunc[0] === EBlendingFunction.ZERO &&\r\n blendFunc[1] === EBlendingFunction.ONE_MINUS_SRC_COLOR &&\r\n blendFunc[2] === EBlendingFunction.ONE &&\r\n blendFunc[3] === EBlendingFunction.ONE\r\n ) {\r\n shaderMaterial.alphaMode = Constants.ALPHA_SUBTRACT;\r\n } else if (\r\n blendFunc[0] === EBlendingFunction.DST_COLOR &&\r\n blendFunc[1] === EBlendingFunction.ZERO &&\r\n blendFunc[2] === EBlendingFunction.ONE &&\r\n blendFunc[3] === EBlendingFunction.ONE\r\n ) {\r\n shaderMaterial.alphaMode = Constants.ALPHA_MULTIPLY;\r\n } else if (\r\n blendFunc[0] === EBlendingFunction.SRC_ALPHA &&\r\n blendFunc[1] === EBlendingFunction.ONE_MINUS_SRC_COLOR &&\r\n blendFunc[2] === EBlendingFunction.ONE &&\r\n blendFunc[3] === EBlendingFunction.ONE\r\n ) {\r\n shaderMaterial.alphaMode = Constants.ALPHA_MAXIMIZED;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * glTF V1 Loader\r\n * @internal\r\n * @deprecated\r\n */\r\nexport class GLTFLoader implements IGLTFLoader {\r\n public static Extensions: { [name: string]: GLTFLoaderExtension } = {};\r\n\r\n public static RegisterExtension(extension: GLTFLoaderExtension): void {\r\n if (GLTFLoader.Extensions[extension.name]) {\r\n Tools.Error('Tool with the same name \"' + extension.name + '\" already exists');\r\n return;\r\n }\r\n\r\n GLTFLoader.Extensions[extension.name] = extension;\r\n }\r\n\r\n public dispose(): void {\r\n // do nothing\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n private _importMeshAsync(\r\n meshesNames: any,\r\n scene: Scene,\r\n data: IGLTFLoaderData,\r\n rootUrl: string,\r\n assetContainer: Nullable<AssetContainer>,\r\n onSuccess: (meshes: AbstractMesh[], skeletons: Skeleton[]) => void,\r\n onProgress?: (event: ISceneLoaderProgressEvent) => void,\r\n onError?: (message: string) => void\r\n ): boolean {\r\n scene.useRightHandedSystem = true;\r\n\r\n GLTFLoaderExtension.LoadRuntimeAsync(\r\n scene,\r\n data,\r\n rootUrl,\r\n (gltfRuntime) => {\r\n gltfRuntime.assetContainer = assetContainer;\r\n gltfRuntime.importOnlyMeshes = true;\r\n\r\n if (meshesNames === \"\") {\r\n gltfRuntime.importMeshesNames = [];\r\n } else if (typeof meshesNames === \"string\") {\r\n gltfRuntime.importMeshesNames = [meshesNames];\r\n } else if (meshesNames && !(meshesNames instanceof Array)) {\r\n gltfRuntime.importMeshesNames = [meshesNames];\r\n } else {\r\n gltfRuntime.importMeshesNames = [];\r\n Tools.Warn(\"Argument meshesNames must be of type string or string[]\");\r\n }\r\n\r\n // Create nodes\r\n this._createNodes(gltfRuntime);\r\n\r\n const meshes: AbstractMesh[] = [];\r\n const skeletons: Skeleton[] = [];\r\n\r\n // Fill arrays of meshes and skeletons\r\n for (const nde in gltfRuntime.nodes) {\r\n const node: IGLTFNode = gltfRuntime.nodes[nde];\r\n\r\n if (node.babylonNode instanceof AbstractMesh) {\r\n meshes.push(node.babylonNode);\r\n }\r\n }\r\n\r\n for (const skl in gltfRuntime.skins) {\r\n const skin: IGLTFSkins = gltfRuntime.skins[skl];\r\n\r\n if (skin.babylonSkeleton instanceof Skeleton) {\r\n skeletons.push(skin.babylonSkeleton);\r\n }\r\n }\r\n\r\n // Load buffers, shaders, materials, etc.\r\n this._loadBuffersAsync(gltfRuntime, () => {\r\n this._loadShadersAsync(gltfRuntime, () => {\r\n ImportMaterials(gltfRuntime);\r\n PostLoad(gltfRuntime);\r\n\r\n if (!GLTFFileLoader.IncrementalLoading && onSuccess) {\r\n onSuccess(meshes, skeletons);\r\n }\r\n });\r\n });\r\n\r\n if (GLTFFileLoader.IncrementalLoading && onSuccess) {\r\n onSuccess(meshes, skeletons);\r\n }\r\n },\r\n onError\r\n );\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Imports one or more meshes from a loaded gltf file and adds them to the scene\r\n * @param meshesNames a string or array of strings of the mesh names that should be loaded from the file\r\n * @param scene the scene the meshes should be added to\r\n * @param assetContainer defines the asset container to use (can be null)\r\n * @param data gltf data containing information of the meshes in a loaded file\r\n * @param rootUrl root url to load from\r\n * @param onProgress event that fires when loading progress has occured\r\n * @returns a promise containg the loaded meshes, particles, skeletons and animations\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n public importMeshAsync(\r\n meshesNames: any,\r\n scene: Scene,\r\n assetContainer: Nullable<AssetContainer>,\r\n data: IGLTFLoaderData,\r\n rootUrl: string,\r\n onProgress?: (event: ISceneLoaderProgressEvent) => void\r\n ): Promise<ISceneLoaderAsyncResult> {\r\n return new Promise((resolve, reject) => {\r\n this._importMeshAsync(\r\n meshesNames,\r\n scene,\r\n data,\r\n rootUrl,\r\n assetContainer,\r\n (meshes, skeletons) => {\r\n resolve({\r\n meshes: meshes,\r\n particleSystems: [],\r\n skeletons: skeletons,\r\n animationGroups: [],\r\n lights: [],\r\n transformNodes: [],\r\n geometries: [],\r\n spriteManagers: [],\r\n });\r\n },\r\n onProgress,\r\n (message) => {\r\n reject(new Error(message));\r\n }\r\n );\r\n });\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n private _loadAsync(\r\n scene: Scene,\r\n data: IGLTFLoaderData,\r\n rootUrl: string,\r\n onSuccess: () => void,\r\n onProgress?: (event: ISceneLoaderProgressEvent) => void,\r\n onError?: (message: string) => void\r\n ): void {\r\n scene.useRightHandedSystem = true;\r\n\r\n GLTFLoaderExtension.LoadRuntimeAsync(\r\n scene,\r\n data,\r\n rootUrl,\r\n (gltfRuntime) => {\r\n // Load runtime extensios\r\n GLTFLoaderExtension.LoadRuntimeExtensionsAsync(\r\n gltfRuntime,\r\n () => {\r\n // Create nodes\r\n this._createNodes(gltfRuntime);\r\n\r\n // Load buffers, shaders, materials, etc.\r\n this._loadBuffersAsync(gltfRuntime, () => {\r\n this._loadShadersAsync(gltfRuntime, () => {\r\n ImportMaterials(gltfRuntime);\r\n PostLoad(gltfRuntime);\r\n\r\n if (!GLTFFileLoader.IncrementalLoading) {\r\n onSuccess();\r\n }\r\n });\r\n });\r\n\r\n if (GLTFFileLoader.IncrementalLoading) {\r\n onSuccess();\r\n }\r\n },\r\n onError\r\n );\r\n },\r\n onError\r\n );\r\n }\r\n\r\n /**\r\n * Imports all objects from a loaded gltf file and adds them to the scene\r\n * @param scene the scene the objects should be added to\r\n * @param data gltf data containing information of the meshes in a loaded file\r\n * @param rootUrl root url to load from\r\n * @param onProgress event that fires when loading progress has occured\r\n * @returns a promise which completes when objects have been loaded to the scene\r\n */\r\n public async loadAsync(scene: Scene, data: IGLTFLoaderData, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void): Promise<void> {\r\n return await new Promise((resolve, reject) => {\r\n this._loadAsync(\r\n scene,\r\n data,\r\n rootUrl,\r\n () => {\r\n resolve();\r\n },\r\n onProgress,\r\n (message) => {\r\n reject(new Error(message));\r\n }\r\n );\r\n });\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n private _loadShadersAsync(gltfRuntime: IGLTFRuntime, onload: () => void): void {\r\n let hasShaders = false;\r\n\r\n const processShader = (sha: string, shader: IGLTFShader) => {\r\n GLTFLoaderExtension.LoadShaderStringAsync(\r\n gltfRuntime,\r\n sha,\r\n (shaderString) => {\r\n if (shaderString instanceof ArrayBuffer) {\r\n return;\r\n }\r\n\r\n gltfRuntime.loadedShaderCount++;\r\n\r\n if (shaderString) {\r\n Effect.ShadersStore[sha + (shader.type === EShaderType.VERTEX ? \"VertexShader\" : \"PixelShader\")] = shaderString;\r\n }\r\n\r\n if (gltfRuntime.loadedShaderCount === gltfRuntime.shaderscount) {\r\n onload();\r\n }\r\n },\r\n () => {\r\n Tools.Error(\"Error when loading shader program named \" + sha + \" located at \" + shader.uri);\r\n }\r\n );\r\n };\r\n\r\n for (const sha in gltfRuntime.shaders) {\r\n hasShaders = true;\r\n\r\n const shader: IGLTFShader = gltfRuntime.shaders[sha];\r\n if (shader) {\r\n processShader.bind(this, sha, shader)();\r\n } else {\r\n Tools.Error(\"No shader named: \" + sha);\r\n }\r\n }\r\n\r\n if (!hasShaders) {\r\n onload();\r\n }\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n private _loadBuffersAsync(gltfRuntime: IGLTFRuntime, onLoad: () => void): void {\r\n let hasBuffers = false;\r\n\r\n const processBuffer = (buf: string, buffer: IGLTFBuffer) => {\r\n GLTFLoaderExtension.LoadBufferAsync(\r\n gltfRuntime,\r\n buf,\r\n (bufferView) => {\r\n gltfRuntime.loadedBufferCount++;\r\n\r\n if (bufferView) {\r\n if (bufferView.byteLength != gltfRuntime.buffers[buf].byteLength) {\r\n Tools.Error(\"Buffer named \" + buf + \" is length \" + bufferView.byteLength + \". Expected: \" + buffer.byteLength); // Improve error message\r\n }\r\n\r\n gltfRuntime.loadedBufferViews[buf] = bufferView;\r\n }\r\n\r\n if (gltfRuntime.loadedBufferCount === gltfRuntime.buffersCount) {\r\n onLoad();\r\n }\r\n },\r\n () => {\r\n Tools.Error(\"Error when loading buffer named \" + buf + \" located at \" + buffer.uri);\r\n }\r\n );\r\n };\r\n\r\n for (const buf in gltfRuntime.buffers) {\r\n hasBuffers = true;\r\n\r\n const buffer: IGLTFBuffer = gltfRuntime.buffers[buf];\r\n if (buffer) {\r\n processBuffer.bind(this, buf, buffer)();\r\n } else {\r\n Tools.Error(\"No buffer named: \" + buf);\r\n }\r\n }\r\n\r\n if (!hasBuffers) {\r\n onLoad();\r\n }\r\n }\r\n\r\n private _createNodes(gltfRuntime: IGLTFRuntime): void {\r\n let currentScene = <IGLTFScene>gltfRuntime.currentScene;\r\n\r\n if (currentScene) {\r\n // Only one scene even if multiple scenes are defined\r\n for (let i = 0; i < currentScene.nodes.length; i++) {\r\n TraverseNodes(gltfRuntime, currentScene.nodes[i], null);\r\n }\r\n } else {\r\n // Load all scenes\r\n for (const thing in gltfRuntime.scenes) {\r\n currentScene = gltfRuntime.scenes[thing];\r\n\r\n for (let i = 0; i < currentScene.nodes.length; i++) {\r\n TraverseNodes(gltfRuntime, currentScene.nodes[i], null);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport abstract class GLTFLoaderExtension {\r\n private _name: string;\r\n\r\n public constructor(name: string) {\r\n this._name = name;\r\n }\r\n\r\n public get name(): string {\r\n return this._name;\r\n }\r\n\r\n /**\r\n * Defines an override for loading the runtime\r\n * Return true to stop further extensions from loading the runtime\r\n * @param scene\r\n * @param data\r\n * @param rootUrl\r\n * @param onSuccess\r\n * @param onError\r\n * @returns true to stop further extensions from loading the runtime\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadRuntimeAsync(scene: Scene, data: IGLTFLoaderData, rootUrl: string, onSuccess?: (gltfRuntime: IGLTFRuntime) => void, onError?: (message: string) => void): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Defines an onverride for creating gltf runtime\r\n * Return true to stop further extensions from creating the runtime\r\n * @param gltfRuntime\r\n * @param onSuccess\r\n * @param onError\r\n * @returns true to stop further extensions from creating the runtime\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadRuntimeExtensionsAsync(gltfRuntime: IGLTFRuntime, onSuccess: () => void, onError?: (message: string) => void): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Defines an override for loading buffers\r\n * Return true to stop further extensions from loading this buffer\r\n * @param gltfRuntime\r\n * @param id\r\n * @param onSuccess\r\n * @param onError\r\n * @param onProgress\r\n * @returns true to stop further extensions from loading this buffer\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadBufferAsync(\r\n gltfRuntime: IGLTFRuntime,\r\n id: string,\r\n onSuccess: (buffer: ArrayBufferView) => void,\r\n onError: (message: string) => void,\r\n onProgress?: () => void\r\n ): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Defines an override for loading texture buffers\r\n * Return true to stop further extensions from loading this texture data\r\n * @param gltfRuntime\r\n * @param id\r\n * @param onSuccess\r\n * @param onError\r\n * @returns true to stop further extensions from loading this texture data\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadTextureBufferAsync(gltfRuntime: IGLTFRuntime, id: string, onSuccess: (buffer: ArrayBufferView) => void, onError: (message: string) => void): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Defines an override for creating textures\r\n * Return true to stop further extensions from loading this texture\r\n * @param gltfRuntime\r\n * @param id\r\n * @param buffer\r\n * @param onSuccess\r\n * @param onError\r\n * @returns true to stop further extensions from loading this texture\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public createTextureAsync(gltfRuntime: IGLTFRuntime, id: string, buffer: ArrayBufferView, onSuccess: (texture: Texture) => void, onError: (message: string) => void): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Defines an override for loading shader strings\r\n * Return true to stop further extensions from loading this shader data\r\n * @param gltfRuntime\r\n * @param id\r\n * @param onSuccess\r\n * @param onError\r\n * @returns true to stop further extensions from loading this shader data\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadShaderStringAsync(gltfRuntime: IGLTFRuntime, id: string, onSuccess: (shaderString: string) => void, onError: (message: string) => void): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Defines an override for loading materials\r\n * Return true to stop further extensions from loading this material\r\n * @param gltfRuntime\r\n * @param id\r\n * @param onSuccess\r\n * @param onError\r\n * @returns true to stop further extensions from loading this material\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadMaterialAsync(gltfRuntime: IGLTFRuntime, id: string, onSuccess: (material: Material) => void, onError: (message: string) => void): boolean {\r\n return false;\r\n }\r\n\r\n // ---------\r\n // Utilities\r\n // ---------\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n public static LoadRuntimeAsync(\r\n scene: Scene,\r\n data: IGLTFLoaderData,\r\n rootUrl: string,\r\n onSuccess?: (gltfRuntime: IGLTFRuntime) => void,\r\n onError?: (message: string) => void\r\n ): void {\r\n GLTFLoaderExtension._ApplyExtensions(\r\n (loaderExtension) => {\r\n return loaderExtension.loadRuntimeAsync(scene, data, rootUrl, onSuccess, onError);\r\n },\r\n () => {\r\n setTimeout(() => {\r\n if (!onSuccess) {\r\n return;\r\n }\r\n onSuccess(GLTFLoaderBase.CreateRuntime(data.json, scene, rootUrl));\r\n });\r\n }\r\n );\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n public static LoadRuntimeExtensionsAsync(gltfRuntime: IGLTFRuntime, onSuccess: () => void, onError?: (message: string) => void): void {\r\n GLTFLoaderExtension._ApplyExtensions(\r\n (loaderExtension) => {\r\n return loaderExtension.loadRuntimeExtensionsAsync(gltfRuntime, onSuccess, onError);\r\n },\r\n () => {\r\n setTimeout(() => {\r\n onSuccess();\r\n });\r\n }\r\n );\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n public static LoadBufferAsync(\r\n gltfRuntime: IGLTFRuntime,\r\n id: string,\r\n onSuccess: (bufferView: ArrayBufferView) => void,\r\n onError: (message: string) => void,\r\n onProgress?: () => void\r\n ): void {\r\n GLTFLoaderExtension._ApplyExtensions(\r\n (loaderExtension) => {\r\n return loaderExtension.loadBufferAsync(gltfRuntime, id, onSuccess, onError, onProgress);\r\n },\r\n () => {\r\n GLTFLoaderBase.LoadBufferAsync(gltfRuntime, id, onSuccess, onError, onProgress);\r\n }\r\n );\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n public static LoadTextureAsync(gltfRuntime: IGLTFRuntime, id: string, onSuccess: (texture: Texture) => void, onError: (message: string) => void): void {\r\n GLTFLoaderExtension._LoadTextureBufferAsync(\r\n gltfRuntime,\r\n id,\r\n (buffer) => {\r\n if (buffer) {\r\n GLTFLoaderExtension._CreateTextureAsync(gltfRuntime, id, buffer, onSuccess, onError);\r\n }\r\n },\r\n onError\r\n );\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n public static LoadShaderStringAsync(gltfRuntime: IGLTFRuntime, id: string, onSuccess: (shaderData: string | ArrayBuffer) => void, onError: (message: string) => void): void {\r\n GLTFLoaderExtension._ApplyExtensions(\r\n (loaderExtension) => {\r\n return loaderExtension.loadShaderStringAsync(gltfRuntime, id, onSuccess, onError);\r\n },\r\n () => {\r\n GLTFLoaderBase.LoadShaderStringAsync(gltfRuntime, id, onSuccess, onError);\r\n }\r\n );\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n public static LoadMaterialAsync(gltfRuntime: IGLTFRuntime, id: string, onSuccess: (material: Material) => void, onError: (message: string) => void): void {\r\n GLTFLoaderExtension._ApplyExtensions(\r\n (loaderExtension) => {\r\n return loaderExtension.loadMaterialAsync(gltfRuntime, id, onSuccess, onError);\r\n },\r\n () => {\r\n GLTFLoaderBase.LoadMaterialAsync(gltfRuntime, id, onSuccess, onError);\r\n }\r\n );\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n private static _LoadTextureBufferAsync(\r\n gltfRuntime: IGLTFRuntime,\r\n id: string,\r\n onSuccess: (buffer: Nullable<ArrayBufferView>) => void,\r\n onError: (message: string) => void\r\n ): void {\r\n GLTFLoaderExtension._ApplyExtensions(\r\n (loaderExtension) => {\r\n return loaderExtension.loadTextureBufferAsync(gltfRuntime, id, onSuccess, onError);\r\n },\r\n () => {\r\n GLTFLoaderBase.LoadTextureBufferAsync(gltfRuntime, id, onSuccess, onError);\r\n }\r\n );\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n private static _CreateTextureAsync(\r\n gltfRuntime: IGLTFRuntime,\r\n id: string,\r\n buffer: ArrayBufferView,\r\n onSuccess: (texture: Texture) => void,\r\n onError: (message: string) => void\r\n ): void {\r\n GLTFLoaderExtension._ApplyExtensions(\r\n (loaderExtension) => {\r\n return loaderExtension.createTextureAsync(gltfRuntime, id, buffer, onSuccess, onError);\r\n },\r\n () => {\r\n GLTFLoaderBase.CreateTextureAsync(gltfRuntime, id, buffer, onSuccess);\r\n }\r\n );\r\n }\r\n\r\n private static _ApplyExtensions(func: (loaderExtension: GLTFLoaderExtension) => boolean, defaultFunc: () => void): void {\r\n for (const extensionName in GLTFLoader.Extensions) {\r\n const loaderExtension = GLTFLoader.Extensions[extensionName];\r\n if (func(loaderExtension)) {\r\n return;\r\n }\r\n }\r\n\r\n defaultFunc();\r\n }\r\n}\r\n\r\nGLTFFileLoader._CreateGLTF1Loader = () => new GLTFLoader();\r\n","import { GLTFLoaderExtension, GLTFLoader, GLTFLoaderBase } from \"./glTFLoader\";\r\nimport { GLTFUtils } from \"./glTFLoaderUtils\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type IGLTFLoaderData } from \"../glTFFileLoader\";\r\nimport { type IGLTFRuntime, type IGLTFTexture, type IGLTFImage, type IGLTFBufferView, type IGLTFShader, EComponentType } from \"./glTFLoaderInterfaces\";\r\n\r\nimport { type IDataBuffer } from \"core/Misc/dataReader\";\r\n\r\nconst BinaryExtensionBufferName = \"binary_glTF\";\r\n\r\ninterface IGLTFBinaryExtensionShader {\r\n bufferView: string;\r\n}\r\n\r\ninterface IGLTFBinaryExtensionImage {\r\n bufferView: string;\r\n mimeType: string;\r\n height: number;\r\n width: number;\r\n}\r\n\r\n/**\r\n * @internal\r\n * @deprecated\r\n */\r\nexport class GLTFBinaryExtension extends GLTFLoaderExtension {\r\n private _bin: IDataBuffer;\r\n\r\n public constructor() {\r\n super(\"KHR_binary_glTF\");\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n public override loadRuntimeAsync(scene: Scene, data: IGLTFLoaderData, rootUrl: string, onSuccess: (gltfRuntime: IGLTFRuntime) => void): boolean {\r\n const extensionsUsed = (<any>data.json).extensionsUsed;\r\n if (!extensionsUsed || extensionsUsed.indexOf(this.name) === -1 || !data.bin) {\r\n return false;\r\n }\r\n\r\n this._bin = data.bin;\r\n onSuccess(GLTFLoaderBase.CreateRuntime(data.json, scene, rootUrl));\r\n return true;\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n public override loadBufferAsync(gltfRuntime: IGLTFRuntime, id: string, onSuccess: (buffer: ArrayBufferView) => void, onError: (message: string) => void): boolean {\r\n if (gltfRuntime.extensionsUsed.indexOf(this.name) === -1) {\r\n return false;\r\n }\r\n\r\n if (id !== BinaryExtensionBufferName) {\r\n return false;\r\n }\r\n\r\n // eslint-disable-next-line github/no-then\r\n this._bin.readAsync(0, this._bin.byteLength).then(onSuccess, (error) => onError(error.message));\r\n return true;\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n public override loadTextureBufferAsync(gltfRuntime: IGLTFRuntime, id: string, onSuccess: (buffer: ArrayBufferView) => void): boolean {\r\n const texture: IGLTFTexture = gltfRuntime.textures[id];\r\n const source: IGLTFImage = gltfRuntime.images[texture.source];\r\n if (!source.extensions || !(this.name in source.extensions)) {\r\n return false;\r\n }\r\n\r\n const sourceExt: IGLTFBinaryExtensionImage = source.extensions[this.name];\r\n const bufferView: IGLTFBufferView = gltfRuntime.bufferViews[sourceExt.bufferView];\r\n const buffer = GLTFUtils.GetBufferFromBufferView(gltfRuntime, bufferView, 0, bufferView.byteLength, EComponentType.UNSIGNED_BYTE);\r\n onSuccess(buffer);\r\n return true;\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n public override loadShaderStringAsync(gltfRuntime: IGLTFRuntime, id: string, onSuccess: (shaderString: string) => void): boolean {\r\n const shader: IGLTFShader = gltfRuntime.shaders[id];\r\n if (!shader.extensions || !(this.name in shader.extensions)) {\r\n return false;\r\n }\r\n\r\n const binaryExtensionShader: IGLTFBinaryExtensionShader = shader.extensions[this.name];\r\n const bufferView: IGLTFBufferView = gltfRuntime.bufferViews[binaryExtensionShader.bufferView];\r\n const shaderBytes = GLTFUtils.GetBufferFromBufferView(gltfRuntime, bufferView, 0, bufferView.byteLength, EComponentType.UNSIGNED_BYTE);\r\n\r\n setTimeout(() => {\r\n const shaderString = GLTFUtils.DecodeBufferToText(shaderBytes);\r\n onSuccess(shaderString);\r\n });\r\n\r\n return true;\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(new GLTFBinaryExtension());\r\n","import { GLTFLoaderExtension, GLTFLoaderBase, GLTFLoader } from \"./glTFLoader\";\r\n\r\nimport { type IGLTFRuntime, type IGLTFMaterial } from \"./glTFLoaderInterfaces\";\r\n\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { Material } from \"core/Materials/material\";\r\nimport { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { HemisphericLight } from \"core/Lights/hemisphericLight\";\r\nimport { DirectionalLight } from \"core/Lights/directionalLight\";\r\nimport { PointLight } from \"core/Lights/pointLight\";\r\nimport { SpotLight } from \"core/Lights/spotLight\";\r\n\r\ninterface IGLTFMaterialsCommonExtensionValues {\r\n ambient?: number[] | string;\r\n diffuse?: number[] | string;\r\n emission?: number[] | string;\r\n specular?: number[] | string;\r\n shininess?: number;\r\n transparency?: number;\r\n}\r\n\r\ninterface IGLTFMaterialsCommonExtension {\r\n technique: string;\r\n transparent?: number;\r\n doubleSided?: boolean;\r\n values: IGLTFMaterialsCommonExtensionValues;\r\n}\r\n\r\ninterface IGLTFRuntimeCommonExtension {\r\n lights: { [key: string]: IGLTFLightCommonExtension };\r\n}\r\n\r\ninterface IGLTFLightCommonExtension {\r\n name: string;\r\n type: string;\r\n\r\n ambient?: IGLTFAmbientLightCommonExtension;\r\n point?: IGLTFPointLightCommonExtension;\r\n directional?: IGLTFDirectionalLightCommonExtension;\r\n spot?: IGLTFSpotLightCommonExtension;\r\n}\r\n\r\ninterface IGLTFPointLightCommonExtension {\r\n color: number[];\r\n constantAttenuation: number;\r\n linearAttenuation: number;\r\n quadraticAttenuation: number;\r\n}\r\n\r\ninterface IGLTFAmbientLightCommonExtension {\r\n color: number[];\r\n}\r\n\r\ninterface IGLTFDirectionalLightCommonExtension {\r\n color: number[];\r\n}\r\n\r\ninterface IGLTFSpotLightCommonExtension {\r\n color: number[];\r\n constantAttenuation: number;\r\n fallOffAngle: number;\r\n fallOffExponent: number;\r\n linearAttenuation: number;\r\n quadraticAttenuation: number;\r\n}\r\n\r\n/**\r\n * @internal\r\n * @deprecated\r\n */\r\nexport class GLTFMaterialsCommonExtension extends GLTFLoaderExtension {\r\n constructor() {\r\n super(\"KHR_materials_common\");\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n public override loadRuntimeExtensionsAsync(gltfRuntime: IGLTFRuntime): boolean {\r\n if (!gltfRuntime.extensions) {\r\n return false;\r\n }\r\n\r\n const extension: IGLTFRuntimeCommonExtension = gltfRuntime.extensions[this.name];\r\n if (!extension) {\r\n return false;\r\n }\r\n\r\n // Create lights\r\n const lights = extension.lights;\r\n if (lights) {\r\n for (const thing in lights) {\r\n const light: IGLTFLightCommonExtension = lights[thing];\r\n\r\n switch (light.type) {\r\n case \"ambient\": {\r\n const ambientLight = new HemisphericLight(light.name, new Vector3(0, 1, 0), gltfRuntime.scene);\r\n const ambient = light.ambient;\r\n if (ambient) {\r\n ambientLight.diffuse = Color3.FromArray(ambient.color || [1, 1, 1]);\r\n }\r\n break;\r\n }\r\n case \"point\": {\r\n const pointLight = new PointLight(light.name, new Vector3(10, 10, 10), gltfRuntime.scene);\r\n const point = light.point;\r\n if (point) {\r\n pointLight.diffuse = Color3.FromArray(point.color || [1, 1, 1]);\r\n }\r\n break;\r\n }\r\n case \"directional\": {\r\n const dirLight = new DirectionalLight(light.name, new Vector3(0, -1, 0), gltfRuntime.scene);\r\n const directional = light.directional;\r\n if (directional) {\r\n dirLight.diffuse = Color3.FromArray(directional.color || [1, 1, 1]);\r\n }\r\n break;\r\n }\r\n case \"spot\": {\r\n const spot = light.spot;\r\n if (spot) {\r\n const spotLight = new SpotLight(\r\n light.name,\r\n new Vector3(0, 10, 0),\r\n new Vector3(0, -1, 0),\r\n spot.fallOffAngle || Math.PI,\r\n spot.fallOffExponent || 0.0,\r\n gltfRuntime.scene\r\n );\r\n spotLight.diffuse = Color3.FromArray(spot.color || [1, 1, 1]);\r\n }\r\n break;\r\n }\r\n default:\r\n Tools.Warn('GLTF Material Common extension: light type \"' + light.type + \"” not supported\");\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n public override loadMaterialAsync(gltfRuntime: IGLTFRuntime, id: string, onSuccess: (material: Material) => void, onError: (message: string) => void): boolean {\r\n const material: IGLTFMaterial = gltfRuntime.materials[id];\r\n if (!material || !material.extensions) {\r\n return false;\r\n }\r\n\r\n const extension: IGLTFMaterialsCommonExtension = material.extensions[this.name];\r\n if (!extension) {\r\n return false;\r\n }\r\n\r\n const standardMaterial = new StandardMaterial(id, gltfRuntime.scene);\r\n standardMaterial.sideOrientation = Material.CounterClockWiseSideOrientation;\r\n\r\n if (extension.technique === \"CONSTANT\") {\r\n standardMaterial.disableLighting = true;\r\n }\r\n\r\n standardMaterial.backFaceCulling = extension.doubleSided === undefined ? false : !extension.doubleSided;\r\n standardMaterial.alpha = extension.values.transparency === undefined ? 1.0 : extension.values.transparency;\r\n standardMaterial.specularPower = extension.values.shininess === undefined ? 0.0 : extension.values.shininess;\r\n\r\n // Ambient\r\n if (typeof extension.values.ambient === \"string\") {\r\n this._loadTexture(gltfRuntime, extension.values.ambient, standardMaterial, \"ambientTexture\", onError);\r\n } else {\r\n standardMaterial.ambientColor = Color3.FromArray(extension.values.ambient || [0, 0, 0]);\r\n }\r\n\r\n // Diffuse\r\n if (typeof extension.values.diffuse === \"string\") {\r\n this._loadTexture(gltfRuntime, extension.values.diffuse, standardMaterial, \"diffuseTexture\", onError);\r\n } else {\r\n standardMaterial.diffuseColor = Color3.FromArray(extension.values.diffuse || [0, 0, 0]);\r\n }\r\n\r\n // Emission\r\n if (typeof extension.values.emission === \"string\") {\r\n this._loadTexture(gltfRuntime, extension.values.emission, standardMaterial, \"emissiveTexture\", onError);\r\n } else {\r\n standardMaterial.emissiveColor = Color3.FromArray(extension.values.emission || [0, 0, 0]);\r\n }\r\n\r\n // Specular\r\n if (typeof extension.values.specular === \"string\") {\r\n this._loadTexture(gltfRuntime, extension.values.specular, standardMaterial, \"specularTexture\", onError);\r\n } else {\r\n standardMaterial.specularColor = Color3.FromArray(extension.values.specular || [0, 0, 0]);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _loadTexture(gltfRuntime: IGLTFRuntime, id: string, material: StandardMaterial, propertyPath: string, onError: (message: string) => void): void {\r\n // Create buffer from texture url\r\n GLTFLoaderBase.LoadTextureBufferAsync(\r\n gltfRuntime,\r\n id,\r\n (buffer) => {\r\n // Create texture from buffer\r\n GLTFLoaderBase.CreateTextureAsync(gltfRuntime, id, buffer, (texture) => ((<any>material)[propertyPath] = texture));\r\n },\r\n onError\r\n );\r\n }\r\n}\r\n\r\nGLTFLoader.RegisterExtension(new GLTFMaterialsCommonExtension());\r\n","/* eslint-disable @typescript-eslint/no-restricted-imports */\r\nimport * as GLTF1 from \"loaders/glTF/1.0/index\";\r\n\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.GLTF1 = (<any>GlobalObject).BABYLON.GLTF1 || {};\r\n for (const key in GLTF1) {\r\n (<any>GlobalObject).BABYLON.GLTF1[key] = (<any>GLTF1)[key];\r\n }\r\n}\r\n\r\nexport { GLTF1 };\r\n","import { type IObjectInfo, type IPathToObjectConverter } from \"core/ObjectModel/objectModelInterfaces\";\r\nimport { type IGLTF } from \"../glTFLoaderInterfaces\";\r\nimport { type IObjectAccessor } from \"core/FlowGraph/typeDefinitions\";\r\n\r\n/**\r\n * Adding an exception here will break traversing through the glTF object tree.\r\n * This is used for properties that might not be in the glTF object model, but are optional and have a default value.\r\n * For example, the path /nodes/\\{\\}/extensions/KHR_node_visibility/visible is optional - the object can be deferred without the object fully existing.\r\n */\r\nexport const OptionalPathExceptionsList: {\r\n regex: RegExp;\r\n}[] = [\r\n {\r\n // get the node as object when reading an extension\r\n regex: new RegExp(`^/nodes/\\\\d+/extensions/`),\r\n },\r\n];\r\n\r\n/**\r\n * A converter that takes a glTF Object Model JSON Pointer\r\n * and transforms it into an ObjectAccessorContainer, allowing\r\n * objects referenced in the glTF to be associated with their\r\n * respective Babylon.js objects.\r\n */\r\nexport class GLTFPathToObjectConverter<T, BabylonType, BabylonValue> implements IPathToObjectConverter<IObjectAccessor<T, BabylonType, BabylonValue>> {\r\n public constructor(\r\n private _gltf: IGLTF,\r\n private _infoTree: any\r\n ) {}\r\n\r\n /**\r\n * The pointer string is represented by a [JSON pointer](https://datatracker.ietf.org/doc/html/rfc6901).\r\n * See also https://github.com/KhronosGroup/glTF/blob/main/specification/2.0/ObjectModel.adoc#core-pointers\r\n * <animationPointer> := /<rootNode>/<assetIndex>/<propertyPath>\r\n * <rootNode> := \"nodes\" | \"materials\" | \"meshes\" | \"cameras\" | \"extensions\"\r\n * <assetIndex> := <digit> | <name>\r\n * <propertyPath> := <extensionPath> | <standardPath>\r\n * <extensionPath> := \"extensions\"/<name>/<standardPath>\r\n * <standardPath> := <name> | <name>/<standardPath>\r\n * <name> := W+\r\n * <digit> := D+\r\n *\r\n * Examples:\r\n * - \"/nodes/0/rotation\"\r\n * - \"/nodes.length\"\r\n * - \"/materials/2/emissiveFactor\"\r\n * - \"/materials/2/pbrMetallicRoughness/baseColorFactor\"\r\n * - \"/materials/2/extensions/KHR_materials_emissive_strength/emissiveStrength\"\r\n *\r\n * @param path The path to convert\r\n * @returns The object and info associated with the path\r\n */\r\n public convert(path: string): IObjectInfo<IObjectAccessor<T, BabylonType, BabylonValue>> {\r\n let objectTree: any = this._gltf;\r\n let infoTree: any = this._infoTree;\r\n let target: any = undefined;\r\n\r\n if (!path.startsWith(\"/\")) {\r\n throw new Error(\"Path must start with a /\");\r\n }\r\n const parts = path.split(\"/\");\r\n parts.shift();\r\n\r\n //if the last part has \".length\" in it, separate that as an extra part\r\n if (parts[parts.length - 1].includes(\".length\")) {\r\n const lastPart = parts[parts.length - 1];\r\n const split = lastPart.split(\".\");\r\n parts.pop();\r\n parts.push(...split);\r\n }\r\n\r\n let ignoreObjectTree = false;\r\n\r\n for (const part of parts) {\r\n const isLength = part === \"length\";\r\n if (isLength && !infoTree.__array__) {\r\n throw new Error(`Path ${path} is invalid`);\r\n }\r\n if (infoTree.__ignoreObjectTree__) {\r\n ignoreObjectTree = true;\r\n }\r\n if (infoTree.__array__ && !isLength) {\r\n infoTree = infoTree.__array__;\r\n } else {\r\n infoTree = infoTree[part];\r\n if (!infoTree) {\r\n throw new Error(`Path ${path} is invalid`);\r\n }\r\n }\r\n if (!ignoreObjectTree) {\r\n if (objectTree === undefined) {\r\n // check if the path is in the exception list. If it is, break and return the last object that was found\r\n const exception = OptionalPathExceptionsList.find((e) => e.regex.test(path));\r\n if (!exception) {\r\n throw new Error(`Path ${path} is invalid`);\r\n }\r\n } else if (!isLength) {\r\n objectTree = objectTree?.[part];\r\n }\r\n }\r\n\r\n if (infoTree.__target__ || isLength) {\r\n target = objectTree;\r\n }\r\n }\r\n\r\n return {\r\n object: target,\r\n info: infoTree,\r\n };\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/naming-convention */\n\nimport { type TransformNode } from \"core/Meshes/transformNode\";\nimport {\n type IAnimation,\n type ICamera,\n type IGLTF,\n type IKHRLightsPunctual_Light,\n type IEXTLightsArea_Light,\n type IMaterial,\n type IMesh,\n type INode,\n} from \"../glTFLoaderInterfaces\";\nimport { type Vector3, Matrix, Quaternion, Vector2 } from \"core/Maths/math.vector\";\nimport { Constants } from \"core/Engines/constants\";\nimport { type Color3, Color4 } from \"core/Maths/math.color\";\nimport { type PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\nimport { type Light } from \"core/Lights/light\";\nimport { type Nullable } from \"core/types\";\nimport { SpotLight } from \"core/Lights/spotLight\";\nimport { type IEXTLightsImageBased_LightImageBased } from \"babylonjs-gltf2interface\";\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\nimport { type IInterpolationPropertyInfo, type IObjectAccessor } from \"core/FlowGraph/typeDefinitions\";\nimport { GLTFPathToObjectConverter } from \"./gltfPathToObjectConverter\";\nimport { type AnimationGroup } from \"core/Animations/animationGroup\";\nimport { type Mesh } from \"core/Meshes/mesh\";\nimport { type RectAreaLight } from \"core/Lights/rectAreaLight\";\n\nexport interface IGLTFObjectModelTree {\n cameras: IGLTFObjectModelTreeCamerasObject;\n nodes: IGLTFObjectModelTreeNodesObject;\n materials: IGLTFObjectModelTreeMaterialsObject;\n extensions: IGLTFObjectModelTreeExtensionsObject;\n animations: {\n length: IObjectAccessor<IAnimation[], AnimationGroup[], number>;\n __array__: {};\n };\n meshes: {\n length: IObjectAccessor<IMesh[], (Mesh | undefined)[], number>;\n __array__: {};\n };\n}\n\nexport interface IGLTFObjectModelTreeNodesObject<GLTFTargetType = INode, BabylonTargetType = TransformNode> {\n length: IObjectAccessor<GLTFTargetType[], BabylonTargetType[], number>;\n __array__: {\n __target__: boolean;\n translation: IObjectAccessor<GLTFTargetType, BabylonTargetType, Vector3>;\n rotation: IObjectAccessor<GLTFTargetType, BabylonTargetType, Quaternion>;\n scale: IObjectAccessor<GLTFTargetType, BabylonTargetType, Vector3>;\n matrix: IObjectAccessor<GLTFTargetType, BabylonTargetType, Matrix>;\n globalMatrix: IObjectAccessor<GLTFTargetType, BabylonTargetType, Matrix>;\n weights: {\n length: IObjectAccessor<GLTFTargetType, BabylonTargetType, number>;\n __array__: { __target__: boolean } & IObjectAccessor<GLTFTargetType, BabylonTargetType, number>;\n } & IObjectAccessor<GLTFTargetType, BabylonTargetType, number[]>;\n extensions: {\n EXT_lights_ies?: {\n multiplier: IObjectAccessor<INode, Light, number>;\n color: IObjectAccessor<INode, Light, Color3>;\n };\n KHR_node_visibility?: {\n visible: IObjectAccessor<INode, Mesh, boolean>;\n };\n };\n };\n}\n\nexport interface IGLTFObjectModelTreeCamerasObject {\n __array__: {\n __target__: boolean;\n orthographic: {\n xmag: IObjectAccessor<ICamera, ICamera, Vector2>;\n ymag: IObjectAccessor<ICamera, ICamera, Vector2>;\n zfar: IObjectAccessor<ICamera, ICamera, number>;\n znear: IObjectAccessor<ICamera, ICamera, number>;\n };\n perspective: {\n yfov: IObjectAccessor<ICamera, ICamera, number>;\n zfar: IObjectAccessor<ICamera, ICamera, number>;\n znear: IObjectAccessor<ICamera, ICamera, number>;\n aspectRatio: IObjectAccessor<ICamera, ICamera, Nullable<number>>;\n };\n };\n}\n\nexport interface IGLTFObjectModelTreeMaterialsObject {\n __array__: {\n __target__: boolean;\n pbrMetallicRoughness: {\n baseColorFactor: IObjectAccessor<IMaterial, PBRMaterial, Color4>;\n metallicFactor: IObjectAccessor<IMaterial, PBRMaterial, Nullable<number>>;\n roughnessFactor: IObjectAccessor<IMaterial, PBRMaterial, Nullable<number>>;\n baseColorTexture: {\n extensions: {\n KHR_texture_transform: ITextureDefinition;\n };\n };\n metallicRoughnessTexture: {\n extensions: {\n KHR_texture_transform: ITextureDefinition;\n };\n };\n };\n emissiveFactor: IObjectAccessor<IMaterial, PBRMaterial, Color3>;\n normalTexture: {\n scale: IObjectAccessor<IMaterial, PBRMaterial, number>;\n extensions: {\n KHR_texture_transform: ITextureDefinition;\n };\n };\n occlusionTexture: {\n strength: IObjectAccessor<IMaterial, PBRMaterial, number>;\n extensions: {\n KHR_texture_transform: ITextureDefinition;\n };\n };\n emissiveTexture: {\n extensions: {\n KHR_texture_transform: ITextureDefinition;\n };\n };\n extensions: {\n KHR_materials_anisotropy: {\n anisotropyStrength: IObjectAccessor<IMaterial, PBRMaterial, number>;\n anisotropyRotation: IObjectAccessor<IMaterial, PBRMaterial, number>;\n anisotropyTexture: {\n extensions: {\n KHR_texture_transform: ITextureDefinition;\n };\n };\n };\n KHR_materials_clearcoat: {\n clearcoatFactor: IObjectAccessor<IMaterial, PBRMaterial, number>;\n clearcoatRoughnessFactor: IObjectAccessor<IMaterial, PBRMaterial, number>;\n clearcoatTexture: {\n extensions: {\n KHR_texture_transform: ITextureDefinition;\n };\n };\n clearcoatNormalTexture: {\n scale: IObjectAccessor<IMaterial, PBRMaterial, number>;\n extensions: {\n KHR_texture_transform: ITextureDefinition;\n };\n };\n clearcoatRoughnessTexture: {\n extensions: {\n KHR_texture_transform: ITextureDefinition;\n };\n };\n };\n KHR_materials_dispersion: {\n dispersion: IObjectAccessor<IMaterial, PBRMaterial, number>;\n };\n KHR_materials_emissive_strength: {\n emissiveStrength: IObjectAccessor<IMaterial, PBRMaterial, number>;\n };\n KHR_materials_ior: {\n ior: IObjectAccessor<IMaterial, PBRMaterial, number>;\n };\n KHR_materials_iridescence: {\n iridescenceFactor: IObjectAccessor<IMaterial, PBRMaterial, number>;\n iridescenceIor: IObjectAccessor<IMaterial, PBRMaterial, number>;\n iridescenceThicknessMinimum: IObjectAccessor<IMaterial, PBRMaterial, number>;\n iridescenceThicknessMaximum: IObjectAccessor<IMaterial, PBRMaterial, number>;\n iridescenceTexture: {\n extensions: {\n KHR_texture_transform: ITextureDefinition;\n };\n };\n iridescenceThicknessTexture: {\n extensions: {\n KHR_texture_transform: ITextureDefinition;\n };\n };\n };\n KHR_materials_sheen: {\n sheenColorFactor: IObjectAccessor<IMaterial, PBRMaterial, Color3>;\n sheenRoughnessFactor: IObjectAccessor<IMaterial, PBRMaterial, number>;\n sheenColorTexture: {\n extensions: {\n KHR_texture_transform: ITextureDefinition;\n };\n };\n sheenRoughnessTexture: {\n extensions: {\n KHR_texture_transform: ITextureDefinition;\n };\n };\n };\n KHR_materials_specular: {\n specularFactor: IObjectAccessor<IMaterial, PBRMaterial, number>;\n specularColorFactor: IObjectAccessor<IMaterial, PBRMaterial, Color3>;\n specularTexture: {\n extensions: {\n KHR_texture_transform: ITextureDefinition;\n };\n };\n specularColorTexture: {\n extensions: {\n KHR_texture_transform: ITextureDefinition;\n };\n };\n };\n KHR_materials_transmission: {\n transmissionFactor: IObjectAccessor<IMaterial, PBRMaterial, number>;\n transmissionTexture: {\n extensions: {\n KHR_texture_transform: ITextureDefinition;\n };\n };\n };\n KHR_materials_diffuse_transmission: {\n diffuseTransmissionFactor: IObjectAccessor<IMaterial, PBRMaterial, number>;\n diffuseTransmissionTexture: {\n extensions: {\n KHR_texture_transform: ITextureDefinition;\n };\n };\n diffuseTransmissionColorFactor: IObjectAccessor<IMaterial, PBRMaterial, Nullable<Color3>>;\n diffuseTransmissionColorTexture: {\n extensions: {\n KHR_texture_transform: ITextureDefinition;\n };\n };\n };\n KHR_materials_volume: {\n thicknessFactor: IObjectAccessor<IMaterial, PBRMaterial, number>;\n attenuationColor: IObjectAccessor<IMaterial, PBRMaterial, Color3>;\n attenuationDistance: IObjectAccessor<IMaterial, PBRMaterial, number>;\n thicknessTexture: {\n extensions: {\n KHR_texture_transform: ITextureDefinition;\n };\n };\n };\n };\n };\n}\n\ninterface ITextureDefinition {\n offset: IObjectAccessor<IMaterial, PBRMaterial, Vector2>;\n rotation: IObjectAccessor<IMaterial, PBRMaterial, number>;\n scale: IObjectAccessor<IMaterial, PBRMaterial, Vector2>;\n}\n\nexport interface IGLTFObjectModelTreeMeshesObject {}\n\nexport interface IGLTFObjectModelTreeExtensionsObject {\n KHR_lights_punctual: {\n lights: {\n length: IObjectAccessor<IKHRLightsPunctual_Light[], Light[], number>;\n __array__: {\n __target__: boolean;\n color: IObjectAccessor<IKHRLightsPunctual_Light, Light, Color3>;\n intensity: IObjectAccessor<IKHRLightsPunctual_Light, Light, number>;\n range: IObjectAccessor<IKHRLightsPunctual_Light, Light, number>;\n spot: {\n innerConeAngle: IObjectAccessor<IKHRLightsPunctual_Light, Light, number>;\n outerConeAngle: IObjectAccessor<IKHRLightsPunctual_Light, Light, number>;\n };\n };\n };\n };\n EXT_lights_area: {\n lights: {\n length: IObjectAccessor<IEXTLightsArea_Light[], Light[], number>;\n __array__: {\n __target__: boolean;\n color: IObjectAccessor<IEXTLightsArea_Light, Light, Color3>;\n intensity: IObjectAccessor<IEXTLightsArea_Light, Light, number>;\n size: IObjectAccessor<IEXTLightsArea_Light, Light, number>;\n rect: {\n aspect: IObjectAccessor<IEXTLightsArea_Light, Light, number>;\n };\n };\n };\n };\n EXT_lights_ies: {\n lights: {\n length: IObjectAccessor<IKHRLightsPunctual_Light[], Light[], number>;\n };\n };\n EXT_lights_image_based: {\n lights: {\n __array__: {\n __target__: boolean;\n intensity: IObjectAccessor<IEXTLightsImageBased_LightImageBased, BaseTexture, number>;\n rotation: IObjectAccessor<IEXTLightsImageBased_LightImageBased, BaseTexture, Quaternion>;\n };\n length: IObjectAccessor<IEXTLightsImageBased_LightImageBased[], BaseTexture[], number>;\n };\n };\n}\n\nconst nodesTree: IGLTFObjectModelTreeNodesObject = {\n length: {\n type: \"number\",\n get: (nodes: INode[]) => nodes.length,\n getTarget: (nodes: INode[]) => nodes.map((node) => node._babylonTransformNode!),\n getPropertyName: [() => \"length\"],\n },\n __array__: {\n __target__: true,\n translation: {\n type: \"Vector3\",\n get: (node: INode) => node._babylonTransformNode?.position,\n set: (value: Vector3, node: INode) => node._babylonTransformNode?.position.copyFrom(value),\n getTarget: (node: INode) => node._babylonTransformNode,\n getPropertyName: [() => \"position\"],\n },\n rotation: {\n type: \"Quaternion\",\n get: (node: INode) => node._babylonTransformNode?.rotationQuaternion!,\n set: (value: Quaternion, node: INode) => node._babylonTransformNode?.rotationQuaternion?.copyFrom(value),\n getTarget: (node: INode) => node._babylonTransformNode,\n getPropertyName: [() => \"rotationQuaternion\"],\n },\n scale: {\n type: \"Vector3\",\n get: (node: INode) => node._babylonTransformNode?.scaling,\n set: (value: Vector3, node: INode) => node._babylonTransformNode?.scaling.copyFrom(value),\n getTarget: (node: INode) => node._babylonTransformNode,\n getPropertyName: [() => \"scaling\"],\n },\n weights: {\n length: {\n type: \"number\",\n get: (node: INode) => node._numMorphTargets,\n getTarget: (node: INode) => node._babylonTransformNode,\n getPropertyName: [() => \"influence\"],\n },\n __array__: {\n __target__: true,\n type: \"number\",\n get: (node: INode, index?: number) => (index !== undefined ? node._primitiveBabylonMeshes?.[0].morphTargetManager?.getTarget(index).influence : undefined),\n // set: (value: number, node: INode, index?: number) => node._babylonTransformNode?.getMorphTargetManager()?.getTarget(index)?.setInfluence(value),\n getTarget: (node: INode) => node._babylonTransformNode,\n getPropertyName: [() => \"influence\"],\n },\n type: \"number[]\",\n get: (node: INode, index?: number) => [0], // TODO: get the weights correctly\n // set: (value: number, node: INode, index?: number) => node._babylonTransformNode?.getMorphTargetManager()?.getTarget(index)?.setInfluence(value),\n getTarget: (node: INode) => node._babylonTransformNode,\n getPropertyName: [() => \"influence\"],\n },\n // readonly!\n matrix: {\n type: \"Matrix\",\n get: (node: INode) => Matrix.Compose(node._babylonTransformNode?.scaling!, node._babylonTransformNode?.rotationQuaternion!, node._babylonTransformNode?.position!),\n getTarget: (node: INode) => node._babylonTransformNode,\n isReadOnly: true,\n },\n globalMatrix: {\n type: \"Matrix\",\n get: (node: INode) => {\n const matrix = Matrix.Identity();\n // RHS/LHS support\n let rootNode = node.parent;\n while (rootNode && rootNode.parent) {\n rootNode = rootNode.parent;\n }\n const forceUpdate =\n node._babylonTransformNode?.position._isDirty || node._babylonTransformNode?.rotationQuaternion?._isDirty || node._babylonTransformNode?.scaling._isDirty;\n if (rootNode) {\n // take the parent root node's world matrix, invert it, and multiply it with the current node's world matrix\n // This will provide the global matrix, ignoring the RHS->LHS conversion\n const rootMatrix = rootNode._babylonTransformNode?.computeWorldMatrix(true).invert();\n if (rootMatrix) {\n node._babylonTransformNode?.computeWorldMatrix(forceUpdate)?.multiplyToRef(rootMatrix, matrix);\n }\n } else if (node._babylonTransformNode) {\n matrix.copyFrom(node._babylonTransformNode.computeWorldMatrix(forceUpdate));\n }\n return matrix;\n },\n getTarget: (node: INode) => node._babylonTransformNode,\n isReadOnly: true,\n },\n extensions: {\n EXT_lights_ies: {\n multiplier: {\n type: \"number\",\n get: (node: INode) => {\n return node._babylonTransformNode?.getChildren((child) => child instanceof SpotLight, true)[0]?.intensity;\n },\n getTarget: (node: INode) => node._babylonTransformNode?.getChildren((child) => child instanceof SpotLight, true)[0],\n set: (value, node) => {\n if (node._babylonTransformNode) {\n const light = node._babylonTransformNode.getChildren((child) => child instanceof SpotLight, true)[0];\n if (light) {\n light.intensity = value;\n }\n }\n },\n },\n color: {\n type: \"Color3\",\n get: (node: INode) => {\n return node._babylonTransformNode?.getChildren((child) => child instanceof SpotLight, true)[0]?.diffuse;\n },\n getTarget: (node: INode) => node._babylonTransformNode?.getChildren((child) => child instanceof SpotLight, true)[0],\n set: (value, node: INode) => {\n if (node._babylonTransformNode) {\n const light = node._babylonTransformNode.getChildren((child) => child instanceof SpotLight, true)[0];\n if (light) {\n light.diffuse = value;\n }\n }\n },\n },\n },\n KHR_node_visibility: {\n visible: {\n type: \"boolean\",\n get: (node: INode) => {\n return node._primitiveBabylonMeshes ? node._primitiveBabylonMeshes[0].isVisible : false;\n },\n getTarget: () => undefined, // TODO: what should this return?\n set: (value: boolean, node: INode) => {\n if (node._primitiveBabylonMeshes) {\n node._primitiveBabylonMeshes.forEach((mesh) => (mesh.isVisible = value));\n }\n },\n },\n },\n },\n },\n};\n\nconst animationsTree = {\n length: {\n type: \"number\",\n get: (animations: IAnimation[]) => animations.length,\n getTarget: (animations: IAnimation[]) => animations.map((animation) => animation._babylonAnimationGroup!),\n getPropertyName: [() => \"length\"],\n },\n __array__: {},\n};\n\nconst meshesTree = {\n length: {\n type: \"number\",\n get: (meshes: IMesh[]) => meshes.length,\n getTarget: (meshes: IMesh[]) => meshes.map((mesh) => mesh.primitives[0]._instanceData?.babylonSourceMesh),\n getPropertyName: [() => \"length\"],\n },\n __array__: {},\n};\n\nconst camerasTree: IGLTFObjectModelTreeCamerasObject = {\n __array__: {\n __target__: true,\n orthographic: {\n xmag: {\n componentsCount: 2,\n type: \"Vector2\",\n get: (camera) => new Vector2(camera._babylonCamera?.orthoLeft ?? 0, camera._babylonCamera?.orthoRight ?? 0),\n set: (value, camera) => {\n if (camera._babylonCamera) {\n camera._babylonCamera.orthoLeft = value.x;\n camera._babylonCamera.orthoRight = value.y;\n }\n },\n getTarget: (camera) => camera,\n getPropertyName: [() => \"orthoLeft\", () => \"orthoRight\"],\n },\n ymag: {\n componentsCount: 2,\n type: \"Vector2\",\n get: (camera: ICamera) => new Vector2(camera._babylonCamera?.orthoBottom ?? 0, camera._babylonCamera?.orthoTop ?? 0),\n set: (value: Vector2, camera: ICamera) => {\n if (camera._babylonCamera) {\n camera._babylonCamera.orthoBottom = value.x;\n camera._babylonCamera.orthoTop = value.y;\n }\n },\n getTarget: (camera) => camera,\n getPropertyName: [() => \"orthoBottom\", () => \"orthoTop\"],\n },\n zfar: {\n type: \"number\",\n get: (camera: ICamera) => camera._babylonCamera?.maxZ,\n set: (value: number, camera: ICamera) => {\n if (camera._babylonCamera) {\n camera._babylonCamera.maxZ = value;\n }\n },\n getTarget: (camera: ICamera) => camera,\n getPropertyName: [() => \"maxZ\"],\n },\n znear: {\n type: \"number\",\n get: (camera: ICamera) => camera._babylonCamera?.minZ,\n set: (value: number, camera: ICamera) => {\n if (camera._babylonCamera) {\n camera._babylonCamera.minZ = value;\n }\n },\n getTarget: (camera: ICamera) => camera,\n getPropertyName: [() => \"minZ\"],\n },\n },\n perspective: {\n aspectRatio: {\n type: \"number\",\n get: (camera: ICamera) => camera._babylonCamera?.getEngine().getAspectRatio(camera._babylonCamera),\n getTarget: (camera: ICamera) => camera,\n getPropertyName: [() => \"aspectRatio\"],\n isReadOnly: true, // might not be the case for glTF?\n },\n yfov: {\n type: \"number\",\n get: (camera: ICamera) => camera._babylonCamera?.fov,\n set: (value: number, camera: ICamera) => {\n if (camera._babylonCamera) {\n camera._babylonCamera.fov = value;\n }\n },\n getTarget: (camera: ICamera) => camera,\n getPropertyName: [() => \"fov\"],\n },\n zfar: {\n type: \"number\",\n get: (camera: ICamera) => camera._babylonCamera?.maxZ,\n set: (value: number, camera: ICamera) => {\n if (camera._babylonCamera) {\n camera._babylonCamera.maxZ = value;\n }\n },\n getTarget: (camera: ICamera) => camera,\n getPropertyName: [() => \"maxZ\"],\n },\n znear: {\n type: \"number\",\n get: (camera: ICamera) => camera._babylonCamera?.minZ,\n set: (value: number, camera: ICamera) => {\n if (camera._babylonCamera) {\n camera._babylonCamera.minZ = value;\n }\n },\n getTarget: (camera: ICamera) => camera,\n getPropertyName: [() => \"minZ\"],\n },\n },\n },\n};\n\nconst materialsTree: IGLTFObjectModelTreeMaterialsObject = {\n __array__: {\n __target__: true,\n emissiveFactor: {\n type: \"Color3\",\n get: (material, index?, payload?) => GetMaterial(material, index, payload).emissiveColor,\n set: (value: Color3, material, index?, payload?) => GetMaterial(material, index, payload).emissiveColor.copyFrom(value),\n getTarget: (material, index?, payload?) => GetMaterial(material, index, payload),\n getPropertyName: [() => \"emissiveColor\"],\n },\n emissiveTexture: {\n extensions: {\n KHR_texture_transform: GenerateTextureMap(\"emissiveTexture\"),\n },\n },\n normalTexture: {\n scale: {\n type: \"number\",\n get: (material, index?, payload?) => GetTexture(material, payload, \"bumpTexture\")?.level,\n set: (value: number, material, index?, payload?) => {\n const texture = GetTexture(material, payload, \"bumpTexture\");\n if (texture) {\n texture.level = value;\n }\n },\n getTarget: (material, index?, payload?) => GetMaterial(material, index, payload),\n getPropertyName: [() => \"level\"],\n },\n extensions: {\n KHR_texture_transform: GenerateTextureMap(\"bumpTexture\"),\n },\n },\n occlusionTexture: {\n strength: {\n type: \"number\",\n get: (material, index?, payload?) => GetMaterial(material, index, payload).ambientTextureStrength,\n set: (value: number, material, index?, payload?) => {\n const mat = GetMaterial(material, index, payload);\n if (mat) {\n mat.ambientTextureStrength = value;\n }\n },\n getTarget: (material, index?, payload?) => GetMaterial(material, index, payload),\n getPropertyName: [() => \"ambientTextureStrength\"],\n },\n extensions: {\n KHR_texture_transform: GenerateTextureMap(\"ambientTexture\"),\n },\n },\n pbrMetallicRoughness: {\n baseColorFactor: {\n type: \"Color4\",\n get: (material, index?, payload?) => {\n const mat = GetMaterial(material, index, payload);\n return Color4.FromColor3(mat.albedoColor, mat.alpha);\n },\n set: (value: Color4, material, index?, payload?) => {\n const mat = GetMaterial(material, index, payload);\n mat.albedoColor.set(value.r, value.g, value.b);\n mat.alpha = value.a;\n },\n getTarget: (material, index?, payload?) => GetMaterial(material, index, payload),\n // This is correct on the animation level, but incorrect as a single property of a type Color4\n getPropertyName: [() => \"albedoColor\", () => \"alpha\"],\n },\n baseColorTexture: {\n extensions: {\n KHR_texture_transform: GenerateTextureMap(\"albedoTexture\"),\n },\n },\n metallicFactor: {\n type: \"number\",\n get: (material, index?, payload?) => GetMaterial(material, index, payload).metallic,\n set: (value, material, index?, payload?) => {\n const mat = GetMaterial(material, index, payload);\n if (mat) {\n mat.metallic = value;\n }\n },\n getTarget: (material, index?, payload?) => GetMaterial(material, index, payload),\n getPropertyName: [() => \"metallic\"],\n },\n roughnessFactor: {\n type: \"number\",\n get: (material, index?, payload?) => GetMaterial(material, index, payload).roughness,\n set: (value, material, index?, payload?) => {\n const mat = GetMaterial(material, index, payload);\n if (mat) {\n mat.roughness = value;\n }\n },\n getTarget: (material, index?, payload?) => GetMaterial(material, index, payload),\n getPropertyName: [() => \"roughness\"],\n },\n metallicRoughnessTexture: {\n extensions: {\n KHR_texture_transform: GenerateTextureMap(\"metallicTexture\"),\n },\n },\n },\n extensions: {\n KHR_materials_anisotropy: {\n anisotropyStrength: {\n type: \"number\",\n get: (material, index?, payload?) => GetMaterial(material, index, payload).anisotropy.intensity,\n set: (value: number, material, index?, payload?) => {\n GetMaterial(material, index, payload).anisotropy.intensity = value;\n },\n getTarget: (material, index?, payload?) => GetMaterial(material, index, payload),\n getPropertyName: [() => \"anisotropy.intensity\"],\n },\n anisotropyRotation: {\n type: \"number\",\n get: (material, index?, payload?) => GetMaterial(material, index, payload).anisotropy.angle,\n set: (value: number, material, index?, payload?) => {\n GetMaterial(material, index, payload).anisotropy.angle = value;\n },\n getTarget: (material, index?, payload?) => GetMaterial(material, index, payload),\n getPropertyName: [() => \"anisotropy.angle\"],\n },\n anisotropyTexture: {\n extensions: {\n KHR_texture_transform: GenerateTextureMap(\"anisotropy\", \"texture\"),\n },\n },\n },\n KHR_materials_clearcoat: {\n clearcoatFactor: {\n type: \"number\",\n get: (material, index?, payload?) => GetMaterial(material, index, payload).clearCoat.intensity,\n set: (value, material, index?, payload?) => {\n GetMaterial(material, index, payload).clearCoat.intensity = value;\n },\n getTarget: (material, index?, payload?) => GetMaterial(material, index, payload),\n getPropertyName: [() => \"clearCoat.intensity\"],\n },\n clearcoatRoughnessFactor: {\n type: \"number\",\n get: (material, index?, payload?) => GetMaterial(material, index, payload).clearCoat.roughness,\n set: (value, material, index?, payload?) => {\n GetMaterial(material, index, payload).clearCoat.roughness = value;\n },\n getTarget: (material, index?, payload?) => GetMaterial(material, index, payload),\n getPropertyName: [() => \"clearCoat.roughness\"],\n },\n clearcoatTexture: {\n extensions: {\n KHR_texture_transform: GenerateTextureMap(\"clearCoat\", \"texture\"),\n },\n },\n clearcoatNormalTexture: {\n scale: {\n type: \"number\",\n get: (material, index, payload) => GetMaterial(material, index, payload).clearCoat.bumpTexture?.level,\n getTarget: GetMaterial,\n set: (value, material, index, payload) => (GetMaterial(material, index, payload).clearCoat.bumpTexture!.level = value),\n },\n extensions: {\n KHR_texture_transform: GenerateTextureMap(\"clearCoat\", \"bumpTexture\"),\n },\n },\n clearcoatRoughnessTexture: {\n extensions: {\n KHR_texture_transform: GenerateTextureMap(\"clearCoat\", \"textureRoughness\"),\n },\n },\n },\n KHR_materials_dispersion: {\n dispersion: {\n type: \"number\",\n get: (material, index, payload) => GetMaterial(material, index, payload).subSurface.dispersion,\n getTarget: GetMaterial,\n set: (value, material, index, payload) => (GetMaterial(material, index, payload).subSurface.dispersion = value),\n },\n },\n KHR_materials_emissive_strength: {\n emissiveStrength: {\n type: \"number\",\n get: (material, index, payload) => GetMaterial(material, index, payload).emissiveIntensity,\n getTarget: GetMaterial,\n set: (value, material, index, payload) => (GetMaterial(material, index, payload).emissiveIntensity = value),\n },\n },\n KHR_materials_ior: {\n ior: {\n type: \"number\",\n get: (material, index, payload) => GetMaterial(material, index, payload).indexOfRefraction,\n getTarget: GetMaterial,\n set: (value, material, index, payload) => (GetMaterial(material, index, payload).indexOfRefraction = value),\n },\n },\n KHR_materials_iridescence: {\n iridescenceFactor: {\n type: \"number\",\n get: (material, index, payload) => GetMaterial(material, index, payload).iridescence.intensity,\n getTarget: GetMaterial,\n set: (value, material, index, payload) => (GetMaterial(material, index, payload).iridescence.intensity = value),\n },\n iridescenceIor: {\n type: \"number\",\n get: (material, index, payload) => GetMaterial(material, index, payload).iridescence.indexOfRefraction,\n getTarget: GetMaterial,\n set: (value, material, index, payload) => (GetMaterial(material, index, payload).iridescence.indexOfRefraction = value),\n },\n iridescenceTexture: {\n extensions: {\n KHR_texture_transform: GenerateTextureMap(\"iridescence\", \"texture\"),\n },\n },\n iridescenceThicknessMaximum: {\n type: \"number\",\n get: (material, index, payload) => GetMaterial(material, index, payload).iridescence.maximumThickness,\n getTarget: GetMaterial,\n set: (value, material, index, payload) => (GetMaterial(material, index, payload).iridescence.maximumThickness = value),\n },\n iridescenceThicknessMinimum: {\n type: \"number\",\n get: (material, index, payload) => GetMaterial(material, index, payload).iridescence.minimumThickness,\n getTarget: GetMaterial,\n set: (value, material, index, payload) => (GetMaterial(material, index, payload).iridescence.minimumThickness = value),\n },\n iridescenceThicknessTexture: {\n extensions: {\n KHR_texture_transform: GenerateTextureMap(\"iridescence\", \"thicknessTexture\"),\n },\n },\n },\n KHR_materials_sheen: {\n sheenColorFactor: {\n type: \"Color3\",\n get: (material, index, payload) => GetMaterial(material, index, payload).sheen.color,\n getTarget: GetMaterial,\n set: (value, material, index, payload) => GetMaterial(material, index, payload).sheen.color.copyFrom(value),\n },\n sheenColorTexture: {\n extensions: {\n KHR_texture_transform: GenerateTextureMap(\"sheen\", \"texture\"),\n },\n },\n sheenRoughnessFactor: {\n type: \"number\",\n get: (material, index, payload) => GetMaterial(material, index, payload).sheen.intensity,\n getTarget: GetMaterial,\n set: (value, material, index, payload) => (GetMaterial(material, index, payload).sheen.intensity = value),\n },\n sheenRoughnessTexture: {\n extensions: {\n KHR_texture_transform: GenerateTextureMap(\"sheen\", \"thicknessTexture\"),\n },\n },\n },\n KHR_materials_specular: {\n specularFactor: {\n type: \"number\",\n get: (material, index, payload) => GetMaterial(material, index, payload).metallicF0Factor,\n getTarget: GetMaterial,\n set: (value, material, index, payload) => (GetMaterial(material, index, payload).metallicF0Factor = value),\n getPropertyName: [() => \"metallicF0Factor\"],\n },\n specularColorFactor: {\n type: \"Color3\",\n get: (material, index, payload) => GetMaterial(material, index, payload).metallicReflectanceColor,\n getTarget: GetMaterial,\n set: (value, material, index, payload) => GetMaterial(material, index, payload).metallicReflectanceColor.copyFrom(value),\n getPropertyName: [() => \"metallicReflectanceColor\"],\n },\n specularTexture: {\n extensions: {\n KHR_texture_transform: GenerateTextureMap(\"metallicReflectanceTexture\"),\n },\n },\n specularColorTexture: {\n extensions: {\n KHR_texture_transform: GenerateTextureMap(\"reflectanceTexture\"),\n },\n },\n },\n KHR_materials_transmission: {\n transmissionFactor: {\n type: \"number\",\n get: (material, index, payload) => GetMaterial(material, index, payload).subSurface.refractionIntensity,\n getTarget: GetMaterial,\n set: (value, material, index, payload) => (GetMaterial(material, index, payload).subSurface.refractionIntensity = value),\n getPropertyName: [() => \"subSurface.refractionIntensity\"],\n },\n transmissionTexture: {\n extensions: {\n KHR_texture_transform: GenerateTextureMap(\"subSurface\", \"refractionIntensityTexture\"),\n },\n },\n },\n KHR_materials_diffuse_transmission: {\n diffuseTransmissionFactor: {\n type: \"number\",\n get: (material, index, payload) => GetMaterial(material, index, payload).subSurface.translucencyIntensity,\n getTarget: GetMaterial,\n set: (value, material, index, payload) => (GetMaterial(material, index, payload).subSurface.translucencyIntensity = value),\n },\n diffuseTransmissionTexture: {\n extensions: {\n KHR_texture_transform: GenerateTextureMap(\"subSurface\", \"translucencyIntensityTexture\"),\n },\n },\n diffuseTransmissionColorFactor: {\n type: \"Color3\",\n get: (material, index, payload) => GetMaterial(material, index, payload).subSurface.translucencyColor,\n getTarget: GetMaterial,\n set: (value, material, index, payload) => value && GetMaterial(material, index, payload).subSurface.translucencyColor?.copyFrom(value),\n },\n diffuseTransmissionColorTexture: {\n extensions: {\n KHR_texture_transform: GenerateTextureMap(\"subSurface\", \"translucencyColorTexture\"),\n },\n },\n },\n KHR_materials_volume: {\n attenuationColor: {\n type: \"Color3\",\n get: (material, index, payload) => GetMaterial(material, index, payload).subSurface.tintColor,\n getTarget: GetMaterial,\n set: (value, material, index, payload) => GetMaterial(material, index, payload).subSurface.tintColor.copyFrom(value),\n },\n attenuationDistance: {\n type: \"number\",\n get: (material, index, payload) => GetMaterial(material, index, payload).subSurface.tintColorAtDistance,\n getTarget: GetMaterial,\n set: (value, material, index, payload) => (GetMaterial(material, index, payload).subSurface.tintColorAtDistance = value),\n },\n thicknessFactor: {\n type: \"number\",\n get: (material, index, payload) => GetMaterial(material, index, payload).subSurface.maximumThickness,\n getTarget: GetMaterial,\n set: (value, material, index, payload) => (GetMaterial(material, index, payload).subSurface.maximumThickness = value),\n },\n thicknessTexture: {\n extensions: {\n KHR_texture_transform: GenerateTextureMap(\"subSurface\", \"thicknessTexture\"),\n },\n },\n },\n },\n },\n};\n\nconst extensionsTree: IGLTFObjectModelTreeExtensionsObject = {\n KHR_lights_punctual: {\n lights: {\n length: {\n type: \"number\",\n get: (lights: IKHRLightsPunctual_Light[]) => lights.length,\n getTarget: (lights: IKHRLightsPunctual_Light[]) => lights.map((light) => light._babylonLight!),\n getPropertyName: [(_lights: IKHRLightsPunctual_Light[]) => \"length\"],\n },\n __array__: {\n __target__: true,\n color: {\n type: \"Color3\",\n get: (light: IKHRLightsPunctual_Light) => light._babylonLight?.diffuse,\n set: (value: Color3, light: IKHRLightsPunctual_Light) => light._babylonLight?.diffuse.copyFrom(value),\n getTarget: (light: IKHRLightsPunctual_Light) => light._babylonLight,\n getPropertyName: [(_light: IKHRLightsPunctual_Light) => \"diffuse\"],\n },\n intensity: {\n type: \"number\",\n get: (light: IKHRLightsPunctual_Light) => light._babylonLight?.intensity,\n set: (value: number, light: IKHRLightsPunctual_Light) => (light._babylonLight ? (light._babylonLight.intensity = value) : undefined),\n getTarget: (light: IKHRLightsPunctual_Light) => light._babylonLight,\n getPropertyName: [(_light: IKHRLightsPunctual_Light) => \"intensity\"],\n },\n range: {\n type: \"number\",\n get: (light: IKHRLightsPunctual_Light) => light._babylonLight?.range,\n set: (value: number, light: IKHRLightsPunctual_Light) => (light._babylonLight ? (light._babylonLight.range = value) : undefined),\n getTarget: (light: IKHRLightsPunctual_Light) => light._babylonLight,\n getPropertyName: [(_light: IKHRLightsPunctual_Light) => \"range\"],\n },\n spot: {\n innerConeAngle: {\n type: \"number\",\n get: (light: IKHRLightsPunctual_Light) => (light._babylonLight as SpotLight)?.innerAngle,\n set: (value: number, light: IKHRLightsPunctual_Light) => (light._babylonLight ? ((light._babylonLight as SpotLight).innerAngle = value) : undefined),\n getTarget: (light: IKHRLightsPunctual_Light) => light._babylonLight,\n getPropertyName: [(_light: IKHRLightsPunctual_Light) => \"innerConeAngle\"],\n },\n outerConeAngle: {\n type: \"number\",\n get: (light: IKHRLightsPunctual_Light) => (light._babylonLight as SpotLight)?.angle,\n set: (value: number, light: IKHRLightsPunctual_Light) => (light._babylonLight ? ((light._babylonLight as SpotLight).angle = value) : undefined),\n getTarget: (light: IKHRLightsPunctual_Light) => light._babylonLight,\n getPropertyName: [(_light: IKHRLightsPunctual_Light) => \"outerConeAngle\"],\n },\n },\n },\n },\n },\n EXT_lights_area: {\n lights: {\n length: {\n type: \"number\",\n get: (lights: IEXTLightsArea_Light[]) => lights.length,\n getTarget: (lights: IEXTLightsArea_Light[]) => lights.map((light) => light._babylonLight!),\n getPropertyName: [(_lights: IEXTLightsArea_Light[]) => \"length\"],\n },\n __array__: {\n __target__: true,\n color: {\n type: \"Color3\",\n get: (light: IEXTLightsArea_Light) => light._babylonLight?.diffuse,\n set: (value: Color3, light: IEXTLightsArea_Light) => light._babylonLight?.diffuse.copyFrom(value),\n getTarget: (light: IEXTLightsArea_Light) => light._babylonLight,\n getPropertyName: [(_light: IEXTLightsArea_Light) => \"diffuse\"],\n },\n intensity: {\n type: \"number\",\n get: (light: IEXTLightsArea_Light) => light._babylonLight?.intensity,\n set: (value: number, light: IEXTLightsArea_Light) => (light._babylonLight ? (light._babylonLight.intensity = value) : undefined),\n getTarget: (light: IEXTLightsArea_Light) => light._babylonLight,\n getPropertyName: [(_light: IEXTLightsArea_Light) => \"intensity\"],\n },\n size: {\n type: \"number\",\n get: (light: IEXTLightsArea_Light) => (light._babylonLight as RectAreaLight)?.height,\n set: (value: number, light: IEXTLightsArea_Light) => (light._babylonLight ? ((light._babylonLight as RectAreaLight).height = value) : undefined),\n getTarget: (light: IEXTLightsArea_Light) => light._babylonLight,\n getPropertyName: [(_light: IEXTLightsArea_Light) => \"size\"],\n },\n rect: {\n aspect: {\n type: \"number\",\n get: (light: IEXTLightsArea_Light) => (light._babylonLight as RectAreaLight)?.width / (light._babylonLight as RectAreaLight)?.height,\n set: (value: number, light: IEXTLightsArea_Light) =>\n light._babylonLight ? ((light._babylonLight as RectAreaLight).width = value * (light._babylonLight as RectAreaLight).height) : undefined,\n getTarget: (light: IEXTLightsArea_Light) => light._babylonLight,\n getPropertyName: [(_light: IEXTLightsArea_Light) => \"aspect\"],\n },\n },\n },\n },\n },\n EXT_lights_ies: {\n lights: {\n length: {\n type: \"number\",\n get: (lights: IKHRLightsPunctual_Light[]) => lights.length,\n getTarget: (lights: IKHRLightsPunctual_Light[]) => lights.map((light) => light._babylonLight!),\n getPropertyName: [(_lights: IKHRLightsPunctual_Light[]) => \"length\"],\n },\n },\n },\n EXT_lights_image_based: {\n lights: {\n length: {\n type: \"number\",\n get: (lights) => lights.length,\n getTarget: (lights) => lights.map((light) => light._babylonTexture!),\n getPropertyName: [(_lights) => \"length\"],\n },\n __array__: {\n __target__: true,\n intensity: {\n type: \"number\",\n get: (light) => light._babylonTexture?.level,\n set: (value, light) => {\n if (light._babylonTexture) {\n light._babylonTexture.level = value;\n }\n },\n\n getTarget: (light) => light._babylonTexture,\n },\n rotation: {\n type: \"Quaternion\",\n get: (light) => light._babylonTexture && Quaternion.FromRotationMatrix(light._babylonTexture?.getReflectionTextureMatrix()),\n set: (value, light) => {\n if (!light._babylonTexture) {\n return;\n }\n // Invert the rotation so that positive rotation is counter-clockwise.\n if (!light._babylonTexture.getScene()?.useRightHandedSystem) {\n value = Quaternion.Inverse(value);\n }\n\n Matrix.FromQuaternionToRef(value, light._babylonTexture.getReflectionTextureMatrix());\n },\n getTarget: (light) => light._babylonTexture,\n },\n },\n },\n },\n};\n\nfunction GetTexture(material: IMaterial, payload: any, textureType: keyof PBRMaterial, textureInObject?: string) {\n const babylonMaterial = GetMaterial(material, payload);\n return textureInObject ? babylonMaterial[textureType][textureInObject] : babylonMaterial[textureType];\n}\nfunction GetMaterial(material: IMaterial, _index?: number, payload?: any) {\n return material._data?.[payload?.fillMode ?? Constants.MATERIAL_TriangleFillMode]?.babylonMaterial as PBRMaterial;\n}\nfunction GenerateTextureMap(textureType: keyof PBRMaterial, textureInObject?: string): ITextureDefinition {\n return {\n offset: {\n componentsCount: 2,\n // assuming two independent values for u and v, and NOT a Vector2\n type: \"Vector2\",\n get: (material, _index?, payload?) => {\n const texture = GetTexture(material, payload, textureType, textureInObject);\n return new Vector2(texture?.uOffset, texture?.vOffset);\n },\n getTarget: GetMaterial,\n set: (value, material, _index?, payload?) => {\n const texture = GetTexture(material, payload, textureType, textureInObject);\n ((texture.uOffset = value.x), (texture.vOffset = value.y));\n },\n getPropertyName: [\n () => `${textureType}${textureInObject ? \".\" + textureInObject : \"\"}.uOffset`,\n () => `${textureType}${textureInObject ? \".\" + textureInObject : \"\"}.vOffset`,\n ],\n },\n rotation: {\n type: \"number\",\n get: (material, _index?, payload?) => GetTexture(material, payload, textureType, textureInObject)?.wAng,\n getTarget: GetMaterial,\n set: (value, material, _index?, payload?) => (GetTexture(material, payload, textureType, textureInObject).wAng = value),\n getPropertyName: [() => `${textureType}${textureInObject ? \".\" + textureInObject : \"\"}.wAng`],\n },\n scale: {\n componentsCount: 2,\n type: \"Vector2\",\n get: (material, _index?, payload?) => {\n const texture = GetTexture(material, payload, textureType, textureInObject);\n return new Vector2(texture?.uScale, texture?.vScale);\n },\n getTarget: GetMaterial,\n set: (value, material, index?, payload?) => {\n const texture = GetTexture(material, payload, textureType, textureInObject);\n ((texture.uScale = value.x), (texture.vScale = value.y));\n },\n getPropertyName: [\n () => `${textureType}${textureInObject ? \".\" + textureInObject : \"\"}.uScale`,\n () => `${textureType}${textureInObject ? \".\" + textureInObject : \"\"}.vScale`,\n ],\n },\n };\n}\n\nconst objectModelMapping: IGLTFObjectModelTree = {\n cameras: camerasTree,\n nodes: nodesTree,\n materials: materialsTree,\n extensions: extensionsTree,\n animations: animationsTree,\n meshes: meshesTree,\n};\n\n/**\n * get a path-to-object converter for the given glTF tree\n * @param gltf the glTF tree to use\n * @returns a path-to-object converter for the given glTF tree\n */\nexport function GetPathToObjectConverter(gltf: IGLTF) {\n return new GLTFPathToObjectConverter(gltf, objectModelMapping);\n}\n\n/**\n * This function will return the object accessor for the given key in the object model\n * If the key is not found, it will return undefined\n * @param key the key to get the mapping for, for example /materials/\\{\\}/emissiveFactor\n * @returns an object accessor for the given key, or undefined if the key is not found\n */\nexport function GetMappingForKey(key: string): IObjectAccessor | undefined {\n // replace every `{}` in key with __array__ to match the object model\n const keyParts = key.split(\"/\").map((part) => part.replace(/{}/g, \"__array__\"));\n let current = objectModelMapping as any;\n for (const part of keyParts) {\n // make sure part is not empty\n if (!part) {\n continue;\n }\n current = current[part];\n }\n // validate that current is an object accessor\n if (current && current.type && current.get) {\n return current;\n }\n return undefined;\n}\n\n/**\n * Set interpolation for a specific key in the object model\n * @param key the key to set, for example /materials/\\{\\}/emissiveFactor\n * @param interpolation the interpolation elements array\n */\nexport function SetInterpolationForKey(key: string, interpolation?: IInterpolationPropertyInfo[]): void {\n // replace every `{}` in key with __array__ to match the object model\n const keyParts = key.split(\"/\").map((part) => part.replace(/{}/g, \"__array__\"));\n let current = objectModelMapping as any;\n for (const part of keyParts) {\n // make sure part is not empty\n if (!part) {\n continue;\n }\n current = current[part];\n }\n // validate that the current object is an object accessor\n if (current && current.type && current.get) {\n (current as IObjectAccessor).interpolation = interpolation;\n }\n}\n\n/**\n * This will ad a new object accessor in the object model at the given key.\n * Note that this will NOT change the typescript types. To do that you will need to change the interface itself (extending it in the module that uses it)\n * @param key the key to add the object accessor at. For example /cameras/\\{\\}/perspective/aspectRatio\n * @param accessor the object accessor to add\n */\nexport function AddObjectAccessorToKey<GLTFTargetType = any, BabylonTargetType = any, BabylonValueType = any>(\n key: string,\n accessor: IObjectAccessor<GLTFTargetType, BabylonTargetType, BabylonValueType>\n): void {\n // replace every `{}` in key with __array__ to match the object model\n const keyParts = key.split(\"/\").map((part) => part.replace(/{}/g, \"__array__\"));\n let current = objectModelMapping as any;\n for (const part of keyParts) {\n // make sure part is not empty\n if (!part) {\n continue;\n }\n if (!current[part]) {\n if (part === \"?\") {\n current.__ignoreObjectTree__ = true;\n continue;\n }\n current[part] = {};\n // if the part is __array__ then add the __target__ property\n if (part === \"__array__\") {\n current[part].__target__ = true;\n }\n }\n current = current[part];\n }\n Object.assign(current, accessor);\n}\n","import { type GLTFLoader } from \"./glTFLoader\";\r\nimport { type IGLTFLoaderExtension } from \"./glTFLoaderExtension\";\r\n\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\ninterface IRegisteredGLTFExtension {\r\n isGLTFExtension: boolean;\r\n factory: GLTFExtensionFactory;\r\n}\r\n\r\nexport type GLTFExtensionFactory = (loader: GLTFLoader) => IGLTFLoaderExtension | Promise<IGLTFLoaderExtension>;\r\n\r\nconst RegisteredGLTFExtensions = new Map<string, IRegisteredGLTFExtension>();\r\n\r\n/**\r\n * All currently registered glTF 2.0 loader extensions.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport const registeredGLTFExtensions: ReadonlyMap<string, Readonly<IRegisteredGLTFExtension>> = RegisteredGLTFExtensions;\r\n\r\n/**\r\n * Registers a loader extension.\r\n * @param name The name of the loader extension.\r\n * @param isGLTFExtension If the loader extension is a glTF extension, then it will only be used for glTF files that use the corresponding glTF extension. Otherwise, it will be used for all loaded glTF files.\r\n * @param factory The factory function that creates the loader extension.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function registerGLTFExtension(name: string, isGLTFExtension: boolean, factory: GLTFExtensionFactory): void {\r\n if (unregisterGLTFExtension(name)) {\r\n Logger.Warn(`Extension with the name '${name}' already exists`);\r\n }\r\n\r\n RegisteredGLTFExtensions.set(name, {\r\n isGLTFExtension,\r\n factory,\r\n });\r\n}\r\n\r\n/**\r\n * Unregisters a loader extension.\r\n * @param name The name of the loader extension.\r\n * @returns A boolean indicating whether the extension has been unregistered\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function unregisterGLTFExtension(name: string): boolean {\r\n return RegisteredGLTFExtensions.delete(name);\r\n}\r\n","/* eslint-disable @typescript-eslint/promise-function-async */\r\n/* eslint-disable no-restricted-syntax */\r\n/* eslint-disable github/no-then */\r\nimport { type IndicesArray, type Nullable, type TypedArray, type TypedArrayConstructor } from \"core/types\";\r\nimport { Deferred } from \"core/Misc/deferred\";\r\nimport { Quaternion, Vector3, Matrix, TmpVectors } from \"core/Maths/math.vector\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { Camera } from \"core/Cameras/camera\";\r\nimport { FreeCamera } from \"core/Cameras/freeCamera\";\r\nimport { type Animation } from \"core/Animations/animation\";\r\nimport { type IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { type IAnimationKey, AnimationKeyInterpolation } from \"core/Animations/animationKey\";\r\nimport { type AnimationGroup } from \"core/Animations/animationGroup\";\r\nimport { Bone } from \"core/Bones/bone\";\r\nimport { Skeleton } from \"core/Bones/skeleton\";\r\nimport { Material } from \"core/Materials/material\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { type ITextureCreationOptions, Texture } from \"core/Materials/Textures/texture\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Buffer, VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { Geometry } from \"core/Meshes/geometry\";\r\nimport { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { MorphTarget } from \"core/Morph/morphTarget\";\r\nimport { MorphTargetManager } from \"core/Morph/morphTargetManager\";\r\nimport { type ISceneLoaderAsyncResult, type ISceneLoaderProgressEvent } from \"core/Loading/sceneLoader\";\r\nimport { type Scene } from \"core/scene\";\r\nimport {\r\n type IProperty,\r\n AnimationChannelTargetPath,\r\n AnimationSamplerInterpolation,\r\n AccessorType,\r\n CameraType,\r\n AccessorComponentType,\r\n MaterialAlphaMode,\r\n TextureMinFilter,\r\n TextureWrapMode,\r\n TextureMagFilter,\r\n MeshPrimitiveMode,\r\n} from \"babylonjs-gltf2interface\";\r\nimport {\r\n type IGLTF,\r\n type ISampler,\r\n type INode,\r\n type IScene,\r\n type IMesh,\r\n type IAccessor,\r\n type ISkin,\r\n type ICamera,\r\n type IAnimation,\r\n type IBuffer,\r\n type IBufferView,\r\n type IMaterialPbrMetallicRoughness,\r\n type IMaterial,\r\n type ITextureInfo,\r\n type ITexture,\r\n type IImage,\r\n type IMeshPrimitive,\r\n type IArrayItem,\r\n type _ISamplerData,\r\n type IAnimationChannel,\r\n type IAnimationSampler,\r\n type _IAnimationSamplerData,\r\n} from \"./glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"./glTFLoaderExtension\";\r\nimport { type IGLTFLoader, type IGLTFLoaderData, GLTFFileLoader, GLTFLoaderState, GLTFLoaderCoordinateSystemMode, GLTFLoaderAnimationStartMode } from \"../glTFFileLoader\";\r\nimport { type IDataBuffer } from \"core/Misc/dataReader\";\r\nimport { DecodeBase64UrlToBinary, GetMimeType, IsBase64DataUrl, LoadFileError } from \"core/Misc/fileTools\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { type Light } from \"core/Lights/light\";\r\nimport { BoundingInfo } from \"core/Culling/boundingInfo\";\r\nimport { type AssetContainer } from \"core/assetContainer\";\r\nimport { type AnimationPropertyInfo } from \"./glTFLoaderAnimation\";\r\nimport { type IObjectInfo } from \"core/ObjectModel/objectModelInterfaces\";\r\nimport { registeredGLTFExtensions, registerGLTFExtension, unregisterGLTFExtension, type GLTFExtensionFactory } from \"./glTFLoaderExtensionRegistry\";\r\nimport { type IInterpolationPropertyInfo } from \"core/FlowGraph/typeDefinitions\";\r\nimport { GetMappingForKey } from \"./Extensions/objectModelMapping\";\r\nimport { deepMerge } from \"core/Misc/deepMerger\";\r\nimport { GetTypedArrayConstructor } from \"core/Buffers/bufferUtils\";\r\nimport { Lazy } from \"core/Misc/lazy\";\r\nimport { type IMaterialLoadingAdapter } from \"./materialLoadingAdapter\";\r\n\r\n// Caching these dynamic imports gives a surprising perf boost (compared to importing them directly each time).\r\nconst LazyAnimationGroupModulePromise = new Lazy(() => import(\"core/Animations/animationGroup\"));\r\nconst LazyLoaderAnimationModulePromise = new Lazy(() => import(\"./glTFLoaderAnimation\"));\r\n\r\nexport { GLTFFileLoader };\r\n\r\ninterface ILoaderProperty extends IProperty {\r\n _activeLoaderExtensionFunctions: {\r\n [id: string]: boolean;\r\n };\r\n}\r\n\r\ninterface IWithMetadata {\r\n metadata: any;\r\n _internalMetadata: any;\r\n}\r\n\r\n/**\r\n * Helper class for working with arrays when loading the glTF asset\r\n */\r\nexport class ArrayItem {\r\n /**\r\n * Gets an item from the given array.\r\n * @param context The context when loading the asset\r\n * @param array The array to get the item from\r\n * @param index The index to the array\r\n * @returns The array item\r\n */\r\n public static Get<T>(context: string, array: ArrayLike<T> | undefined, index: number | undefined): T {\r\n if (!array || index == undefined || !array[index]) {\r\n throw new Error(`${context}: Failed to find index (${index})`);\r\n }\r\n\r\n return array[index];\r\n }\r\n\r\n /**\r\n * Gets an item from the given array or returns null if not available.\r\n * @param array The array to get the item from\r\n * @param index The index to the array\r\n * @returns The array item or null\r\n */\r\n public static TryGet<T>(array: ArrayLike<T> | undefined, index: number | undefined): Nullable<T> {\r\n if (!array || index == undefined || !array[index]) {\r\n return null;\r\n }\r\n\r\n return array[index];\r\n }\r\n\r\n /**\r\n * Assign an `index` field to each item of the given array.\r\n * @param array The array of items\r\n */\r\n public static Assign(array?: IArrayItem[]): void {\r\n if (array) {\r\n for (let index = 0; index < array.length; index++) {\r\n array[index].index = index;\r\n }\r\n }\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport interface IAnimationTargetInfo {\r\n /** @internal */\r\n target: unknown;\r\n\r\n /** @internal */\r\n properties: Array<AnimationPropertyInfo>;\r\n}\r\n\r\n/** @internal */\r\nexport function LoadBoundingInfoFromPositionAccessor(accessor: IAccessor): Nullable<BoundingInfo> {\r\n if (accessor.min && accessor.max) {\r\n const minArray = accessor.min as [number, number, number];\r\n const maxArray = accessor.max as [number, number, number];\r\n const minVector = TmpVectors.Vector3[0].copyFromFloats(minArray[0], minArray[1], minArray[2]);\r\n const maxVector = TmpVectors.Vector3[1].copyFromFloats(maxArray[0], maxArray[1], maxArray[2]);\r\n if (accessor.normalized && accessor.componentType !== AccessorComponentType.FLOAT) {\r\n let divider = 1;\r\n switch (accessor.componentType) {\r\n case AccessorComponentType.BYTE:\r\n divider = 127.0;\r\n break;\r\n case AccessorComponentType.UNSIGNED_BYTE:\r\n divider = 255.0;\r\n break;\r\n case AccessorComponentType.SHORT:\r\n divider = 32767.0;\r\n break;\r\n case AccessorComponentType.UNSIGNED_SHORT:\r\n divider = 65535.0;\r\n break;\r\n }\r\n const oneOverDivider = 1 / divider;\r\n minVector.scaleInPlace(oneOverDivider);\r\n maxVector.scaleInPlace(oneOverDivider);\r\n }\r\n return new BoundingInfo(minVector, maxVector);\r\n }\r\n return null;\r\n}\r\n\r\ntype PBRMaterialImplementation = {\r\n materialClass: typeof Material;\r\n adapterClass: new (material: Material) => IMaterialLoadingAdapter;\r\n};\r\n\r\n/**\r\n * The glTF 2.0 loader\r\n */\r\nexport class GLTFLoader implements IGLTFLoader {\r\n /** @internal */\r\n public readonly _completePromises = new Array<Promise<unknown>>();\r\n\r\n /** AbortController used to cancel in-flight finalizeAsync() calls when dispose() is called. */\r\n private _finalizeController: AbortController | null = null;\r\n\r\n /** @internal */\r\n public _assetContainer: Nullable<AssetContainer> = null;\r\n\r\n /** Storage */\r\n public _babylonLights: Light[] = [];\r\n\r\n /** @internal */\r\n public _disableInstancedMesh = 0;\r\n\r\n /** @internal */\r\n public _allMaterialsDirtyRequired = false;\r\n\r\n /** @internal */\r\n public _skipStartAnimationStep = false;\r\n\r\n private readonly _parent: GLTFFileLoader;\r\n private readonly _extensions = new Array<IGLTFLoaderExtension>();\r\n private _disposed = false;\r\n private _rootUrl: Nullable<string> = null;\r\n private _fileName: Nullable<string> = null;\r\n private _uniqueRootUrl: Nullable<string> = null;\r\n private _gltf: IGLTF;\r\n private _bin: Nullable<IDataBuffer> = null;\r\n private _babylonScene: Scene;\r\n private _rootBabylonMesh: Nullable<TransformNode> = null;\r\n private _defaultBabylonMaterialData: { [drawMode: number]: Material } = {};\r\n private readonly _postSceneLoadActions = new Array<() => void>();\r\n private readonly _materialAdapterCache = new WeakMap<Material, IMaterialLoadingAdapter>();\r\n private readonly _materialAdapters = new Set<IMaterialLoadingAdapter>();\r\n\r\n /** @internal */\r\n public _pbrMaterialImpl: Nullable<Readonly<PBRMaterialImplementation>> | false = null;\r\n\r\n /**\r\n * Test if the given material is of the same type as the one used by the loader\r\n * @param material The material to test\r\n * @returns true if the material is of the same type, false otherwise\r\n */\r\n public isMatchingMaterialType(material: Nullable<Material>): boolean {\r\n if (material && this._pbrMaterialImpl) {\r\n return material instanceof this._pbrMaterialImpl.materialClass;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * The default glTF sampler.\r\n */\r\n public static readonly DefaultSampler: ISampler = { index: -1 };\r\n\r\n /**\r\n * Registers a loader extension.\r\n * @param name The name of the loader extension.\r\n * @param factory The factory function that creates the loader extension.\r\n * @deprecated Please use registerGLTFExtension instead.\r\n */\r\n public static RegisterExtension(name: string, factory: GLTFExtensionFactory): void {\r\n registerGLTFExtension(name, false, factory);\r\n }\r\n\r\n /**\r\n * Unregisters a loader extension.\r\n * @param name The name of the loader extension.\r\n * @returns A boolean indicating whether the extension has been unregistered\r\n * @deprecated Please use unregisterGLTFExtension instead.\r\n */\r\n public static UnregisterExtension(name: string): boolean {\r\n return unregisterGLTFExtension(name);\r\n }\r\n\r\n /**\r\n * The object that represents the glTF JSON.\r\n */\r\n public get gltf(): IGLTF {\r\n if (!this._gltf) {\r\n throw new Error(\"glTF JSON is not available\");\r\n }\r\n\r\n return this._gltf;\r\n }\r\n\r\n /**\r\n * The BIN chunk of a binary glTF.\r\n */\r\n public get bin(): Nullable<IDataBuffer> {\r\n return this._bin;\r\n }\r\n\r\n /**\r\n * The parent file loader.\r\n */\r\n public get parent(): GLTFFileLoader {\r\n return this._parent;\r\n }\r\n\r\n /**\r\n * The Babylon scene when loading the asset.\r\n */\r\n public get babylonScene(): Scene {\r\n if (!this._babylonScene) {\r\n throw new Error(\"Scene is not available\");\r\n }\r\n\r\n return this._babylonScene;\r\n }\r\n\r\n /**\r\n * The root Babylon node when loading the asset.\r\n */\r\n public get rootBabylonMesh(): Nullable<TransformNode> {\r\n return this._rootBabylonMesh;\r\n }\r\n\r\n /**\r\n * The root url when loading the asset.\r\n */\r\n public get rootUrl(): Nullable<string> {\r\n return this._rootUrl;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(parent: GLTFFileLoader) {\r\n this._parent = parent;\r\n }\r\n\r\n /**\r\n * Creates or gets a cached material loading adapter with dynamic imports\r\n * @param material The material to adapt\r\n * @returns Promise that resolves to the appropriate adapter\r\n * @internal\r\n */\r\n public _getOrCreateMaterialAdapter(material: Material): IMaterialLoadingAdapter {\r\n let adapter = this._materialAdapterCache.get(material);\r\n if (!adapter) {\r\n if (this._pbrMaterialImpl) {\r\n adapter = new this._pbrMaterialImpl.adapterClass(material);\r\n } else {\r\n throw new Error(`Appropriate material adapter class not found`);\r\n }\r\n const createdAdapter = adapter;\r\n this._materialAdapterCache.set(material, createdAdapter);\r\n this._materialAdapters.add(createdAdapter);\r\n }\r\n return adapter;\r\n }\r\n\r\n /** @internal */\r\n public dispose(): void {\r\n if (this._disposed) {\r\n return;\r\n }\r\n\r\n this._disposed = true;\r\n\r\n this._finalizeController?.abort();\r\n this._finalizeController = null;\r\n\r\n this._completePromises.length = 0;\r\n\r\n this._extensions.forEach((extension) => extension.dispose && extension.dispose());\r\n this._extensions.length = 0;\r\n\r\n this._materialAdapters.clear();\r\n\r\n (this._gltf as Nullable<IGLTF>) = null; // TODO\r\n this._bin = null;\r\n (this._babylonScene as Nullable<Scene>) = null; // TODO\r\n this._rootBabylonMesh = null;\r\n this._defaultBabylonMaterialData = {};\r\n this._postSceneLoadActions.length = 0;\r\n\r\n this._parent.dispose();\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public async importMeshAsync(\r\n meshesNames: string | readonly string[] | null | undefined,\r\n scene: Scene,\r\n container: Nullable<AssetContainer>,\r\n data: IGLTFLoaderData,\r\n rootUrl: string,\r\n onProgress?: (event: ISceneLoaderProgressEvent) => void,\r\n fileName = \"\"\r\n ): Promise<ISceneLoaderAsyncResult> {\r\n return await Promise.resolve().then(async () => {\r\n this._babylonScene = scene;\r\n this._assetContainer = container;\r\n this._loadData(data);\r\n\r\n let nodes: Nullable<Array<number>> = null;\r\n\r\n if (meshesNames) {\r\n const nodeMap: { [name: string]: number } = {};\r\n if (this._gltf.nodes) {\r\n for (const node of this._gltf.nodes) {\r\n if (node.name) {\r\n nodeMap[node.name] = node.index;\r\n }\r\n }\r\n }\r\n\r\n const names = meshesNames instanceof Array ? meshesNames : [meshesNames];\r\n nodes = names.map((name) => {\r\n const node = nodeMap[name];\r\n if (node === undefined) {\r\n throw new Error(`Failed to find node '${name}'`);\r\n }\r\n\r\n return node;\r\n });\r\n }\r\n\r\n return await this._loadAsync(rootUrl, fileName, nodes, () => {\r\n return {\r\n meshes: this._getMeshes(),\r\n particleSystems: [],\r\n skeletons: this._getSkeletons(),\r\n animationGroups: this._getAnimationGroups(),\r\n lights: this._babylonLights,\r\n transformNodes: this._getTransformNodes(),\r\n geometries: this._getGeometries(),\r\n spriteManagers: [],\r\n };\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public async loadAsync(scene: Scene, data: IGLTFLoaderData, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName = \"\"): Promise<void> {\r\n this._babylonScene = scene;\r\n this._loadData(data);\r\n return await this._loadAsync(rootUrl, fileName, null, () => undefined);\r\n }\r\n\r\n private async _loadAsync<T>(rootUrl: string, fileName: string, nodes: Nullable<Array<number>>, resultFunc: () => T): Promise<T> {\r\n return await Promise.resolve()\r\n .then(async () => {\r\n this._rootUrl = rootUrl;\r\n this._uniqueRootUrl = !rootUrl.startsWith(\"file:\") && fileName ? rootUrl : `${rootUrl}${Date.now()}/`;\r\n this._fileName = fileName;\r\n this._allMaterialsDirtyRequired = false;\r\n\r\n await this._loadExtensionsAsync();\r\n\r\n // NOTE: Explicitly check _pbrMaterialImpl for null as a value of false means don't use PBR materials at all.\r\n if (!this.parent.skipMaterials && this._pbrMaterialImpl == null) {\r\n if (this.parent.useOpenPBR || this.isExtensionUsed(\"KHR_materials_openpbr\")) {\r\n this._pbrMaterialImpl = {\r\n materialClass: (await import(\"core/Materials/PBR/openpbrMaterial\")).OpenPBRMaterial,\r\n adapterClass: (await import(\"./openpbrMaterialLoadingAdapter\")).OpenPBRMaterialLoadingAdapter,\r\n };\r\n } else {\r\n this._pbrMaterialImpl = {\r\n materialClass: (await import(\"core/Materials/PBR/pbrMaterial\")).PBRMaterial,\r\n adapterClass: (await import(\"./pbrMaterialLoadingAdapter\")).PBRMaterialLoadingAdapter,\r\n };\r\n }\r\n }\r\n\r\n const loadingToReadyCounterName = `${GLTFLoaderState[GLTFLoaderState.LOADING]} => ${GLTFLoaderState[GLTFLoaderState.READY]}`;\r\n const loadingToCompleteCounterName = `${GLTFLoaderState[GLTFLoaderState.LOADING]} => ${GLTFLoaderState[GLTFLoaderState.COMPLETE]}`;\r\n\r\n this._parent._startPerformanceCounter(loadingToReadyCounterName);\r\n this._parent._startPerformanceCounter(loadingToCompleteCounterName);\r\n\r\n this._parent._setState(GLTFLoaderState.LOADING);\r\n this._extensionsOnLoading();\r\n\r\n const promises = new Array<Promise<unknown>>();\r\n\r\n // Block the marking of materials dirty until the scene is loaded.\r\n const oldBlockMaterialDirtyMechanism = this._babylonScene.blockMaterialDirtyMechanism;\r\n this._babylonScene.blockMaterialDirtyMechanism = true;\r\n\r\n if (!this.parent.loadOnlyMaterials) {\r\n if (nodes) {\r\n promises.push(this.loadSceneAsync(\"/nodes\", { nodes: nodes, index: -1 }));\r\n } else if (this._gltf.scene != undefined || (this._gltf.scenes && this._gltf.scenes[0])) {\r\n const scene = ArrayItem.Get(`/scene`, this._gltf.scenes, this._gltf.scene || 0);\r\n promises.push(this.loadSceneAsync(`/scenes/${scene.index}`, scene));\r\n }\r\n }\r\n\r\n if (!this.parent.skipMaterials && this.parent.loadAllMaterials && this._gltf.materials) {\r\n for (let m = 0; m < this._gltf.materials.length; ++m) {\r\n const material = this._gltf.materials[m];\r\n const context = \"/materials/\" + m;\r\n const babylonDrawMode = Material.TriangleFillMode;\r\n\r\n promises.push(this._loadMaterialAsync(context, material, null, babylonDrawMode, () => {}));\r\n }\r\n }\r\n\r\n // Restore the blocking of material dirty.\r\n if (this._allMaterialsDirtyRequired) {\r\n // This can happen if we add a light for instance as it will impact the whole scene.\r\n // This automatically resets everything if needed.\r\n this._babylonScene.blockMaterialDirtyMechanism = oldBlockMaterialDirtyMechanism;\r\n } else {\r\n // By default a newly created material is dirty so there is no need to flag the full scene as dirty.\r\n // For perf reasons, we then bypass blockMaterialDirtyMechanism as this would \"dirty\" the entire scene.\r\n this._babylonScene._forceBlockMaterialDirtyMechanism(oldBlockMaterialDirtyMechanism);\r\n }\r\n\r\n if (this._parent.compileMaterials) {\r\n promises.push(this._compileMaterialsAsync());\r\n }\r\n\r\n if (this._parent.compileShadowGenerators) {\r\n promises.push(this._compileShadowGeneratorsAsync());\r\n }\r\n\r\n const resultPromise = Promise.all(promises).then(() => {\r\n if (this._rootBabylonMesh && this._rootBabylonMesh !== this._parent.customRootNode) {\r\n this._rootBabylonMesh.setEnabled(true);\r\n }\r\n\r\n // Making sure we enable enough lights to have all lights together\r\n for (const material of this._babylonScene.materials) {\r\n const mat = material as any;\r\n\r\n if (mat.maxSimultaneousLights !== undefined) {\r\n mat.maxSimultaneousLights = Math.max(mat.maxSimultaneousLights, this._babylonScene.lights.length);\r\n }\r\n }\r\n\r\n // Finalize all material adapters. finalizeAsync() may return a Promise for async\r\n // work (e.g. GPU texture processing); push any such promises into\r\n // _completePromises so they are awaited before the COMPLETE state is reached.\r\n // Fall back to the deprecated finalize() for third-party adapters that have not\r\n // yet migrated, logging a warning so authors know to update.\r\n // An AbortController is created here and aborted in dispose() so that adapters\r\n // can detect mid-flight disposal and clean up intermediate resources early.\r\n this._finalizeController = new AbortController();\r\n const finalizeSignal = this._finalizeController.signal;\r\n for (const adapter of Array.from(this._materialAdapters)) {\r\n if (adapter.finalizeAsync) {\r\n const finalizePromise = adapter.finalizeAsync(finalizeSignal);\r\n if (finalizePromise) {\r\n this._completePromises.push(finalizePromise);\r\n }\r\n } else if (adapter.finalize) {\r\n Logger.Warn(\"GLTFLoader: IMaterialLoadingAdapter.finalize() is deprecated. Implement finalizeAsync() instead.\");\r\n adapter.finalize();\r\n }\r\n }\r\n\r\n this._extensionsOnReady();\r\n this._parent._setState(GLTFLoaderState.READY);\r\n if (!this._skipStartAnimationStep) {\r\n this._startAnimations();\r\n }\r\n\r\n return resultFunc();\r\n });\r\n\r\n return await resultPromise.then((result) => {\r\n this._parent._endPerformanceCounter(loadingToReadyCounterName);\r\n\r\n Tools.SetImmediate(() => {\r\n if (!this._disposed) {\r\n Promise.all(this._completePromises).then(\r\n () => {\r\n this._parent._endPerformanceCounter(loadingToCompleteCounterName);\r\n\r\n this._parent._setState(GLTFLoaderState.COMPLETE);\r\n\r\n this._parent.onCompleteObservable.notifyObservers(undefined);\r\n this._parent.onCompleteObservable.clear();\r\n\r\n this.dispose();\r\n },\r\n (error) => {\r\n this._parent.onErrorObservable.notifyObservers(error);\r\n this._parent.onErrorObservable.clear();\r\n\r\n this.dispose();\r\n }\r\n );\r\n }\r\n });\r\n\r\n return result;\r\n });\r\n })\r\n .catch((error) => {\r\n if (!this._disposed) {\r\n this._parent.onErrorObservable.notifyObservers(error);\r\n this._parent.onErrorObservable.clear();\r\n\r\n this.dispose();\r\n }\r\n\r\n throw error;\r\n });\r\n }\r\n\r\n private _loadData(data: IGLTFLoaderData): void {\r\n this._gltf = data.json as IGLTF;\r\n this._setupData();\r\n\r\n if (data.bin) {\r\n const buffers = this._gltf.buffers;\r\n if (buffers && buffers[0] && !buffers[0].uri) {\r\n const binaryBuffer = buffers[0];\r\n if (binaryBuffer.byteLength < data.bin.byteLength - 3 || binaryBuffer.byteLength > data.bin.byteLength) {\r\n Logger.Warn(`Binary buffer length (${binaryBuffer.byteLength}) from JSON does not match chunk length (${data.bin.byteLength})`);\r\n }\r\n\r\n this._bin = data.bin;\r\n } else {\r\n Logger.Warn(\"Unexpected BIN chunk\");\r\n }\r\n }\r\n }\r\n\r\n private _setupData(): void {\r\n ArrayItem.Assign(this._gltf.accessors);\r\n ArrayItem.Assign(this._gltf.animations);\r\n ArrayItem.Assign(this._gltf.buffers);\r\n ArrayItem.Assign(this._gltf.bufferViews);\r\n ArrayItem.Assign(this._gltf.cameras);\r\n ArrayItem.Assign(this._gltf.images);\r\n ArrayItem.Assign(this._gltf.materials);\r\n ArrayItem.Assign(this._gltf.meshes);\r\n ArrayItem.Assign(this._gltf.nodes);\r\n ArrayItem.Assign(this._gltf.samplers);\r\n ArrayItem.Assign(this._gltf.scenes);\r\n ArrayItem.Assign(this._gltf.skins);\r\n ArrayItem.Assign(this._gltf.textures);\r\n\r\n if (this._gltf.nodes) {\r\n const nodeParents: { [index: number]: number } = {};\r\n for (const node of this._gltf.nodes) {\r\n if (node.children) {\r\n for (const index of node.children) {\r\n nodeParents[index] = node.index;\r\n }\r\n }\r\n }\r\n\r\n const rootNode = this._createRootNode();\r\n for (const node of this._gltf.nodes) {\r\n const parentIndex = nodeParents[node.index];\r\n node.parent = parentIndex === undefined ? rootNode : this._gltf.nodes[parentIndex];\r\n }\r\n }\r\n }\r\n\r\n private async _loadExtensionsAsync() {\r\n const extensionPromises: Promise<IGLTFLoaderExtension>[] = [];\r\n\r\n registeredGLTFExtensions.forEach((registeredExtension, name) => {\r\n // Don't load explicitly disabled extensions.\r\n if (this.parent.extensionOptions[name]?.enabled === false) {\r\n // But warn if the disabled extension is used by the model.\r\n if (registeredExtension.isGLTFExtension && this.isExtensionUsed(name)) {\r\n Logger.Warn(`Extension ${name} is used but has been explicitly disabled.`);\r\n }\r\n }\r\n // Load loader extensions that are not a glTF extension, as well as extensions that are glTF extensions and are used by the model.\r\n else if (!registeredExtension.isGLTFExtension || this.isExtensionUsed(name)) {\r\n extensionPromises.push(\r\n (async () => {\r\n const extension = await registeredExtension.factory(this);\r\n if (extension.name !== name) {\r\n Logger.Warn(`The name of the glTF loader extension instance does not match the registered name: ${extension.name} !== ${name}`);\r\n }\r\n\r\n this._parent.onExtensionLoadedObservable.notifyObservers(extension);\r\n return extension;\r\n })()\r\n );\r\n }\r\n });\r\n\r\n this._extensions.push(...(await Promise.all(extensionPromises)));\r\n\r\n this._extensions.sort((a, b) => (a.order || Number.MAX_VALUE) - (b.order || Number.MAX_VALUE));\r\n this._parent.onExtensionLoadedObservable.clear();\r\n\r\n if (this._gltf.extensionsRequired) {\r\n for (const name of this._gltf.extensionsRequired) {\r\n const available = this._extensions.some((extension) => extension.name === name && extension.enabled);\r\n if (!available) {\r\n if (this.parent.extensionOptions[name]?.enabled === false) {\r\n throw new Error(`Required extension ${name} is disabled`);\r\n }\r\n throw new Error(`Required extension ${name} is not available`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _createRootNode(): INode {\r\n if (this._parent.customRootNode !== undefined) {\r\n this._rootBabylonMesh = this._parent.customRootNode;\r\n return {\r\n _babylonTransformNode: this._rootBabylonMesh === null ? undefined : this._rootBabylonMesh,\r\n index: -1,\r\n };\r\n }\r\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n const rootMesh = new Mesh(\"__root__\", this._babylonScene);\r\n this._rootBabylonMesh = rootMesh;\r\n this._rootBabylonMesh._parentContainer = this._assetContainer;\r\n this._babylonScene._blockEntityCollection = false;\r\n this._rootBabylonMesh.setEnabled(false);\r\n\r\n const rootNode: INode = {\r\n _babylonTransformNode: this._rootBabylonMesh,\r\n index: -1,\r\n };\r\n\r\n switch (this._parent.coordinateSystemMode) {\r\n case GLTFLoaderCoordinateSystemMode.AUTO: {\r\n if (!this._babylonScene.useRightHandedSystem) {\r\n rootNode.rotation = [0, 1, 0, 0];\r\n rootNode.scale = [1, 1, -1];\r\n GLTFLoader._LoadTransform(rootNode, this._rootBabylonMesh);\r\n }\r\n break;\r\n }\r\n case GLTFLoaderCoordinateSystemMode.FORCE_RIGHT_HANDED: {\r\n this._babylonScene.useRightHandedSystem = true;\r\n break;\r\n }\r\n default: {\r\n throw new Error(`Invalid coordinate system mode (${this._parent.coordinateSystemMode})`);\r\n }\r\n }\r\n\r\n this._parent.onMeshLoadedObservable.notifyObservers(rootMesh);\r\n return rootNode;\r\n }\r\n\r\n /**\r\n * Loads a glTF scene.\r\n * @param context The context when loading the asset\r\n * @param scene The glTF scene property\r\n * @returns A promise that resolves when the load is complete\r\n */\r\n\r\n public loadSceneAsync(context: string, scene: IScene): Promise<void> {\r\n const extensionPromise = this._extensionsLoadSceneAsync(context, scene);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n const promises = new Array<Promise<unknown>>();\r\n\r\n this.logOpen(`${context} ${scene.name || \"\"}`);\r\n\r\n if (scene.nodes) {\r\n for (const index of scene.nodes) {\r\n const node = ArrayItem.Get(`${context}/nodes/${index}`, this._gltf.nodes, index);\r\n promises.push(\r\n this.loadNodeAsync(`/nodes/${node.index}`, node, (babylonMesh) => {\r\n babylonMesh.parent = this._rootBabylonMesh;\r\n })\r\n );\r\n }\r\n }\r\n\r\n for (const action of this._postSceneLoadActions) {\r\n action();\r\n }\r\n\r\n promises.push(this._loadAnimationsAsync());\r\n\r\n this.logClose();\r\n\r\n return Promise.all(promises).then(() => {});\r\n }\r\n\r\n private _forEachPrimitive(node: INode, callback: (babylonMesh: AbstractMesh) => void): void {\r\n if (node._primitiveBabylonMeshes) {\r\n for (const babylonMesh of node._primitiveBabylonMeshes) {\r\n callback(babylonMesh);\r\n }\r\n }\r\n }\r\n\r\n private _getGeometries(): Geometry[] {\r\n const geometries: Geometry[] = [];\r\n\r\n const nodes = this._gltf.nodes;\r\n if (nodes) {\r\n for (const node of nodes) {\r\n this._forEachPrimitive(node, (babylonMesh) => {\r\n const geometry = (babylonMesh as Mesh).geometry;\r\n if (geometry && geometries.indexOf(geometry) === -1) {\r\n geometries.push(geometry);\r\n }\r\n });\r\n }\r\n }\r\n\r\n return geometries;\r\n }\r\n\r\n private _getMeshes(): AbstractMesh[] {\r\n const meshes: AbstractMesh[] = [];\r\n\r\n // Root mesh is always first, if available.\r\n if (this._rootBabylonMesh instanceof AbstractMesh) {\r\n meshes.push(this._rootBabylonMesh);\r\n }\r\n\r\n const nodes = this._gltf.nodes;\r\n if (nodes) {\r\n for (const node of nodes) {\r\n this._forEachPrimitive(node, (babylonMesh) => {\r\n meshes.push(babylonMesh);\r\n });\r\n }\r\n }\r\n\r\n return meshes;\r\n }\r\n\r\n private _getTransformNodes(): TransformNode[] {\r\n const transformNodes: TransformNode[] = [];\r\n\r\n const nodes = this._gltf.nodes;\r\n if (nodes) {\r\n for (const node of nodes) {\r\n if (node._babylonTransformNode && node._babylonTransformNode.getClassName() === \"TransformNode\") {\r\n transformNodes.push(node._babylonTransformNode);\r\n }\r\n if (node._babylonTransformNodeForSkin) {\r\n transformNodes.push(node._babylonTransformNodeForSkin);\r\n }\r\n }\r\n }\r\n\r\n return transformNodes;\r\n }\r\n\r\n private _getSkeletons(): Skeleton[] {\r\n const skeletons: Skeleton[] = [];\r\n\r\n const skins = this._gltf.skins;\r\n if (skins) {\r\n for (const skin of skins) {\r\n if (skin._data) {\r\n skeletons.push(skin._data.babylonSkeleton);\r\n }\r\n }\r\n }\r\n\r\n return skeletons;\r\n }\r\n\r\n private _getAnimationGroups(): AnimationGroup[] {\r\n const animationGroups: AnimationGroup[] = [];\r\n\r\n const animations = this._gltf.animations;\r\n if (animations) {\r\n for (const animation of animations) {\r\n if (animation._babylonAnimationGroup) {\r\n animationGroups.push(animation._babylonAnimationGroup);\r\n }\r\n }\r\n }\r\n\r\n return animationGroups;\r\n }\r\n\r\n private _startAnimations(): void {\r\n switch (this._parent.animationStartMode) {\r\n case GLTFLoaderAnimationStartMode.NONE: {\r\n // do nothing\r\n break;\r\n }\r\n case GLTFLoaderAnimationStartMode.FIRST: {\r\n const babylonAnimationGroups = this._getAnimationGroups();\r\n if (babylonAnimationGroups.length !== 0) {\r\n babylonAnimationGroups[0].start(true);\r\n }\r\n break;\r\n }\r\n case GLTFLoaderAnimationStartMode.ALL: {\r\n const babylonAnimationGroups = this._getAnimationGroups();\r\n for (const babylonAnimationGroup of babylonAnimationGroups) {\r\n babylonAnimationGroup.start(true);\r\n }\r\n break;\r\n }\r\n default: {\r\n Logger.Error(`Invalid animation start mode (${this._parent.animationStartMode})`);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Loads a glTF node.\r\n * @param context The context when loading the asset\r\n * @param node The glTF node property\r\n * @param assign A function called synchronously after parsing the glTF properties\r\n * @returns A promise that resolves with the loaded Babylon mesh when the load is complete\r\n */\r\n\r\n public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void = () => {}): Promise<TransformNode> {\r\n const extensionPromise = this._extensionsLoadNodeAsync(context, node, assign);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n if (node._babylonTransformNode) {\r\n throw new Error(`${context}: Invalid recursive node hierarchy`);\r\n }\r\n\r\n const promises = new Array<Promise<unknown>>();\r\n\r\n this.logOpen(`${context} ${node.name || \"\"}`);\r\n\r\n const loadNode = (babylonTransformNode: TransformNode) => {\r\n GLTFLoader.AddPointerMetadata(babylonTransformNode, context);\r\n GLTFLoader._LoadTransform(node, babylonTransformNode);\r\n\r\n if (node.camera != undefined) {\r\n const camera = ArrayItem.Get(`${context}/camera`, this._gltf.cameras, node.camera);\r\n promises.push(\r\n this.loadCameraAsync(`/cameras/${camera.index}`, camera, (babylonCamera) => {\r\n babylonCamera.parent = babylonTransformNode;\r\n if (!this._babylonScene.useRightHandedSystem) {\r\n babylonTransformNode.scaling.x = -1; // Cancelling root node scaling for handedness so the view matrix does not end up flipped.\r\n }\r\n })\r\n );\r\n }\r\n\r\n if (node.children) {\r\n for (const index of node.children) {\r\n const childNode = ArrayItem.Get(`${context}/children/${index}`, this._gltf.nodes, index);\r\n promises.push(\r\n this.loadNodeAsync(`/nodes/${childNode.index}`, childNode, (childBabylonMesh) => {\r\n childBabylonMesh.parent = babylonTransformNode;\r\n })\r\n );\r\n }\r\n }\r\n\r\n assign(babylonTransformNode);\r\n };\r\n\r\n const hasMesh = node.mesh != undefined;\r\n const hasSkin = this._parent.loadSkins && node.skin != undefined;\r\n\r\n if (!hasMesh || hasSkin) {\r\n const nodeName = node.name || `node${node.index}`;\r\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n const transformNode = new TransformNode(nodeName, this._babylonScene);\r\n transformNode._parentContainer = this._assetContainer;\r\n this._babylonScene._blockEntityCollection = false;\r\n if (node.mesh == undefined) {\r\n node._babylonTransformNode = transformNode;\r\n } else {\r\n node._babylonTransformNodeForSkin = transformNode;\r\n }\r\n loadNode(transformNode);\r\n }\r\n\r\n if (hasMesh) {\r\n if (hasSkin) {\r\n // See https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins (second implementation note)\r\n // This code path will place the skinned mesh as a sibling of the skeleton root node without loading the\r\n // transform, which effectively ignores the transform of the skinned mesh, as per spec.\r\n\r\n const mesh = ArrayItem.Get(`${context}/mesh`, this._gltf.meshes, node.mesh);\r\n promises.push(\r\n this._loadMeshAsync(`/meshes/${mesh.index}`, node, mesh, (babylonTransformNode) => {\r\n const babylonTransformNodeForSkin = node._babylonTransformNodeForSkin!;\r\n\r\n // Merge the metadata from the skin node to the skinned mesh in case a loader extension added metadata.\r\n babylonTransformNode.metadata = deepMerge(babylonTransformNodeForSkin.metadata, babylonTransformNode.metadata || {});\r\n\r\n const skin = ArrayItem.Get(`${context}/skin`, this._gltf.skins, node.skin);\r\n promises.push(\r\n this._loadSkinAsync(`/skins/${skin.index}`, node, skin, (babylonSkeleton) => {\r\n this._forEachPrimitive(node, (babylonMesh) => {\r\n babylonMesh.skeleton = babylonSkeleton;\r\n });\r\n\r\n // Wait until all the nodes are parented before parenting the skinned mesh.\r\n this._postSceneLoadActions.push(() => {\r\n if (skin.skeleton != undefined) {\r\n // Place the skinned mesh node as a sibling of the skeleton root node.\r\n // Handle special case when the parent of the skeleton root is the skinned mesh.\r\n const parentNode = ArrayItem.Get(`/skins/${skin.index}/skeleton`, this._gltf.nodes, skin.skeleton).parent!;\r\n if (node.index === parentNode.index) {\r\n babylonTransformNode.parent = babylonTransformNodeForSkin.parent;\r\n } else {\r\n babylonTransformNode.parent = parentNode._babylonTransformNode!;\r\n }\r\n } else {\r\n babylonTransformNode.parent = this._rootBabylonMesh;\r\n }\r\n\r\n this._parent.onSkinLoadedObservable.notifyObservers({ node: babylonTransformNodeForSkin, skinnedNode: babylonTransformNode });\r\n });\r\n })\r\n );\r\n })\r\n );\r\n } else {\r\n const mesh = ArrayItem.Get(`${context}/mesh`, this._gltf.meshes, node.mesh);\r\n promises.push(this._loadMeshAsync(`/meshes/${mesh.index}`, node, mesh, loadNode));\r\n }\r\n }\r\n\r\n this.logClose();\r\n\r\n return Promise.all(promises).then(() => {\r\n this._forEachPrimitive(node, (babylonMesh) => {\r\n const asMesh = babylonMesh as Mesh;\r\n if (!asMesh.isAnInstance && asMesh.geometry && asMesh.geometry.useBoundingInfoFromGeometry) {\r\n // simply apply the world matrices to the bounding info - the extends are already ok\r\n babylonMesh._updateBoundingInfo();\r\n } else {\r\n babylonMesh.refreshBoundingInfo(true, true);\r\n }\r\n });\r\n\r\n return node._babylonTransformNode!;\r\n });\r\n }\r\n\r\n private _loadMeshAsync(context: string, node: INode, mesh: IMesh, assign: (babylonTransformNode: TransformNode) => void): Promise<TransformNode> {\r\n const primitives = mesh.primitives;\r\n if (!primitives || !primitives.length) {\r\n throw new Error(`${context}: Primitives are missing`);\r\n }\r\n\r\n if (primitives[0].index == undefined) {\r\n ArrayItem.Assign(primitives);\r\n }\r\n\r\n const promises = new Array<Promise<unknown>>();\r\n\r\n this.logOpen(`${context} ${mesh.name || \"\"}`);\r\n\r\n const name = node.name || `node${node.index}`;\r\n\r\n if (primitives.length === 1) {\r\n const primitive = mesh.primitives[0];\r\n promises.push(\r\n this._loadMeshPrimitiveAsync(`${context}/primitives/${primitive.index}`, name, node, mesh, primitive, (babylonMesh) => {\r\n node._babylonTransformNode = babylonMesh;\r\n node._primitiveBabylonMeshes = [babylonMesh];\r\n })\r\n );\r\n } else {\r\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n node._babylonTransformNode = new TransformNode(name, this._babylonScene);\r\n node._babylonTransformNode._parentContainer = this._assetContainer;\r\n this._babylonScene._blockEntityCollection = false;\r\n node._primitiveBabylonMeshes = [];\r\n for (const primitive of primitives) {\r\n promises.push(\r\n this._loadMeshPrimitiveAsync(`${context}/primitives/${primitive.index}`, `${name}_primitive${primitive.index}`, node, mesh, primitive, (babylonMesh) => {\r\n babylonMesh.parent = node._babylonTransformNode!;\r\n node._primitiveBabylonMeshes!.push(babylonMesh);\r\n })\r\n );\r\n }\r\n }\r\n\r\n assign(node._babylonTransformNode!);\r\n\r\n this.logClose();\r\n\r\n return Promise.all(promises).then(() => {\r\n return node._babylonTransformNode!;\r\n });\r\n }\r\n\r\n /**\r\n * @internal Define this method to modify the default behavior when loading data for mesh primitives.\r\n * @param context The context when loading the asset\r\n * @param name The mesh name when loading the asset\r\n * @param node The glTF node when loading the asset\r\n * @param mesh The glTF mesh when loading the asset\r\n * @param primitive The glTF mesh primitive property\r\n * @param assign A function called synchronously after parsing the glTF properties\r\n * @returns A promise that resolves with the loaded mesh when the load is complete or null if not handled\r\n */\r\n\r\n public _loadMeshPrimitiveAsync(\r\n context: string,\r\n name: string,\r\n node: INode,\r\n mesh: IMesh,\r\n primitive: IMeshPrimitive,\r\n assign: (babylonMesh: AbstractMesh) => void\r\n ): Promise<AbstractMesh> {\r\n const extensionPromise = this._extensionsLoadMeshPrimitiveAsync(context, name, node, mesh, primitive, assign);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n this.logOpen(`${context}`);\r\n\r\n const shouldInstance = this._disableInstancedMesh === 0 && this._parent.createInstances && node.skin == undefined && !mesh.primitives[0].targets;\r\n\r\n let babylonAbstractMesh: AbstractMesh;\r\n let promise: Promise<unknown>;\r\n\r\n if (shouldInstance && primitive._instanceData) {\r\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n babylonAbstractMesh = primitive._instanceData.babylonSourceMesh.createInstance(name);\r\n babylonAbstractMesh._parentContainer = this._assetContainer;\r\n this._babylonScene._blockEntityCollection = false;\r\n promise = primitive._instanceData.promise;\r\n } else {\r\n const promises = new Array<Promise<unknown>>();\r\n\r\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n const babylonMesh = new Mesh(name, this._babylonScene);\r\n babylonMesh._parentContainer = this._assetContainer;\r\n this._babylonScene._blockEntityCollection = false;\r\n babylonMesh.sideOrientation = this._babylonScene.useRightHandedSystem ? Material.CounterClockWiseSideOrientation : Material.ClockWiseSideOrientation;\r\n\r\n this._createMorphTargets(context, node, mesh, primitive, babylonMesh);\r\n promises.push(\r\n this._loadVertexDataAsync(context, primitive, babylonMesh).then(async (babylonGeometry) => {\r\n return await this._loadMorphTargetsAsync(context, primitive, babylonMesh, babylonGeometry).then(() => {\r\n if (this._disposed) {\r\n return;\r\n }\r\n\r\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n babylonGeometry.applyToMesh(babylonMesh);\r\n babylonGeometry._parentContainer = this._assetContainer;\r\n this._babylonScene._blockEntityCollection = false;\r\n });\r\n })\r\n );\r\n\r\n if (!this.parent.skipMaterials) {\r\n const babylonDrawMode = GLTFLoader._GetDrawMode(context, primitive.mode);\r\n if (primitive.material == undefined) {\r\n let babylonMaterial = this._defaultBabylonMaterialData[babylonDrawMode];\r\n if (!babylonMaterial) {\r\n babylonMaterial = this._createDefaultMaterial(\"__GLTFLoader._default\", babylonDrawMode);\r\n this._parent.onMaterialLoadedObservable.notifyObservers(babylonMaterial);\r\n this._defaultBabylonMaterialData[babylonDrawMode] = babylonMaterial;\r\n }\r\n babylonMesh.material = babylonMaterial;\r\n } else {\r\n const material = ArrayItem.Get(`${context}/material`, this._gltf.materials, primitive.material);\r\n promises.push(\r\n this._loadMaterialAsync(`/materials/${material.index}`, material, babylonMesh, babylonDrawMode, (babylonMaterial) => {\r\n babylonMesh.material = babylonMaterial;\r\n })\r\n );\r\n }\r\n }\r\n\r\n promise = Promise.all(promises);\r\n\r\n if (shouldInstance) {\r\n primitive._instanceData = {\r\n babylonSourceMesh: babylonMesh,\r\n promise: promise,\r\n };\r\n }\r\n\r\n babylonAbstractMesh = babylonMesh;\r\n }\r\n\r\n GLTFLoader.AddPointerMetadata(babylonAbstractMesh, context);\r\n this._parent.onMeshLoadedObservable.notifyObservers(babylonAbstractMesh);\r\n assign(babylonAbstractMesh);\r\n\r\n this.logClose();\r\n\r\n return promise.then(() => {\r\n return babylonAbstractMesh;\r\n });\r\n }\r\n\r\n private _loadVertexDataAsync(context: string, primitive: IMeshPrimitive, babylonMesh: Mesh): Promise<Geometry> {\r\n const extensionPromise = this._extensionsLoadVertexDataAsync(context, primitive, babylonMesh);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n const attributes = primitive.attributes;\r\n if (!attributes) {\r\n throw new Error(`${context}: Attributes are missing`);\r\n }\r\n\r\n const promises = new Array<Promise<unknown>>();\r\n\r\n const babylonGeometry = new Geometry(babylonMesh.name, this._babylonScene);\r\n\r\n if (primitive.indices == undefined) {\r\n babylonMesh.isUnIndexed = true;\r\n } else {\r\n const accessor = ArrayItem.Get(`${context}/indices`, this._gltf.accessors, primitive.indices);\r\n promises.push(\r\n this._loadIndicesAccessorAsync(`/accessors/${accessor.index}`, accessor).then((data) => {\r\n babylonGeometry.setIndices(data);\r\n })\r\n );\r\n }\r\n\r\n const loadAttribute = (name: string, kind: string, callback?: (accessor: IAccessor) => void) => {\r\n if (attributes[name] == undefined) {\r\n return;\r\n }\r\n\r\n babylonMesh._delayInfo = babylonMesh._delayInfo || [];\r\n if (babylonMesh._delayInfo.indexOf(kind) === -1) {\r\n babylonMesh._delayInfo.push(kind);\r\n }\r\n\r\n const accessor = ArrayItem.Get(`${context}/attributes/${name}`, this._gltf.accessors, attributes[name]);\r\n promises.push(\r\n this._loadVertexAccessorAsync(`/accessors/${accessor.index}`, accessor, kind).then((babylonVertexBuffer) => {\r\n if (babylonVertexBuffer.getKind() === VertexBuffer.PositionKind && !this.parent.alwaysComputeBoundingBox && !babylonMesh.skeleton) {\r\n const babylonBoundingInfo = LoadBoundingInfoFromPositionAccessor(accessor);\r\n if (babylonBoundingInfo) {\r\n babylonGeometry._boundingInfo = babylonBoundingInfo;\r\n babylonGeometry.useBoundingInfoFromGeometry = true;\r\n }\r\n }\r\n babylonGeometry.setVerticesBuffer(babylonVertexBuffer, accessor.count);\r\n })\r\n );\r\n\r\n if (kind == VertexBuffer.MatricesIndicesExtraKind) {\r\n babylonMesh.numBoneInfluencers = 8;\r\n }\r\n\r\n if (callback) {\r\n callback(accessor);\r\n }\r\n };\r\n\r\n loadAttribute(\"POSITION\", VertexBuffer.PositionKind);\r\n loadAttribute(\"NORMAL\", VertexBuffer.NormalKind);\r\n loadAttribute(\"TANGENT\", VertexBuffer.TangentKind);\r\n loadAttribute(\"TEXCOORD_0\", VertexBuffer.UVKind);\r\n loadAttribute(\"TEXCOORD_1\", VertexBuffer.UV2Kind);\r\n loadAttribute(\"TEXCOORD_2\", VertexBuffer.UV3Kind);\r\n loadAttribute(\"TEXCOORD_3\", VertexBuffer.UV4Kind);\r\n loadAttribute(\"TEXCOORD_4\", VertexBuffer.UV5Kind);\r\n loadAttribute(\"TEXCOORD_5\", VertexBuffer.UV6Kind);\r\n loadAttribute(\"JOINTS_0\", VertexBuffer.MatricesIndicesKind);\r\n loadAttribute(\"WEIGHTS_0\", VertexBuffer.MatricesWeightsKind);\r\n loadAttribute(\"JOINTS_1\", VertexBuffer.MatricesIndicesExtraKind);\r\n loadAttribute(\"WEIGHTS_1\", VertexBuffer.MatricesWeightsExtraKind);\r\n loadAttribute(\"COLOR_0\", VertexBuffer.ColorKind, (accessor) => {\r\n if (accessor.type === AccessorType.VEC4) {\r\n babylonMesh.hasVertexAlpha = true;\r\n }\r\n });\r\n\r\n return Promise.all(promises).then(() => {\r\n return babylonGeometry;\r\n });\r\n }\r\n\r\n private _createMorphTargets(context: string, node: INode, mesh: IMesh, primitive: IMeshPrimitive, babylonMesh: Mesh): void {\r\n if (!primitive.targets || !this._parent.loadMorphTargets) {\r\n return;\r\n }\r\n\r\n if (node._numMorphTargets == undefined) {\r\n node._numMorphTargets = primitive.targets.length;\r\n } else if (primitive.targets.length !== node._numMorphTargets) {\r\n throw new Error(`${context}: Primitives do not have the same number of targets`);\r\n }\r\n\r\n const targetNames = mesh.extras ? mesh.extras.targetNames : null;\r\n\r\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n babylonMesh.morphTargetManager = new MorphTargetManager(this._babylonScene);\r\n babylonMesh.morphTargetManager._parentContainer = this._assetContainer;\r\n this._babylonScene._blockEntityCollection = false;\r\n\r\n babylonMesh.morphTargetManager.areUpdatesFrozen = true;\r\n\r\n for (let index = 0; index < primitive.targets.length; index++) {\r\n const weight = node.weights ? node.weights[index] : mesh.weights ? mesh.weights[index] : 0;\r\n const name = targetNames ? targetNames[index] : `morphTarget${index}`;\r\n babylonMesh.morphTargetManager.addTarget(new MorphTarget(name, weight, babylonMesh.getScene()));\r\n // TODO: tell the target whether it has positions, normals, tangents\r\n }\r\n }\r\n\r\n private _loadMorphTargetsAsync(context: string, primitive: IMeshPrimitive, babylonMesh: Mesh, babylonGeometry: Geometry): Promise<void> {\r\n if (!primitive.targets || !this._parent.loadMorphTargets) {\r\n return Promise.resolve();\r\n }\r\n\r\n const promises = new Array<Promise<unknown>>();\r\n\r\n const morphTargetManager = babylonMesh.morphTargetManager!;\r\n for (let index = 0; index < morphTargetManager.numTargets; index++) {\r\n const babylonMorphTarget = morphTargetManager.getTarget(index);\r\n promises.push(this._loadMorphTargetVertexDataAsync(`${context}/targets/${index}`, babylonGeometry, primitive.targets[index], babylonMorphTarget));\r\n }\r\n\r\n return Promise.all(promises).then(() => {\r\n morphTargetManager.areUpdatesFrozen = false;\r\n });\r\n }\r\n\r\n private async _loadMorphTargetVertexDataAsync(\r\n context: string,\r\n babylonGeometry: Geometry,\r\n attributes: { [name: string]: number },\r\n babylonMorphTarget: MorphTarget\r\n ): Promise<void> {\r\n const promises = new Array<Promise<unknown>>();\r\n\r\n const loadAttribute = (attribute: string, kind: string, setData: (babylonVertexBuffer: VertexBuffer, data: Float32Array) => void) => {\r\n if (attributes[attribute] == undefined) {\r\n return;\r\n }\r\n\r\n const babylonVertexBuffer = babylonGeometry.getVertexBuffer(kind);\r\n if (!babylonVertexBuffer) {\r\n return;\r\n }\r\n\r\n const accessor = ArrayItem.Get(`${context}/${attribute}`, this._gltf.accessors, attributes[attribute]);\r\n promises.push(\r\n this._loadFloatAccessorAsync(`/accessors/${accessor.index}`, accessor).then((data) => {\r\n setData(babylonVertexBuffer, data);\r\n })\r\n );\r\n };\r\n\r\n loadAttribute(\"POSITION\", VertexBuffer.PositionKind, (babylonVertexBuffer, data) => {\r\n const positions = new Float32Array(data.length);\r\n babylonVertexBuffer.forEach(data.length, (value, index) => {\r\n positions[index] = data[index] + value;\r\n });\r\n\r\n babylonMorphTarget.setPositions(positions);\r\n });\r\n\r\n loadAttribute(\"NORMAL\", VertexBuffer.NormalKind, (babylonVertexBuffer, data) => {\r\n const normals = new Float32Array(data.length);\r\n babylonVertexBuffer.forEach(normals.length, (value, index) => {\r\n normals[index] = data[index] + value;\r\n });\r\n\r\n babylonMorphTarget.setNormals(normals);\r\n });\r\n\r\n loadAttribute(\"TANGENT\", VertexBuffer.TangentKind, (babylonVertexBuffer, data) => {\r\n const tangents = new Float32Array((data.length / 3) * 4);\r\n let dataIndex = 0;\r\n babylonVertexBuffer.forEach((data.length / 3) * 4, (value, index) => {\r\n // Tangent data for morph targets is stored as xyz delta.\r\n // The vertexData.tangent is stored as xyzw.\r\n // So we need to skip every fourth vertexData.tangent.\r\n if ((index + 1) % 4 !== 0) {\r\n tangents[dataIndex] = data[dataIndex] + value;\r\n dataIndex++;\r\n }\r\n });\r\n babylonMorphTarget.setTangents(tangents);\r\n });\r\n\r\n loadAttribute(\"TEXCOORD_0\", VertexBuffer.UVKind, (babylonVertexBuffer, data) => {\r\n const uvs = new Float32Array(data.length);\r\n babylonVertexBuffer.forEach(data.length, (value, index) => {\r\n uvs[index] = data[index] + value;\r\n });\r\n\r\n babylonMorphTarget.setUVs(uvs);\r\n });\r\n\r\n loadAttribute(\"TEXCOORD_1\", VertexBuffer.UV2Kind, (babylonVertexBuffer, data) => {\r\n const uvs = new Float32Array(data.length);\r\n babylonVertexBuffer.forEach(data.length, (value, index) => {\r\n uvs[index] = data[index] + value;\r\n });\r\n\r\n babylonMorphTarget.setUV2s(uvs);\r\n });\r\n\r\n loadAttribute(\"COLOR_0\", VertexBuffer.ColorKind, (babylonVertexBuffer, data) => {\r\n let colors = null;\r\n const componentSize = babylonVertexBuffer.getSize();\r\n if (componentSize === 3) {\r\n colors = new Float32Array((data.length / 3) * 4);\r\n babylonVertexBuffer.forEach(data.length, (value, index) => {\r\n const pixid = Math.floor(index / 3);\r\n const channel = index % 3;\r\n colors[4 * pixid + channel] = data[3 * pixid + channel] + value;\r\n });\r\n for (let i = 0; i < data.length / 3; ++i) {\r\n colors[4 * i + 3] = 1;\r\n }\r\n } else if (componentSize === 4) {\r\n colors = new Float32Array(data.length);\r\n babylonVertexBuffer.forEach(data.length, (value, index) => {\r\n colors[index] = data[index] + value;\r\n });\r\n } else {\r\n throw new Error(`${context}: Invalid number of components (${componentSize}) for COLOR_0 attribute`);\r\n }\r\n babylonMorphTarget.setColors(colors);\r\n });\r\n\r\n return await Promise.all(promises).then(() => {});\r\n }\r\n\r\n private static _LoadTransform(node: INode, babylonNode: TransformNode): void {\r\n // Ignore the TRS of skinned nodes.\r\n // See https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins (second implementation note)\r\n if (node.skin != undefined) {\r\n return;\r\n }\r\n\r\n let position = Vector3.Zero();\r\n let rotation = Quaternion.Identity();\r\n let scaling = Vector3.One();\r\n\r\n if (node.matrix) {\r\n const matrix = Matrix.FromArray(node.matrix);\r\n matrix.decompose(scaling, rotation, position);\r\n } else {\r\n if (node.translation) {\r\n position = Vector3.FromArray(node.translation);\r\n }\r\n if (node.rotation) {\r\n rotation = Quaternion.FromArray(node.rotation);\r\n }\r\n if (node.scale) {\r\n scaling = Vector3.FromArray(node.scale);\r\n }\r\n }\r\n\r\n babylonNode.position = position;\r\n babylonNode.rotationQuaternion = rotation;\r\n babylonNode.scaling = scaling;\r\n }\r\n\r\n private _loadSkinAsync(context: string, node: INode, skin: ISkin, assign: (babylonSkeleton: Skeleton) => void): Promise<void> {\r\n if (!this._parent.loadSkins) {\r\n return Promise.resolve();\r\n }\r\n\r\n const extensionPromise = this._extensionsLoadSkinAsync(context, node, skin);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n if (skin._data) {\r\n assign(skin._data.babylonSkeleton);\r\n return skin._data.promise;\r\n }\r\n\r\n const skeletonId = `skeleton${skin.index}`;\r\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n const babylonSkeleton = new Skeleton(skin.name || skeletonId, skeletonId, this._babylonScene);\r\n babylonSkeleton._parentContainer = this._assetContainer;\r\n this._babylonScene._blockEntityCollection = false;\r\n\r\n this._loadBones(context, skin, babylonSkeleton);\r\n const promise = this._loadSkinInverseBindMatricesDataAsync(context, skin).then((inverseBindMatricesData) => {\r\n this._updateBoneMatrices(babylonSkeleton, inverseBindMatricesData);\r\n });\r\n\r\n skin._data = {\r\n babylonSkeleton: babylonSkeleton,\r\n promise: promise,\r\n };\r\n\r\n assign(babylonSkeleton);\r\n\r\n return promise;\r\n }\r\n\r\n private _loadBones(context: string, skin: ISkin, babylonSkeleton: Skeleton): void {\r\n if (skin.skeleton == undefined || this._parent.alwaysComputeSkeletonRootNode) {\r\n const rootNode = this._findSkeletonRootNode(`${context}/joints`, skin.joints);\r\n if (rootNode) {\r\n if (skin.skeleton === undefined) {\r\n skin.skeleton = rootNode.index;\r\n } else {\r\n const isParent = (a: INode, b: INode): boolean => {\r\n for (; b.parent; b = b.parent) {\r\n if (b.parent === a) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n\r\n const skeletonNode = ArrayItem.Get(`${context}/skeleton`, this._gltf.nodes, skin.skeleton);\r\n if (skeletonNode !== rootNode && !isParent(skeletonNode, rootNode)) {\r\n Logger.Warn(`${context}/skeleton: Overriding with nearest common ancestor as skeleton node is not a common root`);\r\n skin.skeleton = rootNode.index;\r\n }\r\n }\r\n } else {\r\n Logger.Warn(`${context}: Failed to find common root`);\r\n }\r\n }\r\n\r\n const babylonBones: { [index: number]: Bone } = {};\r\n for (const index of skin.joints) {\r\n const node = ArrayItem.Get(`${context}/joints/${index}`, this._gltf.nodes, index);\r\n this._loadBone(node, skin, babylonSkeleton, babylonBones);\r\n }\r\n }\r\n\r\n private _findSkeletonRootNode(context: string, joints: Array<number>): Nullable<INode> {\r\n if (joints.length === 0) {\r\n return null;\r\n }\r\n\r\n const paths: { [joint: number]: Array<INode> } = {};\r\n for (const index of joints) {\r\n const path: INode[] = [];\r\n let node = ArrayItem.Get(`${context}/${index}`, this._gltf.nodes, index);\r\n while (node.index !== -1) {\r\n path.unshift(node);\r\n node = node.parent!;\r\n }\r\n paths[index] = path;\r\n }\r\n\r\n let rootNode: Nullable<INode> = null;\r\n for (let i = 0; ; ++i) {\r\n let path = paths[joints[0]];\r\n if (i >= path.length) {\r\n return rootNode;\r\n }\r\n\r\n const node = path[i];\r\n for (let j = 1; j < joints.length; ++j) {\r\n path = paths[joints[j]];\r\n if (i >= path.length || node !== path[i]) {\r\n return rootNode;\r\n }\r\n }\r\n\r\n rootNode = node;\r\n }\r\n }\r\n\r\n private _loadBone(node: INode, skin: ISkin, babylonSkeleton: Skeleton, babylonBones: { [index: number]: Bone }): Bone {\r\n node._isJoint = true;\r\n\r\n let babylonBone = babylonBones[node.index];\r\n if (babylonBone) {\r\n return babylonBone;\r\n }\r\n\r\n let parentBabylonBone: Nullable<Bone> = null;\r\n if (node.index !== skin.skeleton) {\r\n if (node.parent && node.parent.index !== -1) {\r\n parentBabylonBone = this._loadBone(node.parent, skin, babylonSkeleton, babylonBones);\r\n } else if (skin.skeleton !== undefined) {\r\n Logger.Warn(`/skins/${skin.index}/skeleton: Skeleton node is not a common root`);\r\n }\r\n }\r\n\r\n const boneIndex = skin.joints.indexOf(node.index);\r\n babylonBone = new Bone(node.name || `joint${node.index}`, babylonSkeleton, parentBabylonBone, this._getNodeMatrix(node), null, null, boneIndex);\r\n babylonBones[node.index] = babylonBone;\r\n\r\n // Wait until the scene is loaded to ensure the transform nodes are loaded.\r\n this._postSceneLoadActions.push(() => {\r\n // Link the Babylon bone with the corresponding Babylon transform node.\r\n // A glTF joint is a pointer to a glTF node in the glTF node hierarchy similar to Unity3D.\r\n babylonBone.linkTransformNode(node._babylonTransformNode!);\r\n });\r\n\r\n return babylonBone;\r\n }\r\n\r\n private _loadSkinInverseBindMatricesDataAsync(context: string, skin: ISkin): Promise<Nullable<Float32Array>> {\r\n if (skin.inverseBindMatrices == undefined) {\r\n return Promise.resolve(null);\r\n }\r\n\r\n const accessor = ArrayItem.Get(`${context}/inverseBindMatrices`, this._gltf.accessors, skin.inverseBindMatrices);\r\n return this._loadFloatAccessorAsync(`/accessors/${accessor.index}`, accessor);\r\n }\r\n\r\n private _updateBoneMatrices(babylonSkeleton: Skeleton, inverseBindMatricesData: Nullable<Float32Array>): void {\r\n for (const babylonBone of babylonSkeleton.bones) {\r\n const baseMatrix = Matrix.Identity();\r\n const boneIndex = babylonBone._index!;\r\n if (inverseBindMatricesData && boneIndex !== -1) {\r\n Matrix.FromArrayToRef(inverseBindMatricesData, boneIndex * 16, baseMatrix);\r\n baseMatrix.invertToRef(baseMatrix);\r\n }\r\n\r\n const babylonParentBone = babylonBone.getParent();\r\n if (babylonParentBone) {\r\n baseMatrix.multiplyToRef(babylonParentBone.getAbsoluteInverseBindMatrix(), baseMatrix);\r\n }\r\n\r\n babylonBone.updateMatrix(baseMatrix, false, false);\r\n babylonBone._updateAbsoluteBindMatrices(undefined, false);\r\n }\r\n }\r\n\r\n private _getNodeMatrix(node: INode): Matrix {\r\n return node.matrix\r\n ? Matrix.FromArray(node.matrix)\r\n : Matrix.Compose(\r\n node.scale ? Vector3.FromArray(node.scale) : Vector3.One(),\r\n node.rotation ? Quaternion.FromArray(node.rotation) : Quaternion.Identity(),\r\n node.translation ? Vector3.FromArray(node.translation) : Vector3.Zero()\r\n );\r\n }\r\n\r\n /**\r\n * Loads a glTF camera.\r\n * @param context The context when loading the asset\r\n * @param camera The glTF camera property\r\n * @param assign A function called synchronously after parsing the glTF properties\r\n * @returns A promise that resolves with the loaded Babylon camera when the load is complete\r\n */\r\n public loadCameraAsync(context: string, camera: ICamera, assign: (babylonCamera: Camera) => void = () => {}): Promise<Camera> {\r\n const extensionPromise = this._extensionsLoadCameraAsync(context, camera, assign);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n const promises = new Array<Promise<unknown>>();\r\n\r\n this.logOpen(`${context} ${camera.name || \"\"}`);\r\n\r\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n const babylonCamera = new FreeCamera(camera.name || `camera${camera.index}`, Vector3.Zero(), this._babylonScene, false);\r\n babylonCamera._parentContainer = this._assetContainer;\r\n this._babylonScene._blockEntityCollection = false;\r\n camera._babylonCamera = babylonCamera;\r\n\r\n // glTF cameras look towards the local -Z axis.\r\n babylonCamera.setTarget(new Vector3(0, 0, -1));\r\n\r\n switch (camera.type) {\r\n case CameraType.PERSPECTIVE: {\r\n const perspective = camera.perspective;\r\n if (!perspective) {\r\n throw new Error(`${context}: Camera perspective properties are missing`);\r\n }\r\n\r\n babylonCamera.fov = perspective.yfov;\r\n babylonCamera.minZ = perspective.znear;\r\n babylonCamera.maxZ = perspective.zfar || 0;\r\n break;\r\n }\r\n case CameraType.ORTHOGRAPHIC: {\r\n if (!camera.orthographic) {\r\n throw new Error(`${context}: Camera orthographic properties are missing`);\r\n }\r\n\r\n babylonCamera.mode = Camera.ORTHOGRAPHIC_CAMERA;\r\n babylonCamera.orthoLeft = -camera.orthographic.xmag;\r\n babylonCamera.orthoRight = camera.orthographic.xmag;\r\n babylonCamera.orthoBottom = -camera.orthographic.ymag;\r\n babylonCamera.orthoTop = camera.orthographic.ymag;\r\n babylonCamera.minZ = camera.orthographic.znear;\r\n babylonCamera.maxZ = camera.orthographic.zfar;\r\n break;\r\n }\r\n default: {\r\n throw new Error(`${context}: Invalid camera type (${camera.type})`);\r\n }\r\n }\r\n\r\n GLTFLoader.AddPointerMetadata(babylonCamera, context);\r\n this._parent.onCameraLoadedObservable.notifyObservers(babylonCamera);\r\n assign(babylonCamera);\r\n\r\n this.logClose();\r\n\r\n return Promise.all(promises).then(() => {\r\n return babylonCamera;\r\n });\r\n }\r\n\r\n private _loadAnimationsAsync(): Promise<void> {\r\n this._parent._startPerformanceCounter(\"Load animations\");\r\n\r\n const animations = this._gltf.animations;\r\n if (!animations) {\r\n return Promise.resolve();\r\n }\r\n\r\n const promises = new Array<Promise<void>>();\r\n\r\n for (let index = 0; index < animations.length; index++) {\r\n const animation = animations[index];\r\n promises.push(\r\n this.loadAnimationAsync(`/animations/${animation.index}`, animation).then((animationGroup) => {\r\n // Delete the animation group if it ended up not having any animations in it.\r\n if (animationGroup.targetedAnimations.length === 0) {\r\n animationGroup.dispose();\r\n }\r\n })\r\n );\r\n }\r\n\r\n return Promise.all(promises).then(() => {\r\n this._parent._endPerformanceCounter(\"Load animations\");\r\n });\r\n }\r\n\r\n /**\r\n * Loads a glTF animation.\r\n * @param context The context when loading the asset\r\n * @param animation The glTF animation property\r\n * @returns A promise that resolves with the loaded Babylon animation group when the load is complete\r\n */\r\n public loadAnimationAsync(context: string, animation: IAnimation): Promise<AnimationGroup> {\r\n this._parent._startPerformanceCounter(\"Load animation\");\r\n\r\n const promise = this._extensionsLoadAnimationAsync(context, animation);\r\n if (promise) {\r\n return promise;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n return LazyAnimationGroupModulePromise.value.then(({ AnimationGroup }) => {\r\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n const babylonAnimationGroup = new AnimationGroup(animation.name || `animation${animation.index}`, this._babylonScene);\r\n babylonAnimationGroup._parentContainer = this._assetContainer;\r\n this._babylonScene._blockEntityCollection = false;\r\n animation._babylonAnimationGroup = babylonAnimationGroup;\r\n\r\n const promises = new Array<Promise<unknown>>();\r\n\r\n ArrayItem.Assign(animation.channels);\r\n ArrayItem.Assign(animation.samplers);\r\n\r\n for (const channel of animation.channels) {\r\n promises.push(\r\n this._loadAnimationChannelAsync(`${context}/channels/${channel.index}`, context, animation, channel, (babylonTarget, babylonAnimation) => {\r\n babylonTarget.animations = babylonTarget.animations || [];\r\n babylonTarget.animations.push(babylonAnimation);\r\n babylonAnimationGroup.addTargetedAnimation(babylonAnimation, babylonTarget);\r\n })\r\n );\r\n }\r\n\r\n this._parent._endPerformanceCounter(\"Load animation\");\r\n\r\n return Promise.all(promises).then(() => {\r\n babylonAnimationGroup.normalize(0);\r\n return babylonAnimationGroup;\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * @hidden\r\n * Loads a glTF animation channel.\r\n * @param context The context when loading the asset\r\n * @param animationContext The context of the animation when loading the asset\r\n * @param animation The glTF animation property\r\n * @param channel The glTF animation channel property\r\n * @param onLoad Called for each animation loaded\r\n * @returns A void promise that resolves when the load is complete\r\n */\r\n public _loadAnimationChannelAsync(\r\n context: string,\r\n animationContext: string,\r\n animation: IAnimation,\r\n channel: IAnimationChannel,\r\n onLoad: (babylonAnimatable: IAnimatable, babylonAnimation: Animation) => void\r\n ): Promise<void> {\r\n const promise = this._extensionsLoadAnimationChannelAsync(context, animationContext, animation, channel, onLoad);\r\n if (promise) {\r\n return promise;\r\n }\r\n\r\n if (channel.target.node == undefined) {\r\n return Promise.resolve();\r\n }\r\n\r\n const targetNode = ArrayItem.Get(`${context}/target/node`, this._gltf.nodes, channel.target.node);\r\n const channelTargetPath = channel.target.path;\r\n const pathIsWeights = channelTargetPath === AnimationChannelTargetPath.WEIGHTS;\r\n\r\n // Ignore animations that have no animation targets.\r\n if ((pathIsWeights && !targetNode._numMorphTargets) || (!pathIsWeights && !targetNode._babylonTransformNode)) {\r\n return Promise.resolve();\r\n }\r\n\r\n // Don't load node animations if disabled.\r\n if (!this._parent.loadNodeAnimations && !pathIsWeights && !targetNode._isJoint) {\r\n return Promise.resolve();\r\n }\r\n\r\n // async-load the animation sampler to provide the interpolation of the channelTargetPath\r\n return LazyLoaderAnimationModulePromise.value.then(() => {\r\n let properties: IInterpolationPropertyInfo[];\r\n switch (channelTargetPath) {\r\n case AnimationChannelTargetPath.TRANSLATION: {\r\n properties = GetMappingForKey(\"/nodes/{}/translation\")?.interpolation!;\r\n break;\r\n }\r\n case AnimationChannelTargetPath.ROTATION: {\r\n properties = GetMappingForKey(\"/nodes/{}/rotation\")?.interpolation!;\r\n break;\r\n }\r\n case AnimationChannelTargetPath.SCALE: {\r\n properties = GetMappingForKey(\"/nodes/{}/scale\")?.interpolation!;\r\n break;\r\n }\r\n case AnimationChannelTargetPath.WEIGHTS: {\r\n properties = GetMappingForKey(\"/nodes/{}/weights\")?.interpolation!;\r\n break;\r\n }\r\n default: {\r\n throw new Error(`${context}/target/path: Invalid value (${channel.target.path})`);\r\n }\r\n }\r\n // stay safe\r\n if (!properties) {\r\n throw new Error(`${context}/target/path: Could not find interpolation properties for target path (${channel.target.path})`);\r\n }\r\n\r\n const targetInfo: IObjectInfo<IInterpolationPropertyInfo[]> = {\r\n object: targetNode,\r\n info: properties,\r\n };\r\n\r\n return this._loadAnimationChannelFromTargetInfoAsync(context, animationContext, animation, channel, targetInfo, onLoad);\r\n });\r\n }\r\n\r\n /**\r\n * @hidden\r\n * Loads a glTF animation channel.\r\n * @param context The context when loading the asset\r\n * @param animationContext The context of the animation when loading the asset\r\n * @param animation The glTF animation property\r\n * @param channel The glTF animation channel property\r\n * @param targetInfo The glTF target and properties\r\n * @param onLoad Called for each animation loaded\r\n * @returns A void promise that resolves when the load is complete\r\n */\r\n public _loadAnimationChannelFromTargetInfoAsync(\r\n context: string,\r\n animationContext: string,\r\n animation: IAnimation,\r\n channel: IAnimationChannel,\r\n targetInfo: IObjectInfo<IInterpolationPropertyInfo[]>,\r\n onLoad: (babylonAnimatable: IAnimatable, babylonAnimation: Animation) => void\r\n ): Promise<void> {\r\n const fps = this.parent.targetFps;\r\n const invfps = 1 / fps;\r\n\r\n const sampler = ArrayItem.Get(`${context}/sampler`, animation.samplers, channel.sampler);\r\n return this._loadAnimationSamplerAsync(`${animationContext}/samplers/${channel.sampler}`, sampler).then((data) => {\r\n let numAnimations = 0;\r\n\r\n const target = targetInfo.object;\r\n const propertyInfos = targetInfo.info;\r\n // Extract the corresponding values from the read value.\r\n // GLTF values may be dispatched to several Babylon properties.\r\n // For example, baseColorFactor [`r`, `g`, `b`, `a`] is dispatched to\r\n // - albedoColor as Color3(`r`, `g`, `b`)\r\n // - alpha as `a`\r\n for (const propertyInfo of propertyInfos) {\r\n const stride = propertyInfo.getStride(target);\r\n const input = data.input;\r\n const output = data.output;\r\n const keys = new Array<IAnimationKey>(input.length);\r\n let outputOffset = 0;\r\n\r\n switch (data.interpolation) {\r\n case AnimationSamplerInterpolation.STEP: {\r\n for (let index = 0; index < input.length; index++) {\r\n const value = propertyInfo.getValue(target, output, outputOffset, 1);\r\n outputOffset += stride;\r\n\r\n keys[index] = {\r\n frame: input[index] * fps,\r\n value: value,\r\n interpolation: AnimationKeyInterpolation.STEP,\r\n };\r\n }\r\n break;\r\n }\r\n case AnimationSamplerInterpolation.CUBICSPLINE: {\r\n for (let index = 0; index < input.length; index++) {\r\n const inTangent = propertyInfo.getValue(target, output, outputOffset, invfps);\r\n outputOffset += stride;\r\n const value = propertyInfo.getValue(target, output, outputOffset, 1);\r\n outputOffset += stride;\r\n const outTangent = propertyInfo.getValue(target, output, outputOffset, invfps);\r\n outputOffset += stride;\r\n\r\n keys[index] = {\r\n frame: input[index] * fps,\r\n inTangent: inTangent,\r\n value: value,\r\n outTangent: outTangent,\r\n };\r\n }\r\n break;\r\n }\r\n case AnimationSamplerInterpolation.LINEAR: {\r\n for (let index = 0; index < input.length; index++) {\r\n const value = propertyInfo.getValue(target, output, outputOffset, 1);\r\n outputOffset += stride;\r\n\r\n keys[index] = {\r\n frame: input[index] * fps,\r\n value: value,\r\n };\r\n }\r\n break;\r\n }\r\n }\r\n\r\n if (outputOffset > 0) {\r\n const name = `${animation.name || `animation${animation.index}`}_channel${channel.index}_${numAnimations}`;\r\n const babylonAnimations = propertyInfo.buildAnimations(target, name, fps, keys);\r\n for (const babylonAnimation of babylonAnimations) {\r\n numAnimations++;\r\n onLoad(babylonAnimation.babylonAnimatable, babylonAnimation.babylonAnimation);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _loadAnimationSamplerAsync(context: string, sampler: IAnimationSampler): Promise<_IAnimationSamplerData> {\r\n if (sampler._data) {\r\n return sampler._data;\r\n }\r\n\r\n const interpolation = sampler.interpolation || AnimationSamplerInterpolation.LINEAR;\r\n switch (interpolation) {\r\n case AnimationSamplerInterpolation.STEP:\r\n case AnimationSamplerInterpolation.LINEAR:\r\n case AnimationSamplerInterpolation.CUBICSPLINE: {\r\n break;\r\n }\r\n default: {\r\n throw new Error(`${context}/interpolation: Invalid value (${sampler.interpolation})`);\r\n }\r\n }\r\n\r\n const inputAccessor = ArrayItem.Get(`${context}/input`, this._gltf.accessors, sampler.input);\r\n const outputAccessor = ArrayItem.Get(`${context}/output`, this._gltf.accessors, sampler.output);\r\n sampler._data = Promise.all([\r\n this._loadFloatAccessorAsync(`/accessors/${inputAccessor.index}`, inputAccessor),\r\n this._loadFloatAccessorAsync(`/accessors/${outputAccessor.index}`, outputAccessor),\r\n ]).then(([inputData, outputData]) => {\r\n return {\r\n input: inputData,\r\n interpolation: interpolation,\r\n output: outputData,\r\n };\r\n });\r\n\r\n return sampler._data;\r\n }\r\n\r\n /**\r\n * Loads a glTF buffer.\r\n * @param context The context when loading the asset\r\n * @param buffer The glTF buffer property\r\n * @param byteOffset The byte offset to use\r\n * @param byteLength The byte length to use\r\n * @returns A promise that resolves with the loaded data when the load is complete\r\n */\r\n public loadBufferAsync(context: string, buffer: IBuffer, byteOffset: number, byteLength: number): Promise<ArrayBufferView> {\r\n const extensionPromise = this._extensionsLoadBufferAsync(context, buffer, byteOffset, byteLength);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n if (!buffer._data) {\r\n if (buffer.uri) {\r\n buffer._data = this.loadUriAsync(`${context}/uri`, buffer, buffer.uri);\r\n } else {\r\n if (!this._bin) {\r\n throw new Error(`${context}: Uri is missing or the binary glTF is missing its binary chunk`);\r\n }\r\n\r\n buffer._data = this._bin.readAsync(0, buffer.byteLength);\r\n }\r\n }\r\n\r\n return buffer._data.then((data) => {\r\n try {\r\n return new Uint8Array(data.buffer, data.byteOffset + byteOffset, byteLength);\r\n } catch (e) {\r\n throw new Error(`${context}: ${e.message}`, { cause: e });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Loads a glTF buffer view.\r\n * @param context The context when loading the asset\r\n * @param bufferView The glTF buffer view property\r\n * @returns A promise that resolves with the loaded data when the load is complete\r\n */\r\n public loadBufferViewAsync(context: string, bufferView: IBufferView): Promise<ArrayBufferView> {\r\n const extensionPromise = this._extensionsLoadBufferViewAsync(context, bufferView);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n if (bufferView._data) {\r\n return bufferView._data;\r\n }\r\n\r\n const buffer = ArrayItem.Get(`${context}/buffer`, this._gltf.buffers, bufferView.buffer);\r\n bufferView._data = this.loadBufferAsync(`/buffers/${buffer.index}`, buffer, bufferView.byteOffset || 0, bufferView.byteLength);\r\n\r\n return bufferView._data;\r\n }\r\n\r\n private _loadAccessorAsync(context: string, accessor: IAccessor, constructor: TypedArrayConstructor): Promise<ArrayBufferView> {\r\n if (accessor._data) {\r\n return accessor._data;\r\n }\r\n\r\n const numComponents = GLTFLoader._GetNumComponents(context, accessor.type);\r\n const byteStride = numComponents * VertexBuffer.GetTypeByteLength(accessor.componentType);\r\n const length = numComponents * accessor.count;\r\n\r\n if (accessor.bufferView == undefined) {\r\n accessor._data = Promise.resolve(new constructor(length));\r\n } else {\r\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._gltf.bufferViews, accessor.bufferView);\r\n accessor._data = this.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView).then((data) => {\r\n if (accessor.componentType === AccessorComponentType.FLOAT && !accessor.normalized && (!bufferView.byteStride || bufferView.byteStride === byteStride)) {\r\n return GLTFLoader._GetTypedArray(context, accessor.componentType, data, accessor.byteOffset, length);\r\n } else {\r\n const typedArray = new constructor(length);\r\n VertexBuffer.ForEach(\r\n data,\r\n accessor.byteOffset || 0,\r\n bufferView.byteStride || byteStride,\r\n numComponents,\r\n accessor.componentType,\r\n typedArray.length,\r\n accessor.normalized || false,\r\n (value, index) => {\r\n typedArray[index] = value;\r\n }\r\n );\r\n return typedArray;\r\n }\r\n });\r\n }\r\n\r\n if (accessor.sparse) {\r\n const sparse = accessor.sparse;\r\n accessor._data = accessor._data.then((data) => {\r\n const typedArray = data as TypedArray;\r\n const indicesBufferView = ArrayItem.Get(`${context}/sparse/indices/bufferView`, this._gltf.bufferViews, sparse.indices.bufferView);\r\n const valuesBufferView = ArrayItem.Get(`${context}/sparse/values/bufferView`, this._gltf.bufferViews, sparse.values.bufferView);\r\n return Promise.all([\r\n this.loadBufferViewAsync(`/bufferViews/${indicesBufferView.index}`, indicesBufferView),\r\n this.loadBufferViewAsync(`/bufferViews/${valuesBufferView.index}`, valuesBufferView),\r\n ]).then(([indicesData, valuesData]) => {\r\n const indices = GLTFLoader._GetTypedArray(\r\n `${context}/sparse/indices`,\r\n sparse.indices.componentType,\r\n indicesData,\r\n sparse.indices.byteOffset,\r\n sparse.count\r\n ) as IndicesArray;\r\n\r\n const sparseLength = numComponents * sparse.count;\r\n let values: TypedArray;\r\n\r\n if (accessor.componentType === AccessorComponentType.FLOAT && !accessor.normalized) {\r\n values = GLTFLoader._GetTypedArray(`${context}/sparse/values`, accessor.componentType, valuesData, sparse.values.byteOffset, sparseLength);\r\n } else {\r\n const sparseData = GLTFLoader._GetTypedArray(`${context}/sparse/values`, accessor.componentType, valuesData, sparse.values.byteOffset, sparseLength);\r\n values = new constructor(sparseLength);\r\n VertexBuffer.ForEach(sparseData, 0, byteStride, numComponents, accessor.componentType, values.length, accessor.normalized || false, (value, index) => {\r\n values[index] = value;\r\n });\r\n }\r\n\r\n let valuesIndex = 0;\r\n for (let indicesIndex = 0; indicesIndex < indices.length; indicesIndex++) {\r\n let dataIndex = indices[indicesIndex] * numComponents;\r\n for (let componentIndex = 0; componentIndex < numComponents; componentIndex++) {\r\n typedArray[dataIndex++] = values[valuesIndex++];\r\n }\r\n }\r\n\r\n return typedArray;\r\n });\r\n });\r\n }\r\n\r\n return accessor._data;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _loadFloatAccessorAsync(context: string, accessor: IAccessor): Promise<Float32Array> {\r\n return this._loadAccessorAsync(context, accessor, Float32Array) as Promise<Float32Array>;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _loadIndicesAccessorAsync(context: string, accessor: IAccessor): Promise<IndicesArray> {\r\n if (accessor.type !== AccessorType.SCALAR) {\r\n throw new Error(`${context}/type: Invalid value ${accessor.type}`);\r\n }\r\n\r\n if (\r\n accessor.componentType !== AccessorComponentType.UNSIGNED_BYTE &&\r\n accessor.componentType !== AccessorComponentType.UNSIGNED_SHORT &&\r\n accessor.componentType !== AccessorComponentType.UNSIGNED_INT\r\n ) {\r\n throw new Error(`${context}/componentType: Invalid value ${accessor.componentType}`);\r\n }\r\n\r\n if (accessor._data) {\r\n return accessor._data as Promise<IndicesArray>;\r\n }\r\n\r\n if (accessor.sparse) {\r\n const constructor = GLTFLoader._GetTypedArrayConstructor(`${context}/componentType`, accessor.componentType);\r\n accessor._data = this._loadAccessorAsync(context, accessor, constructor);\r\n } else {\r\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._gltf.bufferViews, accessor.bufferView);\r\n accessor._data = this.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView).then((data) => {\r\n return GLTFLoader._GetTypedArray(context, accessor.componentType, data, accessor.byteOffset, accessor.count);\r\n });\r\n }\r\n\r\n return accessor._data as Promise<IndicesArray>;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _loadVertexBufferViewAsync(bufferView: IBufferView): Promise<Buffer> {\r\n if (bufferView._babylonBuffer) {\r\n return bufferView._babylonBuffer;\r\n }\r\n\r\n const engine = this._babylonScene.getEngine();\r\n bufferView._babylonBuffer = this.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView).then((data) => {\r\n return new Buffer(engine, data, false);\r\n });\r\n\r\n return bufferView._babylonBuffer;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _loadVertexAccessorAsync(context: string, accessor: IAccessor, kind: string): Promise<VertexBuffer> {\r\n if (accessor._babylonVertexBuffer?.[kind]) {\r\n return accessor._babylonVertexBuffer[kind];\r\n }\r\n\r\n if (!accessor._babylonVertexBuffer) {\r\n accessor._babylonVertexBuffer = {};\r\n }\r\n\r\n const engine = this._babylonScene.getEngine();\r\n\r\n if (accessor.sparse || accessor.bufferView == undefined) {\r\n accessor._babylonVertexBuffer[kind] = this._loadFloatAccessorAsync(context, accessor).then((data) => {\r\n return new VertexBuffer(engine, data, kind, false);\r\n });\r\n } else {\r\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._gltf.bufferViews, accessor.bufferView);\r\n accessor._babylonVertexBuffer[kind] = this._loadVertexBufferViewAsync(bufferView).then((babylonBuffer) => {\r\n const numComponents = GLTFLoader._GetNumComponents(context, accessor.type);\r\n return new VertexBuffer(\r\n engine,\r\n babylonBuffer,\r\n kind,\r\n false,\r\n undefined,\r\n bufferView.byteStride,\r\n undefined,\r\n accessor.byteOffset,\r\n numComponents,\r\n accessor.componentType,\r\n accessor.normalized,\r\n true,\r\n undefined,\r\n true\r\n );\r\n });\r\n }\r\n\r\n return accessor._babylonVertexBuffer[kind];\r\n }\r\n\r\n private _loadMaterialMetallicRoughnessPropertiesAsync(context: string, properties: IMaterialPbrMetallicRoughness, babylonMaterial: Material): Promise<void> {\r\n const promises = new Array<Promise<unknown>>();\r\n const adapter = this._getOrCreateMaterialAdapter(babylonMaterial);\r\n\r\n if (properties) {\r\n // Set base color and alpha using adapter\r\n if (properties.baseColorFactor) {\r\n adapter.baseColor = Color3.FromArray(properties.baseColorFactor);\r\n adapter.geometryOpacity = properties.baseColorFactor[3];\r\n } else {\r\n adapter.baseColor = Color3.White();\r\n }\r\n\r\n // Set metallic and roughness using adapter\r\n adapter.baseMetalness = properties.metallicFactor == undefined ? 1 : properties.metallicFactor;\r\n adapter.specularRoughness = properties.roughnessFactor == undefined ? 1 : properties.roughnessFactor;\r\n\r\n if (properties.baseColorTexture) {\r\n promises.push(\r\n this.loadTextureInfoAsync(`${context}/baseColorTexture`, properties.baseColorTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Base Color)`;\r\n adapter.baseColorTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n if (properties.metallicRoughnessTexture) {\r\n properties.metallicRoughnessTexture.nonColorData = true;\r\n promises.push(\r\n this.loadTextureInfoAsync(`${context}/metallicRoughnessTexture`, properties.metallicRoughnessTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Metallic Roughness)`;\r\n adapter.baseMetalnessTexture = texture;\r\n adapter.specularRoughnessTexture = texture;\r\n })\r\n );\r\n\r\n // Configure texture channel usage using adapter\r\n adapter.useRoughnessFromMetallicTextureGreen = true;\r\n adapter.useMetallicFromMetallicTextureBlue = true;\r\n }\r\n }\r\n\r\n return Promise.all(promises).then(() => {});\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _loadMaterialAsync(\r\n context: string,\r\n material: IMaterial,\r\n babylonMesh: Nullable<Mesh>,\r\n babylonDrawMode: number,\r\n assign: (babylonMaterial: Material) => void = () => {}\r\n ): Promise<Material> {\r\n const extensionPromise = this._extensionsLoadMaterialAsync(context, material, babylonMesh, babylonDrawMode, assign);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n material._data = material._data || {};\r\n let babylonData = material._data[babylonDrawMode];\r\n if (!babylonData) {\r\n this.logOpen(`${context} ${material.name || \"\"}`);\r\n\r\n const babylonMaterial = this.createMaterial(context, material, babylonDrawMode);\r\n\r\n babylonData = {\r\n babylonMaterial: babylonMaterial,\r\n babylonMeshes: [],\r\n promise: this.loadMaterialPropertiesAsync(context, material, babylonMaterial),\r\n };\r\n\r\n material._data[babylonDrawMode] = babylonData;\r\n\r\n GLTFLoader.AddPointerMetadata(babylonMaterial, context);\r\n this._parent.onMaterialLoadedObservable.notifyObservers(babylonMaterial);\r\n\r\n this.logClose();\r\n }\r\n\r\n if (babylonMesh) {\r\n babylonData.babylonMeshes.push(babylonMesh);\r\n\r\n babylonMesh.onDisposeObservable.addOnce(() => {\r\n const index = babylonData.babylonMeshes.indexOf(babylonMesh);\r\n if (index !== -1) {\r\n babylonData.babylonMeshes.splice(index, 1);\r\n }\r\n });\r\n }\r\n\r\n assign(babylonData.babylonMaterial);\r\n\r\n return babylonData.promise.then(() => {\r\n return babylonData.babylonMaterial;\r\n });\r\n }\r\n\r\n private _createDefaultMaterial(name: string, babylonDrawMode: number): Material {\r\n if (!this._pbrMaterialImpl) {\r\n throw new Error(\"PBR Material class not loaded\");\r\n }\r\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n const babylonMaterial = new this._pbrMaterialImpl.materialClass(name, this._babylonScene);\r\n babylonMaterial._parentContainer = this._assetContainer;\r\n this._babylonScene._blockEntityCollection = false;\r\n babylonMaterial.fillMode = babylonDrawMode;\r\n babylonMaterial.transparencyMode = this._pbrMaterialImpl.materialClass.MATERIAL_OPAQUE;\r\n // Create the material adapter and set some default properties.\r\n // We don't need to wait for the promise to resolve here.\r\n const adapter = this._getOrCreateMaterialAdapter(babylonMaterial);\r\n adapter.transparencyAsAlphaCoverage = this._parent.transparencyAsCoverage;\r\n\r\n // Set default metallic and roughness values\r\n adapter.baseMetalness = 1.0;\r\n adapter.specularRoughness = 1.0;\r\n\r\n return babylonMaterial;\r\n }\r\n\r\n /**\r\n * Creates a Babylon material from a glTF material.\r\n * @param context The context when loading the asset\r\n * @param material The glTF material property\r\n * @param babylonDrawMode The draw mode for the Babylon material\r\n * @returns The Babylon material\r\n */\r\n public createMaterial(context: string, material: IMaterial, babylonDrawMode: number): Material {\r\n const extensionMaterial = this._extensionsCreateMaterial(context, material, babylonDrawMode);\r\n if (extensionMaterial) {\r\n return extensionMaterial;\r\n }\r\n\r\n const name = material.name || `material${material.index}`;\r\n const babylonMaterial = this._createDefaultMaterial(name, babylonDrawMode);\r\n\r\n return babylonMaterial;\r\n }\r\n\r\n /**\r\n * Loads properties from a glTF material into a Babylon material.\r\n * @param context The context when loading the asset\r\n * @param material The glTF material property\r\n * @param babylonMaterial The Babylon material\r\n * @returns A promise that resolves when the load is complete\r\n */\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Promise<void> {\r\n const extensionPromise = this._extensionsLoadMaterialPropertiesAsync(context, material, babylonMaterial);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n const promises = new Array<Promise<unknown>>();\r\n\r\n promises.push(this.loadMaterialBasePropertiesAsync(context, material, babylonMaterial));\r\n\r\n if (material.pbrMetallicRoughness) {\r\n promises.push(this._loadMaterialMetallicRoughnessPropertiesAsync(`${context}/pbrMetallicRoughness`, material.pbrMetallicRoughness, babylonMaterial));\r\n }\r\n\r\n this.loadMaterialAlphaProperties(context, material, babylonMaterial);\r\n\r\n return Promise.all(promises).then(() => {});\r\n }\r\n\r\n /**\r\n * Loads the normal, occlusion, and emissive properties from a glTF material into a Babylon material.\r\n * @param context The context when loading the asset\r\n * @param material The glTF material property\r\n * @param babylonMaterial The Babylon material\r\n * @returns A promise that resolves when the load is complete\r\n */\r\n public loadMaterialBasePropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Promise<void> {\r\n const promises = new Array<Promise<unknown>>();\r\n const adapter = this._getOrCreateMaterialAdapter(babylonMaterial);\r\n\r\n // Set emission color using adapter\r\n adapter.emissionColor = material.emissiveFactor ? Color3.FromArray(material.emissiveFactor) : new Color3(0, 0, 0);\r\n\r\n // Set double-sided properties using adapter\r\n if (material.doubleSided) {\r\n adapter.backFaceCulling = false;\r\n adapter.twoSidedLighting = true;\r\n }\r\n\r\n if (material.normalTexture) {\r\n material.normalTexture.nonColorData = true;\r\n promises.push(\r\n this.loadTextureInfoAsync(`${context}/normalTexture`, material.normalTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Normal)`;\r\n adapter.geometryNormalTexture = texture;\r\n if (material.normalTexture?.scale != undefined) {\r\n texture.level = material.normalTexture.scale;\r\n }\r\n })\r\n );\r\n\r\n // Set normal map inversions using adapter\r\n adapter.setNormalMapInversions(!this._babylonScene.useRightHandedSystem, this._babylonScene.useRightHandedSystem);\r\n }\r\n\r\n let aoTexture: BaseTexture;\r\n let aoStrength: number = 1.0;\r\n let emissionTexture: BaseTexture;\r\n\r\n if (material.occlusionTexture) {\r\n material.occlusionTexture.nonColorData = true;\r\n promises.push(\r\n this.loadTextureInfoAsync(`${context}/occlusionTexture`, material.occlusionTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Occlusion)`;\r\n aoTexture = texture;\r\n })\r\n );\r\n\r\n if (material.occlusionTexture.strength != undefined) {\r\n aoStrength = material.occlusionTexture.strength;\r\n }\r\n }\r\n\r\n if (material.emissiveTexture) {\r\n promises.push(\r\n this.loadTextureInfoAsync(`${context}/emissiveTexture`, material.emissiveTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Emissive)`;\r\n emissionTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n return Promise.all(promises).then(() => {\r\n // Set ambient occlusion and emissive textures using adapter\r\n if (aoTexture) {\r\n adapter.ambientOcclusionTexture = aoTexture;\r\n adapter.ambientOcclusionTextureStrength = aoStrength;\r\n }\r\n\r\n if (emissionTexture) {\r\n adapter.emissionColorTexture = emissionTexture;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Loads the alpha properties from a glTF material into a Babylon material.\r\n * Must be called after the setting the albedo texture of the Babylon material when the material has an albedo texture.\r\n * @param context The context when loading the asset\r\n * @param material The glTF material property\r\n * @param babylonMaterial The Babylon material\r\n */\r\n public loadMaterialAlphaProperties(context: string, material: IMaterial, babylonMaterial: Material): void {\r\n if (!this._pbrMaterialImpl) {\r\n throw new Error(`${context}: Material type not supported`);\r\n }\r\n\r\n const adapter = this._getOrCreateMaterialAdapter(babylonMaterial);\r\n const baseColorTexture = adapter.baseColorTexture;\r\n\r\n const alphaMode = material.alphaMode || MaterialAlphaMode.OPAQUE;\r\n switch (alphaMode) {\r\n case MaterialAlphaMode.OPAQUE: {\r\n babylonMaterial.transparencyMode = this._pbrMaterialImpl.materialClass.MATERIAL_OPAQUE;\r\n babylonMaterial.alpha = 1.0; // Force alpha to 1.0 for opaque mode.\r\n break;\r\n }\r\n case MaterialAlphaMode.MASK: {\r\n babylonMaterial.transparencyMode = this._pbrMaterialImpl.materialClass.MATERIAL_ALPHATEST;\r\n adapter.alphaCutOff = material.alphaCutoff == undefined ? 0.5 : material.alphaCutoff;\r\n if (baseColorTexture) {\r\n baseColorTexture.hasAlpha = true;\r\n }\r\n break;\r\n }\r\n case MaterialAlphaMode.BLEND: {\r\n babylonMaterial.transparencyMode = this._pbrMaterialImpl.materialClass.MATERIAL_ALPHABLEND;\r\n if (baseColorTexture) {\r\n baseColorTexture.hasAlpha = true;\r\n adapter.useAlphaFromBaseColorTexture = true;\r\n }\r\n break;\r\n }\r\n default: {\r\n throw new Error(`${context}/alphaMode: Invalid value (${material.alphaMode})`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Loads a glTF texture info.\r\n * @param context The context when loading the asset\r\n * @param textureInfo The glTF texture info property\r\n * @param assign A function called synchronously after parsing the glTF properties\r\n * @returns A promise that resolves with the loaded Babylon texture when the load is complete\r\n */\r\n public loadTextureInfoAsync(context: string, textureInfo: ITextureInfo, assign: (babylonTexture: BaseTexture) => void = () => {}): Promise<BaseTexture> {\r\n const extensionPromise = this._extensionsLoadTextureInfoAsync(context, textureInfo, assign);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n this.logOpen(`${context}`);\r\n\r\n if (textureInfo.texCoord! >= 6) {\r\n throw new Error(`${context}/texCoord: Invalid value (${textureInfo.texCoord})`);\r\n }\r\n\r\n const texture = ArrayItem.Get(`${context}/index`, this._gltf.textures, textureInfo.index);\r\n texture._textureInfo = textureInfo;\r\n\r\n const promise = this._loadTextureAsync(`/textures/${textureInfo.index}`, texture, (babylonTexture) => {\r\n babylonTexture.coordinatesIndex = textureInfo.texCoord || 0;\r\n GLTFLoader.AddPointerMetadata(babylonTexture, context);\r\n this._parent.onTextureLoadedObservable.notifyObservers(babylonTexture);\r\n assign(babylonTexture);\r\n });\r\n\r\n this.logClose();\r\n\r\n return promise;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _loadTextureAsync(context: string, texture: ITexture, assign: (babylonTexture: BaseTexture) => void = () => {}): Promise<BaseTexture> {\r\n const extensionPromise = this._extensionsLoadTextureAsync(context, texture, assign);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n this.logOpen(`${context} ${texture.name || \"\"}`);\r\n\r\n const sampler = texture.sampler == undefined ? GLTFLoader.DefaultSampler : ArrayItem.Get(`${context}/sampler`, this._gltf.samplers, texture.sampler);\r\n const image = ArrayItem.Get(`${context}/source`, this._gltf.images, texture.source);\r\n const promise = this._createTextureAsync(context, sampler, image, assign, undefined, !texture._textureInfo.nonColorData);\r\n\r\n this.logClose();\r\n\r\n return promise;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _createTextureAsync(\r\n context: string,\r\n sampler: ISampler,\r\n image: IImage,\r\n assign: (babylonTexture: BaseTexture) => void = () => {},\r\n textureLoaderOptions?: unknown,\r\n useSRGBBuffer?: boolean\r\n ): Promise<BaseTexture> {\r\n const samplerData = this._loadSampler(`/samplers/${sampler.index}`, sampler);\r\n\r\n const promises = new Array<Promise<unknown>>();\r\n\r\n const deferred = new Deferred<void>();\r\n this._babylonScene._blockEntityCollection = !!this._assetContainer;\r\n const textureCreationOptions: ITextureCreationOptions = {\r\n noMipmap: samplerData.noMipMaps,\r\n invertY: false,\r\n samplingMode: samplerData.samplingMode,\r\n onLoad: () => {\r\n if (!this._disposed) {\r\n deferred.resolve();\r\n }\r\n },\r\n onError: (message?: string, exception?: any) => {\r\n if (!this._disposed) {\r\n deferred.reject(new Error(`${context}: ${exception && exception.message ? exception.message : message || \"Failed to load texture\"}`));\r\n }\r\n },\r\n mimeType: image.mimeType ?? GetMimeType(image.uri ?? \"\"),\r\n loaderOptions: textureLoaderOptions,\r\n useSRGBBuffer: !!useSRGBBuffer && this._parent.useSRGBBuffers,\r\n };\r\n const babylonTexture = new Texture(null, this._babylonScene, textureCreationOptions);\r\n babylonTexture._parentContainer = this._assetContainer;\r\n this._babylonScene._blockEntityCollection = false;\r\n promises.push(deferred.promise);\r\n\r\n const nonBase64Uri = image.uri && !IsBase64DataUrl(image.uri) ? image.uri : undefined;\r\n const imageId = nonBase64Uri ?? `${this._fileName}#image${image.index}`;\r\n\r\n promises.push(\r\n this.loadImageAsync(`/images/${image.index}`, image).then((data) => {\r\n const dataUrl = `data:${this._uniqueRootUrl}${imageId}`;\r\n babylonTexture.updateURL(dataUrl, data);\r\n\r\n // Set the internal texture label.\r\n const internalTexture = babylonTexture.getInternalTexture();\r\n if (internalTexture) {\r\n internalTexture.label = image.name;\r\n }\r\n })\r\n );\r\n\r\n babylonTexture.wrapU = samplerData.wrapU;\r\n babylonTexture.wrapV = samplerData.wrapV;\r\n assign(babylonTexture);\r\n\r\n if (this._parent.useGltfTextureNames) {\r\n const textureName = image.name || nonBase64Uri || `image${image.index}`;\r\n babylonTexture.name = textureName;\r\n }\r\n\r\n return Promise.all(promises).then(() => {\r\n return babylonTexture;\r\n });\r\n }\r\n\r\n private _loadSampler(context: string, sampler: ISampler): _ISamplerData {\r\n if (!sampler._data) {\r\n sampler._data = {\r\n noMipMaps: sampler.minFilter === TextureMinFilter.NEAREST || sampler.minFilter === TextureMinFilter.LINEAR,\r\n samplingMode: GLTFLoader._GetTextureSamplingMode(context, sampler),\r\n wrapU: GLTFLoader._GetTextureWrapMode(`${context}/wrapS`, sampler.wrapS),\r\n wrapV: GLTFLoader._GetTextureWrapMode(`${context}/wrapT`, sampler.wrapT),\r\n };\r\n }\r\n\r\n return sampler._data;\r\n }\r\n\r\n /**\r\n * Loads a glTF image.\r\n * @param context The context when loading the asset\r\n * @param image The glTF image property\r\n * @returns A promise that resolves with the loaded data when the load is complete\r\n */\r\n public loadImageAsync(context: string, image: IImage): Promise<ArrayBufferView> {\r\n if (!image._data) {\r\n this.logOpen(`${context} ${image.name || \"\"}`);\r\n\r\n if (image.uri) {\r\n image._data = this.loadUriAsync(`${context}/uri`, image, image.uri);\r\n } else {\r\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._gltf.bufferViews, image.bufferView);\r\n image._data = this.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView);\r\n }\r\n\r\n this.logClose();\r\n }\r\n\r\n return image._data;\r\n }\r\n\r\n /**\r\n * Loads a glTF uri.\r\n * @param context The context when loading the asset\r\n * @param property The glTF property associated with the uri\r\n * @param uri The base64 or relative uri\r\n * @returns A promise that resolves with the loaded data when the load is complete\r\n */\r\n public loadUriAsync(context: string, property: IProperty, uri: string): Promise<ArrayBufferView> {\r\n const extensionPromise = this._extensionsLoadUriAsync(context, property, uri);\r\n if (extensionPromise) {\r\n return extensionPromise;\r\n }\r\n\r\n if (!GLTFLoader._ValidateUri(uri)) {\r\n throw new Error(`${context}: '${uri}' is invalid`);\r\n }\r\n\r\n if (IsBase64DataUrl(uri)) {\r\n const data = new Uint8Array(DecodeBase64UrlToBinary(uri));\r\n this.log(`${context}: Decoded ${uri.substring(0, 64)}... (${data.length} bytes)`);\r\n return Promise.resolve(data);\r\n }\r\n\r\n this.log(`${context}: Loading ${uri}`);\r\n\r\n return this._parent.preprocessUrlAsync(this._rootUrl + uri).then((url) => {\r\n return new Promise((resolve, reject) => {\r\n this._parent._loadFile(\r\n this._babylonScene,\r\n url,\r\n (data) => {\r\n if (!this._disposed) {\r\n this.log(`${context}: Loaded ${uri} (${(data as ArrayBuffer).byteLength} bytes)`);\r\n resolve(new Uint8Array(data as ArrayBuffer));\r\n }\r\n },\r\n true,\r\n (request) => {\r\n reject(new LoadFileError(`${context}: Failed to load '${uri}'${request ? \": \" + request.status + \" \" + request.statusText : \"\"}`, request));\r\n }\r\n );\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Adds a JSON pointer to the _internalMetadata of the Babylon object at `<object>._internalMetadata.gltf.pointers`.\r\n * @param babylonObject the Babylon object with _internalMetadata\r\n * @param pointer the JSON pointer\r\n */\r\n public static AddPointerMetadata(babylonObject: IWithMetadata, pointer: string): void {\r\n babylonObject.metadata = babylonObject.metadata || {};\r\n const metadata = (babylonObject._internalMetadata = babylonObject._internalMetadata || {});\r\n const gltf = (metadata.gltf = metadata.gltf || {});\r\n const pointers = (gltf.pointers = gltf.pointers || []);\r\n pointers.push(pointer);\r\n }\r\n\r\n private static _GetTextureWrapMode(context: string, mode: TextureWrapMode | undefined): number {\r\n // Set defaults if undefined\r\n mode = mode == undefined ? TextureWrapMode.REPEAT : mode;\r\n\r\n switch (mode) {\r\n case TextureWrapMode.CLAMP_TO_EDGE:\r\n return Texture.CLAMP_ADDRESSMODE;\r\n case TextureWrapMode.MIRRORED_REPEAT:\r\n return Texture.MIRROR_ADDRESSMODE;\r\n case TextureWrapMode.REPEAT:\r\n return Texture.WRAP_ADDRESSMODE;\r\n default:\r\n Logger.Warn(`${context}: Invalid value (${mode})`);\r\n return Texture.WRAP_ADDRESSMODE;\r\n }\r\n }\r\n\r\n private static _GetTextureSamplingMode(context: string, sampler: ISampler): number {\r\n // Set defaults if undefined\r\n const magFilter = sampler.magFilter == undefined ? TextureMagFilter.LINEAR : sampler.magFilter;\r\n const minFilter = sampler.minFilter == undefined ? TextureMinFilter.LINEAR_MIPMAP_LINEAR : sampler.minFilter;\r\n\r\n if (magFilter === TextureMagFilter.LINEAR) {\r\n switch (minFilter) {\r\n case TextureMinFilter.NEAREST:\r\n return Texture.LINEAR_NEAREST;\r\n case TextureMinFilter.LINEAR:\r\n return Texture.LINEAR_LINEAR;\r\n case TextureMinFilter.NEAREST_MIPMAP_NEAREST:\r\n return Texture.LINEAR_NEAREST_MIPNEAREST;\r\n case TextureMinFilter.LINEAR_MIPMAP_NEAREST:\r\n return Texture.LINEAR_LINEAR_MIPNEAREST;\r\n case TextureMinFilter.NEAREST_MIPMAP_LINEAR:\r\n return Texture.LINEAR_NEAREST_MIPLINEAR;\r\n case TextureMinFilter.LINEAR_MIPMAP_LINEAR:\r\n return Texture.LINEAR_LINEAR_MIPLINEAR;\r\n default:\r\n Logger.Warn(`${context}/minFilter: Invalid value (${minFilter})`);\r\n return Texture.LINEAR_LINEAR_MIPLINEAR;\r\n }\r\n } else {\r\n if (magFilter !== TextureMagFilter.NEAREST) {\r\n Logger.Warn(`${context}/magFilter: Invalid value (${magFilter})`);\r\n }\r\n\r\n switch (minFilter) {\r\n case TextureMinFilter.NEAREST:\r\n return Texture.NEAREST_NEAREST;\r\n case TextureMinFilter.LINEAR:\r\n return Texture.NEAREST_LINEAR;\r\n case TextureMinFilter.NEAREST_MIPMAP_NEAREST:\r\n return Texture.NEAREST_NEAREST_MIPNEAREST;\r\n case TextureMinFilter.LINEAR_MIPMAP_NEAREST:\r\n return Texture.NEAREST_LINEAR_MIPNEAREST;\r\n case TextureMinFilter.NEAREST_MIPMAP_LINEAR:\r\n return Texture.NEAREST_NEAREST_MIPLINEAR;\r\n case TextureMinFilter.LINEAR_MIPMAP_LINEAR:\r\n return Texture.NEAREST_LINEAR_MIPLINEAR;\r\n default:\r\n Logger.Warn(`${context}/minFilter: Invalid value (${minFilter})`);\r\n return Texture.NEAREST_NEAREST_MIPNEAREST;\r\n }\r\n }\r\n }\r\n\r\n private static _GetTypedArrayConstructor(context: string, componentType: AccessorComponentType): TypedArrayConstructor {\r\n try {\r\n return GetTypedArrayConstructor(componentType);\r\n } catch (e) {\r\n throw new Error(`${context}: ${e.message}`, { cause: e });\r\n }\r\n }\r\n\r\n private static _GetTypedArray(context: string, componentType: AccessorComponentType, bufferView: ArrayBufferView, byteOffset: number | undefined, length: number): TypedArray {\r\n const buffer = bufferView.buffer;\r\n byteOffset = bufferView.byteOffset + (byteOffset || 0);\r\n\r\n const constructor = GLTFLoader._GetTypedArrayConstructor(`${context}/componentType`, componentType);\r\n\r\n const componentTypeLength = VertexBuffer.GetTypeByteLength(componentType);\r\n if (byteOffset % componentTypeLength !== 0) {\r\n // HACK: Copy the buffer if byte offset is not a multiple of component type byte length.\r\n Logger.Warn(`${context}: Copying buffer as byte offset (${byteOffset}) is not a multiple of component type byte length (${componentTypeLength})`);\r\n return new constructor(buffer.slice(byteOffset, byteOffset + length * componentTypeLength), 0);\r\n }\r\n\r\n return new constructor(buffer, byteOffset, length);\r\n }\r\n\r\n private static _GetNumComponents(context: string, type: string): number {\r\n switch (type) {\r\n case \"SCALAR\":\r\n return 1;\r\n case \"VEC2\":\r\n return 2;\r\n case \"VEC3\":\r\n return 3;\r\n case \"VEC4\":\r\n return 4;\r\n case \"MAT2\":\r\n return 4;\r\n case \"MAT3\":\r\n return 9;\r\n case \"MAT4\":\r\n return 16;\r\n }\r\n\r\n throw new Error(`${context}: Invalid type (${type})`);\r\n }\r\n\r\n private static _ValidateUri(uri: string): boolean {\r\n return Tools.IsBase64(uri) || uri.indexOf(\"..\") === -1;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _GetDrawMode(context: string, mode: number | undefined): number {\r\n if (mode == undefined) {\r\n mode = MeshPrimitiveMode.TRIANGLES;\r\n }\r\n\r\n switch (mode) {\r\n case MeshPrimitiveMode.POINTS:\r\n return Material.PointListDrawMode;\r\n case MeshPrimitiveMode.LINES:\r\n return Material.LineListDrawMode;\r\n case MeshPrimitiveMode.LINE_LOOP:\r\n return Material.LineLoopDrawMode;\r\n case MeshPrimitiveMode.LINE_STRIP:\r\n return Material.LineStripDrawMode;\r\n case MeshPrimitiveMode.TRIANGLES:\r\n return Material.TriangleFillMode;\r\n case MeshPrimitiveMode.TRIANGLE_STRIP:\r\n return Material.TriangleStripDrawMode;\r\n case MeshPrimitiveMode.TRIANGLE_FAN:\r\n return Material.TriangleFanDrawMode;\r\n }\r\n\r\n throw new Error(`${context}: Invalid mesh primitive mode (${mode})`);\r\n }\r\n\r\n private _compileMaterialsAsync(): Promise<void> {\r\n this._parent._startPerformanceCounter(\"Compile materials\");\r\n\r\n const promises = new Array<Promise<unknown>>();\r\n\r\n if (this._gltf.materials) {\r\n for (const material of this._gltf.materials) {\r\n if (material._data) {\r\n for (const babylonDrawMode in material._data) {\r\n const babylonData = material._data[babylonDrawMode];\r\n for (const babylonMesh of babylonData.babylonMeshes) {\r\n // Ensure nonUniformScaling is set if necessary.\r\n babylonMesh.computeWorldMatrix(true);\r\n\r\n const babylonMaterial = babylonData.babylonMaterial;\r\n promises.push(babylonMaterial.forceCompilationAsync(babylonMesh));\r\n promises.push(babylonMaterial.forceCompilationAsync(babylonMesh, { useInstances: true }));\r\n if (this._parent.useClipPlane) {\r\n promises.push(babylonMaterial.forceCompilationAsync(babylonMesh, { clipPlane: true }));\r\n promises.push(babylonMaterial.forceCompilationAsync(babylonMesh, { clipPlane: true, useInstances: true }));\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return Promise.all(promises).then(() => {\r\n this._parent._endPerformanceCounter(\"Compile materials\");\r\n });\r\n }\r\n\r\n private _compileShadowGeneratorsAsync(): Promise<void> {\r\n this._parent._startPerformanceCounter(\"Compile shadow generators\");\r\n\r\n const promises = new Array<Promise<unknown>>();\r\n\r\n const lights = this._babylonScene.lights;\r\n for (const light of lights) {\r\n const generator = light.getShadowGenerator();\r\n if (generator) {\r\n promises.push(generator.forceCompilationAsync());\r\n }\r\n }\r\n\r\n return Promise.all(promises).then(() => {\r\n this._parent._endPerformanceCounter(\"Compile shadow generators\");\r\n });\r\n }\r\n\r\n private _forEachExtensions(action: (extension: IGLTFLoaderExtension) => void): void {\r\n for (const extension of this._extensions) {\r\n if (extension.enabled) {\r\n action(extension);\r\n }\r\n }\r\n }\r\n\r\n private _applyExtensions<T>(property: IProperty, functionName: string, actionAsync: (extension: IGLTFLoaderExtension) => Nullable<T> | undefined): Nullable<T> {\r\n for (const extension of this._extensions) {\r\n if (extension.enabled) {\r\n const id = `${extension.name}.${functionName}`;\r\n const loaderProperty = property as ILoaderProperty;\r\n loaderProperty._activeLoaderExtensionFunctions = loaderProperty._activeLoaderExtensionFunctions || {};\r\n const activeLoaderExtensionFunctions = loaderProperty._activeLoaderExtensionFunctions;\r\n if (!activeLoaderExtensionFunctions[id]) {\r\n activeLoaderExtensionFunctions[id] = true;\r\n\r\n try {\r\n const result = actionAsync(extension);\r\n if (result) {\r\n return result;\r\n }\r\n } finally {\r\n delete activeLoaderExtensionFunctions[id];\r\n }\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _extensionsOnLoading(): void {\r\n this._forEachExtensions((extension) => extension.onLoading && extension.onLoading());\r\n }\r\n\r\n private _extensionsOnReady(): void {\r\n this._forEachExtensions((extension) => extension.onReady && extension.onReady());\r\n }\r\n\r\n private _extensionsLoadSceneAsync(context: string, scene: IScene): Nullable<Promise<void>> {\r\n return this._applyExtensions(scene, \"loadScene\", (extension) => extension.loadSceneAsync && extension.loadSceneAsync(context, scene));\r\n }\r\n\r\n private _extensionsLoadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable<Promise<TransformNode>> {\r\n return this._applyExtensions(node, \"loadNode\", (extension) => extension.loadNodeAsync && extension.loadNodeAsync(context, node, assign));\r\n }\r\n\r\n private _extensionsLoadCameraAsync(context: string, camera: ICamera, assign: (babylonCamera: Camera) => void): Nullable<Promise<Camera>> {\r\n return this._applyExtensions(camera, \"loadCamera\", (extension) => extension.loadCameraAsync && extension.loadCameraAsync(context, camera, assign));\r\n }\r\n\r\n private _extensionsLoadVertexDataAsync(context: string, primitive: IMeshPrimitive, babylonMesh: Mesh): Nullable<Promise<Geometry>> {\r\n return this._applyExtensions(primitive, \"loadVertexData\", (extension) => extension._loadVertexDataAsync && extension._loadVertexDataAsync(context, primitive, babylonMesh));\r\n }\r\n\r\n private _extensionsLoadMeshPrimitiveAsync(\r\n context: string,\r\n name: string,\r\n node: INode,\r\n mesh: IMesh,\r\n primitive: IMeshPrimitive,\r\n assign: (babylonMesh: AbstractMesh) => void\r\n ): Nullable<Promise<AbstractMesh>> {\r\n return this._applyExtensions(\r\n primitive,\r\n \"loadMeshPrimitive\",\r\n (extension) => extension._loadMeshPrimitiveAsync && extension._loadMeshPrimitiveAsync(context, name, node, mesh, primitive, assign)\r\n );\r\n }\r\n\r\n private _extensionsLoadMaterialAsync(\r\n context: string,\r\n material: IMaterial,\r\n babylonMesh: Nullable<Mesh>,\r\n babylonDrawMode: number,\r\n assign: (babylonMaterial: Material) => void\r\n ): Nullable<Promise<Material>> {\r\n return this._applyExtensions(\r\n material,\r\n \"loadMaterial\",\r\n (extension) => extension._loadMaterialAsync && extension._loadMaterialAsync(context, material, babylonMesh, babylonDrawMode, assign)\r\n );\r\n }\r\n\r\n private _extensionsCreateMaterial(context: string, material: IMaterial, babylonDrawMode: number): Nullable<Material> {\r\n return this._applyExtensions(material, \"createMaterial\", (extension) => extension.createMaterial && extension.createMaterial(context, material, babylonDrawMode));\r\n }\r\n\r\n private _extensionsLoadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return this._applyExtensions(\r\n material,\r\n \"loadMaterialProperties\",\r\n (extension) => extension.loadMaterialPropertiesAsync && extension.loadMaterialPropertiesAsync(context, material, babylonMaterial)\r\n );\r\n }\r\n\r\n private _extensionsLoadTextureInfoAsync(context: string, textureInfo: ITextureInfo, assign: (babylonTexture: BaseTexture) => void): Nullable<Promise<BaseTexture>> {\r\n return this._applyExtensions(textureInfo, \"loadTextureInfo\", (extension) => extension.loadTextureInfoAsync && extension.loadTextureInfoAsync(context, textureInfo, assign));\r\n }\r\n\r\n private _extensionsLoadTextureAsync(context: string, texture: ITexture, assign: (babylonTexture: BaseTexture) => void): Nullable<Promise<BaseTexture>> {\r\n return this._applyExtensions(texture, \"loadTexture\", (extension) => extension._loadTextureAsync && extension._loadTextureAsync(context, texture, assign));\r\n }\r\n\r\n private _extensionsLoadAnimationAsync(context: string, animation: IAnimation): Nullable<Promise<AnimationGroup>> {\r\n return this._applyExtensions(animation, \"loadAnimation\", (extension) => extension.loadAnimationAsync && extension.loadAnimationAsync(context, animation));\r\n }\r\n\r\n private _extensionsLoadAnimationChannelAsync(\r\n context: string,\r\n animationContext: string,\r\n animation: IAnimation,\r\n channel: IAnimationChannel,\r\n onLoad: (babylonAnimatable: IAnimatable, babylonAnimation: Animation) => void\r\n ): Nullable<Promise<void>> {\r\n return this._applyExtensions(\r\n animation,\r\n \"loadAnimationChannel\",\r\n (extension) => extension._loadAnimationChannelAsync && extension._loadAnimationChannelAsync(context, animationContext, animation, channel, onLoad)\r\n );\r\n }\r\n\r\n private _extensionsLoadSkinAsync(context: string, node: INode, skin: ISkin): Nullable<Promise<void>> {\r\n return this._applyExtensions(skin, \"loadSkin\", (extension) => extension._loadSkinAsync && extension._loadSkinAsync(context, node, skin));\r\n }\r\n\r\n private _extensionsLoadUriAsync(context: string, property: IProperty, uri: string): Nullable<Promise<ArrayBufferView>> {\r\n return this._applyExtensions(property, \"loadUri\", (extension) => extension._loadUriAsync && extension._loadUriAsync(context, property, uri));\r\n }\r\n\r\n private _extensionsLoadBufferViewAsync(context: string, bufferView: IBufferView): Nullable<Promise<ArrayBufferView>> {\r\n return this._applyExtensions(bufferView, \"loadBufferView\", (extension) => extension.loadBufferViewAsync && extension.loadBufferViewAsync(context, bufferView));\r\n }\r\n\r\n private _extensionsLoadBufferAsync(context: string, buffer: IBuffer, byteOffset: number, byteLength: number): Nullable<Promise<ArrayBufferView>> {\r\n return this._applyExtensions(buffer, \"loadBuffer\", (extension) => extension.loadBufferAsync && extension.loadBufferAsync(context, buffer, byteOffset, byteLength));\r\n }\r\n\r\n /**\r\n * Helper method called by a loader extension to load an glTF extension.\r\n * @param context The context when loading the asset\r\n * @param property The glTF property to load the extension from\r\n * @param extensionName The name of the extension to load\r\n * @param actionAsync The action to run\r\n * @returns The promise returned by actionAsync or null if the extension does not exist\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static LoadExtensionAsync<TExtension = unknown, TResult = void>(\r\n context: string,\r\n property: IProperty,\r\n extensionName: string,\r\n actionAsync: (extensionContext: string, extension: TExtension) => Nullable<Promise<TResult>>\r\n ): Nullable<Promise<TResult>> {\r\n if (!property.extensions) {\r\n return null;\r\n }\r\n\r\n const extensions = property.extensions;\r\n\r\n const extension = extensions[extensionName] as TExtension;\r\n if (!extension) {\r\n return null;\r\n }\r\n\r\n return actionAsync(`${context}/extensions/${extensionName}`, extension);\r\n }\r\n\r\n /**\r\n * Helper method called by a loader extension to load a glTF extra.\r\n * @param context The context when loading the asset\r\n * @param property The glTF property to load the extra from\r\n * @param extensionName The name of the extension to load\r\n * @param actionAsync The action to run\r\n * @returns The promise returned by actionAsync or null if the extra does not exist\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public static LoadExtraAsync<TExtra = unknown, TResult = void>(\r\n context: string,\r\n property: IProperty,\r\n extensionName: string,\r\n actionAsync: (extraContext: string, extra: TExtra) => Nullable<Promise<TResult>>\r\n ): Nullable<Promise<TResult>> {\r\n if (!property.extras) {\r\n return null;\r\n }\r\n\r\n const extras = property.extras;\r\n\r\n const extra = extras[extensionName] as TExtra;\r\n if (!extra) {\r\n return null;\r\n }\r\n\r\n return actionAsync(`${context}/extras/${extensionName}`, extra);\r\n }\r\n\r\n /**\r\n * Checks for presence of an extension.\r\n * @param name The name of the extension to check\r\n * @returns A boolean indicating the presence of the given extension name in `extensionsUsed`\r\n */\r\n public isExtensionUsed(name: string): boolean {\r\n return !!this._gltf.extensionsUsed && this._gltf.extensionsUsed.indexOf(name) !== -1;\r\n }\r\n\r\n /**\r\n * Increments the indentation level and logs a message.\r\n * @param message The message to log\r\n */\r\n public logOpen(message: string): void {\r\n this._parent._logOpen(message);\r\n }\r\n\r\n /**\r\n * Decrements the indentation level.\r\n */\r\n public logClose(): void {\r\n this._parent._logClose();\r\n }\r\n\r\n /**\r\n * Logs a message\r\n * @param message The message to log\r\n */\r\n public log(message: string): void {\r\n this._parent._log(message);\r\n }\r\n\r\n /**\r\n * Starts a performance counter.\r\n * @param counterName The name of the performance counter\r\n */\r\n public startPerformanceCounter(counterName: string): void {\r\n this._parent._startPerformanceCounter(counterName);\r\n }\r\n\r\n /**\r\n * Ends a performance counter.\r\n * @param counterName The name of the performance counter\r\n */\r\n public endPerformanceCounter(counterName: string): void {\r\n this._parent._endPerformanceCounter(counterName);\r\n }\r\n}\r\n\r\nGLTFFileLoader._CreateGLTF2Loader = (parent) => new GLTFLoader(parent);\r\n","import { type Nullable } from \"core/types\";\r\nimport { SphericalHarmonics, SphericalPolynomial } from \"core/Maths/sphericalPolynomial\";\r\nimport { Quaternion, Matrix } from \"core/Maths/math.vector\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { RawCubeTexture } from \"core/Materials/Textures/rawCubeTexture\";\r\n\r\nimport { type IEXTLightsImageBased_LightReferenceImageBased, type IEXTLightsImageBased_LightImageBased, type IEXTLightsImageBased } from \"babylonjs-gltf2interface\";\r\nimport { type IScene } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"EXT_lights_image_based\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the EXT_lights_image_based extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"EXT_lights_image_based\"]: {};\r\n }\r\n}\r\n\r\ndeclare module \"babylonjs-gltf2interface\" {\r\n /** @internal */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n interface IEXTLightsImageBased_LightImageBased {\r\n _babylonTexture?: BaseTexture;\r\n _loaded?: Promise<void>;\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/EXT_lights_image_based/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class EXT_lights_image_based implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n private _lights?: IEXTLightsImageBased_LightImageBased[];\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n delete this._lights;\r\n }\r\n\r\n /** @internal */\r\n public onLoading(): void {\r\n const extensions = this._loader.gltf.extensions;\r\n if (extensions && extensions[this.name]) {\r\n const extension = extensions[this.name] as IEXTLightsImageBased;\r\n this._lights = extension.lights;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadSceneAsync(context: string, scene: IScene): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IEXTLightsImageBased_LightReferenceImageBased>(context, scene, this.name, async (extensionContext, extension) => {\r\n this._loader._allMaterialsDirtyRequired = true;\r\n\r\n const promises = new Array<Promise<any>>();\r\n\r\n promises.push(this._loader.loadSceneAsync(context, scene));\r\n\r\n this._loader.logOpen(`${extensionContext}`);\r\n\r\n const light = ArrayItem.Get(`${extensionContext}/light`, this._lights, extension.light);\r\n promises.push(\r\n // eslint-disable-next-line github/no-then\r\n this._loadLightAsync(`/extensions/${this.name}/lights/${extension.light}`, light).then((texture) => {\r\n this._loader.babylonScene.environmentTexture = texture;\r\n })\r\n );\r\n\r\n this._loader.logClose();\r\n\r\n // eslint-disable-next-line github/no-then\r\n return await Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _loadLightAsync(context: string, light: IEXTLightsImageBased_LightImageBased): Promise<BaseTexture> {\r\n if (!light._loaded) {\r\n const promises = new Array<Promise<any>>();\r\n\r\n this._loader.logOpen(`${context}`);\r\n\r\n const imageData = new Array<Array<ArrayBufferView>>(light.specularImages.length);\r\n for (let mipmap = 0; mipmap < light.specularImages.length; mipmap++) {\r\n const faces = light.specularImages[mipmap];\r\n imageData[mipmap] = new Array<ArrayBufferView>(faces.length);\r\n for (let face = 0; face < faces.length; face++) {\r\n const specularImageContext = `${context}/specularImages/${mipmap}/${face}`;\r\n this._loader.logOpen(`${specularImageContext}`);\r\n\r\n const index = faces[face];\r\n const image = ArrayItem.Get(specularImageContext, this._loader.gltf.images, index);\r\n promises.push(\r\n // eslint-disable-next-line github/no-then\r\n this._loader.loadImageAsync(`/images/${index}`, image).then((data) => {\r\n imageData[mipmap][face] = data;\r\n })\r\n );\r\n\r\n this._loader.logClose();\r\n }\r\n }\r\n\r\n this._loader.logClose();\r\n\r\n // eslint-disable-next-line github/no-then\r\n light._loaded = Promise.all(promises).then(async () => {\r\n const babylonTexture = new RawCubeTexture(this._loader.babylonScene, null, light.specularImageSize);\r\n babylonTexture.name = light.name || \"environment\";\r\n light._babylonTexture = babylonTexture;\r\n\r\n if (light.intensity != undefined) {\r\n babylonTexture.level = light.intensity;\r\n }\r\n\r\n if (light.rotation) {\r\n let rotation = Quaternion.FromArray(light.rotation);\r\n\r\n // Invert the rotation so that positive rotation is counter-clockwise.\r\n if (!this._loader.babylonScene.useRightHandedSystem) {\r\n rotation = Quaternion.Inverse(rotation);\r\n }\r\n\r\n Matrix.FromQuaternionToRef(rotation, babylonTexture.getReflectionTextureMatrix());\r\n }\r\n\r\n if (!light.irradianceCoefficients) {\r\n throw new Error(`${context}: Irradiance coefficients are missing`);\r\n }\r\n\r\n const sphericalHarmonics = SphericalHarmonics.FromArray(light.irradianceCoefficients);\r\n sphericalHarmonics.scaleInPlace(light.intensity);\r\n\r\n sphericalHarmonics.convertIrradianceToLambertianRadiance();\r\n const sphericalPolynomial = SphericalPolynomial.FromHarmonics(sphericalHarmonics);\r\n\r\n // Compute the lod generation scale to fit exactly to the number of levels available.\r\n const lodGenerationScale = (imageData.length - 1) / Math.log2(light.specularImageSize);\r\n return await babylonTexture.updateRGBDAsync(imageData, sphericalPolynomial, lodGenerationScale);\r\n });\r\n }\r\n\r\n // eslint-disable-next-line github/no-then\r\n return light._loaded.then(() => {\r\n return light._babylonTexture!;\r\n });\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new EXT_lights_image_based(loader));\r\n","import { Vector3, Quaternion, Matrix, TmpVectors } from \"core/Maths/math.vector\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { type TransformNode } from \"core/Meshes/transformNode\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { type INode } from \"../glTFLoaderInterfaces\";\r\nimport { type IEXTMeshGpuInstancing } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nimport \"core/Meshes/thinInstanceMesh\";\r\n\r\nconst NAME = \"EXT_mesh_gpu_instancing\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the EXT_mesh_gpu_instancing extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"EXT_mesh_gpu_instancing\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/EXT_mesh_gpu_instancing/README.md)\r\n * [Playground Sample](https://playground.babylonjs.com/#QFIGLW#9)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class EXT_mesh_gpu_instancing implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable<Promise<TransformNode>> {\r\n return GLTFLoader.LoadExtensionAsync<IEXTMeshGpuInstancing, TransformNode>(context, node, this.name, async (extensionContext, extension) => {\r\n this._loader._disableInstancedMesh++;\r\n\r\n const promise = this._loader.loadNodeAsync(`/nodes/${node.index}`, node, assign);\r\n\r\n this._loader._disableInstancedMesh--;\r\n\r\n if (!node._primitiveBabylonMeshes) {\r\n return await promise;\r\n }\r\n\r\n const promises = new Array<Promise<Nullable<Float32Array>>>();\r\n let instanceCount = 0;\r\n\r\n const loadAttribute = (attribute: string) => {\r\n if (extension.attributes[attribute] == undefined) {\r\n promises.push(Promise.resolve(null));\r\n return;\r\n }\r\n\r\n const accessor = ArrayItem.Get(`${extensionContext}/attributes/${attribute}`, this._loader.gltf.accessors, extension.attributes[attribute]);\r\n promises.push(this._loader._loadFloatAccessorAsync(`/accessors/${accessor.bufferView}`, accessor));\r\n\r\n if (instanceCount === 0) {\r\n instanceCount = accessor.count;\r\n } else if (instanceCount !== accessor.count) {\r\n throw new Error(`${extensionContext}/attributes: Instance buffer accessors do not have the same count.`);\r\n }\r\n };\r\n\r\n loadAttribute(\"TRANSLATION\");\r\n loadAttribute(\"ROTATION\");\r\n loadAttribute(\"SCALE\");\r\n loadAttribute(\"_COLOR_0\");\r\n\r\n // eslint-disable-next-line github/no-then\r\n return await promise.then(async (babylonTransformNode) => {\r\n const [translationBuffer, rotationBuffer, scaleBuffer, colorBuffer] = await Promise.all(promises);\r\n const matrices = new Float32Array(instanceCount * 16);\r\n TmpVectors.Vector3[0].copyFromFloats(0, 0, 0); // translation\r\n TmpVectors.Quaternion[0].copyFromFloats(0, 0, 0, 1); // rotation\r\n TmpVectors.Vector3[1].copyFromFloats(1, 1, 1); // scale\r\n for (let i = 0; i < instanceCount; ++i) {\r\n translationBuffer && Vector3.FromArrayToRef(translationBuffer, i * 3, TmpVectors.Vector3[0]);\r\n rotationBuffer && Quaternion.FromArrayToRef(rotationBuffer, i * 4, TmpVectors.Quaternion[0]);\r\n scaleBuffer && Vector3.FromArrayToRef(scaleBuffer, i * 3, TmpVectors.Vector3[1]);\r\n\r\n Matrix.ComposeToRef(TmpVectors.Vector3[1], TmpVectors.Quaternion[0], TmpVectors.Vector3[0], TmpVectors.Matrix[0]);\r\n\r\n TmpVectors.Matrix[0].copyToArray(matrices, i * 16);\r\n }\r\n for (const babylonMesh of node._primitiveBabylonMeshes!) {\r\n (babylonMesh as Mesh).thinInstanceSetBuffer(\"matrix\", matrices, 16, true);\r\n if (colorBuffer) {\r\n if (colorBuffer.length === instanceCount * 3) {\r\n (babylonMesh as Mesh).thinInstanceSetBuffer(\"color\", colorBuffer, 3, true);\r\n } else if (colorBuffer.length === instanceCount * 4) {\r\n (babylonMesh as Mesh).thinInstanceSetBuffer(\"color\", colorBuffer, 4, true);\r\n } else {\r\n Logger.Warn(\"Unexpected size of _COLOR_0 attribute for mesh \" + babylonMesh.name);\r\n }\r\n }\r\n }\r\n return babylonTransformNode;\r\n });\r\n });\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new EXT_mesh_gpu_instancing(loader));\r\n","import { type Nullable } from \"core/types\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { ArrayItem, GLTFLoader } from \"../glTFLoader\";\r\nimport { type IBufferView } from \"../glTFLoaderInterfaces\";\r\nimport { type IEXTMeshoptCompression } from \"babylonjs-gltf2interface\";\r\nimport { MeshoptCompression } from \"core/Meshes/Compression/meshoptCompression\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"EXT_meshopt_compression\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the EXT_meshopt_compression extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"EXT_meshopt_compression\"]: {};\r\n }\r\n}\r\n\r\ninterface IBufferViewMeshopt extends IBufferView {\r\n _meshOptData?: Promise<ArrayBufferView>;\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/EXT_meshopt_compression/README.md)\r\n *\r\n * This extension uses a WebAssembly decoder module from https://github.com/zeux/meshoptimizer/tree/master/js\r\n * @since 5.0.0\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class EXT_meshopt_compression implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this.enabled = loader.isExtensionUsed(NAME);\r\n this._loader = loader;\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadBufferViewAsync(context: string, bufferView: IBufferView): Nullable<Promise<ArrayBufferView>> {\r\n return GLTFLoader.LoadExtensionAsync<IEXTMeshoptCompression, ArrayBufferView>(context, bufferView, this.name, async (extensionContext, extension) => {\r\n const bufferViewMeshopt = bufferView as IBufferViewMeshopt;\r\n if (bufferViewMeshopt._meshOptData) {\r\n return await bufferViewMeshopt._meshOptData;\r\n }\r\n\r\n const buffer = ArrayItem.Get(`${context}/buffer`, this._loader.gltf.buffers, extension.buffer);\r\n bufferViewMeshopt._meshOptData = this._loader\r\n .loadBufferAsync(`/buffers/${buffer.index}`, buffer, extension.byteOffset || 0, extension.byteLength)\r\n // eslint-disable-next-line github/no-then\r\n .then(async (buffer) => {\r\n return await MeshoptCompression.Default.decodeGltfBufferAsync(buffer as Uint8Array, extension.count, extension.byteStride, extension.mode, extension.filter);\r\n });\r\n\r\n return await bufferViewMeshopt._meshOptData;\r\n });\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new EXT_meshopt_compression(loader));\r\n","import { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader\";\r\nimport { type ITexture } from \"../glTFLoaderInterfaces\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type IEXTTextureWebP } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"EXT_texture_webp\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the EXT_texture_webp extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"EXT_texture_webp\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/EXT_texture_webp/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class EXT_texture_webp implements IGLTFLoaderExtension {\r\n /** The name of this extension. */\r\n public readonly name = NAME;\r\n\r\n /** Defines whether this extension is enabled. */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public _loadTextureAsync(context: string, texture: ITexture, assign: (babylonTexture: BaseTexture) => void): Nullable<Promise<BaseTexture>> {\r\n return GLTFLoader.LoadExtensionAsync<IEXTTextureWebP, BaseTexture>(context, texture, this.name, async (extensionContext, extension) => {\r\n const sampler = texture.sampler == undefined ? GLTFLoader.DefaultSampler : ArrayItem.Get(`${context}/sampler`, this._loader.gltf.samplers, texture.sampler);\r\n const image = ArrayItem.Get(`${extensionContext}/source`, this._loader.gltf.images, extension.source);\r\n return await this._loader._createTextureAsync(\r\n context,\r\n sampler,\r\n image,\r\n (babylonTexture) => {\r\n assign(babylonTexture);\r\n },\r\n undefined,\r\n !texture._textureInfo.nonColorData\r\n );\r\n });\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new EXT_texture_webp(loader));\r\n","import { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader\";\r\nimport { type ITexture } from \"../glTFLoaderInterfaces\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type IEXTTextureAVIF } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"EXT_texture_avif\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the EXT_texture_avif extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"EXT_texture_avif\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [glTF PR](https://github.com/KhronosGroup/glTF/pull/2235)\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/EXT_texture_avif/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class EXT_texture_avif implements IGLTFLoaderExtension {\r\n /** The name of this extension. */\r\n public readonly name = NAME;\r\n\r\n /** Defines whether this extension is enabled. */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public _loadTextureAsync(context: string, texture: ITexture, assign: (babylonTexture: BaseTexture) => void): Nullable<Promise<BaseTexture>> {\r\n return GLTFLoader.LoadExtensionAsync<IEXTTextureAVIF, BaseTexture>(context, texture, this.name, async (extensionContext, extension) => {\r\n const sampler = texture.sampler == undefined ? GLTFLoader.DefaultSampler : ArrayItem.Get(`${context}/sampler`, this._loader.gltf.samplers, texture.sampler);\r\n const image = ArrayItem.Get(`${extensionContext}/source`, this._loader.gltf.images, extension.source);\r\n return await this._loader._createTextureAsync(\r\n context,\r\n sampler,\r\n image,\r\n (babylonTexture) => {\r\n assign(babylonTexture);\r\n },\r\n undefined,\r\n !texture._textureInfo.nonColorData\r\n );\r\n });\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new EXT_texture_avif(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type Nullable } from \"core/types\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { SpotLight } from \"core/Lights/spotLight\";\r\nimport { Light } from \"core/Lights/light\";\r\nimport { type TransformNode } from \"core/Meshes/transformNode\";\r\n\r\nimport { type IEXTLightsIES_LightReference } from \"babylonjs-gltf2interface\";\r\nimport { type IEXTLightsIES_Light, type INode } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\n\r\nconst NAME = \"EXT_lights_ies\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the EXT_lights_ies extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"EXT_lights_ies\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Vendor/EXT_lights_ies)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class EXT_lights_ies implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /** hidden */\r\n private _loader: GLTFLoader;\r\n private _lights?: IEXTLightsIES_Light[];\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n delete this._lights;\r\n }\r\n\r\n /** @internal */\r\n public onLoading(): void {\r\n const extensions = this._loader.gltf.extensions;\r\n if (extensions && extensions[this.name]) {\r\n const extension = extensions[this.name];\r\n this._lights = extension.lights;\r\n ArrayItem.Assign(this._lights);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable<Promise<TransformNode>> {\r\n return GLTFLoader.LoadExtensionAsync<IEXTLightsIES_LightReference, TransformNode>(context, node, this.name, async (extensionContext, extension) => {\r\n this._loader._allMaterialsDirtyRequired = true;\r\n\r\n let babylonSpotLight: SpotLight;\r\n let light: IEXTLightsIES_Light;\r\n\r\n const transformNode = await this._loader.loadNodeAsync(context, node, (babylonMesh) => {\r\n light = ArrayItem.Get(extensionContext, this._lights, extension.light);\r\n const name = light.name || babylonMesh.name;\r\n\r\n this._loader.babylonScene._blockEntityCollection = !!this._loader._assetContainer;\r\n\r\n babylonSpotLight = new SpotLight(name, Vector3.Zero(), Vector3.Backward(), 0, 1, this._loader.babylonScene);\r\n babylonSpotLight.angle = Math.PI / 2;\r\n babylonSpotLight.innerAngle = 0;\r\n\r\n babylonSpotLight._parentContainer = this._loader._assetContainer;\r\n this._loader.babylonScene._blockEntityCollection = false;\r\n light._babylonLight = babylonSpotLight;\r\n\r\n babylonSpotLight.falloffType = Light.FALLOFF_GLTF;\r\n babylonSpotLight.diffuse = extension.color ? Color3.FromArray(extension.color) : Color3.White();\r\n babylonSpotLight.intensity = extension.multiplier || 1;\r\n babylonSpotLight.range = Number.MAX_VALUE;\r\n babylonSpotLight.parent = babylonMesh;\r\n\r\n this._loader._babylonLights.push(babylonSpotLight);\r\n\r\n GLTFLoader.AddPointerMetadata(babylonSpotLight, extensionContext);\r\n\r\n assign(babylonMesh);\r\n });\r\n\r\n // Load the profile\r\n let bufferData: ArrayBufferView;\r\n if (light!.uri) {\r\n bufferData = await this._loader.loadUriAsync(context, light!, light!.uri);\r\n } else {\r\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._loader.gltf.bufferViews, light!.bufferView);\r\n bufferData = await this._loader.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView);\r\n }\r\n babylonSpotLight!.iesProfileTexture = new Texture(\r\n name + \"_iesProfile\",\r\n this._loader.babylonScene,\r\n true,\r\n false,\r\n undefined,\r\n null,\r\n null,\r\n bufferData,\r\n true,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n \".ies\"\r\n );\r\n\r\n return transformNode;\r\n });\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new EXT_lights_ies(loader));\r\n","/* eslint-disable github/no-then */\r\nimport { DracoDecoder } from \"core/Meshes/Compression/dracoDecoder\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport { type Geometry } from \"core/Meshes/geometry\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\n\r\nimport { MeshPrimitiveMode, type IKHRDracoMeshCompression } from \"babylonjs-gltf2interface\";\r\nimport { type IMeshPrimitive, type IBufferView } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem, LoadBoundingInfoFromPositionAccessor } from \"../glTFLoader\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_draco_mesh_compression\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_draco_mesh_compression extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_draco_mesh_compression\"]: {};\r\n }\r\n}\r\n\r\ninterface IBufferViewDraco extends IBufferView {\r\n _dracoBabylonGeometry?: Promise<Geometry>;\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_draco_mesh_compression/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_draco_mesh_compression implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * The draco decoder used to decode vertex data or DracoDecoder.Default if not defined\r\n */\r\n public dracoDecoder?: DracoDecoder;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines whether to use the normalized flag from the glTF accessor instead of the Draco data. Defaults to true.\r\n */\r\n public useNormalizedFlagFromAccessor = true;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = DracoDecoder.DefaultAvailable && this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose(): void {\r\n delete this.dracoDecoder;\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public _loadVertexDataAsync(context: string, primitive: IMeshPrimitive, babylonMesh: Mesh): Nullable<Promise<Geometry>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRDracoMeshCompression, Geometry>(context, primitive, this.name, async (extensionContext, extension) => {\r\n if (primitive.mode != undefined) {\r\n if (primitive.mode !== MeshPrimitiveMode.TRIANGLES && primitive.mode !== MeshPrimitiveMode.TRIANGLE_STRIP) {\r\n throw new Error(`${context}: Unsupported mode ${primitive.mode}`);\r\n }\r\n }\r\n\r\n const attributes: { [kind: string]: number } = {};\r\n const normalized: { [kind: string]: boolean } = {};\r\n const loadAttribute = (name: string, kind: string) => {\r\n const uniqueId = extension.attributes[name];\r\n if (uniqueId == undefined) {\r\n return;\r\n }\r\n\r\n babylonMesh._delayInfo = babylonMesh._delayInfo || [];\r\n if (babylonMesh._delayInfo.indexOf(kind) === -1) {\r\n babylonMesh._delayInfo.push(kind);\r\n }\r\n\r\n attributes[kind] = uniqueId;\r\n\r\n if (this.useNormalizedFlagFromAccessor) {\r\n const accessor = ArrayItem.TryGet(this._loader.gltf.accessors, primitive.attributes[name]);\r\n if (accessor) {\r\n normalized[kind] = accessor.normalized || false;\r\n }\r\n }\r\n };\r\n\r\n loadAttribute(\"POSITION\", VertexBuffer.PositionKind);\r\n loadAttribute(\"NORMAL\", VertexBuffer.NormalKind);\r\n loadAttribute(\"TANGENT\", VertexBuffer.TangentKind);\r\n loadAttribute(\"TEXCOORD_0\", VertexBuffer.UVKind);\r\n loadAttribute(\"TEXCOORD_1\", VertexBuffer.UV2Kind);\r\n loadAttribute(\"TEXCOORD_2\", VertexBuffer.UV3Kind);\r\n loadAttribute(\"TEXCOORD_3\", VertexBuffer.UV4Kind);\r\n loadAttribute(\"TEXCOORD_4\", VertexBuffer.UV5Kind);\r\n loadAttribute(\"TEXCOORD_5\", VertexBuffer.UV6Kind);\r\n loadAttribute(\"JOINTS_0\", VertexBuffer.MatricesIndicesKind);\r\n loadAttribute(\"WEIGHTS_0\", VertexBuffer.MatricesWeightsKind);\r\n loadAttribute(\"COLOR_0\", VertexBuffer.ColorKind);\r\n\r\n const bufferView = ArrayItem.Get(extensionContext, this._loader.gltf.bufferViews, extension.bufferView) as IBufferViewDraco;\r\n if (!bufferView._dracoBabylonGeometry) {\r\n bufferView._dracoBabylonGeometry = this._loader.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView).then(async (data) => {\r\n const dracoDecoder = this.dracoDecoder || DracoDecoder.Default;\r\n const positionAccessor = ArrayItem.TryGet(this._loader.gltf.accessors, primitive.attributes[\"POSITION\"]);\r\n const babylonBoundingInfo =\r\n !this._loader.parent.alwaysComputeBoundingBox && !babylonMesh.skeleton && positionAccessor ? LoadBoundingInfoFromPositionAccessor(positionAccessor) : null;\r\n return await dracoDecoder\r\n ._decodeMeshToGeometryForGltfAsync(babylonMesh.name, this._loader.babylonScene, data, attributes, normalized, babylonBoundingInfo)\r\n .catch((error) => {\r\n throw new Error(`${context}: ${error.message}`);\r\n });\r\n });\r\n }\r\n\r\n return await bufferView._dracoBabylonGeometry;\r\n });\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_draco_mesh_compression(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type Nullable } from \"core/types\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { DirectionalLight } from \"core/Lights/directionalLight\";\r\nimport { PointLight } from \"core/Lights/pointLight\";\r\nimport { SpotLight } from \"core/Lights/spotLight\";\r\nimport { Light } from \"core/Lights/light\";\r\nimport { type TransformNode } from \"core/Meshes/transformNode\";\r\n\r\nimport { type IKHRLightsPunctual_LightReference, KHRLightsPunctual_LightType } from \"babylonjs-gltf2interface\";\r\nimport { type INode, type IKHRLightsPunctual_Light } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_lights_punctual\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_lights_punctual extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_lights_punctual\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_lights_punctual/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_lights implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /** hidden */\r\n private _loader: GLTFLoader;\r\n private _lights?: IKHRLightsPunctual_Light[];\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n delete this._lights;\r\n }\r\n\r\n /** @internal */\r\n public onLoading(): void {\r\n const extensions = this._loader.gltf.extensions;\r\n if (extensions && extensions[this.name]) {\r\n const extension = extensions[this.name];\r\n this._lights = extension.lights;\r\n ArrayItem.Assign(this._lights);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable<Promise<TransformNode>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRLightsPunctual_LightReference, TransformNode>(context, node, this.name, async (extensionContext, extension) => {\r\n this._loader._allMaterialsDirtyRequired = true;\r\n\r\n return await this._loader.loadNodeAsync(context, node, (babylonMesh) => {\r\n let babylonLight: Light;\r\n\r\n const light = ArrayItem.Get(extensionContext, this._lights, extension.light);\r\n const name = light.name || babylonMesh.name;\r\n\r\n this._loader.babylonScene._blockEntityCollection = !!this._loader._assetContainer;\r\n\r\n switch (light.type) {\r\n case KHRLightsPunctual_LightType.DIRECTIONAL: {\r\n const babylonDirectionalLight = new DirectionalLight(name, Vector3.Backward(), this._loader.babylonScene);\r\n babylonDirectionalLight.position.setAll(0);\r\n babylonLight = babylonDirectionalLight;\r\n break;\r\n }\r\n case KHRLightsPunctual_LightType.POINT: {\r\n babylonLight = new PointLight(name, Vector3.Zero(), this._loader.babylonScene);\r\n break;\r\n }\r\n case KHRLightsPunctual_LightType.SPOT: {\r\n const babylonSpotLight = new SpotLight(name, Vector3.Zero(), Vector3.Backward(), 0, 1, this._loader.babylonScene);\r\n babylonSpotLight.angle = ((light.spot && light.spot.outerConeAngle) || Math.PI / 4) * 2;\r\n babylonSpotLight.innerAngle = ((light.spot && light.spot.innerConeAngle) || 0) * 2;\r\n babylonLight = babylonSpotLight;\r\n break;\r\n }\r\n default: {\r\n this._loader.babylonScene._blockEntityCollection = false;\r\n throw new Error(`${extensionContext}: Invalid light type (${light.type})`);\r\n }\r\n }\r\n\r\n babylonLight._parentContainer = this._loader._assetContainer;\r\n this._loader.babylonScene._blockEntityCollection = false;\r\n light._babylonLight = babylonLight;\r\n\r\n babylonLight.falloffType = Light.FALLOFF_GLTF;\r\n babylonLight.diffuse = light.color ? Color3.FromArray(light.color) : Color3.White();\r\n babylonLight.intensity = light.intensity == undefined ? 1 : light.intensity;\r\n babylonLight.range = light.range == undefined ? Number.MAX_VALUE : light.range;\r\n babylonLight.parent = babylonMesh;\r\n\r\n this._loader._babylonLights.push(babylonLight);\r\n\r\n GLTFLoader.AddPointerMetadata(babylonLight, extensionContext);\r\n\r\n assign(babylonMesh);\r\n });\r\n });\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_lights(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type Nullable } from \"core/types\";\r\nimport { Vector3, Quaternion } from \"core/Maths/math.vector\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Light } from \"core/Lights/light\";\r\nimport { RectAreaLight } from \"core/Lights/rectAreaLight\";\r\nimport { type TransformNode, TransformNode as BabylonTransformNode } from \"core/Meshes/transformNode\";\r\n\r\nimport { type IEXTLightsArea_LightReference, EXTLightsArea_LightType } from \"babylonjs-gltf2interface\";\r\nimport { type INode, type IEXTLightsArea_Light } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"EXT_lights_area\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the EXT_lights_area extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"EXT_lights_area\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/EXT_lights_area/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class EXT_lights_area implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /** hidden */\r\n private _loader: GLTFLoader;\r\n private _lights?: IEXTLightsArea_Light[];\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n delete this._lights;\r\n }\r\n\r\n /** @internal */\r\n public onLoading(): void {\r\n const extensions = this._loader.gltf.extensions;\r\n if (extensions && extensions[this.name]) {\r\n const extension = extensions[this.name];\r\n this._lights = extension.lights;\r\n ArrayItem.Assign(this._lights);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable<Promise<TransformNode>> {\r\n return GLTFLoader.LoadExtensionAsync<IEXTLightsArea_LightReference, TransformNode>(context, node, this.name, async (extensionContext, extension) => {\r\n this._loader._allMaterialsDirtyRequired = true;\r\n\r\n return await this._loader.loadNodeAsync(context, node, (babylonMesh) => {\r\n let babylonLight: Light;\r\n\r\n const light = ArrayItem.Get(extensionContext, this._lights, extension.light);\r\n const name = light.name || babylonMesh.name;\r\n\r\n this._loader.babylonScene._blockEntityCollection = !!this._loader._assetContainer;\r\n const size = light.size !== undefined ? light.size : 1.0;\r\n\r\n switch (light.type) {\r\n case EXTLightsArea_LightType.RECT: {\r\n const width = light.rect?.aspect !== undefined ? light.rect.aspect * size : size;\r\n const height = size;\r\n const babylonRectAreaLight = new RectAreaLight(name, Vector3.Zero(), width, height, this._loader.babylonScene);\r\n babylonLight = babylonRectAreaLight;\r\n break;\r\n }\r\n case EXTLightsArea_LightType.DISK: {\r\n // For disk lights, we'll use a rectangle light with the same area to approximate the disk light\r\n // In the future, this could be extended to support actual disk area lights\r\n const newSize = Math.sqrt(size * size * 0.25 * Math.PI); // Area of the disk\r\n const babylonRectAreaLight = new RectAreaLight(name, Vector3.Zero(), newSize, newSize, this._loader.babylonScene);\r\n babylonLight = babylonRectAreaLight;\r\n break;\r\n }\r\n default: {\r\n this._loader.babylonScene._blockEntityCollection = false;\r\n throw new Error(`${extensionContext}: Invalid area light type (${light.type})`);\r\n }\r\n }\r\n\r\n babylonLight._parentContainer = this._loader._assetContainer;\r\n this._loader.babylonScene._blockEntityCollection = false;\r\n light._babylonLight = babylonLight;\r\n\r\n babylonLight.falloffType = Light.FALLOFF_GLTF;\r\n babylonLight.diffuse = light.color ? Color3.FromArray(light.color) : Color3.White();\r\n babylonLight.intensity = light.intensity == undefined ? 1 : light.intensity;\r\n\r\n // glTF EXT_lights_area specifies lights face down -Z, but Babylon.js area lights face down +Z\r\n // Create a parent transform node with 180-degree rotation around Y axis to flip the direction\r\n const lightParentNode = new BabylonTransformNode(`${name}_orientation`, this._loader.babylonScene);\r\n lightParentNode.rotationQuaternion = Quaternion.RotationAxis(Vector3.Up(), Math.PI);\r\n lightParentNode.parent = babylonMesh;\r\n babylonLight.parent = lightParentNode;\r\n\r\n this._loader._babylonLights.push(babylonLight);\r\n\r\n GLTFLoader.AddPointerMetadata(babylonLight, extensionContext);\r\n\r\n assign(babylonMesh);\r\n });\r\n });\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new EXT_lights_area(loader));\r\n","import { type Nullable } from \"core/types\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { type Material } from \"core/Materials/material\";\r\n\r\nimport { type IMaterial } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { type IKHRMaterialsPbrSpecularGlossiness } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_materials_pbrSpecularGlossiness\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_materials_pbrSpecularGlossiness extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_materials_pbrSpecularGlossiness\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Archived/KHR_materials_pbrSpecularGlossiness/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_pbrSpecularGlossiness implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 200;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRMaterialsPbrSpecularGlossiness>(context, material, this.name, async (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n promises.push(this._loader.loadMaterialBasePropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadSpecularGlossinessPropertiesAsync(extensionContext, extension, babylonMaterial));\r\n this._loader.loadMaterialAlphaProperties(context, material, babylonMaterial);\r\n // eslint-disable-next-line github/no-then\r\n return await Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _loadSpecularGlossinessPropertiesAsync(context: string, properties: IKHRMaterialsPbrSpecularGlossiness, babylonMaterial: Material): Promise<void> {\r\n const adapter = this._loader._getOrCreateMaterialAdapter(babylonMaterial);\r\n\r\n const promises = new Array<Promise<any>>();\r\n\r\n adapter.configureSpecularGlossiness();\r\n\r\n if (properties.diffuseFactor) {\r\n adapter.baseColor = Color3.FromArray(properties.diffuseFactor);\r\n babylonMaterial.alpha = properties.diffuseFactor[3];\r\n } else {\r\n adapter.baseColor = Color3.White();\r\n }\r\n\r\n adapter.specularColor = properties.specularFactor ? Color3.FromArray(properties.specularFactor) : Color3.White();\r\n adapter.glossiness = properties.glossinessFactor == undefined ? 1 : properties.glossinessFactor;\r\n\r\n if (properties.diffuseTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/diffuseTexture`, properties.diffuseTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Diffuse)`;\r\n adapter.baseColorTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n if (properties.specularGlossinessTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/specularGlossinessTexture`, properties.specularGlossinessTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Specular Glossiness)`;\r\n adapter.specularColorTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n // eslint-disable-next-line github/no-then\r\n return Promise.all(promises).then(() => {});\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_materials_pbrSpecularGlossiness(loader));\r\n","import { type Nullable } from \"core/types\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { type Material } from \"core/Materials/material\";\r\n\r\nimport { type IMaterial } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_materials_unlit\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_materials_unlit extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_materials_unlit\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_unlit/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_unlit implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 210;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync(context, material, this.name, async () => {\r\n return await this._loadUnlitPropertiesAsync(context, material, babylonMaterial);\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _loadUnlitPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Promise<void> {\r\n const adapter = this._loader._getOrCreateMaterialAdapter(babylonMaterial)!;\r\n\r\n const promises = new Array<Promise<any>>();\r\n\r\n const properties = material.pbrMetallicRoughness;\r\n if (properties) {\r\n if (properties.baseColorFactor) {\r\n adapter.baseColor = Color3.FromArray(properties.baseColorFactor);\r\n adapter.geometryOpacity = properties.baseColorFactor[3];\r\n }\r\n\r\n if (properties.baseColorTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/baseColorTexture`, properties.baseColorTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Base Color)`;\r\n adapter.baseColorTexture = texture;\r\n })\r\n );\r\n }\r\n }\r\n adapter.isUnlit = true;\r\n if (material.doubleSided) {\r\n adapter.backFaceCulling = false;\r\n adapter.twoSidedLighting = true;\r\n }\r\n\r\n this._loader.loadMaterialAlphaProperties(context, material, babylonMaterial);\r\n\r\n // eslint-disable-next-line github/no-then\r\n return Promise.all(promises).then(() => {});\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_materials_unlit(loader));\r\n","import { type Nullable } from \"core/types\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { type IMaterial, type ITextureInfo } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { type IKHRMaterialsClearcoat } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_materials_clearcoat\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_materials_clearcoat extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_materials_clearcoat\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_clearcoat/README.md)\r\n * [Playground Sample](https://www.babylonjs-playground.com/frame.html#7F7PN6#8)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_clearcoat implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 190;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRMaterialsClearcoat>(context, material, this.name, async (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadClearCoatPropertiesAsync(extensionContext, extension, babylonMaterial));\r\n await Promise.all(promises);\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _loadClearCoatPropertiesAsync(context: string, properties: IKHRMaterialsClearcoat, babylonMaterial: Material): Promise<void> {\r\n const adapter = this._loader._getOrCreateMaterialAdapter(babylonMaterial);\r\n const promises = new Array<Promise<any>>();\r\n\r\n // Set non-texture properties immediately\r\n adapter.configureCoat();\r\n adapter.coatWeight = properties.clearcoatFactor !== undefined ? properties.clearcoatFactor : 0;\r\n adapter.coatRoughness = properties.clearcoatRoughnessFactor !== undefined ? properties.clearcoatRoughnessFactor : 0;\r\n\r\n // Load textures\r\n if (properties.clearcoatTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/clearcoatTexture`, properties.clearcoatTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (ClearCoat)`;\r\n adapter.coatWeightTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n if (properties.clearcoatRoughnessTexture) {\r\n (properties.clearcoatRoughnessTexture as ITextureInfo).nonColorData = true;\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/clearcoatRoughnessTexture`, properties.clearcoatRoughnessTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (ClearCoat Roughness)`;\r\n adapter.coatRoughnessTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n if (properties.clearcoatNormalTexture) {\r\n (properties.clearcoatNormalTexture as ITextureInfo).nonColorData = true;\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/clearcoatNormalTexture`, properties.clearcoatNormalTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (ClearCoat Normal)`;\r\n adapter.geometryCoatNormalTexture = texture;\r\n if (properties.clearcoatNormalTexture?.scale != undefined) {\r\n adapter.geometryCoatNormalTextureScale = properties.clearcoatNormalTexture.scale;\r\n }\r\n })\r\n );\r\n adapter.setNormalMapInversions(!babylonMaterial.getScene().useRightHandedSystem, babylonMaterial.getScene().useRightHandedSystem);\r\n }\r\n\r\n // eslint-disable-next-line github/no-then\r\n return Promise.all(promises).then(() => {});\r\n }\r\n}\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_materials_clearcoat(loader));\r\n","import { type Nullable } from \"core/types\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { type IMaterial, type ITextureInfo } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { type IKHRMaterialsCoat } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\n\r\nconst NAME = \"KHR_materials_coat\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_materials_coat extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_materials_coat\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/6cb2cb84b504c245c49cf2e9a8ae16d26f72ac97/extensions/2.0/Khronos/KHR_materials_coat/README.md)\r\n * @experimental\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_coat implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 191;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * Defines whether the KHR_materials_openpbr extension is used, indicating that\r\n * the material should be interpreted as OpenPBR (for coat, this might be necessary\r\n * to interpret anisotropy correctly).\r\n */\r\n private useOpenPBR: boolean = false;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRMaterialsCoat>(context, material, this.name, async (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n if (material.extensions && material.extensions[\"KHR_materials_openpbr\"]) {\r\n this.useOpenPBR = true;\r\n }\r\n promises.push(this._loadCoatPropertiesAsync(extensionContext, extension, babylonMaterial));\r\n await Promise.all(promises);\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _loadCoatPropertiesAsync(context: string, properties: IKHRMaterialsCoat, babylonMaterial: Material): Promise<void> {\r\n const adapter = this._loader._getOrCreateMaterialAdapter(babylonMaterial);\r\n const promises = new Array<Promise<any>>();\r\n\r\n // Set non-texture properties immediately\r\n adapter.configureCoat();\r\n adapter.coatWeight = properties.coatFactor !== undefined ? properties.coatFactor : 0;\r\n adapter.coatRoughness = properties.coatRoughnessFactor !== undefined ? properties.coatRoughnessFactor : 0;\r\n\r\n // Load textures\r\n if (properties.coatTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/coatTexture`, properties.coatTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Coat)`;\r\n adapter.coatWeightTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n if (properties.coatRoughnessTexture) {\r\n (properties.coatRoughnessTexture as ITextureInfo).nonColorData = true;\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/coatRoughnessTexture`, properties.coatRoughnessTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Coat Roughness)`;\r\n adapter.coatRoughnessTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n if (properties.coatNormalTexture) {\r\n (properties.coatNormalTexture as ITextureInfo).nonColorData = true;\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/coatNormalTexture`, properties.coatNormalTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Coat Normal)`;\r\n adapter.geometryCoatNormalTexture = texture;\r\n if (properties.coatNormalTexture?.scale != undefined) {\r\n adapter.geometryCoatNormalTextureScale = properties.coatNormalTexture.scale;\r\n }\r\n })\r\n );\r\n adapter.setNormalMapInversions(!babylonMaterial.getScene().useRightHandedSystem, babylonMaterial.getScene().useRightHandedSystem);\r\n }\r\n\r\n adapter.coatDarkening = properties.coatDarkeningFactor !== undefined ? properties.coatDarkeningFactor : 1;\r\n adapter.coatIor = properties.coatIor !== undefined ? properties.coatIor : 1.5;\r\n\r\n const colorFactor = Color3.White();\r\n if (properties.coatColorFactor !== undefined) {\r\n colorFactor.fromArray(properties.coatColorFactor);\r\n }\r\n\r\n adapter.coatColor = colorFactor;\r\n\r\n if (properties.coatColorTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/coatColorTexture`, properties.coatColorTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Coat Color)`;\r\n adapter.coatColorTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n // Set non-texture properties immediately\r\n const coatAnisotropyWeight = properties.coatAnisotropyStrength ?? 0;\r\n const coatAnisotropyAngle = properties.coatAnisotropyRotation ?? 0;\r\n\r\n adapter.coatRoughnessAnisotropy = coatAnisotropyWeight;\r\n adapter.geometryCoatTangentAngle = coatAnisotropyAngle;\r\n\r\n // Check if this is glTF-style anisotropy\r\n if (!this.useOpenPBR) {\r\n adapter.configureGltfStyleAnisotropy(true);\r\n }\r\n\r\n // Load texture if present\r\n if (properties.coatAnisotropyTexture) {\r\n (properties.coatAnisotropyTexture as ITextureInfo).nonColorData = true;\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/coatAnisotropyTexture`, properties.coatAnisotropyTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Coat Anisotropy)`;\r\n adapter.geometryCoatTangentTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n // eslint-disable-next-line github/no-then\r\n return Promise.all(promises).then(() => {});\r\n }\r\n}\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_materials_coat(loader));\r\n","import { type Nullable } from \"core/types\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { type IMaterial } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { type IKHRMaterialsIridescence } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_materials_iridescence\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_materials_iridescence extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_materials_iridescence\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_iridescence/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_iridescence implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 195;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRMaterialsIridescence>(context, material, this.name, async (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadIridescencePropertiesAsync(extensionContext, extension, babylonMaterial));\r\n // eslint-disable-next-line github/no-then\r\n return await Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _loadIridescencePropertiesAsync(context: string, properties: IKHRMaterialsIridescence, babylonMaterial: Material): Promise<void> {\r\n const adapter = this._loader._getOrCreateMaterialAdapter(babylonMaterial);\r\n const promises = new Array<Promise<any>>();\r\n\r\n // Set non-texture properties immediately\r\n adapter.thinFilmWeight = properties.iridescenceFactor ?? 0;\r\n adapter.thinFilmIor = properties.iridescenceIor ?? (properties as any).iridescenceIOR ?? 1.3;\r\n adapter.thinFilmThicknessMinimum = properties.iridescenceThicknessMinimum ?? 100;\r\n adapter.thinFilmThicknessMaximum = properties.iridescenceThicknessMaximum ?? 400;\r\n\r\n // Load textures\r\n if (properties.iridescenceTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/iridescenceTexture`, properties.iridescenceTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Iridescence)`;\r\n adapter.thinFilmWeightTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n if (properties.iridescenceThicknessTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/iridescenceThicknessTexture`, properties.iridescenceThicknessTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Iridescence Thickness)`;\r\n adapter.thinFilmThicknessTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n // eslint-disable-next-line github/no-then\r\n return Promise.all(promises).then(() => {});\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_materials_iridescence(loader));\r\n","import { type Nullable } from \"core/types\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { type IMaterial, type ITextureInfo } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { type IKHRMaterialsAnisotropy } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_materials_anisotropy\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_materials_anisotropy extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_materials_anisotropy\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_anisotropy)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_anisotropy implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 195;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRMaterialsAnisotropy>(context, material, this.name, async (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadAnisotropyPropertiesAsync(extensionContext, extension, babylonMaterial));\r\n await Promise.all(promises);\r\n });\r\n }\r\n\r\n private async _loadAnisotropyPropertiesAsync(context: string, properties: IKHRMaterialsAnisotropy, babylonMaterial: Material): Promise<void> {\r\n const adapter = this._loader._getOrCreateMaterialAdapter(babylonMaterial);\r\n const promises = new Array<Promise<any>>();\r\n\r\n // Set non-texture properties immediately\r\n const anisotropyWeight = properties.anisotropyStrength ?? 0;\r\n const anisotropyAngle = properties.anisotropyRotation ?? 0;\r\n\r\n adapter.specularRoughnessAnisotropy = anisotropyWeight;\r\n adapter.geometryTangentAngle = anisotropyAngle;\r\n\r\n // Check if this is glTF-style anisotropy\r\n const extensions = properties.extensions ?? {};\r\n if (!extensions.EXT_materials_anisotropy_openpbr || !extensions.EXT_materials_anisotropy_openpbr.openPbrAnisotropyEnabled) {\r\n adapter.configureGltfStyleAnisotropy(true);\r\n }\r\n\r\n // Load texture if present\r\n if (properties.anisotropyTexture) {\r\n (properties.anisotropyTexture as ITextureInfo).nonColorData = true;\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/anisotropyTexture`, properties.anisotropyTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Anisotropy Intensity)`;\r\n adapter.geometryTangentTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n await Promise.all(promises);\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_materials_anisotropy(loader));\r\n","import { type Nullable } from \"core/types\";\r\nimport { type Material } from \"core/Materials/material\";\r\n\r\nimport { type IMaterial } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { type IKHRMaterialsEmissiveStrength } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_materials_emissive_strength\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_materials_emissive_strength extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_materials_emissive_strength\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_emissive_strength implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 170;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRMaterialsEmissiveStrength>(context, material, this.name, async (extensionContext, extension) => {\r\n await this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial);\r\n this._loadEmissiveProperties(extensionContext, extension, babylonMaterial);\r\n return await Promise.resolve();\r\n });\r\n }\r\n\r\n private _loadEmissiveProperties(context: string, properties: IKHRMaterialsEmissiveStrength, babylonMaterial: Material): void {\r\n if (properties.emissiveStrength !== undefined) {\r\n const adapter = this._loader._getOrCreateMaterialAdapter(babylonMaterial);\r\n adapter.emissionLuminance = properties.emissiveStrength;\r\n }\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_materials_emissive_strength(loader));\r\n","import { type Nullable } from \"core/types\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { type IMaterial, type ITextureInfo } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { type IKHRMaterialsSheen } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_materials_sheen\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_materials_sheen extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_materials_sheen\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_sheen/README.md)\r\n * [Playground Sample](https://www.babylonjs-playground.com/frame.html#BNIZX6#4)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_sheen implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 190;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRMaterialsSheen>(context, material, this.name, async (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadSheenPropertiesAsync(extensionContext, extension, babylonMaterial));\r\n // eslint-disable-next-line github/no-then\r\n return await Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _loadSheenPropertiesAsync(context: string, properties: IKHRMaterialsSheen, babylonMaterial: Material): Promise<void> {\r\n const adapter = this._loader._getOrCreateMaterialAdapter(babylonMaterial);\r\n const promises = new Array<Promise<any>>();\r\n\r\n adapter.configureFuzz();\r\n\r\n // Set non-texture properties immediately\r\n const sheenColor = properties.sheenColorFactor !== undefined ? Color3.FromArray(properties.sheenColorFactor) : Color3.Black();\r\n const sheenRoughness = properties.sheenRoughnessFactor !== undefined ? properties.sheenRoughnessFactor : 0.0;\r\n\r\n adapter.fuzzWeight = 1; // KHR_materials_sheen assumes intensity of 1\r\n adapter.fuzzColor = sheenColor;\r\n adapter.fuzzRoughness = sheenRoughness;\r\n\r\n // Load textures\r\n if (properties.sheenColorTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/sheenColorTexture`, properties.sheenColorTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Sheen Color)`;\r\n adapter.fuzzColorTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n if (properties.sheenRoughnessTexture) {\r\n (properties.sheenRoughnessTexture as ITextureInfo).nonColorData = true;\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/sheenRoughnessTexture`, properties.sheenRoughnessTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Sheen Roughness)`;\r\n adapter.fuzzRoughnessTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n // eslint-disable-next-line github/no-then\r\n return Promise.all(promises).then(() => {});\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_materials_sheen(loader));\r\n","import { type Nullable } from \"core/types\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { type IMaterial, type ITextureInfo } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { type IKHRMaterialsFuzz } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_materials_fuzz\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_materials_fuzz extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_materials_fuzz\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/9734e44accd0dfb986ec5f376117aa00192745fe/extensions/2.0/Khronos/KHR_materials_fuzz/README.md)\r\n * @experimental\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_fuzz implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 190;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRMaterialsFuzz>(context, material, this.name, async (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadFuzzPropertiesAsync(extensionContext, extension, babylonMaterial));\r\n // eslint-disable-next-line github/no-then\r\n return await Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _loadFuzzPropertiesAsync(context: string, properties: IKHRMaterialsFuzz, babylonMaterial: Material): Promise<void> {\r\n const adapter = this._loader._getOrCreateMaterialAdapter(babylonMaterial);\r\n const promises = new Array<Promise<any>>();\r\n\r\n adapter.configureFuzz();\r\n\r\n // Set non-texture properties immediately\r\n adapter.fuzzWeight = properties.fuzzFactor !== undefined ? properties.fuzzFactor : 0.0;\r\n adapter.fuzzColor = properties.fuzzColorFactor !== undefined ? Color3.FromArray(properties.fuzzColorFactor) : Color3.White();\r\n adapter.fuzzRoughness = properties.fuzzRoughnessFactor !== undefined ? properties.fuzzRoughnessFactor : 0.5;\r\n\r\n // Load textures\r\n if (properties.fuzzTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/fuzzTexture`, properties.fuzzTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Fuzz)`;\r\n adapter.fuzzWeightTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n if (properties.fuzzColorTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/fuzzColorTexture`, properties.fuzzColorTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Fuzz Color)`;\r\n adapter.fuzzColorTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n if (properties.fuzzRoughnessTexture) {\r\n (properties.fuzzRoughnessTexture as ITextureInfo).nonColorData = true;\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/fuzzRoughnessTexture`, properties.fuzzRoughnessTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Fuzz Roughness)`;\r\n adapter.fuzzRoughnessTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n // eslint-disable-next-line github/no-then\r\n return Promise.all(promises).then(() => {});\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_materials_fuzz(loader));\r\n","import { type Nullable } from \"core/types\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { type IMaterial, type ITextureInfo } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { type IEXTMaterialsSpecularEdgeColor, type IKHRMaterialsSpecular } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_materials_specular\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_materials_specular extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_materials_specular\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_specular/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_specular implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 190;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRMaterialsSpecular>(context, material, this.name, async (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadSpecularPropertiesAsync(extensionContext, extension, babylonMaterial));\r\n // Handle the EXT_materials_specular_edge_color sub-extension\r\n // https://github.com/KhronosGroup/glTF/blob/2a1111b88f052cbd3e2d82abb9faee56e7494904/extensions/2.0/Vendor/EXT_materials_specular_edge_color/README.md\r\n const adapter = this._loader._getOrCreateMaterialAdapter(babylonMaterial);\r\n if (extension.extensions && extension.extensions.EXT_materials_specular_edge_color) {\r\n const specularEdgeColorExtension = extension.extensions.EXT_materials_specular_edge_color as IEXTMaterialsSpecularEdgeColor;\r\n if (specularEdgeColorExtension.specularEdgeColorEnabled) {\r\n adapter.enableSpecularEdgeColor(true);\r\n }\r\n }\r\n // eslint-disable-next-line github/no-then\r\n return await Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _loadSpecularPropertiesAsync(context: string, properties: IKHRMaterialsSpecular, babylonMaterial: Material): Promise<void> {\r\n const adapter = this._loader._getOrCreateMaterialAdapter(babylonMaterial);\r\n const promises = new Array<Promise<any>>();\r\n\r\n // Set non-texture properties immediately\r\n adapter.specularWeight = properties.specularFactor ?? 1.0;\r\n adapter.specularColor = properties.specularColorFactor !== undefined ? Color3.FromArray(properties.specularColorFactor) : new Color3(1, 1, 1);\r\n\r\n if (properties.specularTexture) {\r\n (properties.specularTexture as ITextureInfo).nonColorData = true;\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/specularTexture`, properties.specularTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Specular)`;\r\n adapter.specularWeightTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n if (properties.specularColorTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/specularColorTexture`, properties.specularColorTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Specular Color)`;\r\n adapter.specularColorTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n // eslint-disable-next-line github/no-then\r\n return Promise.all(promises).then(() => {});\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_materials_specular(loader));\r\n","import { type Nullable } from \"core/types\";\r\nimport { type Material } from \"core/Materials/material\";\r\n\r\nimport { type IMaterial } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { type IKHRMaterialsIor } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_materials_ior\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_materials_ior extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_materials_ior\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_ior/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_ior implements IGLTFLoaderExtension {\r\n /**\r\n * Default ior Value from the spec.\r\n */\r\n private static readonly _DEFAULT_IOR = 1.5;\r\n\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 180;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRMaterialsIor>(context, material, this.name, async (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadIorPropertiesAsync(extensionContext, extension, babylonMaterial));\r\n // eslint-disable-next-line github/no-then\r\n return await Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _loadIorPropertiesAsync(context: string, properties: IKHRMaterialsIor, babylonMaterial: Material): Promise<void> {\r\n const adapter = this._loader._getOrCreateMaterialAdapter(babylonMaterial);\r\n const indexOfRefraction = properties.ior !== undefined ? properties.ior : KHR_materials_ior._DEFAULT_IOR;\r\n adapter.specularIor = indexOfRefraction;\r\n\r\n return Promise.resolve();\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_materials_ior(loader));\r\n","import { type Nullable } from \"core/types\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader\";\r\n\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport { type Node } from \"core/node\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { type INode, type IMeshPrimitive, type IMesh } from \"../glTFLoaderInterfaces\";\r\nimport { type IKHRMaterialVariants_Mapping, type IKHRMaterialVariants_Variant, type IKHRMaterialVariants_Variants } from \"babylonjs-gltf2interface\";\r\nimport { type TransformNode } from \"core/Meshes/transformNode\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\nimport { type MaterialVariantsController } from \"../../glTFFileLoader\";\r\n\r\nconst NAME = \"KHR_materials_variants\";\r\n\r\nexport { MaterialVariantsController };\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // Define options related types here so they can be referenced in the options,\r\n // but export the types at the module level. This ensures the types are in the\r\n // correct namespace for UMD.\r\n type MaterialVariantsController = {\r\n /**\r\n * The list of available variant names for this asset.\r\n */\r\n readonly variants: readonly string[];\r\n\r\n /**\r\n * Gets or sets the selected variant.\r\n */\r\n selectedVariant: string;\r\n };\r\n\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_materials_variants extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_materials_variants\"]: Partial<{\r\n /**\r\n * Specifies the name of the variant that should be selected by default.\r\n */\r\n defaultVariant: string;\r\n\r\n /**\r\n * Defines a callback that will be called if material variants are loaded.\r\n * @experimental\r\n */\r\n onLoaded: (controller: MaterialVariantsController) => void;\r\n }>;\r\n }\r\n}\r\n\r\ninterface IVariantsMap {\r\n [key: string]: Array<{ mesh: AbstractMesh; material: Nullable<Material> }>;\r\n}\r\n\r\ninterface IExtensionMetadata {\r\n lastSelected: Nullable<string | Array<string>>;\r\n original: Array<{ mesh: AbstractMesh; material: Nullable<Material> }>;\r\n variants: IVariantsMap;\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_variants/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_variants implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n private _variants?: Array<IKHRMaterialVariants_Variant>;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME) && !this._loader.parent.skipMaterials;\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * Gets the list of available variant names for this asset.\r\n * @param rootNode The glTF root node\r\n * @returns the list of all the variant names for this model\r\n */\r\n public static GetAvailableVariants(rootNode: TransformNode): string[] {\r\n const extensionMetadata = this._GetExtensionMetadata(rootNode);\r\n if (!extensionMetadata) {\r\n return [];\r\n }\r\n\r\n return Object.keys(extensionMetadata.variants);\r\n }\r\n\r\n /**\r\n * Gets the list of available variant names for this asset.\r\n * @param rootNode The glTF root node\r\n * @returns the list of all the variant names for this model\r\n */\r\n public getAvailableVariants(rootNode: TransformNode): string[] {\r\n return KHR_materials_variants.GetAvailableVariants(rootNode);\r\n }\r\n\r\n /**\r\n * Select a variant given a variant name or a list of variant names.\r\n * @param rootNode The glTF root node\r\n * @param variantName The variant name(s) to select.\r\n */\r\n public static SelectVariant(rootNode: TransformNode, variantName: string | string[]): void {\r\n const extensionMetadata = this._GetExtensionMetadata(rootNode);\r\n if (!extensionMetadata) {\r\n throw new Error(`Cannot select variant on a glTF mesh that does not have the ${NAME} extension`);\r\n }\r\n\r\n const select = (variantName: string): void => {\r\n const entries = extensionMetadata.variants[variantName];\r\n if (entries) {\r\n for (const entry of entries) {\r\n entry.mesh.material = entry.material;\r\n }\r\n }\r\n };\r\n\r\n if (variantName instanceof Array) {\r\n for (const name of variantName) {\r\n select(name);\r\n }\r\n } else {\r\n select(variantName);\r\n }\r\n\r\n extensionMetadata.lastSelected = variantName;\r\n }\r\n\r\n /**\r\n * Select a variant given a variant name or a list of variant names.\r\n * @param rootNode The glTF root node\r\n * @param variantName The variant name(s) to select.\r\n */\r\n public selectVariant(rootNode: TransformNode, variantName: string | string[]): void {\r\n KHR_materials_variants.SelectVariant(rootNode, variantName);\r\n }\r\n\r\n /**\r\n * Reset back to the original before selecting a variant.\r\n * @param rootNode The glTF root node\r\n */\r\n public static Reset(rootNode: TransformNode): void {\r\n const extensionMetadata = this._GetExtensionMetadata(rootNode);\r\n if (!extensionMetadata) {\r\n throw new Error(`Cannot reset on a glTF mesh that does not have the ${NAME} extension`);\r\n }\r\n\r\n for (const entry of extensionMetadata.original) {\r\n entry.mesh.material = entry.material;\r\n }\r\n\r\n extensionMetadata.lastSelected = null;\r\n }\r\n\r\n /**\r\n * Reset back to the original before selecting a variant.\r\n * @param rootNode The glTF root node\r\n */\r\n public reset(rootNode: TransformNode): void {\r\n KHR_materials_variants.Reset(rootNode);\r\n }\r\n\r\n /**\r\n * Gets the last selected variant name(s) or null if original.\r\n * @param rootNode The glTF root node\r\n * @returns The selected variant name(s).\r\n */\r\n public static GetLastSelectedVariant(rootNode: TransformNode): Nullable<string | string[]> {\r\n const extensionMetadata = this._GetExtensionMetadata(rootNode);\r\n if (!extensionMetadata) {\r\n throw new Error(`Cannot get the last selected variant on a glTF mesh that does not have the ${NAME} extension`);\r\n }\r\n\r\n return extensionMetadata.lastSelected;\r\n }\r\n\r\n /**\r\n * Gets the last selected variant name(s) or null if original.\r\n * @param rootNode The glTF root node\r\n * @returns The selected variant name(s).\r\n */\r\n public getLastSelectedVariant(rootNode: TransformNode): Nullable<string | string[]> {\r\n return KHR_materials_variants.GetLastSelectedVariant(rootNode);\r\n }\r\n\r\n private static _GetExtensionMetadata(rootNode: Nullable<TransformNode>): Nullable<IExtensionMetadata> {\r\n return rootNode?._internalMetadata?.gltf?.[NAME] || null;\r\n }\r\n\r\n /** @internal */\r\n public onLoading(): void {\r\n const extensions = this._loader.gltf.extensions;\r\n if (extensions && extensions[this.name]) {\r\n const extension = extensions[this.name] as IKHRMaterialVariants_Variants;\r\n this._variants = extension.variants;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public onReady(): void {\r\n const rootNode = this._loader.rootBabylonMesh;\r\n if (rootNode) {\r\n const options = this._loader.parent.extensionOptions[NAME];\r\n if (options?.defaultVariant) {\r\n KHR_materials_variants.SelectVariant(rootNode, options.defaultVariant);\r\n }\r\n\r\n options?.onLoaded?.({\r\n get variants() {\r\n return KHR_materials_variants.GetAvailableVariants(rootNode);\r\n },\r\n get selectedVariant(): string {\r\n const lastSelectedVariant = KHR_materials_variants.GetLastSelectedVariant(rootNode);\r\n if (!lastSelectedVariant) {\r\n return KHR_materials_variants.GetAvailableVariants(rootNode)[0];\r\n }\r\n if (Array.isArray(lastSelectedVariant)) {\r\n return lastSelectedVariant[0];\r\n }\r\n return lastSelectedVariant;\r\n },\r\n set selectedVariant(variantName) {\r\n KHR_materials_variants.SelectVariant(rootNode, variantName);\r\n },\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public _loadMeshPrimitiveAsync(\r\n context: string,\r\n name: string,\r\n node: INode,\r\n mesh: IMesh,\r\n primitive: IMeshPrimitive,\r\n assign: (babylonMesh: AbstractMesh) => void\r\n ): Nullable<Promise<AbstractMesh>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRMaterialVariants_Mapping, AbstractMesh>(context, primitive, this.name, async (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n promises.push(\r\n this._loader._loadMeshPrimitiveAsync(context, name, node, mesh, primitive, (babylonMesh) => {\r\n assign(babylonMesh);\r\n\r\n if (babylonMesh instanceof Mesh) {\r\n const babylonDrawMode = GLTFLoader._GetDrawMode(context, primitive.mode);\r\n\r\n const root = this._loader.rootBabylonMesh;\r\n const metadata = root ? (root._internalMetadata = root._internalMetadata || {}) : {};\r\n const gltf = (metadata.gltf = metadata.gltf || {});\r\n const extensionMetadata: IExtensionMetadata = (gltf[NAME] = gltf[NAME] || { lastSelected: null, original: [], variants: {} });\r\n\r\n // Store the original material.\r\n extensionMetadata.original.push({ mesh: babylonMesh, material: babylonMesh.material });\r\n\r\n // For each mapping, look at the variants and make a new entry for them.\r\n for (let mappingIndex = 0; mappingIndex < extension.mappings.length; ++mappingIndex) {\r\n const mapping = extension.mappings[mappingIndex];\r\n const material = ArrayItem.Get(`${extensionContext}/mappings/${mappingIndex}/material`, this._loader.gltf.materials, mapping.material);\r\n promises.push(\r\n this._loader._loadMaterialAsync(`#/materials/${mapping.material}`, material, babylonMesh, babylonDrawMode, (babylonMaterial) => {\r\n for (let mappingVariantIndex = 0; mappingVariantIndex < mapping.variants.length; ++mappingVariantIndex) {\r\n const variantIndex = mapping.variants[mappingVariantIndex];\r\n const variant = ArrayItem.Get(`/extensions/${NAME}/variants/${variantIndex}`, this._variants, variantIndex);\r\n extensionMetadata.variants[variant.name] = extensionMetadata.variants[variant.name] || [];\r\n extensionMetadata.variants[variant.name].push({\r\n mesh: babylonMesh,\r\n material: babylonMaterial,\r\n });\r\n\r\n // Replace the target when original mesh is cloned\r\n babylonMesh.onClonedObservable.add((newOne: Node) => {\r\n const newMesh = newOne as Mesh;\r\n let metadata: Nullable<IExtensionMetadata>;\r\n let newRoot: Nullable<Node> = newMesh;\r\n\r\n // Find root to get medata\r\n do {\r\n newRoot = newRoot.parent;\r\n if (!newRoot) {\r\n return;\r\n }\r\n metadata = KHR_materials_variants._GetExtensionMetadata(newRoot as Mesh);\r\n } while (metadata === null);\r\n\r\n // Need to clone the metadata on the root (first time only)\r\n if (root && metadata === KHR_materials_variants._GetExtensionMetadata(root)) {\r\n // Copy main metadata\r\n newRoot._internalMetadata = {};\r\n for (const key in root._internalMetadata) {\r\n newRoot._internalMetadata[key] = root._internalMetadata[key];\r\n }\r\n\r\n // Copy the gltf metadata\r\n newRoot._internalMetadata.gltf = [];\r\n for (const key in root._internalMetadata.gltf) {\r\n newRoot._internalMetadata.gltf[key] = root._internalMetadata.gltf[key];\r\n }\r\n\r\n // Duplicate the extension specific metadata\r\n newRoot._internalMetadata.gltf[NAME] = { lastSelected: null, original: [], variants: {} };\r\n for (const original of metadata.original) {\r\n newRoot._internalMetadata.gltf[NAME].original.push({\r\n mesh: original.mesh,\r\n material: original.material,\r\n });\r\n }\r\n for (const key in metadata.variants) {\r\n if (Object.prototype.hasOwnProperty.call(metadata.variants, key)) {\r\n newRoot._internalMetadata.gltf[NAME].variants[key] = [];\r\n for (const variantEntry of metadata.variants[key]) {\r\n newRoot._internalMetadata.gltf[NAME].variants[key].push({\r\n mesh: variantEntry.mesh,\r\n material: variantEntry.material,\r\n });\r\n }\r\n }\r\n }\r\n\r\n metadata = newRoot._internalMetadata.gltf[NAME];\r\n }\r\n\r\n // Relocate\r\n for (const target of metadata!.original) {\r\n if (target.mesh === babylonMesh) {\r\n target.mesh = newMesh;\r\n }\r\n }\r\n for (const target of metadata!.variants[variant.name]) {\r\n if (target.mesh === babylonMesh) {\r\n target.mesh = newMesh;\r\n }\r\n }\r\n });\r\n }\r\n })\r\n );\r\n }\r\n }\r\n })\r\n );\r\n // eslint-disable-next-line github/no-then\r\n return await Promise.all(promises).then(([babylonMesh]) => {\r\n return babylonMesh;\r\n });\r\n });\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_materials_variants(loader));\r\n","import { type Nullable } from \"core/types\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { MultiMaterial } from \"core/Materials/multiMaterial\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { type IMaterial, type ITextureInfo } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { type IKHRMaterialsTransmission } from \"babylonjs-gltf2interface\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { type SubMesh } from \"core/Meshes/subMesh\";\r\nimport { type Texture } from \"core/Materials/Textures/texture\";\r\nimport { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport { type Observer, Observable } from \"core/Misc/observable\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { type Color4 } from \"core/Maths/math.color\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\ninterface ITransmissionHelperHolder {\r\n /**\r\n * @internal\r\n */\r\n _transmissionHelper: TransmissionHelper | undefined;\r\n}\r\n\r\ninterface ITransmissionHelperOptions {\r\n /**\r\n * The size of the render buffers (default: 1024)\r\n */\r\n renderSize: number;\r\n\r\n /**\r\n * The number of samples to use when generating the render target texture for opaque meshes (default: 4)\r\n */\r\n samples: number;\r\n\r\n /**\r\n * Scale to apply when selecting the LOD level to sample the refraction texture (default: 1)\r\n */\r\n lodGenerationScale: number;\r\n\r\n /**\r\n * Offset to apply when selecting the LOD level to sample the refraction texture (default: -4)\r\n */\r\n lodGenerationOffset: number;\r\n\r\n /**\r\n * Type of the refraction render target texture (default: TEXTURETYPE_HALF_FLOAT)\r\n */\r\n renderTargetTextureType: number;\r\n\r\n /**\r\n * Defines if the mipmaps for the refraction render target texture must be generated (default: true)\r\n */\r\n generateMipmaps: boolean;\r\n\r\n /**\r\n * Clear color of the opaque texture. If not provided, use the scene clear color (which will be converted to linear space).\r\n * If provided, should be in linear space\r\n */\r\n clearColor?: Color4;\r\n}\r\n\r\n/**\r\n * A class to handle setting up the rendering of opaque objects to be shown through transmissive objects.\r\n */\r\nclass TransmissionHelper {\r\n /**\r\n * Creates the default options for the helper.\r\n * @returns the default options\r\n */\r\n private static _GetDefaultOptions(): ITransmissionHelperOptions {\r\n return {\r\n renderSize: 1024,\r\n samples: 4,\r\n lodGenerationScale: 1,\r\n lodGenerationOffset: -4,\r\n renderTargetTextureType: Constants.TEXTURETYPE_HALF_FLOAT,\r\n generateMipmaps: true,\r\n };\r\n }\r\n\r\n /**\r\n * Stores the creation options.\r\n */\r\n private readonly _scene: Scene & ITransmissionHelperHolder;\r\n\r\n private _options: ITransmissionHelperOptions;\r\n\r\n private _opaqueRenderTarget: Nullable<RenderTargetTexture> = null;\r\n private _opaqueMeshesCache: AbstractMesh[] = [];\r\n private _transparentMeshesCache: AbstractMesh[] = [];\r\n private _materialObservers: { [id: string]: Nullable<Observer<AbstractMesh>> } = {};\r\n private _loader: GLTFLoader;\r\n\r\n // For MultiMaterial meshes with mixed opaque/translucent sub-materials:\r\n // maps mesh → set of materialIndex values that are translucent.\r\n private _translucentMaterialIndices: Map<AbstractMesh, Set<number>> = new Map();\r\n // Precomputed opaque-only submesh arrays for mixed meshes, swapped in\r\n // during the opaque RT render to avoid per-frame allocations.\r\n private _opaqueOnlySubMeshes: Map<AbstractMesh, SubMesh[]> = new Map();\r\n private _savedSubMeshes: Map<AbstractMesh, SubMesh[]> = new Map();\r\n\r\n /**\r\n * This observable will be notified with any error during the creation of the environment,\r\n * mainly texture creation errors.\r\n */\r\n public onErrorObservable: Observable<{ message?: string; exception?: any }>;\r\n\r\n /**\r\n * constructor\r\n * @param options Defines the options we want to customize the helper\r\n * @param scene The scene to add the material to\r\n * @param loader The glTF loader loading the asset\r\n */\r\n constructor(options: Partial<ITransmissionHelperOptions>, scene: Scene, loader: GLTFLoader) {\r\n this._options = {\r\n ...TransmissionHelper._GetDefaultOptions(),\r\n ...options,\r\n };\r\n this._scene = scene as any;\r\n this._scene._transmissionHelper = this;\r\n this._loader = loader;\r\n\r\n this.onErrorObservable = new Observable();\r\n this._scene.onDisposeObservable.addOnce(() => {\r\n this.dispose();\r\n });\r\n\r\n this._parseScene();\r\n this._setupRenderTargets();\r\n }\r\n\r\n /**\r\n * Updates the background according to the new options\r\n * @param options\r\n */\r\n public updateOptions(options: Partial<ITransmissionHelperOptions>) {\r\n // First check if any options are actually being changed. If not, exit.\r\n const newValues = Object.keys(options).filter((key: string) => (this._options as any)[key] !== (options as any)[key]);\r\n if (!newValues.length) {\r\n return;\r\n }\r\n\r\n const newOptions = {\r\n ...this._options,\r\n ...options,\r\n };\r\n\r\n const oldOptions = this._options;\r\n this._options = newOptions;\r\n\r\n // If size changes, recreate everything\r\n if (\r\n newOptions.renderSize !== oldOptions.renderSize ||\r\n newOptions.renderTargetTextureType !== oldOptions.renderTargetTextureType ||\r\n newOptions.generateMipmaps !== oldOptions.generateMipmaps ||\r\n !this._opaqueRenderTarget\r\n ) {\r\n this._setupRenderTargets();\r\n } else {\r\n this._opaqueRenderTarget.samples = newOptions.samples;\r\n this._opaqueRenderTarget.lodGenerationScale = newOptions.lodGenerationScale;\r\n this._opaqueRenderTarget.lodGenerationOffset = newOptions.lodGenerationOffset;\r\n }\r\n }\r\n\r\n /**\r\n * @returns the opaque render target texture or null if not available.\r\n */\r\n public getOpaqueTarget(): Nullable<Texture> {\r\n return this._opaqueRenderTarget;\r\n }\r\n\r\n /**\r\n * Classify a mesh's materials as transparent, opaque, or mixed.\r\n * Sets the refraction background texture on any translucent materials found.\r\n * For mixed MultiMaterial meshes, populates _translucentMaterialIndices so\r\n * their translucent submeshes can be excluded from the opaque render target.\r\n * @param mesh - The mesh to classify\r\n * @returns 'transparent' if all materials are translucent, 'opaque' if none are, 'mixed' if both\r\n */\r\n private _classifyMeshMaterials(mesh: AbstractMesh): \"transparent\" | \"opaque\" | \"mixed\" {\r\n const material = mesh.material;\r\n if (!material) {\r\n return \"opaque\";\r\n }\r\n\r\n // Single material case\r\n if (!(material instanceof MultiMaterial)) {\r\n if (!this._loader.isMatchingMaterialType(material)) {\r\n return \"opaque\";\r\n }\r\n const adapter = this._loader._getOrCreateMaterialAdapter(material);\r\n if (adapter.isTranslucent()) {\r\n adapter.refractionBackgroundTexture = this._opaqueRenderTarget;\r\n return \"transparent\";\r\n }\r\n return \"opaque\";\r\n }\r\n\r\n // MultiMaterial case: check each sub-material individually\r\n let hasTranslucent = false;\r\n let hasOpaque = false;\r\n const translucentIndices = new Set<number>();\r\n\r\n for (let i = 0; i < material.subMaterials.length; i++) {\r\n const subMat = material.subMaterials[i];\r\n if (!subMat) {\r\n hasOpaque = true;\r\n continue;\r\n }\r\n if (this._loader.isMatchingMaterialType(subMat)) {\r\n const adapter = this._loader._getOrCreateMaterialAdapter(subMat);\r\n if (adapter.isTranslucent()) {\r\n adapter.refractionBackgroundTexture = this._opaqueRenderTarget;\r\n hasTranslucent = true;\r\n translucentIndices.add(i);\r\n } else {\r\n hasOpaque = true;\r\n }\r\n } else {\r\n hasOpaque = true;\r\n }\r\n }\r\n\r\n if (hasTranslucent && hasOpaque) {\r\n this._translucentMaterialIndices.set(mesh, translucentIndices);\r\n this._rebuildOpaqueOnlySubMeshes(mesh, translucentIndices);\r\n return \"mixed\";\r\n }\r\n this._translucentMaterialIndices.delete(mesh);\r\n this._opaqueOnlySubMeshes.delete(mesh);\r\n return hasTranslucent ? \"transparent\" : \"opaque\";\r\n }\r\n\r\n /**\r\n * Rebuild the cached opaque-only submesh array for a mixed mesh.\r\n * Called when classification changes so the per-frame swap is allocation-free.\r\n * @param mesh - The mesh to rebuild for\r\n * @param translucentIndices - Set of materialIndex values that are translucent\r\n */\r\n private _rebuildOpaqueOnlySubMeshes(mesh: AbstractMesh, translucentIndices: Set<number>): void {\r\n if (mesh.subMeshes) {\r\n this._opaqueOnlySubMeshes.set(\r\n mesh,\r\n mesh.subMeshes.filter((sm: SubMesh) => !translucentIndices.has(sm.materialIndex))\r\n );\r\n }\r\n }\r\n\r\n private _addMesh(mesh: AbstractMesh): void {\r\n this._materialObservers[mesh.uniqueId] = mesh.onMaterialChangedObservable.add(this._onMeshMaterialChanged.bind(this));\r\n\r\n // we need to defer the processing because _addMesh may be called as part as an instance mesh creation, in which case some\r\n // internal properties are not setup yet, like _sourceMesh (needed when doing mesh.material below)\r\n Tools.SetImmediate(() => {\r\n if (mesh.material) {\r\n const classification = this._classifyMeshMaterials(mesh);\r\n if (classification === \"transparent\") {\r\n if (this._transparentMeshesCache.indexOf(mesh) === -1) {\r\n this._transparentMeshesCache.push(mesh);\r\n }\r\n } else {\r\n // Both 'opaque' and 'mixed' go in the opaque cache.\r\n // For 'mixed', the translucent submeshes are temporarily\r\n // excluded during the opaque render target render.\r\n if (this._opaqueMeshesCache.indexOf(mesh) === -1) {\r\n this._opaqueMeshesCache.push(mesh);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _removeMesh(mesh: AbstractMesh): void {\r\n mesh.onMaterialChangedObservable.remove(this._materialObservers[mesh.uniqueId]);\r\n delete this._materialObservers[mesh.uniqueId];\r\n let idx = this._transparentMeshesCache.indexOf(mesh);\r\n if (idx !== -1) {\r\n this._transparentMeshesCache.splice(idx, 1);\r\n }\r\n idx = this._opaqueMeshesCache.indexOf(mesh);\r\n if (idx !== -1) {\r\n this._opaqueMeshesCache.splice(idx, 1);\r\n }\r\n this._translucentMaterialIndices.delete(mesh);\r\n this._opaqueOnlySubMeshes.delete(mesh);\r\n }\r\n\r\n private _parseScene(): void {\r\n this._scene.meshes.forEach(this._addMesh.bind(this));\r\n // Listen for when a mesh is added to the scene and add it to our cache lists.\r\n this._scene.onNewMeshAddedObservable.add(this._addMesh.bind(this));\r\n // Listen for when a mesh is removed from to the scene and remove it from our cache lists.\r\n this._scene.onMeshRemovedObservable.add(this._removeMesh.bind(this));\r\n }\r\n\r\n // When one of the meshes in the scene has its material changed, make sure that it's in the correct cache list.\r\n private _onMeshMaterialChanged(mesh: AbstractMesh) {\r\n const transparentIdx = this._transparentMeshesCache.indexOf(mesh);\r\n const opaqueIdx = this._opaqueMeshesCache.indexOf(mesh);\r\n\r\n const classification = this._classifyMeshMaterials(mesh);\r\n\r\n if (classification === \"transparent\") {\r\n // Fully translucent: move to transparent cache\r\n if (opaqueIdx !== -1) {\r\n this._opaqueMeshesCache.splice(opaqueIdx, 1);\r\n this._transparentMeshesCache.push(mesh);\r\n } else if (transparentIdx === -1) {\r\n this._transparentMeshesCache.push(mesh);\r\n }\r\n } else {\r\n // Opaque or mixed: move to opaque cache (mixed meshes have their\r\n // translucent submeshes excluded during opaque RT render)\r\n if (transparentIdx !== -1) {\r\n this._transparentMeshesCache.splice(transparentIdx, 1);\r\n this._opaqueMeshesCache.push(mesh);\r\n } else if (opaqueIdx === -1) {\r\n this._opaqueMeshesCache.push(mesh);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n * Check if the opaque render target has not been disposed and can still be used.\r\n * @returns\r\n */\r\n public _isRenderTargetValid() {\r\n return this._opaqueRenderTarget?.getInternalTexture() !== null;\r\n }\r\n\r\n /**\r\n * @internal\r\n * Setup the render targets according to the specified options.\r\n */\r\n public _setupRenderTargets(): void {\r\n if (this._opaqueRenderTarget) {\r\n this._opaqueRenderTarget.dispose();\r\n }\r\n this._opaqueRenderTarget = new RenderTargetTexture(\r\n \"opaqueSceneTexture\",\r\n this._options.renderSize,\r\n this._scene,\r\n this._options.generateMipmaps,\r\n undefined,\r\n this._options.renderTargetTextureType\r\n );\r\n this._opaqueRenderTarget.ignoreCameraViewport = true;\r\n this._opaqueRenderTarget.renderList = this._opaqueMeshesCache;\r\n this._opaqueRenderTarget.clearColor = this._options.clearColor?.clone() ?? this._scene.clearColor.clone();\r\n this._opaqueRenderTarget.clearColor.a = 0.0;\r\n this._opaqueRenderTarget.gammaSpace = false;\r\n this._opaqueRenderTarget.lodGenerationScale = this._options.lodGenerationScale;\r\n this._opaqueRenderTarget.lodGenerationOffset = this._options.lodGenerationOffset;\r\n this._opaqueRenderTarget.samples = this._options.samples;\r\n this._opaqueRenderTarget.renderSprites = true;\r\n this._opaqueRenderTarget.renderParticles = true;\r\n this._opaqueRenderTarget.disableImageProcessing = true;\r\n\r\n let saveSceneEnvIntensity: number;\r\n this._opaqueRenderTarget.onBeforeBindObservable.add((opaqueRenderTarget) => {\r\n saveSceneEnvIntensity = this._scene.environmentIntensity;\r\n this._scene.environmentIntensity = 1.0;\r\n if (!this._options.clearColor) {\r\n this._scene.clearColor.toLinearSpaceToRef(opaqueRenderTarget.clearColor, this._scene.getEngine().useExactSrgbConversions);\r\n } else {\r\n opaqueRenderTarget.clearColor.copyFrom(this._options.clearColor);\r\n }\r\n opaqueRenderTarget.clearColor.a = 0.0;\r\n\r\n // For mixed MultiMaterial meshes, swap in the precomputed opaque-only\r\n // submesh array so translucent submeshes don't render into the opaque texture.\r\n const tlEntries = this._opaqueOnlySubMeshes.entries();\r\n for (let tlEntry = tlEntries.next(); !tlEntry.done; tlEntry = tlEntries.next()) {\r\n const mesh = tlEntry.value[0];\r\n const opaqueOnly = tlEntry.value[1];\r\n if (mesh.subMeshes) {\r\n this._savedSubMeshes.set(mesh, mesh.subMeshes);\r\n mesh.subMeshes = opaqueOnly;\r\n }\r\n }\r\n });\r\n this._opaqueRenderTarget.onAfterUnbindObservable.add(() => {\r\n this._scene.environmentIntensity = saveSceneEnvIntensity;\r\n\r\n // Restore the full submesh list after the opaque RT render\r\n const savedEntries = this._savedSubMeshes.entries();\r\n for (let savedEntry = savedEntries.next(); !savedEntry.done; savedEntry = savedEntries.next()) {\r\n savedEntry.value[0].subMeshes = savedEntry.value[1];\r\n }\r\n this._savedSubMeshes.clear();\r\n });\r\n\r\n // Update refraction textures on transparent and mixed meshes\r\n for (const mesh of this._transparentMeshesCache) {\r\n if (mesh.material) {\r\n this._classifyMeshMaterials(mesh);\r\n }\r\n }\r\n const mixedEntries = this._translucentMaterialIndices.entries();\r\n for (let mixedEntry = mixedEntries.next(); !mixedEntry.done; mixedEntry = mixedEntries.next()) {\r\n const mesh = mixedEntry.value[0];\r\n if (mesh.material) {\r\n this._classifyMeshMaterials(mesh);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Dispose all the elements created by the Helper.\r\n */\r\n public dispose(): void {\r\n this._scene._transmissionHelper = undefined;\r\n if (this._opaqueRenderTarget) {\r\n this._opaqueRenderTarget.dispose();\r\n this._opaqueRenderTarget = null;\r\n }\r\n this._transparentMeshesCache = [];\r\n this._opaqueMeshesCache = [];\r\n this._translucentMaterialIndices.clear();\r\n this._opaqueOnlySubMeshes.clear();\r\n this._savedSubMeshes.clear();\r\n }\r\n}\r\n\r\nconst NAME = \"KHR_materials_transmission\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_materials_transmission extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_materials_transmission\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_transmission/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_transmission implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 175;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n if (this.enabled) {\r\n loader.parent.transparencyAsCoverage = true;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRMaterialsTransmission>(context, material, this.name, async (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadTransparentPropertiesAsync(extensionContext, material, babylonMaterial, extension));\r\n // eslint-disable-next-line github/no-then\r\n return await Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax, @typescript-eslint/promise-function-async\r\n private _loadTransparentPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material, extension: IKHRMaterialsTransmission): Promise<void> {\r\n const adapter = this._loader._getOrCreateMaterialAdapter(babylonMaterial);\r\n const transmissionWeight = extension.transmissionFactor !== undefined ? extension.transmissionFactor : 0.0;\r\n\r\n if (transmissionWeight === 0 || !adapter) {\r\n return Promise.resolve();\r\n }\r\n\r\n // Set transmission properties immediately via adapter\r\n adapter.configureTransmission();\r\n adapter.transmissionWeight = transmissionWeight;\r\n\r\n // Handle transmission helper setup (only needed for PBR materials)\r\n if (transmissionWeight > 0 && !this._loader.parent.dontUseTransmissionHelper) {\r\n const scene = babylonMaterial.getScene() as unknown as ITransmissionHelperHolder;\r\n if (!scene._transmissionHelper) {\r\n new TransmissionHelper({}, babylonMaterial.getScene(), this._loader);\r\n } else if (!scene._transmissionHelper?._isRenderTargetValid()) {\r\n // If the render target is not valid, recreate it.\r\n scene._transmissionHelper?._setupRenderTargets();\r\n }\r\n }\r\n\r\n // Load texture if present\r\n let texturePromise: Promise<Nullable<BaseTexture>> = Promise.resolve(null);\r\n if (extension.transmissionTexture) {\r\n (extension.transmissionTexture as ITextureInfo).nonColorData = true;\r\n texturePromise = this._loader.loadTextureInfoAsync(`${context}/transmissionTexture`, extension.transmissionTexture, (texture: BaseTexture) => {\r\n texture.name = `${babylonMaterial.name} (Transmission)`;\r\n adapter.transmissionWeightTexture = texture;\r\n });\r\n }\r\n\r\n // eslint-disable-next-line github/no-then\r\n return texturePromise.then(() => {});\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_materials_transmission(loader));\r\n","/* eslint-disable github/no-then */\r\nimport { type Nullable } from \"core/types\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { type IMaterial, type ITextureInfo } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { type IKHRMaterialsDiffuseTransmission } from \"babylonjs-gltf2interface\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_materials_diffuse_transmission\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_materials_diffuse_transmission extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_materials_diffuse_transmission\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Proposed Specification](https://github.com/KhronosGroup/glTF/pull/1825)\r\n * !!! Experimental Extension Subject to Changes !!!\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_diffuse_transmission implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 174;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n if (this.enabled) {\r\n loader.parent.transparencyAsCoverage = true;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRMaterialsDiffuseTransmission>(context, material, this.name, async (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadTranslucentPropertiesAsync(extensionContext, material, babylonMaterial, extension));\r\n return await Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax, @typescript-eslint/promise-function-async\r\n private _loadTranslucentPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material, extension: IKHRMaterialsDiffuseTransmission): Promise<void> {\r\n const adapter = this._loader._getOrCreateMaterialAdapter(babylonMaterial);\r\n adapter.configureSubsurface();\r\n adapter.subsurfaceWeight = extension.diffuseTransmissionFactor ?? 0;\r\n\r\n adapter.diffuseTransmissionTint = extension.diffuseTransmissionColorFactor !== undefined ? Color3.FromArray(extension.diffuseTransmissionColorFactor) : Color3.White();\r\n\r\n const promises = new Array<Promise<any>>();\r\n\r\n if (extension.diffuseTransmissionTexture) {\r\n (extension.diffuseTransmissionTexture as ITextureInfo).nonColorData = true;\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/diffuseTransmissionTexture`, extension.diffuseTransmissionTexture).then((texture: BaseTexture) => {\r\n texture.name = `${babylonMaterial.name} (Diffuse Transmission)`;\r\n adapter.subsurfaceWeightTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n if (extension.diffuseTransmissionColorTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/diffuseTransmissionColorTexture`, extension.diffuseTransmissionColorTexture).then((texture: BaseTexture) => {\r\n texture.name = `${babylonMaterial.name} (Diffuse Transmission Color)`;\r\n adapter.diffuseTransmissionTintTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n return Promise.all(promises).then(() => {});\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_materials_diffuse_transmission(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type Nullable } from \"core/types\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { type IMaterial, type ITextureInfo } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { type IKHRMaterialsVolume } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_materials_volume\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_materials_volume extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_materials_volume\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_volume/README.md)\r\n * @since 5.0.0\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_volume implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 173;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n if (this.enabled) {\r\n // We need to disable instance usage because the attenuation factor depends on the node scale of each individual mesh\r\n this._loader._disableInstancedMesh++;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n if (this.enabled) {\r\n this._loader._disableInstancedMesh--;\r\n }\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRMaterialsVolume>(context, material, this.name, async (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadVolumePropertiesAsync(extensionContext, material, babylonMaterial, extension));\r\n // eslint-disable-next-line github/no-then\r\n return await Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _loadVolumePropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material, extension: IKHRMaterialsVolume): Promise<void> {\r\n const adapter = this._loader._getOrCreateMaterialAdapter(babylonMaterial);\r\n\r\n // If transparency isn't enabled already, this extension shouldn't do anything.\r\n // i.e. it requires either the KHR_materials_transmission or KHR_materials_diffuse_transmission extensions.\r\n if ((adapter.transmissionWeight === 0 && adapter.subsurfaceWeight === 0) || !extension.thicknessFactor) {\r\n return Promise.resolve();\r\n }\r\n\r\n adapter.geometryThinWalled = false;\r\n const attenuationDistance = extension.attenuationDistance !== undefined ? extension.attenuationDistance : Number.MAX_VALUE;\r\n const attenuationColor = extension.attenuationColor !== undefined && extension.attenuationColor.length == 3 ? Color3.FromArray(extension.attenuationColor) : Color3.White();\r\n adapter.configureVolume();\r\n adapter.transmissionColor = attenuationColor;\r\n adapter.transmissionDepth = attenuationDistance;\r\n\r\n adapter.volumeThickness = extension.thicknessFactor ?? 0;\r\n\r\n const promises = new Array<Promise<any>>();\r\n\r\n if (extension.thicknessTexture) {\r\n (extension.thicknessTexture as ITextureInfo).nonColorData = true;\r\n // eslint-disable-next-line github/no-then\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/thicknessTexture`, extension.thicknessTexture, (texture: BaseTexture) => {\r\n texture.name = `${babylonMaterial.name} (Thickness)`;\r\n adapter.volumeThicknessTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n // eslint-disable-next-line github/no-then\r\n return Promise.all(promises).then(() => {});\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_materials_volume(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type Nullable } from \"core/types\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { type IMaterial, type ITextureInfo } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { type IKHRMaterialsVolumeScatter } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_materials_volume_scatter\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_materials_volume_scatter extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_materials_volume_scatter\"]: {};\r\n }\r\n}\r\n\r\nfunction multiScatterToSingleScatterAlbedo(multiScatter: Color3): Vector3 {\r\n const multiScatterAlbedo = new Vector3(multiScatter.r, multiScatter.g, multiScatter.b);\r\n const s: Vector3 = new Vector3(4.09712, 4.09712, 4.09712);\r\n s.addInPlace(new Vector3(4.20863, 4.20863, 4.20863).multiplyInPlace(multiScatterAlbedo));\r\n\r\n const p: Vector3 = new Vector3(9.59217, 9.59217, 9.59217);\r\n p.addInPlace(new Vector3(41.6808, 41.6808, 41.6808).multiplyInPlace(multiScatterAlbedo));\r\n p.addInPlace(new Vector3(17.7126, 17.7126, 17.7126).multiplyInPlace(multiScatterAlbedo.multiply(multiScatterAlbedo)));\r\n s.subtractInPlace(new Vector3(Math.sqrt(p.x), Math.sqrt(p.y), Math.sqrt(p.z)));\r\n return new Vector3(1.0, 1.0, 1.0).subtract(s.multiply(s));\r\n}\r\n\r\n/**\r\n * TODO: In-progress specification\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/7ea427ed55d44427e83c0a6d1c87068b1a4151c5/extensions/2.0/Khronos/KHR_materials_volume_scatter/README.md)\r\n * @experimental\r\n * @since 9.0.0\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_volume_scatter implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 172;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n if (this.enabled) {\r\n // We need to disable instance usage because the attenuation factor depends on the node scale of each individual mesh\r\n this._loader._disableInstancedMesh++;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n if (this.enabled) {\r\n this._loader._disableInstancedMesh--;\r\n }\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRMaterialsVolumeScatter>(context, material, this.name, async (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadVolumePropertiesAsync(extensionContext, material, babylonMaterial, extension));\r\n // eslint-disable-next-line github/no-then\r\n return await Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _loadVolumePropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material, extension: IKHRMaterialsVolumeScatter): Promise<void> {\r\n const adapter = this._loader._getOrCreateMaterialAdapter(babylonMaterial);\r\n\r\n // If transparency isn't enabled already, this extension shouldn't do anything.\r\n // i.e. it requires either the KHR_materials_transmission or KHR_materials_diffuse_transmission extensions.\r\n // Additionally, this already needs to be a volumetric material to apply this extension.\r\n if ((adapter.transmissionWeight === 0 && adapter.subsurfaceWeight === 0) || adapter.geometryThinWalled) {\r\n return Promise.resolve();\r\n }\r\n\r\n const scatterColor =\r\n extension.multiscatterColorFactor !== undefined && extension.multiscatterColorFactor.length == 3 ? Color3.FromArray(extension.multiscatterColorFactor) : Color3.Black();\r\n const scatterAnisotropy = extension.scatterAnisotropy !== undefined ? extension.scatterAnisotropy : 0;\r\n\r\n // If diffuse_transmission, apply props to subsurface\r\n // If transmission, apply props to transmission\r\n // Load texture if present\r\n let texturePromise: Promise<Nullable<BaseTexture>> = Promise.resolve(null);\r\n if (extension.multiscatterColorTexture) {\r\n (extension.multiscatterColorTexture as ITextureInfo).nonColorData = true;\r\n texturePromise = this._loader.loadTextureInfoAsync(`${context}/multiscatterColorTexture`, extension.multiscatterColorTexture, (texture: BaseTexture) => {\r\n texture.name = `${babylonMaterial.name} (Scatter Color)`;\r\n if (adapter.transmissionWeight > 0) {\r\n adapter.transmissionScatterTexture = texture;\r\n }\r\n if (adapter.subsurfaceWeight > 0) {\r\n adapter.subsurfaceColorTexture = texture;\r\n }\r\n });\r\n }\r\n\r\n const extinctionCoefficient = new Vector3(-Math.log(adapter.transmissionColor.r), -Math.log(adapter.transmissionColor.g), -Math.log(adapter.transmissionColor.b));\r\n extinctionCoefficient.scaleInPlace(1 / Math.max(adapter.transmissionDepth, 0.000001));\r\n\r\n // In glTF, both the translucency volume and subsurface volume use the same input parameters.\r\n // We'll apply them to both, as appropriate.\r\n if (adapter.transmissionWeight > 0) {\r\n const singleScatterAlbedo = multiScatterToSingleScatterAlbedo(scatterColor);\r\n const scatteringCoefficient = extinctionCoefficient.multiply(singleScatterAlbedo);\r\n\r\n // The scattering coefficient in OpenPBR is defined as per unit distance, so we need to scale it back up by the depth.\r\n scatteringCoefficient.scaleInPlace(adapter.transmissionDepth);\r\n adapter.transmissionScatter.set(scatteringCoefficient.x, scatteringCoefficient.y, scatteringCoefficient.z);\r\n\r\n adapter.transmissionScatterAnisotropy = scatterAnisotropy;\r\n }\r\n // Subsurface volume\r\n if (adapter.subsurfaceWeight > 0) {\r\n adapter.subsurfaceScatterAnisotropy = scatterAnisotropy;\r\n adapter.subsurfaceColor = scatterColor;\r\n\r\n const mfp = new Vector3(\r\n extinctionCoefficient.x !== 0 ? 1.0 / extinctionCoefficient.x : 1.0,\r\n extinctionCoefficient.y !== 0 ? 1.0 / extinctionCoefficient.y : 1.0,\r\n extinctionCoefficient.z !== 0 ? 1.0 / extinctionCoefficient.z : 1.0\r\n );\r\n\r\n adapter.subsurfaceRadius = Math.max(mfp.x, mfp.y, mfp.z);\r\n adapter.subsurfaceRadiusScale = new Color3(mfp.x / adapter.subsurfaceRadius, mfp.y / adapter.subsurfaceRadius, mfp.z / adapter.subsurfaceRadius);\r\n }\r\n\r\n // eslint-disable-next-line github/no-then\r\n return texturePromise.then(() => {});\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_materials_volume_scatter(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type Nullable } from \"core/types\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { type IMaterial } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { type IKHRMaterialsDispersion } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_materials_dispersion\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_materials_dispersion extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_materials_dispersion\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/87bd64a7f5e23c84b6aef2e6082069583ed0ddb4/extensions/2.0/Khronos/KHR_materials_dispersion/README.md)\r\n * @experimental\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_dispersion implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 174;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRMaterialsDispersion>(context, material, this.name, async (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadDispersionPropertiesAsync(extensionContext, material, babylonMaterial, extension));\r\n // eslint-disable-next-line github/no-then\r\n return await Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _loadDispersionPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material, extension: IKHRMaterialsDispersion): Promise<void> {\r\n const adapter = this._loader._getOrCreateMaterialAdapter(babylonMaterial);\r\n\r\n // If transparency isn't enabled already, this extension shouldn't do anything.\r\n // i.e. it requires either the KHR_materials_transmission or KHR_materials_diffuse_transmission extensions.\r\n if (adapter.transmissionWeight == 0 || !extension.dispersion) {\r\n return Promise.resolve();\r\n }\r\n\r\n adapter.transmissionDispersionAbbeNumber = 20.0;\r\n adapter.transmissionDispersionScale = extension.dispersion;\r\n\r\n return Promise.resolve();\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_materials_dispersion(loader));\r\n","import { type Nullable } from \"core/types\";\r\nimport { type Material } from \"core/Materials/material\";\r\n\r\nimport { type IMaterial } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { type IKHRMaterialsDiffuseRoughness } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_materials_diffuse_roughness\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_materials_diffuse_roughness extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_materials_diffuse_roughness\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/b102d2d2b40d44a8776800bb2bf85e218853c17d/extensions/2.0/Khronos/KHR_materials_diffuse_roughness/README.md)\r\n * @experimental\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_diffuse_roughness implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 190;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRMaterialsDiffuseRoughness>(context, material, this.name, async (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));\r\n promises.push(this._loadDiffuseRoughnessPropertiesAsync(extensionContext, extension, babylonMaterial));\r\n // eslint-disable-next-line github/no-then\r\n return await Promise.all(promises).then(() => {});\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _loadDiffuseRoughnessPropertiesAsync(context: string, properties: IKHRMaterialsDiffuseRoughness, babylonMaterial: Material): Promise<void> {\r\n const adapter = this._loader._getOrCreateMaterialAdapter(babylonMaterial);\r\n const promises = new Array<Promise<any>>();\r\n\r\n adapter.baseDiffuseRoughness = properties.diffuseRoughnessFactor ?? 0;\r\n\r\n if (properties.diffuseRoughnessTexture) {\r\n promises.push(\r\n this._loader.loadTextureInfoAsync(`${context}/diffuseRoughnessTexture`, properties.diffuseRoughnessTexture, (texture) => {\r\n texture.name = `${babylonMaterial.name} (Diffuse Roughness)`;\r\n adapter.baseDiffuseRoughnessTexture = texture;\r\n })\r\n );\r\n }\r\n\r\n // eslint-disable-next-line github/no-then\r\n return Promise.all(promises).then(() => {});\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_materials_diffuse_roughness(loader));\r\n","import { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { type GLTFLoader } from \"../glTFLoader\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_mesh_quantization\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_mesh_quantization extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_mesh_quantization\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_mesh_quantization/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_mesh_quantization implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this.enabled = loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {}\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_mesh_quantization(loader));\r\n","import { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader\";\r\nimport { type ITexture } from \"../glTFLoaderInterfaces\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type IKHRTextureBasisU } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_texture_basisu\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_texture_basisu extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_texture_basisu\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_texture_basisu/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_texture_basisu implements IGLTFLoaderExtension {\r\n /** The name of this extension. */\r\n public readonly name = NAME;\r\n\r\n /** Defines whether this extension is enabled. */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public _loadTextureAsync(context: string, texture: ITexture, assign: (babylonTexture: BaseTexture) => void): Nullable<Promise<BaseTexture>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRTextureBasisU, BaseTexture>(context, texture, this.name, async (extensionContext, extension) => {\r\n const sampler = texture.sampler == undefined ? GLTFLoader.DefaultSampler : ArrayItem.Get(`${context}/sampler`, this._loader.gltf.samplers, texture.sampler);\r\n const image = ArrayItem.Get(`${extensionContext}/source`, this._loader.gltf.images, extension.source);\r\n return await this._loader._createTextureAsync(\r\n context,\r\n sampler,\r\n image,\r\n (babylonTexture) => {\r\n assign(babylonTexture);\r\n },\r\n texture._textureInfo.nonColorData ? { useRGBAIfASTCBC7NotAvailableWhenUASTC: true } : undefined,\r\n !texture._textureInfo.nonColorData\r\n );\r\n });\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_texture_basisu(loader));\r\n","import { type Nullable } from \"core/types\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\n\r\nimport { type ITextureInfo } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { type IKHRTextureTransform } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_texture_transform\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_texture_transform extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_texture_transform\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_texture_transform/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_texture_transform implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadTextureInfoAsync(context: string, textureInfo: ITextureInfo, assign: (babylonTexture: BaseTexture) => void): Nullable<Promise<BaseTexture>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRTextureTransform, BaseTexture>(context, textureInfo, this.name, async (extensionContext, extension) => {\r\n return await this._loader.loadTextureInfoAsync(context, textureInfo, (babylonTexture) => {\r\n if (!(babylonTexture instanceof Texture)) {\r\n throw new Error(`${extensionContext}: Texture type not supported`);\r\n }\r\n\r\n if (extension.offset) {\r\n babylonTexture.uOffset = extension.offset[0];\r\n babylonTexture.vOffset = extension.offset[1];\r\n }\r\n\r\n // Always rotate around the origin.\r\n babylonTexture.uRotationCenter = 0;\r\n babylonTexture.vRotationCenter = 0;\r\n\r\n if (extension.rotation) {\r\n babylonTexture.wAng = -extension.rotation;\r\n }\r\n\r\n if (extension.scale) {\r\n babylonTexture.uScale = extension.scale[0];\r\n babylonTexture.vScale = extension.scale[1];\r\n }\r\n\r\n if (extension.texCoord != undefined) {\r\n babylonTexture.coordinatesIndex = extension.texCoord;\r\n }\r\n\r\n assign(babylonTexture);\r\n });\r\n });\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_texture_transform(loader));\r\n","import { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { type GLTFLoader } from \"../glTFLoader\";\r\nimport { type IKHRXmpJsonLd_Gltf, type IKHRXmpJsonLd_Node } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_xmp_json_ld\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_xmp_json_ld extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_xmp_json_ld\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_xmp_json_ld/README.md)\r\n * @since 5.0.0\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_xmp_json_ld implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 100;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * Called after the loader state changes to LOADING.\r\n */\r\n public onLoading(): void {\r\n if (this._loader.rootBabylonMesh === null) {\r\n return;\r\n }\r\n\r\n const xmpGltf = this._loader.gltf.extensions?.KHR_xmp_json_ld as IKHRXmpJsonLd_Gltf;\r\n const xmpNode = this._loader.gltf.asset?.extensions?.KHR_xmp_json_ld as IKHRXmpJsonLd_Node;\r\n if (xmpGltf && xmpNode) {\r\n const packet = +xmpNode.packet;\r\n if (xmpGltf.packets && packet < xmpGltf.packets.length) {\r\n this._loader.rootBabylonMesh.metadata = this._loader.rootBabylonMesh.metadata || {};\r\n this._loader.rootBabylonMesh.metadata.xmp = xmpGltf.packets[packet];\r\n }\r\n }\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_xmp_json_ld(loader));\r\n","import { Animation } from \"core/Animations/animation\";\r\nimport { Quaternion, Vector3 } from \"core/Maths/math.vector\";\r\nimport { type INode } from \"./glTFLoaderInterfaces\";\r\nimport { type IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { SetInterpolationForKey } from \"./Extensions/objectModelMapping\";\r\n\r\n/** @internal */\r\nexport type GetValueFn = (target: any, source: Float32Array, offset: number, scale: number) => any;\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function getVector3(_target: any, source: Float32Array, offset: number, scale: number): Vector3 {\r\n return Vector3.FromArray(source, offset).scaleInPlace(scale);\r\n}\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function getQuaternion(_target: any, source: Float32Array, offset: number, scale: number): Quaternion {\r\n return Quaternion.FromArray(source, offset).scaleInPlace(scale);\r\n}\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function getWeights(target: INode, source: Float32Array, offset: number, scale: number): Array<number> {\r\n const value = new Array<number>(target._numMorphTargets!);\r\n for (let i = 0; i < value.length; i++) {\r\n value[i] = source[offset++] * scale;\r\n }\r\n\r\n return value;\r\n}\r\n\r\n/** @internal */\r\nexport abstract class AnimationPropertyInfo {\r\n /** @internal */\r\n public constructor(\r\n public readonly type: number,\r\n public readonly name: string,\r\n public readonly getValue: GetValueFn,\r\n public readonly getStride: (target: any) => number\r\n ) {}\r\n\r\n protected _buildAnimation(name: string, fps: number, keys: any[]): Animation {\r\n const babylonAnimation = new Animation(name, this.name, fps, this.type);\r\n babylonAnimation.setKeys(keys, true);\r\n return babylonAnimation;\r\n }\r\n\r\n /** @internal */\r\n public abstract buildAnimations(target: any, name: string, fps: number, keys: any[]): { babylonAnimatable: IAnimatable; babylonAnimation: Animation }[];\r\n}\r\n\r\n/** @internal */\r\nexport class TransformNodeAnimationPropertyInfo extends AnimationPropertyInfo {\r\n /** @internal */\r\n public buildAnimations(target: INode, name: string, fps: number, keys: any[]) {\r\n const babylonAnimations: { babylonAnimatable: IAnimatable; babylonAnimation: Animation }[] = [];\r\n babylonAnimations.push({ babylonAnimatable: target._babylonTransformNode!, babylonAnimation: this._buildAnimation(name, fps, keys) });\r\n return babylonAnimations;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class WeightAnimationPropertyInfo extends AnimationPropertyInfo {\r\n public buildAnimations(target: INode, name: string, fps: number, keys: any[]) {\r\n const babylonAnimations: { babylonAnimatable: IAnimatable; babylonAnimation: Animation }[] = [];\r\n if (target._numMorphTargets) {\r\n for (let targetIndex = 0; targetIndex < target._numMorphTargets; targetIndex++) {\r\n const babylonAnimation = new Animation(`${name}_${targetIndex}`, this.name, fps, this.type);\r\n babylonAnimation.setKeys(\r\n keys.map((key) => ({\r\n frame: key.frame,\r\n inTangent: key.inTangent ? key.inTangent[targetIndex] : undefined,\r\n value: key.value[targetIndex],\r\n outTangent: key.outTangent ? key.outTangent[targetIndex] : undefined,\r\n interpolation: key.interpolation,\r\n })),\r\n true\r\n );\r\n\r\n if (target._primitiveBabylonMeshes) {\r\n for (const babylonMesh of target._primitiveBabylonMeshes) {\r\n if (babylonMesh.morphTargetManager) {\r\n const morphTarget = babylonMesh.morphTargetManager.getTarget(targetIndex);\r\n const babylonAnimationClone = babylonAnimation.clone();\r\n morphTarget.animations.push(babylonAnimationClone);\r\n babylonAnimations.push({ babylonAnimatable: morphTarget, babylonAnimation: babylonAnimationClone });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return babylonAnimations;\r\n }\r\n}\r\n\r\nSetInterpolationForKey(\"/nodes/{}/translation\", [new TransformNodeAnimationPropertyInfo(Animation.ANIMATIONTYPE_VECTOR3, \"position\", getVector3, () => 3)]);\r\nSetInterpolationForKey(\"/nodes/{}/rotation\", [new TransformNodeAnimationPropertyInfo(Animation.ANIMATIONTYPE_QUATERNION, \"rotationQuaternion\", getQuaternion, () => 4)]);\r\nSetInterpolationForKey(\"/nodes/{}/scale\", [new TransformNodeAnimationPropertyInfo(Animation.ANIMATIONTYPE_VECTOR3, \"scaling\", getVector3, () => 3)]);\r\nSetInterpolationForKey(\"/nodes/{}/weights\", [new WeightAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"influence\", getWeights, (target) => target._numMorphTargets!)]);\r\n","/* eslint-disable @typescript-eslint/naming-convention */\r\n\r\nimport { Animation } from \"core/Animations/animation\";\r\nimport { type ICamera, type IKHRLightsPunctual_Light, type IMaterial, type INode } from \"../glTFLoaderInterfaces\";\r\nimport { type IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { AnimationPropertyInfo } from \"../glTFLoaderAnimation\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { SetInterpolationForKey } from \"./objectModelMapping\";\r\n\r\nfunction getColor3(_target: any, source: Float32Array, offset: number, scale: number): Color3 {\r\n return Color3.FromArray(source, offset).scale(scale);\r\n}\r\n\r\nfunction getAlpha(_target: any, source: Float32Array, offset: number, scale: number): number {\r\n return source[offset + 3] * scale;\r\n}\r\n\r\nfunction getFloat(_target: any, source: Float32Array, offset: number, scale: number): number {\r\n return source[offset] * scale;\r\n}\r\n\r\nfunction getMinusFloat(_target: any, source: Float32Array, offset: number, scale: number): number {\r\n return -source[offset] * scale;\r\n}\r\n\r\nfunction getNextFloat(_target: any, source: Float32Array, offset: number, scale: number): number {\r\n return source[offset + 1] * scale;\r\n}\r\n\r\nfunction getFloatBy2(_target: any, source: Float32Array, offset: number, scale: number): number {\r\n return source[offset] * scale * 2;\r\n}\r\n\r\nfunction getTextureTransformTree(textureName: string) {\r\n return {\r\n scale: [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, `${textureName}.uScale`, getFloat, () => 2),\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, `${textureName}.vScale`, getNextFloat, () => 2),\r\n ],\r\n offset: [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, `${textureName}.uOffset`, getFloat, () => 2),\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, `${textureName}.vOffset`, getNextFloat, () => 2),\r\n ],\r\n rotation: [new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, `${textureName}.wAng`, getMinusFloat, () => 1)],\r\n };\r\n}\r\n\r\nclass CameraAnimationPropertyInfo extends AnimationPropertyInfo {\r\n /** @internal */\r\n public buildAnimations(target: ICamera, name: string, fps: number, keys: any[]) {\r\n return [{ babylonAnimatable: target._babylonCamera!, babylonAnimation: this._buildAnimation(name, fps, keys) }];\r\n }\r\n}\r\n\r\nclass MaterialAnimationPropertyInfo extends AnimationPropertyInfo {\r\n /** @internal */\r\n public buildAnimations(target: IMaterial, name: string, fps: number, keys: any[]) {\r\n const babylonAnimations: { babylonAnimatable: IAnimatable; babylonAnimation: Animation }[] = [];\r\n for (const fillMode in target._data!) {\r\n babylonAnimations.push({\r\n babylonAnimatable: target._data[fillMode].babylonMaterial,\r\n babylonAnimation: this._buildAnimation(name, fps, keys),\r\n });\r\n }\r\n return babylonAnimations;\r\n }\r\n}\r\n\r\nclass LightAnimationPropertyInfo extends AnimationPropertyInfo {\r\n /** @internal */\r\n public buildAnimations(target: IKHRLightsPunctual_Light, name: string, fps: number, keys: any[]) {\r\n return [{ babylonAnimatable: target._babylonLight!, babylonAnimation: this._buildAnimation(name, fps, keys) }];\r\n }\r\n}\r\n\r\nclass MeshAnimationPropertyInfo extends AnimationPropertyInfo {\r\n /** @internal */\r\n public buildAnimations(target: INode, name: string, fps: number, keys: any[]) {\r\n return target._primitiveBabylonMeshes\r\n ? target._primitiveBabylonMeshes.map((mesh) => ({ babylonAnimatable: mesh, babylonAnimation: this._buildAnimation(name, fps, keys) }))\r\n : [];\r\n }\r\n}\r\n\r\nSetInterpolationForKey(\"/cameras/{}/orthographic/xmag\", [\r\n new CameraAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"orthoLeft\", getMinusFloat, () => 1),\r\n new CameraAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"orthoRight\", getNextFloat, () => 1),\r\n]);\r\n\r\nSetInterpolationForKey(\"/cameras/{}/orthographic/ymag\", [\r\n new CameraAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"orthoBottom\", getMinusFloat, () => 1),\r\n new CameraAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"orthoTop\", getNextFloat, () => 1),\r\n]);\r\n\r\nSetInterpolationForKey(\"/cameras/{}/orthographic/zfar\", [new CameraAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"maxZ\", getFloat, () => 1)]);\r\nSetInterpolationForKey(\"/cameras/{}/orthographic/znear\", [new CameraAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"minZ\", getFloat, () => 1)]);\r\n\r\nSetInterpolationForKey(\"/cameras/{}/perspective/yfov\", [new CameraAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"fov\", getFloat, () => 1)]);\r\nSetInterpolationForKey(\"/cameras/{}/perspective/zfar\", [new CameraAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"maxZ\", getFloat, () => 1)]);\r\nSetInterpolationForKey(\"/cameras/{}/perspective/znear\", [new CameraAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"minZ\", getFloat, () => 1)]);\r\n\r\n// add interpolation to the materials mapping\r\nSetInterpolationForKey(\"/materials/{}/pbrMetallicRoughness/baseColorFactor\", [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_COLOR3, \"albedoColor\", getColor3, () => 4),\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"alpha\", getAlpha, () => 4),\r\n]);\r\nSetInterpolationForKey(\"/materials/{}/pbrMetallicRoughness/metallicFactor\", [new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"metallic\", getFloat, () => 1)]);\r\nSetInterpolationForKey(\"/materials/{}/pbrMetallicRoughness/metallicFactor\", [new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"roughness\", getFloat, () => 1)]);\r\nconst baseColorTextureInterpolation = getTextureTransformTree(\"albedoTexture\");\r\nSetInterpolationForKey(\"/materials/{}/pbrMetallicRoughness/baseColorTexture/extensions/KHR_texture_transform/scale\", baseColorTextureInterpolation.scale);\r\nSetInterpolationForKey(\"/materials/{}/pbrMetallicRoughness/baseColorTexture/extensions/KHR_texture_transform/offset\", baseColorTextureInterpolation.offset);\r\nSetInterpolationForKey(\"/materials/{}/pbrMetallicRoughness/baseColorTexture/extensions/KHR_texture_transform/rotation\", baseColorTextureInterpolation.rotation);\r\n\r\nconst metallicRoughnessTextureInterpolation = getTextureTransformTree(\"metallicTexture\");\r\nSetInterpolationForKey(\"//materials/{}/pbrMetallicRoughness/metallicRoughnessTexture/scale\", metallicRoughnessTextureInterpolation.scale);\r\nSetInterpolationForKey(\"//materials/{}/pbrMetallicRoughness/metallicRoughnessTexture/offset\", metallicRoughnessTextureInterpolation.offset);\r\nSetInterpolationForKey(\"//materials/{}/pbrMetallicRoughness/metallicRoughnessTexture/rotation\", metallicRoughnessTextureInterpolation.rotation);\r\n\r\nSetInterpolationForKey(\"/materials/{}/emissiveFactor\", [new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_COLOR3, \"emissiveColor\", getColor3, () => 3)]);\r\nconst normalTextureInterpolation = getTextureTransformTree(\"bumpTexture\");\r\nSetInterpolationForKey(\"/materials/{}/normalTexture/scale\", [new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"bumpTexture.level\", getFloat, () => 1)]);\r\n\r\nSetInterpolationForKey(\"/materials/{}/normalTexture/extensions/KHR_texture_transform/scale\", normalTextureInterpolation.scale);\r\nSetInterpolationForKey(\"/materials/{}/normalTexture/extensions/KHR_texture_transform/offset\", normalTextureInterpolation.offset);\r\nSetInterpolationForKey(\"/materials/{}/normalTexture/extensions/KHR_texture_transform/rotation\", normalTextureInterpolation.rotation);\r\n\r\nSetInterpolationForKey(\"/materials/{}/occlusionTexture/strength\", [new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"ambientTextureStrength\", getFloat, () => 1)]);\r\n\r\nconst occlusionTextureInterpolation = getTextureTransformTree(\"ambientTexture\");\r\nSetInterpolationForKey(\"/materials/{}/occlusionTexture/extensions/KHR_texture_transform/scale\", occlusionTextureInterpolation.scale);\r\nSetInterpolationForKey(\"/materials/{}/occlusionTexture/extensions/KHR_texture_transform/offset\", occlusionTextureInterpolation.offset);\r\nSetInterpolationForKey(\"/materials/{}/occlusionTexture/extensions/KHR_texture_transform/rotation\", occlusionTextureInterpolation.rotation);\r\nconst emissiveTextureInterpolation = getTextureTransformTree(\"emissiveTexture\");\r\nSetInterpolationForKey(\"/materials/{}/emissiveTexture/extensions/KHR_texture_transform/scale\", emissiveTextureInterpolation.scale);\r\nSetInterpolationForKey(\"/materials/{}/emissiveTexture/extensions/KHR_texture_transform/offset\", emissiveTextureInterpolation.offset);\r\nSetInterpolationForKey(\"/materials/{}/emissiveTexture/extensions/KHR_texture_transform/rotation\", emissiveTextureInterpolation.rotation);\r\n\r\n// materials extensions\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_anisotropy/anisotropyStrength\", [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"anisotropy.intensity\", getFloat, () => 1),\r\n]);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_anisotropy/anisotropyRotation\", [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"anisotropy.angle\", getFloat, () => 1),\r\n]);\r\nconst anisotropyTextureInterpolation = getTextureTransformTree(\"anisotropy.texture\");\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_anisotropy/anisotropyTexture/extensions/KHR_texture_transform/scale\", anisotropyTextureInterpolation.scale);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_anisotropy/anisotropyTexture/extensions/KHR_texture_transform/offset\", anisotropyTextureInterpolation.offset);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_anisotropy/anisotropyTexture/extensions/KHR_texture_transform/rotation\", anisotropyTextureInterpolation.rotation);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_clearcoat/clearcoatFactor\", [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"clearCoat.intensity\", getFloat, () => 1),\r\n]);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_clearcoat/clearcoatRoughnessFactor\", [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"clearCoat.roughness\", getFloat, () => 1),\r\n]);\r\nconst clearcoatTextureInterpolation = getTextureTransformTree(\"clearCoat.texture\");\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_clearcoat/clearcoatTexture/extensions/KHR_texture_transform/scale\", clearcoatTextureInterpolation.scale);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_clearcoat/clearcoatTexture/extensions/KHR_texture_transform/offset\", clearcoatTextureInterpolation.offset);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_clearcoat/clearcoatTexture/extensions/KHR_texture_transform/rotation\", clearcoatTextureInterpolation.rotation);\r\nconst clearcoatNormalTextureInterpolation = getTextureTransformTree(\"clearCoat.bumpTexture\");\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_clearcoat/clearcoatNormalTexture/scale\", [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"clearCoat.bumpTexture.level\", getFloat, () => 1),\r\n]);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_clearcoat/clearcoatNormalTexture/extensions/KHR_texture_transform/scale\", clearcoatNormalTextureInterpolation.scale);\r\nSetInterpolationForKey(\r\n \"/materials/{}/extensions/KHR_materials_clearcoat/clearcoatNormalTexture/extensions/KHR_texture_transform/offset\",\r\n clearcoatNormalTextureInterpolation.offset\r\n);\r\nSetInterpolationForKey(\r\n \"/materials/{}/extensions/KHR_materials_clearcoat/clearcoatNormalTexture/extensions/KHR_texture_transform/rotation\",\r\n clearcoatNormalTextureInterpolation.rotation\r\n);\r\nconst clearcoatRoughnessTextureInterpolation = getTextureTransformTree(\"clearCoat.textureRoughness\");\r\nSetInterpolationForKey(\r\n \"/materials/{}/extensions/KHR_materials_clearcoat/clearcoatRoughnessTexture/extensions/KHR_texture_transform/scale\",\r\n clearcoatRoughnessTextureInterpolation.scale\r\n);\r\nSetInterpolationForKey(\r\n \"/materials/{}/extensions/KHR_materials_clearcoat/clearcoatRoughnessTexture/extensions/KHR_texture_transform/offset\",\r\n clearcoatRoughnessTextureInterpolation.offset\r\n);\r\nSetInterpolationForKey(\r\n \"/materials/{}/extensions/KHR_materials_clearcoat/clearcoatRoughnessTexture/extensions/KHR_texture_transform/rotation\",\r\n clearcoatRoughnessTextureInterpolation.rotation\r\n);\r\n\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_dispersion/dispersionFactor\", [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"subSurface.dispersion\", getFloat, () => 1),\r\n]);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_emissive_strength/emissiveStrength\", [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"emissiveIntensity\", getFloat, () => 1),\r\n]);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_ior/ior\", [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"indexOfRefraction\", getFloat, () => 1),\r\n]);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_iridescence/iridescenceFactor\", [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"iridescence.intensity\", getFloat, () => 1),\r\n]);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_iridescence/iridescenceIor\", [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"iridescence.indexOfRefraction\", getFloat, () => 1),\r\n]);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_iridescence/iridescenceThicknessMinimum\", [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"iridescence.minimumThickness\", getFloat, () => 1),\r\n]);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_iridescence/iridescenceThicknessMaximum\", [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"iridescence.maximumThickness\", getFloat, () => 1),\r\n]);\r\n\r\nconst iridescenceTextureInterpolation = getTextureTransformTree(\"iridescence.texture\");\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_iridescence/iridescenceTexture/extensions/KHR_texture_transform/scale\", iridescenceTextureInterpolation.scale);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_iridescence/iridescenceTexture/extensions/KHR_texture_transform/offset\", iridescenceTextureInterpolation.offset);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_iridescence/iridescenceTexture/extensions/KHR_texture_transform/rotation\", iridescenceTextureInterpolation.rotation);\r\n\r\nconst iridescenceThicknessTextureInterpolation = getTextureTransformTree(\"iridescence.thicknessTexture\");\r\nSetInterpolationForKey(\r\n \"/materials/{}/extensions/KHR_materials_iridescence/iridescenceThicknessTexture/extensions/KHR_texture_transform/scale\",\r\n iridescenceThicknessTextureInterpolation.scale\r\n);\r\nSetInterpolationForKey(\r\n \"/materials/{}/extensions/KHR_materials_iridescence/iridescenceThicknessTexture/extensions/KHR_texture_transform/offset\",\r\n iridescenceThicknessTextureInterpolation.offset\r\n);\r\nSetInterpolationForKey(\r\n \"/materials/{}/extensions/KHR_materials_iridescence/iridescenceThicknessTexture/extensions/KHR_texture_transform/rotation\",\r\n iridescenceThicknessTextureInterpolation.rotation\r\n);\r\n\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_sheen/sheenColorFactor\", [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_COLOR3, \"sheen.color\", getColor3, () => 3),\r\n]);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_sheen/sheenRoughnessFactor\", [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"sheen.roughness\", getFloat, () => 1),\r\n]);\r\n\r\nconst sheenTextureInterpolation = getTextureTransformTree(\"sheen.texture\");\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_sheen/sheenColorTexture/extensions/KHR_texture_transform/scale\", sheenTextureInterpolation.scale);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_sheen/sheenColorTexture/extensions/KHR_texture_transform/offset\", sheenTextureInterpolation.offset);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_sheen/sheenColorTexture/extensions/KHR_texture_transform/rotation\", sheenTextureInterpolation.rotation);\r\n\r\nconst sheenRoughnessTextureInterpolation = getTextureTransformTree(\"sheen.textureRoughness\");\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_sheen/sheenRoughnessTexture/extensions/KHR_texture_transform/scale\", sheenRoughnessTextureInterpolation.scale);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_sheen/sheenRoughnessTexture/extensions/KHR_texture_transform/offset\", sheenRoughnessTextureInterpolation.offset);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_sheen/sheenRoughnessTexture/extensions/KHR_texture_transform/rotation\", sheenRoughnessTextureInterpolation.rotation);\r\n\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_specular/specularFactor\", [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"metallicF0Factor\", getFloat, () => 1),\r\n]);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_specular/specularColorFactor\", [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_COLOR3, \"metallicReflectanceColor\", getColor3, () => 3),\r\n]);\r\n\r\nconst specularTextureInterpolation = getTextureTransformTree(\"metallicReflectanceTexture\");\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_specular/specularTexture/extensions/KHR_texture_transform/scale\", specularTextureInterpolation.scale);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_specular/specularTexture/extensions/KHR_texture_transform/offset\", specularTextureInterpolation.offset);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_specular/specularTexture/extensions/KHR_texture_transform/rotation\", specularTextureInterpolation.rotation);\r\nconst specularColorTextureInterpolation = getTextureTransformTree(\"reflectanceTexture\");\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_specular/specularColorTexture/extensions/KHR_texture_transform/scale\", specularColorTextureInterpolation.scale);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_specular/specularColorTexture/extensions/KHR_texture_transform/offset\", specularColorTextureInterpolation.offset);\r\nSetInterpolationForKey(\r\n \"/materials/{}/extensions/KHR_materials_specular/specularColorTexture/extensions/KHR_texture_transform/rotation\",\r\n specularColorTextureInterpolation.rotation\r\n);\r\n\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_transmission/transmissionFactor\", [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"subSurface.refractionIntensity\", getFloat, () => 1),\r\n]);\r\nconst transmissionTextureInterpolation = getTextureTransformTree(\"subSurface.refractionIntensityTexture\");\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_transmission/transmissionTexture/extensions/KHR_texture_transform/scale\", transmissionTextureInterpolation.scale);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_transmission/transmissionTexture/extensions/KHR_texture_transform/offset\", transmissionTextureInterpolation.offset);\r\nSetInterpolationForKey(\r\n \"/materials/{}/extensions/KHR_materials_transmission/transmissionTexture/extensions/KHR_texture_transform/rotation\",\r\n transmissionTextureInterpolation.rotation\r\n);\r\n\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_volume/attenuationColor\", [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_COLOR3, \"subSurface.tintColor\", getColor3, () => 3),\r\n]);\r\n\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_volume/attenuationDistance\", [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"subSurface.tintColorAtDistance\", getFloat, () => 1),\r\n]);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_volume/thicknessFactor\", [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"subSurface.maximumThickness\", getFloat, () => 1),\r\n]);\r\n\r\nconst thicknessTextureInterpolation = getTextureTransformTree(\"subSurface.thicknessTexture\");\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_volume/thicknessTexture/extensions/KHR_texture_transform/scale\", thicknessTextureInterpolation.scale);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_volume/thicknessTexture/extensions/KHR_texture_transform/offset\", thicknessTextureInterpolation.offset);\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_volume/thicknessTexture/extensions/KHR_texture_transform/rotation\", thicknessTextureInterpolation.rotation);\r\n\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_diffuse_transmission/diffuseTransmissionFactor\", [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"subSurface.translucencyIntensity\", getFloat, () => 1),\r\n]);\r\n\r\nconst diffuseTransmissionTextureInterpolation = getTextureTransformTree(\"subSurface.translucencyIntensityTexture\");\r\nSetInterpolationForKey(\r\n \"materials/{}/extensions/KHR_materials_diffuse_transmission/diffuseTransmissionTexture/extensions/KHR_texture_transform/scale\",\r\n diffuseTransmissionTextureInterpolation.scale\r\n);\r\nSetInterpolationForKey(\r\n \"materials/{}/extensions/KHR_materials_diffuse_transmission/diffuseTransmissionTexture/extensions/KHR_texture_transform/offset\",\r\n diffuseTransmissionTextureInterpolation.offset\r\n);\r\nSetInterpolationForKey(\r\n \"materials/{}/extensions/KHR_materials_diffuse_transmission/diffuseTransmissionTexture/extensions/KHR_texture_transform/rotation\",\r\n diffuseTransmissionTextureInterpolation.rotation\r\n);\r\n\r\nSetInterpolationForKey(\"/materials/{}/extensions/KHR_materials_diffuse_transmission/diffuseTransmissionColorFactor\", [\r\n new MaterialAnimationPropertyInfo(Animation.ANIMATIONTYPE_COLOR3, \"subSurface.translucencyColor\", getColor3, () => 3),\r\n]);\r\n\r\nconst diffuseTransmissionColorTextureInterpolation = getTextureTransformTree(\"subSurface.translucencyColorTexture\");\r\nSetInterpolationForKey(\r\n \"materials/{}/extensions/KHR_materials_diffuse_transmission/diffuseTransmissionColorTexture/extensions/KHR_texture_transform/scale\",\r\n diffuseTransmissionColorTextureInterpolation.scale\r\n);\r\nSetInterpolationForKey(\r\n \"materials/{}/extensions/KHR_materials_diffuse_transmission/diffuseTransmissionColorTexture/extensions/KHR_texture_transform/offset\",\r\n diffuseTransmissionColorTextureInterpolation.offset\r\n);\r\nSetInterpolationForKey(\r\n \"materials/{}/extensions/KHR_materials_diffuse_transmission/diffuseTransmissionColorTexture/extensions/KHR_texture_transform/rotation\",\r\n diffuseTransmissionColorTextureInterpolation.rotation\r\n);\r\n\r\nSetInterpolationForKey(\"/extensions/KHR_lights_punctual/lights/{}/color\", [new LightAnimationPropertyInfo(Animation.ANIMATIONTYPE_COLOR3, \"diffuse\", getColor3, () => 3)]);\r\nSetInterpolationForKey(\"/extensions/KHR_lights_punctual/lights/{}/intensity\", [new LightAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"intensity\", getFloat, () => 1)]);\r\nSetInterpolationForKey(\"/extensions/KHR_lights_punctual/lights/{}/range\", [new LightAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"range\", getFloat, () => 1)]);\r\nSetInterpolationForKey(\"/extensions/KHR_lights_punctual/lights/{}/spot/innerConeAngle\", [\r\n new LightAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"innerAngle\", getFloatBy2, () => 1),\r\n]);\r\nSetInterpolationForKey(\"/extensions/KHR_lights_punctual/lights/{}/spot/outerConeAngle\", [\r\n new LightAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"angle\", getFloatBy2, () => 1),\r\n]);\r\n\r\nSetInterpolationForKey(\"/extensions/EXT_lights_area/lights/{}/color\", [new LightAnimationPropertyInfo(Animation.ANIMATIONTYPE_COLOR3, \"diffuse\", getColor3, () => 3)]);\r\nSetInterpolationForKey(\"/extensions/EXT_lights_area/lights/{}/intensity\", [new LightAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"intensity\", getFloat, () => 1)]);\r\nSetInterpolationForKey(\"/extensions/EXT_lights_area/lights/{}/size\", [new LightAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"radius\", getFloat, () => 1)]);\r\nSetInterpolationForKey(\"/extensions/EXT_lights_area/lights/{}/rect/aspect\", [new LightAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"radius\", getFloat, () => 1)]);\r\n\r\nSetInterpolationForKey(\"/nodes/{}/extensions/EXT_lights_ies/color\", [new LightAnimationPropertyInfo(Animation.ANIMATIONTYPE_COLOR3, \"diffuse\", getColor3, () => 3)]);\r\nSetInterpolationForKey(\"/nodes/{}/extensions/EXT_lights_ies/multiplier\", [new LightAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"intensity\", getFloat, () => 1)]);\r\n\r\nSetInterpolationForKey(\"/nodes/{}/extensions/KHR_node_visibility/visible\", [new MeshAnimationPropertyInfo(Animation.ANIMATIONTYPE_FLOAT, \"isVisible\", getFloat, () => 1)]);\r\n","import { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { type GLTFLoader } from \"../glTFLoader\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type Animation } from \"core/Animations/animation\";\r\nimport { type IAnimatable } from \"core/Animations/animatable.interface\";\r\nimport { type IAnimation, type IAnimationChannel } from \"../glTFLoaderInterfaces\";\r\nimport { type IKHRAnimationPointer, AnimationChannelTargetPath } from \"babylonjs-gltf2interface\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { type GLTFPathToObjectConverter } from \"./gltfPathToObjectConverter\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\nimport { GetPathToObjectConverter } from \"./objectModelMapping\";\r\nimport \"./KHR_animation_pointer.data\";\r\n\r\nconst NAME = \"KHR_animation_pointer\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_animation_pointer extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_animation_pointer\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * [Specification PR](https://github.com/KhronosGroup/glTF/pull/2147)\r\n * !!! Experimental Extension Subject to Changes !!!\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_animation_pointer implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n private _loader: GLTFLoader;\r\n private _pathToObjectConverter?: GLTFPathToObjectConverter<any, any, any>;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this._pathToObjectConverter = GetPathToObjectConverter(this._loader.gltf);\r\n }\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public get enabled(): boolean {\r\n return this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n delete this._pathToObjectConverter; // GC\r\n }\r\n\r\n /**\r\n * Loads a glTF animation channel.\r\n * @param context The context when loading the asset\r\n * @param animationContext The context of the animation when loading the asset\r\n * @param animation The glTF animation property\r\n * @param channel The glTF animation channel property\r\n * @param onLoad Called for each animation loaded\r\n * @returns A void promise that resolves when the load is complete or null if not handled\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public _loadAnimationChannelAsync(\r\n context: string,\r\n animationContext: string,\r\n animation: IAnimation,\r\n channel: IAnimationChannel,\r\n onLoad: (babylonAnimatable: IAnimatable, babylonAnimation: Animation) => void\r\n ): Nullable<Promise<void>> {\r\n const extension = channel.target.extensions?.KHR_animation_pointer as IKHRAnimationPointer;\r\n if (!extension || !this._pathToObjectConverter) {\r\n return null;\r\n }\r\n\r\n if (channel.target.path !== AnimationChannelTargetPath.POINTER) {\r\n Logger.Warn(`${context}/target/path: Value (${channel.target.path}) must be (${AnimationChannelTargetPath.POINTER}) when using the ${this.name} extension`);\r\n }\r\n\r\n if (channel.target.node != undefined) {\r\n Logger.Warn(`${context}/target/node: Value (${channel.target.node}) must not be present when using the ${this.name} extension`);\r\n }\r\n\r\n const extensionContext = `${context}/extensions/${this.name}`;\r\n\r\n const pointer = extension.pointer;\r\n if (!pointer) {\r\n throw new Error(`${extensionContext}: Pointer is missing`);\r\n }\r\n\r\n try {\r\n const obj = this._pathToObjectConverter.convert(pointer);\r\n if (!obj.info.interpolation) {\r\n throw new Error(`${extensionContext}/pointer: Interpolation is missing`);\r\n }\r\n return this._loader._loadAnimationChannelFromTargetInfoAsync(\r\n context,\r\n animationContext,\r\n animation,\r\n channel,\r\n {\r\n object: obj.object,\r\n info: obj.info.interpolation,\r\n },\r\n onLoad\r\n );\r\n } catch (e) {\r\n Logger.Warn(`${extensionContext}/pointer: Invalid pointer (${pointer}) skipped`);\r\n return null;\r\n }\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_animation_pointer(loader));\r\n","import { type Nullable } from \"core/types\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { type AnimationGroup } from \"core/Animations/animationGroup\";\r\nimport { AnimationEvent } from \"core/Animations/animationEvent\";\r\nimport { type TransformNode } from \"core/Meshes/transformNode\";\r\nimport { Sound } from \"core/Audio/sound\";\r\nimport { WeightedSound } from \"core/Audio/weightedsound\";\r\n\r\nimport { type IArrayItem, type IScene, type INode, type IAnimation } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader\";\r\nimport {\r\n type IMSFTAudioEmitter_Clip,\r\n type IMSFTAudioEmitter_Emitter,\r\n type IMSFTAudioEmitter_EmittersReference,\r\n type IMSFTAudioEmitter_AnimationEvent,\r\n IMSFTAudioEmitter_AnimationEventAction,\r\n} from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nimport \"core/Audio/audioSceneComponent\";\r\nimport { GetBlobBufferSource } from \"core/Buffers/bufferUtils\";\r\n\r\nconst NAME = \"MSFT_audio_emitter\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the MSFT_audio_emitter extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"MSFT_audio_emitter\"]: {};\r\n }\r\n}\r\n\r\ninterface ILoaderClip extends IMSFTAudioEmitter_Clip, IArrayItem {\r\n _objectURL?: Promise<string>;\r\n}\r\n\r\ninterface ILoaderEmitter extends IMSFTAudioEmitter_Emitter, IArrayItem {\r\n _babylonData?: {\r\n sound?: WeightedSound;\r\n loaded: Promise<void>;\r\n };\r\n _babylonSounds: Sound[];\r\n}\r\n\r\ninterface IMSFTAudioEmitter {\r\n clips: ILoaderClip[];\r\n emitters: ILoaderEmitter[];\r\n}\r\n\r\ninterface ILoaderAnimationEvent extends IMSFTAudioEmitter_AnimationEvent, IArrayItem {}\r\n\r\ninterface ILoaderAnimationEvents {\r\n events: ILoaderAnimationEvent[];\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/najadojo/glTF/blob/MSFT_audio_emitter/extensions/2.0/Vendor/MSFT_audio_emitter/README.md)\r\n * !!! Experimental Extension Subject to Changes !!!\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class MSFT_audio_emitter implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n private _clips: Array<ILoaderClip>;\r\n private _emitters: Array<ILoaderEmitter>;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n (this._clips as any) = null;\r\n (this._emitters as any) = null;\r\n }\r\n\r\n /** @internal */\r\n public onLoading(): void {\r\n const extensions = this._loader.gltf.extensions;\r\n if (extensions && extensions[this.name]) {\r\n const extension = extensions[this.name] as IMSFTAudioEmitter;\r\n\r\n this._clips = extension.clips;\r\n this._emitters = extension.emitters;\r\n\r\n ArrayItem.Assign(this._clips);\r\n ArrayItem.Assign(this._emitters);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadSceneAsync(context: string, scene: IScene): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtensionAsync<IMSFTAudioEmitter_EmittersReference>(context, scene, this.name, async (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n\r\n promises.push(this._loader.loadSceneAsync(context, scene));\r\n\r\n for (const emitterIndex of extension.emitters) {\r\n const emitter = ArrayItem.Get(`${extensionContext}/emitters`, this._emitters, emitterIndex);\r\n if (\r\n emitter.refDistance != undefined ||\r\n emitter.maxDistance != undefined ||\r\n emitter.rolloffFactor != undefined ||\r\n emitter.distanceModel != undefined ||\r\n emitter.innerAngle != undefined ||\r\n emitter.outerAngle != undefined\r\n ) {\r\n throw new Error(`${extensionContext}: Direction or Distance properties are not allowed on emitters attached to a scene`);\r\n }\r\n\r\n promises.push(this._loadEmitterAsync(`${extensionContext}/emitters/${emitter.index}`, emitter));\r\n }\r\n\r\n await Promise.all(promises);\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable<Promise<TransformNode>> {\r\n return GLTFLoader.LoadExtensionAsync<IMSFTAudioEmitter_EmittersReference, TransformNode>(context, node, this.name, async (extensionContext, extension) => {\r\n const promises = new Array<Promise<any>>();\r\n\r\n const babylonMesh = await this._loader.loadNodeAsync(extensionContext, node, (babylonMesh) => {\r\n for (const emitterIndex of extension.emitters) {\r\n const emitter = ArrayItem.Get(`${extensionContext}/emitters`, this._emitters, emitterIndex);\r\n promises.push(\r\n // eslint-disable-next-line github/no-then\r\n this._loadEmitterAsync(`${extensionContext}/emitters/${emitter.index}`, emitter).then(() => {\r\n for (const sound of emitter._babylonSounds) {\r\n sound.attachToMesh(babylonMesh);\r\n if (emitter.innerAngle != undefined || emitter.outerAngle != undefined) {\r\n sound.setLocalDirectionToMesh(Vector3.Forward());\r\n sound.setDirectionalCone(\r\n 2 * Tools.ToDegrees(emitter.innerAngle == undefined ? Math.PI : emitter.innerAngle),\r\n 2 * Tools.ToDegrees(emitter.outerAngle == undefined ? Math.PI : emitter.outerAngle),\r\n 0\r\n );\r\n }\r\n }\r\n })\r\n );\r\n }\r\n\r\n assign(babylonMesh);\r\n });\r\n await Promise.all(promises);\r\n return babylonMesh;\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadAnimationAsync(context: string, animation: IAnimation): Nullable<Promise<AnimationGroup>> {\r\n return GLTFLoader.LoadExtensionAsync<ILoaderAnimationEvents, AnimationGroup>(context, animation, this.name, async (extensionContext, extension) => {\r\n const babylonAnimationGroup = await this._loader.loadAnimationAsync(context, animation);\r\n const promises = new Array<Promise<any>>();\r\n ArrayItem.Assign(extension.events);\r\n for (const event of extension.events) {\r\n promises.push(this._loadAnimationEventAsync(`${extensionContext}/events/${event.index}`, context, animation, event, babylonAnimationGroup));\r\n }\r\n await Promise.all(promises);\r\n return babylonAnimationGroup;\r\n });\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _loadClipAsync(context: string, clip: ILoaderClip): Promise<string> {\r\n if (clip._objectURL) {\r\n return clip._objectURL;\r\n }\r\n\r\n let promise: Promise<ArrayBufferView>;\r\n if (clip.uri) {\r\n promise = this._loader.loadUriAsync(context, clip, clip.uri);\r\n } else {\r\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._loader.gltf.bufferViews, clip.bufferView);\r\n promise = this._loader.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView);\r\n }\r\n\r\n // eslint-disable-next-line github/no-then\r\n clip._objectURL = promise.then((data) => {\r\n const buffer = GetBlobBufferSource(data);\r\n return URL.createObjectURL(new Blob([buffer], { type: clip.mimeType }));\r\n });\r\n\r\n return clip._objectURL;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _loadEmitterAsync(context: string, emitter: ILoaderEmitter): Promise<void> {\r\n emitter._babylonSounds = emitter._babylonSounds || [];\r\n if (!emitter._babylonData) {\r\n const clipPromises = new Array<Promise<any>>();\r\n const name = emitter.name || `emitter${emitter.index}`;\r\n const options = {\r\n loop: false,\r\n autoplay: false,\r\n volume: emitter.volume == undefined ? 1 : emitter.volume,\r\n };\r\n\r\n for (let i = 0; i < emitter.clips.length; i++) {\r\n const clipContext = `/extensions/${this.name}/clips`;\r\n const clip = ArrayItem.Get(clipContext, this._clips, emitter.clips[i].clip);\r\n clipPromises.push(\r\n // eslint-disable-next-line github/no-then\r\n this._loadClipAsync(`${clipContext}/${emitter.clips[i].clip}`, clip).then((objectURL: string) => {\r\n const sound = (emitter._babylonSounds[i] = new Sound(name, objectURL, this._loader.babylonScene, null, options));\r\n sound.refDistance = emitter.refDistance || 1;\r\n sound.maxDistance = emitter.maxDistance || 256;\r\n sound.rolloffFactor = emitter.rolloffFactor || 1;\r\n sound.distanceModel = emitter.distanceModel || \"exponential\";\r\n })\r\n );\r\n }\r\n\r\n // eslint-disable-next-line github/no-then\r\n const promise = Promise.all(clipPromises).then(() => {\r\n const weights = emitter.clips.map((clip) => {\r\n return clip.weight || 1;\r\n });\r\n const weightedSound = new WeightedSound(emitter.loop || false, emitter._babylonSounds, weights);\r\n if (emitter.innerAngle) {\r\n weightedSound.directionalConeInnerAngle = 2 * Tools.ToDegrees(emitter.innerAngle);\r\n }\r\n if (emitter.outerAngle) {\r\n weightedSound.directionalConeOuterAngle = 2 * Tools.ToDegrees(emitter.outerAngle);\r\n }\r\n if (emitter.volume) {\r\n weightedSound.volume = emitter.volume;\r\n }\r\n emitter._babylonData!.sound = weightedSound;\r\n });\r\n\r\n emitter._babylonData = {\r\n loaded: promise,\r\n };\r\n }\r\n\r\n return emitter._babylonData.loaded;\r\n }\r\n\r\n private _getEventAction(\r\n context: string,\r\n sound: WeightedSound,\r\n action: IMSFTAudioEmitter_AnimationEventAction,\r\n time: number,\r\n startOffset?: number\r\n ): (currentFrame: number) => void {\r\n switch (action) {\r\n case IMSFTAudioEmitter_AnimationEventAction.play: {\r\n return (currentFrame: number) => {\r\n const frameOffset = (startOffset || 0) + (currentFrame - time);\r\n sound.play(frameOffset);\r\n };\r\n }\r\n case IMSFTAudioEmitter_AnimationEventAction.stop: {\r\n return () => {\r\n sound.stop();\r\n };\r\n }\r\n case IMSFTAudioEmitter_AnimationEventAction.pause: {\r\n return () => {\r\n sound.pause();\r\n };\r\n }\r\n default: {\r\n throw new Error(`${context}: Unsupported action ${action}`);\r\n }\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n private _loadAnimationEventAsync(\r\n context: string,\r\n animationContext: string,\r\n animation: IAnimation,\r\n event: ILoaderAnimationEvent,\r\n babylonAnimationGroup: AnimationGroup\r\n ): Promise<void> {\r\n if (babylonAnimationGroup.targetedAnimations.length == 0) {\r\n return Promise.resolve();\r\n }\r\n const babylonAnimation = babylonAnimationGroup.targetedAnimations[0];\r\n const emitterIndex = event.emitter;\r\n const emitter = ArrayItem.Get(`/extensions/${this.name}/emitters`, this._emitters, emitterIndex);\r\n // eslint-disable-next-line github/no-then\r\n return this._loadEmitterAsync(context, emitter).then(() => {\r\n const sound = emitter._babylonData!.sound;\r\n if (sound) {\r\n const babylonAnimationEvent = new AnimationEvent(event.time, this._getEventAction(context, sound, event.action, event.time, event.startOffset));\r\n babylonAnimation.animation.addEvent(babylonAnimationEvent);\r\n // Make sure all started audio stops when this animation is terminated.\r\n babylonAnimationGroup.onAnimationGroupEndObservable.add(() => {\r\n sound.stop();\r\n });\r\n babylonAnimationGroup.onAnimationGroupPauseObservable.add(() => {\r\n sound.pause();\r\n });\r\n }\r\n });\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new MSFT_audio_emitter(loader));\r\n","/* eslint-disable github/no-then */\r\nimport { type Nullable } from \"core/types\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { Deferred } from \"core/Misc/deferred\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { type TransformNode } from \"core/Meshes/transformNode\";\r\nimport { type Mesh } from \"core/Meshes/mesh\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { type INode, type IMaterial, type IBuffer, type IScene } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader\";\r\nimport { type IProperty, type IMSFTLOD } from \"babylonjs-gltf2interface\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"MSFT_lod\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the MSFT_lod extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"MSFT_lod\"]: Partial<{\r\n /**\r\n * Maximum number of LODs to load, starting from the lowest LOD.\r\n */\r\n maxLODsToLoad: number;\r\n }>;\r\n }\r\n}\r\n\r\ninterface IBufferInfo {\r\n start: number;\r\n end: number;\r\n loaded: Deferred<ArrayBufferView>;\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/MSFT_lod/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class MSFT_lod implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /**\r\n * Defines a number that determines the order the extensions are applied.\r\n */\r\n public order = 100;\r\n\r\n /**\r\n * Maximum number of LODs to load, starting from the lowest LOD.\r\n */\r\n public maxLODsToLoad = 10;\r\n\r\n /**\r\n * Observable raised when all node LODs of one level are loaded.\r\n * The event data is the index of the loaded LOD starting from zero.\r\n * Dispose the loader to cancel the loading of the next level of LODs.\r\n */\r\n public onNodeLODsLoadedObservable = new Observable<number>();\r\n\r\n /**\r\n * Observable raised when all material LODs of one level are loaded.\r\n * The event data is the index of the loaded LOD starting from zero.\r\n * Dispose the loader to cancel the loading of the next level of LODs.\r\n */\r\n public onMaterialLODsLoadedObservable = new Observable<number>();\r\n\r\n private _loader: GLTFLoader;\r\n\r\n private _bufferLODs = new Array<IBufferInfo>();\r\n\r\n private _nodeIndexLOD: Nullable<number> = null;\r\n private _nodeSignalLODs = new Array<Deferred<void>>();\r\n private _nodePromiseLODs = new Array<Array<Promise<any>>>();\r\n private _nodeBufferLODs = new Array<IBufferInfo>();\r\n\r\n private _materialIndexLOD: Nullable<number> = null;\r\n private _materialSignalLODs = new Array<Deferred<void>>();\r\n private _materialPromiseLODs = new Array<Array<Promise<any>>>();\r\n private _materialBufferLODs = new Array<IBufferInfo>();\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n // Options takes precedence. The maxLODsToLoad extension property is retained for back compat.\r\n // For new extensions, they should only use options.\r\n this.maxLODsToLoad = this._loader.parent.extensionOptions[NAME]?.maxLODsToLoad ?? this.maxLODsToLoad;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n\r\n this._nodeIndexLOD = null;\r\n this._nodeSignalLODs.length = 0;\r\n this._nodePromiseLODs.length = 0;\r\n this._nodeBufferLODs.length = 0;\r\n\r\n this._materialIndexLOD = null;\r\n this._materialSignalLODs.length = 0;\r\n this._materialPromiseLODs.length = 0;\r\n this._materialBufferLODs.length = 0;\r\n\r\n this.onMaterialLODsLoadedObservable.clear();\r\n this.onNodeLODsLoadedObservable.clear();\r\n }\r\n\r\n /** @internal */\r\n public onReady(): void {\r\n for (let indexLOD = 0; indexLOD < this._nodePromiseLODs.length; indexLOD++) {\r\n const promise = Promise.all(this._nodePromiseLODs[indexLOD]).then(() => {\r\n if (indexLOD !== 0) {\r\n this._loader.endPerformanceCounter(`Node LOD ${indexLOD}`);\r\n this._loader.log(`Loaded node LOD ${indexLOD}`);\r\n }\r\n\r\n this.onNodeLODsLoadedObservable.notifyObservers(indexLOD);\r\n\r\n if (indexLOD !== this._nodePromiseLODs.length - 1) {\r\n this._loader.startPerformanceCounter(`Node LOD ${indexLOD + 1}`);\r\n this._loadBufferLOD(this._nodeBufferLODs, indexLOD + 1);\r\n if (this._nodeSignalLODs[indexLOD]) {\r\n this._nodeSignalLODs[indexLOD].resolve();\r\n }\r\n }\r\n });\r\n\r\n this._loader._completePromises.push(promise);\r\n }\r\n\r\n for (let indexLOD = 0; indexLOD < this._materialPromiseLODs.length; indexLOD++) {\r\n const promise = Promise.all(this._materialPromiseLODs[indexLOD]).then(() => {\r\n if (indexLOD !== 0) {\r\n this._loader.endPerformanceCounter(`Material LOD ${indexLOD}`);\r\n this._loader.log(`Loaded material LOD ${indexLOD}`);\r\n }\r\n\r\n this.onMaterialLODsLoadedObservable.notifyObservers(indexLOD);\r\n\r\n if (indexLOD !== this._materialPromiseLODs.length - 1) {\r\n this._loader.startPerformanceCounter(`Material LOD ${indexLOD + 1}`);\r\n this._loadBufferLOD(this._materialBufferLODs, indexLOD + 1);\r\n if (this._materialSignalLODs[indexLOD]) {\r\n this._materialSignalLODs[indexLOD].resolve();\r\n }\r\n }\r\n });\r\n\r\n this._loader._completePromises.push(promise);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadSceneAsync(context: string, scene: IScene): Nullable<Promise<void>> {\r\n const promise = this._loader.loadSceneAsync(context, scene);\r\n this._loadBufferLOD(this._bufferLODs, 0);\r\n return promise;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable<Promise<TransformNode>> {\r\n return GLTFLoader.LoadExtensionAsync<IMSFTLOD, TransformNode>(context, node, this.name, async (extensionContext, extension) => {\r\n let firstPromise: Promise<TransformNode>;\r\n\r\n const nodeLODs = this._getLODs(extensionContext, node, this._loader.gltf.nodes, extension.ids);\r\n this._loader.logOpen(`${extensionContext}`);\r\n\r\n for (let indexLOD = 0; indexLOD < nodeLODs.length; indexLOD++) {\r\n const nodeLOD = nodeLODs[indexLOD];\r\n\r\n if (indexLOD !== 0) {\r\n this._nodeIndexLOD = indexLOD;\r\n this._nodeSignalLODs[indexLOD] = this._nodeSignalLODs[indexLOD] || new Deferred();\r\n }\r\n\r\n const assignWrap = (babylonTransformNode: TransformNode) => {\r\n assign(babylonTransformNode);\r\n babylonTransformNode.setEnabled(false);\r\n };\r\n\r\n const promise = this._loader.loadNodeAsync(`/nodes/${nodeLOD.index}`, nodeLOD, assignWrap).then((babylonMesh) => {\r\n if (indexLOD !== 0) {\r\n // TODO: should not rely on _babylonTransformNode\r\n const previousNodeLOD = nodeLODs[indexLOD - 1];\r\n if (previousNodeLOD._babylonTransformNode) {\r\n this._disposeTransformNode(previousNodeLOD._babylonTransformNode);\r\n delete previousNodeLOD._babylonTransformNode;\r\n }\r\n }\r\n\r\n babylonMesh.setEnabled(true);\r\n return babylonMesh;\r\n });\r\n\r\n this._nodePromiseLODs[indexLOD] = this._nodePromiseLODs[indexLOD] || [];\r\n\r\n if (indexLOD === 0) {\r\n firstPromise = promise;\r\n } else {\r\n this._nodeIndexLOD = null;\r\n this._nodePromiseLODs[indexLOD].push(promise);\r\n }\r\n }\r\n\r\n this._loader.logClose();\r\n return await firstPromise!;\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public _loadMaterialAsync(\r\n context: string,\r\n material: IMaterial,\r\n babylonMesh: Nullable<Mesh>,\r\n babylonDrawMode: number,\r\n assign: (babylonMaterial: Material) => void\r\n ): Nullable<Promise<Material>> {\r\n // Don't load material LODs if already loading a node LOD.\r\n if (this._nodeIndexLOD) {\r\n return null;\r\n }\r\n\r\n return GLTFLoader.LoadExtensionAsync<IMSFTLOD, Material>(context, material, this.name, async (extensionContext, extension) => {\r\n let firstPromise: Promise<Material>;\r\n\r\n const materialLODs = this._getLODs(extensionContext, material, this._loader.gltf.materials, extension.ids);\r\n this._loader.logOpen(`${extensionContext}`);\r\n\r\n for (let indexLOD = 0; indexLOD < materialLODs.length; indexLOD++) {\r\n const materialLOD = materialLODs[indexLOD];\r\n\r\n if (indexLOD !== 0) {\r\n this._materialIndexLOD = indexLOD;\r\n }\r\n\r\n const promise = this._loader\r\n ._loadMaterialAsync(`/materials/${materialLOD.index}`, materialLOD, babylonMesh, babylonDrawMode, (babylonMaterial) => {\r\n if (indexLOD === 0) {\r\n assign(babylonMaterial);\r\n }\r\n })\r\n .then((babylonMaterial) => {\r\n if (indexLOD !== 0) {\r\n assign(babylonMaterial);\r\n\r\n // TODO: should not rely on _data\r\n const previousDataLOD = materialLODs[indexLOD - 1]._data!;\r\n if (previousDataLOD[babylonDrawMode]) {\r\n this._disposeMaterials([previousDataLOD[babylonDrawMode].babylonMaterial]);\r\n delete previousDataLOD[babylonDrawMode];\r\n }\r\n }\r\n\r\n return babylonMaterial;\r\n });\r\n\r\n this._materialPromiseLODs[indexLOD] = this._materialPromiseLODs[indexLOD] || [];\r\n\r\n if (indexLOD === 0) {\r\n firstPromise = promise;\r\n } else {\r\n this._materialIndexLOD = null;\r\n this._materialPromiseLODs[indexLOD].push(promise);\r\n }\r\n }\r\n\r\n this._loader.logClose();\r\n return await firstPromise!;\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public _loadUriAsync(context: string, property: IProperty, uri: string): Nullable<Promise<ArrayBufferView>> {\r\n // Defer the loading of uris if loading a node or material LOD.\r\n if (this._nodeIndexLOD !== null) {\r\n this._loader.log(`deferred`);\r\n const previousIndexLOD = this._nodeIndexLOD - 1;\r\n this._nodeSignalLODs[previousIndexLOD] = this._nodeSignalLODs[previousIndexLOD] || new Deferred<void>();\r\n return this._nodeSignalLODs[this._nodeIndexLOD - 1].promise.then(async () => {\r\n return await this._loader.loadUriAsync(context, property, uri);\r\n });\r\n } else if (this._materialIndexLOD !== null) {\r\n this._loader.log(`deferred`);\r\n const previousIndexLOD = this._materialIndexLOD - 1;\r\n this._materialSignalLODs[previousIndexLOD] = this._materialSignalLODs[previousIndexLOD] || new Deferred<void>();\r\n return this._materialSignalLODs[previousIndexLOD].promise.then(async () => {\r\n return await this._loader.loadUriAsync(context, property, uri);\r\n });\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadBufferAsync(context: string, buffer: IBuffer, byteOffset: number, byteLength: number): Nullable<Promise<ArrayBufferView>> {\r\n if (this._loader.parent.useRangeRequests && !buffer.uri) {\r\n if (!this._loader.bin) {\r\n throw new Error(`${context}: Uri is missing or the binary glTF is missing its binary chunk`);\r\n }\r\n\r\n const loadAsync = async (bufferLODs: Array<IBufferInfo>, indexLOD: number) => {\r\n const start = byteOffset;\r\n const end = start + byteLength - 1;\r\n let bufferLOD = bufferLODs[indexLOD];\r\n if (bufferLOD) {\r\n bufferLOD.start = Math.min(bufferLOD.start, start);\r\n bufferLOD.end = Math.max(bufferLOD.end, end);\r\n } else {\r\n bufferLOD = { start: start, end: end, loaded: new Deferred() };\r\n bufferLODs[indexLOD] = bufferLOD;\r\n }\r\n\r\n return await bufferLOD.loaded.promise.then((data) => {\r\n return new Uint8Array(data.buffer, data.byteOffset + byteOffset - bufferLOD.start, byteLength);\r\n });\r\n };\r\n\r\n this._loader.log(`deferred`);\r\n\r\n if (this._nodeIndexLOD !== null) {\r\n return loadAsync(this._nodeBufferLODs, this._nodeIndexLOD);\r\n } else if (this._materialIndexLOD !== null) {\r\n return loadAsync(this._materialBufferLODs, this._materialIndexLOD);\r\n } else {\r\n return loadAsync(this._bufferLODs, 0);\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _loadBufferLOD(bufferLODs: Array<IBufferInfo>, indexLOD: number): void {\r\n const bufferLOD = bufferLODs[indexLOD];\r\n if (bufferLOD) {\r\n this._loader.log(`Loading buffer range [${bufferLOD.start}-${bufferLOD.end}]`);\r\n this._loader.bin!.readAsync(bufferLOD.start, bufferLOD.end - bufferLOD.start + 1).then(\r\n (data) => {\r\n bufferLOD.loaded.resolve(data);\r\n },\r\n (error) => {\r\n bufferLOD.loaded.reject(error);\r\n }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * @returns an array of LOD properties from lowest to highest.\r\n * @param context\r\n * @param property\r\n * @param array\r\n * @param ids\r\n */\r\n private _getLODs<T>(context: string, property: T, array: ArrayLike<T> | undefined, ids: number[]): T[] {\r\n if (this.maxLODsToLoad <= 0) {\r\n throw new Error(\"maxLODsToLoad must be greater than zero\");\r\n }\r\n\r\n const properties: T[] = [];\r\n\r\n for (let i = ids.length - 1; i >= 0; i--) {\r\n properties.push(ArrayItem.Get(`${context}/ids/${ids[i]}`, array, ids[i]));\r\n if (properties.length === this.maxLODsToLoad) {\r\n return properties;\r\n }\r\n }\r\n\r\n properties.push(property);\r\n return properties;\r\n }\r\n\r\n private _disposeTransformNode(babylonTransformNode: TransformNode): void {\r\n const babylonMaterials: Material[] = [];\r\n const babylonMaterial = (babylonTransformNode as Mesh).material;\r\n if (babylonMaterial) {\r\n babylonMaterials.push(babylonMaterial);\r\n }\r\n for (const babylonMesh of babylonTransformNode.getChildMeshes()) {\r\n if (babylonMesh.material) {\r\n babylonMaterials.push(babylonMesh.material);\r\n }\r\n }\r\n\r\n babylonTransformNode.dispose();\r\n\r\n const babylonMaterialsToDispose = babylonMaterials.filter((babylonMaterial) => this._loader.babylonScene.meshes.every((mesh) => mesh.material != babylonMaterial));\r\n this._disposeMaterials(babylonMaterialsToDispose);\r\n }\r\n\r\n private _disposeMaterials(babylonMaterials: Material[]): void {\r\n const babylonTextures: { [uniqueId: number]: BaseTexture } = {};\r\n\r\n for (const babylonMaterial of babylonMaterials) {\r\n for (const babylonTexture of babylonMaterial.getActiveTextures()) {\r\n babylonTextures[babylonTexture.uniqueId] = babylonTexture;\r\n }\r\n\r\n babylonMaterial.dispose();\r\n }\r\n\r\n for (const uniqueId in babylonTextures) {\r\n for (const babylonMaterial of this._loader.babylonScene.materials) {\r\n if (babylonMaterial.hasTexture(babylonTextures[uniqueId])) {\r\n delete babylonTextures[uniqueId];\r\n }\r\n }\r\n }\r\n\r\n for (const uniqueId in babylonTextures) {\r\n babylonTextures[uniqueId].dispose();\r\n }\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new MSFT_lod(loader));\r\n","import { type Nullable } from \"core/types\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { type PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport { type IMaterial } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"MSFT_minecraftMesh\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the MSFT_minecraftMesh extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"MSFT_minecraftMesh\"]: {};\r\n }\r\n}\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class MSFT_minecraftMesh implements IGLTFLoaderExtension {\r\n /** @internal */\r\n public readonly name = NAME;\r\n\r\n /** @internal */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /** @internal */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /** @internal */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtraAsync<boolean>(context, material, this.name, async (extraContext, extra) => {\r\n if (extra) {\r\n if (!this._loader._pbrMaterialImpl) {\r\n throw new Error(`${extraContext}: Material type not supported`);\r\n }\r\n\r\n const promise = this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial);\r\n\r\n if (babylonMaterial.needAlphaBlending()) {\r\n babylonMaterial.forceDepthWrite = true;\r\n babylonMaterial.separateCullingPass = true;\r\n }\r\n\r\n babylonMaterial.backFaceCulling = babylonMaterial.forceDepthWrite;\r\n (babylonMaterial as PBRMaterial).twoSidedLighting = true;\r\n\r\n return await promise;\r\n }\r\n });\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new MSFT_minecraftMesh(loader));\r\n","import { type Nullable } from \"core/types\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { type IMaterial } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader } from \"../glTFLoader\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"MSFT_sRGBFactors\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the MSFT_sRGBFactors extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"MSFT_sRGBFactors\"]: {};\r\n }\r\n}\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class MSFT_sRGBFactors implements IGLTFLoaderExtension {\r\n /** @internal */\r\n public readonly name = NAME;\r\n\r\n /** @internal */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /** @internal */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /** @internal*/\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable<Promise<void>> {\r\n return GLTFLoader.LoadExtraAsync<boolean>(context, material, this.name, async (extraContext, extra) => {\r\n if (extra) {\r\n const adapter = this._loader._getOrCreateMaterialAdapter(babylonMaterial)!;\r\n const promise = this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial);\r\n\r\n const useExactSrgbConversions = babylonMaterial.getScene().getEngine().useExactSrgbConversions;\r\n if (!adapter.baseColorTexture) {\r\n adapter.baseColor.toLinearSpaceToRef(adapter.baseColor, useExactSrgbConversions);\r\n }\r\n if (!adapter.specularColorTexture) {\r\n adapter.specularColor.toLinearSpaceToRef(adapter.specularColor, useExactSrgbConversions);\r\n }\r\n\r\n return await promise;\r\n }\r\n });\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new MSFT_sRGBFactors(loader));\r\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { type IKHRInteractivity_Declaration, type IKHRInteractivity_Graph, type IKHRInteractivity_Node } from \"babylonjs-gltf2interface\";\nimport { FlowGraphBlockNames } from \"core/FlowGraph/Blocks/flowGraphBlockNames\";\nimport { Logger } from \"core/Misc/logger\";\nimport { type ISerializedFlowGraphBlock, type ISerializedFlowGraphContext } from \"core/FlowGraph/typeDefinitions\";\nimport { type InteractivityEvent, type InteractivityGraphToFlowGraphParser } from \"./interactivityGraphParser\";\nimport { type IGLTF } from \"../../glTFLoaderInterfaces\";\nimport { FlowGraphTypes, getAnimationTypeByFlowGraphType } from \"core/FlowGraph/flowGraphRichTypes\";\n\ninterface IGLTFToFlowGraphMappingObject {\n /**\n * The name of the property in the FlowGraph block.\n */\n name: string;\n\n /**\n * The type of the property in the glTF specs.\n * If not provided will be inferred.\n */\n gltfType?: string;\n\n /**\n * The type of the property in the FlowGraph block.\n * If not defined it equals the glTF type.\n */\n flowGraphType?: string;\n\n /**\n * A function that transforms the data from the glTF to the FlowGraph block.\n */\n dataTransformer?: (data: any, parser: InteractivityGraphToFlowGraphParser) => any;\n\n /**\n * If the property can contain multiple values.\n */\n isArray?: boolean;\n\n /**\n * If the property is in the options passed to the constructor of the block.\n */\n inOptions?: boolean;\n\n /**\n * If the property is an index to a value.\n * if defined this will be the name of the array to find the object in.\n */\n isVariable?: boolean;\n\n /**\n * the name of the class type this value will be mapped to.\n * This is used if we generate more than one block for a single glTF node.\n * Defaults to the first block in the mapping.\n */\n toBlock?: FlowGraphBlockNames;\n\n /**\n * Used in configuration values. If defined, this will be the default value, if no value is provided.\n */\n defaultValue?: any;\n}\n\nexport interface IGLTFToFlowGraphMapping {\n /**\n * The type of the FlowGraph block(s).\n * Typically will be a single element in an array.\n * When adding blocks defined in this module use the KHR_interactivity prefix.\n */\n blocks: (FlowGraphBlockNames | string)[];\n /**\n * The inputs of the glTF node mapped to the FlowGraph block.\n */\n inputs?: {\n /**\n * The value inputs of the glTF node mapped to the FlowGraph block.\n */\n values?: { [originName: string]: IGLTFToFlowGraphMappingObject };\n /**\n * The flow inputs of the glTF node mapped to the FlowGraph block.\n */\n flows?: { [originName: string]: IGLTFToFlowGraphMappingObject };\n };\n /**\n * The outputs of the glTF node mapped to the FlowGraph block.\n */\n outputs?: {\n /**\n * The value outputs of the glTF node mapped to the FlowGraph block.\n */\n values?: { [originName: string]: IGLTFToFlowGraphMappingObject };\n /**\n * The flow outputs of the glTF node mapped to the FlowGraph block.\n */\n flows?: { [originName: string]: IGLTFToFlowGraphMappingObject };\n };\n /**\n * The configuration of the glTF node mapped to the FlowGraph block.\n * This information is usually passed to the constructor of the block.\n */\n configuration?: { [originName: string]: IGLTFToFlowGraphMappingObject };\n\n /**\n * If we generate more than one block for a single glTF node, this mapping will be used to map\n * between the flowGraph classes.\n */\n typeToTypeMapping?: { [originName: string]: IGLTFToFlowGraphMappingObject };\n\n /**\n * The connections between two or more blocks.\n * This is used to connect the blocks in the graph\n */\n interBlockConnectors?: {\n /**\n * The name of the input connection in the first block.\n */\n input: string;\n /**\n * The name of the output connection in the second block.\n */\n output: string;\n\n /**\n * The index of the block in the array of blocks that corresponds to the input.\n */\n inputBlockIndex: number;\n /**\n * The index of the block in the array of blocks that corresponds to the output.\n */\n outputBlockIndex: number;\n /**\n * If the connection is a variable connection or a flow connection.\n */\n isVariable?: boolean;\n }[];\n\n /**\n * This optional function will allow to validate the node, according to the glTF specs.\n * For example, if a node has a configuration object, it must be present and correct.\n * This is a basic node-based validation.\n * This function is expected to return false and log the error if the node is not valid.\n * Note that this function can also modify the node, if needed.\n *\n * @param gltfBlock the glTF node to validate\n * @param interactivityGraph the interactivity graph\n * @param glTFObject the glTF object\n * @returns true if validated, false if not.\n */\n validation?: (gltfBlock: IKHRInteractivity_Node, interactivityGraph: IKHRInteractivity_Graph, glTFObject?: IGLTF) => { valid: boolean; error?: string };\n\n /**\n * This is used if we need extra information for the constructor/options that is not provided directly by the glTF node.\n * This function can return more than one node, if extra nodes are needed for this block to function correctly.\n * Returning more than one block will usually happen when a json pointer was provided.\n *\n * @param gltfBlock the glTF node\n * @param declaration the declaration object\n * @param mapping the mapping object\n * @param parser the interactivity graph parser\n * @param serializedObjects the serialized objects\n * @param context the serialized flow graph context\n * @param globalGLTF the global gltf object\n * @returns an array of serialized nodes that will be added to the graph.\n */\n extraProcessor?: (\n gltfBlock: IKHRInteractivity_Node,\n declaration: IKHRInteractivity_Declaration,\n mapping: IGLTFToFlowGraphMapping,\n parser: InteractivityGraphToFlowGraphParser,\n serializedObjects: ISerializedFlowGraphBlock[],\n context: ISerializedFlowGraphContext,\n globalGLTF?: IGLTF\n ) => ISerializedFlowGraphBlock[];\n}\n\nexport function getMappingForFullOperationName(fullOperationName: string) {\n const [op, extension] = fullOperationName.split(\":\");\n return getMappingForDeclaration({ op, extension });\n}\n\nexport function getMappingForDeclaration(declaration: IKHRInteractivity_Declaration, returnNoOpIfNotAvailable: boolean = true): IGLTFToFlowGraphMapping | undefined {\n const mapping = declaration.extension ? gltfExtensionsToFlowGraphMapping[declaration.extension]?.[declaration.op] : gltfToFlowGraphMapping[declaration.op];\n if (!mapping) {\n Logger.Warn(`No mapping found for operation ${declaration.op} and extension ${declaration.extension || \"KHR_interactivity\"}`);\n if (returnNoOpIfNotAvailable) {\n const inputs: IGLTFToFlowGraphMapping[\"inputs\"] = {};\n const outputs: IGLTFToFlowGraphMapping[\"outputs\"] = {\n flows: {},\n };\n if (declaration.inputValueSockets) {\n inputs.values = {};\n for (const key in declaration.inputValueSockets) {\n inputs.values[key] = {\n name: key,\n };\n }\n }\n if (declaration.outputValueSockets) {\n outputs.values = {};\n Object.keys(declaration.outputValueSockets).forEach((key) => {\n outputs.values![key] = {\n name: key,\n };\n });\n }\n return {\n blocks: [], // no blocks, just mapping\n inputs,\n outputs,\n };\n }\n }\n return mapping;\n}\n\n/**\n * This function will add new mapping to glTF interactivity.\n * Other extensions can define new types of blocks, this is the way to let interactivity know how to parse them.\n * @param key the type of node, i.e. \"variable/get\"\n * @param extension the extension of the interactivity operation, i.e. \"KHR_selectability\"\n * @param mapping The mapping object. See documentation or examples below.\n */\nexport function addNewInteractivityFlowGraphMapping(key: string, extension: string, mapping: IGLTFToFlowGraphMapping) {\n gltfExtensionsToFlowGraphMapping[extension] ||= {};\n gltfExtensionsToFlowGraphMapping[extension][key] = mapping;\n}\n\nconst gltfExtensionsToFlowGraphMapping: { [extension: string]: { [key: string]: IGLTFToFlowGraphMapping } } = {\n /**\n * This is the BABYLON extension for glTF interactivity.\n * It defines babylon-specific blocks and operations.\n */\n BABYLON: {\n /**\n * flow/log is a flow node that logs input to the console.\n * It has \"in\" and \"out\" flows, and takes a message as input.\n * The message can be any type of value.\n * The message is logged to the console when the \"in\" flow is triggered.\n * The \"out\" flow is triggered when the message is logged.\n */\n \"flow/log\": {\n blocks: [FlowGraphBlockNames.ConsoleLog],\n inputs: {\n values: {\n message: { name: \"message\" },\n },\n },\n },\n },\n};\n\n// this mapper is just a way to convert the glTF nodes to FlowGraph nodes in terms of input/output connection names and values.\nconst gltfToFlowGraphMapping: { [key: string]: IGLTFToFlowGraphMapping } = {\n \"event/onStart\": {\n blocks: [FlowGraphBlockNames.SceneReadyEvent],\n outputs: {\n flows: {\n out: { name: \"done\" },\n },\n },\n },\n \"event/onTick\": {\n blocks: [FlowGraphBlockNames.SceneTickEvent],\n inputs: {},\n outputs: {\n values: {\n timeSinceLastTick: { name: \"deltaTime\", gltfType: \"number\" /*, dataTransformer: (time: number) => time / 1000*/ },\n },\n flows: {\n out: { name: \"done\" },\n },\n },\n },\n \"event/send\": {\n blocks: [FlowGraphBlockNames.SendCustomEvent],\n extraProcessor(gltfBlock, declaration, _mapping, parser, serializedObjects) {\n // set eventId and eventData. The configuration object of the glTF should have a single object.\n // validate that we are running it on the right block.\n if (declaration.op !== \"event/send\" || !gltfBlock.configuration || Object.keys(gltfBlock.configuration).length !== 1) {\n throw new Error(\"Receive event should have a single configuration object, the event itself\");\n }\n const eventConfiguration = gltfBlock.configuration[\"event\"];\n const eventId = eventConfiguration.value?.[0];\n if (typeof eventId !== \"number\") {\n throw new Error(\"Event id should be a number\");\n }\n const event: InteractivityEvent = parser.arrays.events[eventId];\n const serializedObject = serializedObjects[0];\n serializedObject.config ||= {};\n serializedObject.config.eventId = event.eventId;\n serializedObject.config.eventData = event.eventData;\n return serializedObjects;\n },\n },\n \"event/receive\": {\n blocks: [FlowGraphBlockNames.ReceiveCustomEvent],\n outputs: {\n flows: {\n out: { name: \"done\" },\n },\n },\n validation(gltfBlock, interactivityGraph) {\n if (!gltfBlock.configuration) {\n Logger.Error(\"Receive event should have a configuration object\");\n return { valid: false, error: \"Receive event should have a configuration object\" };\n }\n const eventConfiguration = gltfBlock.configuration[\"event\"];\n if (!eventConfiguration) {\n Logger.Error(\"Receive event should have a single configuration object, the event itself\");\n return { valid: false, error: \"Receive event should have a single configuration object, the event itself\" };\n }\n const eventId = eventConfiguration.value?.[0];\n if (typeof eventId !== \"number\") {\n Logger.Error(\"Event id should be a number\");\n return { valid: false, error: \"Event id should be a number\" };\n }\n const event = interactivityGraph.events?.[eventId];\n if (!event) {\n Logger.Error(`Event with id ${eventId} not found`);\n return { valid: false, error: `Event with id ${eventId} not found` };\n }\n return { valid: true };\n },\n extraProcessor(gltfBlock, declaration, _mapping, parser, serializedObjects) {\n // set eventId and eventData. The configuration object of the glTF should have a single object.\n // validate that we are running it on the right block.\n if (declaration.op !== \"event/receive\" || !gltfBlock.configuration || Object.keys(gltfBlock.configuration).length !== 1) {\n throw new Error(\"Receive event should have a single configuration object, the event itself\");\n }\n const eventConfiguration = gltfBlock.configuration[\"event\"];\n const eventId = eventConfiguration.value?.[0];\n if (typeof eventId !== \"number\") {\n throw new Error(\"Event id should be a number\");\n }\n const event: InteractivityEvent = parser.arrays.events[eventId];\n const serializedObject = serializedObjects[0];\n serializedObject.config ||= {};\n serializedObject.config.eventId = event.eventId;\n serializedObject.config.eventData = event.eventData;\n return serializedObjects;\n },\n },\n \"math/E\": getSimpleInputMapping(FlowGraphBlockNames.E),\n \"math/Pi\": getSimpleInputMapping(FlowGraphBlockNames.PI),\n \"math/Inf\": getSimpleInputMapping(FlowGraphBlockNames.Inf),\n \"math/NaN\": getSimpleInputMapping(FlowGraphBlockNames.NaN),\n \"math/abs\": getSimpleInputMapping(FlowGraphBlockNames.Abs),\n \"math/sign\": getSimpleInputMapping(FlowGraphBlockNames.Sign),\n \"math/trunc\": getSimpleInputMapping(FlowGraphBlockNames.Trunc),\n \"math/floor\": getSimpleInputMapping(FlowGraphBlockNames.Floor),\n \"math/ceil\": getSimpleInputMapping(FlowGraphBlockNames.Ceil),\n \"math/round\": {\n blocks: [FlowGraphBlockNames.Round],\n configuration: {},\n inputs: {\n values: {\n a: { name: \"a\" },\n },\n },\n outputs: {\n values: {\n value: { name: \"value\" },\n },\n },\n extraProcessor(gltfBlock, declaration, _mapping, parser, serializedObjects) {\n // configure it to work the way glTF specifies\n serializedObjects[0].config ||= {};\n serializedObjects[0].config.roundHalfAwayFromZero = true;\n return serializedObjects;\n },\n },\n \"math/fract\": getSimpleInputMapping(FlowGraphBlockNames.Fraction),\n \"math/neg\": getSimpleInputMapping(FlowGraphBlockNames.Negation),\n \"math/add\": getSimpleInputMapping(FlowGraphBlockNames.Add, [\"a\", \"b\"], true),\n \"math/sub\": getSimpleInputMapping(FlowGraphBlockNames.Subtract, [\"a\", \"b\"], true),\n \"math/mul\": {\n blocks: [FlowGraphBlockNames.Multiply],\n extraProcessor(_gltfBlock, _declaration, _mapping, _parser, serializedObjects) {\n // configure it to work the way glTF specifies\n serializedObjects[0].config ||= {};\n serializedObjects[0].config.useMatrixPerComponent = true;\n serializedObjects[0].config.preventIntegerFloatArithmetic = true;\n // try to infer the type or fallback to Integer\n // check the gltf block for the inputs, see if they have a type\n let type = -1;\n Object.keys(_gltfBlock.values || {}).find((value) => {\n if (_gltfBlock.values?.[value].type !== undefined) {\n type = _gltfBlock.values[value].type;\n return true;\n }\n return false;\n });\n if (type !== -1) {\n serializedObjects[0].config.type = _parser.arrays.types[type].flowGraphType;\n }\n return serializedObjects;\n },\n validation(gltfBlock) {\n if (gltfBlock.values) {\n // make sure types are the same\n return ValidateTypes(gltfBlock);\n }\n return { valid: true };\n },\n },\n \"math/div\": getSimpleInputMapping(FlowGraphBlockNames.Divide, [\"a\", \"b\"], true),\n \"math/rem\": getSimpleInputMapping(FlowGraphBlockNames.Modulo, [\"a\", \"b\"]),\n \"math/min\": getSimpleInputMapping(FlowGraphBlockNames.Min, [\"a\", \"b\"]),\n \"math/max\": getSimpleInputMapping(FlowGraphBlockNames.Max, [\"a\", \"b\"]),\n \"math/clamp\": getSimpleInputMapping(FlowGraphBlockNames.Clamp, [\"a\", \"b\", \"c\"]),\n \"math/saturate\": getSimpleInputMapping(FlowGraphBlockNames.Saturate),\n \"math/mix\": getSimpleInputMapping(FlowGraphBlockNames.MathInterpolation, [\"a\", \"b\", \"c\"]),\n \"math/eq\": getSimpleInputMapping(FlowGraphBlockNames.Equality, [\"a\", \"b\"]),\n \"math/lt\": getSimpleInputMapping(FlowGraphBlockNames.LessThan, [\"a\", \"b\"]),\n \"math/le\": getSimpleInputMapping(FlowGraphBlockNames.LessThanOrEqual, [\"a\", \"b\"]),\n \"math/gt\": getSimpleInputMapping(FlowGraphBlockNames.GreaterThan, [\"a\", \"b\"]),\n \"math/ge\": getSimpleInputMapping(FlowGraphBlockNames.GreaterThanOrEqual, [\"a\", \"b\"]),\n \"math/isNaN\": getSimpleInputMapping(FlowGraphBlockNames.IsNaN),\n \"math/isInf\": getSimpleInputMapping(FlowGraphBlockNames.IsInfinity),\n \"math/select\": {\n blocks: [FlowGraphBlockNames.Conditional],\n inputs: {\n values: {\n condition: { name: \"condition\" },\n // Should we validate those have the same type here, or assume it is already validated?\n a: { name: \"onTrue\" },\n b: { name: \"onFalse\" },\n },\n },\n outputs: {\n values: {\n value: { name: \"output\" },\n },\n },\n },\n \"math/random\": {\n blocks: [FlowGraphBlockNames.Random],\n outputs: {\n values: {\n value: { name: \"value\" },\n },\n },\n },\n \"math/sin\": getSimpleInputMapping(FlowGraphBlockNames.Sin),\n \"math/cos\": getSimpleInputMapping(FlowGraphBlockNames.Cos),\n \"math/tan\": getSimpleInputMapping(FlowGraphBlockNames.Tan),\n \"math/asin\": getSimpleInputMapping(FlowGraphBlockNames.Asin),\n \"math/acos\": getSimpleInputMapping(FlowGraphBlockNames.Acos),\n \"math/atan\": getSimpleInputMapping(FlowGraphBlockNames.Atan),\n \"math/atan2\": getSimpleInputMapping(FlowGraphBlockNames.Atan2, [\"a\", \"b\"]),\n \"math/sinh\": getSimpleInputMapping(FlowGraphBlockNames.Sinh),\n \"math/cosh\": getSimpleInputMapping(FlowGraphBlockNames.Cosh),\n \"math/tanh\": getSimpleInputMapping(FlowGraphBlockNames.Tanh),\n \"math/asinh\": getSimpleInputMapping(FlowGraphBlockNames.Asinh),\n \"math/acosh\": getSimpleInputMapping(FlowGraphBlockNames.Acosh),\n \"math/atanh\": getSimpleInputMapping(FlowGraphBlockNames.Atanh),\n \"math/exp\": getSimpleInputMapping(FlowGraphBlockNames.Exponential),\n \"math/log\": getSimpleInputMapping(FlowGraphBlockNames.Log),\n \"math/log2\": getSimpleInputMapping(FlowGraphBlockNames.Log2),\n \"math/log10\": getSimpleInputMapping(FlowGraphBlockNames.Log10),\n \"math/sqrt\": getSimpleInputMapping(FlowGraphBlockNames.SquareRoot),\n \"math/cbrt\": getSimpleInputMapping(FlowGraphBlockNames.CubeRoot),\n \"math/pow\": getSimpleInputMapping(FlowGraphBlockNames.Power, [\"a\", \"b\"]),\n \"math/length\": getSimpleInputMapping(FlowGraphBlockNames.Length),\n \"math/normalize\": getSimpleInputMapping(FlowGraphBlockNames.Normalize),\n \"math/dot\": getSimpleInputMapping(FlowGraphBlockNames.Dot, [\"a\", \"b\"]),\n \"math/cross\": getSimpleInputMapping(FlowGraphBlockNames.Cross, [\"a\", \"b\"]),\n \"math/rotate2D\": {\n blocks: [FlowGraphBlockNames.Rotate2D],\n inputs: {\n values: {\n a: { name: \"a\" },\n angle: { name: \"b\" },\n },\n },\n outputs: {\n values: {\n value: { name: \"value\" },\n },\n },\n },\n \"math/rotate3D\": {\n blocks: [FlowGraphBlockNames.Rotate3D],\n inputs: {\n values: {\n a: { name: \"a\" },\n rotation: { name: \"b\" },\n },\n },\n outputs: {\n values: {\n value: { name: \"value\" },\n },\n },\n },\n \"math/transform\": {\n // glTF transform is vectorN with matrixN\n blocks: [FlowGraphBlockNames.TransformVector],\n inputs: {\n values: {\n a: { name: \"a\" },\n b: { name: \"b\" },\n },\n },\n outputs: {\n values: {\n value: { name: \"value\" },\n },\n },\n },\n \"math/combine2\": {\n blocks: [FlowGraphBlockNames.CombineVector2],\n inputs: {\n values: {\n a: { name: \"input_0\", gltfType: \"number\" },\n b: { name: \"input_1\", gltfType: \"number\" },\n },\n },\n outputs: {\n values: {\n value: { name: \"value\" },\n },\n },\n },\n \"math/combine3\": {\n blocks: [FlowGraphBlockNames.CombineVector3],\n inputs: {\n values: {\n a: { name: \"input_0\", gltfType: \"number\" },\n b: { name: \"input_1\", gltfType: \"number\" },\n c: { name: \"input_2\", gltfType: \"number\" },\n },\n },\n outputs: {\n values: {\n value: { name: \"value\" },\n },\n },\n },\n \"math/combine4\": {\n blocks: [FlowGraphBlockNames.CombineVector4],\n inputs: {\n values: {\n a: { name: \"input_0\", gltfType: \"number\" },\n b: { name: \"input_1\", gltfType: \"number\" },\n c: { name: \"input_2\", gltfType: \"number\" },\n d: { name: \"input_3\", gltfType: \"number\" },\n },\n },\n outputs: {\n values: {\n value: { name: \"value\" },\n },\n },\n },\n // one input, N outputs! outputs named using numbers.\n \"math/extract2\": {\n blocks: [FlowGraphBlockNames.ExtractVector2],\n inputs: {\n values: {\n a: { name: \"input\", gltfType: \"number\" },\n },\n },\n outputs: {\n values: {\n \"0\": { name: \"output_0\" },\n \"1\": { name: \"output_1\" },\n },\n },\n },\n \"math/extract3\": {\n blocks: [FlowGraphBlockNames.ExtractVector3],\n inputs: {\n values: {\n a: { name: \"input\", gltfType: \"number\" },\n },\n },\n outputs: {\n values: {\n \"0\": { name: \"output_0\" },\n \"1\": { name: \"output_1\" },\n \"2\": { name: \"output_2\" },\n },\n },\n },\n \"math/extract4\": {\n blocks: [FlowGraphBlockNames.ExtractVector4],\n inputs: {\n values: {\n a: { name: \"input\", gltfType: \"number\" },\n },\n },\n outputs: {\n values: {\n \"0\": { name: \"output_0\" },\n \"1\": { name: \"output_1\" },\n \"2\": { name: \"output_2\" },\n \"3\": { name: \"output_3\" },\n },\n },\n },\n \"math/transpose\": getSimpleInputMapping(FlowGraphBlockNames.Transpose),\n \"math/determinant\": getSimpleInputMapping(FlowGraphBlockNames.Determinant),\n \"math/inverse\": getSimpleInputMapping(FlowGraphBlockNames.InvertMatrix),\n \"math/matMul\": getSimpleInputMapping(FlowGraphBlockNames.MatrixMultiplication, [\"a\", \"b\"]),\n \"math/matCompose\": {\n blocks: [FlowGraphBlockNames.MatrixCompose],\n inputs: {\n values: {\n translation: { name: \"position\", gltfType: \"float3\" },\n rotation: { name: \"rotationQuaternion\", gltfType: \"float4\" },\n scale: { name: \"scaling\", gltfType: \"float3\" },\n },\n },\n outputs: {\n values: {\n value: { name: \"value\" },\n },\n },\n extraProcessor(_gltfBlock, _declaration, _mapping, _parser, serializedObjects, context) {\n // configure it to work the way glTF specifies\n const d = serializedObjects[0].dataInputs.find((input) => input.name === \"rotationQuaternion\");\n if (!d) {\n throw new Error(\"Rotation quaternion input not found\");\n }\n // if value is defined, set the type to quaternion\n if (context._connectionValues[d.uniqueId]) {\n context._connectionValues[d.uniqueId].type = FlowGraphTypes.Quaternion;\n }\n return serializedObjects;\n },\n },\n \"math/matDecompose\": {\n blocks: [FlowGraphBlockNames.MatrixDecompose],\n inputs: {\n values: {\n a: { name: \"input\", gltfType: \"number\" },\n },\n },\n outputs: {\n values: {\n translation: { name: \"position\" },\n rotation: { name: \"rotationQuaternion\" },\n scale: { name: \"scaling\" },\n },\n },\n },\n \"math/quatConjugate\": getSimpleInputMapping(FlowGraphBlockNames.Conjugate, [\"a\"]),\n \"math/quatMul\": {\n blocks: [FlowGraphBlockNames.Multiply],\n inputs: {\n values: {\n a: { name: \"a\", gltfType: \"vector4\" },\n b: { name: \"b\", gltfType: \"vector4\" },\n },\n },\n outputs: {\n values: {\n value: { name: \"value\" },\n },\n },\n extraProcessor(_gltfBlock, _declaration, _mapping, _parser, serializedObjects) {\n serializedObjects[0].config ||= {};\n serializedObjects[0].config.type = FlowGraphTypes.Quaternion;\n return serializedObjects;\n },\n },\n \"math/quatAngleBetween\": getSimpleInputMapping(FlowGraphBlockNames.AngleBetween, [\"a\", \"b\"]),\n \"math/quatFromAxisAngle\": {\n blocks: [FlowGraphBlockNames.QuaternionFromAxisAngle],\n inputs: {\n values: {\n axis: { name: \"a\", gltfType: \"float3\" },\n angle: { name: \"b\", gltfType: \"number\" },\n },\n },\n outputs: {\n values: {\n value: { name: \"value\" },\n },\n },\n },\n \"math/quatToAxisAngle\": getSimpleInputMapping(FlowGraphBlockNames.AxisAngleFromQuaternion, [\"a\"]),\n \"math/quatFromDirections\": getSimpleInputMapping(FlowGraphBlockNames.QuaternionFromDirections, [\"a\", \"b\"]),\n \"math/combine2x2\": {\n blocks: [FlowGraphBlockNames.CombineMatrix2D],\n inputs: {\n values: {\n a: { name: \"input_0\", gltfType: \"number\" },\n b: { name: \"input_1\", gltfType: \"number\" },\n c: { name: \"input_2\", gltfType: \"number\" },\n d: { name: \"input_3\", gltfType: \"number\" },\n },\n },\n outputs: {\n values: {\n value: { name: \"value\" },\n },\n },\n extraProcessor(_gltfBlock, _declaration, _mapping, _parser, serializedObjects) {\n // configure it to work the way glTF specifies\n serializedObjects[0].config ||= {};\n serializedObjects[0].config.inputIsColumnMajor = true;\n return serializedObjects;\n },\n },\n \"math/extract2x2\": {\n blocks: [FlowGraphBlockNames.ExtractMatrix2D],\n inputs: {\n values: {\n a: { name: \"input\", gltfType: \"float2x2\" },\n },\n },\n outputs: {\n values: {\n \"0\": { name: \"output_0\" },\n \"1\": { name: \"output_1\" },\n \"2\": { name: \"output_2\" },\n \"3\": { name: \"output_3\" },\n },\n },\n },\n \"math/combine3x3\": {\n blocks: [FlowGraphBlockNames.CombineMatrix3D],\n inputs: {\n values: {\n a: { name: \"input_0\", gltfType: \"number\" },\n b: { name: \"input_1\", gltfType: \"number\" },\n c: { name: \"input_2\", gltfType: \"number\" },\n d: { name: \"input_3\", gltfType: \"number\" },\n e: { name: \"input_4\", gltfType: \"number\" },\n f: { name: \"input_5\", gltfType: \"number\" },\n g: { name: \"input_6\", gltfType: \"number\" },\n h: { name: \"input_7\", gltfType: \"number\" },\n i: { name: \"input_8\", gltfType: \"number\" },\n },\n },\n outputs: {\n values: {\n value: { name: \"value\" },\n },\n },\n extraProcessor(_gltfBlock, _declaration, _mapping, _parser, serializedObjects) {\n // configure it to work the way glTF specifies\n serializedObjects[0].config ||= {};\n serializedObjects[0].config.inputIsColumnMajor = true;\n return serializedObjects;\n },\n },\n \"math/extract3x3\": {\n blocks: [FlowGraphBlockNames.ExtractMatrix3D],\n inputs: {\n values: {\n a: { name: \"input\", gltfType: \"float3x3\" },\n },\n },\n outputs: {\n values: {\n \"0\": { name: \"output_0\" },\n \"1\": { name: \"output_1\" },\n \"2\": { name: \"output_2\" },\n \"3\": { name: \"output_3\" },\n \"4\": { name: \"output_4\" },\n \"5\": { name: \"output_5\" },\n \"6\": { name: \"output_6\" },\n \"7\": { name: \"output_7\" },\n \"8\": { name: \"output_8\" },\n },\n },\n },\n \"math/combine4x4\": {\n blocks: [FlowGraphBlockNames.CombineMatrix],\n inputs: {\n values: {\n a: { name: \"input_0\", gltfType: \"number\" },\n b: { name: \"input_1\", gltfType: \"number\" },\n c: { name: \"input_2\", gltfType: \"number\" },\n d: { name: \"input_3\", gltfType: \"number\" },\n e: { name: \"input_4\", gltfType: \"number\" },\n f: { name: \"input_5\", gltfType: \"number\" },\n g: { name: \"input_6\", gltfType: \"number\" },\n h: { name: \"input_7\", gltfType: \"number\" },\n i: { name: \"input_8\", gltfType: \"number\" },\n j: { name: \"input_9\", gltfType: \"number\" },\n k: { name: \"input_10\", gltfType: \"number\" },\n l: { name: \"input_11\", gltfType: \"number\" },\n m: { name: \"input_12\", gltfType: \"number\" },\n n: { name: \"input_13\", gltfType: \"number\" },\n o: { name: \"input_14\", gltfType: \"number\" },\n p: { name: \"input_15\", gltfType: \"number\" },\n },\n },\n outputs: {\n values: {\n value: { name: \"value\" },\n },\n },\n extraProcessor(_gltfBlock, _declaration, _mapping, _parser, serializedObjects) {\n // configure it to work the way glTF specifies\n serializedObjects[0].config ||= {};\n serializedObjects[0].config.inputIsColumnMajor = true;\n return serializedObjects;\n },\n },\n \"math/extract4x4\": {\n blocks: [FlowGraphBlockNames.ExtractMatrix],\n configuration: {},\n inputs: {\n values: {\n a: { name: \"input\", gltfType: \"number\" },\n },\n },\n outputs: {\n values: {\n \"0\": { name: \"output_0\" },\n \"1\": { name: \"output_1\" },\n \"2\": { name: \"output_2\" },\n \"3\": { name: \"output_3\" },\n \"4\": { name: \"output_4\" },\n \"5\": { name: \"output_5\" },\n \"6\": { name: \"output_6\" },\n \"7\": { name: \"output_7\" },\n \"8\": { name: \"output_8\" },\n \"9\": { name: \"output_9\" },\n \"10\": { name: \"output_10\" },\n \"11\": { name: \"output_11\" },\n \"12\": { name: \"output_12\" },\n \"13\": { name: \"output_13\" },\n \"14\": { name: \"output_14\" },\n \"15\": { name: \"output_15\" },\n },\n },\n },\n \"math/not\": {\n blocks: [FlowGraphBlockNames.BitwiseNot],\n inputs: {\n values: {\n a: { name: \"a\" },\n },\n },\n outputs: {\n values: {\n value: { name: \"value\" },\n },\n },\n extraProcessor(_gltfBlock, _declaration, _mapping, _parser, serializedObjects, context) {\n // configure it to work the way glTF specifies\n serializedObjects[0].config ||= {};\n // try to infer the type or fallback to Integer\n const socketIn = serializedObjects[0].dataInputs[0];\n serializedObjects[0].config.valueType = context._connectionValues[socketIn.uniqueId]?.type ?? FlowGraphTypes.Integer;\n return serializedObjects;\n },\n },\n \"math/and\": {\n blocks: [FlowGraphBlockNames.BitwiseAnd],\n inputs: {\n values: {\n a: { name: \"a\" },\n b: { name: \"b\" },\n },\n },\n outputs: {\n values: {\n value: { name: \"value\" },\n },\n },\n extraProcessor(_gltfBlock, _declaration, _mapping, _parser, serializedObjects, context) {\n // configure it to work the way glTF specifies\n serializedObjects[0].config ||= {};\n // try to infer the type or fallback to Integer\n const socketInA = serializedObjects[0].dataInputs[0];\n const socketInB = serializedObjects[0].dataInputs[1];\n serializedObjects[0].config.valueType =\n context._connectionValues[socketInA.uniqueId]?.type ?? context._connectionValues[socketInB.uniqueId]?.type ?? FlowGraphTypes.Integer;\n return serializedObjects;\n },\n },\n \"math/or\": {\n blocks: [FlowGraphBlockNames.BitwiseOr],\n inputs: {\n values: {\n a: { name: \"a\" },\n b: { name: \"b\" },\n },\n },\n outputs: {\n values: {\n value: { name: \"value\" },\n },\n },\n extraProcessor(_gltfBlock, _declaration, _mapping, _parser, serializedObjects, context) {\n // configure it to work the way glTF specifies\n serializedObjects[0].config ||= {};\n // try to infer the type or fallback to Integer\n const socketInA = serializedObjects[0].dataInputs[0];\n const socketInB = serializedObjects[0].dataInputs[1];\n serializedObjects[0].config.valueType =\n context._connectionValues[socketInA.uniqueId]?.type ?? context._connectionValues[socketInB.uniqueId]?.type ?? FlowGraphTypes.Integer;\n return serializedObjects;\n },\n },\n \"math/xor\": {\n blocks: [FlowGraphBlockNames.BitwiseXor],\n inputs: {\n values: {\n a: { name: \"a\" },\n b: { name: \"b\" },\n },\n },\n outputs: {\n values: {\n value: { name: \"value\" },\n },\n },\n extraProcessor(_gltfBlock, _declaration, _mapping, _parser, serializedObjects, context) {\n // configure it to work the way glTF specifies\n serializedObjects[0].config ||= {};\n // try to infer the type or fallback to Integer\n const socketInA = serializedObjects[0].dataInputs[0];\n const socketInB = serializedObjects[0].dataInputs[1];\n serializedObjects[0].config.valueType =\n context._connectionValues[socketInA.uniqueId]?.type ?? context._connectionValues[socketInB.uniqueId]?.type ?? FlowGraphTypes.Integer;\n return serializedObjects;\n },\n },\n \"math/asr\": getSimpleInputMapping(FlowGraphBlockNames.BitwiseRightShift, [\"a\", \"b\"]),\n \"math/lsl\": getSimpleInputMapping(FlowGraphBlockNames.BitwiseLeftShift, [\"a\", \"b\"]),\n \"math/clz\": getSimpleInputMapping(FlowGraphBlockNames.LeadingZeros),\n \"math/ctz\": getSimpleInputMapping(FlowGraphBlockNames.TrailingZeros),\n \"math/popcnt\": getSimpleInputMapping(FlowGraphBlockNames.OneBitsCounter),\n \"math/rad\": getSimpleInputMapping(FlowGraphBlockNames.DegToRad),\n \"math/deg\": getSimpleInputMapping(FlowGraphBlockNames.RadToDeg),\n \"type/boolToInt\": getSimpleInputMapping(FlowGraphBlockNames.BooleanToInt),\n \"type/boolToFloat\": getSimpleInputMapping(FlowGraphBlockNames.BooleanToFloat),\n \"type/intToBool\": getSimpleInputMapping(FlowGraphBlockNames.IntToBoolean),\n \"type/intToFloat\": getSimpleInputMapping(FlowGraphBlockNames.IntToFloat),\n \"type/floatToInt\": getSimpleInputMapping(FlowGraphBlockNames.FloatToInt),\n \"type/floatToBool\": getSimpleInputMapping(FlowGraphBlockNames.FloatToBoolean),\n\n // flows\n \"flow/sequence\": {\n blocks: [FlowGraphBlockNames.Sequence],\n extraProcessor(gltfBlock, _declaration, _mapping, _arrays, serializedObjects) {\n const serializedObject = serializedObjects[0];\n serializedObject.config ||= {};\n serializedObject.config.outputSignalCount = Object.keys(gltfBlock.flows || []).length;\n serializedObject.signalOutputs.forEach((output, index) => {\n output.name = \"out_\" + index;\n });\n return serializedObjects;\n },\n },\n \"flow/branch\": {\n blocks: [FlowGraphBlockNames.Branch],\n outputs: {\n flows: {\n true: { name: \"onTrue\" },\n false: { name: \"onFalse\" },\n },\n },\n },\n \"flow/switch\": {\n blocks: [FlowGraphBlockNames.Switch],\n configuration: {\n cases: { name: \"cases\", isArray: true, inOptions: true, defaultValue: [] },\n },\n inputs: {\n values: {\n selection: { name: \"case\" },\n default: { name: \"default\" },\n },\n },\n validation(gltfBlock) {\n const cases = gltfBlock.configuration?.cases;\n if (cases && cases.value) {\n const onlyIntegers = cases.value.every((caseValue) => {\n // case value should be an integer. Since Number.isInteger(1.0) is true, we need to check if toString has only digits.\n return typeof caseValue === \"number\" && /^-?\\d+$/.test(caseValue.toString());\n });\n if (!onlyIntegers) {\n Logger.Warn(\"Switch cases should be integers. Using empty array instead.\");\n cases.value = [] as number[];\n return { valid: true };\n }\n // check for duplicates\n const uniqueCases = new Set(cases.value);\n cases.value = Array.from(uniqueCases) as number[];\n }\n return { valid: true };\n },\n extraProcessor(gltfBlock, declaration, _mapping, _arrays, serializedObjects) {\n // convert all names of output flow to out_$1 apart from \"default\"\n if (declaration.op !== \"flow/switch\" || !gltfBlock.flows || Object.keys(gltfBlock.flows).length === 0) {\n throw new Error(\"Switch should have a single configuration object, the cases array\");\n }\n const serializedObject = serializedObjects[0];\n serializedObject.signalOutputs.forEach((output) => {\n if (output.name !== \"default\") {\n output.name = \"out_\" + output.name;\n }\n });\n return serializedObjects;\n },\n },\n \"flow/while\": {\n blocks: [FlowGraphBlockNames.WhileLoop],\n outputs: {\n flows: {\n loopBody: { name: \"executionFlow\" },\n },\n },\n },\n \"flow/for\": {\n blocks: [FlowGraphBlockNames.ForLoop],\n configuration: {\n initialIndex: { name: \"initialIndex\", gltfType: \"number\", inOptions: true, defaultValue: 0 },\n },\n inputs: {\n values: {\n startIndex: { name: \"startIndex\", gltfType: \"number\" },\n endIndex: { name: \"endIndex\", gltfType: \"number\" },\n },\n },\n outputs: {\n values: {\n index: { name: \"index\" },\n },\n flows: {\n loopBody: { name: \"executionFlow\" },\n },\n },\n extraProcessor(_gltfBlock, _declaration, _mapping, _arrays, serializedObjects) {\n const serializedObject = serializedObjects[0];\n serializedObject.config ||= {};\n serializedObject.config.incrementIndexWhenLoopDone = true;\n return serializedObjects;\n },\n },\n \"flow/doN\": {\n blocks: [FlowGraphBlockNames.DoN],\n configuration: {},\n inputs: {\n values: {\n n: { name: \"maxExecutions\", gltfType: \"number\" },\n },\n },\n outputs: {\n values: {\n currentCount: { name: \"executionCount\" },\n },\n },\n },\n \"flow/multiGate\": {\n blocks: [FlowGraphBlockNames.MultiGate],\n configuration: {\n isRandom: { name: \"isRandom\", gltfType: \"boolean\", inOptions: true, defaultValue: false },\n isLoop: { name: \"isLoop\", gltfType: \"boolean\", inOptions: true, defaultValue: false },\n },\n extraProcessor(gltfBlock, declaration, _mapping, _arrays, serializedObjects) {\n if (declaration.op !== \"flow/multiGate\" || !gltfBlock.flows || Object.keys(gltfBlock.flows).length === 0) {\n throw new Error(\"MultiGate should have a single configuration object, the number of output flows\");\n }\n const serializedObject = serializedObjects[0];\n serializedObject.config ||= {};\n serializedObject.config.outputSignalCount = Object.keys(gltfBlock.flows).length;\n serializedObject.signalOutputs.forEach((output, index) => {\n output.name = \"out_\" + index;\n });\n return serializedObjects;\n },\n },\n \"flow/waitAll\": {\n blocks: [FlowGraphBlockNames.WaitAll],\n configuration: {\n inputFlows: { name: \"inputSignalCount\", gltfType: \"number\", inOptions: true, defaultValue: 0 },\n },\n inputs: {\n flows: {\n reset: { name: \"reset\" },\n \"[segment]\": { name: \"in_$1\" },\n },\n },\n validation(gltfBlock) {\n // check that the configuration value is an integer\n if (typeof gltfBlock.configuration?.inputFlows?.value?.[0] !== \"number\") {\n gltfBlock.configuration = gltfBlock.configuration || {\n inputFlows: { value: [0] },\n };\n gltfBlock.configuration.inputFlows.value = [0];\n }\n return { valid: true };\n },\n },\n \"flow/throttle\": {\n blocks: [FlowGraphBlockNames.Throttle],\n outputs: {\n flows: {\n err: { name: \"error\" },\n },\n },\n },\n \"flow/setDelay\": {\n blocks: [FlowGraphBlockNames.SetDelay],\n outputs: {\n flows: {\n err: { name: \"error\" },\n },\n },\n },\n \"flow/cancelDelay\": {\n blocks: [FlowGraphBlockNames.CancelDelay],\n },\n \"variable/get\": {\n blocks: [FlowGraphBlockNames.GetVariable],\n validation(gltfBlock) {\n if (!gltfBlock.configuration?.variable?.value) {\n Logger.Error(\"Variable get block should have a variable configuration\");\n return { valid: false, error: \"Variable get block should have a variable configuration\" };\n }\n return { valid: true };\n },\n configuration: {\n variable: {\n name: \"variable\",\n gltfType: \"number\",\n flowGraphType: \"string\",\n inOptions: true,\n isVariable: true,\n dataTransformer(index, parser) {\n return parser.getVariableName(index);\n },\n },\n },\n },\n \"variable/set\": {\n blocks: [FlowGraphBlockNames.SetVariable],\n configuration: {\n variables: {\n name: \"variables\",\n gltfType: \"number\",\n flowGraphType: \"string\",\n inOptions: true,\n isArray: true,\n dataTransformer(index: number[], parser): string[] {\n return index.map((i) => parser.getVariableName(i));\n },\n },\n },\n extraProcessor(_gltfBlock, _declaration, _mapping, parser, serializedObjects) {\n // variable/get configuration\n const serializedGetVariable = serializedObjects[0];\n serializedGetVariable.dataInputs.forEach((input) => {\n input.name = parser.getVariableName(+input.name);\n });\n\n return serializedObjects;\n },\n },\n \"variable/interpolate\": {\n blocks: [\n FlowGraphBlockNames.ValueInterpolation,\n FlowGraphBlockNames.Context,\n FlowGraphBlockNames.PlayAnimation,\n FlowGraphBlockNames.BezierCurveEasing,\n FlowGraphBlockNames.GetVariable,\n ],\n configuration: {\n variable: {\n name: \"propertyName\",\n inOptions: true,\n isVariable: true,\n dataTransformer(index, parser) {\n return parser.getVariableName(index);\n },\n },\n useSlerp: {\n name: \"animationType\",\n inOptions: true,\n defaultValue: false,\n dataTransformer(value) {\n return value === true ? FlowGraphTypes.Quaternion : undefined;\n },\n },\n },\n inputs: {\n values: {\n value: { name: \"value_1\" },\n duration: { name: \"duration_1\", gltfType: \"number\" },\n p1: { name: \"controlPoint1\", toBlock: FlowGraphBlockNames.BezierCurveEasing },\n p2: { name: \"controlPoint2\", toBlock: FlowGraphBlockNames.BezierCurveEasing },\n },\n flows: {\n in: { name: \"in\", toBlock: FlowGraphBlockNames.PlayAnimation },\n },\n },\n outputs: {\n flows: {\n err: { name: \"error\", toBlock: FlowGraphBlockNames.PlayAnimation },\n out: { name: \"out\", toBlock: FlowGraphBlockNames.PlayAnimation },\n done: { name: \"done\", toBlock: FlowGraphBlockNames.PlayAnimation },\n },\n },\n interBlockConnectors: [\n {\n input: \"object\",\n output: \"userVariables\",\n inputBlockIndex: 2,\n outputBlockIndex: 1,\n isVariable: true,\n },\n {\n input: \"animation\",\n output: \"animation\",\n inputBlockIndex: 2,\n outputBlockIndex: 0,\n isVariable: true,\n },\n {\n input: \"easingFunction\",\n output: \"easingFunction\",\n inputBlockIndex: 0,\n outputBlockIndex: 3,\n isVariable: true,\n },\n {\n input: \"value_0\",\n output: \"value\",\n inputBlockIndex: 0,\n outputBlockIndex: 4,\n isVariable: true,\n },\n ],\n extraProcessor(gltfBlock, _declaration, _mapping, parser, serializedObjects) {\n // is useSlerp is used, animationType should be set to be quaternion!\n const serializedValueInterpolation = serializedObjects[0];\n const propertyIndex = gltfBlock.configuration?.variable.value?.[0];\n if (typeof propertyIndex !== \"number\") {\n Logger.Error(\"Variable index is not defined for variable interpolation block\");\n throw new Error(\"Variable index is not defined for variable interpolation block\");\n }\n const variable = parser.arrays.staticVariables[propertyIndex];\n // if not set by useSlerp\n if (typeof serializedValueInterpolation.config?.animationType?.value === \"undefined\") {\n serializedValueInterpolation.config ||= {};\n serializedValueInterpolation.config.animationType ||= {};\n serializedValueInterpolation.config.animationType.value = getAnimationTypeByFlowGraphType(variable.type);\n }\n\n // variable/get configuration\n const serializedGetVariable = serializedObjects[4];\n serializedGetVariable.config ||= {};\n serializedGetVariable.config.variable ||= {};\n serializedGetVariable.config.variable.value = parser.getVariableName(propertyIndex);\n\n return serializedObjects;\n },\n },\n \"pointer/get\": {\n blocks: [FlowGraphBlockNames.GetProperty, FlowGraphBlockNames.JsonPointerParser],\n configuration: {\n pointer: { name: \"jsonPointer\", toBlock: FlowGraphBlockNames.JsonPointerParser },\n },\n inputs: {\n values: {\n \"[segment]\": { name: \"$1\", toBlock: FlowGraphBlockNames.JsonPointerParser },\n },\n },\n interBlockConnectors: [\n {\n input: \"object\",\n output: \"object\",\n inputBlockIndex: 0,\n outputBlockIndex: 1,\n isVariable: true,\n },\n {\n input: \"propertyName\",\n output: \"propertyName\",\n inputBlockIndex: 0,\n outputBlockIndex: 1,\n isVariable: true,\n },\n {\n input: \"customGetFunction\",\n output: \"getFunction\",\n inputBlockIndex: 0,\n outputBlockIndex: 1,\n isVariable: true,\n },\n ],\n extraProcessor(gltfBlock, _declaration, _mapping, parser, serializedObjects) {\n serializedObjects.forEach((serializedObject) => {\n // check if it is the json pointer block\n if (serializedObject.className === FlowGraphBlockNames.JsonPointerParser) {\n serializedObject.config ||= {};\n serializedObject.config.outputValue = true;\n }\n });\n return serializedObjects;\n },\n },\n \"pointer/set\": {\n blocks: [FlowGraphBlockNames.SetProperty, FlowGraphBlockNames.JsonPointerParser],\n configuration: {\n pointer: { name: \"jsonPointer\", toBlock: FlowGraphBlockNames.JsonPointerParser },\n },\n inputs: {\n values: {\n // must be defined due to the array taking over\n value: { name: \"value\" },\n \"[segment]\": { name: \"$1\", toBlock: FlowGraphBlockNames.JsonPointerParser },\n },\n },\n outputs: {\n flows: {\n err: { name: \"error\" },\n },\n },\n interBlockConnectors: [\n {\n input: \"object\",\n output: \"object\",\n inputBlockIndex: 0,\n outputBlockIndex: 1,\n isVariable: true,\n },\n {\n input: \"propertyName\",\n output: \"propertyName\",\n inputBlockIndex: 0,\n outputBlockIndex: 1,\n isVariable: true,\n },\n {\n input: \"customSetFunction\",\n output: \"setFunction\",\n inputBlockIndex: 0,\n outputBlockIndex: 1,\n isVariable: true,\n },\n ],\n extraProcessor(gltfBlock, _declaration, _mapping, parser, serializedObjects) {\n serializedObjects.forEach((serializedObject) => {\n // check if it is the json pointer block\n if (serializedObject.className === FlowGraphBlockNames.JsonPointerParser) {\n serializedObject.config ||= {};\n serializedObject.config.outputValue = true;\n }\n });\n return serializedObjects;\n },\n },\n \"pointer/interpolate\": {\n // interpolate, parse the pointer and play the animation generated. 3 blocks!\n blocks: [FlowGraphBlockNames.ValueInterpolation, FlowGraphBlockNames.JsonPointerParser, FlowGraphBlockNames.PlayAnimation, FlowGraphBlockNames.BezierCurveEasing],\n configuration: {\n pointer: { name: \"jsonPointer\", toBlock: FlowGraphBlockNames.JsonPointerParser },\n },\n inputs: {\n values: {\n value: { name: \"value_1\" },\n \"[segment]\": { name: \"$1\", toBlock: FlowGraphBlockNames.JsonPointerParser },\n duration: { name: \"duration_1\", gltfType: \"number\" /*, inOptions: true */ },\n p1: { name: \"controlPoint1\", toBlock: FlowGraphBlockNames.BezierCurveEasing },\n p2: { name: \"controlPoint2\", toBlock: FlowGraphBlockNames.BezierCurveEasing },\n },\n flows: {\n in: { name: \"in\", toBlock: FlowGraphBlockNames.PlayAnimation },\n },\n },\n outputs: {\n flows: {\n err: { name: \"error\", toBlock: FlowGraphBlockNames.PlayAnimation },\n out: { name: \"out\", toBlock: FlowGraphBlockNames.PlayAnimation },\n done: { name: \"done\", toBlock: FlowGraphBlockNames.PlayAnimation },\n },\n },\n interBlockConnectors: [\n {\n input: \"object\",\n output: \"object\",\n inputBlockIndex: 2,\n outputBlockIndex: 1,\n isVariable: true,\n },\n {\n input: \"propertyName\",\n output: \"propertyName\",\n inputBlockIndex: 0,\n outputBlockIndex: 1,\n isVariable: true,\n },\n {\n input: \"customBuildAnimation\",\n output: \"generateAnimationsFunction\",\n inputBlockIndex: 0,\n outputBlockIndex: 1,\n isVariable: true,\n },\n {\n input: \"animation\",\n output: \"animation\",\n inputBlockIndex: 2,\n outputBlockIndex: 0,\n isVariable: true,\n },\n {\n input: \"easingFunction\",\n output: \"easingFunction\",\n inputBlockIndex: 0,\n outputBlockIndex: 3,\n isVariable: true,\n },\n {\n input: \"value_0\",\n output: \"value\",\n inputBlockIndex: 0,\n outputBlockIndex: 1,\n isVariable: true,\n },\n ],\n extraProcessor(gltfBlock, _declaration, _mapping, parser, serializedObjects) {\n serializedObjects.forEach((serializedObject) => {\n // check if it is the json pointer block\n if (serializedObject.className === FlowGraphBlockNames.JsonPointerParser) {\n serializedObject.config ||= {};\n serializedObject.config.outputValue = true;\n } else if (serializedObject.className === FlowGraphBlockNames.ValueInterpolation) {\n serializedObject.config ||= {};\n Object.keys(gltfBlock.values || []).forEach((key) => {\n const value = gltfBlock.values?.[key];\n if (key === \"value\" && value) {\n // get the type of the value\n const type = value.type;\n if (type !== undefined) {\n serializedObject.config.animationType = parser.arrays.types[type].flowGraphType;\n }\n }\n });\n }\n });\n return serializedObjects;\n },\n },\n \"animation/start\": {\n blocks: [FlowGraphBlockNames.PlayAnimation, FlowGraphBlockNames.ArrayIndex, \"KHR_interactivity/FlowGraphGLTFDataProvider\"],\n inputs: {\n values: {\n animation: { name: \"index\", gltfType: \"number\", toBlock: FlowGraphBlockNames.ArrayIndex },\n speed: { name: \"speed\", gltfType: \"number\" },\n startTime: { name: \"from\", gltfType: \"number\", dataTransformer: (time: number[], parser) => [time[0] * parser._animationTargetFps] },\n endTime: { name: \"to\", gltfType: \"number\", dataTransformer: (time: number[], parser) => [time[0] * parser._animationTargetFps] },\n },\n },\n outputs: {\n flows: {\n err: { name: \"error\" },\n },\n },\n interBlockConnectors: [\n {\n input: \"animationGroup\",\n output: \"value\",\n inputBlockIndex: 0,\n outputBlockIndex: 1,\n isVariable: true,\n },\n {\n input: \"array\",\n output: \"animationGroups\",\n inputBlockIndex: 1,\n outputBlockIndex: 2,\n isVariable: true,\n },\n ],\n extraProcessor(_gltfBlock, _declaration, _mapping, _arrays, serializedObjects, _context, globalGLTF) {\n // add the glTF to the configuration of the last serialized object\n const serializedObject = serializedObjects[serializedObjects.length - 1];\n serializedObject.config ||= {};\n serializedObject.config.glTF = globalGLTF;\n return serializedObjects;\n },\n },\n \"animation/stop\": {\n blocks: [FlowGraphBlockNames.StopAnimation, FlowGraphBlockNames.ArrayIndex, \"KHR_interactivity/FlowGraphGLTFDataProvider\"],\n inputs: {\n values: {\n animation: { name: \"index\", gltfType: \"number\", toBlock: FlowGraphBlockNames.ArrayIndex },\n },\n },\n outputs: {\n flows: {\n err: { name: \"error\" },\n },\n },\n interBlockConnectors: [\n {\n input: \"animationGroup\",\n output: \"value\",\n inputBlockIndex: 0,\n outputBlockIndex: 1,\n isVariable: true,\n },\n {\n input: \"array\",\n output: \"animationGroups\",\n inputBlockIndex: 1,\n outputBlockIndex: 2,\n isVariable: true,\n },\n ],\n extraProcessor(_gltfBlock, _declaration, _mapping, _arrays, serializedObjects, _context, globalGLTF) {\n // add the glTF to the configuration of the last serialized object\n const serializedObject = serializedObjects[serializedObjects.length - 1];\n serializedObject.config ||= {};\n serializedObject.config.glTF = globalGLTF;\n return serializedObjects;\n },\n },\n \"animation/stopAt\": {\n blocks: [FlowGraphBlockNames.StopAnimation, FlowGraphBlockNames.ArrayIndex, \"KHR_interactivity/FlowGraphGLTFDataProvider\"],\n configuration: {},\n inputs: {\n values: {\n animation: { name: \"index\", gltfType: \"number\", toBlock: FlowGraphBlockNames.ArrayIndex },\n stopTime: { name: \"stopAtFrame\", gltfType: \"number\", dataTransformer: (time: number[], parser) => [time[0] * parser._animationTargetFps] },\n },\n },\n outputs: {\n flows: {\n err: { name: \"error\" },\n },\n },\n interBlockConnectors: [\n {\n input: \"animationGroup\",\n output: \"value\",\n inputBlockIndex: 0,\n outputBlockIndex: 1,\n isVariable: true,\n },\n {\n input: \"array\",\n output: \"animationGroups\",\n inputBlockIndex: 1,\n outputBlockIndex: 2,\n isVariable: true,\n },\n ],\n extraProcessor(_gltfBlock, _declaration, _mapping, _arrays, serializedObjects, _context, globalGLTF) {\n // add the glTF to the configuration of the last serialized object\n const serializedObject = serializedObjects[serializedObjects.length - 1];\n serializedObject.config ||= {};\n serializedObject.config.glTF = globalGLTF;\n return serializedObjects;\n },\n },\n \"math/switch\": {\n blocks: [FlowGraphBlockNames.DataSwitch],\n configuration: {\n cases: { name: \"cases\", isArray: true, inOptions: true, defaultValue: [] },\n },\n inputs: {\n values: {\n selection: { name: \"case\" },\n },\n },\n validation(gltfBlock) {\n const cases = gltfBlock.configuration?.cases;\n if (cases && cases.value) {\n const onlyIntegers = cases.value.every((caseValue) => {\n // case value should be an integer. Since Number.isInteger(1.0) is true, we need to check if toString has only digits.\n return typeof caseValue === \"number\" && /^-?\\d+$/.test(caseValue.toString());\n });\n if (!onlyIntegers) {\n Logger.Warn(\"Switch cases should be integers. Using empty array instead.\");\n cases.value = [] as number[];\n return { valid: true };\n }\n // check for duplicates\n const uniqueCases = new Set(cases.value);\n cases.value = Array.from(uniqueCases) as number[];\n }\n return { valid: true };\n },\n extraProcessor(_gltfBlock, _declaration, _mapping, _arrays, serializedObjects) {\n const serializedObject = serializedObjects[0];\n serializedObject.dataInputs.forEach((input) => {\n if (input.name !== \"default\" && input.name !== \"case\") {\n input.name = \"in_\" + input.name;\n }\n });\n serializedObject.config ||= {};\n serializedObject.config.treatCasesAsIntegers = true;\n return serializedObjects;\n },\n },\n \"debug/log\": {\n blocks: [FlowGraphBlockNames.ConsoleLog],\n configuration: {\n message: { name: \"messageTemplate\", inOptions: true },\n },\n },\n};\n\nfunction getSimpleInputMapping(type: FlowGraphBlockNames, inputs: string[] = [\"a\"], inferType?: boolean): IGLTFToFlowGraphMapping {\n return {\n blocks: [type],\n inputs: {\n values: inputs.reduce(\n (acc, input) => {\n acc[input] = { name: input };\n return acc;\n },\n {} as { [key: string]: { name: string } }\n ),\n },\n outputs: {\n values: {\n value: { name: \"value\" },\n },\n },\n extraProcessor(gltfBlock, _declaration, _mapping, _parser, serializedObjects) {\n if (inferType) {\n // configure it to work the way glTF specifies\n serializedObjects[0].config ||= {};\n serializedObjects[0].config.preventIntegerFloatArithmetic = true;\n // try to infer the type or fallback to Integer\n // check the gltf block for the inputs, see if they have a type\n let type = -1;\n Object.keys(gltfBlock.values || {}).find((value) => {\n if (gltfBlock.values?.[value].type !== undefined) {\n type = gltfBlock.values[value].type;\n return true;\n }\n return false;\n });\n if (type !== -1) {\n serializedObjects[0].config.type = _parser.arrays.types[type].flowGraphType;\n }\n }\n return serializedObjects;\n },\n validation(gltfBlock) {\n if (inferType) {\n // make sure types are the same\n return ValidateTypes(gltfBlock);\n }\n return { valid: true };\n },\n };\n}\n\nfunction ValidateTypes(gltfBlock: IKHRInteractivity_Node): { valid: boolean; error?: string } {\n if (gltfBlock.values) {\n const types = Object.keys(gltfBlock.values)\n .map((key) => gltfBlock.values![key].type)\n .filter((type) => type !== undefined);\n const allSameType = types.every((type) => type === types[0]);\n if (!allSameType) {\n return { valid: false, error: \"All inputs must be of the same type\" };\n }\n }\n return { valid: true };\n}\n\nexport function getAllSupportedNativeNodeTypes(): string[] {\n return Object.keys(gltfToFlowGraphMapping);\n}\n\n/**\n * \n * These are the nodes from the specs:\n\n### Math Nodes\n1. **Constants**\n - E (`math/E`) FlowGraphBlockNames.E\n - Pi (`math/Pi`) FlowGraphBlockNames.PI\n - Infinity (`math/Inf`) FlowGraphBlockNames.Inf\n - Not a Number (`math/NaN`) FlowGraphBlockNames.NaN\n2. **Arithmetic Nodes**\n - Absolute Value (`math/abs`) FlowGraphBlockNames.Abs\n - Sign (`math/sign`) FlowGraphBlockNames.Sign\n - Truncate (`math/trunc`) FlowGraphBlockNames.Trunc\n - Floor (`math/floor`) FlowGraphBlockNames.Floor\n - Ceil (`math/ceil`) FlowGraphBlockNames.Ceil\n - Round (`math/round`) FlowGraphBlockNames.Round\n - Fraction (`math/fract`) FlowGraphBlockNames.Fract\n - Negation (`math/neg`) FlowGraphBlockNames.Negation\n - Addition (`math/add`) FlowGraphBlockNames.Add\n - Subtraction (`math/sub`) FlowGraphBlockNames.Subtract\n - Multiplication (`math/mul`) FlowGraphBlockNames.Multiply\n - Division (`math/div`) FlowGraphBlockNames.Divide\n - Remainder (`math/rem`) FlowGraphBlockNames.Modulo\n - Minimum (`math/min`) FlowGraphBlockNames.Min\n - Maximum (`math/max`) FlowGraphBlockNames.Max\n - Clamp (`math/clamp`) FlowGraphBlockNames.Clamp\n - Saturate (`math/saturate`) FlowGraphBlockNames.Saturate\n - Interpolate (`math/mix`) FlowGraphBlockNames.MathInterpolation\n3. **Comparison Nodes**\n - Equality (`math/eq`) FlowGraphBlockNames.Equality\n - Less Than (`math/lt`) FlowGraphBlockNames.LessThan\n - Less Than Or Equal To (`math/le`) FlowGraphBlockNames.LessThanOrEqual\n - Greater Than (`math/gt`) FlowGraphBlockNames.GreaterThan\n - Greater Than Or Equal To (`math/ge`) FlowGraphBlockNames.GreaterThanOrEqual\n4. **Special Nodes**\n - Is Not a Number (`math/isNaN`) FlowGraphBlockNames.IsNaN\n - Is Infinity (`math/isInf`) FlowGraphBlockNames.IsInfinity\n - Select (`math/select`) FlowGraphBlockNames.Conditional\n - Switch (`math/switch`) FlowGraphBlockNames.DataSwitch\n - Random (`math/random`) FlowGraphBlockNames.Random\n5. **Angle and Trigonometry Nodes**\n - Degrees-To-Radians (`math/rad`) FlowGraphBlockNames.DegToRad\n - Radians-To-Degrees (`math/deg`) FlowGraphBlockNames.RadToDeg\n - Sine (`math/sin`) FlowGraphBlockNames.Sin\n - Cosine (`math/cos`) FlowGraphBlockNames.Cos\n - Tangent (`math/tan`) FlowGraphBlockNames.Tan\n - Arcsine (`math/asin`) FlowGraphBlockNames.Asin\n - Arccosine (`math/acos`) FlowGraphBlockNames.Acos\n - Arctangent (`math/atan`) FlowGraphBlockNames.Atan\n - Arctangent 2 (`math/atan2`) FlowGraphBlockNames.Atan2\n6. **Hyperbolic Nodes**\n - Hyperbolic Sine (`math/sinh`) FlowGraphBlockNames.Sinh\n - Hyperbolic Cosine (`math/cosh`) FlowGraphBlockNames.Cosh\n - Hyperbolic Tangent (`math/tanh`) FlowGraphBlockNames.Tanh\n - Inverse Hyperbolic Sine (`math/asinh`) FlowGraphBlockNames.Asinh\n - Inverse Hyperbolic Cosine (`math/acosh`) FlowGraphBlockNames.Acosh\n - Inverse Hyperbolic Tangent (`math/atanh`) FlowGraphBlockNames.Atanh\n7. **Exponential Nodes**\n - Exponent (`math/exp`) FlowGraphBlockNames.Exponential\n - Natural Logarithm (`math/log`) FlowGraphBlockNames.Log\n - Base-2 Logarithm (`math/log2`) FlowGraphBlockNames.Log2\n - Base-10 Logarithm (`math/log10`) FlowGraphBlockNames.Log10\n - Square Root (`math/sqrt`) FlowGraphBlockNames.SquareRoot\n - Cube Root (`math/cbrt`) FlowGraphBlockNames.CubeRoot\n - Power (`math/pow`) FlowGraphBlockNames.Power\n8. **Vector Nodes**\n - Length (`math/length`) FlowGraphBlockNames.Length\n - Normalize (`math/normalize`) FlowGraphBlockNames.Normalize\n - Dot Product (`math/dot`) FlowGraphBlockNames.Dot\n - Cross Product (`math/cross`) FlowGraphBlockNames.Cross\n - Rotate 2D (`math/rotate2D`) FlowGraphBlockNames.Rotate2D\n - Rotate 3D (`math/rotate3D`) FlowGraphBlockNames.Rotate3D\n - Transform (`math/transform`) FlowGraphBlockNames.TransformVector\n9. **Matrix Nodes**\n - Transpose (`math/transpose`) FlowGraphBlockNames.Transpose\n - Determinant (`math/determinant`) FlowGraphBlockNames.Determinant\n - Inverse (`math/inverse`) FlowGraphBlockNames.InvertMatrix\n - Multiplication (`math/matMul`) FlowGraphBlockNames.MatrixMultiplication\n - Compose (`math/matCompose`) FlowGraphBlockNames.MatrixCompose\n - Decompose (`math/matDecompose`) FlowGraphBlockNames.MatrixDecompose\n10. **Quaternion Nodes**\n - Conjugate (`math/quatConjugate`) FlowGraphBlockNames.Conjugate\n - Multiplication (`math/quatMul`) FlowGraphBlockNames.Multiply\n - Angle Between Quaternions (`math/quatAngleBetween`) FlowGraphBlockNames.AngleBetween\n - Quaternion From Axis Angle (`math/quatFromAxisAngle`) FlowGraphBlockNames.QuaternionFromAxisAngle\n - Quaternion To Axis Angle (`math/quatToAxisAngle`) FlowGraphBlockNames.QuaternionToAxisAngle\n - Quaternion From Two Directional Vectors (`math/quatFromDirections`) FlowGraphBlockNames.QuaternionFromDirections\n11. **Swizzle Nodes**\n - Combine (`math/combine2`, `math/combine3`, `math/combine4`, `math/combine2x2`, `math/combine3x3`, `math/combine4x4`)\n FlowGraphBlockNames.CombineVector2, FlowGraphBlockNames.CombineVector3, FlowGraphBlockNames.CombineVector4\n FlowGraphBlockNames.CombineMatrix2D, FlowGraphBlockNames.CombineMatrix3D, FlowGraphBlockNames.CombineMatrix\n - Extract (`math/extract2`, `math/extract3`, `math/extract4`, `math/extract2x2`, `math/extract3x3`, `math/extract4x4`)\n FlowGraphBlockNames.ExtractVector2, FlowGraphBlockNames.ExtractVector3, FlowGraphBlockNames.ExtractVector4\n FlowGraphBlockNames.ExtractMatrix2D, FlowGraphBlockNames.ExtractMatrix3D, FlowGraphBlockNames.ExtractMatrix\n12. **Integer Arithmetic Nodes**\n - Absolute Value (`math/abs`) FlowGraphBlockNames.Abs\n - Sign (`math/sign`) FlowGraphBlockNames.Sign\n - Negation (`math/neg`) FlowGraphBlockNames.Negation\n - Addition (`math/add`) FlowGraphBlockNames.Add\n - Subtraction (`math/sub`) FlowGraphBlockNames.Subtract\n - Multiplication (`math/mul`) FlowGraphBlockNames.Multiply\n - Division (`math/div`) FlowGraphBlockNames.Divide\n - Remainder (`math/rem`) FlowGraphBlockNames.Modulo\n - Minimum (`math/min`) FlowGraphBlockNames.Min\n - Maximum (`math/max`) FlowGraphBlockNames.Max\n - Clamp (`math/clamp`) FlowGraphBlockNames.Clamp\n13. **Integer Comparison Nodes**\n - Equality (`math/eq`) FlowGraphBlockNames.Equality\n - Less Than (`math/lt`) FlowGraphBlockNames.LessThan\n - Less Than Or Equal To (`math/le`) FlowGraphBlockNames.LessThanOrEqual\n - Greater Than (`math/gt`) FlowGraphBlockNames.GreaterThan\n - Greater Than Or Equal To (`math/ge`) FlowGraphBlockNames.GreaterThanOrEqual\n14. **Integer Bitwise Nodes**\n - Bitwise NOT (`math/not`) FlowGraphBlockNames.BitwiseNot\n - Bitwise AND (`math/and`) FlowGraphBlockNames.BitwiseAnd\n - Bitwise OR (`math/or`) FlowGraphBlockNames.BitwiseOr\n - Bitwise XOR (`math/xor`) FlowGraphBlockNames.BitwiseXor\n - Right Shift (`math/asr`) FlowGraphBlockNames.BitwiseRightShift\n - Left Shift (`math/lsl`) FlowGraphBlockNames.BitwiseLeftShift\n - Count Leading Zeros (`math/clz`) FlowGraphBlockNames.LeadingZeros\n - Count Trailing Zeros (`math/ctz`) FlowGraphBlockNames.TrailingZeros\n - Count One Bits (`math/popcnt`) FlowGraphBlockNames.OneBitsCounter\n15. **Boolean Arithmetic Nodes**\n - Equality (`math/eq`) FlowGraphBlockNames.Equality\n - Boolean NOT (`math/not`) FlowGraphBlockNames.BitwiseNot\n - Boolean AND (`math/and`) FlowGraphBlockNames.BitwiseAnd\n - Boolean OR (`math/or`) FlowGraphBlockNames.BitwiseOr\n - Boolean XOR (`math/xor`) FlowGraphBlockNames.BitwiseXor\n\n### Type Conversion Nodes\n1. **Boolean Conversion Nodes**\n - Boolean to Integer (`type/boolToInt`) FlowGraphBlockNames.BooleanToInt\n - Boolean to Float (`type/boolToFloat`) FlowGraphBlockNames.BooleanToFloat\n2. **Integer Conversion Nodes**\n - Integer to Boolean (`type/intToBool`) FlowGraphBlockNames.IntToBoolean\n - Integer to Float (`type/intToFloat`) FlowGraphBlockNames.IntToFloat\n3. **Float Conversion Nodes**\n - Float to Boolean (`type/floatToBool`) FlowGraphBlockNames.FloatToBoolean\n - Float to Integer (`type/floatToInt`) FlowGraphBlockNames.FloatToInt\n\n### Control Flow Nodes\n1. **Sync Nodes**\n - Sequence (`flow/sequence`) FlowGraphBlockNames.Sequence\n - Branch (`flow/branch`) FlowGraphBlockNames.Branch\n - Switch (`flow/switch`) FlowGraphBlockNames.Switch\n - While Loop (`flow/while`) FlowGraphBlockNames.WhileLoop\n - For Loop (`flow/for`) FlowGraphBlockNames.ForLoop\n - Do N (`flow/doN`) FlowGraphBlockNames.DoN\n - Multi Gate (`flow/multiGate`) FlowGraphBlockNames.MultiGate\n - Wait All (`flow/waitAll`) FlowGraphBlockNames.WaitAll\n - Throttle (`flow/throttle`) FlowGraphBlockNames.Throttle\n2. **Delay Nodes**\n - Set Delay (`flow/setDelay`) FlowGraphBlockNames.SetDelay\n - Cancel Delay (`flow/cancelDelay`) FlowGraphBlockNames.CancelDelay\n\n### State Manipulation Nodes\n1. **Custom Variable Access**\n - Variable Get (`variable/get`) FlowGraphBlockNames.GetVariable\n - Variable Set (`variable/set`) FlowGraphBlockNames.SetVariable\n - Variable Interpolate (`variable/interpolate`)\n2. **Object Model Access** // TODO fully test this!!!\n - JSON Pointer Template Parsing (`pointer/get`) [FlowGraphBlockNames.GetProperty, FlowGraphBlockNames.JsonPointerParser]\n - Effective JSON Pointer Generation (`pointer/set`) [FlowGraphBlockNames.SetProperty, FlowGraphBlockNames.JsonPointerParser]\n - Pointer Get (`pointer/get`) [FlowGraphBlockNames.GetProperty, FlowGraphBlockNames.JsonPointerParser]\n - Pointer Set (`pointer/set`) [FlowGraphBlockNames.SetProperty, FlowGraphBlockNames.JsonPointerParser]\n - Pointer Interpolate (`pointer/interpolate`) [FlowGraphBlockNames.ValueInterpolation, FlowGraphBlockNames.JsonPointerParser, FlowGraphBlockNames.PlayAnimation, FlowGraphBlockNames.Easing]\n\n### Animation Control Nodes\n1. **Animation Play** (`animation/start`) FlowGraphBlockNames.PlayAnimation\n2. **Animation Stop** (`animation/stop`) FlowGraphBlockNames.StopAnimation \n3. **Animation Stop At** (`animation/stopAt`) FlowGraphBlockNames.StopAnimation \n\n### Event Nodes\n1. **Lifecycle Event Nodes**\n - On Start (`event/onStart`) FlowGraphBlockNames.SceneReadyEvent\n - On Tick (`event/onTick`) FlowGraphBlockNames.SceneTickEvent\n2. **Custom Event Nodes**\n - Receive (`event/receive`) FlowGraphBlockNames.ReceiveCustomEvent\n - Send (`event/send`) FlowGraphBlockNames.SendCustomEvent\n\n */\n","import { type IKHRInteractivity_Graph, type IKHRInteractivity_Node, type IKHRInteractivity_OutputSocketReference, type IKHRInteractivity_Variable } from \"babylonjs-gltf2interface\";\nimport { type IGLTF } from \"../../glTFLoaderInterfaces\";\nimport { type IGLTFToFlowGraphMapping, getMappingForDeclaration, getMappingForFullOperationName } from \"./declarationMapper\";\nimport { Logger } from \"core/Misc/logger\";\nimport { type ISerializedFlowGraph, type ISerializedFlowGraphBlock, type ISerializedFlowGraphConnection, type ISerializedFlowGraphContext } from \"core/FlowGraph/typeDefinitions\";\nimport { RandomGUID } from \"core/Misc/guid\";\nimport { type FlowGraphBlockNames } from \"core/FlowGraph/Blocks/flowGraphBlockNames\";\nimport { FlowGraphConnectionType } from \"core/FlowGraph/flowGraphConnection\";\nimport { FlowGraphTypes } from \"core/FlowGraph/flowGraphRichTypes\";\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport interface InteractivityEvent {\n eventId: string;\n eventData?: {\n eventData: boolean;\n id: string;\n type: string;\n value?: any;\n }[];\n}\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const gltfTypeToBabylonType: {\n [key: string]: { length: number; flowGraphType: FlowGraphTypes; elementType: \"number\" | \"boolean\" };\n} = {\n float: { length: 1, flowGraphType: FlowGraphTypes.Number, elementType: \"number\" },\n bool: { length: 1, flowGraphType: FlowGraphTypes.Boolean, elementType: \"boolean\" },\n float2: { length: 2, flowGraphType: FlowGraphTypes.Vector2, elementType: \"number\" },\n float3: { length: 3, flowGraphType: FlowGraphTypes.Vector3, elementType: \"number\" },\n float4: { length: 4, flowGraphType: FlowGraphTypes.Vector4, elementType: \"number\" },\n float4x4: { length: 16, flowGraphType: FlowGraphTypes.Matrix, elementType: \"number\" },\n float2x2: { length: 4, flowGraphType: FlowGraphTypes.Matrix2D, elementType: \"number\" },\n float3x3: { length: 9, flowGraphType: FlowGraphTypes.Matrix3D, elementType: \"number\" },\n int: { length: 1, flowGraphType: FlowGraphTypes.Integer, elementType: \"number\" },\n};\n\nexport class InteractivityGraphToFlowGraphParser {\n /**\n * Note - the graph should be rejected if the same type is defined twice.\n * We currently don't validate that.\n */\n private _types: { length: number; flowGraphType: FlowGraphTypes; elementType: \"number\" | \"boolean\" }[] = [];\n private _mappings: { flowGraphMapping: IGLTFToFlowGraphMapping; fullOperationName: string }[] = [];\n private _staticVariables: { type: FlowGraphTypes; value: any[] }[] = [];\n private _events: InteractivityEvent[] = [];\n private _internalEventsCounter: number = 0;\n private _nodes: { blocks: ISerializedFlowGraphBlock[]; fullOperationName: string }[] = [];\n\n constructor(\n private _interactivityGraph: IKHRInteractivity_Graph,\n private _gltf: IGLTF,\n public _animationTargetFps: number = 60\n ) {\n // start with types\n this._parseTypes();\n // continue with declarations\n this._parseDeclarations();\n this._parseVariables();\n this._parseEvents();\n this._parseNodes();\n }\n\n public get arrays() {\n return {\n types: this._types,\n mappings: this._mappings,\n staticVariables: this._staticVariables,\n events: this._events,\n nodes: this._nodes,\n };\n }\n\n private _parseTypes() {\n if (!this._interactivityGraph.types) {\n return;\n }\n for (const type of this._interactivityGraph.types) {\n this._types.push(gltfTypeToBabylonType[type.signature]);\n }\n }\n\n private _parseDeclarations() {\n if (!this._interactivityGraph.declarations) {\n return;\n }\n for (const declaration of this._interactivityGraph.declarations) {\n // make sure we have the mapping for this operation\n const mapping = getMappingForDeclaration(declaration);\n // mapping is defined, because we generate an empty mapping if it's not found\n if (!mapping) {\n Logger.Error([\"No mapping found for declaration\", declaration]);\n throw new Error(\"Error parsing declarations\");\n }\n this._mappings.push({\n flowGraphMapping: mapping,\n fullOperationName: declaration.extension ? declaration.op + \":\" + declaration.extension : declaration.op,\n });\n }\n }\n\n private _parseVariables() {\n if (!this._interactivityGraph.variables) {\n return;\n }\n for (const variable of this._interactivityGraph.variables) {\n const parsed = this._parseVariable(variable);\n // set the default values here\n this._staticVariables.push(parsed);\n }\n }\n\n private _parseVariable(variable: IKHRInteractivity_Variable, dataTransform?: (value: any, parser: InteractivityGraphToFlowGraphParser) => any) {\n const type = this._types[variable.type];\n if (!type) {\n Logger.Error([\"No type found for variable\", variable]);\n throw new Error(\"Error parsing variables\");\n }\n if (variable.value) {\n if (variable.value.length !== type.length) {\n Logger.Error([\"Invalid value length for variable\", variable, type]);\n throw new Error(\"Error parsing variables\");\n }\n }\n const value = variable.value || [];\n if (!value.length) {\n switch (type.flowGraphType) {\n case FlowGraphTypes.Boolean:\n value.push(false);\n break;\n case FlowGraphTypes.Integer:\n value.push(0);\n break;\n case FlowGraphTypes.Number:\n value.push(NaN);\n break;\n case FlowGraphTypes.Vector2:\n value.push(NaN, NaN);\n break;\n case FlowGraphTypes.Vector3:\n value.push(NaN, NaN, NaN);\n break;\n case FlowGraphTypes.Vector4:\n case FlowGraphTypes.Matrix2D:\n case FlowGraphTypes.Quaternion:\n value.fill(NaN, 0, 4);\n break;\n case FlowGraphTypes.Matrix:\n value.fill(NaN, 0, 16);\n break;\n case FlowGraphTypes.Matrix3D:\n value.fill(NaN, 0, 9);\n break;\n default:\n break;\n }\n }\n // in case of NaN, Infinity, we need to parse the string to the object itself\n if (type.elementType === \"number\" && typeof value[0] === \"string\") {\n value[0] = parseFloat(value[0]);\n }\n return { type: type.flowGraphType, value: dataTransform ? dataTransform(value, this) : value };\n }\n\n private _parseEvents() {\n if (!this._interactivityGraph.events) {\n return;\n }\n for (const event of this._interactivityGraph.events) {\n const converted: InteractivityEvent = {\n eventId: event.id || \"internalEvent_\" + this._internalEventsCounter++,\n };\n if (event.values) {\n converted.eventData = Object.keys(event.values).map((key) => {\n const eventValue = event.values?.[key];\n if (!eventValue) {\n Logger.Error([\"No value found for event key\", key]);\n throw new Error(\"Error parsing events\");\n }\n const type = this._types[eventValue.type];\n if (!type) {\n Logger.Error([\"No type found for event value\", eventValue]);\n throw new Error(\"Error parsing events\");\n }\n const value = typeof eventValue.value !== \"undefined\" ? this._parseVariable(eventValue) : undefined;\n return {\n id: key,\n type: type.flowGraphType,\n eventData: true,\n value,\n };\n });\n }\n this._events.push(converted);\n }\n }\n\n private _parseNodes() {\n if (!this._interactivityGraph.nodes) {\n return;\n }\n for (const node of this._interactivityGraph.nodes) {\n // some validation\n if (typeof node.declaration !== \"number\") {\n Logger.Error([\"No declaration found for node\", node]);\n throw new Error(\"Error parsing nodes\");\n }\n const mapping = this._mappings[node.declaration];\n if (!mapping) {\n Logger.Error([\"No mapping found for node\", node]);\n throw new Error(\"Error parsing nodes\");\n }\n if (mapping.flowGraphMapping.validation) {\n const validationResult = mapping.flowGraphMapping.validation(node, this._interactivityGraph, this._gltf);\n if (!validationResult.valid) {\n throw new Error(`Error validating interactivity node ${this._interactivityGraph.declarations?.[node.declaration].op} - ${validationResult.error}`);\n }\n }\n const blocks: ISerializedFlowGraphBlock[] = [];\n // create block(s) for this node using the mapping\n for (const blockType of mapping.flowGraphMapping.blocks) {\n const block = this._getEmptyBlock(blockType, mapping.fullOperationName);\n this._parseNodeConfiguration(node, block, mapping.flowGraphMapping, blockType);\n blocks.push(block);\n }\n this._nodes.push({ blocks, fullOperationName: mapping.fullOperationName });\n }\n }\n\n private _getEmptyBlock(className: string, type: string): ISerializedFlowGraphBlock {\n return {\n uniqueId: RandomGUID(),\n className,\n dataInputs: [],\n dataOutputs: [],\n signalInputs: [],\n signalOutputs: [],\n config: {},\n type,\n metadata: {},\n };\n }\n\n private _parseNodeConfiguration(node: IKHRInteractivity_Node, block: ISerializedFlowGraphBlock, nodeMapping: IGLTFToFlowGraphMapping, blockType: FlowGraphBlockNames | string) {\n const gltfConfiguration = node.configuration;\n if (gltfConfiguration) {\n for (const key in gltfConfiguration) {\n const gltfProperty = gltfConfiguration[key];\n if (!gltfProperty) {\n throw new Error(\"Error parsing node configuration\");\n }\n\n const propertyMapping = nodeMapping.configuration?.[key];\n const belongsToBlock = propertyMapping && propertyMapping.toBlock ? propertyMapping.toBlock === blockType : nodeMapping.blocks.indexOf(blockType) === 0;\n if (belongsToBlock) {\n let value = propertyMapping?.defaultValue;\n if (gltfProperty?.value) {\n value = gltfProperty.value;\n }\n\n if (!propertyMapping?.isArray) {\n if (value.length !== 1) {\n Logger.Warn(`Invalid non-array value length: ${value.length}`);\n }\n\n value = value[0];\n }\n\n if (propertyMapping?.dataTransformer) {\n value = propertyMapping.dataTransformer(value, this);\n }\n\n if (value !== undefined) {\n // Update the flow graph block config.\n block.config[propertyMapping?.name || key] = {\n value: value,\n };\n }\n }\n }\n }\n }\n\n private _parseNodeConnections(context: ISerializedFlowGraphContext) {\n for (let i = 0; i < this._nodes.length; i++) {\n // get the corresponding gltf node\n const gltfNode = this._interactivityGraph.nodes?.[i];\n if (!gltfNode) {\n // should never happen but let's still check\n Logger.Error([\"No node found for interactivity node\", this._nodes[i]]);\n throw new Error(\"Error parsing node connections\");\n }\n const flowGraphBlocks = this._nodes[i];\n const outputMapper = this._mappings[gltfNode.declaration];\n // validate\n if (!outputMapper) {\n Logger.Error([\"No mapping found for node\", gltfNode]);\n throw new Error(\"Error parsing node connections\");\n }\n const flowsFromGLTF = gltfNode.flows || {};\n const flowsKeys = Object.keys(flowsFromGLTF).sort(); // sorting as some operations require sorted keys\n // connect the flows\n for (const flowKey of flowsKeys) {\n const flow = flowsFromGLTF[flowKey];\n const flowMapping = outputMapper.flowGraphMapping.outputs?.flows?.[flowKey];\n const socketOutName = flowMapping?.name || flowKey;\n // create a serialized socket\n const socketOut = this._createNewSocketConnection(socketOutName, true);\n const block = (flowMapping && flowMapping.toBlock && flowGraphBlocks.blocks.find((b) => b.className === flowMapping.toBlock)) || flowGraphBlocks.blocks[0];\n block.signalOutputs.push(socketOut);\n // get the input node of this block\n const inputNodeId = flow.node;\n const nodeIn = this._nodes[inputNodeId];\n if (!nodeIn) {\n Logger.Error([\"No node found for input node id\", inputNodeId]);\n throw new Error(\"Error parsing node connections\");\n }\n // get the mapper for the input node - in case it mapped to multiple blocks\n const inputMapper = getMappingForFullOperationName(nodeIn.fullOperationName);\n if (!inputMapper) {\n Logger.Error([\"No mapping found for input node\", nodeIn]);\n throw new Error(\"Error parsing node connections\");\n }\n let flowInMapping = inputMapper.inputs?.flows?.[flow.socket || \"in\"];\n let arrayMapping = false;\n if (!flowInMapping) {\n for (const key in inputMapper.inputs?.flows) {\n if (key.startsWith(\"[\") && key.endsWith(\"]\")) {\n arrayMapping = true;\n flowInMapping = inputMapper.inputs?.flows?.[key];\n }\n }\n }\n const nodeInSocketName = flowInMapping ? (arrayMapping ? flowInMapping.name.replace(\"$1\", flow.socket || \"\") : flowInMapping.name) : flow.socket || \"in\";\n const inputBlock = (flowInMapping && flowInMapping.toBlock && nodeIn.blocks.find((b) => b.className === flowInMapping.toBlock)) || nodeIn.blocks[0];\n // in all of the flow graph input connections, find the one with the same name as the socket\n let socketIn = inputBlock.signalInputs.find((s) => s.name === nodeInSocketName);\n // if the socket doesn't exist, create the input socket for the connection\n if (!socketIn) {\n socketIn = this._createNewSocketConnection(nodeInSocketName);\n inputBlock.signalInputs.push(socketIn);\n }\n // connect the sockets\n socketIn.connectedPointIds.push(socketOut.uniqueId);\n socketOut.connectedPointIds.push(socketIn.uniqueId);\n }\n // connect the values\n const valuesFromGLTF = gltfNode.values || {};\n const valuesKeys = Object.keys(valuesFromGLTF);\n for (const valueKey of valuesKeys) {\n const value = valuesFromGLTF[valueKey];\n let valueMapping = outputMapper.flowGraphMapping.inputs?.values?.[valueKey];\n let arrayMapping = false;\n if (!valueMapping) {\n for (const key in outputMapper.flowGraphMapping.inputs?.values) {\n if (key.startsWith(\"[\") && key.endsWith(\"]\")) {\n arrayMapping = true;\n valueMapping = outputMapper.flowGraphMapping.inputs?.values?.[key];\n }\n }\n }\n const socketInName = valueMapping ? (arrayMapping ? valueMapping.name.replace(\"$1\", valueKey) : valueMapping.name) : valueKey;\n // create a serialized socket\n const socketIn = this._createNewSocketConnection(socketInName);\n const block = (valueMapping && valueMapping.toBlock && flowGraphBlocks.blocks.find((b) => b.className === valueMapping.toBlock)) || flowGraphBlocks.blocks[0];\n block.dataInputs.push(socketIn);\n if ((value as IKHRInteractivity_Variable).value !== undefined) {\n const convertedValue = this._parseVariable(value as IKHRInteractivity_Variable, valueMapping && valueMapping.dataTransformer);\n context._connectionValues[socketIn.uniqueId] = convertedValue;\n } else if (typeof (value as IKHRInteractivity_OutputSocketReference).node !== \"undefined\") {\n const nodeOutId = (value as IKHRInteractivity_OutputSocketReference).node;\n const nodeOutSocketName = (value as IKHRInteractivity_OutputSocketReference).socket || \"value\";\n const nodeOut = this._nodes[nodeOutId];\n if (!nodeOut) {\n Logger.Error([\"No node found for output socket reference\", value]);\n throw new Error(\"Error parsing node connections\");\n }\n const outputMapper = getMappingForFullOperationName(nodeOut.fullOperationName);\n if (!outputMapper) {\n Logger.Error([\"No mapping found for output socket reference\", value]);\n throw new Error(\"Error parsing node connections\");\n }\n let valueMapping = outputMapper.outputs?.values?.[nodeOutSocketName];\n let arrayMapping = false;\n // check if there is an array mapping defined\n if (!valueMapping) {\n // search for a value mapping that has an array mapping\n for (const key in outputMapper.outputs?.values) {\n if (key.startsWith(\"[\") && key.endsWith(\"]\")) {\n arrayMapping = true;\n valueMapping = outputMapper.outputs?.values?.[key];\n }\n }\n }\n const socketOutName = valueMapping ? (arrayMapping ? valueMapping.name.replace(\"$1\", nodeOutSocketName) : valueMapping?.name) : nodeOutSocketName;\n const outBlock = (valueMapping && valueMapping.toBlock && nodeOut.blocks.find((b) => b.className === valueMapping.toBlock)) || nodeOut.blocks[0];\n let socketOut = outBlock.dataOutputs.find((s) => s.name === socketOutName);\n // if the socket doesn't exist, create it\n if (!socketOut) {\n socketOut = this._createNewSocketConnection(socketOutName, true);\n outBlock.dataOutputs.push(socketOut);\n }\n // connect the sockets\n socketIn.connectedPointIds.push(socketOut.uniqueId);\n socketOut.connectedPointIds.push(socketIn.uniqueId);\n } else {\n Logger.Error([\"Invalid value for value connection\", value]);\n throw new Error(\"Error parsing node connections\");\n }\n }\n\n // inter block connections\n if (outputMapper.flowGraphMapping.interBlockConnectors) {\n for (const connector of outputMapper.flowGraphMapping.interBlockConnectors) {\n const input = connector.input;\n const output = connector.output;\n const isVariable = connector.isVariable;\n this._connectFlowGraphNodes(input, output, flowGraphBlocks.blocks[connector.inputBlockIndex], flowGraphBlocks.blocks[connector.outputBlockIndex], isVariable);\n }\n }\n\n if (outputMapper.flowGraphMapping.extraProcessor) {\n const declaration = this._interactivityGraph.declarations?.[gltfNode.declaration];\n if (!declaration) {\n Logger.Error([\"No declaration found for extra processor\", gltfNode]);\n throw new Error(\"Error parsing node connections\");\n }\n flowGraphBlocks.blocks = outputMapper.flowGraphMapping.extraProcessor(\n gltfNode,\n declaration,\n outputMapper.flowGraphMapping,\n this,\n flowGraphBlocks.blocks,\n context,\n this._gltf\n );\n }\n }\n }\n\n private _createNewSocketConnection(name: string, isOutput?: boolean): ISerializedFlowGraphConnection {\n return {\n uniqueId: RandomGUID(),\n name,\n _connectionType: isOutput ? FlowGraphConnectionType.Output : FlowGraphConnectionType.Input,\n connectedPointIds: [],\n };\n }\n\n private _connectFlowGraphNodes(input: string, output: string, serializedInput: ISerializedFlowGraphBlock, serializedOutput: ISerializedFlowGraphBlock, isVariable?: boolean) {\n const inputArray = isVariable ? serializedInput.dataInputs : serializedInput.signalInputs;\n const outputArray = isVariable ? serializedOutput.dataOutputs : serializedOutput.signalOutputs;\n const inputConnection = inputArray.find((s) => s.name === input) || this._createNewSocketConnection(input);\n const outputConnection = outputArray.find((s) => s.name === output) || this._createNewSocketConnection(output, true);\n // of not found add it to the array\n if (!inputArray.find((s) => s.name === input)) {\n inputArray.push(inputConnection);\n }\n if (!outputArray.find((s) => s.name === output)) {\n outputArray.push(outputConnection);\n }\n // connect the sockets\n inputConnection.connectedPointIds.push(outputConnection.uniqueId);\n outputConnection.connectedPointIds.push(inputConnection.uniqueId);\n }\n\n public getVariableName(index: number) {\n return \"staticVariable_\" + index;\n }\n\n public serializeToFlowGraph(): ISerializedFlowGraph {\n const context: ISerializedFlowGraphContext = {\n uniqueId: RandomGUID(),\n _userVariables: {},\n _connectionValues: {},\n };\n this._parseNodeConnections(context);\n for (let i = 0; i < this._staticVariables.length; i++) {\n const variable = this._staticVariables[i];\n context._userVariables[this.getVariableName(i)] = variable;\n }\n\n const allBlocks = this._nodes.reduce((acc, val) => acc.concat(val.blocks), [] as ISerializedFlowGraphBlock[]);\n\n return {\n rightHanded: true,\n allBlocks,\n executionContexts: [context],\n };\n }\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type IKHRInteractivity } from \"babylonjs-gltf2interface\";\r\nimport { type GLTFLoader } from \"../glTFLoader\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { FlowGraphCoordinator } from \"core/FlowGraph/flowGraphCoordinator\";\r\nimport { ParseFlowGraphAsync } from \"core/FlowGraph/flowGraphParser\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\nimport { type GLTFPathToObjectConverter } from \"./gltfPathToObjectConverter\";\r\nimport { AddObjectAccessorToKey, GetPathToObjectConverter } from \"./objectModelMapping\";\r\nimport { InteractivityGraphToFlowGraphParser } from \"./KHR_interactivity/interactivityGraphParser\";\r\nimport { addToBlockFactory } from \"core/FlowGraph/Blocks/flowGraphBlockFactory\";\r\nimport { Quaternion, Vector3 } from \"core/Maths/math.vector\";\r\nimport { type Scene } from \"core/scene\";\r\nimport { type IAnimation } from \"../glTFLoaderInterfaces\";\r\n\r\nconst NAME = \"KHR_interactivity\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the KHR_interactivity extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"KHR_interactivity\"]: {};\r\n }\r\n}\r\n\r\n/**\r\n * Loader extension for KHR_interactivity\r\n */\r\nexport class KHR_interactivity implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n private _pathConverter?: GLTFPathToObjectConverter<any, any, any>;\r\n\r\n /**\r\n * @internal\r\n * @param _loader\r\n */\r\n constructor(private _loader: GLTFLoader) {\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n this._pathConverter = GetPathToObjectConverter(this._loader.gltf);\r\n // avoid starting animations automatically.\r\n _loader._skipStartAnimationStep = true;\r\n\r\n // Update object model with new pointers\r\n\r\n const scene = _loader.babylonScene;\r\n if (scene) {\r\n _AddInteractivityObjectModel(scene);\r\n }\r\n }\r\n\r\n public dispose() {\r\n (this._loader as any) = null;\r\n delete this._pathConverter;\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax, @typescript-eslint/no-misused-promises\r\n public async onReady(): Promise<void> {\r\n if (!this._loader.babylonScene || !this._pathConverter) {\r\n return;\r\n }\r\n const scene = this._loader.babylonScene;\r\n const interactivityDefinition = this._loader.gltf.extensions?.KHR_interactivity as IKHRInteractivity;\r\n if (!interactivityDefinition) {\r\n // This can technically throw, but it's not a critical error\r\n return;\r\n }\r\n\r\n const coordinator = new FlowGraphCoordinator({ scene });\r\n coordinator.dispatchEventsSynchronously = false; // glTF interactivity dispatches events asynchronously\r\n const graphs = interactivityDefinition.graphs.map((graph) => {\r\n const parser = new InteractivityGraphToFlowGraphParser(graph, this._loader.gltf, this._loader.parent.targetFps);\r\n return parser.serializeToFlowGraph();\r\n });\r\n // parse each graph async\r\n await Promise.all(graphs.map(async (graph) => await ParseFlowGraphAsync(graph, { coordinator, pathConverter: this._pathConverter })));\r\n\r\n coordinator.start();\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n * populates the object model with the interactivity extension\r\n */\r\nexport function _AddInteractivityObjectModel(scene: Scene) {\r\n // Note - all of those are read-only, as per the specs!\r\n\r\n // active camera rotation\r\n AddObjectAccessorToKey(\"/extensions/KHR_interactivity/?/activeCamera/rotation\", {\r\n get: () => {\r\n if (!scene.activeCamera) {\r\n return new Quaternion(NaN, NaN, NaN, NaN);\r\n }\r\n const quat = Quaternion.FromRotationMatrix(scene.activeCamera.getWorldMatrix()).normalize();\r\n if (!scene.useRightHandedSystem) {\r\n quat.w *= -1; // glTF uses right-handed system, while babylon uses left-handed\r\n quat.x *= -1; // glTF uses right-handed system, while babylon uses left-handed\r\n }\r\n return quat;\r\n },\r\n type: \"Quaternion\",\r\n getTarget: () => scene.activeCamera,\r\n });\r\n // activeCamera position\r\n AddObjectAccessorToKey(\"/extensions/KHR_interactivity/?/activeCamera/position\", {\r\n get: () => {\r\n if (!scene.activeCamera) {\r\n return new Vector3(NaN, NaN, NaN);\r\n }\r\n const pos = scene.activeCamera.getWorldMatrix().getTranslation(); // not global position\r\n if (!scene.useRightHandedSystem) {\r\n pos.x *= -1; // glTF uses right-handed system, while babylon uses left-handed\r\n }\r\n return pos;\r\n },\r\n type: \"Vector3\",\r\n getTarget: () => scene.activeCamera,\r\n });\r\n\r\n // /animations/{} pointers:\r\n AddObjectAccessorToKey(\"/animations/{}/extensions/KHR_interactivity/isPlaying\", {\r\n get: (animation: IAnimation) => {\r\n return animation._babylonAnimationGroup?.isPlaying ?? false;\r\n },\r\n type: \"boolean\",\r\n getTarget: (animation: IAnimation) => {\r\n return animation._babylonAnimationGroup;\r\n },\r\n });\r\n AddObjectAccessorToKey(\"/animations/{}/extensions/KHR_interactivity/minTime\", {\r\n get: (animation: IAnimation) => {\r\n return (animation._babylonAnimationGroup?.from ?? 0) / 60; // fixed factor for duration-to-frames conversion\r\n },\r\n type: \"number\",\r\n getTarget: (animation: IAnimation) => {\r\n return animation._babylonAnimationGroup;\r\n },\r\n });\r\n AddObjectAccessorToKey(\"/animations/{}/extensions/KHR_interactivity/maxTime\", {\r\n get: (animation: IAnimation) => {\r\n return (animation._babylonAnimationGroup?.to ?? 0) / 60; // fixed factor for duration-to-frames conversion\r\n },\r\n type: \"number\",\r\n getTarget: (animation: IAnimation) => {\r\n return animation._babylonAnimationGroup;\r\n },\r\n });\r\n // playhead\r\n AddObjectAccessorToKey(\"/animations/{}/extensions/KHR_interactivity/playhead\", {\r\n get: (animation: IAnimation) => {\r\n return (animation._babylonAnimationGroup?.getCurrentFrame() ?? 0) / 60; // fixed factor for duration-to-frames conversion\r\n },\r\n type: \"number\",\r\n getTarget: (animation: IAnimation) => {\r\n return animation._babylonAnimationGroup;\r\n },\r\n });\r\n //virtualPlayhead - TODO, do we support this property in our animations? getCurrentFrame is the only method we have for this.\r\n AddObjectAccessorToKey(\"/animations/{}/extensions/KHR_interactivity/virtualPlayhead\", {\r\n get: (animation: IAnimation) => {\r\n return (animation._babylonAnimationGroup?.getCurrentFrame() ?? 0) / 60; // fixed factor for duration-to-frames conversion\r\n },\r\n type: \"number\",\r\n getTarget: (animation: IAnimation) => {\r\n return animation._babylonAnimationGroup;\r\n },\r\n });\r\n}\r\n\r\n// Register flow graph blocks. Do it here so they are available when the extension is enabled.\r\naddToBlockFactory(NAME, \"FlowGraphGLTFDataProvider\", async () => {\r\n return (await import(\"./KHR_interactivity/flowGraphGLTFDataProvider\")).FlowGraphGLTFDataProvider;\r\n});\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, true, (loader) => new KHR_interactivity(loader));\r\n","import { type AbstractMesh } from \"core/Meshes/abstractMesh\";\nimport { type GLTFLoader } from \"../glTFLoader\";\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\nimport { type INode } from \"../glTFLoaderInterfaces\";\nimport { AddObjectAccessorToKey } from \"./objectModelMapping\";\n\nconst NAME = \"KHR_node_visibility\";\n\ndeclare module \"../../glTFFileLoader\" {\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\n export interface GLTFLoaderExtensionOptions {\n /**\n * Defines options for the KHR_node_visibility extension.\n */\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\n [\"KHR_node_visibility\"]: {};\n }\n}\n\n// object model extension for visibility\nAddObjectAccessorToKey(\"/nodes/{}/extensions/KHR_node_visibility/visible\", {\n get: (node: INode) => {\n const tn = node._babylonTransformNode as any;\n if (tn && tn.isVisible !== undefined) {\n return tn.isVisible;\n }\n return true;\n },\n set: (value: boolean, node: INode) => {\n node._primitiveBabylonMeshes?.forEach((mesh) => {\n mesh.inheritVisibility = true;\n });\n if (node._babylonTransformNode) {\n (node._babylonTransformNode as AbstractMesh).isVisible = value;\n }\n node._primitiveBabylonMeshes?.forEach((mesh) => {\n mesh.isVisible = value;\n });\n },\n getTarget: (node: INode) => node._babylonTransformNode,\n getPropertyName: [() => \"isVisible\"],\n type: \"boolean\",\n});\n\n/**\n * Loader extension for KHR_node_visibility\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport class KHR_node_visibility implements IGLTFLoaderExtension {\n /**\n * The name of this extension.\n */\n public readonly name = NAME;\n\n /**\n * Defines whether this extension is enabled.\n */\n public enabled: boolean;\n\n private _loader?: GLTFLoader;\n\n /**\n * @internal\n */\n constructor(loader: GLTFLoader) {\n this._loader = loader;\n this.enabled = loader.isExtensionUsed(NAME);\n }\n\n public onReady(): void {\n if (!this._loader) {\n return;\n }\n\n const nodes = this._loader.gltf.nodes;\n if (nodes) {\n for (const node of nodes) {\n const babylonTransformNode = node._babylonTransformNode;\n if (babylonTransformNode) {\n babylonTransformNode.inheritVisibility = true;\n if (node.extensions && node.extensions.KHR_node_visibility && node.extensions.KHR_node_visibility.visible === false) {\n babylonTransformNode.isVisible = false;\n }\n }\n }\n }\n }\n\n public dispose() {\n delete this._loader;\n }\n}\n\nunregisterGLTFExtension(NAME);\nregisterGLTFExtension(NAME, true, (loader) => new KHR_node_visibility(loader));\n","import { FlowGraphBlockNames } from \"core/FlowGraph/Blocks/flowGraphBlockNames\";\nimport { type GLTFLoader } from \"../glTFLoader\";\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\nimport { addNewInteractivityFlowGraphMapping } from \"./KHR_interactivity/declarationMapper\";\nimport { type INode } from \"../glTFLoaderInterfaces\";\nimport { AddObjectAccessorToKey } from \"./objectModelMapping\";\n\nconst NAME = \"KHR_node_selectability\";\n\ndeclare module \"../../glTFFileLoader\" {\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\n export interface GLTFLoaderExtensionOptions {\n /**\n * Defines options for the KHR_selectability extension.\n */\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\n [\"KHR_node_selectability\"]: {};\n }\n}\n\n// add the interactivity mapping for the onSelect event\naddNewInteractivityFlowGraphMapping(\"event/onSelect\", NAME, {\n // using GetVariable as the nodeIndex is a configuration and not a value (i.e. it's not mutable)\n blocks: [FlowGraphBlockNames.MeshPickEvent, FlowGraphBlockNames.GetVariable, FlowGraphBlockNames.IndexOf, \"KHR_interactivity/FlowGraphGLTFDataProvider\"],\n configuration: {\n stopPropagation: { name: \"stopPropagation\" },\n nodeIndex: {\n name: \"variable\",\n toBlock: FlowGraphBlockNames.GetVariable,\n dataTransformer(data) {\n return \"pickedMesh_\" + data;\n },\n },\n },\n outputs: {\n values: {\n selectedNodeIndex: { name: \"index\", toBlock: FlowGraphBlockNames.IndexOf },\n controllerIndex: { name: \"pointerId\" },\n selectionPoint: { name: \"pickedPoint\" },\n selectionRayOrigin: { name: \"pickOrigin\" },\n },\n flows: {\n out: { name: \"done\" },\n },\n },\n interBlockConnectors: [\n {\n input: \"asset\",\n output: \"value\",\n inputBlockIndex: 0,\n outputBlockIndex: 1,\n isVariable: true,\n },\n {\n input: \"array\",\n output: \"nodes\",\n inputBlockIndex: 2,\n outputBlockIndex: 3,\n isVariable: true,\n },\n {\n input: \"object\",\n output: \"pickedMesh\",\n inputBlockIndex: 2,\n outputBlockIndex: 0,\n isVariable: true,\n },\n ],\n extraProcessor(gltfBlock, _declaration, _mapping, _arrays, serializedObjects, context, globalGLTF) {\n // add the glTF to the configuration of the last serialized object\n const serializedObject = serializedObjects[serializedObjects.length - 1];\n serializedObject.config = serializedObject.config || {};\n serializedObject.config.glTF = globalGLTF;\n // find the listener nodeIndex value\n const nodeIndex = gltfBlock.configuration?.[\"nodeIndex\"]?.value?.[0];\n if (nodeIndex === undefined || typeof nodeIndex !== \"number\") {\n throw new Error(\"nodeIndex not found in configuration\");\n }\n const variableName = \"pickedMesh_\" + nodeIndex;\n // find the nodeIndex value\n serializedObjects[1].config.variable = variableName;\n context._userVariables[variableName] = {\n className: \"Mesh\",\n id: globalGLTF?.nodes?.[nodeIndex]._babylonTransformNode?.id,\n uniqueId: globalGLTF?.nodes?.[nodeIndex]._babylonTransformNode?.uniqueId,\n };\n return serializedObjects;\n },\n});\n\n// object model extension for selectable\nAddObjectAccessorToKey(\"/nodes/{}/extensions/KHR_node_selectability/selectable\", {\n get: (node: INode) => {\n const tn = node._babylonTransformNode as any;\n if (tn && tn.isPickable !== undefined) {\n return tn.isPickable;\n }\n return true;\n },\n set: (value: boolean, node: INode) => {\n node._primitiveBabylonMeshes?.forEach((mesh) => {\n mesh.isPickable = value;\n });\n },\n getTarget: (node: INode) => node._babylonTransformNode,\n getPropertyName: [() => \"isPickable\"],\n type: \"boolean\",\n});\n\n/**\n * Loader extension for KHR_selectability\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport class KHR_node_selectability implements IGLTFLoaderExtension {\n /**\n * The name of this extension.\n */\n public readonly name = NAME;\n /**\n * Defines whether this extension is enabled.\n */\n public enabled: boolean;\n\n private _loader: GLTFLoader;\n\n /**\n * @internal\n */\n constructor(loader: GLTFLoader) {\n this._loader = loader;\n this.enabled = loader.isExtensionUsed(NAME);\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-misused-promises\n public async onReady(): Promise<void> {\n this._loader.gltf.nodes?.forEach((node) => {\n if (node.extensions?.KHR_node_selectability && node.extensions?.KHR_node_selectability.selectable === false) {\n node._babylonTransformNode?.getChildMeshes().forEach((mesh) => {\n mesh.isPickable = false;\n });\n }\n });\n }\n\n public dispose() {\n (this._loader as any) = null;\n }\n}\n\nunregisterGLTFExtension(NAME);\nregisterGLTFExtension(NAME, true, (loader) => new KHR_node_selectability(loader));\n","import { FlowGraphBlockNames } from \"core/FlowGraph/Blocks/flowGraphBlockNames\";\nimport { type GLTFLoader } from \"../glTFLoader\";\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\nimport { addNewInteractivityFlowGraphMapping } from \"./KHR_interactivity/declarationMapper\";\nimport { type INode } from \"../glTFLoaderInterfaces\";\nimport { AddObjectAccessorToKey } from \"./objectModelMapping\";\n\nconst NAME = \"KHR_node_hoverability\";\n\ndeclare module \"../../glTFFileLoader\" {\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\n export interface GLTFLoaderExtensionOptions {\n /**\n * Defines options for the KHR_node_hoverability extension.\n */\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\n [\"KHR_node_hoverability\"]: {};\n }\n}\n\n// interactivity\nconst MeshPointerOverPrefix = \"targetMeshPointerOver_\";\naddNewInteractivityFlowGraphMapping(\"event/onHoverIn\", NAME, {\n // using GetVariable as the nodeIndex is a configuration and not a value (i.e. it's not mutable)\n blocks: [FlowGraphBlockNames.PointerOverEvent, FlowGraphBlockNames.GetVariable, FlowGraphBlockNames.IndexOf, \"KHR_interactivity/FlowGraphGLTFDataProvider\"],\n configuration: {\n stopPropagation: { name: \"stopPropagation\" },\n nodeIndex: {\n name: \"variable\",\n toBlock: FlowGraphBlockNames.GetVariable,\n dataTransformer(data) {\n return MeshPointerOverPrefix + data;\n },\n },\n },\n outputs: {\n values: {\n hoverNodeIndex: { name: \"index\", toBlock: FlowGraphBlockNames.IndexOf },\n controllerIndex: { name: \"pointerId\" },\n },\n flows: {\n out: { name: \"done\" },\n },\n },\n interBlockConnectors: [\n {\n input: \"targetMesh\",\n output: \"value\",\n inputBlockIndex: 0,\n outputBlockIndex: 1,\n isVariable: true,\n },\n {\n input: \"array\",\n output: \"nodes\",\n inputBlockIndex: 2,\n outputBlockIndex: 3,\n isVariable: true,\n },\n {\n input: \"object\",\n output: \"meshUnderPointer\",\n inputBlockIndex: 2,\n outputBlockIndex: 0,\n isVariable: true,\n },\n ],\n extraProcessor(gltfBlock, _declaration, _mapping, _arrays, serializedObjects, context, globalGLTF) {\n // add the glTF to the configuration of the last serialized object\n const serializedObject = serializedObjects[serializedObjects.length - 1];\n serializedObject.config = serializedObject.config || {};\n serializedObject.config.glTF = globalGLTF;\n // find the listener nodeIndex value\n const nodeIndex = gltfBlock.configuration?.[\"nodeIndex\"]?.value?.[0];\n if (nodeIndex === undefined || typeof nodeIndex !== \"number\") {\n throw new Error(\"nodeIndex not found in configuration\");\n }\n const variableName = MeshPointerOverPrefix + nodeIndex;\n // find the nodeIndex value\n serializedObjects[1].config.variable = variableName;\n context._userVariables[variableName] = {\n className: \"Mesh\",\n id: globalGLTF?.nodes?.[nodeIndex]._babylonTransformNode?.id,\n uniqueId: globalGLTF?.nodes?.[nodeIndex]._babylonTransformNode?.uniqueId,\n };\n return serializedObjects;\n },\n});\n\nconst MeshPointerOutPrefix = \"targetMeshPointerOut_\";\naddNewInteractivityFlowGraphMapping(\"event/onHoverOut\", NAME, {\n // using GetVariable as the nodeIndex is a configuration and not a value (i.e. it's not mutable)\n blocks: [FlowGraphBlockNames.PointerOutEvent, FlowGraphBlockNames.GetVariable, FlowGraphBlockNames.IndexOf, \"KHR_interactivity/FlowGraphGLTFDataProvider\"],\n configuration: {\n stopPropagation: { name: \"stopPropagation\" },\n nodeIndex: {\n name: \"variable\",\n toBlock: FlowGraphBlockNames.GetVariable,\n dataTransformer(data) {\n return MeshPointerOutPrefix + data;\n },\n },\n },\n outputs: {\n values: {\n hoverNodeIndex: { name: \"index\", toBlock: FlowGraphBlockNames.IndexOf },\n controllerIndex: { name: \"pointerId\" },\n },\n flows: {\n out: { name: \"done\" },\n },\n },\n interBlockConnectors: [\n {\n input: \"targetMesh\",\n output: \"value\",\n inputBlockIndex: 0,\n outputBlockIndex: 1,\n isVariable: true,\n },\n {\n input: \"array\",\n output: \"nodes\",\n inputBlockIndex: 2,\n outputBlockIndex: 3,\n isVariable: true,\n },\n {\n input: \"object\",\n output: \"meshOutOfPointer\",\n inputBlockIndex: 2,\n outputBlockIndex: 0,\n isVariable: true,\n },\n ],\n extraProcessor(gltfBlock, _declaration, _mapping, _arrays, serializedObjects, context, globalGLTF) {\n // add the glTF to the configuration of the last serialized object\n const serializedObject = serializedObjects[serializedObjects.length - 1];\n serializedObject.config = serializedObject.config || {};\n serializedObject.config.glTF = globalGLTF;\n\n const nodeIndex = gltfBlock.configuration?.[\"nodeIndex\"]?.value?.[0];\n if (nodeIndex === undefined || typeof nodeIndex !== \"number\") {\n throw new Error(\"nodeIndex not found in configuration\");\n }\n const variableName = MeshPointerOutPrefix + nodeIndex;\n // find the nodeIndex value\n serializedObjects[1].config.variable = variableName;\n context._userVariables[variableName] = {\n className: \"Mesh\",\n id: globalGLTF?.nodes?.[nodeIndex]._babylonTransformNode?.id,\n uniqueId: globalGLTF?.nodes?.[nodeIndex]._babylonTransformNode?.uniqueId,\n };\n return serializedObjects;\n },\n});\n\nAddObjectAccessorToKey(\"/nodes/{}/extensions/KHR_node_hoverability/hoverable\", {\n get: (node: INode) => {\n const tn = node._babylonTransformNode as any;\n if (tn && tn.pointerOverDisableMeshTesting !== undefined) {\n return tn.pointerOverDisableMeshTesting;\n }\n return true;\n },\n set: (value: boolean, node: INode) => {\n node._primitiveBabylonMeshes?.forEach((mesh) => {\n mesh.pointerOverDisableMeshTesting = !value;\n });\n },\n getTarget: (node: INode) => node._babylonTransformNode,\n getPropertyName: [() => \"pointerOverDisableMeshTesting\"],\n type: \"boolean\",\n});\n\n/**\n * Loader extension for KHR_node_hoverability\n * @see https://github.com/KhronosGroup/glTF/pull/2426\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport class KHR_node_hoverability implements IGLTFLoaderExtension {\n /**\n * The name of this extension.\n */\n public readonly name = NAME;\n /**\n * Defines whether this extension is enabled.\n */\n public enabled: boolean;\n\n private _loader: GLTFLoader;\n\n /**\n * @internal\n */\n constructor(loader: GLTFLoader) {\n this._loader = loader;\n this.enabled = loader.isExtensionUsed(NAME);\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-misused-promises\n public async onReady(): Promise<void> {\n this._loader.gltf.nodes?.forEach((node) => {\n // default is true, so only apply if false\n if (node.extensions?.KHR_node_hoverability && node.extensions?.KHR_node_hoverability.hoverable === false) {\n node._babylonTransformNode?.getChildMeshes().forEach((mesh) => {\n mesh.pointerOverDisableMeshTesting = true;\n });\n }\n });\n }\n\n public dispose() {\n (this._loader as any) = null;\n }\n}\n\nunregisterGLTFExtension(NAME);\nregisterGLTFExtension(NAME, true, (loader) => new KHR_node_hoverability(loader));\n","import { type Nullable } from \"core/types\";\r\nimport { type TransformNode } from \"core/Meshes/transformNode\";\r\nimport { type Camera } from \"core/Cameras/camera\";\r\nimport { type AnimationGroup } from \"core/Animations/animationGroup\";\r\n\r\nimport { type IProperty } from \"babylonjs-gltf2interface\";\r\nimport { type INode, type ICamera, type IMaterial, type IAnimation } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { type GLTFLoader } from \"../glTFLoader\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"ExtrasAsMetadata\";\r\n\r\ndeclare module \"../../glTFFileLoader\" {\r\n // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention\r\n export interface GLTFLoaderExtensionOptions {\r\n /**\r\n * Defines options for the ExtrasAsMetadata extension.\r\n */\r\n // NOTE: Don't use NAME here as it will break the UMD type declarations.\r\n [\"ExtrasAsMetadata\"]: {};\r\n }\r\n}\r\n\r\ninterface IObjectWithMetadata {\r\n metadata: any;\r\n}\r\n\r\n/**\r\n * Store glTF extras (if present) in BJS objects' metadata\r\n */\r\nexport class ExtrasAsMetadata implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled = true;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n private _assignExtras(babylonObject: IObjectWithMetadata, gltfProp: IProperty): void {\r\n if (gltfProp.extras && Object.keys(gltfProp.extras).length > 0) {\r\n const metadata = (babylonObject.metadata = babylonObject.metadata || {});\r\n const gltf = (metadata.gltf = metadata.gltf || {});\r\n gltf.extras = gltfProp.extras;\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n }\r\n\r\n /** @internal */\r\n public dispose(): void {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable<Promise<TransformNode>> {\r\n return this._loader.loadNodeAsync(context, node, (babylonTransformNode): void => {\r\n this._assignExtras(babylonTransformNode, node);\r\n assign(babylonTransformNode);\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadCameraAsync(context: string, camera: ICamera, assign: (babylonCamera: Camera) => void): Nullable<Promise<Camera>> {\r\n return this._loader.loadCameraAsync(context, camera, (babylonCamera): void => {\r\n this._assignExtras(babylonCamera, camera);\r\n assign(babylonCamera);\r\n });\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public createMaterial(context: string, material: IMaterial, babylonDrawMode: number): Nullable<Material> {\r\n const babylonMaterial = this._loader.createMaterial(context, material, babylonDrawMode);\r\n this._assignExtras(babylonMaterial, material);\r\n return babylonMaterial;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadAnimationAsync(context: string, animation: IAnimation): Nullable<Promise<AnimationGroup>> {\r\n // eslint-disable-next-line github/no-then\r\n return this._loader.loadAnimationAsync(context, animation).then((babylonAnimation: AnimationGroup) => {\r\n this._assignExtras(babylonAnimation, animation);\r\n return babylonAnimation;\r\n });\r\n }\r\n}\r\n\r\nunregisterGLTFExtension(NAME);\r\nregisterGLTFExtension(NAME, false, (loader) => new ExtrasAsMetadata(loader));\r\n","import { type IFlowGraphBlockConfiguration, FlowGraphBlock } from \"core/FlowGraph/flowGraphBlock\";\nimport { type IGLTF } from \"../../glTFLoaderInterfaces\";\nimport { type FlowGraphDataConnection } from \"core/FlowGraph/flowGraphDataConnection\";\nimport { type AnimationGroup } from \"core/Animations/animationGroup\";\nimport { type TransformNode } from \"core/Meshes/transformNode\";\nimport { RichTypeAny } from \"core/FlowGraph/flowGraphRichTypes\";\n\n/**\n * a configuration interface for this block\n */\nexport interface IFlowGraphGLTFDataProviderBlockConfiguration extends IFlowGraphBlockConfiguration {\n /**\n * the glTF object to provide data from\n */\n glTF: IGLTF;\n}\n\n/**\n * a glTF-based FlowGraph block that provides arrays with babylon object, based on the glTF tree\n * Can be used, for example, to get animation index from a glTF animation\n */\nexport class FlowGraphGLTFDataProvider extends FlowGraphBlock {\n /**\n * Output: an array of animation groups\n * Corresponds directly to the glTF animations array\n */\n public readonly animationGroups: FlowGraphDataConnection<AnimationGroup[]>;\n\n /**\n * Output an array of (Transform) nodes\n * Corresponds directly to the glTF nodes array\n */\n public readonly nodes: FlowGraphDataConnection<TransformNode[]>;\n\n constructor(config: IFlowGraphGLTFDataProviderBlockConfiguration) {\n super(config);\n const glTF = config.glTF;\n // glTF may be undefined when the block is re-created from serialized data\n // (e.g. in the Flow Graph Editor) where the live glTF parse tree is unavailable.\n const animationGroups = glTF?.animations?.map((a) => a._babylonAnimationGroup) || [];\n this.animationGroups = this.registerDataOutput(\"animationGroups\", RichTypeAny, animationGroups);\n const nodes = glTF?.nodes?.map((n) => n._babylonTransformNode) || [];\n this.nodes = this.registerDataOutput(\"nodes\", RichTypeAny, nodes);\n }\n\n public override getClassName(): string {\n return \"FlowGraphGLTFDataProvider\";\n }\n}\n","import { type OpenPBRMaterial } from \"core/Materials/PBR/openpbrMaterial\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\nimport { type IMaterialLoadingAdapter } from \"./materialLoadingAdapter\";\r\nimport {\r\n MultiplyTexturesAsync,\r\n LerpTexturesAsync,\r\n CreateTextureWithFactorOperand,\r\n TextureChannel,\r\n TextureColorSpace,\r\n InvertTextureAsync,\r\n ExtractChannelAsync,\r\n ChannelMask,\r\n ExtractMaxChannelAsync,\r\n} from \"core/Materials/Textures/textureProcessor\";\r\n\r\n/**\r\n * Material Loading Adapter for OpenPBR materials that provides a unified OpenPBR-like interface.\r\n */\r\nexport class OpenPBRMaterialLoadingAdapter implements IMaterialLoadingAdapter {\r\n private _material: OpenPBRMaterial;\r\n private _specWorkflow: boolean = false;\r\n /**\r\n * Creates a new instance of the OpenPBRMaterialLoadingAdapter.\r\n * @param material - The OpenPBR material to adapt.\r\n */\r\n constructor(material: Material) {\r\n this._material = material as OpenPBRMaterial;\r\n }\r\n\r\n /**\r\n * Gets the underlying material\r\n */\r\n public get material(): OpenPBRMaterial {\r\n return this._material;\r\n }\r\n\r\n /**\r\n * Whether the material should be treated as unlit\r\n */\r\n public get isUnlit(): boolean {\r\n return this._material.unlit;\r\n }\r\n\r\n /**\r\n * Sets whether the material should be treated as unlit\r\n */\r\n public set isUnlit(value: boolean) {\r\n this._material.unlit = value;\r\n }\r\n\r\n // ========================================\r\n // CULLING PROPERTIES\r\n // ========================================\r\n\r\n /**\r\n * Sets whether back face culling is enabled.\r\n * @param value True to enable back face culling\r\n */\r\n public set backFaceCulling(value: boolean) {\r\n this._material.backFaceCulling = value;\r\n }\r\n\r\n /**\r\n * Gets whether back face culling is enabled.\r\n * @returns True if back face culling is enabled\r\n */\r\n public get backFaceCulling(): boolean {\r\n return this._material.backFaceCulling;\r\n }\r\n\r\n /**\r\n * Sets whether two-sided lighting is enabled.\r\n * @param value True to enable two-sided lighting\r\n */\r\n public set twoSidedLighting(value: boolean) {\r\n this._material.twoSidedLighting = value;\r\n }\r\n\r\n /**\r\n * Gets whether two-sided lighting is enabled.\r\n * @returns True if two-sided lighting is enabled\r\n */\r\n public get twoSidedLighting(): boolean {\r\n return this._material.twoSidedLighting;\r\n }\r\n\r\n // ========================================\r\n // ALPHA PROPERTIES\r\n // ========================================\r\n\r\n /**\r\n * Sets the alpha cutoff value for alpha testing.\r\n * Note: OpenPBR doesn't have a direct equivalent, so this is a no-op.\r\n * @param value The alpha cutoff threshold (ignored for OpenPBR)\r\n */\r\n public set alphaCutOff(value: number) {\r\n // OpenPBR doesn't have a direct equivalent, but could be implemented if needed\r\n }\r\n\r\n /**\r\n * Gets the alpha cutoff value.\r\n * @returns Default value of 0.5 (OpenPBR doesn't support this directly)\r\n */\r\n public get alphaCutOff(): number {\r\n return 0.5; // Default value\r\n }\r\n\r\n /**\r\n * Sets whether to use alpha from the base color texture.\r\n * Note: OpenPBR handles this differently through the baseColorTexture alpha channel.\r\n * @param value True to use alpha from base color texture (handled automatically in OpenPBR)\r\n */\r\n public set useAlphaFromBaseColorTexture(value: boolean) {\r\n this._material._useAlphaFromBaseColorTexture = value;\r\n }\r\n\r\n /**\r\n * Gets whether alpha is used from the base color texture.\r\n * @returns Always false for OpenPBR as it's handled automatically\r\n */\r\n public get useAlphaFromBaseColorTexture(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets whether the transparency is treated as alpha coverage.\r\n */\r\n public get transparencyAsAlphaCoverage(): boolean {\r\n // OpenPBR doesn't support treating transparency as alpha coverage.\r\n return false;\r\n }\r\n\r\n /**\r\n * Sets/Gets whether the transparency is treated as alpha coverage\r\n */\r\n public set transparencyAsAlphaCoverage(value: boolean) {\r\n // OpenPBR doesn't support treating transparency as alpha coverage.\r\n }\r\n\r\n // ========================================\r\n // BASE PARAMETERS\r\n // ========================================\r\n\r\n /**\r\n * Sets the base color of the OpenPBR material.\r\n * @param value The base color as a Color3\r\n */\r\n public set baseColor(value: Color3) {\r\n this._material.baseColor = value;\r\n }\r\n\r\n /**\r\n * Gets the base color of the OpenPBR material.\r\n * @returns The base color as a Color3\r\n */\r\n public get baseColor(): Color3 {\r\n return this._material.baseColor;\r\n }\r\n\r\n /**\r\n * Sets the base color texture of the OpenPBR material.\r\n * @param value The base color texture or null\r\n */\r\n public set baseColorTexture(value: Nullable<BaseTexture>) {\r\n this._material.baseColorTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the base color texture of the OpenPBR material.\r\n * @returns The base color texture or null\r\n */\r\n public get baseColorTexture(): Nullable<BaseTexture> {\r\n return this._material.baseColorTexture;\r\n }\r\n\r\n /**\r\n * Sets the base diffuse roughness of the OpenPBR material.\r\n * @param value The diffuse roughness value (0-1)\r\n */\r\n public set baseDiffuseRoughness(value: number) {\r\n this._material.baseDiffuseRoughness = value;\r\n }\r\n\r\n /**\r\n * Gets the base diffuse roughness of the OpenPBR material.\r\n * @returns The diffuse roughness value (0-1)\r\n */\r\n public get baseDiffuseRoughness(): number {\r\n return this._material.baseDiffuseRoughness;\r\n }\r\n\r\n /**\r\n * Sets the base diffuse roughness texture of the OpenPBR material.\r\n * @param value The diffuse roughness texture or null\r\n */\r\n public set baseDiffuseRoughnessTexture(value: Nullable<BaseTexture>) {\r\n this._material.baseDiffuseRoughnessTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the base diffuse roughness texture of the OpenPBR material.\r\n * @returns The diffuse roughness texture or null\r\n */\r\n public get baseDiffuseRoughnessTexture(): Nullable<BaseTexture> {\r\n return this._material.baseDiffuseRoughnessTexture;\r\n }\r\n\r\n /**\r\n * Sets the base metalness value of the OpenPBR material.\r\n * @param value The metalness value (0-1)\r\n */\r\n public set baseMetalness(value: number) {\r\n this._material.baseMetalness = value;\r\n }\r\n\r\n /**\r\n * Gets the base metalness value of the OpenPBR material.\r\n * @returns The metalness value (0-1)\r\n */\r\n public get baseMetalness(): number {\r\n return this._material.baseMetalness;\r\n }\r\n\r\n /**\r\n * Sets the base metalness texture of the OpenPBR material.\r\n * @param value The metalness texture or null\r\n */\r\n public set baseMetalnessTexture(value: Nullable<BaseTexture>) {\r\n this._material.baseMetalnessTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the base metalness texture of the OpenPBR material.\r\n * @returns The metalness texture or null\r\n */\r\n public get baseMetalnessTexture(): Nullable<BaseTexture> {\r\n return this._material.baseMetalnessTexture;\r\n }\r\n\r\n /**\r\n * Sets whether to use roughness from the metallic texture's green channel.\r\n * @param value True to use green channel for roughness\r\n */\r\n public set useRoughnessFromMetallicTextureGreen(value: boolean) {\r\n this._material._useRoughnessFromMetallicTextureGreen = value;\r\n }\r\n\r\n /**\r\n * Sets whether to use metalness from the metallic texture's blue channel.\r\n * @param value True to use blue channel for metalness\r\n */\r\n public set useMetallicFromMetallicTextureBlue(value: boolean) {\r\n this._material._useMetallicFromMetallicTextureBlue = value;\r\n }\r\n\r\n // ========================================\r\n // SPECULAR PARAMETERS\r\n // ========================================\r\n\r\n /**\r\n * Configures specular properties for OpenPBR material.\r\n * @param _enableEdgeColor Whether to enable edge color support (ignored for OpenPBR)\r\n */\r\n public enableSpecularEdgeColor(_enableEdgeColor: boolean = false): void {\r\n // OpenPBR already supports edge color natively, no configuration needed\r\n }\r\n\r\n public configureSpecularGlossiness(): void {\r\n this._specWorkflow = true;\r\n }\r\n\r\n /**\r\n * Sets the specular weight of the OpenPBR material.\r\n * @param value The specular weight value (0-1)\r\n */\r\n public set specularWeight(value: number) {\r\n this._material.specularWeight = value;\r\n }\r\n\r\n /**\r\n * Gets the specular weight of the OpenPBR material.\r\n * @returns The specular weight value (0-1)\r\n */\r\n public get specularWeight(): number {\r\n return this._material.specularWeight;\r\n }\r\n\r\n /**\r\n * Sets the specular weight texture of the OpenPBR material.\r\n * If the same texture is used for specular color, optimizes by using alpha channel for weight.\r\n * @param value The specular weight texture or null\r\n */\r\n public set specularWeightTexture(value: Nullable<BaseTexture>) {\r\n if (this._material.specularColorTexture === value) {\r\n this._material.specularWeightTexture = null;\r\n this._material._useSpecularWeightFromSpecularColorTexture = true;\r\n this._material._useSpecularWeightFromAlpha = true;\r\n } else {\r\n this._material.specularWeightTexture = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the specular weight texture of the OpenPBR material.\r\n * @returns The specular weight texture or null\r\n */\r\n public get specularWeightTexture(): Nullable<BaseTexture> {\r\n return this._material.specularWeightTexture;\r\n }\r\n\r\n /**\r\n * Sets the specular color of the OpenPBR material.\r\n * @param value The specular color as a Color3\r\n */\r\n public set specularColor(value: Color3) {\r\n this._material.specularColor = value;\r\n }\r\n\r\n /**\r\n * Gets the specular color of the OpenPBR material.\r\n * @returns The specular color as a Color3\r\n */\r\n public get specularColor(): Color3 {\r\n return this._material.specularColor;\r\n }\r\n\r\n /**\r\n * Sets the specular color texture of the OpenPBR material.\r\n * If the same texture is used for specular weight, optimizes by using alpha channel for weight.\r\n * @param value The specular color texture or null\r\n */\r\n public set specularColorTexture(value: Nullable<BaseTexture>) {\r\n this._material.specularColorTexture = value;\r\n if (this._material.specularWeightTexture === this._material.specularColorTexture) {\r\n this._material.specularWeightTexture = null;\r\n this._material._useSpecularWeightFromSpecularColorTexture = true;\r\n this._material._useSpecularWeightFromAlpha = true;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the specular color texture of the OpenPBR material.\r\n * @returns The specular color texture or null\r\n */\r\n public get specularColorTexture(): Nullable<BaseTexture> {\r\n return this._material.specularColorTexture;\r\n }\r\n\r\n /**\r\n * Sets the specular roughness of the OpenPBR material.\r\n * @param value The roughness value (0-1)\r\n */\r\n public set specularRoughness(value: number) {\r\n this._material.specularRoughness = value;\r\n }\r\n\r\n /**\r\n * Gets the specular roughness of the OpenPBR material.\r\n * @returns The roughness value (0-1)\r\n */\r\n public get specularRoughness(): number {\r\n return this._material.specularRoughness;\r\n }\r\n\r\n /**\r\n * Sets the specular roughness texture of the OpenPBR material.\r\n * @param value The roughness texture or null\r\n */\r\n public set specularRoughnessTexture(value: Nullable<BaseTexture>) {\r\n this._material.specularRoughnessTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the specular roughness texture of the OpenPBR material.\r\n * @returns The roughness texture or null\r\n */\r\n public get specularRoughnessTexture(): Nullable<BaseTexture> {\r\n return this._material.specularRoughnessTexture;\r\n }\r\n\r\n /**\r\n * Sets the specular index of refraction (IOR) of the OpenPBR material.\r\n * @param value The IOR value\r\n */\r\n public set specularIor(value: number) {\r\n this._material.specularIor = value;\r\n }\r\n\r\n /**\r\n * Gets the specular index of refraction (IOR) of the OpenPBR material.\r\n * @returns The IOR value\r\n */\r\n public get specularIor(): number {\r\n return this._material.specularIor;\r\n }\r\n\r\n /**\r\n * Sets the glossiness (inverted roughness) of the OpenPBR material.\r\n */\r\n public set glossiness(value: number) {\r\n this._material.specularRoughness = Math.max(1.0 - value, 0.0);\r\n }\r\n\r\n public get glossiness(): number {\r\n return 1.0 - this._material.specularRoughness;\r\n }\r\n\r\n // ========================================\r\n // EMISSION PARAMETERS\r\n // ========================================\r\n\r\n /**\r\n * Sets the emission color of the OpenPBR material.\r\n * @param value The emission color as a Color3\r\n */\r\n public set emissionColor(value: Color3) {\r\n this._material.emissionColor = value;\r\n }\r\n\r\n /**\r\n * Gets the emission color of the OpenPBR material.\r\n * @returns The emission color as a Color3\r\n */\r\n public get emissionColor(): Color3 {\r\n return this._material.emissionColor;\r\n }\r\n\r\n /**\r\n * Sets the emission luminance of the OpenPBR material.\r\n * @param value The emission luminance value\r\n */\r\n public set emissionLuminance(value: number) {\r\n this._material.emissionLuminance = value;\r\n }\r\n\r\n /**\r\n * Gets the emission luminance of the OpenPBR material.\r\n * @returns The emission luminance value\r\n */\r\n public get emissionLuminance(): number {\r\n return this._material.emissionLuminance;\r\n }\r\n\r\n /**\r\n * Sets the emission color texture of the OpenPBR material.\r\n * @param value The emission texture or null\r\n */\r\n public set emissionColorTexture(value: Nullable<BaseTexture>) {\r\n this._material.emissionColorTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the emission color texture of the OpenPBR material.\r\n * @returns The emission texture or null\r\n */\r\n public get emissionColorTexture(): Nullable<BaseTexture> {\r\n return this._material.emissionColorTexture;\r\n }\r\n\r\n // ========================================\r\n // AMBIENT OCCLUSION\r\n // ========================================\r\n\r\n /**\r\n * Sets the ambient occlusion texture of the OpenPBR material.\r\n * @param value The ambient occlusion texture or null\r\n */\r\n public set ambientOcclusionTexture(value: Nullable<BaseTexture>) {\r\n this._material.ambientOcclusionTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the ambient occlusion texture of the OpenPBR material.\r\n * @returns The ambient occlusion texture or null\r\n */\r\n public get ambientOcclusionTexture(): Nullable<BaseTexture> {\r\n return this._material.ambientOcclusionTexture;\r\n }\r\n\r\n /**\r\n * Sets the ambient occlusion texture strength by modifying the texture's level.\r\n * @param value The strength value (typically 0-1)\r\n */\r\n public set ambientOcclusionTextureStrength(value: number) {\r\n const texture = this._material.ambientOcclusionTexture;\r\n if (texture) {\r\n texture.level = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the ambient occlusion texture strength from the texture's level property.\r\n * @returns The strength value, defaults to 1.0 if no texture or level is set\r\n */\r\n public get ambientOcclusionTextureStrength(): number {\r\n const texture = this._material.ambientOcclusionTexture;\r\n return texture?.level ?? 1.0;\r\n }\r\n\r\n // ========================================\r\n // COAT PARAMETERS\r\n // ========================================\r\n\r\n /**\r\n * Configures coat parameters for OpenPBR material.\r\n * OpenPBR coat is already built-in, so no configuration is needed.\r\n */\r\n public configureCoat(): void {\r\n // OpenPBR coat is already built-in, no configuration needed\r\n }\r\n\r\n /**\r\n * Sets the coat weight of the OpenPBR material.\r\n * @param value The coat weight value (0-1)\r\n */\r\n public set coatWeight(value: number) {\r\n this._material.coatWeight = value;\r\n }\r\n\r\n /**\r\n * Gets the coat weight of the OpenPBR material.\r\n * @returns The coat weight value (0-1)\r\n */\r\n public get coatWeight(): number {\r\n return this._material.coatWeight;\r\n }\r\n\r\n /**\r\n * Sets the coat weight texture of the OpenPBR material.\r\n * @param value The coat weight texture or null\r\n */\r\n public set coatWeightTexture(value: Nullable<BaseTexture>) {\r\n this._material.coatWeightTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the coat weight texture of the OpenPBR material.\r\n * @returns The coat weight texture or null\r\n */\r\n public get coatWeightTexture(): Nullable<BaseTexture> {\r\n return this._material.coatWeightTexture;\r\n }\r\n\r\n /**\r\n * Sets the coat color of the OpenPBR material.\r\n * @param value The coat color as a Color3\r\n */\r\n public set coatColor(value: Color3) {\r\n this._material.coatColor = value;\r\n }\r\n\r\n /**\r\n * Gets the coat color of the OpenPBR material.\r\n */\r\n public get coatColor(): Color3 {\r\n return this._material.coatColor;\r\n }\r\n\r\n /**\r\n * Sets the coat color texture of the OpenPBR material.\r\n * @param value The coat color texture or null\r\n */\r\n public set coatColorTexture(value: Nullable<BaseTexture>) {\r\n this._material.coatColorTexture = value;\r\n }\r\n\r\n /**\r\n * Sets the coat roughness of the OpenPBR material.\r\n * @param value The coat roughness value (0-1)\r\n */\r\n public set coatRoughness(value: number) {\r\n this._material.coatRoughness = value;\r\n }\r\n\r\n /**\r\n * Gets the coat roughness of the OpenPBR material.\r\n * @returns The coat roughness value (0-1)\r\n */\r\n public get coatRoughness(): number {\r\n return this._material.coatRoughness;\r\n }\r\n\r\n /**\r\n * Sets the coat roughness texture of the OpenPBR material.\r\n * @param value The coat roughness texture or null\r\n */\r\n public set coatRoughnessTexture(value: Nullable<BaseTexture>) {\r\n this._material.coatRoughnessTexture = value;\r\n if (value) {\r\n this._material._useCoatRoughnessFromGreenChannel = true;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the coat roughness texture of the OpenPBR material.\r\n * @returns The coat roughness texture or null\r\n */\r\n public get coatRoughnessTexture(): Nullable<BaseTexture> {\r\n return this._material.coatRoughnessTexture;\r\n }\r\n\r\n /**\r\n * Sets the coat index of refraction (IOR) of the OpenPBR material.\r\n */\r\n public set coatIor(value: number) {\r\n this._material.coatIor = value;\r\n }\r\n\r\n public get coatIor(): number {\r\n return this._material.coatIor;\r\n }\r\n\r\n /**\r\n * Sets the coat darkening value of the OpenPBR material.\r\n * @param value The coat darkening value\r\n */\r\n public set coatDarkening(value: number) {\r\n this._material.coatDarkening = value;\r\n }\r\n\r\n public get coatDarkening(): number {\r\n return this._material.coatDarkening;\r\n }\r\n\r\n /**\r\n * Sets the coat darkening texture (OpenPBR: coatDarkeningTexture, no PBR equivalent)\r\n */\r\n public set coatDarkeningTexture(value: Nullable<BaseTexture>) {\r\n this._material.coatDarkeningTexture = value;\r\n }\r\n\r\n /**\r\n * Sets the coat roughness anisotropy.\r\n * TODO: Implementation pending OpenPBR coat anisotropy feature availability.\r\n * @param value The coat anisotropy intensity value\r\n */\r\n public set coatRoughnessAnisotropy(value: number) {\r\n this._material.coatRoughnessAnisotropy = value;\r\n }\r\n\r\n /**\r\n * Gets the coat roughness anisotropy.\r\n * TODO: Implementation pending OpenPBR coat anisotropy feature availability.\r\n * @returns Currently returns 0 as coat anisotropy is not yet available\r\n */\r\n public get coatRoughnessAnisotropy(): number {\r\n return this._material.coatRoughnessAnisotropy;\r\n }\r\n\r\n /**\r\n * Sets the coat tangent angle for anisotropy.\r\n * TODO: Implementation pending OpenPBR coat anisotropy feature availability.\r\n * @param value The coat anisotropy rotation angle in radians\r\n */\r\n public set geometryCoatTangentAngle(value: number) {\r\n this._material.geometryCoatTangentAngle = value;\r\n }\r\n\r\n /**\r\n * Sets the coat tangent texture for anisotropy.\r\n * TODO: Implementation pending OpenPBR coat anisotropy feature availability.\r\n * @param value The coat anisotropy texture or null\r\n */\r\n public set geometryCoatTangentTexture(value: Nullable<BaseTexture>) {\r\n this._material.geometryCoatTangentTexture = value;\r\n if (value) {\r\n this._material._useCoatRoughnessAnisotropyFromTangentTexture = true;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the coat tangent texture for anisotropy.\r\n * TODO: Implementation pending OpenPBR coat anisotropy feature availability.\r\n * @returns Currently returns null as coat anisotropy is not yet available\r\n */\r\n public get geometryCoatTangentTexture(): Nullable<BaseTexture> {\r\n return this._material.geometryCoatTangentTexture;\r\n }\r\n\r\n // ========================================\r\n // TRANSMISSION LAYER\r\n // ========================================\r\n\r\n /**\r\n * Configures transmission for OpenPBR material.\r\n */\r\n public configureTransmission(): void {\r\n // Material is thin-walled until otherwise specified by the glTF volume extension.\r\n this._material.geometryThinWalled = 1.0;\r\n this._material.transmissionDepth = 0.0;\r\n }\r\n\r\n /**\r\n * Sets the transmission weight.\r\n * @param value The transmission weight value (0-1)\r\n */\r\n public set transmissionWeight(value: number) {\r\n this._material.transmissionWeight = value;\r\n }\r\n\r\n /**\r\n * Sets the transmission weight texture.\r\n * @param value The transmission weight texture or null\r\n */\r\n public set transmissionWeightTexture(value: Nullable<BaseTexture>) {\r\n this._material.transmissionWeightTexture = value;\r\n }\r\n\r\n public get transmissionWeightTexture(): Nullable<BaseTexture> {\r\n return this._material.transmissionWeightTexture;\r\n }\r\n\r\n /**\r\n * Gets the transmission weight.\r\n * @returns Currently returns 0 as transmission is not yet available\r\n */\r\n public get transmissionWeight(): number {\r\n return this._material.transmissionWeight;\r\n }\r\n\r\n /**\r\n * Sets the transmission scatter coefficient.\r\n * @param value The scatter coefficient as a Vector3\r\n */\r\n public set transmissionScatter(value: Color3) {\r\n this._material.transmissionScatter = value;\r\n }\r\n\r\n /**\r\n * Gets the transmission scatter coefficient.\r\n * @returns The scatter coefficient as a Vector3\r\n */\r\n public get transmissionScatter(): Color3 {\r\n return this._material.transmissionScatter;\r\n }\r\n\r\n /**\r\n * Sets the transmission scatter texture.\r\n * @param value The transmission scatter texture or null\r\n */\r\n public set transmissionScatterTexture(value: Nullable<BaseTexture>) {\r\n this._material.transmissionScatterTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the transmission scatter texture.\r\n * @returns The transmission scatter texture or null\r\n */\r\n public get transmissionScatterTexture(): Nullable<BaseTexture> {\r\n return this._material.transmissionScatterTexture;\r\n }\r\n\r\n /**\r\n * Sets the transmission scattering anisotropy.\r\n * @param value The anisotropy intensity value (-1 to 1)\r\n */\r\n public set transmissionScatterAnisotropy(value: number) {\r\n this._material.transmissionScatterAnisotropy = value;\r\n }\r\n\r\n /**\r\n * Sets the transmission dispersion Abbe number.\r\n * @param value The Abbe number value\r\n */\r\n public set transmissionDispersionAbbeNumber(value: number) {\r\n this._material.transmissionDispersionAbbeNumber = value;\r\n }\r\n\r\n /**\r\n * Sets the transmission dispersion scale.\r\n * @param value The dispersion scale value\r\n */\r\n public set transmissionDispersionScale(value: number) {\r\n this._material.transmissionDispersionScale = value;\r\n }\r\n\r\n /**\r\n * Sets the attenuation distance.\r\n * @param value The attenuation distance value\r\n */\r\n public set transmissionDepth(value: number) {\r\n // If the value is being set to the default max value, and the current transmission depth is 0,\r\n // we assume that attenuation color isn't used and keep it at 0 to allow\r\n // us to use constant transmission color to handle glTF's surface tint from base color.\r\n if (value !== Number.MAX_VALUE || this._material.transmissionDepth !== 0) {\r\n this._material.transmissionDepth = value;\r\n } else {\r\n this._material.transmissionDepth = 0;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the attenuation distance.\r\n */\r\n public get transmissionDepth(): number {\r\n return this._material.transmissionDepth;\r\n }\r\n\r\n /**\r\n * Sets the attenuation color.\r\n * @param value The attenuation color as a Color3\r\n */\r\n public set transmissionColor(value: Color3) {\r\n // Only set the transmission color if it's not white (default)\r\n // This allows us to retain the base color as the transmission color,\r\n // if that was previously set.\r\n if (!value.equals(Color3.White())) {\r\n this._material.transmissionColor = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the attenuation color.\r\n */\r\n public get transmissionColor(): Color3 {\r\n return this._material.transmissionColor;\r\n }\r\n\r\n /**\r\n * Gets the refraction background texture\r\n * @returns The refraction background texture or null\r\n */\r\n public get refractionBackgroundTexture(): Nullable<BaseTexture> {\r\n return this._material.backgroundRefractionTexture;\r\n }\r\n\r\n /**\r\n * Sets the refraction background texture\r\n * @param value The refraction background texture or null\r\n */\r\n public set refractionBackgroundTexture(value: Nullable<BaseTexture>) {\r\n this._material.backgroundRefractionTexture = value;\r\n }\r\n\r\n // ========================================\r\n // VOLUME PROPERTIES\r\n // ========================================\r\n\r\n /**\r\n * Configures volume properties for OpenPBR material.\r\n */\r\n public configureVolume(): void {\r\n // If we're configuring volume, we assume the material is not thin-walled (i.e. it's volumetric).\r\n this._material.geometryThinWalled = 0.0;\r\n }\r\n\r\n /**\r\n * Sets whether the material is thin-walled (i.e. non-volumetric) or not.\r\n */\r\n public set geometryThinWalled(value: boolean) {\r\n this._material.geometryThinWalled = value ? 1.0 : 0.0;\r\n }\r\n\r\n /**\r\n * Gets whether the material is thin-walled (i.e. non-volumetric) or not.\r\n */\r\n public get geometryThinWalled(): boolean {\r\n return this._material.geometryThinWalled ? true : false;\r\n }\r\n\r\n /**\r\n * Sets the thickness texture.\r\n * @param value The thickness texture or null\r\n */\r\n public set volumeThicknessTexture(value: Nullable<BaseTexture>) {\r\n this._material.geometryThicknessTexture = value;\r\n this._material._useGeometryThicknessFromGreenChannel = true;\r\n }\r\n\r\n /**\r\n * Sets the thickness factor.\r\n * @param value The thickness value\r\n */\r\n public set volumeThickness(value: number) {\r\n this._material.geometryThickness = value;\r\n }\r\n\r\n // ========================================\r\n // SUBSURFACE PROPERTIES (Subsurface Scattering)\r\n // ========================================\r\n\r\n /**\r\n * Configures subsurface properties for PBR material\r\n */\r\n public configureSubsurface(): void {\r\n // glTF diffuse transmission is thin-walled (before volume extension is applied) will map to the subsurface slab and, without a\r\n this._material.geometryThinWalled = 1.0;\r\n this._material.subsurfaceScatterAnisotropy = 1.0;\r\n }\r\n\r\n /**\r\n * Sets the subsurface weight\r\n */\r\n public set subsurfaceWeight(value: number) {\r\n this._material.subsurfaceWeight = value;\r\n }\r\n\r\n public get subsurfaceWeight(): number {\r\n return this._material.subsurfaceWeight;\r\n }\r\n\r\n /**\r\n * Sets the subsurface weight texture\r\n */\r\n public set subsurfaceWeightTexture(value: Nullable<BaseTexture>) {\r\n this._material.subsurfaceWeightTexture = value;\r\n this._material._useSubsurfaceWeightFromTextureAlpha = true;\r\n }\r\n\r\n public get subsurfaceWeightTexture(): Nullable<BaseTexture> {\r\n return this._material.subsurfaceWeightTexture;\r\n }\r\n\r\n /**\r\n * Sets the subsurface color.\r\n * @param value The subsurface tint color as a Color3\r\n */\r\n public set subsurfaceColor(value: Color3) {\r\n this._material.subsurfaceColor = value;\r\n }\r\n\r\n /**\r\n * Sets the subsurface color texture.\r\n * @param value The subsurface tint texture or null\r\n */\r\n public set subsurfaceColorTexture(value: Nullable<BaseTexture>) {\r\n this._material.subsurfaceColorTexture = value;\r\n }\r\n\r\n private _diffuseTransmissionTint: Color3 = Color3.White();\r\n private _diffuseTransmissionTintTexture: Nullable<BaseTexture> = null;\r\n\r\n /**\r\n * Sets the diffuse transmission tint of the material\r\n */\r\n public set diffuseTransmissionTint(value: Color3) {\r\n this._diffuseTransmissionTint = value;\r\n }\r\n\r\n /**\r\n * Gets the diffuse transmission tint of the material\r\n */\r\n public get diffuseTransmissionTint(): Color3 {\r\n return this._diffuseTransmissionTint;\r\n }\r\n\r\n /**\r\n * Sets the diffuse transmission tint texture of the material\r\n */\r\n public set diffuseTransmissionTintTexture(value: Nullable<BaseTexture>) {\r\n this._diffuseTransmissionTintTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the subsurface radius for subsurface scattering.\r\n * subsurfaceRadiusScale * subsurfaceRadius gives the mean free path per color channel.\r\n */\r\n public get subsurfaceRadius(): number {\r\n return this._material.subsurfaceRadius;\r\n }\r\n\r\n /**\r\n * Sets the subsurface radius for subsurface scattering.\r\n * subsurfaceRadiusScale * subsurfaceRadius gives the mean free path per color channel.\r\n * @param value The subsurface radius value\r\n */\r\n public set subsurfaceRadius(value: number) {\r\n this._material.subsurfaceRadius = value;\r\n }\r\n\r\n /**\r\n * Gets the subsurface radius scale for subsurface scattering.\r\n * subsurfaceRadiusScale * subsurfaceRadius gives the mean free path per color channel.\r\n */\r\n public get subsurfaceRadiusScale(): Color3 {\r\n return this._material.subsurfaceRadiusScale;\r\n }\r\n\r\n /**\r\n * Sets the subsurface radius scale for subsurface scattering.\r\n * subsurfaceRadiusScale * subsurfaceRadius gives the mean free path per color channel.\r\n * @param value The subsurface radius scale as a Color3\r\n */\r\n public set subsurfaceRadiusScale(value: Color3) {\r\n this._material.subsurfaceRadiusScale = value;\r\n }\r\n\r\n /**\r\n * Sets the subsurface scattering anisotropy.\r\n * @param value The anisotropy intensity value\r\n */\r\n public set subsurfaceScatterAnisotropy(value: number) {\r\n this._material.subsurfaceScatterAnisotropy = value;\r\n }\r\n\r\n /**\r\n * Does this material have a translucent surface (i.e. either transmission or subsurface)?\r\n * @returns True if the material is translucent, false otherwise\r\n */\r\n public isTranslucent(): boolean {\r\n return this.transmissionWeight > 0 || this.subsurfaceWeight > 0;\r\n }\r\n\r\n // ========================================\r\n // FUZZ LAYER (Sheen)\r\n // ========================================\r\n\r\n /**\r\n * Configures fuzz for OpenPBR.\r\n * Enables fuzz and sets up proper configuration.\r\n */\r\n public configureFuzz(): void {\r\n // Currently no setup to do for OpenPBR\r\n }\r\n\r\n /**\r\n * Sets the fuzz weight.\r\n * @param value The fuzz weight value\r\n */\r\n public set fuzzWeight(value: number) {\r\n this._material.fuzzWeight = value;\r\n }\r\n\r\n /**\r\n * Sets the fuzz weight texture.\r\n * @param value The fuzz weight texture or null\r\n */\r\n public set fuzzWeightTexture(value: Nullable<BaseTexture>) {\r\n this._material.fuzzWeightTexture = value;\r\n }\r\n\r\n /**\r\n * Sets the fuzz color.\r\n * @param value The fuzz color as a Color3\r\n */\r\n public set fuzzColor(value: Color3) {\r\n this._material.fuzzColor = value;\r\n }\r\n\r\n /**\r\n * Sets the fuzz color texture.\r\n * @param value The fuzz color texture or null\r\n */\r\n public set fuzzColorTexture(value: Nullable<BaseTexture>) {\r\n this._material.fuzzColorTexture = value;\r\n }\r\n\r\n /**\r\n * Sets the fuzz roughness.\r\n * @param value The fuzz roughness value (0-1)\r\n */\r\n public set fuzzRoughness(value: number) {\r\n this._material.fuzzRoughness = value;\r\n }\r\n\r\n /**\r\n * Sets the fuzz roughness texture.\r\n * @param value The fuzz roughness texture or null\r\n */\r\n public set fuzzRoughnessTexture(value: Nullable<BaseTexture>) {\r\n this._material.fuzzRoughnessTexture = value;\r\n this._material._useFuzzRoughnessFromTextureAlpha = true;\r\n }\r\n\r\n // ========================================\r\n // ANISOTROPY\r\n // ========================================\r\n\r\n /**\r\n * Sets the specular roughness anisotropy of the OpenPBR material.\r\n * @param value The anisotropy intensity value\r\n */\r\n public set specularRoughnessAnisotropy(value: number) {\r\n this._material.specularRoughnessAnisotropy = value;\r\n }\r\n\r\n /**\r\n * Gets the specular roughness anisotropy of the OpenPBR material.\r\n * @returns The anisotropy intensity value\r\n */\r\n public get specularRoughnessAnisotropy(): number {\r\n return this._material.specularRoughnessAnisotropy;\r\n }\r\n\r\n /**\r\n * Sets the anisotropy rotation angle.\r\n * @param value The anisotropy rotation angle in radians\r\n */\r\n public set geometryTangentAngle(value: number) {\r\n this._material.geometryTangentAngle = value;\r\n }\r\n\r\n /**\r\n * Sets the geometry tangent texture for anisotropy.\r\n * Automatically enables using anisotropy from the tangent texture.\r\n * @param value The anisotropy texture or null\r\n */\r\n public set geometryTangentTexture(value: Nullable<BaseTexture>) {\r\n this._material.geometryTangentTexture = value;\r\n this._material._useSpecularRoughnessAnisotropyFromTangentTexture = true;\r\n }\r\n\r\n /**\r\n * Gets the geometry tangent texture for anisotropy.\r\n * @returns The anisotropy texture or null\r\n */\r\n public get geometryTangentTexture(): Nullable<BaseTexture> {\r\n return this._material.geometryTangentTexture;\r\n }\r\n\r\n /**\r\n * Configures glTF-style anisotropy for the OpenPBR material.\r\n * @param useGltfStyle Whether to use glTF-style anisotropy\r\n */\r\n public configureGltfStyleAnisotropy(useGltfStyle: boolean = true): void {\r\n this._material._useGltfStyleAnisotropy = useGltfStyle;\r\n }\r\n\r\n // ========================================\r\n // THIN FILM IRIDESCENCE\r\n // ========================================\r\n\r\n /**\r\n * Sets the thin film weight.\r\n * @param value The thin film weight value\r\n */\r\n public set thinFilmWeight(value: number) {\r\n this._material.thinFilmWeight = value;\r\n }\r\n\r\n /**\r\n * Sets the thin film IOR.\r\n * @param value The thin film IOR value\r\n */\r\n public set thinFilmIor(value: number) {\r\n this._material.thinFilmIor = value;\r\n }\r\n\r\n /**\r\n * Sets the thin film thickness minimum.\r\n * @param value The minimum thickness value in nanometers\r\n */\r\n public set thinFilmThicknessMinimum(value: number) {\r\n this._material.thinFilmThicknessMin = value / 1000.0; // Convert to micrometers for OpenPBR\r\n }\r\n\r\n /**\r\n * Sets the thin film thickness maximum.\r\n * @param value The maximum thickness value in nanometers\r\n */\r\n public set thinFilmThicknessMaximum(value: number) {\r\n this._material.thinFilmThickness = value / 1000.0; // Convert to micrometers for OpenPBR\r\n }\r\n\r\n /**\r\n * Sets the thin film weight texture.\r\n * @param value The thin film weight texture or null\r\n */\r\n public set thinFilmWeightTexture(value: Nullable<BaseTexture>) {\r\n this._material.thinFilmWeightTexture = value;\r\n }\r\n\r\n /**\r\n * Sets the thin film thickness texture.\r\n * @param value The thin film thickness texture or null\r\n */\r\n public set thinFilmThicknessTexture(value: Nullable<BaseTexture>) {\r\n this._material.thinFilmThicknessTexture = value;\r\n this._material._useThinFilmThicknessFromTextureGreen = true;\r\n }\r\n\r\n // ========================================\r\n // UNLIT MATERIALS\r\n // ========================================\r\n\r\n /**\r\n * Sets whether the OpenPBR material is unlit.\r\n * @param value True to make the material unlit\r\n */\r\n public set unlit(value: boolean) {\r\n this._material.unlit = value;\r\n }\r\n\r\n // ========================================\r\n // GEOMETRY PARAMETERS\r\n // ========================================\r\n\r\n /**\r\n * Sets the geometry opacity of the OpenPBR material.\r\n * @param value The opacity value (0-1)\r\n */\r\n public set geometryOpacity(value: number) {\r\n this._material.geometryOpacity = value;\r\n }\r\n\r\n /**\r\n * Gets the geometry opacity of the OpenPBR material.\r\n * @returns The opacity value (0-1)\r\n */\r\n public get geometryOpacity(): number {\r\n return this._material.geometryOpacity;\r\n }\r\n\r\n /**\r\n * Sets the geometry normal texture of the OpenPBR material.\r\n * @param value The normal texture or null\r\n */\r\n public set geometryNormalTexture(value: Nullable<BaseTexture>) {\r\n this._material.geometryNormalTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the geometry normal texture of the OpenPBR material.\r\n * @returns The normal texture or null\r\n */\r\n public get geometryNormalTexture(): Nullable<BaseTexture> {\r\n return this._material.geometryNormalTexture;\r\n }\r\n\r\n /**\r\n * Sets the normal map inversions for the OpenPBR material.\r\n * Note: OpenPBR may handle normal map inversions differently or may not need them.\r\n * @param invertX Whether to invert the normal map on the X axis (may be ignored)\r\n * @param invertY Whether to invert the normal map on the Y axis (may be ignored)\r\n */\r\n public setNormalMapInversions(invertX: boolean, invertY: boolean): void {\r\n // OpenPBR handles normal map inversions differently or may not need them\r\n }\r\n\r\n /**\r\n * Sets the geometry coat normal texture of the OpenPBR material.\r\n * @param value The coat normal texture or null\r\n */\r\n public set geometryCoatNormalTexture(value: Nullable<BaseTexture>) {\r\n this._material.geometryCoatNormalTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the geometry coat normal texture of the OpenPBR material.\r\n * @returns The coat normal texture or null\r\n */\r\n public get geometryCoatNormalTexture(): Nullable<BaseTexture> {\r\n return this._material.geometryCoatNormalTexture;\r\n }\r\n\r\n /**\r\n * Sets the geometry coat normal texture scale.\r\n * @param value The scale value for the coat normal texture\r\n */\r\n public set geometryCoatNormalTextureScale(value: number) {\r\n if (this._material.geometryCoatNormalTexture) {\r\n this._material.geometryCoatNormalTexture.level = value;\r\n }\r\n }\r\n\r\n /**\r\n * Finalizes material properties after all loading is complete.\r\n * @param signal An AbortSignal that fires when the loader is disposed. Intermediate\r\n * textures are disposed and the method returns early when aborted.\r\n */\r\n public async finalizeAsync(signal: AbortSignal): Promise<void> {\r\n // Do final configuration for the material to handle any interactions/dependencies between properties that we had to defer until all properties were loaded.\r\n\r\n // If the material is volumetric, we may need to create a coat layer to handle the surface tint.\r\n if ((this._diffuseTransmissionTint && !this._diffuseTransmissionTint.equals(Color3.White())) || this._diffuseTransmissionTintTexture) {\r\n if (this._material.geometryThinWalled) {\r\n // Use the subsurface slab for surface tinting.\r\n this.subsurfaceColor = this._diffuseTransmissionTint;\r\n this.subsurfaceColorTexture = this._diffuseTransmissionTintTexture;\r\n } else {\r\n // Otherwise, we have volumetric attenuation so we need to use the coat layer to preserve the base color tinting of glTF.\r\n await this.copySurfaceToCoatAsync(\r\n this.subsurfaceWeight,\r\n this.subsurfaceWeightTexture,\r\n TextureChannel.A,\r\n this._diffuseTransmissionTint,\r\n this._diffuseTransmissionTintTexture,\r\n true,\r\n signal\r\n );\r\n if (signal.aborted) {\r\n return;\r\n }\r\n }\r\n }\r\n // If the material has transmission, we need to use the base color to tint the transmission.\r\n if (this.transmissionWeight > 0) {\r\n if (this._material.geometryThinWalled || this._material.transmissionDepth === 0) {\r\n // If the material is thin-walled or has no attenuation depth, we can use the base color as the transmission color directly.\r\n this._material.transmissionColor = this._material.baseColor;\r\n this._material.transmissionColorTexture = this._material.baseColorTexture;\r\n } else if (!this.baseColor.equals(Color3.White()) || this.baseColorTexture !== null) {\r\n // Otherwise, we have volumetric attenuation so we need to use the coat layer to preserve the base color tinting of glTF.\r\n await this.copySurfaceToCoatAsync(this.transmissionWeight, this.transmissionWeightTexture, TextureChannel.R, this.baseColor, this.baseColorTexture, false, signal);\r\n if (signal.aborted) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if (this._specWorkflow) {\r\n // To convert from spec-gloss to OpenPBR, we'll grab the specular color's alpha channel (which contains glossiness) and\r\n // invert it to get roughness.\r\n const newRoughnessTexture = await InvertTextureAsync(\r\n \"newRoughnessTexture (\" + this._material.name + \")\",\r\n await ExtractChannelAsync(\r\n \"glossiness (\" + this._material.name + \")\",\r\n CreateTextureWithFactorOperand(\r\n this.specularColorTexture,\r\n new Color4(this.specularColor.r, this.specularColor.g, this.specularColor.b, this.glossiness),\r\n TextureChannel.A,\r\n TextureColorSpace.Linear\r\n ),\r\n TextureChannel.A,\r\n this._material.getScene(),\r\n TextureColorSpace.Linear,\r\n ChannelMask.R\r\n ),\r\n this._material.getScene(),\r\n ChannelMask.R,\r\n TextureColorSpace.Linear,\r\n ChannelMask.R\r\n );\r\n if (signal.aborted) {\r\n newRoughnessTexture.texture?.dispose();\r\n return;\r\n }\r\n this.specularRoughnessTexture = newRoughnessTexture.texture;\r\n this.specularRoughness = newRoughnessTexture.factor ? newRoughnessTexture.factor.r : 1.0;\r\n\r\n // Metallic = max(linearize(specular).rgb). The specular texture is sRGB so we must\r\n // linearize it first (TextureColorSpace.SRGB). The factor is already linear per convention.\r\n // We store metallic as linear (no outputColorSpace) because it is a data/scalar value;\r\n // encoding it as sRGB would corrupt it when it is used as the lerp t below.\r\n const newMetallic = await ExtractMaxChannelAsync(\r\n \"metallicTexture (\" + this._material.name + \")\",\r\n CreateTextureWithFactorOperand(this.specularColorTexture, this.specularColor.toColor4(), TextureChannel.RGBA, TextureColorSpace.Linear),\r\n this._material.getScene(),\r\n false,\r\n TextureColorSpace.SRGB,\r\n ChannelMask.RGB\r\n );\r\n if (signal.aborted) {\r\n newMetallic.texture?.dispose();\r\n return;\r\n }\r\n this.baseMetalnessTexture = newMetallic.texture;\r\n this.baseMetalness = newMetallic.factor ? newMetallic.factor.r : 1.0;\r\n\r\n // base_color = lerp(diffuse, specular, metallic).\r\n // Strip dispose before passing newMetallic as t — its texture is already owned by the\r\n // material (baseMetalnessTexture) and must not be released after the lerp pass.\r\n const newBaseColor = await LerpTexturesAsync(\r\n \"newBaseColor (\" + this._material.name + \")\",\r\n CreateTextureWithFactorOperand(this.baseColorTexture, this.baseColor.toColor4(), TextureChannel.RGBA, TextureColorSpace.Linear),\r\n CreateTextureWithFactorOperand(this.specularColorTexture, this.specularColor.toColor4(), TextureChannel.RGBA, TextureColorSpace.Linear),\r\n { ...newMetallic, dispose: undefined, colorSpace: TextureColorSpace.Linear },\r\n this._material.getScene(),\r\n TextureColorSpace.SRGB,\r\n ChannelMask.RGB\r\n );\r\n if (signal.aborted) {\r\n newBaseColor.texture?.dispose();\r\n return;\r\n }\r\n const oldBaseColorTexture = this.baseColorTexture;\r\n oldBaseColorTexture?.dispose();\r\n this.baseColorTexture = newBaseColor.texture;\r\n this.baseColor = newBaseColor.factor ? new Color3(newBaseColor.factor.r, newBaseColor.factor.g, newBaseColor.factor.b) : Color3.White();\r\n\r\n const oldSpecularColorTexture = this.specularColorTexture;\r\n oldSpecularColorTexture?.dispose();\r\n this.specularColorTexture = null;\r\n }\r\n }\r\n\r\n private async copySurfaceToCoatAsync(\r\n weight: number,\r\n weightTexture: Nullable<BaseTexture>,\r\n weightTextureChannel: TextureChannel,\r\n color: Color3,\r\n colorTexture: Nullable<BaseTexture>,\r\n diffuseTransmission: boolean = false,\r\n signal: AbortSignal = new AbortController().signal\r\n ): Promise<void> {\r\n // Blend coat properties using:\r\n // New coat will cover all areas that previously had coat or transmission.\r\n // new_coat_weight = max(weight, existing_coat_weight)\r\n // New coat color is the multiplication of the base color tint and the existing coat tint, each blended by their respective weights:\r\n // new_coat_color = lerp(white, existing_coat_color, existing_coat_weight)\r\n // * lerp(white, color, weight)\r\n // Snapshot the original coat properties before mutating them, so both lerps\r\n // use the pre-merge values (the first lerp blends the *existing* coat color\r\n // by the *existing* coat weight; we must not use the merged weight here).\r\n const origCoatWeight = this._material.coatWeight;\r\n const origCoatWeightTexture = this._material.coatWeightTexture;\r\n const origCoatColor = this._material.coatColor.clone();\r\n const origCoatColorTexture = this._material.coatColorTexture;\r\n const origCoatNormalTexture = this._material.geometryCoatNormalTexture;\r\n\r\n const origCoatWeightCol4 = new Color4(origCoatWeight, origCoatWeight, origCoatWeight, origCoatWeight);\r\n const weightCol4 = new Color4(weight, weight, weight, weight);\r\n\r\n this.coatWeightTexture = null;\r\n this.coatWeight = 1.0;\r\n\r\n const results = await Promise.allSettled([\r\n LerpTexturesAsync(\r\n \"lerpExistingCoat\",\r\n CreateTextureWithFactorOperand(null, new Color4(1, 1, 1, 1)),\r\n CreateTextureWithFactorOperand(origCoatColorTexture, origCoatColor.toColor4(), TextureChannel.RGBA, TextureColorSpace.SRGB),\r\n CreateTextureWithFactorOperand(origCoatWeightTexture, origCoatWeightCol4, TextureChannel.R),\r\n this._material.getScene(),\r\n TextureColorSpace.SRGB\r\n ),\r\n LerpTexturesAsync(\r\n \"lerpSurfaceColor\",\r\n CreateTextureWithFactorOperand(null, new Color4(1, 1, 1, 1)),\r\n CreateTextureWithFactorOperand(colorTexture, color.toColor4(), TextureChannel.RGBA, TextureColorSpace.SRGB),\r\n CreateTextureWithFactorOperand(weightTexture, weightCol4, weightTextureChannel),\r\n this._material.getScene(),\r\n TextureColorSpace.SRGB\r\n ),\r\n ]);\r\n const rejected = results.find((r) => r.status === \"rejected\") as PromiseRejectedResult | undefined;\r\n if (rejected) {\r\n for (const r of results) {\r\n if (r.status === \"fulfilled\") {\r\n r.value.texture?.dispose();\r\n }\r\n }\r\n throw rejected.reason;\r\n }\r\n const [lerpCoatColor, lerpSurfaceColor] = results.map(\r\n (r) => (r as PromiseFulfilledResult<(typeof results)[number] extends PromiseSettledResult<infer T> ? T : never>).value\r\n );\r\n if (signal.aborted) {\r\n lerpCoatColor.texture?.dispose();\r\n lerpSurfaceColor.texture?.dispose();\r\n return;\r\n }\r\n\r\n const newCoatColor = await MultiplyTexturesAsync(\r\n \"newCoatColor (\" + this._material.name + \")\",\r\n lerpCoatColor,\r\n lerpSurfaceColor,\r\n this._material.getScene(),\r\n TextureColorSpace.SRGB\r\n );\r\n if (signal.aborted) {\r\n newCoatColor.texture?.dispose();\r\n return;\r\n }\r\n\r\n if (newCoatColor.texture) {\r\n this.coatColorTexture = newCoatColor.texture;\r\n this.coatColor = Color3.White();\r\n } else if (newCoatColor.factor) {\r\n this.coatColorTexture = null;\r\n this.coatColor.fromArray([newCoatColor.factor.r, newCoatColor.factor.g, newCoatColor.factor.b]);\r\n }\r\n\r\n const newCoatIor = await LerpTexturesAsync(\r\n \"newCoatIor (\" + this._material.name + \")\",\r\n CreateTextureWithFactorOperand(null, new Color4(this._material.specularIor, this._material.specularIor, this._material.specularIor, 1.0), TextureChannel.R),\r\n CreateTextureWithFactorOperand(null, new Color4(this.coatIor, this.coatIor, this.coatIor, 1.0), TextureChannel.R),\r\n CreateTextureWithFactorOperand(origCoatWeightTexture, origCoatWeightCol4, TextureChannel.R),\r\n this._material.getScene()\r\n );\r\n if (signal.aborted) {\r\n newCoatIor.texture?.dispose();\r\n return;\r\n }\r\n this.coatIor = newCoatIor.factor ? newCoatIor.factor.r : this.coatIor;\r\n\r\n const newCoatRoughness = await LerpTexturesAsync(\r\n \"newCoatRoughness (\" + this._material.name + \")\",\r\n CreateTextureWithFactorOperand(\r\n this.specularRoughnessTexture,\r\n new Color4(this.specularRoughness, this.specularRoughness, this.specularRoughness, 1.0),\r\n TextureChannel.G\r\n ),\r\n CreateTextureWithFactorOperand(this.coatRoughnessTexture, new Color4(this.coatRoughness, this.coatRoughness, this.coatRoughness, 1.0), TextureChannel.G),\r\n CreateTextureWithFactorOperand(origCoatWeightTexture, origCoatWeightCol4, TextureChannel.R),\r\n this._material.getScene()\r\n );\r\n if (signal.aborted) {\r\n newCoatRoughness.texture?.dispose();\r\n return;\r\n }\r\n this.coatRoughness = newCoatRoughness.factor ? newCoatRoughness.factor.r : 1.0;\r\n this.coatRoughnessTexture = newCoatRoughness.texture;\r\n\r\n const newCoatDarkening = await LerpTexturesAsync(\r\n \"newCoatDarkening (\" + this._material.name + \")\",\r\n CreateTextureWithFactorOperand(null, new Color4(0, 0, 0, 1.0), TextureChannel.R),\r\n CreateTextureWithFactorOperand(null, new Color4(this.coatDarkening, this.coatDarkening, this.coatDarkening, 1.0), TextureChannel.R),\r\n CreateTextureWithFactorOperand(origCoatWeightTexture, origCoatWeightCol4, TextureChannel.R),\r\n this._material.getScene()\r\n );\r\n if (signal.aborted) {\r\n newCoatDarkening.texture?.dispose();\r\n return;\r\n }\r\n this.coatDarkening = newCoatDarkening.factor ? newCoatDarkening.factor.r : this.coatDarkening;\r\n\r\n if (diffuseTransmission) {\r\n const newSpecularRoughness = await LerpTexturesAsync(\r\n \"newSpecularRoughness (\" + this._material.name + \")\",\r\n CreateTextureWithFactorOperand(\r\n this.specularRoughnessTexture,\r\n new Color4(this._material.specularRoughness, this._material.specularRoughness, this._material.specularRoughness, 1.0),\r\n TextureChannel.G\r\n ),\r\n CreateTextureWithFactorOperand(null, new Color4(1, 1, 1, 1.0), TextureChannel.R),\r\n CreateTextureWithFactorOperand(weightTexture, weightCol4, weightTextureChannel),\r\n this._material.getScene()\r\n );\r\n if (signal.aborted) {\r\n newSpecularRoughness.texture?.dispose();\r\n return;\r\n }\r\n this.specularRoughness = newSpecularRoughness.factor ? newSpecularRoughness.factor.r : 1.0;\r\n this.specularRoughnessTexture = newSpecularRoughness.texture;\r\n }\r\n\r\n if (origCoatNormalTexture || this.geometryNormalTexture) {\r\n const newCoatNormal = await LerpTexturesAsync(\r\n \"newCoatNormal (\" + this._material.name + \")\",\r\n CreateTextureWithFactorOperand(\r\n this.geometryNormalTexture,\r\n this.geometryNormalTexture ? new Color4(1, 1, 1, 1) : new Color4(0.5, 0.5, 1.0, 1.0),\r\n TextureChannel.RGBA\r\n ),\r\n CreateTextureWithFactorOperand(origCoatNormalTexture, origCoatNormalTexture ? new Color4(1, 1, 1, 1) : new Color4(0.5, 0.5, 1.0, 1.0), TextureChannel.RGBA),\r\n CreateTextureWithFactorOperand(origCoatWeightTexture, origCoatWeightCol4, TextureChannel.R),\r\n this._material.getScene()\r\n );\r\n if (signal.aborted) {\r\n newCoatNormal.texture?.dispose();\r\n return;\r\n }\r\n if (newCoatNormal.texture) {\r\n this.geometryCoatNormalTexture = newCoatNormal.texture;\r\n }\r\n }\r\n }\r\n}\r\n","import { type PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { type IMaterialLoadingAdapter } from \"./materialLoadingAdapter\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\n\r\n/**\r\n * Material Loading Adapter for PBR materials that provides a unified OpenPBR-like interface.\r\n */\r\nexport class PBRMaterialLoadingAdapter implements IMaterialLoadingAdapter {\r\n private _material: PBRMaterial;\r\n private _specWorkflow: boolean = false;\r\n /**\r\n * Creates a new instance of the PBRMaterialLoadingAdapter.\r\n * @param material - The PBR material to adapt.\r\n */\r\n constructor(material: Material) {\r\n this._material = material as PBRMaterial;\r\n this._material.enableSpecularAntiAliasing = true;\r\n }\r\n\r\n /**\r\n * Gets the underlying material\r\n */\r\n public get material(): PBRMaterial {\r\n return this._material;\r\n }\r\n\r\n /**\r\n * Whether the material should be treated as unlit\r\n */\r\n public get isUnlit(): boolean {\r\n return this._material.unlit;\r\n }\r\n\r\n /**\r\n * Sets whether the material should be treated as unlit\r\n */\r\n public set isUnlit(value: boolean) {\r\n this._material.unlit = value;\r\n }\r\n\r\n // ========================================\r\n // CULLING PROPERTIES\r\n // ========================================\r\n\r\n /**\r\n * Sets whether back face culling is enabled.\r\n * @param value True to enable back face culling\r\n */\r\n public set backFaceCulling(value: boolean) {\r\n this._material.backFaceCulling = value;\r\n }\r\n\r\n /**\r\n * Gets whether back face culling is enabled.\r\n * @returns True if back face culling is enabled\r\n */\r\n public get backFaceCulling(): boolean {\r\n return this._material.backFaceCulling;\r\n }\r\n\r\n /**\r\n * Sets whether two-sided lighting is enabled.\r\n * @param value True to enable two-sided lighting\r\n */\r\n public set twoSidedLighting(value: boolean) {\r\n this._material.twoSidedLighting = value;\r\n }\r\n\r\n /**\r\n * Gets whether two-sided lighting is enabled.\r\n * @returns True if two-sided lighting is enabled\r\n */\r\n public get twoSidedLighting(): boolean {\r\n return this._material.twoSidedLighting;\r\n }\r\n\r\n // ========================================\r\n // ALPHA PROPERTIES\r\n // ========================================\r\n\r\n /**\r\n * Sets the alpha cutoff value for alpha testing.\r\n * @param value The alpha cutoff threshold (0-1)\r\n */\r\n public set alphaCutOff(value: number) {\r\n this._material.alphaCutOff = value;\r\n }\r\n\r\n /**\r\n * Gets the alpha cutoff value.\r\n * @returns The alpha cutoff threshold (0-1)\r\n */\r\n public get alphaCutOff(): number {\r\n return this._material.alphaCutOff;\r\n }\r\n\r\n /**\r\n * Sets whether to use alpha from the albedo texture.\r\n * @param value True to use alpha from albedo texture\r\n */\r\n public set useAlphaFromBaseColorTexture(value: boolean) {\r\n this._material.useAlphaFromAlbedoTexture = value;\r\n }\r\n\r\n /**\r\n * Gets whether alpha is used from the albedo texture.\r\n * @returns True if using alpha from albedo texture\r\n */\r\n public get useAlphaFromBaseColorTexture(): boolean {\r\n return this._material.useAlphaFromAlbedoTexture;\r\n }\r\n\r\n /**\r\n * Gets whether the transparency is treated as alpha coverage.\r\n */\r\n public get transparencyAsAlphaCoverage(): boolean {\r\n return this._material.useRadianceOverAlpha || this._material.useSpecularOverAlpha;\r\n }\r\n\r\n /**\r\n * Sets/Gets whether the transparency is treated as alpha coverage\r\n */\r\n public set transparencyAsAlphaCoverage(value: boolean) {\r\n this._material.useRadianceOverAlpha = !value;\r\n this._material.useSpecularOverAlpha = !value;\r\n }\r\n\r\n // ========================================\r\n // BASE PARAMETERS\r\n // ========================================\r\n\r\n /**\r\n * Sets the base color of the material (mapped to PBR albedoColor).\r\n * @param value The base color as a Color3\r\n */\r\n public set baseColor(value: Color3) {\r\n this._material.albedoColor = value;\r\n }\r\n\r\n /**\r\n * Gets the base color of the material.\r\n * @returns The base color as a Color3\r\n */\r\n public get baseColor(): Color3 {\r\n return this._material.albedoColor;\r\n }\r\n\r\n /**\r\n * Sets the base color texture of the material (mapped to PBR albedoTexture).\r\n * @param value The base color texture or null\r\n */\r\n public set baseColorTexture(value: Nullable<BaseTexture>) {\r\n this._material.albedoTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the base color texture of the material.\r\n * @returns The base color texture or null\r\n */\r\n public get baseColorTexture(): Nullable<BaseTexture> {\r\n return this._material.albedoTexture;\r\n }\r\n\r\n /**\r\n * Sets the base diffuse roughness of the material.\r\n * @param value The diffuse roughness value (0-1)\r\n */\r\n public set baseDiffuseRoughness(value: number) {\r\n this._material.baseDiffuseRoughness = value;\r\n if (value > 0) {\r\n this._material.brdf.baseDiffuseModel = Constants.MATERIAL_DIFFUSE_MODEL_E_OREN_NAYAR;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the base diffuse roughness of the material.\r\n * @returns The diffuse roughness value (0-1), defaults to 0 if not set\r\n */\r\n public get baseDiffuseRoughness(): number {\r\n return this._material.baseDiffuseRoughness ?? 0;\r\n }\r\n\r\n /**\r\n * Sets the base diffuse roughness texture of the material.\r\n * @param value The diffuse roughness texture or null\r\n */\r\n public set baseDiffuseRoughnessTexture(value: Nullable<BaseTexture>) {\r\n this._material.baseDiffuseRoughnessTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the base diffuse roughness texture of the material.\r\n * @returns The diffuse roughness texture or null\r\n */\r\n public get baseDiffuseRoughnessTexture(): Nullable<BaseTexture> {\r\n return this._material.baseDiffuseRoughnessTexture;\r\n }\r\n\r\n /**\r\n * Sets the base metalness value of the material (mapped to PBR metallic).\r\n * @param value The metalness value (0-1)\r\n */\r\n public set baseMetalness(value: number) {\r\n this._material.metallic = value;\r\n }\r\n\r\n /**\r\n * Gets the base metalness value of the material.\r\n * @returns The metalness value (0-1), defaults to 1 if not set\r\n */\r\n public get baseMetalness(): number {\r\n return this._material.metallic ?? 1;\r\n }\r\n\r\n /**\r\n * Sets the base metalness texture of the material (mapped to PBR metallicTexture).\r\n * @param value The metalness texture or null\r\n */\r\n public set baseMetalnessTexture(value: Nullable<BaseTexture>) {\r\n this._material.metallicTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the base metalness texture of the material.\r\n * @returns The metalness texture or null\r\n */\r\n public get baseMetalnessTexture(): Nullable<BaseTexture> {\r\n return this._material.metallicTexture;\r\n }\r\n\r\n /**\r\n * Sets whether to use roughness from the metallic texture's green channel.\r\n * Also disables using roughness from the alpha channel when enabled.\r\n * @param value True to use green channel for roughness\r\n */\r\n public set useRoughnessFromMetallicTextureGreen(value: boolean) {\r\n this._material.useRoughnessFromMetallicTextureGreen = value;\r\n this._material.useRoughnessFromMetallicTextureAlpha = !value;\r\n }\r\n\r\n /**\r\n * Sets whether to use metalness from the metallic texture's blue channel.\r\n * @param value True to use blue channel for metalness\r\n */\r\n public set useMetallicFromMetallicTextureBlue(value: boolean) {\r\n this._material.useMetallnessFromMetallicTextureBlue = value;\r\n }\r\n\r\n // ========================================\r\n // SPECULAR PARAMETERS\r\n // ========================================\r\n\r\n /**\r\n * Configures specular properties and optionally enables OpenPBR BRDF model for edge color support.\r\n * @param enableEdgeColor Whether to enable OpenPBR BRDF models for edge color support\r\n */\r\n public enableSpecularEdgeColor(enableEdgeColor: boolean = false): void {\r\n if (enableEdgeColor) {\r\n this._material.brdf.dielectricSpecularModel = Constants.MATERIAL_DIELECTRIC_SPECULAR_MODEL_OPENPBR;\r\n this._material.brdf.conductorSpecularModel = Constants.MATERIAL_CONDUCTOR_SPECULAR_MODEL_OPENPBR;\r\n }\r\n }\r\n\r\n /**\r\n * Enable the specular/glossiness workflow and disable metallic/roughness.\r\n */\r\n public configureSpecularGlossiness(): void {\r\n this._specWorkflow = true;\r\n this._material.metallic = null;\r\n this._material.roughness = null;\r\n this._material.useMicroSurfaceFromReflectivityMapAlpha = true;\r\n }\r\n\r\n /**\r\n * Sets the specular weight (mapped to PBR metallicF0Factor).\r\n * @param value The specular weight value\r\n */\r\n public set specularWeight(value: number) {\r\n this._material.metallicF0Factor = value;\r\n }\r\n\r\n /**\r\n * Gets the specular weight.\r\n * @returns The specular weight value, defaults to 1 if not set\r\n */\r\n public get specularWeight(): number {\r\n return this._material.metallicF0Factor ?? 1;\r\n }\r\n\r\n /**\r\n * Sets the specular weight texture (mapped to PBR metallicReflectanceTexture).\r\n * Configures the material to use only metalness from this texture when set.\r\n * @param value The specular weight texture or null\r\n */\r\n public set specularWeightTexture(value: Nullable<BaseTexture>) {\r\n if (value) {\r\n this._material.metallicReflectanceTexture = value;\r\n this._material.useOnlyMetallicFromMetallicReflectanceTexture = true;\r\n } else {\r\n this._material.metallicReflectanceTexture = null;\r\n this._material.useOnlyMetallicFromMetallicReflectanceTexture = false;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the specular weight texture.\r\n * @returns The specular weight texture or null\r\n */\r\n public get specularWeightTexture(): Nullable<BaseTexture> {\r\n return this._material.metallicReflectanceTexture;\r\n }\r\n\r\n /**\r\n * Sets the specular color (mapped to PBR metallicReflectanceColor).\r\n * @param value The specular color as a Color3\r\n */\r\n public set specularColor(value: Color3) {\r\n if (this._specWorkflow) {\r\n this._material.reflectivityColor = value;\r\n } else {\r\n this._material.metallicReflectanceColor = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the specular color.\r\n * @returns The specular color as a Color3\r\n */\r\n public get specularColor(): Color3 {\r\n if (this._specWorkflow) {\r\n return this._material.reflectivityColor;\r\n } else {\r\n return this._material.metallicReflectanceColor;\r\n }\r\n }\r\n\r\n /**\r\n * Sets the specular color texture (mapped to PBR reflectanceTexture).\r\n * @param value The specular color texture or null\r\n */\r\n public set specularColorTexture(value: Nullable<BaseTexture>) {\r\n if (this._specWorkflow) {\r\n this._material.reflectivityTexture = value;\r\n if (this._material.reflectivityTexture) {\r\n this._material.reflectivityTexture.hasAlpha = true;\r\n }\r\n } else {\r\n this._material.reflectanceTexture = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the specular color texture.\r\n * @returns The specular color texture or null\r\n */\r\n public get specularColorTexture(): Nullable<BaseTexture> {\r\n if (this._specWorkflow) {\r\n return this._material.reflectivityTexture;\r\n } else {\r\n return this._material.reflectanceTexture;\r\n }\r\n }\r\n\r\n /**\r\n * Sets the specular roughness (mapped to PBR roughness).\r\n * @param value The roughness value (0-1)\r\n */\r\n public set specularRoughness(value: number) {\r\n this._material.roughness = value;\r\n }\r\n\r\n /**\r\n * Gets the specular roughness.\r\n * @returns The roughness value (0-1), defaults to 1 if not set\r\n */\r\n public get specularRoughness(): number {\r\n return this._material.roughness ?? 1;\r\n }\r\n\r\n /**\r\n * Sets the specular roughness texture.\r\n * Note: PBR uses the same texture for both metallic and roughness,\r\n * so this only sets the texture if no base metalness texture exists.\r\n * @param value The roughness texture or null\r\n */\r\n public set specularRoughnessTexture(value: Nullable<BaseTexture>) {\r\n // PBR uses the same texture for both metallic and roughness\r\n if (!this.baseMetalnessTexture) {\r\n this._material.metallicTexture = value;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the specular roughness texture.\r\n * @returns The roughness texture (same as metallic texture for PBR) or null\r\n */\r\n public get specularRoughnessTexture(): Nullable<BaseTexture> {\r\n return this._material.metallicTexture;\r\n }\r\n\r\n /**\r\n * Sets the specular index of refraction (mapped to PBR indexOfRefraction).\r\n * @param value The IOR value\r\n */\r\n public set specularIor(value: number) {\r\n this._material.indexOfRefraction = value;\r\n }\r\n\r\n /**\r\n * Gets the specular index of refraction.\r\n * @returns The IOR value\r\n */\r\n public get specularIor(): number {\r\n return this._material.indexOfRefraction;\r\n }\r\n\r\n /**\r\n * Sets/gets the glossiness (inverted roughness)\r\n * ONLY used for specular/glossiness workflow; has no effect when metallic/roughness workflow is active\r\n */\r\n public get glossiness(): number {\r\n return this._material.microSurface ?? 1;\r\n }\r\n\r\n /**\r\n * Sets/gets the glossiness (inverted roughness)\r\n * ONLY used for specular/glossiness workflow; has no effect when metallic/roughness workflow is active\r\n */\r\n public set glossiness(value: number) {\r\n this._material.microSurface = value;\r\n }\r\n\r\n // ========================================\r\n // EMISSION PARAMETERS\r\n // ========================================\r\n\r\n /**\r\n * Sets the emission color (mapped to PBR emissiveColor).\r\n * @param value The emission color as a Color3\r\n */\r\n public set emissionColor(value: Color3) {\r\n this._material.emissiveColor = value;\r\n }\r\n\r\n /**\r\n * Gets the emission color.\r\n * @returns The emission color as a Color3\r\n */\r\n public get emissionColor(): Color3 {\r\n return this._material.emissiveColor;\r\n }\r\n\r\n /**\r\n * Sets the emission luminance/intensity (mapped to PBR emissiveIntensity).\r\n * @param value The emission intensity value\r\n */\r\n public set emissionLuminance(value: number) {\r\n this._material.emissiveIntensity = value;\r\n }\r\n\r\n /**\r\n * Gets the emission luminance/intensity.\r\n * @returns The emission intensity value\r\n */\r\n public get emissionLuminance(): number {\r\n return this._material.emissiveIntensity;\r\n }\r\n\r\n /**\r\n * Sets the emission color texture (mapped to PBR emissiveTexture).\r\n * @param value The emission texture or null\r\n */\r\n public set emissionColorTexture(value: Nullable<BaseTexture>) {\r\n this._material.emissiveTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the emission color texture.\r\n * @returns The emission texture or null\r\n */\r\n public get emissionColorTexture(): Nullable<BaseTexture> {\r\n return this._material.emissiveTexture;\r\n }\r\n\r\n // ========================================\r\n // AMBIENT OCCLUSION\r\n // ========================================\r\n\r\n /**\r\n * Sets the ambient occlusion texture (mapped to PBR ambientTexture).\r\n * Automatically enables grayscale mode when set.\r\n * @param value The ambient occlusion texture or null\r\n */\r\n public set ambientOcclusionTexture(value: Nullable<BaseTexture>) {\r\n this._material.ambientTexture = value;\r\n if (value) {\r\n this._material.useAmbientInGrayScale = true;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the ambient occlusion texture.\r\n * @returns The ambient occlusion texture or null\r\n */\r\n public get ambientOcclusionTexture(): Nullable<BaseTexture> {\r\n return this._material.ambientTexture;\r\n }\r\n\r\n /**\r\n * Sets the ambient occlusion texture strength.\r\n * @param value The strength value (typically 0-1)\r\n */\r\n public set ambientOcclusionTextureStrength(value: number) {\r\n this._material.ambientTextureStrength = value;\r\n }\r\n\r\n /**\r\n * Gets the ambient occlusion texture strength.\r\n * @returns The strength value, defaults to 1.0 if not set\r\n */\r\n public get ambientOcclusionTextureStrength(): number {\r\n return this._material.ambientTextureStrength ?? 1.0;\r\n }\r\n\r\n // ========================================\r\n // COAT PARAMETERS\r\n // ========================================\r\n\r\n /**\r\n * Configures clear coat for PBR material.\r\n * Enables clear coat and sets up proper configuration.\r\n */\r\n public configureCoat(): void {\r\n this._material.clearCoat.isEnabled = true;\r\n this._material.clearCoat.useRoughnessFromMainTexture = false;\r\n this._material.clearCoat.remapF0OnInterfaceChange = false;\r\n }\r\n\r\n /**\r\n * Sets the coat weight (mapped to PBR clearCoat.intensity).\r\n * Automatically enables clear coat.\r\n * @param value The coat weight value (0-1)\r\n */\r\n public set coatWeight(value: number) {\r\n this._material.clearCoat.isEnabled = true;\r\n this._material.clearCoat.intensity = value;\r\n }\r\n\r\n /**\r\n * Gets the coat weight.\r\n * @returns The coat weight value\r\n */\r\n public get coatWeight(): number {\r\n return this._material.clearCoat.intensity;\r\n }\r\n\r\n /**\r\n * Sets the coat weight texture (mapped to PBR clearCoat.texture).\r\n * Automatically enables clear coat.\r\n * @param value The coat weight texture or null\r\n */\r\n public set coatWeightTexture(value: Nullable<BaseTexture>) {\r\n this._material.clearCoat.isEnabled = true;\r\n this._material.clearCoat.texture = value;\r\n }\r\n\r\n /**\r\n * Gets the coat weight texture.\r\n * @returns The coat weight texture or null\r\n */\r\n public get coatWeightTexture(): Nullable<BaseTexture> {\r\n return this._material.clearCoat.texture;\r\n }\r\n\r\n /**\r\n * Sets the coat color (mapped to PBR clearCoat.tintColor).\r\n * @param value The coat tint color as a Color3\r\n */\r\n public set coatColor(value: Color3) {\r\n this._material.clearCoat.isTintEnabled = value != Color3.White();\r\n this._material.clearCoat.tintColor = value;\r\n }\r\n\r\n /**\r\n * Sets the coat color texture (mapped to PBR clearCoat.tintTexture).\r\n * @param value The coat color texture or null\r\n */\r\n public set coatColorTexture(value: Nullable<BaseTexture>) {\r\n this._material.clearCoat.tintTexture = value;\r\n }\r\n\r\n /**\r\n * Sets the coat roughness (mapped to PBR clearCoat.roughness).\r\n * Automatically enables clear coat.\r\n * @param value The coat roughness value (0-1)\r\n */\r\n public set coatRoughness(value: number) {\r\n this._material.clearCoat.isEnabled = true;\r\n this._material.clearCoat.roughness = value;\r\n }\r\n\r\n /**\r\n * Gets the coat roughness.\r\n * @returns The coat roughness value, defaults to 0 if not set\r\n */\r\n public get coatRoughness(): number {\r\n return this._material.clearCoat.roughness ?? 0;\r\n }\r\n\r\n /**\r\n * Sets the coat roughness texture (mapped to PBR clearCoat.textureRoughness).\r\n * Automatically enables clear coat and disables using roughness from main texture.\r\n * @param value The coat roughness texture or null\r\n */\r\n public set coatRoughnessTexture(value: Nullable<BaseTexture>) {\r\n this._material.clearCoat.isEnabled = true;\r\n this._material.clearCoat.useRoughnessFromMainTexture = false;\r\n this._material.clearCoat.textureRoughness = value;\r\n }\r\n\r\n /**\r\n * Gets the coat roughness texture.\r\n * @returns The coat roughness texture or null\r\n */\r\n public get coatRoughnessTexture(): Nullable<BaseTexture> {\r\n return this._material.clearCoat.textureRoughness;\r\n }\r\n\r\n /**\r\n * Sets the coat index of refraction (IOR).\r\n */\r\n public set coatIor(value: number) {\r\n this._material.clearCoat.indexOfRefraction = value;\r\n }\r\n\r\n /**\r\n * Sets the coat darkening value.\r\n * Note: PBR doesn't have a direct coat darkening property, so this is a no-op.\r\n * @param value The coat darkening value (ignored for PBR)\r\n */\r\n public set coatDarkening(value: number) {\r\n // PBR doesn't have a coat darkening property\r\n }\r\n\r\n /**\r\n * Sets the coat darkening texture\r\n * @param value The coat darkening texture or null\r\n */\r\n public set coatDarkeningTexture(value: Nullable<BaseTexture>) {\r\n // PBR doesn't have a coat darkening property\r\n }\r\n\r\n /**\r\n * Sets the coat roughness anisotropy.\r\n * Note: PBR clearCoat doesn't support anisotropy yet, so this is a placeholder.\r\n * @param value The coat anisotropy intensity value (currently ignored)\r\n */\r\n public set coatRoughnessAnisotropy(value: number) {\r\n // TODO: Implement when PBR clearCoat anisotropy becomes available\r\n // this._material.clearCoat.anisotropy = value;\r\n }\r\n\r\n /**\r\n * Gets the coat roughness anisotropy.\r\n * Note: PBR clearCoat doesn't support anisotropy yet, so this returns 0.\r\n * @returns Currently returns 0 as clearCoat anisotropy is not yet available\r\n */\r\n public get coatRoughnessAnisotropy(): number {\r\n // TODO: Implement when PBR clearCoat anisotropy becomes available\r\n // return this._material.clearCoat.anisotropy ?? 0;\r\n return 0;\r\n }\r\n\r\n /**\r\n * Sets the coat tangent angle for anisotropy.\r\n * Note: PBR clearCoat doesn't support anisotropy yet, so this is a placeholder.\r\n * @param value The coat anisotropy rotation angle in radians (currently ignored)\r\n */\r\n public set geometryCoatTangentAngle(value: number) {\r\n // TODO: Implement when PBR clearCoat anisotropy becomes available\r\n // this._material.clearCoat.anisotropyAngle = value;\r\n }\r\n\r\n /**\r\n * Sets the coat tangent texture for anisotropy.\r\n * Note: PBR clearCoat doesn't support anisotropy textures yet, so this is a placeholder.\r\n * @param value The coat anisotropy texture (currently ignored)\r\n */\r\n public set geometryCoatTangentTexture(value: Nullable<BaseTexture>) {\r\n // TODO: Implement when PBR clearCoat anisotropy becomes available\r\n // this._material.clearCoat.anisotropyTangentTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the coat tangent texture for anisotropy.\r\n * Note: PBR clearCoat doesn't support anisotropy textures yet, so this returns null.\r\n * @returns Currently returns null as clearCoat anisotropy is not yet available\r\n */\r\n public get geometryCoatTangentTexture(): Nullable<BaseTexture> {\r\n // TODO: Implement when PBR clearCoat anisotropy becomes available\r\n // return this._material.clearCoat.anisotropyTangentTexture;\r\n return null;\r\n }\r\n\r\n // ========================================\r\n // TRANSMISSION LAYER\r\n // ========================================\r\n\r\n /**\r\n * Sets the transmission weight (mapped to PBR subSurface.refractionIntensity).\r\n * Enables refraction when value \\> 0.\r\n * @param value The transmission weight value (0-1)\r\n */\r\n public set transmissionWeight(value: number) {\r\n this._material.subSurface.isRefractionEnabled = value > 0;\r\n this._material.subSurface.refractionIntensity = value;\r\n }\r\n\r\n /**\r\n * Gets the transmission weight.\r\n * @returns The transmission weight value\r\n */\r\n public get transmissionWeight(): number {\r\n return this._material.subSurface.isRefractionEnabled ? this._material.subSurface.refractionIntensity : 0;\r\n }\r\n\r\n /**\r\n * Sets the transmission weight texture (mapped to PBR subSurface.refractionIntensityTexture).\r\n * Automatically enables refraction and glTF-style textures.\r\n * @param value The transmission weight texture or null\r\n */\r\n public set transmissionWeightTexture(value: Nullable<BaseTexture>) {\r\n this._material.subSurface.isRefractionEnabled = true;\r\n this._material.subSurface.refractionIntensityTexture = value;\r\n this._material.subSurface.useGltfStyleTextures = true;\r\n }\r\n\r\n /**\r\n * Sets the attenuation distance for volume.\r\n * @param value The attenuation distance value\r\n */\r\n public set transmissionDepth(value: number) {\r\n if (this.transmissionWeight > 0) {\r\n this._material.subSurface.tintColorAtDistance = value;\r\n } else if (this.subsurfaceWeight > 0) {\r\n this._material.subSurface.diffusionDistance.multiplyInPlace(new Color3(value, value, value));\r\n }\r\n }\r\n\r\n /**\r\n * Gets the attenuation distance for volume.\r\n * @returns The attenuation distance value\r\n */\r\n public get transmissionDepth(): number {\r\n if (this.transmissionWeight > 0) {\r\n return this._material.subSurface.tintColorAtDistance;\r\n }\r\n return 0;\r\n }\r\n\r\n /**\r\n * Sets the attenuation color (mapped to PBR subSurface.tintColor).\r\n * @param value The attenuation color as a Color3\r\n */\r\n public set transmissionColor(value: Color3) {\r\n if (this.transmissionWeight > 0) {\r\n this._material.subSurface.tintColor = value;\r\n } else if (this.subsurfaceWeight > 0) {\r\n this._material.subSurface.diffusionDistance.multiplyInPlace(value);\r\n }\r\n }\r\n\r\n /**\r\n * Sets the attenuation color (mapped to PBR subSurface.tintColor).\r\n * @returns The attenuation color as a Color3\r\n */\r\n public get transmissionColor(): Color3 {\r\n if (this.transmissionWeight > 0) {\r\n return this._material.subSurface.tintColor;\r\n } else if (this.subsurfaceWeight > 0) {\r\n return this._material.subSurface.diffusionDistance;\r\n }\r\n return new Color3(0, 0, 0);\r\n }\r\n\r\n /**\r\n * Sets the transmission scatter coefficient.\r\n * @param value The scatter coefficient as a Color3\r\n */\r\n public set transmissionScatter(value: Color3) {\r\n // TODO convert from scatter coefficient to diffusion distance\r\n this._material.subSurface.diffusionDistance = value;\r\n }\r\n\r\n /**\r\n * Sets the transmission scatter coefficient.\r\n * @returns The scatter coefficient as a Color3\r\n */\r\n public get transmissionScatter(): Color3 {\r\n // TODO convert from diffusion distance to scatter coefficient\r\n return this._material.subSurface.diffusionDistance;\r\n }\r\n\r\n public set transmissionScatterTexture(value: Nullable<BaseTexture>) {}\r\n\r\n /**\r\n * Sets the transmission scattering anisotropy.\r\n * @param value The anisotropy intensity value (-1 to 1)\r\n */\r\n public set transmissionScatterAnisotropy(value: number) {\r\n // No direct mapping in PBRMaterial\r\n }\r\n\r\n /**\r\n * Sets the transmission dispersion Abbe number.\r\n * @param value The Abbe number value\r\n */\r\n public set transmissionDispersionAbbeNumber(value: number) {\r\n // PBRMaterial assumes a fixed Abbe number of 20.0 for dispersion calculations.\r\n }\r\n\r\n /**\r\n * Sets the transmission dispersion scale.\r\n * @param value The dispersion scale value\r\n */\r\n public set transmissionDispersionScale(value: number) {\r\n if (value > 0) {\r\n this._material.subSurface.isDispersionEnabled = true;\r\n this._material.subSurface.dispersion = 20.0 / value;\r\n } else {\r\n this._material.subSurface.isDispersionEnabled = false;\r\n this._material.subSurface.dispersion = 0;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the refraction background texture\r\n * @returns The refraction background texture or null\r\n */\r\n public get refractionBackgroundTexture(): Nullable<BaseTexture> {\r\n return this._material.subSurface.refractionTexture;\r\n }\r\n\r\n /**\r\n * Sets the refraction background texture\r\n * @param value The refraction background texture or null\r\n */\r\n public set refractionBackgroundTexture(value: Nullable<BaseTexture>) {\r\n this._material.subSurface.refractionTexture = value;\r\n }\r\n\r\n /**\r\n * Configures transmission for thin-surface transmission (KHR_materials_transmission).\r\n * Sets up the material for proper thin-surface transmission behavior.\r\n */\r\n public configureTransmission(): void {\r\n // Since this extension models thin-surface transmission only, we must make IOR = 1.0\r\n this._material.subSurface.volumeIndexOfRefraction = 1.0;\r\n // Albedo colour will tint transmission.\r\n this._material.subSurface.useAlbedoToTintRefraction = true;\r\n this._material.subSurface.minimumThickness = 0.0;\r\n this._material.subSurface.maximumThickness = 0.0;\r\n }\r\n\r\n // ========================================\r\n // VOLUME PROPERTIES\r\n // ========================================\r\n\r\n /**\r\n * Configures volume properties for PBR material. Nothing to do for PBRMaterial.\r\n */\r\n public configureVolume(): void {}\r\n\r\n /**\r\n * Sets whether the material is thin-walled (i.e. non-volumetric) or not.\r\n */\r\n public set geometryThinWalled(value: boolean) {}\r\n\r\n /**\r\n * Gets whether the material is thin-walled (i.e. non-volumetric) or not.\r\n */\r\n public get geometryThinWalled(): boolean {\r\n return this._material.subSurface.maximumThickness === 0;\r\n }\r\n\r\n /**\r\n * Sets the thickness texture (mapped to PBR subSurface.thicknessTexture).\r\n * Automatically enables refraction.\r\n * @param value The thickness texture or null\r\n */\r\n public set volumeThicknessTexture(value: Nullable<BaseTexture>) {\r\n this._material.subSurface.thicknessTexture = value;\r\n this._material.subSurface.useGltfStyleTextures = true;\r\n }\r\n\r\n /**\r\n * Sets the thickness factor (mapped to PBR subSurface.maximumThickness).\r\n * Automatically enables refraction.\r\n * @param value The thickness value\r\n */\r\n public set volumeThickness(value: number) {\r\n this._material.subSurface.minimumThickness = 0.0;\r\n this._material.subSurface.maximumThickness = value;\r\n this._material.subSurface.useThicknessAsDepth = true;\r\n if (value > 0) {\r\n this._material.subSurface.volumeIndexOfRefraction = this._material.indexOfRefraction;\r\n }\r\n }\r\n\r\n // ========================================\r\n // SUBSURFACE PROPERTIES (Subsurface Scattering)\r\n // ========================================\r\n\r\n /**\r\n * Configures subsurface properties for PBR material\r\n */\r\n public configureSubsurface(): void {\r\n this._material.subSurface.useGltfStyleTextures = true;\r\n\r\n // Since this extension models thin-surface transmission only, we must make the\r\n // internal IOR == 1.0 and set the thickness to 0.\r\n this._material.subSurface.volumeIndexOfRefraction = 1.0;\r\n this._material.subSurface.minimumThickness = 0.0;\r\n this._material.subSurface.maximumThickness = 0.0;\r\n\r\n // Tint color will be used for transmission.\r\n this._material.subSurface.useAlbedoToTintTranslucency = false;\r\n }\r\n\r\n /**\r\n * Sets the subsurface weight\r\n */\r\n public set subsurfaceWeight(value: number) {\r\n this._material.subSurface.isTranslucencyEnabled = value > 0;\r\n this._material.subSurface.translucencyIntensity = value;\r\n }\r\n\r\n /**\r\n * Gets the subsurface weight\r\n * @returns The subsurface weight value\r\n */\r\n public get subsurfaceWeight(): number {\r\n return this._material.subSurface.isTranslucencyEnabled ? this._material.subSurface.translucencyIntensity : 0;\r\n }\r\n\r\n /**\r\n * Sets the subsurface weight texture\r\n */\r\n public set subsurfaceWeightTexture(value: Nullable<BaseTexture>) {\r\n this._material.subSurface.translucencyIntensityTexture = value;\r\n }\r\n\r\n /**\r\n * Sets the subsurface color.\r\n * @param value The subsurface tint color as a Color3\r\n */\r\n public set subsurfaceColor(value: Color3) {\r\n // PBRMaterial does not have a direct equivalent for subsurface color,\r\n // We could set the base color to this value, wherever subsurfaceWeight > 0\r\n // When scatterAnisotropy is 1, I believe we can approximate the subsurface effect quite well with\r\n // Translucency and a diffusion distance\r\n const extinctionCoefficient = new Vector3(-Math.log(this.transmissionColor.r), -Math.log(this.transmissionColor.g), -Math.log(this.transmissionColor.b));\r\n extinctionCoefficient.scaleInPlace(1 / Math.max(this.transmissionDepth, 0.001));\r\n const absorptionCoeff = extinctionCoefficient;\r\n const maxChannel = Math.max(absorptionCoeff.x, Math.max(absorptionCoeff.y, absorptionCoeff.z));\r\n const attenuationDistance = maxChannel > 0 ? 1.0 / maxChannel : 1;\r\n this._material.subSurface.diffusionDistance = new Color3(\r\n Math.exp(-absorptionCoeff.x * attenuationDistance),\r\n Math.exp(-absorptionCoeff.y * attenuationDistance),\r\n Math.exp(-absorptionCoeff.z * attenuationDistance)\r\n );\r\n }\r\n\r\n /**\r\n * Sets the subsurface color texture.\r\n * @param value The subsurface tint texture or null\r\n */\r\n public set subsurfaceColorTexture(value: Nullable<BaseTexture>) {\r\n // PBRMaterial does not have a direct equivalent for subsurface color texture,\r\n }\r\n\r\n /**\r\n * Sets the surface tint of the material (when using subsurface scattering)\r\n */\r\n public set diffuseTransmissionTint(value: Color3) {\r\n this._material.subSurface.tintColor = value;\r\n }\r\n\r\n /**\r\n * Gets the subsurface constant tint (when using subsurface scattering)\r\n * @returns The subsurface constant tint as a Color3\r\n */\r\n public get diffuseTransmissionTint(): Color3 {\r\n return this._material.subSurface.tintColor;\r\n }\r\n\r\n /**\r\n * Sets the subsurface constant tint texture (when using subsurface scattering)\r\n * @param value The subsurface constant tint texture or null\r\n */\r\n public set diffuseTransmissionTintTexture(value: Nullable<BaseTexture>) {\r\n this._material.subSurface.translucencyColorTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the subsurface radius (used for subsurface scattering)\r\n * subsurfaceRadiusScale * subsurfaceRadius gives the mean free path per color channel.\r\n * @returns The subsurface radius as a Color3\r\n */\r\n public get subsurfaceRadius(): number {\r\n return 1.0;\r\n }\r\n\r\n /**\r\n * Sets the subsurface radius (used for subsurface scattering)\r\n * subsurfaceRadiusScale * subsurfaceRadius gives the mean free path per color channel.\r\n * @param value The subsurface radius as a number\r\n */\r\n public set subsurfaceRadius(value: number) {\r\n //\r\n }\r\n\r\n /**\r\n * Gets the subsurface radius scale (used for subsurface scattering)\r\n * subsurfaceRadiusScale * subsurfaceRadius gives the mean free path per color channel.\r\n * @returns The subsurface radius scale as a Color3\r\n */\r\n public get subsurfaceRadiusScale(): Color3 {\r\n return this._material.subSurface.scatteringDiffusionProfile ?? Color3.White();\r\n }\r\n\r\n /**\r\n * Sets the subsurface radius scale (used for subsurface scattering)\r\n * subsurfaceRadiusScale * subsurfaceRadius gives the mean free path per color channel.\r\n * @param value The subsurface radius scale as a Color3\r\n */\r\n public set subsurfaceRadiusScale(value: Color3) {\r\n this._material.subSurface.scatteringDiffusionProfile = value;\r\n }\r\n\r\n /**\r\n * Sets the subsurface scattering anisotropy.\r\n * Note: PBRMaterial does not have a direct equivalent, so this is a no-op.\r\n * @param value The anisotropy intensity value (ignored for PBR)\r\n */\r\n public set subsurfaceScatterAnisotropy(value: number) {\r\n // No equivalent in PBRMaterial\r\n }\r\n\r\n /**\r\n * Does this material have a translucent surface (i.e. either transmission or subsurface)?\r\n * @returns True if the material is translucent, false otherwise\r\n */\r\n public isTranslucent(): boolean {\r\n return this.transmissionWeight > 0 || this.subsurfaceWeight > 0;\r\n }\r\n\r\n // ========================================\r\n // FUZZ LAYER (Sheen)\r\n // ========================================\r\n\r\n /**\r\n * Configures sheen for PBR material.\r\n * Enables sheen and sets up proper configuration.\r\n */\r\n public configureFuzz(): void {\r\n this._material.sheen.isEnabled = true;\r\n this._material.sheen.useRoughnessFromMainTexture = false;\r\n this._material.sheen.albedoScaling = true;\r\n }\r\n\r\n /**\r\n * Sets the sheen weight (mapped to PBR sheen.intensity).\r\n * Automatically enables sheen.\r\n * @param value The sheen weight value\r\n */\r\n public set fuzzWeight(value: number) {\r\n this._material.sheen.isEnabled = true;\r\n this._material.sheen.intensity = value;\r\n }\r\n\r\n /**\r\n * Sets the fuzz weight texture.\r\n * @param value The fuzz weight texture or null\r\n */\r\n public set fuzzWeightTexture(value: Nullable<BaseTexture>) {\r\n // PBRMaterial sheen supports glTF-style sheen which doesn't\r\n // use a separate texture for intensity. So we'll only set the\r\n // weight texture if none is already assigned. If one's already\r\n // assigned, we assume it contains the sheen color data.\r\n if (!this._material.sheen.texture) {\r\n this._material.sheen.texture = value;\r\n }\r\n }\r\n\r\n /**\r\n * Sets the sheen color (mapped to PBR sheen.color).\r\n * Automatically enables sheen.\r\n * @param value The sheen color as a Color3\r\n */\r\n public set fuzzColor(value: Color3) {\r\n this._material.sheen.isEnabled = true;\r\n this._material.sheen.color = value;\r\n }\r\n\r\n /**\r\n * Sets the sheen color texture (mapped to PBR sheen.texture).\r\n * Automatically enables sheen.\r\n * @param value The sheen color texture or null\r\n */\r\n public set fuzzColorTexture(value: Nullable<BaseTexture>) {\r\n this._material.sheen.texture = value;\r\n }\r\n\r\n /**\r\n * Sets the sheen roughness (mapped to PBR sheen.roughness).\r\n * Automatically enables sheen.\r\n * @param value The sheen roughness value (0-1)\r\n */\r\n public set fuzzRoughness(value: number) {\r\n this._material.sheen.isEnabled = true;\r\n this._material.sheen.roughness = value;\r\n }\r\n\r\n /**\r\n * Sets the sheen roughness texture (mapped to PBR sheen.textureRoughness).\r\n * Automatically enables sheen.\r\n * @param value The sheen roughness texture or null\r\n */\r\n public set fuzzRoughnessTexture(value: Nullable<BaseTexture>) {\r\n this._material.sheen.isEnabled = true;\r\n this._material.sheen.textureRoughness = value;\r\n }\r\n\r\n // ========================================\r\n // ANISOTROPY\r\n // ========================================\r\n\r\n /**\r\n * Sets the specular roughness anisotropy (mapped to PBR anisotropy.intensity).\r\n * Automatically enables anisotropy.\r\n * @param value The anisotropy intensity value\r\n */\r\n public set specularRoughnessAnisotropy(value: number) {\r\n this._material.anisotropy.isEnabled = true;\r\n this._material.anisotropy.intensity = value;\r\n }\r\n\r\n /**\r\n * Gets the specular roughness anisotropy.\r\n * @returns The anisotropy intensity value\r\n */\r\n public get specularRoughnessAnisotropy(): number {\r\n return this._material.anisotropy.intensity;\r\n }\r\n\r\n /**\r\n * Sets the anisotropy rotation (mapped to PBR anisotropy.angle).\r\n * Automatically enables anisotropy.\r\n * @param value The anisotropy rotation angle in radians\r\n */\r\n public set geometryTangentAngle(value: number) {\r\n this._material.anisotropy.isEnabled = true;\r\n this._material.anisotropy.angle = value;\r\n }\r\n\r\n /**\r\n * Sets the geometry tangent texture (mapped to PBR anisotropy.texture).\r\n * Automatically enables anisotropy.\r\n * @param value The anisotropy texture or null\r\n */\r\n public set geometryTangentTexture(value: Nullable<BaseTexture>) {\r\n this._material.anisotropy.isEnabled = true;\r\n this._material.anisotropy.texture = value;\r\n }\r\n\r\n /**\r\n * Gets the geometry tangent texture.\r\n * @returns The anisotropy texture or null\r\n */\r\n public get geometryTangentTexture(): Nullable<BaseTexture> {\r\n return this._material.anisotropy.texture;\r\n }\r\n\r\n /**\r\n * Configures glTF-style anisotropy for the material.\r\n * Note: PBR materials don't need this configuration, so this is a no-op.\r\n * @param useGltfStyle Whether to use glTF-style anisotropy (ignored for PBR)\r\n */\r\n public configureGltfStyleAnisotropy(useGltfStyle: boolean = true): void {\r\n // PBR materials don't need this configuration\r\n }\r\n\r\n // ========================================\r\n // THIN FILM IRIDESCENCE\r\n // ========================================\r\n\r\n /**\r\n * Sets the iridescence weight (mapped to PBR iridescence.intensity).\r\n * Automatically enables iridescence.\r\n * @param value The iridescence intensity value\r\n */\r\n public set thinFilmWeight(value: number) {\r\n this._material.iridescence.isEnabled = value > 0;\r\n this._material.iridescence.intensity = value;\r\n }\r\n\r\n /**\r\n * Sets the iridescence IOR (mapped to PBR iridescence.indexOfRefraction).\r\n * @param value The iridescence IOR value\r\n */\r\n public set thinFilmIor(value: number) {\r\n this._material.iridescence.indexOfRefraction = value;\r\n }\r\n\r\n /**\r\n * Sets the iridescence thickness minimum (mapped to PBR iridescence.minimumThickness).\r\n * @param value The minimum thickness value in nanometers\r\n */\r\n public set thinFilmThicknessMinimum(value: number) {\r\n this._material.iridescence.minimumThickness = value;\r\n }\r\n\r\n /**\r\n * Sets the iridescence thickness maximum (mapped to PBR iridescence.maximumThickness).\r\n * @param value The maximum thickness value in nanometers\r\n */\r\n public set thinFilmThicknessMaximum(value: number) {\r\n this._material.iridescence.maximumThickness = value;\r\n }\r\n\r\n /**\r\n * Sets the thin film weight texture (mapped to PBR iridescence.texture).\r\n * @param value The thin film weight texture or null\r\n */\r\n public set thinFilmWeightTexture(value: Nullable<BaseTexture>) {\r\n this._material.iridescence.texture = value;\r\n }\r\n\r\n /**\r\n * Sets the iridescence thickness texture (mapped to PBR iridescence.thicknessTexture).\r\n * @param value The iridescence thickness texture or null\r\n */\r\n public set thinFilmThicknessTexture(value: Nullable<BaseTexture>) {\r\n this._material.iridescence.thicknessTexture = value;\r\n }\r\n\r\n // ========================================\r\n // UNLIT MATERIALS\r\n // ========================================\r\n\r\n /**\r\n * Sets whether the material is unlit.\r\n * @param value True to make the material unlit\r\n */\r\n public set unlit(value: boolean) {\r\n this._material.unlit = value;\r\n }\r\n\r\n // ========================================\r\n // GEOMETRY PARAMETERS\r\n // ========================================\r\n\r\n /**\r\n * Sets the geometry opacity (mapped to PBR alpha).\r\n * @param value The opacity value (0-1)\r\n */\r\n public set geometryOpacity(value: number) {\r\n this._material.alpha = value;\r\n }\r\n\r\n /**\r\n * Gets the geometry opacity.\r\n * @returns The opacity value (0-1)\r\n */\r\n public get geometryOpacity(): number {\r\n return this._material.alpha;\r\n }\r\n\r\n /**\r\n * Sets the geometry normal texture (mapped to PBR bumpTexture).\r\n * Also forces irradiance computation in fragment shader for better lighting.\r\n * @param value The normal texture or null\r\n */\r\n public set geometryNormalTexture(value: Nullable<BaseTexture>) {\r\n this._material.bumpTexture = value;\r\n this._material.forceIrradianceInFragment = true;\r\n }\r\n\r\n /**\r\n * Gets the geometry normal texture.\r\n * @returns The normal texture or null\r\n */\r\n public get geometryNormalTexture(): Nullable<BaseTexture> {\r\n return this._material.bumpTexture;\r\n }\r\n\r\n /**\r\n * Sets the normal map inversions for the material.\r\n * @param invertX Whether to invert the normal map on the X axis\r\n * @param invertY Whether to invert the normal map on the Y axis\r\n */\r\n public setNormalMapInversions(invertX: boolean, invertY: boolean): void {\r\n this._material.invertNormalMapX = invertX;\r\n this._material.invertNormalMapY = invertY;\r\n }\r\n\r\n /**\r\n * Sets the geometry coat normal texture (mapped to PBR clearCoat.bumpTexture).\r\n * Automatically enables clear coat.\r\n * @param value The coat normal texture or null\r\n */\r\n public set geometryCoatNormalTexture(value: Nullable<BaseTexture>) {\r\n this._material.clearCoat.isEnabled = true;\r\n this._material.clearCoat.bumpTexture = value;\r\n }\r\n\r\n /**\r\n * Gets the geometry coat normal texture.\r\n * @returns The coat normal texture or null\r\n */\r\n public get geometryCoatNormalTexture(): Nullable<BaseTexture> {\r\n return this._material.clearCoat.bumpTexture;\r\n }\r\n\r\n /**\r\n * Sets the geometry coat normal texture scale.\r\n * @param value The scale value for the coat normal texture\r\n */\r\n public set geometryCoatNormalTextureScale(value: number) {\r\n if (this._material.clearCoat.bumpTexture) {\r\n this._material.clearCoat.bumpTexture.level = value;\r\n }\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-restricted-imports */\r\nimport * as Extensions from \"loaders/glTF/2.0/Extensions/index\";\r\nimport * as Interfaces from \"loaders/glTF/2.0/glTFLoaderInterfaces\";\r\nimport * as GLTF2 from \"loaders/glTF/2.0/index\";\r\n\r\nconst LoaderExtensions = { ...Extensions };\r\nconst GLTF2Loader = {\r\n ...Interfaces,\r\n [\"Extensions\"]: LoaderExtensions,\r\n};\r\nconst GLTF2Legacy = {\r\n ...GLTF2,\r\n [\"Loader\"]: GLTF2Loader,\r\n} as typeof GLTF2;\r\n\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 // eslint-disable-next-line @typescript-eslint/naming-convention\r\n const BABYLON = (<any>GlobalObject).BABYLON;\r\n BABYLON.GLTF2 = BABYLON.GLTF2 || {};\r\n BABYLON.GLTF2.Loader = BABYLON.GLTF2.Loader || {};\r\n BABYLON.GLTF2.Loader.Extensions = BABYLON.GLTF2.Loader.Extensions || {};\r\n\r\n const keys = [\"Loader\"];\r\n for (const key in LoaderExtensions) {\r\n BABYLON.GLTF2.Loader.Extensions[key] = (<any>LoaderExtensions)[key];\r\n keys.push(key);\r\n }\r\n for (const key in GLTF2Loader) {\r\n if (key === \"Extensions\") {\r\n continue;\r\n }\r\n\r\n BABYLON.GLTF2.Loader[key] = (<any>GLTF2Loader)[key];\r\n keys.push(key);\r\n }\r\n\r\n for (const key in GLTF2Legacy) {\r\n // Prevent Reassignment.\r\n if (keys.indexOf(key) > -1) {\r\n continue;\r\n }\r\n\r\n BABYLON.GLTF2[key] = (<any>GLTF2Legacy)[key];\r\n }\r\n}\r\n\r\nexport { GLTF2Legacy as GLTF2 };\r\n"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","prototype","hasOwnProperty","call","__extends","TypeError","String","__","this","constructor","create","__assign","assign","t","s","i","n","arguments","length","apply","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","__generator","body","f","y","_","label","sent","trys","ops","g","Iterator","verb","Symbol","iterator","v","op","pop","push","ValidateAsync","data","rootUrl","fileName","getExternalResource","options","externalResourceFunction","uri","ArrayBuffer","isView","GLTFValidator","validateBytes","validateString","WorkerFunc","pendingExternalResources","onmessage","message","id","importScripts","url","index","postMessage","reason","SuppressedError","GLTFLoaderCoordinateSystemMode","GLTFLoaderAnimationStartMode","GLTFLoaderState","GLTFValidation","_this","Worker","workerContent","concat","workerBlobUrl","URL","createObjectURL","Blob","type","worker","onError","error","removeEventListener","onMessage","buffer","_LastResults","terminate","addEventListener","Tools","GetBabylonScriptURL","Configuration","slicedData","slice","_LoadScriptPromise","LoadBabylonScriptAsync","_DefaultCdnUrl","GLTFMagicBase64Encoded","GLTFFileLoaderMetadata","isBinary","mimeType","readAsync","arrayBuffer","byteOffset","byteLength","Uint8Array","GLTFLoaderBaseOptions","alwaysComputeBoundingBox","alwaysComputeSkeletonRootNode","animationStartMode","FIRST","compileMaterials","compileShadowGenerators","coordinateSystemMode","AUTO","createInstances","loadAllMaterials","loadMorphTargets","loadNodeAnimations","loadOnlyMaterials","loadSkins","skipMaterials","targetFps","transparencyAsCoverage","useClipPlane","useGltfTextureNames","useRangeRequests","useSRGBBuffers","validate","useOpenPBR","dontUseTransmissionHelper","GLTFLoaderDefaultOptions","GLTFLoaderOptions","_super","extensionOptions","preprocessUrlAsync","copyFrom","_a","_b","_c","capturePerformanceCounters","_d","_e","_f","_g","_h","customRootNode","_j","_k","_l","_m","_o","_p","loggingEnabled","_q","onCameraLoaded","onMaterialLoaded","onMeshLoaded","onParsed","onSkinLoaded","onTextureLoaded","onValidated","_r","_s","_t","_u","_v","_w","_x","_y","_z","_0","_1","GLTFFileLoader","onParsedObservable","Observable","onMeshLoadedObservable","onSkinLoadedObservable","onTextureLoadedObservable","onMaterialLoadedObservable","onCameraLoadedObservable","onCompleteObservable","onErrorObservable","onDisposeObservable","onExtensionLoadedObservable","onValidatedObservable","_loader","_state","_requests","name","extensions","onLoaderStateChangedObservable","_logIndentLevel","_loggingEnabled","_log","_logDisabled","_capturePerformanceCounters","_startPerformanceCounter","_startPerformanceCounterDisabled","_endPerformanceCounter","_endPerformanceCounterDisabled","defineProperty","set","callback","_onParsedObserver","remove","add","_onMeshLoadedObserver","_onSkinLoadedObserver","node","skinnedNode","_onTextureLoadedObserver","_onMaterialLoadedObserver","_onCameraLoadedObserver","_onCompleteObserver","_onErrorObserver","_onDisposeObserver","_onExtensionLoadedObserver","get","_logEnabled","_startPerformanceCounterEnabled","_endPerformanceCounterEnabled","_onValidatedObserver","dispose","_i","abort","_progressCallback","clear","notifyObservers","undefined","loadFile","scene","fileOrUrl","onSuccess","onProgress","useArrayBuffer","_loadBinary","GetFilename","Logger","Warn","fileRequest_1","dataBuffer","_loadFile","webRequest","setRequestHeader","_unpackBinaryAsync","DataReader","loaderData","_validate","json","_parseJson","arrayBufferView","RangeError","readViewAsync","importMeshAsync","meshesNames","_getLoader","loadAsync","loadAssetContainerAsync","container","AssetContainer","materials","material","textures","texture","cameras","camera","morphTargetManagers","mesh","morphTargetManager","geometries","meshes","particleSystems","skeletons","animationGroups","lights","transformNodes","canDirectLoad","indexOf","startsWith","directLoad","arrayBuffer_1","DecodeBase64UrlToBinary","createPlugin","whenCompleteAsync","addOnce","_setState","state","onOpened","request","event","_onProgress","_lengthComputable","_total","_loaded","lengthComputable","loaded","total","request_1","_loadFileAsync","asset","version","minVersion","_parseVersion","Error","_compareVersion","major","minor","createLoader","_CreateGLTF1Loader","_CreateGLTF2Loader","parsed","JSON","parse","dataReader","magic","readUint32","RuntimeError","ErrorCodes","GLTFLoaderUnexpectedMagicError","unpacked","_unpackBinaryV1Async","_unpackBinaryV2Async","contentLength","contentFormat","bodyLength","readString","bin","startByteOffset_1","ChunkFormat","chunkLength","startByteOffset_2","skipBytes","match","parseInt","a","_logOpen","_logClose","spaces","_logSpaces","substring","Log","counterName","StartPerformanceCounter","EndPerformanceCounter","IncrementalLoading","HomogeneousCoordinates","RegisterSceneLoaderPlugin","EComponentType","EShaderType","EParameterType","ETextureWrapMode","ETextureFilterType","ETextureFormat","ECullingType","EBlendingFunction","GlobalObject","global","window","key","BABYLON","FileLoader","Validation","ETokenType","GLTFUtils","SetMatrix","source","parameter","uniformName","shaderMaterial","mat","semantic","getWorldMatrix","getProjectionMatrix","getViewMatrix","Matrix","Transpose","multiply","invert","getTransformMatrix","FLOAT_MAT2","setMatrix2x2","GetAsMatrix2x2","FLOAT_MAT3","setMatrix3x3","GetAsMatrix3x3","FLOAT_MAT4","setMatrix","SetUniform","uniform","FLOAT","setFloat","FLOAT_VEC2","setVector2","Vector2","FromArray","FLOAT_VEC3","setVector3","Vector3","FLOAT_VEC4","setVector4","Vector4","GetWrapMode","mode","CLAMP_TO_EDGE","Texture","CLAMP_ADDRESSMODE","MIRRORED_REPEAT","MIRROR_ADDRESSMODE","REPEAT","WRAP_ADDRESSMODE","GetByteStrideFromType","accessor","GetTextureFilterMode","LINEAR","LINEAR_MIPMAP_NEAREST","LINEAR_MIPMAP_LINEAR","TRILINEAR_SAMPLINGMODE","NEAREST","NEAREST_MIPMAP_NEAREST","NEAREST_SAMPLINGMODE","BILINEAR_SAMPLINGMODE","GetBufferFromBufferView","gltfRuntime","bufferView","componentType","loadedBufferView","loadedBufferViews","BYTE","Int8Array","UNSIGNED_BYTE","SHORT","Int16Array","UNSIGNED_SHORT","Uint16Array","Float32Array","GetBufferFromAccessor","bufferViews","count","DecodeBufferToText","view","fromCharCode","GetDefaultMaterial","_DefaultMaterial","Effect","ShadersStore","join","attributes","uniforms","samplers","needAlphaBlending","ShaderMaterial","vertex","fragment","setColor4","Color4","Tokenizer","toParse","_pos","currentToken","UNKNOWN","currentIdentifier","currentString","isLetterOrDigitPattern","_toParse","_maxPos","getNextToken","isEnd","END_OF_INPUT","read","test","IDENTIFIER","peek","forward","glTFTransforms","BabylonTransforms","glTFAnimationPaths","BabylonAnimationPaths","ParseObject","parsedObjects","runtimeProperty","object","parsedObject","NormalizeUVs","GetAttribute","attributeParameter","channel","Number","split","ConfigureBoneTransformation","translation","rotation","scale","Quaternion","position","Compose","matrix","GetParentBone","skins","jointName","newSkeleton","bones","nodes","nde","children","child","bone","Bone","GetNodeToRoot","nodesToRoot","nodeToRoot","j","GetJointNode","NodeIsInJoints","jointNames","ImportMesh","newMesh","_blockEntityCollection","assetContainer","Mesh","_parentContainer","babylonNode","subMaterials","vertexData","verticesStarts","verticesCounts","indexStarts","indexCounts","meshIndex","meshId","primitives","tempVertexData","VertexData","primitive","accessors","normals","positions","uvKind","VertexBuffer","UVKind","uvs","matricesIndices","matricesWeights","colors","indices","Int32Array","merge","material_1","getMaterialById","MultiMaterial","StandardMaterial","Geometry","computeWorldMatrix","subMeshes","SubMesh","AddToMesh","ConfigureNode","newNode","scaling","rotationQuaternion","ImportNode","lastNode","importOnlyMeshes","skin","importMeshesNames","skeleton","getLastSkeletonById","Skeleton","babylonSkeleton","nodesToRootToAdd","k","_parent","GetNodesToRoot","jointNode","existingBone","getBoneById","foundBone","parentBone","jointNode_1","joint","prepare","ImportSkeleton","light","orthoCamera","FreeCamera","Zero","Camera","ORTHOGRAPHIC_CAMERA","attachControl","perspectiveCamera","persCamera","aspectRatio","getEngine","getRenderWidth","getRenderHeight","znear","zfar","maxZ","minZ","ambienLight","hemiLight","HemisphericLight","color","diffuse","Color3","directionalLight","dirLight","DirectionalLight","pointLight","ptLight","PointLight","spotLight","spLight","SpotLight","fallOfAngle","angle","fallOffExponent","exponent","dummy","decompose","ConfigureNodeFromMatrix","updateCache","TraverseNodes","parent","meshIncluded","PostLoad","currentScene","thing","scenes","anim","animations","animation","channels","lastAnimation","sampler","inputData","outputData","parameters","input","output","bufferInput","bufferOutput","targetId","target","targetNode","getNodeById","getNodeByName","isBone","targetPath","path","targetPathIndex","animationType","Animation","ANIMATIONTYPE_MATRIX","ANIMATIONTYPE_QUATERNION","ANIMATIONTYPE_VECTOR3","babylonAnimation","keys","arrayOffset","modifyKey","getKeys","ANIMATIONLOOPMODE_CYCLE","getBaseMatrix","frame","setKeys","stopAnimation","beginAnimation","LoadAnimations","MAX_VALUE","ParseShaderUniforms","tokenizer","technique","unTreatedUniforms","unif","uniformParameter","transformIndex","ImportMaterials","GLTFLoaderExtension","LoadMaterialAsync","GLTFLoaderBase","CreateRuntime","parsedData","buffers","images","shaders","programs","techniques","extensionsUsed","buffersCount","shaderscount","loadedBufferCount","loadedShaderCount","dummyNodes","parsedBuffers","buf","parsedBuffer","ParseBuffers","parsedShaders","sha","parsedShader","ParseShaders","LoadBufferAsync","IsBase64","setTimeout","DecodeBase64","LoadFile","status","statusText","LoadTextureBufferAsync","babylonTexture","CreateTextureAsync","createMipMaps","minFilter","NEAREST_MIPMAP_LINEAR","samplingMode","blob","GetBlobBufferSource","blobURL","revokeBlobURL","revokeObjectURL","newTexture","wrapS","wrapU","wrapT","wrapV","LoadShaderStringAsync","shader","shaderString","atob","defaultMaterial","diffuseColor","sideOrientation","Material","CounterClockWiseSideOrientation","program","states","vertexShader","pixelShader","fragmentShader","newVertexShader","newPixelShader","vertexTokenizer","pixelTokenizer","SAMPLER_2D","attr","attribute","name_1","foundAttribute","shaderPath","enable","effect","OnShaderCompileError","onCompiled","materialValues","values","techniqueUniforms","onLoadTexture","setTexture","LoadTextureAsync","PrepareShaderMaterialUniforms","onBind","getEffect","OnBindShaderMaterial","OnShaderCompileSuccess","functions","cullFace","BACK","backFaceCulling","blendFunc","blendFuncSeparate","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","ONE","alphaMode","Constants","ALPHA_COMBINE","ZERO","ALPHA_ONEONE","ALPHA_ADD","ONE_MINUS_SRC_COLOR","ALPHA_SUBTRACT","DST_COLOR","ALPHA_MULTIPLY","ALPHA_MAXIMIZED","GLTFLoader","RegisterExtension","extension","Extensions","_importMeshAsync","useRightHandedSystem","LoadRuntimeAsync","_createNodes","AbstractMesh","skl","_loadBuffersAsync","_loadShadersAsync","spriteManagers","_loadAsync","LoadRuntimeExtensionsAsync","onload","hasShaders","processShader","VERTEX","bind","onLoad","hasBuffers","processBuffer","_name","loadRuntimeAsync","loadRuntimeExtensionsAsync","loadBufferAsync","loadTextureBufferAsync","createTextureAsync","loadShaderStringAsync","loadMaterialAsync","_ApplyExtensions","loaderExtension","_LoadTextureBufferAsync","_CreateTextureAsync","func","defaultFunc","extensionName","GLTFBinaryExtension","_bin","sourceExt","binaryExtensionShader","shaderBytes","GLTFMaterialsCommonExtension","ambientLight","ambient","point","directional","spot","fallOffAngle","Math","PI","standardMaterial","disableLighting","doubleSided","alpha","transparency","specularPower","shininess","_loadTexture","ambientColor","emission","emissiveColor","specular","specularColor","propertyPath","GLTF1","OptionalPathExceptionsList","regex","RegExp","GLTFPathToObjectConverter","_gltf","_infoTree","convert","objectTree","infoTree","parts","shift","includes","ignoreObjectTree","parts_1","part","isLength","__array__","__ignoreObjectTree__","find","__target__","info","nodesTree","getTarget","map","_babylonTransformNode","getPropertyName","weights","_numMorphTargets","_primitiveBabylonMeshes","influence","isReadOnly","globalMatrix","Identity","rootNode","forceUpdate","_isDirty","rootMatrix","multiplyToRef","EXT_lights_ies","multiplier","getChildren","intensity","KHR_node_visibility","visible","isVisible","forEach","camerasTree","orthographic","xmag","componentsCount","_babylonCamera","orthoLeft","orthoRight","x","ymag","orthoBottom","orthoTop","perspective","getAspectRatio","yfov","fov","materialsTree","emissiveFactor","payload","GetMaterial","emissiveTexture","KHR_texture_transform","GenerateTextureMap","normalTexture","GetTexture","level","occlusionTexture","strength","ambientTextureStrength","pbrMetallicRoughness","baseColorFactor","FromColor3","albedoColor","r","baseColorTexture","metallicFactor","metallic","roughnessFactor","roughness","metallicRoughnessTexture","KHR_materials_anisotropy","anisotropyStrength","anisotropy","anisotropyRotation","anisotropyTexture","KHR_materials_clearcoat","clearcoatFactor","clearCoat","clearcoatRoughnessFactor","clearcoatTexture","clearcoatNormalTexture","bumpTexture","clearcoatRoughnessTexture","KHR_materials_dispersion","dispersion","subSurface","KHR_materials_emissive_strength","emissiveStrength","emissiveIntensity","KHR_materials_ior","ior","indexOfRefraction","KHR_materials_iridescence","iridescenceFactor","iridescence","iridescenceIor","iridescenceTexture","iridescenceThicknessMaximum","maximumThickness","iridescenceThicknessMinimum","minimumThickness","iridescenceThicknessTexture","KHR_materials_sheen","sheenColorFactor","sheen","sheenColorTexture","sheenRoughnessFactor","sheenRoughnessTexture","KHR_materials_specular","specularFactor","metallicF0Factor","specularColorFactor","metallicReflectanceColor","specularTexture","specularColorTexture","KHR_materials_transmission","transmissionFactor","refractionIntensity","transmissionTexture","KHR_materials_diffuse_transmission","diffuseTransmissionFactor","translucencyIntensity","diffuseTransmissionTexture","diffuseTransmissionColorFactor","translucencyColor","diffuseTransmissionColorTexture","KHR_materials_volume","attenuationColor","tintColor","attenuationDistance","tintColorAtDistance","thicknessFactor","thicknessTexture","extensionsTree","KHR_lights_punctual","_babylonLight","_lights","_light","range","innerConeAngle","innerAngle","outerConeAngle","EXT_lights_area","size","height","rect","aspect","width","EXT_lights_image_based","_babylonTexture","FromRotationMatrix","getReflectionTextureMatrix","getScene","Inverse","FromQuaternionToRef","textureType","textureInObject","babylonMaterial","_index","_data","fillMode","MATERIAL_TriangleFillMode","offset","uOffset","vOffset","wAng","uScale","vScale","objectModelMapping","_babylonAnimationGroup","_instanceData","babylonSourceMesh","GetPathToObjectConverter","gltf","GetMappingForKey","keyParts","replace","current","keyParts_1","SetInterpolationForKey","interpolation","keyParts_2","AddObjectAccessorToKey","keyParts_3","RegisteredGLTFExtensions","Map","registeredGLTFExtensions","registerGLTFExtension","isGLTFExtension","factory","unregisterGLTFExtension","delete","LazyAnimationGroupModulePromise","Lazy","LazyLoaderAnimationModulePromise","glTFLoaderAnimation","ArrayItem","Get","context","array","TryGet","Assign","LoadBoundingInfoFromPositionAccessor","min","max","minArray","maxArray","minVector","TmpVectors","copyFromFloats","maxVector","normalized","divider","oneOverDivider","scaleInPlace","BoundingInfo","_completePromises","_finalizeController","_assetContainer","_babylonLights","_disableInstancedMesh","_allMaterialsDirtyRequired","_skipStartAnimationStep","_extensions","_disposed","_rootUrl","_fileName","_uniqueRootUrl","_rootBabylonMesh","_defaultBabylonMaterialData","_postSceneLoadActions","_materialAdapterCache","WeakMap","_materialAdapters","Set","_pbrMaterialImpl","isMatchingMaterialType","materialClass","UnregisterExtension","_babylonScene","_getOrCreateMaterialAdapter","adapter","createdAdapter","adapterClass","meshesNames_1","scene_1","container_1","data_1","rootUrl_1","onProgress_1","_loadData","nodeMap_1","_getMeshes","_getSkeletons","_getAnimationGroups","_getTransformNodes","_getGeometries","resultFunc","Date","now","_loadExtensionsAsync","isExtensionUsed","OpenPBRMaterial","OpenPBRMaterialLoadingAdapter","PBRMaterial","PBRMaterialLoadingAdapter","loadingToReadyCounterName","LOADING","READY","loadingToCompleteCounterName","COMPLETE","_extensionsOnLoading","promises","oldBlockMaterialDirtyMechanism","blockMaterialDirtyMechanism","loadSceneAsync","m","babylonDrawMode","TriangleFillMode","_loadMaterialAsync","_forceBlockMaterialDirtyMechanism","_compileMaterialsAsync","_compileShadowGeneratorsAsync","resultPromise","all","setEnabled","maxSimultaneousLights","AbortController","finalizeSignal","signal","from","finalizeAsync","finalizePromise","finalize","_extensionsOnReady","_startAnimations","SetImmediate","catch","_setupData","binaryBuffer","nodeParents","_createRootNode","parentIndex","extensionPromises","registeredExtension","enabled","sort","order","extensionsRequired","this_1","some","rootMesh","_LoadTransform","FORCE_RIGHT_HANDED","extensionPromise","_extensionsLoadSceneAsync","logOpen","loadNodeAsync","babylonMesh","action","_loadAnimationsAsync","logClose","_forEachPrimitive","nodes_1","geometry","nodes_2","nodes_3","getClassName","_babylonTransformNodeForSkin","skins_1","animations_1","NONE","babylonAnimationGroups","start","ALL","babylonAnimationGroups_1","_extensionsLoadNodeAsync","loadNode","babylonTransformNode","AddPointerMetadata","loadCameraAsync","babylonCamera","childNode","childBabylonMesh","hasMesh","hasSkin","nodeName","transformNode","TransformNode","_loadMeshAsync","babylonTransformNodeForSkin","metadata","deepMerge","_loadSkinAsync","parentNode","asMesh","isAnInstance","useBoundingInfoFromGeometry","_updateBoundingInfo","refreshBoundingInfo","_loadMeshPrimitiveAsync","primitives_1","_extensionsLoadMeshPrimitiveAsync","babylonAbstractMesh","promise","shouldInstance","targets","createInstance","babylonMesh_1","ClockWiseSideOrientation","_createMorphTargets","_loadVertexDataAsync","babylonGeometry","_loadMorphTargetsAsync","applyToMesh","_GetDrawMode","_createDefaultMaterial","_extensionsLoadVertexDataAsync","isUnIndexed","_loadIndicesAccessorAsync","setIndices","loadAttribute","kind","_delayInfo","_loadVertexAccessorAsync","babylonVertexBuffer","getKind","PositionKind","babylonBoundingInfo","_boundingInfo","setVerticesBuffer","MatricesIndicesExtraKind","numBoneInfluencers","NormalKind","TangentKind","UV2Kind","UV3Kind","UV4Kind","UV5Kind","UV6Kind","MatricesIndicesKind","MatricesWeightsKind","MatricesWeightsExtraKind","ColorKind","hasVertexAlpha","targetNames","extras","MorphTargetManager","areUpdatesFrozen","weight","name_2","addTarget","MorphTarget","numTargets","babylonMorphTarget","_loadMorphTargetVertexDataAsync","setData","getVertexBuffer","_loadFloatAccessorAsync","setPositions","setNormals","tangents","dataIndex","setTangents","setUVs","setUV2s","componentSize","getSize","pixid","floor","setColors","One","_extensionsLoadSkinAsync","skeletonId","_loadBones","_loadSkinInverseBindMatricesDataAsync","inverseBindMatricesData","_updateBoneMatrices","_findSkeletonRootNode","joints","skeletonNode","isParent","babylonBones","_loadBone","paths","joints_1","unshift","_isJoint","babylonBone","parentBabylonBone","boneIndex","_getNodeMatrix","linkTransformNode","inverseBindMatrices","baseMatrix","FromArrayToRef","invertToRef","babylonParentBone","getParent","getAbsoluteInverseBindMatrix","updateMatrix","_updateAbsoluteBindMatrices","_extensionsLoadCameraAsync","setTarget","loadAnimationAsync","animationGroup","targetedAnimations","_extensionsLoadAnimationAsync","AnimationGroup","babylonAnimationGroup","_loadAnimationChannelAsync","babylonTarget","addTargetedAnimation","normalize","animationContext","_extensionsLoadAnimationChannelAsync","channelTargetPath","pathIsWeights","properties","targetInfo","_loadAnimationChannelFromTargetInfoAsync","fps","invfps","_loadAnimationSamplerAsync","numAnimations","propertyInfos_1","propertyInfo","stride","getStride","outputOffset","getValue","inTangent","outTangent","name_3","babylonAnimations_1","buildAnimations","babylonAnimatable","inputAccessor","outputAccessor","_extensionsLoadBufferAsync","loadUriAsync","cause","loadBufferViewAsync","_extensionsLoadBufferViewAsync","_loadAccessorAsync","numComponents","_GetNumComponents","byteStride","GetTypeByteLength","bufferView_1","typedArray_1","ForEach","_GetTypedArray","sparse","sparse_1","typedArray","indicesBufferView","valuesBufferView","indicesData","valuesData","sparseLength","sparseData","valuesIndex","indicesIndex","componentIndex","_GetTypedArrayConstructor","_loadVertexBufferViewAsync","_babylonBuffer","engine","Buffer","_babylonVertexBuffer","bufferView_2","babylonBuffer","_loadMaterialMetallicRoughnessPropertiesAsync","baseColor","geometryOpacity","White","baseMetalness","specularRoughness","loadTextureInfoAsync","nonColorData","baseMetalnessTexture","specularRoughnessTexture","useRoughnessFromMetallicTextureGreen","useMetallicFromMetallicTextureBlue","_extensionsLoadMaterialAsync","babylonData","createMaterial","babylonMeshes","loadMaterialPropertiesAsync","splice","transparencyMode","MATERIAL_OPAQUE","transparencyAsAlphaCoverage","extensionMaterial","_extensionsCreateMaterial","_extensionsLoadMaterialPropertiesAsync","loadMaterialBasePropertiesAsync","loadMaterialAlphaProperties","aoTexture","emissionColor","twoSidedLighting","geometryNormalTexture","setNormalMapInversions","emissionTexture","aoStrength","ambientOcclusionTexture","ambientOcclusionTextureStrength","emissionColorTexture","MATERIAL_ALPHATEST","alphaCutOff","alphaCutoff","hasAlpha","MATERIAL_ALPHABLEND","useAlphaFromBaseColorTexture","textureInfo","_extensionsLoadTextureInfoAsync","texCoord","_textureInfo","_loadTextureAsync","coordinatesIndex","_extensionsLoadTextureAsync","DefaultSampler","image","_createTextureAsync","textureLoaderOptions","useSRGBBuffer","samplerData","_loadSampler","deferred","Deferred","textureCreationOptions","noMipmap","noMipMaps","invertY","exception","GetMimeType","loaderOptions","nonBase64Uri","IsBase64DataUrl","imageId","loadImageAsync","dataUrl","updateURL","internalTexture","getInternalTexture","textureName","_GetTextureSamplingMode","_GetTextureWrapMode","property","_extensionsLoadUriAsync","_ValidateUri","log","LoadFileError","babylonObject","pointer","_internalMetadata","pointers","magFilter","LINEAR_NEAREST","LINEAR_LINEAR","LINEAR_NEAREST_MIPNEAREST","LINEAR_LINEAR_MIPNEAREST","LINEAR_NEAREST_MIPLINEAR","LINEAR_LINEAR_MIPLINEAR","NEAREST_NEAREST","NEAREST_LINEAR","NEAREST_NEAREST_MIPNEAREST","NEAREST_LINEAR_MIPNEAREST","NEAREST_NEAREST_MIPLINEAR","NEAREST_LINEAR_MIPLINEAR","GetTypedArrayConstructor","componentTypeLength","PointListDrawMode","LineListDrawMode","LineLoopDrawMode","LineStripDrawMode","TriangleStripDrawMode","TriangleFanDrawMode","forceCompilationAsync","useInstances","clipPlane","lights_1","getShadowGenerator","_forEachExtensions","_applyExtensions","functionName","actionAsync","loaderProperty","_activeLoaderExtensionFunctions","activeLoaderExtensionFunctions","onLoading","onReady","_loadUriAsync","LoadExtensionAsync","LoadExtraAsync","extra","startPerformanceCounter","endPerformanceCounter","NAME","loader","extensionContext","_loadLightAsync","babylonScene","environmentTexture","imageData_1","specularImages","mipmap","faces","face","specularImageContext","RawCubeTexture","specularImageSize","irradianceCoefficients","sphericalHarmonics","SphericalHarmonics","convertIrradianceToLambertianRadiance","sphericalPolynomial","SphericalPolynomial","FromHarmonics","lodGenerationScale","log2","updateRGBDAsync","EXT_mesh_gpu_instancing","instanceCount","translationBuffer","rotationBuffer","scaleBuffer","colorBuffer","matrices","ComposeToRef","copyToArray","thinInstanceSetBuffer","EXT_meshopt_compression","bufferViewMeshopt","_meshOptData","MeshoptCompression","Default","decodeGltfBufferAsync","filter","EXT_texture_webp","EXT_texture_avif","babylonSpotLight","Backward","falloffType","Light","FALLOFF_GLTF","bufferData","iesProfileTexture","KHR_draco_mesh_compression","useNormalizedFlagFromAccessor","DracoDecoder","DefaultAvailable","dracoDecoder","uniqueId","_dracoBabylonGeometry","positionAccessor","_decodeMeshToGeometryForGltfAsync","KHR_lights","babylonLight","babylonDirectionalLight","setAll","RectAreaLight","newSize","sqrt","lightParentNode","BabylonTransformNode","RotationAxis","Up","KHR_materials_pbrSpecularGlossiness","_loadSpecularGlossinessPropertiesAsync","configureSpecularGlossiness","diffuseFactor","glossiness","glossinessFactor","diffuseTexture","specularGlossinessTexture","KHR_materials_unlit","_loadUnlitPropertiesAsync","isUnlit","_loadClearCoatPropertiesAsync","configureCoat","coatWeight","coatRoughness","coatWeightTexture","coatRoughnessTexture","geometryCoatNormalTexture","geometryCoatNormalTextureScale","KHR_materials_coat","_loadCoatPropertiesAsync","coatFactor","coatRoughnessFactor","coatTexture","coatNormalTexture","coatDarkening","coatDarkeningFactor","coatIor","colorFactor","coatColorFactor","fromArray","coatColor","coatColorTexture","coatAnisotropyWeight","coatAnisotropyStrength","coatAnisotropyAngle","coatAnisotropyRotation","coatRoughnessAnisotropy","geometryCoatTangentAngle","configureGltfStyleAnisotropy","coatAnisotropyTexture","geometryCoatTangentTexture","_loadIridescencePropertiesAsync","thinFilmWeight","thinFilmIor","iridescenceIOR","thinFilmThicknessMinimum","thinFilmThicknessMaximum","thinFilmWeightTexture","thinFilmThicknessTexture","_loadAnisotropyPropertiesAsync","anisotropyWeight","anisotropyAngle","specularRoughnessAnisotropy","geometryTangentAngle","EXT_materials_anisotropy_openpbr","openPbrAnisotropyEnabled","geometryTangentTexture","_loadEmissiveProperties","emissionLuminance","_loadSheenPropertiesAsync","configureFuzz","sheenColor","Black","sheenRoughness","fuzzWeight","fuzzColor","fuzzRoughness","fuzzColorTexture","fuzzRoughnessTexture","KHR_materials_fuzz","_loadFuzzPropertiesAsync","fuzzFactor","fuzzColorFactor","fuzzRoughnessFactor","fuzzTexture","fuzzWeightTexture","_loadSpecularPropertiesAsync","EXT_materials_specular_edge_color","specularEdgeColorEnabled","enableSpecularEdgeColor","specularWeight","specularWeightTexture","_loadIorPropertiesAsync","_DEFAULT_IOR","specularIor","KHR_materials_variants","GetAvailableVariants","extensionMetadata","_GetExtensionMetadata","variants","getAvailableVariants","SelectVariant","variantName","select","entries","entries_1","entry","variantName_1","lastSelected","selectVariant","Reset","original","reset","GetLastSelectedVariant","getLastSelectedVariant","_variants","rootBabylonMesh","defaultVariant","onLoaded","selectedVariant","lastSelectedVariant","isArray","root_1","extensionMetadata_1","mappingIndex","mapping","mappings","mappingVariantIndex","variantIndex","variant","onClonedObservable","newOne","newRoot","variantEntry","TransmissionHelper","_opaqueRenderTarget","_opaqueMeshesCache","_transparentMeshesCache","_materialObservers","_translucentMaterialIndices","_opaqueOnlySubMeshes","_savedSubMeshes","_options","_GetDefaultOptions","_scene","_transmissionHelper","_parseScene","_setupRenderTargets","renderSize","samples","lodGenerationOffset","renderTargetTextureType","TEXTURETYPE_HALF_FLOAT","generateMipmaps","updateOptions","newValues","newOptions","oldOptions","getOpaqueTarget","_classifyMeshMaterials","isTranslucent","refractionBackgroundTexture","hasTranslucent","hasOpaque","translucentIndices","subMat","_rebuildOpaqueOnlySubMeshes","sm","has","materialIndex","_addMesh","onMaterialChangedObservable","_onMeshMaterialChanged","_removeMesh","idx","onNewMeshAddedObservable","onMeshRemovedObservable","transparentIdx","opaqueIdx","_isRenderTargetValid","saveSceneEnvIntensity","RenderTargetTexture","ignoreCameraViewport","renderList","clearColor","clone","gammaSpace","renderSprites","renderParticles","disableImageProcessing","onBeforeBindObservable","opaqueRenderTarget","environmentIntensity","toLinearSpaceToRef","useExactSrgbConversions","tlEntries","tlEntry","opaqueOnly","onAfterUnbindObservable","savedEntries","savedEntry","mixedEntries","mixedEntry","_loadTransparentPropertiesAsync","transmissionWeight","configureTransmission","texturePromise","transmissionWeightTexture","_loadTranslucentPropertiesAsync","configureSubsurface","subsurfaceWeight","diffuseTransmissionTint","subsurfaceWeightTexture","diffuseTransmissionTintTexture","_loadVolumePropertiesAsync","geometryThinWalled","configureVolume","transmissionColor","transmissionDepth","volumeThickness","volumeThicknessTexture","KHR_materials_volume_scatter","scatterColor","multiscatterColorFactor","scatterAnisotropy","multiscatterColorTexture","transmissionScatterTexture","subsurfaceColorTexture","extinctionCoefficient","singleScatterAlbedo","multiScatter","multiScatterAlbedo","addInPlace","multiplyInPlace","subtractInPlace","z","subtract","multiScatterToSingleScatterAlbedo","scatteringCoefficient","transmissionScatter","transmissionScatterAnisotropy","subsurfaceScatterAnisotropy","subsurfaceColor","mfp","subsurfaceRadius","subsurfaceRadiusScale","_loadDispersionPropertiesAsync","transmissionDispersionAbbeNumber","transmissionDispersionScale","KHR_materials_diffuse_roughness","_loadDiffuseRoughnessPropertiesAsync","baseDiffuseRoughness","diffuseRoughnessFactor","diffuseRoughnessTexture","baseDiffuseRoughnessTexture","KHR_mesh_quantization","KHR_texture_basisu","useRGBAIfASTCBC7NotAvailableWhenUASTC","uRotationCenter","vRotationCenter","KHR_xmp_json_ld","xmpGltf","xmpNode","packet","packets","xmp","getVector3","_target","getQuaternion","getWeights","AnimationPropertyInfo","_buildAnimation","TransformNodeAnimationPropertyInfo","babylonAnimations","WeightAnimationPropertyInfo","targetIndex","morphTarget","babylonAnimationClone","ANIMATIONTYPE_FLOAT","getColor3","getFloat","getMinusFloat","getNextFloat","getFloatBy2","getTextureTransformTree","MaterialAnimationPropertyInfo","CameraAnimationPropertyInfo","LightAnimationPropertyInfo","MeshAnimationPropertyInfo","ANIMATIONTYPE_COLOR3","baseColorTextureInterpolation","metallicRoughnessTextureInterpolation","normalTextureInterpolation","occlusionTextureInterpolation","emissiveTextureInterpolation","anisotropyTextureInterpolation","clearcoatTextureInterpolation","clearcoatNormalTextureInterpolation","clearcoatRoughnessTextureInterpolation","iridescenceTextureInterpolation","iridescenceThicknessTextureInterpolation","sheenTextureInterpolation","sheenRoughnessTextureInterpolation","specularTextureInterpolation","specularColorTextureInterpolation","transmissionTextureInterpolation","thicknessTextureInterpolation","diffuseTransmissionTextureInterpolation","diffuseTransmissionColorTextureInterpolation","KHR_animation_pointer","_pathToObjectConverter","obj","MSFT_audio_emitter","_clips","_emitters","clips","emitters","emitterIndex","emitter","refDistance","maxDistance","rolloffFactor","distanceModel","outerAngle","_loadEmitterAsync","_babylonSounds","sound","attachToMesh","setLocalDirectionToMesh","Forward","setDirectionalCone","ToDegrees","events","event_1","_loadAnimationEventAsync","_loadClipAsync","clip","_objectURL","_babylonData","clipPromises","options_1","loop","autoplay","volume","clipContext","objectURL","Sound","weightedSound","WeightedSound","directionalConeInnerAngle","directionalConeOuterAngle","_getEventAction","time","startOffset","currentFrame","frameOffset","play","stop","pause","babylonAnimationEvent","AnimationEvent","addEvent","onAnimationGroupEndObservable","onAnimationGroupPauseObservable","MSFT_lod","maxLODsToLoad","onNodeLODsLoadedObservable","onMaterialLODsLoadedObservable","_bufferLODs","_nodeIndexLOD","_nodeSignalLODs","_nodePromiseLODs","_nodeBufferLODs","_materialIndexLOD","_materialSignalLODs","_materialPromiseLODs","_materialBufferLODs","indexLOD","_loadBufferLOD","this_2","nodeLODs","_getLODs","ids","nodeLOD","this_3","previousNodeLOD","_disposeTransformNode","firstPromise","materialLODs","materialLOD","this_4","previousDataLOD","_disposeMaterials","previousIndexLOD","bufferLODs","end","bufferLOD","babylonMaterials","getChildMeshes","babylonMaterialsToDispose","every","babylonTextures","babylonMaterials_1","getActiveTextures","hasTexture","MSFT_minecraftMesh","extraContext","forceDepthWrite","separateCullingPass","MSFT_sRGBFactors","getMappingForFullOperationName","fullOperationName","getMappingForDeclaration","declaration","returnNoOpIfNotAvailable","gltfExtensionsToFlowGraphMapping","gltfToFlowGraphMapping","inputs","outputs_1","flows","inputValueSockets","outputValueSockets","blocks","outputs","addNewInteractivityFlowGraphMapping","out","timeSinceLastTick","gltfType","extraProcessor","gltfBlock","_mapping","parser","serializedObjects","configuration","eventId","arrays","serializedObject","config","eventData","validation","interactivityGraph","valid","eventConfiguration","getSimpleInputMapping","roundHalfAwayFromZero","_gltfBlock","_declaration","_parser","useMatrixPerComponent","preventIntegerFloatArithmetic","types","flowGraphType","ValidateTypes","condition","c","dataInputs","_connectionValues","axis","inputIsColumnMajor","h","l","o","socketIn","valueType","socketInA","socketInB","_arrays","outputSignalCount","signalOutputs","true","false","cases","inOptions","defaultValue","selection","default","caseValue","toString","uniqueCases","loopBody","initialIndex","startIndex","endIndex","incrementIndexWhenLoopDone","currentCount","isRandom","isLoop","inputFlows","err","variable","isVariable","dataTransformer","getVariableName","variables","useSlerp","duration","p1","toBlock","p2","in","interBlockConnectors","inputBlockIndex","outputBlockIndex","serializedValueInterpolation","propertyIndex","staticVariables","getAnimationTypeByFlowGraphType","serializedGetVariable","className","outputValue","speed","startTime","_animationTargetFps","endTime","_context","globalGLTF","glTF","stopTime","treatCasesAsIntegers","inferType","reduce","acc","type_1","types_1","getAllSupportedNativeNodeTypes","gltfTypeToBabylonType","float","elementType","bool","float2","float3","float4","float4x4","float2x2","float3x3","int","InteractivityGraphToFlowGraphParser","_interactivityGraph","_types","_mappings","_staticVariables","_events","_internalEventsCounter","_nodes","_parseTypes","_parseDeclarations","_parseVariables","_parseEvents","_parseNodes","signature","declarations","flowGraphMapping","_parseVariable","dataTransform","NaN","fill","parseFloat","converted","eventValue","validationResult","blockType","block","_getEmptyBlock","_parseNodeConfiguration","RandomGUID","dataOutputs","signalInputs","nodeMapping","gltfConfiguration","gltfProperty","propertyMapping","_parseNodeConnections","gltfNode","flowGraphBlocks","outputMapper","flowsFromGLTF","flowsKeys","flowKey","flow","flowMapping","socketOutName","socketOut","_createNewSocketConnection","inputNodeId","nodeIn","inputMapper","flowInMapping","socket","arrayMapping","endsWith","nodeInSocketName","inputBlock","connectedPointIds","flowsKeys_1","valuesFromGLTF","valuesKeys","valueKey","valueMapping","socketInName","convertedValue","nodeOutId","nodeOutSocketName","nodeOut","outputMapper_1","valueMapping_1","arrayMapping_1","socketOutName_1","outBlock","valuesKeys_1","connector","_connectFlowGraphNodes","isOutput","_connectionType","serializedInput","serializedOutput","inputArray","outputArray","inputConnection","outputConnection","serializeToFlowGraph","_userVariables","rightHanded","allBlocks","val","executionContexts","KHR_interactivity","_pathConverter","_AddInteractivityObjectModel","interactivityDefinition","coordinator","FlowGraphCoordinator","dispatchEventsSynchronously","graphs","graph","ParseFlowGraphAsync","pathConverter","activeCamera","quat","w","pos","getTranslation","isPlaying","to","getCurrentFrame","addToBlockFactory","FlowGraphGLTFDataProvider","tn","inheritVisibility","stopPropagation","nodeIndex","selectedNodeIndex","controllerIndex","selectionPoint","selectionRayOrigin","variableName","isPickable","KHR_node_selectability","selectable","MeshPointerOverPrefix","hoverNodeIndex","MeshPointerOutPrefix","pointerOverDisableMeshTesting","KHR_node_hoverability","hoverable","ExtrasAsMetadata","_assignExtras","gltfProp","registerDataOutput","RichTypeAny","FlowGraphBlock","_specWorkflow","_diffuseTransmissionTint","_diffuseTransmissionTintTexture","_material","unlit","_useAlphaFromBaseColorTexture","_useRoughnessFromMetallicTextureGreen","_useMetallicFromMetallicTextureBlue","_enableEdgeColor","_useSpecularWeightFromSpecularColorTexture","_useSpecularWeightFromAlpha","_useCoatRoughnessFromGreenChannel","coatDarkeningTexture","_useCoatRoughnessAnisotropyFromTangentTexture","equals","backgroundRefractionTexture","geometryThicknessTexture","_useGeometryThicknessFromGreenChannel","geometryThickness","_useSubsurfaceWeightFromTextureAlpha","_useFuzzRoughnessFromTextureAlpha","_useSpecularRoughnessAnisotropyFromTangentTexture","useGltfStyle","_useGltfStyleAnisotropy","thinFilmThicknessMin","thinFilmThickness","_useThinFilmThicknessFromTextureGreen","invertX","copySurfaceToCoatAsync","TextureChannel","A","aborted","transmissionColorTexture","R","InvertTextureAsync","ExtractChannelAsync","CreateTextureWithFactorOperand","TextureColorSpace","Linear","ChannelMask","newRoughnessTexture","factor","ExtractMaxChannelAsync","toColor4","RGBA","SRGB","RGB","newMetallic","LerpTexturesAsync","colorSpace","newBaseColor","oldBaseColorTexture","oldSpecularColorTexture","weight_1","weightTexture_1","weightTextureChannel_1","color_1","colorTexture_1","weightTexture","weightTextureChannel","colorTexture","diffuseTransmission","origCoatWeight","origCoatWeightTexture","origCoatColor","origCoatColorTexture","origCoatNormalTexture","origCoatWeightCol4","weightCol4","allSettled","results","results_1","lerpCoatColor","lerpSurfaceColor","MultiplyTexturesAsync","newCoatColor","newCoatIor","G","newCoatRoughness","newCoatDarkening","newSpecularRoughness","newCoatNormal","enableSpecularAntiAliasing","useAlphaFromAlbedoTexture","useRadianceOverAlpha","useSpecularOverAlpha","albedoTexture","brdf","baseDiffuseModel","MATERIAL_DIFFUSE_MODEL_E_OREN_NAYAR","metallicTexture","useRoughnessFromMetallicTextureAlpha","useMetallnessFromMetallicTextureBlue","enableEdgeColor","dielectricSpecularModel","MATERIAL_DIELECTRIC_SPECULAR_MODEL_OPENPBR","conductorSpecularModel","MATERIAL_CONDUCTOR_SPECULAR_MODEL_OPENPBR","useMicroSurfaceFromReflectivityMapAlpha","metallicReflectanceTexture","useOnlyMetallicFromMetallicReflectanceTexture","reflectivityColor","reflectivityTexture","reflectanceTexture","microSurface","ambientTexture","useAmbientInGrayScale","isEnabled","useRoughnessFromMainTexture","remapF0OnInterfaceChange","isTintEnabled","tintTexture","textureRoughness","isRefractionEnabled","refractionIntensityTexture","useGltfStyleTextures","diffusionDistance","isDispersionEnabled","refractionTexture","volumeIndexOfRefraction","useAlbedoToTintRefraction","useThicknessAsDepth","useAlbedoToTintTranslucency","isTranslucencyEnabled","translucencyIntensityTexture","absorptionCoeff","maxChannel","exp","translucencyColorTexture","scatteringDiffusionProfile","albedoScaling","forceIrradianceInFragment","invertNormalMapX","invertNormalMapY","LoaderExtensions","GLTF2Loader","GLTF2Legacy","GLTF2","BABYLON_1","Loader"],"mappings":"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","x_google_ignoreList":[0]}
|