babylonjs-loaders 8.47.0 → 8.47.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"babylon.glTF1FileLoader.min.js","mappings":"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","sources":["webpack://LOADERS/webpack/universalModuleDefinition","webpack://LOADERS/external umd {\"root\":\"BABYLON\",\"commonjs\":\"babylonjs\",\"commonjs2\":\"babylonjs\",\"amd\":\"babylonjs\"}","webpack://LOADERS/webpack/bootstrap","webpack://LOADERS/webpack/runtime/define property getters","webpack://LOADERS/webpack/runtime/global","webpack://LOADERS/webpack/runtime/hasOwnProperty shorthand","webpack://LOADERS/webpack/runtime/make namespace object","webpack://LOADERS/../../../../node_modules/tslib/tslib.es6.mjs","webpack://LOADERS/../../../dev/loaders/src/glTF/glTFValidation.ts","webpack://LOADERS/../../../dev/loaders/src/glTF/glTFFileLoader.ts","webpack://LOADERS/../../../dev/loaders/src/glTF/glTFFileLoader.metadata.ts","webpack://LOADERS/../../../lts/loaders/src/legacy/legacy-glTF.ts","webpack://LOADERS/../../../dev/loaders/src/glTF/1.0/glTFLoaderInterfaces.ts","webpack://LOADERS/../../../dev/loaders/src/glTF/1.0/glTFLoaderUtils.ts","webpack://LOADERS/../../../dev/loaders/src/glTF/1.0/glTFLoader.ts","webpack://LOADERS/../../../dev/loaders/src/glTF/1.0/glTFBinaryExtension.ts","webpack://LOADERS/../../../dev/loaders/src/glTF/1.0/glTFMaterialsCommonExtension.ts","webpack://LOADERS/../../../lts/loaders/src/legacy/legacy-glTF1.ts","webpack://LOADERS/./src/glTF1FileLoader.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"babylonjs\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"babylonjs-loaders\", [\"babylonjs\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"babylonjs-loaders\"] = factory(require(\"babylonjs\"));\n\telse\n\t\troot[\"LOADERS\"] = factory(root[\"BABYLON\"]);\n})((typeof self !== \"undefined\" ? self : typeof global !== \"undefined\" ? global : this), (__WEBPACK_EXTERNAL_MODULE__597__) => {\nreturn ","module.exports = __WEBPACK_EXTERNAL_MODULE__597__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\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;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\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);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\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;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\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;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\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]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\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; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\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);\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); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\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\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\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\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\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 { 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 * 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 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 } from \"core/Misc/observable\";\r\nimport { 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 type { ISceneLoaderPluginFactory, ISceneLoaderPluginAsync, ISceneLoaderProgressEvent, ISceneLoaderAsyncResult, SceneLoaderPluginOptions } from \"core/Loading/sceneLoader\";\r\nimport { RegisterSceneLoaderPlugin } from \"core/Loading/sceneLoader\";\r\nimport { AssetContainer } from \"core/assetContainer\";\r\nimport type { Scene, 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 } from \"core/Misc/dataReader\";\r\nimport { DataReader } from \"core/Misc/dataReader\";\r\nimport { GLTFValidation } from \"./glTFValidation\";\r\nimport { GLTFFileLoaderMetadata, GLTFMagicBase64Encoded } from \"./glTFFileLoader.metadata\";\r\nimport type { LoadFileError } from \"core/Misc/fileTools\";\r\nimport { 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, 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","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","/* 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 type { IGLTFTechniqueParameter, IGLTFAccessor, IGLTFRuntime, IGLTFBufferView } from \"./glTFLoaderInterfaces\";\r\nimport { EParameterType, ETextureWrapMode, ETextureFilterType, EComponentType } 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 type {\r\n IGLTFRuntime,\r\n IGLTFTechniqueParameter,\r\n IGLTFAnimation,\r\n IGLTFAnimationSampler,\r\n IGLTFNode,\r\n IGLTFSkins,\r\n INodeToRoot,\r\n IJointNode,\r\n IGLTFMesh,\r\n IGLTFAccessor,\r\n IGLTFLight,\r\n IGLTFAmbienLight,\r\n IGLTFDirectionalLight,\r\n IGLTFPointLight,\r\n IGLTFSpotLight,\r\n IGLTFCamera,\r\n IGLTFCameraPerspective,\r\n IGLTFScene,\r\n IGLTFTechnique,\r\n IGLTFMaterial,\r\n IGLTFProgram,\r\n IGLTFBuffer,\r\n IGLTFTexture,\r\n IGLTFImage,\r\n IGLTFSampler,\r\n IGLTFShader,\r\n IGLTFTechniqueStates,\r\n} from \"./glTFLoaderInterfaces\";\r\nimport { EParameterType, ETextureFilterType, ECullingType, EBlendingFunction, EShaderType } from \"./glTFLoaderInterfaces\";\r\n\r\nimport type { FloatArray, 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, ISceneLoaderProgressEvent } from \"core/Loading/sceneLoader\";\r\nimport type { Scene } from \"core/scene\";\r\n\r\nimport { GLTFUtils } from \"./glTFLoaderUtils\";\r\nimport type { IGLTFLoader, IGLTFLoaderData } from \"../glTFFileLoader\";\r\nimport { GLTFFileLoader } from \"../glTFFileLoader\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { AssetContainer } from \"core/assetContainer\";\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> = null;\r\n let outputData: Nullable<string> = null;\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 = null;\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> = null;\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 = false;\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> = null;\r\n let buffer: any = null;\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\r\n const blob = buffer == null ? new Blob() : new Blob([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, IGLTFTexture, IGLTFImage, IGLTFBufferView, IGLTFShader } from \"./glTFLoaderInterfaces\";\r\nimport { 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, 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","// eslint-disable-next-line import/export\r\nimport * as loaders from \"@lts/loaders/legacy/legacy-glTF1FileLoader\";\r\nexport { loaders };\r\nexport default loaders;\r\n"],"names":["root","factory","exports","module","require","define","amd","self","global","this","__WEBPACK_EXTERNAL_MODULE__597__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","d","definition","key","o","Object","defineProperty","enumerable","get","g","globalThis","Function","e","window","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","extendStatics","b","setPrototypeOf","__proto__","Array","p","__extends","TypeError","String","__","constructor","create","__assign","assign","t","s","i","n","arguments","length","apply","SuppressedError","ValidateAsync","data","rootUrl","fileName","getExternalResource","options","externalResourceFunction","uri","ArrayBuffer","isView","GLTFValidator","validateBytes","validateString","WorkerFunc","pendingExternalResources","onmessage","message","id","importScripts","url","Promise","resolve","reject","index","push","postMessage","then","reason","GLTFLoaderCoordinateSystemMode","GLTFLoaderAnimationStartMode","GLTFLoaderState","Worker","workerContent","workerBlobUrl","URL","createObjectURL","Blob","type","worker","onError","error","removeEventListener","onMessage","buffer","terminate","addEventListener","Tools","GetBabylonScriptURL","Configuration","slicedData","slice","_LoadScriptPromise","LoadBabylonScriptAsync","_DefaultCdnUrl","GLTFMagicBase64Encoded","GLTFFileLoaderMetadata","isBinary","mimeType","readAsync","arrayBuffer","byteOffset","byteLength","Uint8Array","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","GLTFLoaderBaseOptions","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","copyFrom","callback","_onParsedObserver","remove","add","_onMeshLoadedObserver","_onSkinLoadedObserver","node","skinnedNode","_onTextureLoadedObserver","_onMaterialLoadedObserver","_onCameraLoadedObserver","_onCompleteObserver","_onErrorObserver","_onDisposeObserver","_onExtensionLoadedObserver","_logEnabled","_startPerformanceCounterEnabled","_endPerformanceCounterEnabled","_onValidatedObserver","dispose","abort","_progressCallback","preprocessUrlAsync","clear","notifyObservers","loadFile","scene","fileOrUrl","onSuccess","onProgress","useArrayBuffer","_loadBinary","GetFilename","Logger","Warn","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","result","geometries","meshes","particleSystems","skeletons","animationGroups","lights","transformNodes","canDirectLoad","indexOf","startsWith","directLoad","DecodeBase64UrlToBinary","createPlugin","GLTFFileLoader","whenCompleteAsync","addOnce","_setState","state","onOpened","request","event","_onProgress","_lengthComputable","_total","_loaded","lengthComputable","loaded","total","GLTFValidation","_loadFileAsync","asset","version","minVersion","generator","_parseVersion","Error","_compareVersion","major","minor","createLoader","_CreateGLTF1Loader","_CreateGLTF2Loader","parsed","JSON","parse","dataReader","magic","readUint32","RuntimeError","ErrorCodes","GLTFLoaderUnexpectedMagicError","loggingEnabled","unpacked","_unpackBinaryV1Async","_unpackBinaryV2Async","contentLength","contentFormat","bodyLength","readString","bin","ChunkFormat","chunkLength","skipBytes","match","parseInt","a","_logOpen","_logClose","spaces","_logSpaces","substring","Log","counterName","StartPerformanceCounter","EndPerformanceCounter","IncrementalLoading","HomogeneousCoordinates","extensionOptions","capturePerformanceCounters","customRootNode","onCameraLoaded","onMaterialLoaded","onMeshLoaded","onParsed","onSkinLoaded","onTextureLoaded","onValidated","RegisterSceneLoaderPlugin","EComponentType","EShaderType","EParameterType","ETextureWrapMode","ETextureFilterType","ETextureFormat","ECullingType","EBlendingFunction","GlobalObject","BABYLON","ETokenType","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","GLTFUtils","DecodeBufferToText","view","fromCharCode","GetDefaultMaterial","_DefaultMaterial","Effect","ShadersStore","join","attributes","uniforms","samplers","needAlphaBlending","ShaderMaterial","vertex","fragment","setColor4","Color4","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","set","positions","uvKind","VertexBuffer","UVKind","uvs","matricesIndices","matricesWeights","colors","indices","Int32Array","merge","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","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","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","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","Tokenizer","pixelTokenizer","SAMPLER_2D","attr","attribute","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","RegisterExtension","extension","GLTFLoader","Extensions","_importMeshAsync","useRightHandedSystem","LoadRuntimeAsync","_createNodes","AbstractMesh","skl","_loadBuffersAsync","_loadShadersAsync","spriteManagers","_loadAsync","LoadRuntimeExtensionsAsync","thisArg","_arguments","body","f","y","label","sent","trys","ops","Iterator","next","verb","iterator","v","op","done","pop","step","P","fulfilled","rejected","onload","hasShaders","processShader","VERTEX","bind","onLoad","hasBuffers","processBuffer","_name","loadRuntimeAsync","loadRuntimeExtensionsAsync","loadBufferAsync","loadTextureBufferAsync","createTextureAsync","loadShaderStringAsync","loadMaterialAsync","_ApplyExtensions","loaderExtension","GLTFLoaderBase","_LoadTextureBufferAsync","_CreateTextureAsync","func","defaultFunc","extensionName","_bin","sourceExt","binaryExtensionShader","shaderBytes","GLTFBinaryExtension","ambientLight","ambient","point","directional","spot","fallOffAngle","Math","PI","standardMaterial","disableLighting","doubleSided","alpha","transparency","specularPower","shininess","_loadTexture","ambientColor","emission","emissiveColor","specular","specularColor","propertyPath","GLTFMaterialsCommonExtension","GLTF1"],"ignoreList":[],"sourceRoot":""}
1
+ {"version":3,"file":"babylon.glTF1FileLoader.min.js","mappings":"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","sources":["webpack://LOADERS/webpack/universalModuleDefinition","webpack://LOADERS/external umd {\"root\":\"BABYLON\",\"commonjs\":\"babylonjs\",\"commonjs2\":\"babylonjs\",\"amd\":\"babylonjs\"}","webpack://LOADERS/webpack/bootstrap","webpack://LOADERS/webpack/runtime/define property getters","webpack://LOADERS/webpack/runtime/global","webpack://LOADERS/webpack/runtime/hasOwnProperty shorthand","webpack://LOADERS/webpack/runtime/make namespace object","webpack://LOADERS/../../../../node_modules/tslib/tslib.es6.mjs","webpack://LOADERS/../../../dev/loaders/src/glTF/glTFValidation.ts","webpack://LOADERS/../../../dev/loaders/src/glTF/glTFFileLoader.ts","webpack://LOADERS/../../../dev/loaders/src/glTF/glTFFileLoader.metadata.ts","webpack://LOADERS/../../../lts/loaders/src/legacy/legacy-glTF.ts","webpack://LOADERS/../../../dev/loaders/src/glTF/1.0/glTFLoaderInterfaces.ts","webpack://LOADERS/../../../dev/loaders/src/glTF/1.0/glTFLoaderUtils.ts","webpack://LOADERS/../../../dev/loaders/src/glTF/1.0/glTFLoader.ts","webpack://LOADERS/../../../dev/loaders/src/glTF/1.0/glTFBinaryExtension.ts","webpack://LOADERS/../../../dev/loaders/src/glTF/1.0/glTFMaterialsCommonExtension.ts","webpack://LOADERS/../../../lts/loaders/src/legacy/legacy-glTF1.ts","webpack://LOADERS/./src/glTF1FileLoader.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"babylonjs\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"babylonjs-loaders\", [\"babylonjs\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"babylonjs-loaders\"] = factory(require(\"babylonjs\"));\n\telse\n\t\troot[\"LOADERS\"] = factory(root[\"BABYLON\"]);\n})((typeof self !== \"undefined\" ? self : typeof global !== \"undefined\" ? global : this), (__WEBPACK_EXTERNAL_MODULE__597__) => {\nreturn ","module.exports = __WEBPACK_EXTERNAL_MODULE__597__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\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;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\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);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\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;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\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;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\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]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\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; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\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);\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); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\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\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\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\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __esDecorate,\n __runInitializers,\n __propKey,\n __setFunctionName,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n __rewriteRelativeImportExtension,\n};\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 } from \"core/Misc/observable\";\r\nimport { 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 type { ISceneLoaderPluginFactory, ISceneLoaderPluginAsync, ISceneLoaderProgressEvent, ISceneLoaderAsyncResult, SceneLoaderPluginOptions } from \"core/Loading/sceneLoader\";\r\nimport { RegisterSceneLoaderPlugin } from \"core/Loading/sceneLoader\";\r\nimport { AssetContainer } from \"core/assetContainer\";\r\nimport type { Scene, 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 } from \"core/Misc/dataReader\";\r\nimport { DataReader } from \"core/Misc/dataReader\";\r\nimport { GLTFValidation } from \"./glTFValidation\";\r\nimport { GLTFFileLoaderMetadata, GLTFMagicBase64Encoded } from \"./glTFFileLoader.metadata\";\r\nimport type { LoadFileError } from \"core/Misc/fileTools\";\r\nimport { 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, 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","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","/* 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 type { IGLTFTechniqueParameter, IGLTFAccessor, IGLTFRuntime, IGLTFBufferView } from \"./glTFLoaderInterfaces\";\r\nimport { EParameterType, ETextureWrapMode, ETextureFilterType, EComponentType } 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 type {\r\n IGLTFRuntime,\r\n IGLTFTechniqueParameter,\r\n IGLTFAnimation,\r\n IGLTFAnimationSampler,\r\n IGLTFNode,\r\n IGLTFSkins,\r\n INodeToRoot,\r\n IJointNode,\r\n IGLTFMesh,\r\n IGLTFAccessor,\r\n IGLTFLight,\r\n IGLTFAmbienLight,\r\n IGLTFDirectionalLight,\r\n IGLTFPointLight,\r\n IGLTFSpotLight,\r\n IGLTFCamera,\r\n IGLTFCameraPerspective,\r\n IGLTFScene,\r\n IGLTFTechnique,\r\n IGLTFMaterial,\r\n IGLTFProgram,\r\n IGLTFBuffer,\r\n IGLTFTexture,\r\n IGLTFImage,\r\n IGLTFSampler,\r\n IGLTFShader,\r\n IGLTFTechniqueStates,\r\n} from \"./glTFLoaderInterfaces\";\r\nimport { EParameterType, ETextureFilterType, ECullingType, EBlendingFunction, EShaderType } from \"./glTFLoaderInterfaces\";\r\n\r\nimport type { FloatArray, 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, ISceneLoaderProgressEvent } from \"core/Loading/sceneLoader\";\r\nimport type { Scene } from \"core/scene\";\r\n\r\nimport { GLTFUtils } from \"./glTFLoaderUtils\";\r\nimport type { IGLTFLoader, IGLTFLoaderData } from \"../glTFFileLoader\";\r\nimport { GLTFFileLoader } from \"../glTFFileLoader\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { AssetContainer } from \"core/assetContainer\";\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> = null;\r\n let outputData: Nullable<string> = null;\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 = null;\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> = null;\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 = false;\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> = null;\r\n let buffer: any = null;\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\r\n const blob = buffer == null ? new Blob() : new Blob([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, IGLTFTexture, IGLTFImage, IGLTFBufferView, IGLTFShader } from \"./glTFLoaderInterfaces\";\r\nimport { 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, 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","// eslint-disable-next-line import/export\r\nimport * as loaders from \"@lts/loaders/legacy/legacy-glTF1FileLoader\";\r\nexport { loaders };\r\nexport default loaders;\r\n"],"names":["root","factory","exports","module","require","define","amd","self","global","this","__WEBPACK_EXTERNAL_MODULE__597__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","d","definition","key","o","Object","defineProperty","enumerable","get","g","globalThis","Function","e","window","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","extendStatics","b","setPrototypeOf","__proto__","Array","p","__extends","TypeError","String","__","constructor","create","__assign","assign","t","s","i","n","arguments","length","apply","SuppressedError","ValidateAsync","data","rootUrl","fileName","getExternalResource","options","externalResourceFunction","uri","ArrayBuffer","isView","GLTFValidator","validateBytes","validateString","WorkerFunc","pendingExternalResources","onmessage","message","id","importScripts","url","Promise","resolve","reject","index","push","postMessage","then","reason","GLTFLoaderCoordinateSystemMode","GLTFLoaderAnimationStartMode","GLTFLoaderState","Worker","workerContent","workerBlobUrl","URL","createObjectURL","Blob","type","worker","onError","error","removeEventListener","onMessage","buffer","GLTFValidation","_LastResults","terminate","addEventListener","Tools","GetBabylonScriptURL","Configuration","slicedData","slice","_LoadScriptPromise","LoadBabylonScriptAsync","_DefaultCdnUrl","GLTFMagicBase64Encoded","GLTFFileLoaderMetadata","isBinary","mimeType","readAsync","arrayBuffer","byteOffset","byteLength","Uint8Array","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","GLTFLoaderBaseOptions","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","copyFrom","callback","_onParsedObserver","remove","add","_onMeshLoadedObserver","_onSkinLoadedObserver","node","skinnedNode","_onTextureLoadedObserver","_onMaterialLoadedObserver","_onCameraLoadedObserver","_onCompleteObserver","_onErrorObserver","_onDisposeObserver","_onExtensionLoadedObserver","_logEnabled","_startPerformanceCounterEnabled","_endPerformanceCounterEnabled","_onValidatedObserver","dispose","abort","_progressCallback","preprocessUrlAsync","clear","notifyObservers","loadFile","scene","fileOrUrl","onSuccess","onProgress","useArrayBuffer","_loadBinary","GetFilename","Logger","Warn","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","result","geometries","meshes","particleSystems","skeletons","animationGroups","lights","transformNodes","canDirectLoad","indexOf","startsWith","directLoad","DecodeBase64UrlToBinary","createPlugin","GLTFFileLoader","whenCompleteAsync","addOnce","_setState","state","onOpened","request","event","_onProgress","_lengthComputable","_total","_loaded","lengthComputable","loaded","total","_loadFileAsync","asset","version","minVersion","generator","_parseVersion","Error","_compareVersion","major","minor","createLoader","_CreateGLTF1Loader","_CreateGLTF2Loader","parsed","JSON","parse","dataReader","magic","readUint32","RuntimeError","ErrorCodes","GLTFLoaderUnexpectedMagicError","loggingEnabled","unpacked","_unpackBinaryV1Async","_unpackBinaryV2Async","contentLength","contentFormat","bodyLength","readString","bin","ChunkFormat","chunkLength","skipBytes","match","parseInt","a","_logOpen","_logClose","spaces","_logSpaces","substring","Log","counterName","StartPerformanceCounter","EndPerformanceCounter","IncrementalLoading","HomogeneousCoordinates","extensionOptions","capturePerformanceCounters","customRootNode","onCameraLoaded","onMaterialLoaded","onMeshLoaded","onParsed","onSkinLoaded","onTextureLoaded","onValidated","RegisterSceneLoaderPlugin","EComponentType","EShaderType","EParameterType","ETextureWrapMode","ETextureFilterType","ETextureFormat","ECullingType","EBlendingFunction","GlobalObject","BABYLON","ETokenType","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","GLTFUtils","DecodeBufferToText","view","fromCharCode","GetDefaultMaterial","_DefaultMaterial","Effect","ShadersStore","join","attributes","uniforms","samplers","needAlphaBlending","ShaderMaterial","vertex","fragment","setColor4","Color4","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","set","positions","uvKind","VertexBuffer","UVKind","uvs","matricesIndices","matricesWeights","colors","indices","Int32Array","merge","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","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","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","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","Tokenizer","pixelTokenizer","SAMPLER_2D","attr","attribute","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","RegisterExtension","extension","GLTFLoader","Extensions","_importMeshAsync","useRightHandedSystem","LoadRuntimeAsync","_createNodes","AbstractMesh","skl","_loadBuffersAsync","_loadShadersAsync","spriteManagers","_loadAsync","LoadRuntimeExtensionsAsync","thisArg","_arguments","body","f","y","label","sent","trys","ops","Iterator","next","verb","iterator","v","op","done","pop","step","P","fulfilled","rejected","onload","hasShaders","processShader","VERTEX","bind","onLoad","hasBuffers","processBuffer","_name","loadRuntimeAsync","loadRuntimeExtensionsAsync","loadBufferAsync","loadTextureBufferAsync","createTextureAsync","loadShaderStringAsync","loadMaterialAsync","_ApplyExtensions","loaderExtension","GLTFLoaderBase","_LoadTextureBufferAsync","_CreateTextureAsync","func","defaultFunc","extensionName","_bin","sourceExt","binaryExtensionShader","shaderBytes","GLTFBinaryExtension","ambientLight","ambient","point","directional","spot","fallOffAngle","Math","PI","standardMaterial","disableLighting","doubleSided","alpha","transparency","specularPower","shininess","_loadTexture","ambientColor","emission","emissiveColor","specular","specularColor","propertyPath","GLTFMaterialsCommonExtension","GLTF1"],"ignoreList":[],"sourceRoot":""}