@galacean/effects-plugin-model 2.7.4 → 2.8.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"douyin.mjs","sources":["../src/plugin/const.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_async_to_generator.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_set_prototype_of.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_inherits.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_instanceof.js","../../../node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.es6.mjs","../src/runtime/anim-sampler.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_array_like_to_array.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_create_for_of_iterator_helper_loose.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_unsupported_iterable_to_array.js","../src/runtime/math.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_create_class.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_extends.js","../src/runtime/common.ts","../src/runtime/object.ts","../../../packages/effects-helper/dist/serialize/geometry.js","../src/utility/debug-helper.ts","../src/utility/ri-helper.ts","../src/runtime/shader-libs/standard-shader-source.ts","../src/runtime/shader-libs/standard-shader.ts","../src/utility/shader-helper.ts","../src/utility/ts-helper.ts","../src/plugin/model-item.ts","../src/utility/hit-test-helper.ts","../src/utility/plugin-helper.ts","../src/runtime/animation.ts","../src/runtime/shader.ts","../src/runtime/material.ts","../src/runtime/skybox.ts","../src/runtime/cache.ts","../src/runtime/camera.ts","../src/runtime/light.ts","../src/runtime/mesh.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_assert_this_initialized.js","../src/runtime/scene.ts","../src/plugin/model-plugin.ts","../src/plugin/model-tree-component.ts","../src/gesture/protocol.ts","../src/gesture/index.ts","../src/gltf/loader-helper.ts","../src/gltf/json-converter.ts","../src/gltf/loader-impl.ts","../src/index.ts"],"sourcesContent":["import type { spec } from '@galacean/effects';\n\n/**\n * Model 插件元素类型\n */\nexport const VFX_ITEM_TYPE_3D = 'PluginModel' as spec.ItemType;\n","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) resolve(value);\n else Promise.resolve(value).then(_next, _throw);\n}\nfunction _async_to_generator(fn) {\n return function() {\n var self = this, args = arguments;\n\n return new Promise(function(resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}\nexport { _async_to_generator as _ };\n","function _set_prototype_of(o, p) {\n _set_prototype_of = Object.setPrototypeOf || function setPrototypeOf(o, p) {\n o.__proto__ = p;\n\n return o;\n };\n\n return _set_prototype_of(o, p);\n}\nexport { _set_prototype_of as _ };\n","import { _ as _set_prototype_of } from \"./_set_prototype_of.js\";\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } });\n\n if (superClass) _set_prototype_of(subClass, superClass);\n}\nexport { _inherits as _ };\n","function _instanceof(left, right) {\n if (right != null && typeof Symbol !== \"undefined\" && right[Symbol.hasInstance]) {\n return !!right[Symbol.hasInstance](left);\n } else return left instanceof right;\n}\nexport { _instanceof as _ };\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","/**\n * 抽象插值采样类\n */\nexport abstract class InterpolationSampler {\n protected cachedIndex = 0;\n\n constructor (\n protected time: Float32Array,\n protected data: Float32Array,\n protected componentCount: number,\n ) { }\n\n /**\n * 计算当前 t 时刻的插值\n * @param t - 当前时间\n * @returns 插值结果\n */\n evaluate (t: number) {\n const pp = this.time;\n let i1 = this.cachedIndex;\n let t1 = pp[i1];\n let t0 = pp[i1 - 1];\n\n validate_interval: {\n seek: {\n let right: number;\n\n linear_scan: {\n //- See http://jsperf.com/comparison-to-undefined/3\n //- slower code:\n //-\n //- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n forward_scan: if (!(t < t1)) {\n for (let giveUpAt = i1 + 2; ;) {\n if (t1 === undefined) {\n if (t < t0) { break forward_scan; }\n\n // after end\n i1 = pp.length;\n this.cachedIndex = i1;\n\n return this.copySampleValue(i1 - 1);\n }\n\n if (i1 === giveUpAt) { break; } // this loop\n\n t0 = t1;\n t1 = pp[++i1];\n\n if (t < t1) {\n // we have arrived at the sought interval\n break seek;\n }\n }\n\n // prepare binary search on the right side of the index\n right = pp.length;\n\n break linear_scan;\n }\n\n //- slower code:\n //-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n if (!(t >= t0)) {\n // looping?\n const t1global = pp[1];\n\n if (t < t1global) {\n i1 = 2; // + 1, using the scan for the details\n t0 = t1global;\n }\n\n // linear reverse scan\n for (let giveUpAt = i1 - 2; ;) {\n if (t0 === undefined) {\n // before start\n this.cachedIndex = 0;\n\n return this.copySampleValue(0);\n }\n\n if (i1 === giveUpAt) { break; } // this loop\n\n t1 = t0;\n t0 = pp[--i1 - 1];\n\n if (t >= t0) {\n // we have arrived at the sought interval\n break seek;\n }\n }\n\n // prepare binary search on the left side of the index\n right = i1;\n i1 = 0;\n\n break linear_scan;\n }\n\n // the interval is valid\n break validate_interval;\n } // linear scan\n\n // binary search\n while (i1 < right) {\n const mid = (i1 + right) >>> 1;\n\n if (t < pp[mid]) {\n right = mid;\n } else {\n i1 = mid + 1;\n }\n }\n\n t1 = pp[i1];\n t0 = pp[i1 - 1];\n\n // check boundary cases, again\n if (t0 === undefined) {\n this.cachedIndex = 0;\n\n return this.copySampleValue(0);\n }\n\n if (t1 === undefined) {\n i1 = pp.length;\n this.cachedIndex = i1;\n\n return this.copySampleValue(i1 - 1);\n }\n } // seek\n\n this.cachedIndex = i1;\n\n this.intervalChanged(i1, t0, t1);\n } // validate_interval\n\n return this.interpolate(i1, t0, t, t1);\n }\n\n /**\n * 销毁\n */\n dispose () {\n // @ts-expect-error\n this.time = undefined;\n // @ts-expect-error\n this.data = undefined;\n }\n\n protected copySampleValue (index: number) {\n // copies a sample value to the result buffer\n const values = this.data;\n const stride = this.componentCount;\n const offset = index * stride;\n\n const result = new Float32Array(stride);\n\n for (let i = 0; i !== stride; ++i) {\n result[i] = values[offset + i];\n }\n\n return result;\n }\n\n protected abstract intervalChanged (i1: number, t0: number, t1: number): void;\n\n protected abstract interpolate (i1: number, t0: number, t: number, t1: number): Float32Array;\n}\n\nclass LinearSampler extends InterpolationSampler {\n\n constructor (time: Float32Array, data: Float32Array, size: number) {\n super(time, data, size);\n }\n\n protected intervalChanged (i1: number, t0: number, t1: number): void {\n }\n\n protected interpolate (i1: number, t0: number, t: number, t1: number): Float32Array {\n const values = this.data;\n const stride = this.componentCount ?? 1;\n const offset1 = i1 * stride;\n const offset0 = offset1 - stride;\n\n const weight1 = (t - t0) / (t1 - t0);\n const weight0 = 1 - weight1;\n\n const result = new Float32Array(stride);\n\n for (let i = 0; i !== stride; ++i) {\n result[i] =\n values[offset0 + i] * weight0 +\n values[offset1 + i] * weight1;\n }\n\n return result;\n }\n}\n\nclass DiscreteSampler extends InterpolationSampler {\n\n constructor (time: Float32Array, data: Float32Array, size: number) {\n super(time, data, size);\n }\n\n protected intervalChanged (i1: number, t0: number, t1: number): void {\n }\n\n protected interpolate (i1: number, t0: number, t: number, t1: number): Float32Array {\n const values = this.data;\n const stride = this.componentCount ?? 1;\n const offset = (i1 - 1) * stride;\n\n const result = new Float32Array(stride);\n\n for (let i = 0; i !== stride; ++i) {\n result[i] = values[offset + i];\n }\n\n return result;\n }\n}\n\nclass QuaternionInner {\n\n static slerpFlat (dst: any, dstOffset: number, src0: any, srcOffset0: number, src1: any, srcOffset1: number, t: number) {\n // fuzz-free, array-based Quaternion SLERP operation\n let x0 = src0[srcOffset0 + 0];\n let y0 = src0[srcOffset0 + 1];\n let z0 = src0[srcOffset0 + 2];\n let w0 = src0[srcOffset0 + 3];\n\n const x1 = src1[srcOffset1 + 0];\n const y1 = src1[srcOffset1 + 1];\n const z1 = src1[srcOffset1 + 2];\n const w1 = src1[srcOffset1 + 3];\n\n if (t === 0) {\n dst[dstOffset + 0] = x0;\n dst[dstOffset + 1] = y0;\n dst[dstOffset + 2] = z0;\n dst[dstOffset + 3] = w0;\n\n return;\n }\n\n if (t === 1) {\n dst[dstOffset + 0] = x1;\n dst[dstOffset + 1] = y1;\n dst[dstOffset + 2] = z1;\n dst[dstOffset + 3] = w1;\n\n return;\n }\n\n if (w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1) {\n let s = 1 - t;\n const cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1;\n const dir = (cos >= 0 ? 1 : - 1);\n const sqrSin = 1 - cos * cos;\n\n // Skip the Slerp for tiny steps to avoid numeric problems:\n if (sqrSin > Number.EPSILON) {\n const sin = Math.sqrt(sqrSin);\n const len = Math.atan2(sin, cos * dir);\n\n s = Math.sin(s * len) / sin;\n t = Math.sin(t * len) / sin;\n }\n\n const tDir = t * dir;\n\n x0 = x0 * s + x1 * tDir;\n y0 = y0 * s + y1 * tDir;\n z0 = z0 * s + z1 * tDir;\n w0 = w0 * s + w1 * tDir;\n\n // Normalize in case we just did a lerp:\n if (s === 1 - t) {\n const f = 1 / Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0);\n\n x0 *= f;\n y0 *= f;\n z0 *= f;\n w0 *= f;\n }\n }\n\n dst[dstOffset] = x0;\n dst[dstOffset + 1] = y0;\n dst[dstOffset + 2] = z0;\n dst[dstOffset + 3] = w0;\n }\n}\n\nclass QuaternionLinearSampler extends InterpolationSampler {\n\n constructor (time: Float32Array, data: Float32Array, size: number) {\n super(time, data, size);\n }\n\n protected intervalChanged (i1: number, t0: number, t1: number): void {\n }\n\n protected interpolate (i1: number, t0: number, t: number, t1: number): Float32Array {\n const values = this.data;\n const stride = this.componentCount ?? 1;\n const alpha = (t - t0) / (t1 - t0);\n let offset = i1 * stride;\n const result = new Float32Array(stride);\n\n for (let end = offset + stride; offset !== end; offset += 4) {\n QuaternionInner.slerpFlat(result, 0, values, offset - stride, values, offset, alpha);\n }\n\n return result;\n }\n\n}\n\n/**\n * 创建动画采样器,支持线性和跳变两种模式,类别上支持平移、旋转和缩放\n * @param type - 动画类型,线性和跳变\n * @param times - 时间点数组\n * @param data - 关键帧数组\n * @param size - 数据分量\n * @param path - 动画类别,平移、旋转和缩放\n * @returns 动画采样器\n */\nexport function createAnimationSampler (type: string, times: Float32Array, data: Float32Array, size: number, path?: string): InterpolationSampler {\n switch (type) {\n case 'LINEAR':\n if (path === 'rotation') {\n return new QuaternionLinearSampler(times, data, size);\n } else {\n return new LinearSampler(times, data, size);\n }\n case 'STEP':\n return new DiscreteSampler(times, data, size);\n case 'CUBICSPLINE':\n // FIXME: support cubic spline\n return new LinearSampler(times, data, size);\n default:\n return new LinearSampler(times, data, size);\n }\n}\n","function _array_like_to_array(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\nexport { _array_like_to_array as _ };\n","import { _ as _unsupported_iterable_to_array } from \"./_unsupported_iterable_to_array.js\";\n\nfunction _create_for_of_iterator_helper_loose(o, allowArrayLike) {\n var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"];\n\n if (it) return (it = it.call(o)).next.bind(it);\n // Fallback for engines without symbol support\n if (Array.isArray(o) || (it = _unsupported_iterable_to_array(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n\n var i = 0;\n\n return function() {\n if (i >= o.length) return { done: true };\n\n return { done: false, value: o[i++] };\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _create_for_of_iterator_helper_loose as _ };\n","import { _ as _array_like_to_array } from \"./_array_like_to_array.js\";\n\nfunction _unsupported_iterable_to_array(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _array_like_to_array(o, minLen);\n\n var n = Object.prototype.toString.call(o).slice(8, -1);\n\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);\n}\nexport { _unsupported_iterable_to_array as _ };\n","import { math } from '@galacean/effects';\n\nexport const {\n Vector2, Vector3, Vector4, Matrix3, Matrix4, Color, Euler, EulerOrder, Quaternion,\n Box3, Sphere, Ray, DEG2RAD,\n} = math;\n\nexport type Ray = math.Ray;\nexport type Euler = math.Euler;\nexport type Vector2 = math.Vector2;\nexport type Vector3 = math.Vector3;\nexport type Vector4 = math.Vector4;\nexport type Matrix3 = math.Matrix3;\nexport type Matrix4 = math.Matrix4;\nexport type Color = math.Color;\nexport type Quaternion = math.Quaternion;\n","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n\n if (\"value\" in descriptor) descriptor.writable = true;\n\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _create_class(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n\n return Constructor;\n}\nexport { _create_class as _ };\n","function _extends() {\n _extends = Object.assign || function assign(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key];\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\nexport { _extends as _ };\n","import { Transform as EffectsTransform, PLAYER_OPTIONS_ENV_EDITOR, spec } from '@galacean/effects';\nimport { Quaternion, Euler, Vector3, Matrix4, EulerOrder } from './math';\nimport type { BaseTransform } from '../index';\n\n/**\n * Model 插件中的对象类型\n */\nexport enum PObjectType {\n none = 0,\n mesh,\n texture,\n material,\n light,\n camera,\n skybox,\n skin,\n morph,\n skeleton,\n animation,\n animationManager,\n reference,\n}\n\n/**\n * 灯光类型\n */\nexport enum PLightType {\n directional = 0,\n point,\n spot,\n ambient,\n}\n\n/**\n * 纹理类型\n */\nexport enum PTextureType {\n none = 0,\n t2d,\n t3d,\n cube,\n}\n\n/**\n * 材质类型\n */\nexport enum PMaterialType {\n none = 0,\n unlit,\n pbr,\n //phong,\n normalVis,\n simpleFilter,\n shadowBase,\n shadowFilter,\n //\n skyboxFilter,\n}\n\n/**\n * 混合模式\n */\nexport enum PBlendMode {\n opaque = 0,\n masked,\n translucent,\n additive,\n}\n\n/**\n * 面片朝向模式\n */\nexport enum PFaceSideMode {\n both = 0,\n front,\n back,\n}\n\nexport enum PShadowType {\n none = 0,\n standard,\n variance,\n expVariance,\n}\n\nexport const PBRShaderGUID = spec.BuiltinObjectGUID.PBRShader;\nexport const UnlitShaderGUID = spec.BuiltinObjectGUID.UnlitShader;\n\n/**\n * 插件变换类\n */\nexport class PTransform {\n private translation = new Vector3(0, 0, 0);\n private rotation = new Quaternion(0, 0, 0, 1);\n private scale = new Vector3(1, 1, 1);\n\n /**\n * 从矩阵设置数据\n * @param matrix - 4阶矩阵\n * @returns\n */\n fromMatrix4 (matrix: Matrix4) {\n this.setMatrix(matrix);\n\n return this;\n }\n\n /**\n * 从 GE 变换设置数据\n * @param trans - GE 变换对象或数据\n * @returns\n */\n fromEffectsTransform (trans: EffectsTransform | BaseTransform) {\n if (trans instanceof EffectsTransform) {\n this.setMatrix(trans.getWorldMatrix());\n } else {\n const effectsTrans = new EffectsTransform({\n ...trans,\n valid: true,\n });\n\n effectsTrans.setValid(true);\n\n this.setMatrix(effectsTrans.getWorldMatrix());\n }\n\n return this;\n }\n\n /**\n * 转成 GE 变换对象\n * @param transform - GE 变换对象\n * @returns\n */\n toEffectsTransform (transform: EffectsTransform) {\n const mat = this.getMatrix();\n\n transform.cloneFromMatrix(mat);\n\n return transform;\n }\n\n /**\n * 通过 GE 变换参数设置\n * @param trans - GE 变换参数\n * @returns\n */\n fromBaseTransform (trans: BaseTransform) {\n if (trans.position) {\n this.setTranslation(trans.position);\n } else {\n this.translation.set(0, 0, 0);\n }\n\n if (trans.rotation) {\n this.setRotation(trans.rotation);\n } else {\n this.rotation.set(0, 0, 0, 1);\n }\n\n if (trans.scale) {\n this.setScale(trans.scale);\n } else {\n this.scale.set(1, 1, 1);\n }\n\n return this;\n }\n\n /**\n * 获取平移\n * @returns\n */\n getTranslation (): Vector3 {\n return this.translation;\n }\n\n /**\n * 设置平移\n * @param val - 平移\n */\n setTranslation (val: Vector3 | spec.vec3) {\n if (val instanceof Vector3) {\n this.translation.set(val.x, val.y, val.z);\n } else {\n this.translation.set(val[0], val[1], val[2]);\n }\n }\n\n /**\n * 获取位置\n * @returns\n */\n getPosition (): Vector3 {\n return this.translation;\n }\n\n /**\n * 设置位置\n * @param val - 位置\n */\n setPosition (val: Vector3 | spec.vec3) {\n if (val instanceof Vector3) {\n this.translation.set(val.x, val.y, val.z);\n } else {\n this.translation.set(val[0], val[1], val[2]);\n }\n }\n\n /**\n * 获取旋转\n * @returns\n */\n getRotation (): Quaternion {\n return this.rotation;\n }\n\n /**\n * 设置旋转\n * @param val - 旋转,可能是四元数或欧拉角\n */\n setRotation (val: Quaternion | Euler | Vector3 | spec.vec4 | spec.vec3) {\n if (val instanceof Quaternion) {\n this.rotation.set(val.x, val.y, val.z, val.w);\n } else if (val instanceof Euler) {\n this.rotation.setFromEuler(val);\n } else if (val instanceof Vector3) {\n this.rotation.setFromEuler(new Euler(val.x, val.y, val.z, EulerOrder.ZYX));\n } else if (val.length === 4) {\n this.rotation.set(val[0], val[1], val[2], val[3]);\n } else {\n this.rotation.setFromEuler(new Euler(val[0], val[1], val[2], EulerOrder.ZYX));\n }\n }\n\n /**\n * 获取缩放\n * @returns\n */\n getScale (): Vector3 {\n return this.scale;\n }\n\n /**\n * 设置缩放\n * @param val - 缩放\n */\n setScale (val: Vector3 | spec.vec3) {\n if (val instanceof Vector3) {\n this.scale.set(val.x, val.y, val.z);\n } else {\n this.scale.set(val[0], val[1], val[2]);\n }\n }\n\n /**\n * 获取矩阵\n * @returns\n */\n getMatrix (): Matrix4 {\n return new Matrix4().compose(this.getTranslation(), this.getRotation(), this.getScale());\n }\n\n /**\n * 设置矩阵\n * @param mat - 4阶矩阵\n */\n setMatrix (mat: Matrix4 | spec.mat4) {\n if (mat instanceof Matrix4) {\n const res = mat.getTransform();\n\n this.setTranslation(res.translation);\n this.setRotation(res.rotation);\n this.setScale(res.scale);\n } else {\n const res = Matrix4.fromArray(mat).getTransform();\n\n this.setTranslation(res.translation);\n this.setRotation(res.rotation);\n this.setScale(res.scale);\n }\n }\n}\n\n/**\n * 坐标系类\n */\nexport class PCoordinate {\n /**\n * 原点\n */\n origin: Vector3;\n /**\n * X 轴\n */\n xAxis: Vector3;\n /**\n * Y 轴\n */\n yAxis: Vector3;\n /**\n * Z 轴\n */\n zAxis: Vector3;\n\n constructor () {\n this.origin = new Vector3(0, 0, 0);\n this.xAxis = new Vector3(1, 0, 0);\n this.yAxis = new Vector3(0, 1, 0);\n this.zAxis = new Vector3(0, 0, 1);\n }\n\n /**\n * 从插件变换创建坐标系\n * @param trans - 变换\n * @param invert - 是否旋转取反\n * @returns 坐标系对象\n */\n fromPTransform (trans: PTransform, invert = false) {\n this.origin.copyFrom(trans.getPosition());\n const rotationMatrix = trans.getRotation().toMatrix4(new Matrix4());\n\n if (invert) {\n rotationMatrix.invert();\n }\n this.fromRotationMatrix(rotationMatrix);\n\n return this;\n }\n\n /**\n * 从旋转矩阵创建坐标系\n * @param matrix - 矩阵\n */\n fromRotationMatrix (matrix: Matrix4) {\n const me = matrix.elements;\n\n this.xAxis.set(me[0], me[1], me[2]);\n this.yAxis.set(me[4], me[5], me[6]);\n this.zAxis.set(me[8], me[9], me[10]);\n }\n}\n\n/**\n * 全局状态\n */\nexport class PGlobalState {\n /**\n * 是否 WebGL2\n */\n isWebGL2: boolean;\n /**\n * 是否共享 Shader\n */\n shaderShared: boolean;\n /**\n * 运行时环境,编辑器模式或设备模式\n */\n runtimeEnv: string;\n /**\n * 兼容模式,glTF 模式或 Tiny3d 模式\n */\n compatibleMode: string;\n /**\n * 是否显示包围盒\n */\n visBoundingBox: boolean;\n /**\n * 渲染输出结果模式,可以换中间渲染数据\n */\n renderMode3D: spec.RenderMode3D;\n /**\n * UV结果输出时,棋盘格的大小控制,范围(0, 1)\n */\n renderMode3DUVGridSize: number;\n\n // singleton related code\n private static instance: PGlobalState;\n\n /**\n * 获取单例\n * @returns\n */\n static getInstance (): PGlobalState {\n // Do you need arguments? Make it a regular static method instead.\n return this.instance || (this.instance = new this());\n }\n\n private constructor () {\n this.isWebGL2 = false;\n this.shaderShared = true;\n this.runtimeEnv = PLAYER_OPTIONS_ENV_EDITOR;\n this.compatibleMode = 'gltf';\n this.visBoundingBox = false;\n this.renderMode3D = spec.RenderMode3D.none;\n this.renderMode3DUVGridSize = 1 / 16;\n }\n\n /**\n * 重置数据\n */\n reset () {\n this.isWebGL2 = false;\n this.shaderShared = true;\n this.runtimeEnv = PLAYER_OPTIONS_ENV_EDITOR;\n this.compatibleMode = 'gltf';\n this.visBoundingBox = false;\n this.renderMode3D = spec.RenderMode3D.none;\n this.renderMode3DUVGridSize = 1 / 16;\n }\n\n /**\n * 是否可视化渲染中间结果\n */\n hasRenderMode3D () {\n return this.renderMode3D !== spec.RenderMode3D.none;\n }\n\n /**\n * 是否编辑器模式\n */\n get isEditorEnv () {\n return this.runtimeEnv === PLAYER_OPTIONS_ENV_EDITOR;\n }\n\n /**\n * 是否设备模式\n */\n get isDeviceEnv () {\n return !this.isEditorEnv;\n }\n\n /**\n * 是否 Tiny3d 模式\n */\n get isTiny3dMode () {\n return this.compatibleMode === 'tiny3d';\n }\n\n /**\n * 是否 glTF 模式\n */\n get isGLTFMode () {\n return !this.isTiny3dMode;\n }\n}\n\n","import type { spec, Renderer } from '@galacean/effects';\nimport type { BaseTransform } from '../index';\nimport type { Quaternion, Euler, Vector3, Matrix4 } from './math';\nimport { PObjectType, PTransform, PCoordinate } from './common';\nimport type { PSceneManager } from './scene';\n\nlet objectIndex = 1;\n\n/**\n * 抽象对象类,提供公共的成员变量和成员函数\n */\nexport abstract class PObject {\n /**\n * 名称\n */\n name = 'Unnamed Object';\n /**\n * 类型\n */\n type: PObjectType = PObjectType.none;\n\n // create () {\n // // create everything in this object\n // }\n\n /**\n * 销毁\n */\n dispose () {\n // delete everything in this object\n }\n\n /**\n * 是否空对象\n * @returns\n */\n isNone () {\n return this.type === PObjectType.none;\n }\n\n /**\n * 是否有效,也就是类型不是 PObjectType.none\n * @returns\n */\n isValid (): boolean {\n return this.type !== PObjectType.none;\n }\n\n protected genName (name: string): string {\n return `${name}_@${objectIndex++}`;\n }\n}\n\n/**\n * 抽象实体类,支持可见性、变换和所属 VFX 元素\n */\nexport abstract class PEntity extends PObject {\n private _visible = false;\n private _transform = new PTransform();\n /**\n * 是否删除\n */\n deleted = false;\n\n /**\n * 逻辑更新\n */\n update () {\n\n }\n\n /**\n * 渲染对象\n * @param scene - 场景管理器\n * @param renderer 渲染器\n */\n render (scene: PSceneManager, renderer: Renderer) {\n // OVERRIDE\n }\n\n /**\n * 外部改变可见性时的回调\n * @param visible - 可见性\n */\n onVisibleChanged (visible: boolean) {\n this.visible = visible;\n }\n\n /**\n * 仅标记不可见和删除状态,但不进行 WebGL 相关资源的释放\n * 最终释放 WebGL 相关资源是在 plugin destroy 的时候\n */\n override dispose () {\n super.dispose();\n this.visible = false;\n this.deleted = true;\n }\n\n /**\n * 获取可见性,如果实体非法也是不可见\n */\n get visible (): boolean {\n return this._visible && this.isValid();\n }\n\n /**\n * 设置可见性\n */\n set visible (val: boolean) {\n this._visible = val;\n }\n\n /**\n * 获取变换\n */\n get transform (): PTransform {\n return this._transform;\n }\n\n /**\n * 设置变换,可以传入插件变换对象或变换参数\n */\n set transform (val: PTransform | BaseTransform) {\n if (val instanceof PTransform) {\n this._transform = val;\n } else {\n if (val.position !== undefined) {\n this._transform.setTranslation(val.position);\n }\n if (val.rotation !== undefined) {\n this._transform.setRotation(val.rotation);\n }\n if (val.scale !== undefined) {\n this._transform.setScale(val.scale);\n }\n }\n }\n\n /**\n * 获取位移\n */\n get translation (): Vector3 {\n return this._transform.getTranslation();\n }\n\n /**\n * 设置位移\n */\n set translation (val: Vector3 | spec.vec3) {\n this._transform.setTranslation(val);\n }\n\n /**\n * 获取位置\n */\n get position (): Vector3 {\n return this._transform.getTranslation();\n }\n\n /**\n * 设置位置\n */\n set position (val: Vector3 | spec.vec3) {\n this._transform.setTranslation(val);\n }\n\n /**\n * 获取旋转\n */\n get rotation (): Quaternion {\n return this._transform.getRotation();\n }\n\n /**\n * 设置旋转\n */\n set rotation (val: Quaternion | Euler | Vector3 | spec.vec4 | spec.vec3) {\n this._transform.setRotation(val);\n }\n\n /**\n * 获取缩放\n */\n get scale (): Vector3 {\n return this._transform.getScale();\n }\n\n /**\n * 设置缩放\n */\n set scale (val: Vector3 | spec.vec3) {\n this._transform.setScale(val);\n }\n\n /**\n * 获取矩阵\n */\n get matrix (): Matrix4 {\n return this._transform.getMatrix();\n }\n\n /**\n * 设置矩阵\n */\n set matrix (val: Matrix4) {\n this._transform.setMatrix(val);\n }\n\n /**\n * 获取坐标系\n */\n get coordinate () {\n const coord = new PCoordinate();\n\n coord.fromPTransform(this._transform);\n\n return coord;\n }\n\n}\n\n","import { spec } from '@galacean/effects';\nimport { concatBuffers, getBinaryType } from './utils';\n/**\n * geometry 序列化\n * @param geometries\n */\nexport function serializeGeometries(geometries) {\n const buffers = [];\n const bufferInfo = new Map();\n let offset = 0;\n geometries.forEach(options => {\n addBuffer(options.indices?.data);\n Object.keys(options.attributes).forEach(key => {\n const { data } = options.attributes[key];\n addBuffer(data);\n });\n });\n const resultBuffer = concatBuffers(buffers, bufferInfo, offset);\n const mappedGeometries = geometries.map(props => {\n const geometryProps = { ...props };\n if (geometryProps.indices) {\n geometryProps.indices = replaceAttribute(geometryProps.indices);\n }\n geometryProps.attributes = {};\n Object.keys(props.attributes).forEach(name => {\n const attribute = props.attributes[name];\n geometryProps.attributes[name] = replaceAttribute(attribute);\n });\n return geometryProps;\n });\n return {\n data: resultBuffer,\n geometries: mappedGeometries,\n version: '1.0',\n };\n function addBuffer(buffer) {\n if (buffer && !buffers.includes(buffer)) {\n buffers.push(buffer);\n bufferInfo.set(buffer, [0, offset, buffer.byteLength, getBinaryType(buffer)]);\n offset += buffer.byteLength;\n // padding 4bytes for f32\n offset = Math.ceil(offset / 4) * 4;\n }\n }\n function replaceAttribute(attr) {\n let source;\n if (attr.data) {\n const info = bufferInfo.get(attr.data);\n if (info) {\n source = { data: [spec.ValueType.BINARY, info] };\n }\n }\n return { ...attr, ...source };\n }\n}\n/**\n * geometry 反序列化\n * @param geometryProps\n * @param data\n */\nexport function deserializeGeometry(geometryProps, data) {\n const { attributes } = geometryProps;\n const ret = { ...geometryProps };\n if (ret.indices) {\n ret.indices = { ...ret.indices };\n if (ret.indices.data) {\n // @ts-expect-error\n ret.indices.data = typedArrayFromBinary(data, geometryProps.indices?.data);\n }\n // @ts-expect-error\n }\n else if (ret.index) {\n // FIXME: 兼容编辑器导出的旧版数据\n // @ts-expect-error\n ret.indices = { ...ret.index };\n // @ts-expect-error\n if (ret.indices.data) {\n // @ts-expect-error\n ret.indices.data = typedArrayFromBinary(data, geometryProps.index?.data);\n }\n }\n Object.keys(attributes).forEach(name => {\n const attribute = attributes[name];\n const { data: pointer } = attribute;\n ret.attributes[name] = { ...attribute };\n if (pointer) {\n ret.attributes[name].data = typedArrayFromBinary(data, pointer);\n }\n });\n return ret;\n}\nconst ctrlMap = {\n i8: Int8Array,\n u8: Uint8Array,\n i16: Int16Array,\n u16: Uint16Array,\n f32: Float32Array,\n i32: Int32Array,\n u32: Uint32Array,\n};\n/**\n * 重构 TypedArray,返回的 TypedArray 如果修改,会反映到原始的 ArrayBuffer 中\n * @param binaries\n * @param pointer\n */\nexport function typedArrayFromBinary(binary, pointer) {\n if (pointer.length != 2 || pointer[0] !== spec.ValueType.BINARY || !(pointer[1] instanceof Array)) {\n // 不是BinaryPointer,可能已经创建,直接返回\n return pointer;\n }\n const [index, start, byteLength, type] = pointer[1];\n if (!type) {\n return binary[index].slice(start, byteLength);\n }\n const CTRL = ctrlMap[type] || Uint8Array;\n return new CTRL(binary[index], start, byteLength / CTRL.BYTES_PER_ELEMENT);\n}\n","import type { Player } from '@galacean/effects';\nimport type { PMesh } from '../runtime/mesh';\nimport { VFX_ITEM_TYPE_3D } from '../plugin/const';\nimport { PObjectType } from '../runtime/common';\nimport { ModelMeshComponent } from '../plugin/model-item';\n\ntype WebGLContext = WebGL2RenderingContext | WebGLRenderingContext;\nconst HookSuffix = '_Native';\nconst number2GLName = new Map();\n\n/**\n * Hook WebGL 相关的 API 调用\n * @param ctx - WebGL 上下文\n */\nexport function HookOGLFunc (ctx: WebGLContext) {\n console.info('HookOGLFunc ' + Object.getPrototypeOf(ctx));\n let hookCount = 0;\n\n for (const name in Object.getPrototypeOf(ctx)) {\n if (name === 'getError') { continue; }\n\n if (typeof ctx[name as keyof WebGLContext] === 'function') {\n ++hookCount;\n //console.log(\"HookFunc \" + each);\n // @ts-expect-error\n ctx[name + HookSuffix] = ctx[name];\n // @ts-expect-error\n ctx[name] = GetHookFunc(ctx, name);\n }\n }\n console.info('HookCount ' + hookCount);\n\n GetNum2GLName(ctx);\n}\n\nfunction FormatFuncInfo (name: string, args: IArguments): string {\n const prefix = `${name}`;\n const argList: string[] = [];\n\n for (let i = 0; i < args.length; i++) {\n if (typeof args[i] == 'number' && number2GLName.has(args[i])) {\n argList.push(number2GLName.get(args[i]) + `(${args[i]})`);\n continue;\n }\n argList.push(args[i]?.toString());\n }\n\n return prefix + (argList.length > 0 ? '(' + argList.join(', ') + ')' : '()');\n}\n\nfunction FormatErrorInfo (error: GLenum): string {\n const err2Info = new Map();\n\n err2Info.set(WebGLRenderingContext.NO_ERROR, 'NO_ERROR');\n err2Info.set(WebGLRenderingContext.INVALID_ENUM, 'INVALID_ENUM');\n err2Info.set(WebGLRenderingContext.INVALID_VALUE, 'INVALID_VALUE');\n err2Info.set(WebGLRenderingContext.INVALID_OPERATION, 'INVALID_OPERATION');\n err2Info.set(WebGLRenderingContext.INVALID_FRAMEBUFFER_OPERATION, 'INVALID_FRAMEBUFFER_OPERATION');\n err2Info.set(WebGLRenderingContext.OUT_OF_MEMORY, 'OUT_OF_MEMORY');\n err2Info.set(WebGLRenderingContext.CONTEXT_LOST_WEBGL, 'CONTEXT_LOST_WEBGL');\n\n return (err2Info.get(error) ?? 'UNKNOWN_ERROR') + `(${error})`;\n}\n\nfunction GetHookFunc (ctx: WebGLContext, name: string) {\n function test () {\n //console.trace();\n // @ts-expect-error\n const ret = ctx[name + HookSuffix].apply(this, arguments);\n const error: GLenum = ctx.getError();\n\n if (error > 0) {\n console.info('OpenGLError: ' + FormatErrorInfo(error) + ' ===> ' + FormatFuncInfo(name, arguments));\n console.trace();\n } else {\n console.info(FormatFuncInfo(name, arguments));\n }\n\n return ret;\n }\n\n return test;\n}\n\nfunction GetNum2GLName (ctx: WebGLContext) {\n for (const name in Object.getPrototypeOf(ctx)) {\n if (typeof ctx[name as keyof WebGLContext] === 'number') {\n number2GLName.set(ctx[name as keyof WebGLContext], name);\n }\n }\n}\n\n/**\n * 获取播放器关联的 GPU 信息\n * @param player - 播放器\n * @returns\n */\nexport function getRendererGPUInfo (player: Player) {\n const instance = player.gpuCapability;\n\n return JSON.stringify(instance, undefined, 2);\n}\n\n/**\n * 获取播放器中 PMesh 对象列表\n * @param player - 播放器\n * @returns\n */\nexport function getPMeshList (player: Player) {\n const meshList: PMesh[] = [];\n\n const composition = player.getCompositions()[0];\n\n composition?.items.forEach(item => {\n if (item.type === VFX_ITEM_TYPE_3D) {\n const meshComponent = item.getComponent(ModelMeshComponent);\n\n if (meshComponent?.content.type === PObjectType.mesh) {\n meshList.push(meshComponent.content);\n }\n }\n });\n\n return meshList;\n}\n","import type { GeometryProps, Engine } from '@galacean/effects';\nimport { glContext, Geometry, Material, Mesh, RenderPassAttachmentStorageType } from '@galacean/effects';\nimport type { Matrix4 } from '../runtime/math';\nimport { Vector2, Vector3 } from '../runtime/math';\n\n/**\n * FBO 选项类,负责构造 FBO 创建时的选项信息\n */\nexport class FBOOptions {\n /**\n * 分辨率\n */\n resolution: Vector2;\n /**\n * 颜色附件列表\n */\n colorAttachments: object[];\n /**\n * 深度附件\n */\n depthAttachment?: any;\n\n /**\n * 构造函数\n * @param options - FBO 参数\n */\n constructor (options: Record<string, any>) {\n this.resolution = options.resolution ?? new Vector2(512, 512);\n this.colorAttachments = options.colorAttachments ?? [];\n this.depthAttachment = options.depthAttachment;\n }\n\n /**\n * 添加深度附件\n * @param options - 深度附件参数\n */\n addDepthAttachment (options: Record<string, any>) {\n this.depthAttachment = {\n storageType: options.storageType ?? RenderPassAttachmentStorageType.depth_16_texture,\n };\n }\n\n /**\n * 添加默认深度附件,数据格式是 depth_16_texture\n */\n addDefaultDepthAttachment () {\n this.depthAttachment = { storageType: RenderPassAttachmentStorageType.depth_16_texture };\n }\n\n /**\n * 删除深度附件\n */\n deleteDepthAttachment () {\n this.depthAttachment = undefined;\n }\n\n /**\n * 添加颜色附件\n * @param options - 颜色附件参数\n */\n addColorAttachment (options: Record<string, any>) {\n this.colorAttachments.push({\n texture: {\n format: options.format ?? glContext.RGBA,\n type: options.type ?? glContext.HALF_FLOAT,\n minFilter: options.filter ?? glContext.LINEAR,\n magFilter: options.filter ?? glContext.LINEAR,\n },\n });\n }\n\n /**\n * 删除颜色附件,按照索引值\n * @param target - 颜色附件索引值\n */\n deleteColorAttachment (target: number) {\n if (target >= 0 && target < this.colorAttachments.length) {\n this.colorAttachments.splice(target, 1);\n }\n }\n\n /**\n * 获取视口大小\n */\n get viewport (): [number, number, number, number] {\n return [0, 0, this.resolution.x, this.resolution.y];\n }\n}\n\n/**\n * 包围盒 Mesh 类,负责 3D Mesh 测试包围盒的显示\n */\nexport class BoxMesh {\n /**\n * core 层 Mesh 对象\n */\n mesh: Mesh;\n\n /**\n * 构造函数,创建基础 Mesh 对象\n * @param engine - 引擎\n * @param priority - 优先级\n */\n constructor (engine: Engine, priority: number) {\n const material = Material.create(\n engine,\n {\n shader: {\n vertex: this.vertexShader,\n fragment: this.fragmentShader,\n shared: true,\n },\n }\n );\n\n material.depthTest = true;\n material.depthMask = true;\n this.mesh = Mesh.create(\n engine,\n {\n name: 'boxMesh',\n material,\n geometry: Geometry.create(engine, this.geometry),\n priority,\n }\n );\n }\n\n /**\n * 更新包围盒着色器 Uniform 数据\n * @param modelMatrix - 模型矩阵\n * @param viewProjMatrix - 相机投影矩阵\n * @param positions - 位置数组\n * @param lineColor - 线颜色\n */\n update (modelMatrix: Matrix4, viewProjMatrix: Matrix4, positions: Float32Array, lineColor: Vector3) {\n const material = this.mesh.material;\n\n material.setMatrix('effects_ObjectToWorld', modelMatrix);\n for (let i = 0; i < positions.length; i += 3) {\n material.setVector3(`_PositionList[${i / 3}]`, Vector3.fromArray(positions, i));\n }\n material.setVector3('_LineColor', lineColor);\n }\n\n /**\n * 销毁,需要销毁 Mesh 对象\n */\n dispose () {\n this.mesh.dispose();\n // @ts-expect-error\n this.mesh = undefined;\n }\n\n /**\n * 获取顶点着色器代码\n */\n get vertexShader (): string {\n return `\n precision highp float;\n\n uniform mat4 effects_ObjectToWorld;\n uniform mat4 effects_MatrixVP;\n uniform vec3 _PositionList[8];\n attribute vec3 aPos;\n void main(){\n int index = int(aPos.x + 0.5);\n vec4 pos = effects_ObjectToWorld * vec4(_PositionList[index], 1);\n gl_Position = effects_MatrixVP * pos;\n }\n `;\n }\n\n /**\n * 获取片段着色器代码\n */\n get fragmentShader (): string {\n return `\n precision highp float;\n\n uniform vec3 _LineColor;\n void main(){\n gl_FragColor = vec4(_LineColor, 1);\n }\n `;\n }\n\n /**\n * 获取基础几何体\n */\n get geometry (): GeometryProps {\n const data = new Float32Array([0, 1, 2, 3, 4, 5, 6, 7]);\n const index = new Uint32Array([\n 0, 1, 1, 2, 2, 3, 3, 0,\n 4, 5, 5, 6, 6, 7, 7, 4,\n 0, 4, 1, 5, 2, 6, 3, 7,\n ]);\n\n return {\n attributes: {\n aPos: {\n type: glContext.FLOAT,\n size: 1,\n data,\n stride: Float32Array.BYTES_PER_ELEMENT,\n offset: 0,\n },\n },\n mode: glContext.LINES,\n indices: { data: index },\n drawStart: 0,\n drawCount: 24,\n };\n }\n}\n","import { ShaderFactory } from '@galacean/effects';\nimport { default as animationVertGLSL } from './standard/animation.vert.glsl';\nimport { default as extensionsFragGLSL } from './standard/extensions.frag.glsl';\nimport { default as toneMappingFragGLSL } from './standard/tone-mapping.frag.glsl';\nimport { default as texturesVertGLSL } from './standard/textures.vert.glsl';\nimport { default as functionsFragGLSL } from './standard/functions.frag.glsl';\nimport { default as shadowFragGLSL } from './standard/shadow.frag.glsl';\nimport { default as shadowCommonVert } from './standard/shadow-common.vert.glsl';\n\n/**\n * GLSL 着色器代码编译预处理\n */\nexport namespace StandardShaderSource {\n /**\n * GLSL 代码预处理和生成最终代码\n * @param source - GLSL 代码\n * @param features - 宏定义\n * @param isWebGL2 - 是否 WebGL2\n * @returns 最终代码\n */\n export function build (source: string, features: string[]): string {\n\n source = source.replace(/#define FEATURES/,\n features.map(value => `#define ${value}`).join('\\n'));\n\n return source;\n }\n}\n\nShaderFactory.registerInclude('animation.vert.glsl', animationVertGLSL);\nShaderFactory.registerInclude('extensions.frag.glsl', extensionsFragGLSL);\nShaderFactory.registerInclude('tone-mapping.frag.glsl', toneMappingFragGLSL);\nShaderFactory.registerInclude('textures.vert.glsl', texturesVertGLSL);\nShaderFactory.registerInclude('functions.frag.glsl', functionsFragGLSL);\nShaderFactory.registerInclude('shadow.frag.glsl', shadowFragGLSL);\nShaderFactory.registerInclude('shadow-common.vert.glsl', shadowCommonVert);\n\n","import { default as primitiveVert } from './standard/primitive.vert.glsl';\nimport { default as metallicRoughnessFrag } from './standard/metallic-roughness.frag.glsl';\nimport { default as shadowPassFrag } from './standard/shadow-pass.frag.glsl';\nimport { default as skyboxVert } from './standard/skybox.vert.glsl';\nimport { default as skyboxFrag } from './standard/skybox.frag.glsl';\nimport { StandardShaderSource } from './standard-shader-source';\nimport { PMaterialType } from '../common';\nimport type { PShaderContext } from '../shader';\n\n/**\n * 着色器代码生成类\n */\nexport class StandardShader {\n /**\n * WebGL 环境\n */\n static environment = 'webgl1';\n\n /**\n * 获取顶点着色器代码\n * @param context - 着色器上下文\n * @returns\n */\n static getVertexShaderCode (context: PShaderContext): string {\n const features = context.featureList;\n const materialType = context.material.materialType;\n\n switch (materialType) {\n case PMaterialType.unlit:\n case PMaterialType.pbr:\n case PMaterialType.shadowBase:\n return StandardShaderSource.build(primitiveVert, features);\n case PMaterialType.skyboxFilter:\n return StandardShaderSource.build(skyboxVert, features);\n default:\n throw new Error(`Invalid material type ${materialType} for getVertexShaderString!`);\n }\n }\n\n /**\n * 获取片段着色器代码\n * @param context - 着色器上下文\n * @returns\n */\n static getFragmentShaderCode (context: PShaderContext): string {\n const features = context.featureList;\n const materialType = context.material.materialType;\n\n switch (materialType) {\n case PMaterialType.unlit:\n case PMaterialType.pbr:\n return StandardShaderSource.build(metallicRoughnessFrag, features);\n case PMaterialType.shadowBase:\n return StandardShaderSource.build(shadowPassFrag, features);\n case PMaterialType.skyboxFilter:\n return StandardShaderSource.build(skyboxFrag, features);\n default:\n throw new Error(`Invalid material type ${materialType} for getFragmentShaderString!`);\n }\n }\n\n static genVertexShaderCode (materialType: PMaterialType): string {\n switch (materialType) {\n case PMaterialType.unlit:\n case PMaterialType.pbr:\n case PMaterialType.shadowBase:\n return primitiveVert;\n case PMaterialType.skyboxFilter:\n return skyboxVert;\n default:\n throw new Error(`Invalid material type ${materialType} for genVertexShaderCode!`);\n }\n }\n\n /**\n * 获取片段着色器代码\n * @param materialType - 材质类型\n * @returns\n */\n static genFragmentShaderCode (materialType: PMaterialType): string {\n switch (materialType) {\n case PMaterialType.unlit:\n case PMaterialType.pbr:\n return metallicRoughnessFrag;\n case PMaterialType.shadowBase:\n return shadowPassFrag;\n case PMaterialType.skyboxFilter:\n return skyboxFrag;\n default:\n throw new Error(`Invalid material type ${materialType} for genFragmentShaderCode!`);\n }\n }\n\n}\n","import { StandardShader } from '../runtime/shader-libs/standard-shader';\nimport type { PShaderContext, PShaderResults } from '../runtime/shader';\nimport { PMaterialType } from '../runtime';\n\nexport function fetchPBRShaderCode (): PShaderResults {\n const vertexShaderCode = StandardShader.genVertexShaderCode(PMaterialType.pbr);\n const fragmentShaderCode = StandardShader.genFragmentShaderCode(PMaterialType.pbr);\n\n return {\n vertexShaderCode,\n fragmentShaderCode,\n };\n}\n\nexport function fetchUnlitShaderCode (): PShaderResults {\n const vertexShaderCode = StandardShader.genVertexShaderCode(PMaterialType.unlit);\n const fragmentShaderCode = StandardShader.genFragmentShaderCode(PMaterialType.unlit);\n\n return {\n vertexShaderCode,\n fragmentShaderCode,\n };\n}\n\n/**\n * 获取 PBR 材质着色器代码\n * @param context - 着色器上下文\n * @returns\n */\nexport function getPBRPassShaderCode (context: PShaderContext): PShaderResults {\n const vertexShaderCode = StandardShader.getVertexShaderCode(context);\n const fragmentShaderCode = StandardShader.getFragmentShaderCode(context);\n\n return {\n vertexShaderCode: vertexShaderCode,\n fragmentShaderCode: fragmentShaderCode,\n };\n}\n\nexport function getShadowPassShaderCode (context: PShaderContext): PShaderResults {\n const vertexShaderCode = StandardShader.getVertexShaderCode(context);\n const fragmentShaderCode = StandardShader.getFragmentShaderCode(context);\n\n return {\n vertexShaderCode: vertexShaderCode,\n fragmentShaderCode: fragmentShaderCode,\n };\n}\n\n/**\n * 获取天空盒着色器代码\n * @param context - 着色器上下文\n * @returns\n */\nexport function getSkyBoxShaderCode (context: PShaderContext): PShaderResults {\n const vertexShaderCode = StandardShader.getVertexShaderCode(context);\n const fragmentShaderCode = StandardShader.getFragmentShaderCode(context);\n\n return {\n vertexShaderCode: vertexShaderCode,\n fragmentShaderCode: fragmentShaderCode,\n };\n}\n\n/**\n * 获取四边形滤波着色器代码\n * @param context - 着色器上下文\n * @returns\n */\nexport function getQuadFilterShaderCode (context: PShaderContext): PShaderResults {\n const fragmentShaderCode = `\n #version 100\n precision highp float;\n uniform sampler2D _ColorSampler;\n\n varying vec2 v_UVCoord1;\n void main(){\n gl_FragColor = texture2D(_ColorSampler, v_UVCoord1);\n }\n `;\n\n return {\n vertexShaderCode: getQuadFilterVS(),\n fragmentShaderCode: fragmentShaderCode,\n };\n}\n\n/**\n * 获取法线可视化着色器代码\n * @param context - 着色器上下文\n * @returns\n */\nexport function getNormalVisShaderCode (context: PShaderContext): PShaderResults {\n const fragmentShaderCode = `\n #version 100\n precision highp float;\n varying vec3 v_Normal;\n void main(){\n gl_FragColor = vec4(v_Normal * 0.5 + 0.5, 1);\n }\n `;\n\n return {\n vertexShaderCode: getBasicVS({ hasNormals: true }),\n fragmentShaderCode: fragmentShaderCode,\n };\n}\n\n/**\n * 获取仅漫反射着色器代码\n * @param context - 着色器上下文\n * @returns\n */\nexport function getDiffuseOnlyShaderCode (context: PShaderContext): PShaderResults {\n const fragmentShaderCode = `\n #version 100\n precision highp float;\n varying vec3 v_Normal;\n void main(){\n vec3 lightDir = normalize(vec3(1, 1, 1));\n gl_FragColor = vec4(max(0.0, dot(v_Normal, lightDir)) * 0.8);\n }\n `;\n\n return {\n vertexShaderCode: getBasicVS({ hasNormals: true }),\n fragmentShaderCode: fragmentShaderCode,\n };\n}\n\n/**\n * 获取 Kawase 模糊着色器代码\n * @param context - 着色器上下文\n * @returns\n */\nexport function getKawaseBlurShaderCode (context: PShaderContext): PShaderResults {\n const fragmentShaderCode = `\n #version 100\n precision highp float;\n uniform float _Offset;\n uniform vec2 _TextureSizeInv;\n uniform sampler2D _TexturSampler;\n\n varying vec2 v_UVCoord1;\n void main() {\n vec4 color = vec4(0.0);\n color += texture2D(_TexturSampler, v_UVCoord1 + vec2(-_Offset-0.5,-_Offset-0.5) * _TextureSizeInv);\n color += texture2D(_TexturSampler, v_UVCoord1 + vec2(-_Offset-0.5, _Offset+0.5) * _TextureSizeInv);\n color += texture2D(_TexturSampler, v_UVCoord1 + vec2( _Offset+0.5,-_Offset-0.5) * _TextureSizeInv);\n color += texture2D(_TexturSampler, v_UVCoord1 + vec2( _Offset+0.5, _Offset+0.5) * _TextureSizeInv);\n gl_FragColor = color * 0.25;\n }\n `;\n\n return {\n vertexShaderCode: getQuadFilterVS(),\n fragmentShaderCode: fragmentShaderCode,\n };\n}\n\n/**\n * 获取简单滤波着色器代码\n * @param context - 着色器上下文\n * @returns\n */\nexport function getSimpleFilterShaderCode (context: PShaderContext): PShaderResults {\n const fragmentShaderCode = `\n #version 100\n precision highp float;\n uniform sampler2D _FilterSampler;\n\n varying vec2 v_UVCoord1;\n void main() {\n gl_FragColor = texture2D(_FilterSampler, v_UVCoord1) * vec4(0.5);\n }\n `;\n\n return {\n vertexShaderCode: getQuadFilterVS(),\n fragmentShaderCode: fragmentShaderCode,\n };\n}\n\n/**\n * 获取高斯模糊着色器代码\n * @param context - 着色器上下文\n * @returns\n */\nexport function getGaussianBlurShaderCodeV2 (context: PShaderContext): PShaderResults {\n const fragmentShaderCode = `\n #version 100\n precision highp float;\n uniform vec2 _BlurScale;\n uniform sampler2D _FilterSampler;\n\n varying vec2 v_UVCoord1;\n void main() {\n vec4 color = vec4(0);\n vec2 offset0 = vec2(0.53805) * _BlurScale.xy;\n vec2 offset1 = vec2(2.06278) * _BlurScale.xy;\n color += (texture2D(_FilterSampler, v_UVCoord1 + offset0) + texture2D(_FilterSampler, v_UVCoord1 - offset0)) * 0.44908;\n color += (texture2D(_FilterSampler, v_UVCoord1 + offset1) + texture2D(_FilterSampler, v_UVCoord1 - offset1)) * 0.05092;\n gl_FragColor = color;\n }\n `;\n\n return {\n vertexShaderCode: getQuadFilterVS(),\n fragmentShaderCode: fragmentShaderCode,\n };\n}\n\n/**\n * 获取高斯模糊着色器代码\n * @param context - 着色器上下文\n * @returns\n */\nexport function getGaussianBlurShaderCodeV1 (context: PShaderContext): PShaderResults {\n const fragmentShaderCode = `\n #version 100\n precision highp float;\n uniform vec2 _BlurScale;\n uniform sampler2D _FilterSampler;\n\n varying vec2 v_UVCoord1;\n void main() {\n vec4 color = vec4(0.0);\n color += texture2D(_FilterSampler, v_UVCoord1 + (vec2(-3.0) * _BlurScale.xy)) * (1.0/64.0);\n color += texture2D(_FilterSampler, v_UVCoord1 + (vec2(-2.0) * _BlurScale.xy)) * (6.0/64.0);\n color += texture2D(_FilterSampler, v_UVCoord1 + (vec2(-1.0) * _BlurScale.xy)) * (15.0/64.0);\n color += texture2D(_FilterSampler, v_UVCoord1 + (vec2(+0.0) * _BlurScale.xy)) * (20.0/64.0);\n color += texture2D(_FilterSampler, v_UVCoord1 + (vec2(+1.0) * _BlurScale.xy)) * (15.0/64.0);\n color += texture2D(_FilterSampler, v_UVCoord1 + (vec2(+2.0) * _BlurScale.xy)) * (6.0/64.0);\n color += texture2D(_FilterSampler, v_UVCoord1 + (vec2(+3.0) * _BlurScale.xy)) * (1.0/64.0);\n gl_FragColor = color;\n }\n `;\n\n return {\n vertexShaderCode: getQuadFilterVS(),\n fragmentShaderCode: fragmentShaderCode,\n };\n}\n\n/**\n * 获取透明效果着色器代码\n * @param isVertexShader - 是否顶点着色器\n * @returns\n */\nexport function getTransparecyBaseShader (isVertexShader: boolean): string {\n if (isVertexShader) {\n return getBasicVS({ hasNormals: true });\n } else {\n return `\n #version 100\n #extension GL_EXT_draw_buffers: require\n\n precision highp float;\n uniform vec4 _BaseColorFactor;\n\n #ifdef HAS_UVS\n uniform sampler2D _BaseColorSampler;\n varying vec2 v_UVCoord1;\n #endif\n\n varying vec3 v_Normal;\n\n float weight(float z, float a) {\n return clamp(pow(min(1.0, a * 10.0) + 0.01, 3.0) * 1e8 * pow(1.0 - z * 0.9, 3.0), 1e-2, 3e3);\n }\n\n void main() {\n vec4 color = _BaseColorFactor;\n\n #ifdef HAS_UVS\n color *= texture2D(_BaseColorSampler, v_UVCoord1);\n #endif\n\n color.rgb *= color.a * dot(normalize(v_Normal), normalize(vec3(0, 1, 3))) * 5.0;\n float w = weight(gl_FragCoord.z, color.a);\n gl_FragData[0] = vec4(color.rgb * w, color.a);\n gl_FragData[1] = vec4(color.a * w);\n }\n `;\n }\n}\n\n/**\n * 获取透明效果滤波着色器代码\n * @param isVertexShader - 是否顶点着色器\n * @returns\n */\nexport function getTransparecyFilterShader (isVertexShader: boolean): string {\n if (isVertexShader) {\n return getQuadFilterVS();\n } else {\n return `\n #version 100\n precision highp float;\n uniform sampler2D _AccumColorSampler;\n uniform sampler2D _AccumAlphaSampler;\n\n varying vec2 v_UVCoord1;\n void main() {\n vec4 accumColor = texture2D(_AccumColorSampler, v_UVCoord1);\n vec4 accumAlpha = texture2D(_AccumAlphaSampler, v_UVCoord1);\n float finalAlpha = 1.0 - accumColor.a;\n vec3 finalColor = accumColor.rgb / clamp(accumAlpha.r, 0.001, 50000.0);\n gl_FragColor = vec4(finalColor, finalAlpha);\n }\n `;\n }\n}\n\nfunction getBasicVS (params: Record<string, boolean> = {}): string {\n const featureList: string[] = ['#version 100'];\n\n if (params.hasUVs) { featureList.push('#define HAS_UVS 1'); }\n if (params.hasNormals) { featureList.push('#define HAS_NORMALS 1'); }\n\n featureList.push(`\n precision highp float;\n\n uniform mat4 effects_ObjectToWorld;\n uniform mat4 effects_MatrixVP;\n attribute vec3 aPos;\n varying vec3 v_Position;\n\n #ifdef HAS_UVS\n attribute vec2 aUV;\n varying vec2 v_UVCoord1;\n #endif\n\n #ifdef HAS_NORMALS\n uniform mat4 _NormalMatrix;\n attribute vec3 aNormal;\n varying vec3 v_Normal;\n #endif\n\n void main(){\n vec4 pos = effects_ObjectToWorld * vec4(aPos, 1);\n v_Position = pos.xyz / pos.w;\n\n #ifdef HAS_UVS\n v_UVCoord1 = aUV;\n #endif\n\n #ifdef HAS_NORMALS\n v_Normal = normalize(vec3(effects_ObjectToWorld * vec4(aNormal, 0)));\n #endif\n\n gl_Position = effects_MatrixVP * pos;\n }\n `);\n\n return featureList.join('\\n');\n}\n\nfunction getQuadFilterVS (): string {\n return `\n #version 100\n precision highp float;\n attribute vec3 aPos;\n attribute vec2 aUV;\n\n varying vec2 v_UVCoord1;\n void main(){\n v_UVCoord1 = aUV;\n gl_Position = vec4(aPos.xy, 0.0, 1.0);\n }\n `;\n}\n","/**\n * 双状态 Set,用于保存前一帧和当前帧的信息\n */\nexport class TwoStatesSet<T> {\n /**\n * 当前帧 Set\n */\n now: Set<T>;\n /**\n * 前一帧 Set\n */\n last: Set<T>;\n\n constructor () {\n this.now = new Set();\n this.last = new Set();\n }\n\n /**\n * 清空 last 和 now\n */\n clear () {\n this.now.clear();\n this.last.clear();\n }\n\n /**\n * 状态前进,当前变成 last,now 被清空\n */\n forward () {\n const temp = this.last;\n\n this.last = this.now;\n this.now = temp;\n this.now.clear();\n }\n\n /**\n * 遍历当前帧新加的元素\n *\n * @param callbackfn - 增加新元素的回调\n */\n forAddedItem (callbackfn: (value: T) => void) {\n this.now.forEach(item => {\n if (!this.last.has(item)) {\n callbackfn(item);\n }\n });\n }\n\n /**\n * 遍历当前帧删除的元素\n *\n * @param callbackfn - 删除旧元素的回调\n */\n forRemovedItem (callbackfn: (value: T) => void) {\n this.last.forEach(item => {\n if (!this.now.has(item)) {\n callbackfn(item);\n }\n });\n }\n\n /**\n * 遍历当前帧所有的元素\n *\n * @param callbackfn - 当前帧元素的回调\n */\n forNowItem (callbackfn: (value: T) => void) {\n this.now.forEach(item => {\n callbackfn(item);\n });\n }\n\n}\n","import type {\n Engine, HitTestBoxParams, HitTestCustomParams, HitTestSphereParams, Renderer, VFXItem,\n} from '@galacean/effects';\nimport {\n HitTestType, Behaviour, RendererComponent, effectsClass, spec, AnimationClip,\n} from '@galacean/effects';\nimport type {\n ModelCameraComponentData, ModelItemBounding, ModelLightComponentData,\n ModelMeshComponentData, ModelSkyboxComponentData, AnimationComponentData,\n} from '../index';\nimport { VFX_ITEM_TYPE_3D } from '../index';\nimport type { PSceneManager, Euler, Ray, Vector2 } from '../runtime';\nimport { PCamera, PLight, PMesh, PSkybox, Vector3 } from '../runtime';\nimport { RayIntersectsBoxWithRotation } from '../utility';\nimport { getSceneManager } from './model-plugin';\n\n/**\n * 插件 Mesh 组件类,支持 3D Mesh 渲染能力\n * @since 2.0.0\n */\n@effectsClass(spec.DataType.MeshComponent)\nexport class ModelMeshComponent extends RendererComponent {\n /**\n * 内部 Mesh 对象\n */\n content: PMesh;\n /**\n * 参数\n */\n data?: ModelMeshComponentData;\n /**\n * 包围盒\n */\n bounding?: ModelItemBounding;\n /**\n * 场景管理器\n */\n sceneManager?: PSceneManager;\n /**\n * morph 动画权重\n */\n morphWeights: number[] = [];\n\n /**\n * 构造函数,只保存传入参数,不在这里创建内部对象\n * @param engine - 引擎\n * @param data - Mesh 参数\n */\n constructor (engine: Engine, data?: ModelMeshComponentData) {\n super(engine);\n if (data) {\n this.fromData(data);\n }\n }\n\n /**\n * 组件开始,需要创建内部对象,更新父元素信息和添加到场景管理器中\n */\n override onStart (): void {\n this.sceneManager = getSceneManager(this);\n this.createContent();\n this.item.type = VFX_ITEM_TYPE_3D;\n this.priority = this.item.renderOrder;\n this.sceneManager?.addItem(this.content);\n if (this.item.parentId && this.item.parent) {\n this.content.updateParentInfo(this.item.parentId, this.item.parent);\n }\n this.setVisible(true);\n this.item.getHitTestParams = this.getHitTestParams;\n }\n\n /**\n * 组件更新,更新内部对象状态\n * @param dt - 更新间隔\n */\n override onUpdate (dt: number): void {\n if (this.sceneManager) {\n this.content.build(this.sceneManager);\n }\n\n this.content.update();\n }\n\n /**\n * 组件晚更新,晚更新内部对象状态\n * @param dt - 更新间隔\n */\n override onLateUpdate (dt: number): void {\n this.content.lateUpdate();\n }\n\n /**\n * 组件渲染,需要检查可见性\n * @param renderer - 渲染器\n * @returns\n */\n override render (renderer: Renderer) {\n if (!this.getVisible() || !this.sceneManager) {\n return;\n }\n\n this.content.render(this.sceneManager, renderer);\n }\n\n /**\n * 组件销毁,需要重场景管理器中删除\n */\n override onDestroy (): void {\n this.sceneManager?.removeItem(this.content);\n this.sceneManager = undefined;\n this.content.dispose();\n }\n\n /**\n * 反序列化,记录传入参数\n * @param data - 组件参数\n */\n override fromData (data: ModelMeshComponentData): void {\n super.fromData(data);\n this.data = {\n ...data,\n materials: [],\n };\n\n this.data.rootBone = data.rootBone ? this.engine.findObject(data.rootBone) : undefined;\n this.data.geometry = this.engine.findObject(data.geometry);\n\n if (data.materials) {\n for (let i = 0; i < data.materials.length; i++) {\n this.data.materials[i] = this.engine.findObject(data.materials[i]);\n }\n }\n }\n\n /**\n * 创建内部对象\n */\n createContent () {\n if (this.data) {\n const bounding = this.data.interaction;\n\n this.bounding = bounding && JSON.parse(JSON.stringify(bounding));\n\n this.content = new PMesh(this.engine, this.item.name, this.data, this, this.item.parentId);\n }\n }\n\n /**\n * 设置当前 Mesh 的可见性。\n * @param visible - true:可见,false:不可见\n */\n setVisible (visible: boolean) {\n this.content?.onVisibleChanged(visible);\n }\n\n /**\n * 获取当前 Mesh 的可见性。\n */\n getVisible (): boolean {\n return this.content?.visible ?? false;\n }\n\n /**\n * 获取点击测试参数,根据元素包围盒进行相交测试,Mesh 对象会进行更加精确的点击测试\n * @param force - 是否强制进行点击测试\n * @returns 点击测试参数\n */\n getHitTestParams = (force?: boolean): HitTestBoxParams | HitTestSphereParams | HitTestCustomParams | undefined => {\n this.computeBoundingBox();\n const bounding = this.bounding;\n\n if (bounding && (force || Number.isInteger(bounding.behavior))) {\n const type = bounding.type;\n\n if (type === spec.ModelBoundingType.box) {\n if (this.content instanceof PMesh) {\n const mesh = this.content;\n const customHitTest: HitTestCustomParams = {\n behavior: bounding.behavior as number,\n type: HitTestType.custom,\n collect: function (ray: Ray, pointInCanvas: Vector2) {\n const result = mesh.hitTesting(ray.origin, ray.direction);\n\n return result;\n },\n };\n\n return customHitTest;\n } else {\n const worldMatrixData = this.transform.getWorldMatrix();\n const customHitTest: HitTestCustomParams = {\n behavior: bounding.behavior as number,\n type: HitTestType.custom,\n collect: function (ray: Ray, pointInCanvas: Vector2) {\n const result = RayIntersectsBoxWithRotation(ray, worldMatrixData, bounding);\n\n return result;\n },\n };\n\n return customHitTest;\n }\n } else if (type === spec.ModelBoundingType.sphere) {\n const pos = new Vector3();\n\n this.transform.assignWorldTRS(pos);\n const center = new Vector3();\n\n if (bounding.center) {\n center.setFromArray(bounding.center);\n }\n\n center.add(pos);\n\n return {\n type: type as unknown as HitTestType.sphere,\n behavior: bounding.behavior as number,\n radius: bounding.radius || 0,\n center,\n };\n }\n }\n };\n\n /**\n * 计算元素包围盒,只针对 Mesh 对象\n * @returns 包围盒\n */\n computeBoundingBox (): ModelItemBounding | undefined {\n if (this.content && this.content instanceof PMesh) {\n const worldMatrix = this.transform.getWorldMatrix();\n const bbox = this.content.computeBoundingBox(worldMatrix);\n const center = bbox.getCenter(new Vector3());\n const size = bbox.getSize(new Vector3());\n\n this.bounding = {\n behavior: this.bounding?.behavior,\n type: spec.ModelBoundingType.box,\n center: [center.x, center.y, center.z],\n size: [size.x, size.y, size.z],\n };\n\n return this.bounding;\n } else {\n return;\n }\n }\n}\n\n/**\n * 插件天空盒组件类,支持 3D 天空盒渲染能力\n * @since 2.0.0\n */\n@effectsClass(spec.DataType.SkyboxComponent)\nexport class ModelSkyboxComponent extends RendererComponent {\n /**\n * 内部天空盒对象\n */\n content: PSkybox;\n /**\n * 天空盒参数\n */\n data?: ModelSkyboxComponentData;\n /**\n * 场景管理器\n */\n sceneManager?: PSceneManager;\n\n /**\n * 构造函数,只保存传入参数,不在这里创建内部对象\n * @param engine - 引擎\n * @param data - Mesh 参数\n */\n constructor (engine: Engine, data?: ModelSkyboxComponentData) {\n super(engine);\n if (data) {\n this.fromData(data);\n }\n }\n\n /**\n * 组件开始,需要创建内部对象和添加到场景管理器中\n */\n override onStart (): void {\n this.createContent();\n this.item.type = VFX_ITEM_TYPE_3D;\n this.priority = this.item.renderOrder;\n this.sceneManager = getSceneManager(this);\n this.sceneManager?.addItem(this.content);\n this.setVisible(true);\n }\n\n /**\n * 组件渲染,需要检查可见性\n * @param renderer - 渲染器\n * @returns\n */\n override render (renderer: Renderer) {\n if (!this.getVisible() || !this.sceneManager) {\n return;\n }\n\n this.content.render(this.sceneManager, renderer);\n }\n\n /**\n * 组件销毁,需要重场景管理器中删除\n */\n override onDestroy (): void {\n this.sceneManager?.removeItem(this.content);\n this.sceneManager = undefined;\n this.content.dispose();\n }\n\n /**\n * 反序列化,记录传入参数\n * @param data - 组件参数\n */\n override fromData (data: ModelSkyboxComponentData): void {\n super.fromData(data);\n\n data.diffuseImage = data.diffuseImage ? this.engine.findObject(data.diffuseImage) : undefined;\n data.specularImage = this.engine.findObject(data.specularImage);\n this.data = data;\n }\n\n /**\n * 创建内部对象\n */\n createContent () {\n if (this.data) {\n const skyboxData = this.data;\n\n this.content = new PSkybox(this.item.name, skyboxData, this);\n }\n }\n\n /**\n * 设置当前可见性。\n * @param visible - true:可见,false:不可见\n */\n setVisible (visible: boolean) {\n this.content?.onVisibleChanged(visible);\n }\n\n /**\n * 获取当前可见性。\n */\n getVisible (): boolean {\n return this.content?.visible ?? false;\n }\n}\n\n/**\n * 插件灯光组件类,支持 3D 灯光能力\n * @since 2.0.0\n */\n@effectsClass(spec.DataType.LightComponent)\nexport class ModelLightComponent extends Behaviour {\n /**\n * 内部灯光对象\n */\n content: PLight;\n /**\n * 参数\n */\n data?: ModelLightComponentData;\n\n /**\n * 构造函数,只保存传入参数,不在这里创建内部对象\n * @param engine - 引擎\n * @param data - Mesh 参数\n */\n constructor (engine: Engine, data?: ModelLightComponentData) {\n super(engine);\n if (data) {\n this.fromData(data);\n }\n }\n\n /**\n * 组件开始,需要创建内部对象和添加到场景管理器中\n */\n override onStart (): void {\n this.createContent();\n this.item.type = VFX_ITEM_TYPE_3D;\n const scene = getSceneManager(this);\n\n scene?.addItem(this.content);\n this.setVisible(true);\n }\n\n /**\n * 组件更新,更新内部对象状态\n * @param dt - 更新间隔\n */\n override onUpdate (dt: number): void {\n this.content.update();\n }\n\n /**\n * 组件销毁\n */\n override onDestroy (): void {\n this.content.dispose();\n }\n\n /**\n * 反序列化,记录传入参数\n * @param data - 组件参数\n */\n override fromData (data: ModelLightComponentData): void {\n super.fromData(data);\n\n this.data = data;\n }\n\n /**\n * 创建内部对象\n */\n createContent () {\n if (this.data) {\n const lightData = this.data;\n\n this.content = new PLight(this.item.name, lightData, this);\n }\n }\n\n /**\n * 设置当前可见性。\n * @param visible - true:可见,false:不可见\n */\n setVisible (visible: boolean) {\n this.content?.onVisibleChanged(visible);\n }\n\n /**\n * 获取当前 Mesh 的可见性。\n */\n getVisible (): boolean {\n return this.content?.visible ?? false;\n }\n}\n\n/**\n * 插件相机组件类,支持 3D 相机能力\n * @since 2.0.0\n */\n@effectsClass(spec.DataType.CameraComponent)\nexport class ModelCameraComponent extends Behaviour {\n /**\n * 内部相机对象\n */\n content: PCamera;\n /**\n * 参数\n */\n data?: ModelCameraComponentData;\n /**\n * 构造函数,只保存传入参数,不在这里创建内部对象\n * @param engine - 引擎\n * @param data - Mesh 参数\n */\n constructor (engine: Engine, data?: ModelCameraComponentData) {\n super(engine);\n if (data) {\n this.fromData(data);\n }\n }\n\n /**\n * 组件开始,需要创建内部对象和添加到场景管理器中\n */\n override onStart (): void {\n this.createContent();\n this.item.type = VFX_ITEM_TYPE_3D;\n const scene = getSceneManager(this);\n\n scene?.addItem(this.content);\n this.updateMainCamera();\n }\n\n /**\n * 组件更新,更新内部对象状态\n * @param dt - 更新间隔\n */\n override onUpdate (dt: number): void {\n this.content.update();\n this.updateMainCamera();\n }\n\n /**\n * 组件销毁\n */\n override onDestroy (): void {\n this.content?.dispose();\n }\n\n /**\n * 反序列化,记录传入参数\n * @param data - 组件参数\n */\n override fromData (data: ModelCameraComponentData): void {\n super.fromData(data);\n\n this.data = data;\n }\n\n /**\n * 创建内部对象\n */\n createContent () {\n if (this.data) {\n const cameraData = this.data;\n\n const width = this.engine.renderer.getWidth();\n const height = this.engine.renderer.getHeight();\n\n this.content = new PCamera(this.item.name, width, height, cameraData, this);\n }\n }\n\n /**\n * 更新合成主相机,更加当前相机元素状态\n */\n updateMainCamera () {\n this.content.matrix = this.transform.getWorldMatrix();\n const composition = this.item.composition;\n\n if (composition) {\n composition.camera.near = this.content.nearPlane;\n composition.camera.far = this.content.farPlane;\n composition.camera.fov = this.content.fov;\n\n composition.camera.setTransform(this.transform);\n }\n }\n\n /**\n * 设置变换\n * @param position - 位置\n * @param rotation - 旋转\n */\n setTransform (position?: Vector3, rotation?: Euler): void {\n if (position) {\n this.transform.setPosition(position.x, position.y, position.z);\n }\n if (rotation) {\n this.transform.setRotation(rotation.x, rotation.y, rotation.z);\n }\n this.updateMainCamera();\n }\n}\n\n/**\n * 插件动画组件类,支持 3D 动画能力\n * @since 2.0.0\n */\n@effectsClass(spec.DataType.AnimationComponent)\nexport class AnimationComponent extends Behaviour {\n /**\n * 参数\n */\n data?: AnimationComponentData;\n\n elapsedTime = 0;\n animation = -1;\n clips: ModelAnimationClip[] = [];\n /**\n * 构造函数,只保存传入参数,不在这里创建内部对象\n * @param engine - 引擎\n */\n constructor (engine: Engine) {\n super(engine);\n }\n\n /**\n * 组件开始,需要创建内部对象和添加到场景管理器中\n */\n override onStart (): void {\n this.elapsedTime = 0;\n this.item.type = VFX_ITEM_TYPE_3D;\n }\n\n /**\n * 组件更新,更新内部对象状态\n * @param dt - 更新间隔\n */\n override onUpdate (dt: number): void {\n this.elapsedTime += dt * 0.001;\n if (this.animation >= 0 && this.animation < this.clips.length) {\n this.clips[this.animation].sampleAnimation(this.item, this.elapsedTime);\n }\n }\n\n /**\n * 组件销毁\n */\n override onDestroy (): void {\n\n }\n\n /**\n * 反序列化,记录传入参数\n * @param data - 组件参数\n */\n override fromData (data: AnimationComponentData): void {\n super.fromData(data);\n this.data = data;\n //\n this.name = data.name ?? '<empty>';\n this.animation = data.animation ?? -1;\n this.clips = [];\n data.animationClips.forEach(clipData => {\n const clipObj = new ModelAnimationClip(this.engine);\n const animationClip = this.engine.findObject<AnimationClip>(clipData);\n\n clipObj.setFromAnimationClip(animationClip);\n this.clips.push(clipObj);\n });\n }\n}\n\nclass ModelAnimationClip extends AnimationClip {\n path2Node: Record<string, VFXItem> = {};\n\n override sampleAnimation (vfxItem: VFXItem, time: number) {\n const duration = this.duration;\n const life = Math.max(0, time) % duration;\n\n for (const curve of this.positionCurves) {\n const value = curve.keyFrames.getValue(life % this.duration);\n const target = this.getTargetItem(vfxItem, curve.path);\n\n target?.transform.setPosition(value.x, value.y, value.z);\n }\n\n for (const curve of this.rotationCurves) {\n const value = curve.keyFrames.getValue(life % this.duration);\n const target = this.getTargetItem(vfxItem, curve.path);\n\n target?.transform.setQuaternion(value.x, value.y, value.z, value.w);\n }\n\n for (const curve of this.scaleCurves) {\n const value = curve.keyFrames.getValue(life % this.duration);\n const target = this.getTargetItem(vfxItem, curve.path);\n\n target?.transform.setScale(value.x, value.y, value.z);\n }\n\n for (const curve of this.floatCurves) {\n const value = curve.keyFrames.getValue(life % this.duration);\n const target = this.getTargetItem(vfxItem, curve.path);\n\n if (curve.className === 'ModelMeshComponent') {\n const component = target?.getComponent(ModelMeshComponent);\n\n if (component) {\n const properties = curve.property.split('.');\n\n setProperty(component, properties, value);\n } else {\n console.error('Can\\'t find mesh component.');\n }\n } else {\n console.warn(`Ignore curve: className ${curve.className}.`);\n }\n }\n }\n\n setFromAnimationClip (clip: AnimationClip) {\n this.duration = clip.duration;\n this.positionCurves = clip.positionCurves.slice();\n this.rotationCurves = clip.rotationCurves.slice();\n this.scaleCurves = clip.scaleCurves.slice();\n this.floatCurves = clip.floatCurves.slice();\n }\n\n getTargetItem (rootItem: VFXItem, path: string) {\n if (this.path2Node[path]) {\n return this.path2Node[path];\n }\n\n let target = rootItem;\n const nameList = path.split('/');\n\n for (const name of nameList) {\n let findTag = false;\n\n for (const child of target.children) {\n if (child.name === name) {\n target = child;\n findTag = true;\n\n break;\n }\n }\n if (!findTag) {\n throw new Error(`Can't find path in tree ${rootItem.id}, ${path}.`);\n }\n }\n\n this.path2Node[path] = target;\n\n return target;\n }\n}\n\nfunction setProperty<T> (obj: Object, properties: string[], value: T) {\n const len = properties.length;\n let current: any = obj;\n\n for (let i = 0; i < len - 1; i++) {\n const propName = properties[i];\n\n if (!(propName in current) || typeof current[propName] !== 'object') {\n console.error(`Invalid properties ${properties}.`);\n\n return;\n }\n current = current[propName];\n }\n\n current[properties[len - 1]] = value;\n}\n","import type { Composition, Region, spec } from '@galacean/effects';\nimport type { Ray, Matrix4 } from '../runtime/math';\nimport { Vector3 } from '../runtime/math';\nimport type { ModelItemBounding, ModelItemBoundingBox } from '../index';\nimport { VFX_ITEM_TYPE_3D } from '../plugin/const';\nimport { ModelMeshComponent } from '../plugin/model-item';\n\n// 射线与带旋转的包围盒求交\n// function transformDirection (m: Matrix4, direction: Vector3) {\n// const x = direction.x;\n// const y = direction.y;\n// const z = direction.z;\n// const me = m.elements;\n// const result = new Vector3();\n\n// result.x = me[0] * x + me[4] * y + me[8] * z;\n// result.y = me[1] * x + me[5] * y + me[9] * z;\n// result.z = me[2] * x + me[6] * y + me[10] * z;\n\n// return result.normalize();\n\n// }\n\n/**\n * 带旋转的射线与包围盒求交\n * @param ray - 射线\n * @param matrixData - 矩阵\n * @param bounding - 包围盒\n * @returns 交点列表或者 undefined\n */\nfunction RayIntersectsBoxWithRotation (ray: Ray, matrixData: Matrix4, bounding: ModelItemBounding): Vector3[] | undefined {\n const local2World = matrixData;\n const world2Local = local2World.clone().invert();\n\n const newRay = ray.clone().applyMatrix(world2Local);\n const boxCenter = Vector3.fromArray(bounding.center!);\n const boxHalfSize = Vector3.fromArray((bounding as ModelItemBoundingBox).size!).multiply(0.5);\n const boxMin = boxCenter.clone().subtract(boxHalfSize);\n const boxMax = boxCenter.clone().add(boxHalfSize);\n const intersetPoint = newRay.intersectBox({ min: boxMin, max: boxMax }, new Vector3());\n\n if (intersetPoint !== undefined) {\n const insersetPointInWorld = local2World.transformPoint(intersetPoint);\n\n return [insersetPointInWorld];\n } else {\n return;\n }\n}\n\n/**\n * 射线与包围盒求交\n * @param ro - 射线原点\n * @param rd - 射线方向\n * @param bmin - 包围盒左下点\n * @param bmax - 包围盒右上点\n * @returns 交点参数或者 undefined\n */\nfunction RayBoxTesting (ro: Vector3, rd: Vector3, bmin: Vector3, bmax: Vector3): number | undefined {\n let tmin = 0, tmax = 0;\n let tymin = 0, tymax = 0;\n let tzmin = 0, tzmax = 0;\n const invdirx = 1 / rd.x;\n const invdiry = 1 / rd.y;\n const invdirz = 1 / rd.z;\n\n if (invdirx >= 0) {\n tmin = (bmin.x - ro.x) * invdirx;\n tmax = (bmax.x - ro.x) * invdirx;\n } else {\n tmin = (bmax.x - ro.x) * invdirx;\n tmax = (bmin.x - ro.x) * invdirx;\n }\n\n if (invdiry >= 0) {\n tymin = (bmin.y - ro.y) * invdiry;\n tymax = (bmax.y - ro.y) * invdiry;\n } else {\n tymin = (bmax.y - ro.y) * invdiry;\n tymax = (bmin.y - ro.y) * invdiry;\n }\n\n // These lines also handle the case where tmin or tmax is NaN\n // (result of 0 * Infinity). x !== x returns true if x is NaN\n if (tmin > tymax || tymin > tmax) {\n return;\n }\n\n if (tymin > tmin || tmin !== tmin) {\n tmin = tymin;\n }\n if (tymax < tmax || tmax !== tmax) {\n tmax = tymax;\n }\n\n if (invdirz >= 0) {\n tzmin = (bmin.z - ro.z) * invdirz;\n tzmax = (bmax.z - ro.z) * invdirz;\n } else {\n tzmin = (bmax.z - ro.z) * invdirz;\n tzmax = (bmin.z - ro.z) * invdirz;\n }\n\n if (tmin > tzmax || tzmin > tmax) {\n return;\n }\n if (tzmin > tmin || tmin !== tmin) {\n tmin = tzmin;\n }\n if (tzmax < tmax || tmax !== tmax) {\n //return point closest to the ray (positive side)\n tmax = tzmax;\n }\n\n if (tmax < 0) {\n return;\n }\n\n return tmin >= 0 ? tmin : tmax;\n}\n\nconst diff = new Vector3();\nconst edge1 = new Vector3();\nconst edge2 = new Vector3();\nconst normal = new Vector3();\n\n/**\n * 射线与三角形求交\n * @param ro - 射线原点\n * @param rd - 射线方向\n * @param a - 三角形点\n * @param b - 三角形点\n * @param c - 三角形点\n * @param backfaceCulling - 是否剔除背面\n * @returns 交点参数或者 undefined\n */\nfunction RayTriangleTesting (ro: Vector3, rd: Vector3, a: Vector3, b: Vector3, c: Vector3, backfaceCulling: boolean): number | undefined {\n // Compute the offset origin, edges, and normal.\n // from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n edge1.subtractVectors(b, a);\n edge2.subtractVectors(c, a);\n normal.crossVectors(edge1, edge2);\n // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n //\t |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n //\t |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n //\t |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\n let DdN = rd.dot(normal);\n let sign = 0;\n\n if (DdN > 0) {\n if (backfaceCulling) { return; }\n sign = 1;\n } else if (DdN < 0) {\n sign = -1;\n DdN = -DdN;\n } else {\n return;\n }\n\n diff.subtractVectors(ro, a);\n\n edge2.crossVectors(diff, edge2);\n const DdQxE2 = sign * rd.dot(edge2); // b1 < 0, no intersection\n\n if (DdQxE2 < 0) {\n return;\n }\n\n edge1.crossVectors(edge1, diff);\n const DdE1xQ = sign * rd.dot(edge1); // b2 < 0, no intersection\n\n if (DdE1xQ < 0) {\n return;\n } // b1+b2 > 1, no intersection\n\n if (DdQxE2 + DdE1xQ > DdN) {\n return;\n } // Line intersects triangle, check if ray does.\n\n const QdN = -sign * diff.dot(normal); // t < 0, no intersection\n\n if (QdN < 0) {\n return;\n } // Ray intersects triangle.\n\n return QdN / DdN;\n}\n\n/**\n * 合成点击测试,支持获取多个交点,并按照远近排序\n * @param composition - 合成\n * @param x - 点击 x 坐标\n * @param y - 点击 y 坐标\n * @returns 点击信息列表\n */\nfunction CompositionHitTest (composition: Composition, x: number, y: number): Region[] {\n const regions = composition.hitTest(x, y, true);\n const ray = composition.getHitTestRay(x, y);\n\n if (regions.length <= 0) {\n return [];\n }\n\n const o = ray.origin;\n const d = ray.direction;\n const nums = regions.map((region, index) => {\n const p = region.position;\n //const p = (region.hitPositions as vec3[]) [index];\n const t: spec.vec3 = [0, 0, 0];\n\n for (let i = 0; i < 3; i++) {\n t[i] = (p.getElement(i) - o.getElement(i)) / d.getElement(i);\n }\n\n return [index, Math.max(...t)];\n });\n\n nums.sort(function (a, b) {\n const a1 = a[1] >= 0 ? a[1] : (a[1] + 1000000000);\n const b1 = b[1] >= 0 ? b[1] : (b[1] + 1000000000);\n\n return a1 - b1;\n });\n\n return nums.map(val => {\n return regions[val[0]];\n });\n}\n\n/**\n * 切换 3D Mesh 元素的包围盒显示标志\n * @param composition - 合成\n * @param itemId - 元素 id\n */\nfunction ToggleItemBounding (composition: Composition, itemId: string) {\n composition.items?.forEach(item => {\n if (item.type === VFX_ITEM_TYPE_3D) {\n const meshComponent = item.getComponent(ModelMeshComponent);\n\n if (meshComponent) {\n const mesh = meshComponent.content;\n\n if (item.id === itemId) {\n mesh.visBoundingBox = true;\n } else {\n mesh.visBoundingBox = false;\n }\n }\n }\n });\n}\n\nexport { RayIntersectsBoxWithRotation, RayBoxTesting, RayTriangleTesting, ToggleItemBounding, CompositionHitTest };\n","import type {\n Scene, Attribute, GeometryProps, TextureSourceOptions, TextureSourceCubeData,\n TextureConfigOptions, Texture2DSourceOptionsImage, TextureCubeSourceOptionsImageMipmaps,\n Engine, math,\n} from '@galacean/effects';\nimport {\n Player, spec, Transform, glContext, Material, Mesh, Texture, Geometry, Renderer,\n TextureSourceType, getDefaultTextureFactory, RenderPass, RenderPassDestroyAttachmentType,\n TextureLoadAction, DestroyOptions, loadImage, PLAYER_OPTIONS_ENV_EDITOR, GLSLVersion,\n} from '@galacean/effects';\nimport { deserializeGeometry } from '@galacean/effects-helper';\nimport type { GLTFCamera, GLTFImage, GLTFLight, GLTFTexture } from '@vvfx/resource-detection';\nimport type {\n ModelAnimationOptions, ModelMeshOptions, ModelMaterialOptions, ModelLightOptions,\n ModelCameraOptions, ModelSkyboxOptions, ModelSkinOptions, ModelPrimitiveOptions,\n ModelTextureTransform, ModelTreeOptions, ModelAnimTrackOptions, ModelMeshComponent,\n} from '../index';\nimport type { FBOOptions } from './ri-helper';\nimport type { PMaterialBase, PImageBufferData } from '../runtime';\nimport { Matrix3, Matrix4, Vector3, Vector4, DEG2RAD, PMorph, PGlobalState } from '../runtime';\nimport { RayTriangleTesting } from './hit-test-helper';\n\ntype Box3 = math.Box3;\ntype VertexArray = Float32Array | Int32Array | Int16Array | Int8Array | Uint32Array | Uint16Array | Uint8Array;\n\n/**\n * WebGL 辅助类,负责 WebGL 相关对象的创建\n */\nexport class WebGLHelper {\n /**\n * 立方体纹理参数\n */\n static cubemapTexConfig: TextureConfigOptions = {\n name: 'cubemap texture',\n wrapS: glContext.CLAMP_TO_EDGE,\n wrapT: glContext.CLAMP_TO_EDGE,\n magFilter: glContext.LINEAR,\n minFilter: glContext.LINEAR,\n };\n /**\n * 立方体纹理参数,带 Mipmap 滤波\n */\n static cubemapMipTexConfig: TextureConfigOptions = {\n wrapS: glContext.CLAMP_TO_EDGE,\n wrapT: glContext.CLAMP_TO_EDGE,\n magFilter: glContext.LINEAR,\n minFilter: glContext.LINEAR_MIPMAP_LINEAR,\n };\n\n /**\n * 创建二维纹理对象\n * @param engine - 引擎\n * @param image - glTF 图像参数\n * @param texture - glTF 纹理参数\n * @param isBaseColor - 是否基础颜色\n * @param tiny3dMode - 是否 Tiny3d 模式\n * @returns 二维纹理对象\n */\n static async createTexture2D (engine: Engine, image: GLTFImage, texture: GLTFTexture, isBaseColor?: boolean, tiny3dMode?: boolean): Promise<Texture> {\n if (image.imageData === undefined) {\n console.error(`createTexture2D: Invalid image data from ${image}.`);\n\n // 这里不应该发生的,做个兜底\n return Texture.create(engine, {\n name: 'createTexture2D',\n sourceType: TextureSourceType.data,\n data: {\n data: new Uint8Array([255, 255, 255, 255]),\n width: 1,\n height: 1,\n },\n });\n }\n const blob = new Blob([image.imageData], { type: image.mimeType });\n const urlCreator = window.URL || window.webkitURL;\n const imageUrl = urlCreator.createObjectURL(blob);\n const imageObj = new Image();\n\n imageObj.src = imageUrl;\n\n return new Promise(function (resolve, reject) {\n imageObj.onload = () => {\n let minFilter: number = texture.minFilter ?? glContext.LINEAR_MIPMAP_LINEAR;\n let premultiplyAlpha = false;\n\n if (tiny3dMode) {\n //if (minFilter === glContext.NEAREST_MIPMAP_LINEAR\n // || minFilter === glContext.LINEAR_MIPMAP_NEAREST) {\n minFilter = glContext.LINEAR_MIPMAP_LINEAR;\n //}\n if (!WebGLHelper.isPow2(imageObj.width) || !WebGLHelper.isPow2(imageObj.height)) {\n minFilter = glContext.LINEAR;\n }\n //\n premultiplyAlpha = isBaseColor ? false : true;\n }\n\n let generateMipmap = false;\n\n if (minFilter == glContext.NEAREST_MIPMAP_NEAREST ||\n minFilter == glContext.LINEAR_MIPMAP_NEAREST ||\n minFilter == glContext.NEAREST_MIPMAP_LINEAR ||\n minFilter == glContext.LINEAR_MIPMAP_LINEAR) {\n generateMipmap = true;\n }\n\n const res = Texture.create(engine, {\n name: 'createTexture2D',\n wrapS: texture.wrapS ?? glContext.REPEAT,\n wrapT: texture.wrapT ?? glContext.REPEAT,\n magFilter: texture.magFilter ?? glContext.LINEAR,\n minFilter,\n anisotropic: 1,\n //flipY: tex.flipY,\n premultiplyAlpha,\n sourceType: TextureSourceType.image,\n image: imageObj,\n generateMipmap,\n });\n\n resolve(res);\n urlCreator.revokeObjectURL(imageUrl);\n };\n imageObj.onerror = reject;\n });\n }\n\n /**\n * 创建纹理对象列表\n * @param engine - 引擎\n * @param images - glTF 图像列表\n * @param textures - glTF 纹理参数列表\n * @returns 纹理对象列表\n */\n static async createTextureList (engine: Engine, images: GLTFImage[], textures: GLTFTexture[]): Promise<Texture[]> {\n const outTextures = await Promise.all(\n textures.map(tex => {\n return this.createTexture2D(engine, images[tex.source], tex);\n })\n );\n\n return outTextures;\n }\n\n /**\n * 获取立方体纹理数据\n * @param images - 图像数据列表\n * @returns\n */\n static async getTextureCubeData (images: PImageBufferData[]): Promise<TextureSourceCubeData> {\n const cubeData: TextureSourceCubeData = [\n await WebHelper.loadImageFromImageData(images[0]),\n await WebHelper.loadImageFromImageData(images[1]),\n await WebHelper.loadImageFromImageData(images[2]),\n await WebHelper.loadImageFromImageData(images[3]),\n await WebHelper.loadImageFromImageData(images[4]),\n await WebHelper.loadImageFromImageData(images[5]),\n ];\n\n return cubeData;\n }\n\n /**\n * 获取立方体纹理 Mipmap 数据\n * @param images - 图像数据二维列表\n * @returns 立方体纹理数据\n */\n static async getTextureCubeMipmapData (images: PImageBufferData[][]): Promise<TextureSourceCubeData[]> {\n const mipmaps: TextureSourceCubeData[] = [];\n\n for (let i = 0; i < images.length; i++) {\n mipmaps.push(await this.getTextureCubeData(images[i]));\n }\n\n return mipmaps;\n }\n\n /**\n * 从 URL 创建立方体纹理\n * @param engine - 引擎\n * @param cubeImage - 立方体图像 URL\n * @returns 纹理对象\n */\n static async createTextureCubeFromURL (engine: Engine, cubeImage: string[]): Promise<Texture> {\n const textureOptions = await getDefaultTextureFactory().loadSource(\n {\n type: TextureSourceType.image,\n target: glContext.TEXTURE_CUBE_MAP,\n map: cubeImage,\n },\n this.cubemapTexConfig,\n );\n\n return Texture.create(engine, textureOptions);\n }\n\n /**\n * 从 URL 创建带 Mipmap 立方体纹理\n * @param engine - 引擎\n * @param cubeImages - 立方体 Mipmap 图像 URL\n * @returns 纹理对象\n */\n static async createTextureCubeMipmapFromURL (engine: Engine, cubeImages: string[][]): Promise<Texture> {\n const textureOptions = await getDefaultTextureFactory().loadSource(\n {\n type: TextureSourceType.mipmaps,\n target: glContext.TEXTURE_CUBE_MAP,\n maps: cubeImages,\n },\n this.cubemapMipTexConfig,\n );\n\n return Texture.create(engine, textureOptions);\n }\n\n /**\n * 从缓冲区创建立方体纹理\n * @param engine - 引擎\n * @param cubeImages - 图像缓冲区数据列表\n * @returns 纹理对象\n */\n static async createTextureCubeFromBuffer (engine: Engine, cubeImages: PImageBufferData[]): Promise<Texture> {\n const cubemap = await WebGLHelper.getTextureCubeData(cubeImages);\n\n return Texture.create(\n engine,\n {\n name: 'createTextureCubeFromBuffer',\n sourceType: TextureSourceType.image,\n cube: cubemap,\n target: glContext.TEXTURE_CUBE_MAP,\n ...this.cubemapTexConfig,\n });\n }\n\n /**\n * 从缓冲区创建带 Mipmap 立方体纹理\n * @param engine - 引擎\n * @param cubeImages - 图像缓冲区数据二维列表\n * @param level0Size - 第 0 层 Mip 的图像大小\n * @returns 纹理对象\n */\n static async createTextureCubeMipmapFromBuffer (engine: Engine, cubeImages: PImageBufferData[][], level0Size: number): Promise<Texture> {\n const mipmaps = await WebGLHelper.getTextureCubeMipmapData(cubeImages);\n //\n let mipCount = 0;\n\n while (Math.pow(2, mipCount) < level0Size) {\n ++mipCount;\n }\n\n while (mipmaps.length <= mipCount) {\n const index = Math.pow(2, mipCount - mipmaps.length);\n const url = `https://gw.alipayobjects.com/zos/gltf-asset/67896749597915/img${index}.png`;\n const imageData = await loadImage(url);\n\n mipmaps.push([imageData, imageData, imageData, imageData, imageData, imageData]);\n }\n\n return Texture.create(\n engine,\n {\n name: 'createTextureCubeMipmapFromBuffer',\n sourceType: TextureSourceType.mipmaps,\n mipmaps,\n target: glContext.TEXTURE_CUBE_MAP,\n ...this.cubemapMipTexConfig,\n });\n }\n\n /**\n * 获取纹理对象\n * @param index - 索引\n * @param textures - 纹理数组\n * @returns 纹理获取或 undefined\n */\n static getTexture (index: number, textures: Texture[]): Texture | null {\n if (index < 0 || index >= textures.length) {\n return null;\n } else {\n return textures[index];\n }\n }\n\n /**\n * 从图像创建纹理\n * @param engine - 引擎\n * @param image - HTML 图像元素\n * @returns\n */\n static createTextureFromImage (engine: Engine, image: HTMLImageElement | HTMLCanvasElement): Texture {\n const options: TextureSourceOptions = {\n name: 'createTextureFromImage',\n image,\n sourceType: TextureSourceType.image,\n flipY: false,\n magFilter: glContext.LINEAR,\n minFilter: glContext.LINEAR,\n wrapT: glContext.REPEAT,\n wrapS: glContext.REPEAT,\n };\n\n return Texture.create(engine, options);\n }\n\n /**\n * 创建渲染 Pass\n * @param renderer - 渲染器\n * @param name - 名称\n * @param priority - 优先级\n * @param meshData - Mesh 数据或数据列表\n * @param fboOpts - FBO 参数\n * @returns\n */\n static createRenderPass (renderer: Renderer, name: string, priority: number, meshData: Mesh | Mesh[], fboOpts: FBOOptions): RenderPass {\n const meshList = meshData instanceof Mesh ? [meshData] : meshData;\n\n return new RenderPass(renderer, {\n name,\n priority,\n attachments: fboOpts.colorAttachments,\n depthStencilAttachment: fboOpts.depthAttachment,\n clearAction: {\n clearDepth: 1,\n clearStencil: 0,\n clearColor: [0, 0, 0, 0],\n colorAction: TextureLoadAction.clear,\n depthAction: TextureLoadAction.clear,\n },\n // storeAction: {\n // colorAction: TextureStoreAction.store,\n // },\n meshes: meshList,\n viewport: fboOpts.viewport,\n });\n }\n\n /**\n * 删除纹理\n * @param texture - 纹理对象\n */\n static deleteTexture (texture: Texture) {\n texture.dispose();\n }\n\n /**\n * 删除 Mesh\n * @param mesh - Mesh 对象\n */\n static deleteMesh (mesh: Mesh) {\n mesh.dispose({\n geometries: DestroyOptions.destroy,\n });\n }\n\n /**\n * 删除几何\n * @param geometry - 几何体\n */\n static deleteGeometry (geometry: Geometry) {\n geometry.dispose();\n }\n\n /**\n * 删除渲染 Pass\n * @param pass - 渲染 Pass\n */\n static deleteRenderPass (pass: RenderPass) {\n pass.dispose({\n meshes: {\n geometries: DestroyOptions.destroy,\n },\n depthStencilAttachment: RenderPassDestroyAttachmentType.force,\n colorAttachment: RenderPassDestroyAttachmentType.force,\n semantics: DestroyOptions.destroy,\n });\n }\n\n /**\n * 返回 Mesh 是否半透明\n * @param component - ModelMeshComponent 对象\n * @return 是否半透明\n */\n static isTransparentMesh (component: ModelMeshComponent): boolean {\n return component.material.blending === true;\n }\n\n /**\n * renderer 是否支持 Float 纹理\n * @param engine - 引擎对象\n * @returns\n */\n static isSupportFloatTexture (engine: Engine): boolean {\n const capability = engine.gpuCapability;\n\n return capability.detail.floatTexture !== 0;\n }\n\n /**\n * renderer 是否支持 HalfFloat 纹理\n * @returns\n */\n static isSupportHalfFloatTexture (engine: Engine): boolean {\n const capability = engine.gpuCapability;\n\n return capability.detail.halfFloatTexture !== 0;\n }\n\n /**\n * 是否 2 的幂次\n * @param v - 数值\n * @returns\n */\n static isPow2 (v: number): boolean {\n return !(v & (v - 1)) && (!!v);\n }\n}\n\n/**\n * Mesh 辅助类,负责 Mesh 相关的基础对象创建\n */\nexport class MeshHelper {\n /**\n * 创建滤波 Mesh\n * @param engine - 引擎\n * @param name - 名称\n * @param material - 3D 材质\n * @returns Mesh 对象\n */\n static createFilterMesh (engine: Engine, name: string, material: PMaterialBase): Mesh {\n const globalState = PGlobalState.getInstance();\n const vertexShader = material.vertexShaderCode;\n const fragmentShader = material.fragmentShaderCode;\n const geometry = Geometry.create(engine, MeshHelper.getPlaneGeometry());\n const isWebGL2 = engine.gpuCapability.level === 2;\n const effectsMaterial = Material.create(\n engine,\n {\n shader: {\n vertex: vertexShader,\n fragment: fragmentShader,\n shared: globalState.shaderShared,\n glslVersion: isWebGL2 ? GLSLVersion.GLSL3 : GLSLVersion.GLSL1,\n },\n }\n );\n\n material.setMaterialStates(effectsMaterial);\n\n return Mesh.create(\n engine,\n {\n name,\n worldMatrix: Matrix4.fromIdentity(),\n material: effectsMaterial,\n geometry,\n }\n );\n }\n\n /**\n * 获取平面的几何参数\n * @returns 几何参数\n */\n static getPlaneGeometry (): GeometryProps {\n const data = MeshHelper.getPlaneVertexArray();\n\n return {\n attributes: {\n aPos: {\n type: glContext.FLOAT,\n size: 3,\n data,\n stride: Float32Array.BYTES_PER_ELEMENT * 8,\n offset: 0,\n },\n aUV: {\n type: glContext.FLOAT,\n size: 2,\n stride: Float32Array.BYTES_PER_ELEMENT * 8,\n offset: Float32Array.BYTES_PER_ELEMENT * 3,\n dataSource: 'aPos',\n },\n aNormal: {\n type: glContext.FLOAT,\n size: 3,\n stride: Float32Array.BYTES_PER_ELEMENT * 8,\n offset: Float32Array.BYTES_PER_ELEMENT * 5,\n dataSource: 'aPos',\n },\n },\n drawStart: 0,\n drawCount: data.length / 8,\n };\n }\n\n /**\n * 获取平面顶点数组\n * @returns 浮点数组\n */\n static getPlaneVertexArray (): Float32Array {\n const halfSize = 1;\n\n return new Float32Array([\n -halfSize, -halfSize, 0, 0, 0, 0, 0, 1,\n halfSize, -halfSize, 0, 1, 0, 0, 0, 1,\n halfSize, halfSize, 0, 1, 1, 0, 0, 1,\n\n -halfSize, -halfSize, 0, 0, 0, 0, 0, 1,\n halfSize, halfSize, 0, 1, 1, 0, 0, 1,\n -halfSize, halfSize, 0, 0, 1, 0, 0, 1,\n ]);\n }\n}\n\nexport interface EffectsSceneInfo {\n loadSkybox?: boolean,\n}\n\n/**\n * 3D 插件辅助类,为插件提供基础的函数\n */\nexport class PluginHelper {\n /**\n * 创建 3D 灯光参数,从 glTF 灯光参数\n * @param light - glTF 灯光参数\n * @returns 3D 灯光参数\n */\n static createLightOptions (light: GLTFLight): ModelLightOptions {\n const color = light.color ?? [255, 255, 255, 255];\n\n if (light.type === 'point') {\n return {\n color,\n intensity: light.intensity ?? 1.0,\n //\n lightType: 'point',\n range: light.range ?? 0,\n };\n } else if (light.type === 'spot') {\n return {\n color,\n intensity: light.intensity ?? 1.0,\n //\n lightType: 'spot',\n range: light.range ?? 0,\n innerConeAngle: light.innerConeAngle ?? 0,\n outerConeAngle: light.outerConeAngle ?? Math.PI / 4.0,\n };\n } else { // \"directional\"\n return {\n color,\n intensity: light.intensity ?? 1.0,\n //\n lightType: 'directional',\n };\n }\n }\n\n /**\n * 创建 3D 相机参数,从 glTF 相机参数\n * @param camera - glTF 相机参数\n * @returns 3D 相机参数\n */\n static createCameraOptions (camera: GLTFCamera): ModelCameraOptions | undefined {\n if (camera.perspective === undefined) { return; }\n\n const p = camera.perspective;\n const options: ModelCameraOptions = {\n near: p.znear,\n far: p.zfar ?? 1000,\n fov: p.yfov,\n clipMode: 0,\n };\n\n return options;\n }\n\n /**\n * 转成播放器中 [0, 255] 区间的颜色值\n * @param color - RGB 颜色值\n * @returns RGB 颜色值\n */\n static toPlayerColor3 (color: spec.vec3): spec.vec3 {\n // [0, 1] => [0, 255]\n return [\n this.scaleTo255(color[0]),\n this.scaleTo255(color[1]),\n this.scaleTo255(color[2]),\n ];\n }\n\n /**\n * 转成播放器中 [0, 255] 区间的颜色值\n * @param color - RGBA 颜色值\n * @returns RGBA 颜色值\n */\n static toPlayerColor4 (color: spec.vec4): spec.vec4 {\n // [0, 1] => [0, 255]\n return [\n this.scaleTo255(color[0]),\n this.scaleTo255(color[1]),\n this.scaleTo255(color[2]),\n this.scaleTo255(color[3]),\n ];\n }\n\n /**\n * 转成插件中 [0, 1] 区间的颜色值\n * @param color - RGB 颜色值\n * @returns RGB 颜色值\n */\n static toPluginColor3 (color: spec.vec3): spec.vec3 {\n // [0, 255] => [0, 1]\n return [\n this.scaleTo1(color[0]),\n this.scaleTo1(color[1]),\n this.scaleTo1(color[2]),\n ];\n }\n\n /**\n * 转成插件中 [0, 1] 区间的颜色值\n * @param color - RGBA 颜色值\n * @returns RGBA 颜色值\n */\n static toPluginColor4 (color: spec.vec4): spec.vec4 {\n // [0, 255] => [0, 1]\n return [\n this.scaleTo1(color[0]),\n this.scaleTo1(color[1]),\n this.scaleTo1(color[2]),\n this.scaleTo1(color[3]),\n ];\n }\n\n /**\n * 创建 UV 变换矩阵,从 UV 变换参数中\n * @param stValue - UV 的缩放和平移参数\n * @param rotateValue - UV 的旋转参数\n * @returns 3阶变换矩阵\n */\n static createUVTransform (material: Material, stName: string, rotateName: string): Matrix3 {\n const stValue = material.getVector4(stName);\n const rotateValue = material.getFloat(rotateName);\n\n const res = Matrix3.fromIdentity();\n\n if (stValue) {\n res.setFromArray([\n 1, 0, 0,\n 0, 1, 0,\n stValue.z, stValue.w, 1,\n ]);\n }\n\n const temp = new Matrix3();\n\n if (rotateValue) {\n const cosTheta = Math.cos(rotateValue);\n const sinTheta = Math.sin(rotateValue);\n\n temp.setFromArray([\n cosTheta, sinTheta, 0,\n -sinTheta, cosTheta, 0,\n 0, 0, 1,\n ]);\n res.multiply(temp);\n }\n\n if (stValue) {\n temp.setFromArray([\n stValue.x, 0, 0,\n 0, stValue.y, 0,\n 0, 0, 1,\n ]);\n res.multiply(temp);\n }\n\n res.transpose();\n\n return res;\n }\n\n /**\n * 获取截断后的数值\n * @param val - 数值\n * @param minv - 最小值\n * @param maxv - 最大值\n * @returns\n */\n static clamp (val: number, minv: number, maxv: number): number {\n return Math.max(Math.min(val, maxv), minv);\n }\n\n /**\n * 转换成 [0, 255] 区间数值\n * @param val - [0, 1] 区间数值\n * @returns\n */\n static scaleTo255 (val: number): number {\n const intVal = Math.round(val * 255);\n\n return Math.max(0, Math.min(intVal, 255));\n }\n\n /**\n * 转换成 [0, 1] 区间数值\n * @param val - [0, 255] 区间数值\n * @returns\n */\n static scaleTo1 (val: number): number {\n const floatVal = val / 255.0;\n\n return Math.max(0.0, Math.min(floatVal, 1.0));\n }\n\n /**\n * 根据相机的位置、Y 轴旋转角度和目标点位置来计算相机变换,\n * 使得相机能够专注于目标点上\n * @param cameraPosition - 相机位置\n * @param YRotationAngle - Y 轴旋转角度\n * @param targetPoint - 目标点\n * @returns 相机变换\n */\n static focusOnPoint (cameraPosition: spec.vec3, YRotationAngle: number, targetPoint: spec.vec3) {\n const camPos = Vector3.fromArray(cameraPosition);\n const targetPos = Vector3.fromArray(targetPoint);\n const deltaPos = new Vector3().copyFrom(camPos).subtract(targetPos);\n const rotationMat = Matrix4.fromRotationAxis(new Vector3(0, 1, 0), YRotationAngle * DEG2RAD);\n\n rotationMat.transformPoint(deltaPos);\n const newCamPos = deltaPos.clone().add(targetPos);\n const viewMatrix = new Matrix4().lookAt(newCamPos, targetPos, new Vector3(0, 1, 0)).invert();\n const effectsTransform = new Transform();\n\n effectsTransform.setValid(true);\n effectsTransform.cloneFromMatrix(viewMatrix);\n\n return effectsTransform;\n }\n\n /**\n * 场景预处理,在移动端 3D 插件会对场景进行预处理,调整纹理参数\n * @param scene - 场景\n * @param runtimeEnv - 运行时环境\n * @param compatibleMode - 兼容模式\n * @param autoAdjustScene - 是否自动调整\n * @returns 场景信息描述\n */\n static preprocessScene (scene: Scene, runtimeEnv: string, compatibleMode: string): EffectsSceneInfo {\n const deviceEnv = (runtimeEnv !== PLAYER_OPTIONS_ENV_EDITOR);\n const tiny3dMode = (compatibleMode === 'tiny3d');\n // 默认skybox如何处理需要讨论\n const jsonScene = scene.jsonScene;\n\n if (!(jsonScene && jsonScene.textures && jsonScene.materials)) {\n // 安全检查\n return {};\n }\n\n const dataMap: Record<string, TextureSourceOptions> = {};\n\n scene.textureOptions.forEach(tex => {\n const id = tex.id;\n\n if (id) {\n dataMap[id] = tex;\n }\n });\n\n let loadSkybox = false;\n\n if (deviceEnv) {\n jsonScene.materials.forEach(mat => {\n this.preprocessTextureOptions(dataMap, mat.textures['_BaseColorSampler'], true, tiny3dMode);\n this.preprocessTextureOptions(dataMap, mat.textures['_MetallicRoughnessSampler'], false, tiny3dMode);\n this.preprocessTextureOptions(dataMap, mat.textures['_NormalSampler'], false, tiny3dMode);\n this.preprocessTextureOptions(dataMap, mat.textures['_OcclusionSampler'], false, tiny3dMode);\n this.preprocessTextureOptions(dataMap, mat.textures['_EmissiveSampler'], false, tiny3dMode);\n });\n jsonScene.components.forEach(comp => {\n if (comp.dataType === spec.DataType.SkyboxComponent) {\n loadSkybox = true;\n const skybox = comp as spec.SkyboxComponentData;\n\n if (skybox.diffuseImage) {\n this.preprocessTextureOptions(dataMap, skybox.diffuseImage, false, tiny3dMode);\n }\n if (skybox.specularImage) {\n this.preprocessTextureOptions(dataMap, skybox.specularImage, false, tiny3dMode);\n }\n }\n });\n }\n\n return { loadSkybox };\n }\n\n /**\n * 纹理参数预处理,设置环绕模式和滤波器\n * @param index - 纹理索引\n * @param textures - 纹理数组\n * @param isBaseColor - 是否基础颜色\n * @param tiny3dMode - 是否 Tiny3d 模式\n * @returns\n */\n static preprocessTextureOptions (dataMap: Record<string, TextureSourceOptions>, textureInfo: spec.MaterialTextureProperty | spec.DataPath, isBaseColor: boolean, tiny3dMode: boolean) {\n if (!tiny3dMode || !textureInfo) {\n return;\n }\n\n let texId;\n\n if ('texture' in textureInfo) {\n texId = textureInfo.texture.id;\n } else {\n texId = textureInfo.id;\n }\n\n if (!texId) {\n return;\n }\n\n const texOptions = dataMap[texId];\n\n if (!texOptions) {\n return;\n }\n\n if (texOptions.target === undefined || texOptions.target === glContext.TEXTURE_2D) {\n texOptions.wrapS = glContext.REPEAT;\n texOptions.wrapT = glContext.REPEAT;\n texOptions.magFilter = glContext.LINEAR;\n texOptions.minFilter = glContext.LINEAR_MIPMAP_LINEAR;\n if (!isBaseColor) {\n texOptions.premultiplyAlpha = true;\n }\n const newOptions = texOptions as Texture2DSourceOptionsImage;\n\n newOptions.generateMipmap = true;\n const image = newOptions.image;\n\n if (image && image.width && image.height) {\n if (!WebGLHelper.isPow2(image.width) || !WebGLHelper.isPow2(image.height)) {\n texOptions.minFilter = glContext.LINEAR;\n }\n }\n } else if (texOptions.target === glContext.TEXTURE_CUBE_MAP) {\n texOptions.wrapS = glContext.CLAMP_TO_EDGE;\n texOptions.wrapT = glContext.CLAMP_TO_EDGE;\n if ((texOptions as TextureCubeSourceOptionsImageMipmaps).mipmaps !== undefined) {\n if ((texOptions as TextureCubeSourceOptionsImageMipmaps).mipmaps.length === 1) {\n texOptions.magFilter = glContext.LINEAR;\n texOptions.minFilter = glContext.LINEAR;\n } else {\n texOptions.magFilter = glContext.LINEAR;\n texOptions.minFilter = glContext.LINEAR_MIPMAP_LINEAR;\n }\n } else {\n texOptions.magFilter = glContext.LINEAR;\n texOptions.minFilter = glContext.LINEAR;\n }\n }\n }\n\n /**\n * 创建几何体,根据几何参数描述 JSON 和数据数组\n * @param engine - 引擎\n * @param geomJson - 几何参数描述 JSON\n * @param bins - 数据数组\n * @returns 几何体\n */\n static createGeometry (engine: Engine, geomJson: spec.GeometryOptionsJSON, bins: ArrayBuffer[]): Geometry {\n const geomOptions = deserializeGeometry(geomJson, bins);\n const attributes: Record<string, Attribute> = {};\n\n // 兼容代码,解决 attribute 的名称问题\n for (const attrib in geomOptions.attributes) {\n const attribData = geomOptions.attributes[attrib];\n const name = this.getAttributeName(attrib);\n\n attributes[name] = attribData;\n }\n geomOptions.attributes = attributes;\n\n return Geometry.create(engine, geomOptions);\n }\n\n /**\n * 索引数组类型转换\n * @param type - 类型\n * @param array - 索引数组\n * @returns 索引数组\n */\n static getIndexArray (type: number, array: spec.TypedArray) {\n switch (type) {\n case WebGLRenderingContext['UNSIGNED_INT']:\n return array as Uint32Array;\n case WebGLRenderingContext['UNSIGNED_SHORT']:\n return array as Uint16Array;\n case WebGLRenderingContext['UNSIGNED_BYTE']:\n return array as Uint8Array;\n default:\n console.error(`Invalid index attribute type ${type}.`);\n }\n }\n\n /**\n * 属性名称转换\n * @param name - 旧名称\n * @returns 新名称\n */\n static getAttributeName (name: string): string {\n switch (name) {\n case 'POSITION': return 'aPos';\n case 'NORMAL': return 'aNormal';\n case 'TANGENT': return 'aTangent';\n case 'TEXCOORD_0': return 'aUV';\n case 'TEXCOORD_1': return 'aUV2';\n case 'JOINTS_0': return 'aJoints';\n case 'WEIGHTS_0': return 'aWeights';\n }\n\n if (!name.startsWith('a')) {\n // aPos, aNormal, aTangent,\n // aUV, aUV2, aJoints, aWeights\n // aTargetXXX\n console.warn(`Unknown attribute name: ${name}.`);\n }\n\n return name;\n }\n\n /**\n * 获取纹理对象\n * @param textures - 纹理数组\n * @param index - 索引\n * @returns\n */\n static getTextureObj (textures: Texture[], index?: number): Texture | null {\n if (typeof index !== 'number') {\n return null;\n }\n\n if (index < 0 || index >= textures.length) {\n console.error(`Invalid index for textures: ${index}, ${textures.length}.`);\n }\n\n return textures[index];\n }\n}\n\n/**\n * Web 辅助类,负责 Web 相关的基础功能\n */\nexport class WebHelper {\n /**\n * 获取图像文件名,从 URL 链接中\n * @param url - 链接\n * @param ext - 扩展名\n * @returns\n */\n static getImageFileName (url: string, ext?: string): string {\n const begin = url.lastIndexOf('/');\n const end = url.lastIndexOf('.');\n const substr = url.substring(begin + 1, end);\n\n return ext ? substr + ext : substr;\n }\n\n /**\n * 获取当前时间字符串\n * @returns\n */\n static getCurrnetTimeStr (): string {\n const date = new Date(Date.now());\n const timeStr = date.toLocaleString('zh-CN');\n const ms = `${date.getMilliseconds()}`;\n\n return timeStr.split(/[ /:]+/).join('') + ms.padStart(3, '0');\n }\n\n /**\n * 将 URL 链接保存成文件\n * @param url - 链接\n * @param filename - 文件名\n */\n static saveFileForURL (url: string, filename: string) {\n const a = document.createElement('a');\n\n a.setAttribute('download', filename);\n a.target = '_blank';\n a.href = url;\n a.click();\n }\n\n /**\n * 创建播放器\n * @param manualRender - 是否手动渲染\n * @returns\n */\n static createPlayer (manualRender = true) {\n const canvas = document.createElement('canvas');\n\n canvas.width = 512;\n canvas.height = 512;\n\n return new Player({\n canvas,\n renderFramework: 'webgl2',\n env: PLAYER_OPTIONS_ENV_EDITOR,\n renderOptions: {\n willCaptureImage: true,\n },\n manualRender,\n });\n }\n\n /**\n * 休眠\n * @param ms - 时间,单位是毫秒\n * @returns\n */\n static async sleep (ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n /**\n * 从 glTF 图像加载 HTML 图像元素\n * @param image - glTF 图像\n * @returns HTML 图像元素\n */\n static async loadImageFromGLTFImage (image: GLTFImage): Promise<HTMLImageElement> {\n return loadImage(new Blob([image.imageData], { type: image.mimeType }));\n }\n\n /**\n * 从图像缓存区数据加载 HTML 图像元素\n * @param image - 图像缓冲区数据\n * @returns\n */\n static async loadImageFromImageData (image: PImageBufferData): Promise<HTMLImageElement> {\n return loadImage(new Blob([image.data], { type: image.mimeType }));\n }\n\n /**\n * 获取画布渲染的内容,转成 PNG 图片数据\n * @param canvas - HTML 画布元素\n * @returns PNG 图片数据\n */\n static async getCanvasArrayBuffer (canvas: HTMLCanvasElement): Promise<ArrayBuffer> {\n return new Promise<ArrayBuffer>(function (resolve, reject) {\n canvas.toBlob(function (b) {\n if (b) {\n resolve(b.arrayBuffer());\n } else {\n reject(new Error('No canvas blob.'));\n }\n }, 'image/png', 1);\n });\n }\n\n /**\n * 从 HTML 图像、视频或位图图像对象获取图像数据\n * @param image - HTML 图像、视频或位图图像\n * @returns PNG 图片数据\n */\n static async getImageArrayBuffer (image: HTMLImageElement | ImageBitmap | HTMLVideoElement): Promise<ArrayBuffer> {\n const cvs = document.createElement('canvas');\n\n cvs.width = image.width;\n cvs.height = image.height;\n (cvs.getContext('2d') as CanvasRenderingContext2D).drawImage(image, 0, 0);\n\n return this.getCanvasArrayBuffer(cvs);\n }\n\n /**\n * 获取画布元素渲染结果\n * @param canvas - 画布元素\n * @returns\n */\n static getCanvasImageData (canvas: HTMLCanvasElement): ImageData {\n const ctx = canvas.getContext('2d') as CanvasRenderingContext2D;\n\n return ctx.getImageData(0, 0, canvas.width, canvas.height);\n }\n\n /**\n * 翻转图像\n * @param imageData - 图像数据\n * @returns 翻转后的图像\n */\n static flipImageData (imageData: ImageData): ImageData {\n const flipped = document.createElement('canvas');\n const ctx = flipped.getContext('2d') as CanvasRenderingContext2D;\n\n flipped.width = imageData.width;\n flipped.height = imageData.height;\n // first put the imageData\n ctx.putImageData(imageData, 0, 0);\n // because we've got transparency\n ctx.globalCompositeOperation = 'copy';\n ctx.scale(1, -1); // Y flip\n ctx.translate(0, -imageData.height); // so we can draw at 0,0\n ctx.drawImage(flipped, 0, 0);\n // now we can restore the context to defaults if needed\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.globalCompositeOperation = 'source-over';\n\n return ctx.getImageData(0, 0, flipped.width, flipped.height);\n }\n\n /**\n * 从 HTML 图像、视频或位图图像对象获取翻转后的图像数据\n * @param image - HTML 图像、视频或位图图像\n * @returns PNG 图片数据\n */\n static getImageData (image: HTMLImageElement | ImageBitmap | HTMLVideoElement): ImageData {\n const cvs = document.createElement('canvas');\n\n cvs.width = image.width;\n cvs.height = image.height;\n const ctx = cvs.getContext('2d') as CanvasRenderingContext2D;\n\n ctx.drawImage(image, 0, 0);\n\n return this.flipImageData(ctx.getImageData(0, 0, cvs.width, cvs.height));\n }\n\n /**\n * 获取位图数据,从 HTML 画布元素\n * @param canvas - HTML 画布元素\n * @returns uint8 数组\n */\n static getWebGLCanvasImageBuffer (canvas: HTMLCanvasElement): Uint8Array {\n const ctx = canvas.getContext('webgl2') as WebGL2RenderingContext;\n const pixels = new Uint8Array(canvas.width * canvas.height * 4);\n\n ctx.readPixels(0, 0, canvas.width, canvas.height, ctx.RGBA, ctx.UNSIGNED_BYTE, pixels);\n\n return pixels;\n }\n}\n\n/**\n * 顶点属性缓冲区\n */\nexport class VertexAttribBuffer {\n /**\n * 顶点数组\n */\n data!: VertexArray;\n /**\n * 分量数\n */\n component = 0;\n /**\n * 长度\n */\n length = 0;\n /**\n * 偏移\n */\n offset = 0;\n /**\n * 步长\n */\n stride = 0;\n /**\n * 类型大小\n */\n typeSize = 0;\n\n /**\n * 获取包围盒,根据顶点数据\n * @param box - 包围盒,会被修改\n * @returns 包围盒\n */\n getBoundingBox (box: Box3) {\n let index = this.offset;\n const point = new Vector3();\n\n while (index + this.component <= this.length) {\n if (this.component == 2) {\n point.set(this.data[index], this.data[index + 1], 0);\n } else {\n point.set(this.data[index], this.data[index + 1], this.data[index + 2]);\n }\n box.expandByPoint(point);\n index += this.stride;\n }\n\n return box;\n }\n}\n\nclass AttributeArray {\n data!: spec.TypedArray;\n //\n length = 0;\n offset = 0;\n stride = 0;\n //\n typeSize = 0;\n compCount = 0;\n //\n signed = false;\n compressed = false;\n compressScale = 1.0;\n\n create (inAttrib: Attribute, inArray: spec.TypedArray) {\n switch (inAttrib.type) {\n case WebGLRenderingContext['INT']:\n this.typeSize = 4;\n this.signed = true;\n this.compressScale = 1 / 2147483647.0;\n\n break;\n case WebGLRenderingContext['SHORT']:\n this.typeSize = 2;\n this.signed = true;\n this.compressScale = 1 / 32767.0;\n\n break;\n default:\n this.typeSize = 4;\n this.signed = true;\n this.compressScale = 1.0;\n }\n\n this.data = inArray;\n this.length = this.data.length;\n this.compCount = inAttrib.size;\n //\n this.offset = inAttrib.offset ?? 0;\n if (this.offset > 0) {\n if (this.offset % this.typeSize !== 0) { console.error(`Invalid offset ${this.offset}, type size ${this.typeSize}.`); }\n this.offset = this.offset / this.typeSize;\n }\n //\n this.stride = inAttrib.stride ?? 0;\n if (this.stride > 0) {\n if (this.stride % this.typeSize !== 0) { console.error(`Invalid stride ${this.stride}, type size ${this.typeSize}.`); }\n this.stride = this.stride / this.typeSize;\n } else {\n this.stride = this.compCount;\n }\n //\n this.compressed = inAttrib.normalize === true;\n }\n\n getData (index: number): [number, number, number, number] | undefined {\n let offset = this.offset;\n\n offset += index * this.stride;\n if (offset + this.compCount > this.length) { return; }\n\n let res: [number, number, number, number];\n\n if (this.compCount === 2) {\n res = [this.data[offset], this.data[offset + 1], 0, 0];\n } else if (this.compCount === 3) {\n res = [this.data[offset], this.data[offset + 1], this.data[offset + 2], 0];\n } else {\n res = [this.data[offset], this.data[offset + 1], this.data[offset + 2], this.data[offset + 3]];\n }\n\n if (this.compressed) {\n for (let i = 0; i < this.compCount; i++) {\n res[i] *= this.compressScale;\n if (this.signed) {\n res[i] = Math.max(res[i], -1.0);\n }\n }\n }\n\n return res;\n }\n\n getLength (): number {\n return Math.round((this.length - this.offset) / this.stride);\n }\n}\n\n/**\n * 几何包围盒代理类\n */\nexport class GeometryBoxProxy {\n /**\n * 渲染开始索引\n */\n drawStart = 0;\n /**\n * 渲染索引数目\n */\n drawCount = 0;\n /**\n * 索引数组\n */\n index?: spec.TypedArray;\n /**\n * 位置数组\n */\n position!: AttributeArray;\n /**\n * 关节点数组\n */\n joint?: AttributeArray;\n /**\n * 权重数组\n */\n weight?: AttributeArray;\n /**\n * 绑定矩阵数组\n */\n bindMatrices: Matrix4[] = [];\n\n /**\n * 创建函数,根据几何体和绑定矩阵数组\n * @param geometry - 几何体\n * @param bindMatrices - 绑定矩阵数组\n */\n create (geometry: Geometry, bindMatrices: Matrix4[]) {\n this.drawStart = 0;\n this.drawCount = Math.abs(geometry.getDrawCount());\n // FIXME: 需要geometry中的attributes数组,GLGeometry有这个数组,其他的没有\n // @ts-expect-error\n const attributes = geometry.attributes as Record<string, Attribute>;\n\n //\n this.index = geometry.getIndexData();\n const positionAttrib = attributes['aPos'];\n const positionArray = geometry.getAttributeData('aPos') as spec.TypedArray;\n\n this.position = new AttributeArray();\n this.position.create(positionAttrib, positionArray);\n //\n const jointAttrib = attributes['aJoints'];\n const weightAttrib = attributes['aWeights'];\n\n if (jointAttrib !== undefined && weightAttrib !== undefined) {\n const jointArray = geometry.getAttributeData('aJoints') as spec.TypedArray;\n const weightArray = geometry.getAttributeData('aWeights') as spec.TypedArray;\n\n this.joint = new AttributeArray();\n this.joint.create(jointAttrib, jointArray);\n this.weight = new AttributeArray();\n this.weight.create(weightAttrib, weightArray);\n }\n this.bindMatrices = bindMatrices;\n }\n\n /**\n * 获取包围盒,如果有骨骼动画,需要先更新位置\n * @param box - 包围盒,会被修改\n * @returns 包围盒\n */\n getBoundingBox (box: Box3) {\n box.makeEmpty();\n const skinMat = new Matrix4();\n const hasAnim = this.joint !== undefined && this.weight !== undefined && this.bindMatrices.length > 0;\n\n const indexSet: Set<number> = new Set();\n\n if (this.index !== undefined) {\n for (let i = 0; i < this.drawCount; i++) {\n const j = this.drawStart + i;\n\n if (j < this.index.length) {\n indexSet.add(this.index[j]);\n }\n }\n } else {\n for (let i = 0; i < this.drawCount; i++) {\n indexSet.add(this.drawStart + i);\n }\n }\n\n indexSet.forEach(index => {\n const posData = this.position.getData(index);\n\n if (posData !== undefined) {\n const posVec = Vector3.fromArray(posData);\n\n if (hasAnim) {\n const jointData = this.joint?.getData(index);\n const weightData = this.weight?.getData(index);\n\n if (jointData !== undefined && weightData !== undefined) {\n skinMat.setZero();\n let findError = false;\n\n for (let i = 0; i < 4; i++) {\n if (weightData[i] === 0) {\n continue;\n }\n\n if (jointData[i] < 0 || jointData[i] >= this.bindMatrices.length) {\n findError = true;\n\n break;\n }\n\n const bindMat = this.bindMatrices[jointData[i]];\n\n skinMat.addScaledMatrix(bindMat, weightData[i]);\n }\n\n if (!findError) {\n const resVec = skinMat.transformVector4(new Vector4(posVec.x, posVec.y, posVec.z, 1.0));\n\n if (Math.abs(resVec.w) > 1e-4) {\n resVec.multiply(1.0 / resVec.w);\n posVec.set(resVec.x, resVec.y, resVec.z);\n }\n }\n }\n }\n\n box.expandByPoint(posVec);\n }\n });\n\n return box;\n }\n}\n\n/**\n * 点击测试代理类,\n */\nexport class HitTestingProxy {\n /**\n * 渲染开始索引\n */\n drawStart = 0;\n /**\n * 渲染索引数目\n */\n drawCount = 0;\n /**\n * 索引数组\n */\n index?: spec.TypedArray;\n /**\n * 位置数组\n */\n position!: AttributeArray;\n /**\n * 关节点数组\n */\n joint?: AttributeArray;\n /**\n * 权重数组\n */\n weight?: AttributeArray;\n /**\n * 是否双面\n */\n doubleSided = false;\n /**\n * 绑定矩阵数组\n */\n bindMatrices: Matrix4[] = [];\n /**\n * 是否有动画\n */\n hasAnimation = false;\n /**\n * 蒙皮矩阵\n */\n skinMatrix = new Matrix4();\n\n /**\n * 创建对象,传入几何体、是否双面和绑定矩阵列表\n * @param geometry - 几何体\n * @param doubleSided - 是否双面\n * @param bindMatrices - 绑定矩阵列表\n */\n create (geometry: Geometry, doubleSided: boolean, bindMatrices: Matrix4[]) {\n this.drawStart = 0;\n this.drawCount = Math.abs(geometry.getDrawCount());\n // FIXME: 需要geometry中的attributes数组,GLGeometry有这个数组,其他的没有\n // @ts-expect-error\n const attributes = geometry.attributes as Record<string, Attribute>;\n\n //\n this.index = geometry.getIndexData();\n const positionAttrib = attributes['aPos'];\n const positionArray = geometry.getAttributeData('aPos') as spec.TypedArray;\n\n this.position = new AttributeArray();\n this.position.create(positionAttrib, positionArray);\n //\n const jointAttrib = attributes['aJoints'];\n const weightAttrib = attributes['aWeights'];\n\n if (jointAttrib !== undefined && weightAttrib !== undefined) {\n const jointArray = geometry.getAttributeData('aJoints') as spec.TypedArray;\n const weightArray = geometry.getAttributeData('aWeights') as spec.TypedArray;\n\n this.joint = new AttributeArray();\n this.joint.create(jointAttrib, jointArray);\n this.weight = new AttributeArray();\n this.weight.create(weightAttrib, weightArray);\n }\n this.doubleSided = doubleSided;\n this.bindMatrices = bindMatrices;\n this.hasAnimation = this.joint !== undefined && this.weight !== undefined && this.bindMatrices.length > 0;\n }\n\n /**\n * 点击测试,返回射线参数值\n * @param rayOrigin - 射线原点\n * @param rayDirection - 射线方向\n * @returns 射线参数值或 undefined\n */\n getHitPoint (rayOrigin: Vector3, rayDirection: Vector3): number | undefined {\n let mint: number | undefined;\n const p0 = new Vector3(), p1 = new Vector3(), p2 = new Vector3();\n const q0 = new Vector4(), q1 = new Vector4(), q2 = new Vector4();\n const backfaceCulling = !this.doubleSided;\n\n for (let i = 0; i + 2 < this.drawCount; i += 3) {\n let i0 = this.drawStart + i;\n let i1 = this.drawStart + i + 1;\n let i2 = this.drawStart + i + 2;\n\n if (this.index !== undefined) {\n i0 = this.index[i0];\n i1 = this.index[i1];\n i2 = this.index[i2];\n }\n\n const r0 = this.getPosition(i0, p0, q0);\n const r1 = this.getPosition(i1, p1, q1);\n const r2 = this.getPosition(i2, p2, q2);\n\n if (!r0 || !r1 || !r2) {\n continue;\n }\n\n const t = RayTriangleTesting(rayOrigin, rayDirection, r0, r1, r2, backfaceCulling);\n\n if (t === undefined) {\n continue;\n }\n\n if (mint === undefined || mint > t) {\n mint = t;\n }\n }\n\n return mint;\n }\n\n /**\n * 获取顶点位置\n * @param index - 顶点索引\n * @param vec3 - 顶点位置,会被修改和返回\n * @param vec4 - 临时变量,用于骨骼动画时的计算\n * @returns 顶点位置\n */\n getPosition (index: number, vec3: Vector3, vec4: Vector4): Vector3 | null {\n const posData = this.position.getData(index);\n\n if (posData === undefined) {\n return null;\n }\n\n if (this.hasAnimation) {\n const jointData = this.joint?.getData(index);\n const weightData = this.weight?.getData(index);\n\n if (jointData !== undefined && weightData !== undefined) {\n const skinMat = this.skinMatrix;\n\n skinMat.setZero();\n for (let i = 0; i < 4; i++) {\n if (weightData[i] === 0) { continue; }\n\n const bindMat = this.bindMatrices[jointData[i]];\n\n skinMat.addScaledMatrix(bindMat, weightData[i]);\n }\n\n vec4.set(posData[0], posData[1], posData[2], 1.0);\n const resVec = skinMat.transformVector4(vec4);\n const scale = 1.0 / resVec.w;\n\n vec3.set(resVec.x * scale, resVec.y * scale, resVec.z * scale);\n }\n } else {\n vec3.set(posData[0], posData[1], posData[2]);\n }\n\n return vec3;\n }\n\n}\n\n/**\n * 检查辅助类,负责 3D 插件元素数据格式检查和报错\n */\nexport class CheckerHelper {\n /**\n * 检查数值\n * @param v - 数值\n * @returns\n */\n static checkNumber (v: number): boolean {\n return typeof v === 'number';\n }\n\n /**\n * 检查数值或未定义\n * @param v - 数值或未定义\n * @returns\n */\n static checkNumberUndef (v?: number): boolean {\n return v === undefined ? true : this.checkNumber(v);\n }\n\n /**\n * 检查 0 和 1 之间数值\n * @param v - 数值\n * @returns\n */\n static checkNumber01 (v: number): boolean {\n return this.checkNumber(v) && v >= 0 && v <= 1;\n }\n\n /**\n * 检查 0 和 1 之间数值或未定义\n * @param v - 数值或未定义\n * @returns\n */\n static checkNumber01Undef (v?: number): boolean {\n return v === undefined ? true : this.checkNumber01(v);\n }\n\n /**\n * 检查正数\n * @param v - 数值\n * @returns\n */\n static checkPositive (v: number): boolean {\n return this.checkNumber(v) && v > 0;\n }\n\n /**\n * 检查非负数\n * @param v - 数值\n * @returns\n */\n static checkNonnegative (v: number): boolean {\n return this.checkNumber(v) && v >= 0;\n }\n\n /**\n * 检查非负数或未定义\n * @param v - 数值\n * @returns\n */\n static checkNonnegativeUndef (v?: number): boolean {\n return v === undefined ? true : this.checkNonnegative(v);\n }\n\n /**\n * 检查布尔类型\n * @param v - 布尔值\n * @returns\n */\n static checkBoolean (v: boolean): boolean {\n return typeof v === 'boolean';\n }\n\n /**\n * 检查布尔类型或未定义\n * @param v - 布尔值或未定义\n * @returns\n */\n static checkBooleanUndef (v?: boolean): boolean {\n return v === undefined ? true : this.checkBoolean(v);\n }\n\n /**\n * 检查字符串类型\n * @param v - 字符串\n * @returns\n */\n static checkString (v: string): boolean {\n return typeof v === 'string';\n }\n\n /**\n * 检查字符串类型或未定义\n * @param v - 字符串或未定义\n * @returns\n */\n static checkStringUndef (v?: string): boolean {\n return v === undefined ? true : this.checkString(v);\n }\n\n /**\n * 检查浮点数组\n * @param v - 浮点数组\n * @returns\n */\n static checkFloat32Array (v: Float32Array): boolean {\n return v instanceof Float32Array;\n }\n\n /**\n * 检查浮点数组或未定义\n * @param v - 浮点数组或未定义\n * @returns\n */\n static checkFloat32ArrayUndef (v?: Float32Array): boolean {\n return v === undefined ? true : this.checkFloat32Array(v);\n }\n\n /**\n * 检查父节点索引\n * @param v - 数值或未定义\n * @returns\n */\n static checkParent (v?: number): boolean {\n if (v === undefined) { return true; }\n if (!this.checkNumber(v)) { return false; }\n\n return v >= 0;\n }\n\n /**\n * 检查纹理坐标\n * @param v - 纹理坐标或未定义\n * @returns\n */\n static checkTexCoord (v?: number): boolean {\n if (v === undefined) { return true; }\n if (!this.checkNumber(v)) { return false; }\n\n return v >= 0 && v <= 1;\n }\n\n /**\n * 检查二维向量\n * @param v - 二维向量\n * @returns\n */\n static checkVec2 (v: spec.vec2): boolean {\n if (!Array.isArray(v)) { return false; }\n if (v.length != 2) { return false; }\n\n return v.every(v => this.checkNumber(v));\n }\n\n /**\n * 检查二维向量或未定义\n * @param v - 二维向量或未定义\n * @returns\n */\n static checkVec2Undef (v?: spec.vec2): boolean {\n return v === undefined ? true : this.checkVec2(v);\n }\n\n /**\n * 检查三维向量\n * @param v - 三维向量\n * @returns\n */\n static checkVec3 (v: spec.vec3): boolean {\n if (!Array.isArray(v)) { return false; }\n if (v.length != 3) { return false; }\n\n return v.every(v => this.checkNumber(v));\n }\n\n /**\n * 检查三维非负向量\n * @param v - 三维向量\n * @returns\n */\n static checkNonnegative3 (v: spec.vec3): boolean {\n if (!Array.isArray(v)) { return false; }\n if (v.length != 3) { return false; }\n\n return v.every(v => this.checkNonnegative(v));\n }\n\n /**\n * 检查四维向量\n * @param v - 四维向量\n * @returns\n */\n static checkVec4 (v: spec.vec4): boolean {\n if (!Array.isArray(v)) { return false; }\n if (v.length != 4) { return false; }\n\n return v.every(v => this.checkNumber(v));\n }\n\n /**\n * 检查四维向量或未定义\n * @param v - 四维向量或未定义\n * @returns\n */\n static checkNonnegative4 (v: spec.vec4): boolean {\n if (!Array.isArray(v)) { return false; }\n if (v.length != 4) { return false; }\n\n return v.every(v => this.checkNonnegative(v));\n }\n\n /**\n * 检查数值数组\n * @param v - 数值数组\n * @returns\n */\n static checkNumberArray (v: number[]): boolean {\n if (!Array.isArray(v)) { return false; }\n\n return v.every(v => this.checkNumber(v));\n }\n\n /**\n * 检查纹理对象\n * @param v - 纹理对象\n * @returns\n */\n static checkTexture (v: Texture): boolean {\n if (v instanceof Texture) {\n if (v.isDestroyed) {\n console.error(`Texture is destroyed, ${v.name}.`);\n }\n\n return !v.isDestroyed;\n } else {\n return false;\n }\n }\n\n /**\n * 检查纹理对象或未定义\n * @param v - 纹理对象或未定义\n * @returns\n */\n static checkTextureUndef (v?: Texture): boolean {\n return v === undefined ? true : this.checkTexture(v);\n }\n\n /**\n * 检查纹理变换参数\n * @param v - 纹理变换参数\n * @returns\n */\n static checkTexTransform (v: ModelTextureTransform): boolean {\n if (!this.checkVec2Undef(v.offset)) { return false; }\n if (!this.checkNumberUndef(v.rotation)) { return false; }\n if (!this.checkVec2Undef(v.scale)) { return false; }\n\n if (v.scale !== undefined) {\n if (Math.abs(v.scale[0]) < 1e-5 || Math.abs(v.scale[1]) < 1e-5) {\n // check scale range\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * 检查纹理变换参数或未定义\n * @param v - 纹理变换参数或未定义\n * @returns\n */\n static checkTexTransformUndef (v?: ModelTextureTransform): boolean {\n return v === undefined ? true : this.checkTexTransform(v);\n }\n\n /**\n * 检查材质混合参数或未定义\n * @param v - 材质混合参数或未定义\n * @returns\n */\n static checkMatBlending (v?: spec.MaterialBlending): boolean {\n return v === undefined\n || v === spec.MaterialBlending.opaque\n || v === spec.MaterialBlending.masked\n || v === spec.MaterialBlending.translucent\n || v === spec.MaterialBlending.additive;\n }\n\n /**\n * 检查材质单双面模式或未定义\n * @param v - 材质单双面模式或未定义\n * @returns\n */\n static checkMatSide (v?: spec.SideMode): boolean {\n return v === undefined || v === spec.SideMode.BACK || v === spec.SideMode.DOUBLE || v === spec.SideMode.FRONT;\n }\n\n /**\n * 检查动画路径模式\n * @param v - 动画路径模式\n * @returns\n */\n static checkAnimPath (v: string): boolean {\n return v === 'translation' || v === 'rotation' || v === 'scale' || v === 'weights';\n }\n\n /**\n * 检查动画插值模式\n * @param v - 动画插值模式\n * @returns\n */\n static checkAnimInterp (v: string): boolean {\n return v === 'LINEAR' || v === 'STEP' || v === 'CUBICSPLINE';\n }\n\n /**\n * 检查几何体\n * @param v - 几何体\n * @param s - 蒙皮参数\n */\n static assertGeometry (v: Geometry, s?: ModelSkinOptions) {\n if (!(v instanceof Geometry)) {\n console.error(`Invalid geometry type ${this.stringify(v)}.`);\n }\n // @ts-expect-error\n if (v.isDestroyed === true) {\n console.error('Geometry object is destroyed.');\n }\n if (!this.checkNonnegative(v.getDrawStart())) {\n console.error(`Invalid geometry draw start: ${v.getDrawStart()}, ${this.stringify(v)}.`);\n }\n // // drawCount不再为负\n // if (!this.checkPositive(v.getDrawCount())) {\n // throw new Error(`Invalid geometry draw count: ${v.getDrawCount()}, ${this.stringify(v)}`);\n // }\n\n // Geometry具体内容检查,先忽略\n // const opts = v.options;\n // const drawCount = Math.abs(v.getDrawCount());\n\n // if (opts !== undefined && drawCount > 0) {\n // let maxLength = v.drawStart + drawCount;\n\n // if (opts.index !== undefined) {\n // const indexArray = opts.index.data;\n\n // if (indexArray.length < maxLength) {\n // throw new Error(`Index length(${indexArray.length}) is less than draw count(${maxLength}), ${this.stringify(v)}`);\n // }\n // let maxIndex = 0;\n\n // for (let i = 0; i < drawCount; i++) {\n // maxIndex = Math.max(indexArray[v.drawStart + i], maxIndex);\n // }\n // maxLength = maxIndex + 1;\n // }\n // const positionAttrib = opts.attributes['aPos'] as Attribute;\n\n // if (positionAttrib === undefined) {\n // throw new Error(`Position attribute is required, ${this.stringify(v)}`);\n // }\n // this.assertGeometryBuffer(v, 'aPos', maxLength);\n // this.assertGeometryBuffer(v, 'aNormal', maxLength);\n // this.assertGeometryBuffer(v, 'aTangent', maxLength);\n // this.assertGeometryBuffer(v, 'aUV', maxLength);\n // this.assertGeometryBuffer(v, 'aJoints', maxLength);\n // this.assertGeometryBuffer(v, 'aWeights', maxLength);\n\n // // 索引检查\n // if(s !== undefined){\n // const matLen = s.inverseBindMatrices?.length ?? 0;\n // if(matLen > 0){\n // const jointArray = this.createAttributeArray(v, \"aJoints\");\n // if(jointArray !== undefined){\n // for(let i = 0; i < maxLength; i++){\n // const data = jointArray.getData(i);\n // if(data === undefined) continue;\n // if(Math.max(...data) >= matLen){\n // throw new Error(`Joint index out of range: ${this.stringify(data)}, matrices: ${matLen}`);\n // }\n // }\n // }\n // }\n // }\n // }\n }\n\n /**\n * 检查几何体缓冲区\n * @param v - 几何体\n * @param name - 名称\n * @param drawCount - 渲染数目\n */\n static assertGeometryBuffer (v: Geometry, name: string, drawCount: number) {\n const attribArray = this.createAttributeArray(v, name);\n\n if (attribArray !== undefined) {\n if (attribArray.getLength() < drawCount) {\n console.error(`${name} Length(${attribArray.getLength()}) is less than draw count(${drawCount}), ${this.stringify(v)}.`);\n }\n }\n }\n\n /**\n * 创建属性数组\n * @param v - 几何体\n * @param name - 名称\n * @returns\n */\n static createAttributeArray (v: Geometry, name: string): AttributeArray | undefined {\n // @ts-expect-error\n const attributes = v.attributes;\n\n if (attributes === undefined) { return; }\n const dataAttrib = attributes[name];\n\n if (dataAttrib === undefined) { return; }\n const dataArray = v.getAttributeData(name);\n\n if (dataArray === undefined) { return; }\n //\n const attribArray = new AttributeArray();\n\n attribArray.create(dataAttrib as Attribute, dataArray);\n\n return attribArray;\n }\n\n /**\n * 检查蒙皮参数\n * @param v - 蒙皮参数\n */\n static assertModelSkinOptions (v: ModelSkinOptions) {\n if (!this.checkStringUndef(v.name)) { console.error(`Invalid skin name ${v.name}, ${this.stringify(v)}.`); }\n if (!this.checkNumberArray(v.joints)) { console.error(`Invalid skin joints ${v.joints}, ${this.stringify(v)}.`); }\n if (!this.checkNumberUndef(v.skeleton)) { console.error(`Invalid skin skeleton ${v.skeleton}, ${this.stringify(v)}.`); }\n if (!this.checkFloat32ArrayUndef(v.inverseBindMatrices)) { console.error(`Invalid skin inverseBindMatrices ${v.inverseBindMatrices}, ${this.stringify(v)}.`); }\n //\n if (v.inverseBindMatrices !== undefined) {\n if (v.inverseBindMatrices.length <= 0 || v.inverseBindMatrices.length % 16 !== 0) { console.error(`Invalid skin inverseBindMatrices length ${v.inverseBindMatrices}, ${this.stringify(v)}.`); }\n if (v.joints.length * 16 !== v.inverseBindMatrices.length) { console.error(`Mismatch: skin joints and inverseBindMatrices length, ${v.joints}, ${v.inverseBindMatrices}, ${this.stringify(v)}.`); }\n const mat = new Matrix4();\n\n for (let i = 0; i < v.inverseBindMatrices.length; i += 16) {\n for (let j = 0; j < 16; j++) {\n mat.elements[j] = v.inverseBindMatrices[i + j];\n }\n if (Math.abs(mat.determinant()) < 1e-5) {\n console.error(`Determinant of inverseBindMatrices is too small ${mat.determinant()}, index ${i / 16}, ${this.stringify(v)}.`);\n }\n }\n } else {\n if (v.joints.length <= 0) { console.error(`Invalid skin joints length ${v.joints}, ${this.stringify(v)}.`); }\n }\n }\n\n /**\n * 检查材质参数\n * @param v - 材质参数\n */\n static assertMatOptions (v: ModelMaterialOptions) {\n if (v.type === spec.MaterialType.unlit) {\n if (!this.checkString(v.name)) { console.error(`Invalid material name ${v.name}, ${this.stringify(v)}.`); }\n //\n if (!this.checkNonnegative4(v.baseColorFactor)) { console.error(`Invalid material baseColorFactor ${v.baseColorFactor}, ${this.stringify(v)}.`); }\n if (!this.checkTextureUndef(v.baseColorTexture)) { console.error(`Invalid material baseColorTexture ${v.baseColorTexture}, ${this.stringify(v)}.`); }\n if (!this.checkTexTransformUndef(v.baseColorTextureTransform)) { console.error(`Invalid material baseColorTextureTransform ${v.baseColorTextureTransform}, ${this.stringify(v)}.`); }\n if (!this.checkTexCoord(v.baseColorTextureCoordinate)) { console.error(`Invalid material baseColorTextureCoordinate ${v.baseColorTextureCoordinate}, ${this.stringify(v)}.`); }\n //\n if (!this.checkBooleanUndef(v.depthMask)) { console.error(`Invalid material depthMask ${v.depthMask}, ${this.stringify(v)}.`); }\n if (!this.checkMatBlending(v.blending)) { console.error(`Invalid material blending ${v.blending}, ${this.stringify(v)}.`); }\n if (!this.checkMatSide(v.side)) { console.error(`Invalid material side ${v.side}, ${this.stringify(v)}.`); }\n if (v.blending === spec.MaterialBlending.masked) {\n if (v.alphaCutOff === undefined) { console.error(`Material alphaCutOff is required for mask, ${this.stringify(v)}.`); }\n }\n if (!this.checkNumber01Undef(v.alphaCutOff)) { console.error(`Invalid material alphaCutOff ${v.alphaCutOff}, ${this.stringify(v)}.`); }\n } else if (v.type === spec.MaterialType.pbr) {\n if (!this.checkString(v.name)) { console.error(`Invalid material name ${v.name}, ${this.stringify(v)}.`); }\n //\n if (!this.checkNonnegative4(v.baseColorFactor)) { console.error(`Invalid material baseColorFactor ${v.baseColorFactor}, ${this.stringify(v)}.`); }\n if (!this.checkTextureUndef(v.baseColorTexture)) { console.error(`Invalid material baseColorTexture ${v.baseColorTexture}, ${this.stringify(v)}.`); }\n if (!this.checkTexTransformUndef(v.baseColorTextureTransform)) { console.error(`Invalid material baseColorTextureTransform ${v.baseColorTextureTransform}, ${this.stringify(v)}.`); }\n if (!this.checkTexCoord(v.baseColorTextureCoordinate)) { console.error(`Invalid material baseColorTextureCoordinate ${v.baseColorTextureCoordinate}, ${this.stringify(v)}.`); }\n //\n if (!this.checkBooleanUndef(v.useSpecularAA)) { console.error(`Invalid material useSpecularAA ${v.useSpecularAA}, ${this.stringify(v)}.`); }\n if (!this.checkNumber01(v.metallicFactor)) { console.error(`Invalid material metallicFactor ${v.metallicFactor}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.roughnessFactor)) { console.error(`Invalid material roughnessFactor ${v.roughnessFactor}, ${this.stringify(v)}.`); }\n if (!this.checkTextureUndef(v.metallicRoughnessTexture)) { console.error(`Invalid material metallicRoughnessTexture ${v.metallicRoughnessTexture}, ${this.stringify(v)}.`); }\n if (!this.checkTexTransformUndef(v.metallicRoughnessTextureTransform)) { console.error(`Invalid material metallicRoughnessTextureTransform ${v.metallicRoughnessTextureTransform}, ${this.stringify(v)}.`); }\n if (!this.checkTexCoord(v.metallicRoughnessTextureCoordinate)) { console.error(`Invalid material metallicRoughnessTextureCoordinate ${v.metallicRoughnessTextureCoordinate}, ${this.stringify(v)}.`); }\n //\n if (!this.checkTextureUndef(v.normalTexture)) { console.error(`Invalid material normalTexture ${v.normalTexture}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegativeUndef(v.normalTextureScale)) { console.error(`Invalid material normalTextureScale ${v.normalTextureScale}, ${this.stringify(v)}.`); }\n if (!this.checkTexTransformUndef(v.normalTextureTransform)) { console.error(`Invalid material normalTextureTransform ${v.normalTextureTransform}, ${this.stringify(v)}.`); }\n if (!this.checkTexCoord(v.normalTextureCoordinate)) { console.error(`Invalid material normalTextureCoordinate ${v.normalTextureCoordinate}, ${this.stringify(v)}.`); }\n //\n if (!this.checkTextureUndef(v.occlusionTexture)) { console.error(`Invalid material occlusionTexture ${v.occlusionTexture}, ${this.stringify(v)}.`); }\n if (!this.checkNumber01Undef(v.occlusionTextureStrength)) { console.error(`Invalid material occlusionTextureStrength ${v.occlusionTextureStrength}, ${this.stringify(v)}.`); }\n if (!this.checkTexTransformUndef(v.occlusionTextureTransform)) { console.error(`Invalid material occlusionTextureTransform ${v.occlusionTextureTransform}, ${this.stringify(v)}.`); }\n if (!this.checkTexCoord(v.occlusionTextureCoordinate)) { console.error(`Invalid material occlusionTextureCoordinate ${v.occlusionTextureCoordinate}, ${this.stringify(v)}.`); }\n //\n //\n if (!this.checkNonnegative4(v.emissiveFactor)) { console.error(`Invalid material emissiveFactor ${v.emissiveFactor}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.emissiveIntensity)) { console.error(`Invalid material emissiveIntensity ${v.emissiveIntensity}, ${this.stringify(v)}.`); }\n if (!this.checkTextureUndef(v.emissiveTexture)) { console.error(`Invalid material emissiveTexture ${v.emissiveTexture}, ${this.stringify(v)}.`); }\n if (!this.checkTexTransformUndef(v.emissiveTextureTransform)) { console.error(`Invalid material emissiveTextureTransform ${v.emissiveTextureTransform}, ${this.stringify(v)}.`); }\n if (!this.checkTexCoord(v.emissiveTextureCoordinate)) { console.error(`Invalid material emissiveTextureCoordinate ${v.emissiveTextureCoordinate}, ${this.stringify(v)}.`); }\n //\n if (!this.checkBooleanUndef(v.depthMask)) { console.error(`Invalid material depthMask ${v.depthMask}, ${this.stringify(v)}.`); }\n if (!this.checkMatBlending(v.blending)) { console.error(`Invalid material blending ${v.blending}, ${this.stringify(v)}.`); }\n if (!this.checkMatSide(v.side)) { console.error(`Invalid material side ${v.side}, ${this.stringify(v)}.`); }\n if (v.blending === spec.MaterialBlending.masked) {\n if (v.alphaCutOff === undefined) { console.error(`Material alphaCutOff is required for mask, ${this.stringify(v)}.`); }\n }\n if (!this.checkNumber01Undef(v.alphaCutOff)) { console.error(`Invalid material alphaCutOff ${v.alphaCutOff}, ${this.stringify(v)}.`); }\n } else {\n console.error(`Invalid material type ${this.stringify(v)}.`);\n }\n }\n\n /**\n * 检查 Primitive 参数\n * @param v - Primitive 参数\n * @param s - 蒙皮参数\n * @returns\n */\n static assertPrimOptions (v: ModelPrimitiveOptions, s?: ModelSkinOptions) {\n this.assertGeometry(v.geometry, s);\n this.assertMatOptions(v.material);\n\n return true;\n }\n\n /**\n * 检查 Model 插件 Mesh 参数\n * @param v - Model 插件 Mesh 参数\n */\n static assertModelMeshOptions (v: ModelMeshOptions) {\n if (!this.checkParent(v.parent)) { console.error(`Invalid mesh parent ${v.parent}, ${this.stringify(v)}.`); }\n\n if (v.skin !== undefined) { this.assertModelSkinOptions(v.skin); }\n\n const morphList: PMorph[] = [];\n\n for (let i = 0; i < v.primitives.length; i++) {\n const prim = v.primitives[i];\n\n if (!this.assertPrimOptions(prim)) {\n console.error(`Invalid primitive ${prim}, ${this.stringify(v)}.`);\n }\n const morph = new PMorph();\n\n morph.create(prim.geometry);\n morphList.push(morph);\n }\n\n for (let i = 1; i < morphList.length; i++) {\n const morph0 = morphList[i - 1];\n const morph1 = morphList[i];\n\n if (!morph0.equals(morph1)) {\n console.error(`Morph states mismatch: ${this.stringify(morph0)}, ${this.stringify(morph1)}, ${this.stringify(v)}.`);\n }\n }\n\n if (!this.checkBooleanUndef(v.hide)) { console.error(`Invalid mesh hide ${v.hide}, ${this.stringify(v)}.`); }\n }\n\n /**\n * 检查 Model 插件相机参数\n * @param v - Model 插件相机参数\n */\n static assertModelCameraOptions (v: ModelCameraOptions) {\n if (!this.checkParent(v.parent)) { console.error(`Invalid camera parent ${v.parent}, ${this.stringify(v)}.`); }\n if (!this.checkNumberUndef(v.aspect)) { console.error(`Invalid camera aspect ${v.aspect}, ${this.stringify(v)}.`); }\n if (!this.checkPositive(v.near)) { console.error(`Invalid camera near ${v.near}, ${this.stringify(v)}.`); }\n if (!this.checkPositive(v.far) || v.far <= v.near) { console.error(`Invalid camera far ${v.far}, ${this.stringify(v)}.`); }\n if (!this.checkPositive(v.fov)) { console.error(`Invalid camera fov ${v.fov}, ${this.stringify(v)}.`); }\n if (!this.checkNumber01(v.clipMode)) { console.error(`Invalid camera clipMode ${v.clipMode}, ${this.stringify(v)}.`); }\n }\n\n /**\n * 检查 Model 插件灯光参数\n * @param v - Model 插件灯光参数\n */\n static assertModelLightOptions (v: ModelLightOptions) {\n if (v.lightType === 'directional') {\n if (!this.checkParent(v.parent)) { console.error(`Invalid light parent ${v.parent}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative4(v.color)) { console.error(`Invalid light color ${v.color}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.intensity)) { console.error(`Invalid light intensity ${v.intensity}, ${this.stringify(v)}.`); }\n } else if (v.lightType === 'point') {\n if (!this.checkParent(v.parent)) { console.error(`Invalid light parent ${v.parent}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative4(v.color)) { console.error(`Invalid light color ${v.color}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.intensity)) { console.error(`Invalid light intensity ${v.intensity}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.range)) { console.error(`Invalid light range ${v.range}, ${this.stringify(v)}.`); }\n } else if (v.lightType === 'spot') {\n if (!this.checkParent(v.parent)) { console.error(`Invalid light parent ${v.parent}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative4(v.color)) { console.error(`Invalid light color ${v.color}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.intensity)) { console.error(`Invalid light intensity ${v.intensity}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.range)) { console.error(`Invalid light range ${v.range}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.innerConeAngle)) { console.error(`Invalid light innerConeAngle ${v.innerConeAngle}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.outerConeAngle)) { console.error(`Invalid light outerConeAngle ${v.outerConeAngle}, ${this.stringify(v)}.`); }\n } else if (v.lightType === 'ambient') {\n if (!this.checkParent(v.parent)) { console.error(`Invalid light parent ${v.parent}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative4(v.color)) { console.error(`Invalid light color ${v.color}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.intensity)) { console.error(`Invalid light intensity ${v.intensity}, ${this.stringify(v)}.`); }\n } else {\n console.error(`Invalid light type ${this.stringify(v)}.`);\n }\n }\n\n /**\n * 检查 Model 插件天空盒参数\n * @param v - Model 插件天空盒参数\n */\n static assertModelSkyboxOptions (v: ModelSkyboxOptions) {\n if (!this.checkBoolean(v.renderable)) { console.error(`Invalid skybox renderable ${v.renderable}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.intensity)) { console.error(`Invalid skybox intensity ${v.intensity}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.reflectionsIntensity)) { console.error(`Invalid skybox reflectionsIntensity ${v.reflectionsIntensity}, ${this.stringify(v)}.`); }\n //\n const c = v.irradianceCoeffs;\n\n if (c !== undefined) {\n if (!Array.isArray(c) || c.length != 9) { console.error(`Invalid skybox irradianceCoeffs ${c}, ${this.stringify(v)}.`); }\n c.forEach(v => {\n if (!this.checkVec3(v as spec.vec3)) { console.error(`Invalid skybox irradianceCoeffs ${c}, ${this.stringify(v)}.`); }\n });\n } else if (v.diffuseImage !== undefined) {\n if (!this.checkTexture(v.diffuseImage)) { console.error(`Invalid skybox diffuseImage ${v.diffuseImage}, ${this.stringify(v)}.`); }\n } else {\n console.error(`Invalid skybox, irradianceCoeffs or diffuseImage should give one, ${this.stringify(v)}.`);\n }\n if (!this.checkTexture(v.specularImage)) { console.error(`Invalid skybox specularImage ${v.specularImage}, ${this.stringify(v)}.`); }\n if (!this.checkPositive(v.specularImageSize)) { console.error(`Invalid skybox specularImageSize ${v.specularImageSize}, ${this.stringify(v)}.`); }\n if (!this.checkPositive(v.specularMipCount)) { console.error(`Invalid skybox specularMipCount ${v.specularMipCount}, ${this.stringify(v)}.`); }\n if (this.pow2(v.specularMipCount) > v.specularImageSize) {\n console.error(`Invalid skybox specularMipCount or specularImageSize, ${this.stringify(v)}.`);\n }\n }\n\n /**\n * 检查 Model 插件动画轨道参数\n * @param v - Model 插件动画轨道参数\n * @returns\n */\n static checkModelAnimTrackOptions (v: ModelAnimTrackOptions) {\n if (!this.checkNonnegative(v.node)) {\n console.error(`Invalid track node ${v.node}, ${this.stringify(v)}`);\n\n return false;\n }\n if (!this.checkFloat32Array(v.input)) {\n console.error(`Invalid track input ${v.input}, ${this.stringify(v)}`);\n\n return false;\n }\n if (!this.checkFloat32Array(v.output)) {\n console.error(`Invalid track input ${v.output}, ${this.stringify(v)}`);\n\n return false;\n }\n if (!this.checkAnimPath(v.path)) {\n console.error(`Invalid track path ${v.path}, ${this.stringify(v)}`);\n\n return false;\n }\n if (!this.checkAnimInterp(v.interpolation)) {\n console.error(`Invalid track interpolation ${v.interpolation}, ${this.stringify(v)}`);\n\n return false;\n }\n\n return true;\n }\n\n /**\n * 检查 Model 插件动画参数\n * @param v - Model 插件动画参数\n */\n static assertModelAnimOptions (v: ModelAnimationOptions) {\n if (!this.checkStringUndef(v.name)) { console.error(`Invalid animation name ${v.name}, ${this.stringify(v)}.`); }\n if (!Array.isArray(v.tracks)) { console.error(`Invalid animation tracks ${v.tracks}, ${this.stringify(v)}.`); }\n v.tracks.forEach(t => {\n if (!this.checkModelAnimTrackOptions(t)) { console.error(`Invalid animation track ${t}, ${this.stringify(v)}.`); }\n });\n }\n\n /**\n * 检查场景树参数\n * @param v - 场景树参数\n */\n static assertTreeOptions (v: ModelTreeOptions) {\n if (!this.checkNumberUndef(v.animation)) { console.error(`Invalid tree animation ${v.animation}, ${this.stringify(v)}.`); }\n if (v.animations !== undefined) {\n if (!Array.isArray(v.animations)) { console.error(`Invalid tree animations ${v.animations}, ${this.stringify(v)}.`); }\n v.animations.forEach(anim => { this.assertModelAnimOptions(anim); });\n if (v.animation !== undefined) {\n if (v.animation < -1 || v.animation >= v.animations.length) { console.error(`Invalid tree animations ${v.animations}, ${this.stringify(v)}.`); }\n }\n }\n }\n\n /**\n * 将对象转成 JSON 字符串,需要忽略函数和渲染相关的对象\n * @param object - 目标对象\n * @returns\n */\n static stringify (object: any) {\n const simpleObject: { [k: string]: any } = {};\n\n for (const prop in object) {\n // if (typeof(object[prop]) == 'object'){\n // continue;\n // }\n if (prop === 'internal') {\n // 与WebGL相关的数据,可以忽略\n continue;\n }\n if (typeof (object[prop]) == 'function') {\n continue;\n }\n if (object[prop] instanceof Texture) {\n simpleObject[prop] = object[prop].name;\n continue;\n }\n if (object[prop] instanceof Geometry) {\n simpleObject[prop] = object[prop].name;\n continue;\n }\n if (object[prop] instanceof Renderer) {\n continue;\n }\n simpleObject[prop] = object[prop];\n }\n\n return JSON.stringify(simpleObject);\n }\n\n /**\n * 获取 2 的 index 指数结果\n * @param index - 指数\n * @returns\n */\n static pow2 (index: number): number {\n let res = 1;\n\n while (index-- > 0) { res *= 2; }\n\n return res;\n }\n}\n\n/**\n * 半精度浮点数组类\n */\nexport class Float16ArrayWrapper {\n /**\n * 大小\n */\n size: number;\n /**\n * 数组\n */\n data: Uint16Array;\n\n constructor (size: number) {\n this.size = size;\n this.data = new Uint16Array(size);\n }\n\n /**\n * 将类数值数组转成半进度浮点,并从起始索引开始添加\n * @param number - 类数值数组\n * @param startIndex - 起始索引\n */\n set (number: ArrayLike<number>, startIndex: number) {\n for (let i = 0; i < number.length; i++) {\n this.data[i + startIndex] = toHalf(number[i]);\n }\n }\n\n /**\n * 获取数组字节数\n */\n get bytes () {\n return this.size * 2;\n }\n}\n\nconst toHalf = (function () {\n\n const floatView = new Float32Array(1);\n const int32View = new Int32Array(floatView.buffer);\n\n /* This method is faster than the OpenEXR implementation (very often\n * used, eg. in Ogre), with the additional benefit of rounding, inspired\n * by James Tursa?s half-precision code. */\n return function toHalf (val: any) {\n\n floatView[0] = val;\n const x = int32View[0];\n\n let bits = (x >> 16) & 0x8000; /* Get the sign */\n let m = (x >> 12) & 0x07ff; /* Keep one extra bit for rounding */\n const e = (x >> 23) & 0xff; /* Using int is faster here */\n\n /* If zero, or denormal, or exponent underflows too much for a denormal\n * half, return signed zero. */\n if (e < 103) {\n return bits;\n }\n\n /* If NaN, return NaN. If Inf or exponent overflow, return Inf. */\n if (e > 142) {\n bits |= 0x7c00;\n /* If exponent was 0xff and one mantissa bit was set, it means NaN,\n * not Inf, so make sure we set one mantissa bit too. */\n bits |= ((e == 255) ? 0 : 1) && (x & 0x007fffff);\n\n return bits;\n }\n\n /* If exponent underflows but not too much, return a denormal */\n if (e < 113) {\n m |= 0x0800;\n /* Extra rounding may overflow and set mantissa to 0 and exponent\n * to 1, which is OK. */\n bits |= (m >> (114 - e)) + ((m >> (113 - e)) & 1);\n\n return bits;\n }\n\n bits |= ((e - 112) << 10) | (m >> 1);\n /* Extra rounding. An overflow will set mantissa to 0 and increment\n * the exponent, which is OK. */\n bits += m & 1;\n\n return bits;\n };\n\n}());\n\n","import type { Geometry, Engine, VFXItem, SkinProps } from '@galacean/effects';\nimport { glContext, Texture, TextureSourceType } from '@galacean/effects';\nimport { Matrix4 } from './math';\nimport { PObjectType } from './common';\nimport { PObject } from './object';\nimport { Float16ArrayWrapper } from '../utility/plugin-helper';\n\nconst forceTextureSkinning = false;\n\n/**\n * 纹理数据模式,包含浮点和半精度浮点\n */\nexport enum TextureDataMode {\n none = 0,\n float,\n half_float,\n}\n\n/**\n * 蒙皮类,支持蒙皮动画\n */\nexport class PSkin extends PObject {\n /**\n * 场景树父元素\n */\n rootBoneItem?: VFXItem;\n /**\n * 骨骼索引\n */\n skeleton = 0;\n /**\n * 关节索引\n */\n jointItem: VFXItem[] = [];\n /**\n * 逆绑定矩阵\n */\n inverseBindMatrices: Matrix4[] = [];\n /**\n * 动画矩阵\n */\n animationMatrices: Matrix4[] = [];\n /**\n * 纹理数据模式\n */\n textureDataMode = TextureDataMode.none;\n /**\n * 最大骨骼数目\n */\n maxJointCount = 0;\n\n /**\n * 创建蒙皮对象\n * @param props - 蒙皮相关数据\n * @param engine - 引擎对象\n * @param rootBoneItem - 场景树父元素\n */\n create (props: SkinProps, engine: Engine, rootBoneItem: VFXItem, maxJointCount: number) {\n this.name = props.rootBoneName ?? 'Unnamed skin';\n this.type = PObjectType.skin;\n //\n this.rootBoneItem = rootBoneItem;\n this.skeleton = -1;\n this.jointItem = this.getJointItems(props, rootBoneItem);\n this.maxJointCount = Math.max(maxJointCount, this.jointItem.length);\n this.animationMatrices = [];\n //\n this.inverseBindMatrices = [];\n //\n this.textureDataMode = this.getTextureDataMode(this.maxJointCount, engine);\n const matList = props.inverseBindMatrices;\n\n if (matList !== undefined && matList.length > 0) {\n if (matList.length % 16 !== 0 || matList.length !== this.jointItem.length * 16) {\n throw new Error(`Invalid array length, invert bind matrices ${matList.length}, joint array ${this.jointItem.length}.`);\n }\n\n const matrixCount = matList.length / 16;\n\n for (let i = 0; i < matrixCount; i++) {\n const mat = Matrix4.fromArray(matList, i * 16);\n\n this.inverseBindMatrices.push(mat);\n }\n }\n }\n\n /**\n * 更新蒙皮矩阵\n */\n updateSkinMatrices () {\n this.animationMatrices = [];\n\n for (let i = 0; i < this.jointItem.length; i++) {\n const node = this.jointItem[i];\n\n // let parent = node?.transform.parentTransform;\n // while(parent !== undefined){\n // const pos = parent.position;\n // parent.setPosition(pos[0], pos[1], pos[2]);\n // parent = parent.parentTransform;\n // }\n\n const mat4 = node.transform.getWorldMatrix();\n\n this.animationMatrices.push(mat4.clone());\n }\n\n if (this.animationMatrices.length === this.inverseBindMatrices.length) {\n this.animationMatrices.forEach((mat, index) => {\n mat.multiply(this.inverseBindMatrices[index]);\n });\n } else {\n this.animationMatrices = this.inverseBindMatrices;\n console.error('Some error occured, replace skin animation matrices by invert bind matrices.');\n }\n }\n\n /**\n * 计算 Mesh 的动画矩阵\n * @param worldMatrix - 世界矩阵\n * @param matrixList - 矩阵列表\n * @param normalMatList - 法线矩阵列表\n */\n computeMeshAnimMatrices (worldMatrix: Matrix4, matrixList: Float32Array, normalMatList: Float32Array) {\n const inverseWorldMatrix = worldMatrix.clone().invert();\n const tempMatrix = new Matrix4();\n\n this.animationMatrices.forEach((mat, i) => {\n const localMatrix = tempMatrix.multiplyMatrices(inverseWorldMatrix, mat);\n\n localMatrix.elements.forEach((x, j) => matrixList[i * 16 + j] = x);\n //\n const normalMat = localMatrix.clone().invert().transpose();\n\n normalMat.elements.forEach((x, j) => normalMatList[i * 16 + j] = x);\n });\n }\n\n /**\n * 更新父元素\n * @param parentItem - 场景树父元素\n */\n updateParentItem (parentItem: VFXItem) {\n this.rootBoneItem = parentItem;\n }\n\n /**\n * 获取关节点数\n * @returns\n */\n getJointCount (): number {\n return this.jointItem.length;\n }\n\n /**\n * 是否纹理数据模式\n * @returns\n */\n isTextureDataMode (): boolean {\n return this.textureDataMode !== TextureDataMode.none;\n }\n\n /**\n * 销毁\n */\n override dispose (): void {\n this.rootBoneItem = undefined;\n this.jointItem = [];\n this.inverseBindMatrices = [];\n this.animationMatrices = [];\n }\n\n private getTextureDataMode (jointCount: number, engine: Engine): TextureDataMode {\n const uniformsRequiredForMostFeatures = 25;\n const detail = engine.gpuCapability.detail;\n const availableJointUniforms = detail.maxVertexUniforms - uniformsRequiredForMostFeatures;\n const uniformsRequiredPerJoint = 8;\n\n if (forceTextureSkinning || jointCount > Math.floor(availableJointUniforms / uniformsRequiredPerJoint)) {\n // 优先使用float,half_float在iOS 13.6上有精度问题\n if (detail.floatTexture) {\n return TextureDataMode.float;\n } else if (detail.halfFloatTexture) {\n return TextureDataMode.half_float;\n } else {\n throw new Error(`Too many joint count ${jointCount}, half float texture not support.`);\n }\n } else {\n return TextureDataMode.none;\n }\n }\n\n private getJointItems (props: SkinProps, rootBoneItem: VFXItem) {\n const name2Item = this.genNodeName(rootBoneItem);\n\n const jointItems: VFXItem[] = [];\n\n props.boneNames?.forEach(boneName => {\n const node = name2Item[boneName];\n\n if (!node) {\n throw new Error(`Can't find node of bone name ${boneName}.`);\n }\n jointItems.push(node);\n });\n\n return jointItems;\n }\n\n private genNodeName (node: VFXItem) {\n const name2Item: Record<string, VFXItem> = {};\n const nameList: string[] = [];\n\n name2Item[''] = node;\n for (const child of node.children) {\n this.genNodeNameDFS(child, nameList, name2Item);\n }\n\n return name2Item;\n }\n\n private genNodeNameDFS (node: VFXItem, nameList: string[], name2Item: Record<string, VFXItem>) {\n nameList.push(node.name);\n name2Item[nameList.join('/')] = node;\n for (const child of node.children) {\n this.genNodeNameDFS(child, nameList, name2Item);\n }\n nameList.pop();\n }\n}\n\n/**\n * Morph 动画类\n * 保存了动画状态相关的数据,包括 weights 数组数据\n * 增加了状态数据的检查,保证数据的正确性\n * Morph 动画非常消耗内存,谨慎使用。\n */\nexport class PMorph extends PObject {\n /**\n * weights 数组的长度,shader 中和更新的时候会用到\n * 范围要在 `[0, 8]` 之间,否则会报错。\n */\n morphWeightsLength = 0;\n /**\n * weights 数组的具体数据,来自动画控制器的每帧更新\n * 数组的长度必须和 morphWeightsLength 相同,否则会出错。\n */\n morphWeightsArray: number[] = [];\n /**\n * 是否有 Position 相关的 Morph 动画,shader 中需要知道\n */\n hasPositionMorph = false;\n /**\n * 是否有 Normal 相关的 Morph 动画,shader 中需要知道\n */\n hasNormalMorph = false;\n /**\n * 是否有 Tangent 相关的 Morph 动画,shader 中需要知道\n */\n hasTangentMorph = false;\n\n /**\n * 通过 Geometry 数据创建 Morph 动画相关状态,并进行必要的正确性检查\n * @param geometry - Mesh 的几何体,是否包含 Morph 动画都是可以的\n * @returns 是否创建成功\n */\n create (geometry: Geometry): boolean {\n this.name = this.genName('Morph target');\n this.type = PObjectType.morph;\n\n // 统计各个属性的在Morph中的数目\n const positionCount = this.getAttributeMorphCount(PMorph.positionNameList, geometry);\n const normalCount = this.getAttributeMorphCount(PMorph.normalNameList, geometry);\n const tangentCount = this.getAttributeMorphCount(PMorph.tangentNameList, geometry);\n const countList: number[] = [positionCount, normalCount, tangentCount];\n\n // 这里是拿到所有数目中非零的最小值,如果没有非零值,那就是直接是零\n this.morphWeightsLength = 0;\n countList.forEach(count => {\n if (count > 0) {\n if (this.morphWeightsLength === 0) {\n this.morphWeightsLength = count;\n } else {\n this.morphWeightsLength = Math.min(this.morphWeightsLength, count);\n }\n }\n });\n\n if (this.morphWeightsLength > 0) {\n // 有Morph动画,申请weights数据,判断各个属性是否有相关动画\n this.morphWeightsArray = Array(this.morphWeightsLength).fill(0);\n this.hasPositionMorph = positionCount == this.morphWeightsLength;\n this.hasNormalMorph = normalCount == this.morphWeightsLength;\n this.hasTangentMorph = tangentCount == this.morphWeightsLength;\n }\n\n /**\n * 这里是做正确性检查,特别是各个属性之间数目需要对上,否则就报错。\n * 还要注意最大数目不能超过5,否则也直接报错。\n * 后续考虑是否做个兼容,目前还是严格报错比较好。\n */\n\n if (positionCount > 0 && positionCount != this.morphWeightsLength) {\n console.error(`Position morph count mismatch: ${this.morphWeightsLength}, ${positionCount}.`);\n\n return false;\n }\n\n if (normalCount > 0 && normalCount != this.morphWeightsLength) {\n console.error(`Normal morph count mismatch: ${this.morphWeightsLength}, ${normalCount}.`);\n\n return false;\n }\n\n if (tangentCount > 0 && tangentCount != this.morphWeightsLength) {\n console.error(`Tangent morph count mismatch: ${this.morphWeightsLength}, ${tangentCount}.`);\n\n return false;\n }\n\n if (this.morphWeightsLength > 5) {\n console.error(`Tangent morph count should not greater than 5, current ${this.morphWeightsLength}.`);\n\n return false;\n }\n\n return true;\n }\n\n /**\n * 初始化 Morph target 的权重数组\n * @param weights - glTF Mesh 的权重数组,长度必须严格一致\n */\n initWeights (weights: number[]) {\n if (this.morphWeightsArray.length === 0) {\n return;\n }\n\n const morphWeights = this.morphWeightsArray;\n\n weights.forEach((val, index) => {\n if (index < morphWeights.length) {\n morphWeights[index] = val;\n }\n });\n }\n\n updateWeights (weights: number[]) {\n if (weights.length != this.morphWeightsArray.length) {\n console.error(`Length of morph weights mismatch: input ${weights.length}, internel ${this.morphWeightsArray.length}.`);\n\n return;\n }\n\n weights.forEach((value, index) => this.morphWeightsArray[index] = value);\n }\n\n /**\n * 当前状态是否有 Morph 动画:\n * 需要判断 weights 数组长度,以及 Position、Normal 和 Tangent 是否有动画\n * @returns 返回是否有 Morph 动画\n */\n hasMorph (): boolean {\n return this.morphWeightsLength > 0 && (this.hasPositionMorph || this.hasNormalMorph || this.hasTangentMorph);\n }\n\n /**\n * 两个 Morph 动画状态是否相等:\n * 这里只比较初始状态是否一样,不考虑 weights 数组的情况,提供给 Mesh 进行 Geometry 检查使用\n * @param morph - Morph 动画状态对象\n * @returns 返回两个 Morph 动画状态是否相等\n */\n equals (morph: PMorph): boolean {\n return this.morphWeightsLength === morph.morphWeightsLength\n && this.hasPositionMorph === morph.hasPositionMorph\n && this.hasNormalMorph === morph.hasNormalMorph\n && this.hasTangentMorph === morph.hasTangentMorph;\n }\n\n getMorphWeightsArray (): number[] {\n return this.morphWeightsArray;\n }\n\n /**\n * 统计 Geometry 中 Attribute 名称个数:\n * 主要用于统计 Morph 动画中新增的 Attribute 名称的个数,会作为最终的 weights 数组长度使用\n * @param attributeNameList - Attribute 名数组列表,只与 Morph Target 中的属性有关\n * @param geometry - Geometry 对象,是否有 Morph 动画都可以\n * @returns 存在的 Attribute 名称数目\n */\n getAttributeMorphCount (attributeNameList: string[], geometry: Geometry): number {\n for (let i = 0; i < attributeNameList.length; i++) {\n const val = attributeNameList[i];\n\n if (geometry.getAttributeData(val) === undefined) {\n return i;\n }\n }\n\n // 所有名称都找到了,所以要返回数组的长度\n return attributeNameList.length;\n }\n\n /**\n * Morph 动画中 Position 相关的 Attribute 名称\n */\n private static positionNameList = [\n 'aTargetPosition0',\n 'aTargetPosition1',\n 'aTargetPosition2',\n 'aTargetPosition3',\n 'aTargetPosition4',\n 'aTargetPosition5',\n 'aTargetPosition6',\n 'aTargetPosition7',\n ];\n\n /**\n * Morph 动画中 Normal 相关的 Attribute 名称\n */\n private static normalNameList = [\n 'aTargetNormal0',\n 'aTargetNormal1',\n 'aTargetNormal2',\n 'aTargetNormal3',\n 'aTargetNormal4',\n 'aTargetNormal5',\n 'aTargetNormal6',\n 'aTargetNormal7',\n ];\n\n /**\n * Morph 动画中 Tangent 相关的 Attribute 名称\n */\n private static tangentNameList = [\n 'aTargetTangent0',\n 'aTargetTangent1',\n 'aTargetTangent2',\n 'aTargetTangent3',\n 'aTargetTangent4',\n 'aTargetTangent5',\n 'aTargetTangent6',\n 'aTargetTangent7',\n ];\n}\n\n/**\n * 动画插值类型\n */\nexport enum PAnimInterpType {\n linear = 0,\n step,\n cubicSpline,\n}\n\n/**\n * 动画路径类型\n */\nexport enum PAnimPathType {\n translation = 0,\n rotation,\n scale,\n weights,\n}\n\n/**\n * 动画纹理类\n */\nexport class PAnimTexture {\n private isHalfFloat = true;\n //\n private width = 0;\n private height = 0;\n private buffer?: Float16ArrayWrapper;\n private texture?: Texture;\n\n constructor (private engine: Engine) {}\n\n /**\n * 创建动画纹理对象\n * @param jointCount - 骨骼数目\n * @param isHalfFloat - 是否半浮点精度\n * @param name - 名称\n */\n create (jointCount: number, isHalfFloat: boolean, name: string) {\n this.width = 4;\n this.height = jointCount;\n this.isHalfFloat = isHalfFloat;\n\n if (this.isHalfFloat) {\n this.buffer = new Float16ArrayWrapper(this.getSize() * 4);\n }\n\n const data = this.buffer?.data ?? new Float32Array(this.getSize() * 4);\n const type = this.isHalfFloat ? glContext.HALF_FLOAT : glContext.FLOAT;\n\n this.texture = Texture.create(\n this.engine,\n {\n name,\n data: {\n width: this.width,\n height: this.height,\n data,\n },\n target: glContext.TEXTURE_2D,\n format: glContext.RGBA,\n type,\n wrapS: glContext.CLAMP_TO_EDGE,\n wrapT: glContext.CLAMP_TO_EDGE,\n minFilter: glContext.NEAREST,\n magFilter: glContext.NEAREST,\n });\n }\n\n /**\n * 更新动画数据\n * @param buffer - 新的动画数据\n */\n update (buffer: Float32Array) {\n if (this.buffer !== undefined) {\n this.buffer.set(buffer, 0);\n }\n\n if (this.texture !== undefined) {\n this.texture.updateSource({\n sourceType: TextureSourceType.data,\n data: {\n width: this.width,\n height: this.height,\n data: this.buffer?.data ?? buffer,\n },\n target: glContext.TEXTURE_2D,\n });\n }\n\n }\n\n /**\n * 销毁\n */\n dispose () {\n // @ts-expect-error\n this.engine = null;\n this.buffer = undefined;\n this.texture?.dispose();\n }\n\n /**\n * 获取纹理大小\n * @returns\n */\n getSize () {\n return this.width * this.height;\n }\n\n /**\n * 获取纹理对象\n * @returns\n */\n getTexture () {\n return this.texture as Texture;\n }\n\n}\n","import { PMaterialType } from './common';\nimport type { PMaterialBase } from './material';\nimport * as Helper from '../utility/shader-helper';\n\n/**\n * 着色器上下文\n */\nexport interface PShaderContext {\n /**\n * 材质\n */\n material: PMaterialBase,\n /**\n * 是否 WebGL2\n */\n isWebGL2: boolean,\n /**\n * 特性列表\n */\n featureList: string[],\n}\n\n/**\n * 着色器返回的代码结果\n */\nexport interface PShaderResults {\n /**\n * 顶点着色器代码\n */\n vertexShaderCode: string,\n /**\n * 片段着色器代码\n */\n fragmentShaderCode: string,\n}\n\ntype ShaderCodeFuncType = (context: PShaderContext) => PShaderResults;\n\n/**\n * 着色器管理类\n */\nexport class PShaderManager {\n private funcMap: Map<PMaterialType, ShaderCodeFuncType>;\n private static _instance: PShaderManager;\n\n /**\n * 获取着色器单例对象\n * @returns\n */\n static getInstance (): PShaderManager {\n // Do you need arguments? Make it a regular static method instead.\n return this._instance || (this._instance = new this());\n }\n\n private constructor () {\n this.funcMap = new Map();\n this.funcMap.set(PMaterialType.unlit, Helper.getPBRPassShaderCode);\n this.funcMap.set(PMaterialType.pbr, Helper.getPBRPassShaderCode);\n this.funcMap.set(PMaterialType.shadowBase, Helper.getShadowPassShaderCode);\n this.funcMap.set(PMaterialType.shadowFilter, Helper.getGaussianBlurShaderCodeV2);\n this.funcMap.set(PMaterialType.normalVis, Helper.getNormalVisShaderCode);\n this.funcMap.set(PMaterialType.simpleFilter, Helper.getSimpleFilterShaderCode);\n this.funcMap.set(PMaterialType.skyboxFilter, Helper.getSkyBoxShaderCode);\n }\n\n /**\n * 生成着色器代码\n * @param context - 着色器上下文\n * @returns\n */\n genShaderCode (context: PShaderContext): PShaderResults {\n const materialType = context.material.materialType;\n const func = this.funcMap.get(materialType);\n\n if (func !== undefined) {\n return func(context);\n } else {\n throw new Error(`Invalid material type ${materialType}, shader content ${context}.`);\n }\n }\n}\n","import type { Texture, Material } from '@galacean/effects';\nimport { spec, glContext } from '@galacean/effects';\nimport type { MacroInfo } from '../index';\nimport type { Matrix3 } from './math';\nimport { Vector3, Vector4, Color } from './math';\nimport { PObjectType, PMaterialType, PGlobalState, PBRShaderGUID } from './common';\nimport { PObject } from './object';\nimport { PluginHelper } from '../utility/plugin-helper';\nimport { PShaderManager } from './shader';\n\n/**\n * 3D 材质基础类,支持公共的材质功能\n */\nexport abstract class PMaterialBase extends PObject {\n effectMaterial: Material;\n /**\n * 材质类型,主要是 pbr 和 unlit 两类\n */\n materialType: PMaterialType = PMaterialType.none;\n /**\n * 顶点着色器代码\n */\n vertexShaderCode = '';\n /**\n * 片段着色器代码\n */\n fragmentShaderCode = '';\n /**\n * 深度是否写入,默认是写入\n */\n ZWrite = true;\n /**\n * 是否深度测试提示,默认开启\n */\n ZTest = true;\n /**\n * 渲染类型,默认是不透明\n */\n renderType: spec.RenderType = spec.RenderType.Opaque;\n /**\n * 是否 Alpha 裁剪,默认关闭\n */\n alphaClip = false;\n /**\n * Alpha 测试截断值\n */\n alphaCutoff = 0.5;\n /**\n * 面侧模式,默认是正面\n */\n renderFace: spec.RenderFace = spec.RenderFace.Front;\n\n /**\n * 获取着色器特性列表,根据材质状态\n * @returns 特性列表\n */\n getShaderFeatures (): string[] {\n const featureList: string[] = [];\n\n if (this.isAlphaClip()) {\n featureList.push('ALPHAMODE_MASK 1');\n } else if (this.isOpaque()) {\n featureList.push('ALPHAMODE_OPAQUE 1');\n }\n\n if (this.renderFace === spec.RenderFace.Both) {\n featureList.push('DOUBLE_SIDED 1');\n }\n\n return featureList;\n }\n\n getShaderMacros (): MacroInfo[] {\n const macroList: MacroInfo[] = [];\n\n if (this.isAlphaClip()) {\n macroList.push({ name: 'ALPHAMODE_MASK' });\n } else if (this.isOpaque()) {\n macroList.push({ name: 'ALPHAMODE_OPAQUE' });\n }\n\n if (this.renderFace === spec.RenderFace.Both) {\n macroList.push({ name: 'DOUBLE_SIDED' });\n }\n\n return macroList;\n }\n\n /**\n * 根据材质状态,更新 GE 材质状态\n * @param material - GE 材质\n */\n updateUniforms (material: Material) {\n // 渲染 UV 结果输出时,设置 uv 大小\n const renderMode = PGlobalState.getInstance().renderMode3D;\n\n if (renderMode === spec.RenderMode3D.uv) {\n const debugUVGridSize = PGlobalState.getInstance().renderMode3DUVGridSize;\n\n material.setFloat('_DebugUVGridSize', debugUVGridSize);\n }\n }\n\n /**\n * 生成顶点和片段着色器代码\n * 先获取着色器特性,再根据材质和全局状态,生成着色器代码\n * @param inFeatureList - 外部特性列表\n */\n build (inFeatureList?: string[]) {\n const finalFeatureList = this.getFeatureList(inFeatureList);\n const isWebGL2 = PGlobalState.getInstance().isWebGL2;\n //\n const shaderManager = PShaderManager.getInstance();\n const shaderResult = shaderManager.genShaderCode({\n material: this,\n isWebGL2,\n featureList: finalFeatureList,\n });\n\n this.vertexShaderCode = shaderResult.vertexShaderCode;\n this.fragmentShaderCode = shaderResult.fragmentShaderCode;\n }\n\n getFeatureList (inFeatureList?: string[]) {\n const finalFeatureList = this.getShaderFeatures();\n\n if (inFeatureList !== undefined) {\n finalFeatureList.push(...inFeatureList);\n }\n\n // 目前只有 PRB 和 Unlit 是需要 EDITOR_TRANSFORM,适配编辑器的视口 Offset\n // 阴影 Pass 的渲染是不需要,所以这里特殊处理下\n if (this.materialType !== PMaterialType.shadowBase) {\n const isEditorEvn = PGlobalState.getInstance().isEditorEnv;\n\n if (isEditorEvn) {\n finalFeatureList.push('EDITOR_TRANSFORM');\n }\n }\n\n return finalFeatureList;\n }\n\n getMacroList (inMacroList?: MacroInfo[]) {\n const finalMacroList = this.getShaderMacros();\n\n if (inMacroList !== undefined) {\n finalMacroList.push(...inMacroList);\n }\n\n // 目前只有 PRB 和 Unlit 是需要 EDITOR_TRANSFORM,适配编辑器的视口 Offset\n // 阴影 Pass 的渲染是不需要,所以这里特殊处理下\n if (this.materialType !== PMaterialType.shadowBase) {\n const isEditorEvn = PGlobalState.getInstance().isEditorEnv;\n\n if (isEditorEvn) {\n finalMacroList.push({ name: 'EDITOR_TRANSFORM' });\n }\n }\n\n return finalMacroList;\n }\n\n /**\n * 设置材质状态,根据 GE 材质状态\n * @param material - GE 材质\n */\n setMaterialStates (material: Material) {\n if (this.renderType === spec.RenderType.Transparent) {\n material.blending = true;\n material.depthTest = this.ZTest;\n material.depthMask = this.ZWrite;\n material.blendEquation = [glContext.FUNC_ADD, glContext.FUNC_ADD];\n material.blendFunction = [\n glContext.ONE, glContext.ONE_MINUS_SRC_ALPHA,\n glContext.ONE, glContext.ONE_MINUS_SRC_ALPHA,\n ];\n } else {\n if (PGlobalState.getInstance().isTiny3dMode) {\n material.blending = false;\n material.depthTest = true;\n // Tiny兼容模式下不透明的深度写入始终开\n material.depthMask = true;\n } else {\n material.blending = false;\n material.depthTest = this.ZTest;\n material.depthMask = this.ZWrite;\n }\n }\n\n this.setFaceSideStates(material);\n }\n\n protected setFaceSideStates (material: Material) {\n if (this.isBothSide()) {\n material.culling = false;\n } else if (this.isBackSide()) {\n material.cullFace = glContext.FRONT;\n material.frontFace = glContext.CCW;\n material.culling = true;\n } else {\n material.cullFace = glContext.BACK;\n material.frontFace = glContext.CCW;\n material.culling = true;\n }\n }\n\n /**\n * 销毁材质,清除着色器代码\n */\n override dispose () {\n this.vertexShaderCode = '';\n this.fragmentShaderCode = '';\n }\n\n /**\n * 是否合法,材质类型非 none\n * @returns\n */\n override isValid (): boolean {\n return this.materialType !== PMaterialType.none && super.isValid();\n }\n\n /**\n * 是否不透明\n * @returns\n */\n isOpaque (): boolean {\n return this.renderType === spec.RenderType.Opaque;\n }\n\n /**\n * 是否 Alpha 裁剪\n * @returns\n */\n isAlphaClip (): boolean {\n return this.alphaClip;\n }\n\n /**\n * 是否半透明\n * @returns\n */\n isTransparent (): boolean {\n return this.renderType === spec.RenderType.Transparent;\n }\n\n /**\n * 是否正面模式\n * @returns\n */\n isFrontSide (): boolean {\n return this.renderFace === spec.RenderFace.Front;\n }\n\n /**\n * 是否背面模式\n * @returns\n */\n isBackSide (): boolean {\n return this.renderFace === spec.RenderFace.Back;\n }\n\n /**\n * 是否双面模式\n * @returns\n */\n isBothSide (): boolean {\n return this.renderFace === spec.RenderFace.Both;\n }\n}\n\n/**\n * 无光照材质类,负责无关照或者不接受光照情况下的物体材质效果\n */\nexport class PMaterialUnlit extends PMaterialBase {\n /**\n * 基础颜色纹理\n */\n baseColorTexture?: Texture;\n /**\n * 基础颜色纹理变换\n */\n baseColorTextureTrans: Matrix3;\n /**\n * 基础颜色值,默认是白色 Color(1, 1, 1, 1)\n */\n baseColorFactor: Color = new Color(1, 1, 1, 1);\n\n /**\n * 创建无光照材质,支持基础颜色纹理\n * @param material - effect 材质对象\n */\n create (material: Material) {\n this.effectMaterial = material;\n this.name = material.name;\n this.type = PObjectType.material;\n this.materialType = PMaterialType.unlit;\n //\n this.baseColorTexture = material.getTexture('_BaseColorSampler') ?? undefined;\n this.baseColorTextureTrans = PluginHelper.createUVTransform(material, '_BaseColorSampler_ST', '_BaseColorRotation');\n this.baseColorFactor = material.getColor('_BaseColorFactor') ?? new Color(1.0, 1.0, 1.0, 1.0);\n //\n this.ZWrite = material.getFloat('ZWrite') !== 0;\n this.ZTest = material.getFloat('ZTest') !== 0;\n this.renderType = material.stringTags['RenderType'] as spec.RenderType ?? spec.RenderType.Opaque;\n this.alphaClip = material.getFloat('AlphaClip') === 1;\n this.alphaCutoff = material.getFloat('_AlphaCutoff') ?? 0;\n this.renderFace = material.stringTags['RenderFace'] as spec.RenderFace ?? spec.RenderFace.Front;\n }\n\n /**\n * 销毁材质\n */\n override dispose () {\n super.dispose();\n this.baseColorTexture = undefined;\n }\n\n /**\n * 获取着色器特性列表,根据材质状态\n * @returns 着色器特性列表\n */\n override getShaderFeatures (): string[] {\n const featureList = super.getShaderFeatures();\n\n featureList.push('MATERIAL_METALLICROUGHNESS 1');\n if (this.hasBaseColorTexture()) {\n featureList.push('HAS_BASE_COLOR_MAP 1');\n }\n\n featureList.push('MATERIAL_UNLIT 1');\n\n return featureList;\n }\n\n override getShaderMacros (): MacroInfo[] {\n const macroList = super.getShaderMacros();\n\n macroList.push({ name: 'MATERIAL_METALLICROUGHNESS' });\n if (this.hasBaseColorTexture()) {\n macroList.push({ name: 'HAS_BASE_COLOR_MAP' });\n }\n\n macroList.push({ name: 'MATERIAL_UNLIT' });\n\n return macroList;\n }\n\n /**\n * 更新对应的 GE 材质中着色器的 Uniform 数据\n * @param material - GE 材质\n */\n override updateUniforms (material: Material) {\n super.updateUniforms(material);\n\n if (this.baseColorTexture !== undefined) {\n material.setInt('_BaseColorUVSet', 0);\n material.setMatrix3('_BaseColorUVTransform', this.baseColorTextureTrans);\n }\n\n material.setFloat('_MetallicFactor', 0);\n material.setFloat('_RoughnessFactor', 0);\n\n material.setFloat('_Exposure', 1.0);\n }\n\n /**\n * 是否有基础颜色纹理\n * @returns\n */\n hasBaseColorTexture (): boolean {\n return this.baseColorTexture !== undefined;\n }\n\n /**\n * 获取基础颜色纹理\n * @returns\n */\n getBaseColorTexture (): Texture {\n return this.baseColorTexture as Texture;\n }\n\n /**\n * 设置基础颜色纹理\n * @param val - 纹理对象\n */\n setBaseColorTexture (val: Texture) {\n this.baseColorTexture = val;\n }\n\n /**\n * 获取基础颜色纹理\n * @returns\n */\n getBaseColorFactor (): Color {\n return this.baseColorFactor;\n }\n\n /**\n * 设置基础颜色值\n * @param val - 颜色值\n */\n setBaseColorFactor (val: Color | Vector4 | spec.vec4) {\n if (val instanceof Color) {\n // for Color\n this.baseColorFactor.set(val.r, val.g, val.b, val.a);\n } else if (val instanceof Vector4) {\n // for Vector4\n this.baseColorFactor.set(val.x, val.y, val.z, val.w);\n } else {\n // for vec4\n this.baseColorFactor.set(val[0], val[1], val[2], val[3]);\n }\n }\n}\n\n/**\n * PBR 材质类,负责基于物理的材质效果,也是渲染中最常用的材质。\n * 目前支持金属度/粗糙度工作流,与其他引擎中的 PBR 材质功能一致。\n */\nexport class PMaterialPBR extends PMaterialBase {\n /**\n * 基础颜色纹理\n */\n baseColorTexture?: Texture;\n /**\n * 基础颜色纹理变换\n */\n baseColorTextureTrans: Matrix3;\n /**\n * 基础颜色值,默认是白色 Color(1, 1, 1, 1)\n */\n baseColorFactor: Color = new Color(1, 1, 1, 1);\n /**\n * 金属度粗超度纹理\n */\n metallicRoughnessTexture?: Texture;\n /**\n * 金属度粗超度纹理变换\n */\n metallicRoughnessTextureTrans: Matrix3;\n /**\n * 是否高光抗锯齿,能够明显提升高光表现效果\n */\n useSpecularAA = false;\n /**\n * 金属度值\n */\n metallicFactor = 0;\n /**\n * 粗超度值\n */\n roughnessFactor = 1;\n /**\n * 法线纹理\n */\n normalTexture?: Texture;\n /**\n * 法线纹理变换\n */\n normalTextureTrans: Matrix3;\n /**\n * 法线纹理缩放\n */\n normalTextureScale = 1;\n /**\n * AO 纹理\n */\n occlusionTexture?: Texture;\n /**\n * AO 纹理变换\n */\n occlusionTextureTrans: Matrix3;\n /**\n * AO 纹理强度\n */\n occlusionTextureStrength = 1;\n /**\n * 自发光纹理\n */\n emissiveTexture?: Texture;\n /**\n * 自发光纹理变换\n */\n emissiveTextureTrans: Matrix3;\n /**\n * 自发光颜色值,默认是黑色 Vector4(0, 0, 0, 0)\n */\n emissiveFactor: Color = new Color(0, 0, 0, 0);\n /**\n * 自发光强度\n */\n emissiveIntensity = 1;\n\n /**\n * 创建材质\n * @param material - effect 材质对象\n */\n create (material: Material) {\n this.effectMaterial = material;\n this.name = material.name;\n this.type = PObjectType.material;\n this.materialType = PMaterialType.pbr;\n //\n this.baseColorTexture = material.getTexture('_BaseColorSampler') ?? undefined;\n this.baseColorTextureTrans = PluginHelper.createUVTransform(material, '_BaseColorSampler_ST', '_BaseColorRotation');\n this.baseColorFactor = material.getColor('_BaseColorFactor') ?? new Color(1.0, 1.0, 1.0, 1.0);\n //\n this.metallicRoughnessTexture = material.getTexture('_MetallicRoughnessSampler') ?? undefined;\n this.metallicRoughnessTextureTrans = PluginHelper.createUVTransform(material, '_MetallicRoughnessSampler_ST', '_MetallicRoughnessRotation');\n this.useSpecularAA = material.getFloat('_SpecularAA') === 1;\n this.metallicFactor = material.getFloat('_MetallicFactor') ?? 1;\n this.roughnessFactor = material.getFloat('_RoughnessFactor') ?? 0;\n //\n this.normalTexture = material.getTexture('_NormalSampler') ?? undefined;\n this.normalTextureTrans = PluginHelper.createUVTransform(material, '_NormalSampler_ST', '_NormalRotation');\n this.normalTextureScale = material.getFloat('_NormalScale') ?? 1;\n //\n this.occlusionTexture = material.getTexture('_OcclusionSampler') ?? undefined;\n this.occlusionTextureTrans = PluginHelper.createUVTransform(material, '_OcclusionSampler_ST', '_OcclusionRotation');\n this.occlusionTextureStrength = material.getFloat('_OcclusionStrength') ?? 1;\n //\n this.emissiveTexture = material.getTexture('_EmissiveSampler') ?? undefined;\n this.emissiveTextureTrans = PluginHelper.createUVTransform(material, '_EmissiveSampler_ST', '_EmissiveRotation');\n this.emissiveFactor = material.getColor('_EmissiveFactor') ?? new Color(0, 0, 0, 1);\n this.emissiveIntensity = material.getFloat('_EmissiveIntensity') ?? 1;\n //\n this.ZWrite = material.getFloat('ZWrite') !== 0;\n this.ZTest = material.getFloat('ZTest') !== 0;\n this.renderType = material.stringTags['RenderType'] as spec.RenderType ?? spec.RenderType.Opaque;\n this.alphaClip = material.getFloat('AlphaClip') === 1;\n this.alphaCutoff = material.getFloat('_AlphaCutoff') ?? 0;\n this.renderFace = material.stringTags['RenderFace'] as spec.RenderFace ?? spec.RenderFace.Front;\n }\n\n /**\n * 销毁材质\n */\n override dispose () {\n super.dispose();\n this.baseColorTexture = undefined;\n this.metallicRoughnessTexture = undefined;\n this.normalTexture = undefined;\n this.occlusionTexture = undefined;\n this.emissiveTexture = undefined;\n }\n\n /**\n * 获取材质特性列表\n * @returns 材质特性列表\n */\n override getShaderFeatures (): string[] {\n const featureList = super.getShaderFeatures();\n\n featureList.push('MATERIAL_METALLICROUGHNESS 1');\n if (this.hasBaseColorTexture()) {\n featureList.push('HAS_BASE_COLOR_MAP 1');\n if (this.baseColorTextureTrans !== undefined) {\n featureList.push('HAS_BASECOLOR_UV_TRANSFORM 1');\n }\n }\n if (this.hasMetallicRoughnessTexture()) {\n featureList.push('HAS_METALLIC_ROUGHNESS_MAP 1');\n if (this.metallicRoughnessTextureTrans !== undefined) {\n featureList.push('HAS_METALLICROUGHNESS_UV_TRANSFORM 1');\n }\n }\n if (this.useSpecularAA) {\n featureList.push('USE_SPECULAR_AA 1');\n }\n if (this.hasNormalTexture()) {\n featureList.push('HAS_NORMAL_MAP 1');\n if (this.normalTextureTrans !== undefined) {\n featureList.push('HAS_NORMAL_UV_TRANSFORM 1');\n }\n }\n if (this.hasOcclusionTexture()) {\n featureList.push('HAS_OCCLUSION_MAP 1');\n if (this.occlusionTextureTrans !== undefined) {\n featureList.push('HAS_OCCLUSION_UV_TRANSFORM 1');\n }\n }\n if (this.hasEmissiveTexture()) {\n featureList.push('HAS_EMISSIVE_MAP 1');\n if (this.emissiveTextureTrans !== undefined) {\n featureList.push('HAS_EMISSIVE_UV_TRANSFORM 1');\n }\n } else if (this.hasEmissiveValue()) {\n featureList.push('HAS_EMISSIVE 1');\n }\n\n return featureList;\n }\n\n override getShaderMacros (): MacroInfo[] {\n const macroList = super.getShaderMacros();\n\n macroList.push({ name: 'MATERIAL_METALLICROUGHNESS' });\n if (this.hasBaseColorTexture()) {\n macroList.push({ name: 'HAS_BASE_COLOR_MAP' });\n if (this.baseColorTextureTrans !== undefined) {\n macroList.push({ name: 'HAS_BASECOLOR_UV_TRANSFORM' });\n }\n }\n if (this.hasMetallicRoughnessTexture()) {\n macroList.push({ name: 'HAS_METALLIC_ROUGHNESS_MAP' });\n if (this.metallicRoughnessTextureTrans !== undefined) {\n macroList.push({ name: 'HAS_METALLICROUGHNESS_UV_TRANSFORM' });\n }\n }\n if (this.useSpecularAA) {\n macroList.push({ name: 'USE_SPECULAR_AA' });\n }\n if (this.hasNormalTexture()) {\n macroList.push({ name: 'HAS_NORMAL_MAP' });\n if (this.normalTextureTrans !== undefined) {\n macroList.push({ name: 'HAS_NORMAL_UV_TRANSFORM' });\n }\n }\n if (this.hasOcclusionTexture()) {\n macroList.push({ name: 'HAS_OCCLUSION_MAP' });\n if (this.occlusionTextureTrans !== undefined) {\n macroList.push({ name: 'HAS_OCCLUSION_UV_TRANSFORM' });\n }\n }\n if (this.hasEmissiveTexture()) {\n macroList.push({ name: 'HAS_EMISSIVE_MAP' });\n if (this.emissiveTextureTrans !== undefined) {\n macroList.push({ name: 'HAS_EMISSIVE_UV_TRANSFORM' });\n }\n } else if (this.hasEmissiveValue()) {\n macroList.push({ name: 'HAS_EMISSIVE' });\n }\n\n return macroList;\n }\n\n /**\n * 更新关联的 GE 材质中着色器的 Uniform 数据\n * @param material - GE 材质\n */\n override updateUniforms (material: Material) {\n super.updateUniforms(material);\n\n if (this.baseColorTexture !== undefined) {\n material.setInt('_BaseColorUVSet', 0);\n material.setMatrix3('_BaseColorUVTransform', this.baseColorTextureTrans);\n }\n //\n if (this.metallicRoughnessTexture !== undefined) {\n material.setInt('_MetallicRoughnessUVSet', 0);\n material.setMatrix3('_MetallicRoughnessUVTransform', this.metallicRoughnessTextureTrans);\n }\n //\n if (this.normalTexture !== undefined) {\n material.setInt('_NormalUVSet', 0);\n material.setMatrix3('_NormalUVTransform', this.normalTextureTrans);\n }\n //\n if (this.occlusionTexture !== undefined) {\n material.setInt('_OcclusionUVSet', 0);\n material.setMatrix3('_OcclusionUVTransform', this.occlusionTextureTrans);\n }\n //\n if (this.emissiveTexture !== undefined) {\n material.setInt('_EmissiveUVSet', 0);\n material.setMatrix3('_EmissiveUVTransform', this.emissiveTextureTrans);\n }\n\n material.setFloat('_Exposure', 3.0);\n }\n\n /**\n * 是否有基础颜色纹理\n * @returns\n */\n hasBaseColorTexture (): boolean {\n return this.baseColorTexture !== undefined;\n }\n\n /**\n * 设置基础颜色纹理\n * @param val - 纹理\n */\n setBaseColorTexture (val: Texture) {\n this.baseColorTexture = val;\n }\n\n /**\n * 获取基础颜色纹理\n * @returns\n */\n getBaseColorFactor (): Color {\n return this.baseColorFactor;\n }\n\n /**\n * 设置基础颜色值\n * @param val - 颜色值\n */\n setBaseColorFactor (val: Color | Vector4 | spec.vec4) {\n if (val instanceof Color) {\n // for Vector4\n this.baseColorFactor.set(val.r, val.g, val.b, val.a);\n } else if (val instanceof Vector4) {\n // for Vector4\n this.baseColorFactor.set(val.x, val.y, val.z, val.w);\n } else {\n // for vec4\n this.baseColorFactor.set(val[0], val[1], val[2], val[3]);\n }\n }\n\n /**\n * 是否有金属度粗超度纹理\n * @returns\n */\n hasMetallicRoughnessTexture (): boolean {\n return this.metallicRoughnessTexture !== undefined;\n }\n\n /**\n * 获取金属度粗超度纹理\n * @returns\n */\n getMetallicRoughnessTexture (): Texture {\n return this.metallicRoughnessTexture as Texture;\n }\n\n /**\n * 设置金属度粗超度纹理\n * @param val - 纹理\n */\n setMetallicRoughnessTexture (val: Texture) {\n this.metallicRoughnessTexture = val;\n }\n\n /**\n * 是否有法线纹理\n * @returns\n */\n hasNormalTexture (): boolean {\n return this.normalTexture !== undefined;\n }\n\n /**\n * 获取法线纹理\n * @returns\n */\n getNormalTexture (): Texture {\n return this.normalTexture as Texture;\n }\n\n /**\n * 设置法线纹理\n * @param val - 纹理\n */\n setNormalTexture (val: Texture) {\n this.normalTexture = val;\n }\n\n /**\n * 是否有遮挡纹理\n * @returns\n */\n hasOcclusionTexture (): boolean {\n return this.occlusionTexture !== undefined;\n }\n\n /**\n * 获取遮挡纹理\n * @returns\n */\n getOcclusionTexture (): Texture {\n return this.occlusionTexture as Texture;\n }\n\n /**\n * 设置遮挡纹理\n * @param val - 纹理\n */\n setOcclusionTexture (val: Texture) {\n this.occlusionTexture = val;\n }\n\n /**\n * 是否有自发光纹理\n * @returns\n */\n hasEmissiveTexture (): boolean {\n return this.emissiveTexture !== undefined;\n }\n\n /**\n * 获取自发光纹理\n * @returns\n */\n getEmissiveTexture (): Texture {\n return this.emissiveTexture as Texture;\n }\n\n /**\n * 设置自发光纹理\n * @param val - 纹理\n */\n setEmissiveTexture (val: Texture) {\n this.emissiveTexture = val;\n }\n\n /**\n * 是否有自发光值,包含强度\n * @returns\n */\n hasEmissiveValue (): boolean {\n return this.emissiveFactor.luminance() * this.emissiveIntensity > 0;\n }\n\n /**\n * 获取自发光颜色\n * @returns\n */\n getEmissiveFactor (): Color {\n return this.emissiveFactor;\n }\n\n /**\n * 设置自发光颜色\n * @param val - 颜色\n */\n setEmissiveFactor (val: Color | Vector3 | spec.vec3) {\n if (val instanceof Color) {\n // Color\n this.emissiveFactor.set(val.r, val.g, val.b, val.a);\n } else if (val instanceof Vector3) {\n // Vector3\n this.emissiveFactor.set(val.x, val.y, val.z, 0);\n } else {\n // vec3\n this.emissiveFactor.set(val[0], val[1], val[2], 0);\n }\n }\n\n /**\n * 获取自发光强度\n * @returns\n */\n getEmissiveIntensity (): number {\n return this.emissiveIntensity;\n }\n\n /**\n * 设置自发光强度\n * @param val - 强度\n */\n setEmissiveIntensity (val: number) {\n this.emissiveIntensity = val;\n }\n}\n\n/**\n * 材质类型,包括无光照材质和 PBR 材质\n */\nexport type PMaterial = PMaterialUnlit | PMaterialPBR;\n\n/**\n * 创建插件材质对象\n * @param material - Effects 材质对象\n * @returns 材质对象\n */\nexport function createPluginMaterial (material: Material): PMaterial {\n if (material.shader.getInstanceId() === PBRShaderGUID) {\n const materialPBR = new PMaterialPBR();\n\n materialPBR.create(material);\n\n return materialPBR;\n } else {\n const materialUnlit = new PMaterialUnlit();\n\n materialUnlit.create(material);\n\n return materialUnlit;\n }\n}\n","import type { Mesh, Material, TextureSourceOptions, Engine, Renderer } from '@galacean/effects';\nimport { spec, glContext, Texture, TextureSourceType, loadImage, generateGUID } from '@galacean/effects';\nimport type { ModelSkyboxComponentData, ModelSkyboxOptions } from '../index';\nimport { PObjectType, PMaterialType } from './common';\nimport { PEntity } from './object';\nimport { PMaterialBase } from './material';\nimport type { PSceneManager } from './scene';\nimport { WebGLHelper } from '../utility/plugin-helper';\nimport { Matrix4, Vector2, Vector3 } from './math';\nimport type { ModelSkyboxComponent } from '../plugin/model-item';\n\n/**\n * 天空盒类,支持天空盒的渲染和 IBL 光照效果\n */\nexport class PSkybox extends PEntity {\n /**\n * 所属的天空盒组件\n */\n owner?: ModelSkyboxComponent;\n /**\n * 是否渲染\n */\n renderable = true;\n /**\n * 强度\n */\n intensity = 1.0;\n /**\n * 反射强度\n */\n reflectionsIntensity = 1.0;\n /**\n * 辐射照度系数\n */\n irradianceCoeffs?: number[][];\n /**\n * 漫反射贴图\n */\n diffuseImage?: Texture;\n /**\n * 高光贴图\n */\n specularImage!: Texture;\n /**\n * 高光贴图大小\n */\n specularImageSize = 0;\n /**\n * 高光贴图 Mip 层数目\n */\n specularMipCount = 0;\n /**\n * BRDF 查询纹理\n */\n brdfLUT?: Texture;\n /**\n * 优先级\n */\n priority = 0;\n /**\n * 天空盒 Mesh\n */\n skyboxMesh?: Mesh;\n /**\n * 天空盒材质\n */\n skyboxMaterial?: PMaterialSkyboxFilter;\n /**\n * 是否构建过\n */\n isBuilt = false;\n\n /**\n * 构造函数\n * @param name - 名称\n * @param data - 天空盒参数\n * @param owner - 所属天空盒组件元素\n */\n constructor (name: string, data: ModelSkyboxComponentData, owner?: ModelSkyboxComponent) {\n super();\n this.name = name;\n this.type = PObjectType.skybox;\n this.visible = false;\n this.owner = owner;\n\n const { irradianceCoeffs } = data;\n\n this.renderable = data.renderable;\n this.intensity = data.intensity;\n this.reflectionsIntensity = data.reflectionsIntensity;\n if (irradianceCoeffs) {\n this.irradianceCoeffs = [];\n for (let i = 0; i < irradianceCoeffs.length; i += 3) {\n this.irradianceCoeffs.push([\n irradianceCoeffs[i],\n irradianceCoeffs[i + 1],\n irradianceCoeffs[i + 2],\n ]);\n }\n } else {\n this.irradianceCoeffs = [];\n }\n\n this.diffuseImage = data.diffuseImage as unknown as Texture;\n this.specularImage = data.specularImage as unknown as Texture;\n this.specularImageSize = data.specularImageSize;\n this.specularMipCount = data.specularMipCount;\n\n this.priority = owner?.item?.renderOrder || 0;\n }\n\n /**\n * 设置 BRDF 查询纹理\n * @param brdfLUT - 纹理\n */\n setup (brdfLUT?: Texture) {\n this.brdfLUT = brdfLUT;\n }\n\n /**\n * 构建天空盒,创建天空盒材质,从场景缓存中创建天空盒 Mesh\n * @param sceneCache - 场景缓存\n * @returns\n */\n build (scene: PSceneManager) {\n if (this.isBuilt) {\n return;\n }\n\n this.isBuilt = true;\n this.skyboxMaterial = new PMaterialSkyboxFilter();\n this.skyboxMaterial.create(this);\n this.skyboxMaterial.build();\n //\n const sceneCache = scene.getSceneCache();\n\n this.skyboxMesh = sceneCache.getFilterMesh('SkyboxFilterPlane', this.skyboxMaterial);\n this.skyboxMesh.priority = this.priority;\n this.skyboxMaterial.updateUniforms(this.skyboxMesh.material);\n }\n\n /**\n * 渲染天空盒\n * @param scene - 场景\n * @param renderer - 渲染器\n */\n override render (scene: PSceneManager, renderer: Renderer) {\n this.updateMaterial(scene);\n\n if (this.visible && this.renderable && this.skyboxMesh !== undefined) {\n const mesh = this.skyboxMesh;\n\n renderer.drawGeometry(mesh.geometry, Matrix4.IDENTITY, mesh.material);\n }\n }\n\n /**\n * 销毁\n */\n override dispose () {\n super.dispose();\n this.owner = undefined;\n this.diffuseImage = undefined;\n //@ts-expect-error\n this.specularImage = undefined;\n this.brdfLUT = undefined;\n this.skyboxMesh = undefined;\n this.skyboxMaterial?.dispose();\n this.skyboxMaterial = undefined;\n }\n\n private updateMaterial (scene: PSceneManager) {\n this.build(scene);\n\n if (this.visible && this.renderable && this.skyboxMesh !== undefined && this.skyboxMaterial !== undefined) {\n const sceneStates = scene.sceneStates;\n const camera = sceneStates.camera;\n const viewMatrix = sceneStates.viewMatrix;\n const newProjViewMatrix = camera.getNewProjectionMatrix(camera.fov).multiply(viewMatrix).invert();\n const material = this.skyboxMesh.material;\n\n this.skyboxMaterial.updateUniforms(material);\n material.setMatrix('_InvViewProjectionMatrix', newProjViewMatrix);\n }\n }\n\n /**\n * 是否可用,根据内部的强度、辐射照度系数、漫反射贴图和高光贴图状态\n */\n get available (): boolean {\n if (!this.isValid()) { return false; }\n\n if (this.intensity <= 0 && this.reflectionsIntensity <= 0) { return false; }\n\n if (this.irradianceCoeffs === undefined && this.diffuseImage === undefined) { return false; }\n\n return this.specularImage !== undefined && this.specularMipCount >= 0;\n }\n\n /**\n * 当前强度,如果不可见返回 0\n */\n get currentIntensity (): number {\n return this.visible ? this.intensity : 0;\n }\n\n /**\n * 当前反射强度,如果不可见返回 0\n */\n get currentReflectionsIntensity (): number {\n return this.visible ? this.reflectionsIntensity : 0;\n }\n\n /**\n * 是否有漫反射贴图\n */\n get hasDiffuseImage (): boolean {\n return this.diffuseImage !== undefined;\n }\n\n /**\n * 是否有辐射照度系数\n */\n get hasIrradianceCoeffs (): boolean {\n return this.irradianceCoeffs !== undefined;\n }\n\n}\n\n/**\n * 天空盒材质类\n */\nexport class PMaterialSkyboxFilter extends PMaterialBase {\n /**\n * 强度\n */\n intensity = 1.0;\n /**\n * 反射强度\n */\n reflectionsIntensity = 1.0;\n /**\n * BRDF 查询纹理\n */\n brdfLUT?: Texture;\n /**\n * 辐射照度系数\n */\n irradianceCoeffs?: number[][];\n /**\n * 漫反射贴图\n */\n diffuseImage?: Texture;\n /**\n * 高光贴图\n */\n specularImage!: Texture;\n /**\n * 高光贴图 Mip 数目\n */\n specularMipCount = 0;\n\n /**\n * 创建天空盒材质,从天空盒对象\n * @param skybox - 天空盒对象\n */\n create (skybox: PSkybox) {\n this.type = PObjectType.material;\n this.materialType = PMaterialType.skyboxFilter;\n this.ZTest = false;\n //\n this.name = skybox.name;\n this.intensity = skybox.intensity;\n this.reflectionsIntensity = skybox.reflectionsIntensity;\n this.brdfLUT = skybox.brdfLUT;\n this.irradianceCoeffs = skybox.irradianceCoeffs;\n this.diffuseImage = skybox.diffuseImage;\n this.specularImage = skybox.specularImage;\n this.specularMipCount = skybox.specularMipCount;\n }\n\n /**\n * 销毁,需要解除资源引用\n */\n override dispose () {\n super.dispose();\n this.brdfLUT = undefined;\n this.irradianceCoeffs = undefined;\n this.diffuseImage = undefined;\n // @ts-expect-error\n this.specularImage = undefined;\n }\n\n /**\n * 获取着色器特性列表\n * @returns\n */\n override getShaderFeatures (): string[] {\n const featureList: string[] = [];\n\n featureList.push('USE_IBL 1');\n featureList.push('USE_TEX_LOD 1');\n if (this.diffuseImage === undefined) { featureList.push('IRRADIANCE_COEFFICIENTS 1'); }\n\n return featureList;\n }\n\n /**\n * 更新着色器 Uniform 数据\n * @param material - 对应的 Core 层材质\n */\n override updateUniforms (material: Material) {\n if (this.brdfLUT === undefined) {\n throw new Error('Setup brdfLUT for skybox at first.');\n }\n\n material.setVector2('_IblIntensity', new Vector2(2.0, 2.0));\n material.setTexture('_brdfLUT', this.brdfLUT);\n if (this.diffuseImage !== undefined) {\n material.setTexture('_DiffuseEnvSampler', this.diffuseImage);\n } else {\n const coeffs = this.irradianceCoeffs;\n\n if (coeffs === undefined || coeffs.length != 9) { throw new Error(`Invalid skybox irradiance coeffs ${coeffs}.`); }\n\n const aliasName = ['l00', 'l1m1', 'l10', 'l11', 'l2m2', 'l2m1', 'l20', 'l21', 'l22'];\n\n aliasName.forEach((n, i) => {\n material.setVector3(`_shCoefficients.${n}`, Vector3.fromArray(coeffs[i] as spec.vec3));\n });\n }\n material.setInt('_MipCount', this.specularMipCount - 1);\n material.setTexture('_SpecularEnvSampler', this.specularImage);\n }\n\n /**\n * 设置对应的材质状态\n * @param material - 对应的 Core 层材质\n */\n override setMaterialStates (material: Material) {\n material.depthTest = true;\n material.depthMask = false;\n this.setFaceSideStates(material);\n }\n}\n\n/**\n * 图像缓冲区数据接口\n */\nexport interface PImageBufferData {\n /**\n * 类型,总是 buffer\n */\n type: 'buffer',\n /**\n * 数组\n */\n data: Uint8Array,\n /**\n * MIME 类型\n */\n mimeType: string,\n}\n\n/**\n * 图像数据类型,字符串(URL)或者图像缓冲区数据\n */\nexport type PImageData = string | PImageBufferData;\n\n/**\n * 天空盒基础参数接口\n */\nexport interface PSkyboxBaseParams {\n /**\n * 是否渲染\n */\n renderable: boolean,\n /**\n * 强度\n */\n intensity: number,\n /**\n * 反射强度\n */\n reflectionsIntensity: number,\n /**\n * 辐射照度系数\n */\n irradianceCoeffs?: number[],\n /**\n * 高光贴图 Mip 层数\n */\n specularMipCount: number,\n /**\n * 高光贴图大小\n */\n specularImageSize: number,\n}\n\n/**\n * 天空盒 URL 参数接口\n */\nexport interface PSkyboxURLParams extends PSkyboxBaseParams {\n /**\n * 类型,总是 url\n */\n type: 'url',\n /**\n * 漫反射贴图 URL 列表\n */\n diffuseImage?: string[],\n /**\n * 高光贴图 URL 二级列表\n */\n specularImage: string[][],\n}\n\n/**\n * 天空盒缓冲区参数接口\n */\nexport interface PSkyboxBufferParams extends PSkyboxBaseParams {\n /**\n * 类型,总是 buffer\n */\n type: 'buffer',\n /**\n * 漫反射贴图列表\n */\n diffuseImage?: PImageBufferData[],\n /**\n * 高光贴图二级列表\n */\n specularImage: PImageBufferData[][],\n}\n\n/**\n * 天空盒参数类型\n */\nexport type PSkyboxParams = PSkyboxURLParams | PSkyboxBufferParams;\n\nexport enum PSkyboxType {\n NFT = 0,\n FARM,\n}\n\n/**\n * 天空盒创建类\n */\nexport class PSkyboxCreator {\n /**\n * 获取 BRDF 查询纹理选项\n * @returns 纹理源选项\n */\n static async getBrdfLutTextureOptions (): Promise<TextureSourceOptions> {\n const brdfURL = 'https://gw.alipayobjects.com/zos/gltf-asset/61420044606400/lut-ggx.png';\n //const brdfURL = 'https://gw.alipayobjects.com/zos/gltf-asset/58540818729423/a4191420-a8cd-432c-8e36-9bd02a67ec85.png';\n const brdfLutImage = await loadImage(brdfURL);\n\n const brdfLutOpts: TextureSourceOptions = {\n name: 'brdfLut',\n wrapS: glContext.CLAMP_TO_EDGE,\n wrapT: glContext.CLAMP_TO_EDGE,\n magFilter: glContext.LINEAR,\n minFilter: glContext.LINEAR,\n anisotropic: 1,\n sourceType: TextureSourceType.image,\n image: brdfLutImage,\n generateMipmap: false,\n flipY: false,\n premultiplyAlpha: false,\n };\n\n return brdfLutOpts;\n }\n\n /**\n * 创建 BRDF 查询纹理\n * @param engine - 引擎\n * @returns 纹理\n */\n static async createBrdfLutTexture (engine: Engine): Promise<Texture> {\n const brdfLutOpts = await this.getBrdfLutTextureOptions();\n const brdfLutTexture = Texture.create(engine, brdfLutOpts);\n\n return brdfLutTexture;\n }\n\n /**\n * 创建天空盒选项\n * @param engine - 引擎\n * @param params - 天空盒参数\n * @returns 天空盒选项\n */\n static async createSkyboxOptions (engine: Engine, params: PSkyboxParams): Promise<ModelSkyboxOptions> {\n const specularImage = await this.createSpecularCubeMap(engine, params);\n const diffuseImage = await this.createDiffuseCubeMap(engine, params);\n const { renderable, intensity, reflectionsIntensity, irradianceCoeffs, specularImageSize, specularMipCount } = params;\n const skyboxOptions: ModelSkyboxOptions = {\n renderable,\n intensity,\n reflectionsIntensity,\n // @ts-expect-error\n irradianceCoeffs,\n diffuseImage,\n specularImage,\n specularImageSize,\n specularMipCount,\n };\n\n return skyboxOptions;\n }\n\n /**\n * 创建天空盒选项\n * @param engine - 引擎\n * @param params - 天空盒参数\n * @returns 天空盒选项\n */\n static createSkyboxComponentData (params: PSkyboxParams) {\n const specularCubeData = PSkyboxCreator.getSpecularCubeMapData(params);\n const diffuseCubeData = PSkyboxCreator.getDiffuseCubeMapData(params);\n const { renderable, intensity, reflectionsIntensity, irradianceCoeffs, specularImageSize, specularMipCount } = params;\n\n let diffuseImage: spec.DataPath;\n const imageList: spec.Image[] = [];\n const textureOptionsList: TextureSourceOptions[] = [];\n\n if (diffuseCubeData) {\n imageList.push(...diffuseCubeData.images);\n textureOptionsList.push(diffuseCubeData.textureOptions);\n diffuseImage = {\n id: diffuseCubeData.textureOptions.id!,\n };\n }\n imageList.push(...specularCubeData.images);\n textureOptionsList.push(specularCubeData.textureOptions);\n const specularImage = { id: specularCubeData.textureOptions.id };\n\n const componentData: ModelSkyboxComponentData = {\n id: generateGUID(),\n dataType: spec.DataType.SkyboxComponent,\n item: {\n id: generateGUID(),\n },\n renderable,\n intensity,\n reflectionsIntensity,\n irradianceCoeffs,\n // @ts-expect-error\n diffuseImage,\n // @ts-expect-error\n specularImage,\n specularImageSize,\n specularMipCount,\n };\n\n return {\n imageList,\n textureOptionsList,\n component: componentData,\n };\n }\n\n /**\n * 创建高光 Cube Map 纹理\n * @param engine - 引擎\n * @param params - 天空盒参数\n * @returns 纹理\n */\n static async createSpecularCubeMap (engine: Engine, params: PSkyboxParams): Promise<Texture> {\n // const configOptions: TextureConfigOptions = {\n // wrapS: glContext.CLAMP_TO_EDGE,\n // wrapT: glContext.CLAMP_TO_EDGE,\n // magFilter: glContext.LINEAR,\n // minFilter: glContext.LINEAR_MIPMAP_LINEAR,\n // };\n\n if (params.type === 'url') {\n return WebGLHelper.createTextureCubeMipmapFromURL(engine, params.specularImage);\n } else {\n return WebGLHelper.createTextureCubeMipmapFromBuffer(engine, params.specularImage, params.specularImageSize);\n }\n }\n\n static getSpecularCubeMapData (params: PSkyboxParams) {\n const imageDatas: spec.Image[] = [];\n const mipmaps: spec.DataPath[][] = [];\n\n params.specularImage.forEach(cubemap => {\n const mipmap: spec.DataPath[] = [];\n\n cubemap.forEach(image => {\n const imageId = generateGUID();\n\n imageDatas.push({\n id: imageId,\n // @ts-expect-error\n url: image,\n });\n mipmap.push({ id: imageId });\n });\n mipmaps.push(mipmap);\n });\n const textureOptions: TextureSourceOptions = {\n id: generateGUID(),\n dataType: spec.DataType.Texture,\n sourceType: TextureSourceType.mipmaps,\n target: glContext.TEXTURE_CUBE_MAP,\n // @ts-expect-error\n mipmaps,\n ...WebGLHelper.cubemapMipTexConfig,\n };\n\n return {\n images: imageDatas,\n textureOptions,\n };\n }\n\n /**\n * 创建漫反射纹理\n * @param engine - 引擎\n * @param params - 天空盒参数\n * @returns 纹理或未定义\n */\n static async createDiffuseCubeMap (engine: Engine, params: PSkyboxParams): Promise<Texture | null> {\n if (params.diffuseImage === undefined) { return null; }\n\n if (params.type === 'url') {\n return WebGLHelper.createTextureCubeFromURL(engine, params.diffuseImage);\n } else {\n return WebGLHelper.createTextureCubeFromBuffer(engine, params.diffuseImage);\n }\n }\n\n static getDiffuseCubeMapData (params: PSkyboxParams) {\n if (params.diffuseImage === undefined) {\n return;\n }\n\n const imageDatas: spec.Image[] = [];\n const cubemap: spec.DataPath[] = [];\n\n params.diffuseImage.forEach(image => {\n const imageId = generateGUID();\n\n imageDatas.push({\n id: imageId,\n // @ts-expect-error\n url: image,\n });\n cubemap.push({ id: imageId });\n });\n\n const textureOptions: TextureSourceOptions = {\n id: generateGUID(),\n dataType: spec.DataType.Texture,\n sourceType: TextureSourceType.mipmaps,\n target: glContext.TEXTURE_CUBE_MAP,\n // @ts-expect-error\n mipmaps: [cubemap],\n ...WebGLHelper.cubemapTexConfig,\n };\n\n return {\n images: imageDatas,\n textureOptions,\n };\n }\n\n /**\n * 创建天空盒参数\n * @param skyboxType - 天空盒类型\n * @returns 天空盒参数\n */\n static getSkyboxParams (skyboxType = PSkyboxType.NFT): PSkyboxURLParams {\n const specularImage = this.getSpecularImageList(skyboxType);\n const params: PSkyboxURLParams = {\n type: 'url',\n renderable: true,\n intensity: 1.8,\n reflectionsIntensity: 1.8,\n irradianceCoeffs: this.getIrradianceCoeffs(skyboxType),\n diffuseImage: this.getDiffuseImageList(skyboxType, specularImage),\n specularImage: specularImage,\n specularImageSize: Math.pow(2, specularImage.length - 1),\n specularMipCount: specularImage.length,\n };\n\n return params;\n }\n\n // TODO: 待移除?\n private async checkCubeMapImage (imageList: string[]) {\n let lastImage!: HTMLImageElement;\n const specularImageLists: HTMLImageElement[][] = [];\n\n for (let i = 0; i < imageList.length; i++) {\n const image = await loadImage(imageList[i]);\n\n if (i > 0) {\n if (i % 6 === 0) {\n if (image.width * 2 !== lastImage.width || image.height * 2 !== lastImage.height) {\n throw new Error(`Invalid cube map list1: index ${i}, image0 ${lastImage}, image1 ${image}.`);\n }\n } else {\n if (image.width !== lastImage.width || image.height !== lastImage.height) {\n throw new Error(`Invalid cube map list2: index ${i}, image0 ${lastImage}, image1 ${image}.`);\n }\n }\n }\n if (i % 6 === 0) { specularImageLists.push([]); }\n const lastList = specularImageLists[specularImageLists.length - 1];\n\n lastList.push(image);\n lastImage = image;\n }\n }\n\n private static getIrradianceCoeffs (skyboxType: PSkyboxType): number[] | undefined {\n let dataArray: number[] = [];\n\n switch (skyboxType) {\n case PSkyboxType.NFT: {\n return undefined;\n }\n case PSkyboxType.FARM: dataArray = [\n 0.2665672302246094, 0.27008703351020813, 0.2836797833442688, -0.15421263873577118, -0.15587495267391205,\n -0.16371899843215942, 0.06483837962150574, 0.06468029320240021, 0.06616337597370148, -0.11598809063434601,\n -0.11796595901250839, -0.1261979341506958, 0.023678265511989594, 0.02456280030310154, 0.02591511607170105,\n -0.032404184341430664, -0.03217344358563423, -0.03126845508813858, 0.009165619499981403, 0.009345818310976028,\n 0.008521141484379768, -0.021998587995767593, -0.02203795686364174, -0.021759089082479477, 0.00046658870996907353,\n 0.0005610908847302198, 0.0007202711421996355,\n ];\n\n break;\n default: dataArray = [\n 0.37462672591209412, 0.35230118036270142, 0.33955901861190796, 0.12082185596227646, 0.18179306387901306,\n 0.26912716031074524, -0.020699946209788322, -0.0046484274789690971, 0.00797625258564949, -0.068421706557273865,\n -0.051390238106250763, -0.03317255899310112, 0.044127799570560455, 0.028159862384200096, 0.0074287452735006809,\n 0.078870773315429688, 0.067734844982624054, 0.047382339835166931, -0.012322401627898216, -0.015187464654445648,\n -0.020201763138175011, -0.1091032400727272, -0.0823250338435173, -0.046844951808452606, -0.057797044515609741,\n -0.066892541944980621, -0.08212742954492569,\n ];\n\n break;\n }\n\n return dataArray;\n }\n\n private static getDiffuseImageList (skyboxType: PSkyboxType, images: string[][]): string[] | undefined {\n if (skyboxType == PSkyboxType.NFT) {\n return images[images.length - 1];\n }\n\n return undefined;\n }\n\n private static getSpecularImageList (skyboxType: PSkyboxType): string[][] {\n const imageList: string[] = [];\n\n switch (skyboxType) {\n case PSkyboxType.FARM: imageList.push(...this.getSpecularImageListAntFarm());\n\n break;\n default: imageList.push(...this.getSpecularImageListNFT());\n\n break;\n }\n\n const levelList: string[][] = [];\n\n imageList.forEach((v, i) => {\n if (i % 6 === 0) {\n levelList.push([]);\n }\n const currentLevel = levelList[levelList.length - 1];\n\n currentLevel.push(v);\n });\n\n return levelList;\n }\n\n private static getSpecularImageListNFT (): string[] {\n return [\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img0.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img1.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img2.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img3.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img5.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img4.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img6.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img7.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img8.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img9.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img11.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img10.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img12.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img13.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img14.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img15.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img17.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img16.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img18.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img19.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img20.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img21.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img23.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img22.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img24.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img25.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img26.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img27.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img29.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img28.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img30.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img31.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img32.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img33.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img35.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img34.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img36.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img37.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img38.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img39.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img41.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img40.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img42.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img43.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img44.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img45.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img47.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img46.png',\n ];\n }\n\n private static getSpecularImageListAntFarm (): string[] {\n return [\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_32_0.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_32_1.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_32_2.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_32_3.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_32_4.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_32_5.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_16_0.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_16_1.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_16_2.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_16_3.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_16_4.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_16_5.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_8_0.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_8_1.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_8_2.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_8_3.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_8_4.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_8_5.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_4_0.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_4_1.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_4_2.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_4_3.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_4_4.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_4_5.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_2_0.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_2_1.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_2_2.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_2_3.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_2_4.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_2_5.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_1_0.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_1_1.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_1_2.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_1_3.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_1_4.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_1_5.png',\n ];\n }\n}\n\n","import type { Mesh, Geometry, TextureSourceOptions, RenderPass, spec, Engine } from '@galacean/effects';\nimport { Texture } from '@galacean/effects';\nimport type { ModelSkyboxOptions } from '../index';\nimport type { FBOOptions } from '../utility/ri-helper';\nimport type { PMaterialBase } from './material';\nimport type { PSkyboxParams } from './skybox';\nimport { PSkyboxCreator } from './skybox';\nimport { WebGLHelper, MeshHelper, PluginHelper } from '../utility/plugin-helper';\n\n/**\n * 合成缓存类,负责管理插件 WebGL 相关资源加载和创建\n */\nexport class CompositionCache {\n // TODO: 待移除?\n private loadSkybox = false;\n // 天空盒依赖的贴图资源\n private brdfLutTexture?: Texture;\n //\n private meshCache: Map<string, Mesh>;\n private textureCache: Map<string, Texture>;\n private geometryCache: Map<string, Geometry>;\n private renderPassCache: Map<string, RenderPass>;\n //\n private static brdfLutTexOptions?: TextureSourceOptions;\n private static skyboxOptions?: ModelSkyboxOptions;\n\n /**\n * 加载静态的纹理数据\n * @returns\n */\n static async loadStaticResources () {\n if (this.brdfLutTexOptions !== undefined) {\n // 避免重复创建\n return;\n }\n\n this.brdfLutTexOptions = await PSkyboxCreator.getBrdfLutTextureOptions();\n }\n\n /**\n * 创建天空盒数据,如果传入的 params 为空,会使用内置的天空盒参数\n * @param engine - 引擎\n * @param params - 天空盒参数\n * @returns 天空盒数据\n */\n static async genSkyboxOptions (engine: Engine, params?: PSkyboxParams): Promise<ModelSkyboxOptions> {\n let newParams = params;\n\n if (newParams === undefined) {\n newParams = PSkyboxCreator.getSkyboxParams();\n }\n\n CompositionCache.skyboxOptions = await PSkyboxCreator.createSkyboxOptions(engine, newParams);\n\n return CompositionCache.skyboxOptions;\n }\n\n constructor (private engine: Engine) {\n this.meshCache = new Map();\n this.textureCache = new Map();\n this.geometryCache = new Map();\n this.renderPassCache = new Map();\n }\n\n /**\n * 记录是否加载天空盒,缓存天空盒相关的查询纹理\n * @param loadSkybox - 是否加载天空盒\n */\n setup (loadSkybox: boolean) {\n this.loadSkybox = loadSkybox;\n\n if (this.brdfLutTexture === undefined || this.brdfLutTexture.isDestroyed) {\n if (CompositionCache.brdfLutTexOptions === undefined) {\n throw new Error('Please load brdfLutTexOptions at first.');\n }\n //\n const brdfLutTextureName = 'brdfLutTexture';\n\n this.brdfLutTexture = Texture.create(this.engine, CompositionCache.brdfLutTexOptions);\n this.deleteTexture(brdfLutTextureName);\n this.setTexture(brdfLutTextureName, this.brdfLutTexture);\n }\n }\n\n /**\n * 获取缓存的纹理对象\n * @param name - 名称\n * @returns 纹理对象\n */\n getTexture (name: string): Texture | undefined {\n return this.textureCache.get(name);\n }\n\n /**\n * 设置纹理对象缓存\n * @param name - 名称\n * @param tex - 纹理对象\n */\n setTexture (name: string, tex: Texture) {\n this.textureCache.set(name, tex);\n }\n\n /**\n * 获取或者创建纹理对象\n * @param name - 名称\n * @param options - 纹理参数\n * @returns 纹理对象\n */\n getOrCreateTexture (name: string, options: TextureSourceOptions): Texture {\n const tex = this.textureCache.get(name);\n\n if (tex !== undefined) {\n return tex;\n }\n const newTex = Texture.create(this.engine, options);\n\n this.textureCache.set(name, newTex);\n\n return newTex;\n }\n\n /**\n * 根据名称删除纹理对象\n * @param name - 名称\n * @returns 是否删除成功\n */\n deleteTexture (name: string): boolean {\n const tex = this.textureCache.get(name);\n\n if (tex !== undefined) {\n tex.dispose();\n }\n\n return this.textureCache.delete(name);\n }\n\n /**\n * 获取或者创建几何体\n * @param name - 名称\n * @param geomJson - 几何体参数\n * @param bins - 几何体数据\n * @returns 几何体\n */\n getOrCreateGeometry (name: string, geomJson: spec.GeometryOptionsJSON, bins: ArrayBuffer[]): Geometry {\n const cachedGeom = this.geometryCache.get(name);\n\n if (cachedGeom !== undefined) {\n return cachedGeom;\n }\n\n const geom = PluginHelper.createGeometry(this.engine, geomJson, bins);\n\n this.geometryCache.set(name, geom);\n\n return geom;\n }\n\n /**\n * 获取滤波 Mesh\n * @param name - 名称\n * @param material - 材质\n * @returns\n */\n getFilterMesh (name: string, material: PMaterialBase): Mesh {\n const cachedMesh = this.meshCache.get(name);\n\n if (cachedMesh !== undefined) {\n return cachedMesh;\n }\n\n const mesh = MeshHelper.createFilterMesh(this.engine, name, material);\n\n this.meshCache.set(name, mesh);\n\n return mesh;\n }\n\n getShadowBasePass (name: string, priority: number, meshList: Mesh[], fboOptions: FBOOptions): RenderPass {\n return this.getRenderPass(name, priority, meshList, fboOptions);\n }\n\n getShadowFilterPass (name: string, priority: number, meshList: Mesh[], fboOptions: FBOOptions): RenderPass {\n return this.getRenderPass(name, priority, meshList, fboOptions);\n }\n\n /**\n * 获取渲染 Pass\n * @param name - 名称\n * @param priority - 优先级\n * @param meshList - Mesh 列表\n * @param fboOptions - FBO 参数\n * @returns\n */\n getRenderPass (name: string, priority: number, meshList: Mesh[], fboOptions: FBOOptions): RenderPass {\n const cachedPass = this.renderPassCache.get(name);\n\n if (cachedPass !== undefined) {\n cachedPass.setMeshes([]);\n meshList.forEach(mesh => { cachedPass.addMesh(mesh); });\n\n return cachedPass;\n } else {\n const renderer = this.engine.renderer;\n const renderPass = WebGLHelper.createRenderPass(renderer, name, priority, meshList, fboOptions);\n\n this.renderPassCache.set(name, renderPass);\n\n return renderPass;\n }\n }\n\n /**\n * 销毁缓存,释放所有缓存的对象\n */\n dispose () {\n // @ts-expect-error\n this.engine = null;\n this.brdfLutTexture = undefined;\n this.meshCache.forEach(mesh => {\n WebGLHelper.deleteMesh(mesh);\n });\n this.meshCache.clear();\n //\n this.textureCache.forEach(texture => {\n WebGLHelper.deleteTexture(texture);\n });\n this.textureCache.clear();\n //\n this.geometryCache.forEach(geometry => {\n WebGLHelper.deleteGeometry(geometry);\n });\n this.geometryCache.clear();\n //\n this.renderPassCache.forEach(pass => {\n WebGLHelper.deleteRenderPass(pass);\n });\n this.renderPassCache.clear();\n }\n\n /**\n * 获取所有的渲染 Pass\n * @returns\n */\n getRenderPasses (): RenderPass[] {\n const resList: RenderPass[] = [];\n\n this.renderPassCache.forEach(pass => {\n resList.push(pass);\n });\n\n return resList;\n }\n\n /**\n * 获取纹理对象,用户 IBL 渲染\n * @returns\n */\n getBrdfLutTexture (): Texture | undefined {\n return this.brdfLutTexture;\n }\n\n /**\n * 获取天空盒参数\n * @returns\n */\n getSkyboxOptions (): ModelSkyboxOptions | undefined {\n return CompositionCache.skyboxOptions;\n }\n}\n\n","import type { math } from '@galacean/effects';\nimport { spec } from '@galacean/effects';\nimport type { ModelCameraComponentData } from '../index';\nimport { Vector2, Vector3, Matrix4 } from './math';\nimport { PObjectType } from './common';\nimport { PEntity } from './object';\nimport type { ModelCameraComponent } from '../plugin/model-item';\n\ntype Box3 = math.Box3;\ntype Quaternion = math.Quaternion;\n\nconst deg2rad = Math.PI / 180;\n\n/**\n * 相机类,支持基础的相机功能\n */\nexport class PCamera extends PEntity {\n /**\n * 所属的相机组件\n */\n owner?: ModelCameraComponent;\n /**\n * 画布宽度\n */\n width = 512;\n /**\n * 画布高度\n */\n height = 512;\n /**\n * 近裁剪平面\n */\n nearPlane = 0.001;\n /**\n * 远裁剪平面\n */\n farPlane = 1000;\n /**\n * Y 轴上视角\n */\n fov = 45;\n /**\n * 视图矩阵\n */\n viewportMatrix = Matrix4.fromIdentity();\n /**\n * 纵横比\n */\n aspect = 1.0;\n /**\n * 剪裁模式,默认是剪裁左右\n */\n clipMode = spec.CameraClipMode.landscape;\n /**\n * 投影矩阵\n */\n projectionMatrix: Matrix4 = new Matrix4();\n /**\n * 相机矩阵\n */\n viewMatrix: Matrix4 = new Matrix4();\n\n /**\n * 构造函数,创建相机对象\n * @param camera - 相机数据\n * @param width - 画布宽度\n * @param height - 画布高度\n * @param owner - 所属的相机组件\n */\n constructor (name: string, width: number, height: number, data: ModelCameraComponentData, owner?: ModelCameraComponent) {\n super();\n this.type = PObjectType.camera;\n this.visible = false;\n this.owner = owner;\n //\n this.name = name;\n this.width = width;\n this.height = height;\n\n this.nearPlane = data.near ?? 0.001;\n this.farPlane = data.far ?? 1000;\n this.fov = data.fov ?? 45;\n this.aspect = data.aspect ?? (this.width / this.height);\n this.clipMode = data.clipMode ?? spec.CameraClipMode.landscape;\n this.update();\n }\n\n /**\n * 更新相机矩阵和投影矩阵,从所属的元素中获取变换数据\n */\n override update () {\n if (this.owner !== undefined) {\n this.transform.fromEffectsTransform(this.owner.transform);\n }\n\n const reverse = this.clipMode === spec.CameraClipMode.portrait;\n\n this.projectionMatrix.perspective(this.fov * deg2rad, this.aspect, this.nearPlane, this.farPlane, reverse);\n this.projectionMatrix.premultiply(this.viewportMatrix);\n this.viewMatrix = this.matrix.invert();\n }\n\n /**\n * 获取新的透视矩阵,视角大小乘 1.25 倍\n * @param fov - 视角大小\n * @returns 投影矩阵\n */\n getNewProjectionMatrix (fov: number): Matrix4 {\n const reverse = this.clipMode === spec.CameraClipMode.portrait;\n\n return new Matrix4().perspective(Math.min(fov * 1.25, 140) * deg2rad, this.aspect, this.nearPlane, this.farPlane, reverse).premultiply(this.viewportMatrix);\n }\n\n /**\n * 计算视角中的包围盒大小\n * @param box - 包围盒\n * @returns 视角中的包围盒\n */\n computeViewAABB (box: Box3): Box3 {\n const tanTheta = Math.tan(this.fov * deg2rad * 0.5);\n const aspect = this.aspect;\n let yFarCoord = 0;\n let yNearCoord = 0;\n let xFarCoord = 0;\n let xNearCoord = 0;\n\n if (this.isReversed()) {\n xFarCoord = this.farPlane * tanTheta;\n xNearCoord = this.nearPlane * tanTheta;\n yFarCoord = xFarCoord / aspect;\n yNearCoord = xNearCoord / aspect;\n } else {\n yFarCoord = this.farPlane * tanTheta;\n yNearCoord = this.nearPlane * tanTheta;\n xFarCoord = aspect * yFarCoord;\n xNearCoord = aspect * yNearCoord;\n }\n\n box.makeEmpty();\n const matrix = this.matrix;\n\n box.expandByPoint(matrix.transformPoint(new Vector3(xFarCoord, yFarCoord, -this.farPlane)));\n box.expandByPoint(matrix.transformPoint(new Vector3(xFarCoord, -yFarCoord, -this.farPlane)));\n box.expandByPoint(matrix.transformPoint(new Vector3(-xFarCoord, yFarCoord, -this.farPlane)));\n box.expandByPoint(matrix.transformPoint(new Vector3(-xFarCoord, -yFarCoord, -this.farPlane)));\n //\n box.expandByPoint(matrix.transformPoint(new Vector3(xNearCoord, yNearCoord, -this.nearPlane)));\n box.expandByPoint(matrix.transformPoint(new Vector3(xNearCoord, -yNearCoord, -this.nearPlane)));\n box.expandByPoint(matrix.transformPoint(new Vector3(-xNearCoord, yNearCoord, -this.nearPlane)));\n box.expandByPoint(matrix.transformPoint(new Vector3(-xNearCoord, -yNearCoord, -this.nearPlane)));\n\n return box;\n }\n\n /**\n * 获取画布大小\n * @returns\n */\n getSize (): Vector2 {\n return new Vector2(this.width, this.height);\n }\n\n /**\n * 是否剪裁上下\n * @returns\n */\n isReversed (): boolean {\n return this.clipMode === spec.CameraClipMode.portrait;\n }\n\n /**\n * 获取眼睛位置\n * @returns\n */\n getEye (): Vector3 {\n return this.translation;\n }\n\n /**\n * 设置眼睛位置\n * @param val - 眼睛位置\n */\n setEye (val: Vector3) {\n this.translation = val;\n }\n}\n\n/**\n * 相机管理类,负责管理场景中的 3D 相机对象\n */\nexport class PCameraManager {\n private winWidth = 512;\n private winHeight = 512;\n private cameraList: PCamera[] = [];\n private defaultCamera;\n\n constructor () {\n this.defaultCamera = new PCamera(\n 'camera', 512, 512,\n {\n id: '0',\n dataType: 'camera' as spec.DataType,\n fov: 60,\n far: 1000,\n near: 0.001,\n clipMode: spec.CameraClipMode.portrait,\n item: { id: '0' },\n },\n );\n }\n\n /**\n * 初始化画布大小,更新默认相机\n * @param width - 画布宽度\n * @param height - 画布高度\n */\n initial (width: number, height: number) {\n this.winWidth = width;\n this.winHeight = height;\n\n const camera = this.defaultCamera;\n\n camera.width = width;\n camera.height = height;\n camera.aspect = width / height;\n camera.update();\n }\n\n /**\n * 插入相机数据,创建新的相机对象\n * @param name - 相机名称\n * @param data - 相机相关数据\n * @param owner - 相机所属组件\n * @returns 新的相机对象\n */\n insert (name: string, data: ModelCameraComponentData, owner?: ModelCameraComponent): PCamera {\n const camera = new PCamera(name, this.winWidth, this.winHeight, data, owner);\n\n this.cameraList.push(camera);\n\n return camera;\n }\n\n /**\n * 插入相机对象\n * @param camera - 相机对象\n */\n insertCamera (camera: PCamera) {\n this.cameraList.push(camera);\n }\n\n /**\n * 根据对象或者索引,删除相机对象\n * @param camera - 索引或相机对象\n */\n remove (camera: PCamera | number) {\n if (camera instanceof PCamera) {\n const findResult = this.cameraList.findIndex(item => {\n return item === camera;\n });\n\n if (findResult !== -1) {\n this.cameraList.splice(findResult, 1);\n }\n } else {\n if (camera >= 0 && camera < this.cameraList.length) {\n this.cameraList.splice(camera, 1);\n }\n }\n }\n\n /**\n * 销毁相机管理对象\n */\n dispose () {\n this.cameraList = [];\n }\n\n /**\n * 更新默认相机状态,并计算新的透视和相机矩阵\n * @param fov - 视角\n * @param viewportMatrix - 视图矩阵\n * @param aspect - 纵横比\n * @param nearPlane - 近裁剪平面\n * @param farPlane - 远裁剪平面\n * @param position - 位置\n * @param rotation - 旋转\n * @param clipMode - 剪裁模式\n */\n updateDefaultCamera (\n fov: number,\n viewportMatrix: Matrix4,\n aspect: number,\n nearPlane: number,\n farPlane: number,\n position: Vector3,\n rotation: Quaternion,\n clipMode: number,\n ) {\n this.defaultCamera.fov = fov;\n this.defaultCamera.viewportMatrix = viewportMatrix.clone();\n this.defaultCamera.aspect = aspect;\n this.defaultCamera.nearPlane = nearPlane;\n this.defaultCamera.farPlane = farPlane;\n this.defaultCamera.position = position;\n this.defaultCamera.rotation = rotation;\n this.defaultCamera.aspect = aspect;\n this.defaultCamera.clipMode = clipMode;\n this.defaultCamera.update();\n }\n\n /**\n * 获取相机对象列表\n * @returns\n */\n getCameraList (): PCamera[] {\n return this.cameraList;\n }\n\n /**\n * 获取默认相机对象\n * @returns\n */\n getDefaultCamera (): PCamera {\n return this.defaultCamera;\n }\n\n /**\n * 获取相机数目\n * @returns\n */\n getCameraCount (): number {\n return this.cameraList.length;\n }\n\n /**\n * 获取激活的相机对象\n * @returns\n */\n getActiveCamera (): PCamera {\n return this.defaultCamera;\n }\n\n /**\n * 获取画布纵横比\n * @returns\n */\n getAspect (): number {\n return this.winWidth / this.winHeight;\n }\n}\n\n","import { spec } from '@galacean/effects';\nimport type { ModelLightComponentData } from '../index';\nimport { Vector2, Vector3 } from './math';\nimport { PObjectType, PLightType } from './common';\nimport { PEntity } from './object';\nimport type { ModelLightComponent } from '../plugin/model-item';\n\n/**\n * 灯光类,支持 3D 场景中的灯光功能\n */\nexport class PLight extends PEntity {\n /**\n * 所属的灯光组件\n */\n owner?: ModelLightComponent;\n /**\n * 方向,仅用于方向光和聚光灯\n */\n direction: Vector3 = new Vector3(0, 0, 1);\n /**\n * 范围,仅用于点光源和聚光灯\n */\n range = 0;\n /**\n * 颜色\n */\n color: Vector3 = new Vector3(1, 1, 1);\n /**\n * 强度\n */\n intensity = 0;\n /**\n * 聚光灯外径\n */\n outerConeAngle = 0;\n /**\n * 聚光灯内径\n */\n innerConeAngle = 0;\n /**\n * 类型\n */\n lightType = PLightType.ambient;\n padding: Vector2 = new Vector2(0, 0);\n /**\n * 是否跟随相机\n */\n followCamera = false;\n\n /**\n * 创建灯光对象\n * @param name - 灯光名称\n * @param data - 灯光相关数据\n * @param owner - 所属灯光组件\n */\n constructor (name: string, data: ModelLightComponentData, owner?: ModelLightComponent) {\n super();\n this.name = name;\n this.type = PObjectType.light;\n this.visible = false;\n this.owner = owner;\n this.direction = new Vector3(0, 0, -1);\n this.range = 0;\n this.outerConeAngle = 0;\n this.innerConeAngle = 0;\n //\n const { color } = data;\n\n this.color = new Vector3(\n color.r,\n color.g,\n color.b,\n );\n this.intensity = data.intensity;\n this.followCamera = data.followCamera ?? false;\n if (data.lightType === spec.LightType.point) {\n this.lightType = PLightType.point;\n this.range = data.range ?? -1;\n } else if (data.lightType === spec.LightType.spot) {\n this.lightType = PLightType.spot;\n this.range = data.range ?? -1;\n this.outerConeAngle = data.outerConeAngle ?? Math.PI;\n this.innerConeAngle = data.innerConeAngle ?? 0;\n } else if (data.lightType === spec.LightType.directional) {\n this.lightType = PLightType.directional;\n } else {\n this.lightType = PLightType.ambient;\n }\n this.update();\n }\n\n /**\n * 更新灯光变换\n */\n override update () {\n if (this.owner !== undefined) {\n this.transform.fromEffectsTransform(this.owner.transform);\n }\n }\n\n /**\n * 是否方向光\n * @returns\n */\n isDirectional (): boolean {\n return this.lightType === PLightType.directional;\n }\n\n /**\n * 是否点光源\n * @returns\n */\n isPoint (): boolean {\n return this.lightType === PLightType.point;\n }\n\n /**\n * 是否聚光灯\n * @returns\n */\n isSpot (): boolean {\n return this.lightType === PLightType.spot;\n }\n\n /**\n * 是否环境光\n * @returns\n */\n isAmbient (): boolean {\n return this.lightType === PLightType.ambient;\n }\n\n /**\n * 获取位置\n */\n override get position (): Vector3 {\n return this.translation;\n }\n\n /**\n * 获取世界坐标中的位置\n * @returns\n */\n getWorldPosition (): Vector3 {\n return this.translation;\n }\n\n /**\n * 获取世界坐标中的方向\n * @returns\n */\n getWorldDirection (): Vector3 {\n return this.matrix.transformNormal(this.direction, new Vector3());\n }\n}\n\n/**\n * 灯光管理类,负责 3D 场景灯光的管理\n */\nexport class PLightManager {\n /**\n * 灯光数组\n */\n lightList: PLight[] = [];\n\n constructor () {\n\n }\n /**\n * 通过灯光参数,创建灯光对象,并保存到灯光数组中\n * @param inLight - 灯光参数\n * @param owner - 所属灯光组件\n * @returns 插入的灯光对象\n */\n insertItem (name: string, inLight: ModelLightComponentData, owner?: ModelLightComponent): PLight {\n const light = new PLight(name, inLight, owner);\n\n this.lightList.push(light);\n\n return light;\n }\n\n /**\n * 插入灯光对象\n * @param inLight - 灯光对象\n * @returns 插入的灯光对象\n */\n insertLight (inLight: PLight): PLight {\n this.lightList.push(inLight);\n\n return inLight;\n }\n\n /**\n * 删除灯光对象,从灯光数组中查找对象并进行删除,如果没有找到就忽略\n * @param inLight - 删除的灯光对象\n */\n remove (inLight: PLight) {\n const findResult = this.lightList.findIndex(item => {\n return item === inLight;\n });\n\n if (findResult !== -1) {\n this.lightList.splice(findResult, 1);\n }\n }\n\n /**\n * 销毁\n */\n dispose () {\n this.lightList = [];\n }\n\n /**\n * 灯光数目\n */\n get lightCount (): number {\n return this.lightList.length;\n }\n\n}\n\n","import type { Texture, Engine, math, VFXItem, Renderer, Geometry } from '@galacean/effects';\nimport { spec, Material, GLSLVersion } from '@galacean/effects';\nimport type { ModelMeshComponentData, ModelItemBounding } from '../index';\nimport { PObjectType, PMaterialType, PGlobalState } from './common';\nimport { PEntity } from './object';\nimport type { PMaterial } from './material';\nimport { PMaterialPBR, PMaterialUnlit, createPluginMaterial } from './material';\nimport { Matrix4, Vector3, Box3, Vector2 } from './math';\nimport { PSkin, PAnimTexture, PMorph, TextureDataMode } from './animation';\nimport type { PSceneManager, PSceneStates } from './scene';\nimport type { PSkybox } from './skybox';\nimport { GeometryBoxProxy, HitTestingProxy } from '../utility/plugin-helper';\nimport { BoxMesh } from '../utility/ri-helper';\nimport { RayBoxTesting } from '../utility/hit-test-helper';\nimport type { ModelMeshComponent } from '../plugin/model-item';\n\ntype Box3 = math.Box3;\n\n/**\n * Mesh 类,负责 Mesh 相关的骨骼动画和 PBR 渲染\n */\nexport class PMesh extends PEntity {\n /**\n * 所属的 Mesh 组件\n */\n owner?: ModelMeshComponent;\n /**\n * 父节点索引\n */\n parentIndex = -1;\n /**\n * 父元素\n */\n parentItem?: VFXItem;\n /**\n * 父元素索引\n */\n parentItemId?: string;\n rootBoneItem?: VFXItem;\n /**\n * 蒙皮\n */\n skin?: PSkin;\n /**\n * morph 动画状态数据,主要是 weights 数组\n */\n morph?: PMorph;\n /**\n * primitive 对象数组\n */\n subMeshes: PSubMesh[] = [];\n /**\n * 是否隐藏,默认是隐藏\n */\n hide = true;\n /**\n * 优先级\n */\n priority = 0;\n /**\n * 包围盒\n */\n boundingBox: Box3 = new Box3();\n /**\n * 是否显示包围盒\n */\n visBoundingBox = false;\n /**\n * 包围盒 Mesh\n */\n boundingBoxMesh?: BoxMesh;\n /**\n * 是否调用 Build\n */\n isBuilt = false;\n /**\n * 是否销毁\n */\n isDisposed = false;\n\n /**\n * 构造函数,创建 Mesh 对象,并与所属组件和父元素相关联\n * @param engine - 引擎\n * @param name - 名称\n * @param meshData - Mesh 参数\n * @param owner - 所属的 Mesh 组件\n * @param parentId - 父元素索引\n * @param parent - 父元素\n */\n constructor (\n private engine: Engine,\n name: string,\n meshData: ModelMeshComponentData,\n owner: ModelMeshComponent,\n parentId?: string,\n parent?: VFXItem,\n ) {\n super();\n const proxy = new EffectsMeshProxy(meshData, owner, parent);\n\n this.name = name;\n this.type = PObjectType.mesh;\n this.visible = false;\n this.owner = owner;\n //\n this.parentIndex = proxy.getParentIndex();\n this.parentItem = proxy.parentItem;\n this.parentItemId = parentId;\n this.rootBoneItem = meshData.rootBone as unknown as VFXItem;\n this.skin = proxy.getSkinObj(engine);\n this.morph = proxy.getMorphObj();\n this.hide = proxy.isHide();\n this.priority = owner?.item?.renderOrder || 0;\n //\n this.subMeshes = [];\n const geometry = proxy.getGeometry() as unknown as Geometry;\n const materials = owner?.materials ?? [];\n\n materials.forEach(material => {\n const subMesh = new PSubMesh(this.engine);\n\n subMesh.create(geometry, material, this);\n this.subMeshes.push(subMesh);\n });\n\n if (this.subMeshes.length <= 0) {\n console.warn(`No primitive inside mesh item ${name}.`);\n }\n\n this.boundingBox = this.getItemBoundingBox(meshData.interaction);\n }\n\n /**\n * 创建 GE 的 Mesh、Geometry 和 Material 对象\n * @param scene - 场景管理器\n * @returns\n */\n build (scene: PSceneManager) {\n if (this.isBuilt) {\n return;\n }\n\n this.isBuilt = true;\n this.subMeshes.forEach(prim => {\n prim.build(scene.maxLightCount, scene.skybox);\n });\n\n if (PGlobalState.getInstance().visBoundingBox) {\n this.boundingBoxMesh = new BoxMesh(this.engine, this.priority);\n }\n }\n\n /**\n * 更新变换数据和蒙皮数据\n */\n override update () {\n if (this.owner !== undefined) {\n this.transform.fromEffectsTransform(this.owner.transform);\n\n if (this.morph && this.morph.hasMorph() && this.owner.morphWeights.length > 0) {\n this.morph.updateWeights(this.owner.morphWeights);\n }\n }\n }\n\n /**\n * 更新骨骼动画\n */\n lateUpdate () {\n this.skin?.updateSkinMatrices();\n }\n\n /**\n * 渲染 Mesh 对象,需要将内部相关数据传给渲染器\n * @param scene - 场景\n * @param renderer - 渲染器\n */\n override render (scene: PSceneManager, renderer: Renderer) {\n this.updateMaterial(scene);\n\n this.subMeshes.forEach((subMesh, index) => {\n renderer.drawGeometry(\n subMesh.getEffectsGeometry(),\n this.matrix,\n subMesh.getEffectsMaterial(),\n index\n );\n });\n\n if (this.visBoundingBox && this.boundingBoxMesh !== undefined) {\n const mesh = this.boundingBoxMesh.mesh;\n\n renderer.drawGeometry(mesh.geometry, Matrix4.IDENTITY, mesh.material);\n }\n }\n\n /**\n * 销毁,需要主动释放蒙皮、morph 和 Mesh 等相关的对象\n * @returns\n */\n override dispose () {\n if (this.isDisposed) {\n return;\n }\n\n super.dispose();\n\n this.owner = undefined;\n this.isDisposed = true;\n // @ts-expect-error\n this.engine = null;\n this.parentItem = undefined;\n this.skin?.dispose();\n this.skin = undefined;\n this.morph?.dispose();\n this.morph = undefined;\n this.subMeshes.forEach(prim => {\n prim.dispose();\n });\n this.subMeshes = [];\n this.boundingBoxMesh?.dispose();\n this.boundingBoxMesh = undefined;\n }\n\n /**\n * 更新 Morph 动画权重\n * 每帧都会更新 Morph 动画权重,需要小心检查 Morph 动画参数\n * 对于数组长度对不上的情况,直接报错\n *\n * @param weightsArray - Morph 动画的权重数组\n */\n updateMorphWeights (weightsArray: Float32Array) {\n if (this.morph === undefined || !this.morph.hasMorph()) {\n return;\n }\n\n const updatedArray = this.morph.morphWeightsArray;\n\n if (updatedArray === undefined) {\n return;\n }\n\n if (updatedArray.length != weightsArray.length) {\n throw new Error('Weight array length mismatch.');\n }\n\n for (let i = 0; i < updatedArray.length; i++) {\n updatedArray[i] = weightsArray[i];\n }\n }\n\n /**\n * 更新父 VFX 元素\n * @param parentId - 父元素索引\n * @param parentItem - 父 VFX 元素\n */\n updateParentInfo (parentId: string, parentItem: VFXItem) {\n this.parentItemId = parentId;\n this.parentItem = parentItem;\n if (this.skin !== undefined) {\n this.skin.updateParentItem(parentItem);\n }\n }\n\n /**\n * 根据当前场景状态更新内部材质数据\n * @param scene - 场景管理器\n */\n updateMaterial (scene: PSceneManager) {\n const worldMatrix = this.matrix;\n const normalMatrix = worldMatrix.clone().invert().transpose();\n const sceneStates = scene.sceneStates;\n\n this.subMeshes.forEach(prim => {\n prim.updateMaterial(worldMatrix, normalMatrix, sceneStates);\n });\n\n if (this.boundingBoxMesh !== undefined) {\n this.computeBoundingBox(worldMatrix);\n const lineColor = new Vector3(1, 1, 1);\n const minPos = this.boundingBox.min;\n const maxPos = this.boundingBox.max;\n const positions = new Float32Array([\n minPos.x, minPos.y, minPos.z,\n maxPos.x, minPos.y, minPos.z,\n maxPos.x, maxPos.y, minPos.z,\n minPos.x, maxPos.y, minPos.z,\n\n minPos.x, minPos.y, maxPos.z,\n maxPos.x, minPos.y, maxPos.z,\n maxPos.x, maxPos.y, maxPos.z,\n minPos.x, maxPos.y, maxPos.z,\n ]);\n\n this.boundingBoxMesh.update(worldMatrix, sceneStates.viewProjectionMatrix, positions, lineColor);\n }\n }\n\n /**\n * 点击测试,对于编辑器模式会进行精准的点击测试,否则就和内部的包围盒进行测试\n * @param rayOrigin - 射线原点\n * @param rayDirection - 射线方向\n * @returns 交点列表\n */\n hitTesting (rayOrigin: Vector3, rayDirection: Vector3): Vector3[] {\n const worldMatrix = this.matrix;\n const invWorldMatrix = worldMatrix.clone().invert();\n const newOrigin = invWorldMatrix.transformPoint(rayOrigin, new Vector3());\n const newDirection = invWorldMatrix.transformNormal(rayDirection, new Vector3());\n\n const bounding = this.boundingBox;\n const boxt = RayBoxTesting(newOrigin, newDirection, bounding.min, bounding.max);\n\n if (boxt === undefined) {\n return [];\n }\n\n let mint: number | undefined;\n\n if (PGlobalState.getInstance().isEditorEnv) {\n this.subMeshes.forEach(prim => {\n const primt = prim.hitTesting(newOrigin, newDirection, worldMatrix, invWorldMatrix);\n\n if (primt !== undefined) {\n if (mint === undefined || mint > primt) {\n mint = primt;\n }\n }\n });\n } else {\n mint = boxt;\n }\n\n if (mint === undefined) {\n return [];\n }\n\n newDirection.multiply(mint);\n newOrigin.add(newDirection);\n worldMatrix.transformPoint(newOrigin);\n\n return [newOrigin];\n }\n\n /**\n * 计算包围盒,根据传入的世界矩阵\n * @param worldMatrix - 世界矩阵\n * @returns\n */\n computeBoundingBox (worldMatrix: Matrix4): Box3 {\n const box = this.boundingBox.makeEmpty();\n const inverseWorldMatrix = worldMatrix.clone().invert();\n\n this.subMeshes.forEach(prim => {\n const subbox = prim.computeBoundingBox(inverseWorldMatrix);\n\n box.union(subbox);\n });\n\n return box;\n }\n\n private getItemBoundingBox (inBounding?: ModelItemBounding) {\n if (inBounding === undefined) {\n return new Box3();\n }\n\n if (inBounding.type === spec.ModelBoundingType.box) {\n const center = inBounding.center ?? [0, 0, 0];\n const size = inBounding.size ?? [0, 0, 0];\n const c = Vector3.fromArray(center);\n const hs = Vector3.fromArray(size).multiply(0.5);\n const minVector = c.clone().subtract(hs);\n const maxVector = c.clone().add(hs);\n\n return new Box3(minVector, maxVector);\n } else {\n const center = inBounding.center ?? [0, 0, 0];\n const halfRadius = (inBounding.radius ?? 0) * 0.5;\n const c = Vector3.fromArray(center);\n const minVector = c.clone().subtract(halfRadius);\n const maxVector = c.clone().add(halfRadius);\n\n return new Box3(minVector, maxVector);\n }\n }\n\n /**\n * 获取父节点 id\n * @returns\n */\n getParentId (): string | undefined {\n return this.parentItemId;\n }\n\n /**\n * 是否有蒙皮\n */\n get hasSkin (): boolean {\n return this.skin !== undefined;\n }\n\n}\n\n/**\n * PSubMesh 类,负责 Sub Mesh相关的功能,支持骨骼动画和 PBR 渲染\n */\nexport class PSubMesh {\n /**\n * 宿主 Mesh,包含了当前 Primitive\n */\n private parent?: PMesh;\n private skin?: PSkin; // from owner mesh\n /**\n * Morph 动画状态数据,来自 Mesh 对象,这里不创建不删除\n */\n private morph?: PMorph;\n private geometry: PGeometry;\n private material: PMaterial;\n //\n private jointMatrixList?: Float32Array;\n private jointNormalMatList?: Float32Array;\n private jointMatrixTexture?: PAnimTexture;\n private jointNormalMatTexture?: PAnimTexture;\n /**\n * 名称\n */\n name = '';\n /**\n * 渲染优先级\n */\n effectsPriority = 0;\n /**\n * 包围盒\n */\n boundingBox = new Box3();\n /**\n * 是否压缩,模式不压缩\n */\n isCompressed = false;\n\n constructor (private engine: Engine) {\n\n }\n\n /**\n * 创建 Primitive 对象\n * @param data - Primitive 参数\n * @param parent - 所属 Mesh 对象\n */\n create (geometry: Geometry, material: Material, parent: PMesh) {\n this.parent = parent;\n this.skin = parent.skin;\n this.morph = parent.morph;\n this.setGeometry(geometry);\n this.setMaterial(material);\n this.name = parent.name;\n this.effectsPriority = parent.priority;\n this.geometry.setHide(parent.hide);\n\n if (this.skin !== undefined) {\n const jointCount = this.skin.maxJointCount;\n\n this.jointMatrixList = new Float32Array(jointCount * 16);\n this.jointNormalMatList = new Float32Array(jointCount * 16);\n if (this.skin.isTextureDataMode()) {\n const isHalfFloat = this.skin.textureDataMode === TextureDataMode.half_float;\n\n this.jointMatrixTexture = new PAnimTexture(this.engine);\n this.jointNormalMatTexture = new PAnimTexture(this.engine);\n this.jointMatrixTexture.create(jointCount, isHalfFloat, 'jointMatrixTexture');\n this.jointNormalMatTexture.create(jointCount, isHalfFloat, 'jointNormalMatTexture');\n }\n } else {\n if (this.geometry.hasWeights() || this.geometry.hasJoints()) {\n // 最近出现发布后模型动画没播出来问题,\n // 是因为导出后 skin 属性丢失导致,所以增加这个检查\n console.warn('Geometry has weight and/or joint array, but the skin is missing.');\n }\n }\n\n this.isCompressed = this.geometry.isCompressed();\n\n //if (PGlobalState.getInstance().isTiny3dMode) {\n // if (this._material.isAdditive || this._material.isTranslucent()) { this.mriPriority += 10000; }\n //}\n }\n\n /**\n * 创建 GE Mesh、Geometry 和 Material 对象,用于后面的渲染\n * @param lightCount - 灯光数目\n * @param skybox - 天空盒\n */\n build (lightCount: number, skybox?: PSkybox) {\n const globalState = PGlobalState.getInstance();\n const primitiveMacroList = this.getMacroList(lightCount, true, skybox);\n const materialMacroList = this.material.getMacroList(primitiveMacroList);\n\n let material: Material;\n const isWebGL2 = PGlobalState.getInstance().isWebGL2;\n\n if (this.material.effectMaterial) {\n material = this.material.effectMaterial;\n\n materialMacroList.forEach(macro => {\n const { name, value } = macro;\n\n material.enableMacro(name, value);\n });\n\n this.material.setMaterialStates(material);\n } else {\n material = Material.create(\n this.engine,\n {\n shader: {\n vertex: this.material.vertexShaderCode,\n fragment: this.material.fragmentShaderCode,\n shared: globalState.shaderShared,\n glslVersion: isWebGL2 ? GLSLVersion.GLSL3 : GLSLVersion.GLSL1,\n },\n }\n );\n this.material.setMaterialStates(material);\n }\n }\n\n // TODO: 待移除?\n private getFeatureList (lightCount: number, pbrPass: boolean, skybox?: PSkybox): string[] {\n const featureList: string[] = [];\n\n if (this.geometry.hasNormals()) {\n featureList.push('HAS_NORMALS 1');\n }\n if (this.geometry.hasTangents()) {\n featureList.push('HAS_TANGENTS 1');\n }\n if (this.geometry.hasUVCoords(1)) {\n featureList.push('HAS_UV_SET1 1');\n }\n if (this.geometry.hasUVCoords(2)) {\n featureList.push('HAS_UV_SET2 1');\n }\n\n if (this.morph !== undefined && this.morph.hasMorph()) {\n // 存在 Morph 动画,需要配置 Morph 动画相关的 Shader 宏定义\n // USE_MORPHING 是总开关,WEIGHT_COUNT 是 weights 数组长度(Shader)\n featureList.push('USE_MORPHING');\n featureList.push(`WEIGHT_COUNT ${this.morph.morphWeightsLength}`);\n for (let i = 0; i < this.morph.morphWeightsLength; i++) {\n if (this.morph.hasPositionMorph) {\n featureList.push(`HAS_TARGET_POSITION${i}`);\n }\n if (this.morph.hasNormalMorph) {\n featureList.push(`HAS_TARGET_NORMAL${i}`);\n }\n if (this.morph.hasTangentMorph) {\n featureList.push(`HAS_TARGET_TANGENT${i}`);\n }\n }\n }\n\n if (this.skin !== undefined) {\n featureList.push('USE_SKINNING 1');\n featureList.push(`JOINT_COUNT ${this.skin.getJointCount()}`);\n featureList.push('HAS_JOINT_SET1 1');\n featureList.push('HAS_WEIGHT_SET1 1');\n if (this.skin.textureDataMode) { featureList.push('USE_SKINNING_TEXTURE 1'); }\n }\n\n if (this.material.materialType !== PMaterialType.unlit) {\n // let hasLight = false;\n\n if (lightCount > 0 && this.geometry.hasNormals()) {\n // hasLight = true;\n featureList.push('USE_PUNCTUAL 1');\n featureList.push(`LIGHT_COUNT ${lightCount}`);\n }\n\n if (skybox !== undefined && skybox.available) {\n // hasLight = true;\n featureList.push('USE_IBL 1');\n featureList.push('USE_TEX_LOD 1');\n if (skybox.hasDiffuseImage) {\n // do nothing\n } else {\n featureList.push('IRRADIANCE_COEFFICIENTS 1');\n }\n }\n\n // if(!hasLight){\n // featureList.push('MATERIAL_UNLIT 1');\n // }\n }\n\n // 渲染中间结果输出,用于渲染效果调试,支持 pbr 和 unlit\n const renderMode = PGlobalState.getInstance().renderMode3D;\n const outputDefine = this.getRenderMode3DDefine(renderMode);\n\n if (outputDefine !== undefined) {\n featureList.push('DEBUG_OUTPUT 1');\n featureList.push(`${outputDefine} 1`);\n }\n\n return featureList;\n }\n\n private getMacroList (lightCount: number, pbrPass: boolean, skybox?: PSkybox): MacroInfo[] {\n const macroList: MacroInfo[] = [];\n\n if (this.geometry.hasNormals()) {\n macroList.push({ name: 'HAS_NORMALS' });\n }\n if (this.geometry.hasTangents()) {\n macroList.push({ name: 'HAS_TANGENTS' });\n }\n if (this.geometry.hasUVCoords(1)) {\n macroList.push({ name: 'HAS_UV_SET1' });\n }\n if (this.geometry.hasUVCoords(2)) {\n macroList.push({ name: 'HAS_UV_SET2' });\n }\n\n if (this.morph !== undefined && this.morph.hasMorph()) {\n // 存在 Morph 动画,需要配置 Morph 动画相关的 Shader 宏定义\n // USE_MORPHING 是总开关,WEIGHT_COUNT 是 weights 数组长度(Shader)\n macroList.push({ name: 'USE_MORPHING' });\n macroList.push({ name: 'WEIGHT_COUNT', value: this.morph.morphWeightsLength });\n for (let i = 0; i < this.morph.morphWeightsLength; i++) {\n if (this.morph.hasPositionMorph) {\n macroList.push({ name: `HAS_TARGET_POSITION${i}` });\n }\n if (this.morph.hasNormalMorph) {\n macroList.push({ name: `HAS_TARGET_NORMAL${i}` });\n }\n if (this.morph.hasTangentMorph) {\n macroList.push({ name: `HAS_TARGET_TANGENT${i}` });\n }\n }\n }\n\n if (this.skin !== undefined) {\n macroList.push({ name: 'USE_SKINNING' });\n macroList.push({ name: 'JOINT_COUNT', value: this.skin.maxJointCount });\n macroList.push({ name: 'HAS_JOINT_SET1' });\n macroList.push({ name: 'HAS_WEIGHT_SET1' });\n if (this.skin.textureDataMode) {\n macroList.push({ name: 'USE_SKINNING_TEXTURE' });\n }\n }\n\n if (this.material.materialType !== PMaterialType.unlit) {\n if (lightCount > 0 && this.geometry.hasNormals()) {\n macroList.push({ name: 'USE_PUNCTUAL' });\n macroList.push({ name: 'LIGHT_COUNT', value: lightCount });\n }\n\n if (skybox !== undefined && skybox.available) {\n macroList.push({ name: 'USE_IBL' });\n macroList.push({ name: 'USE_TEX_LOD' });\n if (skybox.hasDiffuseImage) {\n // do nothing\n } else {\n macroList.push({ name: 'IRRADIANCE_COEFFICIENTS' });\n }\n }\n\n // if(!hasLight){\n // featureList.push('MATERIAL_UNLIT 1');\n // }\n }\n\n // 渲染中间结果输出,用于渲染效果调试,支持 pbr 和 unlit\n const renderMode = PGlobalState.getInstance().renderMode3D;\n const outputDefine = this.getRenderMode3DDefine(renderMode);\n\n if (outputDefine !== undefined) {\n macroList.push({ name: 'DEBUG_OUTPUT' });\n macroList.push({ name: outputDefine });\n }\n\n return macroList;\n }\n\n /**\n * 销毁,需要释放创建的 GE 对象\n */\n dispose () {\n // @ts-expect-error\n this.engine = null;\n this.parent = undefined;\n this.skin = undefined;\n this.morph = undefined;\n this.geometry.dispose();\n this.material.dispose();\n //\n this.jointMatrixList = undefined;\n this.jointNormalMatList = undefined;\n this.jointMatrixTexture?.dispose();\n this.jointMatrixTexture = undefined;\n this.jointNormalMatTexture?.dispose();\n this.jointNormalMatTexture = undefined;\n }\n\n /**\n * 更新内部 GE 材质着色器 Uniform 数据,根据场景状态\n * @param worldMatrix - 世界矩阵\n * @param nomralMatrix - 法线矩阵\n * @param sceneStates - 场景状态\n */\n updateMaterial (worldMatrix: Matrix4, nomralMatrix: Matrix4, sceneStates: PSceneStates) {\n this.updateUniformsByAnimation(worldMatrix, nomralMatrix);\n this.updateUniformsByScene(sceneStates);\n this.material.updateUniforms(this.getEffectsMaterial());\n }\n\n /**\n * 点击测试,先进行简单的包围合测试,然后再计算精准的点击测试,这个测试非常耗时不要在移动端上使用\n * @param newOrigin - 射线原点\n * @param newDirection - 射线方向\n * @param worldMatrix - 世界矩阵\n * @param invWorldMatrix - 逆世界矩阵\n * @returns 射线的 t 参数\n */\n hitTesting (newOrigin: Vector3, newDirection: Vector3, worldMatrix: Matrix4, invWorldMatrix: Matrix4) {\n const bounding = this.boundingBox;\n const boxt = RayBoxTesting(newOrigin, newDirection, bounding.min, bounding.max);\n const bindMatrices: Matrix4[] = [];\n\n if (boxt === undefined) {\n return;\n }\n\n if (this.skin !== undefined) {\n const animMatrices = this.skin.animationMatrices;\n\n animMatrices.forEach(mat => {\n bindMatrices.push(new Matrix4().multiplyMatrices(invWorldMatrix, mat));\n });\n }\n\n const proxy = new HitTestingProxy();\n const doubleSided = this.material.isBothSide();\n\n proxy.create(this.geometry.geometry, doubleSided, bindMatrices);\n\n return proxy.getHitPoint(newOrigin, newDirection);\n }\n\n /**\n * 计算包围盒\n * @param inverseWorldMatrix - 逆世界矩阵\n * @returns\n */\n computeBoundingBox (inverseWorldMatrix: Matrix4): Box3 {\n if (this.skin === undefined && !this.boundingBox.isEmpty()) {\n // 包围盒缓存了,直接返回计算的结果\n return this.boundingBox;\n }\n\n // 重新计算包围盒\n const bindMatrices: Matrix4[] = [];\n\n if (this.skin !== undefined) {\n const animMatrices = this.skin.animationMatrices;\n\n animMatrices.forEach(mat => {\n bindMatrices.push(new Matrix4().multiplyMatrices(inverseWorldMatrix, mat));\n });\n }\n\n const proxy = new GeometryBoxProxy();\n\n proxy.create(this.geometry.geometry, bindMatrices);\n\n return proxy.getBoundingBox(this.boundingBox);\n }\n\n /**\n * 渲染输出模式转成着色器中的宏定义\n * @param mode - 渲染输出模式\n * @returns 返回相应的宏定义\n */\n getRenderMode3DDefine (mode: spec.RenderMode3D): string | undefined {\n switch (mode) {\n case spec.RenderMode3D.uv:\n return 'DEBUG_UV';\n case spec.RenderMode3D.normal:\n return 'DEBUG_NORMAL';\n case spec.RenderMode3D.basecolor:\n return 'DEBUG_BASECOLOR';\n case spec.RenderMode3D.alpha:\n return 'DEBUG_ALPHA';\n case spec.RenderMode3D.metallic:\n return 'DEBUG_METALLIC';\n case spec.RenderMode3D.roughness:\n return 'DEBUG_ROUGHNESS';\n case spec.RenderMode3D.ao:\n return 'DEBUG_OCCLUSION';\n case spec.RenderMode3D.emissive:\n return 'DEBUG_EMISSIVE';\n case spec.RenderMode3D.diffuse:\n return 'DEBUG_DIFFUSE';\n }\n }\n\n private updateUniformsByAnimation (worldMatrix: Matrix4, normalMatrix: Matrix4) {\n const material = this.getEffectsMaterial();\n\n material.setMatrix('_NormalMatrix', normalMatrix);\n //\n const skin = this.skin;\n\n if (skin !== undefined) {\n const jointMatrixList = this.jointMatrixList as Float32Array;\n const jointNormalMatList = this.jointNormalMatList as Float32Array;\n\n skin.computeMeshAnimMatrices(worldMatrix, jointMatrixList, jointNormalMatList);\n if (skin.textureDataMode) {\n const jointMatrixTexture = this.jointMatrixTexture as PAnimTexture;\n const jointNormalMatTexture = this.jointNormalMatTexture as PAnimTexture;\n\n jointMatrixTexture.update(jointMatrixList);\n jointNormalMatTexture.update(jointNormalMatList);\n material.setTexture('_jointMatrixSampler', jointMatrixTexture.getTexture());\n material.setTexture('_jointNormalMatrixSampler', jointNormalMatTexture.getTexture());\n } else {\n const jointMatrixNumbers: number[] = [];\n const jointNormalMatNumbers: number[] = [];\n\n jointMatrixList.forEach(val => jointMatrixNumbers.push(val));\n jointNormalMatList.forEach(val => jointNormalMatNumbers.push(val));\n material.setMatrixNumberArray('_jointMatrix', jointMatrixNumbers);\n material.setMatrixNumberArray('_jointNormalMatrix', jointNormalMatNumbers);\n }\n }\n\n // Morph 相关的数据更新,仅需要更新 weights 数组\n const morph = this.morph;\n\n if (morph !== undefined && morph.hasMorph()) {\n const morphWeights = morph.morphWeightsArray.slice();\n\n material.setFloats('_morphWeights', morphWeights);\n }\n }\n\n private updateUniformsByScene (sceneStates: PSceneStates) {\n const material = this.getEffectsMaterial();\n\n material.setVector3('_Camera', sceneStates.cameraPosition);\n //\n if (!this.isUnlitMaterial()) {\n const { maxLightCount, lightList, inverseViewMatrix } = sceneStates;\n\n for (let i = 0; i < maxLightCount; i++) {\n if (i < lightList.length) {\n const light = lightList[i];\n const intensity = light.visible ? light.intensity : 0;\n\n if (light.followCamera) {\n const newDirection = inverseViewMatrix.transformNormal(light.getWorldDirection(), new Vector3());\n const newPosition = inverseViewMatrix.transformPoint(light.getWorldPosition(), new Vector3());\n\n material.setVector3(`_Lights[${i}].direction`, newDirection);\n material.setVector3(`_Lights[${i}].position`, newPosition);\n } else {\n material.setVector3(`_Lights[${i}].direction`, light.getWorldDirection());\n material.setVector3(`_Lights[${i}].position`, light.getWorldPosition());\n }\n material.setFloat(`_Lights[${i}].range`, light.range);\n material.setVector3(`_Lights[${i}].color`, light.color);\n material.setFloat(`_Lights[${i}].intensity`, intensity);\n material.setFloat(`_Lights[${i}].innerConeCos`, Math.cos(light.innerConeAngle));\n material.setFloat(`_Lights[${i}].outerConeCos`, Math.cos(light.outerConeAngle));\n material.setInt(`_Lights[${i}].type`, light.lightType);\n material.setVector2(`_Lights[${i}].padding`, light.padding);\n } else {\n material.setVector3(`_Lights[${i}].direction`, Vector3.ZERO);\n material.setFloat(`_Lights[${i}].range`, 0);\n material.setVector3(`_Lights[${i}].color`, Vector3.ZERO);\n material.setFloat(`_Lights[${i}].intensity`, 0);\n material.setVector3(`_Lights[${i}].position`, Vector3.ZERO);\n material.setFloat(`_Lights[${i}].innerConeCos`, 0);\n material.setFloat(`_Lights[${i}].outerConeCos`, 0);\n material.setInt(`_Lights[${i}].type`, 99999);\n material.setVector2(`_Lights[${i}].padding`, Vector2.ZERO);\n }\n }\n\n const skybox = sceneStates.skybox;\n\n if (skybox !== undefined && skybox.available) {\n material.setVector2('_IblIntensity', new Vector2(skybox.currentIntensity, skybox.currentReflectionsIntensity));\n material.setTexture('_brdfLUT', skybox.brdfLUT as Texture);\n if (skybox.diffuseImage !== undefined) {\n material.setTexture('_DiffuseEnvSampler', skybox.diffuseImage);\n } else {\n const coeffs = skybox.irradianceCoeffs as number[][];\n const aliasName = ['l00', 'l1m1', 'l10', 'l11', 'l2m2', 'l2m1', 'l20', 'l21', 'l22'];\n\n aliasName.forEach((n, i) => {\n material.setVector3(`_shCoefficients.${n}`, Vector3.fromArray(coeffs[i] as spec.vec3));\n });\n }\n material.setInt('_MipCount', skybox.specularMipCount - 1);\n material.setTexture('_SpecularEnvSampler', skybox.specularImage);\n }\n }\n }\n\n /**\n * 是否有蒙皮\n * @returns\n */\n hasSkin (): boolean {\n return this.skin !== undefined;\n }\n\n /**\n * 获取 GE 几何体\n * @returns\n */\n getEffectsGeometry (): Geometry {\n return this.geometry.geometry;\n }\n\n /**\n * 设置几何体\n * @param val - 插件或 GE 几何体\n */\n setGeometry (val: PGeometry | Geometry) {\n if (val instanceof PGeometry) {\n this.geometry = val;\n } else {\n this.geometry = new PGeometry(val);\n }\n }\n\n /**\n * 设置材质\n * @param val - 插件材质对象或材质参数\n */\n setMaterial (val: PMaterial | Material) {\n if (val instanceof PMaterialUnlit) {\n this.material = val;\n } else if (val instanceof PMaterialPBR) {\n this.material = val;\n } else {\n this.material = createPluginMaterial(val);\n }\n }\n\n /**\n * 获取 GE 材质\n * @returns\n */\n getEffectsMaterial (): Material {\n return this.material.effectMaterial;\n }\n\n /**\n * 是否无光照材质\n * @returns\n */\n isUnlitMaterial (): boolean {\n return this.material.materialType === PMaterialType.unlit;\n }\n\n /**\n * 是否有 Morph 动画:\n * 需要注意 Morph 对象存在,但还是没有 Morph 动画的情况\n * @returns 返回是否有 Morph 动画\n */\n hasMorph (): boolean {\n if (this.morph === undefined) {\n return false;\n }\n\n return this.morph.hasMorph();\n }\n\n /**\n * 获取世界坐标下的包围盒\n * @returns\n */\n getWorldBoundingBox (): Box3 {\n if (this.parent === undefined) {\n if (this.boundingBox.isEmpty()) {\n this.computeBoundingBox(Matrix4.fromIdentity());\n }\n\n return this.boundingBox;\n } else {\n const matrix = this.parent.matrix;\n\n if (this.boundingBox.isEmpty()) {\n this.computeBoundingBox(matrix.clone().invert());\n }\n\n return this.boundingBox.clone().applyMatrix4(matrix);\n }\n }\n}\n\n/**\n * 3D 几何类\n */\nexport class PGeometry {\n /**\n * 属性名称数组\n */\n attributeNames: string[];\n\n /**\n * 创建 3D 几何体,根据 GE 几何体\n * @param geometry - GE 几何体\n */\n constructor (public geometry: Geometry) {\n this.attributeNames = geometry.getAttributeNames();\n }\n\n /**\n * 销毁\n */\n dispose () {\n // @ts-expect-error\n this.geometry = undefined;\n this.attributeNames = [];\n }\n\n /**\n * 是否有某个属性\n * @param name - 属性名\n * @returns\n */\n hasAttribute (name: string): boolean {\n const index = this.attributeNames.findIndex(item => {\n return item === name;\n });\n\n return index !== -1;\n }\n\n /**\n * 设置隐藏,通过修改几何体中的渲染数目\n * @param hide - 隐藏值\n */\n setHide (hide: boolean) {\n const geomExt = this.geometry as GeometryExt;\n\n if (geomExt.getDrawCount() === 0) {\n const indexArray = geomExt.getIndexData();\n\n if (indexArray !== undefined) {\n geomExt.setDrawCount(indexArray.length);\n }\n }\n if (hide) {\n if (geomExt.getDrawCount() >= 0) {\n geomExt.setDrawCount(-geomExt.getDrawCount());\n }\n } else {\n if (geomExt.getDrawCount() < 0) {\n geomExt.setDrawCount(-geomExt.getDrawCount());\n }\n }\n }\n\n /**\n * 是否压缩格式\n * @returns\n */\n isCompressed (): boolean {\n const positionAttrib = this.geometry.getAttributeData('aPos');\n\n if (positionAttrib === undefined) {\n return false;\n }\n\n // FIXME: get attributes from geometry\n //return positionAttrib.normalize === true;\n return false;\n }\n\n /**\n * 是否有位置属性\n * @returns\n */\n hasPositions (): boolean {\n return this.hasAttribute('aPos');\n }\n\n /**\n * 是否有法线属性\n * @returns\n */\n hasNormals (): boolean {\n return this.hasAttribute('aNormal');\n }\n\n /**\n * 是否有切线属性\n * @returns\n */\n hasTangents (): boolean {\n return this.hasAttribute('aTangent');\n }\n\n /**\n * 是否有纹理坐标属性\n * @param index - 纹理坐标索引\n * @returns\n */\n hasUVCoords (index: number): boolean {\n if (index === 1) {\n return this.hasAttribute('aUV');\n } else {\n return this.hasAttribute(`aUV${index}`);\n }\n }\n\n /**\n * 是否有颜色属性\n * @returns\n */\n hasColors (): boolean {\n return this.hasAttribute('aColor');\n }\n\n /**\n * 是否有关节点属性\n * @returns\n */\n hasJoints (): boolean {\n return this.hasAttribute('aJoints');\n }\n\n /**\n * 是否有权重属性\n * @returns\n */\n hasWeights (): boolean {\n return this.hasAttribute('aWeights');\n }\n}\n\nclass EffectsMeshProxy {\n data: ModelMeshComponentData;\n geometry: Geometry;\n rootBoneItem: VFXItem;\n morphObj: PMorph;\n\n constructor (\n public itemData: ModelMeshComponentData,\n public parentComponent: ModelMeshComponent,\n public parentItem?: VFXItem,\n ) {\n this.data = itemData;\n this.geometry = itemData.geometry as unknown as Geometry;\n this.rootBoneItem = itemData.rootBone as unknown as VFXItem;\n\n const morphObj = new PMorph();\n\n if (morphObj.create(this.geometry)) {\n // 设置初始权重数组\n if (itemData.morph?.weights) {\n morphObj.initWeights(itemData.morph?.weights);\n }\n\n this.morphObj = morphObj;\n }\n }\n\n hasMorphTarget (): boolean {\n return this.morphObj.hasMorph();\n }\n\n /**\n * 返回 Morph 对象\n * 需要先判断是否有 Morph 动画,如果没有就直接返回 undefined\n *\n * @returns 缓存的 Morph 对象,或者 undefined\n */\n getMorphObj (): PMorph | undefined {\n if (!this.hasMorphTarget()) {\n return;\n }\n\n return this.morphObj;\n }\n\n isHide (): boolean {\n return this.data.hide === true;\n }\n\n getParentIndex (): number {\n return -1;\n }\n\n getGeometry () {\n return this.data.geometry;\n }\n\n getMaterials () {\n return this.data.materials;\n }\n\n getMaterialCount () {\n return this.data.materials.length;\n }\n\n hasSkin (): boolean {\n const skin = this.geometry.getSkinProps();\n\n return !!(skin.rootBoneName && skin.boneNames && skin.inverseBindMatrices && this.rootBoneItem);\n }\n\n getSkinOpts () {\n return this.geometry.getSkinProps();\n }\n\n getSkinObj (engine: Engine): PSkin | undefined {\n const skin = this.getSkinOpts();\n\n if (skin.rootBoneName && skin.boneNames && skin.inverseBindMatrices && this.rootBoneItem) {\n const skinObj = new PSkin();\n const maxJointCount = this.parentComponent.sceneManager?.maxJointCount ?? 0;\n\n skinObj.create(skin, engine, this.rootBoneItem, maxJointCount);\n\n return skinObj;\n }\n\n return undefined;\n }\n}\n\nexport interface MacroInfo {\n name: string,\n value?: boolean | number,\n}\n\ninterface GeometryExt extends Geometry {\n newDrawCount?: number,\n}\n","function _assert_this_initialized(self) {\n if (self === void 0) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n\n return self;\n}\nexport { _assert_this_initialized as _ };\n","import type { Mesh, Renderer, Texture, Engine, math, CameraOptionsEx } from '@galacean/effects';\nimport { Transform, spec, addItem, removeItem, PLAYER_OPTIONS_ENV_EDITOR } from '@galacean/effects';\nimport { PMesh } from './mesh';\nimport type { PCamera } from './camera';\nimport { PCameraManager } from './camera';\nimport { PLight, PLightManager } from './light';\nimport type { Vector3 } from './math';\nimport { Matrix4, Box3 } from './math';\nimport { PSkybox } from './skybox';\nimport { PTransform, PGlobalState, PObjectType } from './common';\nimport type { CompositionCache } from './cache';\nimport type { PEntity } from './object';\nimport { WebGLHelper } from '../utility/plugin-helper';\nimport { TwoStatesSet } from '../utility/ts-helper';\nimport type { ModelMeshComponent } from '../plugin';\n\ntype Box3 = math.Box3;\ntype Vector2 = math.Vector2;\n\n/**\n * 场景参数接口,初始化场景对象时使用\n */\nexport interface PSceneOptions {\n /**\n * 合成名称\n */\n componentName: string,\n /**\n * 渲染器\n */\n renderer: Renderer,\n /**\n * 场景缓存\n */\n sceneCache: CompositionCache,\n /**\n * 是否只渲染线框\n */\n wireframeOnly?: boolean,\n /**\n * 运行时环境\n */\n runtimeEnv?: string,\n /**\n * 兼容模式\n */\n compatibleMode?: string,\n /**\n * 是否可视化包围盒\n */\n visBoundingBox?: boolean,\n /**\n * 是否动态排序\n */\n enableDynamicSort?: boolean,\n /**\n * 3D 渲染模式\n */\n renderMode3D?: spec.RenderMode3D,\n /**\n * 3D 渲染模式中棋盘格大小\n */\n renderMode3DUVGridSize?: number,\n /**\n * 是否渲染天空盒\n */\n renderSkybox: boolean,\n /**\n * 灯光元素数目\n */\n lightItemCount: number,\n /**\n * 最大骨骼数目\n */\n maxJointCount: number,\n}\n\n/**\n * 场景状态接口,每次场景管理器 Tick 时都会生成\n */\nexport interface PSceneStates {\n /**\n * 时间间隔\n */\n deltaSeconds: number,\n /**\n * 相机对象\n */\n camera: PCamera,\n /**\n * 相机位置\n */\n cameraPosition: Vector3,\n /**\n * 相机矩阵\n */\n viewMatrix: Matrix4,\n /**\n * 逆相机矩阵\n */\n inverseViewMatrix: Matrix4,\n /**\n * 投影矩阵\n */\n projectionMatrix: Matrix4,\n /**\n * 相机投影矩阵\n */\n viewProjectionMatrix: Matrix4,\n /**\n * 画布大小\n */\n winSize: Vector2,\n /**\n * 场景半径\n */\n sceneRadius: number,\n // for shadow\n shadowMapSizeInv?: Vector2,\n lightViewMatrix?: Matrix4,\n lightProjectionMatrix?: Matrix4,\n lightViewProjectionMatrix?: Matrix4,\n /**\n * 灯光对象列表\n */\n lightList: PLight[],\n /**\n * 最大灯光数目\n */\n maxLightCount: number,\n /**\n * 最大骨骼数目\n */\n maxJointCount: number,\n /**\n * 天空盒对象\n */\n skybox?: PSkybox,\n}\n\n/**\n * 场景管理类,如果存在 Model 插件中的元素才会创建\n */\nexport class PSceneManager {\n /**\n * 合成名称\n */\n compName: string;\n /**\n * 实体列表\n */\n itemList: PEntity[];\n /**\n * Mesh 列表\n */\n meshList: PMesh[];\n /**\n * 灯光管理器\n */\n lightManager: PLightManager;\n /**\n * 相机管理器\n */\n cameraManager: PCameraManager;\n /**\n * 是否动态排序 Mesh 渲染优先级\n * 默认 false,需要和 Tiny 对齐时为 true\n */\n enableDynamicSort: boolean;\n /**\n * IBL 渲染时的 BRDF 查询纹理\n */\n brdfLUT?: Texture;\n /**\n * 天空盒\n */\n skybox?: PSkybox;\n /**\n * Tick 次数\n */\n tickCount: number;\n /**\n * 最近 Tick 时间\n */\n lastTickSecond: number;\n /**\n * 当前场景包围盒缓存,在阴影渲染中使用\n */\n sceneAABBCache: Box3;\n /**\n * 场景前帧和当前帧渲染的 Mesh 集合\n */\n renderedMeshSet: TwoStatesSet<Mesh>;\n /**\n * 最多灯光数目\n */\n maxLightCount = 16;\n /**\n * 最大骨骼数目\n */\n maxJointCount = 0;\n /**\n * 场景状态\n */\n sceneStates: PSceneStates;\n\n private renderer?: Renderer;\n private sceneCache?: CompositionCache;\n private parentId2Mesh: Map<string, PMesh>;\n private renderSkybox = false;\n\n private engine: Engine;\n\n constructor (engine: Engine) {\n this.compName = 'SceneManger';\n this.itemList = [];\n this.meshList = [];\n this.engine = engine;\n this.lightManager = new PLightManager();\n this.cameraManager = new PCameraManager();\n this.parentId2Mesh = new Map();\n //\n this.enableDynamicSort = false;\n this.tickCount = 0;\n this.lastTickSecond = -1;\n //\n this.sceneAABBCache = new Box3();\n this.renderedMeshSet = new TwoStatesSet();\n }\n\n /**\n * 初始化场景管理器,设置全局状态\n * @param opts - 场景参数\n */\n initial (opts: PSceneOptions) {\n this.clean();\n this.compName = opts.componentName;\n this.renderer = opts.renderer;\n this.engine = opts.renderer.engine;\n this.sceneCache = opts.sceneCache;\n this.enableDynamicSort = opts.enableDynamicSort === true;\n this.renderSkybox = opts.renderSkybox;\n this.maxLightCount = opts.lightItemCount;\n this.maxJointCount = opts.maxJointCount;\n this.cameraManager.initial(this.renderer.getWidth(), this.renderer.getHeight());\n this.brdfLUT = this.sceneCache.getBrdfLutTexture();\n this.initGlobalState(opts);\n\n if (this.maxLightCount > 8) {\n console.warn(`Too many light items: ${this.maxLightCount} light(s).`);\n }\n }\n\n private initGlobalState (opts: PSceneOptions) {\n const capbility = this.engine.gpuCapability;\n const globalState = PGlobalState.getInstance();\n\n globalState.reset();\n globalState.isWebGL2 = capbility.level === 2;\n //globalState.shaderShared = composition.env === PLAYER_OPTIONS_ENV_EDITOR;\n globalState.runtimeEnv = opts.runtimeEnv ?? PLAYER_OPTIONS_ENV_EDITOR;\n globalState.compatibleMode = opts.compatibleMode ?? 'gltf';\n globalState.visBoundingBox = opts.visBoundingBox ?? false;\n globalState.renderMode3D = opts.renderMode3D ?? spec.RenderMode3D.none;\n globalState.renderMode3DUVGridSize = opts.renderMode3DUVGridSize ?? 1 / 16;\n }\n\n private clean () {\n this.dispose();\n //\n this.compName = '';\n this.renderer = undefined;\n this.sceneCache = undefined;\n this.itemList = [];\n this.meshList = [];\n\n this.lightManager = new PLightManager();\n this.cameraManager = new PCameraManager();\n this.parentId2Mesh = new Map();\n this.brdfLUT = undefined;\n this.skybox = undefined;\n this.lastTickSecond = -1;\n //\n this.tickCount = 0;\n this.renderedMeshSet = new TwoStatesSet();\n }\n\n /**\n * 销毁,需要销毁各种管理器和创建的 WebGL 资源\n */\n dispose () {\n this.itemList.forEach(item => item.dispose());\n this.itemList = [];\n this.meshList.forEach(mesh => mesh.dispose());\n this.meshList = [];\n this.lightManager.dispose();\n this.cameraManager.dispose();\n this.brdfLUT = undefined;\n this.skybox?.dispose();\n this.skybox = undefined;\n this.renderedMeshSet.clear();\n //\n this.renderer = undefined;\n this.sceneCache = undefined;\n // @ts-expect-error\n this.engine = undefined;\n this.parentId2Mesh.clear();\n }\n\n /**\n * 添加插件元素到场景中\n * @param item - 插件元素\n */\n addItem (item: PMesh | PCamera | PLight | PSkybox) {\n if (item instanceof PMesh) {\n const mesh = item;\n\n if (mesh.parentItemId !== undefined) {\n this.parentId2Mesh.set(mesh.parentItemId, mesh);\n }\n\n addItem(this.meshList, mesh);\n } else if (item instanceof PSkybox) {\n const skybox = item;\n\n skybox.setup(this.brdfLUT);\n if (!this.renderSkybox) {\n // renderable会控制天空盒是否作为背景渲染,来自用户(编辑器)的输入\n // this.renderSkybox是播放时候的控制参数。\n // -- 如果是false,会强制天空不渲染。\n // -- 如果是true,会按照用户设置来渲染天空盒。\n skybox.renderable = false;\n }\n this.skybox = skybox;\n } else if (item instanceof PLight) {\n this.lightManager.insertLight(item);\n } else {\n this.cameraManager.insertCamera(item);\n }\n\n addItem(this.itemList, item);\n }\n\n /**\n * 从场景中删除插件元素\n * @param item - 插件元素\n */\n removeItem (item: PMesh | PCamera | PLight | PSkybox) {\n if (item instanceof PMesh) {\n const mesh = item;\n\n if (mesh.parentItemId !== undefined) {\n this.parentId2Mesh.delete(mesh.parentItemId);\n }\n\n removeItem(this.meshList, mesh);\n } else if (item instanceof PSkybox) {\n this.skybox = undefined;\n } else if (item instanceof PLight) {\n this.lightManager.remove(item);\n } else {\n this.cameraManager.remove(item);\n }\n\n removeItem(this.itemList, item);\n }\n\n /**\n * 更新默认相机状态,根据传入的相机参数\n * @param camera - 相机参数\n */\n updateDefaultCamera (camera: CameraOptionsEx, viewportMatrix: Matrix4) {\n const effectsTransfrom = new Transform({\n ...camera,\n valid: true,\n });\n\n const newTransform = new PTransform().fromEffectsTransform(effectsTransfrom);\n\n this.cameraManager.updateDefaultCamera(\n camera.fov,\n viewportMatrix,\n camera.aspect,\n camera.near,\n camera.far,\n newTransform.getPosition(),\n newTransform.getRotation(),\n camera.clipMode,\n );\n }\n\n /**\n * 更新插件场景,需要更新内部的相关的插件对象,特别是 Mesh 对象的骨骼动画\n * 并将需要渲染的对象添加到渲染对象集合中\n * @param deltaTime - 更新间隔\n */\n tick (deltaTime: number) {\n const deltaSeconds = deltaTime;\n const camera = this.activeCamera;\n const viewMatrix = camera.viewMatrix;\n const projectionMatrix = camera.projectionMatrix;\n const viewProjectionMatrix = projectionMatrix.clone().multiply(viewMatrix);\n\n this.sceneStates = {\n deltaSeconds: deltaSeconds,\n //\n camera: camera,\n cameraPosition: camera.getEye(),\n viewMatrix: viewMatrix,\n inverseViewMatrix: viewMatrix.clone().invert(),\n projectionMatrix: projectionMatrix,\n viewProjectionMatrix: viewProjectionMatrix,\n winSize: camera.getSize(),\n sceneRadius: 1.0,\n //\n lightList: this.lightManager.lightList,\n maxLightCount: this.maxLightCount,\n maxJointCount: this.maxJointCount,\n skybox: this.skybox,\n };\n\n if (this.enableDynamicSort) {\n this.dynamicSortMeshes(this.sceneStates);\n }\n\n this.tickCount += 1;\n this.lastTickSecond += deltaSeconds;\n }\n\n /**\n * 动态调整 Mesh 渲染优先级\n * 主要是为了和 Tiny 渲染对齐,正常渲染不进行调整\n * @param states - 场景中的状态数据\n */\n dynamicSortMeshes (states: PSceneStates) {\n const meshComponents: ModelMeshComponent[] = [];\n const priorityList: number[] = [];\n\n this.meshList.forEach(mesh => {\n if (mesh.owner && mesh.owner.enabled) {\n const component = mesh.owner;\n\n meshComponents.push(component);\n priorityList.push(component.priority);\n }\n });\n\n priorityList.sort((a, b) => a - b);\n\n // 按照 Tiny 排序算法,对 Mesh 对象进行排序\n // 将透明和不透明物体拆开,从而渲染正确\n const viewMatrix = states.viewMatrix;\n\n meshComponents.sort((a: ModelMeshComponent, b: ModelMeshComponent) => {\n const atransparent = WebGLHelper.isTransparentMesh(a);\n const btransparent = WebGLHelper.isTransparentMesh(b);\n\n if (atransparent && btransparent) {\n const aposition = a.transform.getWorldPosition();\n const bposition = b.transform.getWorldPosition();\n const anewPos = viewMatrix.transformPoint(aposition);\n const bnewPos = viewMatrix.transformPoint(bposition);\n\n if (anewPos.z === bnewPos.z) { return a.priority - b.priority; } else { return anewPos.z - bnewPos.z; }\n } else if (atransparent) {\n return 1;\n } else if (btransparent) {\n return -1;\n } else {\n return a.priority - b.priority;\n }\n });\n\n let prePriority = -99999;\n\n // 重新赋值渲染优先级\n for (let i = 0; i < meshComponents.length; i++) {\n const mesh = meshComponents[i];\n const priority = priorityList[i];\n\n if (prePriority < priority) {\n prePriority = priority;\n mesh.priority = priority;\n } else {\n prePriority += 0.1;\n mesh.priority = prePriority;\n }\n }\n }\n\n /**\n * 查询场景中的 Mesh\n * 通过 parentId 查询 Mesh 对象,可能找不到 Mesh 对象\n * @param parentId - Item 中定义的 parentId\n * @returns 查询到的 PMesh,或者是没找到。如果 Mesh 不可见,也是没找到。\n */\n queryMesh (parentId: string): PMesh | undefined {\n const mesh = this.parentId2Mesh.get(parentId);\n\n if (mesh === undefined || !mesh.visible) {\n return;\n }\n\n return mesh;\n }\n\n /**\n * 获取场景的包围盒\n * @param box - 包围盒\n * @returns 场景的包围盒\n */\n getSceneAABB (box?: Box3): Box3 {\n const sceneBox = box ?? new Box3();\n\n this.itemList.forEach(item => {\n if (item.type === PObjectType.mesh) {\n const mesh = item as PMesh;\n\n if (mesh.owner) {\n const transform = mesh.owner.item.getWorldTransform();\n const worldMatrix = transform.getWorldMatrix();\n const meshBox = mesh.computeBoundingBox(worldMatrix);\n\n meshBox.applyMatrix4(worldMatrix);\n sceneBox.union(meshBox);\n } else {\n sceneBox.union(mesh.computeBoundingBox(Matrix4.fromIdentity()));\n }\n }\n });\n\n return sceneBox;\n }\n\n printDebugInfo () {\n console.info('@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@');\n console.info('@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@');\n this.meshList.forEach((mesh, index) => {\n console.info('Mesh: ', index, mesh);\n });\n this.cameraManager.getCameraList().forEach((cam, index) => {\n console.info('Camera: ', index, cam);\n });\n console.info('Default Camera: ', this.cameraManager.getDefaultCamera());\n this.lightManager.lightList.forEach((light, index) => {\n console.info('Light: ', index, light);\n });\n console.info('@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@');\n console.info('@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@');\n }\n\n /**\n * 获取渲染器\n * @returns\n */\n getRenderer (): Renderer {\n return this.renderer as Renderer;\n }\n\n /**\n * 获取场景中缓存\n * @returns\n */\n getSceneCache (): CompositionCache {\n return this.sceneCache as CompositionCache;\n }\n\n /**\n * 获取激活的相机\n */\n get activeCamera (): PCamera {\n return this.cameraManager.getActiveCamera();\n }\n\n /**\n * 获取灯光数目\n */\n get lightCount (): number {\n return this.lightManager.lightCount;\n }\n\n /**\n * 获取着色器灯光数目,最小是 10\n */\n get shaderLightCount (): number {\n return Math.min(10, this.lightManager.lightCount);\n }\n}\n\n","import type {\n Scene, SceneLoadOptions, Composition, RenderFrame, Engine, Component, Renderer,\n} from '@galacean/effects';\nimport {\n VFXItem, AbstractPlugin, spec, Behaviour, PLAYER_OPTIONS_ENV_EDITOR, effectsClass,\n GLSLVersion, Geometry,\n} from '@galacean/effects';\nimport {\n CompositionCache, PTransform, PSceneManager, PCoordinate, PBRShaderGUID,\n UnlitShaderGUID, DEG2RAD, Matrix4, Vector3,\n} from '../runtime';\nimport { VFX_ITEM_TYPE_3D } from './const';\nimport { ModelCameraComponent, ModelLightComponent, ModelMeshComponent } from './model-item';\nimport { fetchPBRShaderCode, fetchUnlitShaderCode, PluginHelper } from '../utility';\n\n/**\n * Model 插件类,负责支持播放器中的 3D 功能\n */\nexport class ModelPlugin extends AbstractPlugin {\n /**\n * 插件名称\n */\n override name = 'model';\n /**\n * 合成缓存器\n */\n cache: CompositionCache;\n /**\n * 场景参数\n */\n sceneParams: Record<string, any>;\n\n /**\n * 整个 load 阶段都不会创建 GL 相关的对象,只创建 JS 对象\n * @param scene - 场景\n * @param options - 加载选项\n */\n static override async prepareResource (scene: Scene, options: SceneLoadOptions): Promise<void> {\n if (options.pluginData !== undefined) {\n const keyList = [\n 'compatibleMode',\n 'renderSkybox',\n 'visBoundingBox',\n 'autoAdjustScene',\n 'enableDynamicSort',\n 'renderMode3D',\n 'renderMode3DUVGridSize',\n ];\n const pluginData = options.pluginData;\n\n keyList.forEach(key => scene.storage[key] = pluginData[key]);\n }\n //\n const runtimeEnv = options.env ?? '';\n\n scene.storage['runtimeEnv'] = runtimeEnv;\n const compatibleMode = options.pluginData?.['compatibleMode'] ?? 'gltf';\n\n //\n PluginHelper.preprocessScene(scene, runtimeEnv, compatibleMode);\n await CompositionCache.loadStaticResources();\n }\n\n override precompile (compositions: spec.CompositionData[], renderer: Renderer): Promise<void> {\n const isWebGL2 = renderer.engine.gpuCapability.level === 2;\n const pbrShaderCode = fetchPBRShaderCode();\n const unlitShaderCode = fetchUnlitShaderCode();\n const pbrShaderData: spec.ShaderData = {\n id: PBRShaderGUID,\n name: 'PBR Shader',\n dataType: spec.DataType.Shader,\n fragment: pbrShaderCode.fragmentShaderCode,\n vertex: pbrShaderCode.vertexShaderCode,\n // @ts-expect-error\n glslVersion: isWebGL2 ? GLSLVersion.GLSL3 : GLSLVersion.GLSL1,\n };\n const unlitShaderData: spec.ShaderData = {\n id: UnlitShaderGUID,\n name: 'Unlit Shader',\n dataType: spec.DataType.Shader,\n fragment: unlitShaderCode.fragmentShaderCode,\n vertex: unlitShaderCode.vertexShaderCode,\n // @ts-expect-error\n glslVersion: isWebGL2 ? GLSLVersion.GLSL3 : GLSLVersion.GLSL1,\n };\n\n renderer.engine.addEffectsObjectData(pbrShaderData);\n renderer.engine.addEffectsObjectData(unlitShaderData);\n\n return Promise.resolve();\n }\n\n /**\n * 创建 3D 场景管理器和缓存器\n * @param composition - 合成\n * @param scene - 场景\n */\n override onCompositionConstructed (composition: Composition, scene: Scene): void {\n this.sceneParams = scene.storage;\n\n const engine = composition.renderer.engine;\n\n this.cache = new CompositionCache(engine);\n this.cache.setup(false);\n }\n\n /**\n * 每次播放都会执行,包括重播,所以这里执行“小的销毁”和新的初始化\n * @param composition - 合成\n * @param renderFrame - 渲染帧\n */\n override onCompositionReset (composition: Composition, renderFrame: RenderFrame) {\n const props = {\n id: 'ModelPluginItem',\n name: 'ModelPluginItem',\n duration: 9999999,\n endBehavior: spec.END_BEHAVIOR_FORWARD,\n } as unknown as spec.Item;\n const item = new VFXItem(composition.getEngine(), props);\n\n composition.addItem(item);\n //\n const comp = item.addComponent(ModelPluginComponent);\n\n comp.fromData({ cache: this.cache });\n comp.initial(this.sceneParams);\n }\n\n /**\n * 合成销毁,同时销毁 3D 场景对象和缓存\n * @param composition - 合成\n */\n override onCompositionDestroyed (composition: Composition) {\n this.cache.dispose();\n // @ts-expect-error\n this.cache = null;\n // @ts-expect-error\n this.sceneParams = null;\n }\n}\n\nexport interface ModelPluginOptions {\n cache: CompositionCache,\n}\n\n/**\n * 插件组件类,实现特定的插件功能\n * @since 2.0.0\n * @internal\n */\n@effectsClass(spec.DataType.ModelPluginComponent)\nexport class ModelPluginComponent extends Behaviour {\n private runtimeEnv = PLAYER_OPTIONS_ENV_EDITOR;\n private compatibleMode = 'gltf';\n private renderSkybox = true;\n private visBoundingBox = false;\n private autoAdjustScene = false;\n /**\n * 渲染插件是否启用动态排序功能\n * 支持在渲染的时候对透明 Mesh 进行动态排序\n */\n private enableDynamicSort = false;\n /**\n * 3D 渲染模式,支持可视化渲染中间结果\n * none 表示正常的渲染结果\n */\n private renderMode3D = spec.RenderMode3D.none;\n /**\n * UV 渲染模式中,指定棋盘格的大小,相对于大小为 1 的纹理\n * 取值范围(0, 1)\n */\n private renderMode3DUVGridSize = 1 / 16;\n /**\n * 合成缓存器\n */\n cache: CompositionCache;\n /**\n * 场景管理器\n */\n scene: PSceneManager;\n\n /**\n * 构造函数,创建场景管理器\n * @param engine - 引擎\n * @param options - Mesh 参数\n */\n constructor (engine: Engine, options?: ModelPluginOptions) {\n super(engine);\n if (options) {\n this.fromData(options);\n }\n }\n\n /**\n * 组件后更新,合成相机和场景管理器更新\n * @param dt - 更新间隔\n */\n override onLateUpdate (dt: number): void {\n const composition = this.item.composition as Composition;\n\n if (this.autoAdjustScene && this.scene.tickCount == 1) {\n // 自动计算场景中的相机位置\n // 更加相机的具体参数,计算出合适的相机观察位置\n // 但只会在第一帧进行更新,主要是用于测试使用\n const cameraObject = composition.camera;\n const cameraTransform = new PTransform().fromMatrix4(cameraObject.getViewMatrix());\n const cameraCoordinate = new PCoordinate().fromPTransform(cameraTransform);\n const cameraDirection = cameraCoordinate.zAxis.clone();\n const cameraFov = cameraObject.fov ?? 45;\n const cameraAspect = cameraObject.aspect ?? 1.0;\n //\n const sceneAABB = this.scene.getSceneAABB();\n const newAABB = sceneAABB.clone().applyMatrix4(cameraTransform.getMatrix());\n const newSize = newAABB.getSize(new Vector3()).multiply(0.5);\n const newWidth = newSize.x;\n const newHeight = newSize.y;\n const finalHeight = newHeight * Math.max(newWidth / newHeight / cameraAspect, 1.0);\n const center = sceneAABB.getCenter(new Vector3());\n const offset = finalHeight / Math.tan(cameraFov * 0.5 * DEG2RAD);\n const position = center.clone().add(cameraDirection.clone().multiply(offset + newSize.z));\n\n // 更新相机的位置,主要是composition的camera数据,以及camera item数据\n composition.camera.position = position;\n composition.items?.forEach(item => {\n if (item.type === VFX_ITEM_TYPE_3D) {\n const component = item.getComponent(ModelCameraComponent);\n\n if (component?.content) {\n const worldMatrix = item.transform.parentTransform?.getWorldMatrix() || Matrix4.IDENTITY.clone();\n const invWorldMatrix = worldMatrix.invert();\n const newPosition = invWorldMatrix.transformPoint(position);\n\n component.setTransform(newPosition);\n\n // 正式版本不会走到这个流程,只在测试时使用\n console.info(`Scene AABB [${sceneAABB.min.toArray()}], [${sceneAABB.max.toArray()}].`);\n console.info(`Update camera position [${newPosition.toArray()}].`);\n }\n }\n });\n }\n\n this.updateSceneCamera(composition);\n this.scene.tick(dt);\n }\n\n /**\n * 组件销毁,同时销毁场景管理器和缓存器\n */\n override onDestroy (): void {\n this.scene.dispose();\n // @ts-expect-error\n this.scene = null;\n // @ts-expect-error\n this.cache = null;\n }\n\n /**\n * 反序列化,创建场景管理器\n * @param date - 组件参数\n */\n override fromData (data: ModelPluginOptions): void {\n super.fromData(data);\n //\n const options = data;\n\n this.cache = options.cache;\n this.scene = new PSceneManager(this.engine);\n }\n\n /**\n * 组件初始化,初始化场景管理器并更新合成相机\n * @param sceneParams - 场景参数\n */\n initial (sceneParams: Record<string, any>) {\n this.runtimeEnv = sceneParams['runtimeEnv'] ?? this.runtimeEnv;\n this.compatibleMode = sceneParams['compatibleMode'] ?? this.compatibleMode;\n this.renderSkybox = sceneParams['renderSkybox'] ?? this.renderSkybox;\n this.visBoundingBox = sceneParams['visBoundingBox'] ?? this.visBoundingBox;\n this.autoAdjustScene = sceneParams['autoAdjustScene'] ?? this.autoAdjustScene;\n this.enableDynamicSort = sceneParams['enableDynamicSort'] ?? this.enableDynamicSort;\n this.renderMode3D = sceneParams['renderMode3D'] ?? this.renderMode3D;\n this.renderMode3DUVGridSize = sceneParams['renderMode3DUVGridSize'] ?? this.renderMode3DUVGridSize;\n\n const component = this.item.composition as Composition;\n\n this.scene.initial({\n componentName: `${component.id}`,\n renderer: this.engine.renderer,\n sceneCache: this.cache,\n runtimeEnv: this.runtimeEnv,\n compatibleMode: this.compatibleMode,\n visBoundingBox: this.visBoundingBox,\n enableDynamicSort: this.enableDynamicSort,\n renderMode3D: this.renderMode3D,\n renderMode3DUVGridSize: this.renderMode3DUVGridSize,\n renderSkybox: this.renderSkybox,\n lightItemCount: this.getLightItemCount(),\n maxJointCount: this.getMaxJointCount(this.item.composition?.items ?? []),\n });\n this.updateSceneCamera(component);\n }\n\n /**\n * 更新 SceneManager 中渲染用的相机,相机参数来自 composition.camera\n *\n * @param composition - 当前合成对象\n * @param sceneManager - 当前合成对象绑定的 SceneManager\n */\n private updateSceneCamera (composition: Composition) {\n this.scene.updateDefaultCamera(composition.camera.getOptions(), composition.camera.getViewportMatrix());\n }\n\n private getLightItemCount (): number {\n let lightItemCount = 0;\n const items = this.item.composition?.items ?? [];\n\n items.forEach(item => {\n if (item.getComponent(ModelLightComponent)) {\n lightItemCount++;\n }\n });\n\n return lightItemCount;\n }\n\n private getMaxJointCount (items: VFXItem[]): number {\n let maxJointCount = 0;\n\n items.forEach(item => {\n const meshComp = item.getComponent(ModelMeshComponent);\n\n if (meshComp && meshComp.data) {\n const geometry = meshComp.data.geometry;\n\n if (geometry instanceof Geometry) {\n const skin = geometry.getSkinProps();\n\n if (skin.boneNames) {\n maxJointCount = Math.max(skin.boneNames.length, maxJointCount);\n }\n }\n }\n if (item.children.length !== 0) {\n maxJointCount = Math.max(this.getMaxJointCount(item.children), maxJointCount);\n }\n });\n\n return maxJointCount;\n }\n}\n\n/**\n * 获取场景管理器,从合成中查找\n * @param component\n * @returns\n */\nexport function getSceneManager (component?: Component): PSceneManager | undefined {\n const composition = component?.item?.composition;\n const pluginItem = composition?.getItemByName('ModelPluginItem');\n const pluginComp = pluginItem?.getComponent(ModelPluginComponent);\n\n return pluginComp?.scene;\n}\n","import type { Engine } from '@galacean/effects';\nimport { Behaviour, effectsClass, spec } from '@galacean/effects';\nimport type { ModelTreeContent } from '../index';\n\n/**\n * 插件场景树组件类,实现 3D 场景树功能\n *\n * FIXME: 有些发布的新JSON包含TreeComponent,这里做兼容处理,否则会报错\n * @since 2.1.0\n */\n@effectsClass(spec.DataType.TreeComponent)\nexport class ModelTreeComponent extends Behaviour {\n /**\n * 参数\n */\n options?: ModelTreeContent;\n\n /**\n * 构造函数,创建节点树元素\n * @param engine\n * @param options\n */\n constructor (engine: Engine, options?: ModelTreeContent) {\n super(engine);\n if (options) {\n this.fromData(options);\n }\n }\n\n /**\n * 反序列化,保存入参和创建节点树元素\n * @param options\n */\n override fromData (options: ModelTreeContent): void {\n super.fromData(options);\n this.options = options;\n }\n}\n","import type { CameraOptionsEx, spec } from '@galacean/effects';\n\nexport interface CameraGestureHandler {\n\n getCurrentTarget (): string,\n\n getCurrentType (): CameraGestureType,\n\n /**\n * 通过按键事件对相机进行平移\n * @param event - 键盘事件信息\n * @returns 当前的相机参数\n */\n onKeyEvent (event: CameraKeyEvent): CameraOptionsEx,\n\n /**\n * 在 XY 方向上平移相机开始函数,在鼠标按下时调用\n * @param x - 鼠标在 x 坐标上的值\n * @param y - 鼠标在 y 坐标上的值\n * @param width - 当前画布的宽度\n * @param height - 当前画布的高度\n * @param cameraID - 要控制的相机 item id\n * @returns 当前的相机参数\n */\n onXYMoveBegin (x: number, y: number, width: number, height: number, cameraID: string): CameraOptionsEx,\n\n /**\n * 在 XY 方向上平移相机开始函数,在鼠标按下拖拽时调用\n * @param x - 鼠标在 x 坐标上的值\n * @param y - 鼠标在 y 坐标上的值\n * @param speed - 移动速度,默认是 0.015\n * @returns 更新后的相机参数\n */\n onXYMoving (x: number, y: number, speed?: number): CameraOptionsEx,\n\n /**\n * 结束在 XY 方向上平移相机\n */\n onXYMoveEnd (): void,\n\n /**\n * 在 Z 方向上平移相机开始函数,类似缩放 3D 模型,在鼠标按下时调用\n * @param x - 鼠标在 x 坐标上的值\n * @param y - 鼠标在 y 坐标上的值\n * @param width - 当前画布的宽度\n * @param height - 当前画布的高度\n * @param cameraID - 要控制的相机 item id\n * @returns 当前的相机参数\n */\n onZMoveBegin (x: number, y: number, width: number, height: number, cameraID: string): CameraOptionsEx,\n\n /**\n * 在 Z 方向上平移相机开始函数,类似缩放 3D 模型,在鼠标按下拖拽时调用\n * @param x - 鼠标在 x 坐标上的值\n * @param y - 鼠标在 y 坐标上的值\n * @param speed - 移动速度,默认是 0.015\n * @returns 更新后的相机参数\n */\n onZMoving (x: number, y: number, speed?: number): CameraOptionsEx,\n\n /**\n * 结束在 Z 方向上平移相机\n */\n onZMoveEnd (): void,\n\n /**\n * 相机的自旋转,就是镜头漫游的效果,在鼠标按下时调用\n * @param x - 鼠标在 x 坐标上的值\n * @param y - 鼠标在 y 坐标上的值\n * @param width - 当前画布的宽度\n * @param height - 当前画布的高度\n * @param cameraID - 要控制的相机 item id\n * @returns 当前的相机参数\n */\n onRotateBegin (x: number, y: number, width: number, height: number, cameraID: string): CameraOptionsEx,\n\n /**\n * 相机的自旋转,在鼠标按下拖拽时调用\n * @param x - 鼠标在 x坐标上的值\n * @param y - 鼠标在y坐标上的值\n * @param speed - 移动速度,默认是 1\n * @returns 更新后的相机参数\n */\n onRotating (x: number, y: number, speed?: number): CameraOptionsEx,\n\n /**\n * 相机的自旋转\n */\n onRotateEnd (): void,\n\n /**\n * 相机绕某个点旋转,就是拖拽模型的效果,在鼠标按下时调用\n * @param x - 鼠标在 x 坐标上的值\n * @param y - 鼠标在 y 坐标上的值\n * @param width - 当前画布的宽度\n * @param height - 当前画布的高度\n * @param cameraID - 要控制的相机 item id\n * @returns 当前的相机参数\n */\n onRotatePointBegin (x: number, y: number, width: number, height: number, point: spec.vec3, cameraID: string): CameraOptionsEx,\n\n /**\n * 相机绕某个点旋转,在鼠标按下拖拽时调用\n * @param x - 鼠标在 x 坐标上的值\n * @param y - 鼠标在 y 坐标上的值\n * @param speed - 移动速度,默认是 1\n * @returns 更新后的相机参数\n */\n onRotatingPoint (x: number, y: number, speed?: number): CameraOptionsEx,\n\n /**\n * 相机绕某个点旋转\n */\n onRotatePointEnd (): void,\n\n /**\n * 相机移动到指定点\n * @param cameraID -相机 ID\n * @param position - 指定位置\n */\n moveTo (cameraID: string, position: spec.vec3): void,\n\n /**\n * 相机旋转到指定方向\n * @param cameraID - 相机ID\n * @param quat - 指定旋转\n */\n rotateTo (cameraID: string, quat: spec.vec4): void,\n\n /**\n * 相机对中心点进行聚焦,先从当前位置 LookAt 过去,然后移到距离中心点给定距离(默认是 5)的位置\n * @param cameraID - 相机 ID\n * @param point - 聚焦的中心点\n * @param distance - 聚焦的距离,默认是 5\n */\n onFocusPoint (cameraID: string, point: spec.vec3, distance?: number): void,\n\n}\n\nexport enum CameraGestureType {\n none,\n translate = 1,\n rotate_focus = 2,\n rotate_self = 3,\n scale = 4\n}\n\nexport interface CameraGestureHandlerParams {\n type: CameraGestureType,\n\n mouseEvent: boolean,\n\n // mouse position\n clientX: number,\n clientY: number,\n\n // canvas size\n clientWidth: number,\n clientHeight: number,\n\n //camera item id\n target: string,\n\n //rotate_focus point\n focusPoint?: spec.vec3,\n\n speed?: number, // default = 0.015\n}\n\nexport interface CameraKeyEvent {\n cameraID: string,\n xAxis?: -1 | 1,\n yAxis?: -1 | 1,\n zAxis?: -1 | 1,\n speed?: number,\n}\n","import type { Composition, CameraOptionsEx, spec, VFXItem } from '@galacean/effects';\nimport { Transform } from '@galacean/effects';\nimport type {\n CameraGestureHandler,\n CameraKeyEvent,\n CameraGestureHandlerParams,\n} from './protocol';\nimport { CameraGestureType } from './protocol';\nimport { PCoordinate, PTransform } from '../runtime/common';\nimport type { Euler } from '../runtime/math';\nimport { Quaternion, Vector3, Matrix4 } from '../runtime/math';\nimport { ModelCameraComponent } from '../plugin/model-item';\n\nexport class CameraGestureHandlerImp implements CameraGestureHandler {\n private cameraTransform = new PTransform();\n private cameraCoordiante = new PCoordinate();\n\n private startParams: CameraGestureHandlerParams = {\n type: CameraGestureType.none,\n mouseEvent: false,\n clientX: 0,\n clientY: 0,\n clientWidth: 512,\n clientHeight: 512,\n target: '',\n };\n\n constructor (\n private composition: Composition,\n ) { }\n\n updateComposition (composition: Composition) {\n this.composition = composition;\n }\n\n getItem () {\n return this.composition.items?.find(item => item.name === this.getCurrentTarget());\n }\n\n getCurrentTarget (): string {\n return this.startParams.target;\n }\n\n getCurrentType (): CameraGestureType {\n return this.startParams.type;\n }\n\n onKeyEvent (event: CameraKeyEvent): CameraOptionsEx {\n // check event camera ID at first\n if (this.startParams.target !== event.cameraID) {\n this.startParams.target = event.cameraID;\n this.startParams.type = CameraGestureType.translate;\n }\n\n // can't find camera item, throw error message\n const item = this.getItem();\n\n if (item === undefined) {\n console.warn(`[CameraGestureHandlerImp] Unable to locate camera item with ID: ${this.startParams.target}.`);\n\n return this.composition.camera.getOptions();\n }\n\n const camera = this.composition.camera;\n const effectsTransfrom = new Transform({\n ...camera.getOptions(),\n valid: true,\n });\n const cameraTransform = new PTransform().fromEffectsTransform(effectsTransfrom);\n const cameraCoordiante = new PCoordinate().fromPTransform(cameraTransform);\n\n // compute move direction\n const xAxis = event.xAxis ?? 0;\n const yAxis = event.yAxis ?? 0;\n const zAxis = event.zAxis ?? 0;\n const dir = cameraCoordiante.xAxis.clone().multiply(xAxis);\n\n dir.add(cameraCoordiante.yAxis.clone().multiply(yAxis));\n dir.add(cameraCoordiante.zAxis.clone().multiply(zAxis));\n if (dir.lengthSquared() < 0.00001) {\n return camera.getOptions();\n }\n dir.normalize();\n\n // update camera position\n const speed = event.speed ?? 0.1;\n const pos = cameraTransform.getPosition();\n\n pos.add(dir.clone().multiply(speed));\n this.setTransform(item, pos);\n\n // update camera transform and coordinates\n if (this.startParams.type === CameraGestureType.rotate_self) {\n this.cameraTransform.setPosition(pos);\n this.cameraCoordiante.origin = pos;\n }\n\n return camera.getOptions();\n }\n\n onXYMoveBegin (x: number, y: number, width: number, height: number, cameraID: string): CameraOptionsEx {\n const args = {\n type: CameraGestureType.translate,\n mouseEvent: true,\n clientX: x,\n clientY: y,\n clientWidth: width,\n clientHeight: height,\n target: cameraID,\n };\n\n return this.startGesture(args);\n }\n\n onXYMoving (x: number, y: number, speed?: number): CameraOptionsEx {\n if (!this.startParams.mouseEvent) {\n return this.composition.camera.getOptions();\n }\n\n const arg0 = this.startParams;\n const arg = {\n type: CameraGestureType.translate,\n mouseEvent: true,\n clientX: x,\n clientY: y,\n clientWidth: arg0.clientWidth,\n clientHeight: arg0.clientHeight,\n target: arg0.target,\n speed: speed ?? 0.015,\n };\n\n return this.moveGesture(arg);\n }\n\n onXYMoveEnd () {\n this.endGesture();\n }\n\n onZMoveBegin (x: number, y: number, width: number, height: number, cameraID: string): CameraOptionsEx {\n const arg = {\n type: CameraGestureType.scale,\n mouseEvent: true,\n clientX: x,\n clientY: y,\n clientWidth: width,\n clientHeight: height,\n target: cameraID,\n };\n\n return this.startGesture(arg);\n }\n\n onZMoving (x: number, y: number, speed = 0.015): CameraOptionsEx {\n if (!this.startParams.mouseEvent) {\n return this.composition.camera.getOptions();\n }\n\n const arg0 = this.startParams;\n const arg = {\n type: CameraGestureType.scale,\n mouseEvent: true,\n clientX: x,\n clientY: y,\n clientWidth: arg0.clientWidth,\n clientHeight: arg0.clientHeight,\n target: arg0.target,\n speed,\n };\n\n return this.moveGesture(arg);\n }\n\n onZMoveEnd () {\n this.endGesture();\n }\n\n onRotateBegin (x: number, y: number, width: number, height: number, cameraID: string): CameraOptionsEx {\n const arg = {\n type: CameraGestureType.rotate_self,\n mouseEvent: true,\n clientX: x,\n clientY: y,\n clientWidth: width,\n clientHeight: height,\n target: cameraID,\n };\n\n return this.startGesture(arg);\n }\n\n onRotating (x: number, y: number, speed?: number): CameraOptionsEx {\n if (!this.startParams.mouseEvent) {\n return this.composition.camera.getOptions();\n }\n\n const arg0 = this.startParams;\n const arg = {\n type: CameraGestureType.rotate_self,\n mouseEvent: true,\n clientX: x,\n clientY: y,\n clientWidth: arg0.clientWidth,\n clientHeight: arg0.clientHeight,\n target: arg0.target,\n speed: speed ?? 1.5,\n };\n\n return this.moveGesture(arg);\n }\n\n onRotateEnd () {\n this.endGesture();\n }\n\n onRotatePointBegin (x: number, y: number, width: number, height: number, point: spec.vec3, cameraID: string): CameraOptionsEx {\n const arg = {\n type: CameraGestureType.rotate_focus,\n mouseEvent: true,\n clientX: x,\n clientY: y,\n clientWidth: width,\n clientHeight: height,\n focusPoint: point,\n target: cameraID,\n };\n\n return this.startGesture(arg);\n }\n\n onRotatingPoint (x: number, y: number, speed?: number): CameraOptionsEx {\n if (!this.startParams.mouseEvent) {\n return this.composition.camera.getOptions();\n }\n\n const arg0 = this.startParams;\n const arg = {\n type: CameraGestureType.rotate_focus,\n mouseEvent: true,\n clientX: x,\n clientY: y,\n clientWidth: arg0.clientWidth,\n clientHeight: arg0.clientHeight,\n focusPoint: arg0.focusPoint,\n target: arg0.target,\n speed: speed ?? 8.0,\n };\n\n return this.moveGesture(arg);\n }\n\n onRotatePointEnd (): void {\n this.endGesture();\n }\n\n moveTo (cameraID: string, position: spec.vec3): void {\n this.startParams.target = cameraID;\n this.startParams.type = CameraGestureType.none;\n const item = this.getItem();\n\n if (item === undefined) {\n console.warn('[CameraGestureHandlerImp] Can\\'t find camera item.');\n\n return;\n }\n\n this.setPosition(item, position);\n }\n\n rotateTo (cameraID: string, quat: spec.vec4): void {\n this.startParams.target = cameraID;\n this.startParams.type = CameraGestureType.none;\n const item = this.getItem();\n\n if (item === undefined) {\n console.warn('[CameraGestureHandlerImp] Can\\'t find camera item.');\n\n return;\n }\n\n this.setQuaternion(item, quat);\n }\n\n onFocusPoint (cameraID: string, point: spec.vec3, distance?: number): void {\n this.startParams.target = cameraID;\n this.startParams.type = CameraGestureType.none;\n\n const item = this.getItem();\n\n if (item === undefined) {\n console.warn('[CameraGestureHandlerImp] Can\\'t find camera item.');\n\n return;\n }\n const newDistance = distance ?? 5;\n const targetPoint = Vector3.fromArray(point);\n //\n const transform = new PTransform().fromEffectsTransform(item.transform);\n const coordinate = new PCoordinate().fromPTransform(transform);\n // FIXME: MATH\n const lookatDir = Vector3.fromArray(coordinate.zAxis.toArray()).multiply(1.0);\n //\n const newOffset = lookatDir.clone().multiply(newDistance);\n const newPosition = targetPoint.clone().add(newOffset);\n\n //\n this.setTransform(item, newPosition);\n //\n // z+方向优先\n // const cameraPos = Vector3.fromArray(item.transform.position);\n // const newLookatDir = targetPoint.clone().subVector(cameraPos).normalize();\n // const newOffset = newLookatDir.clone().multiplyScalar(newDistance);\n // const newPosition = targetPoint.clone().subVector(newOffset);\n // const newUpVector = Vector3.tryZUpVector(newLookatDir, new Vector3);\n // const viewMatrix = Matrix4.computeLookAt(newPosition, targetPoint, newUpVector, new Matrix4);\n // const tranform = new PTransform().fromMatrix4(viewMatrix);\n // const newRotation = tranform.rotation;\n // item.transform.setQuat(-newRotation.x, -newRotation.y, -newRotation.z, newRotation.w);\n // item.transform.setPosition(newPosition.x, newPosition.y, newPosition.z);\n //\n // 旋转优先\n // const cameraPos = Vector3.fromArray(item.transform.position);\n // const newLookatDir = targetPoint.clone().subVector(cameraPos).normalize();\n // const newOffset = newLookatDir.clone().multiplyScalar(newDistance);\n // const newPosition = targetPoint.clone().subVector(newOffset);\n // const oldTransform = new PTransform().fromEffectsTransform(item.transform);\n // const oldCoordinate = new PCoordinate().fromPTransform(oldTransform)\n // const oldLookatDir = oldCoordinate.zAxis.clone().multiplyScalar(-1.0);\n // const rotateAxis = oldLookatDir.cross(newLookatDir);\n // const sinTheta = rotateAxis.length();\n // const theta = Math.asin(sinTheta);\n // const deltaRotation = Quaternion.fromAxisAngle(rotateAxis, theta, new Quaternion);\n // const newRotation = Quaternion.multiply(deltaRotation, oldTransform.rotation, new Quaternion);\n // item.transform.setQuat(newRotation.x, newRotation.y, newRotation.z, newRotation.w);\n // item.transform.setPosition(newPosition.x, newPosition.y, newPosition.z);\n //\n //\n this.startParams.target = '';\n }\n\n getCameraTransform (): Transform {\n const camera = this.composition.camera;\n const transform = new Transform(camera.getOptions());\n\n transform.setValid(true);\n\n return transform;\n }\n\n private startGesture (args: CameraGestureHandlerParams): CameraOptionsEx {\n this.startParams = args;\n this.updateCameraTransform(this.composition.camera.getOptions());\n\n if (!this.getItem()) {\n console.warn('[CameraGestureHandlerImp] Invalid target specified in startGesture.');\n }\n\n return this.composition.camera.getOptions();\n }\n\n private moveGesture (arg: CameraGestureHandlerParams): CameraOptionsEx {\n if (this.getCurrentType() === arg.type) {\n const item = this.getItem();\n\n if (item === undefined) {\n console.warn('[CameraGestureHandlerImp] Can\\'t find camera item.');\n\n return this.composition.camera.getOptions();\n }\n const speed = arg.speed ?? 1.015;\n const xAxis = this.cameraCoordiante.xAxis;\n const yAxis = this.cameraCoordiante.yAxis;\n const zAxis = this.cameraCoordiante.zAxis;\n const dx = (arg.clientX - this.startParams.clientX);\n const dy = (arg.clientY - this.startParams.clientY);\n\n if (arg.type === CameraGestureType.translate) {\n const pos = this.cameraTransform.getPosition();\n const newPos = pos.clone();\n\n newPos.add(xAxis.clone().multiply(-dx * speed));\n newPos.add(yAxis.clone().multiply(dy * speed));\n item.transform.setPosition(newPos.x, newPos.y, newPos.z);\n this.setTransform(item, item.transform.position, item.transform.rotation);\n } else if (arg.type === CameraGestureType.scale) {\n const pos = this.cameraTransform.getPosition();\n const newPos = pos.clone();\n\n newPos.add(zAxis.clone().multiply(dy * speed));\n item.transform.setPosition(newPos.x, newPos.y, newPos.z);\n this.setTransform(item, item.transform.position, item.transform.rotation);\n } else if (arg.type === CameraGestureType.rotate_self) {\n const ndx = dx / arg.clientWidth;\n const ndy = dy / arg.clientHeight;\n const dxAngle = ndx * Math.PI * speed * 0.5;\n const dyAngle = ndy * Math.PI * speed * 0.5;\n\n const newRotation = Quaternion.fromAxisAngle(Vector3.Y, -dxAngle);\n // FIXME: MATH\n const tempRotation = Quaternion.fromAxisAngle(xAxis, -dyAngle);\n\n newRotation.multiply(tempRotation);\n // FIXME: MATH\n newRotation.multiply(this.cameraTransform.getRotation());\n item.transform.setQuaternion(newRotation.x, newRotation.y, newRotation.z, newRotation.w);\n this.setTransform(item, item.transform.position, item.transform.rotation);\n } else if (arg.type === CameraGestureType.rotate_focus) {\n const ndx = dx / arg.clientWidth;\n const ndy = dy / arg.clientHeight;\n const dxAngle = ndx * Math.PI * speed;\n const dyAngle = ndy * Math.PI * speed;\n const newRotation = Quaternion.fromAxisAngle(Vector3.Y, -dxAngle);\n const tempRotation = Quaternion.fromAxisAngle(xAxis, -dyAngle);\n\n newRotation.multiply(tempRotation);\n const rotateMatrix = newRotation.toMatrix4(new Matrix4());\n const targetPoint = Vector3.fromArray(arg.focusPoint as spec.vec3);\n const deltaPosition = this.cameraCoordiante.origin.clone().subtract(targetPoint);\n\n rotateMatrix.transformPoint(deltaPosition);\n const newPosition = deltaPosition.add(targetPoint);\n\n newRotation.multiply(this.cameraTransform.getRotation());\n item.transform.setPosition(newPosition.x, newPosition.y, newPosition.z);\n item.transform.setQuaternion(newRotation.x, newRotation.y, newRotation.z, newRotation.w);\n this.setTransform(item, newPosition, item.transform.rotation);\n } else {\n console.warn('[CameraGestureHandlerImp] Movement type not implemented.');\n }\n } else {\n console.warn(`[CameraGestureHandlerImp] Invalid move type specified: ${arg.type}`);\n }\n\n return this.composition.camera.getOptions();\n }\n\n private setTransform (item: VFXItem, position?: Vector3, rotation?: Euler) {\n const camera = item.getComponent(ModelCameraComponent);\n\n if (camera !== undefined) {\n camera.setTransform(position, rotation);\n }\n }\n\n private setPosition (item: VFXItem, position: spec.vec3) {\n item.transform.setPosition(...position);\n const camera = item.getComponent(ModelCameraComponent);\n\n if (camera !== undefined) {\n camera.updateMainCamera();\n }\n }\n\n private setQuaternion (item: VFXItem, quat: spec.vec4) {\n item.transform.setQuaternion(...quat);\n const camera = item.getComponent(ModelCameraComponent);\n\n if (camera !== undefined) {\n camera.updateMainCamera();\n }\n }\n\n private endGesture () {\n this.startParams.type = CameraGestureType.none;\n this.startParams.mouseEvent = false;\n this.startParams.target = '';\n }\n\n private updateCameraTransform (cameraOptions: CameraOptionsEx) {\n const effectsTransfrom = new Transform(cameraOptions);\n\n effectsTransfrom.setValid(true);\n\n this.cameraTransform.fromEffectsTransform(effectsTransfrom);\n this.cameraCoordiante.fromPTransform(this.cameraTransform);\n }\n}\n\nexport * from './protocol';\n","import type { spec } from '@galacean/effects';\nimport { Transform as EffectsTransform } from '@galacean/effects';\nimport type { BaseTransform as Transform } from '../index';\nimport { Vector3, Matrix4, Quaternion, Euler, EulerOrder } from '../runtime/math';\n\nexport class LoaderHelper {\n static getTransformFromMat4 (mat: Matrix4): Transform {\n const transform = mat.getTransform();\n const euler = transform.rotation.toEuler(new Euler());\n\n return {\n position: transform.translation.toArray(),\n rotation: euler.toArray(),\n scale: transform.scale.toArray(),\n };\n }\n\n static getEffectsTransformFromMat4 (mat: Matrix4): Transform {\n const transform = new EffectsTransform({\n valid: true,\n });\n\n transform.cloneFromMatrix(mat);\n\n return {\n position: transform.position.toArray(),\n rotation: transform.rotation.toArray(),\n scale: transform.scale.toArray(),\n };\n }\n\n static getTransformFromTranslation (t: Vector3): Transform {\n return {\n position: t.toArray(),\n };\n }\n\n static getTransformFromDirection (d: Vector3): Transform {\n const d0 = Vector3.fromArray([1, 0, 0]);\n const d1 = d.clone().normalize();\n const a = d0.clone().cross(d1);\n\n if (a.length() < 0.01) { return {}; }\n\n a.normalize();\n const b = d1.dot(d0);\n const c = Math.acos(b);\n\n const mat = Matrix4.fromRotationAxis(a, c);\n\n return LoaderHelper.getTransformFromMat4(mat);\n }\n\n static getEffectsTransformFromDirection (d: Vector3): Transform {\n const d0 = Vector3.fromArray([0, 0, 1]);\n const d1 = d.clone().normalize();\n const a = d0.clone().cross(d1);\n\n if (a.length() < 0.01) { return {}; }\n\n a.normalize();\n const b = d1.dot(d0);\n const c = Math.acos(b);\n\n const mat = Matrix4.fromRotationAxis(a, c);\n\n return LoaderHelper.getEffectsTransformFromMat4(mat);\n }\n\n static getTransformFromTransDir (t: Vector3, d: Vector3): Transform {\n const transform = LoaderHelper.getTransformFromDirection(d);\n\n transform.position = t.toArray();\n\n return transform;\n }\n\n static getEffectsTransformFromTransDir (t: Vector3, d: Vector3): Transform {\n const transform = LoaderHelper.getEffectsTransformFromDirection(d);\n\n transform.position = t.toArray();\n\n return transform;\n }\n\n static getEulerFromQuat (q: Quaternion): [number, number, number] {\n const euler = new Euler();\n const quat = new Quaternion(q.x, q.y, q.z, q.w);\n\n euler.order = EulerOrder.ZYX;\n euler.setFromQuaternion(quat);\n\n return [euler.x, euler.y, euler.z];\n }\n\n static getQuatFromEuler (e: Euler): [number, number, number, number] {\n const quat = new Quaternion();\n\n quat.setFromEuler(e);\n\n return [quat.x, quat.y, quat.z, quat.w];\n }\n\n static toPlayerColor3 (color: spec.vec3): spec.vec3 {\n // [0, 1] => [0, 255]\n return [\n LoaderHelper.scaleTo255(color[0]),\n LoaderHelper.scaleTo255(color[1]),\n LoaderHelper.scaleTo255(color[2]),\n ];\n }\n\n static toPlayerColor4 (color: spec.vec4): spec.vec4 {\n // [0, 1] => [0, 255]\n return [\n LoaderHelper.scaleTo255(color[0]),\n LoaderHelper.scaleTo255(color[1]),\n LoaderHelper.scaleTo255(color[2]),\n LoaderHelper.scaleTo255(color[3]),\n ];\n }\n\n static scaleTo255 (val: number): number {\n const intVal = val * 255;\n\n return Math.max(0, Math.min(intVal, 255));\n }\n\n static scaleTo1 (val: number): number {\n const floatVal = val / 255.0;\n\n return Math.max(0.0, Math.min(floatVal, 1.0));\n }\n}\n","import {\n spec, generateGUID, Downloader, TextureSourceType, getStandardJSON, glContext,\n glType2VertexFormatType, isObject,\n} from '@galacean/effects';\nimport type {\n Engine, Renderer, JSONValue, TextureCubeSourceOptions, GeometryProps,\n} from '@galacean/effects';\nimport { deserializeGeometry, typedArrayFromBinary } from '@galacean/effects-helper';\nimport { PBRShaderGUID, UnlitShaderGUID, Color, Quaternion, Vector3 } from '../runtime';\nimport type { ModelTreeContent } from '../index';\n\nexport class JSONConverter {\n newScene: spec.JSONScene;\n\n engine: Engine;\n downloader: Downloader;\n treeInfo = new TreeInfo();\n\n constructor (\n public renderer: Renderer,\n public keepIBLData = true,\n ) {\n this.engine = renderer.engine;\n this.downloader = new Downloader();\n }\n\n async processScene (sceneData: string | Record<string | symbol, unknown>) {\n const sceneJSON = isObject(sceneData) ? sceneData : await this.loadJSON(sceneData);\n\n //@ts-expect-error\n if (!sceneJSON.textures) {\n //@ts-expect-error\n sceneJSON.textures = [];\n }\n //@ts-expect-error\n sceneJSON.textures.forEach(tex => {\n if (tex.source === undefined) {\n tex.source = 0;\n }\n });\n\n const oldScene = getStandardJSON(sceneJSON);\n const oldBinUrls = oldScene.bins ?? [];\n const binFiles: ArrayBuffer[] = [];\n\n //@ts-expect-error\n const v = sceneJSON.version.split('.');\n\n if (Number(v[0]) >= 3) {\n return oldScene;\n }\n\n if (oldScene.bins) {\n for (const bin of oldScene.bins) {\n binFiles.push(await this.loadBins(bin.url));\n }\n }\n // @ts-expect-error\n oldScene.bins = binFiles;\n\n const newScene: spec.JSONScene = {\n ...oldScene,\n version: spec.JSONSceneVersion['3_0'],\n playerVersion: {\n web: '3.0',\n native: '3.0',\n },\n type: 'ge',\n compositions: [],\n images: [],\n textures: [],\n items: [],\n components: [],\n materials: [],\n shaders: [],\n };\n\n this.setImage(newScene, oldScene);\n await this.setTexture(newScene, oldScene);\n this.setComponent(newScene, oldScene);\n this.setItem(newScene, oldScene);\n this.setComposition(newScene, oldScene);\n\n newScene.bins = oldBinUrls;\n\n return newScene;\n }\n\n setImage (newScene: spec.JSONScene, oldScene: spec.JSONScene) {\n const newImages: spec.Image[] = [];\n\n oldScene.images.forEach(image => {\n newImages.push(image);\n });\n\n newScene.images = newImages;\n }\n\n async setTexture (newScene: spec.JSONScene, oldScene: spec.JSONScene) {\n const newTextures: spec.TextureDefine[] = [];\n const bins = oldScene.bins as unknown as ArrayBuffer[];\n\n if (oldScene.textures) {\n for (const tex of oldScene.textures as spec.SerializedTextureCube[]) {\n if (tex.target === 34067) {\n if (this.keepIBLData) {\n newTextures.push(tex);\n } else {\n const { mipmaps, target } = tex;\n const jobs = mipmaps.map(mipmap => Promise.all(mipmap.map(pointer => this.loadMipmapImage(pointer, bins))));\n const loadedMipmaps = await Promise.all(jobs);\n\n const newMipmaps = loadedMipmaps.map(mipmaps => mipmaps.map(img => {\n const id = generateGUID();\n const sceneImage: spec.Image = {\n url: img,\n id,\n };\n\n newScene.images.push(sceneImage);\n const dataPath: spec.DataPath = { id };\n\n return dataPath;\n }));\n\n const newTex = {\n keepImageSource: false,\n ...tex,\n ...{\n mipmaps: newMipmaps,\n sourceFrom: {\n target,\n type: TextureSourceType.mipmaps,\n mipmaps: mipmaps.map(mipmap => mipmap.map(pointer => [pointer[1][1], pointer[1][2]])),\n },\n } as TextureCubeSourceOptions,\n };\n\n // @ts-expect-error\n newTextures.push(newTex);\n }\n } else {\n // @ts-expect-error\n const source = tex.source as any;\n\n if (typeof source === 'number') {\n // @ts-expect-error\n tex.source = { id: newScene.images[source].id };\n }\n newTextures.push(tex);\n }\n }\n }\n\n newScene.textures = newTextures;\n }\n\n setComponent (newScene: spec.JSONScene, oldScene: spec.JSONScene) {\n const newComponents = newScene.components;\n\n for (const comp of oldScene.components) {\n if (comp.dataType === spec.DataType.SkyboxComponent) {\n newComponents.push(this.createSkyboxComponent(comp, newScene));\n } else if (comp.dataType === spec.DataType.LightComponent) {\n newComponents.push(this.createLightComponent(comp, newScene));\n } else if (comp.dataType === spec.DataType.CameraComponent) {\n newComponents.push(comp);\n console.warn(`Camera component found: ${comp}.`);\n } else if (comp.dataType === spec.DataType.TreeComponent) {\n const treeComp = comp as unknown as ModelTreeContent;\n\n this.createItemsFromTreeComponent(comp, newScene, oldScene);\n treeComp.options.tree.animation = undefined;\n treeComp.options.tree.animations = undefined;\n } else if (comp.dataType !== spec.DataType.MeshComponent) {\n newComponents.push(comp);\n }\n }\n\n for (const comp of oldScene.components) {\n if (comp.dataType === spec.DataType.MeshComponent) {\n newComponents.push(this.createMeshComponent(comp, newScene, oldScene));\n }\n }\n }\n\n setItem (newScene: spec.JSONScene, oldScene: spec.JSONScene) {\n\n }\n\n setComposition (newScene: spec.JSONScene, oldScene: spec.JSONScene) {\n newScene.items = oldScene.items;\n newScene.items.push(...this.treeInfo.getAllTreeNodeList());\n newScene.compositionId = oldScene.compositionId;\n newScene.compositions = oldScene.compositions;\n\n newScene.items.forEach(item => {\n if (item.type === 'root' as spec.ItemType) {\n item.type = 'ECS' as spec.ItemType;\n }\n });\n\n //@ts-expect-error\n newScene.compositions[0].items = newScene.items.map(item => {\n return { id: item.id } as spec.DataPath;\n });\n }\n\n private async loadJSON (url: string) {\n return new Promise<JSONValue>((resolve, reject) => {\n this.downloader.downloadJSON(\n url,\n resolve,\n (status, responseText) => {\n reject(new Error(`Failed to load JSON from URL '${url}': status ${status} - ${responseText}. Please check the URL or network settings.`));\n });\n });\n }\n\n private async loadBins (url: string) {\n return new Promise<ArrayBuffer>((resolve, reject) => {\n this.downloader.downloadBinary(\n url,\n resolve,\n (status, responseText) => {\n reject(`Couldn't load bins ${JSON.stringify(url)}: status ${status}, ${responseText}`);\n });\n });\n }\n\n private async loadMipmapImage (pointer: spec.BinaryPointer, bins: ArrayBuffer[]) {\n const [index, start, length] = pointer[1];\n const bin = bins[index];\n\n if (!bin) {\n throw new Error(`Invalid bin pointer: ${JSON.stringify(pointer)}.`);\n }\n\n return URL.createObjectURL((new Blob([new Uint8Array(bin, start, length)])));\n }\n\n private createSkyboxComponent (component: spec.ComponentData, scene: spec.JSONScene): spec.SkyboxComponentData {\n const skyboxOptions = (component as unknown as spec.SkyboxContent<'json'>).options;\n let irradianceCoeffs;\n\n if (skyboxOptions.irradianceCoeffs) {\n irradianceCoeffs = [];\n skyboxOptions.irradianceCoeffs.forEach(coeffs => irradianceCoeffs.push(...coeffs));\n }\n\n let diffuseImage;\n\n if (skyboxOptions.diffuseImage) {\n // @ts-expect-error\n diffuseImage = { id: scene.textures[skyboxOptions.diffuseImage].id } as spec.DataPath;\n }\n\n const skyboxComponent: spec.SkyboxComponentData = {\n id: component.id,\n dataType: component.dataType,\n item: component.item,\n renderable: skyboxOptions.renderable,\n intensity: skyboxOptions.intensity,\n reflectionsIntensity: skyboxOptions.reflectionsIntensity,\n irradianceCoeffs: irradianceCoeffs,\n diffuseImage,\n specularImage: {\n // @ts-expect-error\n id: scene.textures[skyboxOptions.specularImage].id,\n },\n specularImageSize: skyboxOptions.specularImageSize,\n specularMipCount: skyboxOptions.specularMipCount + 1,\n };\n\n return skyboxComponent;\n }\n\n private createMeshComponent (component: spec.ComponentData, newScene: spec.JSONScene, oldScene: spec.JSONScene): spec.ModelMeshComponentData {\n const meshOptions = (component as unknown as spec.ModelMeshItemContent<'json'>).options;\n\n const geometryPropsList: GeometryProps[] = [];\n const materialDatas: spec.MaterialData[] = [];\n\n meshOptions.primitives.forEach(prim => {\n const geomProps = deserializeGeometry(prim.geometry, oldScene.bins as unknown as ArrayBuffer[]);\n const material = this.getMaterialData(prim.material, oldScene);\n\n if (geomProps.indices?.data instanceof Uint8Array) {\n const oldIndices = geomProps.indices.data;\n const newIndices = new Uint16Array(oldIndices.length);\n\n for (let i = 0; i < oldIndices.length; i++) {\n newIndices[i] = oldIndices[i];\n }\n\n geomProps.indices.data = newIndices;\n }\n\n geometryPropsList.push(geomProps);\n materialDatas.push(material);\n });\n\n const geometryData = getGeometryDataFromPropsList(geometryPropsList);\n\n if (!geometryData) {\n throw new Error('No primitives available to process.');\n }\n\n newScene.geometries.push(geometryData);\n newScene.materials.push(...materialDatas);\n\n const meshComponent: spec.ModelMeshComponentData = {\n id: component.id,\n dataType: component.dataType,\n item: component.item,\n geometry: { id: geometryData.id },\n materials: materialDatas.map(mat => {\n const data: spec.DataPath = {\n id: mat.id,\n };\n\n return data;\n }),\n };\n\n if (meshOptions.skin) {\n let parentItemId = component.item.id;\n\n for (const item of oldScene.items) {\n if (item.id === component.item.id) {\n parentItemId = item.parentId as string;\n }\n }\n\n if (parentItemId === component.item.id) {\n throw new Error(`Can't item ${component.item}.`);\n }\n\n const treeItem = this.treeInfo.getTreeItemByNodeId(parentItemId);\n const treeNodeList = this.treeInfo.getTreeNodeListByNodeId(parentItemId);\n\n if (!treeItem || !treeNodeList) {\n throw new Error(`Failed to retrieve tree node list for item with ID ${component.item.id}. Ensure the item exists and has a valid tree structure.`);\n }\n const rootBoneItem = this.setupBoneData(geometryData, meshOptions.skin, oldScene, treeItem, treeNodeList);\n\n meshComponent.rootBone = { id: rootBoneItem.id };\n }\n\n if (meshOptions.weights !== undefined) {\n meshComponent.morph = {\n weights: meshOptions.weights,\n };\n }\n\n return meshComponent;\n }\n\n private createItemsFromTreeComponent (component: spec.ComponentData, newScene: spec.JSONScene, oldScene: spec.JSONScene) {\n let treeItem = oldScene.items[0];\n\n oldScene.items.forEach(item => {\n if (item.id === component.item.id) {\n treeItem = item;\n }\n });\n\n const treeComp = component as unknown as ModelTreeContent;\n const treeData = treeComp.options.tree;\n const treeNodeList: spec.VFXItemData[] = [];\n\n treeData.nodes.forEach((node, index) => {\n const item: spec.VFXItemData = {\n id: generateGUID(),\n parentId: treeItem.id,\n name: node.name ?? `node${index}`,\n duration: treeItem.duration,\n // @ts-expect-error\n type: 'ECS',\n dataType: spec.DataType.VFXItemData,\n visible: treeItem.visible,\n endBehavior: treeItem.endBehavior,\n delay: treeItem.delay,\n content: {},\n renderLevel: treeItem.renderLevel,\n pn: treeItem.pn,\n pluginName: treeItem.pluginName,\n transform: this.getTransformData(node.transform),\n components: [],\n };\n\n treeNodeList.push(item);\n newScene.items.push(item);\n });\n\n treeData.nodes.forEach((node, index) => {\n const item = treeNodeList[index];\n\n node.children?.forEach(child => {\n const childItem = treeNodeList[child];\n\n childItem.parentId = item.id;\n });\n });\n\n oldScene.items.forEach(item => {\n if (item.parentId) {\n const index = item.parentId.indexOf('^');\n\n if (index >= 0) {\n const parentId = item.parentId.substring(0, index);\n const subIndex = +item.parentId.substring(index + 1);\n\n if (parentId === treeItem.id) {\n item.parentId = treeNodeList[subIndex].id;\n }\n }\n }\n });\n\n this.treeInfo.add(treeItem, treeNodeList);\n\n this.createAnimationComponent(treeData as any, treeItem, newScene, oldScene);\n }\n\n private createLightComponent (component: spec.ComponentData, scene: spec.JSONScene): spec.ModelLightComponentData {\n const lightOptions = (component as unknown as spec.ModelLightContent).options;\n\n const lightComponent: spec.ModelLightComponentData = {\n id: component.id,\n dataType: component.dataType,\n item: component.item,\n lightType: lightOptions.lightType as spec.LightType,\n color: {\n r: lightOptions.color[0] / 255.0,\n g: lightOptions.color[1] / 255.0,\n b: lightOptions.color[2] / 255.0,\n a: lightOptions.color[3] / 255.0,\n },\n intensity: lightOptions.intensity,\n };\n\n if (lightOptions.lightType === 'point') {\n lightComponent.range = lightOptions.range;\n } else if (lightOptions.lightType === 'spot') {\n lightComponent.range = lightOptions.range;\n lightComponent.innerConeAngle = lightOptions.innerConeAngle;\n lightComponent.outerConeAngle = lightOptions.outerConeAngle;\n }\n\n return lightComponent;\n }\n\n private createAnimationComponent (treeOptions: spec.ModelTreeOptions<'json'>, treeItem: spec.VFXItemData, newScene: spec.JSONScene, oldScene: spec.JSONScene) {\n const { animation, animations } = treeOptions;\n\n const animationComponent: spec.AnimationComponentData = {\n id: generateGUID(),\n dataType: spec.DataType.AnimationComponent,\n item: { id: treeItem.id },\n animation,\n animationClips: [],\n };\n\n if (animations && animations.length) {\n // FIXME: calcuate tree item duration\n const bins = oldScene.bins as unknown as ArrayBuffer[];\n\n animations.forEach(anim => {\n const clipData: spec.AnimationClipData = {\n id: generateGUID(),\n name: anim.name,\n dataType: spec.DataType.AnimationClip,\n positionCurves: [],\n rotationCurves: [],\n scaleCurves: [],\n floatCurves: [],\n };\n\n let totalAnimationTime = 0;\n\n anim.tracks.forEach(track => {\n const inputArray = typedArrayFromBinary(bins, track.input) as Float32Array;\n\n totalAnimationTime = Math.max(totalAnimationTime, inputArray[inputArray.length - 1]);\n });\n\n anim.tracks.forEach(track => {\n const inputArray = typedArrayFromBinary(bins, track.input);\n const outputArray = typedArrayFromBinary(bins, track.output) as Float32Array;\n\n if (!(inputArray instanceof Float32Array)) {\n throw new Error(`Type of inputArray should be float32, ${inputArray}.`);\n }\n if (!(outputArray instanceof Float32Array)) {\n throw new Error(`Type of outputArray should be float32, ${outputArray}.`);\n }\n if (track.interpolation !== 'LINEAR') {\n throw new Error(`Invalid interpolation type ${track.interpolation}.`);\n }\n\n if (track.path === 'rotation') {\n const points: spec.vec4[] = [];\n const controlPoints: spec.vec4[] = [];\n const lineValue: spec.LineKeyframeValue[] = [];\n\n for (let i = 0; i < inputArray.length; i++) {\n points.push([\n outputArray[i * 4],\n outputArray[i * 4 + 1],\n outputArray[i * 4 + 2],\n outputArray[i * 4 + 3],\n ]);\n\n if (i > 0) {\n const p0 = Quaternion.fromArray(points[i - 1]);\n const p3 = Quaternion.fromArray(points[i]);\n const p1 = new Quaternion();\n const p2 = new Quaternion();\n\n p1.slerpQuaternions(p0, p3, 1 / 3);\n p2.slerpQuaternions(p0, p3, 2 / 3);\n\n controlPoints.push(p1.toArray());\n controlPoints.push(p2.toArray());\n }\n\n lineValue.push([\n spec.BezierKeyframeType.LINE,\n [inputArray[i], i],\n ]);\n }\n\n const node = this.treeInfo.getTreeNode(treeItem.id, track.node);\n const path = this.treeInfo.getNodePath(node.id);\n\n const keyFrames: spec.BezierCurveQuat = [\n spec.ValueType.BEZIER_CURVE_QUAT,\n [lineValue, points, controlPoints],\n ];\n\n clipData.rotationCurves?.push({ path, keyFrames });\n } else if (track.path === 'weights') {\n const node = this.treeInfo.getTreeNode(treeItem.id, track.node);\n let path = this.treeInfo.getNodePath(node.id);\n\n if (node.components.length === 0) {\n for (let i = 0; i < oldScene.items.length; i++) {\n const child = oldScene.items[i];\n\n if (child.parentId === node.id) {\n path += '/' + child.name;\n\n break;\n }\n }\n }\n const component = outputArray.length / inputArray.length;\n\n for (let c = 0; c < component; c++) {\n const lineValue: spec.LineKeyframeValue[] = [];\n\n for (let i = 0; i < inputArray.length; i++) {\n lineValue.push([\n spec.BezierKeyframeType.LINE,\n [inputArray[i], outputArray[i * component + c]],\n ]);\n }\n\n const keyFrames: spec.BezierValue = [\n spec.ValueType.BEZIER_CURVE,\n lineValue,\n ];\n\n clipData.floatCurves?.push({\n path,\n className: 'ModelMeshComponent',\n property: `morphWeights.${c}`,\n keyFrames,\n });\n }\n } else {\n const points: spec.vec3[] = [];\n const controlPoints: spec.vec3[] = [];\n const lineValue: spec.LineKeyframeValue[] = [];\n\n for (let i = 0; i < inputArray.length; i++) {\n points.push([\n outputArray[i * 3],\n outputArray[i * 3 + 1],\n outputArray[i * 3 + 2],\n ]);\n\n if (i > 0) {\n const p0 = Vector3.fromArray(points[i - 1]);\n const p3 = Vector3.fromArray(points[i]);\n const p1 = new Vector3().lerpVectors(p0, p3, 1 / 3);\n const p2 = new Vector3().lerpVectors(p0, p3, 2 / 3);\n\n controlPoints.push(p1.toArray());\n controlPoints.push(p2.toArray());\n }\n\n lineValue.push([\n spec.BezierKeyframeType.LINE,\n [inputArray[i], i],\n ]);\n }\n\n const node = this.treeInfo.getTreeNode(treeItem.id, track.node);\n const path = this.treeInfo.getNodePath(node.id);\n\n const keyFrames: spec.BezierCurvePath = [\n spec.ValueType.BEZIER_CURVE_PATH,\n [lineValue, points, controlPoints],\n ];\n\n if (track.path === 'translation') {\n clipData.positionCurves?.push({ path, keyFrames });\n } else {\n clipData.scaleCurves?.push({ path, keyFrames: keyFrames as unknown as spec.Vector3CurveValue });\n }\n }\n });\n\n newScene.animations.push(clipData);\n\n animationComponent.animationClips.push({ id: clipData.id });\n });\n }\n treeItem.components = [];\n treeItem.components.push({ id: animationComponent.id });\n newScene.components.push(animationComponent);\n }\n\n private getMaterialData (material: spec.MaterialOptions<'json'>, scene: spec.JSONScene) {\n if (material.type === spec.MaterialType.unlit) {\n const floats: Record<string, number> = {};\n\n if (material.alphaCutOff !== undefined) {\n floats['_AlphaCutoff'] = material.alphaCutOff;\n }\n const colors: Record<string, Color> = {\n '_BaseColorFactor': new Color(\n material.baseColorFactor[0],\n material.baseColorFactor[1],\n material.baseColorFactor[2],\n material.baseColorFactor[3],\n ).divide(255),\n };\n\n const textures: Record<string, spec.MaterialTextureProperty> = {};\n\n if (material.baseColorTexture) {\n textures['_BaseColorSampler'] = this.getTextureData(scene, floats, material.baseColorTexture, material.baseColorTextureTransform);\n }\n\n const newMaterial: spec.MaterialData = {\n id: generateGUID(),\n name: material.name,\n dataType: spec.DataType.Material,\n shader: {\n id: UnlitShaderGUID,\n },\n stringTags: {},\n macros: [],\n ints: {},\n floats,\n vector4s: {},\n colors,\n textures,\n };\n\n this.setupMaterial(material, newMaterial);\n\n return newMaterial;\n } else {\n const floats: Record<string, number> = {\n '_MetallicFactor': material.metallicFactor,\n '_RoughnessFactor': material.roughnessFactor,\n };\n\n if (material.useSpecularAA !== undefined) {\n floats['_SpecularAA'] = material.useSpecularAA ? 1 : 0;\n }\n if (material.normalTextureScale !== undefined) {\n floats['_NormalScale'] = material.normalTextureScale;\n }\n if (material.occlusionTextureStrength !== undefined) {\n floats['_OcclusionStrength'] = material.occlusionTextureStrength;\n }\n if (material.emissiveIntensity !== undefined) {\n floats['_EmissiveIntensity'] = material.emissiveIntensity;\n }\n if (material.alphaCutOff !== undefined) {\n floats['_AlphaCutoff'] = material.alphaCutOff;\n }\n const colors: Record<string, Color> = {\n '_BaseColorFactor': new Color(\n material.baseColorFactor[0],\n material.baseColorFactor[1],\n material.baseColorFactor[2],\n material.baseColorFactor[3],\n ).divide(255),\n '_EmissiveFactor': new Color(\n material.emissiveFactor[0],\n material.emissiveFactor[1],\n material.emissiveFactor[2],\n material.emissiveFactor[3],\n ).divide(255),\n };\n\n const textures: Record<string, spec.MaterialTextureProperty> = {};\n\n if (material.baseColorTexture) {\n textures['_BaseColorSampler'] = this.getTextureData(scene, floats, material.baseColorTexture, material.baseColorTextureTransform);\n }\n\n if (material.metallicRoughnessTexture) {\n textures['_MetallicRoughnessSampler'] = this.getTextureData(scene, floats, material.metallicRoughnessTexture, material.metallicRoughnessTextureTransform);\n }\n\n if (material.normalTexture) {\n textures['_NormalSampler'] = this.getTextureData(scene, floats, material.normalTexture, material.normalTextureTransform);\n }\n\n if (material.occlusionTexture) {\n textures['_OcclusionSampler'] = this.getTextureData(scene, floats, material.occlusionTexture, material.occlusionTextureTransform);\n }\n\n if (material.emissiveTexture) {\n textures['_EmissiveSampler'] = this.getTextureData(scene, floats, material.emissiveTexture, material.emissiveTextureTransform);\n }\n\n const newMaterial: spec.MaterialData = {\n id: generateGUID(),\n name: material.name,\n dataType: spec.DataType.Material,\n shader: {\n id: PBRShaderGUID,\n },\n stringTags: {},\n macros: [],\n ints: {},\n floats,\n vector4s: {},\n colors,\n textures,\n };\n\n this.setupMaterial(material, newMaterial);\n\n return newMaterial;\n }\n }\n\n private setupMaterial (oldMat: spec.MaterialOptions<'json'>, newMat: spec.MaterialData) {\n if (oldMat.blending === spec.MaterialBlending.translucent) {\n newMat.stringTags['RenderType'] = spec.RenderType.Transparent;\n } else {\n newMat.stringTags['RenderType'] = spec.RenderType.Opaque;\n }\n\n if (oldMat.blending === spec.MaterialBlending.masked) {\n newMat.floats['AlphaClip'] = 1;\n newMat.floats['_AlphaCutoff'] = oldMat.alphaCutOff ?? 0;\n } else {\n newMat.floats['AlphaClip'] = 0;\n }\n\n switch (oldMat.side) {\n case spec.SideMode.BACK:\n newMat.stringTags['RenderFace'] = spec.RenderFace.Back;\n\n break;\n case spec.SideMode.DOUBLE:\n newMat.stringTags['RenderFace'] = spec.RenderFace.Both;\n\n break;\n default:\n newMat.stringTags['RenderFace'] = spec.RenderFace.Front;\n }\n\n if (oldMat.type === spec.MaterialType.pbr) {\n newMat.floats['_SpecularAA'] = oldMat.useSpecularAA ? 1 : 0;\n }\n\n newMat.floats['ZWrite'] = oldMat.depthMask !== false ? 1 : 0;\n newMat.floats['ZTest'] = 1;\n }\n\n private getTextureData (scene: spec.JSONScene, floats: Record<string, number>, texIndex: number, texTransform?: spec.ModelTextureTransform) {\n const id = scene.textures![texIndex].id ?? '0';\n const texProperty: spec.MaterialTextureProperty = {\n texture: { id },\n };\n\n if (texTransform) {\n if (texTransform.scale) {\n texProperty.scale = {\n x: texTransform.scale[0],\n y: texTransform.scale[1],\n };\n }\n if (texTransform.offset) {\n texProperty.offset = {\n x: texTransform.offset[0],\n y: texTransform.offset[1],\n };\n }\n if (texTransform.rotation) {\n floats['_BaseColorRotation'] = texTransform.rotation;\n }\n }\n\n return texProperty;\n }\n\n private getTransformData (transform?: spec.BaseItemTransform) {\n const result: spec.TransformData = {\n position: { x: 0, y: 0, z: 0 },\n eulerHint: { x: 0, y: 0, z: 0 },\n scale: { x: 1, y: 1, z: 1 },\n };\n\n if (transform?.position) {\n result.position.x = transform.position[0];\n result.position.y = transform.position[1];\n result.position.z = transform.position[2];\n }\n\n if (transform?.quat) {\n // @ts-expect-error\n result.quat = {};\n // @ts-expect-error\n result.quat.x = transform.quat[0];\n // @ts-expect-error\n result.quat.y = transform.quat[1];\n // @ts-expect-error\n result.quat.z = transform.quat[2];\n // @ts-expect-error\n result.quat.w = transform.quat[3];\n } else if (transform?.rotation) {\n result.eulerHint.x = transform.rotation[0];\n result.eulerHint.y = transform.rotation[1];\n result.eulerHint.z = transform.rotation[2];\n }\n\n if (transform?.scale) {\n result.scale.x = transform.scale[0];\n result.scale.y = transform.scale[1];\n result.scale.z = transform.scale[2];\n }\n\n return result;\n }\n\n private setupBoneData (geom: spec.GeometryData, skin: spec.SkinOptions<'json'>, oldScene: spec.JSONScene, treeItem: spec.VFXItemData, treeNodeList: spec.VFXItemData[]) {\n const bins = oldScene.bins as unknown as ArrayBuffer[];\n const { joints, skeleton, inverseBindMatrices } = skin;\n\n if (!inverseBindMatrices) {\n throw new Error(`'inverseBindMatrices' is undefined for the skin configuration: ${JSON.stringify(skin)}. Ensure 'inverseBindMatrices' is properly defined in your skin data.`);\n }\n const bindMatrixArray = typedArrayFromBinary(bins, inverseBindMatrices) as Float32Array;\n\n geom.inverseBindMatrices = Array.from(bindMatrixArray);\n\n const id2Node: Record<string, spec.VFXItemData> = {};\n\n let rootBoneItem = treeItem;\n\n if (skeleton !== undefined) {\n rootBoneItem = treeNodeList[skeleton];\n } else {\n console.warn('Root bone is missing for the skeleton. Defaulting to the primary tree item as the root bone.');\n }\n\n joints.forEach(joint => {\n const node = treeNodeList[joint];\n\n if (node !== rootBoneItem && node.parentId === rootBoneItem.parentId) {\n console.error('Invalid node detected for \\'rootBoneItem\\'. Adjusting \\'rootBoneItem\\' to the primary tree item. Please verify the tree structure.');\n\n rootBoneItem = treeItem;\n }\n });\n\n treeNodeList.forEach(node => {\n id2Node[node.id] = node;\n });\n\n geom.rootBoneName = rootBoneItem.name;\n\n const boneNames: string[] = [];\n\n joints.forEach(joint => {\n let currentItem = treeNodeList[joint];\n const nodeList: string[] = [];\n\n while (currentItem && currentItem != rootBoneItem) {\n nodeList.push(currentItem.name);\n if (currentItem.parentId) {\n currentItem = id2Node[currentItem.parentId];\n } else {\n break;\n }\n }\n\n boneNames.push(nodeList.reverse().join('/'));\n });\n\n geom.boneNames = boneNames;\n\n return rootBoneItem;\n }\n}\n\nclass TreeInfo {\n tree2NodeList: Record<string, spec.VFXItemData[]> = {};\n nodeList2Tree: Record<string, spec.VFXItemData> = {};\n nodeId2Node: Record<string, spec.VFXItemData> = {};\n node2Path: Record<string, string> = {};\n\n add (treeItem: spec.VFXItemData, treeNodeList: spec.VFXItemData[]) {\n if (this.tree2NodeList[treeItem.id]) {\n throw new Error(`Duplicate treeItem ID detected: ${treeItem.id}. Ensure each tree item has a unique ID.`);\n }\n\n this.tree2NodeList[treeItem.id] = treeNodeList;\n treeNodeList.forEach(node => {\n if (this.nodeList2Tree[node.id]) {\n throw new Error(`Duplicate tree node ID found: ${node.id}. Each node in the tree must have a unique ID.`);\n }\n this.nodeList2Tree[node.id] = treeItem;\n this.nodeId2Node[node.id] = node;\n });\n\n treeNodeList.forEach(node => {\n this.setNodePath(node);\n });\n }\n\n setNodePath (node: spec.VFXItemData) {\n if (node.parentId) {\n if (this.node2Path[node.parentId]) {\n this.node2Path[node.id] = this.node2Path[node.parentId] + '/' + node.name;\n } else if (this.nodeId2Node[node.parentId]) {\n this.setNodePath(this.nodeId2Node[node.parentId]);\n this.node2Path[node.id] = this.node2Path[node.parentId] + '/' + node.name;\n } else {\n this.node2Path[node.id] = node.name;\n }\n } else {\n this.node2Path[node.id] = node.name;\n }\n }\n\n getTreeNodeListByTreeId (id: string) {\n return this.tree2NodeList[id];\n }\n\n getTreeNodeListByNodeId (id: string) {\n const treeItem = this.nodeList2Tree[id];\n\n if (!treeItem) {\n throw new Error(`Invalid id ${id}.`);\n }\n\n return this.getTreeNodeListByTreeId(treeItem.id);\n }\n\n getTreeItemByNodeId (id: string) {\n return this.nodeList2Tree[id];\n }\n\n getTreeNode (treeId: string, nodeIndex: number) {\n const nodeList = this.getTreeNodeListByTreeId(treeId);\n\n return nodeList[nodeIndex];\n }\n\n getAllTreeNodeList () {\n const nodeList: spec.VFXItemData[] = [];\n\n Object.keys(this.tree2NodeList).forEach(key => {\n nodeList.push(...this.tree2NodeList[key]);\n });\n\n return nodeList;\n }\n\n getNodePath (id: string) {\n return this.node2Path[id];\n }\n}\n\nexport interface ModelData {\n vertices: spec.TypedArray,\n uvs: spec.TypedArray,\n normals: spec.TypedArray,\n indices: spec.TypedArray,\n name: string,\n}\n\nexport function getGeometryDataFromOptions (geomOptions: GeometryProps) {\n let vertexCount = 0;\n let verticesType: spec.VertexFormatType = spec.VertexFormatType.Float32;\n let verticesNormalize = false;\n let uvsType: spec.VertexFormatType = spec.VertexFormatType.Float32;\n let uvsNormalize = false;\n let normalsType: spec.VertexFormatType = spec.VertexFormatType.Float32;\n let normalsNormalize = false;\n const modelData: ModelData = {\n vertices: new Float32Array(),\n uvs: new Float32Array(),\n normals: new Float32Array(),\n indices: new Float32Array(),\n name: geomOptions.name ?? '<empty>',\n };\n\n for (const attrib in geomOptions.attributes) {\n const attribData = geomOptions.attributes[attrib];\n\n if (attrib === 'aPosition') {\n // @ts-expect-error\n vertexCount = attribData.data.length / attribData.size;\n // @ts-expect-error\n modelData.vertices = attribData.data;\n verticesNormalize = attribData.normalize ?? false;\n verticesType = glType2VertexFormatType(attribData.type ?? glContext.FLOAT);\n } else if (attrib === 'aNormal') {\n // @ts-expect-error\n modelData.normals = attribData.data;\n normalsNormalize = attribData.normalize ?? false;\n normalsType = glType2VertexFormatType(attribData.type ?? glContext.FLOAT);\n } else if (attrib === 'aUV1') {\n // @ts-expect-error\n modelData.uvs = attribData.data;\n uvsNormalize = attribData.normalize ?? false;\n uvsType = glType2VertexFormatType(attribData.type ?? glContext.FLOAT);\n }\n }\n\n const verticesOffset = getOffset(verticesType, 3, vertexCount);\n const uvsOffset = getOffset(uvsType, 2, vertexCount);\n const normalsOffset = getOffset(normalsType, 3, vertexCount);\n\n if (geomOptions.indices) {\n modelData.indices = geomOptions.indices.data;\n } else if (vertexCount <= 65535) {\n const indices = new Uint16Array(vertexCount);\n\n for (let i = 0; i < vertexCount; i++) {\n indices[i] = i;\n }\n modelData.indices = indices;\n } else {\n const indices = new Uint32Array(vertexCount);\n\n for (let i = 0; i < vertexCount; i++) {\n indices[i] = i;\n }\n modelData.indices = indices;\n }\n\n let indicesType: spec.IndexFormatType = spec.IndexFormatType.UInt16;\n\n if (modelData.indices.BYTES_PER_ELEMENT === 4) {\n indicesType = spec.IndexFormatType.UInt32;\n }\n\n const geometryData: spec.GeometryData = {\n id: generateGUID(),\n dataType: spec.DataType.Geometry,\n vertexData: {\n vertexCount: vertexCount,\n channels: [\n {\n semantic: spec.VertexBufferSemantic.Position,\n offset: 0,\n format: verticesType,\n dimension: 3,\n normalize: verticesNormalize,\n },\n {\n semantic: spec.VertexBufferSemantic.Uv,\n offset: verticesOffset,\n format: uvsType,\n dimension: 2,\n normalize: uvsNormalize,\n },\n {\n semantic: spec.VertexBufferSemantic.Normal,\n offset: verticesOffset + uvsOffset,\n format: normalsType,\n dimension: 3,\n normalize: normalsNormalize,\n },\n ],\n },\n subMeshes: [],\n mode: spec.GeometryType.TRIANGLES,\n indexFormat: indicesType,\n indexOffset: verticesOffset + uvsOffset + normalsOffset,\n buffer: encodeVertexData(modelData),\n };\n\n return geometryData;\n}\n\nexport function getGeometryDataFromPropsList (geomPropsList: GeometryProps[]) {\n if (geomPropsList.length <= 0) {\n return;\n }\n\n let totalCount = 0;\n const subMeshes: spec.SubMesh[] = [];\n\n for (let i = 0; i < geomPropsList.length; i++) {\n const count = getDrawCount(geomPropsList[i]);\n const offset = totalCount + (geomPropsList[i].drawStart ?? 0);\n const scale = geomPropsList[0].indices?.data.BYTES_PER_ELEMENT ?? 1;\n\n subMeshes.push({ offset: offset * scale, indexCount: count, vertexCount: count });\n if (i) {\n const geom0 = geomPropsList[0];\n const geom1 = geomPropsList[i];\n\n let isSame = true;\n\n Object.keys(geom0.attributes).forEach(name => {\n const attrib = geom0.attributes[name];\n // @ts-expect-error\n const array1 = attrib.data as spec.TypedArray;\n // @ts-expect-error\n const array2 = geom1.attributes[name].data as spec.TypedArray;\n\n if (array1.length !== array2.length || array1[0] !== array2[0]) {\n isSame = false;\n }\n });\n\n if (isSame) {\n if (geom0.indices && geom1.indices) {\n geom0.indices.data = mergeTypedArray(geom0.indices.data, geom1.indices.data);\n }\n } else {\n if (geom0.indices && geom1.indices) {\n const vertexCount = getVertexCount(geom0);\n\n geom0.indices.data = mergeTypedArray(geom0.indices.data, geom1.indices.data, vertexCount);\n }\n\n Object.keys(geom0.attributes).forEach(name => {\n const attrib = geom0.attributes[name];\n // @ts-expect-error\n const array1 = attrib.data as spec.TypedArray;\n // @ts-expect-error\n const array2 = geom1.attributes[name].data as spec.TypedArray;\n\n // @ts-expect-error\n attrib.data = mergeTypedArray(array1, array2);\n });\n }\n\n }\n totalCount = offset + count;\n }\n\n return createGeometryData(geomPropsList[0], subMeshes);\n}\n\nfunction getOffset (formatType: spec.VertexFormatType, dimension: number, count: number) {\n switch (formatType) {\n case spec.VertexFormatType.Int8:\n case spec.VertexFormatType.UInt8:\n return dimension * count;\n case spec.VertexFormatType.Int16:\n case spec.VertexFormatType.UInt16:\n return dimension * count * 2;\n default:\n return dimension * count * 4;\n }\n}\n\nfunction createGeometryData (props: GeometryProps, subMeshes: spec.SubMesh[]) {\n let totalByteLength = 0;\n\n for (const attrib in props.attributes) {\n const attribData = props.attributes[attrib];\n\n // @ts-expect-error\n totalByteLength += attribData.data.byteLength;\n }\n\n if (props.indices) {\n totalByteLength += props.indices.data.byteLength;\n }\n\n let vertexCount = 0;\n let bufferOffset = 0;\n const buffer = new Uint8Array(totalByteLength);\n const vertexChannels: spec.VertexChannel[] = [];\n\n for (const attrib in props.attributes) {\n const attribData = props.attributes[attrib];\n const semantic = vertexBufferSemanticMap[attrib] ?? attrib;\n\n // @ts-expect-error\n vertexCount = attribData.data.length / attribData.size;\n const vertexChannel: spec.VertexChannel = {\n semantic,\n offset: bufferOffset,\n format: glType2VertexFormatType(attribData.type ?? glContext.FLOAT),\n dimension: attribData.size,\n normalize: attribData.normalize,\n };\n\n vertexChannels.push(vertexChannel);\n // @ts-expect-error\n const data = attribData.data as spec.TypedArray;\n const subBuffer = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n\n buffer.set(subBuffer, bufferOffset);\n bufferOffset += subBuffer.byteLength;\n }\n\n const geometryData: spec.GeometryData = {\n id: generateGUID(),\n dataType: spec.DataType.Geometry,\n vertexData: {\n vertexCount: vertexCount,\n channels: vertexChannels,\n },\n subMeshes,\n mode: spec.GeometryType.TRIANGLES,\n indexFormat: spec.IndexFormatType.None,\n indexOffset: 0,\n buffer: '',\n };\n\n if (props.indices) {\n const indices = props.indices.data;\n const subBuffer = new Uint8Array(indices.buffer, indices.byteOffset, indices.byteLength);\n\n buffer.set(subBuffer, bufferOffset);\n geometryData.indexOffset = bufferOffset;\n if (indices instanceof Uint32Array) {\n geometryData.indexFormat = spec.IndexFormatType.UInt32;\n } else {\n geometryData.indexFormat = spec.IndexFormatType.UInt16;\n }\n }\n\n geometryData.buffer = toBase64String(buffer);\n\n return geometryData;\n}\n\nfunction encodeVertexData (modelData: ModelData): string {\n const vertices = new Uint8Array(modelData.vertices.buffer, modelData.vertices.byteOffset, modelData.vertices.byteLength);\n const uvs = new Uint8Array(modelData.uvs.buffer, modelData.uvs.byteOffset, modelData.uvs.byteLength);\n const normals = new Uint8Array(modelData.normals.buffer, modelData.normals.byteOffset, modelData.normals.byteLength);\n const indices = new Uint8Array(modelData.indices.buffer, modelData.indices.byteOffset, modelData.indices.byteLength);\n\n // 计算新 ArrayBuffer 的总大小(以字节为单位)\n const totalSize = vertices.byteLength + uvs.byteLength + normals.byteLength + indices.byteLength;\n\n // 创建一个足够大的 ArrayBuffer 来存储两个数组的数据\n const buffer = new ArrayBuffer(totalSize);\n\n // 创建一个视图来按照 Float32 格式写入数据\n let floatView = new Uint8Array(buffer, 0, vertices.byteLength);\n\n floatView.set(vertices);\n floatView = new Uint8Array(buffer, vertices.byteLength, uvs.byteLength);\n floatView.set(uvs);\n floatView = new Uint8Array(buffer, vertices.byteLength + uvs.byteLength, normals.byteLength);\n floatView.set(normals);\n\n // 创建一个视图来按照 Uint16 格式写入数据,紧接着 Float32 数据之后\n const uint16View = new Uint8Array(buffer, vertices.byteLength + uvs.byteLength + normals.byteLength, indices.byteLength);\n\n uint16View.set(indices);\n\n // 创建一个 Uint8Array 视图以便逐字节访问 ArrayBuffer 的数据\n const uint8View = new Uint8Array(buffer);\n\n // 将 Uint8Array 转换为二进制字符串\n let binaryString = '';\n\n for (let i = 0; i < uint8View.length; i++) {\n binaryString += String.fromCharCode(uint8View[i]);\n }\n\n // 使用 btoa 函数将二进制字符串转换为 Base64 编码的字符串\n return btoa(binaryString);\n}\n\nfunction toBase64String (array: Uint8Array) {\n // 将 Uint8Array 转换为二进制字符串\n let binaryString = '';\n\n for (let i = 0; i < array.length; i++) {\n binaryString += String.fromCharCode(array[i]);\n }\n\n // 使用 btoa 函数将二进制字符串转换为 Base64 编码的字符串\n return btoa(binaryString);\n}\n\nfunction getDrawCount (geomProps: GeometryProps) {\n if (geomProps.drawCount) {\n return geomProps.drawCount;\n } else if (geomProps.indices) {\n return geomProps.indices.data.length;\n } else {\n let drawCount = 0;\n\n // @ts-expect-error\n geomProps.attributes.forEach(attrib => {\n drawCount = attrib.data.length / attrib.size;\n });\n\n return drawCount;\n }\n}\n\nfunction getVertexCount (geomProps: GeometryProps) {\n let vertexCount = 0;\n\n Object.keys(geomProps.attributes).forEach(name => {\n const attrib = geomProps.attributes[name];\n\n // @ts-expect-error\n vertexCount = attrib.data.length / attrib.size;\n });\n\n return vertexCount;\n}\n\nfunction mergeTypedArray (array1: spec.TypedArray, array2: spec.TypedArray, offset?: number) {\n if (array1 instanceof Float32Array) {\n const result = new Float32Array(array1.length + array2.length);\n\n result.set(array1);\n result.set(array2, array1.length);\n\n return result;\n } else if (array1 instanceof Int32Array) {\n const result = new Int32Array(array1.length + array2.length);\n\n result.set(array1);\n result.set(array2, array1.length);\n\n return result;\n } else if (array1 instanceof Uint32Array) {\n const result = new Uint32Array(array1.length + array2.length);\n\n result.set(array1);\n result.set(array2, array1.length);\n if (offset) {\n for (let i = 0; i < array2.length; i++) {\n result[array1.length + i] += offset;\n }\n }\n\n return result;\n } else if (array1 instanceof Int16Array) {\n const result = new Int16Array(array1.length + array2.length);\n\n result.set(array1);\n result.set(array2, array1.length);\n\n return result;\n } else if (array1 instanceof Uint16Array) {\n const result = new Uint16Array(array1.length + array2.length);\n\n result.set(array1);\n result.set(array2, array1.length);\n if (offset) {\n for (let i = 0; i < array2.length; i++) {\n result[array1.length + i] += offset;\n }\n }\n\n return result;\n } else if (array1 instanceof Int8Array) {\n const result = new Int8Array(array1.length + array2.length);\n\n result.set(array1);\n result.set(array2, array1.length);\n\n return result;\n } else {\n const result = new Uint8Array(array1.length + array2.length);\n\n result.set(array1);\n result.set(array2, array1.length);\n\n return result;\n }\n}\n\nconst vertexBufferSemanticMap: Record<string, string> = {\n aPos: 'POSITION',\n aUV: 'TEXCOORD0',\n aUV2: 'TEXCOORD1',\n aNormal: 'NORMAL',\n aTangent: 'TANGENT',\n aColor: 'COLOR',\n aJoints: 'JOINTS',\n aWeights: 'WEIGHTS',\n //\n a_Position: 'POSITION',\n a_UV: 'TEXCOORD0',\n a_UV1: 'TEXCOORD0',\n a_UV2: 'TEXCOORD1',\n a_Normal: 'NORMAL',\n a_Tangent: 'TANGENT',\n a_Color: 'COLOR',\n a_Joints: 'JOINTS',\n a_Joint1: 'JOINTS',\n a_Weights: 'WEIGHTS',\n a_Weight1: 'WEIGHTS',\n //\n a_Target_Position0: 'POSITION_BS0',\n a_Target_Position1: 'POSITION_BS1',\n a_Target_Position2: 'POSITION_BS2',\n a_Target_Position3: 'POSITION_BS3',\n a_Target_Position4: 'POSITION_BS4',\n a_Target_Position5: 'POSITION_BS5',\n a_Target_Position6: 'POSITION_BS6',\n a_Target_Position7: 'POSITION_BS7',\n a_Target_Normal0: 'NORMAL_BS0',\n a_Target_Normal1: 'NORMAL_BS1',\n a_Target_Normal2: 'NORMAL_BS2',\n a_Target_Normal3: 'NORMAL_BS3',\n a_Target_Tangent0: 'TANGENT_BS0',\n a_Target_Tangent1: 'TANGENT_BS1',\n a_Target_Tangent2: 'TANGENT_BS2',\n a_Target_Tangent3: 'TANGENT_BS3',\n};\n","import { spec, generateGUID, glContext, addItem, loadImage, Transform, Geometry } from '@galacean/effects';\nimport type { TextureSourceOptions, TextureCubeSourceOptionsImageMipmaps, math, TransformProps, Engine, Texture, Attribute } from '@galacean/effects';\nimport type {\n SkyboxType, LoadSceneOptions, LoadSceneResult, Loader, ModelCamera, ModelLight, ModelSkybox, ModelImageLike,\n} from './protocol';\nimport type {\n ModelMeshComponentData,\n ModelSkyboxComponentData,\n ModelLightComponentData,\n ModelCameraComponentData,\n ModelAnimationOptions,\n ModelAnimTrackOptions,\n ModelMaterialOptions,\n ModelSkyboxOptions,\n ModelTextureTransform,\n} from '../index';\nimport {\n Vector3, Box3, Euler, PSkyboxCreator, PSkyboxType, UnlitShaderGUID, PBRShaderGUID,\n} from '../runtime';\nimport { LoaderHelper } from './loader-helper';\nimport { WebGLHelper } from '../utility';\nimport type { PImageBufferData, PSkyboxBufferParams, PSkyboxURLParams } from '../runtime/skybox';\nimport type {\n GLTFMesh, GLTFImage, GLTFMaterial, GLTFTexture, GLTFLight,\n GLTFCamera, GLTFAnimation, GLTFResources, GLTFImageBasedLight, GLTFPrimitive,\n GLTFBufferAttribute, GLTFBounds, GLTFTextureInfo,\n} from '@vvfx/resource-detection';\nimport type { CubeImage } from '@vvfx/resource-detection/dist/src/gltf-tools/gltf-image-based-light';\n\nexport interface LoaderOptions {\n compatibleMode?: 'gltf' | 'tiny3d',\n}\n\nexport function getDefaultEffectsGLTFLoader (engine: Engine, options?: LoaderOptions): Loader {\n if (!defaultGLTFLoader) {\n defaultGLTFLoader = new LoaderImpl();\n }\n\n (defaultGLTFLoader as LoaderImpl).initial(engine, options);\n\n return defaultGLTFLoader;\n}\n\nexport function setDefaultEffectsGLTFLoader (loader: Loader): void {\n defaultGLTFLoader = loader;\n}\n\nlet defaultGLTFLoader: Loader;\n\ntype Box3 = math.Box3;\n\nexport class LoaderImpl implements Loader {\n private sceneOptions: LoadSceneOptions;\n private loaderOptions: LoaderOptions;\n private gltfMeshs: GLTFMesh[] = [];\n private gltfTextures: GLTFTexture[] = [];\n private gltfMaterials: GLTFMaterial[] = [];\n private gltfAnimations: GLTFAnimation[] = [];\n private gltfImageBasedLights: GLTFImageBasedLight[] = [];\n\n composition: spec.CompositionData;\n timelineAssetId: string = '';\n images: spec.Image[] = [];\n imageElements: ModelImageLike[] = [];\n textures: spec.TextureDefine[] = [];\n items: spec.VFXItemData[] = [];\n components: spec.ComponentData[] = [];\n materials: spec.MaterialData[] = [];\n shaders: spec.ShaderData[] = [];\n geometries: spec.GeometryData[] = [];\n animations: spec.AnimationClipData[] = [];\n sceneAABB = new Box3();\n\n engine: Engine;\n\n constructor (composition?: spec.CompositionData) {\n if (composition) {\n this.composition = composition;\n } else {\n this.timelineAssetId = generateGUID();\n this.composition = {\n id: '1',\n name: 'test1',\n duration: 99999,\n endBehavior: spec.EndBehavior.restart,\n camera: {\n fov: 45,\n far: 2000,\n near: 0.001,\n position: [0, 0, 8],\n rotation: [0, 0, 0],\n clipMode: spec.CameraClipMode.portrait,\n },\n //@ts-expect-error\n items: [],\n timelineAsset: { id: this.timelineAssetId },\n sceneBindings: [],\n };\n }\n }\n\n async loadScene (options: LoadSceneOptions): Promise<LoadSceneResult> {\n this.clear();\n this.sceneOptions = options;\n this.loaderOptions = { compatibleMode: options.gltf.compatibleMode };\n const gltfResource = options.gltf.resource;\n\n if (typeof gltfResource === 'string' || gltfResource instanceof Uint8Array) {\n throw new Error('Please load the resource using GLTFTools first.');\n }\n\n this.images = gltfResource.images.map(gltfImage => {\n const blob = new Blob([gltfImage.imageData.buffer], { type: gltfImage.mimeType ?? 'image/png' });\n\n return {\n id: gltfImage.id,\n url: URL.createObjectURL(blob),\n };\n });\n\n this.imageElements = await Promise.all(this.images.map(async image => {\n return loadImage(image.url);\n }));\n\n this.processGLTFResource(gltfResource, this.imageElements);\n this.gltfMeshs = gltfResource.meshes;\n this.gltfTextures = gltfResource.textures;\n this.gltfMaterials = gltfResource.materials;\n this.gltfAnimations = gltfResource.animations;\n this.gltfImageBasedLights = gltfResource.imageBasedLights;\n\n this.textures = this.gltfTextures.map(texture => {\n const textureOptions = texture.textureOptions;\n const source = textureOptions.source;\n\n if (typeof source === 'number') {\n textureOptions.source = {\n id: this.images[source].id,\n };\n }\n\n return textureOptions;\n });\n this.materials = this.gltfMaterials.map(material => {\n return material.materialData;\n });\n\n gltfResource.meshes.forEach(mesh => {\n this.geometries.push(mesh.geometryData);\n });\n const gltfScene = gltfResource.scenes[0];\n\n gltfScene.meshesComponentData.forEach(mesh => this.checkMeshComponentData(mesh, gltfResource));\n\n this.components.push(...gltfScene.camerasComponentData);\n this.components.push(...gltfScene.lightsComponentData);\n this.components.push(...gltfScene.meshesComponentData);\n if (gltfScene.animationsComponentData.length === 1) {\n const component = gltfScene.animationsComponentData[0];\n\n if (!options.effects.playAllAnimation && options.effects.playAnimation !== undefined) {\n const clips = component.animationClips;\n const index = options.effects.playAnimation;\n\n if (index >= 0 && index < clips.length) {\n component.animationClips = [clips[index]];\n } else {\n component.animationClips = [];\n }\n }\n this.components.push(component);\n } else if (gltfScene.animationsComponentData.length > 1) {\n throw new Error(`Find many animation component data ${gltfScene.animationsComponentData.length}`);\n }\n\n this.animations = [];\n this.gltfAnimations.forEach(anim => {\n this.animations.push(anim.animationClipData);\n });\n\n this.items = [];\n\n await this.tryAddSkybox({\n skyboxType: options.gltf.skyboxType,\n renderable: options.gltf.skyboxVis,\n });\n\n this.items.push(...gltfResource.scenes[0].vfxItemData);\n this.items.forEach(item => {\n if (item.type === 'root' as spec.ItemType) {\n item.type = 'ECS' as spec.ItemType;\n }\n });\n\n return this.getLoadResult();\n }\n\n processGLTFResource (resource: GLTFResources, imageElements: ModelImageLike[]): void {\n const textureDataMap: Record<string, TextureSourceOptions> = {};\n const { textures, materials, scenes, imageBasedLights } = resource;\n\n textures.forEach(tex => {\n const texData = tex.textureOptions;\n const texId = (texData as unknown as spec.EffectsObjectData).id;\n\n if (texId) {\n if (textureDataMap[texId]) {\n console.error(`Duplicate GUID found: ${texId}, old ${textureDataMap[texId]}, new ${texData}.`);\n }\n textureDataMap[texId] = texData;\n } else {\n console.error(`No GUID in texture Data: ${texData}.`);\n }\n });\n\n const baseColorIdSet: Set<string> = new Set();\n const emissiveIdSet: Set<string> = new Set();\n\n materials.forEach(mat => {\n const materialData = mat.materialData;\n const baseColorTexture = materialData.textures['_BaseColorSampler']?.texture;\n const emissiveTexture = materialData.textures['_EmissiveSampler']?.texture;\n\n if (baseColorTexture) {\n baseColorIdSet.add(baseColorTexture.id);\n }\n if (emissiveTexture) {\n emissiveIdSet.add(emissiveTexture.id);\n }\n });\n\n let addTextures = 0;\n const textureIdMap: Record<string, string> = {};\n\n for (const baseColorId of baseColorIdSet) {\n if (emissiveIdSet.has(baseColorId)) {\n const texData = textures.find(tex => tex.textureOptions.id === baseColorId);\n\n if (texData) {\n const newId = generateGUID();\n const newTexData = texData.clone();\n\n newTexData.textureOptions.id = newId;\n textures.push(newTexData);\n textureDataMap[newId] = newTexData.textureOptions;\n textureIdMap[baseColorId] = newId;\n addTextures += 1;\n }\n }\n }\n\n if (addTextures > 0) {\n console.warn(`Add base color texture ${addTextures}`);\n }\n\n materials.forEach(mat => {\n const materialData = mat.materialData;\n\n this.processMaterialData(materialData);\n\n if (materialData.shader?.id === UnlitShaderGUID) {\n this.processMaterialTexture(materialData, '_BaseColorSampler', true, textureDataMap, imageElements);\n } else if (materialData.shader?.id === PBRShaderGUID) {\n const emissiveTexture = materialData.textures['_EmissiveSampler']?.texture;\n\n if (emissiveTexture && textureIdMap[emissiveTexture.id]) {\n emissiveTexture.id = textureIdMap[emissiveTexture.id];\n }\n\n this.processMaterialTexture(materialData, '_BaseColorSampler', true, textureDataMap, imageElements);\n this.processMaterialTexture(materialData, '_MetallicRoughnessSampler', false, textureDataMap, imageElements);\n this.processMaterialTexture(materialData, '_NormalSampler', false, textureDataMap, imageElements);\n this.processMaterialTexture(materialData, '_OcclusionSampler', false, textureDataMap, imageElements);\n this.processMaterialTexture(materialData, '_EmissiveSampler', false, textureDataMap, imageElements);\n }\n });\n\n const gltfScene = scenes[0];\n\n gltfScene.camerasComponentData.forEach(comp => this.processCameraComponentData(comp));\n gltfScene.lightsComponentData.forEach(comp => this.processLightComponentData(comp));\n\n const cubeTextures: TextureSourceOptions[] = [];\n\n imageBasedLights.forEach(ibl => {\n const data = ibl.imageBaseLightData;\n\n if (data.reflectionsIntensity === undefined) {\n data.reflectionsIntensity = data.intensity;\n }\n\n if (data.diffuseImage) {\n const diffuseTexture = textureDataMap[data.diffuseImage.id];\n\n addItem(cubeTextures, diffuseTexture);\n }\n if (data.specularImage) {\n const specularImage = textureDataMap[data.specularImage.id];\n\n addItem(cubeTextures, specularImage);\n }\n });\n\n cubeTextures.forEach(tex => {\n if (tex.target === glContext.TEXTURE_CUBE_MAP) {\n const cube = tex as TextureCubeSourceOptionsImageMipmaps;\n\n cube.mipmaps.forEach(mipmap => {\n [mipmap[4], mipmap[5]] = [mipmap[5], mipmap[4]];\n });\n\n if (cube.mipmaps.length === 1) {\n cube.minFilter = glContext.LINEAR;\n cube.magFilter = glContext.LINEAR;\n } else {\n cube.minFilter = glContext.LINEAR_MIPMAP_LINEAR;\n cube.magFilter = glContext.LINEAR;\n }\n }\n });\n }\n\n processComponentData (components: spec.EffectComponentData[]): void {\n components.forEach(comp => {\n if (comp.dataType === spec.DataType.LightComponent) {\n this.processLightComponentData(comp as unknown as ModelLightComponentData);\n } else if (comp.dataType === spec.DataType.CameraComponent) {\n this.processCameraComponentData(comp as unknown as ModelCameraComponentData);\n } else if (comp.dataType === spec.DataType.SkyboxComponent) {\n this.processSkyboxComponentData(comp as unknown as ModelSkyboxComponentData);\n }\n });\n }\n\n processLightComponentData (light: ModelLightComponentData): void {\n if (!light.color) {\n light.color = { r: 1, g: 1, b: 1, a: 1 };\n }\n\n if (!light.intensity) {\n light.intensity = 1;\n }\n\n if (light.lightType === spec.LightType.point) {\n if (!light.range) {\n light.range = 0;\n }\n } else if (light.lightType === spec.LightType.spot) {\n if (!light.range) {\n light.range = 0;\n }\n\n if (!light.innerConeAngle) {\n light.innerConeAngle = 0;\n }\n\n if (!light.outerConeAngle) {\n light.outerConeAngle = Math.PI / 4;\n }\n }\n }\n\n processCameraComponentData (camera: ModelCameraComponentData): void {\n if (camera.type === spec.CameraType.perspective) {\n if (camera.fov) {\n camera.fov *= Math.PI / 180;\n }\n }\n }\n\n processSkyboxComponentData (skybox: ModelSkyboxComponentData): void {\n if (skybox.intensity === undefined) {\n skybox.intensity = 1;\n }\n\n if (skybox.reflectionsIntensity === undefined) {\n skybox.reflectionsIntensity = 1;\n }\n }\n\n processMaterialData (material: spec.MaterialData): void {\n if (material.shader?.id === UnlitShaderGUID) {\n if (!material.colors['_BaseColorFactor']) {\n material.colors['_BaseColorFactor'] = { r: 1, g: 1, b: 1, a: 1 };\n }\n\n if (material.floats['_AlphaCutoff'] === undefined) {\n material.floats['_AlphaCutoff'] = 0;\n }\n\n if (material.floats['ZWrite'] === undefined) {\n material.floats['ZWrite'] = 1;\n }\n\n if (material.floats['ZTest'] === undefined) {\n material.floats['ZTest'] = 1;\n }\n\n if (!material.stringTags['RenderType']) {\n material.stringTags['RenderType'] = spec.RenderType.Opaque;\n }\n\n if (!material.stringTags['RenderFace']) {\n material.stringTags['RenderFace'] = spec.RenderFace.Front;\n }\n } else if (material.shader?.id === PBRShaderGUID) {\n if (!material.colors['_BaseColorFactor']) {\n material.colors['_BaseColorFactor'] = { r: 1, g: 1, b: 1, a: 1 };\n }\n\n if (material.floats['_SpecularAA'] === undefined) {\n material.floats['_SpecularAA'] = 0;\n }\n\n if (material.floats['_MetallicFactor'] === undefined) {\n material.floats['_MetallicFactor'] = 1;\n }\n\n if (material.floats['_RoughnessFactor'] === undefined) {\n material.floats['_RoughnessFactor'] = 0;\n }\n\n if (material.floats['_NormalScale'] === undefined) {\n material.floats['_NormalScale'] = 1;\n }\n\n if (material.floats['_OcclusionStrength'] === undefined) {\n material.floats['_OcclusionStrength'] = this.isTiny3dMode() ? 0 : 1;\n }\n\n if (!material.colors['_EmissiveFactor']) {\n material.colors['_EmissiveFactor'] = { r: 0, g: 0, b: 0, a: 1 };\n }\n\n if (material.floats['_EmissiveIntensity'] === undefined) {\n material.floats['_EmissiveIntensity'] = 1;\n }\n\n if (material.floats['_AlphaCutoff'] === undefined) {\n material.floats['_AlphaCutoff'] = 0;\n }\n\n if (material.floats['ZWrite'] === undefined) {\n material.floats['ZWrite'] = 1;\n }\n\n if (material.floats['ZTest'] === undefined) {\n material.floats['ZTest'] = 1;\n }\n\n if (!material.stringTags['RenderType']) {\n material.stringTags['RenderType'] = spec.RenderType.Opaque;\n }\n\n if (!material.stringTags['RenderFace']) {\n material.stringTags['RenderFace'] = spec.RenderFace.Front;\n }\n } else {\n console.error(`Encountered unknown shader ID in material with ID: ${material.id}.`);\n }\n }\n\n processTextureOptions (options: TextureSourceOptions, isBaseColor: boolean, image?: ModelImageLike): void {\n let premultiplyAlpha = false;\n let minFilter = options.minFilter ?? glContext.LINEAR_MIPMAP_LINEAR;\n\n if (this.isTiny3dMode()) {\n minFilter = glContext.LINEAR_MIPMAP_LINEAR;\n if (image) {\n if (!WebGLHelper.isPow2(image.width) || !WebGLHelper.isPow2(image.height)) {\n minFilter = glContext.LINEAR;\n }\n }\n\n premultiplyAlpha = isBaseColor ? false : true;\n }\n\n const generateMipmap = minFilter == glContext.NEAREST_MIPMAP_NEAREST\n || minFilter == glContext.LINEAR_MIPMAP_NEAREST\n || minFilter == glContext.NEAREST_MIPMAP_LINEAR\n || minFilter == glContext.LINEAR_MIPMAP_LINEAR;\n\n options.wrapS = options.wrapS ?? glContext.REPEAT;\n options.wrapT = options.wrapT ?? glContext.REPEAT;\n options.magFilter = options.magFilter ?? glContext.LINEAR;\n options.minFilter = minFilter;\n options.anisotropic = 1;\n options.premultiplyAlpha = premultiplyAlpha;\n options.generateMipmap = generateMipmap;\n }\n\n initial (engine: Engine, options?: LoaderOptions) {\n this.engine = engine;\n this.loaderOptions = options ?? {};\n }\n\n checkMeshComponentData (mesh: ModelMeshComponentData, resource: GLTFResources): void {\n if (mesh.materials.length <= 0) {\n throw new Error(`Submesh array is empty for mesh with ID: ${mesh.id}.`);\n }\n\n let geometryData: spec.GeometryData | undefined;\n\n resource.meshes.forEach(meshData => {\n if (meshData.geometryData.id === mesh.geometry.id) {\n geometryData = meshData.geometryData;\n }\n });\n\n if (geometryData === undefined) {\n throw new Error(`Unable to find geometry data for mesh with ID: ${mesh.geometry.id}.`);\n }\n\n if (geometryData.subMeshes.length !== mesh.materials.length) {\n throw new Error(`Mismatch between submeshes count (${geometryData.subMeshes.length}) and materials count (${mesh.materials.length}).`);\n }\n }\n\n processMaterialTexture (material: spec.MaterialData, textureName: string, isBaseColor: boolean, textureDataMap: Record<string, TextureSourceOptions>, imageElements: ModelImageLike[]) {\n const texture = material.textures[textureName];\n\n if (texture) {\n const id = texture.texture.id;\n const texData = textureDataMap[id];\n let imageObj: ModelImageLike | undefined;\n\n // @ts-expect-error\n if (typeof texData.source !== 'number') {\n // @ts-expect-error\n throw new Error(`Invalid texture option source data, ${texData.source}`);\n } else {\n // @ts-expect-error\n imageObj = imageElements[texData.source];\n }\n if (texData) {\n this.processTextureOptions(texData, isBaseColor, imageObj);\n }\n }\n }\n\n getLoadResult (): LoadSceneResult {\n const itemIds: spec.DataPath[] = [];\n\n this.items.forEach(item => itemIds.push({ id: item.id }));\n //@ts-expect-error\n this.composition.items = itemIds;\n\n const jsonScene: spec.JSONScene = {\n version: spec.JSONSceneVersion['3_0'],\n playerVersion: {\n web: '2.0',\n native: '2.0',\n },\n type: 'ge',\n compositionId: this.composition.id,\n compositions: [this.composition],\n images: this.images,\n plugins: ['model'],\n textures: this.textures,\n items: this.items,\n components: this.components,\n materials: this.materials,\n shaders: this.shaders,\n geometries: this.geometries,\n animations: this.animations,\n miscs: [\n {\n id: this.timelineAssetId,\n dataType: spec.DataType.TimelineAsset,\n },\n ],\n };\n\n const sceneAABB = this.computeSceneAABB();\n\n return {\n source: this.getRemarkString(),\n jsonScene,\n sceneAABB: {\n min: sceneAABB.min.toArray(),\n max: sceneAABB.max.toArray(),\n },\n };\n }\n\n addLight (data: ModelLight) {\n const itemId = generateGUID();\n const component: spec.ModelLightComponentData = {\n id: generateGUID(),\n item: { id: itemId },\n dataType: spec.DataType.LightComponent,\n //\n lightType: data.lightType,\n color: data.color,\n intensity: data.intensity,\n range: data.range,\n innerConeAngle: data.innerConeAngle,\n outerConeAngle: data.outerConeAngle,\n followCamera: data.followCamera,\n };\n const item: spec.VFXItemData = {\n id: itemId,\n name: data.name,\n duration: data.duration,\n type: spec.ItemType.light,\n pn: 0,\n visible: true,\n endBehavior: data.endBehavior,\n transform: {\n position: {\n x: data.position[0],\n y: data.position[1],\n z: data.position[2],\n },\n eulerHint: {\n x: data.rotation[0],\n y: data.rotation[1],\n z: data.rotation[2],\n },\n scale: {\n x: data.scale[0],\n y: data.scale[1],\n z: data.scale[2],\n },\n },\n components: [\n { id: component.id },\n ],\n content: {},\n dataType: spec.DataType.VFXItemData,\n };\n\n this.items.push(item);\n this.components.push(component);\n }\n\n addCamera (camera: ModelCamera) {\n const itemId = generateGUID();\n const component: spec.ModelCameraComponentData = {\n id: generateGUID(),\n item: { id: itemId },\n dataType: spec.DataType.CameraComponent,\n fov: camera.fov,\n near: camera.near,\n far: camera.far,\n clipMode: camera.clipMode,\n };\n const item: spec.VFXItemData = {\n id: itemId,\n name: camera.name,\n duration: camera.duration,\n // @ts-expect-error\n type: 'camera',\n pn: 0,\n visible: true,\n endBehavior: camera.endBehavior,\n transform: {\n position: {\n x: camera.position[0],\n y: camera.position[1],\n z: camera.position[2],\n },\n eulerHint: {\n x: camera.rotation[0],\n y: camera.rotation[1],\n z: camera.rotation[2],\n },\n scale: {\n x: 1,\n y: 1,\n z: 1,\n },\n },\n components: [\n { id: component.id },\n ],\n content: {},\n dataType: spec.DataType.VFXItemData,\n };\n\n this.items.push(item);\n this.components.push(component);\n }\n\n addSkybox (skybox: PSkyboxURLParams) {\n const itemId = generateGUID();\n const skyboxInfo = PSkyboxCreator.createSkyboxComponentData(skybox);\n const { imageList, textureOptionsList, component } = skyboxInfo;\n\n component.item.id = itemId;\n if (skybox.intensity !== undefined) {\n component.intensity = skybox.intensity;\n }\n if (skybox.reflectionsIntensity !== undefined) {\n component.reflectionsIntensity = skybox.reflectionsIntensity;\n }\n component.renderable = skybox.renderable ?? false;\n\n const item: spec.VFXItemData = {\n id: itemId,\n name: 'Skybox-Customize',\n duration: 999,\n type: spec.ItemType.skybox,\n pn: 0,\n visible: true,\n endBehavior: spec.EndBehavior.freeze,\n transform: {\n position: {\n x: 0,\n y: 0,\n z: 0,\n },\n eulerHint: {\n x: 0,\n y: 0,\n z: 0,\n },\n scale: {\n x: 1,\n y: 1,\n z: 1,\n },\n },\n components: [\n { id: component.id },\n ],\n content: {},\n dataType: spec.DataType.VFXItemData,\n };\n\n this.images.push(...imageList);\n // @ts-expect-error\n this.textures.push(...textureOptionsList);\n this.items.push(item);\n this.components.push(component);\n }\n\n private async tryAddSkybox (skybox: ModelSkybox) {\n if (this.gltfImageBasedLights.length > 0 && !this.ignoreSkybox()) {\n const ibl = this.gltfImageBasedLights[0];\n\n this.components.push(ibl.imageBaseLightData);\n } else if (skybox.skyboxType !== undefined) {\n const itemId = generateGUID();\n const skyboxInfo = this.createSkyboxComponentData(skybox.skyboxType as SkyboxType);\n const { imageList, textureOptionsList, component } = skyboxInfo;\n\n component.item.id = itemId;\n if (skybox.intensity !== undefined) {\n component.intensity = skybox.intensity;\n }\n if (skybox.reflectionsIntensity !== undefined) {\n component.reflectionsIntensity = skybox.reflectionsIntensity;\n }\n component.renderable = skybox.renderable ?? false;\n\n const item: spec.VFXItemData = {\n id: itemId,\n name: `Skybox-${skybox.skyboxType}`,\n duration: skybox.duration ?? 999,\n type: spec.ItemType.skybox,\n pn: 0,\n visible: true,\n endBehavior: spec.EndBehavior.freeze,\n transform: {\n position: {\n x: 0,\n y: 0,\n z: 0,\n },\n eulerHint: {\n x: 0,\n y: 0,\n z: 0,\n },\n scale: {\n x: 1,\n y: 1,\n z: 1,\n },\n },\n components: [\n { id: component.id },\n ],\n content: {},\n dataType: spec.DataType.VFXItemData,\n };\n\n this.images.push(...imageList);\n // @ts-expect-error\n this.textures.push(...textureOptionsList);\n this.items.push(item);\n this.components.push(component);\n }\n }\n\n createSkyboxComponentData (typeName: SkyboxType) {\n if (typeName !== 'NFT' && typeName !== 'FARM') {\n throw new Error(`Invalid skybox type specified: '${typeName}'. Valid types are: 'NFT', 'FARM'.`);\n }\n //\n const typ = typeName === 'NFT' ? PSkyboxType.NFT : PSkyboxType.FARM;\n const params = PSkyboxCreator.getSkyboxParams(typ);\n\n return PSkyboxCreator.createSkyboxComponentData(params);\n }\n\n dispose () {\n this.clear();\n // @ts-expect-error\n this.engine = null;\n }\n\n clear () {\n this.gltfMeshs = [];\n this.gltfTextures = [];\n this.gltfMaterials = [];\n this.gltfAnimations = [];\n this.gltfImageBasedLights = [];\n\n this.images = [];\n this.imageElements = [];\n this.textures = [];\n this.items = [];\n this.components = [];\n this.materials = [];\n this.shaders = [];\n this.geometries = [];\n this.animations = [];\n }\n\n private computeSceneAABB () {\n const geometryDataMap: Record<string, GLTFMesh> = {};\n\n this.gltfMeshs.forEach(mesh => {\n const id = mesh.geometryData.id;\n\n geometryDataMap[id] = mesh;\n });\n const componentDataMap: Record<string, GLTFMesh> = {};\n\n this.components.forEach(component => {\n if (component.dataType === spec.DataType.MeshComponent) {\n const meshComponent = component as spec.ModelMeshComponentData;\n\n componentDataMap[component.id] = geometryDataMap[meshComponent.geometry.id];\n }\n });\n\n const sceneAABB = new Box3();\n const parentTransformMap: Record<string, Transform> = {};\n\n this.items.forEach(item => {\n const parentId = item.parentId ?? '';\n const parentTransform = parentTransformMap[parentId] ?? new Transform();\n const props: TransformProps = {};\n\n if (item.transform) {\n props.position = new Vector3().copyFrom(item.transform.position);\n props.rotation = Euler.fromVector3(item.transform.eulerHint as Vector3);\n props.scale = new Vector3().copyFrom(item.transform.scale);\n }\n const transform = new Transform(props, parentTransform);\n\n parentTransformMap[item.id] = transform;\n item.components.forEach(component => {\n const mesh = componentDataMap[component.id];\n\n if (mesh && mesh.bounds) {\n const minPos = Vector3.fromArray(mesh.bounds.box.min);\n const maxPos = Vector3.fromArray(mesh.bounds.box.max);\n\n sceneAABB.union(new Box3(minPos, maxPos));\n }\n });\n });\n\n return sceneAABB;\n }\n\n isPlayAnimation (): boolean {\n return this.sceneOptions.effects.playAnimation !== undefined;\n }\n\n isPlayAllAnimation (): boolean {\n return this.sceneOptions.effects.playAllAnimation === true;\n }\n\n getRemarkString (): string {\n const remark = this.sceneOptions.gltf.remark;\n\n if (remark === undefined) {\n return 'Unknown';\n } else if (typeof remark === 'string') {\n return remark;\n } else {\n return 'BinaryBuffer';\n }\n }\n\n getCompositionDuration () {\n return this.composition.duration;\n }\n\n isTiny3dMode (): boolean {\n return this.loaderOptions.compatibleMode === 'tiny3d';\n }\n\n getItemDuration (): number {\n return this.sceneOptions.effects.duration ?? 9999;\n }\n\n getEndBehavior (): spec.EndBehavior {\n return this.sceneOptions.effects.endBehavior ?? spec.EndBehavior.restart;\n }\n\n getSkyboxType (): PSkyboxType | undefined {\n const typeName = this.sceneOptions.gltf.skyboxType;\n\n switch (typeName) {\n case 'NFT': return PSkyboxType.NFT;\n case 'FARM': return PSkyboxType.FARM;\n }\n }\n\n isSkyboxVis (): boolean {\n return this.sceneOptions.gltf.skyboxVis === true;\n }\n\n ignoreSkybox (): boolean {\n return this.sceneOptions.gltf.ignoreSkybox === true;\n }\n\n isEnvironmentTest (): boolean {\n if (typeof this.sceneOptions.gltf.remark === 'string') {\n return this.sceneOptions.gltf.remark.includes('EnvironmentTest');\n } else {\n return false;\n }\n }\n\n /**\n * for old scene compatibility\n */\n\n processLight (lights: GLTFLight[], fromGLTF: boolean): void {\n lights.forEach(l => {\n if (l.color === undefined) {\n if (fromGLTF) { l.color = [255, 255, 255, 255]; } else { l.color = [1, 1, 1, 1]; }\n } else {\n l.color[0] = this.scaleColorVal(l.color[0], fromGLTF);\n l.color[1] = this.scaleColorVal(l.color[1], fromGLTF);\n l.color[2] = this.scaleColorVal(l.color[2], fromGLTF);\n l.color[3] = this.scaleColorVal(l.color[3], fromGLTF);\n }\n });\n }\n\n processCamera (cameras: GLTFCamera[], fromGLTF: boolean): void {\n const scale = fromGLTF ? 180.0 / Math.PI : Math.PI / 180.0;\n\n cameras.forEach(camera => {\n if (camera.perspective !== undefined) {\n camera.perspective.yfov *= scale;\n }\n });\n }\n\n processMaterial (materials: GLTFMaterial[], fromGLTF: boolean): void {\n materials.forEach(mat => {\n if (mat.baseColorFactor === undefined) {\n if (fromGLTF) { mat.baseColorFactor = [255, 255, 255, 255]; } else { mat.baseColorFactor = [1, 1, 1, 1]; }\n } else {\n mat.baseColorFactor[0] = this.scaleColorVal(mat.baseColorFactor[0], fromGLTF);\n mat.baseColorFactor[1] = this.scaleColorVal(mat.baseColorFactor[1], fromGLTF);\n mat.baseColorFactor[2] = this.scaleColorVal(mat.baseColorFactor[2], fromGLTF);\n mat.baseColorFactor[3] = this.scaleColorVal(mat.baseColorFactor[3], fromGLTF);\n }\n\n if (mat.emissiveFactor === undefined) {\n if (fromGLTF) { mat.emissiveFactor = [255, 255, 255, 255]; } else { mat.emissiveFactor = [1, 1, 1, 1]; }\n } else {\n mat.emissiveFactor[0] = this.scaleColorVal(mat.emissiveFactor[0], fromGLTF);\n mat.emissiveFactor[1] = this.scaleColorVal(mat.emissiveFactor[1], fromGLTF);\n mat.emissiveFactor[2] = this.scaleColorVal(mat.emissiveFactor[2], fromGLTF);\n mat.emissiveFactor[3] = this.scaleColorVal(mat.emissiveFactor[3], fromGLTF);\n }\n\n if (fromGLTF && mat.occlusionTexture !== undefined && mat.occlusionTexture.strength === undefined) {\n mat.occlusionTexture.strength = this.isTiny3dMode() ? 0 : 1;\n }\n });\n }\n\n createAnimations (animations: GLTFAnimation[]): ModelAnimationOptions[] {\n return animations.map(anim => {\n const tracks = anim.channels.map(channel => {\n const track: ModelAnimTrackOptions = {\n input: channel.input.array as Float32Array,\n output: channel.output.array as Float32Array,\n node: channel.target.node,\n path: channel.target.path,\n interpolation: channel.interpolation,\n };\n\n return track;\n });\n\n const newAnim: ModelAnimationOptions = {\n name: anim.name,\n tracks: tracks,\n };\n\n return newAnim;\n });\n }\n\n createGeometry (primitive: GLTFPrimitive, hasSkinAnim: boolean): Geometry {\n const proxy = new GeometryProxy(this.engine, primitive, hasSkinAnim);\n\n return proxy.geometry;\n }\n\n createMaterial (material: GLTFMaterial): ModelMaterialOptions {\n const proxy = new MaterialProxy(material, [], this.isTiny3dMode());\n\n return proxy.material;\n }\n\n createTexture2D (image: GLTFImage, texture: GLTFTexture, isBaseColor: boolean): Promise<Texture> {\n return WebGLHelper.createTexture2D(this.engine, image, texture, isBaseColor, this.isTiny3dMode());\n }\n\n createTextureCube (cubeImages: CubeImage[], level0Size?: number): Promise<Texture> {\n if (cubeImages.length == 0) { throw new Error(`createTextureCube: Invalid cubeImages length ${cubeImages}`); }\n\n const mipmaps: PImageBufferData[][] = [];\n\n cubeImages.forEach(cubeImage => {\n if (cubeImage.length != 6) { throw new Error(`createTextureCube: cubeimage count should always be 6, ${cubeImage}`); }\n //\n const imgList: PImageBufferData[] = [];\n\n cubeImage.forEach(img => {\n if (img.imageData === undefined) { throw new Error(`createTextureCube: Invalid image data from ${img}`); }\n //\n imgList.push({\n type: 'buffer',\n data: img.imageData,\n mimeType: img.mimeType,\n });\n });\n\n if (this.isTiny3dMode()) {\n [imgList[4], imgList[5]] = [imgList[5], imgList[4]];\n }\n\n mipmaps.push(imgList);\n });\n //\n if (mipmaps.length == 1) {\n // no mipmaps\n return WebGLHelper.createTextureCubeFromBuffer(this.engine, mipmaps[0]);\n } else {\n // has mipmaps\n return WebGLHelper.createTextureCubeMipmapFromBuffer(this.engine, mipmaps, level0Size ?? Math.pow(2, mipmaps.length - 1));\n }\n }\n\n createSkybox (ibl: GLTFImageBasedLight): Promise<ModelSkyboxOptions> {\n const reflectionsIntensity = ibl.reflectionsIntensity ?? ibl.intensity;\n const irradianceCoeffs = ibl.irradianceCoefficients as number[][];\n const inSpecularImages = ibl.specularImages as CubeImage[];\n const specularImages = inSpecularImages.map(images => {\n const newImages = images.map(img => {\n const outImg: PImageBufferData = {\n type: 'buffer',\n data: img.imageData,\n mimeType: img.mimeType,\n };\n\n return outImg;\n });\n\n if (this.isTiny3dMode()) {\n [newImages[4], newImages[5]] = [newImages[5], newImages[4]];\n }\n\n return newImages;\n });\n const specularMipCount = specularImages.length - 1;\n const specularImageSize = ibl.specularImageSize ?? Math.pow(2, specularMipCount);\n\n const newIrradianceCoeffs: number[] = [];\n\n irradianceCoeffs.forEach(coeffs => {\n newIrradianceCoeffs.push(...coeffs);\n });\n\n const params: PSkyboxBufferParams = {\n type: 'buffer',\n renderable: this.isSkyboxVis(),\n intensity: ibl.intensity,\n reflectionsIntensity: reflectionsIntensity,\n irradianceCoeffs: newIrradianceCoeffs,\n specularImage: specularImages,\n specularMipCount: specularMipCount,\n specularImageSize: specularImageSize,\n };\n\n return PSkyboxCreator.createSkyboxOptions(this.engine, params);\n }\n\n createDefaultSkybox (typeName: SkyboxType): Promise<ModelSkyboxOptions> {\n if (typeName !== 'NFT' && typeName !== 'FARM') { throw new Error(`Invalid skybox type name ${typeName}`); }\n //\n const typ = typeName === 'NFT' ? PSkyboxType.NFT : PSkyboxType.FARM;\n const params = PSkyboxCreator.getSkyboxParams(typ);\n\n return PSkyboxCreator.createSkyboxOptions(this.engine, params);\n }\n\n scaleColorVal (val: number, fromGLTF: boolean): number {\n return fromGLTF ? LoaderHelper.scaleTo255(val) : LoaderHelper.scaleTo1(val);\n }\n\n scaleColorVec (vec: number[], fromGLTF: boolean): number[] {\n return vec.map(val => this.scaleColorVal(val, fromGLTF));\n }\n}\n\nexport function getPBRShaderProperties (): string {\n return `\n _BaseColorSampler (\"基础贴图\", 2D) = \"\" {}\n _BaseColorFactor (\"基础颜色\", Color) = (1, 1, 1, 1)\n _MetallicRoughnessSampler (\"金属贴图\", 2D) = \"\" {}\n _MetallicFactor (\"金属度\", Range(0, 1)) = 1\n _RoughnessFactor (\"粗糙度\", Range(0, 1)) = 1\n [Toggle] _SpecularAA (\"高光抗锯齿\", Float) = 0\n _NormalSampler (\"法线贴图\", 2D) = \"\" {}\n _NormalScale (\"法线贴图强度\", Range(0, 2)) = 1\n _OcclusionSampler (\"AO贴图\", 2D) = \"\" {}\n _OcclusionStrength (\"AO贴图强度\", Range(0, 1)) = 1\n _EmissiveSampler (\"自发光贴图\", 2D) = \"\" {}\n _EmissiveIntensity (\"自发光贴图强度\", Float) = 1\n _EmissiveFactor (\"自发光颜色\", Color) = (0, 0, 0, 1)\n _AlphaCutoff (\"Alpha裁剪值\", Range(0, 1)) = 0.5\n `;\n}\n\nexport function getUnlitShaderProperties (): string {\n return `\n _BaseColorSampler (\"基础贴图\", 2D) = \"\" {}\n _BaseColorFactor (\"基础颜色\", Color) = (1, 1, 1, 1)\n _AlphaCutoff (\"Alpha裁剪值\", Range(0, 1)) = 0.5\n `;\n}\n\nexport function getDefaultPBRMaterialData (): spec.MaterialData {\n const material: spec.MaterialData = {\n 'id': '00000000000000000000000000000000',\n 'name': 'PBR Material',\n 'dataType': spec.DataType.Material,\n 'stringTags': {\n 'RenderType': spec.RenderType.Opaque,\n 'RenderFace': 'Front',\n },\n 'macros': [],\n 'shader': {\n 'id': 'pbr00000000000000000000000000000',\n },\n 'ints': {\n\n },\n 'floats': {\n 'ZWrite': 1,\n 'ZTest': 1,\n '_SpecularAA': 0,\n '_MetallicFactor': 1,\n '_RoughnessFactor': 0.0,\n '_NormalScale': 1,\n '_OcclusionStrength': 1,\n '_EmissiveIntensity': 1,\n '_AlphaCutoff': 0.5,\n },\n 'vector4s': {\n\n },\n 'colors': {\n '_BaseColorFactor': {\n 'r': 1,\n 'g': 1,\n 'b': 1,\n 'a': 1,\n },\n '_EmissiveFactor': {\n 'r': 0,\n 'g': 0,\n 'b': 0,\n 'a': 1,\n },\n },\n 'textures': {\n\n },\n };\n\n return material;\n}\n\nexport function getDefaultUnlitMaterialData (): spec.MaterialData {\n const material: spec.MaterialData = {\n 'id': '00000000000000000000000000000000',\n 'name': 'Unlit Material',\n 'dataType': spec.DataType.Material,\n 'stringTags': {\n 'ZWrite': 'true',\n 'ZTest': 'true',\n 'RenderType': spec.RenderType.Opaque,\n 'Cull': 'Front',\n },\n 'macros': [],\n 'shader': {\n 'id': spec.BuiltinObjectGUID.UnlitShader,\n },\n 'ints': {\n\n },\n 'floats': {\n '_AlphaCutoff': 0.5,\n },\n 'vector4s': {\n\n },\n 'colors': {\n '_BaseColorFactor': {\n 'r': 1,\n 'g': 1,\n 'b': 1,\n 'a': 1,\n },\n },\n 'textures': {\n\n },\n };\n\n return material;\n}\n\nclass GeometryProxy {\n\n constructor (\n private engine: Engine,\n private gltfGeometry: GLTFPrimitive,\n private hasSkinAnimation: boolean) {\n }\n\n get geometry (): Geometry {\n const attributes: Record<string, Attribute> = {};\n\n if (this.hasPosition) {\n const attrib = this.positionAttrib;\n\n attributes['a_Position'] = this._getBufferAttrib(attrib);\n } else {\n throw new Error('Position attribute missing');\n }\n if (this.hasNormal) {\n const attrib = this.normalAttrib;\n\n if (attrib !== undefined) {\n attributes['a_Normal'] = this._getBufferAttrib(attrib);\n }\n }\n if (this.hasTangent) {\n const attrib = this.tangentAttrib;\n\n if (attrib !== undefined) {\n attributes['a_Tangent'] = this._getBufferAttrib(attrib);\n }\n }\n this.texCoordList.forEach(val => {\n const attrib = this.texCoordAttrib(val);\n const attribName = `a_UV${val + 1}`;\n\n attributes[attribName] = this._getBufferAttrib(attrib);\n });\n if (this.hasSkinAnimation) {\n const jointAttrib = this.jointAttribute;\n\n if (jointAttrib !== undefined) {\n attributes['a_Joint1'] = this._getBufferAttrib(jointAttrib);\n }\n const weightAttrib = this.weightAttribute;\n\n if (weightAttrib !== undefined) {\n attributes['a_Weight1'] = this._getBufferAttrib(weightAttrib);\n }\n }\n\n /**\n * 设置Morph动画需要的Attribute,主要包括Position,Normal和Tangent\n */\n for (let i = 0; i < 8; i++) {\n const positionAttrib = this.getTargetPosition(i);\n\n if (positionAttrib !== undefined) {\n attributes[`a_Target_Position${i}`] = this._getBufferAttrib(positionAttrib);\n }\n\n const normalAttrib = this.getTargetNormal(i);\n\n if (normalAttrib !== undefined) {\n attributes[`a_Target_Normal${i}`] = this._getBufferAttrib(normalAttrib);\n }\n\n const tangentAttrib = this.getTargetTangent(i);\n\n if (tangentAttrib !== undefined) {\n attributes[`a_Target_Tangent${i}`] = this._getBufferAttrib(tangentAttrib);\n }\n }\n\n const indexArray = this.indexArray;\n\n if (indexArray !== undefined) {\n return Geometry.create(\n this.engine,\n {\n attributes: attributes,\n indices: { data: indexArray },\n drawStart: 0,\n drawCount: indexArray.length,\n mode: glContext.TRIANGLES,\n }\n );\n } else {\n return Geometry.create(\n this.engine,\n {\n attributes: attributes,\n drawStart: 0,\n drawCount: this.positionAttrib.array.length / 3,\n mode: glContext.TRIANGLES,\n }\n );\n }\n }\n\n private _getBufferAttrib (inAttrib: GLTFBufferAttribute): Attribute {\n const attrib: spec.AttributeWithData = {\n type: inAttrib.type,\n size: inAttrib.itemSize,\n //stride: inAttrib.stride,\n //offset: inAttrib.offset,\n data: inAttrib.array,\n normalize: inAttrib.normalized,\n };\n\n return attrib;\n }\n\n get positionAttrib () {\n return this.gltfGeometry.getPosition();\n }\n\n get normalAttrib () {\n return this.gltfGeometry.getNormal();\n }\n\n get tangentAttrib () {\n return this.gltfGeometry.getTangent();\n }\n\n texCoordAttrib (index: number) {\n return this.gltfGeometry.getTexCoord(index);\n }\n\n get jointAttribute () {\n return this.gltfGeometry.getJoints(0);\n }\n\n get weightAttribute () {\n return this.gltfGeometry.getWeights(0);\n }\n\n get hasPosition (): boolean {\n return this.positionAttrib !== undefined;\n }\n\n get hasNormal (): boolean {\n return this.normalAttrib !== undefined;\n }\n\n get hasTangent (): boolean {\n return this.tangentAttrib !== undefined;\n }\n\n get hasTexCoord (): boolean {\n return this.texCoordCount > 0;\n }\n\n get texCoordCount (): number {\n for (let i = 0; i < 10; i++) {\n if (this.texCoordAttrib(i) === undefined) { return i; }\n }\n\n return 0;\n }\n\n get hasJointAttribute (): boolean {\n return this.jointAttribute !== undefined;\n }\n\n get hasWeightAttribute (): boolean {\n return this.weightAttribute !== undefined;\n }\n\n get indexArray (): Uint8Array | Uint16Array | Uint32Array | undefined {\n if (this.gltfGeometry.indices === undefined) { return undefined; }\n\n switch (this.gltfGeometry.indices.type) {\n case WebGLRenderingContext['UNSIGNED_INT']:\n return this.gltfGeometry.indices.array as Uint32Array;\n case WebGLRenderingContext['UNSIGNED_SHORT']:\n return this.gltfGeometry.indices.array as Uint16Array;\n case WebGLRenderingContext['UNSIGNED_BYTE']:\n return this.gltfGeometry.indices.array as Uint8Array;\n }\n\n return undefined;\n }\n\n get indexCount (): number {\n if (this.gltfGeometry.indices !== undefined) { return this.gltfGeometry.indices.array.length; } else { return 0; }\n }\n\n get texCoordList (): number[] {\n const texCoords: number[] = [];\n\n for (let i = 0; i < 10; i++) {\n if (this.texCoordAttrib(i) !== undefined) {\n texCoords.push(i);\n } else {\n break;\n }\n }\n\n return texCoords;\n }\n\n getTargetPosition (index: number): GLTFBufferAttribute | undefined {\n return this.gltfGeometry.getAttribute(`POSITION${index}`);\n }\n\n getTargetNormal (index: number): GLTFBufferAttribute | undefined {\n return this.gltfGeometry.getAttribute(`NORMAL${index}`);\n }\n\n getTargetTangent (index: number): GLTFBufferAttribute | undefined {\n return this.gltfGeometry.getAttribute(`TANGENT${index}`);\n }\n\n}\n\nclass MaterialProxy {\n private gltfMaterial: GLTFMaterial;\n private textures: Texture[];\n // TODO: 待移除?\n private tiny3dMode: boolean;\n\n constructor (material: GLTFMaterial, textures: Texture[], tiny3dMode: boolean) {\n this.gltfMaterial = material;\n this.textures = textures;\n this.tiny3dMode = tiny3dMode;\n }\n\n get material (): ModelMaterialOptions {\n const mat = this.gltfMaterial;\n const isUnlit = GLTFHelper.isUnlitMaterial(mat);\n\n let blending = spec.MaterialBlending.opaque;\n\n switch (mat.alphaMode) {\n case 'OPAQUE':\n blending = spec.MaterialBlending.opaque;\n\n break;\n case 'MASK':\n blending = spec.MaterialBlending.masked;\n\n break;\n case 'BLEND':\n blending = spec.MaterialBlending.translucent;\n\n break;\n }\n\n const side = mat.doubleSided ? spec.SideMode.DOUBLE : spec.SideMode.FRONT;\n\n const enableShadow = false;\n\n const alphaCutOff = mat.alphaCutOff ?? 0.5;\n\n const name = mat.name;\n\n if (isUnlit) {\n return {\n name: name,\n type: spec.MaterialType.unlit,\n baseColorTexture: this.baseColorTextureObj,\n baseColorTextureCoordinate: this.baseColorTextureCoord,\n baseColorTextureTransform: this.baseColorTextureTransfrom,\n baseColorFactor: this.baseColorFactor,\n //\n depthMask: mat.extras?.depthMask,\n blending: blending,\n alphaCutOff: alphaCutOff,\n side: side,\n };\n } else {\n return {\n name: name,\n type: spec.MaterialType.pbr,\n baseColorTexture: this.baseColorTextureObj,\n baseColorTextureCoordinate: this.baseColorTextureCoord,\n baseColorTextureTransform: this.baseColorTextureTransfrom,\n baseColorFactor: this.baseColorFactor,\n //\n useSpecularAA: this.getSpecularAA(),\n //\n metallicRoughnessTexture: this.metallicRoughnessTextureObj,\n metallicRoughnessTextureCoordinate: this.metallicRoughnessTextureCoord,\n metallicRoughnessTextureTransform: this.metallicRoughnessTextureTransfrom,\n metallicFactor: this.metalicFactor,\n roughnessFactor: this.roughnessFactor,\n //\n normalTexture: this.normalTextureObj,\n normalTextureCoordinate: this.normalTextureCoord,\n normalTextureTransform: this.normalTextureTransfrom,\n normalTextureScale: this.normalTextureScale,\n //\n occlusionTexture: this.occlusionTextureObj,\n occlusionTextureCoordinate: this.occlusionTextureCoord,\n occlusionTextureTransform: this.occlusionTextureTransfrom,\n occlusionTextureStrength: this.occlusionTextureStrength,\n //\n emissiveTexture: this.emissiveTextureObj,\n emissiveTextureCoordinate: this.emissiveTextureCoord,\n emissiveTextureTransform: this.emissiveTextureTransfrom,\n emissiveFactor: this.emissiveFactor,\n emissiveIntensity: 1.0,\n //\n depthMask: mat.extras?.depthMask,\n blending: blending,\n alphaCutOff: alphaCutOff,\n side: side,\n enableShadow: enableShadow,\n };\n }\n }\n\n private getTextureObject (index: number): Texture | undefined {\n if (index < 0 || index >= this.textures.length) { return; }\n\n return this.textures[index];\n }\n\n getTextureObj (texInfo?: GLTFTextureInfo): Texture | undefined {\n return texInfo ? this.getTextureObject(texInfo.index) : undefined;\n }\n\n getTextureCoord (texInfo?: GLTFTextureInfo): number | undefined {\n return texInfo ? texInfo.texCoord : undefined;\n }\n\n getTextureTransform (texInfo?: GLTFTextureInfo): ModelTextureTransform | undefined {\n const transform = texInfo?.extensions?.KHR_texture_transform;\n\n if (transform === undefined) {\n return;\n }\n\n if (transform.offset === undefined && transform.rotation === undefined && transform.scale === undefined) {\n return;\n }\n\n return {\n offset: transform.offset,\n rotation: transform.rotation,\n scale: transform.scale,\n };\n }\n\n get baseColorTextureObj (): Texture | undefined {\n return this.getTextureObj(this.gltfMaterial.baseColorTexture);\n }\n\n get baseColorTextureCoord (): number | undefined {\n return this.getTextureCoord(this.gltfMaterial.baseColorTexture);\n }\n\n get baseColorTextureTransfrom (): ModelTextureTransform | undefined {\n return this.getTextureTransform(this.gltfMaterial.baseColorTexture);\n }\n\n get metallicRoughnessTextureObj (): Texture | undefined {\n return this.getTextureObj(this.gltfMaterial.metallicRoughnessTexture);\n }\n\n get metallicRoughnessTextureCoord (): number | undefined {\n return this.getTextureCoord(this.gltfMaterial.metallicRoughnessTexture);\n }\n\n get metallicRoughnessTextureTransfrom (): ModelTextureTransform | undefined {\n return this.getTextureTransform(this.gltfMaterial.metallicRoughnessTexture);\n }\n\n get normalTextureObj (): Texture | undefined {\n return this.getTextureObj(this.gltfMaterial.normalTexture);\n }\n\n get normalTextureCoord (): number | undefined {\n return this.getTextureCoord(this.gltfMaterial.normalTexture);\n }\n\n get normalTextureTransfrom (): ModelTextureTransform | undefined {\n return this.getTextureTransform(this.gltfMaterial.normalTexture);\n }\n\n get occlusionTextureObj (): Texture | undefined {\n return this.getTextureObj(this.gltfMaterial.occlusionTexture);\n }\n\n get occlusionTextureCoord (): number | undefined {\n return this.getTextureCoord(this.gltfMaterial.occlusionTexture);\n }\n\n get occlusionTextureTransfrom (): ModelTextureTransform | undefined {\n return this.getTextureTransform(this.gltfMaterial.occlusionTexture);\n }\n\n get emissiveTextureObj (): Texture | undefined {\n return this.getTextureObj(this.gltfMaterial.emissiveTexture);\n }\n\n get emissiveTextureCoord (): number | undefined {\n return this.getTextureCoord(this.gltfMaterial.emissiveTexture);\n }\n\n get emissiveTextureTransfrom (): ModelTextureTransform | undefined {\n return this.getTextureTransform(this.gltfMaterial.emissiveTexture);\n }\n\n get hasEmissive (): boolean {\n const factor = this.emissiveFactor;\n\n return factor[0] + factor[1] + factor[2] > 0;\n }\n\n get baseColorFactor (): [number, number, number, number] {\n const f = this.gltfMaterial.baseColorFactor;\n\n if (f === undefined || f.length != 4) { return [1, 1, 1, 1]; } else { return [f[0], f[1], f[2], f[3]]; }\n }\n\n getSpecularAA () {\n return this.gltfMaterial.extras?.useSpecularAA;\n }\n\n get metalicFactor (): number {\n return this.gltfMaterial.metallicFactor ?? 1;\n }\n\n get roughnessFactor (): number {\n return this.gltfMaterial.roughnessFactor ?? 1;\n }\n\n get normalTextureScale (): number {\n return this.gltfMaterial.normalTexture?.scale ?? 1;\n }\n\n get occlusionTextureStrength (): number {\n return this.gltfMaterial.occlusionTexture?.strength ?? 1;\n }\n\n get emissiveFactor (): [number, number, number, number] {\n const f = this.gltfMaterial.emissiveFactor;\n\n if (f === undefined || f.length != 4) {\n return [0, 0, 0, 1];\n } else {\n return [f[0], f[1], f[2], 1.0];\n }\n }\n\n}\n\nclass GLTFHelper {\n static isUnlitMaterial (mat: GLTFMaterial): boolean {\n return mat.extensions?.KHR_materials_unlit !== undefined;\n }\n\n static createBoxFromGLTFBound (bound: GLTFBounds): Box3 {\n const boxMin = Vector3.fromArray(bound.box.min as number[]);\n const boxMax = Vector3.fromArray(bound.box.max as number[]);\n\n return new Box3(boxMin, boxMax);\n }\n}\n","import * as EFFECTS from '@galacean/effects';\nimport type { spec } from '@galacean/effects';\nimport { VFXItem, logger, registerPlugin } from '@galacean/effects';\nimport { ModelPlugin } from './plugin';\n\nregisterPlugin('model', ModelPlugin, VFXItem);\n\n/**\n * 插件版本号\n */\nexport const version = __VERSION__;\n\nexport type BaseTransform = spec.BaseItemTransform;\nexport type ModelBaseItem = spec.BaseItem;\nexport type ModelItemCamera = spec.ModelCameraItem;\nexport type ModelItemLight = spec.ModelLightItem;\nexport type ModelCameraContent = spec.ModelCameraContent;\nexport type ModelLightContent = spec.ModelLightContent;\nexport type ModelTextureTransform = spec.ModelTextureTransform;\nexport type ModelItemBoundingBox = spec.ModelItemBoundingBox;\nexport type ModelItemBoundingSphere = spec.ModelItemBoundingSphere;\nexport type ModelItemBounding = spec.ModelItemBounding;\nexport type ModelCameraOptions = spec.ModelCameraOptions;\nexport type ModelLightBaseOptions = spec.ModelLightBaseOptions;\nexport type ModelLightPointOptions = spec.ModelLightPointOptions;\nexport type ModelLightSpotOptions = spec.ModelLightSpotOptions;\nexport type ModelLightDirOptions = spec.ModelLightDirOptions;\nexport type ModelAmbientLightOptions = spec.ModelAmbientLightOptions;\nexport type ModelLightOptions = spec.ModelLightOptions;\n\nexport type ModelItemMesh = spec.ModelMeshItem<'studio'>;\nexport type ModelItemSkybox = spec.ModelSkyboxItem<'studio'>;\nexport type ModelMeshContent = spec.ModelMeshItemContent<'studio'>;\nexport type ModelSkyboxContent = spec.SkyboxContent<'studio'>;\nexport type ModelMeshOptions = spec.ModelMeshOptions<'studio'>;\nexport type ModelSkinOptions = spec.SkinOptions<'studio'>;\nexport type ModelPrimitiveOptions = spec.PrimitiveOptions<'studio'>;\nexport type ModelMaterialUnlitOptions = spec.MaterialUnlitOptions<'studio'>;\nexport type ModelMaterialPBROptions = spec.MaterialPBROptions<'studio'>;\nexport type ModelMaterialHariOptions = spec.MaterialHairOptions<'studio'>;\nexport type ModelMaterialOptions = spec.MaterialOptions<'studio'>;\nexport type ModelSkyboxOptions = spec.SkyboxOptions<'studio'>;\nexport type ModelTreeOptions = spec.ModelTreeOptions<'studio'>;\nexport type ModelTreeContent = spec.ModelTreeContent<'studio'>;\nexport type ModelAnimTrackOptions = spec.ModelAnimTrackOptions<'studio'>;\nexport type ModelAnimationOptions = spec.ModelAnimationOptions<'studio'>;\n\nexport type ModelMeshSkinData = spec.SkinData;\nexport type ModelMeshMorphData = spec.MorphData;\nexport type ModelMeshPrimitiveData = spec.PrimitiveData;\nexport type ModelMeshComponentData = spec.ModelMeshComponentData;\nexport type ModelLightType = spec.LightType;\nexport type ModelLightComponentData = spec.ModelLightComponentData;\nexport type ModelCameraComponentData = spec.ModelCameraComponentData;\nexport type ModelSkyboxComponentData = spec.SkyboxComponentData;\nexport type AnimationComponentData = spec.AnimationComponentData;\n\nexport * from './gesture';\nexport * from './gltf';\nexport * from './plugin';\nexport * from './runtime';\nexport * from './utility';\n\nlogger.info(`Plugin model version: ${version}.`);\n\nif (version !== EFFECTS.version) {\n console.error(\n '注意:请统一 Model 插件与 Player 版本,不统一的版本混用会有不可预知的后果!',\n '\\nAttention: Please ensure the Model plugin is synchronized with the Player version. Mixing and matching incompatible versions may result in unpredictable consequences!'\n );\n}\n"],"names":["VFX_ITEM_TYPE_3D","asyncGeneratorStep","gen","resolve","reject","_next","_throw","key","arg","info","value","error","done","Promise","then","_async_to_generator","fn","self","this","args","arguments","apply","err","undefined","_set_prototype_of","o","p","Object","setPrototypeOf","__proto__","_inherits","subClass","superClass","TypeError","prototype","create","constructor","writable","configurable","_instanceof","left","right","Symbol","hasInstance","__decorate","decorators","target","desc","d","c","length","r","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","__generator","thisArg","body","f","y","t","_","label","sent","trys","ops","g","Iterator","next","verb","iterator","n","v","op","call","pop","push","e","step","SuppressedError","InterpolationSampler","time","data","componentCount","cachedIndex","evaluate","pp","i1","t1","t0","validate_interval","seek","linear_scan","forward_scan","giveUpAt","copySampleValue","t1global","mid","intervalChanged","interpolate","dispose","_proto","index","values","stride","offset","result","Float32Array","LinearSampler","size","_this_componentCount","offset1","offset0","weight1","weight0","DiscreteSampler","QuaternionInner","slerpFlat","dst","dstOffset","src0","srcOffset0","src1","srcOffset1","x0","y0","z0","w0","x1","y1","z1","w1","s","cos","dir","sqrSin","Number","EPSILON","sin","Math","sqrt","len","atan2","tDir","QuaternionLinearSampler","alpha","end","createAnimationSampler","type","times","path","_array_like_to_array","arr","arr2","Array","_create_for_of_iterator_helper_loose","allowArrayLike","it","bind","isArray","minLen","toString","slice","name","from","test","_unsupported_iterable_to_array","Vector2","math","Vector3","Vector4","Matrix3","Matrix4","Color","Euler","EulerOrder","Quaternion","Box3","Sphere","Ray","DEG2RAD","_defineProperties","props","descriptor","enumerable","_create_class","Constructor","protoProps","staticProps","_extends","assign","source","hasOwnProperty","PObjectType","PLightType","PTextureType","PMaterialType","PBlendMode","PFaceSideMode","PShadowType","PBRShaderGUID","spec","BuiltinObjectGUID","PBRShader","UnlitShaderGUID","UnlitShader","PTransform","translation","rotation","scale","fromMatrix4","matrix","setMatrix","fromEffectsTransform","trans","EffectsTransform","getWorldMatrix","effectsTrans","valid","setValid","toEffectsTransform","transform","mat","getMatrix","cloneFromMatrix","fromBaseTransform","position","setTranslation","set","setRotation","setScale","getTranslation","val","x","z","getPosition","setPosition","getRotation","w","setFromEuler","ZYX","getScale","compose","res","getTransform","fromArray","PCoordinate","origin","xAxis","yAxis","zAxis","fromPTransform","invert","copyFrom","rotationMatrix","toMatrix4","fromRotationMatrix","me","elements","PGlobalState","isWebGL2","shaderShared","runtimeEnv","PLAYER_OPTIONS_ENV_EDITOR","compatibleMode","visBoundingBox","renderMode3D","RenderMode3D","none","renderMode3DUVGridSize","reset","hasRenderMode3D","getInstance","instance","isEditorEnv","isDeviceEnv","isTiny3dMode","isGLTFMode","objectIndex","PObject","isNone","isValid","genName","PEntity","_visible","_transform","_this","deleted","update","render","scene","renderer","onVisibleChanged","visible","coordinate","coord","deserializeGeometry","geometryProps","attributes","ret","indices","typedArrayFromBinary","keys","forEach","attribute","pointer","ctrlMap","i8","Int8Array","u8","Uint8Array","i16","Int16Array","u16","Uint16Array","f32","i32","Int32Array","u32","Uint32Array","binary","ValueType","BINARY","start","byteLength","CTRL","BYTES_PER_ELEMENT","HookSuffix","number2GLName","Map","HookOGLFunc","ctx","console","getPrototypeOf","hookCount","GetHookFunc","GetNum2GLName","FormatFuncInfo","prefix","argList","has","get","join","getError","err2Info","WebGLRenderingContext","NO_ERROR","INVALID_ENUM","INVALID_VALUE","INVALID_OPERATION","INVALID_FRAMEBUFFER_OPERATION","OUT_OF_MEMORY","CONTEXT_LOST_WEBGL","FormatErrorInfo","trace","getRendererGPUInfo","player","gpuCapability","JSON","stringify","getPMeshList","meshList","composition","getCompositions","items","item","meshComponent","getComponent","ModelMeshComponent","content","mesh","FBOOptions","options","resolution","colorAttachments","depthAttachment","addDepthAttachment","storageType","RenderPassAttachmentStorageType","depth_16_texture","addDefaultDepthAttachment","deleteDepthAttachment","addColorAttachment","texture","format","glContext","RGBA","HALF_FLOAT","minFilter","filter","LINEAR","magFilter","deleteColorAttachment","splice","viewport","BoxMesh","engine","priority","material","Material","shader","vertex","vertexShader","fragment","fragmentShader","shared","depthTest","depthMask","Mesh","geometry","Geometry","modelMatrix","viewProjMatrix","positions","lineColor","setVector3","aPos","FLOAT","mode","LINES","drawStart","drawCount","StandardShaderSource","build","features","replace","map","ShaderFactory","registerInclude","StandardShader","getVertexShaderCode","context","featureList","materialType","unlit","pbr","shadowBase","primitiveVert","skyboxFilter","skyboxVert","Error","getFragmentShaderCode","metallicRoughnessFrag","shadowPassFrag","skyboxFrag","genVertexShaderCode","genFragmentShaderCode","fetchPBRShaderCode","vertexShaderCode","fragmentShaderCode","fetchUnlitShaderCode","getPBRPassShaderCode","getShadowPassShaderCode","getSkyBoxShaderCode","getQuadFilterShaderCode","getNormalVisShaderCode","getBasicVS","hasNormals","getDiffuseOnlyShaderCode","getKawaseBlurShaderCode","getSimpleFilterShaderCode","getGaussianBlurShaderCodeV2","getGaussianBlurShaderCodeV1","getTransparecyBaseShader","isVertexShader","getTransparecyFilterShader","params","hasUVs","environment","TwoStatesSet","now","Set","last","clear","forward","temp","forAddedItem","callbackfn","forRemovedItem","forNowItem","RendererComponent","morphWeights","getHitTestParams","force","computeBoundingBox","bounding","isInteger","behavior","ModelBoundingType","box","PMesh","HitTestType","custom","collect","ray","pointInCanvas","hitTesting","direction","worldMatrixData","RayIntersectsBoxWithRotation","sphere","pos","assignWorldTRS","center","setFromArray","add","radius","fromData","onStart","_this_sceneManager","sceneManager","getSceneManager","createContent","renderOrder","addItem","parentId","parent","updateParentInfo","setVisible","onUpdate","dt","onLateUpdate","lateUpdate","getVisible","onDestroy","removeItem","materials","rootBone","findObject","interaction","parse","_this_content","_this_content_visible","_this_bounding","worldMatrix","bbox","getCenter","getSize","effectsClass","DataType","MeshComponent","ModelSkyboxComponent","diffuseImage","specularImage","skyboxData","PSkybox","SkyboxComponent","ModelLightComponent","Behaviour","lightData","PLight","LightComponent","ModelCameraComponent","updateMainCamera","cameraData","width","getWidth","height","getHeight","PCamera","camera","near","nearPlane","far","farPlane","fov","setTransform","CameraComponent","AnimationComponent","elapsedTime","animation","clips","sampleAnimation","animationClips","clipData","clipObj","ModelAnimationClip","animationClip","setFromAnimationClip","AnimationClip","path2Node","vfxItem","_step","duration","life","max","_iterator","positionCurves","curve","keyFrames","getValue","getTargetItem","_step1","_iterator1","rotationCurves","setQuaternion","_step2","_iterator2","scaleCurves","_step3","_iterator3","floatCurves","className","component","setProperty","property","split","warn","clip","rootItem","findTag","children","child","id","obj","properties","current","propName","matrixData","local2World","world2Local","clone","newRay","applyMatrix","boxCenter","boxHalfSize","multiply","boxMin","subtract","boxMax","intersetPoint","intersectBox","min","transformPoint","RayBoxTesting","ro","rd","bmin","bmax","tmin","tmax","tymin","tymax","tzmin","tzmax","invdirx","invdiry","invdirz","diff","edge1","edge2","normal","RayTriangleTesting","a","b","backfaceCulling","subtractVectors","crossVectors","DdN","dot","sign","DdQxE2","DdE1xQ","QdN","CompositionHitTest","regions","hitTest","getHitTestRay","nums","region","getElement","sort","ToggleItemBounding","itemId","WebGLHelper","createTexture2D","image","isBaseColor","tiny3dMode","blob","urlCreator","imageUrl","imageObj","imageData","Texture","sourceType","TextureSourceType","Blob","mimeType","window","URL","webkitURL","createObjectURL","Image","src","onload","LINEAR_MIPMAP_LINEAR","premultiplyAlpha","isPow2","generateMipmap","NEAREST_MIPMAP_NEAREST","LINEAR_MIPMAP_NEAREST","NEAREST_MIPMAP_LINEAR","wrapS","REPEAT","wrapT","anisotropic","revokeObjectURL","onerror","createTextureList","images","textures","all","tex","_state","getTextureCubeData","cubeData","WebHelper","loadImageFromImageData","getTextureCubeMipmapData","mipmaps","createTextureCubeFromURL","cubeImage","textureOptions","getDefaultTextureFactory","loadSource","TEXTURE_CUBE_MAP","cubemapTexConfig","createTextureCubeMipmapFromURL","cubeImages","maps","cubemapMipTexConfig","createTextureCubeFromBuffer","cubemap","cube","createTextureCubeMipmapFromBuffer","level0Size","mipCount","pow","loadImage","getTexture","createTextureFromImage","flipY","createRenderPass","meshData","fboOpts","RenderPass","attachments","depthStencilAttachment","clearAction","clearDepth","clearStencil","clearColor","colorAction","TextureLoadAction","depthAction","meshes","deleteTexture","deleteMesh","geometries","DestroyOptions","destroy","deleteGeometry","deleteRenderPass","pass","RenderPassDestroyAttachmentType","colorAttachment","semantics","isTransparentMesh","blending","isSupportFloatTexture","detail","floatTexture","isSupportHalfFloatTexture","halfFloatTexture","CLAMP_TO_EDGE","floatView","int32View","MeshHelper","createFilterMesh","globalState","getPlaneGeometry","level","effectsMaterial","glslVersion","GLSLVersion","GLSL3","GLSL1","setMaterialStates","fromIdentity","getPlaneVertexArray","aUV","dataSource","aNormal","PluginHelper","createLightOptions","light","color","intensity","lightType","range","innerConeAngle","outerConeAngle","PI","createCameraOptions","perspective","znear","zfar","yfov","clipMode","toPlayerColor3","scaleTo255","toPlayerColor4","toPluginColor3","scaleTo1","toPluginColor4","createUVTransform","stName","rotateName","stValue","getVector4","rotateValue","getFloat","cosTheta","sinTheta","transpose","clamp","minv","maxv","intVal","round","floatVal","focusOnPoint","cameraPosition","YRotationAngle","targetPoint","camPos","targetPos","deltaPos","fromRotationAxis","newCamPos","viewMatrix","lookAt","effectsTransform","Transform","preprocessScene","deviceEnv","jsonScene","dataMap","loadSkybox","preprocessTextureOptions","components","comp","dataType","skybox","textureInfo","texId","texOptions","TEXTURE_2D","newOptions","createGeometry","geomJson","bins","geomOptions","attrib","attribData","getAttributeName","getIndexArray","array","startsWith","getTextureObj","getImageFileName","url","ext","begin","lastIndexOf","substr","substring","getCurrnetTimeStr","date","Date","timeStr","toLocaleString","ms","getMilliseconds","padStart","saveFileForURL","filename","document","createElement","setAttribute","href","click","createPlayer","manualRender","canvas","Player","renderFramework","env","renderOptions","willCaptureImage","sleep","setTimeout","loadImageFromGLTFImage","getCanvasArrayBuffer","toBlob","arrayBuffer","getImageArrayBuffer","cvs","getContext","drawImage","getCanvasImageData","getImageData","flipImageData","flipped","putImageData","globalCompositeOperation","translate","getWebGLCanvasImageBuffer","pixels","readPixels","UNSIGNED_BYTE","VertexAttribBuffer","typeSize","getBoundingBox","point","expandByPoint","AttributeArray","compCount","signed","compressed","compressScale","inAttrib","inArray","normalize","getData","getLength","GeometryBoxProxy","bindMatrices","abs","getDrawCount","getIndexData","positionAttrib","positionArray","getAttributeData","jointAttrib","weightAttrib","jointArray","weightArray","joint","weight","makeEmpty","skinMat","hasAnim","indexSet","j","posData","posVec","_this_joint","_this_weight","jointData","weightData","setZero","findError","bindMat","addScaledMatrix","resVec","transformVector4","HitTestingProxy","doubleSided","hasAnimation","skinMatrix","getHitPoint","rayOrigin","rayDirection","mint","p0","p1","p2","q0","q1","q2","i0","i2","r0","r1","r2","vec3","vec4","CheckerHelper","checkNumber","checkNumberUndef","checkNumber01","checkNumber01Undef","checkPositive","checkNonnegative","checkNonnegativeUndef","checkBoolean","checkBooleanUndef","checkString","checkStringUndef","checkFloat32Array","checkFloat32ArrayUndef","checkParent","checkTexCoord","checkVec2","every","checkVec2Undef","checkVec3","checkNonnegative3","checkVec4","checkNonnegative4","checkNumberArray","checkTexture","isDestroyed","checkTextureUndef","checkTexTransform","checkTexTransformUndef","checkMatBlending","MaterialBlending","opaque","masked","translucent","additive","checkMatSide","SideMode","BACK","DOUBLE","FRONT","checkAnimPath","checkAnimInterp","assertGeometry","getDrawStart","assertGeometryBuffer","attribArray","createAttributeArray","dataAttrib","dataArray","assertModelSkinOptions","joints","skeleton","inverseBindMatrices","determinant","assertMatOptions","MaterialType","baseColorFactor","baseColorTexture","baseColorTextureTransform","baseColorTextureCoordinate","side","alphaCutOff","useSpecularAA","metallicFactor","roughnessFactor","metallicRoughnessTexture","metallicRoughnessTextureTransform","metallicRoughnessTextureCoordinate","normalTexture","normalTextureScale","normalTextureTransform","normalTextureCoordinate","occlusionTexture","occlusionTextureStrength","occlusionTextureTransform","occlusionTextureCoordinate","emissiveFactor","emissiveIntensity","emissiveTexture","emissiveTextureTransform","emissiveTextureCoordinate","assertPrimOptions","assertModelMeshOptions","skin","morphList","primitives","prim","morph","PMorph","morph0","morph1","equals","hide","assertModelCameraOptions","aspect","assertModelLightOptions","assertModelSkyboxOptions","renderable","reflectionsIntensity","irradianceCoeffs","specularImageSize","specularMipCount","pow2","checkModelAnimTrackOptions","node","input","output","interpolation","assertModelAnimOptions","tracks","assertTreeOptions","animations","anim","object","simpleObject","prop","Renderer","Float16ArrayWrapper","number","startIndex","toHalf","bytes","buffer","bits","m","TextureDataMode","PSkin","jointItem","animationMatrices","textureDataMode","maxJointCount","rootBoneItem","rootBoneName","getJointItems","getTextureDataMode","matList","matrixCount","updateSkinMatrices","mat4","computeMeshAnimMatrices","matrixList","normalMatList","inverseWorldMatrix","tempMatrix","localMatrix","multiplyMatrices","updateParentItem","parentItem","getJointCount","isTextureDataMode","jointCount","availableJointUniforms","maxVertexUniforms","floor","name2Item","genNodeName","jointItems","boneNames","boneName","nameList","genNodeNameDFS","morphWeightsLength","morphWeightsArray","hasPositionMorph","hasNormalMorph","hasTangentMorph","positionCount","getAttributeMorphCount","positionNameList","normalCount","normalNameList","tangentCount","tangentNameList","countList","count","fill","initWeights","weights","updateWeights","hasMorph","getMorphWeightsArray","attributeNameList","PAnimInterpType","PAnimPathType","PAnimTexture","isHalfFloat","_this_buffer","_this_buffer_data","NEAREST","updateSource","_this_texture","PShaderManager","funcMap","Helper","shadowFilter","normalVis","simpleFilter","genShaderCode","func","_instance","PMaterialBase","ZWrite","ZTest","renderType","RenderType","Opaque","alphaClip","alphaCutoff","renderFace","RenderFace","Front","getShaderFeatures","isAlphaClip","isOpaque","Both","getShaderMacros","macroList","updateUniforms","uv","debugUVGridSize","setFloat","inFeatureList","finalFeatureList","getFeatureList","shaderResult","getMacroList","inMacroList","finalMacroList","Transparent","blendEquation","FUNC_ADD","blendFunction","ONE","ONE_MINUS_SRC_ALPHA","setFaceSideStates","isBothSide","culling","isBackSide","cullFace","frontFace","CCW","isTransparent","isFrontSide","Back","PMaterialUnlit","effectMaterial","baseColorTextureTrans","getColor","stringTags","hasBaseColorTexture","setInt","setMatrix3","getBaseColorTexture","setBaseColorTexture","getBaseColorFactor","setBaseColorFactor","PMaterialPBR","metallicRoughnessTextureTrans","normalTextureTrans","occlusionTextureTrans","emissiveTextureTrans","hasMetallicRoughnessTexture","hasNormalTexture","hasOcclusionTexture","hasEmissiveTexture","hasEmissiveValue","getMetallicRoughnessTexture","setMetallicRoughnessTexture","getNormalTexture","setNormalTexture","getOcclusionTexture","setOcclusionTexture","getEmissiveTexture","setEmissiveTexture","luminance","getEmissiveFactor","setEmissiveFactor","getEmissiveIntensity","setEmissiveIntensity","createPluginMaterial","getInstanceId","materialPBR","materialUnlit","owner","isBuilt","setup","brdfLUT","skyboxMaterial","PMaterialSkyboxFilter","sceneCache","getSceneCache","skyboxMesh","getFilterMesh","updateMaterial","drawGeometry","IDENTITY","_this_skyboxMaterial","sceneStates","newProjViewMatrix","getNewProjectionMatrix","available","currentIntensity","currentReflectionsIntensity","hasDiffuseImage","hasIrradianceCoeffs","setVector2","setTexture","coeffs","PSkyboxType","PSkyboxCreator","checkCubeMapImage","imageList","lastImage","specularImageLists","getBrdfLutTextureOptions","brdfURL","brdfLutImage","createBrdfLutTexture","brdfLutOpts","createSkyboxOptions","createSpecularCubeMap","createDiffuseCubeMap","createSkyboxComponentData","specularCubeData","getSpecularCubeMapData","diffuseCubeData","getDiffuseCubeMapData","textureOptionsList","generateGUID","imageDatas","mipmap","imageId","getSkyboxParams","skyboxType","getSpecularImageList","getIrradianceCoeffs","getDiffuseImageList","concat","getSpecularImageListAntFarm","getSpecularImageListNFT","levelList","CompositionCache","meshCache","textureCache","geometryCache","renderPassCache","brdfLutTexture","brdfLutTexOptions","brdfLutTextureName","getOrCreateTexture","newTex","delete","getOrCreateGeometry","cachedGeom","geom","cachedMesh","getShadowBasePass","fboOptions","getRenderPass","getShadowFilterPass","cachedPass","setMeshes","addMesh","renderPass","getRenderPasses","resList","getBrdfLutTexture","getSkyboxOptions","skyboxOptions","loadStaticResources","genSkyboxOptions","newParams","deg2rad","viewportMatrix","CameraClipMode","landscape","projectionMatrix","reverse","portrait","premultiply","computeViewAABB","tanTheta","tan","yFarCoord","yNearCoord","xFarCoord","xNearCoord","isReversed","getEye","setEye","PCameraManager","winWidth","winHeight","cameraList","defaultCamera","initial","insert","insertCamera","remove","findResult","findIndex","updateDefaultCamera","getCameraList","getDefaultCamera","getCameraCount","getActiveCamera","getAspect","ambient","padding","followCamera","LightType","spot","directional","isDirectional","isPoint","isSpot","isAmbient","getWorldPosition","getWorldDirection","transformNormal","PLightManager","lightList","insertItem","inLight","insertLight","lightCount","parentIndex","subMeshes","boundingBox","isDisposed","proxy","EffectsMeshProxy","getParentIndex","parentItemId","getSkinObj","getMorphObj","isHide","getGeometry","subMesh","PSubMesh","ReferenceError","getItemBoundingBox","maxLightCount","boundingBoxMesh","_this_skin","getEffectsGeometry","getEffectsMaterial","_this_morph","_this_boundingBoxMesh","updateMorphWeights","weightsArray","updatedArray","normalMatrix","minPos","maxPos","viewProjectionMatrix","invWorldMatrix","newOrigin","newDirection","boxt","primt","subbox","union","inBounding","hs","minVector","maxVector","halfRadius","getParentId","hasSkin","effectsPriority","isCompressed","setGeometry","setMaterial","setHide","jointMatrixList","jointNormalMatList","half_float","jointMatrixTexture","jointNormalMatTexture","hasWeights","hasJoints","primitiveMacroList","materialMacroList","macro","enableMacro","pbrPass","hasTangents","hasUVCoords","renderMode","outputDefine","getRenderMode3DDefine","_this_jointMatrixTexture","_this_jointNormalMatTexture","nomralMatrix","updateUniformsByAnimation","updateUniformsByScene","isEmpty","basecolor","metallic","roughness","ao","emissive","diffuse","jointMatrixNumbers","jointNormalMatNumbers","setMatrixNumberArray","setFloats","isUnlitMaterial","inverseViewMatrix","newPosition","ZERO","PGeometry","getWorldBoundingBox","applyMatrix4","attributeNames","getAttributeNames","hasAttribute","geomExt","indexArray","setDrawCount","hasPositions","hasColors","itemData","parentComponent","morphObj","hasMorphTarget","getMaterials","getMaterialCount","getSkinProps","getSkinOpts","_this_parentComponent_sceneManager","_this_parentComponent_sceneManager_maxJointCount","skinObj","PSceneManager","renderSkybox","compName","itemList","lightManager","cameraManager","parentId2Mesh","enableDynamicSort","tickCount","lastTickSecond","sceneAABBCache","renderedMeshSet","opts","clean","componentName","lightItemCount","initGlobalState","capbility","_this_skybox","effectsTransfrom","newTransform","tick","deltaTime","deltaSeconds","activeCamera","winSize","sceneRadius","dynamicSortMeshes","states","meshComponents","priorityList","enabled","atransparent","btransparent","aposition","bposition","anewPos","bnewPos","prePriority","queryMesh","getSceneAABB","sceneBox","getWorldTransform","meshBox","printDebugInfo","cam","getRenderer","shaderLightCount","ModelPlugin","AbstractPlugin","precompile","compositions","pbrShaderCode","unlitShaderCode","pbrShaderData","Shader","unlitShaderData","addEffectsObjectData","onCompositionConstructed","sceneParams","storage","cache","onCompositionReset","renderFrame","endBehavior","END_BEHAVIOR_FORWARD","VFXItem","getEngine","addComponent","ModelPluginComponent","onCompositionDestroyed","prepareResource","keyList","pluginData","autoAdjustScene","cameraObject","cameraTransform","getViewMatrix","cameraDirection","cameraFov","cameraAspect","sceneAABB","newSize","newWidth","newHeight","finalHeight","parentTransform","toArray","updateSceneCamera","_this_item_composition","_this_item_composition_items","getLightItemCount","getMaxJointCount","getOptions","getViewportMatrix","meshComp","pluginItem","getItemByName","pluginComp","ModelTreeComponent","TreeComponent","CameraGestureType","CameraGestureHandlerImp","cameraCoordiante","startParams","mouseEvent","clientX","clientY","clientWidth","clientHeight","updateComposition","getItem","_this_composition_items","find","getCurrentTarget","getCurrentType","onKeyEvent","event","cameraID","lengthSquared","speed","rotate_self","onXYMoveBegin","startGesture","onXYMoving","arg0","moveGesture","onXYMoveEnd","endGesture","onZMoveBegin","onZMoving","onZMoveEnd","onRotateBegin","onRotating","onRotateEnd","onRotatePointBegin","rotate_focus","focusPoint","onRotatingPoint","onRotatePointEnd","moveTo","rotateTo","quat","onFocusPoint","distance","newDistance","newOffset","getCameraTransform","updateCameraTransform","dx","dy","newPos","ndx","ndy","dxAngle","dyAngle","newRotation","fromAxisAngle","Y","tempRotation","rotateMatrix","deltaPosition","cameraOptions","LoaderHelper","getTransformFromMat4","euler","toEuler","getEffectsTransformFromMat4","getTransformFromTranslation","getTransformFromDirection","d0","d1","cross","acos","getEffectsTransformFromDirection","getTransformFromTransDir","getEffectsTransformFromTransDir","getEulerFromQuat","q","order","setFromQuaternion","getQuatFromEuler","JSONConverter","keepIBLData","treeInfo","TreeInfo","downloader","Downloader","processScene","sceneData","sceneJSON","oldScene","oldBinUrls","binFiles","bin","newScene","isObject","loadJSON","_tmp","getStandardJSON","version","loadBins","JSONSceneVersion","playerVersion","web","native","shaders","setImage","setComponent","setItem","setComposition","newImages","newTextures","jobs","loadedMipmaps","newMipmaps","loadMipmapImage","img","sceneImage","keepImageSource","sourceFrom","newComponents","createSkyboxComponent","createLightComponent","treeComp","createItemsFromTreeComponent","tree","createMeshComponent","getAllTreeNodeList","compositionId","downloadJSON","status","responseText","downloadBinary","meshOptions","geometryPropsList","materialDatas","geomProps","getMaterialData","oldIndices","newIndices","geometryData","getGeometryDataFromPropsList","treeItem","getTreeItemByNodeId","treeNodeList","getTreeNodeListByNodeId","setupBoneData","treeData","nodes","VFXItemData","delay","renderLevel","pn","pluginName","getTransformData","indexOf","subIndex","createAnimationComponent","lightOptions","lightComponent","treeOptions","animationComponent","totalAnimationTime","track","inputArray","outputArray","points","controlPoints","lineValue","p3","slerpQuaternions","BezierKeyframeType","LINE","getTreeNode","getNodePath","BEZIER_CURVE_QUAT","BEZIER_CURVE","lerpVectors","BEZIER_CURVE_PATH","floats","colors","_BaseColorFactor","divide","getTextureData","newMaterial","macros","ints","vector4s","setupMaterial","_MetallicFactor","_RoughnessFactor","_EmissiveFactor","oldMat","newMat","texIndex","texTransform","texProperty","eulerHint","bindMatrixArray","id2Node","currentItem","nodeList","tree2NodeList","nodeList2Tree","nodeId2Node","node2Path","setNodePath","getTreeNodeListByTreeId","treeId","nodeIndex","getGeometryDataFromOptions","vertexCount","verticesType","VertexFormatType","Float32","verticesNormalize","uvsType","uvsNormalize","normalsType","normalsNormalize","modelData","vertices","uvs","normals","glType2VertexFormatType","verticesOffset","getOffset","uvsOffset","normalsOffset","indicesType","IndexFormatType","UInt16","UInt32","vertexData","channels","semantic","VertexBufferSemantic","Position","dimension","Uv","Normal","GeometryType","TRIANGLES","indexFormat","indexOffset","encodeVertexData","geomPropsList","totalCount","indexCount","geom0","geom1","isSame","array1","array2","mergeTypedArray","getVertexCount","totalByteLength","bufferOffset","vertexChannels","vertexBufferSemanticMap","vertexChannel","subBuffer","byteOffset","None","binaryString","String","fromCharCode","btoa","toBase64String","createGeometryData","formatType","Int8","UInt8","Int16","totalSize","ArrayBuffer","uint8View","defaultGLTFLoader","aUV2","aTangent","aColor","aJoints","aWeights","a_Position","a_UV","a_UV1","a_UV2","a_Normal","a_Tangent","a_Color","a_Joints","a_Joint1","a_Weights","a_Weight1","a_Target_Position0","a_Target_Position1","a_Target_Position2","a_Target_Position3","a_Target_Position4","a_Target_Position5","a_Target_Position6","a_Target_Position7","a_Target_Normal0","a_Target_Normal1","a_Target_Normal2","a_Target_Normal3","a_Target_Tangent0","a_Target_Tangent1","a_Target_Tangent2","a_Target_Tangent3","getDefaultEffectsGLTFLoader","LoaderImpl","setDefaultEffectsGLTFLoader","loader","gltfMeshs","gltfTextures","gltfMaterials","gltfAnimations","gltfImageBasedLights","timelineAssetId","imageElements","EndBehavior","restart","timelineAsset","sceneBindings","loadScene","_this_components","_this_components1","_this_components2","_this_items","gltfResource","gltfScene","sceneOptions","loaderOptions","gltf","resource","gltfImage","processGLTFResource","imageBasedLights","materialData","scenes","meshesComponentData","checkMeshComponentData","camerasComponentData","lightsComponentData","animationsComponentData","effects","playAllAnimation","playAnimation","animationClipData","tryAddSkybox","skyboxVis","vfxItemData","getLoadResult","baseColorId","emissiveIdSet","texData","newId","newTexData","textureDataMap","textureIdMap","addTextures","baseColorIdSet","processMaterialData","processMaterialTexture","processCameraComponentData","processLightComponentData","cubeTextures","ibl","imageBaseLightData","diffuseTexture","ref","processComponentData","processSkyboxComponentData","CameraType","processTextureOptions","textureName","itemIds","plugins","miscs","TimelineAsset","computeSceneAABB","getRemarkString","addLight","ItemType","addCamera","addSkybox","_this_images","_this_textures","skyboxInfo","freeze","ignoreSkybox","typeName","typ","NFT","FARM","geometryDataMap","componentDataMap","parentTransformMap","fromVector3","bounds","isPlayAnimation","isPlayAllAnimation","remark","getCompositionDuration","getItemDuration","_this_sceneOptions_effects_duration","getEndBehavior","_this_sceneOptions_effects_endBehavior","getSkyboxType","isSkyboxVis","isEnvironmentTest","includes","processLight","lights","fromGLTF","l","scaleColorVal","processCamera","cameras","processMaterial","strength","createAnimations","channel","primitive","hasSkinAnim","GeometryProxy","createMaterial","MaterialProxy","createTextureCube","imgList","createSkybox","irradianceCoefficients","specularImages","newIrradianceCoeffs","createDefaultSkybox","scaleColorVec","vec","getPBRShaderProperties","getUnlitShaderProperties","getDefaultPBRMaterialData","_SpecularAA","_NormalScale","_OcclusionStrength","_EmissiveIntensity","_AlphaCutoff","getDefaultUnlitMaterialData","Cull","gltfGeometry","hasSkinAnimation","_getBufferAttrib","itemSize","normalized","texCoordAttrib","getTexCoord","getTargetPosition","getAttribute","getTargetNormal","getTargetTangent","hasPosition","hasNormal","normalAttrib","hasTangent","tangentAttrib","texCoordList","jointAttribute","weightAttribute","getNormal","getTangent","getJoints","getWeights","hasTexCoord","texCoordCount","hasJointAttribute","hasWeightAttribute","texCoords","gltfMaterial","getTextureObject","texInfo","getTextureCoord","texCoord","getTextureTransform","extensions","KHR_texture_transform","getSpecularAA","_this_gltfMaterial_extras","extras","isUnlit","GLTFHelper","alphaMode","baseColorTextureObj","baseColorTextureCoord","baseColorTextureTransfrom","metallicRoughnessTextureObj","metallicRoughnessTextureCoord","metallicRoughnessTextureTransfrom","metalicFactor","normalTextureObj","normalTextureCoord","normalTextureTransfrom","occlusionTextureObj","occlusionTextureCoord","occlusionTextureTransfrom","emissiveTextureObj","emissiveTextureCoord","emissiveTextureTransfrom","enableShadow","hasEmissive","factor","_this_gltfMaterial_metallicFactor","_this_gltfMaterial_roughnessFactor","_this_gltfMaterial_normalTexture","_this_gltfMaterial_normalTexture_scale","_this_gltfMaterial_occlusionTexture","_this_gltfMaterial_occlusionTexture_strength","KHR_materials_unlit","createBoxFromGLTFBound","bound","registerPlugin","logger","EFFECTS"],"mappings":"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"}
1
+ {"version":3,"file":"douyin.mjs","sources":["../src/plugin/const.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_async_to_generator.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_set_prototype_of.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_inherits.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_instanceof.js","../../../node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.es6.mjs","../src/runtime/anim-sampler.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_array_like_to_array.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_create_for_of_iterator_helper_loose.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_unsupported_iterable_to_array.js","../src/runtime/math.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_create_class.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_extends.js","../src/runtime/common.ts","../src/runtime/object.ts","../../../packages/effects-helper/dist/serialize/geometry.js","../src/utility/debug-helper.ts","../src/utility/ri-helper.ts","../src/runtime/shader-libs/standard-shader-source.ts","../src/runtime/shader-libs/standard-shader.ts","../src/utility/shader-helper.ts","../src/utility/ts-helper.ts","../src/plugin/model-item.ts","../src/utility/hit-test-helper.ts","../src/utility/plugin-helper.ts","../src/runtime/animation.ts","../src/runtime/shader.ts","../src/runtime/material.ts","../src/runtime/skybox.ts","../src/runtime/cache.ts","../src/runtime/camera.ts","../src/runtime/light.ts","../src/runtime/mesh.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_assert_this_initialized.js","../src/runtime/scene.ts","../src/plugin/model-plugin.ts","../src/plugin/model-tree-component.ts","../src/gesture/protocol.ts","../src/gesture/index.ts","../src/gltf/loader-helper.ts","../src/gltf/json-converter.ts","../src/gltf/loader-impl.ts","../src/index.ts"],"sourcesContent":["import type { spec } from '@galacean/effects';\n\n/**\n * Model 插件元素类型\n */\nexport const VFX_ITEM_TYPE_3D = 'PluginModel' as spec.ItemType;\n","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) resolve(value);\n else Promise.resolve(value).then(_next, _throw);\n}\nfunction _async_to_generator(fn) {\n return function() {\n var self = this, args = arguments;\n\n return new Promise(function(resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}\nexport { _async_to_generator as _ };\n","function _set_prototype_of(o, p) {\n _set_prototype_of = Object.setPrototypeOf || function setPrototypeOf(o, p) {\n o.__proto__ = p;\n\n return o;\n };\n\n return _set_prototype_of(o, p);\n}\nexport { _set_prototype_of as _ };\n","import { _ as _set_prototype_of } from \"./_set_prototype_of.js\";\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } });\n\n if (superClass) _set_prototype_of(subClass, superClass);\n}\nexport { _inherits as _ };\n","function _instanceof(left, right) {\n if (right != null && typeof Symbol !== \"undefined\" && right[Symbol.hasInstance]) {\n return !!right[Symbol.hasInstance](left);\n } else return left instanceof right;\n}\nexport { _instanceof as _ };\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","/**\n * 抽象插值采样类\n */\nexport abstract class InterpolationSampler {\n protected cachedIndex = 0;\n\n constructor (\n protected time: Float32Array,\n protected data: Float32Array,\n protected componentCount: number,\n ) { }\n\n /**\n * 计算当前 t 时刻的插值\n * @param t - 当前时间\n * @returns 插值结果\n */\n evaluate (t: number) {\n const pp = this.time;\n let i1 = this.cachedIndex;\n let t1 = pp[i1];\n let t0 = pp[i1 - 1];\n\n validate_interval: {\n seek: {\n let right: number;\n\n linear_scan: {\n //- See http://jsperf.com/comparison-to-undefined/3\n //- slower code:\n //-\n //- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n forward_scan: if (!(t < t1)) {\n for (let giveUpAt = i1 + 2; ;) {\n if (t1 === undefined) {\n if (t < t0) { break forward_scan; }\n\n // after end\n i1 = pp.length;\n this.cachedIndex = i1;\n\n return this.copySampleValue(i1 - 1);\n }\n\n if (i1 === giveUpAt) { break; } // this loop\n\n t0 = t1;\n t1 = pp[++i1];\n\n if (t < t1) {\n // we have arrived at the sought interval\n break seek;\n }\n }\n\n // prepare binary search on the right side of the index\n right = pp.length;\n\n break linear_scan;\n }\n\n //- slower code:\n //-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n if (!(t >= t0)) {\n // looping?\n const t1global = pp[1];\n\n if (t < t1global) {\n i1 = 2; // + 1, using the scan for the details\n t0 = t1global;\n }\n\n // linear reverse scan\n for (let giveUpAt = i1 - 2; ;) {\n if (t0 === undefined) {\n // before start\n this.cachedIndex = 0;\n\n return this.copySampleValue(0);\n }\n\n if (i1 === giveUpAt) { break; } // this loop\n\n t1 = t0;\n t0 = pp[--i1 - 1];\n\n if (t >= t0) {\n // we have arrived at the sought interval\n break seek;\n }\n }\n\n // prepare binary search on the left side of the index\n right = i1;\n i1 = 0;\n\n break linear_scan;\n }\n\n // the interval is valid\n break validate_interval;\n } // linear scan\n\n // binary search\n while (i1 < right) {\n const mid = (i1 + right) >>> 1;\n\n if (t < pp[mid]) {\n right = mid;\n } else {\n i1 = mid + 1;\n }\n }\n\n t1 = pp[i1];\n t0 = pp[i1 - 1];\n\n // check boundary cases, again\n if (t0 === undefined) {\n this.cachedIndex = 0;\n\n return this.copySampleValue(0);\n }\n\n if (t1 === undefined) {\n i1 = pp.length;\n this.cachedIndex = i1;\n\n return this.copySampleValue(i1 - 1);\n }\n } // seek\n\n this.cachedIndex = i1;\n\n this.intervalChanged(i1, t0, t1);\n } // validate_interval\n\n return this.interpolate(i1, t0, t, t1);\n }\n\n /**\n * 销毁\n */\n dispose () {\n // @ts-expect-error\n this.time = undefined;\n // @ts-expect-error\n this.data = undefined;\n }\n\n protected copySampleValue (index: number) {\n // copies a sample value to the result buffer\n const values = this.data;\n const stride = this.componentCount;\n const offset = index * stride;\n\n const result = new Float32Array(stride);\n\n for (let i = 0; i !== stride; ++i) {\n result[i] = values[offset + i];\n }\n\n return result;\n }\n\n protected abstract intervalChanged (i1: number, t0: number, t1: number): void;\n\n protected abstract interpolate (i1: number, t0: number, t: number, t1: number): Float32Array;\n}\n\nclass LinearSampler extends InterpolationSampler {\n\n constructor (time: Float32Array, data: Float32Array, size: number) {\n super(time, data, size);\n }\n\n protected intervalChanged (i1: number, t0: number, t1: number): void {\n }\n\n protected interpolate (i1: number, t0: number, t: number, t1: number): Float32Array {\n const values = this.data;\n const stride = this.componentCount ?? 1;\n const offset1 = i1 * stride;\n const offset0 = offset1 - stride;\n\n const weight1 = (t - t0) / (t1 - t0);\n const weight0 = 1 - weight1;\n\n const result = new Float32Array(stride);\n\n for (let i = 0; i !== stride; ++i) {\n result[i] =\n values[offset0 + i] * weight0 +\n values[offset1 + i] * weight1;\n }\n\n return result;\n }\n}\n\nclass DiscreteSampler extends InterpolationSampler {\n\n constructor (time: Float32Array, data: Float32Array, size: number) {\n super(time, data, size);\n }\n\n protected intervalChanged (i1: number, t0: number, t1: number): void {\n }\n\n protected interpolate (i1: number, t0: number, t: number, t1: number): Float32Array {\n const values = this.data;\n const stride = this.componentCount ?? 1;\n const offset = (i1 - 1) * stride;\n\n const result = new Float32Array(stride);\n\n for (let i = 0; i !== stride; ++i) {\n result[i] = values[offset + i];\n }\n\n return result;\n }\n}\n\nclass QuaternionInner {\n\n static slerpFlat (dst: any, dstOffset: number, src0: any, srcOffset0: number, src1: any, srcOffset1: number, t: number) {\n // fuzz-free, array-based Quaternion SLERP operation\n let x0 = src0[srcOffset0 + 0];\n let y0 = src0[srcOffset0 + 1];\n let z0 = src0[srcOffset0 + 2];\n let w0 = src0[srcOffset0 + 3];\n\n const x1 = src1[srcOffset1 + 0];\n const y1 = src1[srcOffset1 + 1];\n const z1 = src1[srcOffset1 + 2];\n const w1 = src1[srcOffset1 + 3];\n\n if (t === 0) {\n dst[dstOffset + 0] = x0;\n dst[dstOffset + 1] = y0;\n dst[dstOffset + 2] = z0;\n dst[dstOffset + 3] = w0;\n\n return;\n }\n\n if (t === 1) {\n dst[dstOffset + 0] = x1;\n dst[dstOffset + 1] = y1;\n dst[dstOffset + 2] = z1;\n dst[dstOffset + 3] = w1;\n\n return;\n }\n\n if (w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1) {\n let s = 1 - t;\n const cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1;\n const dir = (cos >= 0 ? 1 : - 1);\n const sqrSin = 1 - cos * cos;\n\n // Skip the Slerp for tiny steps to avoid numeric problems:\n if (sqrSin > Number.EPSILON) {\n const sin = Math.sqrt(sqrSin);\n const len = Math.atan2(sin, cos * dir);\n\n s = Math.sin(s * len) / sin;\n t = Math.sin(t * len) / sin;\n }\n\n const tDir = t * dir;\n\n x0 = x0 * s + x1 * tDir;\n y0 = y0 * s + y1 * tDir;\n z0 = z0 * s + z1 * tDir;\n w0 = w0 * s + w1 * tDir;\n\n // Normalize in case we just did a lerp:\n if (s === 1 - t) {\n const f = 1 / Math.sqrt(x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0);\n\n x0 *= f;\n y0 *= f;\n z0 *= f;\n w0 *= f;\n }\n }\n\n dst[dstOffset] = x0;\n dst[dstOffset + 1] = y0;\n dst[dstOffset + 2] = z0;\n dst[dstOffset + 3] = w0;\n }\n}\n\nclass QuaternionLinearSampler extends InterpolationSampler {\n\n constructor (time: Float32Array, data: Float32Array, size: number) {\n super(time, data, size);\n }\n\n protected intervalChanged (i1: number, t0: number, t1: number): void {\n }\n\n protected interpolate (i1: number, t0: number, t: number, t1: number): Float32Array {\n const values = this.data;\n const stride = this.componentCount ?? 1;\n const alpha = (t - t0) / (t1 - t0);\n let offset = i1 * stride;\n const result = new Float32Array(stride);\n\n for (let end = offset + stride; offset !== end; offset += 4) {\n QuaternionInner.slerpFlat(result, 0, values, offset - stride, values, offset, alpha);\n }\n\n return result;\n }\n\n}\n\n/**\n * 创建动画采样器,支持线性和跳变两种模式,类别上支持平移、旋转和缩放\n * @param type - 动画类型,线性和跳变\n * @param times - 时间点数组\n * @param data - 关键帧数组\n * @param size - 数据分量\n * @param path - 动画类别,平移、旋转和缩放\n * @returns 动画采样器\n */\nexport function createAnimationSampler (type: string, times: Float32Array, data: Float32Array, size: number, path?: string): InterpolationSampler {\n switch (type) {\n case 'LINEAR':\n if (path === 'rotation') {\n return new QuaternionLinearSampler(times, data, size);\n } else {\n return new LinearSampler(times, data, size);\n }\n case 'STEP':\n return new DiscreteSampler(times, data, size);\n case 'CUBICSPLINE':\n // FIXME: support cubic spline\n return new LinearSampler(times, data, size);\n default:\n return new LinearSampler(times, data, size);\n }\n}\n","function _array_like_to_array(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\nexport { _array_like_to_array as _ };\n","import { _ as _unsupported_iterable_to_array } from \"./_unsupported_iterable_to_array.js\";\n\nfunction _create_for_of_iterator_helper_loose(o, allowArrayLike) {\n var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"];\n\n if (it) return (it = it.call(o)).next.bind(it);\n // Fallback for engines without symbol support\n if (Array.isArray(o) || (it = _unsupported_iterable_to_array(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n\n var i = 0;\n\n return function() {\n if (i >= o.length) return { done: true };\n\n return { done: false, value: o[i++] };\n };\n }\n\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _create_for_of_iterator_helper_loose as _ };\n","import { _ as _array_like_to_array } from \"./_array_like_to_array.js\";\n\nfunction _unsupported_iterable_to_array(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _array_like_to_array(o, minLen);\n\n var n = Object.prototype.toString.call(o).slice(8, -1);\n\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(n);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);\n}\nexport { _unsupported_iterable_to_array as _ };\n","import { math } from '@galacean/effects';\n\nexport const {\n Vector2, Vector3, Vector4, Matrix3, Matrix4, Color, Euler, EulerOrder, Quaternion,\n Box3, Sphere, Ray, DEG2RAD,\n} = math;\n\nexport type Ray = math.Ray;\nexport type Euler = math.Euler;\nexport type Vector2 = math.Vector2;\nexport type Vector3 = math.Vector3;\nexport type Vector4 = math.Vector4;\nexport type Matrix3 = math.Matrix3;\nexport type Matrix4 = math.Matrix4;\nexport type Color = math.Color;\nexport type Quaternion = math.Quaternion;\n","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n\n if (\"value\" in descriptor) descriptor.writable = true;\n\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _create_class(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n\n return Constructor;\n}\nexport { _create_class as _ };\n","function _extends() {\n _extends = Object.assign || function assign(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key];\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\nexport { _extends as _ };\n","import { Transform as EffectsTransform, PLAYER_OPTIONS_ENV_EDITOR, spec } from '@galacean/effects';\nimport { Quaternion, Euler, Vector3, Matrix4, EulerOrder } from './math';\nimport type { BaseTransform } from '../index';\n\n/**\n * Model 插件中的对象类型\n */\nexport enum PObjectType {\n none = 0,\n mesh,\n texture,\n material,\n light,\n camera,\n skybox,\n skin,\n morph,\n skeleton,\n animation,\n animationManager,\n reference,\n}\n\n/**\n * 灯光类型\n */\nexport enum PLightType {\n directional = 0,\n point,\n spot,\n ambient,\n}\n\n/**\n * 纹理类型\n */\nexport enum PTextureType {\n none = 0,\n t2d,\n t3d,\n cube,\n}\n\n/**\n * 材质类型\n */\nexport enum PMaterialType {\n none = 0,\n unlit,\n pbr,\n //phong,\n normalVis,\n simpleFilter,\n shadowBase,\n shadowFilter,\n //\n skyboxFilter,\n}\n\n/**\n * 混合模式\n */\nexport enum PBlendMode {\n opaque = 0,\n masked,\n translucent,\n additive,\n}\n\n/**\n * 面片朝向模式\n */\nexport enum PFaceSideMode {\n both = 0,\n front,\n back,\n}\n\nexport enum PShadowType {\n none = 0,\n standard,\n variance,\n expVariance,\n}\n\nexport const PBRShaderGUID = spec.BuiltinObjectGUID.PBRShader;\nexport const UnlitShaderGUID = spec.BuiltinObjectGUID.UnlitShader;\n\n/**\n * 插件变换类\n */\nexport class PTransform {\n private translation = new Vector3(0, 0, 0);\n private rotation = new Quaternion(0, 0, 0, 1);\n private scale = new Vector3(1, 1, 1);\n\n /**\n * 从矩阵设置数据\n * @param matrix - 4阶矩阵\n * @returns\n */\n fromMatrix4 (matrix: Matrix4) {\n this.setMatrix(matrix);\n\n return this;\n }\n\n /**\n * 从 GE 变换设置数据\n * @param trans - GE 变换对象或数据\n * @returns\n */\n fromEffectsTransform (trans: EffectsTransform | BaseTransform) {\n if (trans instanceof EffectsTransform) {\n this.setMatrix(trans.getWorldMatrix());\n } else {\n const effectsTrans = new EffectsTransform({\n ...trans,\n valid: true,\n });\n\n effectsTrans.setValid(true);\n\n this.setMatrix(effectsTrans.getWorldMatrix());\n }\n\n return this;\n }\n\n /**\n * 转成 GE 变换对象\n * @param transform - GE 变换对象\n * @returns\n */\n toEffectsTransform (transform: EffectsTransform) {\n const mat = this.getMatrix();\n\n transform.cloneFromMatrix(mat);\n\n return transform;\n }\n\n /**\n * 通过 GE 变换参数设置\n * @param trans - GE 变换参数\n * @returns\n */\n fromBaseTransform (trans: BaseTransform) {\n if (trans.position) {\n this.setTranslation(trans.position);\n } else {\n this.translation.set(0, 0, 0);\n }\n\n if (trans.rotation) {\n this.setRotation(trans.rotation);\n } else {\n this.rotation.set(0, 0, 0, 1);\n }\n\n if (trans.scale) {\n this.setScale(trans.scale);\n } else {\n this.scale.set(1, 1, 1);\n }\n\n return this;\n }\n\n /**\n * 获取平移\n * @returns\n */\n getTranslation (): Vector3 {\n return this.translation;\n }\n\n /**\n * 设置平移\n * @param val - 平移\n */\n setTranslation (val: Vector3 | spec.vec3) {\n if (val instanceof Vector3) {\n this.translation.set(val.x, val.y, val.z);\n } else {\n this.translation.set(val[0], val[1], val[2]);\n }\n }\n\n /**\n * 获取位置\n * @returns\n */\n getPosition (): Vector3 {\n return this.translation;\n }\n\n /**\n * 设置位置\n * @param val - 位置\n */\n setPosition (val: Vector3 | spec.vec3) {\n if (val instanceof Vector3) {\n this.translation.set(val.x, val.y, val.z);\n } else {\n this.translation.set(val[0], val[1], val[2]);\n }\n }\n\n /**\n * 获取旋转\n * @returns\n */\n getRotation (): Quaternion {\n return this.rotation;\n }\n\n /**\n * 设置旋转\n * @param val - 旋转,可能是四元数或欧拉角\n */\n setRotation (val: Quaternion | Euler | Vector3 | spec.vec4 | spec.vec3) {\n if (val instanceof Quaternion) {\n this.rotation.set(val.x, val.y, val.z, val.w);\n } else if (val instanceof Euler) {\n this.rotation.setFromEuler(val);\n } else if (val instanceof Vector3) {\n this.rotation.setFromEuler(new Euler(val.x, val.y, val.z, EulerOrder.ZYX));\n } else if (val.length === 4) {\n this.rotation.set(val[0], val[1], val[2], val[3]);\n } else {\n this.rotation.setFromEuler(new Euler(val[0], val[1], val[2], EulerOrder.ZYX));\n }\n }\n\n /**\n * 获取缩放\n * @returns\n */\n getScale (): Vector3 {\n return this.scale;\n }\n\n /**\n * 设置缩放\n * @param val - 缩放\n */\n setScale (val: Vector3 | spec.vec3) {\n if (val instanceof Vector3) {\n this.scale.set(val.x, val.y, val.z);\n } else {\n this.scale.set(val[0], val[1], val[2]);\n }\n }\n\n /**\n * 获取矩阵\n * @returns\n */\n getMatrix (): Matrix4 {\n return new Matrix4().compose(this.getTranslation(), this.getRotation(), this.getScale());\n }\n\n /**\n * 设置矩阵\n * @param mat - 4阶矩阵\n */\n setMatrix (mat: Matrix4 | spec.mat4) {\n if (mat instanceof Matrix4) {\n const res = mat.getTransform();\n\n this.setTranslation(res.translation);\n this.setRotation(res.rotation);\n this.setScale(res.scale);\n } else {\n const res = Matrix4.fromArray(mat).getTransform();\n\n this.setTranslation(res.translation);\n this.setRotation(res.rotation);\n this.setScale(res.scale);\n }\n }\n}\n\n/**\n * 坐标系类\n */\nexport class PCoordinate {\n /**\n * 原点\n */\n origin: Vector3;\n /**\n * X 轴\n */\n xAxis: Vector3;\n /**\n * Y 轴\n */\n yAxis: Vector3;\n /**\n * Z 轴\n */\n zAxis: Vector3;\n\n constructor () {\n this.origin = new Vector3(0, 0, 0);\n this.xAxis = new Vector3(1, 0, 0);\n this.yAxis = new Vector3(0, 1, 0);\n this.zAxis = new Vector3(0, 0, 1);\n }\n\n /**\n * 从插件变换创建坐标系\n * @param trans - 变换\n * @param invert - 是否旋转取反\n * @returns 坐标系对象\n */\n fromPTransform (trans: PTransform, invert = false) {\n this.origin.copyFrom(trans.getPosition());\n const rotationMatrix = trans.getRotation().toMatrix4(new Matrix4());\n\n if (invert) {\n rotationMatrix.invert();\n }\n this.fromRotationMatrix(rotationMatrix);\n\n return this;\n }\n\n /**\n * 从旋转矩阵创建坐标系\n * @param matrix - 矩阵\n */\n fromRotationMatrix (matrix: Matrix4) {\n const me = matrix.elements;\n\n this.xAxis.set(me[0], me[1], me[2]);\n this.yAxis.set(me[4], me[5], me[6]);\n this.zAxis.set(me[8], me[9], me[10]);\n }\n}\n\n/**\n * 全局状态\n */\nexport class PGlobalState {\n /**\n * 是否 WebGL2\n */\n isWebGL2: boolean;\n /**\n * 是否共享 Shader\n */\n shaderShared: boolean;\n /**\n * 运行时环境,编辑器模式或设备模式\n */\n runtimeEnv: string;\n /**\n * 兼容模式,glTF 模式或 Tiny3d 模式\n */\n compatibleMode: string;\n /**\n * 是否显示包围盒\n */\n visBoundingBox: boolean;\n /**\n * 渲染输出结果模式,可以换中间渲染数据\n */\n renderMode3D: spec.RenderMode3D;\n /**\n * UV结果输出时,棋盘格的大小控制,范围(0, 1)\n */\n renderMode3DUVGridSize: number;\n\n // singleton related code\n private static instance: PGlobalState;\n\n /**\n * 获取单例\n * @returns\n */\n static getInstance (): PGlobalState {\n // Do you need arguments? Make it a regular static method instead.\n return this.instance || (this.instance = new this());\n }\n\n private constructor () {\n this.isWebGL2 = false;\n this.shaderShared = true;\n this.runtimeEnv = PLAYER_OPTIONS_ENV_EDITOR;\n this.compatibleMode = 'gltf';\n this.visBoundingBox = false;\n this.renderMode3D = spec.RenderMode3D.none;\n this.renderMode3DUVGridSize = 1 / 16;\n }\n\n /**\n * 重置数据\n */\n reset () {\n this.isWebGL2 = false;\n this.shaderShared = true;\n this.runtimeEnv = PLAYER_OPTIONS_ENV_EDITOR;\n this.compatibleMode = 'gltf';\n this.visBoundingBox = false;\n this.renderMode3D = spec.RenderMode3D.none;\n this.renderMode3DUVGridSize = 1 / 16;\n }\n\n /**\n * 是否可视化渲染中间结果\n */\n hasRenderMode3D () {\n return this.renderMode3D !== spec.RenderMode3D.none;\n }\n\n /**\n * 是否编辑器模式\n */\n get isEditorEnv () {\n return this.runtimeEnv === PLAYER_OPTIONS_ENV_EDITOR;\n }\n\n /**\n * 是否设备模式\n */\n get isDeviceEnv () {\n return !this.isEditorEnv;\n }\n\n /**\n * 是否 Tiny3d 模式\n */\n get isTiny3dMode () {\n return this.compatibleMode === 'tiny3d';\n }\n\n /**\n * 是否 glTF 模式\n */\n get isGLTFMode () {\n return !this.isTiny3dMode;\n }\n}\n\n","import type { spec, Renderer } from '@galacean/effects';\nimport type { BaseTransform } from '../index';\nimport type { Quaternion, Euler, Vector3, Matrix4 } from './math';\nimport { PObjectType, PTransform, PCoordinate } from './common';\nimport type { PSceneManager } from './scene';\n\nlet objectIndex = 1;\n\n/**\n * 抽象对象类,提供公共的成员变量和成员函数\n */\nexport abstract class PObject {\n /**\n * 名称\n */\n name = 'Unnamed Object';\n /**\n * 类型\n */\n type: PObjectType = PObjectType.none;\n\n // create () {\n // // create everything in this object\n // }\n\n /**\n * 销毁\n */\n dispose () {\n // delete everything in this object\n }\n\n /**\n * 是否空对象\n * @returns\n */\n isNone () {\n return this.type === PObjectType.none;\n }\n\n /**\n * 是否有效,也就是类型不是 PObjectType.none\n * @returns\n */\n isValid (): boolean {\n return this.type !== PObjectType.none;\n }\n\n protected genName (name: string): string {\n return `${name}_@${objectIndex++}`;\n }\n}\n\n/**\n * 抽象实体类,支持可见性、变换和所属 VFX 元素\n */\nexport abstract class PEntity extends PObject {\n private _visible = false;\n private _transform = new PTransform();\n /**\n * 是否删除\n */\n deleted = false;\n\n /**\n * 逻辑更新\n */\n update () {\n\n }\n\n /**\n * 渲染对象\n * @param scene - 场景管理器\n * @param renderer 渲染器\n */\n render (scene: PSceneManager, renderer: Renderer) {\n // OVERRIDE\n }\n\n /**\n * 外部改变可见性时的回调\n * @param visible - 可见性\n */\n onVisibleChanged (visible: boolean) {\n this.visible = visible;\n }\n\n /**\n * 仅标记不可见和删除状态,但不进行 WebGL 相关资源的释放\n * 最终释放 WebGL 相关资源是在 plugin destroy 的时候\n */\n override dispose () {\n super.dispose();\n this.visible = false;\n this.deleted = true;\n }\n\n /**\n * 获取可见性,如果实体非法也是不可见\n */\n get visible (): boolean {\n return this._visible && this.isValid();\n }\n\n /**\n * 设置可见性\n */\n set visible (val: boolean) {\n this._visible = val;\n }\n\n /**\n * 获取变换\n */\n get transform (): PTransform {\n return this._transform;\n }\n\n /**\n * 设置变换,可以传入插件变换对象或变换参数\n */\n set transform (val: PTransform | BaseTransform) {\n if (val instanceof PTransform) {\n this._transform = val;\n } else {\n if (val.position !== undefined) {\n this._transform.setTranslation(val.position);\n }\n if (val.rotation !== undefined) {\n this._transform.setRotation(val.rotation);\n }\n if (val.scale !== undefined) {\n this._transform.setScale(val.scale);\n }\n }\n }\n\n /**\n * 获取位移\n */\n get translation (): Vector3 {\n return this._transform.getTranslation();\n }\n\n /**\n * 设置位移\n */\n set translation (val: Vector3 | spec.vec3) {\n this._transform.setTranslation(val);\n }\n\n /**\n * 获取位置\n */\n get position (): Vector3 {\n return this._transform.getTranslation();\n }\n\n /**\n * 设置位置\n */\n set position (val: Vector3 | spec.vec3) {\n this._transform.setTranslation(val);\n }\n\n /**\n * 获取旋转\n */\n get rotation (): Quaternion {\n return this._transform.getRotation();\n }\n\n /**\n * 设置旋转\n */\n set rotation (val: Quaternion | Euler | Vector3 | spec.vec4 | spec.vec3) {\n this._transform.setRotation(val);\n }\n\n /**\n * 获取缩放\n */\n get scale (): Vector3 {\n return this._transform.getScale();\n }\n\n /**\n * 设置缩放\n */\n set scale (val: Vector3 | spec.vec3) {\n this._transform.setScale(val);\n }\n\n /**\n * 获取矩阵\n */\n get matrix (): Matrix4 {\n return this._transform.getMatrix();\n }\n\n /**\n * 设置矩阵\n */\n set matrix (val: Matrix4) {\n this._transform.setMatrix(val);\n }\n\n /**\n * 获取坐标系\n */\n get coordinate () {\n const coord = new PCoordinate();\n\n coord.fromPTransform(this._transform);\n\n return coord;\n }\n\n}\n\n","import { spec } from '@galacean/effects';\nimport { concatBuffers, getBinaryType } from './utils';\n/**\n * geometry 序列化\n * @param geometries\n */\nexport function serializeGeometries(geometries) {\n const buffers = [];\n const bufferInfo = new Map();\n let offset = 0;\n geometries.forEach(options => {\n addBuffer(options.indices?.data);\n Object.keys(options.attributes).forEach(key => {\n const { data } = options.attributes[key];\n addBuffer(data);\n });\n });\n const resultBuffer = concatBuffers(buffers, bufferInfo, offset);\n const mappedGeometries = geometries.map(props => {\n const geometryProps = { ...props };\n if (geometryProps.indices) {\n geometryProps.indices = replaceAttribute(geometryProps.indices);\n }\n geometryProps.attributes = {};\n Object.keys(props.attributes).forEach(name => {\n const attribute = props.attributes[name];\n geometryProps.attributes[name] = replaceAttribute(attribute);\n });\n return geometryProps;\n });\n return {\n data: resultBuffer,\n geometries: mappedGeometries,\n version: '1.0',\n };\n function addBuffer(buffer) {\n if (buffer && !buffers.includes(buffer)) {\n buffers.push(buffer);\n bufferInfo.set(buffer, [0, offset, buffer.byteLength, getBinaryType(buffer)]);\n offset += buffer.byteLength;\n // padding 4bytes for f32\n offset = Math.ceil(offset / 4) * 4;\n }\n }\n function replaceAttribute(attr) {\n let source;\n if (attr.data) {\n const info = bufferInfo.get(attr.data);\n if (info) {\n source = { data: [spec.ValueType.BINARY, info] };\n }\n }\n return { ...attr, ...source };\n }\n}\n/**\n * geometry 反序列化\n * @param geometryProps\n * @param data\n */\nexport function deserializeGeometry(geometryProps, data) {\n const { attributes } = geometryProps;\n const ret = { ...geometryProps };\n if (ret.indices) {\n ret.indices = { ...ret.indices };\n if (ret.indices.data) {\n // @ts-expect-error\n ret.indices.data = typedArrayFromBinary(data, geometryProps.indices?.data);\n }\n // @ts-expect-error\n }\n else if (ret.index) {\n // FIXME: 兼容编辑器导出的旧版数据\n // @ts-expect-error\n ret.indices = { ...ret.index };\n // @ts-expect-error\n if (ret.indices.data) {\n // @ts-expect-error\n ret.indices.data = typedArrayFromBinary(data, geometryProps.index?.data);\n }\n }\n Object.keys(attributes).forEach(name => {\n const attribute = attributes[name];\n const { data: pointer } = attribute;\n ret.attributes[name] = { ...attribute };\n if (pointer) {\n ret.attributes[name].data = typedArrayFromBinary(data, pointer);\n }\n });\n return ret;\n}\nconst ctrlMap = {\n i8: Int8Array,\n u8: Uint8Array,\n i16: Int16Array,\n u16: Uint16Array,\n f32: Float32Array,\n i32: Int32Array,\n u32: Uint32Array,\n};\n/**\n * 重构 TypedArray,返回的 TypedArray 如果修改,会反映到原始的 ArrayBuffer 中\n * @param binaries\n * @param pointer\n */\nexport function typedArrayFromBinary(binary, pointer) {\n if (pointer.length != 2 || pointer[0] !== spec.ValueType.BINARY || !(pointer[1] instanceof Array)) {\n // 不是BinaryPointer,可能已经创建,直接返回\n return pointer;\n }\n const [index, start, byteLength, type] = pointer[1];\n if (!type) {\n return binary[index].slice(start, byteLength);\n }\n const CTRL = ctrlMap[type] || Uint8Array;\n return new CTRL(binary[index], start, byteLength / CTRL.BYTES_PER_ELEMENT);\n}\n","import type { Player } from '@galacean/effects';\nimport type { PMesh } from '../runtime/mesh';\nimport { VFX_ITEM_TYPE_3D } from '../plugin/const';\nimport { PObjectType } from '../runtime/common';\nimport { ModelMeshComponent } from '../plugin/model-item';\n\ntype WebGLContext = WebGL2RenderingContext | WebGLRenderingContext;\nconst HookSuffix = '_Native';\nconst number2GLName = new Map();\n\n/**\n * Hook WebGL 相关的 API 调用\n * @param ctx - WebGL 上下文\n */\nexport function HookOGLFunc (ctx: WebGLContext) {\n console.info('HookOGLFunc ' + Object.getPrototypeOf(ctx));\n let hookCount = 0;\n\n for (const name in Object.getPrototypeOf(ctx)) {\n if (name === 'getError') { continue; }\n\n if (typeof ctx[name as keyof WebGLContext] === 'function') {\n ++hookCount;\n //console.log(\"HookFunc \" + each);\n // @ts-expect-error\n ctx[name + HookSuffix] = ctx[name];\n // @ts-expect-error\n ctx[name] = GetHookFunc(ctx, name);\n }\n }\n console.info('HookCount ' + hookCount);\n\n GetNum2GLName(ctx);\n}\n\nfunction FormatFuncInfo (name: string, args: IArguments): string {\n const prefix = `${name}`;\n const argList: string[] = [];\n\n for (let i = 0; i < args.length; i++) {\n if (typeof args[i] == 'number' && number2GLName.has(args[i])) {\n argList.push(number2GLName.get(args[i]) + `(${args[i]})`);\n continue;\n }\n argList.push(args[i]?.toString());\n }\n\n return prefix + (argList.length > 0 ? '(' + argList.join(', ') + ')' : '()');\n}\n\nfunction FormatErrorInfo (error: GLenum): string {\n const err2Info = new Map();\n\n err2Info.set(WebGLRenderingContext.NO_ERROR, 'NO_ERROR');\n err2Info.set(WebGLRenderingContext.INVALID_ENUM, 'INVALID_ENUM');\n err2Info.set(WebGLRenderingContext.INVALID_VALUE, 'INVALID_VALUE');\n err2Info.set(WebGLRenderingContext.INVALID_OPERATION, 'INVALID_OPERATION');\n err2Info.set(WebGLRenderingContext.INVALID_FRAMEBUFFER_OPERATION, 'INVALID_FRAMEBUFFER_OPERATION');\n err2Info.set(WebGLRenderingContext.OUT_OF_MEMORY, 'OUT_OF_MEMORY');\n err2Info.set(WebGLRenderingContext.CONTEXT_LOST_WEBGL, 'CONTEXT_LOST_WEBGL');\n\n return (err2Info.get(error) ?? 'UNKNOWN_ERROR') + `(${error})`;\n}\n\nfunction GetHookFunc (ctx: WebGLContext, name: string) {\n function test () {\n //console.trace();\n // @ts-expect-error\n const ret = ctx[name + HookSuffix].apply(this, arguments);\n const error: GLenum = ctx.getError();\n\n if (error > 0) {\n console.info('OpenGLError: ' + FormatErrorInfo(error) + ' ===> ' + FormatFuncInfo(name, arguments));\n console.trace();\n } else {\n console.info(FormatFuncInfo(name, arguments));\n }\n\n return ret;\n }\n\n return test;\n}\n\nfunction GetNum2GLName (ctx: WebGLContext) {\n for (const name in Object.getPrototypeOf(ctx)) {\n if (typeof ctx[name as keyof WebGLContext] === 'number') {\n number2GLName.set(ctx[name as keyof WebGLContext], name);\n }\n }\n}\n\n/**\n * 获取播放器关联的 GPU 信息\n * @param player - 播放器\n * @returns\n */\nexport function getRendererGPUInfo (player: Player) {\n const instance = player.gpuCapability;\n\n return JSON.stringify(instance, undefined, 2);\n}\n\n/**\n * 获取播放器中 PMesh 对象列表\n * @param player - 播放器\n * @returns\n */\nexport function getPMeshList (player: Player) {\n const meshList: PMesh[] = [];\n\n const composition = player.getCompositions()[0];\n\n composition?.items.forEach(item => {\n if (item.type === VFX_ITEM_TYPE_3D) {\n const meshComponent = item.getComponent(ModelMeshComponent);\n\n if (meshComponent?.content.type === PObjectType.mesh) {\n meshList.push(meshComponent.content);\n }\n }\n });\n\n return meshList;\n}\n","import type { GeometryProps, Engine } from '@galacean/effects';\nimport { glContext, Geometry, Material, Mesh, RenderPassAttachmentStorageType } from '@galacean/effects';\nimport type { Matrix4 } from '../runtime/math';\nimport { Vector2, Vector3 } from '../runtime/math';\n\n/**\n * FBO 选项类,负责构造 FBO 创建时的选项信息\n */\nexport class FBOOptions {\n /**\n * 分辨率\n */\n resolution: Vector2;\n /**\n * 颜色附件列表\n */\n colorAttachments: object[];\n /**\n * 深度附件\n */\n depthAttachment?: any;\n\n /**\n * 构造函数\n * @param options - FBO 参数\n */\n constructor (options: Record<string, any>) {\n this.resolution = options.resolution ?? new Vector2(512, 512);\n this.colorAttachments = options.colorAttachments ?? [];\n this.depthAttachment = options.depthAttachment;\n }\n\n /**\n * 添加深度附件\n * @param options - 深度附件参数\n */\n addDepthAttachment (options: Record<string, any>) {\n this.depthAttachment = {\n storageType: options.storageType ?? RenderPassAttachmentStorageType.depth_16_texture,\n };\n }\n\n /**\n * 添加默认深度附件,数据格式是 depth_16_texture\n */\n addDefaultDepthAttachment () {\n this.depthAttachment = { storageType: RenderPassAttachmentStorageType.depth_16_texture };\n }\n\n /**\n * 删除深度附件\n */\n deleteDepthAttachment () {\n this.depthAttachment = undefined;\n }\n\n /**\n * 添加颜色附件\n * @param options - 颜色附件参数\n */\n addColorAttachment (options: Record<string, any>) {\n this.colorAttachments.push({\n texture: {\n format: options.format ?? glContext.RGBA,\n type: options.type ?? glContext.HALF_FLOAT,\n minFilter: options.filter ?? glContext.LINEAR,\n magFilter: options.filter ?? glContext.LINEAR,\n },\n });\n }\n\n /**\n * 删除颜色附件,按照索引值\n * @param target - 颜色附件索引值\n */\n deleteColorAttachment (target: number) {\n if (target >= 0 && target < this.colorAttachments.length) {\n this.colorAttachments.splice(target, 1);\n }\n }\n\n /**\n * 获取视口大小\n */\n get viewport (): [number, number, number, number] {\n return [0, 0, this.resolution.x, this.resolution.y];\n }\n}\n\n/**\n * 包围盒 Mesh 类,负责 3D Mesh 测试包围盒的显示\n */\nexport class BoxMesh {\n /**\n * core 层 Mesh 对象\n */\n mesh: Mesh;\n\n /**\n * 构造函数,创建基础 Mesh 对象\n * @param engine - 引擎\n * @param priority - 优先级\n */\n constructor (engine: Engine, priority: number) {\n const material = Material.create(\n engine,\n {\n shader: {\n vertex: this.vertexShader,\n fragment: this.fragmentShader,\n shared: true,\n },\n }\n );\n\n material.depthTest = true;\n material.depthMask = true;\n this.mesh = Mesh.create(\n engine,\n {\n name: 'boxMesh',\n material,\n geometry: Geometry.create(engine, this.geometry),\n priority,\n }\n );\n }\n\n /**\n * 更新包围盒着色器 Uniform 数据\n * @param modelMatrix - 模型矩阵\n * @param viewProjMatrix - 相机投影矩阵\n * @param positions - 位置数组\n * @param lineColor - 线颜色\n */\n update (modelMatrix: Matrix4, viewProjMatrix: Matrix4, positions: Float32Array, lineColor: Vector3) {\n const material = this.mesh.material;\n\n material.setMatrix('effects_ObjectToWorld', modelMatrix);\n for (let i = 0; i < positions.length; i += 3) {\n material.setVector3(`_PositionList[${i / 3}]`, Vector3.fromArray(positions, i));\n }\n material.setVector3('_LineColor', lineColor);\n }\n\n /**\n * 销毁,需要销毁 Mesh 对象\n */\n dispose () {\n this.mesh.dispose();\n // @ts-expect-error\n this.mesh = undefined;\n }\n\n /**\n * 获取顶点着色器代码\n */\n get vertexShader (): string {\n return `\n precision highp float;\n\n uniform mat4 effects_ObjectToWorld;\n uniform mat4 effects_MatrixVP;\n uniform vec3 _PositionList[8];\n attribute vec3 aPos;\n void main(){\n int index = int(aPos.x + 0.5);\n vec4 pos = effects_ObjectToWorld * vec4(_PositionList[index], 1);\n gl_Position = effects_MatrixVP * pos;\n }\n `;\n }\n\n /**\n * 获取片段着色器代码\n */\n get fragmentShader (): string {\n return `\n precision highp float;\n\n uniform vec3 _LineColor;\n void main(){\n gl_FragColor = vec4(_LineColor, 1);\n }\n `;\n }\n\n /**\n * 获取基础几何体\n */\n get geometry (): GeometryProps {\n const data = new Float32Array([0, 1, 2, 3, 4, 5, 6, 7]);\n const index = new Uint32Array([\n 0, 1, 1, 2, 2, 3, 3, 0,\n 4, 5, 5, 6, 6, 7, 7, 4,\n 0, 4, 1, 5, 2, 6, 3, 7,\n ]);\n\n return {\n attributes: {\n aPos: {\n type: glContext.FLOAT,\n size: 1,\n data,\n stride: Float32Array.BYTES_PER_ELEMENT,\n offset: 0,\n },\n },\n mode: glContext.LINES,\n indices: { data: index },\n drawStart: 0,\n drawCount: 24,\n };\n }\n}\n","import { ShaderFactory } from '@galacean/effects';\nimport { default as animationVertGLSL } from './standard/animation.vert.glsl';\nimport { default as extensionsFragGLSL } from './standard/extensions.frag.glsl';\nimport { default as toneMappingFragGLSL } from './standard/tone-mapping.frag.glsl';\nimport { default as texturesVertGLSL } from './standard/textures.vert.glsl';\nimport { default as functionsFragGLSL } from './standard/functions.frag.glsl';\nimport { default as shadowFragGLSL } from './standard/shadow.frag.glsl';\nimport { default as shadowCommonVert } from './standard/shadow-common.vert.glsl';\n\n/**\n * GLSL 着色器代码编译预处理\n */\nexport namespace StandardShaderSource {\n /**\n * GLSL 代码预处理和生成最终代码\n * @param source - GLSL 代码\n * @param features - 宏定义\n * @param isWebGL2 - 是否 WebGL2\n * @returns 最终代码\n */\n export function build (source: string, features: string[]): string {\n\n source = source.replace(/#define FEATURES/,\n features.map(value => `#define ${value}`).join('\\n'));\n\n return source;\n }\n}\n\nShaderFactory.registerInclude('animation.vert.glsl', animationVertGLSL);\nShaderFactory.registerInclude('extensions.frag.glsl', extensionsFragGLSL);\nShaderFactory.registerInclude('tone-mapping.frag.glsl', toneMappingFragGLSL);\nShaderFactory.registerInclude('textures.vert.glsl', texturesVertGLSL);\nShaderFactory.registerInclude('functions.frag.glsl', functionsFragGLSL);\nShaderFactory.registerInclude('shadow.frag.glsl', shadowFragGLSL);\nShaderFactory.registerInclude('shadow-common.vert.glsl', shadowCommonVert);\n\n","import { default as primitiveVert } from './standard/primitive.vert.glsl';\nimport { default as metallicRoughnessFrag } from './standard/metallic-roughness.frag.glsl';\nimport { default as shadowPassFrag } from './standard/shadow-pass.frag.glsl';\nimport { default as skyboxVert } from './standard/skybox.vert.glsl';\nimport { default as skyboxFrag } from './standard/skybox.frag.glsl';\nimport { StandardShaderSource } from './standard-shader-source';\nimport { PMaterialType } from '../common';\nimport type { PShaderContext } from '../shader';\n\n/**\n * 着色器代码生成类\n */\nexport class StandardShader {\n /**\n * WebGL 环境\n */\n static environment = 'webgl1';\n\n /**\n * 获取顶点着色器代码\n * @param context - 着色器上下文\n * @returns\n */\n static getVertexShaderCode (context: PShaderContext): string {\n const features = context.featureList;\n const materialType = context.material.materialType;\n\n switch (materialType) {\n case PMaterialType.unlit:\n case PMaterialType.pbr:\n case PMaterialType.shadowBase:\n return StandardShaderSource.build(primitiveVert, features);\n case PMaterialType.skyboxFilter:\n return StandardShaderSource.build(skyboxVert, features);\n default:\n throw new Error(`Invalid material type ${materialType} for getVertexShaderString!`);\n }\n }\n\n /**\n * 获取片段着色器代码\n * @param context - 着色器上下文\n * @returns\n */\n static getFragmentShaderCode (context: PShaderContext): string {\n const features = context.featureList;\n const materialType = context.material.materialType;\n\n switch (materialType) {\n case PMaterialType.unlit:\n case PMaterialType.pbr:\n return StandardShaderSource.build(metallicRoughnessFrag, features);\n case PMaterialType.shadowBase:\n return StandardShaderSource.build(shadowPassFrag, features);\n case PMaterialType.skyboxFilter:\n return StandardShaderSource.build(skyboxFrag, features);\n default:\n throw new Error(`Invalid material type ${materialType} for getFragmentShaderString!`);\n }\n }\n\n static genVertexShaderCode (materialType: PMaterialType): string {\n switch (materialType) {\n case PMaterialType.unlit:\n case PMaterialType.pbr:\n case PMaterialType.shadowBase:\n return primitiveVert;\n case PMaterialType.skyboxFilter:\n return skyboxVert;\n default:\n throw new Error(`Invalid material type ${materialType} for genVertexShaderCode!`);\n }\n }\n\n /**\n * 获取片段着色器代码\n * @param materialType - 材质类型\n * @returns\n */\n static genFragmentShaderCode (materialType: PMaterialType): string {\n switch (materialType) {\n case PMaterialType.unlit:\n case PMaterialType.pbr:\n return metallicRoughnessFrag;\n case PMaterialType.shadowBase:\n return shadowPassFrag;\n case PMaterialType.skyboxFilter:\n return skyboxFrag;\n default:\n throw new Error(`Invalid material type ${materialType} for genFragmentShaderCode!`);\n }\n }\n\n}\n","import { StandardShader } from '../runtime/shader-libs/standard-shader';\nimport type { PShaderContext, PShaderResults } from '../runtime/shader';\nimport { PMaterialType } from '../runtime';\n\nexport function fetchPBRShaderCode (): PShaderResults {\n const vertexShaderCode = StandardShader.genVertexShaderCode(PMaterialType.pbr);\n const fragmentShaderCode = StandardShader.genFragmentShaderCode(PMaterialType.pbr);\n\n return {\n vertexShaderCode,\n fragmentShaderCode,\n };\n}\n\nexport function fetchUnlitShaderCode (): PShaderResults {\n const vertexShaderCode = StandardShader.genVertexShaderCode(PMaterialType.unlit);\n const fragmentShaderCode = StandardShader.genFragmentShaderCode(PMaterialType.unlit);\n\n return {\n vertexShaderCode,\n fragmentShaderCode,\n };\n}\n\n/**\n * 获取 PBR 材质着色器代码\n * @param context - 着色器上下文\n * @returns\n */\nexport function getPBRPassShaderCode (context: PShaderContext): PShaderResults {\n const vertexShaderCode = StandardShader.getVertexShaderCode(context);\n const fragmentShaderCode = StandardShader.getFragmentShaderCode(context);\n\n return {\n vertexShaderCode: vertexShaderCode,\n fragmentShaderCode: fragmentShaderCode,\n };\n}\n\nexport function getShadowPassShaderCode (context: PShaderContext): PShaderResults {\n const vertexShaderCode = StandardShader.getVertexShaderCode(context);\n const fragmentShaderCode = StandardShader.getFragmentShaderCode(context);\n\n return {\n vertexShaderCode: vertexShaderCode,\n fragmentShaderCode: fragmentShaderCode,\n };\n}\n\n/**\n * 获取天空盒着色器代码\n * @param context - 着色器上下文\n * @returns\n */\nexport function getSkyBoxShaderCode (context: PShaderContext): PShaderResults {\n const vertexShaderCode = StandardShader.getVertexShaderCode(context);\n const fragmentShaderCode = StandardShader.getFragmentShaderCode(context);\n\n return {\n vertexShaderCode: vertexShaderCode,\n fragmentShaderCode: fragmentShaderCode,\n };\n}\n\n/**\n * 获取四边形滤波着色器代码\n * @param context - 着色器上下文\n * @returns\n */\nexport function getQuadFilterShaderCode (context: PShaderContext): PShaderResults {\n const fragmentShaderCode = `\n #version 100\n precision highp float;\n uniform sampler2D _ColorSampler;\n\n varying vec2 v_UVCoord1;\n void main(){\n gl_FragColor = texture2D(_ColorSampler, v_UVCoord1);\n }\n `;\n\n return {\n vertexShaderCode: getQuadFilterVS(),\n fragmentShaderCode: fragmentShaderCode,\n };\n}\n\n/**\n * 获取法线可视化着色器代码\n * @param context - 着色器上下文\n * @returns\n */\nexport function getNormalVisShaderCode (context: PShaderContext): PShaderResults {\n const fragmentShaderCode = `\n #version 100\n precision highp float;\n varying vec3 v_Normal;\n void main(){\n gl_FragColor = vec4(v_Normal * 0.5 + 0.5, 1);\n }\n `;\n\n return {\n vertexShaderCode: getBasicVS({ hasNormals: true }),\n fragmentShaderCode: fragmentShaderCode,\n };\n}\n\n/**\n * 获取仅漫反射着色器代码\n * @param context - 着色器上下文\n * @returns\n */\nexport function getDiffuseOnlyShaderCode (context: PShaderContext): PShaderResults {\n const fragmentShaderCode = `\n #version 100\n precision highp float;\n varying vec3 v_Normal;\n void main(){\n vec3 lightDir = normalize(vec3(1, 1, 1));\n gl_FragColor = vec4(max(0.0, dot(v_Normal, lightDir)) * 0.8);\n }\n `;\n\n return {\n vertexShaderCode: getBasicVS({ hasNormals: true }),\n fragmentShaderCode: fragmentShaderCode,\n };\n}\n\n/**\n * 获取 Kawase 模糊着色器代码\n * @param context - 着色器上下文\n * @returns\n */\nexport function getKawaseBlurShaderCode (context: PShaderContext): PShaderResults {\n const fragmentShaderCode = `\n #version 100\n precision highp float;\n uniform float _Offset;\n uniform vec2 _TextureSizeInv;\n uniform sampler2D _TexturSampler;\n\n varying vec2 v_UVCoord1;\n void main() {\n vec4 color = vec4(0.0);\n color += texture2D(_TexturSampler, v_UVCoord1 + vec2(-_Offset-0.5,-_Offset-0.5) * _TextureSizeInv);\n color += texture2D(_TexturSampler, v_UVCoord1 + vec2(-_Offset-0.5, _Offset+0.5) * _TextureSizeInv);\n color += texture2D(_TexturSampler, v_UVCoord1 + vec2( _Offset+0.5,-_Offset-0.5) * _TextureSizeInv);\n color += texture2D(_TexturSampler, v_UVCoord1 + vec2( _Offset+0.5, _Offset+0.5) * _TextureSizeInv);\n gl_FragColor = color * 0.25;\n }\n `;\n\n return {\n vertexShaderCode: getQuadFilterVS(),\n fragmentShaderCode: fragmentShaderCode,\n };\n}\n\n/**\n * 获取简单滤波着色器代码\n * @param context - 着色器上下文\n * @returns\n */\nexport function getSimpleFilterShaderCode (context: PShaderContext): PShaderResults {\n const fragmentShaderCode = `\n #version 100\n precision highp float;\n uniform sampler2D _FilterSampler;\n\n varying vec2 v_UVCoord1;\n void main() {\n gl_FragColor = texture2D(_FilterSampler, v_UVCoord1) * vec4(0.5);\n }\n `;\n\n return {\n vertexShaderCode: getQuadFilterVS(),\n fragmentShaderCode: fragmentShaderCode,\n };\n}\n\n/**\n * 获取高斯模糊着色器代码\n * @param context - 着色器上下文\n * @returns\n */\nexport function getGaussianBlurShaderCodeV2 (context: PShaderContext): PShaderResults {\n const fragmentShaderCode = `\n #version 100\n precision highp float;\n uniform vec2 _BlurScale;\n uniform sampler2D _FilterSampler;\n\n varying vec2 v_UVCoord1;\n void main() {\n vec4 color = vec4(0);\n vec2 offset0 = vec2(0.53805) * _BlurScale.xy;\n vec2 offset1 = vec2(2.06278) * _BlurScale.xy;\n color += (texture2D(_FilterSampler, v_UVCoord1 + offset0) + texture2D(_FilterSampler, v_UVCoord1 - offset0)) * 0.44908;\n color += (texture2D(_FilterSampler, v_UVCoord1 + offset1) + texture2D(_FilterSampler, v_UVCoord1 - offset1)) * 0.05092;\n gl_FragColor = color;\n }\n `;\n\n return {\n vertexShaderCode: getQuadFilterVS(),\n fragmentShaderCode: fragmentShaderCode,\n };\n}\n\n/**\n * 获取高斯模糊着色器代码\n * @param context - 着色器上下文\n * @returns\n */\nexport function getGaussianBlurShaderCodeV1 (context: PShaderContext): PShaderResults {\n const fragmentShaderCode = `\n #version 100\n precision highp float;\n uniform vec2 _BlurScale;\n uniform sampler2D _FilterSampler;\n\n varying vec2 v_UVCoord1;\n void main() {\n vec4 color = vec4(0.0);\n color += texture2D(_FilterSampler, v_UVCoord1 + (vec2(-3.0) * _BlurScale.xy)) * (1.0/64.0);\n color += texture2D(_FilterSampler, v_UVCoord1 + (vec2(-2.0) * _BlurScale.xy)) * (6.0/64.0);\n color += texture2D(_FilterSampler, v_UVCoord1 + (vec2(-1.0) * _BlurScale.xy)) * (15.0/64.0);\n color += texture2D(_FilterSampler, v_UVCoord1 + (vec2(+0.0) * _BlurScale.xy)) * (20.0/64.0);\n color += texture2D(_FilterSampler, v_UVCoord1 + (vec2(+1.0) * _BlurScale.xy)) * (15.0/64.0);\n color += texture2D(_FilterSampler, v_UVCoord1 + (vec2(+2.0) * _BlurScale.xy)) * (6.0/64.0);\n color += texture2D(_FilterSampler, v_UVCoord1 + (vec2(+3.0) * _BlurScale.xy)) * (1.0/64.0);\n gl_FragColor = color;\n }\n `;\n\n return {\n vertexShaderCode: getQuadFilterVS(),\n fragmentShaderCode: fragmentShaderCode,\n };\n}\n\n/**\n * 获取透明效果着色器代码\n * @param isVertexShader - 是否顶点着色器\n * @returns\n */\nexport function getTransparecyBaseShader (isVertexShader: boolean): string {\n if (isVertexShader) {\n return getBasicVS({ hasNormals: true });\n } else {\n return `\n #version 100\n #extension GL_EXT_draw_buffers: require\n\n precision highp float;\n uniform vec4 _BaseColorFactor;\n\n #ifdef HAS_UVS\n uniform sampler2D _BaseColorSampler;\n varying vec2 v_UVCoord1;\n #endif\n\n varying vec3 v_Normal;\n\n float weight(float z, float a) {\n return clamp(pow(min(1.0, a * 10.0) + 0.01, 3.0) * 1e8 * pow(1.0 - z * 0.9, 3.0), 1e-2, 3e3);\n }\n\n void main() {\n vec4 color = _BaseColorFactor;\n\n #ifdef HAS_UVS\n color *= texture2D(_BaseColorSampler, v_UVCoord1);\n #endif\n\n color.rgb *= color.a * dot(normalize(v_Normal), normalize(vec3(0, 1, 3))) * 5.0;\n float w = weight(gl_FragCoord.z, color.a);\n gl_FragData[0] = vec4(color.rgb * w, color.a);\n gl_FragData[1] = vec4(color.a * w);\n }\n `;\n }\n}\n\n/**\n * 获取透明效果滤波着色器代码\n * @param isVertexShader - 是否顶点着色器\n * @returns\n */\nexport function getTransparecyFilterShader (isVertexShader: boolean): string {\n if (isVertexShader) {\n return getQuadFilterVS();\n } else {\n return `\n #version 100\n precision highp float;\n uniform sampler2D _AccumColorSampler;\n uniform sampler2D _AccumAlphaSampler;\n\n varying vec2 v_UVCoord1;\n void main() {\n vec4 accumColor = texture2D(_AccumColorSampler, v_UVCoord1);\n vec4 accumAlpha = texture2D(_AccumAlphaSampler, v_UVCoord1);\n float finalAlpha = 1.0 - accumColor.a;\n vec3 finalColor = accumColor.rgb / clamp(accumAlpha.r, 0.001, 50000.0);\n gl_FragColor = vec4(finalColor, finalAlpha);\n }\n `;\n }\n}\n\nfunction getBasicVS (params: Record<string, boolean> = {}): string {\n const featureList: string[] = ['#version 100'];\n\n if (params.hasUVs) { featureList.push('#define HAS_UVS 1'); }\n if (params.hasNormals) { featureList.push('#define HAS_NORMALS 1'); }\n\n featureList.push(`\n precision highp float;\n\n uniform mat4 effects_ObjectToWorld;\n uniform mat4 effects_MatrixVP;\n attribute vec3 aPos;\n varying vec3 v_Position;\n\n #ifdef HAS_UVS\n attribute vec2 aUV;\n varying vec2 v_UVCoord1;\n #endif\n\n #ifdef HAS_NORMALS\n uniform mat4 _NormalMatrix;\n attribute vec3 aNormal;\n varying vec3 v_Normal;\n #endif\n\n void main(){\n vec4 pos = effects_ObjectToWorld * vec4(aPos, 1);\n v_Position = pos.xyz / pos.w;\n\n #ifdef HAS_UVS\n v_UVCoord1 = aUV;\n #endif\n\n #ifdef HAS_NORMALS\n v_Normal = normalize(vec3(effects_ObjectToWorld * vec4(aNormal, 0)));\n #endif\n\n gl_Position = effects_MatrixVP * pos;\n }\n `);\n\n return featureList.join('\\n');\n}\n\nfunction getQuadFilterVS (): string {\n return `\n #version 100\n precision highp float;\n attribute vec3 aPos;\n attribute vec2 aUV;\n\n varying vec2 v_UVCoord1;\n void main(){\n v_UVCoord1 = aUV;\n gl_Position = vec4(aPos.xy, 0.0, 1.0);\n }\n `;\n}\n","/**\n * 双状态 Set,用于保存前一帧和当前帧的信息\n */\nexport class TwoStatesSet<T> {\n /**\n * 当前帧 Set\n */\n now: Set<T>;\n /**\n * 前一帧 Set\n */\n last: Set<T>;\n\n constructor () {\n this.now = new Set();\n this.last = new Set();\n }\n\n /**\n * 清空 last 和 now\n */\n clear () {\n this.now.clear();\n this.last.clear();\n }\n\n /**\n * 状态前进,当前变成 last,now 被清空\n */\n forward () {\n const temp = this.last;\n\n this.last = this.now;\n this.now = temp;\n this.now.clear();\n }\n\n /**\n * 遍历当前帧新加的元素\n *\n * @param callbackfn - 增加新元素的回调\n */\n forAddedItem (callbackfn: (value: T) => void) {\n this.now.forEach(item => {\n if (!this.last.has(item)) {\n callbackfn(item);\n }\n });\n }\n\n /**\n * 遍历当前帧删除的元素\n *\n * @param callbackfn - 删除旧元素的回调\n */\n forRemovedItem (callbackfn: (value: T) => void) {\n this.last.forEach(item => {\n if (!this.now.has(item)) {\n callbackfn(item);\n }\n });\n }\n\n /**\n * 遍历当前帧所有的元素\n *\n * @param callbackfn - 当前帧元素的回调\n */\n forNowItem (callbackfn: (value: T) => void) {\n this.now.forEach(item => {\n callbackfn(item);\n });\n }\n\n}\n","import type {\n Engine, HitTestBoxParams, HitTestCustomParams, HitTestSphereParams, Renderer, VFXItem,\n} from '@galacean/effects';\nimport {\n HitTestType, Behaviour, RendererComponent, effectsClass, spec, AnimationClip,\n} from '@galacean/effects';\nimport type {\n ModelCameraComponentData, ModelItemBounding, ModelLightComponentData,\n ModelMeshComponentData, ModelSkyboxComponentData, AnimationComponentData,\n} from '../index';\nimport { VFX_ITEM_TYPE_3D } from '../index';\nimport type { PSceneManager, Euler, Ray, Vector2 } from '../runtime';\nimport { PCamera, PLight, PMesh, PSkybox, Vector3 } from '../runtime';\nimport { RayIntersectsBoxWithRotation } from '../utility';\nimport { getSceneManager } from './model-plugin';\n\n/**\n * 插件 Mesh 组件类,支持 3D Mesh 渲染能力\n * @since 2.0.0\n */\n@effectsClass(spec.DataType.MeshComponent)\nexport class ModelMeshComponent extends RendererComponent {\n /**\n * 内部 Mesh 对象\n */\n content: PMesh;\n /**\n * 参数\n */\n data?: ModelMeshComponentData;\n /**\n * 包围盒\n */\n bounding?: ModelItemBounding;\n /**\n * 场景管理器\n */\n sceneManager?: PSceneManager;\n /**\n * morph 动画权重\n */\n morphWeights: number[] = [];\n\n /**\n * 构造函数,只保存传入参数,不在这里创建内部对象\n * @param engine - 引擎\n * @param data - Mesh 参数\n */\n constructor (engine: Engine, data?: ModelMeshComponentData) {\n super(engine);\n if (data) {\n this.fromData(data);\n }\n }\n\n /**\n * 组件开始,需要创建内部对象,更新父元素信息和添加到场景管理器中\n */\n override onStart (): void {\n this.sceneManager = getSceneManager(this);\n this.createContent();\n this.item.type = VFX_ITEM_TYPE_3D;\n this.priority = this.item.renderOrder;\n this.sceneManager?.addItem(this.content);\n if (this.item.parentId && this.item.parent) {\n this.content.updateParentInfo(this.item.parentId, this.item.parent);\n }\n this.setVisible(true);\n this.item.getHitTestParams = this.getHitTestParams;\n }\n\n /**\n * 组件更新,更新内部对象状态\n * @param dt - 更新间隔\n */\n override onUpdate (dt: number): void {\n if (this.sceneManager) {\n this.content.build(this.sceneManager);\n }\n\n this.content.update();\n }\n\n /**\n * 组件晚更新,晚更新内部对象状态\n * @param dt - 更新间隔\n */\n override onLateUpdate (dt: number): void {\n this.content.lateUpdate();\n }\n\n /**\n * 组件渲染,需要检查可见性\n * @param renderer - 渲染器\n * @returns\n */\n override render (renderer: Renderer) {\n if (!this.getVisible() || !this.sceneManager) {\n return;\n }\n\n this.content.render(this.sceneManager, renderer);\n }\n\n /**\n * 组件销毁,需要重场景管理器中删除\n */\n override onDestroy (): void {\n this.sceneManager?.removeItem(this.content);\n this.sceneManager = undefined;\n this.content.dispose();\n }\n\n /**\n * 反序列化,记录传入参数\n * @param data - 组件参数\n */\n override fromData (data: ModelMeshComponentData): void {\n super.fromData(data);\n this.data = {\n ...data,\n materials: [],\n };\n\n this.data.rootBone = data.rootBone ? this.engine.findObject(data.rootBone) : undefined;\n this.data.geometry = this.engine.findObject(data.geometry);\n\n if (data.materials) {\n for (let i = 0; i < data.materials.length; i++) {\n this.data.materials[i] = this.engine.findObject(data.materials[i]);\n }\n }\n }\n\n /**\n * 创建内部对象\n */\n createContent () {\n if (this.data) {\n const bounding = this.data.interaction;\n\n this.bounding = bounding && JSON.parse(JSON.stringify(bounding));\n\n this.content = new PMesh(this.engine, this.item.name, this.data, this, this.item.parentId);\n }\n }\n\n /**\n * 设置当前 Mesh 的可见性。\n * @param visible - true:可见,false:不可见\n */\n setVisible (visible: boolean) {\n this.content?.onVisibleChanged(visible);\n }\n\n /**\n * 获取当前 Mesh 的可见性。\n */\n getVisible (): boolean {\n return this.content?.visible ?? false;\n }\n\n /**\n * 获取点击测试参数,根据元素包围盒进行相交测试,Mesh 对象会进行更加精确的点击测试\n * @param force - 是否强制进行点击测试\n * @returns 点击测试参数\n */\n getHitTestParams = (force?: boolean): HitTestBoxParams | HitTestSphereParams | HitTestCustomParams | undefined => {\n this.computeBoundingBox();\n const bounding = this.bounding;\n\n if (bounding && (force || Number.isInteger(bounding.behavior))) {\n const type = bounding.type;\n\n if (type === spec.ModelBoundingType.box) {\n if (this.content instanceof PMesh) {\n const mesh = this.content;\n const customHitTest: HitTestCustomParams = {\n behavior: bounding.behavior as number,\n type: HitTestType.custom,\n collect: function (ray: Ray, pointInCanvas: Vector2) {\n const result = mesh.hitTesting(ray.origin, ray.direction);\n\n return result;\n },\n };\n\n return customHitTest;\n } else {\n const worldMatrixData = this.transform.getWorldMatrix();\n const customHitTest: HitTestCustomParams = {\n behavior: bounding.behavior as number,\n type: HitTestType.custom,\n collect: function (ray: Ray, pointInCanvas: Vector2) {\n const result = RayIntersectsBoxWithRotation(ray, worldMatrixData, bounding);\n\n return result;\n },\n };\n\n return customHitTest;\n }\n } else if (type === spec.ModelBoundingType.sphere) {\n const pos = new Vector3();\n\n this.transform.assignWorldTRS(pos);\n const center = new Vector3();\n\n if (bounding.center) {\n center.setFromArray(bounding.center);\n }\n\n center.add(pos);\n\n return {\n type: type as unknown as HitTestType.sphere,\n behavior: bounding.behavior as number,\n radius: bounding.radius || 0,\n center,\n };\n }\n }\n };\n\n /**\n * 计算元素包围盒,只针对 Mesh 对象\n * @returns 包围盒\n */\n computeBoundingBox (): ModelItemBounding | undefined {\n if (this.content && this.content instanceof PMesh) {\n const worldMatrix = this.transform.getWorldMatrix();\n const bbox = this.content.computeBoundingBox(worldMatrix);\n const center = bbox.getCenter(new Vector3());\n const size = bbox.getSize(new Vector3());\n\n this.bounding = {\n behavior: this.bounding?.behavior,\n type: spec.ModelBoundingType.box,\n center: [center.x, center.y, center.z],\n size: [size.x, size.y, size.z],\n };\n\n return this.bounding;\n } else {\n return;\n }\n }\n}\n\n/**\n * 插件天空盒组件类,支持 3D 天空盒渲染能力\n * @since 2.0.0\n */\n@effectsClass(spec.DataType.SkyboxComponent)\nexport class ModelSkyboxComponent extends RendererComponent {\n /**\n * 内部天空盒对象\n */\n content: PSkybox;\n /**\n * 天空盒参数\n */\n data?: ModelSkyboxComponentData;\n /**\n * 场景管理器\n */\n sceneManager?: PSceneManager;\n\n /**\n * 构造函数,只保存传入参数,不在这里创建内部对象\n * @param engine - 引擎\n * @param data - Mesh 参数\n */\n constructor (engine: Engine, data?: ModelSkyboxComponentData) {\n super(engine);\n if (data) {\n this.fromData(data);\n }\n }\n\n /**\n * 组件开始,需要创建内部对象和添加到场景管理器中\n */\n override onStart (): void {\n this.createContent();\n this.item.type = VFX_ITEM_TYPE_3D;\n this.priority = this.item.renderOrder;\n this.sceneManager = getSceneManager(this);\n this.sceneManager?.addItem(this.content);\n this.setVisible(true);\n }\n\n /**\n * 组件渲染,需要检查可见性\n * @param renderer - 渲染器\n * @returns\n */\n override render (renderer: Renderer) {\n if (!this.getVisible() || !this.sceneManager) {\n return;\n }\n\n this.content.render(this.sceneManager, renderer);\n }\n\n /**\n * 组件销毁,需要重场景管理器中删除\n */\n override onDestroy (): void {\n this.sceneManager?.removeItem(this.content);\n this.sceneManager = undefined;\n this.content.dispose();\n }\n\n /**\n * 反序列化,记录传入参数\n * @param data - 组件参数\n */\n override fromData (data: ModelSkyboxComponentData): void {\n super.fromData(data);\n\n data.diffuseImage = data.diffuseImage ? this.engine.findObject(data.diffuseImage) : undefined;\n data.specularImage = this.engine.findObject(data.specularImage);\n this.data = data;\n }\n\n /**\n * 创建内部对象\n */\n createContent () {\n if (this.data) {\n const skyboxData = this.data;\n\n this.content = new PSkybox(this.item.name, skyboxData, this);\n }\n }\n\n /**\n * 设置当前可见性。\n * @param visible - true:可见,false:不可见\n */\n setVisible (visible: boolean) {\n this.content?.onVisibleChanged(visible);\n }\n\n /**\n * 获取当前可见性。\n */\n getVisible (): boolean {\n return this.content?.visible ?? false;\n }\n}\n\n/**\n * 插件灯光组件类,支持 3D 灯光能力\n * @since 2.0.0\n */\n@effectsClass(spec.DataType.LightComponent)\nexport class ModelLightComponent extends Behaviour {\n /**\n * 内部灯光对象\n */\n content: PLight;\n /**\n * 参数\n */\n data?: ModelLightComponentData;\n\n /**\n * 构造函数,只保存传入参数,不在这里创建内部对象\n * @param engine - 引擎\n * @param data - Mesh 参数\n */\n constructor (engine: Engine, data?: ModelLightComponentData) {\n super(engine);\n if (data) {\n this.fromData(data);\n }\n }\n\n /**\n * 组件开始,需要创建内部对象和添加到场景管理器中\n */\n override onStart (): void {\n this.createContent();\n this.item.type = VFX_ITEM_TYPE_3D;\n const scene = getSceneManager(this);\n\n scene?.addItem(this.content);\n this.setVisible(true);\n }\n\n /**\n * 组件更新,更新内部对象状态\n * @param dt - 更新间隔\n */\n override onUpdate (dt: number): void {\n this.content.update();\n }\n\n /**\n * 组件销毁\n */\n override onDestroy (): void {\n this.content.dispose();\n }\n\n /**\n * 反序列化,记录传入参数\n * @param data - 组件参数\n */\n override fromData (data: ModelLightComponentData): void {\n super.fromData(data);\n\n this.data = data;\n }\n\n /**\n * 创建内部对象\n */\n createContent () {\n if (this.data) {\n const lightData = this.data;\n\n this.content = new PLight(this.item.name, lightData, this);\n }\n }\n\n /**\n * 设置当前可见性。\n * @param visible - true:可见,false:不可见\n */\n setVisible (visible: boolean) {\n this.content?.onVisibleChanged(visible);\n }\n\n /**\n * 获取当前 Mesh 的可见性。\n */\n getVisible (): boolean {\n return this.content?.visible ?? false;\n }\n}\n\n/**\n * 插件相机组件类,支持 3D 相机能力\n * @since 2.0.0\n */\n@effectsClass(spec.DataType.CameraComponent)\nexport class ModelCameraComponent extends Behaviour {\n /**\n * 内部相机对象\n */\n content: PCamera;\n /**\n * 参数\n */\n data?: ModelCameraComponentData;\n /**\n * 构造函数,只保存传入参数,不在这里创建内部对象\n * @param engine - 引擎\n * @param data - Mesh 参数\n */\n constructor (engine: Engine, data?: ModelCameraComponentData) {\n super(engine);\n if (data) {\n this.fromData(data);\n }\n }\n\n /**\n * 组件开始,需要创建内部对象和添加到场景管理器中\n */\n override onStart (): void {\n this.createContent();\n this.item.type = VFX_ITEM_TYPE_3D;\n const scene = getSceneManager(this);\n\n scene?.addItem(this.content);\n this.updateMainCamera();\n }\n\n /**\n * 组件更新,更新内部对象状态\n * @param dt - 更新间隔\n */\n override onUpdate (dt: number): void {\n this.content.update();\n this.updateMainCamera();\n }\n\n /**\n * 组件销毁\n */\n override onDestroy (): void {\n this.content?.dispose();\n }\n\n /**\n * 反序列化,记录传入参数\n * @param data - 组件参数\n */\n override fromData (data: ModelCameraComponentData): void {\n super.fromData(data);\n\n this.data = data;\n }\n\n /**\n * 创建内部对象\n */\n createContent () {\n if (this.data) {\n const cameraData = this.data;\n\n const width = this.engine.renderer.getWidth();\n const height = this.engine.renderer.getHeight();\n\n this.content = new PCamera(this.item.name, width, height, cameraData, this);\n }\n }\n\n /**\n * 更新合成主相机,更加当前相机元素状态\n */\n updateMainCamera () {\n this.content.matrix = this.transform.getWorldMatrix();\n const composition = this.item.composition;\n\n if (composition) {\n composition.camera.near = this.content.nearPlane;\n composition.camera.far = this.content.farPlane;\n composition.camera.fov = this.content.fov;\n\n composition.camera.setTransform(this.transform);\n }\n }\n\n /**\n * 设置变换\n * @param position - 位置\n * @param rotation - 旋转\n */\n setTransform (position?: Vector3, rotation?: Euler): void {\n if (position) {\n this.transform.setPosition(position.x, position.y, position.z);\n }\n if (rotation) {\n this.transform.setRotation(rotation.x, rotation.y, rotation.z);\n }\n this.updateMainCamera();\n }\n}\n\n/**\n * 插件动画组件类,支持 3D 动画能力\n * @since 2.0.0\n */\n@effectsClass(spec.DataType.AnimationComponent)\nexport class AnimationComponent extends Behaviour {\n /**\n * 参数\n */\n data?: AnimationComponentData;\n\n elapsedTime = 0;\n animation = -1;\n clips: ModelAnimationClip[] = [];\n /**\n * 构造函数,只保存传入参数,不在这里创建内部对象\n * @param engine - 引擎\n */\n constructor (engine: Engine) {\n super(engine);\n }\n\n /**\n * 组件开始,需要创建内部对象和添加到场景管理器中\n */\n override onStart (): void {\n this.elapsedTime = 0;\n this.item.type = VFX_ITEM_TYPE_3D;\n }\n\n /**\n * 组件更新,更新内部对象状态\n * @param dt - 更新间隔\n */\n override onUpdate (dt: number): void {\n this.elapsedTime += dt * 0.001;\n if (this.animation >= 0 && this.animation < this.clips.length) {\n this.clips[this.animation].sampleAnimation(this.item, this.elapsedTime);\n }\n }\n\n /**\n * 组件销毁\n */\n override onDestroy (): void {\n\n }\n\n /**\n * 反序列化,记录传入参数\n * @param data - 组件参数\n */\n override fromData (data: AnimationComponentData): void {\n super.fromData(data);\n this.data = data;\n //\n this.name = data.name ?? '<empty>';\n this.animation = data.animation ?? -1;\n this.clips = [];\n data.animationClips.forEach(clipData => {\n const clipObj = new ModelAnimationClip(this.engine);\n const animationClip = this.engine.findObject<AnimationClip>(clipData);\n\n clipObj.setFromAnimationClip(animationClip);\n this.clips.push(clipObj);\n });\n }\n}\n\nclass ModelAnimationClip extends AnimationClip {\n path2Node: Record<string, VFXItem> = {};\n\n override sampleAnimation (vfxItem: VFXItem, time: number) {\n const duration = this.duration;\n const life = Math.max(0, time) % duration;\n\n for (const curve of this.positionCurves) {\n const value = curve.keyFrames.getValue(life % this.duration);\n const target = this.getTargetItem(vfxItem, curve.path);\n\n target?.transform.setPosition(value.x, value.y, value.z);\n }\n\n for (const curve of this.rotationCurves) {\n const value = curve.keyFrames.getValue(life % this.duration);\n const target = this.getTargetItem(vfxItem, curve.path);\n\n target?.transform.setQuaternion(value.x, value.y, value.z, value.w);\n }\n\n for (const curve of this.scaleCurves) {\n const value = curve.keyFrames.getValue(life % this.duration);\n const target = this.getTargetItem(vfxItem, curve.path);\n\n target?.transform.setScale(value.x, value.y, value.z);\n }\n\n for (const curve of this.floatCurves) {\n const value = curve.keyFrames.getValue(life % this.duration);\n const target = this.getTargetItem(vfxItem, curve.path);\n\n if (curve.className === 'ModelMeshComponent') {\n const component = target?.getComponent(ModelMeshComponent);\n\n if (component) {\n const properties = curve.property.split('.');\n\n setProperty(component, properties, value);\n } else {\n console.error('Can\\'t find mesh component.');\n }\n } else {\n console.warn(`Ignore curve: className ${curve.className}.`);\n }\n }\n }\n\n setFromAnimationClip (clip: AnimationClip) {\n this.duration = clip.duration;\n this.positionCurves = clip.positionCurves.slice();\n this.rotationCurves = clip.rotationCurves.slice();\n this.scaleCurves = clip.scaleCurves.slice();\n this.floatCurves = clip.floatCurves.slice();\n }\n\n getTargetItem (rootItem: VFXItem, path: string) {\n if (this.path2Node[path]) {\n return this.path2Node[path];\n }\n\n let target = rootItem;\n const nameList = path.split('/');\n\n for (const name of nameList) {\n let findTag = false;\n\n for (const child of target.children) {\n if (child.name === name) {\n target = child;\n findTag = true;\n\n break;\n }\n }\n if (!findTag) {\n throw new Error(`Can't find path in tree ${rootItem.id}, ${path}.`);\n }\n }\n\n this.path2Node[path] = target;\n\n return target;\n }\n}\n\nfunction setProperty<T> (obj: Object, properties: string[], value: T) {\n const len = properties.length;\n let current: any = obj;\n\n for (let i = 0; i < len - 1; i++) {\n const propName = properties[i];\n\n if (!(propName in current) || typeof current[propName] !== 'object') {\n console.error(`Invalid properties ${properties}.`);\n\n return;\n }\n current = current[propName];\n }\n\n current[properties[len - 1]] = value;\n}\n","import type { Composition, Region, spec } from '@galacean/effects';\nimport type { Ray, Matrix4 } from '../runtime/math';\nimport { Vector3 } from '../runtime/math';\nimport type { ModelItemBounding, ModelItemBoundingBox } from '../index';\nimport { VFX_ITEM_TYPE_3D } from '../plugin/const';\nimport { ModelMeshComponent } from '../plugin/model-item';\n\n// 射线与带旋转的包围盒求交\n// function transformDirection (m: Matrix4, direction: Vector3) {\n// const x = direction.x;\n// const y = direction.y;\n// const z = direction.z;\n// const me = m.elements;\n// const result = new Vector3();\n\n// result.x = me[0] * x + me[4] * y + me[8] * z;\n// result.y = me[1] * x + me[5] * y + me[9] * z;\n// result.z = me[2] * x + me[6] * y + me[10] * z;\n\n// return result.normalize();\n\n// }\n\n/**\n * 带旋转的射线与包围盒求交\n * @param ray - 射线\n * @param matrixData - 矩阵\n * @param bounding - 包围盒\n * @returns 交点列表或者 undefined\n */\nfunction RayIntersectsBoxWithRotation (ray: Ray, matrixData: Matrix4, bounding: ModelItemBounding): Vector3[] | undefined {\n const local2World = matrixData;\n const world2Local = local2World.clone().invert();\n\n const newRay = ray.clone().applyMatrix(world2Local);\n const boxCenter = Vector3.fromArray(bounding.center!);\n const boxHalfSize = Vector3.fromArray((bounding as ModelItemBoundingBox).size!).multiply(0.5);\n const boxMin = boxCenter.clone().subtract(boxHalfSize);\n const boxMax = boxCenter.clone().add(boxHalfSize);\n const intersetPoint = newRay.intersectBox({ min: boxMin, max: boxMax }, new Vector3());\n\n if (intersetPoint !== undefined) {\n const insersetPointInWorld = local2World.transformPoint(intersetPoint);\n\n return [insersetPointInWorld];\n } else {\n return;\n }\n}\n\n/**\n * 射线与包围盒求交\n * @param ro - 射线原点\n * @param rd - 射线方向\n * @param bmin - 包围盒左下点\n * @param bmax - 包围盒右上点\n * @returns 交点参数或者 undefined\n */\nfunction RayBoxTesting (ro: Vector3, rd: Vector3, bmin: Vector3, bmax: Vector3): number | undefined {\n let tmin = 0, tmax = 0;\n let tymin = 0, tymax = 0;\n let tzmin = 0, tzmax = 0;\n const invdirx = 1 / rd.x;\n const invdiry = 1 / rd.y;\n const invdirz = 1 / rd.z;\n\n if (invdirx >= 0) {\n tmin = (bmin.x - ro.x) * invdirx;\n tmax = (bmax.x - ro.x) * invdirx;\n } else {\n tmin = (bmax.x - ro.x) * invdirx;\n tmax = (bmin.x - ro.x) * invdirx;\n }\n\n if (invdiry >= 0) {\n tymin = (bmin.y - ro.y) * invdiry;\n tymax = (bmax.y - ro.y) * invdiry;\n } else {\n tymin = (bmax.y - ro.y) * invdiry;\n tymax = (bmin.y - ro.y) * invdiry;\n }\n\n // These lines also handle the case where tmin or tmax is NaN\n // (result of 0 * Infinity). x !== x returns true if x is NaN\n if (tmin > tymax || tymin > tmax) {\n return;\n }\n\n if (tymin > tmin || tmin !== tmin) {\n tmin = tymin;\n }\n if (tymax < tmax || tmax !== tmax) {\n tmax = tymax;\n }\n\n if (invdirz >= 0) {\n tzmin = (bmin.z - ro.z) * invdirz;\n tzmax = (bmax.z - ro.z) * invdirz;\n } else {\n tzmin = (bmax.z - ro.z) * invdirz;\n tzmax = (bmin.z - ro.z) * invdirz;\n }\n\n if (tmin > tzmax || tzmin > tmax) {\n return;\n }\n if (tzmin > tmin || tmin !== tmin) {\n tmin = tzmin;\n }\n if (tzmax < tmax || tmax !== tmax) {\n //return point closest to the ray (positive side)\n tmax = tzmax;\n }\n\n if (tmax < 0) {\n return;\n }\n\n return tmin >= 0 ? tmin : tmax;\n}\n\nconst diff = new Vector3();\nconst edge1 = new Vector3();\nconst edge2 = new Vector3();\nconst normal = new Vector3();\n\n/**\n * 射线与三角形求交\n * @param ro - 射线原点\n * @param rd - 射线方向\n * @param a - 三角形点\n * @param b - 三角形点\n * @param c - 三角形点\n * @param backfaceCulling - 是否剔除背面\n * @returns 交点参数或者 undefined\n */\nfunction RayTriangleTesting (ro: Vector3, rd: Vector3, a: Vector3, b: Vector3, c: Vector3, backfaceCulling: boolean): number | undefined {\n // Compute the offset origin, edges, and normal.\n // from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n edge1.subtractVectors(b, a);\n edge2.subtractVectors(c, a);\n normal.crossVectors(edge1, edge2);\n // Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n //\t |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n //\t |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n //\t |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\n let DdN = rd.dot(normal);\n let sign = 0;\n\n if (DdN > 0) {\n if (backfaceCulling) { return; }\n sign = 1;\n } else if (DdN < 0) {\n sign = -1;\n DdN = -DdN;\n } else {\n return;\n }\n\n diff.subtractVectors(ro, a);\n\n edge2.crossVectors(diff, edge2);\n const DdQxE2 = sign * rd.dot(edge2); // b1 < 0, no intersection\n\n if (DdQxE2 < 0) {\n return;\n }\n\n edge1.crossVectors(edge1, diff);\n const DdE1xQ = sign * rd.dot(edge1); // b2 < 0, no intersection\n\n if (DdE1xQ < 0) {\n return;\n } // b1+b2 > 1, no intersection\n\n if (DdQxE2 + DdE1xQ > DdN) {\n return;\n } // Line intersects triangle, check if ray does.\n\n const QdN = -sign * diff.dot(normal); // t < 0, no intersection\n\n if (QdN < 0) {\n return;\n } // Ray intersects triangle.\n\n return QdN / DdN;\n}\n\n/**\n * 合成点击测试,支持获取多个交点,并按照远近排序\n * @param composition - 合成\n * @param x - 点击 x 坐标\n * @param y - 点击 y 坐标\n * @returns 点击信息列表\n */\nfunction CompositionHitTest (composition: Composition, x: number, y: number): Region[] {\n const regions = composition.hitTest(x, y, true);\n const ray = composition.getHitTestRay(x, y);\n\n if (regions.length <= 0) {\n return [];\n }\n\n const o = ray.origin;\n const d = ray.direction;\n const nums = regions.map((region, index) => {\n const p = region.position;\n //const p = (region.hitPositions as vec3[]) [index];\n const t: spec.vec3 = [0, 0, 0];\n\n for (let i = 0; i < 3; i++) {\n t[i] = (p.getElement(i) - o.getElement(i)) / d.getElement(i);\n }\n\n return [index, Math.max(...t)];\n });\n\n nums.sort(function (a, b) {\n const a1 = a[1] >= 0 ? a[1] : (a[1] + 1000000000);\n const b1 = b[1] >= 0 ? b[1] : (b[1] + 1000000000);\n\n return a1 - b1;\n });\n\n return nums.map(val => {\n return regions[val[0]];\n });\n}\n\n/**\n * 切换 3D Mesh 元素的包围盒显示标志\n * @param composition - 合成\n * @param itemId - 元素 id\n */\nfunction ToggleItemBounding (composition: Composition, itemId: string) {\n composition.items?.forEach(item => {\n if (item.type === VFX_ITEM_TYPE_3D) {\n const meshComponent = item.getComponent(ModelMeshComponent);\n\n if (meshComponent) {\n const mesh = meshComponent.content;\n\n if (item.id === itemId) {\n mesh.visBoundingBox = true;\n } else {\n mesh.visBoundingBox = false;\n }\n }\n }\n });\n}\n\nexport { RayIntersectsBoxWithRotation, RayBoxTesting, RayTriangleTesting, ToggleItemBounding, CompositionHitTest };\n","import type {\n Scene, Attribute, GeometryProps, TextureSourceOptions, TextureSourceCubeData,\n TextureConfigOptions, Texture2DSourceOptionsImage, TextureCubeSourceOptionsImageMipmaps,\n Engine, math,\n RenderPass } from '@galacean/effects';\nimport {\n Player, spec, Transform, glContext, Material, Mesh, Texture, Geometry, Renderer,\n TextureSourceType, getDefaultTextureFactory, RenderPassDestroyAttachmentType,\n DestroyOptions, loadImage, PLAYER_OPTIONS_ENV_EDITOR, GLSLVersion,\n} from '@galacean/effects';\nimport { deserializeGeometry } from '@galacean/effects-helper';\nimport type { GLTFCamera, GLTFImage, GLTFLight, GLTFTexture } from '@vvfx/resource-detection';\nimport type {\n ModelAnimationOptions, ModelMeshOptions, ModelMaterialOptions, ModelLightOptions,\n ModelCameraOptions, ModelSkyboxOptions, ModelSkinOptions, ModelPrimitiveOptions,\n ModelTextureTransform, ModelTreeOptions, ModelAnimTrackOptions, ModelMeshComponent,\n} from '../index';\nimport type { PMaterialBase, PImageBufferData } from '../runtime';\nimport { Matrix3, Matrix4, Vector3, Vector4, DEG2RAD, PMorph, PGlobalState } from '../runtime';\nimport { RayTriangleTesting } from './hit-test-helper';\n\ntype Box3 = math.Box3;\ntype VertexArray = Float32Array | Int32Array | Int16Array | Int8Array | Uint32Array | Uint16Array | Uint8Array;\n\n/**\n * WebGL 辅助类,负责 WebGL 相关对象的创建\n */\nexport class WebGLHelper {\n /**\n * 立方体纹理参数\n */\n static cubemapTexConfig: TextureConfigOptions = {\n name: 'cubemap texture',\n wrapS: glContext.CLAMP_TO_EDGE,\n wrapT: glContext.CLAMP_TO_EDGE,\n magFilter: glContext.LINEAR,\n minFilter: glContext.LINEAR,\n };\n /**\n * 立方体纹理参数,带 Mipmap 滤波\n */\n static cubemapMipTexConfig: TextureConfigOptions = {\n wrapS: glContext.CLAMP_TO_EDGE,\n wrapT: glContext.CLAMP_TO_EDGE,\n magFilter: glContext.LINEAR,\n minFilter: glContext.LINEAR_MIPMAP_LINEAR,\n };\n\n /**\n * 创建二维纹理对象\n * @param engine - 引擎\n * @param image - glTF 图像参数\n * @param texture - glTF 纹理参数\n * @param isBaseColor - 是否基础颜色\n * @param tiny3dMode - 是否 Tiny3d 模式\n * @returns 二维纹理对象\n */\n static async createTexture2D (engine: Engine, image: GLTFImage, texture: GLTFTexture, isBaseColor?: boolean, tiny3dMode?: boolean): Promise<Texture> {\n if (image.imageData === undefined) {\n console.error(`createTexture2D: Invalid image data from ${image}.`);\n\n // 这里不应该发生的,做个兜底\n return Texture.create(engine, {\n name: 'createTexture2D',\n sourceType: TextureSourceType.data,\n data: {\n data: new Uint8Array([255, 255, 255, 255]),\n width: 1,\n height: 1,\n },\n });\n }\n const blob = new Blob([image.imageData], { type: image.mimeType });\n const urlCreator = window.URL || window.webkitURL;\n const imageUrl = urlCreator.createObjectURL(blob);\n const imageObj = new Image();\n\n imageObj.src = imageUrl;\n\n return new Promise(function (resolve, reject) {\n imageObj.onload = () => {\n let minFilter: number = texture.minFilter ?? glContext.LINEAR_MIPMAP_LINEAR;\n let premultiplyAlpha = false;\n\n if (tiny3dMode) {\n //if (minFilter === glContext.NEAREST_MIPMAP_LINEAR\n // || minFilter === glContext.LINEAR_MIPMAP_NEAREST) {\n minFilter = glContext.LINEAR_MIPMAP_LINEAR;\n //}\n if (!WebGLHelper.isPow2(imageObj.width) || !WebGLHelper.isPow2(imageObj.height)) {\n minFilter = glContext.LINEAR;\n }\n //\n premultiplyAlpha = isBaseColor ? false : true;\n }\n\n let generateMipmap = false;\n\n if (minFilter == glContext.NEAREST_MIPMAP_NEAREST ||\n minFilter == glContext.LINEAR_MIPMAP_NEAREST ||\n minFilter == glContext.NEAREST_MIPMAP_LINEAR ||\n minFilter == glContext.LINEAR_MIPMAP_LINEAR) {\n generateMipmap = true;\n }\n\n const res = Texture.create(engine, {\n name: 'createTexture2D',\n wrapS: texture.wrapS ?? glContext.REPEAT,\n wrapT: texture.wrapT ?? glContext.REPEAT,\n magFilter: texture.magFilter ?? glContext.LINEAR,\n minFilter,\n anisotropic: 1,\n //flipY: tex.flipY,\n premultiplyAlpha,\n sourceType: TextureSourceType.image,\n image: imageObj,\n generateMipmap,\n });\n\n resolve(res);\n urlCreator.revokeObjectURL(imageUrl);\n };\n imageObj.onerror = reject;\n });\n }\n\n /**\n * 创建纹理对象列表\n * @param engine - 引擎\n * @param images - glTF 图像列表\n * @param textures - glTF 纹理参数列表\n * @returns 纹理对象列表\n */\n static async createTextureList (engine: Engine, images: GLTFImage[], textures: GLTFTexture[]): Promise<Texture[]> {\n const outTextures = await Promise.all(\n textures.map(tex => {\n return this.createTexture2D(engine, images[tex.source], tex);\n })\n );\n\n return outTextures;\n }\n\n /**\n * 获取立方体纹理数据\n * @param images - 图像数据列表\n * @returns\n */\n static async getTextureCubeData (images: PImageBufferData[]): Promise<TextureSourceCubeData> {\n const cubeData: TextureSourceCubeData = [\n await WebHelper.loadImageFromImageData(images[0]),\n await WebHelper.loadImageFromImageData(images[1]),\n await WebHelper.loadImageFromImageData(images[2]),\n await WebHelper.loadImageFromImageData(images[3]),\n await WebHelper.loadImageFromImageData(images[4]),\n await WebHelper.loadImageFromImageData(images[5]),\n ];\n\n return cubeData;\n }\n\n /**\n * 获取立方体纹理 Mipmap 数据\n * @param images - 图像数据二维列表\n * @returns 立方体纹理数据\n */\n static async getTextureCubeMipmapData (images: PImageBufferData[][]): Promise<TextureSourceCubeData[]> {\n const mipmaps: TextureSourceCubeData[] = [];\n\n for (let i = 0; i < images.length; i++) {\n mipmaps.push(await this.getTextureCubeData(images[i]));\n }\n\n return mipmaps;\n }\n\n /**\n * 从 URL 创建立方体纹理\n * @param engine - 引擎\n * @param cubeImage - 立方体图像 URL\n * @returns 纹理对象\n */\n static async createTextureCubeFromURL (engine: Engine, cubeImage: string[]): Promise<Texture> {\n const textureOptions = await getDefaultTextureFactory().loadSource(\n {\n type: TextureSourceType.image,\n target: glContext.TEXTURE_CUBE_MAP,\n map: cubeImage,\n },\n this.cubemapTexConfig,\n );\n\n return Texture.create(engine, textureOptions);\n }\n\n /**\n * 从 URL 创建带 Mipmap 立方体纹理\n * @param engine - 引擎\n * @param cubeImages - 立方体 Mipmap 图像 URL\n * @returns 纹理对象\n */\n static async createTextureCubeMipmapFromURL (engine: Engine, cubeImages: string[][]): Promise<Texture> {\n const textureOptions = await getDefaultTextureFactory().loadSource(\n {\n type: TextureSourceType.mipmaps,\n target: glContext.TEXTURE_CUBE_MAP,\n maps: cubeImages,\n },\n this.cubemapMipTexConfig,\n );\n\n return Texture.create(engine, textureOptions);\n }\n\n /**\n * 从缓冲区创建立方体纹理\n * @param engine - 引擎\n * @param cubeImages - 图像缓冲区数据列表\n * @returns 纹理对象\n */\n static async createTextureCubeFromBuffer (engine: Engine, cubeImages: PImageBufferData[]): Promise<Texture> {\n const cubemap = await WebGLHelper.getTextureCubeData(cubeImages);\n\n return Texture.create(\n engine,\n {\n name: 'createTextureCubeFromBuffer',\n sourceType: TextureSourceType.image,\n cube: cubemap,\n target: glContext.TEXTURE_CUBE_MAP,\n ...this.cubemapTexConfig,\n });\n }\n\n /**\n * 从缓冲区创建带 Mipmap 立方体纹理\n * @param engine - 引擎\n * @param cubeImages - 图像缓冲区数据二维列表\n * @param level0Size - 第 0 层 Mip 的图像大小\n * @returns 纹理对象\n */\n static async createTextureCubeMipmapFromBuffer (engine: Engine, cubeImages: PImageBufferData[][], level0Size: number): Promise<Texture> {\n const mipmaps = await WebGLHelper.getTextureCubeMipmapData(cubeImages);\n //\n let mipCount = 0;\n\n while (Math.pow(2, mipCount) < level0Size) {\n ++mipCount;\n }\n\n while (mipmaps.length <= mipCount) {\n const index = Math.pow(2, mipCount - mipmaps.length);\n const url = `https://gw.alipayobjects.com/zos/gltf-asset/67896749597915/img${index}.png`;\n const imageData = await loadImage(url);\n\n mipmaps.push([imageData, imageData, imageData, imageData, imageData, imageData]);\n }\n\n return Texture.create(\n engine,\n {\n name: 'createTextureCubeMipmapFromBuffer',\n sourceType: TextureSourceType.mipmaps,\n mipmaps,\n target: glContext.TEXTURE_CUBE_MAP,\n ...this.cubemapMipTexConfig,\n });\n }\n\n /**\n * 获取纹理对象\n * @param index - 索引\n * @param textures - 纹理数组\n * @returns 纹理获取或 undefined\n */\n static getTexture (index: number, textures: Texture[]): Texture | null {\n if (index < 0 || index >= textures.length) {\n return null;\n } else {\n return textures[index];\n }\n }\n\n /**\n * 从图像创建纹理\n * @param engine - 引擎\n * @param image - HTML 图像元素\n * @returns\n */\n static createTextureFromImage (engine: Engine, image: HTMLImageElement | HTMLCanvasElement): Texture {\n const options: TextureSourceOptions = {\n name: 'createTextureFromImage',\n image,\n sourceType: TextureSourceType.image,\n flipY: false,\n magFilter: glContext.LINEAR,\n minFilter: glContext.LINEAR,\n wrapT: glContext.REPEAT,\n wrapS: glContext.REPEAT,\n };\n\n return Texture.create(engine, options);\n }\n\n /**\n * 删除纹理\n * @param texture - 纹理对象\n */\n static deleteTexture (texture: Texture) {\n texture.dispose();\n }\n\n /**\n * 删除 Mesh\n * @param mesh - Mesh 对象\n */\n static deleteMesh (mesh: Mesh) {\n mesh.dispose({\n geometries: DestroyOptions.destroy,\n });\n }\n\n /**\n * 删除几何\n * @param geometry - 几何体\n */\n static deleteGeometry (geometry: Geometry) {\n geometry.dispose();\n }\n\n /**\n * 删除渲染 Pass\n * @param pass - 渲染 Pass\n */\n static deleteRenderPass (pass: RenderPass) {\n pass.dispose({\n meshes: {\n geometries: DestroyOptions.destroy,\n },\n depthStencilAttachment: RenderPassDestroyAttachmentType.force,\n colorAttachment: RenderPassDestroyAttachmentType.force,\n semantics: DestroyOptions.destroy,\n });\n }\n\n /**\n * 返回 Mesh 是否半透明\n * @param component - ModelMeshComponent 对象\n * @return 是否半透明\n */\n static isTransparentMesh (component: ModelMeshComponent): boolean {\n return component.material.blending === true;\n }\n\n /**\n * renderer 是否支持 Float 纹理\n * @param engine - 引擎对象\n * @returns\n */\n static isSupportFloatTexture (engine: Engine): boolean {\n const capability = engine.gpuCapability;\n\n return capability.detail.floatTexture !== 0;\n }\n\n /**\n * renderer 是否支持 HalfFloat 纹理\n * @returns\n */\n static isSupportHalfFloatTexture (engine: Engine): boolean {\n const capability = engine.gpuCapability;\n\n return capability.detail.halfFloatTexture !== 0;\n }\n\n /**\n * 是否 2 的幂次\n * @param v - 数值\n * @returns\n */\n static isPow2 (v: number): boolean {\n return !(v & (v - 1)) && (!!v);\n }\n}\n\n/**\n * Mesh 辅助类,负责 Mesh 相关的基础对象创建\n */\nexport class MeshHelper {\n /**\n * 创建滤波 Mesh\n * @param engine - 引擎\n * @param name - 名称\n * @param material - 3D 材质\n * @returns Mesh 对象\n */\n static createFilterMesh (engine: Engine, name: string, material: PMaterialBase): Mesh {\n const globalState = PGlobalState.getInstance();\n const vertexShader = material.vertexShaderCode;\n const fragmentShader = material.fragmentShaderCode;\n const geometry = Geometry.create(engine, MeshHelper.getPlaneGeometry());\n const isWebGL2 = engine.gpuCapability.level === 2;\n const effectsMaterial = Material.create(\n engine,\n {\n shader: {\n vertex: vertexShader,\n fragment: fragmentShader,\n shared: globalState.shaderShared,\n glslVersion: isWebGL2 ? GLSLVersion.GLSL3 : GLSLVersion.GLSL1,\n },\n }\n );\n\n material.setMaterialStates(effectsMaterial);\n\n return Mesh.create(\n engine,\n {\n name,\n worldMatrix: Matrix4.fromIdentity(),\n material: effectsMaterial,\n geometry,\n }\n );\n }\n\n /**\n * 获取平面的几何参数\n * @returns 几何参数\n */\n static getPlaneGeometry (): GeometryProps {\n const data = MeshHelper.getPlaneVertexArray();\n\n return {\n attributes: {\n aPos: {\n type: glContext.FLOAT,\n size: 3,\n data,\n stride: Float32Array.BYTES_PER_ELEMENT * 8,\n offset: 0,\n },\n aUV: {\n type: glContext.FLOAT,\n size: 2,\n stride: Float32Array.BYTES_PER_ELEMENT * 8,\n offset: Float32Array.BYTES_PER_ELEMENT * 3,\n dataSource: 'aPos',\n },\n aNormal: {\n type: glContext.FLOAT,\n size: 3,\n stride: Float32Array.BYTES_PER_ELEMENT * 8,\n offset: Float32Array.BYTES_PER_ELEMENT * 5,\n dataSource: 'aPos',\n },\n },\n drawStart: 0,\n drawCount: data.length / 8,\n };\n }\n\n /**\n * 获取平面顶点数组\n * @returns 浮点数组\n */\n static getPlaneVertexArray (): Float32Array {\n const halfSize = 1;\n\n return new Float32Array([\n -halfSize, -halfSize, 0, 0, 0, 0, 0, 1,\n halfSize, -halfSize, 0, 1, 0, 0, 0, 1,\n halfSize, halfSize, 0, 1, 1, 0, 0, 1,\n\n -halfSize, -halfSize, 0, 0, 0, 0, 0, 1,\n halfSize, halfSize, 0, 1, 1, 0, 0, 1,\n -halfSize, halfSize, 0, 0, 1, 0, 0, 1,\n ]);\n }\n}\n\nexport interface EffectsSceneInfo {\n loadSkybox?: boolean,\n}\n\n/**\n * 3D 插件辅助类,为插件提供基础的函数\n */\nexport class PluginHelper {\n /**\n * 创建 3D 灯光参数,从 glTF 灯光参数\n * @param light - glTF 灯光参数\n * @returns 3D 灯光参数\n */\n static createLightOptions (light: GLTFLight): ModelLightOptions {\n const color = light.color ?? [255, 255, 255, 255];\n\n if (light.type === 'point') {\n return {\n color,\n intensity: light.intensity ?? 1.0,\n //\n lightType: 'point',\n range: light.range ?? 0,\n };\n } else if (light.type === 'spot') {\n return {\n color,\n intensity: light.intensity ?? 1.0,\n //\n lightType: 'spot',\n range: light.range ?? 0,\n innerConeAngle: light.innerConeAngle ?? 0,\n outerConeAngle: light.outerConeAngle ?? Math.PI / 4.0,\n };\n } else { // \"directional\"\n return {\n color,\n intensity: light.intensity ?? 1.0,\n //\n lightType: 'directional',\n };\n }\n }\n\n /**\n * 创建 3D 相机参数,从 glTF 相机参数\n * @param camera - glTF 相机参数\n * @returns 3D 相机参数\n */\n static createCameraOptions (camera: GLTFCamera): ModelCameraOptions | undefined {\n if (camera.perspective === undefined) { return; }\n\n const p = camera.perspective;\n const options: ModelCameraOptions = {\n near: p.znear,\n far: p.zfar ?? 1000,\n fov: p.yfov,\n clipMode: 0,\n };\n\n return options;\n }\n\n /**\n * 转成播放器中 [0, 255] 区间的颜色值\n * @param color - RGB 颜色值\n * @returns RGB 颜色值\n */\n static toPlayerColor3 (color: spec.vec3): spec.vec3 {\n // [0, 1] => [0, 255]\n return [\n this.scaleTo255(color[0]),\n this.scaleTo255(color[1]),\n this.scaleTo255(color[2]),\n ];\n }\n\n /**\n * 转成播放器中 [0, 255] 区间的颜色值\n * @param color - RGBA 颜色值\n * @returns RGBA 颜色值\n */\n static toPlayerColor4 (color: spec.vec4): spec.vec4 {\n // [0, 1] => [0, 255]\n return [\n this.scaleTo255(color[0]),\n this.scaleTo255(color[1]),\n this.scaleTo255(color[2]),\n this.scaleTo255(color[3]),\n ];\n }\n\n /**\n * 转成插件中 [0, 1] 区间的颜色值\n * @param color - RGB 颜色值\n * @returns RGB 颜色值\n */\n static toPluginColor3 (color: spec.vec3): spec.vec3 {\n // [0, 255] => [0, 1]\n return [\n this.scaleTo1(color[0]),\n this.scaleTo1(color[1]),\n this.scaleTo1(color[2]),\n ];\n }\n\n /**\n * 转成插件中 [0, 1] 区间的颜色值\n * @param color - RGBA 颜色值\n * @returns RGBA 颜色值\n */\n static toPluginColor4 (color: spec.vec4): spec.vec4 {\n // [0, 255] => [0, 1]\n return [\n this.scaleTo1(color[0]),\n this.scaleTo1(color[1]),\n this.scaleTo1(color[2]),\n this.scaleTo1(color[3]),\n ];\n }\n\n /**\n * 创建 UV 变换矩阵,从 UV 变换参数中\n * @param stValue - UV 的缩放和平移参数\n * @param rotateValue - UV 的旋转参数\n * @returns 3阶变换矩阵\n */\n static createUVTransform (material: Material, stName: string, rotateName: string): Matrix3 {\n const stValue = material.getVector4(stName);\n const rotateValue = material.getFloat(rotateName);\n\n const res = Matrix3.fromIdentity();\n\n if (stValue) {\n res.setFromArray([\n 1, 0, 0,\n 0, 1, 0,\n stValue.z, stValue.w, 1,\n ]);\n }\n\n const temp = new Matrix3();\n\n if (rotateValue) {\n const cosTheta = Math.cos(rotateValue);\n const sinTheta = Math.sin(rotateValue);\n\n temp.setFromArray([\n cosTheta, sinTheta, 0,\n -sinTheta, cosTheta, 0,\n 0, 0, 1,\n ]);\n res.multiply(temp);\n }\n\n if (stValue) {\n temp.setFromArray([\n stValue.x, 0, 0,\n 0, stValue.y, 0,\n 0, 0, 1,\n ]);\n res.multiply(temp);\n }\n\n res.transpose();\n\n return res;\n }\n\n /**\n * 获取截断后的数值\n * @param val - 数值\n * @param minv - 最小值\n * @param maxv - 最大值\n * @returns\n */\n static clamp (val: number, minv: number, maxv: number): number {\n return Math.max(Math.min(val, maxv), minv);\n }\n\n /**\n * 转换成 [0, 255] 区间数值\n * @param val - [0, 1] 区间数值\n * @returns\n */\n static scaleTo255 (val: number): number {\n const intVal = Math.round(val * 255);\n\n return Math.max(0, Math.min(intVal, 255));\n }\n\n /**\n * 转换成 [0, 1] 区间数值\n * @param val - [0, 255] 区间数值\n * @returns\n */\n static scaleTo1 (val: number): number {\n const floatVal = val / 255.0;\n\n return Math.max(0.0, Math.min(floatVal, 1.0));\n }\n\n /**\n * 根据相机的位置、Y 轴旋转角度和目标点位置来计算相机变换,\n * 使得相机能够专注于目标点上\n * @param cameraPosition - 相机位置\n * @param YRotationAngle - Y 轴旋转角度\n * @param targetPoint - 目标点\n * @returns 相机变换\n */\n static focusOnPoint (cameraPosition: spec.vec3, YRotationAngle: number, targetPoint: spec.vec3) {\n const camPos = Vector3.fromArray(cameraPosition);\n const targetPos = Vector3.fromArray(targetPoint);\n const deltaPos = new Vector3().copyFrom(camPos).subtract(targetPos);\n const rotationMat = Matrix4.fromRotationAxis(new Vector3(0, 1, 0), YRotationAngle * DEG2RAD);\n\n rotationMat.transformPoint(deltaPos);\n const newCamPos = deltaPos.clone().add(targetPos);\n const viewMatrix = new Matrix4().lookAt(newCamPos, targetPos, new Vector3(0, 1, 0)).invert();\n const effectsTransform = new Transform();\n\n effectsTransform.setValid(true);\n effectsTransform.cloneFromMatrix(viewMatrix);\n\n return effectsTransform;\n }\n\n /**\n * 场景预处理,在移动端 3D 插件会对场景进行预处理,调整纹理参数\n * @param scene - 场景\n * @param runtimeEnv - 运行时环境\n * @param compatibleMode - 兼容模式\n * @param autoAdjustScene - 是否自动调整\n * @returns 场景信息描述\n */\n static preprocessScene (scene: Scene, runtimeEnv: string, compatibleMode: string): EffectsSceneInfo {\n const deviceEnv = (runtimeEnv !== PLAYER_OPTIONS_ENV_EDITOR);\n const tiny3dMode = (compatibleMode === 'tiny3d');\n // 默认skybox如何处理需要讨论\n const jsonScene = scene.jsonScene;\n\n if (!(jsonScene && jsonScene.textures && jsonScene.materials)) {\n // 安全检查\n return {};\n }\n\n const dataMap: Record<string, TextureSourceOptions> = {};\n\n scene.textureOptions.forEach(tex => {\n const id = tex.id;\n\n if (id) {\n dataMap[id] = tex;\n }\n });\n\n let loadSkybox = false;\n\n if (deviceEnv) {\n jsonScene.materials.forEach(mat => {\n this.preprocessTextureOptions(dataMap, mat.textures['_BaseColorSampler'], true, tiny3dMode);\n this.preprocessTextureOptions(dataMap, mat.textures['_MetallicRoughnessSampler'], false, tiny3dMode);\n this.preprocessTextureOptions(dataMap, mat.textures['_NormalSampler'], false, tiny3dMode);\n this.preprocessTextureOptions(dataMap, mat.textures['_OcclusionSampler'], false, tiny3dMode);\n this.preprocessTextureOptions(dataMap, mat.textures['_EmissiveSampler'], false, tiny3dMode);\n });\n jsonScene.components.forEach(comp => {\n if (comp.dataType === spec.DataType.SkyboxComponent) {\n loadSkybox = true;\n const skybox = comp as spec.SkyboxComponentData;\n\n if (skybox.diffuseImage) {\n this.preprocessTextureOptions(dataMap, skybox.diffuseImage, false, tiny3dMode);\n }\n if (skybox.specularImage) {\n this.preprocessTextureOptions(dataMap, skybox.specularImage, false, tiny3dMode);\n }\n }\n });\n }\n\n return { loadSkybox };\n }\n\n /**\n * 纹理参数预处理,设置环绕模式和滤波器\n * @param index - 纹理索引\n * @param textures - 纹理数组\n * @param isBaseColor - 是否基础颜色\n * @param tiny3dMode - 是否 Tiny3d 模式\n * @returns\n */\n static preprocessTextureOptions (dataMap: Record<string, TextureSourceOptions>, textureInfo: spec.MaterialTextureProperty | spec.DataPath, isBaseColor: boolean, tiny3dMode: boolean) {\n if (!tiny3dMode || !textureInfo) {\n return;\n }\n\n let texId;\n\n if ('texture' in textureInfo) {\n texId = textureInfo.texture.id;\n } else {\n texId = textureInfo.id;\n }\n\n if (!texId) {\n return;\n }\n\n const texOptions = dataMap[texId];\n\n if (!texOptions) {\n return;\n }\n\n if (texOptions.target === undefined || texOptions.target === glContext.TEXTURE_2D) {\n texOptions.wrapS = glContext.REPEAT;\n texOptions.wrapT = glContext.REPEAT;\n texOptions.magFilter = glContext.LINEAR;\n texOptions.minFilter = glContext.LINEAR_MIPMAP_LINEAR;\n if (!isBaseColor) {\n texOptions.premultiplyAlpha = true;\n }\n const newOptions = texOptions as Texture2DSourceOptionsImage;\n\n newOptions.generateMipmap = true;\n const image = newOptions.image;\n\n if (image && image.width && image.height) {\n if (!WebGLHelper.isPow2(image.width) || !WebGLHelper.isPow2(image.height)) {\n texOptions.minFilter = glContext.LINEAR;\n }\n }\n } else if (texOptions.target === glContext.TEXTURE_CUBE_MAP) {\n texOptions.wrapS = glContext.CLAMP_TO_EDGE;\n texOptions.wrapT = glContext.CLAMP_TO_EDGE;\n if ((texOptions as TextureCubeSourceOptionsImageMipmaps).mipmaps !== undefined) {\n if ((texOptions as TextureCubeSourceOptionsImageMipmaps).mipmaps.length === 1) {\n texOptions.magFilter = glContext.LINEAR;\n texOptions.minFilter = glContext.LINEAR;\n } else {\n texOptions.magFilter = glContext.LINEAR;\n texOptions.minFilter = glContext.LINEAR_MIPMAP_LINEAR;\n }\n } else {\n texOptions.magFilter = glContext.LINEAR;\n texOptions.minFilter = glContext.LINEAR;\n }\n }\n }\n\n /**\n * 创建几何体,根据几何参数描述 JSON 和数据数组\n * @param engine - 引擎\n * @param geomJson - 几何参数描述 JSON\n * @param bins - 数据数组\n * @returns 几何体\n */\n static createGeometry (engine: Engine, geomJson: spec.GeometryOptionsJSON, bins: ArrayBuffer[]): Geometry {\n const geomOptions = deserializeGeometry(geomJson, bins);\n const attributes: Record<string, Attribute> = {};\n\n // 兼容代码,解决 attribute 的名称问题\n for (const attrib in geomOptions.attributes) {\n const attribData = geomOptions.attributes[attrib];\n const name = this.getAttributeName(attrib);\n\n attributes[name] = attribData;\n }\n geomOptions.attributes = attributes;\n\n return Geometry.create(engine, geomOptions);\n }\n\n /**\n * 索引数组类型转换\n * @param type - 类型\n * @param array - 索引数组\n * @returns 索引数组\n */\n static getIndexArray (type: number, array: spec.TypedArray) {\n switch (type) {\n case WebGLRenderingContext['UNSIGNED_INT']:\n return array as Uint32Array;\n case WebGLRenderingContext['UNSIGNED_SHORT']:\n return array as Uint16Array;\n case WebGLRenderingContext['UNSIGNED_BYTE']:\n return array as Uint8Array;\n default:\n console.error(`Invalid index attribute type ${type}.`);\n }\n }\n\n /**\n * 属性名称转换\n * @param name - 旧名称\n * @returns 新名称\n */\n static getAttributeName (name: string): string {\n switch (name) {\n case 'POSITION': return 'aPos';\n case 'NORMAL': return 'aNormal';\n case 'TANGENT': return 'aTangent';\n case 'TEXCOORD_0': return 'aUV';\n case 'TEXCOORD_1': return 'aUV2';\n case 'JOINTS_0': return 'aJoints';\n case 'WEIGHTS_0': return 'aWeights';\n }\n\n if (!name.startsWith('a')) {\n // aPos, aNormal, aTangent,\n // aUV, aUV2, aJoints, aWeights\n // aTargetXXX\n console.warn(`Unknown attribute name: ${name}.`);\n }\n\n return name;\n }\n\n /**\n * 获取纹理对象\n * @param textures - 纹理数组\n * @param index - 索引\n * @returns\n */\n static getTextureObj (textures: Texture[], index?: number): Texture | null {\n if (typeof index !== 'number') {\n return null;\n }\n\n if (index < 0 || index >= textures.length) {\n console.error(`Invalid index for textures: ${index}, ${textures.length}.`);\n }\n\n return textures[index];\n }\n}\n\n/**\n * Web 辅助类,负责 Web 相关的基础功能\n */\nexport class WebHelper {\n /**\n * 获取图像文件名,从 URL 链接中\n * @param url - 链接\n * @param ext - 扩展名\n * @returns\n */\n static getImageFileName (url: string, ext?: string): string {\n const begin = url.lastIndexOf('/');\n const end = url.lastIndexOf('.');\n const substr = url.substring(begin + 1, end);\n\n return ext ? substr + ext : substr;\n }\n\n /**\n * 获取当前时间字符串\n * @returns\n */\n static getCurrnetTimeStr (): string {\n const date = new Date(Date.now());\n const timeStr = date.toLocaleString('zh-CN');\n const ms = `${date.getMilliseconds()}`;\n\n return timeStr.split(/[ /:]+/).join('') + ms.padStart(3, '0');\n }\n\n /**\n * 将 URL 链接保存成文件\n * @param url - 链接\n * @param filename - 文件名\n */\n static saveFileForURL (url: string, filename: string) {\n const a = document.createElement('a');\n\n a.setAttribute('download', filename);\n a.target = '_blank';\n a.href = url;\n a.click();\n }\n\n /**\n * 创建播放器\n * @param manualRender - 是否手动渲染\n * @returns\n */\n static createPlayer (manualRender = true) {\n const canvas = document.createElement('canvas');\n\n canvas.width = 512;\n canvas.height = 512;\n\n return new Player({\n canvas,\n renderFramework: 'webgl2',\n env: PLAYER_OPTIONS_ENV_EDITOR,\n renderOptions: {\n willCaptureImage: true,\n },\n manualRender,\n });\n }\n\n /**\n * 休眠\n * @param ms - 时间,单位是毫秒\n * @returns\n */\n static async sleep (ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n /**\n * 从 glTF 图像加载 HTML 图像元素\n * @param image - glTF 图像\n * @returns HTML 图像元素\n */\n static async loadImageFromGLTFImage (image: GLTFImage): Promise<HTMLImageElement> {\n return loadImage(new Blob([image.imageData], { type: image.mimeType }));\n }\n\n /**\n * 从图像缓存区数据加载 HTML 图像元素\n * @param image - 图像缓冲区数据\n * @returns\n */\n static async loadImageFromImageData (image: PImageBufferData): Promise<HTMLImageElement> {\n return loadImage(new Blob([image.data], { type: image.mimeType }));\n }\n\n /**\n * 获取画布渲染的内容,转成 PNG 图片数据\n * @param canvas - HTML 画布元素\n * @returns PNG 图片数据\n */\n static async getCanvasArrayBuffer (canvas: HTMLCanvasElement): Promise<ArrayBuffer> {\n return new Promise<ArrayBuffer>(function (resolve, reject) {\n canvas.toBlob(function (b) {\n if (b) {\n resolve(b.arrayBuffer());\n } else {\n reject(new Error('No canvas blob.'));\n }\n }, 'image/png', 1);\n });\n }\n\n /**\n * 从 HTML 图像、视频或位图图像对象获取图像数据\n * @param image - HTML 图像、视频或位图图像\n * @returns PNG 图片数据\n */\n static async getImageArrayBuffer (image: HTMLImageElement | ImageBitmap | HTMLVideoElement): Promise<ArrayBuffer> {\n const cvs = document.createElement('canvas');\n\n cvs.width = image.width;\n cvs.height = image.height;\n (cvs.getContext('2d') as CanvasRenderingContext2D).drawImage(image, 0, 0);\n\n return this.getCanvasArrayBuffer(cvs);\n }\n\n /**\n * 获取画布元素渲染结果\n * @param canvas - 画布元素\n * @returns\n */\n static getCanvasImageData (canvas: HTMLCanvasElement): ImageData {\n const ctx = canvas.getContext('2d') as CanvasRenderingContext2D;\n\n return ctx.getImageData(0, 0, canvas.width, canvas.height);\n }\n\n /**\n * 翻转图像\n * @param imageData - 图像数据\n * @returns 翻转后的图像\n */\n static flipImageData (imageData: ImageData): ImageData {\n const flipped = document.createElement('canvas');\n const ctx = flipped.getContext('2d') as CanvasRenderingContext2D;\n\n flipped.width = imageData.width;\n flipped.height = imageData.height;\n // first put the imageData\n ctx.putImageData(imageData, 0, 0);\n // because we've got transparency\n ctx.globalCompositeOperation = 'copy';\n ctx.scale(1, -1); // Y flip\n ctx.translate(0, -imageData.height); // so we can draw at 0,0\n ctx.drawImage(flipped, 0, 0);\n // now we can restore the context to defaults if needed\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.globalCompositeOperation = 'source-over';\n\n return ctx.getImageData(0, 0, flipped.width, flipped.height);\n }\n\n /**\n * 从 HTML 图像、视频或位图图像对象获取翻转后的图像数据\n * @param image - HTML 图像、视频或位图图像\n * @returns PNG 图片数据\n */\n static getImageData (image: HTMLImageElement | ImageBitmap | HTMLVideoElement): ImageData {\n const cvs = document.createElement('canvas');\n\n cvs.width = image.width;\n cvs.height = image.height;\n const ctx = cvs.getContext('2d') as CanvasRenderingContext2D;\n\n ctx.drawImage(image, 0, 0);\n\n return this.flipImageData(ctx.getImageData(0, 0, cvs.width, cvs.height));\n }\n\n /**\n * 获取位图数据,从 HTML 画布元素\n * @param canvas - HTML 画布元素\n * @returns uint8 数组\n */\n static getWebGLCanvasImageBuffer (canvas: HTMLCanvasElement): Uint8Array {\n const ctx = canvas.getContext('webgl2') as WebGL2RenderingContext;\n const pixels = new Uint8Array(canvas.width * canvas.height * 4);\n\n ctx.readPixels(0, 0, canvas.width, canvas.height, ctx.RGBA, ctx.UNSIGNED_BYTE, pixels);\n\n return pixels;\n }\n}\n\n/**\n * 顶点属性缓冲区\n */\nexport class VertexAttribBuffer {\n /**\n * 顶点数组\n */\n data!: VertexArray;\n /**\n * 分量数\n */\n component = 0;\n /**\n * 长度\n */\n length = 0;\n /**\n * 偏移\n */\n offset = 0;\n /**\n * 步长\n */\n stride = 0;\n /**\n * 类型大小\n */\n typeSize = 0;\n\n /**\n * 获取包围盒,根据顶点数据\n * @param box - 包围盒,会被修改\n * @returns 包围盒\n */\n getBoundingBox (box: Box3) {\n let index = this.offset;\n const point = new Vector3();\n\n while (index + this.component <= this.length) {\n if (this.component == 2) {\n point.set(this.data[index], this.data[index + 1], 0);\n } else {\n point.set(this.data[index], this.data[index + 1], this.data[index + 2]);\n }\n box.expandByPoint(point);\n index += this.stride;\n }\n\n return box;\n }\n}\n\nclass AttributeArray {\n data!: spec.TypedArray;\n //\n length = 0;\n offset = 0;\n stride = 0;\n //\n typeSize = 0;\n compCount = 0;\n //\n signed = false;\n compressed = false;\n compressScale = 1.0;\n\n create (inAttrib: Attribute, inArray: spec.TypedArray) {\n switch (inAttrib.type) {\n case WebGLRenderingContext['INT']:\n this.typeSize = 4;\n this.signed = true;\n this.compressScale = 1 / 2147483647.0;\n\n break;\n case WebGLRenderingContext['SHORT']:\n this.typeSize = 2;\n this.signed = true;\n this.compressScale = 1 / 32767.0;\n\n break;\n default:\n this.typeSize = 4;\n this.signed = true;\n this.compressScale = 1.0;\n }\n\n this.data = inArray;\n this.length = this.data.length;\n this.compCount = inAttrib.size;\n //\n this.offset = inAttrib.offset ?? 0;\n if (this.offset > 0) {\n if (this.offset % this.typeSize !== 0) { console.error(`Invalid offset ${this.offset}, type size ${this.typeSize}.`); }\n this.offset = this.offset / this.typeSize;\n }\n //\n this.stride = inAttrib.stride ?? 0;\n if (this.stride > 0) {\n if (this.stride % this.typeSize !== 0) { console.error(`Invalid stride ${this.stride}, type size ${this.typeSize}.`); }\n this.stride = this.stride / this.typeSize;\n } else {\n this.stride = this.compCount;\n }\n //\n this.compressed = inAttrib.normalize === true;\n }\n\n getData (index: number): [number, number, number, number] | undefined {\n let offset = this.offset;\n\n offset += index * this.stride;\n if (offset + this.compCount > this.length) { return; }\n\n let res: [number, number, number, number];\n\n if (this.compCount === 2) {\n res = [this.data[offset], this.data[offset + 1], 0, 0];\n } else if (this.compCount === 3) {\n res = [this.data[offset], this.data[offset + 1], this.data[offset + 2], 0];\n } else {\n res = [this.data[offset], this.data[offset + 1], this.data[offset + 2], this.data[offset + 3]];\n }\n\n if (this.compressed) {\n for (let i = 0; i < this.compCount; i++) {\n res[i] *= this.compressScale;\n if (this.signed) {\n res[i] = Math.max(res[i], -1.0);\n }\n }\n }\n\n return res;\n }\n\n getLength (): number {\n return Math.round((this.length - this.offset) / this.stride);\n }\n}\n\n/**\n * 几何包围盒代理类\n */\nexport class GeometryBoxProxy {\n /**\n * 渲染开始索引\n */\n drawStart = 0;\n /**\n * 渲染索引数目\n */\n drawCount = 0;\n /**\n * 索引数组\n */\n index?: spec.TypedArray;\n /**\n * 位置数组\n */\n position!: AttributeArray;\n /**\n * 关节点数组\n */\n joint?: AttributeArray;\n /**\n * 权重数组\n */\n weight?: AttributeArray;\n /**\n * 绑定矩阵数组\n */\n bindMatrices: Matrix4[] = [];\n\n /**\n * 创建函数,根据几何体和绑定矩阵数组\n * @param geometry - 几何体\n * @param bindMatrices - 绑定矩阵数组\n */\n create (geometry: Geometry, bindMatrices: Matrix4[]) {\n this.drawStart = 0;\n this.drawCount = Math.abs(geometry.getDrawCount());\n // FIXME: 需要geometry中的attributes数组,GLGeometry有这个数组,其他的没有\n // @ts-expect-error\n const attributes = geometry.attributes as Record<string, Attribute>;\n\n //\n this.index = geometry.getIndexData();\n const positionAttrib = attributes['aPos'];\n const positionArray = geometry.getAttributeData('aPos') as spec.TypedArray;\n\n this.position = new AttributeArray();\n this.position.create(positionAttrib, positionArray);\n //\n const jointAttrib = attributes['aJoints'];\n const weightAttrib = attributes['aWeights'];\n\n if (jointAttrib !== undefined && weightAttrib !== undefined) {\n const jointArray = geometry.getAttributeData('aJoints') as spec.TypedArray;\n const weightArray = geometry.getAttributeData('aWeights') as spec.TypedArray;\n\n this.joint = new AttributeArray();\n this.joint.create(jointAttrib, jointArray);\n this.weight = new AttributeArray();\n this.weight.create(weightAttrib, weightArray);\n }\n this.bindMatrices = bindMatrices;\n }\n\n /**\n * 获取包围盒,如果有骨骼动画,需要先更新位置\n * @param box - 包围盒,会被修改\n * @returns 包围盒\n */\n getBoundingBox (box: Box3) {\n box.makeEmpty();\n const skinMat = new Matrix4();\n const hasAnim = this.joint !== undefined && this.weight !== undefined && this.bindMatrices.length > 0;\n\n const indexSet: Set<number> = new Set();\n\n if (this.index !== undefined) {\n for (let i = 0; i < this.drawCount; i++) {\n const j = this.drawStart + i;\n\n if (j < this.index.length) {\n indexSet.add(this.index[j]);\n }\n }\n } else {\n for (let i = 0; i < this.drawCount; i++) {\n indexSet.add(this.drawStart + i);\n }\n }\n\n indexSet.forEach(index => {\n const posData = this.position.getData(index);\n\n if (posData !== undefined) {\n const posVec = Vector3.fromArray(posData);\n\n if (hasAnim) {\n const jointData = this.joint?.getData(index);\n const weightData = this.weight?.getData(index);\n\n if (jointData !== undefined && weightData !== undefined) {\n skinMat.setZero();\n let findError = false;\n\n for (let i = 0; i < 4; i++) {\n if (weightData[i] === 0) {\n continue;\n }\n\n if (jointData[i] < 0 || jointData[i] >= this.bindMatrices.length) {\n findError = true;\n\n break;\n }\n\n const bindMat = this.bindMatrices[jointData[i]];\n\n skinMat.addScaledMatrix(bindMat, weightData[i]);\n }\n\n if (!findError) {\n const resVec = skinMat.transformVector4(new Vector4(posVec.x, posVec.y, posVec.z, 1.0));\n\n if (Math.abs(resVec.w) > 1e-4) {\n resVec.multiply(1.0 / resVec.w);\n posVec.set(resVec.x, resVec.y, resVec.z);\n }\n }\n }\n }\n\n box.expandByPoint(posVec);\n }\n });\n\n return box;\n }\n}\n\n/**\n * 点击测试代理类,\n */\nexport class HitTestingProxy {\n /**\n * 渲染开始索引\n */\n drawStart = 0;\n /**\n * 渲染索引数目\n */\n drawCount = 0;\n /**\n * 索引数组\n */\n index?: spec.TypedArray;\n /**\n * 位置数组\n */\n position!: AttributeArray;\n /**\n * 关节点数组\n */\n joint?: AttributeArray;\n /**\n * 权重数组\n */\n weight?: AttributeArray;\n /**\n * 是否双面\n */\n doubleSided = false;\n /**\n * 绑定矩阵数组\n */\n bindMatrices: Matrix4[] = [];\n /**\n * 是否有动画\n */\n hasAnimation = false;\n /**\n * 蒙皮矩阵\n */\n skinMatrix = new Matrix4();\n\n /**\n * 创建对象,传入几何体、是否双面和绑定矩阵列表\n * @param geometry - 几何体\n * @param doubleSided - 是否双面\n * @param bindMatrices - 绑定矩阵列表\n */\n create (geometry: Geometry, doubleSided: boolean, bindMatrices: Matrix4[]) {\n this.drawStart = 0;\n this.drawCount = Math.abs(geometry.getDrawCount());\n // FIXME: 需要geometry中的attributes数组,GLGeometry有这个数组,其他的没有\n // @ts-expect-error\n const attributes = geometry.attributes as Record<string, Attribute>;\n\n //\n this.index = geometry.getIndexData();\n const positionAttrib = attributes['aPos'];\n const positionArray = geometry.getAttributeData('aPos') as spec.TypedArray;\n\n this.position = new AttributeArray();\n this.position.create(positionAttrib, positionArray);\n //\n const jointAttrib = attributes['aJoints'];\n const weightAttrib = attributes['aWeights'];\n\n if (jointAttrib !== undefined && weightAttrib !== undefined) {\n const jointArray = geometry.getAttributeData('aJoints') as spec.TypedArray;\n const weightArray = geometry.getAttributeData('aWeights') as spec.TypedArray;\n\n this.joint = new AttributeArray();\n this.joint.create(jointAttrib, jointArray);\n this.weight = new AttributeArray();\n this.weight.create(weightAttrib, weightArray);\n }\n this.doubleSided = doubleSided;\n this.bindMatrices = bindMatrices;\n this.hasAnimation = this.joint !== undefined && this.weight !== undefined && this.bindMatrices.length > 0;\n }\n\n /**\n * 点击测试,返回射线参数值\n * @param rayOrigin - 射线原点\n * @param rayDirection - 射线方向\n * @returns 射线参数值或 undefined\n */\n getHitPoint (rayOrigin: Vector3, rayDirection: Vector3): number | undefined {\n let mint: number | undefined;\n const p0 = new Vector3(), p1 = new Vector3(), p2 = new Vector3();\n const q0 = new Vector4(), q1 = new Vector4(), q2 = new Vector4();\n const backfaceCulling = !this.doubleSided;\n\n for (let i = 0; i + 2 < this.drawCount; i += 3) {\n let i0 = this.drawStart + i;\n let i1 = this.drawStart + i + 1;\n let i2 = this.drawStart + i + 2;\n\n if (this.index !== undefined) {\n i0 = this.index[i0];\n i1 = this.index[i1];\n i2 = this.index[i2];\n }\n\n const r0 = this.getPosition(i0, p0, q0);\n const r1 = this.getPosition(i1, p1, q1);\n const r2 = this.getPosition(i2, p2, q2);\n\n if (!r0 || !r1 || !r2) {\n continue;\n }\n\n const t = RayTriangleTesting(rayOrigin, rayDirection, r0, r1, r2, backfaceCulling);\n\n if (t === undefined) {\n continue;\n }\n\n if (mint === undefined || mint > t) {\n mint = t;\n }\n }\n\n return mint;\n }\n\n /**\n * 获取顶点位置\n * @param index - 顶点索引\n * @param vec3 - 顶点位置,会被修改和返回\n * @param vec4 - 临时变量,用于骨骼动画时的计算\n * @returns 顶点位置\n */\n getPosition (index: number, vec3: Vector3, vec4: Vector4): Vector3 | null {\n const posData = this.position.getData(index);\n\n if (posData === undefined) {\n return null;\n }\n\n if (this.hasAnimation) {\n const jointData = this.joint?.getData(index);\n const weightData = this.weight?.getData(index);\n\n if (jointData !== undefined && weightData !== undefined) {\n const skinMat = this.skinMatrix;\n\n skinMat.setZero();\n for (let i = 0; i < 4; i++) {\n if (weightData[i] === 0) { continue; }\n\n const bindMat = this.bindMatrices[jointData[i]];\n\n skinMat.addScaledMatrix(bindMat, weightData[i]);\n }\n\n vec4.set(posData[0], posData[1], posData[2], 1.0);\n const resVec = skinMat.transformVector4(vec4);\n const scale = 1.0 / resVec.w;\n\n vec3.set(resVec.x * scale, resVec.y * scale, resVec.z * scale);\n }\n } else {\n vec3.set(posData[0], posData[1], posData[2]);\n }\n\n return vec3;\n }\n\n}\n\n/**\n * 检查辅助类,负责 3D 插件元素数据格式检查和报错\n */\nexport class CheckerHelper {\n /**\n * 检查数值\n * @param v - 数值\n * @returns\n */\n static checkNumber (v: number): boolean {\n return typeof v === 'number';\n }\n\n /**\n * 检查数值或未定义\n * @param v - 数值或未定义\n * @returns\n */\n static checkNumberUndef (v?: number): boolean {\n return v === undefined ? true : this.checkNumber(v);\n }\n\n /**\n * 检查 0 和 1 之间数值\n * @param v - 数值\n * @returns\n */\n static checkNumber01 (v: number): boolean {\n return this.checkNumber(v) && v >= 0 && v <= 1;\n }\n\n /**\n * 检查 0 和 1 之间数值或未定义\n * @param v - 数值或未定义\n * @returns\n */\n static checkNumber01Undef (v?: number): boolean {\n return v === undefined ? true : this.checkNumber01(v);\n }\n\n /**\n * 检查正数\n * @param v - 数值\n * @returns\n */\n static checkPositive (v: number): boolean {\n return this.checkNumber(v) && v > 0;\n }\n\n /**\n * 检查非负数\n * @param v - 数值\n * @returns\n */\n static checkNonnegative (v: number): boolean {\n return this.checkNumber(v) && v >= 0;\n }\n\n /**\n * 检查非负数或未定义\n * @param v - 数值\n * @returns\n */\n static checkNonnegativeUndef (v?: number): boolean {\n return v === undefined ? true : this.checkNonnegative(v);\n }\n\n /**\n * 检查布尔类型\n * @param v - 布尔值\n * @returns\n */\n static checkBoolean (v: boolean): boolean {\n return typeof v === 'boolean';\n }\n\n /**\n * 检查布尔类型或未定义\n * @param v - 布尔值或未定义\n * @returns\n */\n static checkBooleanUndef (v?: boolean): boolean {\n return v === undefined ? true : this.checkBoolean(v);\n }\n\n /**\n * 检查字符串类型\n * @param v - 字符串\n * @returns\n */\n static checkString (v: string): boolean {\n return typeof v === 'string';\n }\n\n /**\n * 检查字符串类型或未定义\n * @param v - 字符串或未定义\n * @returns\n */\n static checkStringUndef (v?: string): boolean {\n return v === undefined ? true : this.checkString(v);\n }\n\n /**\n * 检查浮点数组\n * @param v - 浮点数组\n * @returns\n */\n static checkFloat32Array (v: Float32Array): boolean {\n return v instanceof Float32Array;\n }\n\n /**\n * 检查浮点数组或未定义\n * @param v - 浮点数组或未定义\n * @returns\n */\n static checkFloat32ArrayUndef (v?: Float32Array): boolean {\n return v === undefined ? true : this.checkFloat32Array(v);\n }\n\n /**\n * 检查父节点索引\n * @param v - 数值或未定义\n * @returns\n */\n static checkParent (v?: number): boolean {\n if (v === undefined) { return true; }\n if (!this.checkNumber(v)) { return false; }\n\n return v >= 0;\n }\n\n /**\n * 检查纹理坐标\n * @param v - 纹理坐标或未定义\n * @returns\n */\n static checkTexCoord (v?: number): boolean {\n if (v === undefined) { return true; }\n if (!this.checkNumber(v)) { return false; }\n\n return v >= 0 && v <= 1;\n }\n\n /**\n * 检查二维向量\n * @param v - 二维向量\n * @returns\n */\n static checkVec2 (v: spec.vec2): boolean {\n if (!Array.isArray(v)) { return false; }\n if (v.length != 2) { return false; }\n\n return v.every(v => this.checkNumber(v));\n }\n\n /**\n * 检查二维向量或未定义\n * @param v - 二维向量或未定义\n * @returns\n */\n static checkVec2Undef (v?: spec.vec2): boolean {\n return v === undefined ? true : this.checkVec2(v);\n }\n\n /**\n * 检查三维向量\n * @param v - 三维向量\n * @returns\n */\n static checkVec3 (v: spec.vec3): boolean {\n if (!Array.isArray(v)) { return false; }\n if (v.length != 3) { return false; }\n\n return v.every(v => this.checkNumber(v));\n }\n\n /**\n * 检查三维非负向量\n * @param v - 三维向量\n * @returns\n */\n static checkNonnegative3 (v: spec.vec3): boolean {\n if (!Array.isArray(v)) { return false; }\n if (v.length != 3) { return false; }\n\n return v.every(v => this.checkNonnegative(v));\n }\n\n /**\n * 检查四维向量\n * @param v - 四维向量\n * @returns\n */\n static checkVec4 (v: spec.vec4): boolean {\n if (!Array.isArray(v)) { return false; }\n if (v.length != 4) { return false; }\n\n return v.every(v => this.checkNumber(v));\n }\n\n /**\n * 检查四维向量或未定义\n * @param v - 四维向量或未定义\n * @returns\n */\n static checkNonnegative4 (v: spec.vec4): boolean {\n if (!Array.isArray(v)) { return false; }\n if (v.length != 4) { return false; }\n\n return v.every(v => this.checkNonnegative(v));\n }\n\n /**\n * 检查数值数组\n * @param v - 数值数组\n * @returns\n */\n static checkNumberArray (v: number[]): boolean {\n if (!Array.isArray(v)) { return false; }\n\n return v.every(v => this.checkNumber(v));\n }\n\n /**\n * 检查纹理对象\n * @param v - 纹理对象\n * @returns\n */\n static checkTexture (v: Texture): boolean {\n if (v instanceof Texture) {\n if (v.isDestroyed) {\n console.error(`Texture is destroyed, ${v.name}.`);\n }\n\n return !v.isDestroyed;\n } else {\n return false;\n }\n }\n\n /**\n * 检查纹理对象或未定义\n * @param v - 纹理对象或未定义\n * @returns\n */\n static checkTextureUndef (v?: Texture): boolean {\n return v === undefined ? true : this.checkTexture(v);\n }\n\n /**\n * 检查纹理变换参数\n * @param v - 纹理变换参数\n * @returns\n */\n static checkTexTransform (v: ModelTextureTransform): boolean {\n if (!this.checkVec2Undef(v.offset)) { return false; }\n if (!this.checkNumberUndef(v.rotation)) { return false; }\n if (!this.checkVec2Undef(v.scale)) { return false; }\n\n if (v.scale !== undefined) {\n if (Math.abs(v.scale[0]) < 1e-5 || Math.abs(v.scale[1]) < 1e-5) {\n // check scale range\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * 检查纹理变换参数或未定义\n * @param v - 纹理变换参数或未定义\n * @returns\n */\n static checkTexTransformUndef (v?: ModelTextureTransform): boolean {\n return v === undefined ? true : this.checkTexTransform(v);\n }\n\n /**\n * 检查材质混合参数或未定义\n * @param v - 材质混合参数或未定义\n * @returns\n */\n static checkMatBlending (v?: spec.MaterialBlending): boolean {\n return v === undefined\n || v === spec.MaterialBlending.opaque\n || v === spec.MaterialBlending.masked\n || v === spec.MaterialBlending.translucent\n || v === spec.MaterialBlending.additive;\n }\n\n /**\n * 检查材质单双面模式或未定义\n * @param v - 材质单双面模式或未定义\n * @returns\n */\n static checkMatSide (v?: spec.SideMode): boolean {\n return v === undefined || v === spec.SideMode.BACK || v === spec.SideMode.DOUBLE || v === spec.SideMode.FRONT;\n }\n\n /**\n * 检查动画路径模式\n * @param v - 动画路径模式\n * @returns\n */\n static checkAnimPath (v: string): boolean {\n return v === 'translation' || v === 'rotation' || v === 'scale' || v === 'weights';\n }\n\n /**\n * 检查动画插值模式\n * @param v - 动画插值模式\n * @returns\n */\n static checkAnimInterp (v: string): boolean {\n return v === 'LINEAR' || v === 'STEP' || v === 'CUBICSPLINE';\n }\n\n /**\n * 检查几何体\n * @param v - 几何体\n * @param s - 蒙皮参数\n */\n static assertGeometry (v: Geometry, s?: ModelSkinOptions) {\n if (!(v instanceof Geometry)) {\n console.error(`Invalid geometry type ${this.stringify(v)}.`);\n }\n // @ts-expect-error\n if (v.isDestroyed === true) {\n console.error('Geometry object is destroyed.');\n }\n if (!this.checkNonnegative(v.getDrawStart())) {\n console.error(`Invalid geometry draw start: ${v.getDrawStart()}, ${this.stringify(v)}.`);\n }\n // // drawCount不再为负\n // if (!this.checkPositive(v.getDrawCount())) {\n // throw new Error(`Invalid geometry draw count: ${v.getDrawCount()}, ${this.stringify(v)}`);\n // }\n\n // Geometry具体内容检查,先忽略\n // const opts = v.options;\n // const drawCount = Math.abs(v.getDrawCount());\n\n // if (opts !== undefined && drawCount > 0) {\n // let maxLength = v.drawStart + drawCount;\n\n // if (opts.index !== undefined) {\n // const indexArray = opts.index.data;\n\n // if (indexArray.length < maxLength) {\n // throw new Error(`Index length(${indexArray.length}) is less than draw count(${maxLength}), ${this.stringify(v)}`);\n // }\n // let maxIndex = 0;\n\n // for (let i = 0; i < drawCount; i++) {\n // maxIndex = Math.max(indexArray[v.drawStart + i], maxIndex);\n // }\n // maxLength = maxIndex + 1;\n // }\n // const positionAttrib = opts.attributes['aPos'] as Attribute;\n\n // if (positionAttrib === undefined) {\n // throw new Error(`Position attribute is required, ${this.stringify(v)}`);\n // }\n // this.assertGeometryBuffer(v, 'aPos', maxLength);\n // this.assertGeometryBuffer(v, 'aNormal', maxLength);\n // this.assertGeometryBuffer(v, 'aTangent', maxLength);\n // this.assertGeometryBuffer(v, 'aUV', maxLength);\n // this.assertGeometryBuffer(v, 'aJoints', maxLength);\n // this.assertGeometryBuffer(v, 'aWeights', maxLength);\n\n // // 索引检查\n // if(s !== undefined){\n // const matLen = s.inverseBindMatrices?.length ?? 0;\n // if(matLen > 0){\n // const jointArray = this.createAttributeArray(v, \"aJoints\");\n // if(jointArray !== undefined){\n // for(let i = 0; i < maxLength; i++){\n // const data = jointArray.getData(i);\n // if(data === undefined) continue;\n // if(Math.max(...data) >= matLen){\n // throw new Error(`Joint index out of range: ${this.stringify(data)}, matrices: ${matLen}`);\n // }\n // }\n // }\n // }\n // }\n // }\n }\n\n /**\n * 检查几何体缓冲区\n * @param v - 几何体\n * @param name - 名称\n * @param drawCount - 渲染数目\n */\n static assertGeometryBuffer (v: Geometry, name: string, drawCount: number) {\n const attribArray = this.createAttributeArray(v, name);\n\n if (attribArray !== undefined) {\n if (attribArray.getLength() < drawCount) {\n console.error(`${name} Length(${attribArray.getLength()}) is less than draw count(${drawCount}), ${this.stringify(v)}.`);\n }\n }\n }\n\n /**\n * 创建属性数组\n * @param v - 几何体\n * @param name - 名称\n * @returns\n */\n static createAttributeArray (v: Geometry, name: string): AttributeArray | undefined {\n // @ts-expect-error\n const attributes = v.attributes;\n\n if (attributes === undefined) { return; }\n const dataAttrib = attributes[name];\n\n if (dataAttrib === undefined) { return; }\n const dataArray = v.getAttributeData(name);\n\n if (dataArray === undefined) { return; }\n //\n const attribArray = new AttributeArray();\n\n attribArray.create(dataAttrib as Attribute, dataArray);\n\n return attribArray;\n }\n\n /**\n * 检查蒙皮参数\n * @param v - 蒙皮参数\n */\n static assertModelSkinOptions (v: ModelSkinOptions) {\n if (!this.checkStringUndef(v.name)) { console.error(`Invalid skin name ${v.name}, ${this.stringify(v)}.`); }\n if (!this.checkNumberArray(v.joints)) { console.error(`Invalid skin joints ${v.joints}, ${this.stringify(v)}.`); }\n if (!this.checkNumberUndef(v.skeleton)) { console.error(`Invalid skin skeleton ${v.skeleton}, ${this.stringify(v)}.`); }\n if (!this.checkFloat32ArrayUndef(v.inverseBindMatrices)) { console.error(`Invalid skin inverseBindMatrices ${v.inverseBindMatrices}, ${this.stringify(v)}.`); }\n //\n if (v.inverseBindMatrices !== undefined) {\n if (v.inverseBindMatrices.length <= 0 || v.inverseBindMatrices.length % 16 !== 0) { console.error(`Invalid skin inverseBindMatrices length ${v.inverseBindMatrices}, ${this.stringify(v)}.`); }\n if (v.joints.length * 16 !== v.inverseBindMatrices.length) { console.error(`Mismatch: skin joints and inverseBindMatrices length, ${v.joints}, ${v.inverseBindMatrices}, ${this.stringify(v)}.`); }\n const mat = new Matrix4();\n\n for (let i = 0; i < v.inverseBindMatrices.length; i += 16) {\n for (let j = 0; j < 16; j++) {\n mat.elements[j] = v.inverseBindMatrices[i + j];\n }\n if (Math.abs(mat.determinant()) < 1e-5) {\n console.error(`Determinant of inverseBindMatrices is too small ${mat.determinant()}, index ${i / 16}, ${this.stringify(v)}.`);\n }\n }\n } else {\n if (v.joints.length <= 0) { console.error(`Invalid skin joints length ${v.joints}, ${this.stringify(v)}.`); }\n }\n }\n\n /**\n * 检查材质参数\n * @param v - 材质参数\n */\n static assertMatOptions (v: ModelMaterialOptions) {\n if (v.type === spec.MaterialType.unlit) {\n if (!this.checkString(v.name)) { console.error(`Invalid material name ${v.name}, ${this.stringify(v)}.`); }\n //\n if (!this.checkNonnegative4(v.baseColorFactor)) { console.error(`Invalid material baseColorFactor ${v.baseColorFactor}, ${this.stringify(v)}.`); }\n if (!this.checkTextureUndef(v.baseColorTexture)) { console.error(`Invalid material baseColorTexture ${v.baseColorTexture}, ${this.stringify(v)}.`); }\n if (!this.checkTexTransformUndef(v.baseColorTextureTransform)) { console.error(`Invalid material baseColorTextureTransform ${v.baseColorTextureTransform}, ${this.stringify(v)}.`); }\n if (!this.checkTexCoord(v.baseColorTextureCoordinate)) { console.error(`Invalid material baseColorTextureCoordinate ${v.baseColorTextureCoordinate}, ${this.stringify(v)}.`); }\n //\n if (!this.checkBooleanUndef(v.depthMask)) { console.error(`Invalid material depthMask ${v.depthMask}, ${this.stringify(v)}.`); }\n if (!this.checkMatBlending(v.blending)) { console.error(`Invalid material blending ${v.blending}, ${this.stringify(v)}.`); }\n if (!this.checkMatSide(v.side)) { console.error(`Invalid material side ${v.side}, ${this.stringify(v)}.`); }\n if (v.blending === spec.MaterialBlending.masked) {\n if (v.alphaCutOff === undefined) { console.error(`Material alphaCutOff is required for mask, ${this.stringify(v)}.`); }\n }\n if (!this.checkNumber01Undef(v.alphaCutOff)) { console.error(`Invalid material alphaCutOff ${v.alphaCutOff}, ${this.stringify(v)}.`); }\n } else if (v.type === spec.MaterialType.pbr) {\n if (!this.checkString(v.name)) { console.error(`Invalid material name ${v.name}, ${this.stringify(v)}.`); }\n //\n if (!this.checkNonnegative4(v.baseColorFactor)) { console.error(`Invalid material baseColorFactor ${v.baseColorFactor}, ${this.stringify(v)}.`); }\n if (!this.checkTextureUndef(v.baseColorTexture)) { console.error(`Invalid material baseColorTexture ${v.baseColorTexture}, ${this.stringify(v)}.`); }\n if (!this.checkTexTransformUndef(v.baseColorTextureTransform)) { console.error(`Invalid material baseColorTextureTransform ${v.baseColorTextureTransform}, ${this.stringify(v)}.`); }\n if (!this.checkTexCoord(v.baseColorTextureCoordinate)) { console.error(`Invalid material baseColorTextureCoordinate ${v.baseColorTextureCoordinate}, ${this.stringify(v)}.`); }\n //\n if (!this.checkBooleanUndef(v.useSpecularAA)) { console.error(`Invalid material useSpecularAA ${v.useSpecularAA}, ${this.stringify(v)}.`); }\n if (!this.checkNumber01(v.metallicFactor)) { console.error(`Invalid material metallicFactor ${v.metallicFactor}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.roughnessFactor)) { console.error(`Invalid material roughnessFactor ${v.roughnessFactor}, ${this.stringify(v)}.`); }\n if (!this.checkTextureUndef(v.metallicRoughnessTexture)) { console.error(`Invalid material metallicRoughnessTexture ${v.metallicRoughnessTexture}, ${this.stringify(v)}.`); }\n if (!this.checkTexTransformUndef(v.metallicRoughnessTextureTransform)) { console.error(`Invalid material metallicRoughnessTextureTransform ${v.metallicRoughnessTextureTransform}, ${this.stringify(v)}.`); }\n if (!this.checkTexCoord(v.metallicRoughnessTextureCoordinate)) { console.error(`Invalid material metallicRoughnessTextureCoordinate ${v.metallicRoughnessTextureCoordinate}, ${this.stringify(v)}.`); }\n //\n if (!this.checkTextureUndef(v.normalTexture)) { console.error(`Invalid material normalTexture ${v.normalTexture}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegativeUndef(v.normalTextureScale)) { console.error(`Invalid material normalTextureScale ${v.normalTextureScale}, ${this.stringify(v)}.`); }\n if (!this.checkTexTransformUndef(v.normalTextureTransform)) { console.error(`Invalid material normalTextureTransform ${v.normalTextureTransform}, ${this.stringify(v)}.`); }\n if (!this.checkTexCoord(v.normalTextureCoordinate)) { console.error(`Invalid material normalTextureCoordinate ${v.normalTextureCoordinate}, ${this.stringify(v)}.`); }\n //\n if (!this.checkTextureUndef(v.occlusionTexture)) { console.error(`Invalid material occlusionTexture ${v.occlusionTexture}, ${this.stringify(v)}.`); }\n if (!this.checkNumber01Undef(v.occlusionTextureStrength)) { console.error(`Invalid material occlusionTextureStrength ${v.occlusionTextureStrength}, ${this.stringify(v)}.`); }\n if (!this.checkTexTransformUndef(v.occlusionTextureTransform)) { console.error(`Invalid material occlusionTextureTransform ${v.occlusionTextureTransform}, ${this.stringify(v)}.`); }\n if (!this.checkTexCoord(v.occlusionTextureCoordinate)) { console.error(`Invalid material occlusionTextureCoordinate ${v.occlusionTextureCoordinate}, ${this.stringify(v)}.`); }\n //\n //\n if (!this.checkNonnegative4(v.emissiveFactor)) { console.error(`Invalid material emissiveFactor ${v.emissiveFactor}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.emissiveIntensity)) { console.error(`Invalid material emissiveIntensity ${v.emissiveIntensity}, ${this.stringify(v)}.`); }\n if (!this.checkTextureUndef(v.emissiveTexture)) { console.error(`Invalid material emissiveTexture ${v.emissiveTexture}, ${this.stringify(v)}.`); }\n if (!this.checkTexTransformUndef(v.emissiveTextureTransform)) { console.error(`Invalid material emissiveTextureTransform ${v.emissiveTextureTransform}, ${this.stringify(v)}.`); }\n if (!this.checkTexCoord(v.emissiveTextureCoordinate)) { console.error(`Invalid material emissiveTextureCoordinate ${v.emissiveTextureCoordinate}, ${this.stringify(v)}.`); }\n //\n if (!this.checkBooleanUndef(v.depthMask)) { console.error(`Invalid material depthMask ${v.depthMask}, ${this.stringify(v)}.`); }\n if (!this.checkMatBlending(v.blending)) { console.error(`Invalid material blending ${v.blending}, ${this.stringify(v)}.`); }\n if (!this.checkMatSide(v.side)) { console.error(`Invalid material side ${v.side}, ${this.stringify(v)}.`); }\n if (v.blending === spec.MaterialBlending.masked) {\n if (v.alphaCutOff === undefined) { console.error(`Material alphaCutOff is required for mask, ${this.stringify(v)}.`); }\n }\n if (!this.checkNumber01Undef(v.alphaCutOff)) { console.error(`Invalid material alphaCutOff ${v.alphaCutOff}, ${this.stringify(v)}.`); }\n } else {\n console.error(`Invalid material type ${this.stringify(v)}.`);\n }\n }\n\n /**\n * 检查 Primitive 参数\n * @param v - Primitive 参数\n * @param s - 蒙皮参数\n * @returns\n */\n static assertPrimOptions (v: ModelPrimitiveOptions, s?: ModelSkinOptions) {\n this.assertGeometry(v.geometry, s);\n this.assertMatOptions(v.material);\n\n return true;\n }\n\n /**\n * 检查 Model 插件 Mesh 参数\n * @param v - Model 插件 Mesh 参数\n */\n static assertModelMeshOptions (v: ModelMeshOptions) {\n if (!this.checkParent(v.parent)) { console.error(`Invalid mesh parent ${v.parent}, ${this.stringify(v)}.`); }\n\n if (v.skin !== undefined) { this.assertModelSkinOptions(v.skin); }\n\n const morphList: PMorph[] = [];\n\n for (let i = 0; i < v.primitives.length; i++) {\n const prim = v.primitives[i];\n\n if (!this.assertPrimOptions(prim)) {\n console.error(`Invalid primitive ${prim}, ${this.stringify(v)}.`);\n }\n const morph = new PMorph();\n\n morph.create(prim.geometry);\n morphList.push(morph);\n }\n\n for (let i = 1; i < morphList.length; i++) {\n const morph0 = morphList[i - 1];\n const morph1 = morphList[i];\n\n if (!morph0.equals(morph1)) {\n console.error(`Morph states mismatch: ${this.stringify(morph0)}, ${this.stringify(morph1)}, ${this.stringify(v)}.`);\n }\n }\n\n if (!this.checkBooleanUndef(v.hide)) { console.error(`Invalid mesh hide ${v.hide}, ${this.stringify(v)}.`); }\n }\n\n /**\n * 检查 Model 插件相机参数\n * @param v - Model 插件相机参数\n */\n static assertModelCameraOptions (v: ModelCameraOptions) {\n if (!this.checkParent(v.parent)) { console.error(`Invalid camera parent ${v.parent}, ${this.stringify(v)}.`); }\n if (!this.checkNumberUndef(v.aspect)) { console.error(`Invalid camera aspect ${v.aspect}, ${this.stringify(v)}.`); }\n if (!this.checkPositive(v.near)) { console.error(`Invalid camera near ${v.near}, ${this.stringify(v)}.`); }\n if (!this.checkPositive(v.far) || v.far <= v.near) { console.error(`Invalid camera far ${v.far}, ${this.stringify(v)}.`); }\n if (!this.checkPositive(v.fov)) { console.error(`Invalid camera fov ${v.fov}, ${this.stringify(v)}.`); }\n if (!this.checkNumber01(v.clipMode)) { console.error(`Invalid camera clipMode ${v.clipMode}, ${this.stringify(v)}.`); }\n }\n\n /**\n * 检查 Model 插件灯光参数\n * @param v - Model 插件灯光参数\n */\n static assertModelLightOptions (v: ModelLightOptions) {\n if (v.lightType === 'directional') {\n if (!this.checkParent(v.parent)) { console.error(`Invalid light parent ${v.parent}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative4(v.color)) { console.error(`Invalid light color ${v.color}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.intensity)) { console.error(`Invalid light intensity ${v.intensity}, ${this.stringify(v)}.`); }\n } else if (v.lightType === 'point') {\n if (!this.checkParent(v.parent)) { console.error(`Invalid light parent ${v.parent}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative4(v.color)) { console.error(`Invalid light color ${v.color}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.intensity)) { console.error(`Invalid light intensity ${v.intensity}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.range)) { console.error(`Invalid light range ${v.range}, ${this.stringify(v)}.`); }\n } else if (v.lightType === 'spot') {\n if (!this.checkParent(v.parent)) { console.error(`Invalid light parent ${v.parent}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative4(v.color)) { console.error(`Invalid light color ${v.color}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.intensity)) { console.error(`Invalid light intensity ${v.intensity}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.range)) { console.error(`Invalid light range ${v.range}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.innerConeAngle)) { console.error(`Invalid light innerConeAngle ${v.innerConeAngle}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.outerConeAngle)) { console.error(`Invalid light outerConeAngle ${v.outerConeAngle}, ${this.stringify(v)}.`); }\n } else if (v.lightType === 'ambient') {\n if (!this.checkParent(v.parent)) { console.error(`Invalid light parent ${v.parent}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative4(v.color)) { console.error(`Invalid light color ${v.color}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.intensity)) { console.error(`Invalid light intensity ${v.intensity}, ${this.stringify(v)}.`); }\n } else {\n console.error(`Invalid light type ${this.stringify(v)}.`);\n }\n }\n\n /**\n * 检查 Model 插件天空盒参数\n * @param v - Model 插件天空盒参数\n */\n static assertModelSkyboxOptions (v: ModelSkyboxOptions) {\n if (!this.checkBoolean(v.renderable)) { console.error(`Invalid skybox renderable ${v.renderable}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.intensity)) { console.error(`Invalid skybox intensity ${v.intensity}, ${this.stringify(v)}.`); }\n if (!this.checkNonnegative(v.reflectionsIntensity)) { console.error(`Invalid skybox reflectionsIntensity ${v.reflectionsIntensity}, ${this.stringify(v)}.`); }\n //\n const c = v.irradianceCoeffs;\n\n if (c !== undefined) {\n if (!Array.isArray(c) || c.length != 9) { console.error(`Invalid skybox irradianceCoeffs ${c}, ${this.stringify(v)}.`); }\n c.forEach(v => {\n if (!this.checkVec3(v as spec.vec3)) { console.error(`Invalid skybox irradianceCoeffs ${c}, ${this.stringify(v)}.`); }\n });\n } else if (v.diffuseImage !== undefined) {\n if (!this.checkTexture(v.diffuseImage)) { console.error(`Invalid skybox diffuseImage ${v.diffuseImage}, ${this.stringify(v)}.`); }\n } else {\n console.error(`Invalid skybox, irradianceCoeffs or diffuseImage should give one, ${this.stringify(v)}.`);\n }\n if (!this.checkTexture(v.specularImage)) { console.error(`Invalid skybox specularImage ${v.specularImage}, ${this.stringify(v)}.`); }\n if (!this.checkPositive(v.specularImageSize)) { console.error(`Invalid skybox specularImageSize ${v.specularImageSize}, ${this.stringify(v)}.`); }\n if (!this.checkPositive(v.specularMipCount)) { console.error(`Invalid skybox specularMipCount ${v.specularMipCount}, ${this.stringify(v)}.`); }\n if (this.pow2(v.specularMipCount) > v.specularImageSize) {\n console.error(`Invalid skybox specularMipCount or specularImageSize, ${this.stringify(v)}.`);\n }\n }\n\n /**\n * 检查 Model 插件动画轨道参数\n * @param v - Model 插件动画轨道参数\n * @returns\n */\n static checkModelAnimTrackOptions (v: ModelAnimTrackOptions) {\n if (!this.checkNonnegative(v.node)) {\n console.error(`Invalid track node ${v.node}, ${this.stringify(v)}`);\n\n return false;\n }\n if (!this.checkFloat32Array(v.input)) {\n console.error(`Invalid track input ${v.input}, ${this.stringify(v)}`);\n\n return false;\n }\n if (!this.checkFloat32Array(v.output)) {\n console.error(`Invalid track input ${v.output}, ${this.stringify(v)}`);\n\n return false;\n }\n if (!this.checkAnimPath(v.path)) {\n console.error(`Invalid track path ${v.path}, ${this.stringify(v)}`);\n\n return false;\n }\n if (!this.checkAnimInterp(v.interpolation)) {\n console.error(`Invalid track interpolation ${v.interpolation}, ${this.stringify(v)}`);\n\n return false;\n }\n\n return true;\n }\n\n /**\n * 检查 Model 插件动画参数\n * @param v - Model 插件动画参数\n */\n static assertModelAnimOptions (v: ModelAnimationOptions) {\n if (!this.checkStringUndef(v.name)) { console.error(`Invalid animation name ${v.name}, ${this.stringify(v)}.`); }\n if (!Array.isArray(v.tracks)) { console.error(`Invalid animation tracks ${v.tracks}, ${this.stringify(v)}.`); }\n v.tracks.forEach(t => {\n if (!this.checkModelAnimTrackOptions(t)) { console.error(`Invalid animation track ${t}, ${this.stringify(v)}.`); }\n });\n }\n\n /**\n * 检查场景树参数\n * @param v - 场景树参数\n */\n static assertTreeOptions (v: ModelTreeOptions) {\n if (!this.checkNumberUndef(v.animation)) { console.error(`Invalid tree animation ${v.animation}, ${this.stringify(v)}.`); }\n if (v.animations !== undefined) {\n if (!Array.isArray(v.animations)) { console.error(`Invalid tree animations ${v.animations}, ${this.stringify(v)}.`); }\n v.animations.forEach(anim => { this.assertModelAnimOptions(anim); });\n if (v.animation !== undefined) {\n if (v.animation < -1 || v.animation >= v.animations.length) { console.error(`Invalid tree animations ${v.animations}, ${this.stringify(v)}.`); }\n }\n }\n }\n\n /**\n * 将对象转成 JSON 字符串,需要忽略函数和渲染相关的对象\n * @param object - 目标对象\n * @returns\n */\n static stringify (object: any) {\n const simpleObject: { [k: string]: any } = {};\n\n for (const prop in object) {\n // if (typeof(object[prop]) == 'object'){\n // continue;\n // }\n if (prop === 'internal') {\n // 与WebGL相关的数据,可以忽略\n continue;\n }\n if (typeof (object[prop]) == 'function') {\n continue;\n }\n if (object[prop] instanceof Texture) {\n simpleObject[prop] = object[prop].name;\n continue;\n }\n if (object[prop] instanceof Geometry) {\n simpleObject[prop] = object[prop].name;\n continue;\n }\n if (object[prop] instanceof Renderer) {\n continue;\n }\n simpleObject[prop] = object[prop];\n }\n\n return JSON.stringify(simpleObject);\n }\n\n /**\n * 获取 2 的 index 指数结果\n * @param index - 指数\n * @returns\n */\n static pow2 (index: number): number {\n let res = 1;\n\n while (index-- > 0) { res *= 2; }\n\n return res;\n }\n}\n\n/**\n * 半精度浮点数组类\n */\nexport class Float16ArrayWrapper {\n /**\n * 大小\n */\n size: number;\n /**\n * 数组\n */\n data: Uint16Array;\n\n constructor (size: number) {\n this.size = size;\n this.data = new Uint16Array(size);\n }\n\n /**\n * 将类数值数组转成半进度浮点,并从起始索引开始添加\n * @param number - 类数值数组\n * @param startIndex - 起始索引\n */\n set (number: ArrayLike<number>, startIndex: number) {\n for (let i = 0; i < number.length; i++) {\n this.data[i + startIndex] = toHalf(number[i]);\n }\n }\n\n /**\n * 获取数组字节数\n */\n get bytes () {\n return this.size * 2;\n }\n}\n\nconst toHalf = (function () {\n\n const floatView = new Float32Array(1);\n const int32View = new Int32Array(floatView.buffer);\n\n /* This method is faster than the OpenEXR implementation (very often\n * used, eg. in Ogre), with the additional benefit of rounding, inspired\n * by James Tursa?s half-precision code. */\n return function toHalf (val: any) {\n\n floatView[0] = val;\n const x = int32View[0];\n\n let bits = (x >> 16) & 0x8000; /* Get the sign */\n let m = (x >> 12) & 0x07ff; /* Keep one extra bit for rounding */\n const e = (x >> 23) & 0xff; /* Using int is faster here */\n\n /* If zero, or denormal, or exponent underflows too much for a denormal\n * half, return signed zero. */\n if (e < 103) {\n return bits;\n }\n\n /* If NaN, return NaN. If Inf or exponent overflow, return Inf. */\n if (e > 142) {\n bits |= 0x7c00;\n /* If exponent was 0xff and one mantissa bit was set, it means NaN,\n * not Inf, so make sure we set one mantissa bit too. */\n bits |= ((e == 255) ? 0 : 1) && (x & 0x007fffff);\n\n return bits;\n }\n\n /* If exponent underflows but not too much, return a denormal */\n if (e < 113) {\n m |= 0x0800;\n /* Extra rounding may overflow and set mantissa to 0 and exponent\n * to 1, which is OK. */\n bits |= (m >> (114 - e)) + ((m >> (113 - e)) & 1);\n\n return bits;\n }\n\n bits |= ((e - 112) << 10) | (m >> 1);\n /* Extra rounding. An overflow will set mantissa to 0 and increment\n * the exponent, which is OK. */\n bits += m & 1;\n\n return bits;\n };\n\n}());\n\n","import type { Geometry, Engine, VFXItem, SkinProps } from '@galacean/effects';\nimport { glContext, Texture, TextureSourceType } from '@galacean/effects';\nimport { Matrix4 } from './math';\nimport { PObjectType } from './common';\nimport { PObject } from './object';\nimport { Float16ArrayWrapper } from '../utility/plugin-helper';\n\nconst forceTextureSkinning = false;\n\n/**\n * 纹理数据模式,包含浮点和半精度浮点\n */\nexport enum TextureDataMode {\n none = 0,\n float,\n half_float,\n}\n\n/**\n * 蒙皮类,支持蒙皮动画\n */\nexport class PSkin extends PObject {\n /**\n * 场景树父元素\n */\n rootBoneItem?: VFXItem;\n /**\n * 骨骼索引\n */\n skeleton = 0;\n /**\n * 关节索引\n */\n jointItem: VFXItem[] = [];\n /**\n * 逆绑定矩阵\n */\n inverseBindMatrices: Matrix4[] = [];\n /**\n * 动画矩阵\n */\n animationMatrices: Matrix4[] = [];\n /**\n * 纹理数据模式\n */\n textureDataMode = TextureDataMode.none;\n /**\n * 最大骨骼数目\n */\n maxJointCount = 0;\n\n /**\n * 创建蒙皮对象\n * @param props - 蒙皮相关数据\n * @param engine - 引擎对象\n * @param rootBoneItem - 场景树父元素\n */\n create (props: SkinProps, engine: Engine, rootBoneItem: VFXItem, maxJointCount: number) {\n this.name = props.rootBoneName ?? 'Unnamed skin';\n this.type = PObjectType.skin;\n //\n this.rootBoneItem = rootBoneItem;\n this.skeleton = -1;\n this.jointItem = this.getJointItems(props, rootBoneItem);\n this.maxJointCount = Math.max(maxJointCount, this.jointItem.length);\n this.animationMatrices = [];\n //\n this.inverseBindMatrices = [];\n //\n this.textureDataMode = this.getTextureDataMode(this.maxJointCount, engine);\n const matList = props.inverseBindMatrices;\n\n if (matList !== undefined && matList.length > 0) {\n if (matList.length % 16 !== 0 || matList.length !== this.jointItem.length * 16) {\n throw new Error(`Invalid array length, invert bind matrices ${matList.length}, joint array ${this.jointItem.length}.`);\n }\n\n const matrixCount = matList.length / 16;\n\n for (let i = 0; i < matrixCount; i++) {\n const mat = Matrix4.fromArray(matList, i * 16);\n\n this.inverseBindMatrices.push(mat);\n }\n }\n }\n\n /**\n * 更新蒙皮矩阵\n */\n updateSkinMatrices () {\n this.animationMatrices = [];\n\n for (let i = 0; i < this.jointItem.length; i++) {\n const node = this.jointItem[i];\n\n // let parent = node?.transform.parentTransform;\n // while(parent !== undefined){\n // const pos = parent.position;\n // parent.setPosition(pos[0], pos[1], pos[2]);\n // parent = parent.parentTransform;\n // }\n\n const mat4 = node.transform.getWorldMatrix();\n\n this.animationMatrices.push(mat4.clone());\n }\n\n if (this.animationMatrices.length === this.inverseBindMatrices.length) {\n this.animationMatrices.forEach((mat, index) => {\n mat.multiply(this.inverseBindMatrices[index]);\n });\n } else {\n this.animationMatrices = this.inverseBindMatrices;\n console.error('Some error occured, replace skin animation matrices by invert bind matrices.');\n }\n }\n\n /**\n * 计算 Mesh 的动画矩阵\n * @param worldMatrix - 世界矩阵\n * @param matrixList - 矩阵列表\n * @param normalMatList - 法线矩阵列表\n */\n computeMeshAnimMatrices (worldMatrix: Matrix4, matrixList: Float32Array, normalMatList: Float32Array) {\n const inverseWorldMatrix = worldMatrix.clone().invert();\n const tempMatrix = new Matrix4();\n\n this.animationMatrices.forEach((mat, i) => {\n const localMatrix = tempMatrix.multiplyMatrices(inverseWorldMatrix, mat);\n\n localMatrix.elements.forEach((x, j) => matrixList[i * 16 + j] = x);\n //\n const normalMat = localMatrix.clone().invert().transpose();\n\n normalMat.elements.forEach((x, j) => normalMatList[i * 16 + j] = x);\n });\n }\n\n /**\n * 更新父元素\n * @param parentItem - 场景树父元素\n */\n updateParentItem (parentItem: VFXItem) {\n this.rootBoneItem = parentItem;\n }\n\n /**\n * 获取关节点数\n * @returns\n */\n getJointCount (): number {\n return this.jointItem.length;\n }\n\n /**\n * 是否纹理数据模式\n * @returns\n */\n isTextureDataMode (): boolean {\n return this.textureDataMode !== TextureDataMode.none;\n }\n\n /**\n * 销毁\n */\n override dispose (): void {\n this.rootBoneItem = undefined;\n this.jointItem = [];\n this.inverseBindMatrices = [];\n this.animationMatrices = [];\n }\n\n private getTextureDataMode (jointCount: number, engine: Engine): TextureDataMode {\n const uniformsRequiredForMostFeatures = 25;\n const detail = engine.gpuCapability.detail;\n const availableJointUniforms = detail.maxVertexUniforms - uniformsRequiredForMostFeatures;\n const uniformsRequiredPerJoint = 8;\n\n if (forceTextureSkinning || jointCount > Math.floor(availableJointUniforms / uniformsRequiredPerJoint)) {\n // 优先使用float,half_float在iOS 13.6上有精度问题\n if (detail.floatTexture) {\n return TextureDataMode.float;\n } else if (detail.halfFloatTexture) {\n return TextureDataMode.half_float;\n } else {\n throw new Error(`Too many joint count ${jointCount}, half float texture not support.`);\n }\n } else {\n return TextureDataMode.none;\n }\n }\n\n private getJointItems (props: SkinProps, rootBoneItem: VFXItem) {\n const name2Item = this.genNodeName(rootBoneItem);\n\n const jointItems: VFXItem[] = [];\n\n props.boneNames?.forEach(boneName => {\n const node = name2Item[boneName];\n\n if (!node) {\n throw new Error(`Can't find node of bone name ${boneName}.`);\n }\n jointItems.push(node);\n });\n\n return jointItems;\n }\n\n private genNodeName (node: VFXItem) {\n const name2Item: Record<string, VFXItem> = {};\n const nameList: string[] = [];\n\n name2Item[''] = node;\n for (const child of node.children) {\n this.genNodeNameDFS(child, nameList, name2Item);\n }\n\n return name2Item;\n }\n\n private genNodeNameDFS (node: VFXItem, nameList: string[], name2Item: Record<string, VFXItem>) {\n nameList.push(node.name);\n name2Item[nameList.join('/')] = node;\n for (const child of node.children) {\n this.genNodeNameDFS(child, nameList, name2Item);\n }\n nameList.pop();\n }\n}\n\n/**\n * Morph 动画类\n * 保存了动画状态相关的数据,包括 weights 数组数据\n * 增加了状态数据的检查,保证数据的正确性\n * Morph 动画非常消耗内存,谨慎使用。\n */\nexport class PMorph extends PObject {\n /**\n * weights 数组的长度,shader 中和更新的时候会用到\n * 范围要在 `[0, 8]` 之间,否则会报错。\n */\n morphWeightsLength = 0;\n /**\n * weights 数组的具体数据,来自动画控制器的每帧更新\n * 数组的长度必须和 morphWeightsLength 相同,否则会出错。\n */\n morphWeightsArray: number[] = [];\n /**\n * 是否有 Position 相关的 Morph 动画,shader 中需要知道\n */\n hasPositionMorph = false;\n /**\n * 是否有 Normal 相关的 Morph 动画,shader 中需要知道\n */\n hasNormalMorph = false;\n /**\n * 是否有 Tangent 相关的 Morph 动画,shader 中需要知道\n */\n hasTangentMorph = false;\n\n /**\n * 通过 Geometry 数据创建 Morph 动画相关状态,并进行必要的正确性检查\n * @param geometry - Mesh 的几何体,是否包含 Morph 动画都是可以的\n * @returns 是否创建成功\n */\n create (geometry: Geometry): boolean {\n this.name = this.genName('Morph target');\n this.type = PObjectType.morph;\n\n // 统计各个属性的在Morph中的数目\n const positionCount = this.getAttributeMorphCount(PMorph.positionNameList, geometry);\n const normalCount = this.getAttributeMorphCount(PMorph.normalNameList, geometry);\n const tangentCount = this.getAttributeMorphCount(PMorph.tangentNameList, geometry);\n const countList: number[] = [positionCount, normalCount, tangentCount];\n\n // 这里是拿到所有数目中非零的最小值,如果没有非零值,那就是直接是零\n this.morphWeightsLength = 0;\n countList.forEach(count => {\n if (count > 0) {\n if (this.morphWeightsLength === 0) {\n this.morphWeightsLength = count;\n } else {\n this.morphWeightsLength = Math.min(this.morphWeightsLength, count);\n }\n }\n });\n\n if (this.morphWeightsLength > 0) {\n // 有Morph动画,申请weights数据,判断各个属性是否有相关动画\n this.morphWeightsArray = Array(this.morphWeightsLength).fill(0);\n this.hasPositionMorph = positionCount == this.morphWeightsLength;\n this.hasNormalMorph = normalCount == this.morphWeightsLength;\n this.hasTangentMorph = tangentCount == this.morphWeightsLength;\n }\n\n /**\n * 这里是做正确性检查,特别是各个属性之间数目需要对上,否则就报错。\n * 还要注意最大数目不能超过5,否则也直接报错。\n * 后续考虑是否做个兼容,目前还是严格报错比较好。\n */\n\n if (positionCount > 0 && positionCount != this.morphWeightsLength) {\n console.error(`Position morph count mismatch: ${this.morphWeightsLength}, ${positionCount}.`);\n\n return false;\n }\n\n if (normalCount > 0 && normalCount != this.morphWeightsLength) {\n console.error(`Normal morph count mismatch: ${this.morphWeightsLength}, ${normalCount}.`);\n\n return false;\n }\n\n if (tangentCount > 0 && tangentCount != this.morphWeightsLength) {\n console.error(`Tangent morph count mismatch: ${this.morphWeightsLength}, ${tangentCount}.`);\n\n return false;\n }\n\n if (this.morphWeightsLength > 5) {\n console.error(`Tangent morph count should not greater than 5, current ${this.morphWeightsLength}.`);\n\n return false;\n }\n\n return true;\n }\n\n /**\n * 初始化 Morph target 的权重数组\n * @param weights - glTF Mesh 的权重数组,长度必须严格一致\n */\n initWeights (weights: number[]) {\n if (this.morphWeightsArray.length === 0) {\n return;\n }\n\n const morphWeights = this.morphWeightsArray;\n\n weights.forEach((val, index) => {\n if (index < morphWeights.length) {\n morphWeights[index] = val;\n }\n });\n }\n\n updateWeights (weights: number[]) {\n if (weights.length != this.morphWeightsArray.length) {\n console.error(`Length of morph weights mismatch: input ${weights.length}, internel ${this.morphWeightsArray.length}.`);\n\n return;\n }\n\n weights.forEach((value, index) => this.morphWeightsArray[index] = value);\n }\n\n /**\n * 当前状态是否有 Morph 动画:\n * 需要判断 weights 数组长度,以及 Position、Normal 和 Tangent 是否有动画\n * @returns 返回是否有 Morph 动画\n */\n hasMorph (): boolean {\n return this.morphWeightsLength > 0 && (this.hasPositionMorph || this.hasNormalMorph || this.hasTangentMorph);\n }\n\n /**\n * 两个 Morph 动画状态是否相等:\n * 这里只比较初始状态是否一样,不考虑 weights 数组的情况,提供给 Mesh 进行 Geometry 检查使用\n * @param morph - Morph 动画状态对象\n * @returns 返回两个 Morph 动画状态是否相等\n */\n equals (morph: PMorph): boolean {\n return this.morphWeightsLength === morph.morphWeightsLength\n && this.hasPositionMorph === morph.hasPositionMorph\n && this.hasNormalMorph === morph.hasNormalMorph\n && this.hasTangentMorph === morph.hasTangentMorph;\n }\n\n getMorphWeightsArray (): number[] {\n return this.morphWeightsArray;\n }\n\n /**\n * 统计 Geometry 中 Attribute 名称个数:\n * 主要用于统计 Morph 动画中新增的 Attribute 名称的个数,会作为最终的 weights 数组长度使用\n * @param attributeNameList - Attribute 名数组列表,只与 Morph Target 中的属性有关\n * @param geometry - Geometry 对象,是否有 Morph 动画都可以\n * @returns 存在的 Attribute 名称数目\n */\n getAttributeMorphCount (attributeNameList: string[], geometry: Geometry): number {\n for (let i = 0; i < attributeNameList.length; i++) {\n const val = attributeNameList[i];\n\n if (geometry.getAttributeData(val) === undefined) {\n return i;\n }\n }\n\n // 所有名称都找到了,所以要返回数组的长度\n return attributeNameList.length;\n }\n\n /**\n * Morph 动画中 Position 相关的 Attribute 名称\n */\n private static positionNameList = [\n 'aTargetPosition0',\n 'aTargetPosition1',\n 'aTargetPosition2',\n 'aTargetPosition3',\n 'aTargetPosition4',\n 'aTargetPosition5',\n 'aTargetPosition6',\n 'aTargetPosition7',\n ];\n\n /**\n * Morph 动画中 Normal 相关的 Attribute 名称\n */\n private static normalNameList = [\n 'aTargetNormal0',\n 'aTargetNormal1',\n 'aTargetNormal2',\n 'aTargetNormal3',\n 'aTargetNormal4',\n 'aTargetNormal5',\n 'aTargetNormal6',\n 'aTargetNormal7',\n ];\n\n /**\n * Morph 动画中 Tangent 相关的 Attribute 名称\n */\n private static tangentNameList = [\n 'aTargetTangent0',\n 'aTargetTangent1',\n 'aTargetTangent2',\n 'aTargetTangent3',\n 'aTargetTangent4',\n 'aTargetTangent5',\n 'aTargetTangent6',\n 'aTargetTangent7',\n ];\n}\n\n/**\n * 动画插值类型\n */\nexport enum PAnimInterpType {\n linear = 0,\n step,\n cubicSpline,\n}\n\n/**\n * 动画路径类型\n */\nexport enum PAnimPathType {\n translation = 0,\n rotation,\n scale,\n weights,\n}\n\n/**\n * 动画纹理类\n */\nexport class PAnimTexture {\n private isHalfFloat = true;\n //\n private width = 0;\n private height = 0;\n private buffer?: Float16ArrayWrapper;\n private texture?: Texture;\n\n constructor (private engine: Engine) {}\n\n /**\n * 创建动画纹理对象\n * @param jointCount - 骨骼数目\n * @param isHalfFloat - 是否半浮点精度\n * @param name - 名称\n */\n create (jointCount: number, isHalfFloat: boolean, name: string) {\n this.width = 4;\n this.height = jointCount;\n this.isHalfFloat = isHalfFloat;\n\n if (this.isHalfFloat) {\n this.buffer = new Float16ArrayWrapper(this.getSize() * 4);\n }\n\n const data = this.buffer?.data ?? new Float32Array(this.getSize() * 4);\n const type = this.isHalfFloat ? glContext.HALF_FLOAT : glContext.FLOAT;\n\n this.texture = Texture.create(\n this.engine,\n {\n name,\n data: {\n width: this.width,\n height: this.height,\n data,\n },\n target: glContext.TEXTURE_2D,\n format: glContext.RGBA,\n type,\n wrapS: glContext.CLAMP_TO_EDGE,\n wrapT: glContext.CLAMP_TO_EDGE,\n minFilter: glContext.NEAREST,\n magFilter: glContext.NEAREST,\n });\n }\n\n /**\n * 更新动画数据\n * @param buffer - 新的动画数据\n */\n update (buffer: Float32Array) {\n if (this.buffer !== undefined) {\n this.buffer.set(buffer, 0);\n }\n\n if (this.texture !== undefined) {\n this.texture.updateSource({\n sourceType: TextureSourceType.data,\n data: {\n width: this.width,\n height: this.height,\n data: this.buffer?.data ?? buffer,\n },\n target: glContext.TEXTURE_2D,\n });\n }\n\n }\n\n /**\n * 销毁\n */\n dispose () {\n // @ts-expect-error\n this.engine = null;\n this.buffer = undefined;\n this.texture?.dispose();\n }\n\n /**\n * 获取纹理大小\n * @returns\n */\n getSize () {\n return this.width * this.height;\n }\n\n /**\n * 获取纹理对象\n * @returns\n */\n getTexture () {\n return this.texture as Texture;\n }\n\n}\n","import { PMaterialType } from './common';\nimport type { PMaterialBase } from './material';\nimport * as Helper from '../utility/shader-helper';\n\n/**\n * 着色器上下文\n */\nexport interface PShaderContext {\n /**\n * 材质\n */\n material: PMaterialBase,\n /**\n * 是否 WebGL2\n */\n isWebGL2: boolean,\n /**\n * 特性列表\n */\n featureList: string[],\n}\n\n/**\n * 着色器返回的代码结果\n */\nexport interface PShaderResults {\n /**\n * 顶点着色器代码\n */\n vertexShaderCode: string,\n /**\n * 片段着色器代码\n */\n fragmentShaderCode: string,\n}\n\ntype ShaderCodeFuncType = (context: PShaderContext) => PShaderResults;\n\n/**\n * 着色器管理类\n */\nexport class PShaderManager {\n private funcMap: Map<PMaterialType, ShaderCodeFuncType>;\n private static _instance: PShaderManager;\n\n /**\n * 获取着色器单例对象\n * @returns\n */\n static getInstance (): PShaderManager {\n // Do you need arguments? Make it a regular static method instead.\n return this._instance || (this._instance = new this());\n }\n\n private constructor () {\n this.funcMap = new Map();\n this.funcMap.set(PMaterialType.unlit, Helper.getPBRPassShaderCode);\n this.funcMap.set(PMaterialType.pbr, Helper.getPBRPassShaderCode);\n this.funcMap.set(PMaterialType.shadowBase, Helper.getShadowPassShaderCode);\n this.funcMap.set(PMaterialType.shadowFilter, Helper.getGaussianBlurShaderCodeV2);\n this.funcMap.set(PMaterialType.normalVis, Helper.getNormalVisShaderCode);\n this.funcMap.set(PMaterialType.simpleFilter, Helper.getSimpleFilterShaderCode);\n this.funcMap.set(PMaterialType.skyboxFilter, Helper.getSkyBoxShaderCode);\n }\n\n /**\n * 生成着色器代码\n * @param context - 着色器上下文\n * @returns\n */\n genShaderCode (context: PShaderContext): PShaderResults {\n const materialType = context.material.materialType;\n const func = this.funcMap.get(materialType);\n\n if (func !== undefined) {\n return func(context);\n } else {\n throw new Error(`Invalid material type ${materialType}, shader content ${context}.`);\n }\n }\n}\n","import type { Texture, Material } from '@galacean/effects';\nimport { spec, glContext } from '@galacean/effects';\nimport type { MacroInfo } from '../index';\nimport type { Matrix3 } from './math';\nimport { Vector3, Vector4, Color } from './math';\nimport { PObjectType, PMaterialType, PGlobalState, PBRShaderGUID } from './common';\nimport { PObject } from './object';\nimport { PluginHelper } from '../utility/plugin-helper';\nimport { PShaderManager } from './shader';\n\n/**\n * 3D 材质基础类,支持公共的材质功能\n */\nexport abstract class PMaterialBase extends PObject {\n effectMaterial: Material;\n /**\n * 材质类型,主要是 pbr 和 unlit 两类\n */\n materialType: PMaterialType = PMaterialType.none;\n /**\n * 顶点着色器代码\n */\n vertexShaderCode = '';\n /**\n * 片段着色器代码\n */\n fragmentShaderCode = '';\n /**\n * 深度是否写入,默认是写入\n */\n ZWrite = true;\n /**\n * 是否深度测试提示,默认开启\n */\n ZTest = true;\n /**\n * 渲染类型,默认是不透明\n */\n renderType: spec.RenderType = spec.RenderType.Opaque;\n /**\n * 是否 Alpha 裁剪,默认关闭\n */\n alphaClip = false;\n /**\n * Alpha 测试截断值\n */\n alphaCutoff = 0.5;\n /**\n * 面侧模式,默认是正面\n */\n renderFace: spec.RenderFace = spec.RenderFace.Front;\n\n /**\n * 获取着色器特性列表,根据材质状态\n * @returns 特性列表\n */\n getShaderFeatures (): string[] {\n const featureList: string[] = [];\n\n if (this.isAlphaClip()) {\n featureList.push('ALPHAMODE_MASK 1');\n } else if (this.isOpaque()) {\n featureList.push('ALPHAMODE_OPAQUE 1');\n }\n\n if (this.renderFace === spec.RenderFace.Both) {\n featureList.push('DOUBLE_SIDED 1');\n }\n\n return featureList;\n }\n\n getShaderMacros (): MacroInfo[] {\n const macroList: MacroInfo[] = [];\n\n if (this.isAlphaClip()) {\n macroList.push({ name: 'ALPHAMODE_MASK' });\n } else if (this.isOpaque()) {\n macroList.push({ name: 'ALPHAMODE_OPAQUE' });\n }\n\n if (this.renderFace === spec.RenderFace.Both) {\n macroList.push({ name: 'DOUBLE_SIDED' });\n }\n\n return macroList;\n }\n\n /**\n * 根据材质状态,更新 GE 材质状态\n * @param material - GE 材质\n */\n updateUniforms (material: Material) {\n // 渲染 UV 结果输出时,设置 uv 大小\n const renderMode = PGlobalState.getInstance().renderMode3D;\n\n if (renderMode === spec.RenderMode3D.uv) {\n const debugUVGridSize = PGlobalState.getInstance().renderMode3DUVGridSize;\n\n material.setFloat('_DebugUVGridSize', debugUVGridSize);\n }\n }\n\n /**\n * 生成顶点和片段着色器代码\n * 先获取着色器特性,再根据材质和全局状态,生成着色器代码\n * @param inFeatureList - 外部特性列表\n */\n build (inFeatureList?: string[]) {\n const finalFeatureList = this.getFeatureList(inFeatureList);\n const isWebGL2 = PGlobalState.getInstance().isWebGL2;\n //\n const shaderManager = PShaderManager.getInstance();\n const shaderResult = shaderManager.genShaderCode({\n material: this,\n isWebGL2,\n featureList: finalFeatureList,\n });\n\n this.vertexShaderCode = shaderResult.vertexShaderCode;\n this.fragmentShaderCode = shaderResult.fragmentShaderCode;\n }\n\n getFeatureList (inFeatureList?: string[]) {\n const finalFeatureList = this.getShaderFeatures();\n\n if (inFeatureList !== undefined) {\n finalFeatureList.push(...inFeatureList);\n }\n\n // 目前只有 PRB 和 Unlit 是需要 EDITOR_TRANSFORM,适配编辑器的视口 Offset\n // 阴影 Pass 的渲染是不需要,所以这里特殊处理下\n if (this.materialType !== PMaterialType.shadowBase) {\n const isEditorEvn = PGlobalState.getInstance().isEditorEnv;\n\n if (isEditorEvn) {\n finalFeatureList.push('EDITOR_TRANSFORM');\n }\n }\n\n return finalFeatureList;\n }\n\n getMacroList (inMacroList?: MacroInfo[]) {\n const finalMacroList = this.getShaderMacros();\n\n if (inMacroList !== undefined) {\n finalMacroList.push(...inMacroList);\n }\n\n // 目前只有 PRB 和 Unlit 是需要 EDITOR_TRANSFORM,适配编辑器的视口 Offset\n // 阴影 Pass 的渲染是不需要,所以这里特殊处理下\n if (this.materialType !== PMaterialType.shadowBase) {\n const isEditorEvn = PGlobalState.getInstance().isEditorEnv;\n\n if (isEditorEvn) {\n finalMacroList.push({ name: 'EDITOR_TRANSFORM' });\n }\n }\n\n return finalMacroList;\n }\n\n /**\n * 设置材质状态,根据 GE 材质状态\n * @param material - GE 材质\n */\n setMaterialStates (material: Material) {\n if (this.renderType === spec.RenderType.Transparent) {\n material.blending = true;\n material.depthTest = this.ZTest;\n material.depthMask = this.ZWrite;\n material.blendEquation = [glContext.FUNC_ADD, glContext.FUNC_ADD];\n material.blendFunction = [\n glContext.ONE, glContext.ONE_MINUS_SRC_ALPHA,\n glContext.ONE, glContext.ONE_MINUS_SRC_ALPHA,\n ];\n } else {\n if (PGlobalState.getInstance().isTiny3dMode) {\n material.blending = false;\n material.depthTest = true;\n // Tiny兼容模式下不透明的深度写入始终开\n material.depthMask = true;\n } else {\n material.blending = false;\n material.depthTest = this.ZTest;\n material.depthMask = this.ZWrite;\n }\n }\n\n this.setFaceSideStates(material);\n }\n\n protected setFaceSideStates (material: Material) {\n if (this.isBothSide()) {\n material.culling = false;\n } else if (this.isBackSide()) {\n material.cullFace = glContext.FRONT;\n material.frontFace = glContext.CCW;\n material.culling = true;\n } else {\n material.cullFace = glContext.BACK;\n material.frontFace = glContext.CCW;\n material.culling = true;\n }\n }\n\n /**\n * 销毁材质,清除着色器代码\n */\n override dispose () {\n this.vertexShaderCode = '';\n this.fragmentShaderCode = '';\n }\n\n /**\n * 是否合法,材质类型非 none\n * @returns\n */\n override isValid (): boolean {\n return this.materialType !== PMaterialType.none && super.isValid();\n }\n\n /**\n * 是否不透明\n * @returns\n */\n isOpaque (): boolean {\n return this.renderType === spec.RenderType.Opaque;\n }\n\n /**\n * 是否 Alpha 裁剪\n * @returns\n */\n isAlphaClip (): boolean {\n return this.alphaClip;\n }\n\n /**\n * 是否半透明\n * @returns\n */\n isTransparent (): boolean {\n return this.renderType === spec.RenderType.Transparent;\n }\n\n /**\n * 是否正面模式\n * @returns\n */\n isFrontSide (): boolean {\n return this.renderFace === spec.RenderFace.Front;\n }\n\n /**\n * 是否背面模式\n * @returns\n */\n isBackSide (): boolean {\n return this.renderFace === spec.RenderFace.Back;\n }\n\n /**\n * 是否双面模式\n * @returns\n */\n isBothSide (): boolean {\n return this.renderFace === spec.RenderFace.Both;\n }\n}\n\n/**\n * 无光照材质类,负责无关照或者不接受光照情况下的物体材质效果\n */\nexport class PMaterialUnlit extends PMaterialBase {\n /**\n * 基础颜色纹理\n */\n baseColorTexture?: Texture;\n /**\n * 基础颜色纹理变换\n */\n baseColorTextureTrans: Matrix3;\n /**\n * 基础颜色值,默认是白色 Color(1, 1, 1, 1)\n */\n baseColorFactor: Color = new Color(1, 1, 1, 1);\n\n /**\n * 创建无光照材质,支持基础颜色纹理\n * @param material - effect 材质对象\n */\n create (material: Material) {\n this.effectMaterial = material;\n this.name = material.name;\n this.type = PObjectType.material;\n this.materialType = PMaterialType.unlit;\n //\n this.baseColorTexture = material.getTexture('_BaseColorSampler') ?? undefined;\n this.baseColorTextureTrans = PluginHelper.createUVTransform(material, '_BaseColorSampler_ST', '_BaseColorRotation');\n this.baseColorFactor = material.getColor('_BaseColorFactor') ?? new Color(1.0, 1.0, 1.0, 1.0);\n //\n this.ZWrite = material.getFloat('ZWrite') !== 0;\n this.ZTest = material.getFloat('ZTest') !== 0;\n this.renderType = material.stringTags['RenderType'] as spec.RenderType ?? spec.RenderType.Opaque;\n this.alphaClip = material.getFloat('AlphaClip') === 1;\n this.alphaCutoff = material.getFloat('_AlphaCutoff') ?? 0;\n this.renderFace = material.stringTags['RenderFace'] as spec.RenderFace ?? spec.RenderFace.Front;\n }\n\n /**\n * 销毁材质\n */\n override dispose () {\n super.dispose();\n this.baseColorTexture = undefined;\n }\n\n /**\n * 获取着色器特性列表,根据材质状态\n * @returns 着色器特性列表\n */\n override getShaderFeatures (): string[] {\n const featureList = super.getShaderFeatures();\n\n featureList.push('MATERIAL_METALLICROUGHNESS 1');\n if (this.hasBaseColorTexture()) {\n featureList.push('HAS_BASE_COLOR_MAP 1');\n }\n\n featureList.push('MATERIAL_UNLIT 1');\n\n return featureList;\n }\n\n override getShaderMacros (): MacroInfo[] {\n const macroList = super.getShaderMacros();\n\n macroList.push({ name: 'MATERIAL_METALLICROUGHNESS' });\n if (this.hasBaseColorTexture()) {\n macroList.push({ name: 'HAS_BASE_COLOR_MAP' });\n }\n\n macroList.push({ name: 'MATERIAL_UNLIT' });\n\n return macroList;\n }\n\n /**\n * 更新对应的 GE 材质中着色器的 Uniform 数据\n * @param material - GE 材质\n */\n override updateUniforms (material: Material) {\n super.updateUniforms(material);\n\n if (this.baseColorTexture !== undefined) {\n material.setInt('_BaseColorUVSet', 0);\n material.setMatrix3('_BaseColorUVTransform', this.baseColorTextureTrans);\n }\n\n material.setFloat('_MetallicFactor', 0);\n material.setFloat('_RoughnessFactor', 0);\n\n material.setFloat('_Exposure', 1.0);\n }\n\n /**\n * 是否有基础颜色纹理\n * @returns\n */\n hasBaseColorTexture (): boolean {\n return this.baseColorTexture !== undefined;\n }\n\n /**\n * 获取基础颜色纹理\n * @returns\n */\n getBaseColorTexture (): Texture {\n return this.baseColorTexture as Texture;\n }\n\n /**\n * 设置基础颜色纹理\n * @param val - 纹理对象\n */\n setBaseColorTexture (val: Texture) {\n this.baseColorTexture = val;\n }\n\n /**\n * 获取基础颜色纹理\n * @returns\n */\n getBaseColorFactor (): Color {\n return this.baseColorFactor;\n }\n\n /**\n * 设置基础颜色值\n * @param val - 颜色值\n */\n setBaseColorFactor (val: Color | Vector4 | spec.vec4) {\n if (val instanceof Color) {\n // for Color\n this.baseColorFactor.set(val.r, val.g, val.b, val.a);\n } else if (val instanceof Vector4) {\n // for Vector4\n this.baseColorFactor.set(val.x, val.y, val.z, val.w);\n } else {\n // for vec4\n this.baseColorFactor.set(val[0], val[1], val[2], val[3]);\n }\n }\n}\n\n/**\n * PBR 材质类,负责基于物理的材质效果,也是渲染中最常用的材质。\n * 目前支持金属度/粗糙度工作流,与其他引擎中的 PBR 材质功能一致。\n */\nexport class PMaterialPBR extends PMaterialBase {\n /**\n * 基础颜色纹理\n */\n baseColorTexture?: Texture;\n /**\n * 基础颜色纹理变换\n */\n baseColorTextureTrans: Matrix3;\n /**\n * 基础颜色值,默认是白色 Color(1, 1, 1, 1)\n */\n baseColorFactor: Color = new Color(1, 1, 1, 1);\n /**\n * 金属度粗超度纹理\n */\n metallicRoughnessTexture?: Texture;\n /**\n * 金属度粗超度纹理变换\n */\n metallicRoughnessTextureTrans: Matrix3;\n /**\n * 是否高光抗锯齿,能够明显提升高光表现效果\n */\n useSpecularAA = false;\n /**\n * 金属度值\n */\n metallicFactor = 0;\n /**\n * 粗超度值\n */\n roughnessFactor = 1;\n /**\n * 法线纹理\n */\n normalTexture?: Texture;\n /**\n * 法线纹理变换\n */\n normalTextureTrans: Matrix3;\n /**\n * 法线纹理缩放\n */\n normalTextureScale = 1;\n /**\n * AO 纹理\n */\n occlusionTexture?: Texture;\n /**\n * AO 纹理变换\n */\n occlusionTextureTrans: Matrix3;\n /**\n * AO 纹理强度\n */\n occlusionTextureStrength = 1;\n /**\n * 自发光纹理\n */\n emissiveTexture?: Texture;\n /**\n * 自发光纹理变换\n */\n emissiveTextureTrans: Matrix3;\n /**\n * 自发光颜色值,默认是黑色 Vector4(0, 0, 0, 0)\n */\n emissiveFactor: Color = new Color(0, 0, 0, 0);\n /**\n * 自发光强度\n */\n emissiveIntensity = 1;\n\n /**\n * 创建材质\n * @param material - effect 材质对象\n */\n create (material: Material) {\n this.effectMaterial = material;\n this.name = material.name;\n this.type = PObjectType.material;\n this.materialType = PMaterialType.pbr;\n //\n this.baseColorTexture = material.getTexture('_BaseColorSampler') ?? undefined;\n this.baseColorTextureTrans = PluginHelper.createUVTransform(material, '_BaseColorSampler_ST', '_BaseColorRotation');\n this.baseColorFactor = material.getColor('_BaseColorFactor') ?? new Color(1.0, 1.0, 1.0, 1.0);\n //\n this.metallicRoughnessTexture = material.getTexture('_MetallicRoughnessSampler') ?? undefined;\n this.metallicRoughnessTextureTrans = PluginHelper.createUVTransform(material, '_MetallicRoughnessSampler_ST', '_MetallicRoughnessRotation');\n this.useSpecularAA = material.getFloat('_SpecularAA') === 1;\n this.metallicFactor = material.getFloat('_MetallicFactor') ?? 1;\n this.roughnessFactor = material.getFloat('_RoughnessFactor') ?? 0;\n //\n this.normalTexture = material.getTexture('_NormalSampler') ?? undefined;\n this.normalTextureTrans = PluginHelper.createUVTransform(material, '_NormalSampler_ST', '_NormalRotation');\n this.normalTextureScale = material.getFloat('_NormalScale') ?? 1;\n //\n this.occlusionTexture = material.getTexture('_OcclusionSampler') ?? undefined;\n this.occlusionTextureTrans = PluginHelper.createUVTransform(material, '_OcclusionSampler_ST', '_OcclusionRotation');\n this.occlusionTextureStrength = material.getFloat('_OcclusionStrength') ?? 1;\n //\n this.emissiveTexture = material.getTexture('_EmissiveSampler') ?? undefined;\n this.emissiveTextureTrans = PluginHelper.createUVTransform(material, '_EmissiveSampler_ST', '_EmissiveRotation');\n this.emissiveFactor = material.getColor('_EmissiveFactor') ?? new Color(0, 0, 0, 1);\n this.emissiveIntensity = material.getFloat('_EmissiveIntensity') ?? 1;\n //\n this.ZWrite = material.getFloat('ZWrite') !== 0;\n this.ZTest = material.getFloat('ZTest') !== 0;\n this.renderType = material.stringTags['RenderType'] as spec.RenderType ?? spec.RenderType.Opaque;\n this.alphaClip = material.getFloat('AlphaClip') === 1;\n this.alphaCutoff = material.getFloat('_AlphaCutoff') ?? 0;\n this.renderFace = material.stringTags['RenderFace'] as spec.RenderFace ?? spec.RenderFace.Front;\n }\n\n /**\n * 销毁材质\n */\n override dispose () {\n super.dispose();\n this.baseColorTexture = undefined;\n this.metallicRoughnessTexture = undefined;\n this.normalTexture = undefined;\n this.occlusionTexture = undefined;\n this.emissiveTexture = undefined;\n }\n\n /**\n * 获取材质特性列表\n * @returns 材质特性列表\n */\n override getShaderFeatures (): string[] {\n const featureList = super.getShaderFeatures();\n\n featureList.push('MATERIAL_METALLICROUGHNESS 1');\n if (this.hasBaseColorTexture()) {\n featureList.push('HAS_BASE_COLOR_MAP 1');\n if (this.baseColorTextureTrans !== undefined) {\n featureList.push('HAS_BASECOLOR_UV_TRANSFORM 1');\n }\n }\n if (this.hasMetallicRoughnessTexture()) {\n featureList.push('HAS_METALLIC_ROUGHNESS_MAP 1');\n if (this.metallicRoughnessTextureTrans !== undefined) {\n featureList.push('HAS_METALLICROUGHNESS_UV_TRANSFORM 1');\n }\n }\n if (this.useSpecularAA) {\n featureList.push('USE_SPECULAR_AA 1');\n }\n if (this.hasNormalTexture()) {\n featureList.push('HAS_NORMAL_MAP 1');\n if (this.normalTextureTrans !== undefined) {\n featureList.push('HAS_NORMAL_UV_TRANSFORM 1');\n }\n }\n if (this.hasOcclusionTexture()) {\n featureList.push('HAS_OCCLUSION_MAP 1');\n if (this.occlusionTextureTrans !== undefined) {\n featureList.push('HAS_OCCLUSION_UV_TRANSFORM 1');\n }\n }\n if (this.hasEmissiveTexture()) {\n featureList.push('HAS_EMISSIVE_MAP 1');\n if (this.emissiveTextureTrans !== undefined) {\n featureList.push('HAS_EMISSIVE_UV_TRANSFORM 1');\n }\n } else if (this.hasEmissiveValue()) {\n featureList.push('HAS_EMISSIVE 1');\n }\n\n return featureList;\n }\n\n override getShaderMacros (): MacroInfo[] {\n const macroList = super.getShaderMacros();\n\n macroList.push({ name: 'MATERIAL_METALLICROUGHNESS' });\n if (this.hasBaseColorTexture()) {\n macroList.push({ name: 'HAS_BASE_COLOR_MAP' });\n if (this.baseColorTextureTrans !== undefined) {\n macroList.push({ name: 'HAS_BASECOLOR_UV_TRANSFORM' });\n }\n }\n if (this.hasMetallicRoughnessTexture()) {\n macroList.push({ name: 'HAS_METALLIC_ROUGHNESS_MAP' });\n if (this.metallicRoughnessTextureTrans !== undefined) {\n macroList.push({ name: 'HAS_METALLICROUGHNESS_UV_TRANSFORM' });\n }\n }\n if (this.useSpecularAA) {\n macroList.push({ name: 'USE_SPECULAR_AA' });\n }\n if (this.hasNormalTexture()) {\n macroList.push({ name: 'HAS_NORMAL_MAP' });\n if (this.normalTextureTrans !== undefined) {\n macroList.push({ name: 'HAS_NORMAL_UV_TRANSFORM' });\n }\n }\n if (this.hasOcclusionTexture()) {\n macroList.push({ name: 'HAS_OCCLUSION_MAP' });\n if (this.occlusionTextureTrans !== undefined) {\n macroList.push({ name: 'HAS_OCCLUSION_UV_TRANSFORM' });\n }\n }\n if (this.hasEmissiveTexture()) {\n macroList.push({ name: 'HAS_EMISSIVE_MAP' });\n if (this.emissiveTextureTrans !== undefined) {\n macroList.push({ name: 'HAS_EMISSIVE_UV_TRANSFORM' });\n }\n } else if (this.hasEmissiveValue()) {\n macroList.push({ name: 'HAS_EMISSIVE' });\n }\n\n return macroList;\n }\n\n /**\n * 更新关联的 GE 材质中着色器的 Uniform 数据\n * @param material - GE 材质\n */\n override updateUniforms (material: Material) {\n super.updateUniforms(material);\n\n if (this.baseColorTexture !== undefined) {\n material.setInt('_BaseColorUVSet', 0);\n material.setMatrix3('_BaseColorUVTransform', this.baseColorTextureTrans);\n }\n //\n if (this.metallicRoughnessTexture !== undefined) {\n material.setInt('_MetallicRoughnessUVSet', 0);\n material.setMatrix3('_MetallicRoughnessUVTransform', this.metallicRoughnessTextureTrans);\n }\n //\n if (this.normalTexture !== undefined) {\n material.setInt('_NormalUVSet', 0);\n material.setMatrix3('_NormalUVTransform', this.normalTextureTrans);\n }\n //\n if (this.occlusionTexture !== undefined) {\n material.setInt('_OcclusionUVSet', 0);\n material.setMatrix3('_OcclusionUVTransform', this.occlusionTextureTrans);\n }\n //\n if (this.emissiveTexture !== undefined) {\n material.setInt('_EmissiveUVSet', 0);\n material.setMatrix3('_EmissiveUVTransform', this.emissiveTextureTrans);\n }\n\n material.setFloat('_Exposure', 3.0);\n }\n\n /**\n * 是否有基础颜色纹理\n * @returns\n */\n hasBaseColorTexture (): boolean {\n return this.baseColorTexture !== undefined;\n }\n\n /**\n * 设置基础颜色纹理\n * @param val - 纹理\n */\n setBaseColorTexture (val: Texture) {\n this.baseColorTexture = val;\n }\n\n /**\n * 获取基础颜色纹理\n * @returns\n */\n getBaseColorFactor (): Color {\n return this.baseColorFactor;\n }\n\n /**\n * 设置基础颜色值\n * @param val - 颜色值\n */\n setBaseColorFactor (val: Color | Vector4 | spec.vec4) {\n if (val instanceof Color) {\n // for Vector4\n this.baseColorFactor.set(val.r, val.g, val.b, val.a);\n } else if (val instanceof Vector4) {\n // for Vector4\n this.baseColorFactor.set(val.x, val.y, val.z, val.w);\n } else {\n // for vec4\n this.baseColorFactor.set(val[0], val[1], val[2], val[3]);\n }\n }\n\n /**\n * 是否有金属度粗超度纹理\n * @returns\n */\n hasMetallicRoughnessTexture (): boolean {\n return this.metallicRoughnessTexture !== undefined;\n }\n\n /**\n * 获取金属度粗超度纹理\n * @returns\n */\n getMetallicRoughnessTexture (): Texture {\n return this.metallicRoughnessTexture as Texture;\n }\n\n /**\n * 设置金属度粗超度纹理\n * @param val - 纹理\n */\n setMetallicRoughnessTexture (val: Texture) {\n this.metallicRoughnessTexture = val;\n }\n\n /**\n * 是否有法线纹理\n * @returns\n */\n hasNormalTexture (): boolean {\n return this.normalTexture !== undefined;\n }\n\n /**\n * 获取法线纹理\n * @returns\n */\n getNormalTexture (): Texture {\n return this.normalTexture as Texture;\n }\n\n /**\n * 设置法线纹理\n * @param val - 纹理\n */\n setNormalTexture (val: Texture) {\n this.normalTexture = val;\n }\n\n /**\n * 是否有遮挡纹理\n * @returns\n */\n hasOcclusionTexture (): boolean {\n return this.occlusionTexture !== undefined;\n }\n\n /**\n * 获取遮挡纹理\n * @returns\n */\n getOcclusionTexture (): Texture {\n return this.occlusionTexture as Texture;\n }\n\n /**\n * 设置遮挡纹理\n * @param val - 纹理\n */\n setOcclusionTexture (val: Texture) {\n this.occlusionTexture = val;\n }\n\n /**\n * 是否有自发光纹理\n * @returns\n */\n hasEmissiveTexture (): boolean {\n return this.emissiveTexture !== undefined;\n }\n\n /**\n * 获取自发光纹理\n * @returns\n */\n getEmissiveTexture (): Texture {\n return this.emissiveTexture as Texture;\n }\n\n /**\n * 设置自发光纹理\n * @param val - 纹理\n */\n setEmissiveTexture (val: Texture) {\n this.emissiveTexture = val;\n }\n\n /**\n * 是否有自发光值,包含强度\n * @returns\n */\n hasEmissiveValue (): boolean {\n return this.emissiveFactor.luminance() * this.emissiveIntensity > 0;\n }\n\n /**\n * 获取自发光颜色\n * @returns\n */\n getEmissiveFactor (): Color {\n return this.emissiveFactor;\n }\n\n /**\n * 设置自发光颜色\n * @param val - 颜色\n */\n setEmissiveFactor (val: Color | Vector3 | spec.vec3) {\n if (val instanceof Color) {\n // Color\n this.emissiveFactor.set(val.r, val.g, val.b, val.a);\n } else if (val instanceof Vector3) {\n // Vector3\n this.emissiveFactor.set(val.x, val.y, val.z, 0);\n } else {\n // vec3\n this.emissiveFactor.set(val[0], val[1], val[2], 0);\n }\n }\n\n /**\n * 获取自发光强度\n * @returns\n */\n getEmissiveIntensity (): number {\n return this.emissiveIntensity;\n }\n\n /**\n * 设置自发光强度\n * @param val - 强度\n */\n setEmissiveIntensity (val: number) {\n this.emissiveIntensity = val;\n }\n}\n\n/**\n * 材质类型,包括无光照材质和 PBR 材质\n */\nexport type PMaterial = PMaterialUnlit | PMaterialPBR;\n\n/**\n * 创建插件材质对象\n * @param material - Effects 材质对象\n * @returns 材质对象\n */\nexport function createPluginMaterial (material: Material): PMaterial {\n if (material.shader.getInstanceId() === PBRShaderGUID) {\n const materialPBR = new PMaterialPBR();\n\n materialPBR.create(material);\n\n return materialPBR;\n } else {\n const materialUnlit = new PMaterialUnlit();\n\n materialUnlit.create(material);\n\n return materialUnlit;\n }\n}\n","import type { Mesh, Material, TextureSourceOptions, Engine, Renderer } from '@galacean/effects';\nimport { spec, glContext, Texture, TextureSourceType, loadImage, generateGUID } from '@galacean/effects';\nimport type { ModelSkyboxComponentData, ModelSkyboxOptions } from '../index';\nimport { PObjectType, PMaterialType } from './common';\nimport { PEntity } from './object';\nimport { PMaterialBase } from './material';\nimport type { PSceneManager } from './scene';\nimport { WebGLHelper } from '../utility/plugin-helper';\nimport { Matrix4, Vector2, Vector3 } from './math';\nimport type { ModelSkyboxComponent } from '../plugin/model-item';\n\n/**\n * 天空盒类,支持天空盒的渲染和 IBL 光照效果\n */\nexport class PSkybox extends PEntity {\n /**\n * 所属的天空盒组件\n */\n owner?: ModelSkyboxComponent;\n /**\n * 是否渲染\n */\n renderable = true;\n /**\n * 强度\n */\n intensity = 1.0;\n /**\n * 反射强度\n */\n reflectionsIntensity = 1.0;\n /**\n * 辐射照度系数\n */\n irradianceCoeffs?: number[][];\n /**\n * 漫反射贴图\n */\n diffuseImage?: Texture;\n /**\n * 高光贴图\n */\n specularImage!: Texture;\n /**\n * 高光贴图大小\n */\n specularImageSize = 0;\n /**\n * 高光贴图 Mip 层数目\n */\n specularMipCount = 0;\n /**\n * BRDF 查询纹理\n */\n brdfLUT?: Texture;\n /**\n * 优先级\n */\n priority = 0;\n /**\n * 天空盒 Mesh\n */\n skyboxMesh?: Mesh;\n /**\n * 天空盒材质\n */\n skyboxMaterial?: PMaterialSkyboxFilter;\n /**\n * 是否构建过\n */\n isBuilt = false;\n\n /**\n * 构造函数\n * @param name - 名称\n * @param data - 天空盒参数\n * @param owner - 所属天空盒组件元素\n */\n constructor (name: string, data: ModelSkyboxComponentData, owner?: ModelSkyboxComponent) {\n super();\n this.name = name;\n this.type = PObjectType.skybox;\n this.visible = false;\n this.owner = owner;\n\n const { irradianceCoeffs } = data;\n\n this.renderable = data.renderable;\n this.intensity = data.intensity;\n this.reflectionsIntensity = data.reflectionsIntensity;\n if (irradianceCoeffs) {\n this.irradianceCoeffs = [];\n for (let i = 0; i < irradianceCoeffs.length; i += 3) {\n this.irradianceCoeffs.push([\n irradianceCoeffs[i],\n irradianceCoeffs[i + 1],\n irradianceCoeffs[i + 2],\n ]);\n }\n } else {\n this.irradianceCoeffs = [];\n }\n\n this.diffuseImage = data.diffuseImage as unknown as Texture;\n this.specularImage = data.specularImage as unknown as Texture;\n this.specularImageSize = data.specularImageSize;\n this.specularMipCount = data.specularMipCount;\n\n this.priority = owner?.item?.renderOrder || 0;\n }\n\n /**\n * 设置 BRDF 查询纹理\n * @param brdfLUT - 纹理\n */\n setup (brdfLUT?: Texture) {\n this.brdfLUT = brdfLUT;\n }\n\n /**\n * 构建天空盒,创建天空盒材质,从场景缓存中创建天空盒 Mesh\n * @param sceneCache - 场景缓存\n * @returns\n */\n build (scene: PSceneManager) {\n if (this.isBuilt) {\n return;\n }\n\n this.isBuilt = true;\n this.skyboxMaterial = new PMaterialSkyboxFilter();\n this.skyboxMaterial.create(this);\n this.skyboxMaterial.build();\n //\n const sceneCache = scene.getSceneCache();\n\n this.skyboxMesh = sceneCache.getFilterMesh('SkyboxFilterPlane', this.skyboxMaterial);\n this.skyboxMesh.priority = this.priority;\n this.skyboxMaterial.updateUniforms(this.skyboxMesh.material);\n }\n\n /**\n * 渲染天空盒\n * @param scene - 场景\n * @param renderer - 渲染器\n */\n override render (scene: PSceneManager, renderer: Renderer) {\n this.updateMaterial(scene);\n\n if (this.visible && this.renderable && this.skyboxMesh !== undefined) {\n const mesh = this.skyboxMesh;\n\n renderer.drawGeometry(mesh.geometry, Matrix4.IDENTITY, mesh.material);\n }\n }\n\n /**\n * 销毁\n */\n override dispose () {\n super.dispose();\n this.owner = undefined;\n this.diffuseImage = undefined;\n //@ts-expect-error\n this.specularImage = undefined;\n this.brdfLUT = undefined;\n this.skyboxMesh = undefined;\n this.skyboxMaterial?.dispose();\n this.skyboxMaterial = undefined;\n }\n\n private updateMaterial (scene: PSceneManager) {\n this.build(scene);\n\n if (this.visible && this.renderable && this.skyboxMesh !== undefined && this.skyboxMaterial !== undefined) {\n const sceneStates = scene.sceneStates;\n const camera = sceneStates.camera;\n const viewMatrix = sceneStates.viewMatrix;\n const newProjViewMatrix = camera.getNewProjectionMatrix(camera.fov).multiply(viewMatrix).invert();\n const material = this.skyboxMesh.material;\n\n this.skyboxMaterial.updateUniforms(material);\n material.setMatrix('_InvViewProjectionMatrix', newProjViewMatrix);\n }\n }\n\n /**\n * 是否可用,根据内部的强度、辐射照度系数、漫反射贴图和高光贴图状态\n */\n get available (): boolean {\n if (!this.isValid()) { return false; }\n\n if (this.intensity <= 0 && this.reflectionsIntensity <= 0) { return false; }\n\n if (this.irradianceCoeffs === undefined && this.diffuseImage === undefined) { return false; }\n\n return this.specularImage !== undefined && this.specularMipCount >= 0;\n }\n\n /**\n * 当前强度,如果不可见返回 0\n */\n get currentIntensity (): number {\n return this.visible ? this.intensity : 0;\n }\n\n /**\n * 当前反射强度,如果不可见返回 0\n */\n get currentReflectionsIntensity (): number {\n return this.visible ? this.reflectionsIntensity : 0;\n }\n\n /**\n * 是否有漫反射贴图\n */\n get hasDiffuseImage (): boolean {\n return this.diffuseImage !== undefined;\n }\n\n /**\n * 是否有辐射照度系数\n */\n get hasIrradianceCoeffs (): boolean {\n return this.irradianceCoeffs !== undefined;\n }\n\n}\n\n/**\n * 天空盒材质类\n */\nexport class PMaterialSkyboxFilter extends PMaterialBase {\n /**\n * 强度\n */\n intensity = 1.0;\n /**\n * 反射强度\n */\n reflectionsIntensity = 1.0;\n /**\n * BRDF 查询纹理\n */\n brdfLUT?: Texture;\n /**\n * 辐射照度系数\n */\n irradianceCoeffs?: number[][];\n /**\n * 漫反射贴图\n */\n diffuseImage?: Texture;\n /**\n * 高光贴图\n */\n specularImage!: Texture;\n /**\n * 高光贴图 Mip 数目\n */\n specularMipCount = 0;\n\n /**\n * 创建天空盒材质,从天空盒对象\n * @param skybox - 天空盒对象\n */\n create (skybox: PSkybox) {\n this.type = PObjectType.material;\n this.materialType = PMaterialType.skyboxFilter;\n this.ZTest = false;\n //\n this.name = skybox.name;\n this.intensity = skybox.intensity;\n this.reflectionsIntensity = skybox.reflectionsIntensity;\n this.brdfLUT = skybox.brdfLUT;\n this.irradianceCoeffs = skybox.irradianceCoeffs;\n this.diffuseImage = skybox.diffuseImage;\n this.specularImage = skybox.specularImage;\n this.specularMipCount = skybox.specularMipCount;\n }\n\n /**\n * 销毁,需要解除资源引用\n */\n override dispose () {\n super.dispose();\n this.brdfLUT = undefined;\n this.irradianceCoeffs = undefined;\n this.diffuseImage = undefined;\n // @ts-expect-error\n this.specularImage = undefined;\n }\n\n /**\n * 获取着色器特性列表\n * @returns\n */\n override getShaderFeatures (): string[] {\n const featureList: string[] = [];\n\n featureList.push('USE_IBL 1');\n featureList.push('USE_TEX_LOD 1');\n if (this.diffuseImage === undefined) { featureList.push('IRRADIANCE_COEFFICIENTS 1'); }\n\n return featureList;\n }\n\n /**\n * 更新着色器 Uniform 数据\n * @param material - 对应的 Core 层材质\n */\n override updateUniforms (material: Material) {\n if (this.brdfLUT === undefined) {\n throw new Error('Setup brdfLUT for skybox at first.');\n }\n\n material.setVector2('_IblIntensity', new Vector2(2.0, 2.0));\n material.setTexture('_brdfLUT', this.brdfLUT);\n if (this.diffuseImage !== undefined) {\n material.setTexture('_DiffuseEnvSampler', this.diffuseImage);\n } else {\n const coeffs = this.irradianceCoeffs;\n\n if (coeffs === undefined || coeffs.length != 9) { throw new Error(`Invalid skybox irradiance coeffs ${coeffs}.`); }\n\n const aliasName = ['l00', 'l1m1', 'l10', 'l11', 'l2m2', 'l2m1', 'l20', 'l21', 'l22'];\n\n aliasName.forEach((n, i) => {\n material.setVector3(`_shCoefficients.${n}`, Vector3.fromArray(coeffs[i] as spec.vec3));\n });\n }\n material.setInt('_MipCount', this.specularMipCount - 1);\n material.setTexture('_SpecularEnvSampler', this.specularImage);\n }\n\n /**\n * 设置对应的材质状态\n * @param material - 对应的 Core 层材质\n */\n override setMaterialStates (material: Material) {\n material.depthTest = true;\n material.depthMask = false;\n this.setFaceSideStates(material);\n }\n}\n\n/**\n * 图像缓冲区数据接口\n */\nexport interface PImageBufferData {\n /**\n * 类型,总是 buffer\n */\n type: 'buffer',\n /**\n * 数组\n */\n data: Uint8Array,\n /**\n * MIME 类型\n */\n mimeType: string,\n}\n\n/**\n * 图像数据类型,字符串(URL)或者图像缓冲区数据\n */\nexport type PImageData = string | PImageBufferData;\n\n/**\n * 天空盒基础参数接口\n */\nexport interface PSkyboxBaseParams {\n /**\n * 是否渲染\n */\n renderable: boolean,\n /**\n * 强度\n */\n intensity: number,\n /**\n * 反射强度\n */\n reflectionsIntensity: number,\n /**\n * 辐射照度系数\n */\n irradianceCoeffs?: number[],\n /**\n * 高光贴图 Mip 层数\n */\n specularMipCount: number,\n /**\n * 高光贴图大小\n */\n specularImageSize: number,\n}\n\n/**\n * 天空盒 URL 参数接口\n */\nexport interface PSkyboxURLParams extends PSkyboxBaseParams {\n /**\n * 类型,总是 url\n */\n type: 'url',\n /**\n * 漫反射贴图 URL 列表\n */\n diffuseImage?: string[],\n /**\n * 高光贴图 URL 二级列表\n */\n specularImage: string[][],\n}\n\n/**\n * 天空盒缓冲区参数接口\n */\nexport interface PSkyboxBufferParams extends PSkyboxBaseParams {\n /**\n * 类型,总是 buffer\n */\n type: 'buffer',\n /**\n * 漫反射贴图列表\n */\n diffuseImage?: PImageBufferData[],\n /**\n * 高光贴图二级列表\n */\n specularImage: PImageBufferData[][],\n}\n\n/**\n * 天空盒参数类型\n */\nexport type PSkyboxParams = PSkyboxURLParams | PSkyboxBufferParams;\n\nexport enum PSkyboxType {\n NFT = 0,\n FARM,\n}\n\n/**\n * 天空盒创建类\n */\nexport class PSkyboxCreator {\n /**\n * 获取 BRDF 查询纹理选项\n * @returns 纹理源选项\n */\n static async getBrdfLutTextureOptions (): Promise<TextureSourceOptions> {\n const brdfURL = 'https://gw.alipayobjects.com/zos/gltf-asset/61420044606400/lut-ggx.png';\n //const brdfURL = 'https://gw.alipayobjects.com/zos/gltf-asset/58540818729423/a4191420-a8cd-432c-8e36-9bd02a67ec85.png';\n const brdfLutImage = await loadImage(brdfURL);\n\n const brdfLutOpts: TextureSourceOptions = {\n name: 'brdfLut',\n wrapS: glContext.CLAMP_TO_EDGE,\n wrapT: glContext.CLAMP_TO_EDGE,\n magFilter: glContext.LINEAR,\n minFilter: glContext.LINEAR,\n anisotropic: 1,\n sourceType: TextureSourceType.image,\n image: brdfLutImage,\n generateMipmap: false,\n flipY: false,\n premultiplyAlpha: false,\n };\n\n return brdfLutOpts;\n }\n\n /**\n * 创建 BRDF 查询纹理\n * @param engine - 引擎\n * @returns 纹理\n */\n static async createBrdfLutTexture (engine: Engine): Promise<Texture> {\n const brdfLutOpts = await this.getBrdfLutTextureOptions();\n const brdfLutTexture = Texture.create(engine, brdfLutOpts);\n\n return brdfLutTexture;\n }\n\n /**\n * 创建天空盒选项\n * @param engine - 引擎\n * @param params - 天空盒参数\n * @returns 天空盒选项\n */\n static async createSkyboxOptions (engine: Engine, params: PSkyboxParams): Promise<ModelSkyboxOptions> {\n const specularImage = await this.createSpecularCubeMap(engine, params);\n const diffuseImage = await this.createDiffuseCubeMap(engine, params);\n const { renderable, intensity, reflectionsIntensity, irradianceCoeffs, specularImageSize, specularMipCount } = params;\n const skyboxOptions: ModelSkyboxOptions = {\n renderable,\n intensity,\n reflectionsIntensity,\n // @ts-expect-error\n irradianceCoeffs,\n diffuseImage,\n specularImage,\n specularImageSize,\n specularMipCount,\n };\n\n return skyboxOptions;\n }\n\n /**\n * 创建天空盒选项\n * @param engine - 引擎\n * @param params - 天空盒参数\n * @returns 天空盒选项\n */\n static createSkyboxComponentData (params: PSkyboxParams) {\n const specularCubeData = PSkyboxCreator.getSpecularCubeMapData(params);\n const diffuseCubeData = PSkyboxCreator.getDiffuseCubeMapData(params);\n const { renderable, intensity, reflectionsIntensity, irradianceCoeffs, specularImageSize, specularMipCount } = params;\n\n let diffuseImage: spec.DataPath;\n const imageList: spec.Image[] = [];\n const textureOptionsList: TextureSourceOptions[] = [];\n\n if (diffuseCubeData) {\n imageList.push(...diffuseCubeData.images);\n textureOptionsList.push(diffuseCubeData.textureOptions);\n diffuseImage = {\n id: diffuseCubeData.textureOptions.id!,\n };\n }\n imageList.push(...specularCubeData.images);\n textureOptionsList.push(specularCubeData.textureOptions);\n const specularImage = { id: specularCubeData.textureOptions.id };\n\n const componentData: ModelSkyboxComponentData = {\n id: generateGUID(),\n dataType: spec.DataType.SkyboxComponent,\n item: {\n id: generateGUID(),\n },\n renderable,\n intensity,\n reflectionsIntensity,\n irradianceCoeffs,\n // @ts-expect-error\n diffuseImage,\n // @ts-expect-error\n specularImage,\n specularImageSize,\n specularMipCount,\n };\n\n return {\n imageList,\n textureOptionsList,\n component: componentData,\n };\n }\n\n /**\n * 创建高光 Cube Map 纹理\n * @param engine - 引擎\n * @param params - 天空盒参数\n * @returns 纹理\n */\n static async createSpecularCubeMap (engine: Engine, params: PSkyboxParams): Promise<Texture> {\n // const configOptions: TextureConfigOptions = {\n // wrapS: glContext.CLAMP_TO_EDGE,\n // wrapT: glContext.CLAMP_TO_EDGE,\n // magFilter: glContext.LINEAR,\n // minFilter: glContext.LINEAR_MIPMAP_LINEAR,\n // };\n\n if (params.type === 'url') {\n return WebGLHelper.createTextureCubeMipmapFromURL(engine, params.specularImage);\n } else {\n return WebGLHelper.createTextureCubeMipmapFromBuffer(engine, params.specularImage, params.specularImageSize);\n }\n }\n\n static getSpecularCubeMapData (params: PSkyboxParams) {\n const imageDatas: spec.Image[] = [];\n const mipmaps: spec.DataPath[][] = [];\n\n params.specularImage.forEach(cubemap => {\n const mipmap: spec.DataPath[] = [];\n\n cubemap.forEach(image => {\n const imageId = generateGUID();\n\n imageDatas.push({\n id: imageId,\n // @ts-expect-error\n url: image,\n });\n mipmap.push({ id: imageId });\n });\n mipmaps.push(mipmap);\n });\n const textureOptions: TextureSourceOptions = {\n id: generateGUID(),\n dataType: spec.DataType.Texture,\n sourceType: TextureSourceType.mipmaps,\n target: glContext.TEXTURE_CUBE_MAP,\n // @ts-expect-error\n mipmaps,\n ...WebGLHelper.cubemapMipTexConfig,\n };\n\n return {\n images: imageDatas,\n textureOptions,\n };\n }\n\n /**\n * 创建漫反射纹理\n * @param engine - 引擎\n * @param params - 天空盒参数\n * @returns 纹理或未定义\n */\n static async createDiffuseCubeMap (engine: Engine, params: PSkyboxParams): Promise<Texture | null> {\n if (params.diffuseImage === undefined) { return null; }\n\n if (params.type === 'url') {\n return WebGLHelper.createTextureCubeFromURL(engine, params.diffuseImage);\n } else {\n return WebGLHelper.createTextureCubeFromBuffer(engine, params.diffuseImage);\n }\n }\n\n static getDiffuseCubeMapData (params: PSkyboxParams) {\n if (params.diffuseImage === undefined) {\n return;\n }\n\n const imageDatas: spec.Image[] = [];\n const cubemap: spec.DataPath[] = [];\n\n params.diffuseImage.forEach(image => {\n const imageId = generateGUID();\n\n imageDatas.push({\n id: imageId,\n // @ts-expect-error\n url: image,\n });\n cubemap.push({ id: imageId });\n });\n\n const textureOptions: TextureSourceOptions = {\n id: generateGUID(),\n dataType: spec.DataType.Texture,\n sourceType: TextureSourceType.mipmaps,\n target: glContext.TEXTURE_CUBE_MAP,\n // @ts-expect-error\n mipmaps: [cubemap],\n ...WebGLHelper.cubemapTexConfig,\n };\n\n return {\n images: imageDatas,\n textureOptions,\n };\n }\n\n /**\n * 创建天空盒参数\n * @param skyboxType - 天空盒类型\n * @returns 天空盒参数\n */\n static getSkyboxParams (skyboxType = PSkyboxType.NFT): PSkyboxURLParams {\n const specularImage = this.getSpecularImageList(skyboxType);\n const params: PSkyboxURLParams = {\n type: 'url',\n renderable: true,\n intensity: 1.8,\n reflectionsIntensity: 1.8,\n irradianceCoeffs: this.getIrradianceCoeffs(skyboxType),\n diffuseImage: this.getDiffuseImageList(skyboxType, specularImage),\n specularImage: specularImage,\n specularImageSize: Math.pow(2, specularImage.length - 1),\n specularMipCount: specularImage.length,\n };\n\n return params;\n }\n\n // TODO: 待移除?\n private async checkCubeMapImage (imageList: string[]) {\n let lastImage!: HTMLImageElement;\n const specularImageLists: HTMLImageElement[][] = [];\n\n for (let i = 0; i < imageList.length; i++) {\n const image = await loadImage(imageList[i]);\n\n if (i > 0) {\n if (i % 6 === 0) {\n if (image.width * 2 !== lastImage.width || image.height * 2 !== lastImage.height) {\n throw new Error(`Invalid cube map list1: index ${i}, image0 ${lastImage}, image1 ${image}.`);\n }\n } else {\n if (image.width !== lastImage.width || image.height !== lastImage.height) {\n throw new Error(`Invalid cube map list2: index ${i}, image0 ${lastImage}, image1 ${image}.`);\n }\n }\n }\n if (i % 6 === 0) { specularImageLists.push([]); }\n const lastList = specularImageLists[specularImageLists.length - 1];\n\n lastList.push(image);\n lastImage = image;\n }\n }\n\n private static getIrradianceCoeffs (skyboxType: PSkyboxType): number[] | undefined {\n let dataArray: number[] = [];\n\n switch (skyboxType) {\n case PSkyboxType.NFT: {\n return undefined;\n }\n case PSkyboxType.FARM: dataArray = [\n 0.2665672302246094, 0.27008703351020813, 0.2836797833442688, -0.15421263873577118, -0.15587495267391205,\n -0.16371899843215942, 0.06483837962150574, 0.06468029320240021, 0.06616337597370148, -0.11598809063434601,\n -0.11796595901250839, -0.1261979341506958, 0.023678265511989594, 0.02456280030310154, 0.02591511607170105,\n -0.032404184341430664, -0.03217344358563423, -0.03126845508813858, 0.009165619499981403, 0.009345818310976028,\n 0.008521141484379768, -0.021998587995767593, -0.02203795686364174, -0.021759089082479477, 0.00046658870996907353,\n 0.0005610908847302198, 0.0007202711421996355,\n ];\n\n break;\n default: dataArray = [\n 0.37462672591209412, 0.35230118036270142, 0.33955901861190796, 0.12082185596227646, 0.18179306387901306,\n 0.26912716031074524, -0.020699946209788322, -0.0046484274789690971, 0.00797625258564949, -0.068421706557273865,\n -0.051390238106250763, -0.03317255899310112, 0.044127799570560455, 0.028159862384200096, 0.0074287452735006809,\n 0.078870773315429688, 0.067734844982624054, 0.047382339835166931, -0.012322401627898216, -0.015187464654445648,\n -0.020201763138175011, -0.1091032400727272, -0.0823250338435173, -0.046844951808452606, -0.057797044515609741,\n -0.066892541944980621, -0.08212742954492569,\n ];\n\n break;\n }\n\n return dataArray;\n }\n\n private static getDiffuseImageList (skyboxType: PSkyboxType, images: string[][]): string[] | undefined {\n if (skyboxType == PSkyboxType.NFT) {\n return images[images.length - 1];\n }\n\n return undefined;\n }\n\n private static getSpecularImageList (skyboxType: PSkyboxType): string[][] {\n const imageList: string[] = [];\n\n switch (skyboxType) {\n case PSkyboxType.FARM: imageList.push(...this.getSpecularImageListAntFarm());\n\n break;\n default: imageList.push(...this.getSpecularImageListNFT());\n\n break;\n }\n\n const levelList: string[][] = [];\n\n imageList.forEach((v, i) => {\n if (i % 6 === 0) {\n levelList.push([]);\n }\n const currentLevel = levelList[levelList.length - 1];\n\n currentLevel.push(v);\n });\n\n return levelList;\n }\n\n private static getSpecularImageListNFT (): string[] {\n return [\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img0.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img1.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img2.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img3.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img5.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img4.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img6.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img7.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img8.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img9.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img11.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img10.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img12.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img13.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img14.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img15.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img17.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img16.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img18.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img19.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img20.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img21.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img23.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img22.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img24.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img25.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img26.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img27.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img29.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img28.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img30.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img31.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img32.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img33.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img35.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img34.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img36.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img37.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img38.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img39.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img41.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img40.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img42.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img43.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img44.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img45.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img47.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/1656063861448/227da6e6-8d07-4f8b-bbb0-3b22fde48c0b_img46.png',\n ];\n }\n\n private static getSpecularImageListAntFarm (): string[] {\n return [\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_32_0.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_32_1.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_32_2.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_32_3.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_32_4.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_32_5.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_16_0.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_16_1.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_16_2.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_16_3.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_16_4.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_16_5.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_8_0.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_8_1.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_8_2.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_8_3.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_8_4.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_8_5.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_4_0.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_4_1.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_4_2.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_4_3.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_4_4.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_4_5.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_2_0.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_2_1.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_2_2.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_2_3.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_2_4.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_2_5.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_1_0.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_1_1.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_1_2.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_1_3.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_1_4.png',\n 'https://gw.alipayobjects.com/zos/gltf-asset/58741584603363/M_Cubemap_1_5.png',\n ];\n }\n}\n\n","import type { Mesh, Geometry, TextureSourceOptions, RenderPass, spec, Engine } from '@galacean/effects';\nimport { Texture } from '@galacean/effects';\nimport type { ModelSkyboxOptions } from '../index';\nimport type { PMaterialBase } from './material';\nimport type { PSkyboxParams } from './skybox';\nimport { PSkyboxCreator } from './skybox';\nimport { WebGLHelper, MeshHelper, PluginHelper } from '../utility/plugin-helper';\n\n/**\n * 合成缓存类,负责管理插件 WebGL 相关资源加载和创建\n */\nexport class CompositionCache {\n // TODO: 待移除?\n private loadSkybox = false;\n // 天空盒依赖的贴图资源\n private brdfLutTexture?: Texture;\n //\n private meshCache: Map<string, Mesh>;\n private textureCache: Map<string, Texture>;\n private geometryCache: Map<string, Geometry>;\n private renderPassCache: Map<string, RenderPass>;\n //\n private static brdfLutTexOptions?: TextureSourceOptions;\n private static skyboxOptions?: ModelSkyboxOptions;\n\n /**\n * 加载静态的纹理数据\n * @returns\n */\n static async loadStaticResources () {\n if (this.brdfLutTexOptions !== undefined) {\n // 避免重复创建\n return;\n }\n\n this.brdfLutTexOptions = await PSkyboxCreator.getBrdfLutTextureOptions();\n }\n\n /**\n * 创建天空盒数据,如果传入的 params 为空,会使用内置的天空盒参数\n * @param engine - 引擎\n * @param params - 天空盒参数\n * @returns 天空盒数据\n */\n static async genSkyboxOptions (engine: Engine, params?: PSkyboxParams): Promise<ModelSkyboxOptions> {\n let newParams = params;\n\n if (newParams === undefined) {\n newParams = PSkyboxCreator.getSkyboxParams();\n }\n\n CompositionCache.skyboxOptions = await PSkyboxCreator.createSkyboxOptions(engine, newParams);\n\n return CompositionCache.skyboxOptions;\n }\n\n constructor (private engine: Engine) {\n this.meshCache = new Map();\n this.textureCache = new Map();\n this.geometryCache = new Map();\n this.renderPassCache = new Map();\n }\n\n /**\n * 记录是否加载天空盒,缓存天空盒相关的查询纹理\n * @param loadSkybox - 是否加载天空盒\n */\n setup (loadSkybox: boolean) {\n this.loadSkybox = loadSkybox;\n\n if (this.brdfLutTexture === undefined || this.brdfLutTexture.isDestroyed) {\n if (CompositionCache.brdfLutTexOptions === undefined) {\n throw new Error('Please load brdfLutTexOptions at first.');\n }\n //\n const brdfLutTextureName = 'brdfLutTexture';\n\n this.brdfLutTexture = Texture.create(this.engine, CompositionCache.brdfLutTexOptions);\n this.deleteTexture(brdfLutTextureName);\n this.setTexture(brdfLutTextureName, this.brdfLutTexture);\n }\n }\n\n /**\n * 获取缓存的纹理对象\n * @param name - 名称\n * @returns 纹理对象\n */\n getTexture (name: string): Texture | undefined {\n return this.textureCache.get(name);\n }\n\n /**\n * 设置纹理对象缓存\n * @param name - 名称\n * @param tex - 纹理对象\n */\n setTexture (name: string, tex: Texture) {\n this.textureCache.set(name, tex);\n }\n\n /**\n * 获取或者创建纹理对象\n * @param name - 名称\n * @param options - 纹理参数\n * @returns 纹理对象\n */\n getOrCreateTexture (name: string, options: TextureSourceOptions): Texture {\n const tex = this.textureCache.get(name);\n\n if (tex !== undefined) {\n return tex;\n }\n const newTex = Texture.create(this.engine, options);\n\n this.textureCache.set(name, newTex);\n\n return newTex;\n }\n\n /**\n * 根据名称删除纹理对象\n * @param name - 名称\n * @returns 是否删除成功\n */\n deleteTexture (name: string): boolean {\n const tex = this.textureCache.get(name);\n\n if (tex !== undefined) {\n tex.dispose();\n }\n\n return this.textureCache.delete(name);\n }\n\n /**\n * 获取或者创建几何体\n * @param name - 名称\n * @param geomJson - 几何体参数\n * @param bins - 几何体数据\n * @returns 几何体\n */\n getOrCreateGeometry (name: string, geomJson: spec.GeometryOptionsJSON, bins: ArrayBuffer[]): Geometry {\n const cachedGeom = this.geometryCache.get(name);\n\n if (cachedGeom !== undefined) {\n return cachedGeom;\n }\n\n const geom = PluginHelper.createGeometry(this.engine, geomJson, bins);\n\n this.geometryCache.set(name, geom);\n\n return geom;\n }\n\n /**\n * 获取滤波 Mesh\n * @param name - 名称\n * @param material - 材质\n * @returns\n */\n getFilterMesh (name: string, material: PMaterialBase): Mesh {\n const cachedMesh = this.meshCache.get(name);\n\n if (cachedMesh !== undefined) {\n return cachedMesh;\n }\n\n const mesh = MeshHelper.createFilterMesh(this.engine, name, material);\n\n this.meshCache.set(name, mesh);\n\n return mesh;\n }\n\n /**\n * 销毁缓存,释放所有缓存的对象\n */\n dispose () {\n // @ts-expect-error\n this.engine = null;\n this.brdfLutTexture = undefined;\n this.meshCache.forEach(mesh => {\n WebGLHelper.deleteMesh(mesh);\n });\n this.meshCache.clear();\n //\n this.textureCache.forEach(texture => {\n WebGLHelper.deleteTexture(texture);\n });\n this.textureCache.clear();\n //\n this.geometryCache.forEach(geometry => {\n WebGLHelper.deleteGeometry(geometry);\n });\n this.geometryCache.clear();\n //\n this.renderPassCache.forEach(pass => {\n WebGLHelper.deleteRenderPass(pass);\n });\n this.renderPassCache.clear();\n }\n\n /**\n * 获取所有的渲染 Pass\n * @returns\n */\n getRenderPasses (): RenderPass[] {\n const resList: RenderPass[] = [];\n\n this.renderPassCache.forEach(pass => {\n resList.push(pass);\n });\n\n return resList;\n }\n\n /**\n * 获取纹理对象,用户 IBL 渲染\n * @returns\n */\n getBrdfLutTexture (): Texture | undefined {\n return this.brdfLutTexture;\n }\n\n /**\n * 获取天空盒参数\n * @returns\n */\n getSkyboxOptions (): ModelSkyboxOptions | undefined {\n return CompositionCache.skyboxOptions;\n }\n}\n\n","import type { math } from '@galacean/effects';\nimport { spec } from '@galacean/effects';\nimport type { ModelCameraComponentData } from '../index';\nimport { Vector2, Vector3, Matrix4 } from './math';\nimport { PObjectType } from './common';\nimport { PEntity } from './object';\nimport type { ModelCameraComponent } from '../plugin/model-item';\n\ntype Box3 = math.Box3;\ntype Quaternion = math.Quaternion;\n\nconst deg2rad = Math.PI / 180;\n\n/**\n * 相机类,支持基础的相机功能\n */\nexport class PCamera extends PEntity {\n /**\n * 所属的相机组件\n */\n owner?: ModelCameraComponent;\n /**\n * 画布宽度\n */\n width = 512;\n /**\n * 画布高度\n */\n height = 512;\n /**\n * 近裁剪平面\n */\n nearPlane = 0.001;\n /**\n * 远裁剪平面\n */\n farPlane = 1000;\n /**\n * Y 轴上视角\n */\n fov = 45;\n /**\n * 视图矩阵\n */\n viewportMatrix = Matrix4.fromIdentity();\n /**\n * 纵横比\n */\n aspect = 1.0;\n /**\n * 剪裁模式,默认是剪裁左右\n */\n clipMode = spec.CameraClipMode.landscape;\n /**\n * 投影矩阵\n */\n projectionMatrix: Matrix4 = new Matrix4();\n /**\n * 相机矩阵\n */\n viewMatrix: Matrix4 = new Matrix4();\n\n /**\n * 构造函数,创建相机对象\n * @param camera - 相机数据\n * @param width - 画布宽度\n * @param height - 画布高度\n * @param owner - 所属的相机组件\n */\n constructor (name: string, width: number, height: number, data: ModelCameraComponentData, owner?: ModelCameraComponent) {\n super();\n this.type = PObjectType.camera;\n this.visible = false;\n this.owner = owner;\n //\n this.name = name;\n this.width = width;\n this.height = height;\n\n this.nearPlane = data.near ?? 0.001;\n this.farPlane = data.far ?? 1000;\n this.fov = data.fov ?? 45;\n this.aspect = data.aspect ?? (this.width / this.height);\n this.clipMode = data.clipMode ?? spec.CameraClipMode.landscape;\n this.update();\n }\n\n /**\n * 更新相机矩阵和投影矩阵,从所属的元素中获取变换数据\n */\n override update () {\n if (this.owner !== undefined) {\n this.transform.fromEffectsTransform(this.owner.transform);\n }\n\n const reverse = this.clipMode === spec.CameraClipMode.portrait;\n\n this.projectionMatrix.perspective(this.fov * deg2rad, this.aspect, this.nearPlane, this.farPlane, reverse);\n this.projectionMatrix.premultiply(this.viewportMatrix);\n this.viewMatrix = this.matrix.invert();\n }\n\n /**\n * 获取新的透视矩阵,视角大小乘 1.25 倍\n * @param fov - 视角大小\n * @returns 投影矩阵\n */\n getNewProjectionMatrix (fov: number): Matrix4 {\n const reverse = this.clipMode === spec.CameraClipMode.portrait;\n\n return new Matrix4().perspective(Math.min(fov * 1.25, 140) * deg2rad, this.aspect, this.nearPlane, this.farPlane, reverse).premultiply(this.viewportMatrix);\n }\n\n /**\n * 计算视角中的包围盒大小\n * @param box - 包围盒\n * @returns 视角中的包围盒\n */\n computeViewAABB (box: Box3): Box3 {\n const tanTheta = Math.tan(this.fov * deg2rad * 0.5);\n const aspect = this.aspect;\n let yFarCoord = 0;\n let yNearCoord = 0;\n let xFarCoord = 0;\n let xNearCoord = 0;\n\n if (this.isReversed()) {\n xFarCoord = this.farPlane * tanTheta;\n xNearCoord = this.nearPlane * tanTheta;\n yFarCoord = xFarCoord / aspect;\n yNearCoord = xNearCoord / aspect;\n } else {\n yFarCoord = this.farPlane * tanTheta;\n yNearCoord = this.nearPlane * tanTheta;\n xFarCoord = aspect * yFarCoord;\n xNearCoord = aspect * yNearCoord;\n }\n\n box.makeEmpty();\n const matrix = this.matrix;\n\n box.expandByPoint(matrix.transformPoint(new Vector3(xFarCoord, yFarCoord, -this.farPlane)));\n box.expandByPoint(matrix.transformPoint(new Vector3(xFarCoord, -yFarCoord, -this.farPlane)));\n box.expandByPoint(matrix.transformPoint(new Vector3(-xFarCoord, yFarCoord, -this.farPlane)));\n box.expandByPoint(matrix.transformPoint(new Vector3(-xFarCoord, -yFarCoord, -this.farPlane)));\n //\n box.expandByPoint(matrix.transformPoint(new Vector3(xNearCoord, yNearCoord, -this.nearPlane)));\n box.expandByPoint(matrix.transformPoint(new Vector3(xNearCoord, -yNearCoord, -this.nearPlane)));\n box.expandByPoint(matrix.transformPoint(new Vector3(-xNearCoord, yNearCoord, -this.nearPlane)));\n box.expandByPoint(matrix.transformPoint(new Vector3(-xNearCoord, -yNearCoord, -this.nearPlane)));\n\n return box;\n }\n\n /**\n * 获取画布大小\n * @returns\n */\n getSize (): Vector2 {\n return new Vector2(this.width, this.height);\n }\n\n /**\n * 是否剪裁上下\n * @returns\n */\n isReversed (): boolean {\n return this.clipMode === spec.CameraClipMode.portrait;\n }\n\n /**\n * 获取眼睛位置\n * @returns\n */\n getEye (): Vector3 {\n return this.translation;\n }\n\n /**\n * 设置眼睛位置\n * @param val - 眼睛位置\n */\n setEye (val: Vector3) {\n this.translation = val;\n }\n}\n\n/**\n * 相机管理类,负责管理场景中的 3D 相机对象\n */\nexport class PCameraManager {\n private winWidth = 512;\n private winHeight = 512;\n private cameraList: PCamera[] = [];\n private defaultCamera;\n\n constructor () {\n this.defaultCamera = new PCamera(\n 'camera', 512, 512,\n {\n id: '0',\n dataType: 'camera' as spec.DataType,\n fov: 60,\n far: 1000,\n near: 0.001,\n clipMode: spec.CameraClipMode.portrait,\n item: { id: '0' },\n },\n );\n }\n\n /**\n * 初始化画布大小,更新默认相机\n * @param width - 画布宽度\n * @param height - 画布高度\n */\n initial (width: number, height: number) {\n this.winWidth = width;\n this.winHeight = height;\n\n const camera = this.defaultCamera;\n\n camera.width = width;\n camera.height = height;\n camera.aspect = width / height;\n camera.update();\n }\n\n /**\n * 插入相机数据,创建新的相机对象\n * @param name - 相机名称\n * @param data - 相机相关数据\n * @param owner - 相机所属组件\n * @returns 新的相机对象\n */\n insert (name: string, data: ModelCameraComponentData, owner?: ModelCameraComponent): PCamera {\n const camera = new PCamera(name, this.winWidth, this.winHeight, data, owner);\n\n this.cameraList.push(camera);\n\n return camera;\n }\n\n /**\n * 插入相机对象\n * @param camera - 相机对象\n */\n insertCamera (camera: PCamera) {\n this.cameraList.push(camera);\n }\n\n /**\n * 根据对象或者索引,删除相机对象\n * @param camera - 索引或相机对象\n */\n remove (camera: PCamera | number) {\n if (camera instanceof PCamera) {\n const findResult = this.cameraList.findIndex(item => {\n return item === camera;\n });\n\n if (findResult !== -1) {\n this.cameraList.splice(findResult, 1);\n }\n } else {\n if (camera >= 0 && camera < this.cameraList.length) {\n this.cameraList.splice(camera, 1);\n }\n }\n }\n\n /**\n * 销毁相机管理对象\n */\n dispose () {\n this.cameraList = [];\n }\n\n /**\n * 更新默认相机状态,并计算新的透视和相机矩阵\n * @param fov - 视角\n * @param viewportMatrix - 视图矩阵\n * @param aspect - 纵横比\n * @param nearPlane - 近裁剪平面\n * @param farPlane - 远裁剪平面\n * @param position - 位置\n * @param rotation - 旋转\n * @param clipMode - 剪裁模式\n */\n updateDefaultCamera (\n fov: number,\n viewportMatrix: Matrix4,\n aspect: number,\n nearPlane: number,\n farPlane: number,\n position: Vector3,\n rotation: Quaternion,\n clipMode: number,\n ) {\n this.defaultCamera.fov = fov;\n this.defaultCamera.viewportMatrix = viewportMatrix.clone();\n this.defaultCamera.aspect = aspect;\n this.defaultCamera.nearPlane = nearPlane;\n this.defaultCamera.farPlane = farPlane;\n this.defaultCamera.position = position;\n this.defaultCamera.rotation = rotation;\n this.defaultCamera.aspect = aspect;\n this.defaultCamera.clipMode = clipMode;\n this.defaultCamera.update();\n }\n\n /**\n * 获取相机对象列表\n * @returns\n */\n getCameraList (): PCamera[] {\n return this.cameraList;\n }\n\n /**\n * 获取默认相机对象\n * @returns\n */\n getDefaultCamera (): PCamera {\n return this.defaultCamera;\n }\n\n /**\n * 获取相机数目\n * @returns\n */\n getCameraCount (): number {\n return this.cameraList.length;\n }\n\n /**\n * 获取激活的相机对象\n * @returns\n */\n getActiveCamera (): PCamera {\n return this.defaultCamera;\n }\n\n /**\n * 获取画布纵横比\n * @returns\n */\n getAspect (): number {\n return this.winWidth / this.winHeight;\n }\n}\n\n","import { spec } from '@galacean/effects';\nimport type { ModelLightComponentData } from '../index';\nimport { Vector2, Vector3 } from './math';\nimport { PObjectType, PLightType } from './common';\nimport { PEntity } from './object';\nimport type { ModelLightComponent } from '../plugin/model-item';\n\n/**\n * 灯光类,支持 3D 场景中的灯光功能\n */\nexport class PLight extends PEntity {\n /**\n * 所属的灯光组件\n */\n owner?: ModelLightComponent;\n /**\n * 方向,仅用于方向光和聚光灯\n */\n direction: Vector3 = new Vector3(0, 0, 1);\n /**\n * 范围,仅用于点光源和聚光灯\n */\n range = 0;\n /**\n * 颜色\n */\n color: Vector3 = new Vector3(1, 1, 1);\n /**\n * 强度\n */\n intensity = 0;\n /**\n * 聚光灯外径\n */\n outerConeAngle = 0;\n /**\n * 聚光灯内径\n */\n innerConeAngle = 0;\n /**\n * 类型\n */\n lightType = PLightType.ambient;\n padding: Vector2 = new Vector2(0, 0);\n /**\n * 是否跟随相机\n */\n followCamera = false;\n\n /**\n * 创建灯光对象\n * @param name - 灯光名称\n * @param data - 灯光相关数据\n * @param owner - 所属灯光组件\n */\n constructor (name: string, data: ModelLightComponentData, owner?: ModelLightComponent) {\n super();\n this.name = name;\n this.type = PObjectType.light;\n this.visible = false;\n this.owner = owner;\n this.direction = new Vector3(0, 0, -1);\n this.range = 0;\n this.outerConeAngle = 0;\n this.innerConeAngle = 0;\n //\n const { color } = data;\n\n this.color = new Vector3(\n color.r,\n color.g,\n color.b,\n );\n this.intensity = data.intensity;\n this.followCamera = data.followCamera ?? false;\n if (data.lightType === spec.LightType.point) {\n this.lightType = PLightType.point;\n this.range = data.range ?? -1;\n } else if (data.lightType === spec.LightType.spot) {\n this.lightType = PLightType.spot;\n this.range = data.range ?? -1;\n this.outerConeAngle = data.outerConeAngle ?? Math.PI;\n this.innerConeAngle = data.innerConeAngle ?? 0;\n } else if (data.lightType === spec.LightType.directional) {\n this.lightType = PLightType.directional;\n } else {\n this.lightType = PLightType.ambient;\n }\n this.update();\n }\n\n /**\n * 更新灯光变换\n */\n override update () {\n if (this.owner !== undefined) {\n this.transform.fromEffectsTransform(this.owner.transform);\n }\n }\n\n /**\n * 是否方向光\n * @returns\n */\n isDirectional (): boolean {\n return this.lightType === PLightType.directional;\n }\n\n /**\n * 是否点光源\n * @returns\n */\n isPoint (): boolean {\n return this.lightType === PLightType.point;\n }\n\n /**\n * 是否聚光灯\n * @returns\n */\n isSpot (): boolean {\n return this.lightType === PLightType.spot;\n }\n\n /**\n * 是否环境光\n * @returns\n */\n isAmbient (): boolean {\n return this.lightType === PLightType.ambient;\n }\n\n /**\n * 获取位置\n */\n override get position (): Vector3 {\n return this.translation;\n }\n\n /**\n * 获取世界坐标中的位置\n * @returns\n */\n getWorldPosition (): Vector3 {\n return this.translation;\n }\n\n /**\n * 获取世界坐标中的方向\n * @returns\n */\n getWorldDirection (): Vector3 {\n return this.matrix.transformNormal(this.direction, new Vector3());\n }\n}\n\n/**\n * 灯光管理类,负责 3D 场景灯光的管理\n */\nexport class PLightManager {\n /**\n * 灯光数组\n */\n lightList: PLight[] = [];\n\n constructor () {\n\n }\n /**\n * 通过灯光参数,创建灯光对象,并保存到灯光数组中\n * @param inLight - 灯光参数\n * @param owner - 所属灯光组件\n * @returns 插入的灯光对象\n */\n insertItem (name: string, inLight: ModelLightComponentData, owner?: ModelLightComponent): PLight {\n const light = new PLight(name, inLight, owner);\n\n this.lightList.push(light);\n\n return light;\n }\n\n /**\n * 插入灯光对象\n * @param inLight - 灯光对象\n * @returns 插入的灯光对象\n */\n insertLight (inLight: PLight): PLight {\n this.lightList.push(inLight);\n\n return inLight;\n }\n\n /**\n * 删除灯光对象,从灯光数组中查找对象并进行删除,如果没有找到就忽略\n * @param inLight - 删除的灯光对象\n */\n remove (inLight: PLight) {\n const findResult = this.lightList.findIndex(item => {\n return item === inLight;\n });\n\n if (findResult !== -1) {\n this.lightList.splice(findResult, 1);\n }\n }\n\n /**\n * 销毁\n */\n dispose () {\n this.lightList = [];\n }\n\n /**\n * 灯光数目\n */\n get lightCount (): number {\n return this.lightList.length;\n }\n\n}\n\n","import type { Texture, Engine, math, VFXItem, Renderer, Geometry } from '@galacean/effects';\nimport { spec, Material, GLSLVersion } from '@galacean/effects';\nimport type { ModelMeshComponentData, ModelItemBounding } from '../index';\nimport { PObjectType, PMaterialType, PGlobalState } from './common';\nimport { PEntity } from './object';\nimport type { PMaterial } from './material';\nimport { PMaterialPBR, PMaterialUnlit, createPluginMaterial } from './material';\nimport { Matrix4, Vector3, Box3, Vector2 } from './math';\nimport { PSkin, PAnimTexture, PMorph, TextureDataMode } from './animation';\nimport type { PSceneManager, PSceneStates } from './scene';\nimport type { PSkybox } from './skybox';\nimport { GeometryBoxProxy, HitTestingProxy } from '../utility/plugin-helper';\nimport { BoxMesh } from '../utility/ri-helper';\nimport { RayBoxTesting } from '../utility/hit-test-helper';\nimport type { ModelMeshComponent } from '../plugin/model-item';\n\ntype Box3 = math.Box3;\n\n/**\n * Mesh 类,负责 Mesh 相关的骨骼动画和 PBR 渲染\n */\nexport class PMesh extends PEntity {\n /**\n * 所属的 Mesh 组件\n */\n owner?: ModelMeshComponent;\n /**\n * 父节点索引\n */\n parentIndex = -1;\n /**\n * 父元素\n */\n parentItem?: VFXItem;\n /**\n * 父元素索引\n */\n parentItemId?: string;\n rootBoneItem?: VFXItem;\n /**\n * 蒙皮\n */\n skin?: PSkin;\n /**\n * morph 动画状态数据,主要是 weights 数组\n */\n morph?: PMorph;\n /**\n * primitive 对象数组\n */\n subMeshes: PSubMesh[] = [];\n /**\n * 是否隐藏,默认是隐藏\n */\n hide = true;\n /**\n * 优先级\n */\n priority = 0;\n /**\n * 包围盒\n */\n boundingBox: Box3 = new Box3();\n /**\n * 是否显示包围盒\n */\n visBoundingBox = false;\n /**\n * 包围盒 Mesh\n */\n boundingBoxMesh?: BoxMesh;\n /**\n * 是否调用 Build\n */\n isBuilt = false;\n /**\n * 是否销毁\n */\n isDisposed = false;\n\n /**\n * 构造函数,创建 Mesh 对象,并与所属组件和父元素相关联\n * @param engine - 引擎\n * @param name - 名称\n * @param meshData - Mesh 参数\n * @param owner - 所属的 Mesh 组件\n * @param parentId - 父元素索引\n * @param parent - 父元素\n */\n constructor (\n private engine: Engine,\n name: string,\n meshData: ModelMeshComponentData,\n owner: ModelMeshComponent,\n parentId?: string,\n parent?: VFXItem,\n ) {\n super();\n const proxy = new EffectsMeshProxy(meshData, owner, parent);\n\n this.name = name;\n this.type = PObjectType.mesh;\n this.visible = false;\n this.owner = owner;\n //\n this.parentIndex = proxy.getParentIndex();\n this.parentItem = proxy.parentItem;\n this.parentItemId = parentId;\n this.rootBoneItem = meshData.rootBone as unknown as VFXItem;\n this.skin = proxy.getSkinObj(engine);\n this.morph = proxy.getMorphObj();\n this.hide = proxy.isHide();\n this.priority = owner?.item?.renderOrder || 0;\n //\n this.subMeshes = [];\n const geometry = proxy.getGeometry() as unknown as Geometry;\n const materials = owner?.materials ?? [];\n\n materials.forEach(material => {\n const subMesh = new PSubMesh(this.engine);\n\n subMesh.create(geometry, material, this);\n this.subMeshes.push(subMesh);\n });\n\n if (this.subMeshes.length <= 0) {\n console.warn(`No primitive inside mesh item ${name}.`);\n }\n\n this.boundingBox = this.getItemBoundingBox(meshData.interaction);\n }\n\n /**\n * 创建 GE 的 Mesh、Geometry 和 Material 对象\n * @param scene - 场景管理器\n * @returns\n */\n build (scene: PSceneManager) {\n if (this.isBuilt) {\n return;\n }\n\n this.isBuilt = true;\n this.subMeshes.forEach(prim => {\n prim.build(scene.maxLightCount, scene.skybox);\n });\n\n if (PGlobalState.getInstance().visBoundingBox) {\n this.boundingBoxMesh = new BoxMesh(this.engine, this.priority);\n }\n }\n\n /**\n * 更新变换数据和蒙皮数据\n */\n override update () {\n if (this.owner !== undefined) {\n this.transform.fromEffectsTransform(this.owner.transform);\n\n if (this.morph && this.morph.hasMorph() && this.owner.morphWeights.length > 0) {\n this.morph.updateWeights(this.owner.morphWeights);\n }\n }\n }\n\n /**\n * 更新骨骼动画\n */\n lateUpdate () {\n this.skin?.updateSkinMatrices();\n }\n\n /**\n * 渲染 Mesh 对象,需要将内部相关数据传给渲染器\n * @param scene - 场景\n * @param renderer - 渲染器\n */\n override render (scene: PSceneManager, renderer: Renderer) {\n this.updateMaterial(scene);\n\n this.subMeshes.forEach((subMesh, index) => {\n renderer.drawGeometry(\n subMesh.getEffectsGeometry(),\n this.matrix,\n subMesh.getEffectsMaterial(),\n index\n );\n });\n\n if (this.visBoundingBox && this.boundingBoxMesh !== undefined) {\n const mesh = this.boundingBoxMesh.mesh;\n\n renderer.drawGeometry(mesh.geometry, Matrix4.IDENTITY, mesh.material);\n }\n }\n\n /**\n * 销毁,需要主动释放蒙皮、morph 和 Mesh 等相关的对象\n * @returns\n */\n override dispose () {\n if (this.isDisposed) {\n return;\n }\n\n super.dispose();\n\n this.owner = undefined;\n this.isDisposed = true;\n // @ts-expect-error\n this.engine = null;\n this.parentItem = undefined;\n this.skin?.dispose();\n this.skin = undefined;\n this.morph?.dispose();\n this.morph = undefined;\n this.subMeshes.forEach(prim => {\n prim.dispose();\n });\n this.subMeshes = [];\n this.boundingBoxMesh?.dispose();\n this.boundingBoxMesh = undefined;\n }\n\n /**\n * 更新 Morph 动画权重\n * 每帧都会更新 Morph 动画权重,需要小心检查 Morph 动画参数\n * 对于数组长度对不上的情况,直接报错\n *\n * @param weightsArray - Morph 动画的权重数组\n */\n updateMorphWeights (weightsArray: Float32Array) {\n if (this.morph === undefined || !this.morph.hasMorph()) {\n return;\n }\n\n const updatedArray = this.morph.morphWeightsArray;\n\n if (updatedArray === undefined) {\n return;\n }\n\n if (updatedArray.length != weightsArray.length) {\n throw new Error('Weight array length mismatch.');\n }\n\n for (let i = 0; i < updatedArray.length; i++) {\n updatedArray[i] = weightsArray[i];\n }\n }\n\n /**\n * 更新父 VFX 元素\n * @param parentId - 父元素索引\n * @param parentItem - 父 VFX 元素\n */\n updateParentInfo (parentId: string, parentItem: VFXItem) {\n this.parentItemId = parentId;\n this.parentItem = parentItem;\n if (this.skin !== undefined) {\n this.skin.updateParentItem(parentItem);\n }\n }\n\n /**\n * 根据当前场景状态更新内部材质数据\n * @param scene - 场景管理器\n */\n updateMaterial (scene: PSceneManager) {\n const worldMatrix = this.matrix;\n const normalMatrix = worldMatrix.clone().invert().transpose();\n const sceneStates = scene.sceneStates;\n\n this.subMeshes.forEach(prim => {\n prim.updateMaterial(worldMatrix, normalMatrix, sceneStates);\n });\n\n if (this.boundingBoxMesh !== undefined) {\n this.computeBoundingBox(worldMatrix);\n const lineColor = new Vector3(1, 1, 1);\n const minPos = this.boundingBox.min;\n const maxPos = this.boundingBox.max;\n const positions = new Float32Array([\n minPos.x, minPos.y, minPos.z,\n maxPos.x, minPos.y, minPos.z,\n maxPos.x, maxPos.y, minPos.z,\n minPos.x, maxPos.y, minPos.z,\n\n minPos.x, minPos.y, maxPos.z,\n maxPos.x, minPos.y, maxPos.z,\n maxPos.x, maxPos.y, maxPos.z,\n minPos.x, maxPos.y, maxPos.z,\n ]);\n\n this.boundingBoxMesh.update(worldMatrix, sceneStates.viewProjectionMatrix, positions, lineColor);\n }\n }\n\n /**\n * 点击测试,对于编辑器模式会进行精准的点击测试,否则就和内部的包围盒进行测试\n * @param rayOrigin - 射线原点\n * @param rayDirection - 射线方向\n * @returns 交点列表\n */\n hitTesting (rayOrigin: Vector3, rayDirection: Vector3): Vector3[] {\n const worldMatrix = this.matrix;\n const invWorldMatrix = worldMatrix.clone().invert();\n const newOrigin = invWorldMatrix.transformPoint(rayOrigin, new Vector3());\n const newDirection = invWorldMatrix.transformNormal(rayDirection, new Vector3());\n\n const bounding = this.boundingBox;\n const boxt = RayBoxTesting(newOrigin, newDirection, bounding.min, bounding.max);\n\n if (boxt === undefined) {\n return [];\n }\n\n let mint: number | undefined;\n\n if (PGlobalState.getInstance().isEditorEnv) {\n this.subMeshes.forEach(prim => {\n const primt = prim.hitTesting(newOrigin, newDirection, worldMatrix, invWorldMatrix);\n\n if (primt !== undefined) {\n if (mint === undefined || mint > primt) {\n mint = primt;\n }\n }\n });\n } else {\n mint = boxt;\n }\n\n if (mint === undefined) {\n return [];\n }\n\n newDirection.multiply(mint);\n newOrigin.add(newDirection);\n worldMatrix.transformPoint(newOrigin);\n\n return [newOrigin];\n }\n\n /**\n * 计算包围盒,根据传入的世界矩阵\n * @param worldMatrix - 世界矩阵\n * @returns\n */\n computeBoundingBox (worldMatrix: Matrix4): Box3 {\n const box = this.boundingBox.makeEmpty();\n const inverseWorldMatrix = worldMatrix.clone().invert();\n\n this.subMeshes.forEach(prim => {\n const subbox = prim.computeBoundingBox(inverseWorldMatrix);\n\n box.union(subbox);\n });\n\n return box;\n }\n\n private getItemBoundingBox (inBounding?: ModelItemBounding) {\n if (inBounding === undefined) {\n return new Box3();\n }\n\n if (inBounding.type === spec.ModelBoundingType.box) {\n const center = inBounding.center ?? [0, 0, 0];\n const size = inBounding.size ?? [0, 0, 0];\n const c = Vector3.fromArray(center);\n const hs = Vector3.fromArray(size).multiply(0.5);\n const minVector = c.clone().subtract(hs);\n const maxVector = c.clone().add(hs);\n\n return new Box3(minVector, maxVector);\n } else {\n const center = inBounding.center ?? [0, 0, 0];\n const halfRadius = (inBounding.radius ?? 0) * 0.5;\n const c = Vector3.fromArray(center);\n const minVector = c.clone().subtract(halfRadius);\n const maxVector = c.clone().add(halfRadius);\n\n return new Box3(minVector, maxVector);\n }\n }\n\n /**\n * 获取父节点 id\n * @returns\n */\n getParentId (): string | undefined {\n return this.parentItemId;\n }\n\n /**\n * 是否有蒙皮\n */\n get hasSkin (): boolean {\n return this.skin !== undefined;\n }\n\n}\n\n/**\n * PSubMesh 类,负责 Sub Mesh相关的功能,支持骨骼动画和 PBR 渲染\n */\nexport class PSubMesh {\n /**\n * 宿主 Mesh,包含了当前 Primitive\n */\n private parent?: PMesh;\n private skin?: PSkin; // from owner mesh\n /**\n * Morph 动画状态数据,来自 Mesh 对象,这里不创建不删除\n */\n private morph?: PMorph;\n private geometry: PGeometry;\n private material: PMaterial;\n //\n private jointMatrixList?: Float32Array;\n private jointNormalMatList?: Float32Array;\n private jointMatrixTexture?: PAnimTexture;\n private jointNormalMatTexture?: PAnimTexture;\n /**\n * 名称\n */\n name = '';\n /**\n * 渲染优先级\n */\n effectsPriority = 0;\n /**\n * 包围盒\n */\n boundingBox = new Box3();\n /**\n * 是否压缩,模式不压缩\n */\n isCompressed = false;\n\n constructor (private engine: Engine) {\n\n }\n\n /**\n * 创建 Primitive 对象\n * @param data - Primitive 参数\n * @param parent - 所属 Mesh 对象\n */\n create (geometry: Geometry, material: Material, parent: PMesh) {\n this.parent = parent;\n this.skin = parent.skin;\n this.morph = parent.morph;\n this.setGeometry(geometry);\n this.setMaterial(material);\n this.name = parent.name;\n this.effectsPriority = parent.priority;\n this.geometry.setHide(parent.hide);\n\n if (this.skin !== undefined) {\n const jointCount = this.skin.maxJointCount;\n\n this.jointMatrixList = new Float32Array(jointCount * 16);\n this.jointNormalMatList = new Float32Array(jointCount * 16);\n if (this.skin.isTextureDataMode()) {\n const isHalfFloat = this.skin.textureDataMode === TextureDataMode.half_float;\n\n this.jointMatrixTexture = new PAnimTexture(this.engine);\n this.jointNormalMatTexture = new PAnimTexture(this.engine);\n this.jointMatrixTexture.create(jointCount, isHalfFloat, 'jointMatrixTexture');\n this.jointNormalMatTexture.create(jointCount, isHalfFloat, 'jointNormalMatTexture');\n }\n } else {\n if (this.geometry.hasWeights() || this.geometry.hasJoints()) {\n // 最近出现发布后模型动画没播出来问题,\n // 是因为导出后 skin 属性丢失导致,所以增加这个检查\n console.warn('Geometry has weight and/or joint array, but the skin is missing.');\n }\n }\n\n this.isCompressed = this.geometry.isCompressed();\n\n //if (PGlobalState.getInstance().isTiny3dMode) {\n // if (this._material.isAdditive || this._material.isTranslucent()) { this.mriPriority += 10000; }\n //}\n }\n\n /**\n * 创建 GE Mesh、Geometry 和 Material 对象,用于后面的渲染\n * @param lightCount - 灯光数目\n * @param skybox - 天空盒\n */\n build (lightCount: number, skybox?: PSkybox) {\n const globalState = PGlobalState.getInstance();\n const primitiveMacroList = this.getMacroList(lightCount, true, skybox);\n const materialMacroList = this.material.getMacroList(primitiveMacroList);\n\n let material: Material;\n const isWebGL2 = PGlobalState.getInstance().isWebGL2;\n\n if (this.material.effectMaterial) {\n material = this.material.effectMaterial;\n\n materialMacroList.forEach(macro => {\n const { name, value } = macro;\n\n material.enableMacro(name, value);\n });\n\n this.material.setMaterialStates(material);\n } else {\n material = Material.create(\n this.engine,\n {\n shader: {\n vertex: this.material.vertexShaderCode,\n fragment: this.material.fragmentShaderCode,\n shared: globalState.shaderShared,\n glslVersion: isWebGL2 ? GLSLVersion.GLSL3 : GLSLVersion.GLSL1,\n },\n }\n );\n this.material.setMaterialStates(material);\n }\n }\n\n // TODO: 待移除?\n private getFeatureList (lightCount: number, pbrPass: boolean, skybox?: PSkybox): string[] {\n const featureList: string[] = [];\n\n if (this.geometry.hasNormals()) {\n featureList.push('HAS_NORMALS 1');\n }\n if (this.geometry.hasTangents()) {\n featureList.push('HAS_TANGENTS 1');\n }\n if (this.geometry.hasUVCoords(1)) {\n featureList.push('HAS_UV_SET1 1');\n }\n if (this.geometry.hasUVCoords(2)) {\n featureList.push('HAS_UV_SET2 1');\n }\n\n if (this.morph !== undefined && this.morph.hasMorph()) {\n // 存在 Morph 动画,需要配置 Morph 动画相关的 Shader 宏定义\n // USE_MORPHING 是总开关,WEIGHT_COUNT 是 weights 数组长度(Shader)\n featureList.push('USE_MORPHING');\n featureList.push(`WEIGHT_COUNT ${this.morph.morphWeightsLength}`);\n for (let i = 0; i < this.morph.morphWeightsLength; i++) {\n if (this.morph.hasPositionMorph) {\n featureList.push(`HAS_TARGET_POSITION${i}`);\n }\n if (this.morph.hasNormalMorph) {\n featureList.push(`HAS_TARGET_NORMAL${i}`);\n }\n if (this.morph.hasTangentMorph) {\n featureList.push(`HAS_TARGET_TANGENT${i}`);\n }\n }\n }\n\n if (this.skin !== undefined) {\n featureList.push('USE_SKINNING 1');\n featureList.push(`JOINT_COUNT ${this.skin.getJointCount()}`);\n featureList.push('HAS_JOINT_SET1 1');\n featureList.push('HAS_WEIGHT_SET1 1');\n if (this.skin.textureDataMode) { featureList.push('USE_SKINNING_TEXTURE 1'); }\n }\n\n if (this.material.materialType !== PMaterialType.unlit) {\n // let hasLight = false;\n\n if (lightCount > 0 && this.geometry.hasNormals()) {\n // hasLight = true;\n featureList.push('USE_PUNCTUAL 1');\n featureList.push(`LIGHT_COUNT ${lightCount}`);\n }\n\n if (skybox !== undefined && skybox.available) {\n // hasLight = true;\n featureList.push('USE_IBL 1');\n featureList.push('USE_TEX_LOD 1');\n if (skybox.hasDiffuseImage) {\n // do nothing\n } else {\n featureList.push('IRRADIANCE_COEFFICIENTS 1');\n }\n }\n\n // if(!hasLight){\n // featureList.push('MATERIAL_UNLIT 1');\n // }\n }\n\n // 渲染中间结果输出,用于渲染效果调试,支持 pbr 和 unlit\n const renderMode = PGlobalState.getInstance().renderMode3D;\n const outputDefine = this.getRenderMode3DDefine(renderMode);\n\n if (outputDefine !== undefined) {\n featureList.push('DEBUG_OUTPUT 1');\n featureList.push(`${outputDefine} 1`);\n }\n\n return featureList;\n }\n\n private getMacroList (lightCount: number, pbrPass: boolean, skybox?: PSkybox): MacroInfo[] {\n const macroList: MacroInfo[] = [];\n\n if (this.geometry.hasNormals()) {\n macroList.push({ name: 'HAS_NORMALS' });\n }\n if (this.geometry.hasTangents()) {\n macroList.push({ name: 'HAS_TANGENTS' });\n }\n if (this.geometry.hasUVCoords(1)) {\n macroList.push({ name: 'HAS_UV_SET1' });\n }\n if (this.geometry.hasUVCoords(2)) {\n macroList.push({ name: 'HAS_UV_SET2' });\n }\n\n if (this.morph !== undefined && this.morph.hasMorph()) {\n // 存在 Morph 动画,需要配置 Morph 动画相关的 Shader 宏定义\n // USE_MORPHING 是总开关,WEIGHT_COUNT 是 weights 数组长度(Shader)\n macroList.push({ name: 'USE_MORPHING' });\n macroList.push({ name: 'WEIGHT_COUNT', value: this.morph.morphWeightsLength });\n for (let i = 0; i < this.morph.morphWeightsLength; i++) {\n if (this.morph.hasPositionMorph) {\n macroList.push({ name: `HAS_TARGET_POSITION${i}` });\n }\n if (this.morph.hasNormalMorph) {\n macroList.push({ name: `HAS_TARGET_NORMAL${i}` });\n }\n if (this.morph.hasTangentMorph) {\n macroList.push({ name: `HAS_TARGET_TANGENT${i}` });\n }\n }\n }\n\n if (this.skin !== undefined) {\n macroList.push({ name: 'USE_SKINNING' });\n macroList.push({ name: 'JOINT_COUNT', value: this.skin.maxJointCount });\n macroList.push({ name: 'HAS_JOINT_SET1' });\n macroList.push({ name: 'HAS_WEIGHT_SET1' });\n if (this.skin.textureDataMode) {\n macroList.push({ name: 'USE_SKINNING_TEXTURE' });\n }\n }\n\n if (this.material.materialType !== PMaterialType.unlit) {\n if (lightCount > 0 && this.geometry.hasNormals()) {\n macroList.push({ name: 'USE_PUNCTUAL' });\n macroList.push({ name: 'LIGHT_COUNT', value: lightCount });\n }\n\n if (skybox !== undefined && skybox.available) {\n macroList.push({ name: 'USE_IBL' });\n macroList.push({ name: 'USE_TEX_LOD' });\n if (skybox.hasDiffuseImage) {\n // do nothing\n } else {\n macroList.push({ name: 'IRRADIANCE_COEFFICIENTS' });\n }\n }\n\n // if(!hasLight){\n // featureList.push('MATERIAL_UNLIT 1');\n // }\n }\n\n // 渲染中间结果输出,用于渲染效果调试,支持 pbr 和 unlit\n const renderMode = PGlobalState.getInstance().renderMode3D;\n const outputDefine = this.getRenderMode3DDefine(renderMode);\n\n if (outputDefine !== undefined) {\n macroList.push({ name: 'DEBUG_OUTPUT' });\n macroList.push({ name: outputDefine });\n }\n\n return macroList;\n }\n\n /**\n * 销毁,需要释放创建的 GE 对象\n */\n dispose () {\n // @ts-expect-error\n this.engine = null;\n this.parent = undefined;\n this.skin = undefined;\n this.morph = undefined;\n this.geometry.dispose();\n this.material.dispose();\n //\n this.jointMatrixList = undefined;\n this.jointNormalMatList = undefined;\n this.jointMatrixTexture?.dispose();\n this.jointMatrixTexture = undefined;\n this.jointNormalMatTexture?.dispose();\n this.jointNormalMatTexture = undefined;\n }\n\n /**\n * 更新内部 GE 材质着色器 Uniform 数据,根据场景状态\n * @param worldMatrix - 世界矩阵\n * @param nomralMatrix - 法线矩阵\n * @param sceneStates - 场景状态\n */\n updateMaterial (worldMatrix: Matrix4, nomralMatrix: Matrix4, sceneStates: PSceneStates) {\n this.updateUniformsByAnimation(worldMatrix, nomralMatrix);\n this.updateUniformsByScene(sceneStates);\n this.material.updateUniforms(this.getEffectsMaterial());\n }\n\n /**\n * 点击测试,先进行简单的包围合测试,然后再计算精准的点击测试,这个测试非常耗时不要在移动端上使用\n * @param newOrigin - 射线原点\n * @param newDirection - 射线方向\n * @param worldMatrix - 世界矩阵\n * @param invWorldMatrix - 逆世界矩阵\n * @returns 射线的 t 参数\n */\n hitTesting (newOrigin: Vector3, newDirection: Vector3, worldMatrix: Matrix4, invWorldMatrix: Matrix4) {\n const bounding = this.boundingBox;\n const boxt = RayBoxTesting(newOrigin, newDirection, bounding.min, bounding.max);\n const bindMatrices: Matrix4[] = [];\n\n if (boxt === undefined) {\n return;\n }\n\n if (this.skin !== undefined) {\n const animMatrices = this.skin.animationMatrices;\n\n animMatrices.forEach(mat => {\n bindMatrices.push(new Matrix4().multiplyMatrices(invWorldMatrix, mat));\n });\n }\n\n const proxy = new HitTestingProxy();\n const doubleSided = this.material.isBothSide();\n\n proxy.create(this.geometry.geometry, doubleSided, bindMatrices);\n\n return proxy.getHitPoint(newOrigin, newDirection);\n }\n\n /**\n * 计算包围盒\n * @param inverseWorldMatrix - 逆世界矩阵\n * @returns\n */\n computeBoundingBox (inverseWorldMatrix: Matrix4): Box3 {\n if (this.skin === undefined && !this.boundingBox.isEmpty()) {\n // 包围盒缓存了,直接返回计算的结果\n return this.boundingBox;\n }\n\n // 重新计算包围盒\n const bindMatrices: Matrix4[] = [];\n\n if (this.skin !== undefined) {\n const animMatrices = this.skin.animationMatrices;\n\n animMatrices.forEach(mat => {\n bindMatrices.push(new Matrix4().multiplyMatrices(inverseWorldMatrix, mat));\n });\n }\n\n const proxy = new GeometryBoxProxy();\n\n proxy.create(this.geometry.geometry, bindMatrices);\n\n return proxy.getBoundingBox(this.boundingBox);\n }\n\n /**\n * 渲染输出模式转成着色器中的宏定义\n * @param mode - 渲染输出模式\n * @returns 返回相应的宏定义\n */\n getRenderMode3DDefine (mode: spec.RenderMode3D): string | undefined {\n switch (mode) {\n case spec.RenderMode3D.uv:\n return 'DEBUG_UV';\n case spec.RenderMode3D.normal:\n return 'DEBUG_NORMAL';\n case spec.RenderMode3D.basecolor:\n return 'DEBUG_BASECOLOR';\n case spec.RenderMode3D.alpha:\n return 'DEBUG_ALPHA';\n case spec.RenderMode3D.metallic:\n return 'DEBUG_METALLIC';\n case spec.RenderMode3D.roughness:\n return 'DEBUG_ROUGHNESS';\n case spec.RenderMode3D.ao:\n return 'DEBUG_OCCLUSION';\n case spec.RenderMode3D.emissive:\n return 'DEBUG_EMISSIVE';\n case spec.RenderMode3D.diffuse:\n return 'DEBUG_DIFFUSE';\n }\n }\n\n private updateUniformsByAnimation (worldMatrix: Matrix4, normalMatrix: Matrix4) {\n const material = this.getEffectsMaterial();\n\n material.setMatrix('_NormalMatrix', normalMatrix);\n //\n const skin = this.skin;\n\n if (skin !== undefined) {\n const jointMatrixList = this.jointMatrixList as Float32Array;\n const jointNormalMatList = this.jointNormalMatList as Float32Array;\n\n skin.computeMeshAnimMatrices(worldMatrix, jointMatrixList, jointNormalMatList);\n if (skin.textureDataMode) {\n const jointMatrixTexture = this.jointMatrixTexture as PAnimTexture;\n const jointNormalMatTexture = this.jointNormalMatTexture as PAnimTexture;\n\n jointMatrixTexture.update(jointMatrixList);\n jointNormalMatTexture.update(jointNormalMatList);\n material.setTexture('_jointMatrixSampler', jointMatrixTexture.getTexture());\n material.setTexture('_jointNormalMatrixSampler', jointNormalMatTexture.getTexture());\n } else {\n const jointMatrixNumbers: number[] = [];\n const jointNormalMatNumbers: number[] = [];\n\n jointMatrixList.forEach(val => jointMatrixNumbers.push(val));\n jointNormalMatList.forEach(val => jointNormalMatNumbers.push(val));\n material.setMatrixNumberArray('_jointMatrix', jointMatrixNumbers);\n material.setMatrixNumberArray('_jointNormalMatrix', jointNormalMatNumbers);\n }\n }\n\n // Morph 相关的数据更新,仅需要更新 weights 数组\n const morph = this.morph;\n\n if (morph !== undefined && morph.hasMorph()) {\n const morphWeights = morph.morphWeightsArray.slice();\n\n material.setFloats('_morphWeights', morphWeights);\n }\n }\n\n private updateUniformsByScene (sceneStates: PSceneStates) {\n const material = this.getEffectsMaterial();\n\n material.setVector3('_Camera', sceneStates.cameraPosition);\n //\n if (!this.isUnlitMaterial()) {\n const { maxLightCount, lightList, inverseViewMatrix } = sceneStates;\n\n for (let i = 0; i < maxLightCount; i++) {\n if (i < lightList.length) {\n const light = lightList[i];\n const intensity = light.visible ? light.intensity : 0;\n\n if (light.followCamera) {\n const newDirection = inverseViewMatrix.transformNormal(light.getWorldDirection(), new Vector3());\n const newPosition = inverseViewMatrix.transformPoint(light.getWorldPosition(), new Vector3());\n\n material.setVector3(`_Lights[${i}].direction`, newDirection);\n material.setVector3(`_Lights[${i}].position`, newPosition);\n } else {\n material.setVector3(`_Lights[${i}].direction`, light.getWorldDirection());\n material.setVector3(`_Lights[${i}].position`, light.getWorldPosition());\n }\n material.setFloat(`_Lights[${i}].range`, light.range);\n material.setVector3(`_Lights[${i}].color`, light.color);\n material.setFloat(`_Lights[${i}].intensity`, intensity);\n material.setFloat(`_Lights[${i}].innerConeCos`, Math.cos(light.innerConeAngle));\n material.setFloat(`_Lights[${i}].outerConeCos`, Math.cos(light.outerConeAngle));\n material.setInt(`_Lights[${i}].type`, light.lightType);\n material.setVector2(`_Lights[${i}].padding`, light.padding);\n } else {\n material.setVector3(`_Lights[${i}].direction`, Vector3.ZERO);\n material.setFloat(`_Lights[${i}].range`, 0);\n material.setVector3(`_Lights[${i}].color`, Vector3.ZERO);\n material.setFloat(`_Lights[${i}].intensity`, 0);\n material.setVector3(`_Lights[${i}].position`, Vector3.ZERO);\n material.setFloat(`_Lights[${i}].innerConeCos`, 0);\n material.setFloat(`_Lights[${i}].outerConeCos`, 0);\n material.setInt(`_Lights[${i}].type`, 99999);\n material.setVector2(`_Lights[${i}].padding`, Vector2.ZERO);\n }\n }\n\n const skybox = sceneStates.skybox;\n\n if (skybox !== undefined && skybox.available) {\n material.setVector2('_IblIntensity', new Vector2(skybox.currentIntensity, skybox.currentReflectionsIntensity));\n material.setTexture('_brdfLUT', skybox.brdfLUT as Texture);\n if (skybox.diffuseImage !== undefined) {\n material.setTexture('_DiffuseEnvSampler', skybox.diffuseImage);\n } else {\n const coeffs = skybox.irradianceCoeffs as number[][];\n const aliasName = ['l00', 'l1m1', 'l10', 'l11', 'l2m2', 'l2m1', 'l20', 'l21', 'l22'];\n\n aliasName.forEach((n, i) => {\n material.setVector3(`_shCoefficients.${n}`, Vector3.fromArray(coeffs[i] as spec.vec3));\n });\n }\n material.setInt('_MipCount', skybox.specularMipCount - 1);\n material.setTexture('_SpecularEnvSampler', skybox.specularImage);\n }\n }\n }\n\n /**\n * 是否有蒙皮\n * @returns\n */\n hasSkin (): boolean {\n return this.skin !== undefined;\n }\n\n /**\n * 获取 GE 几何体\n * @returns\n */\n getEffectsGeometry (): Geometry {\n return this.geometry.geometry;\n }\n\n /**\n * 设置几何体\n * @param val - 插件或 GE 几何体\n */\n setGeometry (val: PGeometry | Geometry) {\n if (val instanceof PGeometry) {\n this.geometry = val;\n } else {\n this.geometry = new PGeometry(val);\n }\n }\n\n /**\n * 设置材质\n * @param val - 插件材质对象或材质参数\n */\n setMaterial (val: PMaterial | Material) {\n if (val instanceof PMaterialUnlit) {\n this.material = val;\n } else if (val instanceof PMaterialPBR) {\n this.material = val;\n } else {\n this.material = createPluginMaterial(val);\n }\n }\n\n /**\n * 获取 GE 材质\n * @returns\n */\n getEffectsMaterial (): Material {\n return this.material.effectMaterial;\n }\n\n /**\n * 是否无光照材质\n * @returns\n */\n isUnlitMaterial (): boolean {\n return this.material.materialType === PMaterialType.unlit;\n }\n\n /**\n * 是否有 Morph 动画:\n * 需要注意 Morph 对象存在,但还是没有 Morph 动画的情况\n * @returns 返回是否有 Morph 动画\n */\n hasMorph (): boolean {\n if (this.morph === undefined) {\n return false;\n }\n\n return this.morph.hasMorph();\n }\n\n /**\n * 获取世界坐标下的包围盒\n * @returns\n */\n getWorldBoundingBox (): Box3 {\n if (this.parent === undefined) {\n if (this.boundingBox.isEmpty()) {\n this.computeBoundingBox(Matrix4.fromIdentity());\n }\n\n return this.boundingBox;\n } else {\n const matrix = this.parent.matrix;\n\n if (this.boundingBox.isEmpty()) {\n this.computeBoundingBox(matrix.clone().invert());\n }\n\n return this.boundingBox.clone().applyMatrix4(matrix);\n }\n }\n}\n\n/**\n * 3D 几何类\n */\nexport class PGeometry {\n /**\n * 属性名称数组\n */\n attributeNames: string[];\n\n /**\n * 创建 3D 几何体,根据 GE 几何体\n * @param geometry - GE 几何体\n */\n constructor (public geometry: Geometry) {\n this.attributeNames = geometry.getAttributeNames();\n }\n\n /**\n * 销毁\n */\n dispose () {\n // @ts-expect-error\n this.geometry = undefined;\n this.attributeNames = [];\n }\n\n /**\n * 是否有某个属性\n * @param name - 属性名\n * @returns\n */\n hasAttribute (name: string): boolean {\n const index = this.attributeNames.findIndex(item => {\n return item === name;\n });\n\n return index !== -1;\n }\n\n /**\n * 设置隐藏,通过修改几何体中的渲染数目\n * @param hide - 隐藏值\n */\n setHide (hide: boolean) {\n const geomExt = this.geometry as GeometryExt;\n\n if (geomExt.getDrawCount() === 0) {\n const indexArray = geomExt.getIndexData();\n\n if (indexArray !== undefined) {\n geomExt.setDrawCount(indexArray.length);\n }\n }\n if (hide) {\n if (geomExt.getDrawCount() >= 0) {\n geomExt.setDrawCount(-geomExt.getDrawCount());\n }\n } else {\n if (geomExt.getDrawCount() < 0) {\n geomExt.setDrawCount(-geomExt.getDrawCount());\n }\n }\n }\n\n /**\n * 是否压缩格式\n * @returns\n */\n isCompressed (): boolean {\n const positionAttrib = this.geometry.getAttributeData('aPos');\n\n if (positionAttrib === undefined) {\n return false;\n }\n\n // FIXME: get attributes from geometry\n //return positionAttrib.normalize === true;\n return false;\n }\n\n /**\n * 是否有位置属性\n * @returns\n */\n hasPositions (): boolean {\n return this.hasAttribute('aPos');\n }\n\n /**\n * 是否有法线属性\n * @returns\n */\n hasNormals (): boolean {\n return this.hasAttribute('aNormal');\n }\n\n /**\n * 是否有切线属性\n * @returns\n */\n hasTangents (): boolean {\n return this.hasAttribute('aTangent');\n }\n\n /**\n * 是否有纹理坐标属性\n * @param index - 纹理坐标索引\n * @returns\n */\n hasUVCoords (index: number): boolean {\n if (index === 1) {\n return this.hasAttribute('aUV');\n } else {\n return this.hasAttribute(`aUV${index}`);\n }\n }\n\n /**\n * 是否有颜色属性\n * @returns\n */\n hasColors (): boolean {\n return this.hasAttribute('aColor');\n }\n\n /**\n * 是否有关节点属性\n * @returns\n */\n hasJoints (): boolean {\n return this.hasAttribute('aJoints');\n }\n\n /**\n * 是否有权重属性\n * @returns\n */\n hasWeights (): boolean {\n return this.hasAttribute('aWeights');\n }\n}\n\nclass EffectsMeshProxy {\n data: ModelMeshComponentData;\n geometry: Geometry;\n rootBoneItem: VFXItem;\n morphObj: PMorph;\n\n constructor (\n public itemData: ModelMeshComponentData,\n public parentComponent: ModelMeshComponent,\n public parentItem?: VFXItem,\n ) {\n this.data = itemData;\n this.geometry = itemData.geometry as unknown as Geometry;\n this.rootBoneItem = itemData.rootBone as unknown as VFXItem;\n\n const morphObj = new PMorph();\n\n if (morphObj.create(this.geometry)) {\n // 设置初始权重数组\n if (itemData.morph?.weights) {\n morphObj.initWeights(itemData.morph?.weights);\n }\n\n this.morphObj = morphObj;\n }\n }\n\n hasMorphTarget (): boolean {\n return this.morphObj.hasMorph();\n }\n\n /**\n * 返回 Morph 对象\n * 需要先判断是否有 Morph 动画,如果没有就直接返回 undefined\n *\n * @returns 缓存的 Morph 对象,或者 undefined\n */\n getMorphObj (): PMorph | undefined {\n if (!this.hasMorphTarget()) {\n return;\n }\n\n return this.morphObj;\n }\n\n isHide (): boolean {\n return this.data.hide === true;\n }\n\n getParentIndex (): number {\n return -1;\n }\n\n getGeometry () {\n return this.data.geometry;\n }\n\n getMaterials () {\n return this.data.materials;\n }\n\n getMaterialCount () {\n return this.data.materials.length;\n }\n\n hasSkin (): boolean {\n const skin = this.geometry.getSkinProps();\n\n return !!(skin.rootBoneName && skin.boneNames && skin.inverseBindMatrices && this.rootBoneItem);\n }\n\n getSkinOpts () {\n return this.geometry.getSkinProps();\n }\n\n getSkinObj (engine: Engine): PSkin | undefined {\n const skin = this.getSkinOpts();\n\n if (skin.rootBoneName && skin.boneNames && skin.inverseBindMatrices && this.rootBoneItem) {\n const skinObj = new PSkin();\n const maxJointCount = this.parentComponent.sceneManager?.maxJointCount ?? 0;\n\n skinObj.create(skin, engine, this.rootBoneItem, maxJointCount);\n\n return skinObj;\n }\n\n return undefined;\n }\n}\n\nexport interface MacroInfo {\n name: string,\n value?: boolean | number,\n}\n\ninterface GeometryExt extends Geometry {\n newDrawCount?: number,\n}\n","function _assert_this_initialized(self) {\n if (self === void 0) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n\n return self;\n}\nexport { _assert_this_initialized as _ };\n","import type { Mesh, Renderer, Texture, Engine, math, CameraOptionsEx } from '@galacean/effects';\nimport { Transform, spec, addItem, removeItem, PLAYER_OPTIONS_ENV_EDITOR } from '@galacean/effects';\nimport { PMesh } from './mesh';\nimport type { PCamera } from './camera';\nimport { PCameraManager } from './camera';\nimport { PLight, PLightManager } from './light';\nimport type { Vector3 } from './math';\nimport { Matrix4, Box3 } from './math';\nimport { PSkybox } from './skybox';\nimport { PTransform, PGlobalState, PObjectType } from './common';\nimport type { CompositionCache } from './cache';\nimport type { PEntity } from './object';\nimport { WebGLHelper } from '../utility/plugin-helper';\nimport { TwoStatesSet } from '../utility/ts-helper';\nimport type { ModelMeshComponent } from '../plugin';\n\ntype Box3 = math.Box3;\ntype Vector2 = math.Vector2;\n\n/**\n * 场景参数接口,初始化场景对象时使用\n */\nexport interface PSceneOptions {\n /**\n * 合成名称\n */\n componentName: string,\n /**\n * 渲染器\n */\n renderer: Renderer,\n /**\n * 场景缓存\n */\n sceneCache: CompositionCache,\n /**\n * 是否只渲染线框\n */\n wireframeOnly?: boolean,\n /**\n * 运行时环境\n */\n runtimeEnv?: string,\n /**\n * 兼容模式\n */\n compatibleMode?: string,\n /**\n * 是否可视化包围盒\n */\n visBoundingBox?: boolean,\n /**\n * 是否动态排序\n */\n enableDynamicSort?: boolean,\n /**\n * 3D 渲染模式\n */\n renderMode3D?: spec.RenderMode3D,\n /**\n * 3D 渲染模式中棋盘格大小\n */\n renderMode3DUVGridSize?: number,\n /**\n * 是否渲染天空盒\n */\n renderSkybox: boolean,\n /**\n * 灯光元素数目\n */\n lightItemCount: number,\n /**\n * 最大骨骼数目\n */\n maxJointCount: number,\n}\n\n/**\n * 场景状态接口,每次场景管理器 Tick 时都会生成\n */\nexport interface PSceneStates {\n /**\n * 时间间隔\n */\n deltaSeconds: number,\n /**\n * 相机对象\n */\n camera: PCamera,\n /**\n * 相机位置\n */\n cameraPosition: Vector3,\n /**\n * 相机矩阵\n */\n viewMatrix: Matrix4,\n /**\n * 逆相机矩阵\n */\n inverseViewMatrix: Matrix4,\n /**\n * 投影矩阵\n */\n projectionMatrix: Matrix4,\n /**\n * 相机投影矩阵\n */\n viewProjectionMatrix: Matrix4,\n /**\n * 画布大小\n */\n winSize: Vector2,\n /**\n * 场景半径\n */\n sceneRadius: number,\n // for shadow\n shadowMapSizeInv?: Vector2,\n lightViewMatrix?: Matrix4,\n lightProjectionMatrix?: Matrix4,\n lightViewProjectionMatrix?: Matrix4,\n /**\n * 灯光对象列表\n */\n lightList: PLight[],\n /**\n * 最大灯光数目\n */\n maxLightCount: number,\n /**\n * 最大骨骼数目\n */\n maxJointCount: number,\n /**\n * 天空盒对象\n */\n skybox?: PSkybox,\n}\n\n/**\n * 场景管理类,如果存在 Model 插件中的元素才会创建\n */\nexport class PSceneManager {\n /**\n * 合成名称\n */\n compName: string;\n /**\n * 实体列表\n */\n itemList: PEntity[];\n /**\n * Mesh 列表\n */\n meshList: PMesh[];\n /**\n * 灯光管理器\n */\n lightManager: PLightManager;\n /**\n * 相机管理器\n */\n cameraManager: PCameraManager;\n /**\n * 是否动态排序 Mesh 渲染优先级\n * 默认 false,需要和 Tiny 对齐时为 true\n */\n enableDynamicSort: boolean;\n /**\n * IBL 渲染时的 BRDF 查询纹理\n */\n brdfLUT?: Texture;\n /**\n * 天空盒\n */\n skybox?: PSkybox;\n /**\n * Tick 次数\n */\n tickCount: number;\n /**\n * 最近 Tick 时间\n */\n lastTickSecond: number;\n /**\n * 当前场景包围盒缓存,在阴影渲染中使用\n */\n sceneAABBCache: Box3;\n /**\n * 场景前帧和当前帧渲染的 Mesh 集合\n */\n renderedMeshSet: TwoStatesSet<Mesh>;\n /**\n * 最多灯光数目\n */\n maxLightCount = 16;\n /**\n * 最大骨骼数目\n */\n maxJointCount = 0;\n /**\n * 场景状态\n */\n sceneStates: PSceneStates;\n\n private renderer?: Renderer;\n private sceneCache?: CompositionCache;\n private parentId2Mesh: Map<string, PMesh>;\n private renderSkybox = false;\n\n private engine: Engine;\n\n constructor (engine: Engine) {\n this.compName = 'SceneManger';\n this.itemList = [];\n this.meshList = [];\n this.engine = engine;\n this.lightManager = new PLightManager();\n this.cameraManager = new PCameraManager();\n this.parentId2Mesh = new Map();\n //\n this.enableDynamicSort = false;\n this.tickCount = 0;\n this.lastTickSecond = -1;\n //\n this.sceneAABBCache = new Box3();\n this.renderedMeshSet = new TwoStatesSet();\n }\n\n /**\n * 初始化场景管理器,设置全局状态\n * @param opts - 场景参数\n */\n initial (opts: PSceneOptions) {\n this.clean();\n this.compName = opts.componentName;\n this.renderer = opts.renderer;\n this.engine = opts.renderer.engine;\n this.sceneCache = opts.sceneCache;\n this.enableDynamicSort = opts.enableDynamicSort === true;\n this.renderSkybox = opts.renderSkybox;\n this.maxLightCount = opts.lightItemCount;\n this.maxJointCount = opts.maxJointCount;\n this.cameraManager.initial(this.renderer.getWidth(), this.renderer.getHeight());\n this.brdfLUT = this.sceneCache.getBrdfLutTexture();\n this.initGlobalState(opts);\n\n if (this.maxLightCount > 8) {\n console.warn(`Too many light items: ${this.maxLightCount} light(s).`);\n }\n }\n\n private initGlobalState (opts: PSceneOptions) {\n const capbility = this.engine.gpuCapability;\n const globalState = PGlobalState.getInstance();\n\n globalState.reset();\n globalState.isWebGL2 = capbility.level === 2;\n //globalState.shaderShared = composition.env === PLAYER_OPTIONS_ENV_EDITOR;\n globalState.runtimeEnv = opts.runtimeEnv ?? PLAYER_OPTIONS_ENV_EDITOR;\n globalState.compatibleMode = opts.compatibleMode ?? 'gltf';\n globalState.visBoundingBox = opts.visBoundingBox ?? false;\n globalState.renderMode3D = opts.renderMode3D ?? spec.RenderMode3D.none;\n globalState.renderMode3DUVGridSize = opts.renderMode3DUVGridSize ?? 1 / 16;\n }\n\n private clean () {\n this.dispose();\n //\n this.compName = '';\n this.renderer = undefined;\n this.sceneCache = undefined;\n this.itemList = [];\n this.meshList = [];\n\n this.lightManager = new PLightManager();\n this.cameraManager = new PCameraManager();\n this.parentId2Mesh = new Map();\n this.brdfLUT = undefined;\n this.skybox = undefined;\n this.lastTickSecond = -1;\n //\n this.tickCount = 0;\n this.renderedMeshSet = new TwoStatesSet();\n }\n\n /**\n * 销毁,需要销毁各种管理器和创建的 WebGL 资源\n */\n dispose () {\n this.itemList.forEach(item => item.dispose());\n this.itemList = [];\n this.meshList.forEach(mesh => mesh.dispose());\n this.meshList = [];\n this.lightManager.dispose();\n this.cameraManager.dispose();\n this.brdfLUT = undefined;\n this.skybox?.dispose();\n this.skybox = undefined;\n this.renderedMeshSet.clear();\n //\n this.renderer = undefined;\n this.sceneCache = undefined;\n // @ts-expect-error\n this.engine = undefined;\n this.parentId2Mesh.clear();\n }\n\n /**\n * 添加插件元素到场景中\n * @param item - 插件元素\n */\n addItem (item: PMesh | PCamera | PLight | PSkybox) {\n if (item instanceof PMesh) {\n const mesh = item;\n\n if (mesh.parentItemId !== undefined) {\n this.parentId2Mesh.set(mesh.parentItemId, mesh);\n }\n\n addItem(this.meshList, mesh);\n } else if (item instanceof PSkybox) {\n const skybox = item;\n\n skybox.setup(this.brdfLUT);\n if (!this.renderSkybox) {\n // renderable会控制天空盒是否作为背景渲染,来自用户(编辑器)的输入\n // this.renderSkybox是播放时候的控制参数。\n // -- 如果是false,会强制天空不渲染。\n // -- 如果是true,会按照用户设置来渲染天空盒。\n skybox.renderable = false;\n }\n this.skybox = skybox;\n } else if (item instanceof PLight) {\n this.lightManager.insertLight(item);\n } else {\n this.cameraManager.insertCamera(item);\n }\n\n addItem(this.itemList, item);\n }\n\n /**\n * 从场景中删除插件元素\n * @param item - 插件元素\n */\n removeItem (item: PMesh | PCamera | PLight | PSkybox) {\n if (item instanceof PMesh) {\n const mesh = item;\n\n if (mesh.parentItemId !== undefined) {\n this.parentId2Mesh.delete(mesh.parentItemId);\n }\n\n removeItem(this.meshList, mesh);\n } else if (item instanceof PSkybox) {\n this.skybox = undefined;\n } else if (item instanceof PLight) {\n this.lightManager.remove(item);\n } else {\n this.cameraManager.remove(item);\n }\n\n removeItem(this.itemList, item);\n }\n\n /**\n * 更新默认相机状态,根据传入的相机参数\n * @param camera - 相机参数\n */\n updateDefaultCamera (camera: CameraOptionsEx, viewportMatrix: Matrix4) {\n const effectsTransfrom = new Transform({\n ...camera,\n valid: true,\n });\n\n const newTransform = new PTransform().fromEffectsTransform(effectsTransfrom);\n\n this.cameraManager.updateDefaultCamera(\n camera.fov,\n viewportMatrix,\n camera.aspect,\n camera.near,\n camera.far,\n newTransform.getPosition(),\n newTransform.getRotation(),\n camera.clipMode,\n );\n }\n\n /**\n * 更新插件场景,需要更新内部的相关的插件对象,特别是 Mesh 对象的骨骼动画\n * 并将需要渲染的对象添加到渲染对象集合中\n * @param deltaTime - 更新间隔\n */\n tick (deltaTime: number) {\n const deltaSeconds = deltaTime;\n const camera = this.activeCamera;\n const viewMatrix = camera.viewMatrix;\n const projectionMatrix = camera.projectionMatrix;\n const viewProjectionMatrix = projectionMatrix.clone().multiply(viewMatrix);\n\n this.sceneStates = {\n deltaSeconds: deltaSeconds,\n //\n camera: camera,\n cameraPosition: camera.getEye(),\n viewMatrix: viewMatrix,\n inverseViewMatrix: viewMatrix.clone().invert(),\n projectionMatrix: projectionMatrix,\n viewProjectionMatrix: viewProjectionMatrix,\n winSize: camera.getSize(),\n sceneRadius: 1.0,\n //\n lightList: this.lightManager.lightList,\n maxLightCount: this.maxLightCount,\n maxJointCount: this.maxJointCount,\n skybox: this.skybox,\n };\n\n if (this.enableDynamicSort) {\n this.dynamicSortMeshes(this.sceneStates);\n }\n\n this.tickCount += 1;\n this.lastTickSecond += deltaSeconds;\n }\n\n /**\n * 动态调整 Mesh 渲染优先级\n * 主要是为了和 Tiny 渲染对齐,正常渲染不进行调整\n * @param states - 场景中的状态数据\n */\n dynamicSortMeshes (states: PSceneStates) {\n const meshComponents: ModelMeshComponent[] = [];\n const priorityList: number[] = [];\n\n this.meshList.forEach(mesh => {\n if (mesh.owner && mesh.owner.enabled) {\n const component = mesh.owner;\n\n meshComponents.push(component);\n priorityList.push(component.priority);\n }\n });\n\n priorityList.sort((a, b) => a - b);\n\n // 按照 Tiny 排序算法,对 Mesh 对象进行排序\n // 将透明和不透明物体拆开,从而渲染正确\n const viewMatrix = states.viewMatrix;\n\n meshComponents.sort((a: ModelMeshComponent, b: ModelMeshComponent) => {\n const atransparent = WebGLHelper.isTransparentMesh(a);\n const btransparent = WebGLHelper.isTransparentMesh(b);\n\n if (atransparent && btransparent) {\n const aposition = a.transform.getWorldPosition();\n const bposition = b.transform.getWorldPosition();\n const anewPos = viewMatrix.transformPoint(aposition);\n const bnewPos = viewMatrix.transformPoint(bposition);\n\n if (anewPos.z === bnewPos.z) { return a.priority - b.priority; } else { return anewPos.z - bnewPos.z; }\n } else if (atransparent) {\n return 1;\n } else if (btransparent) {\n return -1;\n } else {\n return a.priority - b.priority;\n }\n });\n\n let prePriority = -99999;\n\n // 重新赋值渲染优先级\n for (let i = 0; i < meshComponents.length; i++) {\n const mesh = meshComponents[i];\n const priority = priorityList[i];\n\n if (prePriority < priority) {\n prePriority = priority;\n mesh.priority = priority;\n } else {\n prePriority += 0.1;\n mesh.priority = prePriority;\n }\n }\n }\n\n /**\n * 查询场景中的 Mesh\n * 通过 parentId 查询 Mesh 对象,可能找不到 Mesh 对象\n * @param parentId - Item 中定义的 parentId\n * @returns 查询到的 PMesh,或者是没找到。如果 Mesh 不可见,也是没找到。\n */\n queryMesh (parentId: string): PMesh | undefined {\n const mesh = this.parentId2Mesh.get(parentId);\n\n if (mesh === undefined || !mesh.visible) {\n return;\n }\n\n return mesh;\n }\n\n /**\n * 获取场景的包围盒\n * @param box - 包围盒\n * @returns 场景的包围盒\n */\n getSceneAABB (box?: Box3): Box3 {\n const sceneBox = box ?? new Box3();\n\n this.itemList.forEach(item => {\n if (item.type === PObjectType.mesh) {\n const mesh = item as PMesh;\n\n if (mesh.owner) {\n const transform = mesh.owner.item.getWorldTransform();\n const worldMatrix = transform.getWorldMatrix();\n const meshBox = mesh.computeBoundingBox(worldMatrix);\n\n meshBox.applyMatrix4(worldMatrix);\n sceneBox.union(meshBox);\n } else {\n sceneBox.union(mesh.computeBoundingBox(Matrix4.fromIdentity()));\n }\n }\n });\n\n return sceneBox;\n }\n\n printDebugInfo () {\n console.info('@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@');\n console.info('@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@');\n this.meshList.forEach((mesh, index) => {\n console.info('Mesh: ', index, mesh);\n });\n this.cameraManager.getCameraList().forEach((cam, index) => {\n console.info('Camera: ', index, cam);\n });\n console.info('Default Camera: ', this.cameraManager.getDefaultCamera());\n this.lightManager.lightList.forEach((light, index) => {\n console.info('Light: ', index, light);\n });\n console.info('@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@');\n console.info('@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@');\n }\n\n /**\n * 获取渲染器\n * @returns\n */\n getRenderer (): Renderer {\n return this.renderer as Renderer;\n }\n\n /**\n * 获取场景中缓存\n * @returns\n */\n getSceneCache (): CompositionCache {\n return this.sceneCache as CompositionCache;\n }\n\n /**\n * 获取激活的相机\n */\n get activeCamera (): PCamera {\n return this.cameraManager.getActiveCamera();\n }\n\n /**\n * 获取灯光数目\n */\n get lightCount (): number {\n return this.lightManager.lightCount;\n }\n\n /**\n * 获取着色器灯光数目,最小是 10\n */\n get shaderLightCount (): number {\n return Math.min(10, this.lightManager.lightCount);\n }\n}\n\n","import type {\n Scene, SceneLoadOptions, Composition, RenderFrame, Engine, Component, Renderer,\n} from '@galacean/effects';\nimport {\n VFXItem, AbstractPlugin, spec, Behaviour, PLAYER_OPTIONS_ENV_EDITOR, effectsClass,\n GLSLVersion, Geometry,\n} from '@galacean/effects';\nimport {\n CompositionCache, PTransform, PSceneManager, PCoordinate, PBRShaderGUID,\n UnlitShaderGUID, DEG2RAD, Matrix4, Vector3,\n} from '../runtime';\nimport { VFX_ITEM_TYPE_3D } from './const';\nimport { ModelCameraComponent, ModelLightComponent, ModelMeshComponent } from './model-item';\nimport { fetchPBRShaderCode, fetchUnlitShaderCode, PluginHelper } from '../utility';\n\n/**\n * Model 插件类,负责支持播放器中的 3D 功能\n */\nexport class ModelPlugin extends AbstractPlugin {\n /**\n * 插件名称\n */\n override name = 'model';\n /**\n * 合成缓存器\n */\n cache: CompositionCache;\n /**\n * 场景参数\n */\n sceneParams: Record<string, any>;\n\n /**\n * 整个 load 阶段都不会创建 GL 相关的对象,只创建 JS 对象\n * @param scene - 场景\n * @param options - 加载选项\n */\n static override async prepareResource (scene: Scene, options: SceneLoadOptions): Promise<void> {\n if (options.pluginData !== undefined) {\n const keyList = [\n 'compatibleMode',\n 'renderSkybox',\n 'visBoundingBox',\n 'autoAdjustScene',\n 'enableDynamicSort',\n 'renderMode3D',\n 'renderMode3DUVGridSize',\n ];\n const pluginData = options.pluginData;\n\n keyList.forEach(key => scene.storage[key] = pluginData[key]);\n }\n //\n const runtimeEnv = options.env ?? '';\n\n scene.storage['runtimeEnv'] = runtimeEnv;\n const compatibleMode = options.pluginData?.['compatibleMode'] ?? 'gltf';\n\n //\n PluginHelper.preprocessScene(scene, runtimeEnv, compatibleMode);\n await CompositionCache.loadStaticResources();\n }\n\n override precompile (compositions: spec.CompositionData[], renderer: Renderer): Promise<void> {\n const isWebGL2 = renderer.engine.gpuCapability.level === 2;\n const pbrShaderCode = fetchPBRShaderCode();\n const unlitShaderCode = fetchUnlitShaderCode();\n const pbrShaderData: spec.ShaderData = {\n id: PBRShaderGUID,\n name: 'PBR Shader',\n dataType: spec.DataType.Shader,\n fragment: pbrShaderCode.fragmentShaderCode,\n vertex: pbrShaderCode.vertexShaderCode,\n // @ts-expect-error\n glslVersion: isWebGL2 ? GLSLVersion.GLSL3 : GLSLVersion.GLSL1,\n };\n const unlitShaderData: spec.ShaderData = {\n id: UnlitShaderGUID,\n name: 'Unlit Shader',\n dataType: spec.DataType.Shader,\n fragment: unlitShaderCode.fragmentShaderCode,\n vertex: unlitShaderCode.vertexShaderCode,\n // @ts-expect-error\n glslVersion: isWebGL2 ? GLSLVersion.GLSL3 : GLSLVersion.GLSL1,\n };\n\n renderer.engine.addEffectsObjectData(pbrShaderData);\n renderer.engine.addEffectsObjectData(unlitShaderData);\n\n return Promise.resolve();\n }\n\n /**\n * 创建 3D 场景管理器和缓存器\n * @param composition - 合成\n * @param scene - 场景\n */\n override onCompositionConstructed (composition: Composition, scene: Scene): void {\n this.sceneParams = scene.storage;\n\n const engine = composition.renderer.engine;\n\n this.cache = new CompositionCache(engine);\n this.cache.setup(false);\n }\n\n /**\n * 每次播放都会执行,包括重播,所以这里执行“小的销毁”和新的初始化\n * @param composition - 合成\n * @param renderFrame - 渲染帧\n */\n override onCompositionReset (composition: Composition, renderFrame: RenderFrame) {\n const props = {\n id: 'ModelPluginItem',\n name: 'ModelPluginItem',\n duration: 9999999,\n endBehavior: spec.END_BEHAVIOR_FORWARD,\n } as unknown as spec.Item;\n const item = new VFXItem(composition.getEngine(), props);\n\n composition.addItem(item);\n //\n const comp = item.addComponent(ModelPluginComponent);\n\n comp.fromData({ cache: this.cache });\n comp.initial(this.sceneParams);\n }\n\n /**\n * 合成销毁,同时销毁 3D 场景对象和缓存\n * @param composition - 合成\n */\n override onCompositionDestroyed (composition: Composition) {\n this.cache.dispose();\n // @ts-expect-error\n this.cache = null;\n // @ts-expect-error\n this.sceneParams = null;\n }\n}\n\nexport interface ModelPluginOptions {\n cache: CompositionCache,\n}\n\n/**\n * 插件组件类,实现特定的插件功能\n * @since 2.0.0\n * @internal\n */\n@effectsClass(spec.DataType.ModelPluginComponent)\nexport class ModelPluginComponent extends Behaviour {\n private runtimeEnv = PLAYER_OPTIONS_ENV_EDITOR;\n private compatibleMode = 'gltf';\n private renderSkybox = true;\n private visBoundingBox = false;\n private autoAdjustScene = false;\n /**\n * 渲染插件是否启用动态排序功能\n * 支持在渲染的时候对透明 Mesh 进行动态排序\n */\n private enableDynamicSort = false;\n /**\n * 3D 渲染模式,支持可视化渲染中间结果\n * none 表示正常的渲染结果\n */\n private renderMode3D = spec.RenderMode3D.none;\n /**\n * UV 渲染模式中,指定棋盘格的大小,相对于大小为 1 的纹理\n * 取值范围(0, 1)\n */\n private renderMode3DUVGridSize = 1 / 16;\n /**\n * 合成缓存器\n */\n cache: CompositionCache;\n /**\n * 场景管理器\n */\n scene: PSceneManager;\n\n /**\n * 构造函数,创建场景管理器\n * @param engine - 引擎\n * @param options - Mesh 参数\n */\n constructor (engine: Engine, options?: ModelPluginOptions) {\n super(engine);\n if (options) {\n this.fromData(options);\n }\n }\n\n /**\n * 组件后更新,合成相机和场景管理器更新\n * @param dt - 更新间隔\n */\n override onLateUpdate (dt: number): void {\n const composition = this.item.composition as Composition;\n\n if (this.autoAdjustScene && this.scene.tickCount == 1) {\n // 自动计算场景中的相机位置\n // 更加相机的具体参数,计算出合适的相机观察位置\n // 但只会在第一帧进行更新,主要是用于测试使用\n const cameraObject = composition.camera;\n const cameraTransform = new PTransform().fromMatrix4(cameraObject.getViewMatrix());\n const cameraCoordinate = new PCoordinate().fromPTransform(cameraTransform);\n const cameraDirection = cameraCoordinate.zAxis.clone();\n const cameraFov = cameraObject.fov ?? 45;\n const cameraAspect = cameraObject.aspect ?? 1.0;\n //\n const sceneAABB = this.scene.getSceneAABB();\n const newAABB = sceneAABB.clone().applyMatrix4(cameraTransform.getMatrix());\n const newSize = newAABB.getSize(new Vector3()).multiply(0.5);\n const newWidth = newSize.x;\n const newHeight = newSize.y;\n const finalHeight = newHeight * Math.max(newWidth / newHeight / cameraAspect, 1.0);\n const center = sceneAABB.getCenter(new Vector3());\n const offset = finalHeight / Math.tan(cameraFov * 0.5 * DEG2RAD);\n const position = center.clone().add(cameraDirection.clone().multiply(offset + newSize.z));\n\n // 更新相机的位置,主要是composition的camera数据,以及camera item数据\n composition.camera.position = position;\n composition.items?.forEach(item => {\n if (item.type === VFX_ITEM_TYPE_3D) {\n const component = item.getComponent(ModelCameraComponent);\n\n if (component?.content) {\n const worldMatrix = item.transform.parentTransform?.getWorldMatrix() || Matrix4.IDENTITY.clone();\n const invWorldMatrix = worldMatrix.invert();\n const newPosition = invWorldMatrix.transformPoint(position);\n\n component.setTransform(newPosition);\n\n // 正式版本不会走到这个流程,只在测试时使用\n console.info(`Scene AABB [${sceneAABB.min.toArray()}], [${sceneAABB.max.toArray()}].`);\n console.info(`Update camera position [${newPosition.toArray()}].`);\n }\n }\n });\n }\n\n this.updateSceneCamera(composition);\n this.scene.tick(dt);\n }\n\n /**\n * 组件销毁,同时销毁场景管理器和缓存器\n */\n override onDestroy (): void {\n this.scene.dispose();\n // @ts-expect-error\n this.scene = null;\n // @ts-expect-error\n this.cache = null;\n }\n\n /**\n * 反序列化,创建场景管理器\n * @param date - 组件参数\n */\n override fromData (data: ModelPluginOptions): void {\n super.fromData(data);\n //\n const options = data;\n\n this.cache = options.cache;\n this.scene = new PSceneManager(this.engine);\n }\n\n /**\n * 组件初始化,初始化场景管理器并更新合成相机\n * @param sceneParams - 场景参数\n */\n initial (sceneParams: Record<string, any>) {\n this.runtimeEnv = sceneParams['runtimeEnv'] ?? this.runtimeEnv;\n this.compatibleMode = sceneParams['compatibleMode'] ?? this.compatibleMode;\n this.renderSkybox = sceneParams['renderSkybox'] ?? this.renderSkybox;\n this.visBoundingBox = sceneParams['visBoundingBox'] ?? this.visBoundingBox;\n this.autoAdjustScene = sceneParams['autoAdjustScene'] ?? this.autoAdjustScene;\n this.enableDynamicSort = sceneParams['enableDynamicSort'] ?? this.enableDynamicSort;\n this.renderMode3D = sceneParams['renderMode3D'] ?? this.renderMode3D;\n this.renderMode3DUVGridSize = sceneParams['renderMode3DUVGridSize'] ?? this.renderMode3DUVGridSize;\n\n const component = this.item.composition as Composition;\n\n this.scene.initial({\n componentName: `${component.id}`,\n renderer: this.engine.renderer,\n sceneCache: this.cache,\n runtimeEnv: this.runtimeEnv,\n compatibleMode: this.compatibleMode,\n visBoundingBox: this.visBoundingBox,\n enableDynamicSort: this.enableDynamicSort,\n renderMode3D: this.renderMode3D,\n renderMode3DUVGridSize: this.renderMode3DUVGridSize,\n renderSkybox: this.renderSkybox,\n lightItemCount: this.getLightItemCount(),\n maxJointCount: this.getMaxJointCount(this.item.composition?.items ?? []),\n });\n this.updateSceneCamera(component);\n }\n\n /**\n * 更新 SceneManager 中渲染用的相机,相机参数来自 composition.camera\n *\n * @param composition - 当前合成对象\n * @param sceneManager - 当前合成对象绑定的 SceneManager\n */\n private updateSceneCamera (composition: Composition) {\n this.scene.updateDefaultCamera(composition.camera.getOptions(), composition.camera.getViewportMatrix());\n }\n\n private getLightItemCount (): number {\n let lightItemCount = 0;\n const items = this.item.composition?.items ?? [];\n\n items.forEach(item => {\n if (item.getComponent(ModelLightComponent)) {\n lightItemCount++;\n }\n });\n\n return lightItemCount;\n }\n\n private getMaxJointCount (items: VFXItem[]): number {\n let maxJointCount = 0;\n\n items.forEach(item => {\n const meshComp = item.getComponent(ModelMeshComponent);\n\n if (meshComp && meshComp.data) {\n const geometry = meshComp.data.geometry;\n\n if (geometry instanceof Geometry) {\n const skin = geometry.getSkinProps();\n\n if (skin.boneNames) {\n maxJointCount = Math.max(skin.boneNames.length, maxJointCount);\n }\n }\n }\n if (item.children.length !== 0) {\n maxJointCount = Math.max(this.getMaxJointCount(item.children), maxJointCount);\n }\n });\n\n return maxJointCount;\n }\n}\n\n/**\n * 获取场景管理器,从合成中查找\n * @param component\n * @returns\n */\nexport function getSceneManager (component?: Component): PSceneManager | undefined {\n const composition = component?.item?.composition;\n const pluginItem = composition?.getItemByName('ModelPluginItem');\n const pluginComp = pluginItem?.getComponent(ModelPluginComponent);\n\n return pluginComp?.scene;\n}\n","import type { Engine } from '@galacean/effects';\nimport { Behaviour, effectsClass, spec } from '@galacean/effects';\nimport type { ModelTreeContent } from '../index';\n\n/**\n * 插件场景树组件类,实现 3D 场景树功能\n *\n * FIXME: 有些发布的新JSON包含TreeComponent,这里做兼容处理,否则会报错\n * @since 2.1.0\n */\n@effectsClass(spec.DataType.TreeComponent)\nexport class ModelTreeComponent extends Behaviour {\n /**\n * 参数\n */\n options?: ModelTreeContent;\n\n /**\n * 构造函数,创建节点树元素\n * @param engine\n * @param options\n */\n constructor (engine: Engine, options?: ModelTreeContent) {\n super(engine);\n if (options) {\n this.fromData(options);\n }\n }\n\n /**\n * 反序列化,保存入参和创建节点树元素\n * @param options\n */\n override fromData (options: ModelTreeContent): void {\n super.fromData(options);\n this.options = options;\n }\n}\n","import type { CameraOptionsEx, spec } from '@galacean/effects';\n\nexport interface CameraGestureHandler {\n\n getCurrentTarget (): string,\n\n getCurrentType (): CameraGestureType,\n\n /**\n * 通过按键事件对相机进行平移\n * @param event - 键盘事件信息\n * @returns 当前的相机参数\n */\n onKeyEvent (event: CameraKeyEvent): CameraOptionsEx,\n\n /**\n * 在 XY 方向上平移相机开始函数,在鼠标按下时调用\n * @param x - 鼠标在 x 坐标上的值\n * @param y - 鼠标在 y 坐标上的值\n * @param width - 当前画布的宽度\n * @param height - 当前画布的高度\n * @param cameraID - 要控制的相机 item id\n * @returns 当前的相机参数\n */\n onXYMoveBegin (x: number, y: number, width: number, height: number, cameraID: string): CameraOptionsEx,\n\n /**\n * 在 XY 方向上平移相机开始函数,在鼠标按下拖拽时调用\n * @param x - 鼠标在 x 坐标上的值\n * @param y - 鼠标在 y 坐标上的值\n * @param speed - 移动速度,默认是 0.015\n * @returns 更新后的相机参数\n */\n onXYMoving (x: number, y: number, speed?: number): CameraOptionsEx,\n\n /**\n * 结束在 XY 方向上平移相机\n */\n onXYMoveEnd (): void,\n\n /**\n * 在 Z 方向上平移相机开始函数,类似缩放 3D 模型,在鼠标按下时调用\n * @param x - 鼠标在 x 坐标上的值\n * @param y - 鼠标在 y 坐标上的值\n * @param width - 当前画布的宽度\n * @param height - 当前画布的高度\n * @param cameraID - 要控制的相机 item id\n * @returns 当前的相机参数\n */\n onZMoveBegin (x: number, y: number, width: number, height: number, cameraID: string): CameraOptionsEx,\n\n /**\n * 在 Z 方向上平移相机开始函数,类似缩放 3D 模型,在鼠标按下拖拽时调用\n * @param x - 鼠标在 x 坐标上的值\n * @param y - 鼠标在 y 坐标上的值\n * @param speed - 移动速度,默认是 0.015\n * @returns 更新后的相机参数\n */\n onZMoving (x: number, y: number, speed?: number): CameraOptionsEx,\n\n /**\n * 结束在 Z 方向上平移相机\n */\n onZMoveEnd (): void,\n\n /**\n * 相机的自旋转,就是镜头漫游的效果,在鼠标按下时调用\n * @param x - 鼠标在 x 坐标上的值\n * @param y - 鼠标在 y 坐标上的值\n * @param width - 当前画布的宽度\n * @param height - 当前画布的高度\n * @param cameraID - 要控制的相机 item id\n * @returns 当前的相机参数\n */\n onRotateBegin (x: number, y: number, width: number, height: number, cameraID: string): CameraOptionsEx,\n\n /**\n * 相机的自旋转,在鼠标按下拖拽时调用\n * @param x - 鼠标在 x坐标上的值\n * @param y - 鼠标在y坐标上的值\n * @param speed - 移动速度,默认是 1\n * @returns 更新后的相机参数\n */\n onRotating (x: number, y: number, speed?: number): CameraOptionsEx,\n\n /**\n * 相机的自旋转\n */\n onRotateEnd (): void,\n\n /**\n * 相机绕某个点旋转,就是拖拽模型的效果,在鼠标按下时调用\n * @param x - 鼠标在 x 坐标上的值\n * @param y - 鼠标在 y 坐标上的值\n * @param width - 当前画布的宽度\n * @param height - 当前画布的高度\n * @param cameraID - 要控制的相机 item id\n * @returns 当前的相机参数\n */\n onRotatePointBegin (x: number, y: number, width: number, height: number, point: spec.vec3, cameraID: string): CameraOptionsEx,\n\n /**\n * 相机绕某个点旋转,在鼠标按下拖拽时调用\n * @param x - 鼠标在 x 坐标上的值\n * @param y - 鼠标在 y 坐标上的值\n * @param speed - 移动速度,默认是 1\n * @returns 更新后的相机参数\n */\n onRotatingPoint (x: number, y: number, speed?: number): CameraOptionsEx,\n\n /**\n * 相机绕某个点旋转\n */\n onRotatePointEnd (): void,\n\n /**\n * 相机移动到指定点\n * @param cameraID -相机 ID\n * @param position - 指定位置\n */\n moveTo (cameraID: string, position: spec.vec3): void,\n\n /**\n * 相机旋转到指定方向\n * @param cameraID - 相机ID\n * @param quat - 指定旋转\n */\n rotateTo (cameraID: string, quat: spec.vec4): void,\n\n /**\n * 相机对中心点进行聚焦,先从当前位置 LookAt 过去,然后移到距离中心点给定距离(默认是 5)的位置\n * @param cameraID - 相机 ID\n * @param point - 聚焦的中心点\n * @param distance - 聚焦的距离,默认是 5\n */\n onFocusPoint (cameraID: string, point: spec.vec3, distance?: number): void,\n\n}\n\nexport enum CameraGestureType {\n none,\n translate = 1,\n rotate_focus = 2,\n rotate_self = 3,\n scale = 4\n}\n\nexport interface CameraGestureHandlerParams {\n type: CameraGestureType,\n\n mouseEvent: boolean,\n\n // mouse position\n clientX: number,\n clientY: number,\n\n // canvas size\n clientWidth: number,\n clientHeight: number,\n\n //camera item id\n target: string,\n\n //rotate_focus point\n focusPoint?: spec.vec3,\n\n speed?: number, // default = 0.015\n}\n\nexport interface CameraKeyEvent {\n cameraID: string,\n xAxis?: -1 | 1,\n yAxis?: -1 | 1,\n zAxis?: -1 | 1,\n speed?: number,\n}\n","import type { Composition, CameraOptionsEx, spec, VFXItem } from '@galacean/effects';\nimport { Transform } from '@galacean/effects';\nimport type {\n CameraGestureHandler,\n CameraKeyEvent,\n CameraGestureHandlerParams,\n} from './protocol';\nimport { CameraGestureType } from './protocol';\nimport { PCoordinate, PTransform } from '../runtime/common';\nimport type { Euler } from '../runtime/math';\nimport { Quaternion, Vector3, Matrix4 } from '../runtime/math';\nimport { ModelCameraComponent } from '../plugin/model-item';\n\nexport class CameraGestureHandlerImp implements CameraGestureHandler {\n private cameraTransform = new PTransform();\n private cameraCoordiante = new PCoordinate();\n\n private startParams: CameraGestureHandlerParams = {\n type: CameraGestureType.none,\n mouseEvent: false,\n clientX: 0,\n clientY: 0,\n clientWidth: 512,\n clientHeight: 512,\n target: '',\n };\n\n constructor (\n private composition: Composition,\n ) { }\n\n updateComposition (composition: Composition) {\n this.composition = composition;\n }\n\n getItem () {\n return this.composition.items?.find(item => item.name === this.getCurrentTarget());\n }\n\n getCurrentTarget (): string {\n return this.startParams.target;\n }\n\n getCurrentType (): CameraGestureType {\n return this.startParams.type;\n }\n\n onKeyEvent (event: CameraKeyEvent): CameraOptionsEx {\n // check event camera ID at first\n if (this.startParams.target !== event.cameraID) {\n this.startParams.target = event.cameraID;\n this.startParams.type = CameraGestureType.translate;\n }\n\n // can't find camera item, throw error message\n const item = this.getItem();\n\n if (item === undefined) {\n console.warn(`[CameraGestureHandlerImp] Unable to locate camera item with ID: ${this.startParams.target}.`);\n\n return this.composition.camera.getOptions();\n }\n\n const camera = this.composition.camera;\n const effectsTransfrom = new Transform({\n ...camera.getOptions(),\n valid: true,\n });\n const cameraTransform = new PTransform().fromEffectsTransform(effectsTransfrom);\n const cameraCoordiante = new PCoordinate().fromPTransform(cameraTransform);\n\n // compute move direction\n const xAxis = event.xAxis ?? 0;\n const yAxis = event.yAxis ?? 0;\n const zAxis = event.zAxis ?? 0;\n const dir = cameraCoordiante.xAxis.clone().multiply(xAxis);\n\n dir.add(cameraCoordiante.yAxis.clone().multiply(yAxis));\n dir.add(cameraCoordiante.zAxis.clone().multiply(zAxis));\n if (dir.lengthSquared() < 0.00001) {\n return camera.getOptions();\n }\n dir.normalize();\n\n // update camera position\n const speed = event.speed ?? 0.1;\n const pos = cameraTransform.getPosition();\n\n pos.add(dir.clone().multiply(speed));\n this.setTransform(item, pos);\n\n // update camera transform and coordinates\n if (this.startParams.type === CameraGestureType.rotate_self) {\n this.cameraTransform.setPosition(pos);\n this.cameraCoordiante.origin = pos;\n }\n\n return camera.getOptions();\n }\n\n onXYMoveBegin (x: number, y: number, width: number, height: number, cameraID: string): CameraOptionsEx {\n const args = {\n type: CameraGestureType.translate,\n mouseEvent: true,\n clientX: x,\n clientY: y,\n clientWidth: width,\n clientHeight: height,\n target: cameraID,\n };\n\n return this.startGesture(args);\n }\n\n onXYMoving (x: number, y: number, speed?: number): CameraOptionsEx {\n if (!this.startParams.mouseEvent) {\n return this.composition.camera.getOptions();\n }\n\n const arg0 = this.startParams;\n const arg = {\n type: CameraGestureType.translate,\n mouseEvent: true,\n clientX: x,\n clientY: y,\n clientWidth: arg0.clientWidth,\n clientHeight: arg0.clientHeight,\n target: arg0.target,\n speed: speed ?? 0.015,\n };\n\n return this.moveGesture(arg);\n }\n\n onXYMoveEnd () {\n this.endGesture();\n }\n\n onZMoveBegin (x: number, y: number, width: number, height: number, cameraID: string): CameraOptionsEx {\n const arg = {\n type: CameraGestureType.scale,\n mouseEvent: true,\n clientX: x,\n clientY: y,\n clientWidth: width,\n clientHeight: height,\n target: cameraID,\n };\n\n return this.startGesture(arg);\n }\n\n onZMoving (x: number, y: number, speed = 0.015): CameraOptionsEx {\n if (!this.startParams.mouseEvent) {\n return this.composition.camera.getOptions();\n }\n\n const arg0 = this.startParams;\n const arg = {\n type: CameraGestureType.scale,\n mouseEvent: true,\n clientX: x,\n clientY: y,\n clientWidth: arg0.clientWidth,\n clientHeight: arg0.clientHeight,\n target: arg0.target,\n speed,\n };\n\n return this.moveGesture(arg);\n }\n\n onZMoveEnd () {\n this.endGesture();\n }\n\n onRotateBegin (x: number, y: number, width: number, height: number, cameraID: string): CameraOptionsEx {\n const arg = {\n type: CameraGestureType.rotate_self,\n mouseEvent: true,\n clientX: x,\n clientY: y,\n clientWidth: width,\n clientHeight: height,\n target: cameraID,\n };\n\n return this.startGesture(arg);\n }\n\n onRotating (x: number, y: number, speed?: number): CameraOptionsEx {\n if (!this.startParams.mouseEvent) {\n return this.composition.camera.getOptions();\n }\n\n const arg0 = this.startParams;\n const arg = {\n type: CameraGestureType.rotate_self,\n mouseEvent: true,\n clientX: x,\n clientY: y,\n clientWidth: arg0.clientWidth,\n clientHeight: arg0.clientHeight,\n target: arg0.target,\n speed: speed ?? 1.5,\n };\n\n return this.moveGesture(arg);\n }\n\n onRotateEnd () {\n this.endGesture();\n }\n\n onRotatePointBegin (x: number, y: number, width: number, height: number, point: spec.vec3, cameraID: string): CameraOptionsEx {\n const arg = {\n type: CameraGestureType.rotate_focus,\n mouseEvent: true,\n clientX: x,\n clientY: y,\n clientWidth: width,\n clientHeight: height,\n focusPoint: point,\n target: cameraID,\n };\n\n return this.startGesture(arg);\n }\n\n onRotatingPoint (x: number, y: number, speed?: number): CameraOptionsEx {\n if (!this.startParams.mouseEvent) {\n return this.composition.camera.getOptions();\n }\n\n const arg0 = this.startParams;\n const arg = {\n type: CameraGestureType.rotate_focus,\n mouseEvent: true,\n clientX: x,\n clientY: y,\n clientWidth: arg0.clientWidth,\n clientHeight: arg0.clientHeight,\n focusPoint: arg0.focusPoint,\n target: arg0.target,\n speed: speed ?? 8.0,\n };\n\n return this.moveGesture(arg);\n }\n\n onRotatePointEnd (): void {\n this.endGesture();\n }\n\n moveTo (cameraID: string, position: spec.vec3): void {\n this.startParams.target = cameraID;\n this.startParams.type = CameraGestureType.none;\n const item = this.getItem();\n\n if (item === undefined) {\n console.warn('[CameraGestureHandlerImp] Can\\'t find camera item.');\n\n return;\n }\n\n this.setPosition(item, position);\n }\n\n rotateTo (cameraID: string, quat: spec.vec4): void {\n this.startParams.target = cameraID;\n this.startParams.type = CameraGestureType.none;\n const item = this.getItem();\n\n if (item === undefined) {\n console.warn('[CameraGestureHandlerImp] Can\\'t find camera item.');\n\n return;\n }\n\n this.setQuaternion(item, quat);\n }\n\n onFocusPoint (cameraID: string, point: spec.vec3, distance?: number): void {\n this.startParams.target = cameraID;\n this.startParams.type = CameraGestureType.none;\n\n const item = this.getItem();\n\n if (item === undefined) {\n console.warn('[CameraGestureHandlerImp] Can\\'t find camera item.');\n\n return;\n }\n const newDistance = distance ?? 5;\n const targetPoint = Vector3.fromArray(point);\n //\n const transform = new PTransform().fromEffectsTransform(item.transform);\n const coordinate = new PCoordinate().fromPTransform(transform);\n // FIXME: MATH\n const lookatDir = Vector3.fromArray(coordinate.zAxis.toArray()).multiply(1.0);\n //\n const newOffset = lookatDir.clone().multiply(newDistance);\n const newPosition = targetPoint.clone().add(newOffset);\n\n //\n this.setTransform(item, newPosition);\n //\n // z+方向优先\n // const cameraPos = Vector3.fromArray(item.transform.position);\n // const newLookatDir = targetPoint.clone().subVector(cameraPos).normalize();\n // const newOffset = newLookatDir.clone().multiplyScalar(newDistance);\n // const newPosition = targetPoint.clone().subVector(newOffset);\n // const newUpVector = Vector3.tryZUpVector(newLookatDir, new Vector3);\n // const viewMatrix = Matrix4.computeLookAt(newPosition, targetPoint, newUpVector, new Matrix4);\n // const tranform = new PTransform().fromMatrix4(viewMatrix);\n // const newRotation = tranform.rotation;\n // item.transform.setQuat(-newRotation.x, -newRotation.y, -newRotation.z, newRotation.w);\n // item.transform.setPosition(newPosition.x, newPosition.y, newPosition.z);\n //\n // 旋转优先\n // const cameraPos = Vector3.fromArray(item.transform.position);\n // const newLookatDir = targetPoint.clone().subVector(cameraPos).normalize();\n // const newOffset = newLookatDir.clone().multiplyScalar(newDistance);\n // const newPosition = targetPoint.clone().subVector(newOffset);\n // const oldTransform = new PTransform().fromEffectsTransform(item.transform);\n // const oldCoordinate = new PCoordinate().fromPTransform(oldTransform)\n // const oldLookatDir = oldCoordinate.zAxis.clone().multiplyScalar(-1.0);\n // const rotateAxis = oldLookatDir.cross(newLookatDir);\n // const sinTheta = rotateAxis.length();\n // const theta = Math.asin(sinTheta);\n // const deltaRotation = Quaternion.fromAxisAngle(rotateAxis, theta, new Quaternion);\n // const newRotation = Quaternion.multiply(deltaRotation, oldTransform.rotation, new Quaternion);\n // item.transform.setQuat(newRotation.x, newRotation.y, newRotation.z, newRotation.w);\n // item.transform.setPosition(newPosition.x, newPosition.y, newPosition.z);\n //\n //\n this.startParams.target = '';\n }\n\n getCameraTransform (): Transform {\n const camera = this.composition.camera;\n const transform = new Transform(camera.getOptions());\n\n transform.setValid(true);\n\n return transform;\n }\n\n private startGesture (args: CameraGestureHandlerParams): CameraOptionsEx {\n this.startParams = args;\n this.updateCameraTransform(this.composition.camera.getOptions());\n\n if (!this.getItem()) {\n console.warn('[CameraGestureHandlerImp] Invalid target specified in startGesture.');\n }\n\n return this.composition.camera.getOptions();\n }\n\n private moveGesture (arg: CameraGestureHandlerParams): CameraOptionsEx {\n if (this.getCurrentType() === arg.type) {\n const item = this.getItem();\n\n if (item === undefined) {\n console.warn('[CameraGestureHandlerImp] Can\\'t find camera item.');\n\n return this.composition.camera.getOptions();\n }\n const speed = arg.speed ?? 1.015;\n const xAxis = this.cameraCoordiante.xAxis;\n const yAxis = this.cameraCoordiante.yAxis;\n const zAxis = this.cameraCoordiante.zAxis;\n const dx = (arg.clientX - this.startParams.clientX);\n const dy = (arg.clientY - this.startParams.clientY);\n\n if (arg.type === CameraGestureType.translate) {\n const pos = this.cameraTransform.getPosition();\n const newPos = pos.clone();\n\n newPos.add(xAxis.clone().multiply(-dx * speed));\n newPos.add(yAxis.clone().multiply(dy * speed));\n item.transform.setPosition(newPos.x, newPos.y, newPos.z);\n this.setTransform(item, item.transform.position, item.transform.rotation);\n } else if (arg.type === CameraGestureType.scale) {\n const pos = this.cameraTransform.getPosition();\n const newPos = pos.clone();\n\n newPos.add(zAxis.clone().multiply(dy * speed));\n item.transform.setPosition(newPos.x, newPos.y, newPos.z);\n this.setTransform(item, item.transform.position, item.transform.rotation);\n } else if (arg.type === CameraGestureType.rotate_self) {\n const ndx = dx / arg.clientWidth;\n const ndy = dy / arg.clientHeight;\n const dxAngle = ndx * Math.PI * speed * 0.5;\n const dyAngle = ndy * Math.PI * speed * 0.5;\n\n const newRotation = Quaternion.fromAxisAngle(Vector3.Y, -dxAngle);\n // FIXME: MATH\n const tempRotation = Quaternion.fromAxisAngle(xAxis, -dyAngle);\n\n newRotation.multiply(tempRotation);\n // FIXME: MATH\n newRotation.multiply(this.cameraTransform.getRotation());\n item.transform.setQuaternion(newRotation.x, newRotation.y, newRotation.z, newRotation.w);\n this.setTransform(item, item.transform.position, item.transform.rotation);\n } else if (arg.type === CameraGestureType.rotate_focus) {\n const ndx = dx / arg.clientWidth;\n const ndy = dy / arg.clientHeight;\n const dxAngle = ndx * Math.PI * speed;\n const dyAngle = ndy * Math.PI * speed;\n const newRotation = Quaternion.fromAxisAngle(Vector3.Y, -dxAngle);\n const tempRotation = Quaternion.fromAxisAngle(xAxis, -dyAngle);\n\n newRotation.multiply(tempRotation);\n const rotateMatrix = newRotation.toMatrix4(new Matrix4());\n const targetPoint = Vector3.fromArray(arg.focusPoint as spec.vec3);\n const deltaPosition = this.cameraCoordiante.origin.clone().subtract(targetPoint);\n\n rotateMatrix.transformPoint(deltaPosition);\n const newPosition = deltaPosition.add(targetPoint);\n\n newRotation.multiply(this.cameraTransform.getRotation());\n item.transform.setPosition(newPosition.x, newPosition.y, newPosition.z);\n item.transform.setQuaternion(newRotation.x, newRotation.y, newRotation.z, newRotation.w);\n this.setTransform(item, newPosition, item.transform.rotation);\n } else {\n console.warn('[CameraGestureHandlerImp] Movement type not implemented.');\n }\n } else {\n console.warn(`[CameraGestureHandlerImp] Invalid move type specified: ${arg.type}`);\n }\n\n return this.composition.camera.getOptions();\n }\n\n private setTransform (item: VFXItem, position?: Vector3, rotation?: Euler) {\n const camera = item.getComponent(ModelCameraComponent);\n\n if (camera !== undefined) {\n camera.setTransform(position, rotation);\n }\n }\n\n private setPosition (item: VFXItem, position: spec.vec3) {\n item.transform.setPosition(...position);\n const camera = item.getComponent(ModelCameraComponent);\n\n if (camera !== undefined) {\n camera.updateMainCamera();\n }\n }\n\n private setQuaternion (item: VFXItem, quat: spec.vec4) {\n item.transform.setQuaternion(...quat);\n const camera = item.getComponent(ModelCameraComponent);\n\n if (camera !== undefined) {\n camera.updateMainCamera();\n }\n }\n\n private endGesture () {\n this.startParams.type = CameraGestureType.none;\n this.startParams.mouseEvent = false;\n this.startParams.target = '';\n }\n\n private updateCameraTransform (cameraOptions: CameraOptionsEx) {\n const effectsTransfrom = new Transform(cameraOptions);\n\n effectsTransfrom.setValid(true);\n\n this.cameraTransform.fromEffectsTransform(effectsTransfrom);\n this.cameraCoordiante.fromPTransform(this.cameraTransform);\n }\n}\n\nexport * from './protocol';\n","import type { spec } from '@galacean/effects';\nimport { Transform as EffectsTransform } from '@galacean/effects';\nimport type { BaseTransform as Transform } from '../index';\nimport { Vector3, Matrix4, Quaternion, Euler, EulerOrder } from '../runtime/math';\n\nexport class LoaderHelper {\n static getTransformFromMat4 (mat: Matrix4): Transform {\n const transform = mat.getTransform();\n const euler = transform.rotation.toEuler(new Euler());\n\n return {\n position: transform.translation.toArray(),\n rotation: euler.toArray(),\n scale: transform.scale.toArray(),\n };\n }\n\n static getEffectsTransformFromMat4 (mat: Matrix4): Transform {\n const transform = new EffectsTransform({\n valid: true,\n });\n\n transform.cloneFromMatrix(mat);\n\n return {\n position: transform.position.toArray(),\n rotation: transform.rotation.toArray(),\n scale: transform.scale.toArray(),\n };\n }\n\n static getTransformFromTranslation (t: Vector3): Transform {\n return {\n position: t.toArray(),\n };\n }\n\n static getTransformFromDirection (d: Vector3): Transform {\n const d0 = Vector3.fromArray([1, 0, 0]);\n const d1 = d.clone().normalize();\n const a = d0.clone().cross(d1);\n\n if (a.length() < 0.01) { return {}; }\n\n a.normalize();\n const b = d1.dot(d0);\n const c = Math.acos(b);\n\n const mat = Matrix4.fromRotationAxis(a, c);\n\n return LoaderHelper.getTransformFromMat4(mat);\n }\n\n static getEffectsTransformFromDirection (d: Vector3): Transform {\n const d0 = Vector3.fromArray([0, 0, 1]);\n const d1 = d.clone().normalize();\n const a = d0.clone().cross(d1);\n\n if (a.length() < 0.01) { return {}; }\n\n a.normalize();\n const b = d1.dot(d0);\n const c = Math.acos(b);\n\n const mat = Matrix4.fromRotationAxis(a, c);\n\n return LoaderHelper.getEffectsTransformFromMat4(mat);\n }\n\n static getTransformFromTransDir (t: Vector3, d: Vector3): Transform {\n const transform = LoaderHelper.getTransformFromDirection(d);\n\n transform.position = t.toArray();\n\n return transform;\n }\n\n static getEffectsTransformFromTransDir (t: Vector3, d: Vector3): Transform {\n const transform = LoaderHelper.getEffectsTransformFromDirection(d);\n\n transform.position = t.toArray();\n\n return transform;\n }\n\n static getEulerFromQuat (q: Quaternion): [number, number, number] {\n const euler = new Euler();\n const quat = new Quaternion(q.x, q.y, q.z, q.w);\n\n euler.order = EulerOrder.ZYX;\n euler.setFromQuaternion(quat);\n\n return [euler.x, euler.y, euler.z];\n }\n\n static getQuatFromEuler (e: Euler): [number, number, number, number] {\n const quat = new Quaternion();\n\n quat.setFromEuler(e);\n\n return [quat.x, quat.y, quat.z, quat.w];\n }\n\n static toPlayerColor3 (color: spec.vec3): spec.vec3 {\n // [0, 1] => [0, 255]\n return [\n LoaderHelper.scaleTo255(color[0]),\n LoaderHelper.scaleTo255(color[1]),\n LoaderHelper.scaleTo255(color[2]),\n ];\n }\n\n static toPlayerColor4 (color: spec.vec4): spec.vec4 {\n // [0, 1] => [0, 255]\n return [\n LoaderHelper.scaleTo255(color[0]),\n LoaderHelper.scaleTo255(color[1]),\n LoaderHelper.scaleTo255(color[2]),\n LoaderHelper.scaleTo255(color[3]),\n ];\n }\n\n static scaleTo255 (val: number): number {\n const intVal = val * 255;\n\n return Math.max(0, Math.min(intVal, 255));\n }\n\n static scaleTo1 (val: number): number {\n const floatVal = val / 255.0;\n\n return Math.max(0.0, Math.min(floatVal, 1.0));\n }\n}\n","import {\n spec, generateGUID, Downloader, TextureSourceType, getStandardJSON, glContext,\n glType2VertexFormatType, isObject,\n} from '@galacean/effects';\nimport type {\n Engine, Renderer, JSONValue, TextureCubeSourceOptions, GeometryProps,\n} from '@galacean/effects';\nimport { deserializeGeometry, typedArrayFromBinary } from '@galacean/effects-helper';\nimport { PBRShaderGUID, UnlitShaderGUID, Color, Quaternion, Vector3 } from '../runtime';\nimport type { ModelTreeContent } from '../index';\n\nexport class JSONConverter {\n newScene: spec.JSONScene;\n\n engine: Engine;\n downloader: Downloader;\n treeInfo = new TreeInfo();\n\n constructor (\n public renderer: Renderer,\n public keepIBLData = true,\n ) {\n this.engine = renderer.engine;\n this.downloader = new Downloader();\n }\n\n async processScene (sceneData: string | Record<string | symbol, unknown>) {\n const sceneJSON = isObject(sceneData) ? sceneData : await this.loadJSON(sceneData);\n\n //@ts-expect-error\n if (!sceneJSON.textures) {\n //@ts-expect-error\n sceneJSON.textures = [];\n }\n //@ts-expect-error\n sceneJSON.textures.forEach(tex => {\n if (tex.source === undefined) {\n tex.source = 0;\n }\n });\n\n const oldScene = getStandardJSON(sceneJSON);\n const oldBinUrls = oldScene.bins ?? [];\n const binFiles: ArrayBuffer[] = [];\n\n //@ts-expect-error\n const v = sceneJSON.version.split('.');\n\n if (Number(v[0]) >= 3) {\n return oldScene;\n }\n\n if (oldScene.bins) {\n for (const bin of oldScene.bins) {\n binFiles.push(await this.loadBins(bin.url));\n }\n }\n // @ts-expect-error\n oldScene.bins = binFiles;\n\n const newScene: spec.JSONScene = {\n ...oldScene,\n version: spec.JSONSceneVersion['3_0'],\n playerVersion: {\n web: '3.0',\n native: '3.0',\n },\n type: 'ge',\n compositions: [],\n images: [],\n textures: [],\n items: [],\n components: [],\n materials: [],\n shaders: [],\n };\n\n this.setImage(newScene, oldScene);\n await this.setTexture(newScene, oldScene);\n this.setComponent(newScene, oldScene);\n this.setItem(newScene, oldScene);\n this.setComposition(newScene, oldScene);\n\n newScene.bins = oldBinUrls;\n\n return newScene;\n }\n\n setImage (newScene: spec.JSONScene, oldScene: spec.JSONScene) {\n const newImages: spec.Image[] = [];\n\n oldScene.images.forEach(image => {\n newImages.push(image);\n });\n\n newScene.images = newImages;\n }\n\n async setTexture (newScene: spec.JSONScene, oldScene: spec.JSONScene) {\n const newTextures: spec.TextureDefine[] = [];\n const bins = oldScene.bins as unknown as ArrayBuffer[];\n\n if (oldScene.textures) {\n for (const tex of oldScene.textures as spec.SerializedTextureCube[]) {\n if (tex.target === 34067) {\n if (this.keepIBLData) {\n newTextures.push(tex);\n } else {\n const { mipmaps, target } = tex;\n const jobs = mipmaps.map(mipmap => Promise.all(mipmap.map(pointer => this.loadMipmapImage(pointer, bins))));\n const loadedMipmaps = await Promise.all(jobs);\n\n const newMipmaps = loadedMipmaps.map(mipmaps => mipmaps.map(img => {\n const id = generateGUID();\n const sceneImage: spec.Image = {\n url: img,\n id,\n };\n\n newScene.images.push(sceneImage);\n const dataPath: spec.DataPath = { id };\n\n return dataPath;\n }));\n\n const newTex = {\n keepImageSource: false,\n ...tex,\n ...{\n mipmaps: newMipmaps,\n sourceFrom: {\n target,\n type: TextureSourceType.mipmaps,\n mipmaps: mipmaps.map(mipmap => mipmap.map(pointer => [pointer[1][1], pointer[1][2]])),\n },\n } as TextureCubeSourceOptions,\n };\n\n // @ts-expect-error\n newTextures.push(newTex);\n }\n } else {\n // @ts-expect-error\n const source = tex.source as any;\n\n if (typeof source === 'number') {\n // @ts-expect-error\n tex.source = { id: newScene.images[source].id };\n }\n newTextures.push(tex);\n }\n }\n }\n\n newScene.textures = newTextures;\n }\n\n setComponent (newScene: spec.JSONScene, oldScene: spec.JSONScene) {\n const newComponents = newScene.components;\n\n for (const comp of oldScene.components) {\n if (comp.dataType === spec.DataType.SkyboxComponent) {\n newComponents.push(this.createSkyboxComponent(comp, newScene));\n } else if (comp.dataType === spec.DataType.LightComponent) {\n newComponents.push(this.createLightComponent(comp, newScene));\n } else if (comp.dataType === spec.DataType.CameraComponent) {\n newComponents.push(comp);\n console.warn(`Camera component found: ${comp}.`);\n } else if (comp.dataType === spec.DataType.TreeComponent) {\n const treeComp = comp as unknown as ModelTreeContent;\n\n this.createItemsFromTreeComponent(comp, newScene, oldScene);\n treeComp.options.tree.animation = undefined;\n treeComp.options.tree.animations = undefined;\n } else if (comp.dataType !== spec.DataType.MeshComponent) {\n newComponents.push(comp);\n }\n }\n\n for (const comp of oldScene.components) {\n if (comp.dataType === spec.DataType.MeshComponent) {\n newComponents.push(this.createMeshComponent(comp, newScene, oldScene));\n }\n }\n }\n\n setItem (newScene: spec.JSONScene, oldScene: spec.JSONScene) {\n\n }\n\n setComposition (newScene: spec.JSONScene, oldScene: spec.JSONScene) {\n newScene.items = oldScene.items;\n newScene.items.push(...this.treeInfo.getAllTreeNodeList());\n newScene.compositionId = oldScene.compositionId;\n newScene.compositions = oldScene.compositions;\n\n newScene.items.forEach(item => {\n if (item.type === 'root' as spec.ItemType) {\n item.type = 'ECS' as spec.ItemType;\n }\n });\n\n //@ts-expect-error\n newScene.compositions[0].items = newScene.items.map(item => {\n return { id: item.id } as spec.DataPath;\n });\n }\n\n private async loadJSON (url: string) {\n return new Promise<JSONValue>((resolve, reject) => {\n this.downloader.downloadJSON(\n url,\n resolve,\n (status, responseText) => {\n reject(new Error(`Failed to load JSON from URL '${url}': status ${status} - ${responseText}. Please check the URL or network settings.`));\n });\n });\n }\n\n private async loadBins (url: string) {\n return new Promise<ArrayBuffer>((resolve, reject) => {\n this.downloader.downloadBinary(\n url,\n resolve,\n (status, responseText) => {\n reject(`Couldn't load bins ${JSON.stringify(url)}: status ${status}, ${responseText}`);\n });\n });\n }\n\n private async loadMipmapImage (pointer: spec.BinaryPointer, bins: ArrayBuffer[]) {\n const [index, start, length] = pointer[1];\n const bin = bins[index];\n\n if (!bin) {\n throw new Error(`Invalid bin pointer: ${JSON.stringify(pointer)}.`);\n }\n\n return URL.createObjectURL((new Blob([new Uint8Array(bin, start, length)])));\n }\n\n private createSkyboxComponent (component: spec.ComponentData, scene: spec.JSONScene): spec.SkyboxComponentData {\n const skyboxOptions = (component as unknown as spec.SkyboxContent<'json'>).options;\n let irradianceCoeffs;\n\n if (skyboxOptions.irradianceCoeffs) {\n irradianceCoeffs = [];\n skyboxOptions.irradianceCoeffs.forEach(coeffs => irradianceCoeffs.push(...coeffs));\n }\n\n let diffuseImage;\n\n if (skyboxOptions.diffuseImage) {\n // @ts-expect-error\n diffuseImage = { id: scene.textures[skyboxOptions.diffuseImage].id } as spec.DataPath;\n }\n\n const skyboxComponent: spec.SkyboxComponentData = {\n id: component.id,\n dataType: component.dataType,\n item: component.item,\n renderable: skyboxOptions.renderable,\n intensity: skyboxOptions.intensity,\n reflectionsIntensity: skyboxOptions.reflectionsIntensity,\n irradianceCoeffs: irradianceCoeffs,\n diffuseImage,\n specularImage: {\n // @ts-expect-error\n id: scene.textures[skyboxOptions.specularImage].id,\n },\n specularImageSize: skyboxOptions.specularImageSize,\n specularMipCount: skyboxOptions.specularMipCount + 1,\n };\n\n return skyboxComponent;\n }\n\n private createMeshComponent (component: spec.ComponentData, newScene: spec.JSONScene, oldScene: spec.JSONScene): spec.ModelMeshComponentData {\n const meshOptions = (component as unknown as spec.ModelMeshItemContent<'json'>).options;\n\n const geometryPropsList: GeometryProps[] = [];\n const materialDatas: spec.MaterialData[] = [];\n\n meshOptions.primitives.forEach(prim => {\n const geomProps = deserializeGeometry(prim.geometry, oldScene.bins as unknown as ArrayBuffer[]);\n const material = this.getMaterialData(prim.material, oldScene);\n\n if (geomProps.indices?.data instanceof Uint8Array) {\n const oldIndices = geomProps.indices.data;\n const newIndices = new Uint16Array(oldIndices.length);\n\n for (let i = 0; i < oldIndices.length; i++) {\n newIndices[i] = oldIndices[i];\n }\n\n geomProps.indices.data = newIndices;\n }\n\n geometryPropsList.push(geomProps);\n materialDatas.push(material);\n });\n\n const geometryData = getGeometryDataFromPropsList(geometryPropsList);\n\n if (!geometryData) {\n throw new Error('No primitives available to process.');\n }\n\n newScene.geometries.push(geometryData);\n newScene.materials.push(...materialDatas);\n\n const meshComponent: spec.ModelMeshComponentData = {\n id: component.id,\n dataType: component.dataType,\n item: component.item,\n geometry: { id: geometryData.id },\n materials: materialDatas.map(mat => {\n const data: spec.DataPath = {\n id: mat.id,\n };\n\n return data;\n }),\n };\n\n if (meshOptions.skin) {\n let parentItemId = component.item.id;\n\n for (const item of oldScene.items) {\n if (item.id === component.item.id) {\n parentItemId = item.parentId as string;\n }\n }\n\n if (parentItemId === component.item.id) {\n throw new Error(`Can't item ${component.item}.`);\n }\n\n const treeItem = this.treeInfo.getTreeItemByNodeId(parentItemId);\n const treeNodeList = this.treeInfo.getTreeNodeListByNodeId(parentItemId);\n\n if (!treeItem || !treeNodeList) {\n throw new Error(`Failed to retrieve tree node list for item with ID ${component.item.id}. Ensure the item exists and has a valid tree structure.`);\n }\n const rootBoneItem = this.setupBoneData(geometryData, meshOptions.skin, oldScene, treeItem, treeNodeList);\n\n meshComponent.rootBone = { id: rootBoneItem.id };\n }\n\n if (meshOptions.weights !== undefined) {\n meshComponent.morph = {\n weights: meshOptions.weights,\n };\n }\n\n return meshComponent;\n }\n\n private createItemsFromTreeComponent (component: spec.ComponentData, newScene: spec.JSONScene, oldScene: spec.JSONScene) {\n let treeItem = oldScene.items[0];\n\n oldScene.items.forEach(item => {\n if (item.id === component.item.id) {\n treeItem = item;\n }\n });\n\n const treeComp = component as unknown as ModelTreeContent;\n const treeData = treeComp.options.tree;\n const treeNodeList: spec.VFXItemData[] = [];\n\n treeData.nodes.forEach((node, index) => {\n const item: spec.VFXItemData = {\n id: generateGUID(),\n parentId: treeItem.id,\n name: node.name ?? `node${index}`,\n duration: treeItem.duration,\n // @ts-expect-error\n type: 'ECS',\n dataType: spec.DataType.VFXItemData,\n visible: treeItem.visible,\n endBehavior: treeItem.endBehavior,\n delay: treeItem.delay,\n content: {},\n renderLevel: treeItem.renderLevel,\n pn: treeItem.pn,\n pluginName: treeItem.pluginName,\n transform: this.getTransformData(node.transform),\n components: [],\n };\n\n treeNodeList.push(item);\n newScene.items.push(item);\n });\n\n treeData.nodes.forEach((node, index) => {\n const item = treeNodeList[index];\n\n node.children?.forEach(child => {\n const childItem = treeNodeList[child];\n\n childItem.parentId = item.id;\n });\n });\n\n oldScene.items.forEach(item => {\n if (item.parentId) {\n const index = item.parentId.indexOf('^');\n\n if (index >= 0) {\n const parentId = item.parentId.substring(0, index);\n const subIndex = +item.parentId.substring(index + 1);\n\n if (parentId === treeItem.id) {\n item.parentId = treeNodeList[subIndex].id;\n }\n }\n }\n });\n\n this.treeInfo.add(treeItem, treeNodeList);\n\n this.createAnimationComponent(treeData as any, treeItem, newScene, oldScene);\n }\n\n private createLightComponent (component: spec.ComponentData, scene: spec.JSONScene): spec.ModelLightComponentData {\n const lightOptions = (component as unknown as spec.ModelLightContent).options;\n\n const lightComponent: spec.ModelLightComponentData = {\n id: component.id,\n dataType: component.dataType,\n item: component.item,\n lightType: lightOptions.lightType as spec.LightType,\n color: {\n r: lightOptions.color[0] / 255.0,\n g: lightOptions.color[1] / 255.0,\n b: lightOptions.color[2] / 255.0,\n a: lightOptions.color[3] / 255.0,\n },\n intensity: lightOptions.intensity,\n };\n\n if (lightOptions.lightType === 'point') {\n lightComponent.range = lightOptions.range;\n } else if (lightOptions.lightType === 'spot') {\n lightComponent.range = lightOptions.range;\n lightComponent.innerConeAngle = lightOptions.innerConeAngle;\n lightComponent.outerConeAngle = lightOptions.outerConeAngle;\n }\n\n return lightComponent;\n }\n\n private createAnimationComponent (treeOptions: spec.ModelTreeOptions<'json'>, treeItem: spec.VFXItemData, newScene: spec.JSONScene, oldScene: spec.JSONScene) {\n const { animation, animations } = treeOptions;\n\n const animationComponent: spec.AnimationComponentData = {\n id: generateGUID(),\n dataType: spec.DataType.AnimationComponent,\n item: { id: treeItem.id },\n animation,\n animationClips: [],\n };\n\n if (animations && animations.length) {\n // FIXME: calcuate tree item duration\n const bins = oldScene.bins as unknown as ArrayBuffer[];\n\n animations.forEach(anim => {\n const clipData: spec.AnimationClipData = {\n id: generateGUID(),\n name: anim.name,\n dataType: spec.DataType.AnimationClip,\n positionCurves: [],\n rotationCurves: [],\n scaleCurves: [],\n floatCurves: [],\n };\n\n let totalAnimationTime = 0;\n\n anim.tracks.forEach(track => {\n const inputArray = typedArrayFromBinary(bins, track.input) as Float32Array;\n\n totalAnimationTime = Math.max(totalAnimationTime, inputArray[inputArray.length - 1]);\n });\n\n anim.tracks.forEach(track => {\n const inputArray = typedArrayFromBinary(bins, track.input);\n const outputArray = typedArrayFromBinary(bins, track.output) as Float32Array;\n\n if (!(inputArray instanceof Float32Array)) {\n throw new Error(`Type of inputArray should be float32, ${inputArray}.`);\n }\n if (!(outputArray instanceof Float32Array)) {\n throw new Error(`Type of outputArray should be float32, ${outputArray}.`);\n }\n if (track.interpolation !== 'LINEAR') {\n throw new Error(`Invalid interpolation type ${track.interpolation}.`);\n }\n\n if (track.path === 'rotation') {\n const points: spec.vec4[] = [];\n const controlPoints: spec.vec4[] = [];\n const lineValue: spec.LineKeyframeValue[] = [];\n\n for (let i = 0; i < inputArray.length; i++) {\n points.push([\n outputArray[i * 4],\n outputArray[i * 4 + 1],\n outputArray[i * 4 + 2],\n outputArray[i * 4 + 3],\n ]);\n\n if (i > 0) {\n const p0 = Quaternion.fromArray(points[i - 1]);\n const p3 = Quaternion.fromArray(points[i]);\n const p1 = new Quaternion();\n const p2 = new Quaternion();\n\n p1.slerpQuaternions(p0, p3, 1 / 3);\n p2.slerpQuaternions(p0, p3, 2 / 3);\n\n controlPoints.push(p1.toArray());\n controlPoints.push(p2.toArray());\n }\n\n lineValue.push([\n spec.BezierKeyframeType.LINE,\n [inputArray[i], i],\n ]);\n }\n\n const node = this.treeInfo.getTreeNode(treeItem.id, track.node);\n const path = this.treeInfo.getNodePath(node.id);\n\n const keyFrames: spec.BezierCurveQuat = [\n spec.ValueType.BEZIER_CURVE_QUAT,\n [lineValue, points, controlPoints],\n ];\n\n clipData.rotationCurves?.push({ path, keyFrames });\n } else if (track.path === 'weights') {\n const node = this.treeInfo.getTreeNode(treeItem.id, track.node);\n let path = this.treeInfo.getNodePath(node.id);\n\n if (node.components.length === 0) {\n for (let i = 0; i < oldScene.items.length; i++) {\n const child = oldScene.items[i];\n\n if (child.parentId === node.id) {\n path += '/' + child.name;\n\n break;\n }\n }\n }\n const component = outputArray.length / inputArray.length;\n\n for (let c = 0; c < component; c++) {\n const lineValue: spec.LineKeyframeValue[] = [];\n\n for (let i = 0; i < inputArray.length; i++) {\n lineValue.push([\n spec.BezierKeyframeType.LINE,\n [inputArray[i], outputArray[i * component + c]],\n ]);\n }\n\n const keyFrames: spec.BezierValue = [\n spec.ValueType.BEZIER_CURVE,\n lineValue,\n ];\n\n clipData.floatCurves?.push({\n path,\n className: 'ModelMeshComponent',\n property: `morphWeights.${c}`,\n keyFrames,\n });\n }\n } else {\n const points: spec.vec3[] = [];\n const controlPoints: spec.vec3[] = [];\n const lineValue: spec.LineKeyframeValue[] = [];\n\n for (let i = 0; i < inputArray.length; i++) {\n points.push([\n outputArray[i * 3],\n outputArray[i * 3 + 1],\n outputArray[i * 3 + 2],\n ]);\n\n if (i > 0) {\n const p0 = Vector3.fromArray(points[i - 1]);\n const p3 = Vector3.fromArray(points[i]);\n const p1 = new Vector3().lerpVectors(p0, p3, 1 / 3);\n const p2 = new Vector3().lerpVectors(p0, p3, 2 / 3);\n\n controlPoints.push(p1.toArray());\n controlPoints.push(p2.toArray());\n }\n\n lineValue.push([\n spec.BezierKeyframeType.LINE,\n [inputArray[i], i],\n ]);\n }\n\n const node = this.treeInfo.getTreeNode(treeItem.id, track.node);\n const path = this.treeInfo.getNodePath(node.id);\n\n const keyFrames: spec.BezierCurvePath = [\n spec.ValueType.BEZIER_CURVE_PATH,\n [lineValue, points, controlPoints],\n ];\n\n if (track.path === 'translation') {\n clipData.positionCurves?.push({ path, keyFrames });\n } else {\n clipData.scaleCurves?.push({ path, keyFrames: keyFrames as unknown as spec.Vector3CurveValue });\n }\n }\n });\n\n newScene.animations.push(clipData);\n\n animationComponent.animationClips.push({ id: clipData.id });\n });\n }\n treeItem.components = [];\n treeItem.components.push({ id: animationComponent.id });\n newScene.components.push(animationComponent);\n }\n\n private getMaterialData (material: spec.MaterialOptions<'json'>, scene: spec.JSONScene) {\n if (material.type === spec.MaterialType.unlit) {\n const floats: Record<string, number> = {};\n\n if (material.alphaCutOff !== undefined) {\n floats['_AlphaCutoff'] = material.alphaCutOff;\n }\n const colors: Record<string, Color> = {\n '_BaseColorFactor': new Color(\n material.baseColorFactor[0],\n material.baseColorFactor[1],\n material.baseColorFactor[2],\n material.baseColorFactor[3],\n ).divide(255),\n };\n\n const textures: Record<string, spec.MaterialTextureProperty> = {};\n\n if (material.baseColorTexture) {\n textures['_BaseColorSampler'] = this.getTextureData(scene, floats, material.baseColorTexture, material.baseColorTextureTransform);\n }\n\n const newMaterial: spec.MaterialData = {\n id: generateGUID(),\n name: material.name,\n dataType: spec.DataType.Material,\n shader: {\n id: UnlitShaderGUID,\n },\n stringTags: {},\n macros: [],\n ints: {},\n floats,\n vector4s: {},\n colors,\n textures,\n };\n\n this.setupMaterial(material, newMaterial);\n\n return newMaterial;\n } else {\n const floats: Record<string, number> = {\n '_MetallicFactor': material.metallicFactor,\n '_RoughnessFactor': material.roughnessFactor,\n };\n\n if (material.useSpecularAA !== undefined) {\n floats['_SpecularAA'] = material.useSpecularAA ? 1 : 0;\n }\n if (material.normalTextureScale !== undefined) {\n floats['_NormalScale'] = material.normalTextureScale;\n }\n if (material.occlusionTextureStrength !== undefined) {\n floats['_OcclusionStrength'] = material.occlusionTextureStrength;\n }\n if (material.emissiveIntensity !== undefined) {\n floats['_EmissiveIntensity'] = material.emissiveIntensity;\n }\n if (material.alphaCutOff !== undefined) {\n floats['_AlphaCutoff'] = material.alphaCutOff;\n }\n const colors: Record<string, Color> = {\n '_BaseColorFactor': new Color(\n material.baseColorFactor[0],\n material.baseColorFactor[1],\n material.baseColorFactor[2],\n material.baseColorFactor[3],\n ).divide(255),\n '_EmissiveFactor': new Color(\n material.emissiveFactor[0],\n material.emissiveFactor[1],\n material.emissiveFactor[2],\n material.emissiveFactor[3],\n ).divide(255),\n };\n\n const textures: Record<string, spec.MaterialTextureProperty> = {};\n\n if (material.baseColorTexture) {\n textures['_BaseColorSampler'] = this.getTextureData(scene, floats, material.baseColorTexture, material.baseColorTextureTransform);\n }\n\n if (material.metallicRoughnessTexture) {\n textures['_MetallicRoughnessSampler'] = this.getTextureData(scene, floats, material.metallicRoughnessTexture, material.metallicRoughnessTextureTransform);\n }\n\n if (material.normalTexture) {\n textures['_NormalSampler'] = this.getTextureData(scene, floats, material.normalTexture, material.normalTextureTransform);\n }\n\n if (material.occlusionTexture) {\n textures['_OcclusionSampler'] = this.getTextureData(scene, floats, material.occlusionTexture, material.occlusionTextureTransform);\n }\n\n if (material.emissiveTexture) {\n textures['_EmissiveSampler'] = this.getTextureData(scene, floats, material.emissiveTexture, material.emissiveTextureTransform);\n }\n\n const newMaterial: spec.MaterialData = {\n id: generateGUID(),\n name: material.name,\n dataType: spec.DataType.Material,\n shader: {\n id: PBRShaderGUID,\n },\n stringTags: {},\n macros: [],\n ints: {},\n floats,\n vector4s: {},\n colors,\n textures,\n };\n\n this.setupMaterial(material, newMaterial);\n\n return newMaterial;\n }\n }\n\n private setupMaterial (oldMat: spec.MaterialOptions<'json'>, newMat: spec.MaterialData) {\n if (oldMat.blending === spec.MaterialBlending.translucent) {\n newMat.stringTags['RenderType'] = spec.RenderType.Transparent;\n } else {\n newMat.stringTags['RenderType'] = spec.RenderType.Opaque;\n }\n\n if (oldMat.blending === spec.MaterialBlending.masked) {\n newMat.floats['AlphaClip'] = 1;\n newMat.floats['_AlphaCutoff'] = oldMat.alphaCutOff ?? 0;\n } else {\n newMat.floats['AlphaClip'] = 0;\n }\n\n switch (oldMat.side) {\n case spec.SideMode.BACK:\n newMat.stringTags['RenderFace'] = spec.RenderFace.Back;\n\n break;\n case spec.SideMode.DOUBLE:\n newMat.stringTags['RenderFace'] = spec.RenderFace.Both;\n\n break;\n default:\n newMat.stringTags['RenderFace'] = spec.RenderFace.Front;\n }\n\n if (oldMat.type === spec.MaterialType.pbr) {\n newMat.floats['_SpecularAA'] = oldMat.useSpecularAA ? 1 : 0;\n }\n\n newMat.floats['ZWrite'] = oldMat.depthMask !== false ? 1 : 0;\n newMat.floats['ZTest'] = 1;\n }\n\n private getTextureData (scene: spec.JSONScene, floats: Record<string, number>, texIndex: number, texTransform?: spec.ModelTextureTransform) {\n const id = scene.textures![texIndex].id ?? '0';\n const texProperty: spec.MaterialTextureProperty = {\n texture: { id },\n };\n\n if (texTransform) {\n if (texTransform.scale) {\n texProperty.scale = {\n x: texTransform.scale[0],\n y: texTransform.scale[1],\n };\n }\n if (texTransform.offset) {\n texProperty.offset = {\n x: texTransform.offset[0],\n y: texTransform.offset[1],\n };\n }\n if (texTransform.rotation) {\n floats['_BaseColorRotation'] = texTransform.rotation;\n }\n }\n\n return texProperty;\n }\n\n private getTransformData (transform?: spec.BaseItemTransform) {\n const result: spec.TransformData = {\n position: { x: 0, y: 0, z: 0 },\n eulerHint: { x: 0, y: 0, z: 0 },\n scale: { x: 1, y: 1, z: 1 },\n };\n\n if (transform?.position) {\n result.position.x = transform.position[0];\n result.position.y = transform.position[1];\n result.position.z = transform.position[2];\n }\n\n if (transform?.quat) {\n // @ts-expect-error\n result.quat = {};\n // @ts-expect-error\n result.quat.x = transform.quat[0];\n // @ts-expect-error\n result.quat.y = transform.quat[1];\n // @ts-expect-error\n result.quat.z = transform.quat[2];\n // @ts-expect-error\n result.quat.w = transform.quat[3];\n } else if (transform?.rotation) {\n result.eulerHint.x = transform.rotation[0];\n result.eulerHint.y = transform.rotation[1];\n result.eulerHint.z = transform.rotation[2];\n }\n\n if (transform?.scale) {\n result.scale.x = transform.scale[0];\n result.scale.y = transform.scale[1];\n result.scale.z = transform.scale[2];\n }\n\n return result;\n }\n\n private setupBoneData (geom: spec.GeometryData, skin: spec.SkinOptions<'json'>, oldScene: spec.JSONScene, treeItem: spec.VFXItemData, treeNodeList: spec.VFXItemData[]) {\n const bins = oldScene.bins as unknown as ArrayBuffer[];\n const { joints, skeleton, inverseBindMatrices } = skin;\n\n if (!inverseBindMatrices) {\n throw new Error(`'inverseBindMatrices' is undefined for the skin configuration: ${JSON.stringify(skin)}. Ensure 'inverseBindMatrices' is properly defined in your skin data.`);\n }\n const bindMatrixArray = typedArrayFromBinary(bins, inverseBindMatrices) as Float32Array;\n\n geom.inverseBindMatrices = Array.from(bindMatrixArray);\n\n const id2Node: Record<string, spec.VFXItemData> = {};\n\n let rootBoneItem = treeItem;\n\n if (skeleton !== undefined) {\n rootBoneItem = treeNodeList[skeleton];\n } else {\n console.warn('Root bone is missing for the skeleton. Defaulting to the primary tree item as the root bone.');\n }\n\n joints.forEach(joint => {\n const node = treeNodeList[joint];\n\n if (node !== rootBoneItem && node.parentId === rootBoneItem.parentId) {\n console.error('Invalid node detected for \\'rootBoneItem\\'. Adjusting \\'rootBoneItem\\' to the primary tree item. Please verify the tree structure.');\n\n rootBoneItem = treeItem;\n }\n });\n\n treeNodeList.forEach(node => {\n id2Node[node.id] = node;\n });\n\n geom.rootBoneName = rootBoneItem.name;\n\n const boneNames: string[] = [];\n\n joints.forEach(joint => {\n let currentItem = treeNodeList[joint];\n const nodeList: string[] = [];\n\n while (currentItem && currentItem != rootBoneItem) {\n nodeList.push(currentItem.name);\n if (currentItem.parentId) {\n currentItem = id2Node[currentItem.parentId];\n } else {\n break;\n }\n }\n\n boneNames.push(nodeList.reverse().join('/'));\n });\n\n geom.boneNames = boneNames;\n\n return rootBoneItem;\n }\n}\n\nclass TreeInfo {\n tree2NodeList: Record<string, spec.VFXItemData[]> = {};\n nodeList2Tree: Record<string, spec.VFXItemData> = {};\n nodeId2Node: Record<string, spec.VFXItemData> = {};\n node2Path: Record<string, string> = {};\n\n add (treeItem: spec.VFXItemData, treeNodeList: spec.VFXItemData[]) {\n if (this.tree2NodeList[treeItem.id]) {\n throw new Error(`Duplicate treeItem ID detected: ${treeItem.id}. Ensure each tree item has a unique ID.`);\n }\n\n this.tree2NodeList[treeItem.id] = treeNodeList;\n treeNodeList.forEach(node => {\n if (this.nodeList2Tree[node.id]) {\n throw new Error(`Duplicate tree node ID found: ${node.id}. Each node in the tree must have a unique ID.`);\n }\n this.nodeList2Tree[node.id] = treeItem;\n this.nodeId2Node[node.id] = node;\n });\n\n treeNodeList.forEach(node => {\n this.setNodePath(node);\n });\n }\n\n setNodePath (node: spec.VFXItemData) {\n if (node.parentId) {\n if (this.node2Path[node.parentId]) {\n this.node2Path[node.id] = this.node2Path[node.parentId] + '/' + node.name;\n } else if (this.nodeId2Node[node.parentId]) {\n this.setNodePath(this.nodeId2Node[node.parentId]);\n this.node2Path[node.id] = this.node2Path[node.parentId] + '/' + node.name;\n } else {\n this.node2Path[node.id] = node.name;\n }\n } else {\n this.node2Path[node.id] = node.name;\n }\n }\n\n getTreeNodeListByTreeId (id: string) {\n return this.tree2NodeList[id];\n }\n\n getTreeNodeListByNodeId (id: string) {\n const treeItem = this.nodeList2Tree[id];\n\n if (!treeItem) {\n throw new Error(`Invalid id ${id}.`);\n }\n\n return this.getTreeNodeListByTreeId(treeItem.id);\n }\n\n getTreeItemByNodeId (id: string) {\n return this.nodeList2Tree[id];\n }\n\n getTreeNode (treeId: string, nodeIndex: number) {\n const nodeList = this.getTreeNodeListByTreeId(treeId);\n\n return nodeList[nodeIndex];\n }\n\n getAllTreeNodeList () {\n const nodeList: spec.VFXItemData[] = [];\n\n Object.keys(this.tree2NodeList).forEach(key => {\n nodeList.push(...this.tree2NodeList[key]);\n });\n\n return nodeList;\n }\n\n getNodePath (id: string) {\n return this.node2Path[id];\n }\n}\n\nexport interface ModelData {\n vertices: spec.TypedArray,\n uvs: spec.TypedArray,\n normals: spec.TypedArray,\n indices: spec.TypedArray,\n name: string,\n}\n\nexport function getGeometryDataFromOptions (geomOptions: GeometryProps) {\n let vertexCount = 0;\n let verticesType: spec.VertexFormatType = spec.VertexFormatType.Float32;\n let verticesNormalize = false;\n let uvsType: spec.VertexFormatType = spec.VertexFormatType.Float32;\n let uvsNormalize = false;\n let normalsType: spec.VertexFormatType = spec.VertexFormatType.Float32;\n let normalsNormalize = false;\n const modelData: ModelData = {\n vertices: new Float32Array(),\n uvs: new Float32Array(),\n normals: new Float32Array(),\n indices: new Float32Array(),\n name: geomOptions.name ?? '<empty>',\n };\n\n for (const attrib in geomOptions.attributes) {\n const attribData = geomOptions.attributes[attrib];\n\n if (attrib === 'aPosition') {\n // @ts-expect-error\n vertexCount = attribData.data.length / attribData.size;\n // @ts-expect-error\n modelData.vertices = attribData.data;\n verticesNormalize = attribData.normalize ?? false;\n verticesType = glType2VertexFormatType(attribData.type ?? glContext.FLOAT);\n } else if (attrib === 'aNormal') {\n // @ts-expect-error\n modelData.normals = attribData.data;\n normalsNormalize = attribData.normalize ?? false;\n normalsType = glType2VertexFormatType(attribData.type ?? glContext.FLOAT);\n } else if (attrib === 'aUV1') {\n // @ts-expect-error\n modelData.uvs = attribData.data;\n uvsNormalize = attribData.normalize ?? false;\n uvsType = glType2VertexFormatType(attribData.type ?? glContext.FLOAT);\n }\n }\n\n const verticesOffset = getOffset(verticesType, 3, vertexCount);\n const uvsOffset = getOffset(uvsType, 2, vertexCount);\n const normalsOffset = getOffset(normalsType, 3, vertexCount);\n\n if (geomOptions.indices) {\n modelData.indices = geomOptions.indices.data;\n } else if (vertexCount <= 65535) {\n const indices = new Uint16Array(vertexCount);\n\n for (let i = 0; i < vertexCount; i++) {\n indices[i] = i;\n }\n modelData.indices = indices;\n } else {\n const indices = new Uint32Array(vertexCount);\n\n for (let i = 0; i < vertexCount; i++) {\n indices[i] = i;\n }\n modelData.indices = indices;\n }\n\n let indicesType: spec.IndexFormatType = spec.IndexFormatType.UInt16;\n\n if (modelData.indices.BYTES_PER_ELEMENT === 4) {\n indicesType = spec.IndexFormatType.UInt32;\n }\n\n const geometryData: spec.GeometryData = {\n id: generateGUID(),\n dataType: spec.DataType.Geometry,\n vertexData: {\n vertexCount: vertexCount,\n channels: [\n {\n semantic: spec.VertexBufferSemantic.Position,\n offset: 0,\n format: verticesType,\n dimension: 3,\n normalize: verticesNormalize,\n },\n {\n semantic: spec.VertexBufferSemantic.Uv,\n offset: verticesOffset,\n format: uvsType,\n dimension: 2,\n normalize: uvsNormalize,\n },\n {\n semantic: spec.VertexBufferSemantic.Normal,\n offset: verticesOffset + uvsOffset,\n format: normalsType,\n dimension: 3,\n normalize: normalsNormalize,\n },\n ],\n },\n subMeshes: [],\n mode: spec.GeometryType.TRIANGLES,\n indexFormat: indicesType,\n indexOffset: verticesOffset + uvsOffset + normalsOffset,\n buffer: encodeVertexData(modelData),\n };\n\n return geometryData;\n}\n\nexport function getGeometryDataFromPropsList (geomPropsList: GeometryProps[]) {\n if (geomPropsList.length <= 0) {\n return;\n }\n\n let totalCount = 0;\n const subMeshes: spec.SubMesh[] = [];\n\n for (let i = 0; i < geomPropsList.length; i++) {\n const count = getDrawCount(geomPropsList[i]);\n const offset = totalCount + (geomPropsList[i].drawStart ?? 0);\n const scale = geomPropsList[0].indices?.data.BYTES_PER_ELEMENT ?? 1;\n\n subMeshes.push({ offset: offset * scale, indexCount: count, vertexCount: count });\n if (i) {\n const geom0 = geomPropsList[0];\n const geom1 = geomPropsList[i];\n\n let isSame = true;\n\n Object.keys(geom0.attributes).forEach(name => {\n const attrib = geom0.attributes[name];\n // @ts-expect-error\n const array1 = attrib.data as spec.TypedArray;\n // @ts-expect-error\n const array2 = geom1.attributes[name].data as spec.TypedArray;\n\n if (array1.length !== array2.length || array1[0] !== array2[0]) {\n isSame = false;\n }\n });\n\n if (isSame) {\n if (geom0.indices && geom1.indices) {\n geom0.indices.data = mergeTypedArray(geom0.indices.data, geom1.indices.data);\n }\n } else {\n if (geom0.indices && geom1.indices) {\n const vertexCount = getVertexCount(geom0);\n\n geom0.indices.data = mergeTypedArray(geom0.indices.data, geom1.indices.data, vertexCount);\n }\n\n Object.keys(geom0.attributes).forEach(name => {\n const attrib = geom0.attributes[name];\n // @ts-expect-error\n const array1 = attrib.data as spec.TypedArray;\n // @ts-expect-error\n const array2 = geom1.attributes[name].data as spec.TypedArray;\n\n // @ts-expect-error\n attrib.data = mergeTypedArray(array1, array2);\n });\n }\n\n }\n totalCount = offset + count;\n }\n\n return createGeometryData(geomPropsList[0], subMeshes);\n}\n\nfunction getOffset (formatType: spec.VertexFormatType, dimension: number, count: number) {\n switch (formatType) {\n case spec.VertexFormatType.Int8:\n case spec.VertexFormatType.UInt8:\n return dimension * count;\n case spec.VertexFormatType.Int16:\n case spec.VertexFormatType.UInt16:\n return dimension * count * 2;\n default:\n return dimension * count * 4;\n }\n}\n\nfunction createGeometryData (props: GeometryProps, subMeshes: spec.SubMesh[]) {\n let totalByteLength = 0;\n\n for (const attrib in props.attributes) {\n const attribData = props.attributes[attrib];\n\n // @ts-expect-error\n totalByteLength += attribData.data.byteLength;\n }\n\n if (props.indices) {\n totalByteLength += props.indices.data.byteLength;\n }\n\n let vertexCount = 0;\n let bufferOffset = 0;\n const buffer = new Uint8Array(totalByteLength);\n const vertexChannels: spec.VertexChannel[] = [];\n\n for (const attrib in props.attributes) {\n const attribData = props.attributes[attrib];\n const semantic = vertexBufferSemanticMap[attrib] ?? attrib;\n\n // @ts-expect-error\n vertexCount = attribData.data.length / attribData.size;\n const vertexChannel: spec.VertexChannel = {\n semantic,\n offset: bufferOffset,\n format: glType2VertexFormatType(attribData.type ?? glContext.FLOAT),\n dimension: attribData.size,\n normalize: attribData.normalize,\n };\n\n vertexChannels.push(vertexChannel);\n // @ts-expect-error\n const data = attribData.data as spec.TypedArray;\n const subBuffer = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n\n buffer.set(subBuffer, bufferOffset);\n bufferOffset += subBuffer.byteLength;\n }\n\n const geometryData: spec.GeometryData = {\n id: generateGUID(),\n dataType: spec.DataType.Geometry,\n vertexData: {\n vertexCount: vertexCount,\n channels: vertexChannels,\n },\n subMeshes,\n mode: spec.GeometryType.TRIANGLES,\n indexFormat: spec.IndexFormatType.None,\n indexOffset: 0,\n buffer: '',\n };\n\n if (props.indices) {\n const indices = props.indices.data;\n const subBuffer = new Uint8Array(indices.buffer, indices.byteOffset, indices.byteLength);\n\n buffer.set(subBuffer, bufferOffset);\n geometryData.indexOffset = bufferOffset;\n if (indices instanceof Uint32Array) {\n geometryData.indexFormat = spec.IndexFormatType.UInt32;\n } else {\n geometryData.indexFormat = spec.IndexFormatType.UInt16;\n }\n }\n\n geometryData.buffer = toBase64String(buffer);\n\n return geometryData;\n}\n\nfunction encodeVertexData (modelData: ModelData): string {\n const vertices = new Uint8Array(modelData.vertices.buffer, modelData.vertices.byteOffset, modelData.vertices.byteLength);\n const uvs = new Uint8Array(modelData.uvs.buffer, modelData.uvs.byteOffset, modelData.uvs.byteLength);\n const normals = new Uint8Array(modelData.normals.buffer, modelData.normals.byteOffset, modelData.normals.byteLength);\n const indices = new Uint8Array(modelData.indices.buffer, modelData.indices.byteOffset, modelData.indices.byteLength);\n\n // 计算新 ArrayBuffer 的总大小(以字节为单位)\n const totalSize = vertices.byteLength + uvs.byteLength + normals.byteLength + indices.byteLength;\n\n // 创建一个足够大的 ArrayBuffer 来存储两个数组的数据\n const buffer = new ArrayBuffer(totalSize);\n\n // 创建一个视图来按照 Float32 格式写入数据\n let floatView = new Uint8Array(buffer, 0, vertices.byteLength);\n\n floatView.set(vertices);\n floatView = new Uint8Array(buffer, vertices.byteLength, uvs.byteLength);\n floatView.set(uvs);\n floatView = new Uint8Array(buffer, vertices.byteLength + uvs.byteLength, normals.byteLength);\n floatView.set(normals);\n\n // 创建一个视图来按照 Uint16 格式写入数据,紧接着 Float32 数据之后\n const uint16View = new Uint8Array(buffer, vertices.byteLength + uvs.byteLength + normals.byteLength, indices.byteLength);\n\n uint16View.set(indices);\n\n // 创建一个 Uint8Array 视图以便逐字节访问 ArrayBuffer 的数据\n const uint8View = new Uint8Array(buffer);\n\n // 将 Uint8Array 转换为二进制字符串\n let binaryString = '';\n\n for (let i = 0; i < uint8View.length; i++) {\n binaryString += String.fromCharCode(uint8View[i]);\n }\n\n // 使用 btoa 函数将二进制字符串转换为 Base64 编码的字符串\n return btoa(binaryString);\n}\n\nfunction toBase64String (array: Uint8Array) {\n // 将 Uint8Array 转换为二进制字符串\n let binaryString = '';\n\n for (let i = 0; i < array.length; i++) {\n binaryString += String.fromCharCode(array[i]);\n }\n\n // 使用 btoa 函数将二进制字符串转换为 Base64 编码的字符串\n return btoa(binaryString);\n}\n\nfunction getDrawCount (geomProps: GeometryProps) {\n if (geomProps.drawCount) {\n return geomProps.drawCount;\n } else if (geomProps.indices) {\n return geomProps.indices.data.length;\n } else {\n let drawCount = 0;\n\n // @ts-expect-error\n geomProps.attributes.forEach(attrib => {\n drawCount = attrib.data.length / attrib.size;\n });\n\n return drawCount;\n }\n}\n\nfunction getVertexCount (geomProps: GeometryProps) {\n let vertexCount = 0;\n\n Object.keys(geomProps.attributes).forEach(name => {\n const attrib = geomProps.attributes[name];\n\n // @ts-expect-error\n vertexCount = attrib.data.length / attrib.size;\n });\n\n return vertexCount;\n}\n\nfunction mergeTypedArray (array1: spec.TypedArray, array2: spec.TypedArray, offset?: number) {\n if (array1 instanceof Float32Array) {\n const result = new Float32Array(array1.length + array2.length);\n\n result.set(array1);\n result.set(array2, array1.length);\n\n return result;\n } else if (array1 instanceof Int32Array) {\n const result = new Int32Array(array1.length + array2.length);\n\n result.set(array1);\n result.set(array2, array1.length);\n\n return result;\n } else if (array1 instanceof Uint32Array) {\n const result = new Uint32Array(array1.length + array2.length);\n\n result.set(array1);\n result.set(array2, array1.length);\n if (offset) {\n for (let i = 0; i < array2.length; i++) {\n result[array1.length + i] += offset;\n }\n }\n\n return result;\n } else if (array1 instanceof Int16Array) {\n const result = new Int16Array(array1.length + array2.length);\n\n result.set(array1);\n result.set(array2, array1.length);\n\n return result;\n } else if (array1 instanceof Uint16Array) {\n const result = new Uint16Array(array1.length + array2.length);\n\n result.set(array1);\n result.set(array2, array1.length);\n if (offset) {\n for (let i = 0; i < array2.length; i++) {\n result[array1.length + i] += offset;\n }\n }\n\n return result;\n } else if (array1 instanceof Int8Array) {\n const result = new Int8Array(array1.length + array2.length);\n\n result.set(array1);\n result.set(array2, array1.length);\n\n return result;\n } else {\n const result = new Uint8Array(array1.length + array2.length);\n\n result.set(array1);\n result.set(array2, array1.length);\n\n return result;\n }\n}\n\nconst vertexBufferSemanticMap: Record<string, string> = {\n aPos: 'POSITION',\n aUV: 'TEXCOORD0',\n aUV2: 'TEXCOORD1',\n aNormal: 'NORMAL',\n aTangent: 'TANGENT',\n aColor: 'COLOR',\n aJoints: 'JOINTS',\n aWeights: 'WEIGHTS',\n //\n a_Position: 'POSITION',\n a_UV: 'TEXCOORD0',\n a_UV1: 'TEXCOORD0',\n a_UV2: 'TEXCOORD1',\n a_Normal: 'NORMAL',\n a_Tangent: 'TANGENT',\n a_Color: 'COLOR',\n a_Joints: 'JOINTS',\n a_Joint1: 'JOINTS',\n a_Weights: 'WEIGHTS',\n a_Weight1: 'WEIGHTS',\n //\n a_Target_Position0: 'POSITION_BS0',\n a_Target_Position1: 'POSITION_BS1',\n a_Target_Position2: 'POSITION_BS2',\n a_Target_Position3: 'POSITION_BS3',\n a_Target_Position4: 'POSITION_BS4',\n a_Target_Position5: 'POSITION_BS5',\n a_Target_Position6: 'POSITION_BS6',\n a_Target_Position7: 'POSITION_BS7',\n a_Target_Normal0: 'NORMAL_BS0',\n a_Target_Normal1: 'NORMAL_BS1',\n a_Target_Normal2: 'NORMAL_BS2',\n a_Target_Normal3: 'NORMAL_BS3',\n a_Target_Tangent0: 'TANGENT_BS0',\n a_Target_Tangent1: 'TANGENT_BS1',\n a_Target_Tangent2: 'TANGENT_BS2',\n a_Target_Tangent3: 'TANGENT_BS3',\n};\n","import { spec, generateGUID, glContext, addItem, loadImage, Transform, Geometry } from '@galacean/effects';\nimport type { TextureSourceOptions, TextureCubeSourceOptionsImageMipmaps, math, TransformProps, Engine, Texture, Attribute } from '@galacean/effects';\nimport type {\n SkyboxType, LoadSceneOptions, LoadSceneResult, Loader, ModelCamera, ModelLight, ModelSkybox, ModelImageLike,\n} from './protocol';\nimport type {\n ModelMeshComponentData,\n ModelSkyboxComponentData,\n ModelLightComponentData,\n ModelCameraComponentData,\n ModelAnimationOptions,\n ModelAnimTrackOptions,\n ModelMaterialOptions,\n ModelSkyboxOptions,\n ModelTextureTransform,\n} from '../index';\nimport {\n Vector3, Box3, Euler, PSkyboxCreator, PSkyboxType, UnlitShaderGUID, PBRShaderGUID,\n} from '../runtime';\nimport { LoaderHelper } from './loader-helper';\nimport { WebGLHelper } from '../utility';\nimport type { PImageBufferData, PSkyboxBufferParams, PSkyboxURLParams } from '../runtime/skybox';\nimport type {\n GLTFMesh, GLTFImage, GLTFMaterial, GLTFTexture, GLTFLight,\n GLTFCamera, GLTFAnimation, GLTFResources, GLTFImageBasedLight, GLTFPrimitive,\n GLTFBufferAttribute, GLTFBounds, GLTFTextureInfo,\n} from '@vvfx/resource-detection';\nimport type { CubeImage } from '@vvfx/resource-detection/dist/src/gltf-tools/gltf-image-based-light';\n\nexport interface LoaderOptions {\n compatibleMode?: 'gltf' | 'tiny3d',\n}\n\nexport function getDefaultEffectsGLTFLoader (engine: Engine, options?: LoaderOptions): Loader {\n if (!defaultGLTFLoader) {\n defaultGLTFLoader = new LoaderImpl();\n }\n\n (defaultGLTFLoader as LoaderImpl).initial(engine, options);\n\n return defaultGLTFLoader;\n}\n\nexport function setDefaultEffectsGLTFLoader (loader: Loader): void {\n defaultGLTFLoader = loader;\n}\n\nlet defaultGLTFLoader: Loader;\n\ntype Box3 = math.Box3;\n\nexport class LoaderImpl implements Loader {\n private sceneOptions: LoadSceneOptions;\n private loaderOptions: LoaderOptions;\n private gltfMeshs: GLTFMesh[] = [];\n private gltfTextures: GLTFTexture[] = [];\n private gltfMaterials: GLTFMaterial[] = [];\n private gltfAnimations: GLTFAnimation[] = [];\n private gltfImageBasedLights: GLTFImageBasedLight[] = [];\n\n composition: spec.CompositionData;\n timelineAssetId: string = '';\n images: spec.Image[] = [];\n imageElements: ModelImageLike[] = [];\n textures: spec.TextureDefine[] = [];\n items: spec.VFXItemData[] = [];\n components: spec.ComponentData[] = [];\n materials: spec.MaterialData[] = [];\n shaders: spec.ShaderData[] = [];\n geometries: spec.GeometryData[] = [];\n animations: spec.AnimationClipData[] = [];\n sceneAABB = new Box3();\n\n engine: Engine;\n\n constructor (composition?: spec.CompositionData) {\n if (composition) {\n this.composition = composition;\n } else {\n this.timelineAssetId = generateGUID();\n this.composition = {\n id: '1',\n name: 'test1',\n duration: 99999,\n endBehavior: spec.EndBehavior.restart,\n camera: {\n fov: 45,\n far: 2000,\n near: 0.001,\n position: [0, 0, 8],\n rotation: [0, 0, 0],\n clipMode: spec.CameraClipMode.portrait,\n },\n //@ts-expect-error\n items: [],\n timelineAsset: { id: this.timelineAssetId },\n sceneBindings: [],\n };\n }\n }\n\n async loadScene (options: LoadSceneOptions): Promise<LoadSceneResult> {\n this.clear();\n this.sceneOptions = options;\n this.loaderOptions = { compatibleMode: options.gltf.compatibleMode };\n const gltfResource = options.gltf.resource;\n\n if (typeof gltfResource === 'string' || gltfResource instanceof Uint8Array) {\n throw new Error('Please load the resource using GLTFTools first.');\n }\n\n this.images = gltfResource.images.map(gltfImage => {\n const blob = new Blob([gltfImage.imageData.buffer], { type: gltfImage.mimeType ?? 'image/png' });\n\n return {\n id: gltfImage.id,\n url: URL.createObjectURL(blob),\n };\n });\n\n this.imageElements = await Promise.all(this.images.map(async image => {\n return loadImage(image.url);\n }));\n\n this.processGLTFResource(gltfResource, this.imageElements);\n this.gltfMeshs = gltfResource.meshes;\n this.gltfTextures = gltfResource.textures;\n this.gltfMaterials = gltfResource.materials;\n this.gltfAnimations = gltfResource.animations;\n this.gltfImageBasedLights = gltfResource.imageBasedLights;\n\n this.textures = this.gltfTextures.map(texture => {\n const textureOptions = texture.textureOptions;\n const source = textureOptions.source;\n\n if (typeof source === 'number') {\n textureOptions.source = {\n id: this.images[source].id,\n };\n }\n\n return textureOptions;\n });\n this.materials = this.gltfMaterials.map(material => {\n return material.materialData;\n });\n\n gltfResource.meshes.forEach(mesh => {\n this.geometries.push(mesh.geometryData);\n });\n const gltfScene = gltfResource.scenes[0];\n\n gltfScene.meshesComponentData.forEach(mesh => this.checkMeshComponentData(mesh, gltfResource));\n\n this.components.push(...gltfScene.camerasComponentData);\n this.components.push(...gltfScene.lightsComponentData);\n this.components.push(...gltfScene.meshesComponentData);\n if (gltfScene.animationsComponentData.length === 1) {\n const component = gltfScene.animationsComponentData[0];\n\n if (!options.effects.playAllAnimation && options.effects.playAnimation !== undefined) {\n const clips = component.animationClips;\n const index = options.effects.playAnimation;\n\n if (index >= 0 && index < clips.length) {\n component.animationClips = [clips[index]];\n } else {\n component.animationClips = [];\n }\n }\n this.components.push(component);\n } else if (gltfScene.animationsComponentData.length > 1) {\n throw new Error(`Find many animation component data ${gltfScene.animationsComponentData.length}`);\n }\n\n this.animations = [];\n this.gltfAnimations.forEach(anim => {\n this.animations.push(anim.animationClipData);\n });\n\n this.items = [];\n\n await this.tryAddSkybox({\n skyboxType: options.gltf.skyboxType,\n renderable: options.gltf.skyboxVis,\n });\n\n this.items.push(...gltfResource.scenes[0].vfxItemData);\n this.items.forEach(item => {\n if (item.type === 'root' as spec.ItemType) {\n item.type = 'ECS' as spec.ItemType;\n }\n });\n\n return this.getLoadResult();\n }\n\n processGLTFResource (resource: GLTFResources, imageElements: ModelImageLike[]): void {\n const textureDataMap: Record<string, TextureSourceOptions> = {};\n const { textures, materials, scenes, imageBasedLights } = resource;\n\n textures.forEach(tex => {\n const texData = tex.textureOptions;\n const texId = (texData as unknown as spec.EffectsObjectData).id;\n\n if (texId) {\n if (textureDataMap[texId]) {\n console.error(`Duplicate GUID found: ${texId}, old ${textureDataMap[texId]}, new ${texData}.`);\n }\n textureDataMap[texId] = texData;\n } else {\n console.error(`No GUID in texture Data: ${texData}.`);\n }\n });\n\n const baseColorIdSet: Set<string> = new Set();\n const emissiveIdSet: Set<string> = new Set();\n\n materials.forEach(mat => {\n const materialData = mat.materialData;\n const baseColorTexture = materialData.textures['_BaseColorSampler']?.texture;\n const emissiveTexture = materialData.textures['_EmissiveSampler']?.texture;\n\n if (baseColorTexture) {\n baseColorIdSet.add(baseColorTexture.id);\n }\n if (emissiveTexture) {\n emissiveIdSet.add(emissiveTexture.id);\n }\n });\n\n let addTextures = 0;\n const textureIdMap: Record<string, string> = {};\n\n for (const baseColorId of baseColorIdSet) {\n if (emissiveIdSet.has(baseColorId)) {\n const texData = textures.find(tex => tex.textureOptions.id === baseColorId);\n\n if (texData) {\n const newId = generateGUID();\n const newTexData = texData.clone();\n\n newTexData.textureOptions.id = newId;\n textures.push(newTexData);\n textureDataMap[newId] = newTexData.textureOptions;\n textureIdMap[baseColorId] = newId;\n addTextures += 1;\n }\n }\n }\n\n if (addTextures > 0) {\n console.warn(`Add base color texture ${addTextures}`);\n }\n\n materials.forEach(mat => {\n const materialData = mat.materialData;\n\n this.processMaterialData(materialData);\n\n if (materialData.shader?.id === UnlitShaderGUID) {\n this.processMaterialTexture(materialData, '_BaseColorSampler', true, textureDataMap, imageElements);\n } else if (materialData.shader?.id === PBRShaderGUID) {\n const emissiveTexture = materialData.textures['_EmissiveSampler']?.texture;\n\n if (emissiveTexture && textureIdMap[emissiveTexture.id]) {\n emissiveTexture.id = textureIdMap[emissiveTexture.id];\n }\n\n this.processMaterialTexture(materialData, '_BaseColorSampler', true, textureDataMap, imageElements);\n this.processMaterialTexture(materialData, '_MetallicRoughnessSampler', false, textureDataMap, imageElements);\n this.processMaterialTexture(materialData, '_NormalSampler', false, textureDataMap, imageElements);\n this.processMaterialTexture(materialData, '_OcclusionSampler', false, textureDataMap, imageElements);\n this.processMaterialTexture(materialData, '_EmissiveSampler', false, textureDataMap, imageElements);\n }\n });\n\n const gltfScene = scenes[0];\n\n gltfScene.camerasComponentData.forEach(comp => this.processCameraComponentData(comp));\n gltfScene.lightsComponentData.forEach(comp => this.processLightComponentData(comp));\n\n const cubeTextures: TextureSourceOptions[] = [];\n\n imageBasedLights.forEach(ibl => {\n const data = ibl.imageBaseLightData;\n\n if (data.reflectionsIntensity === undefined) {\n data.reflectionsIntensity = data.intensity;\n }\n\n if (data.diffuseImage) {\n const diffuseTexture = textureDataMap[data.diffuseImage.id];\n\n addItem(cubeTextures, diffuseTexture);\n }\n if (data.specularImage) {\n const specularImage = textureDataMap[data.specularImage.id];\n\n addItem(cubeTextures, specularImage);\n }\n });\n\n cubeTextures.forEach(tex => {\n if (tex.target === glContext.TEXTURE_CUBE_MAP) {\n const cube = tex as TextureCubeSourceOptionsImageMipmaps;\n\n cube.mipmaps.forEach(mipmap => {\n [mipmap[4], mipmap[5]] = [mipmap[5], mipmap[4]];\n });\n\n if (cube.mipmaps.length === 1) {\n cube.minFilter = glContext.LINEAR;\n cube.magFilter = glContext.LINEAR;\n } else {\n cube.minFilter = glContext.LINEAR_MIPMAP_LINEAR;\n cube.magFilter = glContext.LINEAR;\n }\n }\n });\n }\n\n processComponentData (components: spec.EffectComponentData[]): void {\n components.forEach(comp => {\n if (comp.dataType === spec.DataType.LightComponent) {\n this.processLightComponentData(comp as unknown as ModelLightComponentData);\n } else if (comp.dataType === spec.DataType.CameraComponent) {\n this.processCameraComponentData(comp as unknown as ModelCameraComponentData);\n } else if (comp.dataType === spec.DataType.SkyboxComponent) {\n this.processSkyboxComponentData(comp as unknown as ModelSkyboxComponentData);\n }\n });\n }\n\n processLightComponentData (light: ModelLightComponentData): void {\n if (!light.color) {\n light.color = { r: 1, g: 1, b: 1, a: 1 };\n }\n\n if (!light.intensity) {\n light.intensity = 1;\n }\n\n if (light.lightType === spec.LightType.point) {\n if (!light.range) {\n light.range = 0;\n }\n } else if (light.lightType === spec.LightType.spot) {\n if (!light.range) {\n light.range = 0;\n }\n\n if (!light.innerConeAngle) {\n light.innerConeAngle = 0;\n }\n\n if (!light.outerConeAngle) {\n light.outerConeAngle = Math.PI / 4;\n }\n }\n }\n\n processCameraComponentData (camera: ModelCameraComponentData): void {\n if (camera.type === spec.CameraType.perspective) {\n if (camera.fov) {\n camera.fov *= Math.PI / 180;\n }\n }\n }\n\n processSkyboxComponentData (skybox: ModelSkyboxComponentData): void {\n if (skybox.intensity === undefined) {\n skybox.intensity = 1;\n }\n\n if (skybox.reflectionsIntensity === undefined) {\n skybox.reflectionsIntensity = 1;\n }\n }\n\n processMaterialData (material: spec.MaterialData): void {\n if (material.shader?.id === UnlitShaderGUID) {\n if (!material.colors['_BaseColorFactor']) {\n material.colors['_BaseColorFactor'] = { r: 1, g: 1, b: 1, a: 1 };\n }\n\n if (material.floats['_AlphaCutoff'] === undefined) {\n material.floats['_AlphaCutoff'] = 0;\n }\n\n if (material.floats['ZWrite'] === undefined) {\n material.floats['ZWrite'] = 1;\n }\n\n if (material.floats['ZTest'] === undefined) {\n material.floats['ZTest'] = 1;\n }\n\n if (!material.stringTags['RenderType']) {\n material.stringTags['RenderType'] = spec.RenderType.Opaque;\n }\n\n if (!material.stringTags['RenderFace']) {\n material.stringTags['RenderFace'] = spec.RenderFace.Front;\n }\n } else if (material.shader?.id === PBRShaderGUID) {\n if (!material.colors['_BaseColorFactor']) {\n material.colors['_BaseColorFactor'] = { r: 1, g: 1, b: 1, a: 1 };\n }\n\n if (material.floats['_SpecularAA'] === undefined) {\n material.floats['_SpecularAA'] = 0;\n }\n\n if (material.floats['_MetallicFactor'] === undefined) {\n material.floats['_MetallicFactor'] = 1;\n }\n\n if (material.floats['_RoughnessFactor'] === undefined) {\n material.floats['_RoughnessFactor'] = 0;\n }\n\n if (material.floats['_NormalScale'] === undefined) {\n material.floats['_NormalScale'] = 1;\n }\n\n if (material.floats['_OcclusionStrength'] === undefined) {\n material.floats['_OcclusionStrength'] = this.isTiny3dMode() ? 0 : 1;\n }\n\n if (!material.colors['_EmissiveFactor']) {\n material.colors['_EmissiveFactor'] = { r: 0, g: 0, b: 0, a: 1 };\n }\n\n if (material.floats['_EmissiveIntensity'] === undefined) {\n material.floats['_EmissiveIntensity'] = 1;\n }\n\n if (material.floats['_AlphaCutoff'] === undefined) {\n material.floats['_AlphaCutoff'] = 0;\n }\n\n if (material.floats['ZWrite'] === undefined) {\n material.floats['ZWrite'] = 1;\n }\n\n if (material.floats['ZTest'] === undefined) {\n material.floats['ZTest'] = 1;\n }\n\n if (!material.stringTags['RenderType']) {\n material.stringTags['RenderType'] = spec.RenderType.Opaque;\n }\n\n if (!material.stringTags['RenderFace']) {\n material.stringTags['RenderFace'] = spec.RenderFace.Front;\n }\n } else {\n console.error(`Encountered unknown shader ID in material with ID: ${material.id}.`);\n }\n }\n\n processTextureOptions (options: TextureSourceOptions, isBaseColor: boolean, image?: ModelImageLike): void {\n let premultiplyAlpha = false;\n let minFilter = options.minFilter ?? glContext.LINEAR_MIPMAP_LINEAR;\n\n if (this.isTiny3dMode()) {\n minFilter = glContext.LINEAR_MIPMAP_LINEAR;\n if (image) {\n if (!WebGLHelper.isPow2(image.width) || !WebGLHelper.isPow2(image.height)) {\n minFilter = glContext.LINEAR;\n }\n }\n\n premultiplyAlpha = isBaseColor ? false : true;\n }\n\n const generateMipmap = minFilter == glContext.NEAREST_MIPMAP_NEAREST\n || minFilter == glContext.LINEAR_MIPMAP_NEAREST\n || minFilter == glContext.NEAREST_MIPMAP_LINEAR\n || minFilter == glContext.LINEAR_MIPMAP_LINEAR;\n\n options.wrapS = options.wrapS ?? glContext.REPEAT;\n options.wrapT = options.wrapT ?? glContext.REPEAT;\n options.magFilter = options.magFilter ?? glContext.LINEAR;\n options.minFilter = minFilter;\n options.anisotropic = 1;\n options.premultiplyAlpha = premultiplyAlpha;\n options.generateMipmap = generateMipmap;\n }\n\n initial (engine: Engine, options?: LoaderOptions) {\n this.engine = engine;\n this.loaderOptions = options ?? {};\n }\n\n checkMeshComponentData (mesh: ModelMeshComponentData, resource: GLTFResources): void {\n if (mesh.materials.length <= 0) {\n throw new Error(`Submesh array is empty for mesh with ID: ${mesh.id}.`);\n }\n\n let geometryData: spec.GeometryData | undefined;\n\n resource.meshes.forEach(meshData => {\n if (meshData.geometryData.id === mesh.geometry.id) {\n geometryData = meshData.geometryData;\n }\n });\n\n if (geometryData === undefined) {\n throw new Error(`Unable to find geometry data for mesh with ID: ${mesh.geometry.id}.`);\n }\n\n if (geometryData.subMeshes.length !== mesh.materials.length) {\n throw new Error(`Mismatch between submeshes count (${geometryData.subMeshes.length}) and materials count (${mesh.materials.length}).`);\n }\n }\n\n processMaterialTexture (material: spec.MaterialData, textureName: string, isBaseColor: boolean, textureDataMap: Record<string, TextureSourceOptions>, imageElements: ModelImageLike[]) {\n const texture = material.textures[textureName];\n\n if (texture) {\n const id = texture.texture.id;\n const texData = textureDataMap[id];\n let imageObj: ModelImageLike | undefined;\n\n // @ts-expect-error\n if (typeof texData.source !== 'number') {\n // @ts-expect-error\n throw new Error(`Invalid texture option source data, ${texData.source}`);\n } else {\n // @ts-expect-error\n imageObj = imageElements[texData.source];\n }\n if (texData) {\n this.processTextureOptions(texData, isBaseColor, imageObj);\n }\n }\n }\n\n getLoadResult (): LoadSceneResult {\n const itemIds: spec.DataPath[] = [];\n\n this.items.forEach(item => itemIds.push({ id: item.id }));\n //@ts-expect-error\n this.composition.items = itemIds;\n\n const jsonScene: spec.JSONScene = {\n version: spec.JSONSceneVersion['3_0'],\n playerVersion: {\n web: '2.0',\n native: '2.0',\n },\n type: 'ge',\n compositionId: this.composition.id,\n compositions: [this.composition],\n images: this.images,\n plugins: ['model'],\n textures: this.textures,\n items: this.items,\n components: this.components,\n materials: this.materials,\n shaders: this.shaders,\n geometries: this.geometries,\n animations: this.animations,\n miscs: [\n {\n id: this.timelineAssetId,\n dataType: spec.DataType.TimelineAsset,\n },\n ],\n };\n\n const sceneAABB = this.computeSceneAABB();\n\n return {\n source: this.getRemarkString(),\n jsonScene,\n sceneAABB: {\n min: sceneAABB.min.toArray(),\n max: sceneAABB.max.toArray(),\n },\n };\n }\n\n addLight (data: ModelLight) {\n const itemId = generateGUID();\n const component: spec.ModelLightComponentData = {\n id: generateGUID(),\n item: { id: itemId },\n dataType: spec.DataType.LightComponent,\n //\n lightType: data.lightType,\n color: data.color,\n intensity: data.intensity,\n range: data.range,\n innerConeAngle: data.innerConeAngle,\n outerConeAngle: data.outerConeAngle,\n followCamera: data.followCamera,\n };\n const item: spec.VFXItemData = {\n id: itemId,\n name: data.name,\n duration: data.duration,\n type: spec.ItemType.light,\n pn: 0,\n visible: true,\n endBehavior: data.endBehavior,\n transform: {\n position: {\n x: data.position[0],\n y: data.position[1],\n z: data.position[2],\n },\n eulerHint: {\n x: data.rotation[0],\n y: data.rotation[1],\n z: data.rotation[2],\n },\n scale: {\n x: data.scale[0],\n y: data.scale[1],\n z: data.scale[2],\n },\n },\n components: [\n { id: component.id },\n ],\n content: {},\n dataType: spec.DataType.VFXItemData,\n };\n\n this.items.push(item);\n this.components.push(component);\n }\n\n addCamera (camera: ModelCamera) {\n const itemId = generateGUID();\n const component: spec.ModelCameraComponentData = {\n id: generateGUID(),\n item: { id: itemId },\n dataType: spec.DataType.CameraComponent,\n fov: camera.fov,\n near: camera.near,\n far: camera.far,\n clipMode: camera.clipMode,\n };\n const item: spec.VFXItemData = {\n id: itemId,\n name: camera.name,\n duration: camera.duration,\n // @ts-expect-error\n type: 'camera',\n pn: 0,\n visible: true,\n endBehavior: camera.endBehavior,\n transform: {\n position: {\n x: camera.position[0],\n y: camera.position[1],\n z: camera.position[2],\n },\n eulerHint: {\n x: camera.rotation[0],\n y: camera.rotation[1],\n z: camera.rotation[2],\n },\n scale: {\n x: 1,\n y: 1,\n z: 1,\n },\n },\n components: [\n { id: component.id },\n ],\n content: {},\n dataType: spec.DataType.VFXItemData,\n };\n\n this.items.push(item);\n this.components.push(component);\n }\n\n addSkybox (skybox: PSkyboxURLParams) {\n const itemId = generateGUID();\n const skyboxInfo = PSkyboxCreator.createSkyboxComponentData(skybox);\n const { imageList, textureOptionsList, component } = skyboxInfo;\n\n component.item.id = itemId;\n if (skybox.intensity !== undefined) {\n component.intensity = skybox.intensity;\n }\n if (skybox.reflectionsIntensity !== undefined) {\n component.reflectionsIntensity = skybox.reflectionsIntensity;\n }\n component.renderable = skybox.renderable ?? false;\n\n const item: spec.VFXItemData = {\n id: itemId,\n name: 'Skybox-Customize',\n duration: 999,\n type: spec.ItemType.skybox,\n pn: 0,\n visible: true,\n endBehavior: spec.EndBehavior.freeze,\n transform: {\n position: {\n x: 0,\n y: 0,\n z: 0,\n },\n eulerHint: {\n x: 0,\n y: 0,\n z: 0,\n },\n scale: {\n x: 1,\n y: 1,\n z: 1,\n },\n },\n components: [\n { id: component.id },\n ],\n content: {},\n dataType: spec.DataType.VFXItemData,\n };\n\n this.images.push(...imageList);\n // @ts-expect-error\n this.textures.push(...textureOptionsList);\n this.items.push(item);\n this.components.push(component);\n }\n\n private async tryAddSkybox (skybox: ModelSkybox) {\n if (this.gltfImageBasedLights.length > 0 && !this.ignoreSkybox()) {\n const ibl = this.gltfImageBasedLights[0];\n\n this.components.push(ibl.imageBaseLightData);\n } else if (skybox.skyboxType !== undefined) {\n const itemId = generateGUID();\n const skyboxInfo = this.createSkyboxComponentData(skybox.skyboxType as SkyboxType);\n const { imageList, textureOptionsList, component } = skyboxInfo;\n\n component.item.id = itemId;\n if (skybox.intensity !== undefined) {\n component.intensity = skybox.intensity;\n }\n if (skybox.reflectionsIntensity !== undefined) {\n component.reflectionsIntensity = skybox.reflectionsIntensity;\n }\n component.renderable = skybox.renderable ?? false;\n\n const item: spec.VFXItemData = {\n id: itemId,\n name: `Skybox-${skybox.skyboxType}`,\n duration: skybox.duration ?? 999,\n type: spec.ItemType.skybox,\n pn: 0,\n visible: true,\n endBehavior: spec.EndBehavior.freeze,\n transform: {\n position: {\n x: 0,\n y: 0,\n z: 0,\n },\n eulerHint: {\n x: 0,\n y: 0,\n z: 0,\n },\n scale: {\n x: 1,\n y: 1,\n z: 1,\n },\n },\n components: [\n { id: component.id },\n ],\n content: {},\n dataType: spec.DataType.VFXItemData,\n };\n\n this.images.push(...imageList);\n // @ts-expect-error\n this.textures.push(...textureOptionsList);\n this.items.push(item);\n this.components.push(component);\n }\n }\n\n createSkyboxComponentData (typeName: SkyboxType) {\n if (typeName !== 'NFT' && typeName !== 'FARM') {\n throw new Error(`Invalid skybox type specified: '${typeName}'. Valid types are: 'NFT', 'FARM'.`);\n }\n //\n const typ = typeName === 'NFT' ? PSkyboxType.NFT : PSkyboxType.FARM;\n const params = PSkyboxCreator.getSkyboxParams(typ);\n\n return PSkyboxCreator.createSkyboxComponentData(params);\n }\n\n dispose () {\n this.clear();\n // @ts-expect-error\n this.engine = null;\n }\n\n clear () {\n this.gltfMeshs = [];\n this.gltfTextures = [];\n this.gltfMaterials = [];\n this.gltfAnimations = [];\n this.gltfImageBasedLights = [];\n\n this.images = [];\n this.imageElements = [];\n this.textures = [];\n this.items = [];\n this.components = [];\n this.materials = [];\n this.shaders = [];\n this.geometries = [];\n this.animations = [];\n }\n\n private computeSceneAABB () {\n const geometryDataMap: Record<string, GLTFMesh> = {};\n\n this.gltfMeshs.forEach(mesh => {\n const id = mesh.geometryData.id;\n\n geometryDataMap[id] = mesh;\n });\n const componentDataMap: Record<string, GLTFMesh> = {};\n\n this.components.forEach(component => {\n if (component.dataType === spec.DataType.MeshComponent) {\n const meshComponent = component as spec.ModelMeshComponentData;\n\n componentDataMap[component.id] = geometryDataMap[meshComponent.geometry.id];\n }\n });\n\n const sceneAABB = new Box3();\n const parentTransformMap: Record<string, Transform> = {};\n\n this.items.forEach(item => {\n const parentId = item.parentId ?? '';\n const parentTransform = parentTransformMap[parentId] ?? new Transform();\n const props: TransformProps = {};\n\n if (item.transform) {\n props.position = new Vector3().copyFrom(item.transform.position);\n props.rotation = Euler.fromVector3(item.transform.eulerHint as Vector3);\n props.scale = new Vector3().copyFrom(item.transform.scale);\n }\n const transform = new Transform(props, parentTransform);\n\n parentTransformMap[item.id] = transform;\n item.components.forEach(component => {\n const mesh = componentDataMap[component.id];\n\n if (mesh && mesh.bounds) {\n const minPos = Vector3.fromArray(mesh.bounds.box.min);\n const maxPos = Vector3.fromArray(mesh.bounds.box.max);\n\n sceneAABB.union(new Box3(minPos, maxPos));\n }\n });\n });\n\n return sceneAABB;\n }\n\n isPlayAnimation (): boolean {\n return this.sceneOptions.effects.playAnimation !== undefined;\n }\n\n isPlayAllAnimation (): boolean {\n return this.sceneOptions.effects.playAllAnimation === true;\n }\n\n getRemarkString (): string {\n const remark = this.sceneOptions.gltf.remark;\n\n if (remark === undefined) {\n return 'Unknown';\n } else if (typeof remark === 'string') {\n return remark;\n } else {\n return 'BinaryBuffer';\n }\n }\n\n getCompositionDuration () {\n return this.composition.duration;\n }\n\n isTiny3dMode (): boolean {\n return this.loaderOptions.compatibleMode === 'tiny3d';\n }\n\n getItemDuration (): number {\n return this.sceneOptions.effects.duration ?? 9999;\n }\n\n getEndBehavior (): spec.EndBehavior {\n return this.sceneOptions.effects.endBehavior ?? spec.EndBehavior.restart;\n }\n\n getSkyboxType (): PSkyboxType | undefined {\n const typeName = this.sceneOptions.gltf.skyboxType;\n\n switch (typeName) {\n case 'NFT': return PSkyboxType.NFT;\n case 'FARM': return PSkyboxType.FARM;\n }\n }\n\n isSkyboxVis (): boolean {\n return this.sceneOptions.gltf.skyboxVis === true;\n }\n\n ignoreSkybox (): boolean {\n return this.sceneOptions.gltf.ignoreSkybox === true;\n }\n\n isEnvironmentTest (): boolean {\n if (typeof this.sceneOptions.gltf.remark === 'string') {\n return this.sceneOptions.gltf.remark.includes('EnvironmentTest');\n } else {\n return false;\n }\n }\n\n /**\n * for old scene compatibility\n */\n\n processLight (lights: GLTFLight[], fromGLTF: boolean): void {\n lights.forEach(l => {\n if (l.color === undefined) {\n if (fromGLTF) { l.color = [255, 255, 255, 255]; } else { l.color = [1, 1, 1, 1]; }\n } else {\n l.color[0] = this.scaleColorVal(l.color[0], fromGLTF);\n l.color[1] = this.scaleColorVal(l.color[1], fromGLTF);\n l.color[2] = this.scaleColorVal(l.color[2], fromGLTF);\n l.color[3] = this.scaleColorVal(l.color[3], fromGLTF);\n }\n });\n }\n\n processCamera (cameras: GLTFCamera[], fromGLTF: boolean): void {\n const scale = fromGLTF ? 180.0 / Math.PI : Math.PI / 180.0;\n\n cameras.forEach(camera => {\n if (camera.perspective !== undefined) {\n camera.perspective.yfov *= scale;\n }\n });\n }\n\n processMaterial (materials: GLTFMaterial[], fromGLTF: boolean): void {\n materials.forEach(mat => {\n if (mat.baseColorFactor === undefined) {\n if (fromGLTF) { mat.baseColorFactor = [255, 255, 255, 255]; } else { mat.baseColorFactor = [1, 1, 1, 1]; }\n } else {\n mat.baseColorFactor[0] = this.scaleColorVal(mat.baseColorFactor[0], fromGLTF);\n mat.baseColorFactor[1] = this.scaleColorVal(mat.baseColorFactor[1], fromGLTF);\n mat.baseColorFactor[2] = this.scaleColorVal(mat.baseColorFactor[2], fromGLTF);\n mat.baseColorFactor[3] = this.scaleColorVal(mat.baseColorFactor[3], fromGLTF);\n }\n\n if (mat.emissiveFactor === undefined) {\n if (fromGLTF) { mat.emissiveFactor = [255, 255, 255, 255]; } else { mat.emissiveFactor = [1, 1, 1, 1]; }\n } else {\n mat.emissiveFactor[0] = this.scaleColorVal(mat.emissiveFactor[0], fromGLTF);\n mat.emissiveFactor[1] = this.scaleColorVal(mat.emissiveFactor[1], fromGLTF);\n mat.emissiveFactor[2] = this.scaleColorVal(mat.emissiveFactor[2], fromGLTF);\n mat.emissiveFactor[3] = this.scaleColorVal(mat.emissiveFactor[3], fromGLTF);\n }\n\n if (fromGLTF && mat.occlusionTexture !== undefined && mat.occlusionTexture.strength === undefined) {\n mat.occlusionTexture.strength = this.isTiny3dMode() ? 0 : 1;\n }\n });\n }\n\n createAnimations (animations: GLTFAnimation[]): ModelAnimationOptions[] {\n return animations.map(anim => {\n const tracks = anim.channels.map(channel => {\n const track: ModelAnimTrackOptions = {\n input: channel.input.array as Float32Array,\n output: channel.output.array as Float32Array,\n node: channel.target.node,\n path: channel.target.path,\n interpolation: channel.interpolation,\n };\n\n return track;\n });\n\n const newAnim: ModelAnimationOptions = {\n name: anim.name,\n tracks: tracks,\n };\n\n return newAnim;\n });\n }\n\n createGeometry (primitive: GLTFPrimitive, hasSkinAnim: boolean): Geometry {\n const proxy = new GeometryProxy(this.engine, primitive, hasSkinAnim);\n\n return proxy.geometry;\n }\n\n createMaterial (material: GLTFMaterial): ModelMaterialOptions {\n const proxy = new MaterialProxy(material, [], this.isTiny3dMode());\n\n return proxy.material;\n }\n\n createTexture2D (image: GLTFImage, texture: GLTFTexture, isBaseColor: boolean): Promise<Texture> {\n return WebGLHelper.createTexture2D(this.engine, image, texture, isBaseColor, this.isTiny3dMode());\n }\n\n createTextureCube (cubeImages: CubeImage[], level0Size?: number): Promise<Texture> {\n if (cubeImages.length == 0) { throw new Error(`createTextureCube: Invalid cubeImages length ${cubeImages}`); }\n\n const mipmaps: PImageBufferData[][] = [];\n\n cubeImages.forEach(cubeImage => {\n if (cubeImage.length != 6) { throw new Error(`createTextureCube: cubeimage count should always be 6, ${cubeImage}`); }\n //\n const imgList: PImageBufferData[] = [];\n\n cubeImage.forEach(img => {\n if (img.imageData === undefined) { throw new Error(`createTextureCube: Invalid image data from ${img}`); }\n //\n imgList.push({\n type: 'buffer',\n data: img.imageData,\n mimeType: img.mimeType,\n });\n });\n\n if (this.isTiny3dMode()) {\n [imgList[4], imgList[5]] = [imgList[5], imgList[4]];\n }\n\n mipmaps.push(imgList);\n });\n //\n if (mipmaps.length == 1) {\n // no mipmaps\n return WebGLHelper.createTextureCubeFromBuffer(this.engine, mipmaps[0]);\n } else {\n // has mipmaps\n return WebGLHelper.createTextureCubeMipmapFromBuffer(this.engine, mipmaps, level0Size ?? Math.pow(2, mipmaps.length - 1));\n }\n }\n\n createSkybox (ibl: GLTFImageBasedLight): Promise<ModelSkyboxOptions> {\n const reflectionsIntensity = ibl.reflectionsIntensity ?? ibl.intensity;\n const irradianceCoeffs = ibl.irradianceCoefficients as number[][];\n const inSpecularImages = ibl.specularImages as CubeImage[];\n const specularImages = inSpecularImages.map(images => {\n const newImages = images.map(img => {\n const outImg: PImageBufferData = {\n type: 'buffer',\n data: img.imageData,\n mimeType: img.mimeType,\n };\n\n return outImg;\n });\n\n if (this.isTiny3dMode()) {\n [newImages[4], newImages[5]] = [newImages[5], newImages[4]];\n }\n\n return newImages;\n });\n const specularMipCount = specularImages.length - 1;\n const specularImageSize = ibl.specularImageSize ?? Math.pow(2, specularMipCount);\n\n const newIrradianceCoeffs: number[] = [];\n\n irradianceCoeffs.forEach(coeffs => {\n newIrradianceCoeffs.push(...coeffs);\n });\n\n const params: PSkyboxBufferParams = {\n type: 'buffer',\n renderable: this.isSkyboxVis(),\n intensity: ibl.intensity,\n reflectionsIntensity: reflectionsIntensity,\n irradianceCoeffs: newIrradianceCoeffs,\n specularImage: specularImages,\n specularMipCount: specularMipCount,\n specularImageSize: specularImageSize,\n };\n\n return PSkyboxCreator.createSkyboxOptions(this.engine, params);\n }\n\n createDefaultSkybox (typeName: SkyboxType): Promise<ModelSkyboxOptions> {\n if (typeName !== 'NFT' && typeName !== 'FARM') { throw new Error(`Invalid skybox type name ${typeName}`); }\n //\n const typ = typeName === 'NFT' ? PSkyboxType.NFT : PSkyboxType.FARM;\n const params = PSkyboxCreator.getSkyboxParams(typ);\n\n return PSkyboxCreator.createSkyboxOptions(this.engine, params);\n }\n\n scaleColorVal (val: number, fromGLTF: boolean): number {\n return fromGLTF ? LoaderHelper.scaleTo255(val) : LoaderHelper.scaleTo1(val);\n }\n\n scaleColorVec (vec: number[], fromGLTF: boolean): number[] {\n return vec.map(val => this.scaleColorVal(val, fromGLTF));\n }\n}\n\nexport function getPBRShaderProperties (): string {\n return `\n _BaseColorSampler (\"基础贴图\", 2D) = \"\" {}\n _BaseColorFactor (\"基础颜色\", Color) = (1, 1, 1, 1)\n _MetallicRoughnessSampler (\"金属贴图\", 2D) = \"\" {}\n _MetallicFactor (\"金属度\", Range(0, 1)) = 1\n _RoughnessFactor (\"粗糙度\", Range(0, 1)) = 1\n [Toggle] _SpecularAA (\"高光抗锯齿\", Float) = 0\n _NormalSampler (\"法线贴图\", 2D) = \"\" {}\n _NormalScale (\"法线贴图强度\", Range(0, 2)) = 1\n _OcclusionSampler (\"AO贴图\", 2D) = \"\" {}\n _OcclusionStrength (\"AO贴图强度\", Range(0, 1)) = 1\n _EmissiveSampler (\"自发光贴图\", 2D) = \"\" {}\n _EmissiveIntensity (\"自发光贴图强度\", Float) = 1\n _EmissiveFactor (\"自发光颜色\", Color) = (0, 0, 0, 1)\n _AlphaCutoff (\"Alpha裁剪值\", Range(0, 1)) = 0.5\n `;\n}\n\nexport function getUnlitShaderProperties (): string {\n return `\n _BaseColorSampler (\"基础贴图\", 2D) = \"\" {}\n _BaseColorFactor (\"基础颜色\", Color) = (1, 1, 1, 1)\n _AlphaCutoff (\"Alpha裁剪值\", Range(0, 1)) = 0.5\n `;\n}\n\nexport function getDefaultPBRMaterialData (): spec.MaterialData {\n const material: spec.MaterialData = {\n 'id': '00000000000000000000000000000000',\n 'name': 'PBR Material',\n 'dataType': spec.DataType.Material,\n 'stringTags': {\n 'RenderType': spec.RenderType.Opaque,\n 'RenderFace': 'Front',\n },\n 'macros': [],\n 'shader': {\n 'id': 'pbr00000000000000000000000000000',\n },\n 'ints': {\n\n },\n 'floats': {\n 'ZWrite': 1,\n 'ZTest': 1,\n '_SpecularAA': 0,\n '_MetallicFactor': 1,\n '_RoughnessFactor': 0.0,\n '_NormalScale': 1,\n '_OcclusionStrength': 1,\n '_EmissiveIntensity': 1,\n '_AlphaCutoff': 0.5,\n },\n 'vector4s': {\n\n },\n 'colors': {\n '_BaseColorFactor': {\n 'r': 1,\n 'g': 1,\n 'b': 1,\n 'a': 1,\n },\n '_EmissiveFactor': {\n 'r': 0,\n 'g': 0,\n 'b': 0,\n 'a': 1,\n },\n },\n 'textures': {\n\n },\n };\n\n return material;\n}\n\nexport function getDefaultUnlitMaterialData (): spec.MaterialData {\n const material: spec.MaterialData = {\n 'id': '00000000000000000000000000000000',\n 'name': 'Unlit Material',\n 'dataType': spec.DataType.Material,\n 'stringTags': {\n 'ZWrite': 'true',\n 'ZTest': 'true',\n 'RenderType': spec.RenderType.Opaque,\n 'Cull': 'Front',\n },\n 'macros': [],\n 'shader': {\n 'id': spec.BuiltinObjectGUID.UnlitShader,\n },\n 'ints': {\n\n },\n 'floats': {\n '_AlphaCutoff': 0.5,\n },\n 'vector4s': {\n\n },\n 'colors': {\n '_BaseColorFactor': {\n 'r': 1,\n 'g': 1,\n 'b': 1,\n 'a': 1,\n },\n },\n 'textures': {\n\n },\n };\n\n return material;\n}\n\nclass GeometryProxy {\n\n constructor (\n private engine: Engine,\n private gltfGeometry: GLTFPrimitive,\n private hasSkinAnimation: boolean) {\n }\n\n get geometry (): Geometry {\n const attributes: Record<string, Attribute> = {};\n\n if (this.hasPosition) {\n const attrib = this.positionAttrib;\n\n attributes['a_Position'] = this._getBufferAttrib(attrib);\n } else {\n throw new Error('Position attribute missing');\n }\n if (this.hasNormal) {\n const attrib = this.normalAttrib;\n\n if (attrib !== undefined) {\n attributes['a_Normal'] = this._getBufferAttrib(attrib);\n }\n }\n if (this.hasTangent) {\n const attrib = this.tangentAttrib;\n\n if (attrib !== undefined) {\n attributes['a_Tangent'] = this._getBufferAttrib(attrib);\n }\n }\n this.texCoordList.forEach(val => {\n const attrib = this.texCoordAttrib(val);\n const attribName = `a_UV${val + 1}`;\n\n attributes[attribName] = this._getBufferAttrib(attrib);\n });\n if (this.hasSkinAnimation) {\n const jointAttrib = this.jointAttribute;\n\n if (jointAttrib !== undefined) {\n attributes['a_Joint1'] = this._getBufferAttrib(jointAttrib);\n }\n const weightAttrib = this.weightAttribute;\n\n if (weightAttrib !== undefined) {\n attributes['a_Weight1'] = this._getBufferAttrib(weightAttrib);\n }\n }\n\n /**\n * 设置Morph动画需要的Attribute,主要包括Position,Normal和Tangent\n */\n for (let i = 0; i < 8; i++) {\n const positionAttrib = this.getTargetPosition(i);\n\n if (positionAttrib !== undefined) {\n attributes[`a_Target_Position${i}`] = this._getBufferAttrib(positionAttrib);\n }\n\n const normalAttrib = this.getTargetNormal(i);\n\n if (normalAttrib !== undefined) {\n attributes[`a_Target_Normal${i}`] = this._getBufferAttrib(normalAttrib);\n }\n\n const tangentAttrib = this.getTargetTangent(i);\n\n if (tangentAttrib !== undefined) {\n attributes[`a_Target_Tangent${i}`] = this._getBufferAttrib(tangentAttrib);\n }\n }\n\n const indexArray = this.indexArray;\n\n if (indexArray !== undefined) {\n return Geometry.create(\n this.engine,\n {\n attributes: attributes,\n indices: { data: indexArray },\n drawStart: 0,\n drawCount: indexArray.length,\n mode: glContext.TRIANGLES,\n }\n );\n } else {\n return Geometry.create(\n this.engine,\n {\n attributes: attributes,\n drawStart: 0,\n drawCount: this.positionAttrib.array.length / 3,\n mode: glContext.TRIANGLES,\n }\n );\n }\n }\n\n private _getBufferAttrib (inAttrib: GLTFBufferAttribute): Attribute {\n const attrib: spec.AttributeWithData = {\n type: inAttrib.type,\n size: inAttrib.itemSize,\n //stride: inAttrib.stride,\n //offset: inAttrib.offset,\n data: inAttrib.array,\n normalize: inAttrib.normalized,\n };\n\n return attrib;\n }\n\n get positionAttrib () {\n return this.gltfGeometry.getPosition();\n }\n\n get normalAttrib () {\n return this.gltfGeometry.getNormal();\n }\n\n get tangentAttrib () {\n return this.gltfGeometry.getTangent();\n }\n\n texCoordAttrib (index: number) {\n return this.gltfGeometry.getTexCoord(index);\n }\n\n get jointAttribute () {\n return this.gltfGeometry.getJoints(0);\n }\n\n get weightAttribute () {\n return this.gltfGeometry.getWeights(0);\n }\n\n get hasPosition (): boolean {\n return this.positionAttrib !== undefined;\n }\n\n get hasNormal (): boolean {\n return this.normalAttrib !== undefined;\n }\n\n get hasTangent (): boolean {\n return this.tangentAttrib !== undefined;\n }\n\n get hasTexCoord (): boolean {\n return this.texCoordCount > 0;\n }\n\n get texCoordCount (): number {\n for (let i = 0; i < 10; i++) {\n if (this.texCoordAttrib(i) === undefined) { return i; }\n }\n\n return 0;\n }\n\n get hasJointAttribute (): boolean {\n return this.jointAttribute !== undefined;\n }\n\n get hasWeightAttribute (): boolean {\n return this.weightAttribute !== undefined;\n }\n\n get indexArray (): Uint8Array | Uint16Array | Uint32Array | undefined {\n if (this.gltfGeometry.indices === undefined) { return undefined; }\n\n switch (this.gltfGeometry.indices.type) {\n case WebGLRenderingContext['UNSIGNED_INT']:\n return this.gltfGeometry.indices.array as Uint32Array;\n case WebGLRenderingContext['UNSIGNED_SHORT']:\n return this.gltfGeometry.indices.array as Uint16Array;\n case WebGLRenderingContext['UNSIGNED_BYTE']:\n return this.gltfGeometry.indices.array as Uint8Array;\n }\n\n return undefined;\n }\n\n get indexCount (): number {\n if (this.gltfGeometry.indices !== undefined) { return this.gltfGeometry.indices.array.length; } else { return 0; }\n }\n\n get texCoordList (): number[] {\n const texCoords: number[] = [];\n\n for (let i = 0; i < 10; i++) {\n if (this.texCoordAttrib(i) !== undefined) {\n texCoords.push(i);\n } else {\n break;\n }\n }\n\n return texCoords;\n }\n\n getTargetPosition (index: number): GLTFBufferAttribute | undefined {\n return this.gltfGeometry.getAttribute(`POSITION${index}`);\n }\n\n getTargetNormal (index: number): GLTFBufferAttribute | undefined {\n return this.gltfGeometry.getAttribute(`NORMAL${index}`);\n }\n\n getTargetTangent (index: number): GLTFBufferAttribute | undefined {\n return this.gltfGeometry.getAttribute(`TANGENT${index}`);\n }\n\n}\n\nclass MaterialProxy {\n private gltfMaterial: GLTFMaterial;\n private textures: Texture[];\n // TODO: 待移除?\n private tiny3dMode: boolean;\n\n constructor (material: GLTFMaterial, textures: Texture[], tiny3dMode: boolean) {\n this.gltfMaterial = material;\n this.textures = textures;\n this.tiny3dMode = tiny3dMode;\n }\n\n get material (): ModelMaterialOptions {\n const mat = this.gltfMaterial;\n const isUnlit = GLTFHelper.isUnlitMaterial(mat);\n\n let blending = spec.MaterialBlending.opaque;\n\n switch (mat.alphaMode) {\n case 'OPAQUE':\n blending = spec.MaterialBlending.opaque;\n\n break;\n case 'MASK':\n blending = spec.MaterialBlending.masked;\n\n break;\n case 'BLEND':\n blending = spec.MaterialBlending.translucent;\n\n break;\n }\n\n const side = mat.doubleSided ? spec.SideMode.DOUBLE : spec.SideMode.FRONT;\n\n const enableShadow = false;\n\n const alphaCutOff = mat.alphaCutOff ?? 0.5;\n\n const name = mat.name;\n\n if (isUnlit) {\n return {\n name: name,\n type: spec.MaterialType.unlit,\n baseColorTexture: this.baseColorTextureObj,\n baseColorTextureCoordinate: this.baseColorTextureCoord,\n baseColorTextureTransform: this.baseColorTextureTransfrom,\n baseColorFactor: this.baseColorFactor,\n //\n depthMask: mat.extras?.depthMask,\n blending: blending,\n alphaCutOff: alphaCutOff,\n side: side,\n };\n } else {\n return {\n name: name,\n type: spec.MaterialType.pbr,\n baseColorTexture: this.baseColorTextureObj,\n baseColorTextureCoordinate: this.baseColorTextureCoord,\n baseColorTextureTransform: this.baseColorTextureTransfrom,\n baseColorFactor: this.baseColorFactor,\n //\n useSpecularAA: this.getSpecularAA(),\n //\n metallicRoughnessTexture: this.metallicRoughnessTextureObj,\n metallicRoughnessTextureCoordinate: this.metallicRoughnessTextureCoord,\n metallicRoughnessTextureTransform: this.metallicRoughnessTextureTransfrom,\n metallicFactor: this.metalicFactor,\n roughnessFactor: this.roughnessFactor,\n //\n normalTexture: this.normalTextureObj,\n normalTextureCoordinate: this.normalTextureCoord,\n normalTextureTransform: this.normalTextureTransfrom,\n normalTextureScale: this.normalTextureScale,\n //\n occlusionTexture: this.occlusionTextureObj,\n occlusionTextureCoordinate: this.occlusionTextureCoord,\n occlusionTextureTransform: this.occlusionTextureTransfrom,\n occlusionTextureStrength: this.occlusionTextureStrength,\n //\n emissiveTexture: this.emissiveTextureObj,\n emissiveTextureCoordinate: this.emissiveTextureCoord,\n emissiveTextureTransform: this.emissiveTextureTransfrom,\n emissiveFactor: this.emissiveFactor,\n emissiveIntensity: 1.0,\n //\n depthMask: mat.extras?.depthMask,\n blending: blending,\n alphaCutOff: alphaCutOff,\n side: side,\n enableShadow: enableShadow,\n };\n }\n }\n\n private getTextureObject (index: number): Texture | undefined {\n if (index < 0 || index >= this.textures.length) { return; }\n\n return this.textures[index];\n }\n\n getTextureObj (texInfo?: GLTFTextureInfo): Texture | undefined {\n return texInfo ? this.getTextureObject(texInfo.index) : undefined;\n }\n\n getTextureCoord (texInfo?: GLTFTextureInfo): number | undefined {\n return texInfo ? texInfo.texCoord : undefined;\n }\n\n getTextureTransform (texInfo?: GLTFTextureInfo): ModelTextureTransform | undefined {\n const transform = texInfo?.extensions?.KHR_texture_transform;\n\n if (transform === undefined) {\n return;\n }\n\n if (transform.offset === undefined && transform.rotation === undefined && transform.scale === undefined) {\n return;\n }\n\n return {\n offset: transform.offset,\n rotation: transform.rotation,\n scale: transform.scale,\n };\n }\n\n get baseColorTextureObj (): Texture | undefined {\n return this.getTextureObj(this.gltfMaterial.baseColorTexture);\n }\n\n get baseColorTextureCoord (): number | undefined {\n return this.getTextureCoord(this.gltfMaterial.baseColorTexture);\n }\n\n get baseColorTextureTransfrom (): ModelTextureTransform | undefined {\n return this.getTextureTransform(this.gltfMaterial.baseColorTexture);\n }\n\n get metallicRoughnessTextureObj (): Texture | undefined {\n return this.getTextureObj(this.gltfMaterial.metallicRoughnessTexture);\n }\n\n get metallicRoughnessTextureCoord (): number | undefined {\n return this.getTextureCoord(this.gltfMaterial.metallicRoughnessTexture);\n }\n\n get metallicRoughnessTextureTransfrom (): ModelTextureTransform | undefined {\n return this.getTextureTransform(this.gltfMaterial.metallicRoughnessTexture);\n }\n\n get normalTextureObj (): Texture | undefined {\n return this.getTextureObj(this.gltfMaterial.normalTexture);\n }\n\n get normalTextureCoord (): number | undefined {\n return this.getTextureCoord(this.gltfMaterial.normalTexture);\n }\n\n get normalTextureTransfrom (): ModelTextureTransform | undefined {\n return this.getTextureTransform(this.gltfMaterial.normalTexture);\n }\n\n get occlusionTextureObj (): Texture | undefined {\n return this.getTextureObj(this.gltfMaterial.occlusionTexture);\n }\n\n get occlusionTextureCoord (): number | undefined {\n return this.getTextureCoord(this.gltfMaterial.occlusionTexture);\n }\n\n get occlusionTextureTransfrom (): ModelTextureTransform | undefined {\n return this.getTextureTransform(this.gltfMaterial.occlusionTexture);\n }\n\n get emissiveTextureObj (): Texture | undefined {\n return this.getTextureObj(this.gltfMaterial.emissiveTexture);\n }\n\n get emissiveTextureCoord (): number | undefined {\n return this.getTextureCoord(this.gltfMaterial.emissiveTexture);\n }\n\n get emissiveTextureTransfrom (): ModelTextureTransform | undefined {\n return this.getTextureTransform(this.gltfMaterial.emissiveTexture);\n }\n\n get hasEmissive (): boolean {\n const factor = this.emissiveFactor;\n\n return factor[0] + factor[1] + factor[2] > 0;\n }\n\n get baseColorFactor (): [number, number, number, number] {\n const f = this.gltfMaterial.baseColorFactor;\n\n if (f === undefined || f.length != 4) { return [1, 1, 1, 1]; } else { return [f[0], f[1], f[2], f[3]]; }\n }\n\n getSpecularAA () {\n return this.gltfMaterial.extras?.useSpecularAA;\n }\n\n get metalicFactor (): number {\n return this.gltfMaterial.metallicFactor ?? 1;\n }\n\n get roughnessFactor (): number {\n return this.gltfMaterial.roughnessFactor ?? 1;\n }\n\n get normalTextureScale (): number {\n return this.gltfMaterial.normalTexture?.scale ?? 1;\n }\n\n get occlusionTextureStrength (): number {\n return this.gltfMaterial.occlusionTexture?.strength ?? 1;\n }\n\n get emissiveFactor (): [number, number, number, number] {\n const f = this.gltfMaterial.emissiveFactor;\n\n if (f === undefined || f.length != 4) {\n return [0, 0, 0, 1];\n } else {\n return [f[0], f[1], f[2], 1.0];\n }\n }\n\n}\n\nclass GLTFHelper {\n static isUnlitMaterial (mat: GLTFMaterial): boolean {\n return mat.extensions?.KHR_materials_unlit !== undefined;\n }\n\n static createBoxFromGLTFBound (bound: GLTFBounds): Box3 {\n const boxMin = Vector3.fromArray(bound.box.min as number[]);\n const boxMax = Vector3.fromArray(bound.box.max as number[]);\n\n return new Box3(boxMin, boxMax);\n }\n}\n","import * as EFFECTS from '@galacean/effects';\nimport type { spec } from '@galacean/effects';\nimport { VFXItem, logger, registerPlugin } from '@galacean/effects';\nimport { ModelPlugin } from './plugin';\n\nregisterPlugin('model', ModelPlugin, VFXItem);\n\n/**\n * 插件版本号\n */\nexport const version = __VERSION__;\n\nexport type BaseTransform = spec.BaseItemTransform;\nexport type ModelBaseItem = spec.BaseItem;\nexport type ModelItemCamera = spec.ModelCameraItem;\nexport type ModelItemLight = spec.ModelLightItem;\nexport type ModelCameraContent = spec.ModelCameraContent;\nexport type ModelLightContent = spec.ModelLightContent;\nexport type ModelTextureTransform = spec.ModelTextureTransform;\nexport type ModelItemBoundingBox = spec.ModelItemBoundingBox;\nexport type ModelItemBoundingSphere = spec.ModelItemBoundingSphere;\nexport type ModelItemBounding = spec.ModelItemBounding;\nexport type ModelCameraOptions = spec.ModelCameraOptions;\nexport type ModelLightBaseOptions = spec.ModelLightBaseOptions;\nexport type ModelLightPointOptions = spec.ModelLightPointOptions;\nexport type ModelLightSpotOptions = spec.ModelLightSpotOptions;\nexport type ModelLightDirOptions = spec.ModelLightDirOptions;\nexport type ModelAmbientLightOptions = spec.ModelAmbientLightOptions;\nexport type ModelLightOptions = spec.ModelLightOptions;\n\nexport type ModelItemMesh = spec.ModelMeshItem<'studio'>;\nexport type ModelItemSkybox = spec.ModelSkyboxItem<'studio'>;\nexport type ModelMeshContent = spec.ModelMeshItemContent<'studio'>;\nexport type ModelSkyboxContent = spec.SkyboxContent<'studio'>;\nexport type ModelMeshOptions = spec.ModelMeshOptions<'studio'>;\nexport type ModelSkinOptions = spec.SkinOptions<'studio'>;\nexport type ModelPrimitiveOptions = spec.PrimitiveOptions<'studio'>;\nexport type ModelMaterialUnlitOptions = spec.MaterialUnlitOptions<'studio'>;\nexport type ModelMaterialPBROptions = spec.MaterialPBROptions<'studio'>;\nexport type ModelMaterialHariOptions = spec.MaterialHairOptions<'studio'>;\nexport type ModelMaterialOptions = spec.MaterialOptions<'studio'>;\nexport type ModelSkyboxOptions = spec.SkyboxOptions<'studio'>;\nexport type ModelTreeOptions = spec.ModelTreeOptions<'studio'>;\nexport type ModelTreeContent = spec.ModelTreeContent<'studio'>;\nexport type ModelAnimTrackOptions = spec.ModelAnimTrackOptions<'studio'>;\nexport type ModelAnimationOptions = spec.ModelAnimationOptions<'studio'>;\n\nexport type ModelMeshSkinData = spec.SkinData;\nexport type ModelMeshMorphData = spec.MorphData;\nexport type ModelMeshPrimitiveData = spec.PrimitiveData;\nexport type ModelMeshComponentData = spec.ModelMeshComponentData;\nexport type ModelLightType = spec.LightType;\nexport type ModelLightComponentData = spec.ModelLightComponentData;\nexport type ModelCameraComponentData = spec.ModelCameraComponentData;\nexport type ModelSkyboxComponentData = spec.SkyboxComponentData;\nexport type AnimationComponentData = spec.AnimationComponentData;\n\nexport * from './gesture';\nexport * from './gltf';\nexport * from './plugin';\nexport * from './runtime';\nexport * from './utility';\n\nlogger.info(`Plugin model version: ${version}.`);\n\nif (version !== EFFECTS.version) {\n console.error(\n '注意:请统一 Model 插件与 Player 版本,不统一的版本混用会有不可预知的后果!',\n '\\nAttention: Please ensure the Model plugin is synchronized with the Player version. Mixing and matching incompatible versions may result in unpredictable consequences!'\n );\n}\n"],"names":["VFX_ITEM_TYPE_3D","asyncGeneratorStep","gen","resolve","reject","_next","_throw","key","arg","info","value","error","done","Promise","then","_async_to_generator","fn","self","this","args","arguments","apply","err","undefined","_set_prototype_of","o","p","Object","setPrototypeOf","__proto__","_inherits","subClass","superClass","TypeError","prototype","create","constructor","writable","configurable","_instanceof","left","right","Symbol","hasInstance","__decorate","decorators","target","desc","d","c","length","r","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","__generator","thisArg","body","f","y","t","_","label","sent","trys","ops","g","Iterator","next","verb","iterator","n","v","op","call","pop","push","e","step","SuppressedError","InterpolationSampler","time","data","componentCount","cachedIndex","evaluate","pp","i1","t1","t0","validate_interval","seek","linear_scan","forward_scan","giveUpAt","copySampleValue","t1global","mid","intervalChanged","interpolate","dispose","_proto","index","values","stride","offset","result","Float32Array","LinearSampler","size","_this_componentCount","offset1","offset0","weight1","weight0","DiscreteSampler","QuaternionInner","slerpFlat","dst","dstOffset","src0","srcOffset0","src1","srcOffset1","x0","y0","z0","w0","x1","y1","z1","w1","s","cos","dir","sqrSin","Number","EPSILON","sin","Math","sqrt","len","atan2","tDir","QuaternionLinearSampler","alpha","end","createAnimationSampler","type","times","path","_array_like_to_array","arr","arr2","Array","_create_for_of_iterator_helper_loose","allowArrayLike","it","bind","isArray","minLen","toString","slice","name","from","test","_unsupported_iterable_to_array","Vector2","math","Vector3","Vector4","Matrix3","Matrix4","Color","Euler","EulerOrder","Quaternion","Box3","Sphere","Ray","DEG2RAD","_defineProperties","props","descriptor","enumerable","_create_class","Constructor","protoProps","staticProps","_extends","assign","source","hasOwnProperty","PObjectType","PLightType","PTextureType","PMaterialType","PBlendMode","PFaceSideMode","PShadowType","PBRShaderGUID","spec","BuiltinObjectGUID","PBRShader","UnlitShaderGUID","UnlitShader","PTransform","translation","rotation","scale","fromMatrix4","matrix","setMatrix","fromEffectsTransform","trans","EffectsTransform","getWorldMatrix","effectsTrans","valid","setValid","toEffectsTransform","transform","mat","getMatrix","cloneFromMatrix","fromBaseTransform","position","setTranslation","set","setRotation","setScale","getTranslation","val","x","z","getPosition","setPosition","getRotation","w","setFromEuler","ZYX","getScale","compose","res","getTransform","fromArray","PCoordinate","origin","xAxis","yAxis","zAxis","fromPTransform","invert","copyFrom","rotationMatrix","toMatrix4","fromRotationMatrix","me","elements","PGlobalState","isWebGL2","shaderShared","runtimeEnv","PLAYER_OPTIONS_ENV_EDITOR","compatibleMode","visBoundingBox","renderMode3D","RenderMode3D","none","renderMode3DUVGridSize","reset","hasRenderMode3D","getInstance","instance","isEditorEnv","isDeviceEnv","isTiny3dMode","isGLTFMode","objectIndex","PObject","isNone","isValid","genName","PEntity","_visible","_transform","_this","deleted","update","render","scene","renderer","onVisibleChanged","visible","coordinate","coord","deserializeGeometry","geometryProps","attributes","ret","indices","typedArrayFromBinary","keys","forEach","attribute","pointer","ctrlMap","i8","Int8Array","u8","Uint8Array","i16","Int16Array","u16","Uint16Array","f32","i32","Int32Array","u32","Uint32Array","binary","ValueType","BINARY","start","byteLength","CTRL","BYTES_PER_ELEMENT","HookSuffix","number2GLName","Map","HookOGLFunc","ctx","console","getPrototypeOf","hookCount","GetHookFunc","GetNum2GLName","FormatFuncInfo","prefix","argList","has","get","join","getError","err2Info","WebGLRenderingContext","NO_ERROR","INVALID_ENUM","INVALID_VALUE","INVALID_OPERATION","INVALID_FRAMEBUFFER_OPERATION","OUT_OF_MEMORY","CONTEXT_LOST_WEBGL","FormatErrorInfo","trace","getRendererGPUInfo","player","gpuCapability","JSON","stringify","getPMeshList","meshList","composition","getCompositions","items","item","meshComponent","getComponent","ModelMeshComponent","content","mesh","FBOOptions","options","resolution","colorAttachments","depthAttachment","addDepthAttachment","storageType","RenderPassAttachmentStorageType","depth_16_texture","addDefaultDepthAttachment","deleteDepthAttachment","addColorAttachment","texture","format","glContext","RGBA","HALF_FLOAT","minFilter","filter","LINEAR","magFilter","deleteColorAttachment","splice","viewport","BoxMesh","engine","priority","material","Material","shader","vertex","vertexShader","fragment","fragmentShader","shared","depthTest","depthMask","Mesh","geometry","Geometry","modelMatrix","viewProjMatrix","positions","lineColor","setVector3","aPos","FLOAT","mode","LINES","drawStart","drawCount","StandardShaderSource","build","features","replace","map","ShaderFactory","registerInclude","StandardShader","getVertexShaderCode","context","featureList","materialType","unlit","pbr","shadowBase","primitiveVert","skyboxFilter","skyboxVert","Error","getFragmentShaderCode","metallicRoughnessFrag","shadowPassFrag","skyboxFrag","genVertexShaderCode","genFragmentShaderCode","fetchPBRShaderCode","vertexShaderCode","fragmentShaderCode","fetchUnlitShaderCode","getPBRPassShaderCode","getShadowPassShaderCode","getSkyBoxShaderCode","getQuadFilterShaderCode","getNormalVisShaderCode","getBasicVS","hasNormals","getDiffuseOnlyShaderCode","getKawaseBlurShaderCode","getSimpleFilterShaderCode","getGaussianBlurShaderCodeV2","getGaussianBlurShaderCodeV1","getTransparecyBaseShader","isVertexShader","getTransparecyFilterShader","params","hasUVs","environment","TwoStatesSet","now","Set","last","clear","forward","temp","forAddedItem","callbackfn","forRemovedItem","forNowItem","RendererComponent","morphWeights","getHitTestParams","force","computeBoundingBox","bounding","isInteger","behavior","ModelBoundingType","box","PMesh","HitTestType","custom","collect","ray","pointInCanvas","hitTesting","direction","worldMatrixData","RayIntersectsBoxWithRotation","sphere","pos","assignWorldTRS","center","setFromArray","add","radius","fromData","onStart","_this_sceneManager","sceneManager","getSceneManager","createContent","renderOrder","addItem","parentId","parent","updateParentInfo","setVisible","onUpdate","dt","onLateUpdate","lateUpdate","getVisible","onDestroy","removeItem","materials","rootBone","findObject","interaction","parse","_this_content","_this_content_visible","_this_bounding","worldMatrix","bbox","getCenter","getSize","effectsClass","DataType","MeshComponent","ModelSkyboxComponent","diffuseImage","specularImage","skyboxData","PSkybox","SkyboxComponent","ModelLightComponent","Behaviour","lightData","PLight","LightComponent","ModelCameraComponent","updateMainCamera","cameraData","width","getWidth","height","getHeight","PCamera","camera","near","nearPlane","far","farPlane","fov","setTransform","CameraComponent","AnimationComponent","elapsedTime","animation","clips","sampleAnimation","animationClips","clipData","clipObj","ModelAnimationClip","animationClip","setFromAnimationClip","AnimationClip","path2Node","vfxItem","_step","duration","life","max","_iterator","positionCurves","curve","keyFrames","getValue","getTargetItem","_step1","_iterator1","rotationCurves","setQuaternion","_step2","_iterator2","scaleCurves","_step3","_iterator3","floatCurves","className","component","setProperty","property","split","warn","clip","rootItem","findTag","children","child","id","obj","properties","current","propName","matrixData","local2World","world2Local","clone","newRay","applyMatrix","boxCenter","boxHalfSize","multiply","boxMin","subtract","boxMax","intersetPoint","intersectBox","min","transformPoint","RayBoxTesting","ro","rd","bmin","bmax","tmin","tmax","tymin","tymax","tzmin","tzmax","invdirx","invdiry","invdirz","diff","edge1","edge2","normal","RayTriangleTesting","a","b","backfaceCulling","subtractVectors","crossVectors","DdN","dot","sign","DdQxE2","DdE1xQ","QdN","CompositionHitTest","regions","hitTest","getHitTestRay","nums","region","getElement","sort","ToggleItemBounding","itemId","WebGLHelper","createTexture2D","image","isBaseColor","tiny3dMode","blob","urlCreator","imageUrl","imageObj","imageData","Texture","sourceType","TextureSourceType","Blob","mimeType","window","URL","webkitURL","createObjectURL","Image","src","onload","LINEAR_MIPMAP_LINEAR","premultiplyAlpha","isPow2","generateMipmap","NEAREST_MIPMAP_NEAREST","LINEAR_MIPMAP_NEAREST","NEAREST_MIPMAP_LINEAR","wrapS","REPEAT","wrapT","anisotropic","revokeObjectURL","onerror","createTextureList","images","textures","all","tex","_state","getTextureCubeData","cubeData","WebHelper","loadImageFromImageData","getTextureCubeMipmapData","mipmaps","createTextureCubeFromURL","cubeImage","textureOptions","getDefaultTextureFactory","loadSource","TEXTURE_CUBE_MAP","cubemapTexConfig","createTextureCubeMipmapFromURL","cubeImages","maps","cubemapMipTexConfig","createTextureCubeFromBuffer","cubemap","cube","createTextureCubeMipmapFromBuffer","level0Size","mipCount","pow","loadImage","getTexture","createTextureFromImage","flipY","deleteTexture","deleteMesh","geometries","DestroyOptions","destroy","deleteGeometry","deleteRenderPass","pass","meshes","depthStencilAttachment","RenderPassDestroyAttachmentType","colorAttachment","semantics","isTransparentMesh","blending","isSupportFloatTexture","detail","floatTexture","isSupportHalfFloatTexture","halfFloatTexture","CLAMP_TO_EDGE","floatView","int32View","MeshHelper","createFilterMesh","globalState","getPlaneGeometry","level","effectsMaterial","glslVersion","GLSLVersion","GLSL3","GLSL1","setMaterialStates","fromIdentity","getPlaneVertexArray","aUV","dataSource","aNormal","PluginHelper","createLightOptions","light","color","intensity","lightType","range","innerConeAngle","outerConeAngle","PI","createCameraOptions","perspective","znear","zfar","yfov","clipMode","toPlayerColor3","scaleTo255","toPlayerColor4","toPluginColor3","scaleTo1","toPluginColor4","createUVTransform","stName","rotateName","stValue","getVector4","rotateValue","getFloat","cosTheta","sinTheta","transpose","clamp","minv","maxv","intVal","round","floatVal","focusOnPoint","cameraPosition","YRotationAngle","targetPoint","camPos","targetPos","deltaPos","fromRotationAxis","newCamPos","viewMatrix","lookAt","effectsTransform","Transform","preprocessScene","deviceEnv","jsonScene","dataMap","loadSkybox","preprocessTextureOptions","components","comp","dataType","skybox","textureInfo","texId","texOptions","TEXTURE_2D","newOptions","createGeometry","geomJson","bins","geomOptions","attrib","attribData","getAttributeName","getIndexArray","array","startsWith","getTextureObj","getImageFileName","url","ext","begin","lastIndexOf","substr","substring","getCurrnetTimeStr","date","Date","timeStr","toLocaleString","ms","getMilliseconds","padStart","saveFileForURL","filename","document","createElement","setAttribute","href","click","createPlayer","manualRender","canvas","Player","renderFramework","env","renderOptions","willCaptureImage","sleep","setTimeout","loadImageFromGLTFImage","getCanvasArrayBuffer","toBlob","arrayBuffer","getImageArrayBuffer","cvs","getContext","drawImage","getCanvasImageData","getImageData","flipImageData","flipped","putImageData","globalCompositeOperation","translate","getWebGLCanvasImageBuffer","pixels","readPixels","UNSIGNED_BYTE","VertexAttribBuffer","typeSize","getBoundingBox","point","expandByPoint","AttributeArray","compCount","signed","compressed","compressScale","inAttrib","inArray","normalize","getData","getLength","GeometryBoxProxy","bindMatrices","abs","getDrawCount","getIndexData","positionAttrib","positionArray","getAttributeData","jointAttrib","weightAttrib","jointArray","weightArray","joint","weight","makeEmpty","skinMat","hasAnim","indexSet","j","posData","posVec","_this_joint","_this_weight","jointData","weightData","setZero","findError","bindMat","addScaledMatrix","resVec","transformVector4","HitTestingProxy","doubleSided","hasAnimation","skinMatrix","getHitPoint","rayOrigin","rayDirection","mint","p0","p1","p2","q0","q1","q2","i0","i2","r0","r1","r2","vec3","vec4","CheckerHelper","checkNumber","checkNumberUndef","checkNumber01","checkNumber01Undef","checkPositive","checkNonnegative","checkNonnegativeUndef","checkBoolean","checkBooleanUndef","checkString","checkStringUndef","checkFloat32Array","checkFloat32ArrayUndef","checkParent","checkTexCoord","checkVec2","every","checkVec2Undef","checkVec3","checkNonnegative3","checkVec4","checkNonnegative4","checkNumberArray","checkTexture","isDestroyed","checkTextureUndef","checkTexTransform","checkTexTransformUndef","checkMatBlending","MaterialBlending","opaque","masked","translucent","additive","checkMatSide","SideMode","BACK","DOUBLE","FRONT","checkAnimPath","checkAnimInterp","assertGeometry","getDrawStart","assertGeometryBuffer","attribArray","createAttributeArray","dataAttrib","dataArray","assertModelSkinOptions","joints","skeleton","inverseBindMatrices","determinant","assertMatOptions","MaterialType","baseColorFactor","baseColorTexture","baseColorTextureTransform","baseColorTextureCoordinate","side","alphaCutOff","useSpecularAA","metallicFactor","roughnessFactor","metallicRoughnessTexture","metallicRoughnessTextureTransform","metallicRoughnessTextureCoordinate","normalTexture","normalTextureScale","normalTextureTransform","normalTextureCoordinate","occlusionTexture","occlusionTextureStrength","occlusionTextureTransform","occlusionTextureCoordinate","emissiveFactor","emissiveIntensity","emissiveTexture","emissiveTextureTransform","emissiveTextureCoordinate","assertPrimOptions","assertModelMeshOptions","skin","morphList","primitives","prim","morph","PMorph","morph0","morph1","equals","hide","assertModelCameraOptions","aspect","assertModelLightOptions","assertModelSkyboxOptions","renderable","reflectionsIntensity","irradianceCoeffs","specularImageSize","specularMipCount","pow2","checkModelAnimTrackOptions","node","input","output","interpolation","assertModelAnimOptions","tracks","assertTreeOptions","animations","anim","object","simpleObject","prop","Renderer","Float16ArrayWrapper","number","startIndex","toHalf","bytes","buffer","bits","m","TextureDataMode","PSkin","jointItem","animationMatrices","textureDataMode","maxJointCount","rootBoneItem","rootBoneName","getJointItems","getTextureDataMode","matList","matrixCount","updateSkinMatrices","mat4","computeMeshAnimMatrices","matrixList","normalMatList","inverseWorldMatrix","tempMatrix","localMatrix","multiplyMatrices","updateParentItem","parentItem","getJointCount","isTextureDataMode","jointCount","availableJointUniforms","maxVertexUniforms","floor","name2Item","genNodeName","jointItems","boneNames","boneName","nameList","genNodeNameDFS","morphWeightsLength","morphWeightsArray","hasPositionMorph","hasNormalMorph","hasTangentMorph","positionCount","getAttributeMorphCount","positionNameList","normalCount","normalNameList","tangentCount","tangentNameList","countList","count","fill","initWeights","weights","updateWeights","hasMorph","getMorphWeightsArray","attributeNameList","PAnimInterpType","PAnimPathType","PAnimTexture","isHalfFloat","_this_buffer","_this_buffer_data","NEAREST","updateSource","_this_texture","PShaderManager","funcMap","Helper","shadowFilter","normalVis","simpleFilter","genShaderCode","func","_instance","PMaterialBase","ZWrite","ZTest","renderType","RenderType","Opaque","alphaClip","alphaCutoff","renderFace","RenderFace","Front","getShaderFeatures","isAlphaClip","isOpaque","Both","getShaderMacros","macroList","updateUniforms","uv","debugUVGridSize","setFloat","inFeatureList","finalFeatureList","getFeatureList","shaderResult","getMacroList","inMacroList","finalMacroList","Transparent","blendEquation","FUNC_ADD","blendFunction","ONE","ONE_MINUS_SRC_ALPHA","setFaceSideStates","isBothSide","culling","isBackSide","cullFace","frontFace","CCW","isTransparent","isFrontSide","Back","PMaterialUnlit","effectMaterial","baseColorTextureTrans","getColor","stringTags","hasBaseColorTexture","setInt","setMatrix3","getBaseColorTexture","setBaseColorTexture","getBaseColorFactor","setBaseColorFactor","PMaterialPBR","metallicRoughnessTextureTrans","normalTextureTrans","occlusionTextureTrans","emissiveTextureTrans","hasMetallicRoughnessTexture","hasNormalTexture","hasOcclusionTexture","hasEmissiveTexture","hasEmissiveValue","getMetallicRoughnessTexture","setMetallicRoughnessTexture","getNormalTexture","setNormalTexture","getOcclusionTexture","setOcclusionTexture","getEmissiveTexture","setEmissiveTexture","luminance","getEmissiveFactor","setEmissiveFactor","getEmissiveIntensity","setEmissiveIntensity","createPluginMaterial","getInstanceId","materialPBR","materialUnlit","owner","isBuilt","setup","brdfLUT","skyboxMaterial","PMaterialSkyboxFilter","sceneCache","getSceneCache","skyboxMesh","getFilterMesh","updateMaterial","drawGeometry","IDENTITY","_this_skyboxMaterial","sceneStates","newProjViewMatrix","getNewProjectionMatrix","available","currentIntensity","currentReflectionsIntensity","hasDiffuseImage","hasIrradianceCoeffs","setVector2","setTexture","coeffs","PSkyboxType","PSkyboxCreator","checkCubeMapImage","imageList","lastImage","specularImageLists","getBrdfLutTextureOptions","brdfURL","brdfLutImage","createBrdfLutTexture","brdfLutOpts","createSkyboxOptions","createSpecularCubeMap","createDiffuseCubeMap","createSkyboxComponentData","specularCubeData","getSpecularCubeMapData","diffuseCubeData","getDiffuseCubeMapData","textureOptionsList","generateGUID","imageDatas","mipmap","imageId","getSkyboxParams","skyboxType","getSpecularImageList","getIrradianceCoeffs","getDiffuseImageList","concat","getSpecularImageListAntFarm","getSpecularImageListNFT","levelList","CompositionCache","meshCache","textureCache","geometryCache","renderPassCache","brdfLutTexture","brdfLutTexOptions","brdfLutTextureName","getOrCreateTexture","newTex","delete","getOrCreateGeometry","cachedGeom","geom","cachedMesh","getRenderPasses","resList","getBrdfLutTexture","getSkyboxOptions","skyboxOptions","loadStaticResources","genSkyboxOptions","newParams","deg2rad","viewportMatrix","CameraClipMode","landscape","projectionMatrix","reverse","portrait","premultiply","computeViewAABB","tanTheta","tan","yFarCoord","yNearCoord","xFarCoord","xNearCoord","isReversed","getEye","setEye","PCameraManager","winWidth","winHeight","cameraList","defaultCamera","initial","insert","insertCamera","remove","findResult","findIndex","updateDefaultCamera","getCameraList","getDefaultCamera","getCameraCount","getActiveCamera","getAspect","ambient","padding","followCamera","LightType","spot","directional","isDirectional","isPoint","isSpot","isAmbient","getWorldPosition","getWorldDirection","transformNormal","PLightManager","lightList","insertItem","inLight","insertLight","lightCount","meshData","parentIndex","subMeshes","boundingBox","isDisposed","proxy","EffectsMeshProxy","getParentIndex","parentItemId","getSkinObj","getMorphObj","isHide","getGeometry","subMesh","PSubMesh","ReferenceError","getItemBoundingBox","maxLightCount","boundingBoxMesh","_this_skin","getEffectsGeometry","getEffectsMaterial","_this_morph","_this_boundingBoxMesh","updateMorphWeights","weightsArray","updatedArray","normalMatrix","minPos","maxPos","viewProjectionMatrix","invWorldMatrix","newOrigin","newDirection","boxt","primt","subbox","union","inBounding","hs","minVector","maxVector","halfRadius","getParentId","hasSkin","effectsPriority","isCompressed","setGeometry","setMaterial","setHide","jointMatrixList","jointNormalMatList","half_float","jointMatrixTexture","jointNormalMatTexture","hasWeights","hasJoints","primitiveMacroList","materialMacroList","macro","enableMacro","pbrPass","hasTangents","hasUVCoords","renderMode","outputDefine","getRenderMode3DDefine","_this_jointMatrixTexture","_this_jointNormalMatTexture","nomralMatrix","updateUniformsByAnimation","updateUniformsByScene","isEmpty","basecolor","metallic","roughness","ao","emissive","diffuse","jointMatrixNumbers","jointNormalMatNumbers","setMatrixNumberArray","setFloats","isUnlitMaterial","inverseViewMatrix","newPosition","ZERO","PGeometry","getWorldBoundingBox","applyMatrix4","attributeNames","getAttributeNames","hasAttribute","geomExt","indexArray","setDrawCount","hasPositions","hasColors","itemData","parentComponent","morphObj","hasMorphTarget","getMaterials","getMaterialCount","getSkinProps","getSkinOpts","_this_parentComponent_sceneManager","_this_parentComponent_sceneManager_maxJointCount","skinObj","PSceneManager","renderSkybox","compName","itemList","lightManager","cameraManager","parentId2Mesh","enableDynamicSort","tickCount","lastTickSecond","sceneAABBCache","renderedMeshSet","opts","clean","componentName","lightItemCount","initGlobalState","capbility","_this_skybox","effectsTransfrom","newTransform","tick","deltaTime","deltaSeconds","activeCamera","winSize","sceneRadius","dynamicSortMeshes","states","meshComponents","priorityList","enabled","atransparent","btransparent","aposition","bposition","anewPos","bnewPos","prePriority","queryMesh","getSceneAABB","sceneBox","getWorldTransform","meshBox","printDebugInfo","cam","getRenderer","shaderLightCount","ModelPlugin","AbstractPlugin","precompile","compositions","pbrShaderCode","unlitShaderCode","pbrShaderData","Shader","unlitShaderData","addEffectsObjectData","onCompositionConstructed","sceneParams","storage","cache","onCompositionReset","renderFrame","endBehavior","END_BEHAVIOR_FORWARD","VFXItem","getEngine","addComponent","ModelPluginComponent","onCompositionDestroyed","prepareResource","keyList","pluginData","autoAdjustScene","cameraObject","cameraTransform","getViewMatrix","cameraDirection","cameraFov","cameraAspect","sceneAABB","newSize","newWidth","newHeight","finalHeight","parentTransform","toArray","updateSceneCamera","_this_item_composition","_this_item_composition_items","getLightItemCount","getMaxJointCount","getOptions","getViewportMatrix","meshComp","pluginItem","getItemByName","pluginComp","ModelTreeComponent","TreeComponent","CameraGestureType","CameraGestureHandlerImp","cameraCoordiante","startParams","mouseEvent","clientX","clientY","clientWidth","clientHeight","updateComposition","getItem","_this_composition_items","find","getCurrentTarget","getCurrentType","onKeyEvent","event","cameraID","lengthSquared","speed","rotate_self","onXYMoveBegin","startGesture","onXYMoving","arg0","moveGesture","onXYMoveEnd","endGesture","onZMoveBegin","onZMoving","onZMoveEnd","onRotateBegin","onRotating","onRotateEnd","onRotatePointBegin","rotate_focus","focusPoint","onRotatingPoint","onRotatePointEnd","moveTo","rotateTo","quat","onFocusPoint","distance","newDistance","newOffset","getCameraTransform","updateCameraTransform","dx","dy","newPos","ndx","ndy","dxAngle","dyAngle","newRotation","fromAxisAngle","Y","tempRotation","rotateMatrix","deltaPosition","cameraOptions","LoaderHelper","getTransformFromMat4","euler","toEuler","getEffectsTransformFromMat4","getTransformFromTranslation","getTransformFromDirection","d0","d1","cross","acos","getEffectsTransformFromDirection","getTransformFromTransDir","getEffectsTransformFromTransDir","getEulerFromQuat","q","order","setFromQuaternion","getQuatFromEuler","JSONConverter","keepIBLData","treeInfo","TreeInfo","downloader","Downloader","processScene","sceneData","sceneJSON","oldScene","oldBinUrls","binFiles","bin","newScene","isObject","loadJSON","_tmp","getStandardJSON","version","loadBins","JSONSceneVersion","playerVersion","web","native","shaders","setImage","setComponent","setItem","setComposition","newImages","newTextures","jobs","loadedMipmaps","newMipmaps","loadMipmapImage","img","sceneImage","keepImageSource","sourceFrom","newComponents","createSkyboxComponent","createLightComponent","treeComp","createItemsFromTreeComponent","tree","createMeshComponent","getAllTreeNodeList","compositionId","downloadJSON","status","responseText","downloadBinary","meshOptions","geometryPropsList","materialDatas","geomProps","getMaterialData","oldIndices","newIndices","geometryData","getGeometryDataFromPropsList","treeItem","getTreeItemByNodeId","treeNodeList","getTreeNodeListByNodeId","setupBoneData","treeData","nodes","VFXItemData","delay","renderLevel","pn","pluginName","getTransformData","indexOf","subIndex","createAnimationComponent","lightOptions","lightComponent","treeOptions","animationComponent","totalAnimationTime","track","inputArray","outputArray","points","controlPoints","lineValue","p3","slerpQuaternions","BezierKeyframeType","LINE","getTreeNode","getNodePath","BEZIER_CURVE_QUAT","BEZIER_CURVE","lerpVectors","BEZIER_CURVE_PATH","floats","colors","_BaseColorFactor","divide","getTextureData","newMaterial","macros","ints","vector4s","setupMaterial","_MetallicFactor","_RoughnessFactor","_EmissiveFactor","oldMat","newMat","texIndex","texTransform","texProperty","eulerHint","bindMatrixArray","id2Node","currentItem","nodeList","tree2NodeList","nodeList2Tree","nodeId2Node","node2Path","setNodePath","getTreeNodeListByTreeId","treeId","nodeIndex","getGeometryDataFromOptions","vertexCount","verticesType","VertexFormatType","Float32","verticesNormalize","uvsType","uvsNormalize","normalsType","normalsNormalize","modelData","vertices","uvs","normals","glType2VertexFormatType","verticesOffset","getOffset","uvsOffset","normalsOffset","indicesType","IndexFormatType","UInt16","UInt32","vertexData","channels","semantic","VertexBufferSemantic","Position","dimension","Uv","Normal","GeometryType","TRIANGLES","indexFormat","indexOffset","encodeVertexData","geomPropsList","totalCount","indexCount","geom0","geom1","isSame","array1","array2","mergeTypedArray","getVertexCount","totalByteLength","bufferOffset","vertexChannels","vertexBufferSemanticMap","vertexChannel","subBuffer","byteOffset","None","binaryString","String","fromCharCode","btoa","toBase64String","createGeometryData","formatType","Int8","UInt8","Int16","totalSize","ArrayBuffer","uint8View","defaultGLTFLoader","aUV2","aTangent","aColor","aJoints","aWeights","a_Position","a_UV","a_UV1","a_UV2","a_Normal","a_Tangent","a_Color","a_Joints","a_Joint1","a_Weights","a_Weight1","a_Target_Position0","a_Target_Position1","a_Target_Position2","a_Target_Position3","a_Target_Position4","a_Target_Position5","a_Target_Position6","a_Target_Position7","a_Target_Normal0","a_Target_Normal1","a_Target_Normal2","a_Target_Normal3","a_Target_Tangent0","a_Target_Tangent1","a_Target_Tangent2","a_Target_Tangent3","getDefaultEffectsGLTFLoader","LoaderImpl","setDefaultEffectsGLTFLoader","loader","gltfMeshs","gltfTextures","gltfMaterials","gltfAnimations","gltfImageBasedLights","timelineAssetId","imageElements","EndBehavior","restart","timelineAsset","sceneBindings","loadScene","_this_components","_this_components1","_this_components2","_this_items","gltfResource","gltfScene","sceneOptions","loaderOptions","gltf","resource","gltfImage","processGLTFResource","imageBasedLights","materialData","scenes","meshesComponentData","checkMeshComponentData","camerasComponentData","lightsComponentData","animationsComponentData","effects","playAllAnimation","playAnimation","animationClipData","tryAddSkybox","skyboxVis","vfxItemData","getLoadResult","baseColorId","emissiveIdSet","texData","newId","newTexData","textureDataMap","textureIdMap","addTextures","baseColorIdSet","processMaterialData","processMaterialTexture","processCameraComponentData","processLightComponentData","cubeTextures","ibl","imageBaseLightData","diffuseTexture","ref","processComponentData","processSkyboxComponentData","CameraType","processTextureOptions","textureName","itemIds","plugins","miscs","TimelineAsset","computeSceneAABB","getRemarkString","addLight","ItemType","addCamera","addSkybox","_this_images","_this_textures","skyboxInfo","freeze","ignoreSkybox","typeName","typ","NFT","FARM","geometryDataMap","componentDataMap","parentTransformMap","fromVector3","bounds","isPlayAnimation","isPlayAllAnimation","remark","getCompositionDuration","getItemDuration","_this_sceneOptions_effects_duration","getEndBehavior","_this_sceneOptions_effects_endBehavior","getSkyboxType","isSkyboxVis","isEnvironmentTest","includes","processLight","lights","fromGLTF","l","scaleColorVal","processCamera","cameras","processMaterial","strength","createAnimations","channel","primitive","hasSkinAnim","GeometryProxy","createMaterial","MaterialProxy","createTextureCube","imgList","createSkybox","irradianceCoefficients","specularImages","newIrradianceCoeffs","createDefaultSkybox","scaleColorVec","vec","getPBRShaderProperties","getUnlitShaderProperties","getDefaultPBRMaterialData","_SpecularAA","_NormalScale","_OcclusionStrength","_EmissiveIntensity","_AlphaCutoff","getDefaultUnlitMaterialData","Cull","gltfGeometry","hasSkinAnimation","_getBufferAttrib","itemSize","normalized","texCoordAttrib","getTexCoord","getTargetPosition","getAttribute","getTargetNormal","getTargetTangent","hasPosition","hasNormal","normalAttrib","hasTangent","tangentAttrib","texCoordList","jointAttribute","weightAttribute","getNormal","getTangent","getJoints","getWeights","hasTexCoord","texCoordCount","hasJointAttribute","hasWeightAttribute","texCoords","gltfMaterial","getTextureObject","texInfo","getTextureCoord","texCoord","getTextureTransform","extensions","KHR_texture_transform","getSpecularAA","_this_gltfMaterial_extras","extras","isUnlit","GLTFHelper","alphaMode","baseColorTextureObj","baseColorTextureCoord","baseColorTextureTransfrom","metallicRoughnessTextureObj","metallicRoughnessTextureCoord","metallicRoughnessTextureTransfrom","metalicFactor","normalTextureObj","normalTextureCoord","normalTextureTransfrom","occlusionTextureObj","occlusionTextureCoord","occlusionTextureTransfrom","emissiveTextureObj","emissiveTextureCoord","emissiveTextureTransfrom","enableShadow","hasEmissive","factor","_this_gltfMaterial_metallicFactor","_this_gltfMaterial_roughnessFactor","_this_gltfMaterial_normalTexture","_this_gltfMaterial_normalTexture_scale","_this_gltfMaterial_occlusionTexture","_this_gltfMaterial_occlusionTexture_strength","KHR_materials_unlit","createBoxFromGLTFBound","bound","registerPlugin","logger","EFFECTS"],"mappings":"itBAKaA,IAAAA,EAAmB,cCLhC,SAASC,EAAmBC,EAAKC,EAASC,EAAQC,EAAOC,EAAQC,EAAKC,GAClE,IACI,IAAIC,EAAOP,EAAIK,GAAKC,GAChBE,EAAQD,EAAKC,KACrB,CAAE,MAAOC,GAEL,YADAP,EAAOO,EAEX,CACIF,EAAKG,KAAMT,EAAQO,GAClBG,QAAQV,QAAQO,GAAOI,KAAKT,EAAOC,EAC5C,CACA,SAASS,EAAoBC,GACzB,OAAO,WACH,IAAIC,EAAOC,KAAMC,EAAOC,UAExB,OAAO,IAAIP,SAAQ,SAASV,EAASC,GACjC,IAAIF,EAAMc,EAAGK,MAAMJ,EAAME,GAEzB,SAASd,EAAMK,GACXT,EAAmBC,EAAKC,EAASC,EAAQC,EAAOC,EAAQ,OAAQI,EACpE,CAEA,SAASJ,EAAOgB,GACZrB,EAAmBC,EAAKC,EAASC,EAAQC,EAAOC,EAAQ,QAASgB,EACrE,CAEAjB,OAAMkB,EACV,GACJ,CACJ,CC7BA,SAASC,EAAkBC,EAAGC,GAO1B,OANAF,EAAoBG,OAAOC,gBAAkB,SAAwBH,EAAGC,GAGpE,OAFAD,EAAEI,UAAYH,EAEPD,CACX,EAEOD,EAAkBC,EAAGC,EAChC,CCNA,SAASI,EAAUC,EAAUC,GACzB,GAA0B,mBAAfA,GAA4C,OAAfA,EACpC,MAAM,IAAIC,UAAU,sDAGxBF,EAASG,UAAYP,OAAOQ,OAAOH,GAAcA,EAAWE,UAAW,CAAEE,YAAa,CAAE1B,MAAOqB,EAAUM,UAAU,EAAMC,cAAc,KAEnIN,GAAYR,EAAkBO,EAAUC,EAChD,CCVA,SAASO,EAAYC,EAAMC,GACvB,OAAa,MAATA,GAAmC,oBAAXC,QAA0BD,EAAMC,OAAOC,eACtDF,EAAMC,OAAOC,aAAaH,GACzBA,EAAAA,EAAgBC,EAClC,CCkDO,SAASG,EAAWC,EAAYC,EAAQvC,EAAKwC,GAClD,IAA2HC,EAAvHC,EAAI7B,UAAU8B,OAAQC,EAAIF,EAAI,EAAIH,EAAkB,OAATC,EAAgBA,EAAOpB,OAAOyB,yBAAyBN,EAAQvC,GAAOwC,EACrH,GAAuB,iBAAZM,SAAoD,mBAArBA,QAAQC,SAAyBH,EAAIE,QAAQC,SAAST,EAAYC,EAAQvC,EAAKwC,QACpH,IAAK,IAAIQ,EAAIV,EAAWK,OAAS,EAAGK,GAAK,EAAGA,KAASP,EAAIH,EAAWU,MAAIJ,GAAKF,EAAI,EAAID,EAAEG,GAAKF,EAAI,EAAID,EAAEF,EAAQvC,EAAK4C,GAAKH,EAAEF,EAAQvC,KAAS4C,GAChJ,OAAOF,EAAI,GAAKE,GAAKxB,OAAO6B,eAAeV,EAAQvC,EAAK4C,GAAIA,CAC9D,CAiEO,SAASM,EAAYC,EAASC,GACnC,IAAsGC,EAAGC,EAAGC,EAAxGC,EAAI,CAAEC,MAAO,EAAGC,KAAM,WAAa,GAAW,EAAPH,EAAE,GAAQ,MAAMA,EAAE,GAAI,OAAOA,EAAE,EAAI,EAAGI,KAAM,GAAIC,IAAK,IAAeC,EAAIzC,OAAOQ,QAA4B,mBAAbkC,SAA0BA,SAAW1C,QAAQO,WACtL,OAAOkC,EAAEE,KAAOC,EAAK,GAAIH,EAAU,MAAGG,EAAK,GAAIH,SAAcG,EAAK,GAAsB,mBAAX7B,SAA0B0B,EAAE1B,OAAO8B,UAAY,WAAa,OAAOtD,IAAM,GAAIkD,EAC1J,SAASG,EAAKE,GAAK,OAAO,SAAUC,GAAK,OACzC,SAAcC,GACV,GAAIf,EAAG,MAAM,IAAI3B,UAAU,mCAC3B,KAAOmC,IAAMA,EAAI,EAAGO,EAAG,KAAOZ,EAAI,IAAKA,OACnC,GAAIH,EAAI,EAAGC,IAAMC,EAAY,EAARa,EAAG,GAASd,EAAE,OAAYc,EAAG,GAAKd,EAAU,SAAMC,EAAID,WAAgBC,EAAEc,KAAKf,GAAI,GAAKA,EAAES,SAAWR,EAAIA,EAAEc,KAAKf,EAAGc,EAAG,KAAK/D,KAAM,OAAOkD,EAE3J,OADID,EAAI,EAAGC,IAAGa,EAAK,CAAS,EAARA,EAAG,GAAQb,EAAEpD,QACzBiE,EAAG,IACP,KAAK,EAAG,KAAK,EAAGb,EAAIa,EAAI,MACxB,KAAK,EAAc,OAAXZ,EAAEC,QAAgB,CAAEtD,MAAOiE,EAAG,GAAI/D,MAAM,GAChD,KAAK,EAAGmD,EAAEC,QAASH,EAAIc,EAAG,GAAIA,EAAK,CAAC,GAAI,SACxC,KAAK,EAAGA,EAAKZ,EAAEI,IAAIU,MAAOd,EAAEG,KAAKW,MAAO,SACxC,QACI,KAAMf,EAAIC,EAAEG,MAAMJ,EAAIA,EAAEZ,OAAS,GAAKY,EAAEA,EAAEZ,OAAS,KAAkB,IAAVyB,EAAG,IAAsB,IAAVA,EAAG,IAAW,CAAEZ,EAAI,EAAG,QAAU,CAC3G,GAAc,IAAVY,EAAG,MAAcb,GAAMa,EAAG,GAAKb,EAAE,IAAMa,EAAG,GAAKb,EAAE,IAAM,CAAEC,EAAEC,MAAQW,EAAG,GAAI,KAAO,CACrF,GAAc,IAAVA,EAAG,IAAYZ,EAAEC,MAAQF,EAAE,GAAI,CAAEC,EAAEC,MAAQF,EAAE,GAAIA,EAAIa,EAAI,KAAO,CACpE,GAAIb,GAAKC,EAAEC,MAAQF,EAAE,GAAI,CAAEC,EAAEC,MAAQF,EAAE,GAAIC,EAAEI,IAAIW,KAAKH,GAAK,KAAO,CAC9Db,EAAE,IAAIC,EAAEI,IAAIU,MAChBd,EAAEG,KAAKW,MAAO,SAEtBF,EAAKhB,EAAKiB,KAAKlB,EAASK,EAC5B,CAAE,MAAOgB,GAAKJ,EAAK,CAAC,EAAGI,GAAIlB,EAAI,EAAa,QAAED,EAAIE,EAAI,CAAG,CACzD,GAAY,EAARa,EAAG,GAAQ,MAAMA,EAAG,GAAI,MAAO,CAAEjE,MAAOiE,EAAG,GAAKA,EAAG,QAAK,EAAQ/D,MAAM,EAC9E,CAtBgDoE,CAAK,CAACP,EAAGC,GAAK,CAAG,CAuBnE,CAiLkD,mBAApBO,iBAAiCA,gBCpUxD,IAAAC,EAAK,WAAUA,SAAAA,EAIlBC,EACAC,EACAC,QAFUF,KAAAA,OACAC,KAAAA,OACAC,eAAAA,OALFC,YAAc,EADJJ,IAAAA,EAAAA,EAAAA,UAAAA,OAcpBK,EAAAA,SAAAA,SAAUzB,GACR,IAAM0B,EAAKtE,KAAKiE,KACZM,EAAKvE,KAAKoE,YACVI,EAAKF,EAAGC,GACRE,EAAKH,EAAGC,EAAK,GAEjBG,EAAmB,CACjBC,EAAM,CACJ,IAAIpD,EAEJqD,EAAa,CAKXC,EAAc,KAAMjC,EAAI4B,GAAK,CAC3B,IAAK,IAAIM,EAAWP,EAAK,IAAM,CAC7B,QAAWlE,IAAPmE,EAAkB,CACpB,GAAI5B,EAAI6B,EAAM,MAAMI,EAMpB,OAHAN,EAAKD,EAAGtC,OACRhC,KAAKoE,YAAcG,EAEZvE,KAAK+E,gBAAgBR,EAAK,EACnC,CAEA,GAAIA,IAAOO,EAAY,MAKvB,GAHAL,EAAKD,EAGD5B,GAFJ4B,EAAKF,IAAKC,IAIR,MAAMI,CAEV,CAGApD,EAAQ+C,EAAGtC,OAEX,MAAM4C,CACR,CAIA,GAAMhC,GAAK6B,EAqCX,MAAMC,EAnCJ,IAAMM,EAAWV,EAAG,GAEhB1B,EAAIoC,IACNT,EAAK,EACLE,EAAKO,GAIP,IAAK,IAAIF,EAAWP,EAAK,IAAM,CAC7B,QAAWlE,IAAPoE,EAIF,OAFAzE,KAAKoE,YAAc,EAEZpE,KAAK+E,gBAAgB,GAG9B,GAAIR,IAAOO,EAAY,MAKvB,GAHAN,EAAKC,EAGD7B,IAFJ6B,EAAKH,IAAKC,EAAK,IAIb,MAAMI,CAEV,CAGApD,EAAQgD,EACRA,EAAK,CAOT,CAGA,KAAOA,EAAKhD,GAAO,CACjB,IAAM0D,EAAMV,EAAMhD,IAAW,EAEzBqB,EAAI0B,EAAGW,GACT1D,EAAQ0D,EAERV,EAAKU,EAAM,CAEf,CAMA,GAJAT,EAAKF,EAAGC,QAIGlE,KAHXoE,EAAKH,EAAGC,EAAK,IAMX,OAFAvE,KAAKoE,YAAc,EAEZpE,KAAK+E,gBAAgB,GAG9B,QAAW1E,IAAPmE,EAIF,OAHAD,EAAKD,EAAGtC,OACRhC,KAAKoE,YAAcG,EAEZvE,KAAK+E,gBAAgBR,EAAK,EAErC,CAEAvE,KAAKoE,YAAcG,EAEnBvE,KAAKkF,gBAAgBX,EAAIE,EAAID,EAC/B,CAEA,OAAOxE,KAAKmF,YAAYZ,EAAIE,EAAI7B,EAAG4B,EACrC,EAKAY,EAAAA,QAAAA,WAEEpF,KAAKiE,UAAO5D,EAEZL,KAAKkE,UAAO7D,CACd,EAEAgF,EAAUN,gBAAV,SAA2BO,GAQzB,IANA,IAAMC,EAASvF,KAAKkE,KACdsB,EAASxF,KAAKmE,eACdsB,EAASH,EAAQE,EAEjBE,EAAS,IAAIC,aAAaH,GAEvBnD,EAAI,EAAGA,IAAMmD,IAAUnD,EAC9BqD,EAAOrD,GAAKkD,EAAOE,EAASpD,GAG9B,OAAOqD,CACT,EAhKoB1B,CAqKrB,CArKW,GAuKN4B,EAAD,SAAL5B,GAAM4B,SAAAA,EAES3B,EAAoBC,EAAoB2B,GAC7C5B,OAAAA,EAAAA,KAAAA,KAAAA,EAAMC,EAAM2B,GAHhBD,EAAAA,EAAAA,GAAAA,IAAAA,EAAAA,EAAAA,UAAAA,OAMJP,EAAUH,gBAAV,SAA2BX,EAAYE,EAAYD,KAGnDa,EAAUF,YAAV,SAAuBZ,EAAYE,EAAY7B,EAAW4B,GAWxD,IAVA,IACesB,EADTP,EAASvF,KAAKkE,KACdsB,SAASM,EAAA9F,KAAKmE,gBAAL2B,EAAuB,EAChCC,EAAUxB,EAAKiB,EACfQ,EAAUD,EAAUP,EAEpBS,GAAWrD,EAAI6B,IAAOD,EAAKC,GAC3ByB,EAAU,EAAID,EAEdP,EAAS,IAAIC,aAAaH,GAEvBnD,EAAI,EAAGA,IAAMmD,IAAUnD,EAC9BqD,EAAOrD,GACLkD,EAAOS,EAAU3D,GAAK6D,EACtBX,EAAOQ,EAAU1D,GAAK4D,EAG1B,OAAOP,CACT,EA3BIE,CAAsB5B,CAAvB,CAAuBA,GA8BtBmC,EAAD,SAALnC,GAAMmC,SAAAA,EAESlC,EAAoBC,EAAoB2B,GAC7C5B,OAAAA,EAAAA,KAAAA,KAAAA,EAAMC,EAAM2B,GAHhBM,EAAAA,EAAAA,GAAAA,IAAAA,EAAAA,EAAAA,UAAAA,OAMJd,EAAUH,gBAAV,SAA2BX,EAAYE,EAAYD,KAGnDa,EAAUF,YAAV,SAAuBZ,EAAYE,EAAY7B,EAAW4B,GAOxD,IANA,IACesB,EADTP,EAASvF,KAAKkE,KACdsB,SAASM,EAAA9F,KAAKmE,gBAAL2B,EAAuB,EAChCL,GAAUlB,EAAK,GAAKiB,EAEpBE,EAAS,IAAIC,aAAaH,GAEvBnD,EAAI,EAAGA,IAAMmD,IAAUnD,EAC9BqD,EAAOrD,GAAKkD,EAAOE,EAASpD,GAG9B,OAAOqD,CACT,EArBIS,CAAwBnC,CAAzB,CAAyBA,GAwBxBoC,EAAD,WAACA,SAAAA,IAAAA,CAAAA,OAAAA,EAEGC,UAAP,SAAkBC,EAAUC,EAAmBC,EAAWC,EAAoBC,EAAWC,EAAoB/D,GAE3G,IAAIgE,EAAKJ,EAAKC,EAAa,GACvBI,EAAKL,EAAKC,EAAa,GACvBK,EAAKN,EAAKC,EAAa,GACvBM,EAAKP,EAAKC,EAAa,GAErBO,EAAKN,EAAKC,EAAa,GACvBM,EAAKP,EAAKC,EAAa,GACvBO,EAAKR,EAAKC,EAAa,GACvBQ,EAAKT,EAAKC,EAAa,GAE7B,GAAU,IAAN/D,EAMF,OALA0D,EAAIC,EAAY,GAAKK,EACrBN,EAAIC,EAAY,GAAKM,EACrBP,EAAIC,EAAY,GAAKO,OACrBR,EAAIC,EAAY,GAAKQ,GAKvB,GAAU,IAANnE,EAMF,OALA0D,EAAIC,EAAY,GAAKS,EACrBV,EAAIC,EAAY,GAAKU,EACrBX,EAAIC,EAAY,GAAKW,OACrBZ,EAAIC,EAAY,GAAKY,GAKvB,GAAIJ,IAAOI,GAAMP,IAAOI,GAAMH,IAAOI,GAAMH,IAAOI,EAAI,CACpD,IAAIE,EAAI,EAAIxE,EACNyE,EAAMT,EAAKI,EAAKH,EAAKI,EAAKH,EAAKI,EAAKH,EAAKI,EACzCG,EAAOD,GAAO,EAAI,GAAM,EACxBE,EAAS,EAAIF,EAAMA,EAGzB,GAAIE,EAASC,OAAOC,QAAS,CAC3B,IAAMC,EAAMC,KAAKC,KAAKL,GAChBM,EAAMF,KAAKG,MAAMJ,EAAKL,EAAMC,GAElCF,EAAIO,KAAKD,IAAIN,EAAIS,GAAOH,EACxB9E,EAAI+E,KAAKD,IAAI9E,EAAIiF,GAAOH,CAC1B,CAEA,IAAMK,EAAOnF,EAAI0E,EAQjB,GANAV,EAAKA,EAAKQ,EAAIJ,EAAKe,EACnBlB,EAAKA,EAAKO,EAAIH,EAAKc,EACnBjB,EAAKA,EAAKM,EAAIF,EAAKa,EACnBhB,EAAKA,EAAKK,EAAID,EAAKY,EAGfX,IAAM,EAAIxE,EAAG,CACf,IAAMF,EAAI,EAAIiF,KAAKC,KAAKhB,EAAKA,EAAKC,EAAKA,EAAKC,EAAKA,EAAKC,EAAKA,GAE3DH,GAAMlE,EACNmE,GAAMnE,EACNoE,GAAMpE,EACNqE,GAAMrE,CACR,CACF,CAEA4D,EAAIC,GAAaK,EACjBN,EAAIC,EAAY,GAAKM,EACrBP,EAAIC,EAAY,GAAKO,EACrBR,EAAIC,EAAY,GAAKQ,CACvB,EArEIX,EAAD,GAwEC4B,EAAD,SAALhE,GAAMgE,SAAAA,EAES/D,EAAoBC,EAAoB2B,GAC7C5B,OAAAA,EAAAA,KAAAA,KAAAA,EAAMC,EAAM2B,GAHhBmC,EAAAA,EAAAA,GAAAA,IAAAA,EAAAA,EAAAA,UAAAA,OAMJ3C,EAAUH,gBAAV,SAA2BX,EAAYE,EAAYD,KAGnDa,EAAUF,YAAV,SAAuBZ,EAAYE,EAAY7B,EAAW4B,GAOxD,IANA,IACesB,EADTP,EAASvF,KAAKkE,KACdsB,SAASM,EAAA9F,KAAKmE,gBAAL2B,EAAuB,EAChCmC,GAASrF,EAAI6B,IAAOD,EAAKC,GAC3BgB,EAASlB,EAAKiB,EACZE,EAAS,IAAIC,aAAaH,GAEvB0C,EAAMzC,EAASD,EAAQC,IAAWyC,EAAKzC,GAAU,EACxDW,EAAgBC,UAAUX,EAAQ,EAAGH,EAAQE,EAASD,EAAQD,EAAQE,EAAQwC,GAGhF,OAAOvC,CACT,EArBIsC,CAAgChE,CAAjC,CAAiCA,GAkC/B,SAASmE,EAAwBC,EAAcC,EAAqBnE,EAAoB2B,EAAcyC,GAC3G,OAAQF,GACN,IAAK,SACH,MAAa,aAATE,EACK,IAAIN,EAAwBK,EAAOnE,EAAM2B,GAEzC,IAAID,EAAcyC,EAAOnE,EAAM2B,GAE1C,IAAK,OACH,OAAO,IAAIM,EAAgBkC,EAAOnE,EAAM2B,GAI1C,QACE,OAAO,IAAID,EAAcyC,EAAOnE,EAAM2B,GAE5C,CC1VA,SAAS0C,EAAqBC,EAAKX,IACpB,MAAPA,GAAeA,EAAMW,EAAIxG,UAAQ6F,EAAMW,EAAIxG,QAE/C,IAAK,IAAIK,EAAI,EAAGoG,EAAO,IAAIC,MAAMb,GAAMxF,EAAIwF,EAAKxF,IAAKoG,EAAKpG,GAAKmG,EAAInG,GAEnE,OAAOoG,CACX,CCJA,SAASE,EAAqCpI,EAAGqI,GAC7C,IAAIC,EAAuB,oBAAXrH,QAA0BjB,EAAEiB,OAAO8B,WAAa/C,EAAE,cAElE,GAAIsI,EAAI,OAAQA,EAAKA,EAAGnF,KAAKnD,IAAI6C,KAAK0F,KAAKD,GAE3C,GAAIH,MAAMK,QAAQxI,KAAOsI,ECL7B,SAAwCtI,EAAGyI,GACvC,GAAKzI,EAAL,CACA,GAAiB,iBAANA,EAAgB,OAAOgI,EAAqBhI,EAAGyI,GAE1D,IAAIzF,EAAI9C,OAAOO,UAAUiI,SAASvF,KAAKnD,GAAG2I,MAAM,GAAI,GAGpD,MADU,WAAN3F,GAAkBhD,EAAEW,cAAaqC,EAAIhD,EAAEW,YAAYiI,MAC7C,QAAN5F,GAAqB,QAANA,EAAoBmF,MAAMU,KAAK7F,GACxC,cAANA,GAAqB,2CAA2C8F,KAAK9F,GAAWgF,EAAqBhI,EAAGyI,QAA5G,CAPQ,CAQZ,CDJkCM,CAA+B/I,KAAOqI,GAAkBrI,GAAyB,iBAAbA,EAAEyB,OAAqB,CACjH6G,IAAItI,EAAIsI,GAEZ,IAAIxG,EAAI,EAER,OAAO,WACH,OAAIA,GAAK9B,EAAEyB,OAAe,CAAEtC,MAAM,GAE3B,CAAEA,MAAM,EAAOF,MAAOe,EAAE8B,KACnC,CACJ,CAEA,MAAM,IAAItB,UAAU,wIACxB,wBEjBEwI,GAEEC,EAFFD,QAASE,GAEPD,EAFOC,QAASC,GAEhBF,EAFgBE,QAASC,GAEzBH,EAFyBG,QAASC,GAElCJ,EAFkCI,QAASC,GAE3CL,EAF2CK,MAAOC,GAElDN,EAFkDM,MAAOC,GAEzDP,EAFyDO,WAAYC,GAErER,EAFqEQ,WACvEC,GACET,EADFS,KAAMC,GACJV,EADIU,OAAQC,GACZX,EADYW,IAAKC,GACjBZ,EADiBY,QCJrB,SAASC,GAAkBzI,EAAQ0I,GAC/B,IAAK,IAAIjI,EAAI,EAAGA,EAAIiI,EAAMtI,OAAQK,IAAK,CACnC,IAAIkI,EAAaD,EAAMjI,GACvBkI,EAAWC,WAAaD,EAAWC,aAAc,EACjDD,EAAWnJ,cAAe,EAEtB,UAAWmJ,IAAYA,EAAWpJ,UAAW,GAEjDV,OAAO6B,eAAeV,EAAQ2I,EAAWlL,IAAKkL,EAClD,CACJ,CACA,SAASE,GAAcC,EAAaC,EAAYC,GAI5C,OAHID,GAAYN,GAAkBK,EAAY1J,UAAW2J,GACrDC,GAAaP,GAAkBK,EAAaE,GAEzCF,CACX,CChBA,SAASG,KAUL,OATAA,GAAWpK,OAAOqK,QAAU,SAAgBlJ,GACxC,IAAK,IAAIS,EAAI,EAAGA,EAAInC,UAAU8B,OAAQK,IAAK,CACvC,IAAI0I,EAAS7K,UAAUmC,GACvB,IAAK,IAAIhD,KAAO0L,EAAYtK,OAAOO,UAAUgK,eAAetH,KAAKqH,EAAQ1L,KAAMuC,EAAOvC,GAAO0L,EAAO1L,GACxG,CAEA,OAAOuC,CACX,EAEOiJ,GAAS1K,MAAMH,KAAME,UAChC,ECJY+K,SAAAA,2UAAAA,CAAAA,IAAAA,EAAAA,CAAAA,IAmBAC,SAAAA,qGAAAA,CAAAA,IAAAA,EAAAA,CAAAA,IAUAC,SAAAA,2EAAAA,CAAAA,KAAAA,GAAAA,CAAAA,IAUAC,SAAAA,iOAAAA,CAAAA,KAAAA,GAAAA,CAAAA,IAgBAC,SAAAA,6GAAAA,CAAAA,KAAAA,GAAAA,CAAAA,IAUAC,SAAAA,8DAAAA,CAAAA,KAAAA,GAAAA,CAAAA,IAMAC,SAAAA,6GAAAA,CAAAA,KAAAA,GAAAA,CAAAA,QAOCC,GAAgBC,EAAKC,kBAAkBC,UACvCC,GAAkBH,EAAKC,kBAAkBG,YAK/CC,GAAK,WAACA,SAAAA,SACHC,YAAc,IAAItC,GAAQ,EAAG,EAAG,GAChCuC,KAAAA,SAAW,IAAIhC,GAAW,EAAG,EAAG,EAAG,QACnCiC,MAAQ,IAAIxC,GAAQ,EAAG,EAAG,GAHvBqC,IAAAA,EAAAA,EAAAA,UAAAA,OAUXI,EAAAA,YAAAA,SAAaC,GAGX,OAFAnM,KAAKoM,UAAUD,GAERnM,IACT,EAOAqM,EAAAA,qBAAAA,SAAsBC,GACpB,GAASjL,EAALiL,EAAiBC,GACnBvM,KAAKoM,UAAUE,EAAME,sBAChB,CACL,IAAMC,EAAe,IAAIF,EAAiB1B,GACrCyB,CAAAA,EAAAA,EAAAA,CACHI,OAAO,KAGTD,EAAaE,UAAS,GAEtB3M,KAAKoM,UAAUK,EAAaD,iBAC9B,CAEA,OAAOxM,IACT,EAOA4M,EAAAA,mBAAAA,SAAoBC,GAClB,IAAMC,EAAM9M,KAAK+M,YAIjB,OAFAF,EAAUG,gBAAgBF,GAEnBD,CACT,EAOAI,EAAAA,kBAAAA,SAAmBX,GAmBjB,OAlBIA,EAAMY,SACRlN,KAAKmN,eAAeb,EAAMY,UAE1BlN,KAAK+L,YAAYqB,IAAI,EAAG,EAAG,GAGzBd,EAAMN,SACRhM,KAAKqN,YAAYf,EAAMN,UAEvBhM,KAAKgM,SAASoB,IAAI,EAAG,EAAG,EAAG,GAGzBd,EAAML,MACRjM,KAAKsN,SAAShB,EAAML,OAEpBjM,KAAKiM,MAAMmB,IAAI,EAAG,EAAG,GAGhBpN,IACT,EAMAuN,EAAAA,eAAAA,WACE,OAAOvN,KAAK+L,WACd,EAMAoB,EAAAA,eAAAA,SAAgBK,GACPnM,EAAHmM,EAAe/D,IACjBzJ,KAAK+L,YAAYqB,IAAII,EAAIC,EAAGD,EAAI7K,EAAG6K,EAAIE,GAEvC1N,KAAK+L,YAAYqB,IAAII,EAAI,GAAIA,EAAI,GAAIA,EAAI,GAE7C,EAMAG,EAAAA,YAAAA,WACE,OAAO3N,KAAK+L,WACd,EAMA6B,EAAAA,YAAAA,SAAaJ,GACJnM,EAAHmM,EAAe/D,IACjBzJ,KAAK+L,YAAYqB,IAAII,EAAIC,EAAGD,EAAI7K,EAAG6K,EAAIE,GAEvC1N,KAAK+L,YAAYqB,IAAII,EAAI,GAAIA,EAAI,GAAIA,EAAI,GAE7C,EAMAK,EAAAA,YAAAA,WACE,OAAO7N,KAAKgM,QACd,EAMAqB,EAAAA,YAAAA,SAAaG,GACJnM,EAAHmM,EAAexD,IACjBhK,KAAKgM,SAASoB,IAAII,EAAIC,EAAGD,EAAI7K,EAAG6K,EAAIE,EAAGF,EAAIM,GAC/BzM,EAAHmM,EAAe1D,IACxB9J,KAAKgM,SAAS+B,aAAaP,GACfnM,EAAHmM,EAAe/D,IACxBzJ,KAAKgM,SAAS+B,aAAa,IAAIjE,GAAM0D,EAAIC,EAAGD,EAAI7K,EAAG6K,EAAIE,EAAG3D,GAAWiE,MAC7C,IAAfR,EAAIxL,OACbhC,KAAKgM,SAASoB,IAAII,EAAI,GAAIA,EAAI,GAAIA,EAAI,GAAIA,EAAI,IAE9CxN,KAAKgM,SAAS+B,aAAa,IAAIjE,GAAM0D,EAAI,GAAIA,EAAI,GAAIA,EAAI,GAAIzD,GAAWiE,KAE5E,EAMAC,EAAAA,SAAAA,WACE,OAAOjO,KAAKiM,KACd,EAMAqB,EAAAA,SAAAA,SAAUE,GACDnM,EAAHmM,EAAe/D,IACjBzJ,KAAKiM,MAAMmB,IAAII,EAAIC,EAAGD,EAAI7K,EAAG6K,EAAIE,GAEjC1N,KAAKiM,MAAMmB,IAAII,EAAI,GAAIA,EAAI,GAAIA,EAAI,GAEvC,EAMAT,EAAAA,UAAAA,WACE,OAAO,IAAInD,IAAUsE,QAAQlO,KAAKuN,iBAAkBvN,KAAK6N,cAAe7N,KAAKiO,WAC/E,EAMA7B,EAAAA,UAAAA,SAAWU,GACT,GAAOzL,EAAHyL,EAAelD,IAAS,CAC1B,IAAMuE,EAAMrB,EAAIsB,eAEhBpO,KAAKmN,eAAegB,EAAIpC,aACxB/L,KAAKqN,YAAYc,EAAInC,UACrBhM,KAAKsN,SAASa,EAAIlC,WACb,CACL,IAAMkC,EAAMvE,GAAQyE,UAAUvB,GAAKsB,eAEnCpO,KAAKmN,eAAegB,EAAIpC,aACxB/L,KAAKqN,YAAYc,EAAInC,UACrBhM,KAAKsN,SAASa,EAAIlC,MACpB,CACF,EA9LWH,CA+LZ,CA/LW,GAoMLwC,GAAK,WAACA,SAAAA,IAmBTtO,KAAKuO,OAAS,IAAI9E,GAAQ,EAAG,EAAG,GAChCzJ,KAAKwO,MAAQ,IAAI/E,GAAQ,EAAG,EAAG,GAC/BzJ,KAAKyO,MAAQ,IAAIhF,GAAQ,EAAG,EAAG,GAC/BzJ,KAAK0O,MAAQ,IAAIjF,GAAQ,EAAG,EAAG,GAtBtB6E,IAAAA,EAAAA,EAAAA,UAAAA,OA+BXK,EAAAA,eAAAA,SAAgBrC,EAAmBsC,YAAAA,IAAAA,GAAS,GAC1C5O,KAAKuO,OAAOM,SAASvC,EAAMqB,eAC3B,IAAMmB,EAAiBxC,EAAMuB,cAAckB,UAAU,IAAInF,IAOzD,OALIgF,GACFE,EAAeF,SAEjB5O,KAAKgP,mBAAmBF,GAEjB9O,IACT,EAMAgP,EAAAA,mBAAAA,SAAoB7C,GAClB,IAAM8C,EAAK9C,EAAO+C,SAElBlP,KAAKwO,MAAMpB,IAAI6B,EAAG,GAAIA,EAAG,GAAIA,EAAG,IAChCjP,KAAKyO,MAAMrB,IAAI6B,EAAG,GAAIA,EAAG,GAAIA,EAAG,IAChCjP,KAAK0O,MAAMtB,IAAI6B,EAAG,GAAIA,EAAG,GAAIA,EAAG,IAClC,EArDWX,CAsDZ,CAtDW,GA2DLa,GAAK,WAACA,SAAAA,IA2CTnP,KAAKoP,UAAW,EAChBpP,KAAKqP,cAAe,EACpBrP,KAAKsP,WAAaC,EAClBvP,KAAKwP,eAAiB,OACtBxP,KAAKyP,gBAAiB,EACtBzP,KAAK0P,aAAejE,EAAKkE,aAAaC,KACtC5P,KAAK6P,uBAAyB,EAAI,GAjDzBV,IAAAA,EAAAA,EAAAA,UAAAA,OAuDXW,EAAAA,MAAAA,WACE9P,KAAKoP,UAAW,EAChBpP,KAAKqP,cAAe,EACpBrP,KAAKsP,WAAaC,EAClBvP,KAAKwP,eAAiB,OACtBxP,KAAKyP,gBAAiB,EACtBzP,KAAK0P,aAAejE,EAAKkE,aAAaC,KACtC5P,KAAK6P,uBAAyB,EAAI,EACpC,EAKAE,EAAAA,gBAAAA,WACE,OAAO/P,KAAK0P,eAAiBjE,EAAKkE,aAAaC,IACjD,EAjCAT,EAAOa,YAAP,WAEE,OAAOhQ,KAAKiQ,WAAajQ,KAAKiQ,SAAW,IAAIjQ,KAC/C,EAxCWmP,GAAAA,EAAAA,EA2EPe,IAAAA,kBAAJ,WACE,OAAOlQ,KAAKsP,aAAeC,CAC7B,IAKIY,IAAAA,kBAAJ,WACE,OAAQnQ,KAAKkQ,WACf,IAKIE,IAAAA,mBAAJ,WACE,MAA+B,WAAxBpQ,KAAKwP,cACd,IAKIa,IAAAA,iBAAJ,WACE,OAAQrQ,KAAKoQ,YACf,KAlGWjB,CAmGZ,CAnGW,GCpVRmB,GAAc,EAKXC,GAAK,WAAUA,SAAAA,IAGnBvQ,KACDmJ,KAAO,iBAIPf,KAAAA,KAAoB6C,EAAY2E,KARZW,IAAAA,EAAAA,EAAAA,UAAAA,OAiBpBnL,EAAAA,QAAAA,WAEA,EAMAoL,EAAAA,OAAAA,WACE,OAAOxQ,KAAKoI,OAAS6C,EAAY2E,IACnC,EAMAa,EAAAA,QAAAA,WACE,OAAOzQ,KAAKoI,OAAS6C,EAAY2E,IACnC,EAEAvK,EAAUqL,QAAV,SAAmBvH,GACjB,OAAUA,EAAK,KAAImH,IACrB,EAvCoBC,CAwCrB,CAxCW,GA6CLI,GAAK,SAALJ,GAAeI,SAAAA,kDACZC,UAAW,EACXC,EAAAA,WAAa,IAAI/E,GAGxBgF,EACDC,SAAU,IANUJ,EAAAA,EAAAA,GAAAA,IAAAA,EAAAA,EAAAA,UAAAA,OAWpBK,EAAAA,OAAAA,aASAC,EAAAA,OAAAA,SAAQC,EAAsBC,GAE9B,EAMAC,EAAAA,iBAAAA,SAAkBC,GAChBrR,KAAKqR,QAAUA,CACjB,EAMAhM,EAASD,QAAT,WACEmL,EAAAvP,UAAMoE,QAAD1B,KAAA1D,MACLA,KAAKqR,SAAU,EACfrR,KAAK+Q,SAAU,CACjB,EAxCoBJ,GAAAA,EAAAA,EA6ChBU,IAAAA,cAAJ,WACE,OAAOrR,KAAK4Q,UAAY5Q,KAAKyQ,SAC/B,MAKA,SAAajD,GACXxN,KAAK4Q,SAAWpD,CAClB,IAKIX,IAAAA,gBAAJ,WACE,OAAO7M,KAAK6Q,UACd,MAKA,SAAerD,GACNnM,EAAHmM,EAAe1B,IACjB9L,KAAK6Q,WAAarD,QAEGnN,IAAjBmN,EAAIN,UACNlN,KAAK6Q,WAAW1D,eAAeK,EAAIN,eAEhB7M,IAAjBmN,EAAIxB,UACNhM,KAAK6Q,WAAWxD,YAAYG,EAAIxB,eAEhB3L,IAAdmN,EAAIvB,OACNjM,KAAK6Q,WAAWvD,SAASE,EAAIvB,OAGnC,IAKIF,IAAAA,kBAAJ,WACE,OAAO/L,KAAK6Q,WAAWtD,gBACzB,MAKA,SAAiBC,GACfxN,KAAK6Q,WAAW1D,eAAeK,EACjC,IAKIN,IAAAA,eAAJ,WACE,OAAOlN,KAAK6Q,WAAWtD,gBACzB,MAKA,SAAcC,GACZxN,KAAK6Q,WAAW1D,eAAeK,EACjC,IAKIxB,IAAAA,eAAJ,WACE,OAAOhM,KAAK6Q,WAAWhD,aACzB,MAKA,SAAcL,GACZxN,KAAK6Q,WAAWxD,YAAYG,EAC9B,IAKIvB,IAAAA,YAAJ,WACE,OAAOjM,KAAK6Q,WAAW5C,UACzB,MAKA,SAAWT,GACTxN,KAAK6Q,WAAWvD,SAASE,EAC3B,IAKIrB,IAAAA,aAAJ,WACE,OAAOnM,KAAK6Q,WAAW9D,WACzB,MAKA,SAAYS,GACVxN,KAAK6Q,WAAWzE,UAAUoB,EAC5B,IAKI8D,IAAAA,iBAAJ,WACE,IAAMC,EAAQ,IAAIjD,GAIlB,OAFAiD,EAAM5C,eAAe3O,KAAK6Q,YAEnBU,CACT,KAjKoBZ,EAAV,CAA0BJ,ICI/B,SAASiB,GAAoBC,EAAevN,GAC/C,IAMsDuN,EAN9CC,EAAeD,EAAfC,WACFC,EAAM9G,GAAK4G,CAAAA,EAAAA,GACjB,GAAIE,EAAIC,QACJD,EAAIC,QAAU/G,GAAK8G,CAAAA,EAAAA,EAAIC,SACnBD,EAAIC,QAAQ1N,OAEZyN,EAAIC,QAAQ1N,KAAO2N,GAAqB3N,EAAMuN,OAAAA,EAAAA,EAAcG,cAAdH,EAAAA,EAAuBvN,YAIxE,GAAIyN,EAAIrM,MAAO,CAOkCmM,IAAAA,EAFlD,GAFAE,EAAIC,QAAU/G,GAAK8G,CAAAA,EAAAA,EAAIrM,OAEnBqM,EAAIC,QAAQ1N,KAEZyN,EAAIC,QAAQ1N,KAAO2N,GAAqB3N,EAAMuN,OAAAA,EAAAA,EAAcnM,YAAdmM,EAAAA,EAAqBvN,KAE3E,CASA,OARAzD,OAAOqR,KAAKJ,GAAYK,SAAQ5I,SAAAA,GAC5B,IAAM6I,EAAYN,EAAWvI,GACf8I,EAAYD,EAAlB9N,KACRyN,EAAID,WAAWvI,GAAQ0B,GAAKmH,CAAAA,EAAAA,GACxBC,IACAN,EAAID,WAAWvI,GAAMjF,KAAO2N,GAAqB3N,EAAM+N,GAE/D,IACON,CACX,CACA,IAAMO,GAAU,CACZC,GAAIC,UACJC,GAAIC,WACJC,IAAKC,WACLC,IAAKC,YACLC,IAAKhN,aACLiN,IAAKC,WACLC,IAAKC,aAOF,SAASlB,GAAqBmB,EAAQf,GACzC,GAAsB,GAAlBA,EAAQjQ,QAAeiQ,EAAQ,KAAOxG,EAAKwH,UAAUC,SAAYjB,EAAAA,EAAQ,GAAcvJ,OAEvF,OAAOuJ,EAEX,IAAyCA,EAAAA,EAAQ,GAA1C3M,EAAkC2M,EAAAA,GAA3BkB,EAA2BlB,EAAAA,GAApBmB,EAAoBnB,EAAAA,GAAR7J,EAAQ6J,EAAAA,GACzC,IAAK7J,EACD,OAAO4K,EAAO1N,GAAO4D,MAAMiK,EAAOC,GAEtC,IAAMC,EAAOnB,GAAQ9J,IAASkK,WAC9B,OAAO,IAAIe,EAAKL,EAAO1N,GAAQ6N,EAAOC,EAAaC,EAAKC,kBAC5D,CC7GA,IAAMC,GAAa,UACbC,GAAgB,IAAIC,IAMnB,SAASC,GAAaC,GAC3BC,QAAQrU,KAAK,eAAiBkB,OAAOoT,eAAeF,IACpD,IAAIG,EAAY,EAEhB,IAAK,IAAM3K,KAAQ1I,OAAOoT,eAAeF,GAC1B,aAATxK,GAE2C,mBAApCwK,EAAIxK,OACX2K,EAGFH,EAAIxK,EAAOoK,IAAcI,EAAIxK,GAE7BwK,EAAIxK,GAAQ4K,GAAYJ,EAAKxK,IAGjCyK,QAAQrU,KAAK,aAAeuU,GAsD9B,SAAwBH,GACtB,IAAK,IAAMxK,KAAQ1I,OAAOoT,eAAeF,GACQ,iBAApCA,EAAIxK,IACbqK,GAAcpG,IAAIuG,EAAIxK,GAA6BA,EAGzD,CA1DE6K,CAAcL,EAChB,CAEA,SAASM,GAAgB9K,EAAclJ,GAIrC,IAHA,IAAMiU,EAAS,GAAG/K,EACZgL,EAAoB,GAEjB9R,EAAI,EAAGA,EAAIpC,EAAK+B,OAAQK,IAAK,CAKvBpC,IAAAA,EAJS,iBAAXA,EAAKoC,IAAkBmR,GAAcY,IAAInU,EAAKoC,IACvD8R,EAAQvQ,KAAK4P,GAAca,IAAIpU,EAAKoC,IAAM,IAAIpC,EAAKoC,GAAG,KAGxD8R,EAAQvQ,KAAY,OAAP3D,EAAAA,EAAKoC,SAAE,EAAPpC,EAASgJ,WACxB,CAEA,OAAOiL,GAAUC,EAAQnS,OAAS,EAAI,IAAMmS,EAAQG,KAAK,MAAQ,IAAM,KACzE,CAgBA,SAASP,GAAaJ,EAAmBxK,GAiBvC,OAhBA,WAGE,IAAMwI,EAAMgC,EAAIxK,EAAOoK,IAAYpT,MAAMH,KAAME,WACzCT,EAAgBkU,EAAIY,WAS1B,OAPI9U,EAAQ,GACVmU,QAAQrU,KAAK,gBAtBnB,SAA0BE,GACxB,IAUQ+U,EAVFA,EAAW,IAAIf,IAUrB,OARAe,EAASpH,IAAIqH,sBAAsBC,SAAU,YAC7CF,EAASpH,IAAIqH,sBAAsBE,aAAc,gBACjDH,EAASpH,IAAIqH,sBAAsBG,cAAe,iBAClDJ,EAASpH,IAAIqH,sBAAsBI,kBAAmB,qBACtDL,EAASpH,IAAIqH,sBAAsBK,8BAA+B,iCAClEN,EAASpH,IAAIqH,sBAAsBM,cAAe,iBAClDP,EAASpH,IAAIqH,sBAAsBO,mBAAoB,uBAE/CR,OAAAA,EAAAA,EAASH,IAAI5U,IAAb+U,EAAuB,iBAAmB,IAAI/U,EAAM,GAC9D,CAUqCwV,CAAgBxV,GAAS,SAAWwU,GAAe9K,EAAMjJ,YACxF0T,QAAQsB,SAERtB,QAAQrU,KAAK0U,GAAe9K,EAAMjJ,YAG7ByR,CACT,CAGF,CAeO,SAASwD,GAAoBC,GAClC,IAAMnF,EAAWmF,EAAOC,cAExB,OAAOC,KAAKC,UAAUtF,OAAU5P,EAAW,EAC7C,CAOO,SAASmV,GAAcJ,GAC5B,IAAMK,EAAoB,GAEpBC,EAAcN,EAAOO,kBAAkB,GAY7C,OAVAD,MAAAA,GAAAA,EAAaE,MAAM7D,SAAQ8D,SAAAA,GACzB,GAAIA,EAAKzN,OAAStJ,EAAkB,CAClC,IAAMgX,EAAgBD,EAAKE,aAAaC,WAEpCF,SAAAA,EAAeG,QAAQ7N,QAAS6C,EAAYiL,MAC9CT,EAAS7R,KAAKkS,EAAcG,QAEhC,CACF,IAEOR,CACT,CCpHO,OAAAU,GAAK,WAACA,SAAAA,EAkBEC,GACOA,IAAAA,EACMA,EADxBpW,KAAKqW,WAAaD,OAAAA,EAAAA,EAAQC,YAARD,EAAsB,IAAI7M,GAAQ,IAAK,KACzDvJ,KAAKsW,iBAAmBF,OAAAA,EAAAA,EAAQE,kBAARF,EAA4B,GACpDpW,KAAKuW,gBAAkBH,EAAQG,gBArBtBJ,IAAAA,EAAAA,EAAAA,UAAAA,OA4BXK,EAAAA,mBAAAA,SAAoBJ,GAEHA,IAAAA,EADfpW,KAAKuW,gBAAkB,CACrBE,YAAaL,OAAAA,EAAAA,EAAQK,aAARL,EAAuBM,EAAgCC,iBAExE,EAKAC,EAAAA,0BAAAA,WACE5W,KAAKuW,gBAAkB,CAAEE,YAAaC,EAAgCC,iBACxE,EAKAE,EAAAA,sBAAAA,WACE7W,KAAKuW,qBAAkBlW,CACzB,EAMAyW,EAAAA,mBAAAA,SAAoBV,GAGNA,IAAAA,EACFA,EACKA,EACAA,EALfpW,KAAKsW,iBAAiB1S,KAAK,CACzBmT,QAAS,CACPC,OAAQZ,OAAAA,EAAAA,EAAQY,QAARZ,EAAkBa,EAAUC,KACpC9O,KAAMgO,OAAAA,EAAAA,EAAQhO,MAARgO,EAAgBa,EAAUE,WAChCC,UAAWhB,OAAAA,EAAAA,EAAQiB,QAARjB,EAAkBa,EAAUK,OACvCC,UAAWnB,OAAAA,EAAAA,EAAQiB,QAARjB,EAAkBa,EAAUK,SAG7C,EAMAE,EAAAA,sBAAAA,SAAuB5V,GACjBA,GAAU,GAAKA,EAAS5B,KAAKsW,iBAAiBtU,QAChDhC,KAAKsW,iBAAiBmB,OAAO7V,EAAQ,EAEzC,EAvEWuU,GAAAA,EAAAA,EA4EPuB,IAAAA,eAAJ,WACE,MAAO,CAAC,EAAG,EAAG1X,KAAKqW,WAAW5I,EAAGzN,KAAKqW,WAAW1T,EACnD,KA9EWwT,CA+EZ,CA/EW,GAoFLwB,GAAK,oBAACA,EAWEC,EAAgBC,GAC3B,IAAMC,EAAWC,EAAS9W,OACxB2W,EACA,CACEI,OAAQ,CACNC,OAAQjY,KAAKkY,aACbC,SAAUnY,KAAKoY,eACfC,QAAQ,KAKdP,EAASQ,WAAY,EACrBR,EAASS,WAAY,EACrBvY,KAAKkW,KAAOsC,EAAKvX,OACf2W,EACA,CACEzO,KAAM,UACN2O,SAAAA,EACAW,SAAUC,EAASzX,OAAO2W,EAAQ5X,KAAKyY,UACvCZ,SAAAA,IA/BKF,IAAAA,EAAAA,EAAAA,UAAAA,OA2CX3G,EAAAA,OAAAA,SAAQ2H,EAAsBC,EAAyBC,EAAyBC,GAC9E,IAAMhB,EAAW9X,KAAKkW,KAAK4B,SAE3BA,EAAS1L,UAAU,wBAAyBuM,GAC5C,IAAK,IAAItW,EAAI,EAAGA,EAAIwW,EAAU7W,OAAQK,GAAK,EACzCyV,EAASiB,WAAY,iBAAgB1W,EAAI,EAAE,IAAIoH,GAAQ4E,UAAUwK,EAAWxW,IAE9EyV,EAASiB,WAAW,aAAcD,EACpC,EAKA1T,EAAAA,QAAAA,WACEpF,KAAKkW,KAAK9Q,UAEVpF,KAAKkW,UAAO7V,CACd,EA5DWsX,GAAAA,EAAAA,EAiEPO,IAAAA,mBAAJ,WACE,MAAQ,0XAaV,IAKIE,IAAAA,qBAAJ,WACE,MAAQ,kJAQV,IAKIK,IAAAA,eAAJ,WACE,IAAMvU,EAAO,IAAIyB,aAAa,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAC9CL,EAAQ,IAAIyN,YAAY,CAC5B,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACrB,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACrB,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAGvB,MAAO,CACLrB,WAAY,CACVsH,KAAM,CACJ5Q,KAAM6O,EAAUgC,MAChBpT,KAAM,EACN3B,KAAAA,EACAsB,OAAQG,aAAa2N,kBACrB7N,OAAQ,IAGZyT,KAAMjC,EAAUkC,MAChBvH,QAAS,CAAE1N,KAAMoB,GACjB8T,UAAW,EACXC,UAAW,GAEf,KAzHW1B,CA0HZ,CA1HW,y+lBChFK2B,SAAAA,GAOdA,EACeC,MAAT,SAAgBxO,EAAgByO,GAKrC,OAHAzO,EAASA,EAAO0O,QAAQ,mBACtBD,EAASE,KAAIla,SAAAA,GAAS,MAAC,WAAUA,CAAS8U,IAAAA,KAAK,MAGnD,CACF,CAfiBgF,CAAAA,KAAAA,GAAAA,CAAAA,IAiBjBK,EAAcC,gBAAgB,0qJAC9BD,EAAcC,gBAAgB,0iBAC9BD,EAAcC,gBAAgB,wuCAC9BD,EAAcC,gBAAgB,w7GAC9BD,EAAcC,gBAAgB,wuFAC9BD,EAAcC,gBAAgB,qqFAC9BD,EAAcC,gBAAgB,0JCvBvB,IAAAC,GAAK,WAACA,SAAAA,IAAAA,CAAAA,OAWXA,EAAOC,oBAAP,SAA4BC,GAC1B,IAAMP,EAAWO,EAAQC,YACnBC,EAAeF,EAAQjC,SAASmC,aAEtC,OAAQA,GACN,KAAK7O,GAAc8O,MACnB,KAAK9O,GAAc+O,IACnB,KAAK/O,GAAcgP,WACjB,OAAOd,GAAqBC,MAAMc,GAAeb,GACnD,KAAKpO,GAAckP,aACjB,OAAOhB,GAAqBC,MAAMgB,GAAYf,GAChD,QACE,MAAM,IAAIgB,MAAM,yBAAyBP,EAAa,+BAE5D,EAOAJ,EAAOY,sBAAP,SAA8BV,GAC5B,IAAMP,EAAWO,EAAQC,YACnBC,EAAeF,EAAQjC,SAASmC,aAEtC,OAAQA,GACN,KAAK7O,GAAc8O,MACnB,KAAK9O,GAAc+O,IACjB,OAAOb,GAAqBC,MAAMmB,GAAuBlB,GAC3D,KAAKpO,GAAcgP,WACjB,OAAOd,GAAqBC,MAAMoB,GAAgBnB,GACpD,KAAKpO,GAAckP,aACjB,OAAOhB,GAAqBC,MAAMqB,GAAYpB,GAChD,QACE,MAAM,IAAIgB,MAAM,yBAAyBP,EAAa,iCAE5D,EA/CWJ,EAiDJgB,oBAAP,SAA4BZ,GAC1B,OAAQA,GACN,KAAK7O,GAAc8O,MACnB,KAAK9O,GAAc+O,IACnB,KAAK/O,GAAcgP,WACjB,OAAOC,GACT,KAAKjP,GAAckP,aACjB,OAAOC,GACT,QACE,MAAM,IAAIC,MAAM,yBAAyBP,EAAa,6BAE5D,EAOAJ,EAAOiB,sBAAP,SAA8Bb,GAC5B,OAAQA,GACN,KAAK7O,GAAc8O,MACnB,KAAK9O,GAAc+O,IACjB,OAAOO,GACT,KAAKtP,GAAcgP,WACjB,OAAOO,GACT,KAAKvP,GAAckP,aACjB,OAAOM,GACT,QACE,MAAM,IAAIJ,MAAM,yBAAyBP,EAAa,+BAE5D,EA/EWJ,CAiFZ,CAjFW,GCRL,SAASkB,KAId,MAAO,CACLC,iBAJuBnB,GAAegB,oBAAoBzP,GAAc+O,KAKxEc,mBAJyBpB,GAAeiB,sBAAsB1P,GAAc+O,KAMhF,CAEO,SAASe,KAId,MAAO,CACLF,iBAJuBnB,GAAegB,oBAAoBzP,GAAc8O,OAKxEe,mBAJyBpB,GAAeiB,sBAAsB1P,GAAc8O,OAMhF,CAOO,SAASiB,GAAsBpB,GAIpC,MAAO,CACLiB,iBAJuBnB,GAAeC,oBAAoBC,GAK1DkB,mBAJyBpB,GAAeY,sBAAsBV,GAMlE,CAEO,SAASqB,GAAyBrB,GAIvC,MAAO,CACLiB,iBAJuBnB,GAAeC,oBAAoBC,GAK1DkB,mBAJyBpB,GAAeY,sBAAsBV,GAMlE,CAOO,SAASsB,GAAqBtB,GAInC,MAAO,CACLiB,iBAJuBnB,GAAeC,oBAAoBC,GAK1DkB,mBAJyBpB,GAAeY,sBAAsBV,GAMlE,CAOO,SAASuB,GAAyBvB,GAYvC,MAAO,CACLiB,iBAqRM,wOApRNC,mBAb0B,gNAe9B,CAOO,SAASM,GAAwBxB,GAUtC,MAAO,CACLiB,iBAAkBQ,GAAW,CAAEC,YAAY,IAC3CR,mBAX0B,+JAa9B,CAOO,SAASS,GAA0B3B,GAWxC,MAAO,CACLiB,iBAAkBQ,GAAW,CAAEC,YAAY,IAC3CR,mBAZ0B,gOAc9B,CAOO,SAASU,GAAyB5B,GAmBvC,MAAO,CACLiB,iBA4MM,wOA3MNC,mBApB0B,osBAsB9B,CAOO,SAASW,GAA2B7B,GAYzC,MAAO,CACLiB,iBAqLM,wOApLNC,mBAb0B,+NAe9B,CAOO,SAASY,GAA6B9B,GAkB3C,MAAO,CACLiB,iBAwJM,wOAvJNC,mBAnB0B,slBAqB9B,CAOO,SAASa,GAA6B/B,GAqB3C,MAAO,CACLiB,iBAwHM,wOAvHNC,mBAtB0B,w6BAwB9B,CAOO,SAASc,GAA0BC,GACxC,OAAIA,EACKR,GAAW,CAAEC,YAAY,IAExB,ozBAgCZ,CAOO,SAASQ,GAA4BD,GAC1C,OAAIA,EAkEI,wOA/DE,+fAgBZ,CAEA,SAASR,GAAYU,QAAAA,IAAAA,IAAAA,EAAkC,CAAA,GACrD,IAAMlC,EAAwB,CAAC,gBAwC/B,OAtCIkC,EAAOC,QAAUnC,EAAYpW,KAAK,qBAClCsY,EAAOT,YAAczB,EAAYpW,KAAK,yBAE1CoW,EAAYpW,KAAM,kuBAmCXoW,EAAY1F,KAAK,KAC1B,CDxVauF,GAIJuC,YAAc,SEbhB,IAAAC,GAAK,WAACA,SAAAA,IAWTrc,KAAKsc,IAAM,IAAIC,IACfvc,KAAKwc,KAAO,IAAID,IAZPF,IAAAA,EAAAA,EAAAA,UAAAA,OAkBXI,EAAAA,MAAAA,WACEzc,KAAKsc,IAAIG,QACTzc,KAAKwc,KAAKC,OACZ,EAKAC,EAAAA,QAAAA,WACE,IAAMC,EAAO3c,KAAKwc,KAElBxc,KAAKwc,KAAOxc,KAAKsc,IACjBtc,KAAKsc,IAAMK,EACX3c,KAAKsc,IAAIG,OACX,EAOAG,EAAAA,aAAAA,SAAcC,cACZ7c,KAAKsc,IAAIvK,SAAQ8D,SAAAA,GACV/E,EAAK0L,KAAKpI,IAAIyB,IACjBgH,EAAWhH,EAEf,GACF,EAOAiH,EAAAA,eAAAA,SAAgBD,cACd7c,KAAKwc,KAAKzK,SAAQ8D,SAAAA,GACX/E,EAAKwL,IAAIlI,IAAIyB,IAChBgH,EAAWhH,EAEf,GACF,EAOAkH,EAAAA,WAAAA,SAAYF,GACV7c,KAAKsc,IAAIvK,SAAQ8D,SAAAA,GACfgH,EAAWhH,EACb,GACF,EArEWwG,CAuEZ,CAvEW,GCkBLrG,GAAK,SAALgH,YAAMhH,EA2BE4B,EAAgB1T,gBACrB0T,EAAAA,EAAAA,KAAAA,KAAAA,IAAAA,MARRqF,aAAyB,GA6HxBnM,EACDoM,iBAAmB,SAACC,GAClBrM,EAAKsM,qBACL,IAAMC,EAAWvM,EAAKuM,SAEtB,GAAIA,IAAaF,GAAS3V,OAAO8V,UAAUD,EAASE,WAAY,CAC9D,IAAMnV,EAAOiV,EAASjV,KAEtB,GAAIA,IAASqD,EAAK+R,kBAAkBC,IAAK,CACvC,GAAIpc,EAAAyP,EAAKmF,QAAmByH,IAAO,CACjC,IAAMxH,EAAOpF,EAAKmF,QAWlB,MAV2C,CACzCsH,SAAUF,EAASE,SACnBnV,KAAMuV,EAAYC,OAClBC,QAAS,SAAUC,EAAUC,GAG3B,OAFe7H,EAAK8H,WAAWF,EAAIvP,OAAQuP,EAAIG,UAGjD,GAKF,IAAMC,EAAkBpN,EAAKjE,UAAUL,iBAWvC,MAV2C,CACzC+Q,SAAUF,EAASE,SACnBnV,KAAMuV,EAAYC,OAClBC,QAAS,SAAUC,EAAUC,GAG3B,OAFeI,GAA6BL,EAAKI,EAAiBb,EAGpE,EAKN,CAAO,GAAIjV,IAASqD,EAAK+R,kBAAkBY,OAAQ,CACjD,IAAMC,EAAM,IAAI5U,GAEhBqH,EAAKjE,UAAUyR,eAAeD,GAC9B,IAAME,EAAS,IAAI9U,GAQnB,OANI4T,EAASkB,QACXA,EAAOC,aAAanB,EAASkB,QAG/BA,EAAOE,IAAIJ,GAEJ,CACLjW,KAAMA,EACNmV,SAAUF,EAASE,SACnBmB,OAAQrB,EAASqB,QAAU,EAC3BH,OAAAA,EAEJ,CACF,CACF,EA5KMra,GACF4M,EAAK6N,SAASza,KA9BP8R,EAAAA,EAAAA,GAAAA,IAAAA,EAAAA,EAAAA,UAAAA,OAqCX3Q,EAASuZ,QAAT,WAKE,IAAAC,EAJA7e,KAAK8e,aAAeC,GAAgB/e,MACpCA,KAAKgf,gBACLhf,KAAK6V,KAAKzN,KAAOtJ,EACjBkB,KAAK6X,SAAW7X,KAAK6V,KAAKoJ,YACT,OAAjBJ,EAAA7e,KAAK8e,eAALD,EAAmBK,QAAQlf,KAAKiW,SAC5BjW,KAAK6V,KAAKsJ,UAAYnf,KAAK6V,KAAKuJ,QAClCpf,KAAKiW,QAAQoJ,iBAAiBrf,KAAK6V,KAAKsJ,SAAUnf,KAAK6V,KAAKuJ,QAE9Dpf,KAAKsf,YAAW,GAChBtf,KAAK6V,KAAKqH,iBAAmBld,KAAKkd,gBACpC,EAMA7X,EAASka,SAAT,SAAmBC,GACbxf,KAAK8e,cACP9e,KAAKiW,QAAQsD,MAAMvZ,KAAK8e,cAG1B9e,KAAKiW,QAAQjF,QACf,EAMA3L,EAASoa,aAAT,SAAuBD,GACrBxf,KAAKiW,QAAQyJ,YACf,EAOAra,EAAS4L,OAAT,SAAiBE,GACVnR,KAAK2f,cAAiB3f,KAAK8e,cAIhC9e,KAAKiW,QAAQhF,OAAOjR,KAAK8e,aAAc3N,EACzC,EAKA9L,EAASua,UAAT,WACE,IAAAf,EAAiB,OAAjBA,EAAA7e,KAAK8e,eAALD,EAAmBgB,WAAW7f,KAAKiW,SACnCjW,KAAK8e,kBAAeze,EACpBL,KAAKiW,QAAQ7Q,SACf,EAMAC,EAASsZ,SAAT,SAAmBza,GAUjB,GATA8Y,EAAAhc,UAAM2d,SAASza,KAAAA,KAAAA,GACflE,KAAKkE,KAAO2G,GACP3G,CAAAA,EAAAA,EAAAA,CACH4b,UAAW,KAGb9f,KAAKkE,KAAK6b,SAAW7b,EAAK6b,SAAW/f,KAAK4X,OAAOoI,WAAW9b,EAAK6b,eAAY1f,EAC7EL,KAAKkE,KAAKuU,SAAWzY,KAAK4X,OAAOoI,WAAW9b,EAAKuU,UAE7CvU,EAAK4b,UACP,IAAK,IAAIzd,EAAI,EAAGA,EAAI6B,EAAK4b,UAAU9d,OAAQK,IACzCrC,KAAKkE,KAAK4b,UAAUzd,GAAKrC,KAAK4X,OAAOoI,WAAW9b,EAAK4b,UAAUzd,GAGrE,EAKA2c,EAAAA,cAAAA,WACE,GAAIhf,KAAKkE,KAAM,CACb,IAAMmZ,EAAWrd,KAAKkE,KAAK+b,YAE3BjgB,KAAKqd,SAAWA,GAAY/H,KAAK4K,MAAM5K,KAAKC,UAAU8H,IAEtDrd,KAAKiW,QAAU,IAAIyH,GAAM1d,KAAK4X,OAAQ5X,KAAK6V,KAAK1M,KAAMnJ,KAAKkE,KAAMlE,KAAMA,KAAK6V,KAAKsJ,SACnF,CACF,EAMAG,EAAAA,WAAAA,SAAYjO,GACV,IAAA8O,EAAA,OAAAA,EAAAngB,KAAKiW,UAALkK,EAAc/O,iBAAiBC,EACjC,EAKAsO,EAAAA,WAAAA,WACS,IAAAQ,EAAAC,EAAP,OAA4B,OAArBA,EAAA,OAAAD,EAAAngB,KAAKiW,cAAL,EAAAkK,EAAc9O,UAAd+O,CACT,EAoEAhD,EAAAA,mBAAAA,WACE,GAAIpd,KAAKiW,SAAuB5U,EAAZrB,KAAKiW,QAAmByH,IAAO,CAOrC,IAAA2C,EANNC,EAActgB,KAAK6M,UAAUL,iBAC7B+T,EAAOvgB,KAAKiW,QAAQmH,mBAAmBkD,GACvC/B,EAASgC,EAAKC,UAAU,IAAI/W,IAC5B5D,EAAO0a,EAAKE,QAAQ,IAAIhX,IAS9B,OAPAzJ,KAAKqd,SAAW,CACdE,SAAuB,OAAb8C,EAAArgB,KAAKqd,eAAQ,EAAbgD,EAAe9C,SACzBnV,KAAMqD,EAAK+R,kBAAkBC,IAC7Bc,OAAQ,CAACA,EAAO9Q,EAAG8Q,EAAO5b,EAAG4b,EAAO7Q,GACpC7H,KAAM,CAACA,EAAK4H,EAAG5H,EAAKlD,EAAGkD,EAAK6H,IAGvB1N,KAAKqd,SAIhB,EAjOWrH,EAAD,CAA4BgH,GAA3BhH,GAAAA,EAAAA,CADZ0K,EAAajV,EAAKkV,SAASC,gBACf5K,IAyON,IAAA6K,GAAK,SAAL7D,YAAM6D,EAmBEjJ,EAAgB1T,gBACrB0T,EAAAA,EAAAA,KAAAA,KAAAA,IAAAA,KACF1T,GACF4M,EAAK6N,SAASza,KAtBP2c,EAAAA,EAAAA,GAAAA,IAAAA,EAAAA,EAAAA,UAAAA,OA6BXxb,EAASuZ,QAAT,WAKE,IAAAC,EAJA7e,KAAKgf,gBACLhf,KAAK6V,KAAKzN,KAAOtJ,EACjBkB,KAAK6X,SAAW7X,KAAK6V,KAAKoJ,YAC1Bjf,KAAK8e,aAAeC,GAAgB/e,MACnB,OAAjB6e,EAAA7e,KAAK8e,eAALD,EAAmBK,QAAQlf,KAAKiW,SAChCjW,KAAKsf,YAAW,EAClB,EAOAja,EAAS4L,OAAT,SAAiBE,GACVnR,KAAK2f,cAAiB3f,KAAK8e,cAIhC9e,KAAKiW,QAAQhF,OAAOjR,KAAK8e,aAAc3N,EACzC,EAKA9L,EAASua,UAAT,WACE,IAAAf,EAAiB,OAAjBA,EAAA7e,KAAK8e,eAALD,EAAmBgB,WAAW7f,KAAKiW,SACnCjW,KAAK8e,kBAAeze,EACpBL,KAAKiW,QAAQ7Q,SACf,EAMAC,EAASsZ,SAAT,SAAmBza,GACjB8Y,EAAAhc,UAAM2d,SAASza,KAAAA,KAAAA,GAEfA,EAAK4c,aAAe5c,EAAK4c,aAAe9gB,KAAK4X,OAAOoI,WAAW9b,EAAK4c,mBAAgBzgB,EACpF6D,EAAK6c,cAAgB/gB,KAAK4X,OAAOoI,WAAW9b,EAAK6c,eACjD/gB,KAAKkE,KAAOA,CACd,EAKA8a,EAAAA,cAAAA,WACE,GAAIhf,KAAKkE,KAAM,CACb,IAAM8c,EAAahhB,KAAKkE,KAExBlE,KAAKiW,QAAU,IAAIgL,GAAQjhB,KAAK6V,KAAK1M,KAAM6X,EAAYhhB,KACzD,CACF,EAMAsf,EAAAA,WAAAA,SAAYjO,GACV,IAAA8O,EAAA,OAAAA,EAAAngB,KAAKiW,UAALkK,EAAc/O,iBAAiBC,EACjC,EAKAsO,EAAAA,WAAAA,WACS,IAAAQ,EAAAC,EAAP,OAA4B,OAArBA,EAAA,OAAAD,EAAAngB,KAAKiW,cAAL,EAAAkK,EAAc9O,UAAd+O,CACT,EAhGWS,EAAD,CAA8B7D,GAA7B6D,GAAAA,EAAAA,CADZH,EAAajV,EAAKkV,SAASO,kBACfL,IAwGN,IAAAM,GAAK,SAALC,YAAMD,EAeEvJ,EAAgB1T,gBACrB0T,EAAAA,EAAAA,KAAAA,KAAAA,IAAAA,KACF1T,GACF4M,EAAK6N,SAASza,KAlBPid,EAAAA,EAAAA,GAAAA,IAAAA,EAAAA,EAAAA,UAAAA,OAyBX9b,EAASuZ,QAAT,WACE5e,KAAKgf,gBACLhf,KAAK6V,KAAKzN,KAAOtJ,EACjB,IAAMoS,EAAQ6N,GAAgB/e,MAE9BkR,MAAAA,GAAAA,EAAOgO,QAAQlf,KAAKiW,SACpBjW,KAAKsf,YAAW,EAClB,EAMAja,EAASka,SAAT,SAAmBC,GACjBxf,KAAKiW,QAAQjF,QACf,EAKA3L,EAASua,UAAT,WACE5f,KAAKiW,QAAQ7Q,SACf,EAMAC,EAASsZ,SAAT,SAAmBza,GACjBkd,EAAApgB,UAAM2d,SAASza,KAAAA,KAAAA,GAEflE,KAAKkE,KAAOA,CACd,EAKA8a,EAAAA,cAAAA,WACE,GAAIhf,KAAKkE,KAAM,CACb,IAAMmd,EAAYrhB,KAAKkE,KAEvBlE,KAAKiW,QAAU,IAAIqL,GAAOthB,KAAK6V,KAAK1M,KAAMkY,EAAWrhB,KACvD,CACF,EAMAsf,EAAAA,WAAAA,SAAYjO,GACV,IAAA8O,EAAA,OAAAA,EAAAngB,KAAKiW,UAALkK,EAAc/O,iBAAiBC,EACjC,EAKAsO,EAAAA,WAAAA,WACS,IAAAQ,EAAAC,EAAP,OAA4B,OAArBA,EAAA,OAAAD,EAAAngB,KAAKiW,cAAL,EAAAkK,EAAc9O,UAAd+O,CACT,EAnFWe,EAAD,CAA6BC,GAA5BD,GAAAA,EAAAA,CADZT,EAAajV,EAAKkV,SAASY,iBACfJ,IA2FN,IAAAK,GAAK,SAALJ,YAAMI,EAcE5J,EAAgB1T,gBACrB0T,EAAAA,EAAAA,KAAAA,KAAAA,IAAAA,KACF1T,GACF4M,EAAK6N,SAASza,KAjBPsd,EAAAA,EAAAA,GAAAA,IAAAA,EAAAA,EAAAA,UAAAA,OAwBXnc,EAASuZ,QAAT,WACE5e,KAAKgf,gBACLhf,KAAK6V,KAAKzN,KAAOtJ,EACjB,IAAMoS,EAAQ6N,GAAgB/e,MAE9BkR,MAAAA,GAAAA,EAAOgO,QAAQlf,KAAKiW,SACpBjW,KAAKyhB,kBACP,EAMApc,EAASka,SAAT,SAAmBC,GACjBxf,KAAKiW,QAAQjF,SACbhR,KAAKyhB,kBACP,EAKApc,EAASua,UAAT,WACE,IAAAO,EAAY,OAAZA,EAAAngB,KAAKiW,UAALkK,EAAc/a,SAChB,EAMAC,EAASsZ,SAAT,SAAmBza,GACjBkd,EAAApgB,UAAM2d,SAASza,KAAAA,KAAAA,GAEflE,KAAKkE,KAAOA,CACd,EAKA8a,EAAAA,cAAAA,WACE,GAAIhf,KAAKkE,KAAM,CACb,IAAMwd,EAAa1hB,KAAKkE,KAElByd,EAAQ3hB,KAAK4X,OAAOzG,SAASyQ,WAC7BC,EAAS7hB,KAAK4X,OAAOzG,SAAS2Q,YAEpC9hB,KAAKiW,QAAU,IAAI8L,GAAQ/hB,KAAK6V,KAAK1M,KAAMwY,EAAOE,EAAQH,EAAY1hB,KACxE,CACF,EAKAyhB,EAAAA,iBAAAA,WACEzhB,KAAKiW,QAAQ9J,OAASnM,KAAK6M,UAAUL,iBACrC,IAAMkJ,EAAc1V,KAAK6V,KAAKH,YAE1BA,IACFA,EAAYsM,OAAOC,KAAOjiB,KAAKiW,QAAQiM,UACvCxM,EAAYsM,OAAOG,IAAMniB,KAAKiW,QAAQmM,SACtC1M,EAAYsM,OAAOK,IAAMriB,KAAKiW,QAAQoM,IAEtC3M,EAAYsM,OAAOM,aAAatiB,KAAK6M,WAEzC,EAOAyV,EAAAA,aAAAA,SAAcpV,EAAoBlB,GAC5BkB,GACFlN,KAAK6M,UAAUe,YAAYV,EAASO,EAAGP,EAASvK,EAAGuK,EAASQ,GAE1D1B,GACFhM,KAAK6M,UAAUQ,YAAYrB,EAASyB,EAAGzB,EAASrJ,EAAGqJ,EAAS0B,GAE9D1N,KAAKyhB,kBACP,EAtGWD,EAAD,CAA8BJ,GAA7BI,GAAAA,EAAAA,CADZd,EAAajV,EAAKkV,SAAS4B,kBACff,IA8GN,IAAAgB,GAAK,SAALpB,GAAMoB,SAAAA,EAaE5K,gBACLA,EAAAA,EAAAA,KAAAA,KAAAA,IAAAA,MARR6K,YAAc,EACdC,EAAAA,WAAa,EACbC,EAAAA,MAA8B,KARnBH,EAAAA,EAAAA,GAAAA,IAAAA,EAAAA,EAAAA,UAAAA,OAoBXnd,EAASuZ,QAAT,WACE5e,KAAKyiB,YAAc,EACnBziB,KAAK6V,KAAKzN,KAAOtJ,CACnB,EAMAuG,EAASka,SAAT,SAAmBC,GACjBxf,KAAKyiB,aAAoB,KAALjD,EAChBxf,KAAK0iB,WAAa,GAAK1iB,KAAK0iB,UAAY1iB,KAAK2iB,MAAM3gB,QACrDhC,KAAK2iB,MAAM3iB,KAAK0iB,WAAWE,gBAAgB5iB,KAAK6V,KAAM7V,KAAKyiB,YAE/D,EAKApd,EAASua,UAAT,aAQAva,EAASsZ,SAAT,SAAmBza,OAILA,EACKA,SAJjBkd,EAAApgB,UAAM2d,SAASza,KAAAA,KAAAA,GACflE,KAAKkE,KAAOA,EAEZlE,KAAKmJ,YAAOjF,EAAAA,EAAKiF,MAALjF,EAAa,UACzBlE,KAAK0iB,UAAYxe,OAAAA,EAAAA,EAAKwe,WAALxe,GAAmB,EACpClE,KAAK2iB,MAAQ,GACbze,EAAK2e,eAAe9Q,SAAQ+Q,SAAAA,GAC1B,IAAMC,EAAU,IAAIC,GAAmBlS,EAAK8G,QACtCqL,EAAgBnS,EAAK8G,OAAOoI,WAA0B8C,GAE5DC,EAAQG,qBAAqBD,GAC7BnS,EAAK6R,MAAM/e,KAAKmf,EAClB,GACF,EA7DWP,EAAD,CAA4BpB,GAA3BoB,GAAAA,EAAAA,CADZ9B,EAAajV,EAAKkV,SAAS6B,qBACfA,IAgEb,IAAMQ,GAAD,SAALG,GAAMH,SAAAA,kDACJI,UAAqC,KADjCJ,EAAAA,EAAAA,GAAAA,IAAAA,EAAAA,EAAAA,UAAAA,OAGJ3d,EAASud,gBAAT,SAA0BS,EAAkBpf,GAI1C,IAHA,IAGyCqf,EAHnCC,EAAWvjB,KAAKujB,SAChBC,EAAO7b,KAAK8b,IAAI,EAAGxf,GAAQsf,EAEbG,EAAA/a,EAAA3I,KAAK2jB,kBAAgBL,EAAAI,KAAAhkB,MAAA,CAA9BkkB,IAAAA,EAAAA,EAAAA,MACHpkB,EAAQokB,EAAMC,UAAUC,SAASN,EAAOxjB,KAAKujB,UAC7C3hB,EAAS5B,KAAK+jB,cAAcV,EAASO,EAAMtb,MAEjD1G,MAAAA,GAAAA,EAAQiL,UAAUe,YAAYpO,EAAMiO,EAAGjO,EAAMmD,EAAGnD,EAAMkO,EACxD,CAEA,IAAoB,IAAqBsW,EAArBC,EAAAtb,EAAA3I,KAAKkkB,kBAAgBF,EAAAC,KAAAvkB,MAAA,CAA9BkkB,IAAAA,EAAAA,EAAAA,MACHpkB,EAAQokB,EAAMC,UAAUC,SAASN,EAAOxjB,KAAKujB,UAC7C3hB,EAAS5B,KAAK+jB,cAAcV,EAASO,EAAMtb,MAEjD1G,MAAAA,GAAAA,EAAQiL,UAAUsX,cAAc3kB,EAAMiO,EAAGjO,EAAMmD,EAAGnD,EAAMkO,EAAGlO,EAAMsO,EACnE,CAEA,IAAoB,IAAkBsW,EAAlBC,EAAA1b,EAAA3I,KAAKskB,eAAaF,EAAAC,KAAA3kB,MAAA,CAA3BkkB,IAAAA,EAAAA,EAAAA,MACHpkB,EAAQokB,EAAMC,UAAUC,SAASN,EAAOxjB,KAAKujB,UAC7C3hB,EAAS5B,KAAK+jB,cAAcV,EAASO,EAAMtb,MAEjD1G,MAAAA,GAAAA,EAAQiL,UAAUS,SAAS9N,EAAMiO,EAAGjO,EAAMmD,EAAGnD,EAAMkO,EACrD,CAEA,IAAoB,IAAkB6W,EAAlBC,EAAA7b,EAAA3I,KAAKykB,eAAaF,EAAAC,KAAA9kB,MAAA,CAA3BkkB,IAAAA,EAAAA,EAAAA,MACHpkB,EAAQokB,EAAMC,UAAUC,SAASN,EAAOxjB,KAAKujB,UAC7C3hB,EAAS5B,KAAK+jB,cAAcV,EAASO,EAAMtb,MAEjD,GAAwB,uBAApBsb,EAAMc,UAAoC,CAC5C,IAAMC,EAAY/iB,MAAAA,OAAAA,EAAAA,EAAQmU,aAAaC,IAEvC,GAAI2O,EAGFC,GAAYD,EAFOf,EAAMiB,SAASC,MAAM,KAELtlB,QAEnCoU,QAAQnU,MAAM,mCAGhBmU,QAAQmR,KAAM,2BAA0BnB,EAAMc,UAAU,IAE5D,CACF,EAEAxB,EAAAA,qBAAAA,SAAsB8B,GACpBhlB,KAAKujB,SAAWyB,EAAKzB,SACrBvjB,KAAK2jB,eAAiBqB,EAAKrB,eAAeza,QAC1ClJ,KAAKkkB,eAAiBc,EAAKd,eAAehb,QAC1ClJ,KAAKskB,YAAcU,EAAKV,YAAYpb,QACpClJ,KAAKykB,YAAcO,EAAKP,YAAYvb,OACtC,EAEA6a,EAAAA,cAAAA,SAAekB,EAAmB3c,GAChC,GAAItI,KAAKojB,UAAU9a,GACjB,OAAOtI,KAAKojB,UAAU9a,GAMxB,IAHA,IAG6Bgb,EAHzB1hB,EAASqjB,EAGbvB,EAAA/a,EAFiBL,EAAKwc,MAAM,QAECxB,EAAAI,KAAAhkB,MAAA,CAG3B,IAHSyJ,IAG4B6a,EAH5B7a,EAAAA,EAAAA,MACL+b,GAAU,EAEMtjB,EAAAA,EAAAA,EAAOujB,YAAUnB,EAAAC,KAAAvkB,MAAA,CAA1B0lB,IAAAA,EAAAA,EAAAA,MACT,GAAIA,EAAMjc,OAASA,EAAM,CACvBvH,EAASwjB,EACTF,GAAU,EAEV,KACF,CACF,CACA,IAAKA,EACH,MAAM,IAAI1K,MAAM,2BAA2ByK,EAASI,GAAG,KAAI/c,EAAK,IAEpE,CAIA,OAFAtI,KAAKojB,UAAU9a,GAAQ1G,EAEhBA,CACT,EAnFIohB,CAA2BG,CAA5B,CAA4BA,GAsFjC,SAASyB,GAAgBU,EAAaC,EAAsB/lB,GAI1D,IAHA,IAAMqI,EAAM0d,EAAWvjB,OACnBwjB,EAAeF,EAEVjjB,EAAI,EAAGA,EAAIwF,EAAM,EAAGxF,IAAK,CAChC,IAAMojB,EAAWF,EAAWljB,GAE5B,KAAMojB,KAAYD,IAAyC,iBAAtBA,EAAQC,GAG3C,YAFA7R,QAAQnU,MAAM,sBAAsB8lB,EAAW,KAIjDC,EAAUA,EAAQC,EACpB,CAEAD,EAAQD,EAAW1d,EAAM,IAAMrI,CACjC,CCvrBA,SAAS2e,GAA8BL,EAAU4H,EAAqBrI,GACpE,IAAMsI,EAAcD,EACdE,EAAcD,EAAYE,QAAQjX,SAElCkX,EAAShI,EAAI+H,QAAQE,YAAYH,GACjCI,EAAYvc,GAAQ4E,UAAUgP,EAASkB,QACvC0H,EAAcxc,GAAQ4E,UAAUgP,EAAmCxX,MAAOqgB,SAAS,IACnFC,EAASH,EAAUH,QAAQO,SAASH,GACpCI,EAASL,EAAUH,QAAQpH,IAAIwH,GAC/BK,EAAgBR,EAAOS,aAAa,CAAEC,IAAKL,EAAQ1C,IAAK4C,GAAU,IAAI5c,IAE5E,YAAsBpJ,IAAlBimB,EAGK,CAFsBX,EAAYc,eAAeH,SAIxD,CAEJ,CAUA,SAASI,GAAeC,EAAaC,EAAaC,EAAeC,GAC/D,IAAIC,EAAO,EAAGC,EAAO,EACjBC,EAAQ,EAAGC,EAAQ,EACnBC,EAAQ,EAAGC,EAAQ,EACjBC,EAAU,EAAIT,EAAGnZ,EACjB6Z,EAAU,EAAIV,EAAGjkB,EACjB4kB,EAAU,EAAIX,EAAGlZ,EAoBvB,GAlBI2Z,GAAW,GACbN,GAAQF,EAAKpZ,EAAIkZ,EAAGlZ,GAAK4Z,EACzBL,GAAQF,EAAKrZ,EAAIkZ,EAAGlZ,GAAK4Z,IAEzBN,GAAQD,EAAKrZ,EAAIkZ,EAAGlZ,GAAK4Z,EACzBL,GAAQH,EAAKpZ,EAAIkZ,EAAGlZ,GAAK4Z,GAGvBC,GAAW,GACbL,GAASJ,EAAKlkB,EAAIgkB,EAAGhkB,GAAK2kB,EAC1BJ,GAASJ,EAAKnkB,EAAIgkB,EAAGhkB,GAAK2kB,IAE1BL,GAASH,EAAKnkB,EAAIgkB,EAAGhkB,GAAK2kB,EAC1BJ,GAASL,EAAKlkB,EAAIgkB,EAAGhkB,GAAK2kB,KAKxBP,EAAOG,GAASD,EAAQD,KAIxBC,EAAQF,GAAQA,GAASA,KAC3BA,EAAOE,IAELC,EAAQF,GAAQA,GAASA,KAC3BA,EAAOE,GAGLK,GAAW,GACbJ,GAASN,EAAKnZ,EAAIiZ,EAAGjZ,GAAK6Z,EAC1BH,GAASN,EAAKpZ,EAAIiZ,EAAGjZ,GAAK6Z,IAE1BJ,GAASL,EAAKpZ,EAAIiZ,EAAGjZ,GAAK6Z,EAC1BH,GAASP,EAAKnZ,EAAIiZ,EAAGjZ,GAAK6Z,GAGxBR,EAAOK,GAASD,EAAQH,KAGxBG,EAAQJ,GAAQA,GAASA,KAC3BA,EAAOI,IAELC,EAAQJ,GAAQA,GAASA,KAE3BA,EAAOI,GAGLJ,EAAO,KAIX,OAAOD,GAAQ,EAAIA,EAAOC,CAC5B,CAEA,IAAMQ,GAAO,IAAI/d,GACXge,GAAQ,IAAIhe,GACZie,GAAQ,IAAIje,GACZke,GAAS,IAAIle,GAYnB,SAASme,GAAoBjB,EAAaC,EAAaiB,EAAYC,EAAY/lB,EAAYgmB,GAGzFN,GAAMO,gBAAgBF,EAAGD,GACzBH,GAAMM,gBAAgBjmB,EAAG8lB,GACzBF,GAAOM,aAAaR,GAAOC,IAO3B,IAAIQ,EAAMtB,EAAGuB,IAAIR,IACbS,EAAO,EAEX,GAAIF,EAAM,EAAG,CACX,GAAIH,EAAmB,OACvBK,EAAO,MACF,MAAIF,EAAM,GAIf,OAHAE,GAAQ,EACRF,GAAOA,CAGT,CAEAV,GAAKQ,gBAAgBrB,EAAIkB,GAEzBH,GAAMO,aAAaT,GAAME,IACzB,IAAMW,EAASD,EAAOxB,EAAGuB,IAAIT,IAE7B,KAAIW,EAAS,GAAb,CAIAZ,GAAMQ,aAAaR,GAAOD,IAC1B,IAAMc,EAASF,EAAOxB,EAAGuB,IAAIV,IAE7B,KAAIa,EAAS,GAITD,EAASC,EAASJ,GAAtB,CAIA,IAAMK,GAAOH,EAAOZ,GAAKW,IAAIR,IAE7B,KAAIY,EAAM,GAIV,OAAOA,EAAML,CARb,CAXA,CAoBF,CASA,SAASM,GAAoB9S,EAA0BjI,EAAW9K,GAChE,IAAM8lB,EAAU/S,EAAYgT,QAAQjb,EAAG9K,GAAG,GACpCmb,EAAMpI,EAAYiT,cAAclb,EAAG9K,GAEzC,GAAI8lB,EAAQzmB,QAAU,EACpB,MAAO,GAGT,IAAMzB,EAAIud,EAAIvP,OACRzM,EAAIgc,EAAIG,UACR2K,EAAOH,EAAQ/O,KAAI,SAACmP,EAAQvjB,GAKhC,IAIeqC,IAAAA,EARTnH,EAAIqoB,EAAO3b,SAEXtK,EAAe,CAAC,EAAG,EAAG,GAEnBP,EAAI,EAAGA,EAAI,EAAGA,IACrBO,EAAEP,IAAM7B,EAAEsoB,WAAWzmB,GAAK9B,EAAEuoB,WAAWzmB,IAAMP,EAAEgnB,WAAWzmB,GAG5D,MAAO,CAACiD,GAAOqC,EAAAA,MAAK8b,IAAL9b,MAAAA,EAAY/E,GAAAA,OAAAA,IAC7B,IASA,OAPAgmB,EAAKG,MAAK,SAAUlB,EAAGC,GAIrB,OAHWD,EAAE,IAAM,EAAIA,EAAE,GAAMA,EAAE,GAAK,MAC3BC,EAAE,IAAM,EAAIA,EAAE,GAAMA,EAAE,GAAK,IAGxC,IAEOc,EAAKlP,KAAIlM,SAAAA,GACd,OAAOib,EAAQjb,EAAI,GACrB,GACF,CAOA,SAASwb,GAAoBtT,EAA0BuT,GACrDvT,IAAAA,EAAiB,OAAjBA,EAAAA,EAAYE,QAAZF,EAAmB3D,SAAQ8D,SAAAA,GACzB,GAAIA,EAAKzN,OAAStJ,EAAkB,CAClC,IAAMgX,EAAgBD,EAAKE,aAAaC,IAExC,GAAIF,EAAe,CACjB,IAAMI,EAAOJ,EAAcG,QAEvBJ,EAAKwP,KAAO4D,EACd/S,EAAKzG,gBAAiB,EAEtByG,EAAKzG,gBAAiB,CAE1B,CACF,CACF,GACF,CCjOO,IAAAyZ,GAAK,WAACA,SAAAA,IAAAA,CAAAA,OA8BXA,EAAaC,gBAAb,SAA8BvR,EAAgBwR,EAAkBrS,EAAsBsS,EAAuBC,UAA7GzpB,GAAA,WAeQ0pB,IAAAA,EACAC,EACAC,EACAC,6BAjBN,YAAwBrpB,IAApB+oB,EAAMO,WACR/V,QAAQnU,MAAM,4CAA4C2pB,EAAM,KAGhE,GAAOQ,EAAQ3oB,OAAO2W,EAAQ,CAC5BzO,KAAM,kBACN0gB,WAAYC,EAAkB5lB,KAC9BA,KAAM,CACJA,KAAM,IAAIoO,WAAAA,CAAY,IAAK,IAAK,IAAK,MACrCqP,MAAO,EACPE,OAAQ,QAIR0H,EAAO,IAAIQ,KAAAA,CAAMX,EAAMO,WAAY,CAAEvhB,KAAMghB,EAAMY,WACjDR,EAAaS,OAAOC,KAAOD,OAAOE,UAClCV,EAAWD,EAAWY,gBAAgBb,IACtCG,EAAW,IAAIW,OAEZC,IAAMb,EAEf,GAAO,IAAI9pB,SAAQ,SAAUV,EAASC,GACpCwqB,EAASa,OAAS,WACQxT,IAAAA,EAApBK,EAAoBL,OAAAA,EAAAA,EAAQK,WAARL,EAAqBE,EAAUuT,qBACnDC,GAAmB,EAEnBnB,IAGFlS,EAAYH,EAAUuT,qBA5DnBtB,EA8DcwB,OAAOhB,EAAS/H,QAAWuH,EAAYwB,OAAOhB,EAAS7H,UACtEzK,EAAYH,EAAUK,QAGxBmT,GAAmBpB,GAGrB,IAWStS,EACAA,EACIA,EAbT4T,GAAiB,EAEjBvT,GAAaH,EAAU2T,wBACzBxT,GAAaH,EAAU4T,uBACvBzT,GAAaH,EAAU6T,uBACvB1T,GAAaH,EAAUuT,uBACvBG,GAAiB,GAGnB,IAAMxc,EAAMyb,EAAQ3oB,OAAO2W,EAAQ,CACjCzO,KAAM,kBACN4hB,MAAOhU,OAAAA,EAAAA,EAAQgU,OAARhU,EAAiBE,EAAU+T,OAClCC,MAAOlU,OAAAA,EAAAA,EAAQkU,OAARlU,EAAiBE,EAAU+T,OAClCzT,UAAWR,OAAAA,EAAAA,EAAQQ,WAARR,EAAqBE,EAAUK,OAC1CF,UAAAA,EACA8T,YAAa,EAEbT,iBAAAA,EACAZ,WAAYC,EAAkBV,MAC9BA,MAAOM,EACPiB,eAAAA,IAGF1rB,EAAQkP,GACRqb,EAAW2B,gBAAgB1B,EAC7B,EACAC,EAAS0B,QAAUlsB,CACrB,QACF,GAnEAW,IA9BWqpB,EA0GEmC,kBAAb,SAAgCzT,EAAgB0T,EAAqBC,qBAArE1rB,GAAA,6DACsB,MAAA,GAAMF,QAAQ6rB,IAChCD,EAAS7R,KAAI+R,SAAAA,GACX,OAAO3a,EAAKqY,gBAAgBvR,EAAQ0T,EAAOG,EAAI1gB,QAAS0gB,EAC1D,aAGF,MAAA,GANoBC,EAAA3oB,WAOtB,GARAlD,IAeAqpB,EAAayC,mBAAb,SAAiCL,UAAjCzrB,GAAA,WACQ+rB,IAAAA,oDACJ,MAAA,GAAMC,GAAUC,uBAAuBR,EAAO,YAC9C,UADAI,EAAA3oB,QACA,GAAM8oB,GAAUC,uBAAuBR,EAAO,YAC9C,mBADAI,EAAA3oB,SACA,GAAM8oB,GAAUC,uBAAuBR,EAAO,YAC9C,mBADAI,EAAA3oB,SACA,GAAM8oB,GAAUC,uBAAuBR,EAAO,YAC9C,mBADAI,EAAA3oB,SACA,GAAM8oB,GAAUC,uBAAuBR,EAAO,YAC9C,mBADAI,EAAA3oB,SACA,GAAM8oB,GAAUC,uBAAuBR,EAAO,YAGhD,MAAA,GATMM,EAAAA,OAAAA,CAMJF,EAAA3oB,aAIJ,GAXAlD,IAkBAqpB,EAAa6C,yBAAb,SAAuCT,qBAAvCzrB,GAAA,eACQmsB,EAEG3pB,EAAAA,oDAFH2pB,EAAAA,GAEG3pB,EAAI,0BAAGA,EAAIipB,EAAOtpB,QACzBgqB,EAAAA,EAAQpoB,KAAK,GAAMkN,EAAK6a,mBAAmBL,EAAOjpB,MADpB,aAC9B2pB,EAAAA,MAAAA,EAAAA,CAAaN,EAAA3oB,iCADoBV,iBAInC,MAAA,GAAO2pB,MACT,GARAnsB,IA3IWqpB,EA2JE+C,yBAAb,SAAuCrU,EAAgBsU,qBAAvDrsB,GAAA,WACQssB,IAAAA,oDAAiB,MAAA,GAAMC,IAA2BC,WACtD,CACEjkB,KAAM0hB,EAAkBV,MACxBxnB,OAAQqV,EAAUqV,iBAClB5S,IAAKwS,GAEPpb,EAAKyb,0BAGP,OATMJ,EAAiBT,EAAA3oB,OASvB,GAAO6mB,EAAQ3oB,OAAO2W,EAAQuU,OAChC,GAXAtsB,IA3JWqpB,EA8KEsD,+BAAb,SAA6C5U,EAAgB6U,qBAA7D5sB,GAAA,WACQssB,IAAAA,oDAAiB,MAAA,GAAMC,IAA2BC,WACtD,CACEjkB,KAAM0hB,EAAkBkC,QACxBpqB,OAAQqV,EAAUqV,iBAClBI,KAAMD,GAER3b,EAAK6b,6BAGP,OATMR,EAAiBT,EAAA3oB,OASvB,GAAO6mB,EAAQ3oB,OAAO2W,EAAQuU,OAChC,GAXAtsB,IA9KWqpB,EAiME0D,4BAAb,SAA0ChV,EAAgB6U,qBAA1D5sB,GAAA,WACQgtB,IAAAA,oDAAU,MAAA,GAlMP3D,EAkMyByC,mBAAmBc,WAErD,OAFMI,EAAUnB,EAAA3oB,OAEhB,GAAO6mB,EAAQ3oB,OACb2W,EACA/M,GAAA,CACE1B,KAAM,8BACN0gB,WAAYC,EAAkBV,MAC9B0D,KAAMD,EACNjrB,OAAQqV,EAAUqV,kBACfxb,EAAKyb,uBAEd,GAZA1sB,IAjMWqpB,EAsNE6D,kCAAb,SAAgDnV,EAAgB6U,EAAkCO,qBAAlGntB,GAAA,eACQmsB,EAEFiB,EAOI3nB,EAEAqkB,oDAXQ,MAAA,GAvNPT,EAuNyB6C,yBAAyBU,WAI3D,IAJMT,EAAUN,EAAA3oB,OAEZkqB,EAAW,EAERtlB,KAAKulB,IAAI,EAAGD,GAAYD,KAC3BC,0BAGGjB,EAAQhqB,QAAUirB,GACjB3nB,EAAQqC,KAAKulB,IAAI,EAAGD,EAAWjB,EAAQhqB,QAE3B,GAAMmrB,EADX,iEAAgE7nB,EAAM,UAFrD,oBAGxBqkB,EAAY+B,EAAA3oB,OAElBipB,EAAQpoB,KAAI,CAAE+lB,EAAWA,EAAWA,EAAWA,EAAWA,EAAWA,iBAGvE,MAAA,GAAOC,EAAQ3oB,OACb2W,EACA/M,GAAA,CACE1B,KAAM,oCACN0gB,WAAYC,EAAkBkC,QAC9BA,QAAAA,EACApqB,OAAQqV,EAAUqV,kBACfxb,EAAK6b,0BAEd,GA1BA9sB,IAtNWqpB,EAwPJkE,WAAP,SAAmB9nB,EAAeimB,GAChC,OAAIjmB,EAAQ,GAAKA,GAASimB,EAASvpB,OAC1B,KAEAupB,EAASjmB,EAEpB,EA9PW4jB,EAsQJmE,uBAAP,SAA+BzV,EAAgBwR,GAC7C,IAAMhT,EAAgC,CACpCjN,KAAM,yBACNigB,MAAAA,EACAS,WAAYC,EAAkBV,MAC9BkE,OAAO,EACP/V,UAAWN,EAAUK,OACrBF,UAAWH,EAAUK,OACrB2T,MAAOhU,EAAU+T,OACjBD,MAAO9T,EAAU+T,QAGnB,OAAOpB,EAAQ3oB,OAAO2W,EAAQxB,EAChC,EAMA8S,EAAOqE,cAAP,SAAsBxW,GACpBA,EAAQ3R,SACV,EAMA8jB,EAAOsE,WAAP,SAAmBtX,GACjBA,EAAK9Q,QAAQ,CACXqoB,WAAYC,EAAeC,SAE/B,EAMAzE,EAAO0E,eAAP,SAAuBnV,GACrBA,EAASrT,SACX,EAMA8jB,EAAO2E,iBAAP,SAAyBC,GACvBA,EAAK1oB,QAAQ,CACX2oB,OAAQ,CACNN,WAAYC,EAAeC,SAE7BK,uBAAwBC,EAAgC9Q,MACxD+Q,gBAAiBD,EAAgC9Q,MACjDgR,UAAWT,EAAeC,SAE9B,EAOAzE,EAAOkF,kBAAP,SAA0BzJ,GACxB,OAAuC,IAAhCA,EAAU7M,SAASuW,QAC5B,EAOAnF,EAAOoF,sBAAP,SAA8B1W,GAG5B,OAA0C,IAFvBA,EAAOvC,cAERkZ,OAAOC,YAC3B,EAMAtF,EAAOuF,0BAAP,SAAkC7W,GAGhC,OAA8C,IAF3BA,EAAOvC,cAERkZ,OAAOG,gBAC3B,EAOAxF,EAAOwB,OAAP,SAAelnB,GACb,QAASA,EAAKA,EAAI,IAAUA,EAC9B,EAnWW0lB,CAoWZ,CApWW,GAACA,GAIJqD,iBAAyC,CAC9CpjB,KAAM,kBACN4hB,MAAO9T,EAAU0X,cACjB1D,MAAOhU,EAAU0X,cACjBpX,UAAWN,EAAUK,OACrBF,UAAWH,EAAUK,QATZ4R,GAcJyD,oBAA4C,CACjD5B,MAAO9T,EAAU0X,cACjB1D,MAAOhU,EAAU0X,cACjBpX,UAAWN,EAAUK,OACrBF,UAAWH,EAAUuT,sBAuVlB,IAy7DCoE,GACAC,MA17DDC,GAAK,WAACA,SAAAA,IAAAA,CAAAA,OAAAA,EAQJC,iBAAP,SAAyBnX,EAAgBzO,EAAc2O,GACrD,IAAMkX,EAAc7f,GAAaa,cAC3BkI,EAAeJ,EAASkD,iBACxB5C,EAAiBN,EAASmD,mBAC1BxC,EAAWC,EAASzX,OAAO2W,EAZxBkX,EAY2CG,oBAC9C7f,EAA0C,IAA/BwI,EAAOvC,cAAc6Z,MAChCC,EAAkBpX,EAAS9W,OAC/B2W,EACA,CACEI,OAAQ,CACNC,OAAQC,EACRC,SAAUC,EACVC,OAAQ2W,EAAY3f,aACpB+f,YAAahgB,EAAWigB,EAAYC,MAAQD,EAAYE,SAO9D,OAFAzX,EAAS0X,kBAAkBL,GAEpB3W,EAAKvX,OACV2W,EACA,CACEzO,KAAAA,EACAmX,YAAa1W,GAAQ6lB,eACrB3X,SAAUqX,EACV1W,SAAAA,GAGN,EAMAqW,EAAOG,iBAAP,WACE,IAAM/qB,EAAO4qB,EAAWY,sBAExB,MAAO,CACLhe,WAAY,CACVsH,KAAM,CACJ5Q,KAAM6O,EAAUgC,MAChBpT,KAAM,EACN3B,KAAAA,EACAsB,OAAyC,EAAjCG,aAAa2N,kBACrB7N,OAAQ,GAEVkqB,IAAK,CACHvnB,KAAM6O,EAAUgC,MAChBpT,KAAM,EACNL,OAAyC,EAAjCG,aAAa2N,kBACrB7N,OAAyC,EAAjCE,aAAa2N,kBACrBsc,WAAY,QAEdC,QAAS,CACPznB,KAAM6O,EAAUgC,MAChBpT,KAAM,EACNL,OAAyC,EAAjCG,aAAa2N,kBACrB7N,OAAyC,EAAjCE,aAAa2N,kBACrBsc,WAAY,SAGhBxW,UAAW,EACXC,UAAWnV,EAAKlC,OAAS,EAE7B,EAMA8sB,EAAOY,oBAAP,WAGE,OAAO,IAAI/pB,aAAa,EAFP,KAGO,EAAG,EAAG,EAAG,EAAG,EAAG,EAHtB,KAIM,EAAG,EAAG,EAAG,EAAG,EAAG,EAJrB,IAKK,EAAG,EAAG,EAAG,EAAG,EAAG,GALpB,KAOO,EAAG,EAAG,EAAG,EAAG,EAAG,EAPtB,IAQK,EAAG,EAAG,EAAG,EAAG,EAAG,GARpB,IASM,EAAG,EAAG,EAAG,EAAG,EAAG,GAExC,EA3FWmpB,CA4FZ,CA5FW,GAqGLgB,GAAK,WAACA,SAAAA,IAAAA,CAAAA,OAMXA,EAAOC,mBAAP,SAA2BC,GACXA,IAAAA,EAKCA,EAGJA,EAKIA,EAGJA,EACSA,EACAA,EAKLA,EAvBTC,SAAQD,EAAAA,EAAMC,OAAND,EAAe,CAAC,IAAK,IAAK,IAAK,KAE7C,MAAmB,UAAfA,EAAM5nB,KACD,CACL6nB,MAAAA,EACAC,iBAAWF,EAAAA,EAAME,WAANF,EAAmB,EAE9BG,UAAW,QACXC,aAAOJ,EAAAA,EAAMI,OAANJ,EAAe,GAEA,SAAfA,EAAM5nB,KACR,CACL6nB,MAAAA,EACAC,iBAAWF,EAAAA,EAAME,WAANF,EAAmB,EAE9BG,UAAW,OACXC,aAAOJ,EAAAA,EAAMI,OAANJ,EAAe,EACtBK,sBAAgBL,EAAAA,EAAMK,gBAANL,EAAwB,EACxCM,sBAAgBN,EAAAA,EAAMM,gBAANN,EAAwBroB,KAAK4oB,GAAK,GAG7C,CACLN,MAAAA,EACAC,iBAAWF,EAAAA,EAAME,WAANF,EAAmB,EAE9BG,UAAW,cAGjB,EAOAL,EAAOU,oBAAP,SAA4BxO,GAC1B,QAA2B3hB,IAAvB2hB,EAAOyO,YAAX,CAEA,IAGOjwB,EAHDA,EAAIwhB,EAAOyO,YAQjB,MAPoC,CAClCxO,KAAMzhB,EAAEkwB,MACRvO,WAAK3hB,EAAAA,EAAEmwB,MAAFnwB,EAAU,IACf6hB,IAAK7hB,EAAEowB,KACPC,SAAU,EAPoC,CAWlD,EAOAf,EAAOgB,eAAP,SAAuBb,GAErB,MAAO,CACLjwB,KAAK+wB,WAAWd,EAAM,IACtBjwB,KAAK+wB,WAAWd,EAAM,IACtBjwB,KAAK+wB,WAAWd,EAAM,IAE1B,EAOAH,EAAOkB,eAAP,SAAuBf,GAErB,MAAO,CACLjwB,KAAK+wB,WAAWd,EAAM,IACtBjwB,KAAK+wB,WAAWd,EAAM,IACtBjwB,KAAK+wB,WAAWd,EAAM,IACtBjwB,KAAK+wB,WAAWd,EAAM,IAE1B,EAOAH,EAAOmB,eAAP,SAAuBhB,GAErB,MAAO,CACLjwB,KAAKkxB,SAASjB,EAAM,IACpBjwB,KAAKkxB,SAASjB,EAAM,IACpBjwB,KAAKkxB,SAASjB,EAAM,IAExB,EAOAH,EAAOqB,eAAP,SAAuBlB,GAErB,MAAO,CACLjwB,KAAKkxB,SAASjB,EAAM,IACpBjwB,KAAKkxB,SAASjB,EAAM,IACpBjwB,KAAKkxB,SAASjB,EAAM,IACpBjwB,KAAKkxB,SAASjB,EAAM,IAExB,EAhHWH,EAwHJsB,kBAAP,SAA0BtZ,EAAoBuZ,EAAgBC,GAC5D,IAAMC,EAAUzZ,EAAS0Z,WAAWH,GAC9BI,EAAc3Z,EAAS4Z,SAASJ,GAEhCnjB,EAAMxE,GAAQ8lB,eAEhB8B,GACFpjB,EAAIqQ,aAAa,CACf,EAAG,EAAG,EACN,EAAG,EAAG,EACN+S,EAAQ7jB,EAAG6jB,EAAQzjB,EAAG,IAI1B,IAAM6O,EAAO,IAAIhT,GAEjB,GAAI8nB,EAAa,CACf,IAAME,EAAWhqB,KAAKN,IAAIoqB,GACpBG,EAAWjqB,KAAKD,IAAI+pB,GAE1B9U,EAAK6B,aAAa,CAChBmT,EAAUC,EAAU,GACnBA,EAAUD,EAAU,EACrB,EAAG,EAAG,IAERxjB,EAAI+X,SAASvJ,EACf,CAaA,OAXI4U,IACF5U,EAAK6B,aAAa,CAChB+S,EAAQ9jB,EAAG,EAAG,EACd,EAAG8jB,EAAQ5uB,EAAG,EACd,EAAG,EAAG,IAERwL,EAAI+X,SAASvJ,IAGfxO,EAAI0jB,YAEG1jB,CACT,EAhKW2hB,EAyKJgC,MAAP,SAActkB,EAAaukB,EAAcC,GACvC,OAAOrqB,KAAK8b,IAAI9b,KAAK6e,IAAIhZ,EAAKwkB,GAAOD,EACvC,EAOAjC,EAAOiB,WAAP,SAAmBvjB,GACjB,IAAMykB,EAAStqB,KAAKuqB,MAAY,IAAN1kB,GAE1B,OAAO7F,KAAK8b,IAAI,EAAG9b,KAAK6e,IAAIyL,EAAQ,KACtC,EAOAnC,EAAOoB,SAAP,SAAiB1jB,GACf,IAAM2kB,EAAW3kB,EAAM,IAEvB,OAAO7F,KAAK8b,IAAI,EAAK9b,KAAK6e,IAAI2L,EAAU,GAC1C,EAjMWrC,EA2MJsC,aAAP,SAAqBC,EAA2BC,EAAwBC,GACtE,IAAMC,EAAS/oB,GAAQ4E,UAAUgkB,GAC3BI,EAAYhpB,GAAQ4E,UAAUkkB,GAC9BG,GAAW,IAAIjpB,IAAUoF,SAAS2jB,GAAQpM,SAASqM,GACrC7oB,GAAQ+oB,iBAAiB,IAAIlpB,GAAQ,EAAG,EAAG,GAAI6oB,EAAiBloB,IAExEqc,eAAeiM,GAC3B,IAAME,EAAYF,EAAS7M,QAAQpH,IAAIgU,GACjCI,GAAa,IAAIjpB,IAAUkpB,OAAOF,EAAWH,EAAW,IAAIhpB,GAAQ,EAAG,EAAG,IAAImF,SAC9EmkB,EAAmB,IAAIC,EAK7B,OAHAD,EAAiBpmB,UAAS,GAC1BomB,EAAiB/lB,gBAAgB6lB,GAE1BE,CACT,EA1NWjD,EAoOJmD,gBAAP,SAAwB/hB,EAAc5B,EAAoBE,cAClD0jB,EAAa5jB,IAAeC,EAC5B+Z,EAAiC,WAAnB9Z,EAEd2jB,EAAYjiB,EAAMiiB,UAExB,KAAMA,GAAaA,EAAU5H,UAAY4H,EAAUrT,WAEjD,MAAO,GAGT,IAAMsT,EAAgD,CAAA,EAEtDliB,EAAMib,eAAepa,SAAQ0Z,SAAAA,GAC3B,IAAMpG,EAAKoG,EAAIpG,GAEXA,IACF+N,EAAQ/N,GAAMoG,EAElB,IAEA,IAAI4H,GAAa,EAyBjB,OAvBIH,IACFC,EAAUrT,UAAU/N,SAAQjF,SAAAA,GAC1BgE,EAAKwiB,yBAAyBF,EAAStmB,EAAIye,SAAS,mBAAsB,EAAMjC,GAChFxY,EAAKwiB,yBAAyBF,EAAStmB,EAAIye,SAAS,2BAA8B,EAAOjC,GACzFxY,EAAKwiB,yBAAyBF,EAAStmB,EAAIye,SAAS,gBAAmB,EAAOjC,GAC9ExY,EAAKwiB,yBAAyBF,EAAStmB,EAAIye,SAAS,mBAAsB,EAAOjC,GACjFxY,EAAKwiB,yBAAyBF,EAAStmB,EAAIye,SAAS,kBAAqB,EAAOjC,EAClF,IACA6J,EAAUI,WAAWxhB,SAAQyhB,SAAAA,GAC3B,GAAIA,EAAKC,WAAahoB,EAAKkV,SAASO,gBAAiB,CACnDmS,GAAa,EACb,IAAMK,EAASF,EAEXE,EAAO5S,cACThQ,EAAKwiB,yBAAyBF,EAASM,EAAO5S,cAAc,EAAOwI,GAEjEoK,EAAO3S,eACTjQ,EAAKwiB,yBAAyBF,EAASM,EAAO3S,eAAe,EAAOuI,EAExE,CACF,KAGK,CAAE+J,WAAAA,EACX,EAUAvD,EAAOwD,yBAAP,SAAiCF,EAA+CO,EAA2DtK,EAAsBC,GAK/J,IAAIsK,EAJJ,GAAKtK,GAAeqK,IAOlBC,EADE,YAAaD,EACPA,EAAY5c,QAAQsO,GAEpBsO,EAAYtO,IAGtB,CAIA,IAAMwO,EAAaT,EAAQQ,GAE3B,GAAKC,EAIL,QAA0BxzB,IAAtBwzB,EAAWjyB,QAAwBiyB,EAAWjyB,SAAWqV,EAAU6c,WAAY,CACjFD,EAAW9I,MAAQ9T,EAAU+T,OAC7B6I,EAAW5I,MAAQhU,EAAU+T,OAC7B6I,EAAWtc,UAAYN,EAAUK,OACjCuc,EAAWzc,UAAYH,EAAUuT,qBAC5BnB,IACHwK,EAAWpJ,kBAAmB,GAEhC,IAAMsJ,EAAaF,EAEnBE,EAAWpJ,gBAAiB,EAC5B,IAAMvB,EAAQ2K,EAAW3K,MAErBA,GAASA,EAAMzH,OAASyH,EAAMvH,SAC3BqH,GAAYwB,OAAOtB,EAAMzH,QAAWuH,GAAYwB,OAAOtB,EAAMvH,UAChEgS,EAAWzc,UAAYH,EAAUK,QAGvC,MAAWuc,EAAWjyB,SAAWqV,EAAUqV,mBACzCuH,EAAW9I,MAAQ9T,EAAU0X,cAC7BkF,EAAW5I,MAAQhU,EAAU0X,mBACwCtuB,IAAjEwzB,EAAqD7H,QACqB,IAAxE6H,EAAqD7H,QAAQhqB,QAC/D6xB,EAAWtc,UAAYN,EAAUK,OACjCuc,EAAWzc,UAAYH,EAAUK,SAEjCuc,EAAWtc,UAAYN,EAAUK,OACjCuc,EAAWzc,UAAYH,EAAUuT,uBAGnCqJ,EAAWtc,UAAYN,EAAUK,OACjCuc,EAAWzc,UAAYH,EAAUK,QAvCrC,CA0CF,EAtVWwY,EA+VJkE,eAAP,SAAuBpc,EAAgBqc,EAAoCC,GACzE,IAAMC,EAAc3iB,GAAoByiB,EAAUC,GAC5CxiB,EAAwC,CAAA,EAG9C,IAAK,IAAM0iB,KAAUD,EAAYziB,WAAY,CAC3C,IAAM2iB,EAAaF,EAAYziB,WAAW0iB,GAG1C1iB,EAFa1R,KAAKs0B,iBAAiBF,IAEhBC,CACrB,CAGA,OAFAF,EAAYziB,WAAaA,EAElBgH,EAASzX,OAAO2W,EAAQuc,EACjC,EA7WWrE,EAqXJyE,cAAP,SAAsBnsB,EAAcosB,GAClC,OAAQpsB,GACN,KAAKqM,sBAAqC,aAE1C,KAAKA,sBAAuC,eAE5C,KAAKA,sBAAsC,cACzC,OAAO+f,EACT,QACE5gB,QAAQnU,MAAM,gCAAgC2I,EAAK,KAEzD,EAOA0nB,EAAOwE,iBAAP,SAAyBnrB,GACvB,OAAQA,GACN,IAAK,WAAY,MAAO,OACxB,IAAK,SAAU,MAAO,UACtB,IAAK,UAAW,MAAO,WACvB,IAAK,aAAc,MAAO,MAC1B,IAAK,aAAc,MAAO,OAC1B,IAAK,WAAY,MAAO,UACxB,IAAK,YAAa,MAAO,WAU3B,OAPKA,EAAKsrB,WAAW,MAInB7gB,QAAQmR,KAAK,2BAA2B5b,EAAK,KAGxCA,CACT,EA1ZW2mB,EAkaJ4E,cAAP,SAAsBnJ,EAAqBjmB,GACzC,MAAqB,iBAAVA,EACF,OAGLA,EAAQ,GAAKA,GAASimB,EAASvpB,SACjC4R,QAAQnU,MAAM,+BAA+B6F,EAAM,KAAIimB,EAASvpB,OAAO,KAGlEupB,EAASjmB,GAClB,EA5aWwqB,CA6aZ,CA7aW,GAkbLjE,GAAK,WAACA,SAAAA,IAAAA,CAAAA,OAAAA,EAOJ8I,iBAAP,SAAyBC,EAAaC,GACpC,IAAMC,EAAQF,EAAIG,YAAY,KACxB7sB,EAAM0sB,EAAIG,YAAY,KACtBC,EAASJ,EAAIK,UAAUH,EAAQ,EAAG5sB,GAExC,OAAO2sB,EAAMG,EAASH,EAAMG,CAC9B,EAMAnJ,EAAOqJ,kBAAP,WACE,IAAMC,EAAO,IAAIC,KAAKA,KAAK9Y,OACrB+Y,EAAUF,EAAKG,eAAe,SAC9BC,EAAM,GAAEJ,EAAKK,kBAEnB,OAAOH,EAAQvQ,MAAM,UAAUxQ,KAAK,IAAMihB,EAAGE,SAAS,EAAG,IAC3D,EAzBW5J,EAgCJ6J,eAAP,SAAuBd,EAAae,GAClC,IAAM9N,EAAI+N,SAASC,cAAc,KAEjChO,EAAEiO,aAAa,WAAYH,GAC3B9N,EAAEjmB,OAAS,SACXimB,EAAEkO,KAAOnB,EACT/M,EAAEmO,OACJ,EAOAnK,EAAOoK,aAAP,SAAqBC,YAAAA,IAAAA,GAAe,GAClC,IAAMC,EAASP,SAASC,cAAc,UAKtC,OAHAM,EAAOxU,MAAQ,IACfwU,EAAOtU,OAAS,IAET,IAAIuU,EAAO,CAChBD,OAAAA,EACAE,gBAAiB,SACjBC,IAAK/mB,EACLgnB,cAAe,CACbC,kBAAkB,GAEpBN,aAAAA,GAEJ,EAOArK,EAAa4K,MAAb,SAAoBlB,UAApB11B,GAAA,sCACE,MAAA,GAAO,IAAIF,SAAQV,SAAAA,GAAWy3B,OAAAA,WAAWz3B,EAASs2B,SACpD,GAFA11B,IASAgsB,EAAa8K,uBAAb,SAAqCvN,UAArCvpB,GAAA,sCACE,MAAA,GAAOstB,EAAU,IAAIpD,KAAAA,CAAMX,EAAMO,WAAY,CAAEvhB,KAAMghB,EAAMY,eAC7D,GAFAnqB,IASAgsB,EAAaC,uBAAb,SAAqC1C,UAArCvpB,GAAA,sCACE,MAAA,GAAOstB,EAAU,IAAIpD,KAAAA,CAAMX,EAAMllB,MAAO,CAAEkE,KAAMghB,EAAMY,eACxD,GAFAnqB,IASAgsB,EAAa+K,qBAAb,SAAmCT,UAAnCt2B,GAAA,sCACE,MAAA,GAAO,IAAIF,SAAqB,SAAUV,EAASC,GACjDi3B,EAAOU,QAAO,SAAU/O,GAClBA,EACF7oB,EAAQ6oB,EAAEgP,eAEV53B,EAAO,IAAIsb,MAAM,mBAErB,GAAG,YAAa,EAClB,OACF,GAVA3a,IAiBAgsB,EAAakL,oBAAb,SAAkC3N,qBAAlCvpB,GAAA,WACQm3B,IAAAA,6BAMN,OANMA,EAAMpB,SAASC,cAAc,WAE/BlU,MAAQyH,EAAMzH,MAClBqV,EAAInV,OAASuH,EAAMvH,OAClBmV,EAAIC,WAAW,MAAmCC,UAAU9N,EAAO,EAAG,GAEvE,GAAOtY,EAAK8lB,qBAAqBI,MACnC,GARAn3B,IAeAgsB,EAAOsL,mBAAP,SAA2BhB,GAGzB,OAFYA,EAAOc,WAAW,MAEnBG,aAAa,EAAG,EAAGjB,EAAOxU,MAAOwU,EAAOtU,OACrD,EAOAgK,EAAOwL,cAAP,SAAsB1N,GACpB,IAAM2N,EAAU1B,SAASC,cAAc,UACjCliB,EAAM2jB,EAAQL,WAAW,MAe/B,OAbAK,EAAQ3V,MAAQgI,EAAUhI,MAC1B2V,EAAQzV,OAAS8H,EAAU9H,OAE3BlO,EAAI4jB,aAAa5N,EAAW,EAAG,GAE/BhW,EAAI6jB,yBAA2B,OAC/B7jB,EAAI1H,MAAM,GAAI,GACd0H,EAAI8jB,UAAU,GAAI9N,EAAU9H,QAC5BlO,EAAIujB,UAAUI,EAAS,EAAG,GAE1B3jB,EAAI2O,aAAa,EAAG,EAAG,EAAG,EAAG,EAAG,GAChC3O,EAAI6jB,yBAA2B,cAExB7jB,EAAIyjB,aAAa,EAAG,EAAGE,EAAQ3V,MAAO2V,EAAQzV,OACvD,EAOAgK,EAAOuL,aAAP,SAAqBhO,GACnB,IAAM4N,EAAMpB,SAASC,cAAc,UAEnCmB,EAAIrV,MAAQyH,EAAMzH,MAClBqV,EAAInV,OAASuH,EAAMvH,OACnB,IAAMlO,EAAMqjB,EAAIC,WAAW,MAI3B,OAFAtjB,EAAIujB,UAAU9N,EAAO,EAAG,GAEjBppB,KAAKq3B,cAAc1jB,EAAIyjB,aAAa,EAAG,EAAGJ,EAAIrV,MAAOqV,EAAInV,QAClE,EAOAgK,EAAO6L,0BAAP,SAAkCvB,GAChC,IAAMxiB,EAAMwiB,EAAOc,WAAW,UACxBU,EAAS,IAAIrlB,WAAW6jB,EAAOxU,MAAQwU,EAAOtU,OAAS,GAI7D,OAFAlO,EAAIikB,WAAW,EAAG,EAAGzB,EAAOxU,MAAOwU,EAAOtU,OAAQlO,EAAIuD,KAAMvD,EAAIkkB,cAAeF,GAExEA,CACT,EA3LW9L,CA4LZ,CA5LW,GAiMLiM,GAAK,WAACA,SAAAA,IAOV93B,KACD2kB,UAAY,EAGX3kB,KACDgC,OAAS,EAGRhC,KACDyF,OAAS,EAGRzF,KACDwF,OAAS,EAGRxF,KACD+3B,SAAW,EAxBAD,OAAAA,EAAAA,UA+BXE,eAAAA,SAAgBva,GAId,IAHA,IAAInY,EAAQtF,KAAKyF,OACXwyB,EAAQ,IAAIxuB,GAEXnE,EAAQtF,KAAK2kB,WAAa3kB,KAAKgC,QACd,GAAlBhC,KAAK2kB,UACPsT,EAAM7qB,IAAIpN,KAAKkE,KAAKoB,GAAQtF,KAAKkE,KAAKoB,EAAQ,GAAI,GAElD2yB,EAAM7qB,IAAIpN,KAAKkE,KAAKoB,GAAQtF,KAAKkE,KAAKoB,EAAQ,GAAItF,KAAKkE,KAAKoB,EAAQ,IAEtEmY,EAAIya,cAAcD,GAClB3yB,GAAStF,KAAKwF,OAGhB,OAAOiY,CACT,EA9CWqa,CA+CZ,CA/CW,GAiDNK,GAAD,WAACA,SAAAA,SAGJn2B,OAAS,OACTyD,OAAS,OACTD,OAAS,OAETuyB,SAAW,OACXK,UAAY,OAEZC,QAAS,OACTC,YAAa,OACbC,cAAgB,EAZZJ,IAAAA,EAAAA,EAAAA,UAAAA,OAcJl3B,EAAAA,OAAAA,SAAQu3B,EAAqBC,GAC3B,OAAQD,EAASpwB,MACf,KAAKqM,sBAA4B,IAC/BzU,KAAK+3B,SAAW,EAChB/3B,KAAKq4B,QAAS,EACdr4B,KAAKu4B,cAAgB,EAAI,WAEzB,MACF,KAAK9jB,sBAA8B,MACjCzU,KAAK+3B,SAAW,EAChB/3B,KAAKq4B,QAAS,EACdr4B,KAAKu4B,cAAgB,EAAI,MAEzB,MACF,QACEv4B,KAAK+3B,SAAW,EAChB/3B,KAAKq4B,QAAS,EACdr4B,KAAKu4B,cAAgB,EAOXC,IAAAA,EAMAA,EAVdx4B,KAAKkE,KAAOu0B,EACZz4B,KAAKgC,OAAShC,KAAKkE,KAAKlC,OACxBhC,KAAKo4B,UAAYI,EAAS3yB,KAE1B7F,KAAKyF,cAAS+yB,EAAAA,EAAS/yB,QAAT+yB,EAAmB,EAC7Bx4B,KAAKyF,OAAS,IACZzF,KAAKyF,OAASzF,KAAK+3B,UAAa,GAAKnkB,QAAQnU,MAAM,kBAAkBO,KAAKyF,OAAO,eAAczF,KAAK+3B,SAAS,KACjH/3B,KAAKyF,OAASzF,KAAKyF,OAASzF,KAAK+3B,UAGnC/3B,KAAKwF,cAASgzB,EAAAA,EAAShzB,QAATgzB,EAAmB,EAC7Bx4B,KAAKwF,OAAS,GACZxF,KAAKwF,OAASxF,KAAK+3B,UAAa,GAAKnkB,QAAQnU,MAAM,kBAAkBO,KAAKwF,OAAO,eAAcxF,KAAK+3B,SAAS,KACjH/3B,KAAKwF,OAASxF,KAAKwF,OAASxF,KAAK+3B,UAEjC/3B,KAAKwF,OAASxF,KAAKo4B,UAGrBp4B,KAAKs4B,YAAoC,IAAvBE,EAASE,SAC7B,EAEAC,EAAAA,QAAAA,SAASrzB,GACP,IAAIG,EAASzF,KAAKyF,OAGlB,MADAA,GAAUH,EAAQtF,KAAKwF,QACVxF,KAAKo4B,UAAYp4B,KAAKgC,QAAnC,CAEA,IAAImM,EAUJ,GAPEA,EADqB,IAAnBnO,KAAKo4B,UACD,CAACp4B,KAAKkE,KAAKuB,GAASzF,KAAKkE,KAAKuB,EAAS,GAAI,EAAG,GACxB,IAAnBzF,KAAKo4B,UACR,CAACp4B,KAAKkE,KAAKuB,GAASzF,KAAKkE,KAAKuB,EAAS,GAAIzF,KAAKkE,KAAKuB,EAAS,GAAI,GAElE,CAACzF,KAAKkE,KAAKuB,GAASzF,KAAKkE,KAAKuB,EAAS,GAAIzF,KAAKkE,KAAKuB,EAAS,GAAIzF,KAAKkE,KAAKuB,EAAS,IAGzFzF,KAAKs4B,WACP,IAAK,IAAIj2B,EAAI,EAAGA,EAAIrC,KAAKo4B,UAAW/1B,IAClC8L,EAAI9L,IAAMrC,KAAKu4B,cACXv4B,KAAKq4B,SACPlqB,EAAI9L,GAAKsF,KAAK8b,IAAItV,EAAI9L,IAAK,IAKjC,OAAO8L,CArB8C,CAsBvD,EAEAyqB,EAAAA,UAAAA,WACE,OAAOjxB,KAAKuqB,OAAOlyB,KAAKgC,OAAShC,KAAKyF,QAAUzF,KAAKwF,OACvD,EArFI2yB,EAAD,GA2FEU,GAAK,WAACA,SAAAA,IAGV74B,KACDoZ,UAAY,EAGXpZ,KACDqZ,UAAY,EAmBXrZ,KACD84B,aAA0B,GA5BfD,IAAAA,EAAAA,EAAAA,UAAAA,OAmCX53B,EAAAA,OAAAA,SAAQwX,EAAoBqgB,GAC1B94B,KAAKoZ,UAAY,EACjBpZ,KAAKqZ,UAAY1R,KAAKoxB,IAAItgB,EAASugB,gBAGnC,IAAMtnB,EAAa+G,EAAS/G,WAG5B1R,KAAKsF,MAAQmT,EAASwgB,eACtB,IAAMC,EAAiBxnB,EAAkB,KACnCynB,EAAgB1gB,EAAS2gB,iBAAiB,QAEhDp5B,KAAKkN,SAAW,IAAIirB,GACpBn4B,KAAKkN,SAASjM,OAAOi4B,EAAgBC,GAErC,IAAME,EAAc3nB,EAAqB,QACnC4nB,EAAe5nB,EAAsB,SAE3C,QAAoBrR,IAAhBg5B,QAA8Ch5B,IAAjBi5B,EAA4B,CAC3D,IAAMC,EAAa9gB,EAAS2gB,iBAAiB,WACvCI,EAAc/gB,EAAS2gB,iBAAiB,YAE9Cp5B,KAAKy5B,MAAQ,IAAItB,GACjBn4B,KAAKy5B,MAAMx4B,OAAOo4B,EAAaE,GAC/Bv5B,KAAK05B,OAAS,IAAIvB,GAClBn4B,KAAK05B,OAAOz4B,OAAOq4B,EAAcE,EACnC,CACAx5B,KAAK84B,aAAeA,CACtB,EAOAd,EAAAA,eAAAA,SAAgBva,cACdA,EAAIkc,YACJ,IAAMC,EAAU,IAAIhwB,GACdiwB,OAAyBx5B,IAAfL,KAAKy5B,YAAuCp5B,IAAhBL,KAAK05B,QAAwB15B,KAAK84B,aAAa92B,OAAS,EAE9F83B,EAAwB,IAAIvd,IAElC,QAAmBlc,IAAfL,KAAKsF,MACP,IAAK,IAAIjD,EAAI,EAAGA,EAAIrC,KAAKqZ,UAAWhX,IAAK,CACvC,IAAM03B,EAAI/5B,KAAKoZ,UAAY/W,EAEvB03B,EAAI/5B,KAAKsF,MAAMtD,QACjB83B,EAASrb,IAAIze,KAAKsF,MAAMy0B,GAE5B,MAEA,IAAK,IAAI13B,EAAI,EAAGA,EAAIrC,KAAKqZ,UAAWhX,IAClCy3B,EAASrb,IAAIze,KAAKoZ,UAAY/W,GAiDlC,OA7CAy3B,EAAS/nB,SAAQzM,SAAAA,GACf,IAAM00B,EAAUlpB,EAAK5D,SAASyrB,QAAQrzB,GAEtC,QAAgBjF,IAAZ25B,EAAuB,CACzB,IAAMC,EAASxwB,GAAQ4E,UAAU2rB,GAEjC,GAAIH,EAAS,KACOK,EACCC,EADbC,EAAY,OAAAF,EAAAppB,EAAK2oB,YAAL,EAAAS,EAAYvB,QAAQrzB,GAChC+0B,EAAa,OAAAF,EAAArpB,EAAK4oB,aAAL,EAAAS,EAAaxB,QAAQrzB,GAExC,QAAkBjF,IAAd+5B,QAA0C/5B,IAAfg6B,EAA0B,CACvDT,EAAQU,UAGR,IAFA,IAAIC,GAAY,EAEPl4B,EAAI,EAAGA,EAAI,EAAGA,IACrB,GAAsB,IAAlBg4B,EAAWh4B,GAAf,CAIA,GAAI+3B,EAAU/3B,GAAK,GAAK+3B,EAAU/3B,IAAMyO,EAAKgoB,aAAa92B,OAAQ,CAChEu4B,GAAY,EAEZ,KACF,CAEA,IAAMC,EAAU1pB,EAAKgoB,aAAasB,EAAU/3B,IAE5Cu3B,EAAQa,gBAAgBD,EAASH,EAAWh4B,GAV5C,CAaF,IAAKk4B,EAAW,CACd,IAAMG,EAASd,EAAQe,iBAAiB,IAAIjxB,GAAQuwB,EAAOxsB,EAAGwsB,EAAOt3B,EAAGs3B,EAAOvsB,EAAG,IAE9E/F,KAAKoxB,IAAI2B,EAAO5sB,GAAK,OACvB4sB,EAAOxU,SAAS,EAAMwU,EAAO5sB,GAC7BmsB,EAAO7sB,IAAIstB,EAAOjtB,EAAGitB,EAAO/3B,EAAG+3B,EAAOhtB,GAE1C,CACF,CACF,CAEA+P,EAAIya,cAAc+B,EACpB,CACF,IAEOxc,CACT,EAzIWob,CA0IZ,CA1IW,GA+IL+B,GAAK,WAACA,SAAAA,IAGV56B,KACDoZ,UAAY,EAGXpZ,KACDqZ,UAAY,EAmBXrZ,KACD66B,aAAc,EAGb76B,KACD84B,aAA0B,GAGzB94B,KACD86B,cAAe,EAGd96B,KACD+6B,WAAa,IAAInxB,GAxCNgxB,IAAAA,EAAAA,EAAAA,UAAAA,OAgDX35B,EAAAA,OAAAA,SAAQwX,EAAoBoiB,EAAsB/B,GAChD94B,KAAKoZ,UAAY,EACjBpZ,KAAKqZ,UAAY1R,KAAKoxB,IAAItgB,EAASugB,gBAGnC,IAAMtnB,EAAa+G,EAAS/G,WAG5B1R,KAAKsF,MAAQmT,EAASwgB,eACtB,IAAMC,EAAiBxnB,EAAkB,KACnCynB,EAAgB1gB,EAAS2gB,iBAAiB,QAEhDp5B,KAAKkN,SAAW,IAAIirB,GACpBn4B,KAAKkN,SAASjM,OAAOi4B,EAAgBC,GAErC,IAAME,EAAc3nB,EAAqB,QACnC4nB,EAAe5nB,EAAsB,SAE3C,QAAoBrR,IAAhBg5B,QAA8Ch5B,IAAjBi5B,EAA4B,CAC3D,IAAMC,EAAa9gB,EAAS2gB,iBAAiB,WACvCI,EAAc/gB,EAAS2gB,iBAAiB,YAE9Cp5B,KAAKy5B,MAAQ,IAAItB,GACjBn4B,KAAKy5B,MAAMx4B,OAAOo4B,EAAaE,GAC/Bv5B,KAAK05B,OAAS,IAAIvB,GAClBn4B,KAAK05B,OAAOz4B,OAAOq4B,EAAcE,EACnC,CACAx5B,KAAK66B,YAAcA,EACnB76B,KAAK84B,aAAeA,EACpB94B,KAAK86B,kBAA8Bz6B,IAAfL,KAAKy5B,YAAuCp5B,IAAhBL,KAAK05B,QAAwB15B,KAAK84B,aAAa92B,OAAS,CAC1G,EAQAg5B,EAAAA,YAAAA,SAAaC,EAAoBC,GAM/B,IALA,IAAIC,EACEC,EAAK,IAAI3xB,GAAW4xB,EAAK,IAAI5xB,GAAW6xB,EAAK,IAAI7xB,GACjD8xB,EAAK,IAAI7xB,GAAW8xB,EAAK,IAAI9xB,GAAW+xB,EAAK,IAAI/xB,GACjDqe,GAAmB/nB,KAAK66B,YAErBx4B,EAAI,EAAGA,EAAI,EAAIrC,KAAKqZ,UAAWhX,GAAK,EAAG,CAC9C,IAAIq5B,EAAK17B,KAAKoZ,UAAY/W,EACtBkC,EAAKvE,KAAKoZ,UAAY/W,EAAI,EAC1Bs5B,EAAK37B,KAAKoZ,UAAY/W,EAAI,OAEXhC,IAAfL,KAAKsF,QACPo2B,EAAK17B,KAAKsF,MAAMo2B,GAChBn3B,EAAKvE,KAAKsF,MAAMf,GAChBo3B,EAAK37B,KAAKsF,MAAMq2B,IAGlB,IAAMC,EAAK57B,KAAK2N,YAAY+tB,EAAIN,EAAIG,GAC9BM,EAAK77B,KAAK2N,YAAYpJ,EAAI82B,EAAIG,GAC9BM,EAAK97B,KAAK2N,YAAYguB,EAAIL,EAAIG,GAEpC,GAAKG,GAAOC,GAAOC,EAAnB,CAIA,IAAMl5B,EAAIglB,GAAmBqT,EAAWC,EAAcU,EAAIC,EAAIC,EAAI/T,QAExD1nB,IAANuC,SAISvC,IAAT86B,GAAsBA,EAAOv4B,KAC/Bu4B,EAAOv4B,EATT,CAWF,CAEA,OAAOu4B,CACT,EASAxtB,EAAAA,YAAAA,SAAarI,EAAey2B,EAAeC,GACzC,IAAMhC,EAAUh6B,KAAKkN,SAASyrB,QAAQrzB,GAEtC,QAAgBjF,IAAZ25B,EACF,OAAO,KAGT,GAAIh6B,KAAK86B,aAAc,KACHZ,EACCC,EADbC,EAAY,OAAAF,EAAAl6B,KAAKy5B,YAAL,EAAAS,EAAYvB,QAAQrzB,GAChC+0B,EAAa,OAAAF,EAAAn6B,KAAK05B,aAAL,EAAAS,EAAaxB,QAAQrzB,GAExC,QAAkBjF,IAAd+5B,QAA0C/5B,IAAfg6B,EAA0B,CACvD,IAAMT,EAAU55B,KAAK+6B,WAErBnB,EAAQU,UACR,IAAK,IAAIj4B,EAAI,EAAGA,EAAI,EAAGA,IACrB,GAAsB,IAAlBg4B,EAAWh4B,GAAf,CAEA,IAAMm4B,EAAUx6B,KAAK84B,aAAasB,EAAU/3B,IAE5Cu3B,EAAQa,gBAAgBD,EAASH,EAAWh4B,GAJP,CAOvC25B,EAAK5uB,IAAI4sB,EAAQ,GAAIA,EAAQ,GAAIA,EAAQ,GAAI,GAC7C,IAAMU,EAASd,EAAQe,iBAAiBqB,GAClC/vB,EAAQ,EAAMyuB,EAAO5sB,EAE3BiuB,EAAK3uB,IAAIstB,EAAOjtB,EAAIxB,EAAOyuB,EAAO/3B,EAAIsJ,EAAOyuB,EAAOhtB,EAAIzB,EAC1D,OAEA8vB,EAAK3uB,IAAI4sB,EAAQ,GAAIA,EAAQ,GAAIA,EAAQ,IAG3C,OAAO+B,CACT,EAtKWnB,CAwKZ,CAxKW,GA6KLqB,GAAK,WAACA,SAAAA,IAAAA,CAAAA,OAMXA,EAAOC,YAAP,SAAoB14B,GAClB,MAAoB,iBAANA,CAChB,EAOAy4B,EAAOE,iBAAP,SAAyB34B,GACvB,YAAanD,IAANmD,GAAyBxD,KAAKk8B,YAAY14B,EACnD,EAOAy4B,EAAOG,cAAP,SAAsB54B,GACpB,OAAOxD,KAAKk8B,YAAY14B,IAAMA,GAAK,GAAKA,GAAK,CAC/C,EAOAy4B,EAAOI,mBAAP,SAA2B74B,GACzB,YAAanD,IAANmD,GAAyBxD,KAAKo8B,cAAc54B,EACrD,EAOAy4B,EAAOK,cAAP,SAAsB94B,GACpB,OAAOxD,KAAKk8B,YAAY14B,IAAMA,EAAI,CACpC,EAOAy4B,EAAOM,iBAAP,SAAyB/4B,GACvB,OAAOxD,KAAKk8B,YAAY14B,IAAMA,GAAK,CACrC,EAOAy4B,EAAOO,sBAAP,SAA8Bh5B,GAC5B,YAAanD,IAANmD,GAAyBxD,KAAKu8B,iBAAiB/4B,EACxD,EAOAy4B,EAAOQ,aAAP,SAAqBj5B,GACnB,MAAoB,kBAANA,CAChB,EAOAy4B,EAAOS,kBAAP,SAA0Bl5B,GACxB,YAAanD,IAANmD,GAAyBxD,KAAKy8B,aAAaj5B,EACpD,EAOAy4B,EAAOU,YAAP,SAAoBn5B,GAClB,MAAoB,iBAANA,CAChB,EAOAy4B,EAAOW,iBAAP,SAAyBp5B,GACvB,YAAanD,IAANmD,GAAyBxD,KAAK28B,YAAYn5B,EACnD,EAOAy4B,EAAOY,kBAAP,SAA0Br5B,GACxB,OAAQnC,EAADmC,EAAamC,aACtB,EAOAs2B,EAAOa,uBAAP,SAA+Bt5B,GAC7B,YAAanD,IAANmD,GAAyBxD,KAAK68B,kBAAkBr5B,EACzD,EAOAy4B,EAAOc,YAAP,SAAoBv5B,GAClB,YAAUnD,IAANmD,KACCxD,KAAKk8B,YAAY14B,IAEfA,GAAK,CACd,EAOAy4B,EAAOe,cAAP,SAAsBx5B,GACpB,YAAUnD,IAANmD,KACCxD,KAAKk8B,YAAY14B,KAEfA,GAAK,GAAKA,GAAK,EACxB,EAOAy4B,EAAOgB,UAAP,SAAkBz5B,cAChB,QAAKkF,MAAMK,QAAQvF,KACH,GAAZA,EAAExB,QAECwB,EAAE05B,OAAM15B,SAAAA,GAAK,OAAAsN,EAAKorB,YAAY14B,MACvC,EAOAy4B,EAAOkB,eAAP,SAAuB35B,GACrB,YAAanD,IAANmD,GAAyBxD,KAAKi9B,UAAUz5B,EACjD,EAOAy4B,EAAOmB,UAAP,SAAkB55B,cAChB,QAAKkF,MAAMK,QAAQvF,KACH,GAAZA,EAAExB,QAECwB,EAAE05B,OAAM15B,SAAAA,GAAK,OAAAsN,EAAKorB,YAAY14B,MACvC,EAOAy4B,EAAOoB,kBAAP,SAA0B75B,cACxB,QAAKkF,MAAMK,QAAQvF,KACH,GAAZA,EAAExB,QAECwB,EAAE05B,OAAM15B,SAAAA,GAAK,OAAAsN,EAAKyrB,iBAAiB/4B,MAC5C,EAOAy4B,EAAOqB,UAAP,SAAkB95B,cAChB,QAAKkF,MAAMK,QAAQvF,KACH,GAAZA,EAAExB,QAECwB,EAAE05B,OAAM15B,SAAAA,GAAK,OAAAsN,EAAKorB,YAAY14B,MACvC,EAOAy4B,EAAOsB,kBAAP,SAA0B/5B,cACxB,QAAKkF,MAAMK,QAAQvF,KACH,GAAZA,EAAExB,QAECwB,EAAE05B,OAAM15B,SAAAA,GAAK,OAAAsN,EAAKyrB,iBAAiB/4B,MAC5C,EAOAy4B,EAAOuB,iBAAP,SAAyBh6B,cACvB,QAAKkF,MAAMK,QAAQvF,IAEZA,EAAE05B,OAAM15B,SAAAA,GAAK,OAAAsN,EAAKorB,YAAY14B,KACvC,EAOAy4B,EAAOwB,aAAP,SAAqBj6B,GACnB,QAAKnC,EAADmC,EAAaomB,KACXpmB,EAAEk6B,aACJ9pB,QAAQnU,MAAO,yBAAwB+D,EAAE2F,KAAK,MAGxC3F,EAAEk6B,YAId,EAOAzB,EAAO0B,kBAAP,SAA0Bn6B,GACxB,YAAanD,IAANmD,GAAyBxD,KAAKy9B,aAAaj6B,EACpD,EAOAy4B,EAAO2B,kBAAP,SAA0Bp6B,GACxB,QAAKxD,KAAKm9B,eAAe35B,EAAEiC,YACtBzF,KAAKm8B,iBAAiB34B,EAAEwI,cACxBhM,KAAKm9B,eAAe35B,EAAEyI,cAEX5L,IAAZmD,EAAEyI,SACAtE,KAAKoxB,IAAIv1B,EAAEyI,MAAM,IAAM,MAAQtE,KAAKoxB,IAAIv1B,EAAEyI,MAAM,IAAM,QAO9D,EAOAgwB,EAAO4B,uBAAP,SAA+Br6B,GAC7B,YAAanD,IAANmD,GAAyBxD,KAAK49B,kBAAkBp6B,EACzD,EAOAy4B,EAAO6B,iBAAP,SAAyBt6B,GACvB,YAAanD,IAANmD,GACFA,IAAMiI,EAAKsyB,iBAAiBC,QAC5Bx6B,IAAMiI,EAAKsyB,iBAAiBE,QAC5Bz6B,IAAMiI,EAAKsyB,iBAAiBG,aAC5B16B,IAAMiI,EAAKsyB,iBAAiBI,QACnC,EAOAlC,EAAOmC,aAAP,SAAqB56B,GACnB,YAAanD,IAANmD,GAAmBA,IAAMiI,EAAK4yB,SAASC,MAAQ96B,IAAMiI,EAAK4yB,SAASE,QAAU/6B,IAAMiI,EAAK4yB,SAASG,KAC1G,EAOAvC,EAAOwC,cAAP,SAAsBj7B,GACpB,MAAa,gBAANA,GAA6B,aAANA,GAA0B,UAANA,GAAuB,YAANA,CACrE,EAOAy4B,EAAOyC,gBAAP,SAAwBl7B,GACtB,MAAa,WAANA,GAAwB,SAANA,GAAsB,gBAANA,CAC3C,EA3TWy4B,EAkUJ0C,eAAP,SAAuBn7B,EAAa4D,GAC3B/F,EAADmC,EAAakV,IACjB9E,QAAQnU,MAAM,yBAAyBO,KAAKuV,UAAU/R,GAAG,MAGrC,IAAlBA,EAAEk6B,aACJ9pB,QAAQnU,MAAM,iCAEXO,KAAKu8B,iBAAiB/4B,EAAEo7B,iBAC3BhrB,QAAQnU,MAAM,gCAAgC+D,EAAEo7B,eAAe,KAAI5+B,KAAKuV,UAAU/R,GAAG,IAwDzF,EAnYWy4B,EA2YJ4C,qBAAP,SAA6Br7B,EAAa2F,EAAckQ,GACtD,IAAMylB,EAAc9+B,KAAK++B,qBAAqBv7B,EAAG2F,QAE7B9I,IAAhBy+B,GACEA,EAAYlG,YAAcvf,GAC5BzF,QAAQnU,MAAM0J,EAAQ,WAAU21B,EAAYlG,YAAY,6BAA4Bvf,EAAU,MAAKrZ,KAAKuV,UAAU/R,GAAG,IAG3H,EAnZWy4B,EA2ZJ8C,qBAAP,SAA6Bv7B,EAAa2F,GAExC,IAAMuI,EAAalO,EAAEkO,WAErB,QAAmBrR,IAAfqR,EAAJ,CACA,IAAMstB,EAAattB,EAAWvI,GAE9B,QAAmB9I,IAAf2+B,EAAJ,CACA,IAAMC,EAAYz7B,EAAE41B,iBAAiBjwB,GAErC,QAAkB9I,IAAd4+B,EAAJ,CAEA,IAAMH,EAAc,IAAI3G,GAIxB,OAFA2G,EAAY79B,OAAO+9B,EAAyBC,GAErCH,CANgC,CAHC,CAHA,CAa1C,EAMA7C,EAAOiD,uBAAP,SAA+B17B,GAM7B,GALKxD,KAAK48B,iBAAiBp5B,EAAE2F,OAASyK,QAAQnU,MAAM,qBAAqB+D,EAAE2F,KAAK,KAAInJ,KAAKuV,UAAU/R,GAAG,KACjGxD,KAAKw9B,iBAAiBh6B,EAAE27B,SAAWvrB,QAAQnU,MAAM,uBAAuB+D,EAAE27B,OAAO,KAAIn/B,KAAKuV,UAAU/R,GAAG,KACvGxD,KAAKm8B,iBAAiB34B,EAAE47B,WAAaxrB,QAAQnU,MAAM,yBAAyB+D,EAAE47B,SAAS,KAAIp/B,KAAKuV,UAAU/R,GAAG,KAC7GxD,KAAK88B,uBAAuBt5B,EAAE67B,sBAAwBzrB,QAAQnU,MAAM,oCAAoC+D,EAAE67B,oBAAoB,KAAIr/B,KAAKuV,UAAU/R,GAAG,UAE3HnD,IAA1BmD,EAAE67B,oBAAmC,EACnC77B,EAAE67B,oBAAoBr9B,QAAU,GAAKwB,EAAE67B,oBAAoBr9B,OAAS,IAAO,IAAK4R,QAAQnU,MAAM,2CAA2C+D,EAAE67B,oBAAoB,KAAIr/B,KAAKuV,UAAU/R,GAAG,KACnK,GAAlBA,EAAE27B,OAAOn9B,SAAgBwB,EAAE67B,oBAAoBr9B,QAAU4R,QAAQnU,MAAO,yDAAwD+D,EAAE27B,OAAO,KAAI37B,EAAE67B,oBAAoB,KAAIr/B,KAAKuV,UAAU/R,GAAG,KAG7L,IAFA,IAAMsJ,EAAM,IAAIlD,GAEPvH,EAAI,EAAGA,EAAImB,EAAE67B,oBAAoBr9B,OAAQK,GAAK,GAAI,CACzD,IAAK,IAAI03B,EAAI,EAAGA,EAAI,GAAIA,IACtBjtB,EAAIoC,SAAS6qB,GAAKv2B,EAAE67B,oBAAoBh9B,EAAI03B,GAE1CpyB,KAAKoxB,IAAIjsB,EAAIwyB,eAAiB,MAChC1rB,QAAQnU,MAAM,mDAAmDqN,EAAIwyB,cAAc,WAAUj9B,EAAI,GAAG,KAAIrC,KAAKuV,UAAU/R,GAAG,IAE9H,OAEIA,EAAE27B,OAAOn9B,QAAU,GAAK4R,QAAQnU,MAAM,8BAA8B+D,EAAE27B,OAAO,KAAIn/B,KAAKuV,UAAU/R,GAAG,IAE3G,EAMAy4B,EAAOsD,iBAAP,SAAyB/7B,GACnBA,EAAE4E,OAASqD,EAAK+zB,aAAatlB,OAC1Bla,KAAK28B,YAAYn5B,EAAE2F,OAASyK,QAAQnU,MAAM,yBAAyB+D,EAAE2F,KAAK,KAAInJ,KAAKuV,UAAU/R,GAAG,KAEhGxD,KAAKu9B,kBAAkB/5B,EAAEi8B,kBAAoB7rB,QAAQnU,MAAM,oCAAoC+D,EAAEi8B,gBAAgB,KAAIz/B,KAAKuV,UAAU/R,GAAG,KACvIxD,KAAK29B,kBAAkBn6B,EAAEk8B,mBAAqB9rB,QAAQnU,MAAM,qCAAqC+D,EAAEk8B,iBAAiB,KAAI1/B,KAAKuV,UAAU/R,GAAG,KAC1IxD,KAAK69B,uBAAuBr6B,EAAEm8B,4BAA8B/rB,QAAQnU,MAAM,8CAA8C+D,EAAEm8B,0BAA0B,KAAI3/B,KAAKuV,UAAU/R,GAAG,KAC1KxD,KAAKg9B,cAAcx5B,EAAEo8B,6BAA+BhsB,QAAQnU,MAAM,+CAA+C+D,EAAEo8B,2BAA2B,KAAI5/B,KAAKuV,UAAU/R,GAAG,KAEpKxD,KAAK08B,kBAAkBl5B,EAAE+U,YAAc3E,QAAQnU,MAAM,8BAA8B+D,EAAE+U,UAAU,KAAIvY,KAAKuV,UAAU/R,GAAG,KACrHxD,KAAK89B,iBAAiBt6B,EAAE6qB,WAAaza,QAAQnU,MAAM,6BAA6B+D,EAAE6qB,SAAS,KAAIruB,KAAKuV,UAAU/R,GAAG,KACjHxD,KAAKo+B,aAAa56B,EAAEq8B,OAASjsB,QAAQnU,MAAM,yBAAyB+D,EAAEq8B,KAAK,KAAI7/B,KAAKuV,UAAU/R,GAAG,KAClGA,EAAE6qB,WAAa5iB,EAAKsyB,iBAAiBE,aACjB59B,IAAlBmD,EAAEs8B,aAA6BlsB,QAAQnU,MAAM,8CAA8CO,KAAKuV,UAAU/R,GAAG,KAE9GxD,KAAKq8B,mBAAmB74B,EAAEs8B,cAAgBlsB,QAAQnU,MAAM,gCAAgC+D,EAAEs8B,YAAY,KAAI9/B,KAAKuV,UAAU/R,GAAG,MACxHA,EAAE4E,OAASqD,EAAK+zB,aAAarlB,KACjCna,KAAK28B,YAAYn5B,EAAE2F,OAASyK,QAAQnU,MAAM,yBAAyB+D,EAAE2F,KAAK,KAAInJ,KAAKuV,UAAU/R,GAAG,KAEhGxD,KAAKu9B,kBAAkB/5B,EAAEi8B,kBAAoB7rB,QAAQnU,MAAM,oCAAoC+D,EAAEi8B,gBAAgB,KAAIz/B,KAAKuV,UAAU/R,GAAG,KACvIxD,KAAK29B,kBAAkBn6B,EAAEk8B,mBAAqB9rB,QAAQnU,MAAM,qCAAqC+D,EAAEk8B,iBAAiB,KAAI1/B,KAAKuV,UAAU/R,GAAG,KAC1IxD,KAAK69B,uBAAuBr6B,EAAEm8B,4BAA8B/rB,QAAQnU,MAAM,8CAA8C+D,EAAEm8B,0BAA0B,KAAI3/B,KAAKuV,UAAU/R,GAAG,KAC1KxD,KAAKg9B,cAAcx5B,EAAEo8B,6BAA+BhsB,QAAQnU,MAAM,+CAA+C+D,EAAEo8B,2BAA2B,KAAI5/B,KAAKuV,UAAU/R,GAAG,KAEpKxD,KAAK08B,kBAAkBl5B,EAAEu8B,gBAAkBnsB,QAAQnU,MAAM,kCAAkC+D,EAAEu8B,cAAc,KAAI//B,KAAKuV,UAAU/R,GAAG,KACjIxD,KAAKo8B,cAAc54B,EAAEw8B,iBAAmBpsB,QAAQnU,MAAM,mCAAmC+D,EAAEw8B,eAAe,KAAIhgC,KAAKuV,UAAU/R,GAAG,KAChIxD,KAAKu8B,iBAAiB/4B,EAAEy8B,kBAAoBrsB,QAAQnU,MAAM,oCAAoC+D,EAAEy8B,gBAAgB,KAAIjgC,KAAKuV,UAAU/R,GAAG,KACtIxD,KAAK29B,kBAAkBn6B,EAAE08B,2BAA6BtsB,QAAQnU,MAAM,6CAA6C+D,EAAE08B,yBAAyB,KAAIlgC,KAAKuV,UAAU/R,GAAG,KAClKxD,KAAK69B,uBAAuBr6B,EAAE28B,oCAAsCvsB,QAAQnU,MAAM,sDAAsD+D,EAAE28B,kCAAkC,KAAIngC,KAAKuV,UAAU/R,GAAG,KAClMxD,KAAKg9B,cAAcx5B,EAAE48B,qCAAuCxsB,QAAQnU,MAAM,uDAAuD+D,EAAE48B,mCAAmC,KAAIpgC,KAAKuV,UAAU/R,GAAG,KAE5LxD,KAAK29B,kBAAkBn6B,EAAE68B,gBAAkBzsB,QAAQnU,MAAM,kCAAkC+D,EAAE68B,cAAc,KAAIrgC,KAAKuV,UAAU/R,GAAG,KACjIxD,KAAKw8B,sBAAsBh5B,EAAE88B,qBAAuB1sB,QAAQnU,MAAM,uCAAuC+D,EAAE88B,mBAAmB,KAAItgC,KAAKuV,UAAU/R,GAAG,KACpJxD,KAAK69B,uBAAuBr6B,EAAE+8B,yBAA2B3sB,QAAQnU,MAAM,2CAA2C+D,EAAE+8B,uBAAuB,KAAIvgC,KAAKuV,UAAU/R,GAAG,KACjKxD,KAAKg9B,cAAcx5B,EAAEg9B,0BAA4B5sB,QAAQnU,MAAM,4CAA4C+D,EAAEg9B,wBAAwB,KAAIxgC,KAAKuV,UAAU/R,GAAG,KAE3JxD,KAAK29B,kBAAkBn6B,EAAEi9B,mBAAqB7sB,QAAQnU,MAAM,qCAAqC+D,EAAEi9B,iBAAiB,KAAIzgC,KAAKuV,UAAU/R,GAAG,KAC1IxD,KAAKq8B,mBAAmB74B,EAAEk9B,2BAA6B9sB,QAAQnU,MAAM,6CAA6C+D,EAAEk9B,yBAAyB,KAAI1gC,KAAKuV,UAAU/R,GAAG,KACnKxD,KAAK69B,uBAAuBr6B,EAAEm9B,4BAA8B/sB,QAAQnU,MAAM,8CAA8C+D,EAAEm9B,0BAA0B,KAAI3gC,KAAKuV,UAAU/R,GAAG,KAC1KxD,KAAKg9B,cAAcx5B,EAAEo9B,6BAA+BhtB,QAAQnU,MAAM,+CAA+C+D,EAAEo9B,2BAA2B,KAAI5gC,KAAKuV,UAAU/R,GAAG,KAGpKxD,KAAKu9B,kBAAkB/5B,EAAEq9B,iBAAmBjtB,QAAQnU,MAAM,mCAAmC+D,EAAEq9B,eAAe,KAAI7gC,KAAKuV,UAAU/R,GAAG,KACpIxD,KAAKu8B,iBAAiB/4B,EAAEs9B,oBAAsBltB,QAAQnU,MAAM,sCAAsC+D,EAAEs9B,kBAAkB,KAAI9gC,KAAKuV,UAAU/R,GAAG,KAC5IxD,KAAK29B,kBAAkBn6B,EAAEu9B,kBAAoBntB,QAAQnU,MAAM,oCAAoC+D,EAAEu9B,gBAAgB,KAAI/gC,KAAKuV,UAAU/R,GAAG,KACvIxD,KAAK69B,uBAAuBr6B,EAAEw9B,2BAA6BptB,QAAQnU,MAAM,6CAA6C+D,EAAEw9B,yBAAyB,KAAIhhC,KAAKuV,UAAU/R,GAAG,KACvKxD,KAAKg9B,cAAcx5B,EAAEy9B,4BAA8BrtB,QAAQnU,MAAM,8CAA8C+D,EAAEy9B,0BAA0B,KAAIjhC,KAAKuV,UAAU/R,GAAG,KAEjKxD,KAAK08B,kBAAkBl5B,EAAE+U,YAAc3E,QAAQnU,MAAM,8BAA8B+D,EAAE+U,UAAU,KAAIvY,KAAKuV,UAAU/R,GAAG,KACrHxD,KAAK89B,iBAAiBt6B,EAAE6qB,WAAaza,QAAQnU,MAAM,6BAA6B+D,EAAE6qB,SAAS,KAAIruB,KAAKuV,UAAU/R,GAAG,KACjHxD,KAAKo+B,aAAa56B,EAAEq8B,OAASjsB,QAAQnU,MAAM,yBAAyB+D,EAAEq8B,KAAK,KAAI7/B,KAAKuV,UAAU/R,GAAG,KAClGA,EAAE6qB,WAAa5iB,EAAKsyB,iBAAiBE,aACjB59B,IAAlBmD,EAAEs8B,aAA6BlsB,QAAQnU,MAAM,8CAA8CO,KAAKuV,UAAU/R,GAAG,KAE9GxD,KAAKq8B,mBAAmB74B,EAAEs8B,cAAgBlsB,QAAQnU,MAAM,gCAAgC+D,EAAEs8B,YAAY,KAAI9/B,KAAKuV,UAAU/R,GAAG,MAEjIoQ,QAAQnU,MAAM,yBAAyBO,KAAKuV,UAAU/R,GAAG,IAE7D,EAxgBWy4B,EAghBJiF,kBAAP,SAA0B19B,EAA0B4D,GAIlD,OAHApH,KAAK2+B,eAAen7B,EAAEiV,SAAUrR,GAChCpH,KAAKu/B,iBAAiB/7B,EAAEsU,WAEjB,CACT,EAMAmkB,EAAOkF,uBAAP,SAA+B39B,GACxBxD,KAAK+8B,YAAYv5B,EAAE4b,SAAWxL,QAAQnU,MAAM,uBAAuB+D,EAAE4b,OAAO,KAAIpf,KAAKuV,UAAU/R,GAAG,UAExFnD,IAAXmD,EAAE49B,MAAsBphC,KAAKk/B,uBAAuB17B,EAAE49B,MAI1D,IAFA,IAAMC,EAAsB,GAEnBh/B,EAAI,EAAGA,EAAImB,EAAE89B,WAAWt/B,OAAQK,IAAK,CAC5C,IAAMk/B,EAAO/9B,EAAE89B,WAAWj/B,GAErBrC,KAAKkhC,kBAAkBK,IAC1B3tB,QAAQnU,MAAO,qBAAoB8hC,EAAK,KAAIvhC,KAAKuV,UAAU/R,GAAG,KAEhE,IAAMg+B,EAAQ,IAAIC,GAElBD,EAAMvgC,OAAOsgC,EAAK9oB,UAClB4oB,EAAUz9B,KAAK49B,EACjB,CAEA,IAAK,IAAIn/B,EAAI,EAAGA,EAAIg/B,EAAUr/B,OAAQK,IAAK,CACzC,IAAMq/B,EAASL,EAAUh/B,EAAI,GACvBs/B,EAASN,EAAUh/B,GAEpBq/B,EAAOE,OAAOD,IACjB/tB,QAAQnU,MAAM,0BAA0BO,KAAKuV,UAAUmsB,GAAQ,KAAI1hC,KAAKuV,UAAUosB,GAAQ,KAAI3hC,KAAKuV,UAAU/R,GAAG,IAEpH,CAEKxD,KAAK08B,kBAAkBl5B,EAAEq+B,OAASjuB,QAAQnU,MAAM,qBAAqB+D,EAAEq+B,KAAK,KAAI7hC,KAAKuV,UAAU/R,GAAG,IACzG,EAMAy4B,EAAO6F,yBAAP,SAAiCt+B,GAC1BxD,KAAK+8B,YAAYv5B,EAAE4b,SAAWxL,QAAQnU,MAAM,yBAAyB+D,EAAE4b,OAAO,KAAIpf,KAAKuV,UAAU/R,GAAG,KACpGxD,KAAKm8B,iBAAiB34B,EAAEu+B,SAAWnuB,QAAQnU,MAAM,yBAAyB+D,EAAEu+B,OAAO,KAAI/hC,KAAKuV,UAAU/R,GAAG,KACzGxD,KAAKs8B,cAAc94B,EAAEye,OAASrO,QAAQnU,MAAM,uBAAuB+D,EAAEye,KAAK,KAAIjiB,KAAKuV,UAAU/R,GAAG,OAChGxD,KAAKs8B,cAAc94B,EAAE2e,MAAQ3e,EAAE2e,KAAO3e,EAAEye,OAAQrO,QAAQnU,MAAM,sBAAsB+D,EAAE2e,IAAI,KAAIniB,KAAKuV,UAAU/R,GAAG,KAChHxD,KAAKs8B,cAAc94B,EAAE6e,MAAQzO,QAAQnU,MAAM,sBAAsB+D,EAAE6e,IAAI,KAAIriB,KAAKuV,UAAU/R,GAAG,KAC7FxD,KAAKo8B,cAAc54B,EAAEqtB,WAAajd,QAAQnU,MAAM,2BAA2B+D,EAAEqtB,SAAS,KAAI7wB,KAAKuV,UAAU/R,GAAG,IACnH,EAMAy4B,EAAO+F,wBAAP,SAAgCx+B,GACV,gBAAhBA,EAAE2sB,WACCnwB,KAAK+8B,YAAYv5B,EAAE4b,SAAWxL,QAAQnU,MAAM,wBAAwB+D,EAAE4b,OAAO,KAAIpf,KAAKuV,UAAU/R,GAAG,KACnGxD,KAAKu9B,kBAAkB/5B,EAAEysB,QAAUrc,QAAQnU,MAAM,uBAAuB+D,EAAEysB,MAAM,KAAIjwB,KAAKuV,UAAU/R,GAAG,KACtGxD,KAAKu8B,iBAAiB/4B,EAAE0sB,YAActc,QAAQnU,MAAM,2BAA2B+D,EAAE0sB,UAAU,KAAIlwB,KAAKuV,UAAU/R,GAAG,MAC7F,UAAhBA,EAAE2sB,WACNnwB,KAAK+8B,YAAYv5B,EAAE4b,SAAWxL,QAAQnU,MAAM,wBAAwB+D,EAAE4b,OAAO,KAAIpf,KAAKuV,UAAU/R,GAAG,KACnGxD,KAAKu9B,kBAAkB/5B,EAAEysB,QAAUrc,QAAQnU,MAAM,uBAAuB+D,EAAEysB,MAAM,KAAIjwB,KAAKuV,UAAU/R,GAAG,KACtGxD,KAAKu8B,iBAAiB/4B,EAAE0sB,YAActc,QAAQnU,MAAM,2BAA2B+D,EAAE0sB,UAAU,KAAIlwB,KAAKuV,UAAU/R,GAAG,KACjHxD,KAAKu8B,iBAAiB/4B,EAAE4sB,QAAUxc,QAAQnU,MAAM,uBAAuB+D,EAAE4sB,MAAM,KAAIpwB,KAAKuV,UAAU/R,GAAG,MACjF,SAAhBA,EAAE2sB,WACNnwB,KAAK+8B,YAAYv5B,EAAE4b,SAAWxL,QAAQnU,MAAM,wBAAwB+D,EAAE4b,OAAO,KAAIpf,KAAKuV,UAAU/R,GAAG,KACnGxD,KAAKu9B,kBAAkB/5B,EAAEysB,QAAUrc,QAAQnU,MAAM,uBAAuB+D,EAAEysB,MAAM,KAAIjwB,KAAKuV,UAAU/R,GAAG,KACtGxD,KAAKu8B,iBAAiB/4B,EAAE0sB,YAActc,QAAQnU,MAAM,2BAA2B+D,EAAE0sB,UAAU,KAAIlwB,KAAKuV,UAAU/R,GAAG,KACjHxD,KAAKu8B,iBAAiB/4B,EAAE4sB,QAAUxc,QAAQnU,MAAM,uBAAuB+D,EAAE4sB,MAAM,KAAIpwB,KAAKuV,UAAU/R,GAAG,KACrGxD,KAAKu8B,iBAAiB/4B,EAAE6sB,iBAAmBzc,QAAQnU,MAAM,gCAAgC+D,EAAE6sB,eAAe,KAAIrwB,KAAKuV,UAAU/R,GAAG,KAChIxD,KAAKu8B,iBAAiB/4B,EAAE8sB,iBAAmB1c,QAAQnU,MAAM,gCAAgC+D,EAAE8sB,eAAe,KAAItwB,KAAKuV,UAAU/R,GAAG,MAC5G,YAAhBA,EAAE2sB,WACNnwB,KAAK+8B,YAAYv5B,EAAE4b,SAAWxL,QAAQnU,MAAM,wBAAwB+D,EAAE4b,OAAO,KAAIpf,KAAKuV,UAAU/R,GAAG,KACnGxD,KAAKu9B,kBAAkB/5B,EAAEysB,QAAUrc,QAAQnU,MAAM,uBAAuB+D,EAAEysB,MAAM,KAAIjwB,KAAKuV,UAAU/R,GAAG,KACtGxD,KAAKu8B,iBAAiB/4B,EAAE0sB,YAActc,QAAQnU,MAAM,2BAA2B+D,EAAE0sB,UAAU,KAAIlwB,KAAKuV,UAAU/R,GAAG,MAEtHoQ,QAAQnU,MAAM,sBAAsBO,KAAKuV,UAAU/R,GAAG,IAE1D,EAMAy4B,EAAOgG,yBAAP,SAAiCz+B,cAC1BxD,KAAKy8B,aAAaj5B,EAAE0+B,aAAetuB,QAAQnU,MAAM,6BAA6B+D,EAAE0+B,WAAW,KAAIliC,KAAKuV,UAAU/R,GAAG,KACjHxD,KAAKu8B,iBAAiB/4B,EAAE0sB,YAActc,QAAQnU,MAAM,4BAA4B+D,EAAE0sB,UAAU,KAAIlwB,KAAKuV,UAAU/R,GAAG,KAClHxD,KAAKu8B,iBAAiB/4B,EAAE2+B,uBAAyBvuB,QAAQnU,MAAM,uCAAuC+D,EAAE2+B,qBAAqB,KAAIniC,KAAKuV,UAAU/R,GAAG,KAExJ,IAAMzB,EAAIyB,EAAE4+B,sBAEF/hC,IAAN0B,GACG2G,MAAMK,QAAQhH,IAAkB,GAAZA,EAAEC,QAAe4R,QAAQnU,MAAO,mCAAkCsC,EAAE,KAAI/B,KAAKuV,UAAU/R,GAAG,KACnHzB,EAAEgQ,SAAQvO,SAAAA,GACHsN,EAAKssB,UAAU55B,IAAmBoQ,QAAQnU,MAAM,mCAAmCsC,EAAE,KAAI+O,EAAKyE,UAAU/R,GAAG,IAClH,UAC4BnD,IAAnBmD,EAAEsd,aACN9gB,KAAKy9B,aAAaj6B,EAAEsd,eAAiBlN,QAAQnU,MAAM,+BAA+B+D,EAAEsd,aAAa,KAAI9gB,KAAKuV,UAAU/R,GAAG,KAE5HoQ,QAAQnU,MAAM,qEAAqEO,KAAKuV,UAAU/R,GAAG,KAElGxD,KAAKy9B,aAAaj6B,EAAEud,gBAAkBnN,QAAQnU,MAAM,gCAAgC+D,EAAEud,cAAc,KAAI/gB,KAAKuV,UAAU/R,GAAG,KAC1HxD,KAAKs8B,cAAc94B,EAAE6+B,oBAAsBzuB,QAAQnU,MAAM,oCAAoC+D,EAAE6+B,kBAAkB,KAAIriC,KAAKuV,UAAU/R,GAAG,KACvIxD,KAAKs8B,cAAc94B,EAAE8+B,mBAAqB1uB,QAAQnU,MAAM,mCAAmC+D,EAAE8+B,iBAAiB,KAAItiC,KAAKuV,UAAU/R,GAAG,KACrIxD,KAAKuiC,KAAK/+B,EAAE8+B,kBAAoB9+B,EAAE6+B,mBACpCzuB,QAAQnU,MAAM,yDAAyDO,KAAKuV,UAAU/R,GAAG,IAE7F,EAOAy4B,EAAOuG,2BAAP,SAAmCh/B,GACjC,OAAKxD,KAAKu8B,iBAAiB/4B,EAAEi/B,MAKxBziC,KAAK68B,kBAAkBr5B,EAAEk/B,OAKzB1iC,KAAK68B,kBAAkBr5B,EAAEm/B,QAKzB3iC,KAAKy+B,cAAcj7B,EAAE8E,QAKrBtI,KAAK0+B,gBAAgBl7B,EAAEo/B,iBAC1BhvB,QAAQnU,MAAO,+BAA8B+D,EAAEo/B,cAAc,KAAI5iC,KAAKuV,UAAU/R,KAEzE,IAPPoQ,QAAQnU,MAAO,sBAAqB+D,EAAE8E,KAAK,KAAItI,KAAKuV,UAAU/R,KAEvD,IAPPoQ,QAAQnU,MAAO,uBAAsB+D,EAAEm/B,OAAO,KAAI3iC,KAAKuV,UAAU/R,KAE1D,IAPPoQ,QAAQnU,MAAO,uBAAsB+D,EAAEk/B,MAAM,KAAI1iC,KAAKuV,UAAU/R,KAEzD,IAPPoQ,QAAQnU,MAAO,sBAAqB+D,EAAEi/B,KAAK,KAAIziC,KAAKuV,UAAU/R,KAEvD,EAwBX,EAMAy4B,EAAO4G,uBAAP,SAA+Br/B,cACxBxD,KAAK48B,iBAAiBp5B,EAAE2F,OAASyK,QAAQnU,MAAM,0BAA0B+D,EAAE2F,KAAK,KAAInJ,KAAKuV,UAAU/R,GAAG,KACtGkF,MAAMK,QAAQvF,EAAEs/B,SAAWlvB,QAAQnU,MAAM,4BAA4B+D,EAAEs/B,OAAO,KAAI9iC,KAAKuV,UAAU/R,GAAG,KACzGA,EAAEs/B,OAAO/wB,SAAQnP,SAAAA,GACVkO,EAAK0xB,2BAA2B5/B,IAAMgR,QAAQnU,MAAM,2BAA2BmD,EAAE,KAAIkO,EAAKyE,UAAU/R,GAAG,IAC9G,GACF,EAMAy4B,EAAO8G,kBAAP,SAA0Bv/B,cACnBxD,KAAKm8B,iBAAiB34B,EAAEkf,YAAc9O,QAAQnU,MAAM,0BAA0B+D,EAAEkf,UAAU,KAAI1iB,KAAKuV,UAAU/R,GAAG,UAChGnD,IAAjBmD,EAAEw/B,aACCt6B,MAAMK,QAAQvF,EAAEw/B,aAAepvB,QAAQnU,MAAM,2BAA2B+D,EAAEw/B,WAAW,KAAIhjC,KAAKuV,UAAU/R,GAAG,KAChHA,EAAEw/B,WAAWjxB,SAAQkxB,SAAAA,GAAUnyB,EAAK+xB,uBAAuBI,EAAO,SAC9C5iC,IAAhBmD,EAAEkf,YACAlf,EAAEkf,WAAa,GAAKlf,EAAEkf,WAAalf,EAAEw/B,WAAWhhC,SAAU4R,QAAQnU,MAAM,2BAA2B+D,EAAEw/B,WAAW,KAAIhjC,KAAKuV,UAAU/R,GAAG,KAGhJ,EAOAy4B,EAAO1mB,UAAP,SAAkB2tB,GAChB,IAAMC,EAAqC,CAAA,EAE3C,IAAK,IAAMC,KAAQF,EAIJ,aAATE,GAIyB,mBAAjBF,EAAOE,KAGfF,EAAAA,EAAOE,GAAiBxZ,IAIxBsZ,EAAAA,EAAOE,GAAiB1qB,GAH1ByqB,EAAaC,GAAQF,EAAOE,GAAMj6B,KAOhC+5B,EAAAA,EAAOE,GAAiBC,KAG5BF,EAAaC,GAAQF,EAAOE,KAG9B,OAAO9tB,KAAKC,UAAU4tB,EACxB,EAOAlH,EAAOsG,KAAP,SAAaj9B,GAGX,IAFA,IAAI6I,EAAM,EAEH7I,KAAU,GAAK6I,GAAO,EAE7B,OAAOA,CACT,EA/uBW8tB,CAgvBZ,CAhvBW,GAqvBLqH,GAAK,WAACA,SAAAA,EAUEz9B,GACX7F,KAAK6F,KAAOA,EACZ7F,KAAKkE,KAAO,IAAIwO,YAAY7M,GAZnBy9B,OAAAA,EAAAA,UAoBXl2B,IAAAA,SAAKm2B,EAA2BC,GAC9B,IAAK,IAAInhC,EAAI,EAAGA,EAAIkhC,EAAOvhC,OAAQK,IACjCrC,KAAKkE,KAAK7B,EAAImhC,GAAcC,GAAOF,EAAOlhC,GAE9C,EAxBWihC,GAAAA,EAAAA,EA6BPI,IAAAA,YAAJ,WACE,OAAmB,EAAZ1jC,KAAK6F,IACd,KA/BWy9B,CAgCZ,CAhCW,GAkCNG,IAEE7U,GAAY,IAAIjpB,aAAa,GAC7BkpB,GAAY,IAAIhc,WAAW+b,GAAU+U,QAKpC,SAAiBn2B,GAEtBohB,GAAU,GAAKphB,EACf,IAAMC,EAAIohB,GAAU,GAEhB+U,EAAQn2B,GAAK,GAAM,MACnBo2B,EAAKp2B,GAAK,GAAM,KACd5J,EAAK4J,GAAK,GAAM,IAItB,OAAI5J,EAAI,IACC+/B,EAIL//B,EAAI,KACN+/B,GAAQ,MAGRA,IAAe,KAAL//B,EAAY,EAAI,IAAW,QAAJ4J,GAM/B5J,EAAI,IAIN+/B,KAHAC,GAAK,OAGU,IAAMhgC,IAAOggC,GAAO,IAAMhgC,EAAM,IAKjD+/B,GAAQ//B,EAAM,KAAQ,GAAOggC,GAAK,EAGlCD,GAAY,EAAJC,EAGV,ICh2EUC,SAAAA,0EAAAA,CAAAA,KAAAA,GAAAA,CAAAA,IASL,UAAAC,GAAK,SAALxzB,GAAMwzB,SAAAA,kDAQX3E,SAAW,EAGVtuB,EACDkzB,UAAuB,GAGtBlzB,EACDuuB,oBAAiC,GAGhCvuB,EACDmzB,kBAA+B,GAI/BC,EAAAA,gBAAAA,EAGCpzB,EACDqzB,cAAgB,IA5BLJ,EAAAA,EAAAA,GAAAA,IAAAA,EAAAA,EAAAA,UAAAA,OAoCX9iC,EAAAA,OAAAA,SAAQqJ,EAAkBsN,EAAgBwsB,EAAuBD,GACnD75B,IAAAA,EAAZtK,KAAKmJ,YAAOmB,EAAAA,EAAM+5B,cAAN/5B,EAAsB,eAClCtK,KAAKoI,KAAO6C,EAAYm2B,KAExBphC,KAAKokC,aAAeA,EACpBpkC,KAAKo/B,UAAY,EACjBp/B,KAAKgkC,UAAYhkC,KAAKskC,cAAch6B,EAAO85B,GAC3CpkC,KAAKmkC,cAAgBx8B,KAAK8b,IAAI0gB,EAAenkC,KAAKgkC,UAAUhiC,QAC5DhC,KAAKikC,kBAAoB,GAEzBjkC,KAAKq/B,oBAAsB,GAE3Br/B,KAAKkkC,gBAAkBlkC,KAAKukC,mBAAmBvkC,KAAKmkC,cAAevsB,GACnE,IAAM4sB,EAAUl6B,EAAM+0B,oBAEtB,QAAgBh/B,IAAZmkC,GAAyBA,EAAQxiC,OAAS,EAAG,CAC/C,GAAIwiC,EAAQxiC,OAAS,IAAO,GAAKwiC,EAAQxiC,SAAmC,GAAxBhC,KAAKgkC,UAAUhiC,OACjE,MAAM,IAAIwY,MAAM,8CAA8CgqB,EAAQxiC,OAAO,iBAAgBhC,KAAKgkC,UAAUhiC,OAAO,KAKrH,IAFA,IAAMyiC,EAAcD,EAAQxiC,OAAS,GAE5BK,EAAI,EAAGA,EAAIoiC,EAAapiC,IAAK,CACpC,IAAMyK,EAAMlD,GAAQyE,UAAUm2B,EAAa,GAAJniC,GAEvCrC,KAAKq/B,oBAAoBz7B,KAAKkJ,EAChC,CACF,CACF,EAKA43B,EAAAA,mBAAAA,sBACE1kC,KAAKikC,kBAAoB,GAEzB,IAAK,IAAI5hC,EAAI,EAAGA,EAAIrC,KAAKgkC,UAAUhiC,OAAQK,IAAK,CAC9C,IASMsiC,EATO3kC,KAAKgkC,UAAU3hC,GASVwK,UAAUL,iBAE5BxM,KAAKikC,kBAAkBrgC,KAAK+gC,EAAK9e,QACnC,CAEI7lB,KAAKikC,kBAAkBjiC,SAAWhC,KAAKq/B,oBAAoBr9B,OAC7DhC,KAAKikC,kBAAkBlyB,SAAQ,SAACjF,EAAKxH,GACnCwH,EAAIoZ,SAASpV,EAAKuuB,oBAAoB/5B,GACxC,KAEAtF,KAAKikC,kBAAoBjkC,KAAKq/B,oBAC9BzrB,QAAQnU,MAAM,gFAElB,EAQAmlC,EAAAA,wBAAAA,SAAyBtkB,EAAsBukB,EAA0BC,GACvE,IAAMC,EAAqBzkB,EAAYuF,QAAQjX,SACzCo2B,EAAa,IAAIp7B,GAEvB5J,KAAKikC,kBAAkBlyB,SAAQ,SAACjF,EAAKzK,GACnC,IAAM4iC,EAAcD,EAAWE,iBAAiBH,EAAoBj4B,GAEpEm4B,EAAY/1B,SAAS6C,SAAQ,SAACtE,EAAGssB,GAAM8K,OAAAA,EAAe,GAAJxiC,EAAS03B,GAAKtsB,KAE9Cw3B,EAAYpf,QAAQjX,SAASijB,YAErC3iB,SAAS6C,SAAQ,SAACtE,EAAGssB,GAAM+K,OAAAA,EAAkB,GAAJziC,EAAS03B,GAAKtsB,IACnE,GACF,EAMA03B,EAAAA,iBAAAA,SAAkBC,GAChBplC,KAAKokC,aAAegB,CACtB,EAMAC,EAAAA,cAAAA,WACE,OAAOrlC,KAAKgkC,UAAUhiC,MACxB,EAMAsjC,EAAAA,kBAAAA,WACE,OAA2B,IAApBtlC,KAAKkkC,eACd,EAKA7+B,EAASD,QAAT,WACEpF,KAAKokC,kBAAe/jC,EACpBL,KAAKgkC,UAAY,GACjBhkC,KAAKq/B,oBAAsB,GAC3Br/B,KAAKikC,kBAAoB,EAC3B,EAEA5+B,EAAQk/B,mBAAR,SAA4BgB,EAAoB3tB,GAC9C,IACM2W,EAAS3W,EAAOvC,cAAckZ,OAC9BiX,EAAyBjX,EAAOkX,kBAFE,GAKxC,GAA4BF,EAAa59B,KAAK+9B,MAAMF,EAFnB,GAEuE,CAEtG,GAAIjX,EAAOC,aACT,OAAA,EACK,GAAID,EAAOG,iBAChB,OAAA,EAEA,MAAM,IAAIlU,MAAM,wBAAwB+qB,EAAW,qCAGrD,OAAA,CAEJ,EAEAlgC,EAAQi/B,cAAR,SAAuBh6B,EAAkB85B,GAKvC95B,IAAAA,EAJMq7B,EAAY3lC,KAAK4lC,YAAYxB,GAE7ByB,EAAwB,GAW9B,OATe,OAAfv7B,EAAAA,EAAMw7B,YAANx7B,EAAiByH,SAAQg0B,SAAAA,GACvB,IAAMtD,EAAOkD,EAAUI,GAEvB,IAAKtD,EACH,MAAM,IAAIjoB,MAAM,gCAAgCurB,EAAS,KAE3DF,EAAWjiC,KAAK6+B,EAClB,IAEOoD,CACT,EAEAxgC,EAAQugC,YAAR,SAAqBnD,GACnB,IAAMkD,EAAqC,CAAA,EACrCK,EAAqB,GAE3BL,EAAU,IAAMlD,EAChB,IAAoBA,IAAenf,EAAfmf,EAAAA,EAAAA,EAAKtd,YAAU7B,EAAAI,KAAAhkB,MAAA,CAAxB0lB,IAAAA,EAAAA,EAAAA,MACTplB,KAAKimC,eAAe7gB,EAAO4gB,EAAUL,EACvC,CAEA,OAAOA,CACT,EAEAtgC,EAAQ4gC,eAAR,SAAwBxD,EAAeuD,EAAoBL,GACzDK,EAASpiC,KAAK6+B,EAAKt5B,MACnBw8B,EAAUK,EAAS1xB,KAAK,MAAQmuB,EAChC,IAAoBA,IAAenf,EAAfmf,EAAAA,EAAAA,EAAKtd,YAAU7B,EAAAI,KAAAhkB,MAAA,CAAxB0lB,IAAAA,EAAAA,EAAAA,MACTplB,KAAKimC,eAAe7gB,EAAO4gB,EAAUL,EACvC,CACAK,EAASriC,KACX,EAhNWogC,EAAD,CAAexzB,IAyNpBkxB,GAAK,SAALlxB,GAAMkxB,SAAAA,kDAKXyE,mBAAqB,EAIpBp1B,EACDq1B,kBAA8B,GAG7Br1B,EACDs1B,kBAAmB,EAGlBt1B,EACDu1B,gBAAiB,EAGhBv1B,EACDw1B,iBAAkB,IAtBP7E,EAAAA,EAAAA,GAAAA,IAAAA,EAAAA,EAAAA,UAAAA,OA6BXxgC,EAAAA,OAAAA,SAAQwX,cACNzY,KAAKmJ,KAAOnJ,KAAK0Q,QAAQ,gBACzB1Q,KAAKoI,KAAO6C,EAAYu2B,MAGxB,IAAM+E,EAAgBvmC,KAAKwmC,uBAAuB/E,EAAOgF,iBAAkBhuB,GACrEiuB,EAAc1mC,KAAKwmC,uBAAuB/E,EAAOkF,eAAgBluB,GACjEmuB,EAAe5mC,KAAKwmC,uBAAuB/E,EAAOoF,gBAAiBpuB,GACnEquB,EAAsB,CAACP,EAAeG,EAAaE,GA4BzD,OAzBA5mC,KAAKkmC,mBAAqB,EAC1BY,EAAU/0B,SAAQg1B,SAAAA,GACZA,EAAQ,IACsB,IAA5Bj2B,EAAKo1B,mBACPp1B,EAAKo1B,mBAAqBa,EAE1Bj2B,EAAKo1B,mBAAqBv+B,KAAK6e,IAAI1V,EAAKo1B,mBAAoBa,GAGlE,IAEI/mC,KAAKkmC,mBAAqB,IAE5BlmC,KAAKmmC,kBAAoBz9B,MAAM1I,KAAKkmC,oBAAoBc,KAAK,GAC7DhnC,KAAKomC,iBAAmBG,GAAiBvmC,KAAKkmC,mBAC9ClmC,KAAKqmC,eAAiBK,GAAe1mC,KAAKkmC,mBAC1ClmC,KAAKsmC,gBAAkBM,GAAgB5mC,KAAKkmC,oBAS1CK,EAAgB,GAAKA,GAAiBvmC,KAAKkmC,oBAC7CtyB,QAAQnU,MAAM,kCAAkCO,KAAKkmC,mBAAmB,KAAIK,EAAc,MAEnF,GAGLG,EAAc,GAAKA,GAAe1mC,KAAKkmC,oBACzCtyB,QAAQnU,MAAM,gCAAgCO,KAAKkmC,mBAAmB,KAAIQ,EAAY,MAE/E,GAGLE,EAAe,GAAKA,GAAgB5mC,KAAKkmC,oBAC3CtyB,QAAQnU,MAAM,iCAAiCO,KAAKkmC,mBAAmB,KAAIU,EAAa,MAEjF,KAGL5mC,KAAKkmC,mBAAqB,KAC5BtyB,QAAQnU,MAAO,0DAAyDO,KAAKkmC,mBAAmB,MAEzF,EAIX,EAMAe,EAAAA,YAAAA,SAAaC,GACX,GAAsC,IAAlClnC,KAAKmmC,kBAAkBnkC,OAA3B,CAIA,IAAMib,EAAejd,KAAKmmC,kBAE1Be,EAAQn1B,SAAQ,SAACvE,EAAKlI,GAChBA,EAAQ2X,EAAajb,SACvBib,EAAa3X,GAASkI,EAE1B,GARA,CASF,EAEA25B,EAAAA,cAAAA,SAAeD,cACTA,EAAQllC,QAAUhC,KAAKmmC,kBAAkBnkC,OAM7CklC,EAAQn1B,SAAQ,SAACvS,EAAO8F,UAAUwL,EAAKq1B,kBAAkB7gC,GAAS9F,KALhEoU,QAAQnU,MAAM,2CAA2CynC,EAAQllC,OAAO,cAAahC,KAAKmmC,kBAAkBnkC,OAAO,IAMvH,EAOAolC,EAAAA,SAAAA,WACE,OAAOpnC,KAAKkmC,mBAAqB,IAAMlmC,KAAKomC,kBAAoBpmC,KAAKqmC,gBAAkBrmC,KAAKsmC,gBAC9F,EAQA1E,EAAAA,OAAAA,SAAQJ,GACN,OAAOxhC,KAAKkmC,qBAAuB1E,EAAM0E,oBACpClmC,KAAKomC,mBAAqB5E,EAAM4E,kBAChCpmC,KAAKqmC,iBAAmB7E,EAAM6E,gBAC9BrmC,KAAKsmC,kBAAoB9E,EAAM8E,eACtC,EAEAe,EAAAA,qBAAAA,WACE,OAAOrnC,KAAKmmC,iBACd,EASAK,EAAAA,uBAAAA,SAAwBc,EAA6B7uB,GACnD,IAAK,IAAIpW,EAAI,EAAGA,EAAIilC,EAAkBtlC,OAAQK,IAAK,CACjD,IAAMmL,EAAM85B,EAAkBjlC,GAE9B,QAAuChC,IAAnCoY,EAAS2gB,iBAAiB5rB,GAC5B,OAAOnL,CAEX,CAGA,OAAOilC,EAAkBtlC,MAC3B,EApKWy/B,EAAD,CAAgBlxB,IAAfkxB,GAyKIgF,iBAAmB,CAChC,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,oBAjLShF,GAuLIkF,eAAiB,CAC9B,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,kBA/LSlF,GAqMIoF,gBAAkB,CAC/B,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,kBACA,mBAOQU,SAAAA,8EAAAA,CAAAA,KAAAA,GAAAA,CAAAA,IASAC,SAAAA,6GAAAA,CAAAA,KAAAA,GAAAA,CAAAA,IAUL,IAAAC,GAAK,WAACA,SAAAA,EAQE7vB,QAAQA,OAAAA,OAPb8vB,aAAc,OAEd/lB,MAAQ,OACRE,OAAS,EAJN4lB,IAAAA,EAAAA,EAAAA,UAAAA,OAgBXxmC,EAAAA,OAAAA,SAAQskC,EAAoBmC,EAAsBv+B,GASnC,IAAAw+B,EAAAC,EARb5nC,KAAK2hB,MAAQ,EACb3hB,KAAK6hB,OAAS0jB,EACdvlC,KAAK0nC,YAAcA,EAEf1nC,KAAK0nC,cACP1nC,KAAK2jC,OAAS,IAAIL,GAAqC,EAAjBtjC,KAAKygB,YAG7C,IAAMvc,SAAO0jC,EAAW,OAAXD,EAAA3nC,KAAK2jC,aAAM,EAAXgE,EAAazjC,MAAb0jC,EAAqB,IAAIjiC,aAA8B,EAAjB3F,KAAKygB,WAClDrY,EAAOpI,KAAK0nC,YAAczwB,EAAUE,WAAaF,EAAUgC,MAEjEjZ,KAAK+W,QAAU6S,EAAQ3oB,OACrBjB,KAAK4X,OACL,CACEzO,KAAAA,EACAjF,KAAM,CACJyd,MAAO3hB,KAAK2hB,MACZE,OAAQ7hB,KAAK6hB,OACb3d,KAAAA,GAEFtC,OAAQqV,EAAU6c,WAClB9c,OAAQC,EAAUC,KAClB9O,KAAAA,EACA2iB,MAAO9T,EAAU0X,cACjB1D,MAAOhU,EAAU0X,cACjBvX,UAAWH,EAAU4wB,QACrBtwB,UAAWN,EAAU4wB,SAE3B,EAMA72B,EAAAA,OAAAA,SAAQ2yB,GAWM,IAAAgE,EAAAC,QAVQvnC,IAAhBL,KAAK2jC,QACP3jC,KAAK2jC,OAAOv2B,IAAIu2B,EAAQ,QAGLtjC,IAAjBL,KAAK+W,UACP/W,KAAK+W,QAAQ+wB,aAAa,CACxBje,WAAYC,EAAkB5lB,KAC9BA,KAAM,CACJyd,MAAO3hB,KAAK2hB,MACZE,OAAQ7hB,KAAK6hB,OACb3d,KAAuB,OAAjB0jC,EAAA,OAAAD,EAAA3nC,KAAK2jC,aAAL,EAAAgE,EAAazjC,MAAb0jC,EAAqBjE,GAE7B/hC,OAAQqV,EAAU6c,YAIxB,EAKA1uB,EAAAA,QAAAA,WAIE,IAAA2iC,EAFA/nC,KAAK4X,OAAS,KACd5X,KAAK2jC,YAAStjC,EACF,OAAZ0nC,EAAA/nC,KAAK+W,UAALgxB,EAAc3iC,SAChB,EAMAqb,EAAAA,QAAAA,WACE,OAAOzgB,KAAK2hB,MAAQ3hB,KAAK6hB,MAC3B,EAMAuL,EAAAA,WAAAA,WACE,OAAOptB,KAAK+W,OACd,EA9FW0wB,CAgGZ,CAhGW,GC5aLO,GAAK,WAACA,SAAAA,IAcThoC,KAAKioC,QAAU,IAAIx0B,IACnBzT,KAAKioC,QAAQ76B,IAAIhC,GAAc8O,MAAOguB,IACtCloC,KAAKioC,QAAQ76B,IAAIhC,GAAc+O,IAAK+tB,IACpCloC,KAAKioC,QAAQ76B,IAAIhC,GAAcgP,WAAY8tB,IAC3CloC,KAAKioC,QAAQ76B,IAAIhC,GAAc+8B,aAAcD,IAC7CloC,KAAKioC,QAAQ76B,IAAIhC,GAAcg9B,UAAWF,IAC1CloC,KAAKioC,QAAQ76B,IAAIhC,GAAci9B,aAAcH,IAC7CloC,KAAKioC,QAAQ76B,IAAIhC,GAAckP,aAAc4tB,IArBpCF,OAAAA,EAAAA,UA6BXM,cAAAA,SAAevuB,GACb,IAAME,EAAeF,EAAQjC,SAASmC,aAChCsuB,EAAOvoC,KAAKioC,QAAQ5zB,IAAI4F,GAE9B,QAAa5Z,IAATkoC,EACF,OAAOA,EAAKxuB,GAEZ,MAAM,IAAIS,MAAO,yBAAwBP,EAAa,oBAAmBF,EAAQ,IAErF,EA9BAiuB,EAAOh4B,YAAP,WAEE,OAAOhQ,KAAKwoC,YAAcxoC,KAAKwoC,UAAY,IAAIxoC,KACjD,EAXWgoC,CAuCZ,CAvCW,GC5BLS,GAAK,SAALl4B,GAAek4B,SAAAA,kDAKpBxuB,aAA8B7O,GAAcwE,KAG3CkB,EACDkK,iBAAmB,GAGlBlK,EACDmK,mBAAqB,GAGpBnK,EACD43B,QAAS,EAGR53B,EACD63B,OAAQ,EAGP73B,EACD83B,WAA8Bn9B,EAAKo9B,WAAWC,OAG7Ch4B,EACDi4B,WAAY,EAGXj4B,EACDk4B,YAAc,GAGbl4B,EACDm4B,WAA8Bx9B,EAAKy9B,WAAWC,QArC1BV,EAAAA,EAAAA,GAAAA,IAAAA,EAAAA,EAAAA,UAAAA,OA2CpBW,EAAAA,kBAAAA,WACE,IAAMpvB,EAAwB,GAY9B,OAVIha,KAAKqpC,cACPrvB,EAAYpW,KAAK,oBACR5D,KAAKspC,YACdtvB,EAAYpW,KAAK,sBAGf5D,KAAKipC,aAAex9B,EAAKy9B,WAAWK,MACtCvvB,EAAYpW,KAAK,kBAGZoW,CACT,EAEAwvB,EAAAA,gBAAAA,WACE,IAAMC,EAAyB,GAY/B,OAVIzpC,KAAKqpC,cACPI,EAAU7lC,KAAK,CAAEuF,KAAM,mBACdnJ,KAAKspC,YACdG,EAAU7lC,KAAK,CAAEuF,KAAM,qBAGrBnJ,KAAKipC,aAAex9B,EAAKy9B,WAAWK,MACtCE,EAAU7lC,KAAK,CAAEuF,KAAM,iBAGlBsgC,CACT,EAMAC,EAAAA,eAAAA,SAAgB5xB,GAId,GAFmB3I,GAAaa,cAAcN,eAE3BjE,EAAKkE,aAAag6B,GAAI,CACvC,IAAMC,EAAkBz6B,GAAaa,cAAcH,uBAEnDiI,EAAS+xB,SAAS,mBAAoBD,EACxC,CACF,EAOArwB,EAAAA,MAAAA,SAAOuwB,GACL,IAAMC,EAAmB/pC,KAAKgqC,eAAeF,GACvC16B,EAAWD,GAAaa,cAAcZ,SAGtC66B,EADgBjC,GAAeh4B,cACFs4B,cAAc,CAC/CxwB,SAAU9X,KACVoP,SAAAA,EACA4K,YAAa+vB,IAGf/pC,KAAKgb,iBAAmBivB,EAAajvB,iBACrChb,KAAKib,mBAAqBgvB,EAAahvB,kBACzC,EAEA+uB,EAAAA,eAAAA,SAAgBF,GACd,IAGEC,EAHIA,EAAmB/pC,KAAKopC,yBAER/oC,IAAlBypC,IACFC,EAAAA,GAAiBnmC,KAAjBmmC,MAAAA,EAAyBD,GAAAA,OAAAA,IAKvB9pC,KAAKia,eAAiB7O,GAAcgP,aAClBjL,GAAaa,cAAcE,aAG7C65B,EAAiBnmC,KAAK,qBAI1B,OAAOmmC,CACT,EAEAG,EAAAA,aAAAA,SAAcC,GACZ,IAGEC,EAHIA,EAAiBpqC,KAAKwpC,uBAERnpC,IAAhB8pC,IACFC,EAAAA,GAAexmC,KAAfwmC,MAAAA,EAAuBD,GAAAA,OAAAA,IAKrBnqC,KAAKia,eAAiB7O,GAAcgP,aAClBjL,GAAaa,cAAcE,aAG7Ck6B,EAAexmC,KAAK,CAAEuF,KAAM,sBAIhC,OAAOihC,CACT,EAMA5a,EAAAA,kBAAAA,SAAmB1X,GACb9X,KAAK4oC,aAAen9B,EAAKo9B,WAAWwB,aACtCvyB,EAASuW,UAAW,EACpBvW,EAASQ,UAAYtY,KAAK2oC,MAC1B7wB,EAASS,UAAYvY,KAAK0oC,OAC1B5wB,EAASwyB,cAAgB,CAACrzB,EAAUszB,SAAUtzB,EAAUszB,UACxDzyB,EAAS0yB,cAAgB,CACvBvzB,EAAUwzB,IAAKxzB,EAAUyzB,oBACzBzzB,EAAUwzB,IAAKxzB,EAAUyzB,sBAGvBv7B,GAAaa,cAAcI,cAC7B0H,EAASuW,UAAW,EACpBvW,EAASQ,WAAY,EAErBR,EAASS,WAAY,IAErBT,EAASuW,UAAW,EACpBvW,EAASQ,UAAYtY,KAAK2oC,MAC1B7wB,EAASS,UAAYvY,KAAK0oC,QAI9B1oC,KAAK2qC,kBAAkB7yB,EACzB,EAEAzS,EAAUslC,kBAAV,SAA6B7yB,GACvB9X,KAAK4qC,aACP9yB,EAAS+yB,SAAU,EACV7qC,KAAK8qC,cACdhzB,EAASizB,SAAW9zB,EAAUunB,MAC9B1mB,EAASkzB,UAAY/zB,EAAUg0B,IAC/BnzB,EAAS+yB,SAAU,IAEnB/yB,EAASizB,SAAW9zB,EAAUqnB,KAC9BxmB,EAASkzB,UAAY/zB,EAAUg0B,IAC/BnzB,EAAS+yB,SAAU,EAEvB,EAKAxlC,EAASD,QAAT,WACEpF,KAAKgb,iBAAmB,GACxBhb,KAAKib,mBAAqB,EAC5B,EAMA5V,EAASoL,QAAT,WACE,OAAOzQ,KAAKia,eAAiB7O,GAAcwE,MAAQW,YAAME,QAAD/M,KAAA1D,KAC1D,EAMAspC,EAAAA,SAAAA,WACE,OAAOtpC,KAAK4oC,aAAen9B,EAAKo9B,WAAWC,MAC7C,EAMAO,EAAAA,YAAAA,WACE,OAAOrpC,KAAK+oC,SACd,EAMAmC,EAAAA,cAAAA,WACE,OAAOlrC,KAAK4oC,aAAen9B,EAAKo9B,WAAWwB,WAC7C,EAMAc,EAAAA,YAAAA,WACE,OAAOnrC,KAAKipC,aAAex9B,EAAKy9B,WAAWC,KAC7C,EAMA2B,EAAAA,WAAAA,WACE,OAAO9qC,KAAKipC,aAAex9B,EAAKy9B,WAAWkC,IAC7C,EAMAR,EAAAA,WAAAA,WACE,OAAO5qC,KAAKipC,aAAex9B,EAAKy9B,WAAWK,IAC7C,EAhQoBd,EAAV,CAAgCl4B,IAsQrC86B,GAAK,SAAL5C,GAAM4C,SAAAA,kDAYX5L,gBAAyB,IAAI51B,GAAM,EAAG,EAAG,EAAG,KAZjCwhC,EAAAA,EAAAA,GAAAA,IAAAA,EAAAA,EAAAA,UAAAA,OAkBXpqC,EAAAA,OAAAA,SAAQ6W,GAMkBA,IAAAA,EAEDA,EAILA,EAECA,EACDA,EAdlB9X,KAAKsrC,eAAiBxzB,EACtB9X,KAAKmJ,KAAO2O,EAAS3O,KACrBnJ,KAAKoI,KAAO6C,EAAY6M,SACxB9X,KAAKia,aAAe7O,GAAc8O,MAElCla,KAAK0/B,iBAAuC,OAApB5nB,EAAAA,EAASsV,WAAW,sBAApBtV,OAA4CzX,EACpEL,KAAKurC,sBAAwBzb,GAAasB,kBAAkBtZ,EAAU,uBAAwB,sBAC9F9X,KAAKy/B,gBAAoC,OAAlB3nB,EAAAA,EAAS0zB,SAAS,qBAAlB1zB,EAAyC,IAAIjO,GAAM,EAAK,EAAK,EAAK,GAEzF7J,KAAK0oC,OAAyC,IAAhC5wB,EAAS4Z,SAAS,UAChC1xB,KAAK2oC,MAAuC,IAA/B7wB,EAAS4Z,SAAS,SAC/B1xB,KAAK4oC,WAAa9wB,OAAAA,EAAAA,EAAS2zB,WAAW,YAApB3zB,EAAwDrM,EAAKo9B,WAAWC,OAC1F9oC,KAAK+oC,UAA+C,IAAnCjxB,EAAS4Z,SAAS,aACnC1xB,KAAKgpC,YAAgC,OAAlBlxB,EAAAA,EAAS4Z,SAAS,iBAAlB5Z,EAAqC,EACxD9X,KAAKipC,WAAanxB,OAAAA,EAAAA,EAAS2zB,WAAW,YAApB3zB,EAAwDrM,EAAKy9B,WAAWC,KAC5F,EAKA9jC,EAASD,QAAT,WACEqjC,EAAAznC,UAAMoE,QAAD1B,KAAA1D,MACLA,KAAK0/B,sBAAmBr/B,CAC1B,EAMAgF,EAAS+jC,kBAAT,WACE,IAAMpvB,EAAcyuB,YAAMW,kBAAD1lC,KAAA1D,MASzB,OAPAga,EAAYpW,KAAK,gCACb5D,KAAK0rC,uBACP1xB,EAAYpW,KAAK,wBAGnBoW,EAAYpW,KAAK,oBAEVoW,CACT,EAEA3U,EAASmkC,gBAAT,WACE,IAAMC,EAAYhB,YAAMe,gBAAD9lC,KAAA1D,MASvB,OAPAypC,EAAU7lC,KAAK,CAAEuF,KAAM,+BACnBnJ,KAAK0rC,uBACPjC,EAAU7lC,KAAK,CAAEuF,KAAM,uBAGzBsgC,EAAU7lC,KAAK,CAAEuF,KAAM,mBAEhBsgC,CACT,EAMApkC,EAASqkC,eAAT,SAAyB5xB,GACvB2wB,EAAAznC,UAAM0oC,eAAe5xB,KAAAA,KAAAA,QAESzX,IAA1BL,KAAK0/B,mBACP5nB,EAAS6zB,OAAO,kBAAmB,GACnC7zB,EAAS8zB,WAAW,wBAAyB5rC,KAAKurC,wBAGpDzzB,EAAS+xB,SAAS,kBAAmB,GACrC/xB,EAAS+xB,SAAS,mBAAoB,GAEtC/xB,EAAS+xB,SAAS,YAAa,EACjC,EAMA6B,EAAAA,oBAAAA,WACE,YAAiCrrC,IAA1BL,KAAK0/B,gBACd,EAMAmM,EAAAA,oBAAAA,WACE,OAAO7rC,KAAK0/B,gBACd,EAMAoM,EAAAA,oBAAAA,SAAqBt+B,GACnBxN,KAAK0/B,iBAAmBlyB,CAC1B,EAMAu+B,EAAAA,mBAAAA,WACE,OAAO/rC,KAAKy/B,eACd,EAMAuM,EAAAA,mBAAAA,SAAoBx+B,GACXnM,EAAHmM,EAAe3D,IAEjB7J,KAAKy/B,gBAAgBryB,IAAII,EAAIvL,EAAGuL,EAAItK,EAAGsK,EAAIsa,EAAGta,EAAIqa,GACtCxmB,EAAHmM,EAAe9D,IAExB1J,KAAKy/B,gBAAgBryB,IAAII,EAAIC,EAAGD,EAAI7K,EAAG6K,EAAIE,EAAGF,EAAIM,GAGlD9N,KAAKy/B,gBAAgBryB,IAAII,EAAI,GAAIA,EAAI,GAAIA,EAAI,GAAIA,EAAI,GAEzD,EA3IW69B,EAAD,CAAwB5C,IAkJ7BwD,GAAK,SAALxD,GAAMwD,SAAAA,kDAYXxM,gBAAyB,IAAI51B,GAAM,EAAG,EAAG,EAAG,GAW3CiH,EACDivB,eAAgB,EAGfjvB,EACDkvB,eAAiB,EAGhBlvB,EACDmvB,gBAAkB,EAWjBnvB,EACDwvB,mBAAqB,EAWpBxvB,EACD4vB,yBAA2B,EAW1B5vB,EACD+vB,eAAwB,IAAIh3B,GAAM,EAAG,EAAG,EAAG,GAG1CiH,EACDgwB,kBAAoB,IAxETmL,EAAAA,EAAAA,GAAAA,IAAAA,EAAAA,EAAAA,UAAAA,OA8EXhrC,EAAAA,OAAAA,SAAQ6W,GAMkBA,IAAAA,EAEDA,EAESA,EAGVA,EACCA,EAEFA,EAEKA,EAEFA,EAEQA,EAETA,EAEDA,EACGA,EAIPA,EAECA,EACDA,EAjClB9X,KAAKsrC,eAAiBxzB,EACtB9X,KAAKmJ,KAAO2O,EAAS3O,KACrBnJ,KAAKoI,KAAO6C,EAAY6M,SACxB9X,KAAKia,aAAe7O,GAAc+O,IAElCna,KAAK0/B,iBAAuC,OAApB5nB,EAAAA,EAASsV,WAAW,sBAApBtV,OAA4CzX,EACpEL,KAAKurC,sBAAwBzb,GAAasB,kBAAkBtZ,EAAU,uBAAwB,sBAC9F9X,KAAKy/B,gBAAoC,OAAlB3nB,EAAAA,EAAS0zB,SAAS,qBAAlB1zB,EAAyC,IAAIjO,GAAM,EAAK,EAAK,EAAK,GAEzF7J,KAAKkgC,yBAA+C,OAApBpoB,EAAAA,EAASsV,WAAW,8BAApBtV,OAAoDzX,EACpFL,KAAKksC,8BAAgCpc,GAAasB,kBAAkBtZ,EAAU,+BAAgC,8BAC9G9X,KAAK+/B,cAAqD,IAArCjoB,EAAS4Z,SAAS,eACvC1xB,KAAKggC,eAAmC,OAAlBloB,EAAAA,EAAS4Z,SAAS,oBAAlB5Z,EAAwC,EAC9D9X,KAAKigC,gBAAoC,OAAlBnoB,EAAAA,EAAS4Z,SAAS,qBAAlB5Z,EAAyC,EAEhE9X,KAAKqgC,cAAoC,OAApBvoB,EAAAA,EAASsV,WAAW,mBAApBtV,OAAyCzX,EAC9DL,KAAKmsC,mBAAqBrc,GAAasB,kBAAkBtZ,EAAU,oBAAqB,mBACxF9X,KAAKsgC,mBAAuC,OAAlBxoB,EAAAA,EAAS4Z,SAAS,iBAAlB5Z,EAAqC,EAE/D9X,KAAKygC,iBAAuC,OAApB3oB,EAAAA,EAASsV,WAAW,sBAApBtV,OAA4CzX,EACpEL,KAAKosC,sBAAwBtc,GAAasB,kBAAkBtZ,EAAU,uBAAwB,sBAC9F9X,KAAK0gC,yBAA6C,OAAlB5oB,EAAAA,EAAS4Z,SAAS,uBAAlB5Z,EAA2C,EAE3E9X,KAAK+gC,gBAAsC,OAApBjpB,EAAAA,EAASsV,WAAW,qBAApBtV,OAA2CzX,EAClEL,KAAKqsC,qBAAuBvc,GAAasB,kBAAkBtZ,EAAU,sBAAuB,qBAC5F9X,KAAK6gC,eAAmC,OAAlB/oB,EAAAA,EAAS0zB,SAAS,oBAAlB1zB,EAAwC,IAAIjO,GAAM,EAAG,EAAG,EAAG,GACjF7J,KAAK8gC,kBAAsC,OAAlBhpB,EAAAA,EAAS4Z,SAAS,uBAAlB5Z,EAA2C,EAEpE9X,KAAK0oC,OAAyC,IAAhC5wB,EAAS4Z,SAAS,UAChC1xB,KAAK2oC,MAAuC,IAA/B7wB,EAAS4Z,SAAS,SAC/B1xB,KAAK4oC,WAAa9wB,OAAAA,EAAAA,EAAS2zB,WAAW,YAApB3zB,EAAwDrM,EAAKo9B,WAAWC,OAC1F9oC,KAAK+oC,UAA+C,IAAnCjxB,EAAS4Z,SAAS,aACnC1xB,KAAKgpC,YAAgC,OAAlBlxB,EAAAA,EAAS4Z,SAAS,iBAAlB5Z,EAAqC,EACxD9X,KAAKipC,WAAanxB,OAAAA,EAAAA,EAAS2zB,WAAW,YAApB3zB,EAAwDrM,EAAKy9B,WAAWC,KAC5F,EAKA9jC,EAASD,QAAT,WACEqjC,EAAAznC,UAAMoE,QAAD1B,KAAA1D,MACLA,KAAK0/B,sBAAmBr/B,EACxBL,KAAKkgC,8BAA2B7/B,EAChCL,KAAKqgC,mBAAgBhgC,EACrBL,KAAKygC,sBAAmBpgC,EACxBL,KAAK+gC,qBAAkB1gC,CACzB,EAMAgF,EAAS+jC,kBAAT,WACE,IAAMpvB,EAAcyuB,YAAMW,kBAAD1lC,KAAA1D,MAuCzB,OArCAga,EAAYpW,KAAK,gCACb5D,KAAK0rC,wBACP1xB,EAAYpW,KAAK,6BACkBvD,IAA/BL,KAAKurC,uBACPvxB,EAAYpW,KAAK,iCAGjB5D,KAAKssC,gCACPtyB,EAAYpW,KAAK,qCAC0BvD,IAAvCL,KAAKksC,+BACPlyB,EAAYpW,KAAK,yCAGjB5D,KAAK+/B,eACP/lB,EAAYpW,KAAK,qBAEf5D,KAAKusC,qBACPvyB,EAAYpW,KAAK,yBACevD,IAA5BL,KAAKmsC,oBACPnyB,EAAYpW,KAAK,8BAGjB5D,KAAKwsC,wBACPxyB,EAAYpW,KAAK,4BACkBvD,IAA/BL,KAAKosC,uBACPpyB,EAAYpW,KAAK,iCAGjB5D,KAAKysC,sBACPzyB,EAAYpW,KAAK,2BACiBvD,IAA9BL,KAAKqsC,sBACPryB,EAAYpW,KAAK,gCAEV5D,KAAK0sC,oBACd1yB,EAAYpW,KAAK,kBAGZoW,CACT,EAEA3U,EAASmkC,gBAAT,WACE,IAAMC,EAAYhB,YAAMe,gBAAD9lC,KAAA1D,MAuCvB,OArCAypC,EAAU7lC,KAAK,CAAEuF,KAAM,+BACnBnJ,KAAK0rC,wBACPjC,EAAU7lC,KAAK,CAAEuF,KAAM,4BACY9I,IAA/BL,KAAKurC,uBACP9B,EAAU7lC,KAAK,CAAEuF,KAAM,gCAGvBnJ,KAAKssC,gCACP7C,EAAU7lC,KAAK,CAAEuF,KAAM,oCACoB9I,IAAvCL,KAAKksC,+BACPzC,EAAU7lC,KAAK,CAAEuF,KAAM,wCAGvBnJ,KAAK+/B,eACP0J,EAAU7lC,KAAK,CAAEuF,KAAM,oBAErBnJ,KAAKusC,qBACP9C,EAAU7lC,KAAK,CAAEuF,KAAM,wBACS9I,IAA5BL,KAAKmsC,oBACP1C,EAAU7lC,KAAK,CAAEuF,KAAM,6BAGvBnJ,KAAKwsC,wBACP/C,EAAU7lC,KAAK,CAAEuF,KAAM,2BACY9I,IAA/BL,KAAKosC,uBACP3C,EAAU7lC,KAAK,CAAEuF,KAAM,gCAGvBnJ,KAAKysC,sBACPhD,EAAU7lC,KAAK,CAAEuF,KAAM,0BACW9I,IAA9BL,KAAKqsC,sBACP5C,EAAU7lC,KAAK,CAAEuF,KAAM,+BAEhBnJ,KAAK0sC,oBACdjD,EAAU7lC,KAAK,CAAEuF,KAAM,iBAGlBsgC,CACT,EAMApkC,EAASqkC,eAAT,SAAyB5xB,GACvB2wB,EAAAznC,UAAM0oC,eAAe5xB,KAAAA,KAAAA,QAESzX,IAA1BL,KAAK0/B,mBACP5nB,EAAS6zB,OAAO,kBAAmB,GACnC7zB,EAAS8zB,WAAW,wBAAyB5rC,KAAKurC,6BAGdlrC,IAAlCL,KAAKkgC,2BACPpoB,EAAS6zB,OAAO,0BAA2B,GAC3C7zB,EAAS8zB,WAAW,gCAAiC5rC,KAAKksC,qCAGjC7rC,IAAvBL,KAAKqgC,gBACPvoB,EAAS6zB,OAAO,eAAgB,GAChC7zB,EAAS8zB,WAAW,qBAAsB5rC,KAAKmsC,0BAGnB9rC,IAA1BL,KAAKygC,mBACP3oB,EAAS6zB,OAAO,kBAAmB,GACnC7zB,EAAS8zB,WAAW,wBAAyB5rC,KAAKosC,6BAGvB/rC,IAAzBL,KAAK+gC,kBACPjpB,EAAS6zB,OAAO,iBAAkB,GAClC7zB,EAAS8zB,WAAW,uBAAwB5rC,KAAKqsC,uBAGnDv0B,EAAS+xB,SAAS,YAAa,EACjC,EAMA6B,EAAAA,oBAAAA,WACE,YAAiCrrC,IAA1BL,KAAK0/B,gBACd,EAMAoM,EAAAA,oBAAAA,SAAqBt+B,GACnBxN,KAAK0/B,iBAAmBlyB,CAC1B,EAMAu+B,EAAAA,mBAAAA,WACE,OAAO/rC,KAAKy/B,eACd,EAMAuM,EAAAA,mBAAAA,SAAoBx+B,GACXnM,EAAHmM,EAAe3D,IAEjB7J,KAAKy/B,gBAAgBryB,IAAII,EAAIvL,EAAGuL,EAAItK,EAAGsK,EAAIsa,EAAGta,EAAIqa,GACtCxmB,EAAHmM,EAAe9D,IAExB1J,KAAKy/B,gBAAgBryB,IAAII,EAAIC,EAAGD,EAAI7K,EAAG6K,EAAIE,EAAGF,EAAIM,GAGlD9N,KAAKy/B,gBAAgBryB,IAAII,EAAI,GAAIA,EAAI,GAAIA,EAAI,GAAIA,EAAI,GAEzD,EAMA8+B,EAAAA,4BAAAA,WACE,YAAyCjsC,IAAlCL,KAAKkgC,wBACd,EAMAyM,EAAAA,4BAAAA,WACE,OAAO3sC,KAAKkgC,wBACd,EAMA0M,EAAAA,4BAAAA,SAA6Bp/B,GAC3BxN,KAAKkgC,yBAA2B1yB,CAClC,EAMA++B,EAAAA,iBAAAA,WACE,YAA8BlsC,IAAvBL,KAAKqgC,aACd,EAMAwM,EAAAA,iBAAAA,WACE,OAAO7sC,KAAKqgC,aACd,EAMAyM,EAAAA,iBAAAA,SAAkBt/B,GAChBxN,KAAKqgC,cAAgB7yB,CACvB,EAMAg/B,EAAAA,oBAAAA,WACE,YAAiCnsC,IAA1BL,KAAKygC,gBACd,EAMAsM,EAAAA,oBAAAA,WACE,OAAO/sC,KAAKygC,gBACd,EAMAuM,EAAAA,oBAAAA,SAAqBx/B,GACnBxN,KAAKygC,iBAAmBjzB,CAC1B,EAMAi/B,EAAAA,mBAAAA,WACE,YAAgCpsC,IAAzBL,KAAK+gC,eACd,EAMAkM,EAAAA,mBAAAA,WACE,OAAOjtC,KAAK+gC,eACd,EAMAmM,EAAAA,mBAAAA,SAAoB1/B,GAClBxN,KAAK+gC,gBAAkBvzB,CACzB,EAMAk/B,EAAAA,iBAAAA,WACE,OAAO1sC,KAAK6gC,eAAesM,YAAcntC,KAAK8gC,kBAAoB,CACpE,EAMAsM,EAAAA,kBAAAA,WACE,OAAOptC,KAAK6gC,cACd,EAMAwM,EAAAA,kBAAAA,SAAmB7/B,GACVnM,EAAHmM,EAAe3D,IAEjB7J,KAAK6gC,eAAezzB,IAAII,EAAIvL,EAAGuL,EAAItK,EAAGsK,EAAIsa,EAAGta,EAAIqa,GACrCxmB,EAAHmM,EAAe/D,IAExBzJ,KAAK6gC,eAAezzB,IAAII,EAAIC,EAAGD,EAAI7K,EAAG6K,EAAIE,EAAG,GAG7C1N,KAAK6gC,eAAezzB,IAAII,EAAI,GAAIA,EAAI,GAAIA,EAAI,GAAI,EAEpD,EAMA8/B,EAAAA,qBAAAA,WACE,OAAOttC,KAAK8gC,iBACd,EAMAyM,EAAAA,qBAAAA,SAAsB//B,GACpBxN,KAAK8gC,kBAAoBtzB,CAC3B,EApbWy+B,EAAD,CAAsBxD,IAic3B,SAAS+E,GAAsB11B,GACpC,GAAIA,EAASE,OAAOy1B,kBAAoBjiC,GAAe,CACrD,IAAMkiC,EAAc,IAAIzB,GAIxB,OAFAyB,EAAYzsC,OAAO6W,GAEZ41B,EAEP,IAAMC,EAAgB,IAAItC,GAI1B,OAFAsC,EAAc1sC,OAAO6W,GAEd61B,CAEX,CCt2BO,OAAA1sB,GAAK,SAALtQ,GAAMsQ,SAAAA,EAgEE9X,EAAcjF,EAAgC0pC,SA8BzCA,yBAtFlB1L,YAAa,EAGZpxB,EACDof,UAAY,EAGXpf,EACDqxB,qBAAuB,EAetBrxB,EACDuxB,kBAAoB,EAGnBvxB,EACDwxB,iBAAmB,EAOlBxxB,EACD+G,SAAW,EAWV/G,EACD+8B,SAAU,EAUR/8B,EAAK3H,KAAOA,EACZ2H,EAAK1I,KAAO6C,EAAYyoB,OACxB5iB,EAAKO,SAAU,EACfP,EAAK88B,MAAQA,EAEb,IAAQxL,EAAqBl+B,EAArBk+B,iBAKR,GAHAtxB,EAAKoxB,WAAah+B,EAAKg+B,WACvBpxB,EAAKof,UAAYhsB,EAAKgsB,UACtBpf,EAAKqxB,qBAAuBj+B,EAAKi+B,qBAC7BC,EAAkB,CACpBtxB,EAAKsxB,iBAAmB,GACxB,IAAK,IAAI//B,EAAI,EAAGA,EAAI+/B,EAAiBpgC,OAAQK,GAAK,EAChDyO,EAAKsxB,iBAAiBx+B,KAAK,CACzBw+B,EAAiB//B,GACjB+/B,EAAiB//B,EAAI,GACrB+/B,EAAiB//B,EAAI,UAIzByO,EAAKsxB,iBAAmB,UAG1BtxB,EAAKgQ,aAAe5c,EAAK4c,aACzBhQ,EAAKiQ,cAAgB7c,EAAK6c,cAC1BjQ,EAAKuxB,kBAAoBn+B,EAAKm+B,kBAC9BvxB,EAAKwxB,iBAAmBp+B,EAAKo+B,iBAE7BxxB,EAAK+G,UAAW+1B,MAAAA,GAAW,OAAXA,EAAAA,EAAO/3B,WAAP+3B,EAAAA,EAAa3uB,cAAe,IA9FnCgC,EAAAA,EAAAA,GAAAA,IAAAA,EAAAA,EAAAA,UAAAA,OAqGX6sB,EAAAA,MAAAA,SAAOC,GACL/tC,KAAK+tC,QAAUA,CACjB,EAOAx0B,EAAAA,MAAAA,SAAOrI,GACL,IAAIlR,KAAK6tC,QAAT,CAIA7tC,KAAK6tC,SAAU,EACf7tC,KAAKguC,eAAiB,IAAIC,GAC1BjuC,KAAKguC,eAAe/sC,OAAOjB,MAC3BA,KAAKguC,eAAez0B,QAEpB,IAAM20B,EAAah9B,EAAMi9B,gBAEzBnuC,KAAKouC,WAAaF,EAAWG,cAAc,oBAAqBruC,KAAKguC,gBACrEhuC,KAAKouC,WAAWv2B,SAAW7X,KAAK6X,SAChC7X,KAAKguC,eAAetE,eAAe1pC,KAAKouC,WAAWt2B,SAXnD,CAYF,EAOAzS,EAAS4L,OAAT,SAAiBC,EAAsBC,GAGrC,GAFAnR,KAAKsuC,eAAep9B,GAEhBlR,KAAKqR,SAAWrR,KAAKkiC,iBAAkC7hC,IAApBL,KAAKouC,WAA0B,CACpE,IAAMl4B,EAAOlW,KAAKouC,WAElBj9B,EAASo9B,aAAar4B,EAAKuC,SAAU7O,GAAQ4kC,SAAUt4B,EAAK4B,SAC9D,CACF,EAKAzS,EAASD,QAAT,WAQE,IAAAqpC,EAPA99B,EAAA3P,UAAMoE,QAAD1B,KAAA1D,MACLA,KAAK4tC,WAAQvtC,EACbL,KAAK8gB,kBAAezgB,EAEpBL,KAAK+gB,mBAAgB1gB,EACrBL,KAAK+tC,aAAU1tC,EACfL,KAAKouC,gBAAa/tC,EACC,OAAnBouC,EAAAzuC,KAAKguC,iBAALS,EAAqBrpC,UACrBpF,KAAKguC,oBAAiB3tC,CACxB,EAEAgF,EAAQipC,eAAR,SAAwBp9B,GAGtB,GAFAlR,KAAKuZ,MAAMrI,GAEPlR,KAAKqR,SAAWrR,KAAKkiC,iBAAkC7hC,IAApBL,KAAKouC,iBAAoD/tC,IAAxBL,KAAKguC,eAA8B,CACzG,IAAMU,EAAcx9B,EAAMw9B,YACpB1sB,EAAS0sB,EAAY1sB,OACrB6Q,EAAa6b,EAAY7b,WACzB8b,EAAoB3sB,EAAO4sB,uBAAuB5sB,EAAOK,KAAK6D,SAAS2M,GAAYjkB,SACnFkJ,EAAW9X,KAAKouC,WAAWt2B,SAEjC9X,KAAKguC,eAAetE,eAAe5xB,GACnCA,EAAS1L,UAAU,2BAA4BuiC,EACjD,CACF,EA1KW1tB,GAAAA,EAAAA,EA+KP4tB,IAAAA,gBAAJ,WACE,QAAK7uC,KAAKyQ,cAENzQ,KAAKkwB,WAAa,GAAKlwB,KAAKmiC,sBAAwB,WAE1B9hC,IAA1BL,KAAKoiC,uBAAwD/hC,IAAtBL,KAAK8gB,qBAElBzgB,IAAvBL,KAAK+gB,eAA+B/gB,KAAKsiC,kBAAoB,IACtE,IAKIwM,IAAAA,uBAAJ,WACE,OAAO9uC,KAAKqR,QAAUrR,KAAKkwB,UAAY,CACzC,IAKI6e,IAAAA,kCAAJ,WACE,OAAO/uC,KAAKqR,QAAUrR,KAAKmiC,qBAAuB,CACpD,IAKI6M,IAAAA,sBAAJ,WACE,YAA6B3uC,IAAtBL,KAAK8gB,YACd,IAKImuB,IAAAA,0BAAJ,WACE,YAAiC5uC,IAA1BL,KAAKoiC,gBACd,KAnNWnhB,EAAD,CAAiBtQ,IA0NtBs9B,GAAK,SAALxF,GAAMwF,SAAAA,kDAIX/d,UAAY,EAGXpf,EACDqxB,qBAAuB,EAmBtBrxB,EACDwxB,iBAAmB,IA5BR2L,EAAAA,EAAAA,GAAAA,IAAAA,EAAAA,EAAAA,UAAAA,OAkCXhtC,EAAAA,OAAAA,SAAQyyB,GACN1zB,KAAKoI,KAAO6C,EAAY6M,SACxB9X,KAAKia,aAAe7O,GAAckP,aAClCta,KAAK2oC,OAAQ,EAEb3oC,KAAKmJ,KAAOuqB,EAAOvqB,KACnBnJ,KAAKkwB,UAAYwD,EAAOxD,UACxBlwB,KAAKmiC,qBAAuBzO,EAAOyO,qBACnCniC,KAAK+tC,QAAUra,EAAOqa,QACtB/tC,KAAKoiC,iBAAmB1O,EAAO0O,iBAC/BpiC,KAAK8gB,aAAe4S,EAAO5S,aAC3B9gB,KAAK+gB,cAAgB2S,EAAO3S,cAC5B/gB,KAAKsiC,iBAAmB5O,EAAO4O,gBACjC,EAKAj9B,EAASD,QAAT,WACEqjC,EAAAznC,UAAMoE,QAAD1B,KAAA1D,MACLA,KAAK+tC,aAAU1tC,EACfL,KAAKoiC,sBAAmB/hC,EACxBL,KAAK8gB,kBAAezgB,EAEpBL,KAAK+gB,mBAAgB1gB,CACvB,EAMAgF,EAAS+jC,kBAAT,WACE,IAAMpvB,EAAwB,GAM9B,OAJAA,EAAYpW,KAAK,aACjBoW,EAAYpW,KAAK,sBACSvD,IAAtBL,KAAK8gB,cAA8B9G,EAAYpW,KAAK,6BAEjDoW,CACT,EAMA3U,EAASqkC,eAAT,SAAyB5xB,GACvB,QAAqBzX,IAAjBL,KAAK+tC,QACP,MAAM,IAAIvzB,MAAM,sCAKlB,GAFA1C,EAASo3B,WAAW,gBAAiB,IAAI3lC,GAAQ,EAAK,IACtDuO,EAASq3B,WAAW,WAAYnvC,KAAK+tC,cACX1tC,IAAtBL,KAAK8gB,aACPhJ,EAASq3B,WAAW,qBAAsBnvC,KAAK8gB,kBAC1C,CACL,IAAMsuB,EAASpvC,KAAKoiC,iBAEpB,QAAe/hC,IAAX+uC,GAAyC,GAAjBA,EAAOptC,OAAe,MAAM,IAAIwY,MAAM,oCAAoC40B,EAAO,KAE3F,CAAC,MAAO,OAAQ,MAAO,MAAO,OAAQ,OAAQ,MAAO,MAAO,OAEpEr9B,SAAQ,SAACxO,EAAGlB,GACpByV,EAASiB,WAAY,mBAAkBxV,EAAKkG,GAAQ4E,UAAU+gC,EAAO/sC,IACvE,GACF,CACAyV,EAAS6zB,OAAO,YAAa3rC,KAAKsiC,iBAAmB,GACrDxqB,EAASq3B,WAAW,sBAAuBnvC,KAAK+gB,cAClD,EAMA1b,EAASmqB,kBAAT,SAA4B1X,GAC1BA,EAASQ,WAAY,EACrBR,EAASS,WAAY,EACrBvY,KAAK2qC,kBAAkB7yB,EACzB,EA/GWm2B,EAAD,CAA+BxF,KAgN/B4G,SAAAA,uCAAAA,CAAAA,KAAAA,GAAAA,CAAAA,IAQL,IAAAC,GAAK,WAACA,SAAAA,IAAAA,CAAAA,OAAAA,EAAAA,UAqPGC,kBAAd,SAAiCC,UAAjC3vC,GAAA,eACM4vC,EACEC,EAEGrtC,EACD+mB,oDAHFsmB,EAAAA,GAEGrtC,EAAI,0BAAGA,EAAImtC,EAAUxtC,OACd,GAAMmrB,EAAUqiB,EAAUntC,KADP,aAGjC,GAFM+mB,EAAQsC,EAAA3oB,OAEVV,EAAI,EACN,GAAIA,EAAI,GAAM,GACZ,GAAkB,EAAd+mB,EAAMzH,QAAc8tB,EAAU9tB,OAAwB,EAAfyH,EAAMvH,SAAe4tB,EAAU5tB,OACxE,MAAM,IAAIrH,MAAM,iCAAiCnY,EAAE,YAAWotC,EAAU,YAAWrmB,EAAM,UAG3F,GAAIA,EAAMzH,QAAU8tB,EAAU9tB,OAASyH,EAAMvH,SAAW4tB,EAAU5tB,OAChE,MAAM,IAAIrH,MAAM,iCAAiCnY,EAAE,YAAWotC,EAAU,YAAWrmB,EAAM,KAI3F/mB,EAAI,GAAM,GAAKqtC,EAAmB9rC,KAAI,IACzB8rC,EAAmBA,EAAmB1tC,OAAS,GAEvD4B,KAAKwlB,GACdqmB,EAAYrmB,0BAlBwB/mB,8BAoBxC,GAxBAxC,IAhPAyvC,EAAaK,yBAAb,kBAAA9vC,GAAA,WACQ+vC,IAEAC,oDAAe,MAFL,yEAEK,GAAM1iB,EAFX,kFAkBhB,OAhBM0iB,EAAenkB,EAAA3oB,OAgBrB,GAd0C,CACxCoG,KAAM,UACN4hB,MAAO9T,EAAU0X,cACjB1D,MAAOhU,EAAU0X,cACjBpX,UAAWN,EAAUK,OACrBF,UAAWH,EAAUK,OACrB4T,YAAa,EACbrB,WAAYC,EAAkBV,MAC9BA,MAAOymB,EACPllB,gBAAgB,EAChB2C,OAAO,EACP7C,kBAAkB,OAItB,GApBA5qB,IA2BAyvC,EAAaQ,qBAAb,SAAmCl4B,qBAAnC/X,GAAA,eACQkwC,oDAAc,MAAA,GAAMj/B,EAAK6+B,mCAG/B,OAHMI,EAAcrkB,EAAA3oB,OAGpB,GAFuB6mB,EAAQ3oB,OAAO2W,EAAQm4B,OAGhD,GALAlwC,IAhCWyvC,EA6CEU,oBAAb,SAAkCp4B,EAAgBsE,qBAAlDrc,GAAA,WACQkhB,IAAAA,EACAD,EACEohB,EAAYhS,EAAWiS,EAAsBC,EAAkBC,EAAmBC,oDAFpE,MAAA,GAAMxxB,EAAKm/B,sBAAsBr4B,EAAQsE,WAC1C,OADf6E,EAAgB2K,EAAA3oB,OACD,GAAM+N,EAAKo/B,qBAAqBt4B,EAAQsE,WAc7D,OAdM4E,EAAe4K,EAAA3oB,OACbm/B,EAAuGhmB,EAAvGgmB,WAAYhS,EAA2FhU,EAA3FgU,UAAWiS,EAAgFjmB,EAAhFimB,qBAAsBC,EAA0DlmB,EAA1DkmB,iBAAkBC,EAAwCnmB,EAAxCmmB,kBAAmBC,EAAqBpmB,EAArBomB,iBAa1F,GAZ0C,CACxCJ,WAAAA,EACAhS,UAAAA,EACAiS,qBAAAA,EAEAC,iBAAAA,EACAthB,aAAAA,EACAC,cAAAA,EACAshB,kBAAAA,EACAC,iBAAAA,OAIJ,GAjBAziC,IAyBAyvC,EAAOa,0BAAP,SAAkCj0B,GAgBhCszB,IAAAA,EAXI1uB,EAKF0uB,EATIY,EAvEGd,EAuE+Be,uBAAuBn0B,GACzDo0B,EAxEGhB,EAwE8BiB,sBAAsBr0B,GACrDgmB,EAAuGhmB,EAAvGgmB,WAAYhS,EAA2FhU,EAA3FgU,UAAWiS,EAAgFjmB,EAAhFimB,qBAAsBC,EAA0DlmB,EAA1DkmB,iBAAkBC,EAAwCnmB,EAAxCmmB,kBAAmBC,EAAqBpmB,EAArBomB,iBAGpFkN,EAA0B,GAC1BgB,EAA6C,GAE/CF,KACFd,EAAAA,GAAU5rC,KAAV4rC,MAAAA,EAAAA,GAAAA,OAAkBc,EAAgBhlB,SAClCklB,EAAmB5sC,KAAK0sC,EAAgBnkB,gBACxCrL,EAAe,CACbuE,GAAIirB,EAAgBnkB,eAAe9G,MAGvCmqB,EAAAA,GAAU5rC,KAAV4rC,MAAAA,EAAAA,GAAAA,OAAkBY,EAAiB9kB,SACnCklB,EAAmB5sC,KAAKwsC,EAAiBjkB,gBACzC,IAAMpL,EAAgB,CAAEsE,GAAI+qB,EAAiBjkB,eAAe9G,IAoB5D,MAAO,CACLmqB,UAAAA,EACAgB,mBAAAA,EACA7rB,UArB8C,CAC9CU,GAAIorB,IACJhd,SAAUhoB,EAAKkV,SAASO,gBACxBrL,KAAM,CACJwP,GAAIorB,KAENvO,WAAAA,EACAhS,UAAAA,EACAiS,qBAAAA,EACAC,iBAAAA,EAEAthB,aAAAA,EAEAC,cAAAA,EACAshB,kBAAAA,EACAC,iBAAAA,GAQJ,EAjHWgN,EAyHEW,sBAAb,SAAoCr4B,EAAgBsE,UAApDrc,GAAA,sCAQE,MAAoB,QAAhBqc,EAAO9T,KACT,GAAO8gB,GAAYsD,+BAA+B5U,EAAQsE,EAAO6E,gBAEjE,GAAOmI,GAAY6D,kCAAkCnV,EAAQsE,EAAO6E,cAAe7E,EAAOmmB,sBAE9F,GAbAxiC,IAzHWyvC,EAwIJe,uBAAP,SAA+Bn0B,GAC7B,IAAMw0B,EAA2B,GAC3B1kB,EAA6B,GAEnC9P,EAAO6E,cAAchP,SAAQ8a,SAAAA,GAC3B,IAAM8jB,EAA0B,GAEhC9jB,EAAQ9a,SAAQqX,SAAAA,GACd,IAAMwnB,EAAUH,IAEhBC,EAAW9sC,KAAK,CACdyhB,GAAIurB,EAEJhc,IAAKxL,IAEPunB,EAAO/sC,KAAK,CAAEyhB,GAAIurB,GACpB,IACA5kB,EAAQpoB,KAAK+sC,EACf,IACA,IAAMxkB,EAAuCthB,GAAA,CAC3Cwa,GAAIorB,IACJhd,SAAUhoB,EAAKkV,SAASiJ,QACxBC,WAAYC,EAAkBkC,QAC9BpqB,OAAQqV,EAAUqV,iBAElBN,QAAAA,GACG9C,GAAYyD,qBAGjB,MAAO,CACLrB,OAAQolB,EACRvkB,eAAAA,EAEJ,EAzKWmjB,EAiLEY,qBAAb,SAAmCt4B,EAAgBsE,UAAnDrc,GAAA,sCACE,YAA4BQ,IAAxB6b,EAAO4E,aAA8B,GAAO,MAE5B,QAAhB5E,EAAO9T,KACT,GAAO8gB,GAAY+C,yBAAyBrU,EAAQsE,EAAO4E,eAE3D,GAAOoI,GAAY0D,4BAA4BhV,EAAQsE,EAAO4E,iBAElE,GARAjhB,IAjLWyvC,EA2LJiB,sBAAP,SAA8Br0B,GAC5B,QAA4B7b,IAAxB6b,EAAO4E,aAAX,CAIA,IAAM4vB,EAA2B,GAC3B7jB,EAA2B,GAEjC3Q,EAAO4E,aAAa/O,SAAQqX,SAAAA,GAC1B,IAAMwnB,EAAUH,IAEhBC,EAAW9sC,KAAK,CACdyhB,GAAIurB,EAEJhc,IAAKxL,IAEPyD,EAAQjpB,KAAK,CAAEyhB,GAAIurB,GACrB,IAEA,IAAMzkB,EAAuCthB,GAAA,CAC3Cwa,GAAIorB,IACJhd,SAAUhoB,EAAKkV,SAASiJ,QACxBC,WAAYC,EAAkBkC,QAC9BpqB,OAAQqV,EAAUqV,iBAElBN,QAAS,CAACa,IACP3D,GAAYqD,kBAGjB,MAAO,CACLjB,OAAQolB,EACRvkB,eAAAA,EA5BF,CA8BF,EAOAmjB,EAAOuB,gBAAP,SAAwBC,QAAAA,IAAAA,IAAAA,EAAAA,GACtB,IAAM/vB,EAAgB/gB,KAAK+wC,qBAAqBD,GAahD,MAZiC,CAC/B1oC,KAAM,MACN85B,YAAY,EACZhS,UAAW,IACXiS,qBAAsB,IACtBC,iBAAkBpiC,KAAKgxC,oBAAoBF,GAC3ChwB,aAAc9gB,KAAKixC,oBAAoBH,EAAY/vB,GACnDA,cAAeA,EACfshB,kBAAmB16B,KAAKulB,IAAI,EAAGnM,EAAc/e,OAAS,GACtDsgC,iBAAkBvhB,EAAc/e,OAIpC,EAlPWstC,EA+QI0B,oBAAf,SAAoCF,GAClC,IAAI7R,EAAsB,GAE1B,OAAQ6R,GACN,KAAA,EACE,OAEF,KAAA,EAAuB7R,EAAY,CACjC,kBAAoB,mBAAqB,mBAAqB,oBAAsB,oBACnF,mBAAqB,mBAAqB,mBAAqB,oBAAsB,oBACrF,oBAAsB,kBAAoB,oBAAsB,mBAAqB,oBACrF,qBAAuB,oBAAsB,mBAAqB,oBAAsB,oBACzF,qBAAuB,qBAAuB,oBAAsB,oBAAsB,sBAC1F,qBAAuB,sBAGvB,MACF,QAASA,EAAY,CACnB,kBAAqB,kBAAqB,mBAAqB,mBAAqB,mBACpF,oBAAsB,qBAAuB,oBAAuB,oBAAsB,oBACzF,oBAAuB,mBAAqB,oBAAsB,oBAAsB,oBACzF,mBAAsB,mBAAsB,oBAAuB,qBAAuB,qBACzF,oBAAuB,mBAAqB,mBAAqB,qBAAuB,oBACxF,oBAAuB,oBAM5B,OAAOA,CACT,EA7SWqQ,EA+SI2B,oBAAf,SAAoCH,EAAyBxlB,GAC3D,GAAmC,GAA/BwlB,EACF,OAAOxlB,EAAOA,EAAOtpB,OAAS,EAIlC,EArTWstC,EAuTIyB,qBAAf,SAAqCD,GACnC,IAGyBtB,EAGdA,EANLA,EAAsB,GAG1B,IADMsB,GACiBtB,EAAAA,GAAU5rC,KAAV4rC,MAAAA,EAAkB,GAAA0B,OAAAlxC,KAAKmxC,iCAGrC3B,EAAAA,GAAU5rC,KAAV4rC,MAAAA,EAAkB,GAAA0B,OAAAlxC,KAAKoxC,4BAKlC,IAAMC,EAAwB,GAW9B,OATA7B,EAAUz9B,SAAQ,SAACvO,EAAGnB,GAChBA,EAAI,GAAM,GACZgvC,EAAUztC,KAAK,IAEIytC,EAAUA,EAAUrvC,OAAS,GAErC4B,KAAKJ,EACpB,IAEO6tC,CACT,EA/UW/B,EAiVI8B,wBAAf,WACE,MAAO,CACL,0GACA,0GACA,0GACA,0GACA,0GACA,0GACA,0GACA,0GACA,0GACA,0GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GACA,2GAEJ,EApYW9B,EAsYI6B,4BAAf,WACE,MAAO,CACL,gFACA,gFACA,gFACA,gFACA,gFACA,gFACA,gFACA,gFACA,gFACA,gFACA,gFACA,gFACA,+EACA,+EACA,+EACA,+EACA,+EACA,+EACA,+EACA,+EACA,+EACA,+EACA,+EACA,+EACA,+EACA,+EACA,+EACA,+EACA,+EACA,+EACA,+EACA,+EACA,+EACA,+EACA,+EACA,+EAEJ,EA7aW7B,CA8aZ,CA9aW,GCrbLgC,GAAK,WAACA,SAAAA,EA6CE15B,QAAQA,OAAAA,OA3Cbyb,YAAa,EA4CnBrzB,KAAKuxC,UAAY,IAAI99B,IACrBzT,KAAKwxC,aAAe,IAAI/9B,IACxBzT,KAAKyxC,cAAgB,IAAIh+B,IACzBzT,KAAK0xC,gBAAkB,IAAIj+B,IAjDlB69B,IAAAA,EAAAA,EAAAA,UAAAA,OAwDXxD,EAAAA,MAAAA,SAAOza,GAGL,GAFArzB,KAAKqzB,WAAaA,OAEUhzB,IAAxBL,KAAK2xC,gBAAgC3xC,KAAK2xC,eAAejU,YAAa,CACxE,QAA2Cr9B,IAAvCixC,EAAiBM,kBACnB,MAAM,IAAIp3B,MAAM,2CAGlB,IAAMq3B,EAAqB,iBAE3B7xC,KAAK2xC,eAAiB/nB,EAAQ3oB,OAAOjB,KAAK4X,OAAQ05B,EAAiBM,mBACnE5xC,KAAKutB,cAAcskB,GACnB7xC,KAAKmvC,WAAW0C,EAAoB7xC,KAAK2xC,eAC3C,CACF,EAOAvkB,EAAAA,WAAAA,SAAYjkB,GACV,OAAOnJ,KAAKwxC,aAAan9B,IAAIlL,EAC/B,EAOAgmC,EAAAA,WAAAA,SAAYhmC,EAAcsiB,GACxBzrB,KAAKwxC,aAAapkC,IAAIjE,EAAMsiB,EAC9B,EAQAqmB,EAAAA,mBAAAA,SAAoB3oC,EAAciN,GAChC,IAAMqV,EAAMzrB,KAAKwxC,aAAan9B,IAAIlL,GAElC,QAAY9I,IAARorB,EACF,OAAOA,EAET,IAAMsmB,EAASnoB,EAAQ3oB,OAAOjB,KAAK4X,OAAQxB,GAI3C,OAFApW,KAAKwxC,aAAapkC,IAAIjE,EAAM4oC,GAErBA,CACT,EAOAxkB,EAAAA,cAAAA,SAAepkB,GACb,IAAMsiB,EAAMzrB,KAAKwxC,aAAan9B,IAAIlL,GAMlC,YAJY9I,IAARorB,GACFA,EAAIrmB,UAGCpF,KAAKwxC,aAAaQ,OAAO7oC,EAClC,EASA8oC,EAAAA,oBAAAA,SAAqB9oC,EAAc8qB,EAAoCC,GACrE,IAAMge,EAAalyC,KAAKyxC,cAAcp9B,IAAIlL,GAE1C,QAAmB9I,IAAf6xC,EACF,OAAOA,EAGT,IAAMC,EAAOriB,GAAakE,eAAeh0B,KAAK4X,OAAQqc,EAAUC,GAIhE,OAFAl0B,KAAKyxC,cAAcrkC,IAAIjE,EAAMgpC,GAEtBA,CACT,EAQA9D,EAAAA,cAAAA,SAAellC,EAAc2O,GAC3B,IAAMs6B,EAAapyC,KAAKuxC,UAAUl9B,IAAIlL,GAEtC,QAAmB9I,IAAf+xC,EACF,OAAOA,EAGT,IAAMl8B,EAAO4Y,GAAWC,iBAAiB/uB,KAAK4X,OAAQzO,EAAM2O,GAI5D,OAFA9X,KAAKuxC,UAAUnkC,IAAIjE,EAAM+M,GAElBA,CACT,EAKA9Q,EAAAA,QAAAA,WAEEpF,KAAK4X,OAAS,KACd5X,KAAK2xC,oBAAiBtxC,EACtBL,KAAKuxC,UAAUx/B,SAAQmE,SAAAA,GACrBgT,GAAYsE,WAAWtX,EACzB,IACAlW,KAAKuxC,UAAU90B,QAEfzc,KAAKwxC,aAAaz/B,SAAQgF,SAAAA,GACxBmS,GAAYqE,cAAcxW,EAC5B,IACA/W,KAAKwxC,aAAa/0B,QAElBzc,KAAKyxC,cAAc1/B,SAAQ0G,SAAAA,GACzByQ,GAAY0E,eAAenV,EAC7B,IACAzY,KAAKyxC,cAAch1B,QAEnBzc,KAAK0xC,gBAAgB3/B,SAAQ+b,SAAAA,GAC3B5E,GAAY2E,iBAAiBC,EAC/B,IACA9tB,KAAK0xC,gBAAgBj1B,OACvB,EAMA41B,EAAAA,gBAAAA,WACE,IAAMC,EAAwB,GAM9B,OAJAtyC,KAAK0xC,gBAAgB3/B,SAAQ+b,SAAAA,GAC3BwkB,EAAQ1uC,KAAKkqB,EACf,IAEOwkB,CACT,EAMAC,EAAAA,kBAAAA,WACE,OAAOvyC,KAAK2xC,cACd,EAMAa,EAAAA,iBAAAA,WACE,OA5NSlB,EA4NemB,aAC1B,EA3MAnB,EAAaoB,oBAAb,6BAAA7yC,GAAA,6DACE,YAA+BQ,IAA3ByQ,EAAK8gC,kBAEP,IAGuB,GAAMtC,GAAeK,0CAA9C7+B,EAAK8gC,kBAAoBlmB,EAAA3oB,cAC3B,GAPAlD,IAlBWyxC,EAiCEqB,iBAAb,SAA+B/6B,EAAgBsE,UAA/Crc,GAAA,WACM+yC,IAAAA,oDAM6B,YAJfvyC,KAFduyC,EAAY12B,KAGd02B,EAAYtD,GAAeuB,mBAGI,GAAMvB,GAAeU,oBAAoBp4B,EAAQg7B,WAElF,OA1CStB,EAwCQmB,cAAgB/mB,EAAA3oB,OAEjC,GA1CSuuC,EA0CemB,kBAC1B,GAVA5yC,IAjCWyxC,CA8NZ,CA9NW,GCANuB,GAAUlrC,KAAK4oB,GAAK,IAKnBxO,GAAK,SAALpR,YAAMoR,EAqDE5Y,EAAcwY,EAAeE,EAAgB3d,EAAgC0pC,SAUvE1pC,EACDA,EACLA,EACGA,EACEA,+BA3DlByd,MAAQ,IAGP7Q,EACD+Q,OAAS,IAGR/Q,EACDoR,UAAY,KAGXpR,EACDsR,SAAW,IAGVtR,EACDuR,IAAM,GAINywB,EAAAA,eAAiBlpC,GAAQ6lB,eAGxB3e,EACDixB,OAAS,EAGRjxB,EACD+f,SAAWplB,EAAKsnC,eAAeC,UAG9BliC,EACDmiC,iBAA4B,IAAIrpC,GAG/BkH,EACD+hB,WAAsB,IAAIjpB,GAWxBkH,EAAK1I,KAAO6C,EAAY+W,OACxBlR,EAAKO,SAAU,EACfP,EAAK88B,MAAQA,EAEb98B,EAAK3H,KAAOA,EACZ2H,EAAK6Q,MAAQA,EACb7Q,EAAK+Q,OAASA,EAEd/Q,EAAKoR,iBAAYhe,EAAAA,EAAK+d,MAAL/d,EAAa,KAC9B4M,EAAKsR,gBAAWle,EAAAA,EAAKie,KAALje,EAAY,IAC5B4M,EAAKuR,WAAMne,EAAAA,EAAKme,KAALne,EAAY,GACvB4M,EAAKixB,OAAS79B,OAAAA,EAAAA,EAAK69B,QAAL79B,EAAgB4M,EAAK6Q,MAAQ7Q,EAAK+Q,OAChD/Q,EAAK+f,SAAwB,OAAb3sB,EAAAA,EAAK2sB,UAAL3sB,EAAiBuH,EAAKsnC,eAAeC,UACrDliC,EAAKE,WApEI+Q,EAAAA,EAAAA,GAAAA,IAAAA,EAAAA,EAAAA,UAAAA,OA0EX1c,EAAS2L,OAAT,gBACqB3Q,IAAfL,KAAK4tC,OACP5tC,KAAK6M,UAAUR,qBAAqBrM,KAAK4tC,MAAM/gC,WAGjD,IAAMqmC,EAAUlzC,KAAK6wB,WAAaplB,EAAKsnC,eAAeI,SAEtDnzC,KAAKizC,iBAAiBxiB,YAAYzwB,KAAKqiB,IAAMwwB,GAAS7yC,KAAK+hC,OAAQ/hC,KAAKkiB,UAAWliB,KAAKoiB,SAAU8wB,GAClGlzC,KAAKizC,iBAAiBG,YAAYpzC,KAAK8yC,gBACvC9yC,KAAK6yB,WAAa7yB,KAAKmM,OAAOyC,QAChC,EAOAggC,EAAAA,uBAAAA,SAAwBvsB,GACtB,IAAM6wB,EAAUlzC,KAAK6wB,WAAaplB,EAAKsnC,eAAeI,SAEtD,OAAO,IAAIvpC,IAAU6mB,YAAY9oB,KAAK6e,IAAU,KAANnE,EAAY,KAAOwwB,GAAS7yC,KAAK+hC,OAAQ/hC,KAAKkiB,UAAWliB,KAAKoiB,SAAU8wB,GAASE,YAAYpzC,KAAK8yC,eAC9I,EAOAO,EAAAA,gBAAAA,SAAiB51B,GACf,IAAM61B,EAAW3rC,KAAK4rC,IAAIvzC,KAAKqiB,IAAMwwB,GAAU,IACzC9Q,EAAS/hC,KAAK+hC,OAChByR,EAAY,EACZC,EAAa,EACbC,EAAY,EACZC,EAAa,EAEb3zC,KAAK4zC,cAGPJ,GAFAE,EAAY1zC,KAAKoiB,SAAWkxB,GAEJvR,EACxB0R,GAFAE,EAAa3zC,KAAKkiB,UAAYoxB,GAEJvR,IAI1B2R,EAAY3R,GAFZyR,EAAYxzC,KAAKoiB,SAAWkxB,GAG5BK,EAAa5R,GAFb0R,EAAazzC,KAAKkiB,UAAYoxB,IAKhC71B,EAAIkc,YACJ,IAAMxtB,EAASnM,KAAKmM,OAYpB,OAVAsR,EAAIya,cAAc/rB,EAAOsa,eAAe,IAAIhd,GAAQiqC,EAAWF,GAAYxzC,KAAKoiB,YAChF3E,EAAIya,cAAc/rB,EAAOsa,eAAe,IAAIhd,GAAQiqC,GAAYF,GAAYxzC,KAAKoiB,YACjF3E,EAAIya,cAAc/rB,EAAOsa,eAAe,IAAIhd,IAASiqC,EAAWF,GAAYxzC,KAAKoiB,YACjF3E,EAAIya,cAAc/rB,EAAOsa,eAAe,IAAIhd,IAASiqC,GAAYF,GAAYxzC,KAAKoiB,YAElF3E,EAAIya,cAAc/rB,EAAOsa,eAAe,IAAIhd,GAAQkqC,EAAYF,GAAazzC,KAAKkiB,aAClFzE,EAAIya,cAAc/rB,EAAOsa,eAAe,IAAIhd,GAAQkqC,GAAaF,GAAazzC,KAAKkiB,aACnFzE,EAAIya,cAAc/rB,EAAOsa,eAAe,IAAIhd,IAASkqC,EAAYF,GAAazzC,KAAKkiB,aACnFzE,EAAIya,cAAc/rB,EAAOsa,eAAe,IAAIhd,IAASkqC,GAAaF,GAAazzC,KAAKkiB,aAE7EzE,CACT,EAMAgD,EAAAA,QAAAA,WACE,OAAO,IAAIlX,GAAQvJ,KAAK2hB,MAAO3hB,KAAK6hB,OACtC,EAMA+xB,EAAAA,WAAAA,WACE,OAAO5zC,KAAK6wB,WAAaplB,EAAKsnC,eAAeI,QAC/C,EAMAU,EAAAA,OAAAA,WACE,OAAO7zC,KAAK+L,WACd,EAMA+nC,EAAAA,OAAAA,SAAQtmC,GACNxN,KAAK+L,YAAcyB,CACrB,EAxKWuU,EAAD,CAAiBpR,IA8KtBojC,GAAK,WAACA,SAAAA,SACHC,SAAW,SACXC,UAAY,IACZC,KAAAA,WAAwB,GAI9Bl0C,KAAKm0C,cAAgB,IAAIpyB,GACvB,SAAU,IAAK,IACf,CACEsD,GAAI,IACJoO,SAAU,SACVpR,IAAK,GACLF,IAAK,IACLF,KAAM,KACN4O,SAAUplB,EAAKsnC,eAAeI,SAC9Bt9B,KAAM,CAAEwP,GAAI,OAhBP0uB,IAAAA,EAAAA,EAAAA,UAAAA,OA0BXK,EAAAA,QAAAA,SAASzyB,EAAeE,GACtB7hB,KAAKg0C,SAAWryB,EAChB3hB,KAAKi0C,UAAYpyB,EAEjB,IAAMG,EAAShiB,KAAKm0C,cAEpBnyB,EAAOL,MAAQA,EACfK,EAAOH,OAASA,EAChBG,EAAO+f,OAASpgB,EAAQE,EACxBG,EAAOhR,QACT,EASAqjC,EAAAA,OAAAA,SAAQlrC,EAAcjF,EAAgC0pC,GACpD,IAAM5rB,EAAS,IAAID,GAAQ5Y,EAAMnJ,KAAKg0C,SAAUh0C,KAAKi0C,UAAW/vC,EAAM0pC,GAItE,OAFA5tC,KAAKk0C,WAAWtwC,KAAKoe,GAEdA,CACT,EAMAsyB,EAAAA,aAAAA,SAActyB,GACZhiB,KAAKk0C,WAAWtwC,KAAKoe,EACvB,EAMAuyB,EAAAA,OAAAA,SAAQvyB,GACN,GAAU3gB,EAAN2gB,EAAkBD,IAAS,CAC7B,IAAMyyB,EAAax0C,KAAKk0C,WAAWO,WAAU5+B,SAAAA,GAC3C,OAAOA,IAASmM,CAClB,KAEoB,IAAhBwyB,GACFx0C,KAAKk0C,WAAWz8B,OAAO+8B,EAAY,QAGjCxyB,GAAU,GAAKA,EAAShiB,KAAKk0C,WAAWlyC,QAC1ChC,KAAKk0C,WAAWz8B,OAAOuK,EAAQ,EAGrC,EAKA5c,EAAAA,QAAAA,WACEpF,KAAKk0C,WAAa,EACpB,EAaAQ,EAAAA,oBAAAA,SACEryB,EACAywB,EACA/Q,EACA7f,EACAE,EACAlV,EACAlB,EACA6kB,GAEA7wB,KAAKm0C,cAAc9xB,IAAMA,EACzBriB,KAAKm0C,cAAcrB,eAAiBA,EAAejtB,QACnD7lB,KAAKm0C,cAAcpS,OAASA,EAC5B/hC,KAAKm0C,cAAcjyB,UAAYA,EAC/BliB,KAAKm0C,cAAc/xB,SAAWA,EAC9BpiB,KAAKm0C,cAAcjnC,SAAWA,EAC9BlN,KAAKm0C,cAAcnoC,SAAWA,EAC9BhM,KAAKm0C,cAAcpS,OAASA,EAC5B/hC,KAAKm0C,cAActjB,SAAWA,EAC9B7wB,KAAKm0C,cAAcnjC,QACrB,EAMA2jC,EAAAA,cAAAA,WACE,OAAO30C,KAAKk0C,UACd,EAMAU,EAAAA,iBAAAA,WACE,OAAO50C,KAAKm0C,aACd,EAMAU,EAAAA,eAAAA,WACE,OAAO70C,KAAKk0C,WAAWlyC,MACzB,EAMA8yC,EAAAA,gBAAAA,WACE,OAAO90C,KAAKm0C,aACd,EAMAY,EAAAA,UAAAA,WACE,OAAO/0C,KAAKg0C,SAAWh0C,KAAKi0C,SAC9B,EA/JWF,CAgKZ,CAhKW,GCpLLzyB,GAAK,SAAL3Q,GAAM2Q,SAAAA,EA6CEnY,EAAcjF,EAA+B0pC,gCArC1D3vB,UAAqB,IAAIxU,GAAQ,EAAG,EAAG,GAGtCqH,EACDsf,MAAQ,EAGPtf,EACDmf,MAAiB,IAAIxmB,GAAQ,EAAG,EAAG,GAGlCqH,EACDof,UAAY,EAGXpf,EACDwf,eAAiB,EAGhBxf,EACDuf,eAAiB,EAIjBF,EAAAA,UAAYjlB,EAAW8pC,UACvBC,QAAmB,IAAI1rC,GAAQ,EAAG,GAGjCuH,EACDokC,cAAe,EAUbpkC,EAAK3H,KAAOA,EACZ2H,EAAK1I,KAAO6C,EAAY+kB,MACxBlf,EAAKO,SAAU,EACfP,EAAK88B,MAAQA,EACb98B,EAAKmN,UAAY,IAAIxU,GAAQ,EAAG,GAAI,GACpCqH,EAAKsf,MAAQ,EACbtf,EAAKwf,eAAiB,EACtBxf,EAAKuf,eAAiB,EAEtB,IAQoBnsB,EAGLA,EAXP+rB,EAAU/rB,EAAV+rB,MASR,GAPAnf,EAAKmf,MAAQ,IAAIxmB,GACfwmB,EAAMhuB,EACNguB,EAAM/sB,EACN+sB,EAAMnI,GAERhX,EAAKof,UAAYhsB,EAAKgsB,UACtBpf,EAAKokC,oBAAehxC,EAAAA,EAAKgxC,eAALhxC,EAChBA,EAAKisB,YAAc1kB,EAAK0pC,UAAUld,MACpCnnB,EAAKqf,UAAYjlB,EAAW+sB,MAC5BnnB,EAAKsf,MAAkB,OAAVlsB,EAAAA,EAAKksB,OAALlsB,GAAe,OACvB,GAAIA,EAAKisB,YAAc1kB,EAAK0pC,UAAUC,KAAM,CAEpClxC,IAAAA,EACSA,EACAA,EAHtB4M,EAAKqf,UAAYjlB,EAAWkqC,KAC5BtkC,EAAKsf,MAAkB,OAAVlsB,EAAAA,EAAKksB,OAALlsB,GAAe,EAC5B4M,EAAKwf,eAAoC,OAAnBpsB,EAAAA,EAAKosB,gBAALpsB,EAAuByD,KAAK4oB,GAClDzf,EAAKuf,sBAAiBnsB,EAAAA,EAAKmsB,gBAALnsB,EAAuB,CACxC,MAAIA,EAAKisB,YAAc1kB,EAAK0pC,UAAUE,YAC3CvkC,EAAKqf,UAAYjlB,EAAWmqC,YAE5BvkC,EAAKqf,UAAYjlB,EAAW8pC,eAE9BlkC,EAAKE,WA9EIsQ,EAAAA,EAAAA,GAAAA,IAAAA,EAAAA,EAAAA,UAAAA,OAoFXjc,EAAS2L,OAAT,gBACqB3Q,IAAfL,KAAK4tC,OACP5tC,KAAK6M,UAAUR,qBAAqBrM,KAAK4tC,MAAM/gC,UAEnD,EAMAyoC,EAAAA,cAAAA,WACE,OAAOt1C,KAAKmwB,YAAcjlB,EAAWmqC,WACvC,EAMAE,EAAAA,QAAAA,WACE,OAAOv1C,KAAKmwB,YAAcjlB,EAAW+sB,KACvC,EAMAud,EAAAA,OAAAA,WACE,OAAOx1C,KAAKmwB,YAAcjlB,EAAWkqC,IACvC,EAMAK,EAAAA,UAAAA,WACE,OAAOz1C,KAAKmwB,YAAcjlB,EAAW8pC,OACvC,EAaAU,EAAAA,iBAAAA,WACE,OAAO11C,KAAK+L,WACd,EAMA4pC,EAAAA,kBAAAA,WACE,OAAO31C,KAAKmM,OAAOypC,gBAAgB51C,KAAKie,UAAW,IAAIxU,GACzD,EA/IW6X,GAAAA,EAAAA,EA6HEpU,IAAAA,eAAb,WACE,OAAOlN,KAAK+L,WACd,KA/HWuV,EAAD,CAAgB3Q,IAqJrBklC,GAAK,WAACA,SAAAA,IAGV71C,KACD81C,UAAsB,GAJXD,IAAAA,EAAAA,EAAAA,UAAAA,OAeXE,EAAAA,WAAAA,SAAY5sC,EAAc6sC,EAAkCpI,GAC1D,IAAM5d,EAAQ,IAAI1O,GAAOnY,EAAM6sC,EAASpI,GAIxC,OAFA5tC,KAAK81C,UAAUlyC,KAAKosB,GAEbA,CACT,EAOAimB,EAAAA,YAAAA,SAAaD,GAGX,OAFAh2C,KAAK81C,UAAUlyC,KAAKoyC,GAEbA,CACT,EAMAzB,EAAAA,OAAAA,SAAQyB,GACN,IAAMxB,EAAax0C,KAAK81C,UAAUrB,WAAU5+B,SAAAA,GAC1C,OAAOA,IAASmgC,CAClB,KAEoB,IAAhBxB,GACFx0C,KAAK81C,UAAUr+B,OAAO+8B,EAAY,EAEtC,EAKApvC,EAAAA,QAAAA,WACEpF,KAAK81C,UAAY,EACnB,EArDWD,GAAAA,EAAAA,EA0DPK,IAAAA,iBAAJ,WACE,OAAOl2C,KAAK81C,UAAU9zC,MACxB,KA5DW6zC,CA8DZ,CA9DW,GC1IL,IAAAn4B,GAAK,SAAL/M,YAAM+M,EAqED9F,EACRzO,EACAgtC,EACAvI,EACAzuB,EACAC,SAiBgBwuB,yBAtBRh2B,OAAAA,EAhEV9G,EAGAslC,aAAe,EAkBftlC,EAGAulC,UAAwB,GACxBvlC,EAGA+wB,MAAO,EACP/wB,EAGA+G,SAAW,EACX/G,EAGAwlC,YAAoB,IAAIrsC,GACxB6G,EAGArB,gBAAiB,EAKjBqB,EAGA+8B,SAAU,EACV/8B,EAGAylC,YAAa,EAoBX,IAAMC,EAAQ,IAAIC,GAAiBN,EAAUvI,EAAOxuB,GAEpDtO,EAAK3H,KAAOA,EACZ2H,EAAK1I,KAAO6C,EAAYiL,KACxBpF,EAAKO,SAAU,EACfP,EAAK88B,MAAQA,EAEb98B,EAAKslC,YAAcI,EAAME,iBACzB5lC,EAAKs0B,WAAaoR,EAAMpR,WACxBt0B,EAAK6lC,aAAex3B,EACpBrO,EAAKszB,aAAe+R,EAASp2B,SAC7BjP,EAAKswB,KAAOoV,EAAMI,WAAWh/B,GAC7B9G,EAAK0wB,MAAQgV,EAAMK,cACnB/lC,EAAK+wB,KAAO2U,EAAMM,SAClBhmC,EAAK+G,UAAW+1B,MAAAA,GAAW,OAAXA,EAAAA,EAAO/3B,WAAP+3B,EAAAA,EAAa3uB,cAAe,EAE5CnO,EAAKulC,UAAY,GACjB,IACkBzI,EADZn1B,EAAW+9B,EAAMO,qBACW,OAAhBnJ,EAAAA,MAAAA,OAAAA,EAAAA,EAAO9tB,WAAP8tB,EAAoB,IAE5B77B,SAAQ+F,SAAAA,GAChB,IAAMk/B,EAAU,IAAIC,GAASnmC,EAAK8G,QAElCo/B,EAAQ/1C,OAAOwX,EAAUX,ECzH/B,SAAkC/X,GAC9B,QAAa,IAATA,EAAiB,MAAM,IAAIm3C,eAAe,6DAE9C,OAAOn3C,CACX,CDqH+B+X,CAAAA,IACzBhH,EAAKulC,UAAUzyC,KAAKozC,EACtB,IAEIlmC,EAAKulC,UAAUr0C,QAAU,GAC3B4R,QAAQmR,KAAK,iCAAiC5b,EAAK,KAGrD2H,EAAKwlC,YAAcxlC,EAAKqmC,mBAAmBhB,EAASl2B,eA5G3CvC,EAAAA,EAAAA,GAAAA,IAAAA,EAAAA,EAAAA,UAAAA,OAoHXnE,EAAAA,MAAAA,SAAOrI,GACDlR,KAAK6tC,UAIT7tC,KAAK6tC,SAAU,EACf7tC,KAAKq2C,UAAUtkC,SAAQwvB,SAAAA,GACrBA,EAAKhoB,MAAMrI,EAAMkmC,cAAelmC,EAAMwiB,OACxC,IAEIvkB,GAAaa,cAAcP,iBAC7BzP,KAAKq3C,gBAAkB,IAAI1/B,GAAQ3X,KAAK4X,OAAQ5X,KAAK6X,WAEzD,EAKAxS,EAAS2L,OAAT,gBACqB3Q,IAAfL,KAAK4tC,QACP5tC,KAAK6M,UAAUR,qBAAqBrM,KAAK4tC,MAAM/gC,WAE3C7M,KAAKwhC,OAASxhC,KAAKwhC,MAAM4F,YAAcpnC,KAAK4tC,MAAM3wB,aAAajb,OAAS,GAC1EhC,KAAKwhC,MAAM2F,cAAcnnC,KAAK4tC,MAAM3wB,cAG1C,EAKAyC,EAAAA,WAAAA,WACE,IAAA43B,EAAS,OAATA,EAAAt3C,KAAKohC,OAALkW,EAAW5S,oBACb,EAOAr/B,EAAS4L,OAAT,SAAiBC,EAAsBC,cAYrC,GAXAnR,KAAKsuC,eAAep9B,GAEpBlR,KAAKq2C,UAAUtkC,SAAQ,SAACilC,EAAS1xC,GAC/B6L,EAASo9B,aACPyI,EAAQO,qBACRzmC,EAAK3E,OACL6qC,EAAQQ,qBACRlyC,EAEJ,IAEItF,KAAKyP,qBAA2CpP,IAAzBL,KAAKq3C,gBAA+B,CAC7D,IAAMnhC,EAAOlW,KAAKq3C,gBAAgBnhC,KAElC/E,EAASo9B,aAAar4B,EAAKuC,SAAU7O,GAAQ4kC,SAAUt4B,EAAK4B,SAC9D,CACF,EAMAzS,EAASD,QAAT,WAYE,IAAAkyC,EAEAG,EAMAC,EAnBI13C,KAAKu2C,aAIT5lC,EAAA3P,UAAMoE,QAAD1B,KAAA1D,MAELA,KAAK4tC,WAAQvtC,EACbL,KAAKu2C,YAAa,EAElBv2C,KAAK4X,OAAS,KACd5X,KAAKolC,gBAAa/kC,EACT,OAATi3C,EAAAt3C,KAAKohC,OAALkW,EAAWlyC,UACXpF,KAAKohC,UAAO/gC,EACF,OAAVo3C,EAAAz3C,KAAKwhC,QAALiW,EAAYryC,UACZpF,KAAKwhC,WAAQnhC,EACbL,KAAKq2C,UAAUtkC,SAAQwvB,SAAAA,GACrBA,EAAKn8B,SACP,IACApF,KAAKq2C,UAAY,GACG,OAApBqB,EAAA13C,KAAKq3C,kBAALK,EAAsBtyC,UACtBpF,KAAKq3C,qBAAkBh3C,EACzB,EASAs3C,EAAAA,mBAAAA,SAAoBC,GAClB,QAAmBv3C,IAAfL,KAAKwhC,OAAwBxhC,KAAKwhC,MAAM4F,WAA5C,CAIA,IAAMyQ,EAAe73C,KAAKwhC,MAAM2E,kBAEhC,QAAqB9lC,IAAjBw3C,EAAJ,CAIA,GAAIA,EAAa71C,QAAU41C,EAAa51C,OACtC,MAAM,IAAIwY,MAAM,iCAGlB,IAAK,IAAInY,EAAI,EAAGA,EAAIw1C,EAAa71C,OAAQK,IACvCw1C,EAAax1C,GAAKu1C,EAAav1C,EAPjC,CANA,CAeF,EAOAgd,EAAAA,iBAAAA,SAAkBF,EAAkBimB,GAClCplC,KAAK22C,aAAex3B,EACpBnf,KAAKolC,WAAaA,OACA/kC,IAAdL,KAAKohC,MACPphC,KAAKohC,KAAK+D,iBAAiBC,EAE/B,EAMAkJ,EAAAA,eAAAA,SAAgBp9B,GACd,IAAMoP,EAActgB,KAAKmM,OACnB2rC,EAAex3B,EAAYuF,QAAQjX,SAASijB,YAC5C6c,EAAcx9B,EAAMw9B,YAM1B,GAJA1uC,KAAKq2C,UAAUtkC,SAAQwvB,SAAAA,GACrBA,EAAK+M,eAAehuB,EAAaw3B,EAAcpJ,EACjD,SAE6BruC,IAAzBL,KAAKq3C,gBAA+B,CACtCr3C,KAAKod,mBAAmBkD,GACxB,IAAMxH,EAAY,IAAIrP,GAAQ,EAAG,EAAG,GAC9BsuC,EAAS/3C,KAAKs2C,YAAY9vB,IAC1BwxB,EAASh4C,KAAKs2C,YAAY7yB,IAC1B5K,EAAY,IAAIlT,aAAa,CACjCoyC,EAAOtqC,EAAGsqC,EAAOp1C,EAAGo1C,EAAOrqC,EAC3BsqC,EAAOvqC,EAAGsqC,EAAOp1C,EAAGo1C,EAAOrqC,EAC3BsqC,EAAOvqC,EAAGuqC,EAAOr1C,EAAGo1C,EAAOrqC,EAC3BqqC,EAAOtqC,EAAGuqC,EAAOr1C,EAAGo1C,EAAOrqC,EAE3BqqC,EAAOtqC,EAAGsqC,EAAOp1C,EAAGq1C,EAAOtqC,EAC3BsqC,EAAOvqC,EAAGsqC,EAAOp1C,EAAGq1C,EAAOtqC,EAC3BsqC,EAAOvqC,EAAGuqC,EAAOr1C,EAAGq1C,EAAOtqC,EAC3BqqC,EAAOtqC,EAAGuqC,EAAOr1C,EAAGq1C,EAAOtqC,IAG7B1N,KAAKq3C,gBAAgBrmC,OAAOsP,EAAaouB,EAAYuJ,qBAAsBp/B,EAAWC,EACxF,CACF,EAQAkF,EAAAA,WAAAA,SAAYid,EAAoBC,GAC9B,IAYIC,EAZE7a,EAActgB,KAAKmM,OACnB+rC,EAAiB53B,EAAYuF,QAAQjX,SACrCupC,EAAYD,EAAezxB,eAAewU,EAAW,IAAIxxB,IACzD2uC,EAAeF,EAAetC,gBAAgB1a,EAAc,IAAIzxB,IAEhE4T,EAAWrd,KAAKs2C,YAChB+B,EAAO3xB,GAAcyxB,EAAWC,EAAc/6B,EAASmJ,IAAKnJ,EAASoG,KAE3E,YAAapjB,IAATg4C,EACK,IAKLlpC,GAAaa,cAAcE,YAC7BlQ,KAAKq2C,UAAUtkC,SAAQwvB,SAAAA,GACrB,IAAM+W,EAAQ/W,EAAKvjB,WAAWm6B,EAAWC,EAAc93B,EAAa43B,QAEtD73C,IAAVi4C,SACWj4C,IAAT86B,GAAsBA,EAAOmd,KAC/Bnd,EAAOmd,EAGb,IAEAnd,EAAOkd,OAGIh4C,IAAT86B,EACK,IAGTid,EAAalyB,SAASiV,GACtBgd,EAAU15B,IAAI25B,GACd93B,EAAYmG,eAAe0xB,GAEpB,CAACA,IACV,EAOA/6B,EAAAA,mBAAAA,SAAoBkD,GAClB,IAAM7C,EAAMzd,KAAKs2C,YAAY3c,YACvBoL,EAAqBzkB,EAAYuF,QAAQjX,SAQ/C,OANA5O,KAAKq2C,UAAUtkC,SAAQwvB,SAAAA,GACrB,IAAMgX,EAAShX,EAAKnkB,mBAAmB2nB,GAEvCtnB,EAAI+6B,MAAMD,EACZ,IAEO96B,CACT,EAEApY,EAAQ8xC,mBAAR,SAA4BsB,GAC1B,QAAmBp4C,IAAfo4C,EACF,OAAO,IAAIxuC,GAGb,GAAIwuC,EAAWrwC,OAASqD,EAAK+R,kBAAkBC,IAAK,CACnCg7B,IAAAA,EACFA,EADPl6B,SAASk6B,EAAAA,EAAWl6B,QAAXk6B,EAAqB,CAAC,EAAG,EAAG,GACrC5yC,SAAO4yC,EAAAA,EAAW5yC,MAAX4yC,EAAmB,CAAC,EAAG,EAAG,GACjC12C,EAAI0H,GAAQ4E,UAAUkQ,GACtBm6B,EAAKjvC,GAAQ4E,UAAUxI,GAAMqgB,SAAS,IACtCyyB,EAAY52C,EAAE8jB,QAAQO,SAASsyB,GAC/BE,EAAY72C,EAAE8jB,QAAQpH,IAAIi6B,GAEhC,OAAO,IAAIzuC,GAAK0uC,EAAWC,GAEZH,IAAAA,EACKA,EADdl6B,SAASk6B,EAAAA,EAAWl6B,QAAXk6B,EAAqB,CAAC,EAAG,EAAG,GACrCI,EAAwC,IAAT,OAAjBJ,EAAAA,EAAW/5B,QAAX+5B,EAAqB,GACnC12C,EAAI0H,GAAQ4E,UAAUkQ,GACtBo6B,EAAY52C,EAAE8jB,QAAQO,SAASyyB,GAC/BD,EAAY72C,EAAE8jB,QAAQpH,IAAIo6B,GAEhC,OAAO,IAAI5uC,GAAK0uC,EAAWC,EAE/B,EAMAE,EAAAA,YAAAA,WACE,OAAO94C,KAAK22C,YACd,EApXWj5B,GAAAA,EAAAA,EAyXPq7B,IAAAA,cAAJ,WACE,YAAqB14C,IAAdL,KAAKohC,IACd,KA3XW1jB,EAAD,CAAe/M,IAkYpBsmC,GAAK,WAACA,SAAAA,EAkCEr/B,QAAQA,OAAAA,EAjBrB5X,KAGAmJ,KAAO,GACPnJ,KAGAg5C,gBAAkB,EAClBh5C,KAGAs2C,YAAc,IAAIrsC,GAClBjK,KAGAi5C,cAAe,EAhCJhC,IAAAA,EAAAA,EAAAA,UAAAA,OA2CXh2C,EAAAA,OAAAA,SAAQwX,EAAoBX,EAAoBsH,GAU9C,GATApf,KAAKof,OAASA,EACdpf,KAAKohC,KAAOhiB,EAAOgiB,KACnBphC,KAAKwhC,MAAQpiB,EAAOoiB,MACpBxhC,KAAKk5C,YAAYzgC,GACjBzY,KAAKm5C,YAAYrhC,GACjB9X,KAAKmJ,KAAOiW,EAAOjW,KACnBnJ,KAAKg5C,gBAAkB55B,EAAOvH,SAC9B7X,KAAKyY,SAAS2gC,QAAQh6B,EAAOyiB,WAEXxhC,IAAdL,KAAKohC,KAAoB,CAC3B,IAAMmE,EAAavlC,KAAKohC,KAAK+C,cAI7B,GAFAnkC,KAAKq5C,gBAAkB,IAAI1zC,aAA0B,GAAb4/B,GACxCvlC,KAAKs5C,mBAAqB,IAAI3zC,aAA0B,GAAb4/B,GACvCvlC,KAAKohC,KAAKkE,oBAAqB,CACjC,IAAMoC,EAAc1nC,KAAKohC,KAAK8C,kBAAoBJ,GAAgByV,WAElEv5C,KAAKw5C,mBAAqB,IAAI/R,GAAaznC,KAAK4X,QAChD5X,KAAKy5C,sBAAwB,IAAIhS,GAAaznC,KAAK4X,QACnD5X,KAAKw5C,mBAAmBv4C,OAAOskC,EAAYmC,EAAa,sBACxD1nC,KAAKy5C,sBAAsBx4C,OAAOskC,EAAYmC,EAAa,wBAC7D,OAEI1nC,KAAKyY,SAASihC,cAAgB15C,KAAKyY,SAASkhC,cAG9C/lC,QAAQmR,KAAK,oEAIjB/kB,KAAKi5C,aAAej5C,KAAKyY,SAASwgC,cAKpC,EAOA1/B,EAAAA,MAAAA,SAAO28B,EAAoBxiB,GACzB,IAII5b,EAJEkX,EAAc7f,GAAaa,cAC3B4pC,EAAqB55C,KAAKkqC,aAAagM,GAAY,EAAMxiB,GACzDmmB,EAAoB75C,KAAK8X,SAASoyB,aAAa0P,GAG/CxqC,EAAWD,GAAaa,cAAcZ,SAExCpP,KAAK8X,SAASwzB,gBAChBxzB,EAAW9X,KAAK8X,SAASwzB,eAEzBuO,EAAkB9nC,SAAQ+nC,SAAAA,GACxB,IAAQ3wC,EAAgB2wC,EAAhB3wC,KAAM3J,EAAUs6C,EAAVt6C,MAEdsY,EAASiiC,YAAY5wC,EAAM3J,EAC7B,IAEAQ,KAAK8X,SAAS0X,kBAAkB1X,KAEhCA,EAAWC,EAAS9W,OAClBjB,KAAK4X,OACL,CACEI,OAAQ,CACNC,OAAQjY,KAAK8X,SAASkD,iBACtB7C,SAAUnY,KAAK8X,SAASmD,mBACxB5C,OAAQ2W,EAAY3f,aACpB+f,YAAahgB,EAAWigB,EAAYC,MAAQD,EAAYE,SAI9DvvB,KAAK8X,SAAS0X,kBAAkB1X,GAEpC,EAGAzS,EAAQ2kC,eAAR,SAAwBkM,EAAoB8D,EAAkBtmB,GAC5D,IAAM1Z,EAAwB,GAe9B,GAbIha,KAAKyY,SAASgD,cAChBzB,EAAYpW,KAAK,iBAEf5D,KAAKyY,SAASwhC,eAChBjgC,EAAYpW,KAAK,kBAEf5D,KAAKyY,SAASyhC,YAAY,IAC5BlgC,EAAYpW,KAAK,iBAEf5D,KAAKyY,SAASyhC,YAAY,IAC5BlgC,EAAYpW,KAAK,sBAGAvD,IAAfL,KAAKwhC,OAAuBxhC,KAAKwhC,MAAM4F,WAAY,CAGrDptB,EAAYpW,KAAK,gBACjBoW,EAAYpW,KAAK,gBAAgB5D,KAAKwhC,MAAM0E,oBAC5C,IAAK,IAAI7jC,EAAI,EAAGA,EAAIrC,KAAKwhC,MAAM0E,mBAAoB7jC,IAC7CrC,KAAKwhC,MAAM4E,kBACbpsB,EAAYpW,KAAM,sBAAqBvB,GAErCrC,KAAKwhC,MAAM6E,gBACbrsB,EAAYpW,KAAM,oBAAmBvB,GAEnCrC,KAAKwhC,MAAM8E,iBACbtsB,EAAYpW,KAAM,qBAAoBvB,EAG5C,MAEkBhC,IAAdL,KAAKohC,OACPpnB,EAAYpW,KAAK,kBACjBoW,EAAYpW,KAAK,eAAe5D,KAAKohC,KAAKiE,iBAC1CrrB,EAAYpW,KAAK,oBACjBoW,EAAYpW,KAAK,qBACb5D,KAAKohC,KAAK8C,iBAAmBlqB,EAAYpW,KAAK,2BAGhD5D,KAAK8X,SAASmC,eAAiB7O,GAAc8O,QAG3Cg8B,EAAa,GAAKl2C,KAAKyY,SAASgD,eAElCzB,EAAYpW,KAAK,kBACjBoW,EAAYpW,KAAM,eAAcsyC,SAGnB71C,IAAXqzB,GAAwBA,EAAOmb,YAEjC70B,EAAYpW,KAAK,aACjBoW,EAAYpW,KAAK,iBACb8vB,EAAOsb,iBAGTh1B,EAAYpW,KAAK,+BAUvB,IAAMu2C,EAAahrC,GAAaa,cAAcN,aACxC0qC,EAAep6C,KAAKq6C,sBAAsBF,GAOhD,YALqB95C,IAAjB+5C,IACFpgC,EAAYpW,KAAK,kBACjBoW,EAAYpW,KAAQw2C,EAAa,OAG5BpgC,CACT,EAEA3U,EAAQ6kC,aAAR,SAAsBgM,EAAoB8D,EAAkBtmB,GAC1D,IAAM+V,EAAyB,GAe/B,GAbIzpC,KAAKyY,SAASgD,cAChBguB,EAAU7lC,KAAK,CAAEuF,KAAM,gBAErBnJ,KAAKyY,SAASwhC,eAChBxQ,EAAU7lC,KAAK,CAAEuF,KAAM,iBAErBnJ,KAAKyY,SAASyhC,YAAY,IAC5BzQ,EAAU7lC,KAAK,CAAEuF,KAAM,gBAErBnJ,KAAKyY,SAASyhC,YAAY,IAC5BzQ,EAAU7lC,KAAK,CAAEuF,KAAM,qBAGN9I,IAAfL,KAAKwhC,OAAuBxhC,KAAKwhC,MAAM4F,WAAY,CAGrDqC,EAAU7lC,KAAK,CAAEuF,KAAM,iBACvBsgC,EAAU7lC,KAAK,CAAEuF,KAAM,eAAgB3J,MAAOQ,KAAKwhC,MAAM0E,qBACzD,IAAK,IAAI7jC,EAAI,EAAGA,EAAIrC,KAAKwhC,MAAM0E,mBAAoB7jC,IAC7CrC,KAAKwhC,MAAM4E,kBACbqD,EAAU7lC,KAAK,CAAEuF,KAAM,sBAAsB9G,IAE3CrC,KAAKwhC,MAAM6E,gBACboD,EAAU7lC,KAAK,CAAEuF,KAAM,oBAAoB9G,IAEzCrC,KAAKwhC,MAAM8E,iBACbmD,EAAU7lC,KAAK,CAAEuF,KAAM,qBAAqB9G,GAGlD,MAEkBhC,IAAdL,KAAKohC,OACPqI,EAAU7lC,KAAK,CAAEuF,KAAM,iBACvBsgC,EAAU7lC,KAAK,CAAEuF,KAAM,cAAe3J,MAAOQ,KAAKohC,KAAK+C,gBACvDsF,EAAU7lC,KAAK,CAAEuF,KAAM,mBACvBsgC,EAAU7lC,KAAK,CAAEuF,KAAM,oBACnBnJ,KAAKohC,KAAK8C,iBACZuF,EAAU7lC,KAAK,CAAEuF,KAAM,0BAIvBnJ,KAAK8X,SAASmC,eAAiB7O,GAAc8O,QAC3Cg8B,EAAa,GAAKl2C,KAAKyY,SAASgD,eAClCguB,EAAU7lC,KAAK,CAAEuF,KAAM,iBACvBsgC,EAAU7lC,KAAK,CAAEuF,KAAM,cAAe3J,MAAO02C,UAGhC71C,IAAXqzB,GAAwBA,EAAOmb,YACjCpF,EAAU7lC,KAAK,CAAEuF,KAAM,YACvBsgC,EAAU7lC,KAAK,CAAEuF,KAAM,gBACnBuqB,EAAOsb,iBAGTvF,EAAU7lC,KAAK,CAAEuF,KAAM,8BAU7B,IAAMgxC,EAAahrC,GAAaa,cAAcN,aACxC0qC,EAAep6C,KAAKq6C,sBAAsBF,GAOhD,YALqB95C,IAAjB+5C,IACF3Q,EAAU7lC,KAAK,CAAEuF,KAAM,iBACvBsgC,EAAU7lC,KAAK,CAAEuF,KAAMixC,KAGlB3Q,CACT,EAKArkC,EAAAA,QAAAA,eAWEk1C,EAEAC,EAXAv6C,KAAK4X,OAAS,KACd5X,KAAKof,YAAS/e,EACdL,KAAKohC,UAAO/gC,EACZL,KAAKwhC,WAAQnhC,EACbL,KAAKyY,SAASrT,UACdpF,KAAK8X,SAAS1S,UAEdpF,KAAKq5C,qBAAkBh5C,EACvBL,KAAKs5C,wBAAqBj5C,EACH,OAAvBi6C,EAAAt6C,KAAKw5C,qBAALc,EAAyBl1C,UACzBpF,KAAKw5C,wBAAqBn5C,EACA,OAA1Bk6C,EAAAv6C,KAAKy5C,wBAALc,EAA4Bn1C,UAC5BpF,KAAKy5C,2BAAwBp5C,CAC/B,EAQAiuC,EAAAA,eAAAA,SAAgBhuB,EAAsBk6B,EAAuB9L,GAC3D1uC,KAAKy6C,0BAA0Bn6B,EAAak6B,GAC5Cx6C,KAAK06C,sBAAsBhM,GAC3B1uC,KAAK8X,SAAS4xB,eAAe1pC,KAAKw3C,qBACpC,EAUAx5B,EAAAA,WAAAA,SAAYm6B,EAAoBC,EAAuB93B,EAAsB43B,GAC3E,IAAM76B,EAAWrd,KAAKs2C,YAChB+B,EAAO3xB,GAAcyxB,EAAWC,EAAc/6B,EAASmJ,IAAKnJ,EAASoG,KACrEqV,EAA0B,GAEhC,QAAaz4B,IAATg4C,EAAJ,CAIA,QAAkBh4C,IAAdL,KAAKohC,KACcphC,KAAKohC,KAAK6C,kBAElBlyB,SAAQjF,SAAAA,GACnBgsB,EAAal1B,MAAK,IAAIgG,IAAUs7B,iBAAiBgT,EAAgBprC,GACnE,IAGF,IAAM0pC,EAAQ,IAAI5b,GACZC,EAAc76B,KAAK8X,SAAS8yB,aAIlC,OAFA4L,EAAMv1C,OAAOjB,KAAKyY,SAASA,SAAUoiB,EAAa/B,GAE3C0d,EAAMxb,YAAYmd,EAAWC,EAfpC,CAgBF,EAOAh7B,EAAAA,mBAAAA,SAAoB2nB,GAClB,QAAkB1kC,IAAdL,KAAKohC,OAAuBphC,KAAKs2C,YAAYqE,UAE/C,OAAO36C,KAAKs2C,YAId,IAAMxd,EAA0B,QAEdz4B,IAAdL,KAAKohC,MACcphC,KAAKohC,KAAK6C,kBAElBlyB,SAAQjF,SAAAA,GACnBgsB,EAAal1B,MAAK,IAAIgG,IAAUs7B,iBAAiBH,EAAoBj4B,GACvE,IAGF,IAAM0pC,EAAQ,IAAI3d,GAIlB,OAFA2d,EAAMv1C,OAAOjB,KAAKyY,SAASA,SAAUqgB,GAE9B0d,EAAMxe,eAAeh4B,KAAKs2C,YACnC,EAOA+D,EAAAA,sBAAAA,SAAuBnhC,GACrB,OAAQA,GACN,KAAKzN,EAAKkE,aAAag6B,GACrB,MAAO,WACT,KAAKl+B,EAAKkE,aAAagY,OACrB,MAAO,eACT,KAAKlc,EAAKkE,aAAairC,UACrB,MAAO,kBACT,KAAKnvC,EAAKkE,aAAa1H,MACrB,MAAO,cACT,KAAKwD,EAAKkE,aAAakrC,SACrB,MAAO,iBACT,KAAKpvC,EAAKkE,aAAamrC,UACrB,MAAO,kBACT,KAAKrvC,EAAKkE,aAAaorC,GACrB,MAAO,kBACT,KAAKtvC,EAAKkE,aAAaqrC,SACrB,MAAO,iBACT,KAAKvvC,EAAKkE,aAAasrC,QACrB,MAAO,gBAEb,EAEA51C,EAAQo1C,0BAAR,SAAmCn6B,EAAsBw3B,GACvD,IAAMhgC,EAAW9X,KAAKw3C,qBAEtB1/B,EAAS1L,UAAU,gBAAiB0rC,GAEpC,IAAM1W,EAAOphC,KAAKohC,KAElB,QAAa/gC,IAAT+gC,EAAoB,CACtB,IAAMiY,EAAkBr5C,KAAKq5C,gBACvBC,EAAqBt5C,KAAKs5C,mBAGhC,GADAlY,EAAKwD,wBAAwBtkB,EAAa+4B,EAAiBC,GACvDlY,EAAK8C,gBAAiB,CACxB,IAAMsV,EAAqBx5C,KAAKw5C,mBAC1BC,EAAwBz5C,KAAKy5C,sBAEnCD,EAAmBxoC,OAAOqoC,GAC1BI,EAAsBzoC,OAAOsoC,GAC7BxhC,EAASq3B,WAAW,sBAAuBqK,EAAmBpsB,cAC9DtV,EAASq3B,WAAW,4BAA6BsK,EAAsBrsB,kBAClE,CACL,IAAM8tB,EAA+B,GAC/BC,EAAkC,GAExC9B,EAAgBtnC,SAAQvE,SAAAA,GAAO0tC,OAAAA,EAAmBt3C,KAAK4J,MACvD8rC,EAAmBvnC,SAAQvE,SAAAA,GAAO2tC,OAAAA,EAAsBv3C,KAAK4J,MAC7DsK,EAASsjC,qBAAqB,eAAgBF,GAC9CpjC,EAASsjC,qBAAqB,qBAAsBD,EACtD,CACF,CAGA,IAAM3Z,EAAQxhC,KAAKwhC,MAEnB,QAAcnhC,IAAVmhC,GAAuBA,EAAM4F,WAAY,CAC3C,IAAMnqB,EAAeukB,EAAM2E,kBAAkBj9B,QAE7C4O,EAASujC,UAAU,gBAAiBp+B,EACtC,CACF,EAEA5X,EAAQq1C,sBAAR,SAA+BhM,GAC7B,IAAM52B,EAAW9X,KAAKw3C,qBAItB,GAFA1/B,EAASiB,WAAW,UAAW21B,EAAYrc,iBAEtCryB,KAAKs7C,kBAAmB,CAG3B,IAFA,IAAQlE,EAAgD1I,EAAhD0I,cAAetB,EAAiCpH,EAAjCoH,UAAWyF,EAAsB7M,EAAtB6M,kBAEzBl5C,EAAI,EAAGA,EAAI+0C,EAAe/0C,IACjC,GAAIA,EAAIyzC,EAAU9zC,OAAQ,CACxB,IAAMguB,EAAQ8lB,EAAUzzC,GAClB6tB,EAAYF,EAAM3e,QAAU2e,EAAME,UAAY,EAEpD,GAAIF,EAAMklB,aAAc,CACtB,IAAMkD,EAAemD,EAAkB3F,gBAAgB5lB,EAAM2lB,oBAAqB,IAAIlsC,IAChF+xC,EAAcD,EAAkB90B,eAAeuJ,EAAM0lB,mBAAoB,IAAIjsC,IAEnFqO,EAASiB,WAAW,WAAW1W,EAAE,cAAc+1C,GAC/CtgC,EAASiB,WAAW,WAAW1W,EAAE,aAAam5C,QAE9C1jC,EAASiB,WAAY,WAAU1W,EAAE,cAAc2tB,EAAM2lB,qBACrD79B,EAASiB,WAAY,WAAU1W,EAAE,aAAa2tB,EAAM0lB,oBAEtD59B,EAAS+xB,SAAU,WAAUxnC,EAAE,UAAU2tB,EAAMI,OAC/CtY,EAASiB,WAAY,WAAU1W,EAAE,UAAU2tB,EAAMC,OACjDnY,EAAS+xB,SAAS,WAAWxnC,EAAE,cAAc6tB,GAC7CpY,EAAS+xB,SAAU,WAAUxnC,EAAE,iBAAiBsF,KAAKN,IAAI2oB,EAAMK,iBAC/DvY,EAAS+xB,SAAU,WAAUxnC,EAAE,iBAAiBsF,KAAKN,IAAI2oB,EAAMM,iBAC/DxY,EAAS6zB,OAAQ,WAAUtpC,EAAE,SAAS2tB,EAAMG,WAC5CrY,EAASo3B,WAAY,WAAU7sC,EAAE,YAAY2tB,EAAMilB,cAEnDn9B,EAASiB,WAAY,WAAU1W,EAAE,cAAcoH,GAAQgyC,MACvD3jC,EAAS+xB,SAAS,WAAWxnC,EAAE,UAAU,GACzCyV,EAASiB,WAAY,WAAU1W,EAAE,UAAUoH,GAAQgyC,MACnD3jC,EAAS+xB,SAAS,WAAWxnC,EAAE,cAAc,GAC7CyV,EAASiB,WAAY,WAAU1W,EAAE,aAAaoH,GAAQgyC,MACtD3jC,EAAS+xB,SAAS,WAAWxnC,EAAE,iBAAiB,GAChDyV,EAAS+xB,SAAS,WAAWxnC,EAAE,iBAAiB,GAChDyV,EAAS6zB,OAAO,WAAWtpC,EAAE,SAAS,OACtCyV,EAASo3B,WAAY,WAAU7sC,EAAE,YAAYkH,GAAQkyC,MAIzD,IAAM/nB,EAASgb,EAAYhb,OAE3B,QAAerzB,IAAXqzB,GAAwBA,EAAOmb,UAAW,CAG5C,GAFA/2B,EAASo3B,WAAW,gBAAiB,IAAI3lC,GAAQmqB,EAAOob,iBAAkBpb,EAAOqb,8BACjFj3B,EAASq3B,WAAW,WAAYzb,EAAOqa,cACX1tC,IAAxBqzB,EAAO5S,aACThJ,EAASq3B,WAAW,qBAAsBzb,EAAO5S,kBAC5C,CACL,IAAMsuB,EAAS1b,EAAO0O,iBACJ,CAAC,MAAO,OAAQ,MAAO,MAAO,OAAQ,OAAQ,MAAO,MAAO,OAEpErwB,SAAQ,SAACxO,EAAGlB,GACpByV,EAASiB,WAAY,mBAAkBxV,EAAKkG,GAAQ4E,UAAU+gC,EAAO/sC,IACvE,GACF,CACAyV,EAAS6zB,OAAO,YAAajY,EAAO4O,iBAAmB,GACvDxqB,EAASq3B,WAAW,sBAAuBzb,EAAO3S,cACpD,CACF,CACF,EAMAg4B,EAAAA,QAAAA,WACE,YAAqB14C,IAAdL,KAAKohC,IACd,EAMAmW,EAAAA,mBAAAA,WACE,OAAOv3C,KAAKyY,SAASA,QACvB,EAMAygC,EAAAA,YAAAA,SAAa1rC,GACJnM,EAAHmM,EAAekuC,IACjB17C,KAAKyY,SAAWjL,EAEhBxN,KAAKyY,SAAW,IAAIijC,GAAUluC,EAElC,EAMA2rC,EAAAA,YAAAA,SAAa3rC,GACJnM,EAAHmM,EAAe69B,KAELhqC,EAAHmM,EAAey+B,IADxBjsC,KAAK8X,SAAWtK,EAIhBxN,KAAK8X,SAAW01B,GAAqBhgC,EAEzC,EAMAgqC,EAAAA,mBAAAA,WACE,OAAOx3C,KAAK8X,SAASwzB,cACvB,EAMAgQ,EAAAA,gBAAAA,WACE,OAAOt7C,KAAK8X,SAASmC,eAAiB7O,GAAc8O,KACtD,EAOAktB,EAAAA,SAAAA,WACE,YAAmB/mC,IAAfL,KAAKwhC,OAIFxhC,KAAKwhC,MAAM4F,UACpB,EAMAuU,EAAAA,oBAAAA,WACE,QAAoBt7C,IAAhBL,KAAKof,OAKP,OAJIpf,KAAKs2C,YAAYqE,WACnB36C,KAAKod,mBAAmBxT,GAAQ6lB,gBAG3BzvB,KAAKs2C,YAEZ,IAAMnqC,EAASnM,KAAKof,OAAOjT,OAM3B,OAJInM,KAAKs2C,YAAYqE,WACnB36C,KAAKod,mBAAmBjR,EAAO0Z,QAAQjX,UAGlC5O,KAAKs2C,YAAYzwB,QAAQ+1B,aAAazvC,EAEjD,EAnlBW8qC,CAolBZ,CAplBW,GAylBLyE,GAAK,WAACA,SAAAA,EAUEjjC,QAAOA,SAAAA,EAClBzY,KAAK67C,eAAiBpjC,EAASqjC,oBAXtBJ,IAAAA,EAAAA,EAAAA,UAAAA,OAiBXt2C,EAAAA,QAAAA,WAEEpF,KAAKyY,cAAWpY,EAChBL,KAAK67C,eAAiB,EACxB,EAOAE,EAAAA,aAAAA,SAAc5yC,GAKZ,OAAkB,IAJJnJ,KAAK67C,eAAepH,WAAU5+B,SAAAA,GAC1C,OAAOA,IAAS1M,CAClB,GAGF,EAMAiwC,EAAAA,QAAAA,SAASvX,GACP,IAAMma,EAAUh8C,KAAKyY,SAErB,GAA+B,IAA3BujC,EAAQhjB,eAAsB,CAChC,IAAMijB,EAAaD,EAAQ/iB,oBAER54B,IAAf47C,GACFD,EAAQE,aAAaD,EAAWj6C,OAEpC,CACI6/B,EACEma,EAAQhjB,gBAAkB,GAC5BgjB,EAAQE,cAAcF,EAAQhjB,gBAG5BgjB,EAAQhjB,eAAiB,GAC3BgjB,EAAQE,cAAcF,EAAQhjB,eAGpC,EAMAigB,EAAAA,aAAAA,WACyBj5C,KAAKyY,SAAS2gB,iBAAiB,QAEtD,OACS,CAMX,EAMA+iB,EAAAA,aAAAA,WACE,OAAOn8C,KAAK+7C,aAAa,OAC3B,EAMAtgC,EAAAA,WAAAA,WACE,OAAOzb,KAAK+7C,aAAa,UAC3B,EAMA9B,EAAAA,YAAAA,WACE,OAAOj6C,KAAK+7C,aAAa,WAC3B,EAOA7B,EAAAA,YAAAA,SAAa50C,GACX,OAAc,IAAVA,EACKtF,KAAK+7C,aAAa,OAElB/7C,KAAK+7C,aAAa,MAAMz2C,EAEnC,EAMA82C,EAAAA,UAAAA,WACE,OAAOp8C,KAAK+7C,aAAa,SAC3B,EAMApC,EAAAA,UAAAA,WACE,OAAO35C,KAAK+7C,aAAa,UAC3B,EAMArC,EAAAA,WAAAA,WACE,OAAO15C,KAAK+7C,aAAa,WAC3B,EAxIWL,CAyIZ,CAzIW,GA2INjF,GAAD,WAACA,SAAAA,EAOF4F,EACAC,EACAlX,QAFOiX,SAAAA,OACAC,gBAAAA,OACAlX,WAAAA,EAEPplC,KAAKkE,KAAOm4C,EACZr8C,KAAKyY,SAAW4jC,EAAS5jC,SACzBzY,KAAKokC,aAAeiY,EAASt8B,SAE7B,IAAMw8B,EAAW,IAAI9a,GAErB,GAAI8a,EAASt7C,OAAOjB,KAAKyY,UAAW,CAE9B4jC,IAAAA,EACmBA,EADvB,GAAIA,OAAAA,EAAAA,EAAS7a,YAAT6a,EAAAA,EAAgBnV,QAClBqV,EAAStV,YAA0B,OAAdoV,EAAAA,EAAS7a,YAAK,EAAd6a,EAAgBnV,SAGvClnC,KAAKu8C,SAAWA,CAClB,EAxBE9F,IAAAA,EAAAA,EAAAA,UAAAA,OA2BJ+F,EAAAA,eAAAA,WACE,OAAOx8C,KAAKu8C,SAASnV,UACvB,EAQAyP,EAAAA,YAAAA,WACE,GAAK72C,KAAKw8C,iBAIV,OAAOx8C,KAAKu8C,QACd,EAEAzF,EAAAA,OAAAA,WACE,OAA0B,IAAnB92C,KAAKkE,KAAK29B,IACnB,EAEA6U,EAAAA,eAAAA,WACE,OAAQ,CACV,EAEAK,EAAAA,YAAAA,WACE,OAAO/2C,KAAKkE,KAAKuU,QACnB,EAEAgkC,EAAAA,aAAAA,WACE,OAAOz8C,KAAKkE,KAAK4b,SACnB,EAEA48B,EAAAA,iBAAAA,WACE,OAAO18C,KAAKkE,KAAK4b,UAAU9d,MAC7B,EAEA+2C,EAAAA,QAAAA,WACE,IAAM3X,EAAOphC,KAAKyY,SAASkkC,eAE3B,SAAUvb,EAAKiD,cAAgBjD,EAAK0E,WAAa1E,EAAK/B,qBAAuBr/B,KAAKokC,aACpF,EAEAwY,EAAAA,YAAAA,WACE,OAAO58C,KAAKyY,SAASkkC,cACvB,EAEA/F,EAAAA,WAAAA,SAAYh/B,GACV,IAAMwpB,EAAOphC,KAAK48C,cAElB,GAAIxb,EAAKiD,cAAgBjD,EAAK0E,WAAa1E,EAAK/B,qBAAuBr/B,KAAKokC,aAAc,CAElE,IAAAyY,EAAAC,EADhBC,EAAU,IAAIhZ,GACdI,SAAgB2Y,EAAiC,OAAjCD,EAAA78C,KAAKs8C,gBAAgBx9B,mBAAY,EAAjC+9B,EAAmC1Y,eAAnC2Y,EAAoD,EAI1E,OAFAC,EAAQ97C,OAAOmgC,EAAMxpB,EAAQ5X,KAAKokC,aAAcD,GAEzC4Y,CACT,CAGF,EAxFItG,EAAD,GE5+BEuG,GAAK,WAACA,SAAAA,EAsEEplC,GAlBZ5X,KACDo3C,cAAgB,GAGfp3C,KACDmkC,cAAgB,OASR8Y,cAAe,EAKrBj9C,KAAKk9C,SAAW,cAChBl9C,KAAKm9C,SAAW,GAChBn9C,KAAKyV,SAAW,GAChBzV,KAAK4X,OAASA,EACd5X,KAAKo9C,aAAe,IAAIvH,GACxB71C,KAAKq9C,cAAgB,IAAItJ,GACzB/zC,KAAKs9C,cAAgB,IAAI7pC,IAEzBzT,KAAKu9C,mBAAoB,EACzBv9C,KAAKw9C,UAAY,EACjBx9C,KAAKy9C,gBAAkB,EAEvBz9C,KAAK09C,eAAiB,IAAIzzC,GAC1BjK,KAAK29C,gBAAkB,IAAIthC,GApFlB2gC,IAAAA,EAAAA,EAAAA,UAAAA,OA2FX5I,EAAAA,QAAAA,SAASwJ,GACP59C,KAAK69C,QACL79C,KAAKk9C,SAAWU,EAAKE,cACrB99C,KAAKmR,SAAWysC,EAAKzsC,SACrBnR,KAAK4X,OAASgmC,EAAKzsC,SAASyG,OAC5B5X,KAAKkuC,WAAa0P,EAAK1P,WACvBluC,KAAKu9C,mBAA+C,IAA3BK,EAAKL,kBAC9Bv9C,KAAKi9C,aAAeW,EAAKX,aACzBj9C,KAAKo3C,cAAgBwG,EAAKG,eAC1B/9C,KAAKmkC,cAAgByZ,EAAKzZ,cAC1BnkC,KAAKq9C,cAAcjJ,QAAQp0C,KAAKmR,SAASyQ,WAAY5hB,KAAKmR,SAAS2Q,aACnE9hB,KAAK+tC,QAAU/tC,KAAKkuC,WAAWqE,oBAC/BvyC,KAAKg+C,gBAAgBJ,GAEjB59C,KAAKo3C,cAAgB,GACvBxjC,QAAQmR,KAAM,yBAAwB/kB,KAAKo3C,cAAc,aAE7D,EAEA/xC,EAAQ24C,gBAAR,SAAyBJ,GACvB,IAMyBA,EACIA,EACAA,EACFA,EACUA,EAV/BK,EAAYj+C,KAAK4X,OAAOvC,cACxB2Z,EAAc7f,GAAaa,cAEjCgf,EAAYlf,QACZkf,EAAY5f,SAA+B,IAApB6uC,EAAU/uB,MAEjCF,EAAY1f,kBAAasuC,EAAAA,EAAKtuC,YAALsuC,EAAmBruC,EAC5Cyf,EAAYxf,sBAAiBouC,EAAAA,EAAKpuC,gBAALouC,EAAuB,OACpD5uB,EAAYvf,sBAAiBmuC,EAAAA,EAAKnuC,iBAALmuC,EAC7B5uB,EAAYtf,aAAgC,OAAjBkuC,EAAAA,EAAKluC,cAALkuC,EAAqBnyC,EAAKkE,aAAaC,KAClEof,EAAYnf,uBAAoD,OAA3B+tC,EAAAA,EAAK/tC,wBAAL+tC,EAA+B,EAAI,EAC1E,EAEAv4C,EAAQw4C,MAAR,WACE79C,KAAKoF,UAELpF,KAAKk9C,SAAW,GAChBl9C,KAAKmR,cAAW9Q,EAChBL,KAAKkuC,gBAAa7tC,EAClBL,KAAKm9C,SAAW,GAChBn9C,KAAKyV,SAAW,GAEhBzV,KAAKo9C,aAAe,IAAIvH,GACxB71C,KAAKq9C,cAAgB,IAAItJ,GACzB/zC,KAAKs9C,cAAgB,IAAI7pC,IACzBzT,KAAK+tC,aAAU1tC,EACfL,KAAK0zB,YAASrzB,EACdL,KAAKy9C,gBAAkB,EAEvBz9C,KAAKw9C,UAAY,EACjBx9C,KAAK29C,gBAAkB,IAAIthC,EAC7B,EAKAjX,EAAAA,QAAAA,WAQE,IAAA84C,EAPAl+C,KAAKm9C,SAASprC,SAAQ8D,SAAAA,GAAQA,OAAAA,EAAKzQ,aACnCpF,KAAKm9C,SAAW,GAChBn9C,KAAKyV,SAAS1D,SAAQmE,SAAAA,GAAQA,OAAAA,EAAK9Q,aACnCpF,KAAKyV,SAAW,GAChBzV,KAAKo9C,aAAah4C,UAClBpF,KAAKq9C,cAAcj4C,UACnBpF,KAAK+tC,aAAU1tC,EACJ,OAAX69C,EAAAl+C,KAAK0zB,SAALwqB,EAAa94C,UACbpF,KAAK0zB,YAASrzB,EACdL,KAAK29C,gBAAgBlhC,QAErBzc,KAAKmR,cAAW9Q,EAChBL,KAAKkuC,gBAAa7tC,EAElBL,KAAK4X,YAASvX,EACdL,KAAKs9C,cAAc7gC,OACrB,EAMAyC,EAAAA,QAAAA,SAASrJ,GACP,GAAQxU,EAAJwU,EAAgB6H,IAAO,CACzB,IAAMxH,EAAOL,OAEaxV,IAAtB6V,EAAKygC,cACP32C,KAAKs9C,cAAclwC,IAAI8I,EAAKygC,aAAczgC,GAG5CgJ,EAAQlf,KAAKyV,SAAUS,EACzB,MAAO,GAAQ7U,EAAJwU,EAAgBoL,IAAS,CAClC,IAAMyS,EAAS7d,EAEf6d,EAAOoa,MAAM9tC,KAAK+tC,SACb/tC,KAAKi9C,eAKRvpB,EAAOwO,YAAa,GAEtBliC,KAAK0zB,OAASA,CAChB,MAAeryB,EAAJwU,EAAgByL,IACzBthB,KAAKo9C,aAAanH,YAAYpgC,GAE9B7V,KAAKq9C,cAAc/I,aAAaz+B,GAGlCqJ,EAAQlf,KAAKm9C,SAAUtnC,EACzB,EAMAgK,EAAAA,WAAAA,SAAYhK,GACV,GAAQxU,EAAJwU,EAAgB6H,IAAO,CACzB,IAAMxH,EAAOL,OAEaxV,IAAtB6V,EAAKygC,cACP32C,KAAKs9C,cAActL,OAAO97B,EAAKygC,cAGjC92B,EAAW7f,KAAKyV,SAAUS,EAC5B,MAAe7U,EAAJwU,EAAgBoL,IACzBjhB,KAAK0zB,YAASrzB,EACDgB,EAAJwU,EAAgByL,IACzBthB,KAAKo9C,aAAa7I,OAAO1+B,GAEzB7V,KAAKq9C,cAAc9I,OAAO1+B,GAG5BgK,EAAW7f,KAAKm9C,SAAUtnC,EAC5B,EAMA6+B,EAAAA,oBAAAA,SAAqB1yB,EAAyB8wB,GAC5C,IAAMqL,EAAmB,IAAInrB,EAAUnoB,GAClCmX,CAAAA,EAAAA,EAAAA,CACHtV,OAAO,KAGH0xC,GAAe,IAAItyC,IAAaO,qBAAqB8xC,GAE3Dn+C,KAAKq9C,cAAc3I,oBACjB1yB,EAAOK,IACPywB,EACA9wB,EAAO+f,OACP/f,EAAOC,KACPD,EAAOG,IACPi8B,EAAazwC,cACbywC,EAAavwC,cACbmU,EAAO6O,SAEX,EAOAwtB,EAAAA,KAAAA,SAAMC,GACJ,IAAMC,EAAeD,EACft8B,EAAShiB,KAAKw+C,aACd3rB,EAAa7Q,EAAO6Q,WACpBogB,EAAmBjxB,EAAOixB,iBAC1BgF,EAAuBhF,EAAiBptB,QAAQK,SAAS2M,GAE/D7yB,KAAK0uC,YAAc,CACjB6P,aAAcA,EAEdv8B,OAAQA,EACRqQ,eAAgBrQ,EAAO6xB,SACvBhhB,WAAYA,EACZ0oB,kBAAmB1oB,EAAWhN,QAAQjX,SACtCqkC,iBAAkBA,EAClBgF,qBAAsBA,EACtBwG,QAASz8B,EAAOvB,UAChBi+B,YAAa,EAEb5I,UAAW91C,KAAKo9C,aAAatH,UAC7BsB,cAAep3C,KAAKo3C,cACpBjT,cAAenkC,KAAKmkC,cACpBzQ,OAAQ1zB,KAAK0zB,QAGX1zB,KAAKu9C,mBACPv9C,KAAK2+C,kBAAkB3+C,KAAK0uC,aAG9B1uC,KAAKw9C,WAAa,EAClBx9C,KAAKy9C,gBAAkBc,CACzB,EAOAI,EAAAA,kBAAAA,SAAmBC,GACjB,IAAMC,EAAuC,GACvCC,EAAyB,GAE/B9+C,KAAKyV,SAAS1D,SAAQmE,SAAAA,GACpB,GAAIA,EAAK03B,OAAS13B,EAAK03B,MAAMmR,QAAS,CACpC,IAAMp6B,EAAYzO,EAAK03B,MAEvBiR,EAAej7C,KAAK+gB,GACpBm6B,EAAal7C,KAAK+gB,EAAU9M,SAC9B,CACF,IAEAinC,EAAa/1B,MAAK,SAAClB,EAAGC,UAAMD,EAAIC,KAIhC,IAAM+K,EAAa+rB,EAAO/rB,WAE1BgsB,EAAe91B,MAAK,SAAClB,EAAuBC,GAC1C,IAAMk3B,EAAe91B,GAAYkF,kBAAkBvG,GAC7Co3B,EAAe/1B,GAAYkF,kBAAkBtG,GAEnD,GAAIk3B,GAAgBC,EAAc,CAChC,IAAMC,EAAYr3B,EAAEhb,UAAU6oC,mBACxByJ,EAAYr3B,EAAEjb,UAAU6oC,mBACxB0J,EAAUvsB,EAAWpM,eAAey4B,GACpCG,EAAUxsB,EAAWpM,eAAe04B,GAE1C,OAAIC,EAAQ1xC,IAAM2xC,EAAQ3xC,EAAYma,EAAEhQ,SAAWiQ,EAAEjQ,SAA0BunC,EAAQ1xC,EAAI2xC,EAAQ3xC,CACrG,CAAO,OAAIsxC,EACF,EACEC,GACD,EAEDp3B,EAAEhQ,SAAWiQ,EAAEjQ,QAE1B,IAKA,IAHA,IAAIynC,GAAe,MAGVj9C,EAAI,EAAGA,EAAIw8C,EAAe78C,OAAQK,IAAK,CAC9C,IAAM6T,EAAO2oC,EAAex8C,GACtBwV,EAAWinC,EAAaz8C,GAE1Bi9C,EAAcznC,GAChBynC,EAAcznC,EACd3B,EAAK2B,SAAWA,IAEhBynC,GAAe,GACfppC,EAAK2B,SAAWynC,EAEpB,CACF,EAQAC,EAAAA,UAAAA,SAAWpgC,GACT,IAAMjJ,EAAOlW,KAAKs9C,cAAcjpC,IAAI8K,GAEpC,QAAa9e,IAAT6V,GAAuBA,EAAK7E,QAIhC,OAAO6E,CACT,EAOAspC,EAAAA,aAAAA,SAAc/hC,GACZ,IAAMgiC,EAAWhiC,MAAAA,EAAAA,EAAO,IAAIxT,GAmB5B,OAjBAjK,KAAKm9C,SAASprC,SAAQ8D,SAAAA,GACpB,GAAIA,EAAKzN,OAAS6C,EAAYiL,KAAM,CAClC,IAAMA,EAAOL,EAEb,GAAIK,EAAK03B,MAAO,CACd,IACMttB,EADYpK,EAAK03B,MAAM/3B,KAAK6pC,oBACJlzC,iBACxBmzC,EAAUzpC,EAAKkH,mBAAmBkD,GAExCq/B,EAAQ/D,aAAat7B,GACrBm/B,EAASjH,MAAMmH,QAEfF,EAASjH,MAAMtiC,EAAKkH,mBAAmBxT,GAAQ6lB,gBAEnD,CACF,IAEOgwB,CACT,EAEAG,EAAAA,eAAAA,WACEhsC,QAAQrU,KAAK,iEACbqU,QAAQrU,KAAK,iEACbS,KAAKyV,SAAS1D,SAAQ,SAACmE,EAAM5Q,GAC3BsO,QAAQrU,KAAK,SAAU+F,EAAO4Q,EAChC,IACAlW,KAAKq9C,cAAc1I,gBAAgB5iC,SAAQ,SAAC8tC,EAAKv6C,GAC/CsO,QAAQrU,KAAK,WAAY+F,EAAOu6C,EAClC,IACAjsC,QAAQrU,KAAK,mBAAoBS,KAAKq9C,cAAczI,oBACpD50C,KAAKo9C,aAAatH,UAAU/jC,SAAQ,SAACie,EAAO1qB,GAC1CsO,QAAQrU,KAAK,UAAW+F,EAAO0qB,EACjC,IACApc,QAAQrU,KAAK,iEACbqU,QAAQrU,KAAK,gEACf,EAMAugD,EAAAA,YAAAA,WACE,OAAO9/C,KAAKmR,QACd,EAMAg9B,EAAAA,cAAAA,WACE,OAAOnuC,KAAKkuC,UACd,EAtaW8O,GAAAA,EAAAA,EA2aPwB,IAAAA,mBAAJ,WACE,OAAOx+C,KAAKq9C,cAAcvI,iBAC5B,IAKIoB,IAAAA,iBAAJ,WACE,OAAOl2C,KAAKo9C,aAAalH,UAC3B,IAKI6J,IAAAA,uBAAJ,WACE,OAAOp4C,KAAK6e,IAAI,GAAIxmB,KAAKo9C,aAAalH,WACxC,KA3bW8G,CA4bZ,CA5bW,GC7HLgD,GAAK,SAALC,GAAMD,SAAAA,kDAIF72C,KAAO,UAJL62C,EAAAA,EAAAA,GAAAA,IAAAA,EAAAA,EAAAA,UAAAA,OA6CX36C,EAAS66C,WAAT,SAAqBC,EAAsChvC,GACzD,IAAM/B,EAAmD,IAAxC+B,EAASyG,OAAOvC,cAAc6Z,MACzCkxB,EAAgBrlC,KAChBslC,EAAkBnlC,KAClBolC,EAAiC,CACrCj7B,GAAI7Z,GACJrC,KAAM,aACNsqB,SAAUhoB,EAAKkV,SAAS4/B,OACxBpoC,SAAUioC,EAAcnlC,mBACxBhD,OAAQmoC,EAAcplC,iBAEtBoU,YAAahgB,EAAWigB,EAAYC,MAAQD,EAAYE,OAEpDixB,EAAmC,CACvCn7B,GAAIzZ,GACJzC,KAAM,eACNsqB,SAAUhoB,EAAKkV,SAAS4/B,OACxBpoC,SAAUkoC,EAAgBplC,mBAC1BhD,OAAQooC,EAAgBrlC,iBAExBoU,YAAahgB,EAAWigB,EAAYC,MAAQD,EAAYE,OAM1D,OAHApe,EAASyG,OAAO6oC,qBAAqBH,GACrCnvC,EAASyG,OAAO6oC,qBAAqBD,GAE9B7gD,QAAQV,SACjB,EAOAoG,EAASq7C,yBAAT,SAAmChrC,EAA0BxE,GAC3DlR,KAAK2gD,YAAczvC,EAAM0vC,QAEzB,IAAMhpC,EAASlC,EAAYvE,SAASyG,OAEpC5X,KAAK6gD,MAAQ,IAAIvP,GAAiB15B,GAClC5X,KAAK6gD,MAAM/S,OAAM,EACnB,EAOAzoC,EAASy7C,mBAAT,SAA6BprC,EAA0BqrC,GACrD,IAAMz2C,EAAQ,CACZ+a,GAAI,kBACJlc,KAAM,kBACNoa,SAAU,QACVy9B,YAAav1C,EAAKw1C,sBAEdprC,EAAO,IAAIqrC,EAAQxrC,EAAYyrC,YAAa72C,GAElDoL,EAAYwJ,QAAQrJ,GAEpB,IAAM2d,EAAO3d,EAAKurC,aAAaC,IAE/B7tB,EAAK7U,SAAS,CAAEkiC,MAAO7gD,KAAK6gD,QAC5BrtB,EAAK4gB,QAAQp0C,KAAK2gD,YACpB,EAMAt7C,EAASi8C,uBAAT,SAAiC5rC,GAC/B1V,KAAK6gD,MAAMz7C,UAEXpF,KAAK6gD,MAAQ,KAEb7gD,KAAK2gD,YAAc,IACrB,EAxHWX,EAmBWuB,gBAAtB,SAAuCrwC,EAAckF,UAArDvW,GAAA,WAmByBuW,IAAAA,EAjBforC,EASAC,EAKWrrC,EAAb9G,EAGiB8G,EAAjB5G,oDAIN,YAtB2BnP,IAAvB+V,EAAQqrC,aACJD,EAAAA,CACJ,iBACA,eACA,iBACA,kBACA,oBACA,eACA,0BAEIC,EAAarrC,EAAQqrC,WAE3BD,EAAQzvC,SAAQ1S,SAAAA,GAAO6R,OAAAA,EAAM0vC,QAAQvhD,GAAOoiD,EAAWpiD,OAGnDiQ,SAAa8G,EAAAA,EAAQkgB,KAARlgB,EAAe,GAElClF,EAAM0vC,QAAQ,WAAgBtxC,EACxBE,EAAuD,OAAtC4G,SAAAA,EAAAA,EAAQqrC,mBAARrrC,EAAsC,gBAAtCA,EAA0C,OAGjE0Z,GAAamD,gBAAgB/hB,EAAO5B,EAAYE,GAChD,GAAM8hC,GAAiBoB,qCAAvBhnB,EAAA3oB,cACF,GAxBAlD,IAnBWmgD,EAAD,CAAqBC,GAqI1BoB,GAAK,SAALjgC,YAAMigC,EAmCEzpC,EAAgBxB,gBACrBwB,EAAAA,EAAAA,KAAAA,KAAAA,IAAAA,MAnCAtI,WAAaC,IACbC,eAAiB,SACjBytC,cAAe,IACfxtC,gBAAiB,IACjBiyC,iBAAkB,EAIzB5wC,EACOysC,mBAAoB,EAI3BzsC,EACOpB,aAAejE,EAAKkE,aAAaC,KAIxCkB,EACOjB,uBAAyB,EAAI,GAiB/BuG,GACFtF,EAAK6N,SAASvI,KAtCPirC,EAAAA,EAAAA,GAAAA,IAAAA,EAAAA,EAAAA,UAAAA,OA8CXh8C,EAASoa,aAAT,SAAuBD,GACrB,IAAM9J,EAAc1V,KAAK6V,KAAKH,YAE9B,GAAI1V,KAAK0hD,iBAA2C,GAAxB1hD,KAAKkR,MAAMssC,UAAgB,CAuBrD9nC,IAAAA,EAfkBisC,EACGA,EALfA,EAAejsC,EAAYsM,OAC3B4/B,GAAkB,IAAI91C,IAAaI,YAAYy1C,EAAaE,iBAE5DC,GADmB,IAAIxzC,IAAcK,eAAeizC,GACjBlzC,MAAMmX,QACzCk8B,SAAYJ,EAAAA,EAAat/B,KAAbs/B,EAAoB,GAChCK,SAAeL,EAAAA,EAAa5f,QAAb4f,EAAuB,EAEtCM,EAAYjiD,KAAKkR,MAAMsuC,eAEvB0C,EADUD,EAAUp8B,QAAQ+1B,aAAagG,EAAgB70C,aACvC0T,QAAQ,IAAIhX,IAAWyc,SAAS,IAClDi8B,EAAWD,EAAQz0C,EACnB20C,EAAYF,EAAQv/C,EACpB0/C,EAAcD,EAAYz6C,KAAK8b,IAAI0+B,EAAWC,EAAYJ,EAAc,GACxEzjC,EAAS0jC,EAAUzhC,UAAU,IAAI/W,IACjChE,EAAS48C,EAAc16C,KAAK4rC,IAAgB,GAAZwO,EAAkB33C,IAClD8C,EAAWqR,EAAOsH,QAAQpH,IAAIqjC,EAAgBj8B,QAAQK,SAASzgB,EAASy8C,EAAQx0C,IAGtFgI,EAAYsM,OAAO9U,SAAWA,EACb,OAAjBwI,EAAAA,EAAYE,QAAZF,EAAmB3D,SAAQ8D,SAAAA,GACzB,GAAIA,EAAKzN,OAAStJ,EAAkB,CAClC,IAAM6lB,EAAY9O,EAAKE,aAAayL,IAEpC,GAAImD,MAAAA,OAAAA,EAAAA,EAAW1O,QAAS,CACFJ,IAAAA,EAEd2lC,IAFc3lC,OAAAA,EAAAA,EAAKhJ,UAAUy1C,sBAAfzsC,EAAAA,EAAgCrJ,mBAAoB5C,GAAQ4kC,SAAS3oB,SACtDjX,SACA6X,eAAevZ,GAElDyX,EAAUrC,aAAak5B,GAGvB5nC,QAAQrU,KAAK,eAAe0iD,EAAUz7B,IAAI+7B,UAAU,OAAMN,EAAUx+B,IAAI8+B,UAAU,MAClF3uC,QAAQrU,KAAM,2BAA0Bi8C,EAAY+G,UAAU,KAChE,CACF,CACF,GACF,CAEAviD,KAAKwiD,kBAAkB9sC,GACvB1V,KAAKkR,MAAMmtC,KAAK7+B,EAClB,EAKAna,EAASua,UAAT,WACE5f,KAAKkR,MAAM9L,UAEXpF,KAAKkR,MAAQ,KAEblR,KAAK6gD,MAAQ,IACf,EAMAx7C,EAASsZ,SAAT,SAAmBza,GACjBkd,EAAApgB,UAAM2d,SAASza,KAAAA,KAAAA,GAEf,IAAMkS,EAAUlS,EAEhBlE,KAAK6gD,MAAQzqC,EAAQyqC,MACrB7gD,KAAKkR,MAAQ,IAAI8rC,GAAch9C,KAAK4X,OACtC,EAMAw8B,EAAAA,QAAAA,SAASuM,GAwBgC,IAAA8B,EAvBrB9B,EACIA,EACFA,EACEA,EACCA,EACEA,EACLA,EACUA,EAP9B3gD,KAAKsP,WAAaqxC,OAAAA,EAAAA,EAAY,YAAZA,EAA6B3gD,KAAKsP,WACpDtP,KAAKwP,eAAiBmxC,OAAAA,EAAAA,EAAY,gBAAZA,EAAiC3gD,KAAKwP,eAC5DxP,KAAKi9C,aAAe0D,OAAAA,EAAAA,EAAY,cAAZA,EAA+B3gD,KAAKi9C,aACxDj9C,KAAKyP,eAAiBkxC,OAAAA,EAAAA,EAAY,gBAAZA,EAAiC3gD,KAAKyP,eAC5DzP,KAAK0hD,gBAAkBf,OAAAA,EAAAA,EAAY,iBAAZA,EAAkC3gD,KAAK0hD,gBAC9D1hD,KAAKu9C,kBAAoBoD,OAAAA,EAAAA,EAAY,mBAAZA,EAAoC3gD,KAAKu9C,kBAClEv9C,KAAK0P,aAAeixC,OAAAA,EAAAA,EAAY,cAAZA,EAA+B3gD,KAAK0P,aACxD1P,KAAK6P,uBAAyB8wC,OAAAA,EAAAA,EAAY,wBAAZA,EAAyC3gD,KAAK6P,uBAE5E,IAcuC6yC,EAdjC/9B,EAAY3kB,KAAK6V,KAAKH,YAE5B1V,KAAKkR,MAAMkjC,QAAQ,CACjB0J,cAAgB,GAAEn5B,EAAUU,GAC5BlU,SAAUnR,KAAK4X,OAAOzG,SACtB+8B,WAAYluC,KAAK6gD,MACjBvxC,WAAYtP,KAAKsP,WACjBE,eAAgBxP,KAAKwP,eACrBC,eAAgBzP,KAAKyP,eACrB8tC,kBAAmBv9C,KAAKu9C,kBACxB7tC,aAAc1P,KAAK0P,aACnBG,uBAAwB7P,KAAK6P,uBAC7BotC,aAAcj9C,KAAKi9C,aACnBc,eAAgB/9C,KAAK2iD,oBACrBxe,cAAenkC,KAAK4iD,iBAA6C,OAA5BF,EAAqB,OAArBD,EAAAziD,KAAK6V,KAAKH,kBAAW,EAArB+sC,EAAuB7sC,OAAvB8sC,EAAgC,MAEvE1iD,KAAKwiD,kBAAkB79B,EACzB,EAQAtf,EAAQm9C,kBAAR,SAA2B9sC,GACzB1V,KAAKkR,MAAMwjC,oBAAoBh/B,EAAYsM,OAAO6gC,aAAcntC,EAAYsM,OAAO8gC,oBACrF,EAEAz9C,EAAQs9C,kBAAR,WAEgB,IAAAF,EAAAC,EADV3E,EAAiB,EASrB,OAR0C,OAA5B2E,EAAA,OAAAD,EAAAziD,KAAK6V,KAAKH,kBAAV,EAAA+sC,EAAuB7sC,OAAvB8sC,EAAgC,IAExC3wC,SAAQ8D,SAAAA,GACRA,EAAKE,aAAaoL,KACpB48B,GAEJ,IAEOA,CACT,EAEA14C,EAAQu9C,iBAAR,SAA0BhtC,cACpBuuB,EAAgB,EAqBpB,OAnBAvuB,EAAM7D,SAAQ8D,SAAAA,GACZ,IAAMktC,EAAWltC,EAAKE,aAAaC,IAEnC,GAAI+sC,GAAYA,EAAS7+C,KAAM,CAC7B,IAAMuU,EAAWsqC,EAAS7+C,KAAKuU,SAE/B,GAAYpX,EAARoX,EAAoBC,GAAU,CAChC,IAAM0oB,EAAO3oB,EAASkkC,eAElBvb,EAAK0E,YACP3B,EAAgBx8B,KAAK8b,IAAI2d,EAAK0E,UAAU9jC,OAAQmiC,GAEpD,CACF,CAC6B,IAAzBtuB,EAAKsP,SAASnjB,SAChBmiC,EAAgBx8B,KAAK8b,IAAI3S,EAAK8xC,iBAAiB/sC,EAAKsP,UAAWgf,GAEnE,IAEOA,CACT,EAtMWkd,EAAD,CAA8BjgC,GA8MnC,SAASrC,GAAiB4F,GACXA,IAAAA,EAAdjP,EAAciP,MAAAA,GAAe,OAAfA,EAAAA,EAAW9O,WAAX8O,EAAAA,EAAiBjP,YAC/BstC,EAAattC,MAAAA,OAAAA,EAAAA,EAAautC,cAAc,mBACxCC,EAAaF,MAAAA,OAAAA,EAAAA,EAAYjtC,aAAasrC,IAE5C,OAAO6B,MAAAA,OAAAA,EAAAA,EAAYhyC,KACrB,CApNamwC,GAAAA,EAAAA,CADZ3gC,EAAajV,EAAKkV,SAAS0gC,uBACfA,IC5IN,OAAA8B,GAAK,SAAL/hC,YAAM+hC,EAWEvrC,EAAgBxB,gBACrBwB,EAAAA,EAAAA,KAAAA,KAAAA,IAAAA,KACFxB,GACFtF,EAAK6N,SAASvI,KAdP+sC,OAAAA,EAAAA,EAAAA,GAAAA,EAAAA,UAsBFxkC,SAAT,SAAmBvI,GACjBgL,EAAApgB,UAAM2d,SAASvI,KAAAA,KAAAA,GACfpW,KAAKoW,QAAUA,CACjB,EAzBW+sC,EAAD,CAA4B/hC,GAA3B+hC,GAAAA,EAAAA,CADZziC,EAAajV,EAAKkV,SAASyiC,gBACfD,ICgIDE,SAAAA,4IAAAA,CAAAA,KAAAA,GAAAA,CAAAA,IC9HL,IAAAC,GAAK,WAACA,SAAAA,EAeT5tC,QAAQA,YAAAA,EAdFksC,KAAAA,gBAAkB,IAAI91C,GACtBy3C,KAAAA,iBAAmB,IAAIj1C,QAEvBk1C,YAA0C,CAChDp7C,KAAMi7C,GAAkBzzC,KACxB6zC,YAAY,EACZC,QAAS,EACTC,QAAS,EACTC,YAAa,IACbC,aAAc,IACdjiD,OAAQ,IAXC0hD,IAAAA,EAAAA,EAAAA,UAAAA,OAkBXQ,EAAAA,kBAAAA,SAAmBpuC,GACjB1V,KAAK0V,YAAcA,CACrB,EAEAquC,EAAAA,QAAAA,eACSC,SAAP,OAAO,OAAAA,EAAAhkD,KAAK0V,YAAYE,YAAjB,EAAAouC,EAAwBC,MAAKpuC,SAAAA,UAAQA,EAAK1M,OAAS2H,EAAKozC,qBACjE,EAEAA,EAAAA,iBAAAA,WACE,OAAOlkD,KAAKwjD,YAAY5hD,MAC1B,EAEAuiD,EAAAA,eAAAA,WACE,OAAOnkD,KAAKwjD,YAAYp7C,IAC1B,EAEAg8C,EAAAA,WAAAA,SAAYC,GAENrkD,KAAKwjD,YAAY5hD,SAAWyiD,EAAMC,WACpCtkD,KAAKwjD,YAAY5hD,OAASyiD,EAAMC,SAChCtkD,KAAKwjD,YAAYp7C,KAAOi7C,GAAkB5rB,WAI5C,IAAM5hB,EAAO7V,KAAK+jD,UAElB,QAAa1jD,IAATwV,EAGF,OAFAjC,QAAQmR,KAAK,mEAAmE/kB,KAAKwjD,YAAY5hD,OAAO,KAEjG5B,KAAK0V,YAAYsM,OAAO6gC,aAGjC,IAScwB,EACAA,EACAA,EAWAA,EAtBRriC,EAAShiB,KAAK0V,YAAYsM,OAC1Bm8B,EAAmB,IAAInrB,EAAUnoB,GAAA,CAAA,EAClCmX,EAAO6gC,aAAU,CACpBn2C,OAAO,KAEHk1C,GAAkB,IAAI91C,IAAaO,qBAAqB8xC,GACxDoF,GAAmB,IAAIj1C,IAAcK,eAAeizC,GAGpDpzC,SAAQ61C,EAAAA,EAAM71C,OAAN61C,EAAe,EACvB51C,SAAQ41C,EAAAA,EAAM51C,OAAN41C,EAAe,EACvB31C,SAAQ21C,EAAAA,EAAM31C,OAAN21C,EAAe,EACvB/8C,EAAMi8C,EAAiB/0C,MAAMqX,QAAQK,SAAS1X,GAIpD,GAFAlH,EAAImX,IAAI8kC,EAAiB90C,MAAMoX,QAAQK,SAASzX,IAChDnH,EAAImX,IAAI8kC,EAAiB70C,MAAMmX,QAAQK,SAASxX,IAC5CpH,EAAIi9C,gBAAkB,KACxB,OAAOviC,EAAO6gC,aAEhBv7C,EAAIoxB,YAGJ,IAAM8rB,SAAQH,EAAAA,EAAMG,OAANH,EAAe,GACvBhmC,EAAMujC,EAAgBj0C,cAW5B,OATA0Q,EAAII,IAAInX,EAAIue,QAAQK,SAASs+B,IAC7BxkD,KAAKsiB,aAAazM,EAAMwI,GAGpBre,KAAKwjD,YAAYp7C,OAASi7C,GAAkBoB,cAC9CzkD,KAAK4hD,gBAAgBh0C,YAAYyQ,GACjCre,KAAKujD,iBAAiBh1C,OAAS8P,GAG1B2D,EAAO6gC,YAChB,EAEA6B,EAAAA,cAAAA,SAAej3C,EAAW9K,EAAWgf,EAAeE,EAAgByiC,GAClE,IAAMrkD,EAAO,CACXmI,KAAMi7C,GAAkB5rB,UACxBgsB,YAAY,EACZC,QAASj2C,EACTk2C,QAAShhD,EACTihD,YAAajiC,EACbkiC,aAAchiC,EACdjgB,OAAQ0iD,GAGV,OAAOtkD,KAAK2kD,aAAa1kD,EAC3B,EAEA2kD,EAAAA,WAAAA,SAAYn3C,EAAW9K,EAAW6hD,GAChC,IAAKxkD,KAAKwjD,YAAYC,WACpB,OAAOzjD,KAAK0V,YAAYsM,OAAO6gC,aAGjC,IAAMgC,EAAO7kD,KAAKwjD,YACZlkD,EAAM,CACV8I,KAAMi7C,GAAkB5rB,UACxBgsB,YAAY,EACZC,QAASj2C,EACTk2C,QAAShhD,EACTihD,YAAaiB,EAAKjB,YAClBC,aAAcgB,EAAKhB,aACnBjiD,OAAQijD,EAAKjjD,OACb4iD,YAAOA,EAAAA,EAAS,MAGlB,OAAOxkD,KAAK8kD,YAAYxlD,EAC1B,EAEAylD,EAAAA,YAAAA,WACE/kD,KAAKglD,YACP,EAEAC,EAAAA,aAAAA,SAAcx3C,EAAW9K,EAAWgf,EAAeE,EAAgByiC,GACjE,IAAMhlD,EAAM,CACV8I,KAAMi7C,GAAkBp3C,MACxBw3C,YAAY,EACZC,QAASj2C,EACTk2C,QAAShhD,EACTihD,YAAajiC,EACbkiC,aAAchiC,EACdjgB,OAAQ0iD,GAGV,OAAOtkD,KAAK2kD,aAAarlD,EAC3B,EAEA4lD,EAAAA,UAAAA,SAAWz3C,EAAW9K,EAAW6hD,GAC/B,YAD+BA,IAAAA,EAAQ,OAClCxkD,KAAKwjD,YAAYC,WACpB,OAAOzjD,KAAK0V,YAAYsM,OAAO6gC,aAGjC,IAAMgC,EAAO7kD,KAAKwjD,YACZlkD,EAAM,CACV8I,KAAMi7C,GAAkBp3C,MACxBw3C,YAAY,EACZC,QAASj2C,EACTk2C,QAAShhD,EACTihD,YAAaiB,EAAKjB,YAClBC,aAAcgB,EAAKhB,aACnBjiD,OAAQijD,EAAKjjD,OACb4iD,MAAAA,GAGF,OAAOxkD,KAAK8kD,YAAYxlD,EAC1B,EAEA6lD,EAAAA,WAAAA,WACEnlD,KAAKglD,YACP,EAEAI,EAAAA,cAAAA,SAAe33C,EAAW9K,EAAWgf,EAAeE,EAAgByiC,GAClE,IAAMhlD,EAAM,CACV8I,KAAMi7C,GAAkBoB,YACxBhB,YAAY,EACZC,QAASj2C,EACTk2C,QAAShhD,EACTihD,YAAajiC,EACbkiC,aAAchiC,EACdjgB,OAAQ0iD,GAGV,OAAOtkD,KAAK2kD,aAAarlD,EAC3B,EAEA+lD,EAAAA,WAAAA,SAAY53C,EAAW9K,EAAW6hD,GAChC,IAAKxkD,KAAKwjD,YAAYC,WACpB,OAAOzjD,KAAK0V,YAAYsM,OAAO6gC,aAGjC,IAAMgC,EAAO7kD,KAAKwjD,YACZlkD,EAAM,CACV8I,KAAMi7C,GAAkBoB,YACxBhB,YAAY,EACZC,QAASj2C,EACTk2C,QAAShhD,EACTihD,YAAaiB,EAAKjB,YAClBC,aAAcgB,EAAKhB,aACnBjiD,OAAQijD,EAAKjjD,OACb4iD,YAAOA,EAAAA,EAAS,KAGlB,OAAOxkD,KAAK8kD,YAAYxlD,EAC1B,EAEAgmD,EAAAA,YAAAA,WACEtlD,KAAKglD,YACP,EAEAO,EAAAA,mBAAAA,SAAoB93C,EAAW9K,EAAWgf,EAAeE,EAAgBoW,EAAkBqsB,GACzF,IAAMhlD,EAAM,CACV8I,KAAMi7C,GAAkBmC,aACxB/B,YAAY,EACZC,QAASj2C,EACTk2C,QAAShhD,EACTihD,YAAajiC,EACbkiC,aAAchiC,EACd4jC,WAAYxtB,EACZr2B,OAAQ0iD,GAGV,OAAOtkD,KAAK2kD,aAAarlD,EAC3B,EAEAomD,EAAAA,gBAAAA,SAAiBj4C,EAAW9K,EAAW6hD,GACrC,IAAKxkD,KAAKwjD,YAAYC,WACpB,OAAOzjD,KAAK0V,YAAYsM,OAAO6gC,aAGjC,IAAMgC,EAAO7kD,KAAKwjD,YACZlkD,EAAM,CACV8I,KAAMi7C,GAAkBmC,aACxB/B,YAAY,EACZC,QAASj2C,EACTk2C,QAAShhD,EACTihD,YAAaiB,EAAKjB,YAClBC,aAAcgB,EAAKhB,aACnB4B,WAAYZ,EAAKY,WACjB7jD,OAAQijD,EAAKjjD,OACb4iD,YAAOA,EAAAA,EAAS,GAGlB,OAAOxkD,KAAK8kD,YAAYxlD,EAC1B,EAEAqmD,EAAAA,iBAAAA,WACE3lD,KAAKglD,YACP,EAEAY,EAAAA,OAAAA,SAAQtB,EAAkBp3C,GACxBlN,KAAKwjD,YAAY5hD,OAAS0iD,EAC1BtkD,KAAKwjD,YAAYp7C,KAAOi7C,GAAkBzzC,KAC1C,IAAMiG,EAAO7V,KAAK+jD,eAEL1jD,IAATwV,EAMJ7V,KAAK4N,YAAYiI,EAAM3I,GALrB0G,QAAQmR,KAAK,oDAMjB,EAEA8gC,EAAAA,SAAAA,SAAUvB,EAAkBwB,GAC1B9lD,KAAKwjD,YAAY5hD,OAAS0iD,EAC1BtkD,KAAKwjD,YAAYp7C,KAAOi7C,GAAkBzzC,KAC1C,IAAMiG,EAAO7V,KAAK+jD,eAEL1jD,IAATwV,EAMJ7V,KAAKmkB,cAActO,EAAMiwC,GALvBlyC,QAAQmR,KAAK,oDAMjB,EAEAghC,EAAAA,aAAAA,SAAczB,EAAkBrsB,EAAkB+tB,GAChDhmD,KAAKwjD,YAAY5hD,OAAS0iD,EAC1BtkD,KAAKwjD,YAAYp7C,KAAOi7C,GAAkBzzC,KAE1C,IAAMiG,EAAO7V,KAAK+jD,UAElB,QAAa1jD,IAATwV,EAAJ,CAKA,IAAMowC,QAAcD,EAAAA,EAAY,EAC1BzzB,EAAc9oB,GAAQ4E,UAAU4pB,GAEhCprB,GAAY,IAAIf,IAAaO,qBAAqBwJ,EAAKhJ,WACvDyE,GAAa,IAAIhD,IAAcK,eAAe9B,GAI9Cq5C,EAFYz8C,GAAQ4E,UAAUiD,EAAW5C,MAAM6zC,WAAWr8B,SAAS,GAE7CL,QAAQK,SAAS+/B,GACvCzK,EAAcjpB,EAAY1M,QAAQpH,IAAIynC,GAG5ClmD,KAAKsiB,aAAazM,EAAM2lC,GA+BxBx7C,KAAKwjD,YAAY5hD,OAAS,EA5C1B,MAHEgS,QAAQmR,KAAK,oDAgDjB,EAEAohC,EAAAA,mBAAAA,WACE,IAAMnkC,EAAShiB,KAAK0V,YAAYsM,OAC1BnV,EAAY,IAAImmB,EAAUhR,EAAO6gC,cAIvC,OAFAh2C,EAAUF,UAAS,GAEZE,CACT,EAEAxH,EAAQs/C,aAAR,SAAsB1kD,GAQpB,OAPAD,KAAKwjD,YAAcvjD,EACnBD,KAAKomD,sBAAsBpmD,KAAK0V,YAAYsM,OAAO6gC,cAE9C7iD,KAAK+jD,WACRnwC,QAAQmR,KAAK,uEAGR/kB,KAAK0V,YAAYsM,OAAO6gC,YACjC,EAEAx9C,EAAQy/C,YAAR,SAAqBxlD,GACnB,GAAIU,KAAKmkD,mBAAqB7kD,EAAI8I,KAAM,CACtC,IAOc9I,EAPRuW,EAAO7V,KAAK+jD,UAElB,QAAa1jD,IAATwV,EAGF,OAFAjC,QAAQmR,KAAK,qDAEN/kB,KAAK0V,YAAYsM,OAAO6gC,aAEjC,IAAM2B,SAAQllD,EAAAA,EAAIklD,OAAJllD,EAAa,MACrBkP,EAAQxO,KAAKujD,iBAAiB/0C,MAC9BC,EAAQzO,KAAKujD,iBAAiB90C,MAC9BC,EAAQ1O,KAAKujD,iBAAiB70C,MAC9B23C,EAAM/mD,EAAIokD,QAAU1jD,KAAKwjD,YAAYE,QACrC4C,EAAMhnD,EAAIqkD,QAAU3jD,KAAKwjD,YAAYG,QAE3C,GAAIrkD,EAAI8I,OAASi7C,GAAkB5rB,UAAW,CAC5C,IACM8uB,EADMvmD,KAAK4hD,gBAAgBj0C,cACdkY,QAEnB0gC,EAAO9nC,IAAIjQ,EAAMqX,QAAQK,UAAUmgC,EAAK7B,IACxC+B,EAAO9nC,IAAIhQ,EAAMoX,QAAQK,SAASogC,EAAK9B,IACvC3uC,EAAKhJ,UAAUe,YAAY24C,EAAO94C,EAAG84C,EAAO5jD,EAAG4jD,EAAO74C,GACtD1N,KAAKsiB,aAAazM,EAAMA,EAAKhJ,UAAUK,SAAU2I,EAAKhJ,UAAUb,SAClE,MAAO,GAAI1M,EAAI8I,OAASi7C,GAAkBp3C,MAAO,CAC/C,IACMs6C,EADMvmD,KAAK4hD,gBAAgBj0C,cACdkY,QAEnB0gC,EAAO9nC,IAAI/P,EAAMmX,QAAQK,SAASogC,EAAK9B,IACvC3uC,EAAKhJ,UAAUe,YAAY24C,EAAO94C,EAAG84C,EAAO5jD,EAAG4jD,EAAO74C,GACtD1N,KAAKsiB,aAAazM,EAAMA,EAAKhJ,UAAUK,SAAU2I,EAAKhJ,UAAUb,SAClE,MAAO,GAAI1M,EAAI8I,OAASi7C,GAAkBoB,YAAa,CACrD,IAAM+B,EAAMH,EAAK/mD,EAAIskD,YACf6C,EAAMH,EAAKhnD,EAAIukD,aACf6C,EAAUF,EAAM7+C,KAAK4oB,GAAKi0B,EAAQ,GAClCmC,EAAUF,EAAM9+C,KAAK4oB,GAAKi0B,EAAQ,GAElCoC,EAAc58C,GAAW68C,cAAcp9C,GAAQq9C,GAAIJ,GAEnDK,EAAe/8C,GAAW68C,cAAcr4C,GAAQm4C,GAEtDC,EAAY1gC,SAAS6gC,GAErBH,EAAY1gC,SAASlmB,KAAK4hD,gBAAgB/zC,eAC1CgI,EAAKhJ,UAAUsX,cAAcyiC,EAAYn5C,EAAGm5C,EAAYjkD,EAAGikD,EAAYl5C,EAAGk5C,EAAY94C,GACtF9N,KAAKsiB,aAAazM,EAAMA,EAAKhJ,UAAUK,SAAU2I,EAAKhJ,UAAUb,SAClE,MAAO,GAAI1M,EAAI8I,OAASi7C,GAAkBmC,aAAc,CACtD,IAAMgB,EAAMH,EAAK/mD,EAAIskD,YACf6C,EAAMH,EAAKhnD,EAAIukD,aACf6C,EAAUF,EAAM7+C,KAAK4oB,GAAKi0B,EAC1BmC,EAAUF,EAAM9+C,KAAK4oB,GAAKi0B,EAC1BoC,EAAc58C,GAAW68C,cAAcp9C,GAAQq9C,GAAIJ,GACnDK,EAAe/8C,GAAW68C,cAAcr4C,GAAQm4C,GAEtDC,EAAY1gC,SAAS6gC,GACrB,IAAMC,EAAeJ,EAAY73C,UAAU,IAAInF,IACzC2oB,EAAc9oB,GAAQ4E,UAAU/O,EAAImmD,YACpCwB,EAAgBjnD,KAAKujD,iBAAiBh1C,OAAOsX,QAAQO,SAASmM,GAEpEy0B,EAAavgC,eAAewgC,GAC5B,IAAMzL,EAAcyL,EAAcxoC,IAAI8T,GAEtCq0B,EAAY1gC,SAASlmB,KAAK4hD,gBAAgB/zC,eAC1CgI,EAAKhJ,UAAUe,YAAY4tC,EAAY/tC,EAAG+tC,EAAY74C,EAAG64C,EAAY9tC,GACrEmI,EAAKhJ,UAAUsX,cAAcyiC,EAAYn5C,EAAGm5C,EAAYjkD,EAAGikD,EAAYl5C,EAAGk5C,EAAY94C,GACtF9N,KAAKsiB,aAAazM,EAAM2lC,EAAa3lC,EAAKhJ,UAAUb,eAEpD4H,QAAQmR,KAAK,iEAGfnR,QAAQmR,KAAK,0DAA0DzlB,EAAI8I,MAG7E,OAAOpI,KAAK0V,YAAYsM,OAAO6gC,YACjC,EAEAx9C,EAAQid,aAAR,SAAsBzM,EAAe3I,EAAoBlB,GACvD,IAAMgW,EAASnM,EAAKE,aAAayL,SAElBnhB,IAAX2hB,GACFA,EAAOM,aAAapV,EAAUlB,EAElC,EAEA3G,EAAQuI,YAAR,SAAqBiI,EAAe3I,GAClC2I,IAAAA,GAAAA,EAAAA,EAAKhJ,WAAUe,YAAfiI,MAAAA,EAA8B3I,GAAAA,OAAAA,IAC9B,IAAM8U,EAASnM,EAAKE,aAAayL,SAElBnhB,IAAX2hB,GACFA,EAAOP,kBAEX,EAEApc,EAAQ8e,cAAR,SAAuBtO,EAAeiwC,GACpCjwC,IAAAA,GAAAA,EAAAA,EAAKhJ,WAAUsX,cAAftO,MAAAA,EAAgCiwC,GAAAA,OAAAA,IAChC,IAAM9jC,EAASnM,EAAKE,aAAayL,SAElBnhB,IAAX2hB,GACFA,EAAOP,kBAEX,EAEApc,EAAQ2/C,WAAR,WACEhlD,KAAKwjD,YAAYp7C,KAAOi7C,GAAkBzzC,KAC1C5P,KAAKwjD,YAAYC,YAAa,EAC9BzjD,KAAKwjD,YAAY5hD,OAAS,EAC5B,EAEAyD,EAAQ+gD,sBAAR,SAA+Bc,GAC7B,IAAM/I,EAAmB,IAAInrB,EAAUk0B,GAEvC/I,EAAiBxxC,UAAS,GAE1B3M,KAAK4hD,gBAAgBv1C,qBAAqB8xC,GAC1Cn+C,KAAKujD,iBAAiB50C,eAAe3O,KAAK4hD,gBAC5C,EA7cW0B,CA8cZ,CA9cW,GCRL6D,GAAK,WAACA,SAAAA,IAAAA,CAAAA,OAAAA,EACJC,qBAAP,SAA6Bt6C,GAC3B,IAAMD,EAAYC,EAAIsB,eAChBi5C,EAAQx6C,EAAUb,SAASs7C,QAAQ,IAAIx9C,IAE7C,MAAO,CACLoD,SAAUL,EAAUd,YAAYw2C,UAChCv2C,SAAUq7C,EAAM9E,UAChBt2C,MAAOY,EAAUZ,MAAMs2C,UAE3B,EAVW4E,EAYJI,4BAAP,SAAoCz6C,GAClC,IAAMD,EAAY,IAAIN,EAAiB,CACrCG,OAAO,IAKT,OAFAG,EAAUG,gBAAgBF,GAEnB,CACLI,SAAUL,EAAUK,SAASq1C,UAC7Bv2C,SAAUa,EAAUb,SAASu2C,UAC7Bt2C,MAAOY,EAAUZ,MAAMs2C,UAE3B,EAxBW4E,EA0BJK,4BAAP,SAAoC5kD,GAClC,MAAO,CACLsK,SAAUtK,EAAE2/C,UAEhB,EA9BW4E,EAgCJM,0BAAP,SAAkC3lD,GAChC,IAAM4lD,EAAKj+C,GAAQ4E,UAAU,CAAC,EAAG,EAAG,IAC9Bs5C,EAAK7lD,EAAE+jB,QAAQ6S,YACf7Q,EAAI6/B,EAAG7hC,QAAQ+hC,MAAMD,GAE3B,GAAI9/B,EAAE7lB,SAAW,IAAQ,MAAO,GAEhC6lB,EAAE6Q,YACF,IAAM5Q,EAAI6/B,EAAGx/B,IAAIu/B,GACX3lD,EAAI4F,KAAKkgD,KAAK//B,GAEdhb,EAAMlD,GAAQ+oB,iBAAiB9K,EAAG9lB,GAExC,OA7CSolD,EA6CWC,qBAAqBt6C,EAC3C,EA9CWq6C,EAgDJW,iCAAP,SAAyChmD,GACvC,IAAM4lD,EAAKj+C,GAAQ4E,UAAU,CAAC,EAAG,EAAG,IAC9Bs5C,EAAK7lD,EAAE+jB,QAAQ6S,YACf7Q,EAAI6/B,EAAG7hC,QAAQ+hC,MAAMD,GAE3B,GAAI9/B,EAAE7lB,SAAW,IAAQ,MAAO,GAEhC6lB,EAAE6Q,YACF,IAAM5Q,EAAI6/B,EAAGx/B,IAAIu/B,GACX3lD,EAAI4F,KAAKkgD,KAAK//B,GAEdhb,EAAMlD,GAAQ+oB,iBAAiB9K,EAAG9lB,GAExC,OA7DSolD,EA6DWI,4BAA4Bz6C,EAClD,EA9DWq6C,EAgEJY,yBAAP,SAAiCnlD,EAAYd,GAC3C,IAAM+K,EAjEGs6C,EAiEsBM,0BAA0B3lD,GAIzD,OAFA+K,EAAUK,SAAWtK,EAAE2/C,UAEhB11C,CACT,EAtEWs6C,EAwEJa,gCAAP,SAAwCplD,EAAYd,GAClD,IAAM+K,EAzEGs6C,EAyEsBW,iCAAiChmD,GAIhE,OAFA+K,EAAUK,SAAWtK,EAAE2/C,UAEhB11C,CACT,EA9EWs6C,EAgFJc,iBAAP,SAAyBC,GACvB,IAAMb,EAAQ,IAAIv9C,GACZg8C,EAAO,IAAI97C,GAAWk+C,EAAEz6C,EAAGy6C,EAAEvlD,EAAGulD,EAAEx6C,EAAGw6C,EAAEp6C,GAK7C,OAHAu5C,EAAMc,MAAQp+C,GAAWiE,IACzBq5C,EAAMe,kBAAkBtC,GAEjB,CAACuB,EAAM55C,EAAG45C,EAAM1kD,EAAG0kD,EAAM35C,EAClC,EAxFWy5C,EA0FJkB,iBAAP,SAAyBxkD,GACvB,IAAMiiD,EAAO,IAAI97C,GAIjB,OAFA87C,EAAK/3C,aAAalK,GAEX,CAACiiD,EAAKr4C,EAAGq4C,EAAKnjD,EAAGmjD,EAAKp4C,EAAGo4C,EAAKh4C,EACvC,EAhGWq5C,EAkGJr2B,eAAP,SAAuBb,GAErB,MAAO,CApGEk3B,EAqGMp2B,WAAWd,EAAM,IArGvBk3B,EAsGMp2B,WAAWd,EAAM,IAtGvBk3B,EAuGMp2B,WAAWd,EAAM,IAElC,EAzGWk3B,EA2GJn2B,eAAP,SAAuBf,GAErB,MAAO,CA7GEk3B,EA8GMp2B,WAAWd,EAAM,IA9GvBk3B,EA+GMp2B,WAAWd,EAAM,IA/GvBk3B,EAgHMp2B,WAAWd,EAAM,IAhHvBk3B,EAiHMp2B,WAAWd,EAAM,IAElC,EAnHWk3B,EAqHJp2B,WAAP,SAAmBvjB,GACjB,IAAMykB,EAAe,IAANzkB,EAEf,OAAO7F,KAAK8b,IAAI,EAAG9b,KAAK6e,IAAIyL,EAAQ,KACtC,EAzHWk1B,EA2HJj2B,SAAP,SAAiB1jB,GACf,IAAM2kB,EAAW3kB,EAAM,IAEvB,OAAO7F,KAAK8b,IAAI,EAAK9b,KAAK6e,IAAI2L,EAAU,GAC1C,EA/HWg1B,CAgIZ,CAhIW,GCMLmB,GAAK,WAACA,SAAAA,EAQTn3C,EACOo3C,YAAAA,IAAAA,GAAc,QADdp3C,SAAAA,OACAo3C,YAAAA,EAJTC,KAAAA,SAAW,IAAIC,GAMbzoD,KAAK4X,OAASzG,EAASyG,OACvB5X,KAAK0oD,WAAa,IAAIC,EAZbL,IAAAA,EAAAA,EAAAA,UAAAA,OAeXjjD,EAAMujD,aAAN,SAAoBC,qBAApBhpD,GAAA,WACQipD,IAAAA,EAAAA,EAcAC,EACaA,EAAbC,EACAC,EAGAzlD,MAOO0lD,EAOPC,EAAAA,oDAjCYC,OAAAA,EAASP,IAAaA,EAAAA,SAAtBO,aAAkC,MAAA,GAAMt4C,EAAKu4C,SAASR,WAApBS,EAAA59B,EAAA3oB,wBAqBpD,IArBM+lD,EAAAA,GAGSv9B,WAEbu9B,EAAUv9B,SAAQ,IAGpBu9B,EAAUv9B,SAASxZ,SAAQ0Z,SAAAA,QACNprB,IAAforB,EAAI1gB,SACN0gB,EAAI1gB,OAAS,EAEjB,IAEMg+C,EAAWQ,EAAgBT,GAC3BE,EAAaD,OAAAA,EAAAA,EAAS70B,MAAT60B,EAAAA,GACbE,EAAAA,GAGAzlD,EAAIslD,EAAUU,QAAQ1kC,MAAM,KAE9Btd,OAAOhE,EAAE,KAAO,EAClB,MAAA,GAAOulD,GAGLA,IAAAA,EAAS70B,KAAT60B,MAAAA,MACgBA,EAAAA,EAAAA,EAAS70B,iDAAhBg1B,EAAAA,EAAAA,MACTD,EAAAA,EAASrlD,KAAK,GAAMkN,EAAK24C,SAASP,EAAIt0B,cAAtCq0B,EAAAA,MAAAA,EAAAA,CAAcv9B,EAAA3oB,6CAwBlB,OApBAgmD,EAAS70B,KAAO+0B,EAEVE,EAA2Bt+C,GAC5Bk+C,CAAAA,EAAAA,EAAAA,CACHS,QAAS/9C,EAAKi+C,iBAAiB,OAC/BC,cAAe,CACbC,IAAK,MACLC,OAAQ,OAEVzhD,KAAM,KACN+3C,aAAY,GACZ70B,OAAM,GACNC,SAAQ,GACR3V,MAAK,GACL2d,WAAU,GACVzT,UAAS,GACTgqC,QAAO,KAGTh5C,EAAKi5C,SAASZ,EAAUJ,GACxB,GAAMj4C,EAAKq+B,WAAWga,EAAUJ,WAOhC,OAPAr9B,EAAA3oB,OACA+N,EAAKk5C,aAAab,EAAUJ,GAC5Bj4C,EAAKm5C,QAAQd,EAAUJ,GACvBj4C,EAAKo5C,eAAef,EAAUJ,GAE9BI,EAASj1B,KAAO80B,EAEhB,GAAOG,MACT,GA5DAtpD,IA8DAkqD,EAAAA,SAAAA,SAAUZ,EAA0BJ,GAClC,IAAMoB,EAA0B,GAEhCpB,EAASz9B,OAAOvZ,SAAQqX,SAAAA,GACtB+gC,EAAUvmD,KAAKwlB,EACjB,IAEA+/B,EAAS79B,OAAS6+B,CACpB,EAEA9kD,EAAM8pC,WAAN,SAAkBga,EAA0BJ,qBAA5ClpD,GAAA,WACQuqD,IAAAA,EACAl2B,MAGOzI,EAKGO,EAASpqB,EACXyoD,EACAC,EAEAC,EAaAxY,EAkBFhnC,oDAzCRg+C,GAHEqB,EAAAA,GACAl2B,EAAO60B,EAAS70B,MAElB60B,EAASx9B,SAATw9B,MAAAA,MACgBA,EAAAA,EAAAA,EAASx9B,oDACN,SADVE,EAAAA,EAAAA,OACD7pB,OAAJ6pB,MACE3a,EAAKy3C,aACP6B,EAAYxmD,KAAK6nB,UADf,aAKoB,OAFdO,EAAoBP,EAApBO,QAASpqB,EAAW6pB,EAAX7pB,OACXyoD,EAAOr+B,EAAQtS,KAAIi3B,SAAAA,GAAUhxC,OAAAA,QAAQ6rB,IAAImlB,EAAOj3B,KAAIzH,SAAAA,UAAWnB,EAAK05C,gBAAgBv4C,EAASiiB,UAC7E,GAAMv0B,QAAQ6rB,IAAI6+B,WAAlCC,EAAgB5+B,EAAA3oB,OAEhBwnD,EAAaD,EAAc5wC,KAAIsS,SAAAA,UAAWA,EAAQtS,KAAI+wC,SAAAA,GAC1D,IAAMplC,EAAKorB,IACLia,EAAyB,CAC7B91B,IAAK61B,EACLplC,GAAAA,GAMF,OAHA8jC,EAAS79B,OAAO1nB,KAAK8mD,GACW,CAAErlC,GAAAA,EAGpC,OAEM0sB,EAASlnC,GAAA,CACb8/C,iBAAiB,GACdl/B,EACA,CACDO,QAASu+B,EACTK,WAAY,CACVhpD,OAAAA,EACAwG,KAAM0hB,EAAkBkC,QACxBA,QAASA,EAAQtS,KAAIi3B,SAAAA,UAAUA,EAAOj3B,KAAIzH,SAAAA,GAAW,MAAA,CAACA,EAAQ,GAAG,GAAIA,EAAQ,GAAG,aAMtFm4C,EAAYxmD,KAAKmuC,uCAMG,iBAFhBhnC,EAAS0gB,EAAI1gB,UAIjB0gB,EAAI1gB,OAAS,CAAEsa,GAAI8jC,EAAS79B,OAAOvgB,GAAQsa,KAE7C+kC,EAAYxmD,KAAK6nB,8CAKvB09B,EAAS59B,SAAW6+B,SACtB,GAzDAvqD,IA2DAmqD,EAAAA,aAAAA,SAAcb,EAA0BJ,GAGtC,IAFA,IAEwCzlC,EAFlCunC,EAAgB1B,EAAS51B,WAEZw1B,EAAAA,EAAAA,EAASx1B,cAAYjQ,EAAAI,KAAAhkB,MAAA,CAA7B8zB,IAAAA,EAAAA,EAAAA,MACT,GAAIA,EAAKC,WAAahoB,EAAKkV,SAASO,gBAClC2pC,EAAcjnD,KAAK5D,KAAK8qD,sBAAsBt3B,EAAM21B,SAC/C,GAAI31B,EAAKC,WAAahoB,EAAKkV,SAASY,eACzCspC,EAAcjnD,KAAK5D,KAAK+qD,qBAAqBv3B,EAAM21B,SAC9C,GAAI31B,EAAKC,WAAahoB,EAAKkV,SAAS4B,gBACzCsoC,EAAcjnD,KAAK4vB,GACnB5f,QAAQmR,KAAK,2BAA2ByO,EAAK,UACxC,GAAIA,EAAKC,WAAahoB,EAAKkV,SAASyiC,cAAe,CACxD,IAAM4H,EAAWx3B,EAEjBxzB,KAAKirD,6BAA6Bz3B,EAAM21B,EAAUJ,GAClDiC,EAAS50C,QAAQ80C,KAAKxoC,eAAYriB,EAClC2qD,EAAS50C,QAAQ80C,KAAKloB,gBAAa3iC,CAC9B,MAAImzB,EAAKC,WAAahoB,EAAKkV,SAASC,eACzCiqC,EAAcjnD,KAAK4vB,EAEvB,CAEA,IAAmBu1B,IAAqB/kC,EAArB+kC,EAAAA,EAAAA,EAASx1B,cAAYvP,EAAAC,KAAAvkB,MAAA,CAA7B8zB,IAAAA,EAAAA,EAAAA,MACLA,EAAKC,WAAahoB,EAAKkV,SAASC,eAClCiqC,EAAcjnD,KAAK5D,KAAKmrD,oBAAoB33B,EAAM21B,EAAUJ,GAEhE,CACF,EAEAkB,EAAAA,QAAAA,SAASd,EAA0BJ,GAEnC,EAEAmB,EAAAA,eAAAA,SAAgBf,EAA0BJ,GAExCI,IAAAA,EADAA,EAASvzC,MAAQmzC,EAASnzC,OAC1BuzC,EAAAA,EAASvzC,OAAMhS,KAAfulD,MAAAA,EAAAA,GAAAA,OAAuBnpD,KAAKwoD,SAAS4C,uBACrCjC,EAASkC,cAAgBtC,EAASsC,cAClClC,EAAShJ,aAAe4I,EAAS5I,aAEjCgJ,EAASvzC,MAAM7D,SAAQ8D,SAAAA,GACH,SAAdA,EAAKzN,OACPyN,EAAKzN,KAAO,MAEhB,IAGA+gD,EAAShJ,aAAa,GAAGvqC,MAAQuzC,EAASvzC,MAAM8D,KAAI7D,SAAAA,GAClD,MAAO,CAAEwP,GAAIxP,EAAKwP,GACpB,GACF,EAEAhgB,EAAcgkD,SAAd,SAAwBz0B,qBAAxB/0B,GAAA,sCACE,MAAA,GAAO,IAAIF,SAAmB,SAACV,EAASC,GACtC4R,EAAK43C,WAAW4C,aACd12B,EACA31B,GACA,SAACssD,EAAQC,GACPtsD,EAAO,IAAIsb,MAAM,iCAAiCoa,EAAI,aAAY22B,EAAO,MAAKC,EAAa,+CAC7F,GACJ,OACF,GATA3rD,IAWAwF,EAAcokD,SAAd,SAAwB70B,qBAAxB/0B,GAAA,sCACE,MAAA,GAAO,IAAIF,SAAqB,SAACV,EAASC,GACxC4R,EAAK43C,WAAW+C,eACd72B,EACA31B,GACA,SAACssD,EAAQC,GACPtsD,EAAQ,sBAAqBoW,KAAKC,UAAUqf,GAAK,YAAW22B,EAAO,KAAIC,EACzE,GACJ,OACF,GATA3rD,IAWAwF,EAAcmlD,gBAAd,SAA+Bv4C,EAA6BiiB,UAA5Dr0B,GAAA,eACiCoS,EAAxB3M,EAAO6N,EAAOnR,EACfknD,6BAEN,GAH+Bj3C,EAAAA,EAAQ,GAAhC3M,EAAwB2M,EAAjBkB,GAAAA,EAAiBlB,KAAVjQ,EAAUiQ,EAAAA,KACzBi3C,EAAMh1B,EAAK5uB,IAGf,MAAM,IAAIkV,MAAO,wBAAuBlF,KAAKC,UAAUtD,GAAS,KAGlE,MAAA,GAAOiY,IAAIE,gBAAiB,IAAIL,KAAAA,CAAM,IAAIzX,WAAW42C,EAAK/1C,EAAOnR,SACnE,GATAnC,IAWAwF,EAAQylD,sBAAR,SAA+BnmC,EAA+BzT,GAC5D,IACIkxB,EAI+CA,EAG/CthB,EARE2xB,EAAgB9tB,EAAqDvO,QAGvEq8B,EAAcrQ,mBAChBA,EAAmB,GACnBqQ,EAAcrQ,iBAAiBrwB,SAAQq9B,SAAAA,GAAUhN,OAAAA,EAAAA,GAAiBx+B,KAAjBw+B,MAAAA,EAAyBgN,GAAAA,OAAAA,QA2B5E,OAtBIqD,EAAc3xB,eAEhBA,EAAe,CAAEuE,GAAInU,EAAMqa,SAASknB,EAAc3xB,cAAcuE,KAGhB,CAChDA,GAAIV,EAAUU,GACdoO,SAAU9O,EAAU8O,SACpB5d,KAAM8O,EAAU9O,KAChBqsB,WAAYuQ,EAAcvQ,WAC1BhS,UAAWuiB,EAAcviB,UACzBiS,qBAAsBsQ,EAActQ,qBACpCC,iBAAkBA,EAClBthB,aAAAA,EACAC,cAAe,CAEbsE,GAAInU,EAAMqa,SAASknB,EAAc1xB,eAAesE,IAElDgd,kBAAmBoQ,EAAcpQ,kBACjCC,iBAAkBmQ,EAAcnQ,iBAAmB,EAIvD,EAEAj9B,EAAQ8lD,oBAAR,SAA6BxmC,EAA+BwkC,EAA0BJ,OAgCpFI,SA/BMuC,EAAc/mC,EAA4DvO,QAE1Eu1C,EAAqC,GACrCC,EAAqC,GAE3CF,EAAYpqB,WAAWvvB,SAAQwvB,SAAAA,GAIzBsqB,IAAAA,EAHEA,EAAYr6C,GAAoB+vB,EAAK9oB,SAAUswC,EAAS70B,MACxDpc,EAAWhH,EAAKg7C,gBAAgBvqB,EAAKzpB,SAAUixC,GAErD,GAAI8C,SAAAA,EAAAA,EAAUj6C,gBAAVi6C,EAAmB3nD,KAAgBoO,YAAY,CAIjD,IAHA,IAAMy5C,EAAaF,EAAUj6C,QAAQ1N,KAC/B8nD,EAAa,IAAIt5C,YAAYq5C,EAAW/pD,QAErCK,EAAI,EAAGA,EAAI0pD,EAAW/pD,OAAQK,IACrC2pD,EAAW3pD,GAAK0pD,EAAW1pD,GAG7BwpD,EAAUj6C,QAAQ1N,KAAO8nD,CAC3B,CAEAL,EAAkB/nD,KAAKioD,GACvBD,EAAchoD,KAAKkU,EACrB,IAEA,IAAMm0C,EAAeC,GAA6BP,GAElD,IAAKM,EACH,MAAM,IAAIzxC,MAAM,uCAGlB2uC,EAAS17B,WAAW7pB,KAAKqoD,IACzB9C,EAAAA,EAASrpC,WAAUlc,KAAnBulD,MAAAA,EAA2ByC,GAAAA,OAAAA,IAE3B,IAAM91C,EAA6C,CACjDuP,GAAIV,EAAUU,GACdoO,SAAU9O,EAAU8O,SACpB5d,KAAM8O,EAAU9O,KAChB4C,SAAU,CAAE4M,GAAI4mC,EAAa5mC,IAC7BvF,UAAW8rC,EAAclyC,KAAI5M,SAAAA,GAK3B,MAJ4B,CAC1BuY,GAAIvY,EAAIuY,GAIZ,KAGF,GAAIqmC,EAAYtqB,KAAM,CAGpB,IAFA,IAEmC9d,EAF/BqzB,EAAehyB,EAAU9O,KAAKwP,GAEf0jC,EAAAA,EAAAA,EAASnzC,SAAO0N,EAAAI,KAAAhkB,MAAA,CAAxBmW,IAAAA,EAAAA,EAAAA,MACLA,EAAKwP,KAAOV,EAAU9O,KAAKwP,KAC7BsxB,EAAe9gC,EAAKsJ,SAExB,CAEA,GAAIw3B,IAAiBhyB,EAAU9O,KAAKwP,GAClC,MAAM,IAAI7K,MAAO,cAAamK,EAAU9O,KAAK,KAG/C,IAAMs2C,EAAWnsD,KAAKwoD,SAAS4D,oBAAoBzV,GAC7C0V,EAAersD,KAAKwoD,SAAS8D,wBAAwB3V,GAE3D,IAAKwV,IAAaE,EAChB,MAAM,IAAI7xC,MAAM,sDAAsDmK,EAAU9O,KAAKwP,GAAG,4DAE1F,IAAM+e,EAAepkC,KAAKusD,cAAcN,EAAcP,EAAYtqB,KAAM2nB,EAAUoD,EAAUE,GAE5Fv2C,EAAciK,SAAW,CAAEsF,GAAI+e,EAAa/e,GAC9C,CAQA,YAN4BhlB,IAAxBqrD,EAAYxkB,UACdpxB,EAAc0rB,MAAQ,CACpB0F,QAASwkB,EAAYxkB,UAIlBpxB,CACT,EAEAzQ,EAAQ4lD,6BAAR,SAAsCtmC,EAA+BwkC,EAA0BJ,cACzFoD,EAAWpD,EAASnzC,MAAM,GAE9BmzC,EAASnzC,MAAM7D,SAAQ8D,SAAAA,GACjBA,EAAKwP,KAAOV,EAAU9O,KAAKwP,KAC7B8mC,EAAWt2C,EAEf,IAEA,IACM22C,EADW7nC,EACSvO,QAAQ80C,KAC5BmB,EAAmC,GAEzCG,EAASC,MAAM16C,SAAQ,SAAC0wB,EAAMn9B,GAIpBm9B,IAAAA,EAHF5sB,EAAyB,CAC7BwP,GAAIorB,IACJtxB,SAAUgtC,EAAS9mC,GACnBlc,KAAMs5B,OAAAA,EAAAA,EAAKt5B,MAALs5B,EAAa,OAAOn9B,EAC1Bie,SAAU4oC,EAAS5oC,SAEnBnb,KAAM,MACNqrB,SAAUhoB,EAAKkV,SAAS+rC,YACxBr7C,QAAS86C,EAAS96C,QAClB2vC,YAAamL,EAASnL,YACtB2L,MAAOR,EAASQ,MAChB12C,QAAS,CAAC,EACV22C,YAAaT,EAASS,YACtBC,GAAIV,EAASU,GACbC,WAAYX,EAASW,WACrBjgD,UAAWiE,EAAKi8C,iBAAiBtqB,EAAK51B,WACtC0mB,WAAY,IAGd84B,EAAazoD,KAAKiS,GAClBszC,EAASvzC,MAAMhS,KAAKiS,EACtB,IAEA22C,EAASC,MAAM16C,SAAQ,SAAC0wB,EAAMn9B,GAG5Bm9B,IAAAA,EAFM5sB,EAAOw2C,EAAa/mD,GAEb,OAAbm9B,EAAAA,EAAKtd,WAALsd,EAAe1wB,SAAQqT,SAAAA,GACHinC,EAAajnC,GAErBjG,SAAWtJ,EAAKwP,EAC5B,GACF,IAEA0jC,EAASnzC,MAAM7D,SAAQ8D,SAAAA,GACrB,GAAIA,EAAKsJ,SAAU,CACjB,IAAM7Z,EAAQuQ,EAAKsJ,SAAS6tC,QAAQ,KAEpC,GAAI1nD,GAAS,EAAG,CACd,IAAM6Z,EAAWtJ,EAAKsJ,SAAS8V,UAAU,EAAG3vB,GACtC2nD,GAAYp3C,EAAKsJ,SAAS8V,UAAU3vB,EAAQ,GAE9C6Z,IAAagtC,EAAS9mC,KACxBxP,EAAKsJ,SAAWktC,EAAaY,GAAU5nC,GAE3C,CACF,CACF,IAEArlB,KAAKwoD,SAAS/pC,IAAI0tC,EAAUE,GAE5BrsD,KAAKktD,yBAAyBV,EAAiBL,EAAUhD,EAAUJ,EACrE,EAEA1jD,EAAQ0lD,qBAAR,SAA8BpmC,EAA+BzT,GAC3D,IAAMi8C,EAAexoC,EAAiDvO,QAEhEg3C,EAA+C,CACnD/nC,GAAIV,EAAUU,GACdoO,SAAU9O,EAAU8O,SACpB5d,KAAM8O,EAAU9O,KAChBsa,UAAWg9B,EAAah9B,UACxBF,MAAO,CACLhuB,EAAGkrD,EAAal9B,MAAM,GAAK,IAC3B/sB,EAAGiqD,EAAal9B,MAAM,GAAK,IAC3BnI,EAAGqlC,EAAal9B,MAAM,GAAK,IAC3BpI,EAAGslC,EAAal9B,MAAM,GAAK,KAE7BC,UAAWi9B,EAAaj9B,WAW1B,MAR+B,UAA3Bi9B,EAAah9B,UACfi9B,EAAeh9B,MAAQ+8B,EAAa/8B,MACA,SAA3B+8B,EAAah9B,YACtBi9B,EAAeh9B,MAAQ+8B,EAAa/8B,MACpCg9B,EAAe/8B,eAAiB88B,EAAa98B,eAC7C+8B,EAAe98B,eAAiB68B,EAAa78B,gBAGxC88B,CACT,EAEA/nD,EAAQ6nD,yBAAR,SAAkCG,EAA4ClB,EAA4BhD,EAA0BJ,cAC1HrmC,EAA0B2qC,EAA1B3qC,UAAWsgB,EAAeqqB,EAAfrqB,WAEbsqB,EAAkD,CACtDjoC,GAAIorB,IACJhd,SAAUhoB,EAAKkV,SAAS6B,mBACxB3M,KAAM,CAAEwP,GAAI8mC,EAAS9mC,IACrB3C,UAAAA,EACAG,eAAgB,IAGlB,GAAImgB,GAAcA,EAAWhhC,OAAQ,CAEnC,IAAMkyB,EAAO60B,EAAS70B,KAEtB8O,EAAWjxB,SAAQkxB,SAAAA,GACjB,IAAMngB,EAAmC,CACvCuC,GAAIorB,IACJtnC,KAAM85B,EAAK95B,KACXsqB,SAAUhoB,EAAKkV,SAASwC,cACxBQ,eAAgB,GAChBO,eAAgB,GAChBI,YAAa,GACbG,YAAa,IAGX8oC,EAAqB,EAEzBtqB,EAAKH,OAAO/wB,SAAQy7C,SAAAA,GAClB,IAAMC,EAAa57C,GAAqBqiB,EAAMs5B,EAAM9qB,OAEpD6qB,EAAqB5lD,KAAK8b,IAAI8pC,EAAoBE,EAAWA,EAAWzrD,OAAS,GACnF,IAEAihC,EAAKH,OAAO/wB,SAAQy7C,SAAAA,GAClB,IAAMC,EAAa57C,GAAqBqiB,EAAMs5B,EAAM9qB,OAC9CgrB,EAAc77C,GAAqBqiB,EAAMs5B,EAAM7qB,QAErD,IAAgBthC,EAAVosD,EAAsB9nD,cAC1B,MAAM,IAAI6U,MAAM,yCAAyCizC,EAAW,KAEtE,IAAiBpsD,EAAXqsD,EAAuB/nD,cAC3B,MAAM,IAAI6U,MAAM,0CAA0CkzC,EAAY,KAExE,GAA4B,WAAxBF,EAAM5qB,cACR,MAAM,IAAIpoB,MAAO,8BAA6BgzC,EAAM5qB,cAAc,KAGpE,GAAmB,aAAf4qB,EAAMllD,KAAqB,CAK7B,IAmCAwa,IAAAA,EAvCM6qC,EAAsB,GACtBC,EAA6B,GAC7BC,EAAsC,GAEnCxrD,EAAI,EAAGA,EAAIorD,EAAWzrD,OAAQK,IAAK,CAQ1C,GAPAsrD,EAAO/pD,KAAK,CACV8pD,EAAgB,EAAJrrD,GACZqrD,EAAgB,EAAJrrD,EAAQ,GACpBqrD,EAAgB,EAAJrrD,EAAQ,GACpBqrD,EAAgB,EAAJrrD,EAAQ,KAGlBA,EAAI,EAAG,CACT,IAAM+4B,EAAKpxB,GAAWqE,UAAUs/C,EAAOtrD,EAAI,IACrCyrD,EAAK9jD,GAAWqE,UAAUs/C,EAAOtrD,IACjCg5B,EAAK,IAAIrxB,GACTsxB,EAAK,IAAItxB,GAEfqxB,EAAG0yB,iBAAiB3yB,EAAI0yB,EAAI,EAAI,GAChCxyB,EAAGyyB,iBAAiB3yB,EAAI0yB,EAAI,EAAI,GAEhCF,EAAchqD,KAAKy3B,EAAGknB,WACtBqL,EAAchqD,KAAK03B,EAAGinB,UACxB,CAEAsL,EAAUjqD,KAAK,CACb6H,EAAKuiD,mBAAmBC,KACxB,CAACR,EAAWprD,GAAIA,IAEpB,CAEA,IAAMogC,EAAO3xB,EAAK03C,SAAS0F,YAAY/B,EAAS9mC,GAAImoC,EAAM/qB,MACpDn6B,EAAOwI,EAAK03C,SAAS2F,YAAY1rB,EAAKpd,IAEtCxB,EAAkC,CACtCpY,EAAKwH,UAAUm7C,kBACf,CAACP,EAAWF,EAAQC,IAGtB9qC,OAAAA,EAAAA,EAASoB,iBAATpB,EAAyBlf,KAAK,CAAE0E,KAAAA,EAAMub,UAAAA,GACxC,MAAO,GAAmB,YAAf2pC,EAAMllD,KAAoB,CACnC,IAAMm6B,EAAO3xB,EAAK03C,SAAS0F,YAAY/B,EAAS9mC,GAAImoC,EAAM/qB,MACtDn6B,EAAOwI,EAAK03C,SAAS2F,YAAY1rB,EAAKpd,IAE1C,GAA+B,IAA3Bod,EAAKlP,WAAWvxB,OAClB,IAAK,IAAIK,EAAI,EAAGA,EAAI0mD,EAASnzC,MAAM5T,OAAQK,IAAK,CAC9C,IAAM+iB,EAAQ2jC,EAASnzC,MAAMvT,GAE7B,GAAI+iB,EAAMjG,WAAasjB,EAAKpd,GAAI,CAC9B/c,GAAQ,IAAM8c,EAAMjc,KAEpB,KACF,CACF,CAIF,IAFA,IAAMwb,EAAY+oC,EAAY1rD,OAASyrD,EAAWzrD,OAEzCD,EAAI,EAAGA,EAAI4iB,EAAW5iB,IAAK,CAGlC,IAYA+gB,IAAAA,EAdM+qC,EAAsC,GAEnCxrD,EAAI,EAAGA,EAAIorD,EAAWzrD,OAAQK,IACrCwrD,EAAUjqD,KAAK,CACb6H,EAAKuiD,mBAAmBC,KACxB,CAACR,EAAWprD,GAAIqrD,EAAYrrD,EAAIsiB,EAAY5iB,MAIhD,IAAM8hB,EAA8B,CAClCpY,EAAKwH,UAAUo7C,aACfR,GAGF/qC,OAAAA,EAAAA,EAAS2B,cAAT3B,EAAsBlf,KAAK,CACzB0E,KAAAA,EACAoc,UAAW,qBACXG,SAAU,gBAAgB9iB,EAC1B8hB,UAAAA,GAEJ,MACK,CAKL,IAJA,IAAM8pC,EAAsB,GACtBC,EAA6B,GAC7BC,EAAsC,GAEnCxrD,EAAI,EAAGA,EAAIorD,EAAWzrD,OAAQK,IAAK,CAO1C,GANAsrD,EAAO/pD,KAAK,CACV8pD,EAAgB,EAAJrrD,GACZqrD,EAAgB,EAAJrrD,EAAQ,GACpBqrD,EAAgB,EAAJrrD,EAAQ,KAGlBA,EAAI,EAAG,CACT,IAAM+4B,EAAK3xB,GAAQ4E,UAAUs/C,EAAOtrD,EAAI,IAClCyrD,EAAKrkD,GAAQ4E,UAAUs/C,EAAOtrD,IAC9Bg5B,GAAK,IAAI5xB,IAAU6kD,YAAYlzB,EAAI0yB,EAAI,EAAI,GAC3CxyB,GAAK,IAAI7xB,IAAU6kD,YAAYlzB,EAAI0yB,EAAI,EAAI,GAEjDF,EAAchqD,KAAKy3B,EAAGknB,WACtBqL,EAAchqD,KAAK03B,EAAGinB,UACxB,CAEAsL,EAAUjqD,KAAK,CACb6H,EAAKuiD,mBAAmBC,KACxB,CAACR,EAAWprD,GAAIA,IAEpB,CAEA,IASEygB,EAEAA,EAXI2f,EAAO3xB,EAAK03C,SAAS0F,YAAY/B,EAAS9mC,GAAImoC,EAAM/qB,MACpDn6B,EAAOwI,EAAK03C,SAAS2F,YAAY1rB,EAAKpd,IAEtCxB,EAAkC,CACtCpY,EAAKwH,UAAUs7C,kBACf,CAACV,EAAWF,EAAQC,IAGtB,GAAmB,gBAAfJ,EAAMllD,KACRwa,OAAAA,EAAAA,EAASa,iBAATb,EAAyBlf,KAAK,CAAE0E,KAAAA,EAAMub,UAAAA,SAEtCf,OAAAA,EAAAA,EAASwB,cAATxB,EAAsBlf,KAAK,CAAE0E,KAAAA,EAAMub,UAAWA,GAElD,CACF,IAEAslC,EAASnmB,WAAWp/B,KAAKkf,GAEzBwqC,EAAmBzqC,eAAejf,KAAK,CAAEyhB,GAAIvC,EAASuC,IACxD,GACF,CACA8mC,EAAS54B,WAAa,GACtB44B,EAAS54B,WAAW3vB,KAAK,CAAEyhB,GAAIioC,EAAmBjoC,KAClD8jC,EAAS51B,WAAW3vB,KAAK0pD,EAC3B,EAEAjoD,EAAQymD,gBAAR,SAAyBh0C,EAAwC5G,GAC/D,GAAI4G,EAAS1P,OAASqD,EAAK+zB,aAAatlB,MAAO,CAC7C,IAAMs0C,EAAiC,CAAA,OAEVnuD,IAAzByX,EAASgoB,cACX0uB,EAAO,aAAkB12C,EAASgoB,aAEpC,IAAM2uB,EAAgC,CACpCC,iBAAoB,IAAI7kD,GACtBiO,EAAS2nB,gBAAgB,GACzB3nB,EAAS2nB,gBAAgB,GACzB3nB,EAAS2nB,gBAAgB,GACzB3nB,EAAS2nB,gBAAgB,IACzBkvB,OAAO,MAGLpjC,EAAyD,CAAA,EAE3DzT,EAAS4nB,mBACXnU,EAAS,kBAAuBvrB,KAAK4uD,eAAe19C,EAAOs9C,EAAQ12C,EAAS4nB,iBAAkB5nB,EAAS6nB,4BAGzG,IAAMkvB,EAAiC,CACrCxpC,GAAIorB,IACJtnC,KAAM2O,EAAS3O,KACfsqB,SAAUhoB,EAAKkV,SAAS5I,SACxBC,OAAQ,CACNqN,GAAIzZ,IAEN6/B,WAAY,CAAC,EACbqjB,OAAQ,GACRC,KAAM,CAAC,EACPP,OAAAA,EACAQ,SAAU,CAAC,EACXP,OAAAA,EACAljC,SAAAA,GAKF,OAFAvrB,KAAKivD,cAAcn3C,EAAU+2C,GAEtBA,EAEP,IAAML,EAAiC,CACrCU,gBAAmBp3C,EAASkoB,eAC5BmvB,iBAAoBr3C,EAASmoB,sBAGA5/B,IAA3ByX,EAASioB,gBACXyuB,EAAqB,YAAG12C,EAASioB,cAAgB,EAAI,QAEnB1/B,IAAhCyX,EAASwoB,qBACXkuB,EAAO,aAAkB12C,EAASwoB,yBAEMjgC,IAAtCyX,EAAS4oB,2BACX8tB,EAAO,mBAAwB12C,EAAS4oB,+BAEPrgC,IAA/ByX,EAASgpB,oBACX0tB,EAAO,mBAAwB12C,EAASgpB,wBAEbzgC,IAAzByX,EAASgoB,cACX0uB,EAAO,aAAkB12C,EAASgoB,aAEpC,IAAM2uB,EAAgC,CACpCC,iBAAoB,IAAI7kD,GACtBiO,EAAS2nB,gBAAgB,GACzB3nB,EAAS2nB,gBAAgB,GACzB3nB,EAAS2nB,gBAAgB,GACzB3nB,EAAS2nB,gBAAgB,IACzBkvB,OAAO,KACTS,gBAAmB,IAAIvlD,GACrBiO,EAAS+oB,eAAe,GACxB/oB,EAAS+oB,eAAe,GACxB/oB,EAAS+oB,eAAe,GACxB/oB,EAAS+oB,eAAe,IACxB8tB,OAAO,MAGLpjC,EAAyD,CAAA,EAE3DzT,EAAS4nB,mBACXnU,EAAS,kBAAuBvrB,KAAK4uD,eAAe19C,EAAOs9C,EAAQ12C,EAAS4nB,iBAAkB5nB,EAAS6nB,4BAGrG7nB,EAASooB,2BACX3U,EAAS,0BAA+BvrB,KAAK4uD,eAAe19C,EAAOs9C,EAAQ12C,EAASooB,yBAA0BpoB,EAASqoB,oCAGrHroB,EAASuoB,gBACX9U,EAAS,eAAoBvrB,KAAK4uD,eAAe19C,EAAOs9C,EAAQ12C,EAASuoB,cAAevoB,EAASyoB,yBAG/FzoB,EAAS2oB,mBACXlV,EAAS,kBAAuBvrB,KAAK4uD,eAAe19C,EAAOs9C,EAAQ12C,EAAS2oB,iBAAkB3oB,EAAS6oB,4BAGrG7oB,EAASipB,kBACXxV,EAAS,iBAAsBvrB,KAAK4uD,eAAe19C,EAAOs9C,EAAQ12C,EAASipB,gBAAiBjpB,EAASkpB,2BAGvG,IAAM6tB,EAAiC,CACrCxpC,GAAIorB,IACJtnC,KAAM2O,EAAS3O,KACfsqB,SAAUhoB,EAAKkV,SAAS5I,SACxBC,OAAQ,CACNqN,GAAI7Z,IAENigC,WAAY,CAAC,EACbqjB,OAAQ,GACRC,KAAM,CAAC,EACPP,OAAAA,EACAQ,SAAU,CAAC,EACXP,OAAAA,EACAljC,SAAAA,GAKF,OAFAvrB,KAAKivD,cAAcn3C,EAAU+2C,GAEtBA,CAEX,EAEAxpD,EAAQ4pD,cAAR,SAAuBI,EAAsCC,GASzBD,IAAAA,GAR9BA,EAAOhhC,WAAa5iB,EAAKsyB,iBAAiBG,YAC5CoxB,EAAO7jB,WAAW,WAAgBhgC,EAAKo9B,WAAWwB,YAElDilB,EAAO7jB,WAAW,WAAgBhgC,EAAKo9B,WAAWC,OAGhDumB,EAAOhhC,WAAa5iB,EAAKsyB,iBAAiBE,SAC5CqxB,EAAOd,OAAO,UAAe,EAC7Bc,EAAOd,OAAsB,aAAqB,OAAlBa,EAAAA,EAAOvvB,aAAPuvB,EAAsB,GAEtDC,EAAOd,OAAO,UAAe,EAG/B,OAAQa,EAAOxvB,MACb,KAAKp0B,EAAK4yB,SAASC,KACjBgxB,EAAO7jB,WAAW,WAAgBhgC,EAAKy9B,WAAWkC,KAElD,MACF,KAAK3/B,EAAK4yB,SAASE,OACjB+wB,EAAO7jB,WAAW,WAAgBhgC,EAAKy9B,WAAWK,KAElD,MACF,QACE+lB,EAAO7jB,WAAW,WAAgBhgC,EAAKy9B,WAAWC,MAGlDkmB,EAAOjnD,OAASqD,EAAK+zB,aAAarlB,MACpCm1C,EAAOd,OAAO,YAAiBa,EAAOtvB,cAAgB,EAAI,GAG5DuvB,EAAOd,OAAgB,QAAwB,IAArBa,EAAO92C,UAAsB,EAAI,EAC3D+2C,EAAOd,OAAO,MAAW,CAC3B,EAEAnpD,EAAQupD,eAAR,SAAwB19C,EAAuBs9C,EAAgCe,EAAkBC,GACpFt+C,IAAAA,EACLu+C,EAA4C,CAChD14C,QAAS,CAAEsO,GAF0B,OAA5BnU,EAAAA,EAAMqa,SAAUgkC,GAAUlqC,IAA1BnU,EAAgC,MAuB3C,OAlBIs+C,IACEA,EAAavjD,QACfwjD,EAAYxjD,MAAQ,CAClBwB,EAAG+hD,EAAavjD,MAAM,GACtBtJ,EAAG6sD,EAAavjD,MAAM,KAGtBujD,EAAa/pD,SACfgqD,EAAYhqD,OAAS,CACnBgI,EAAG+hD,EAAa/pD,OAAO,GACvB9C,EAAG6sD,EAAa/pD,OAAO,KAGvB+pD,EAAaxjD,WACfwiD,EAAO,mBAAwBgB,EAAaxjD,WAIzCyjD,CACT,EAEApqD,EAAQ0nD,iBAAR,SAA0BlgD,GACxB,IAAMnH,EAA6B,CACjCwH,SAAU,CAAEO,EAAG,EAAG9K,EAAG,EAAG+K,EAAG,GAC3BgiD,UAAW,CAAEjiD,EAAG,EAAG9K,EAAG,EAAG+K,EAAG,GAC5BzB,MAAO,CAAEwB,EAAG,EAAG9K,EAAG,EAAG+K,EAAG,IAgC1B,OA7BIb,MAAAA,OAAAA,EAAAA,EAAWK,YACbxH,EAAOwH,SAASO,EAAIZ,EAAUK,SAAS,GACvCxH,EAAOwH,SAASvK,EAAIkK,EAAUK,SAAS,GACvCxH,EAAOwH,SAASQ,EAAIb,EAAUK,SAAS,KAGrCL,MAAAA,OAAAA,EAAAA,EAAWi5C,OAEbpgD,EAAOogD,KAAO,GAEdpgD,EAAOogD,KAAKr4C,EAAIZ,EAAUi5C,KAAK,GAE/BpgD,EAAOogD,KAAKnjD,EAAIkK,EAAUi5C,KAAK,GAE/BpgD,EAAOogD,KAAKp4C,EAAIb,EAAUi5C,KAAK,GAE/BpgD,EAAOogD,KAAKh4C,EAAIjB,EAAUi5C,KAAK,KACtBj5C,MAAAA,OAAAA,EAAAA,EAAWb,YACpBtG,EAAOgqD,UAAUjiD,EAAIZ,EAAUb,SAAS,GACxCtG,EAAOgqD,UAAU/sD,EAAIkK,EAAUb,SAAS,GACxCtG,EAAOgqD,UAAUhiD,EAAIb,EAAUb,SAAS,KAGtCa,MAAAA,OAAAA,EAAAA,EAAWZ,SACbvG,EAAOuG,MAAMwB,EAAIZ,EAAUZ,MAAM,GACjCvG,EAAOuG,MAAMtJ,EAAIkK,EAAUZ,MAAM,GACjCvG,EAAOuG,MAAMyB,EAAIb,EAAUZ,MAAM,IAG5BvG,CACT,EAEAL,EAAQknD,cAAR,SAAuBpa,EAAyB/Q,EAAgC2nB,EAA0BoD,EAA4BE,GACpI,IAAMn4B,EAAO60B,EAAS70B,KACdiL,EAA0CiC,EAA1CjC,OAAQC,EAAkCgC,EAAlChC,SAAUC,EAAwB+B,EAAxB/B,oBAE1B,IAAKA,EACH,MAAM,IAAI7kB,MAAO,kEAAiElF,KAAKC,UAAU6rB,GAAM,yEAEzG,IAAMuuB,EAAkB99C,GAAqBqiB,EAAMmL,GAEnD8S,EAAK9S,oBAAsB32B,MAAMU,KAAKumD,GAEtC,IAAMC,EAA4C,CAAA,EAE9CxrB,EAAe+nB,OAEF9rD,IAAb++B,EACFgF,EAAeioB,EAAajtB,GAE5BxrB,QAAQmR,KAAK,gGAGfoa,EAAOptB,SAAQ0nB,SAAAA,GACb,IAAMgJ,EAAO4pB,EAAa5yB,GAEtBgJ,IAAS2B,GAAgB3B,EAAKtjB,WAAailB,EAAajlB,WAC1DvL,QAAQnU,MAAM,kIAEd2kC,EAAe+nB,EAEnB,IAEAE,EAAat6C,SAAQ0wB,SAAAA,GACnBmtB,EAAQntB,EAAKpd,IAAMod,CACrB,IAEA0P,EAAK9N,aAAeD,EAAaj7B,KAEjC,IAAM28B,EAAsB,GAoB5B,OAlBA3G,EAAOptB,SAAQ0nB,SAAAA,GAIb,IAHA,IAAIo2B,EAAcxD,EAAa5yB,GACzBq2B,EAAqB,GAEpBD,GAAeA,GAAezrB,IACnC0rB,EAASlsD,KAAKisD,EAAY1mD,MACtB0mD,EAAY1wC,WACd0wC,EAAcD,EAAQC,EAAY1wC,UAMtC2mB,EAAUliC,KAAKksD,EAAS5c,UAAU5+B,KAAK,KACzC,IAEA69B,EAAKrM,UAAYA,EAEV1B,CACT,EAx4BWkkB,CAy4BZ,CAz4BW,GA24BNG,GAAD,WAACA,SAAAA,IACJsH,KAAAA,cAAoD,GACpDC,KAAAA,cAAkD,GAClDC,KAAAA,YAAgD,GAChDC,KAAAA,UAAoC,GAJhCzH,IAAAA,EAAAA,EAAAA,UAAAA,OAMJhqC,EAAAA,IAAAA,SAAK0tC,EAA4BE,cAC/B,GAAIrsD,KAAK+vD,cAAc5D,EAAS9mC,IAC9B,MAAM,IAAI7K,MAAO,mCAAkC2xC,EAAS9mC,GAAG,4CAGjErlB,KAAK+vD,cAAc5D,EAAS9mC,IAAMgnC,EAClCA,EAAat6C,SAAQ0wB,SAAAA,GACnB,GAAI3xB,EAAKk/C,cAAcvtB,EAAKpd,IAC1B,MAAM,IAAI7K,MAAO,iCAAgCioB,EAAKpd,GAAG,kDAE3DvU,EAAKk/C,cAAcvtB,EAAKpd,IAAM8mC,EAC9Br7C,EAAKm/C,YAAYxtB,EAAKpd,IAAMod,CAC9B,IAEA4pB,EAAat6C,SAAQ0wB,SAAAA,GACnB3xB,EAAKq/C,YAAY1tB,EACnB,GACF,EAEA0tB,EAAAA,YAAAA,SAAa1tB,GACPA,EAAKtjB,SACHnf,KAAKkwD,UAAUztB,EAAKtjB,UACtBnf,KAAKkwD,UAAUztB,EAAKpd,IAAMrlB,KAAKkwD,UAAUztB,EAAKtjB,UAAY,IAAMsjB,EAAKt5B,KAC5DnJ,KAAKiwD,YAAYxtB,EAAKtjB,WAC/Bnf,KAAKmwD,YAAYnwD,KAAKiwD,YAAYxtB,EAAKtjB,WACvCnf,KAAKkwD,UAAUztB,EAAKpd,IAAMrlB,KAAKkwD,UAAUztB,EAAKtjB,UAAY,IAAMsjB,EAAKt5B,MAErEnJ,KAAKkwD,UAAUztB,EAAKpd,IAAMod,EAAKt5B,KAGjCnJ,KAAKkwD,UAAUztB,EAAKpd,IAAMod,EAAKt5B,IAEnC,EAEAinD,EAAAA,wBAAAA,SAAyB/qC,GACvB,OAAOrlB,KAAK+vD,cAAc1qC,EAC5B,EAEAinC,EAAAA,wBAAAA,SAAyBjnC,GACvB,IAAM8mC,EAAWnsD,KAAKgwD,cAAc3qC,GAEpC,IAAK8mC,EACH,MAAM,IAAI3xC,MAAM,cAAc6K,EAAG,KAGnC,OAAOrlB,KAAKowD,wBAAwBjE,EAAS9mC,GAC/C,EAEA+mC,EAAAA,oBAAAA,SAAqB/mC,GACnB,OAAOrlB,KAAKgwD,cAAc3qC,EAC5B,EAEA6oC,EAAAA,YAAAA,SAAamC,EAAgBC,GAG3B,OAFiBtwD,KAAKowD,wBAAwBC,GAE9BC,EAClB,EAEAlF,EAAAA,mBAAAA,sBACQ0E,EAA+B,GAMrC,OAJArvD,OAAOqR,KAAK9R,KAAK+vD,eAAeh+C,SAAQ1S,SAAAA,GACtCywD,IAAAA,GAAAA,EAAAA,GAASlsD,KAATksD,MAAAA,EAAiB,GAAA5e,OAAApgC,EAAKi/C,cAAc1wD,IACtC,IAEOywD,CACT,EAEA3B,EAAAA,YAAAA,SAAa9oC,GACX,OAAOrlB,KAAKkwD,UAAU7qC,EACxB,EA5EIojC,EAAD,GAuFE,SAAS8H,GAA4Bp8B,GAC1C,IAYQA,EAZJq8B,EAAc,EACdC,EAAsChlD,EAAKilD,iBAAiBC,QAC5DC,GAAoB,EACpBC,EAAiCplD,EAAKilD,iBAAiBC,QACvDG,GAAe,EACfC,EAAqCtlD,EAAKilD,iBAAiBC,QAC3DK,GAAmB,EACjBC,EAAuB,CAC3BC,SAAU,IAAIvrD,aACdwrD,IAAK,IAAIxrD,aACTyrD,QAAS,IAAIzrD,aACbiM,QAAS,IAAIjM,aACbwD,YAAMgrB,EAAAA,EAAYhrB,MAAZgrB,EAAoB,WAG5B,IAAK,IAAMC,KAAUD,EAAYziB,WAAY,CAC3C,IAOsB2iB,EACmBA,EARnCA,EAAaF,EAAYziB,WAAW0iB,GAE1C,GAAe,cAAXA,EAEFo8B,EAAcn8B,EAAWnwB,KAAKlC,OAASqyB,EAAWxuB,KAElDorD,EAAUC,SAAW78B,EAAWnwB,KAChC0sD,SAAoBv8B,EAAAA,EAAWqE,YAAXrE,EACpBo8B,EAAeY,EAAwBh9B,OAAAA,EAAAA,EAAWjsB,MAAXisB,EAAmBpd,EAAUgC,YAC/D,GAAe,YAAXmb,EAAsB,CAGZC,IAAAA,EACmBA,EAFtC48B,EAAUG,QAAU/8B,EAAWnwB,KAC/B8sD,SAAmB38B,EAAAA,EAAWqE,YAAXrE,EACnB08B,EAAcM,EAAwBh9B,OAAAA,EAAAA,EAAWjsB,MAAXisB,EAAmBpd,EAAUgC,YAC9D,GAAe,SAAXmb,EAAmB,CAGbC,IAAAA,EACmBA,EAFlC48B,EAAUE,IAAM98B,EAAWnwB,KAC3B4sD,SAAez8B,EAAAA,EAAWqE,YAAXrE,EACfw8B,EAAUQ,EAAwBh9B,OAAAA,EAAAA,EAAWjsB,MAAXisB,EAAmBpd,EAAUgC,MACjE,CACF,CAEA,IAAMq4C,EAAiBC,GAAUd,EAAc,EAAGD,GAC5CgB,EAAYD,GAAUV,EAAS,EAAGL,GAClCiB,EAAgBF,GAAUR,EAAa,EAAGP,GAEhD,GAAIr8B,EAAYviB,QACdq/C,EAAUr/C,QAAUuiB,EAAYviB,QAAQ1N,UACnC,GAAIssD,GAAe,MAAO,CAG/B,IAFA,IAAM5+C,EAAU,IAAIc,YAAY89C,GAEvBnuD,EAAI,EAAGA,EAAImuD,EAAanuD,IAC/BuP,EAAQvP,GAAKA,EAEf4uD,EAAUr/C,QAAUA,MACf,CAGL,IAFA,IAAMA,EAAU,IAAImB,YAAYy9C,GAEvBnuD,EAAI,EAAGA,EAAImuD,EAAanuD,IAC/BuP,EAAQvP,GAAKA,EAEf4uD,EAAUr/C,QAAUA,CACtB,CAEA,IAAI8/C,EAAoCjmD,EAAKkmD,gBAAgBC,OA0C7D,OAxC4C,IAAxCX,EAAUr/C,QAAQ0B,oBACpBo+C,EAAcjmD,EAAKkmD,gBAAgBE,QAGG,CACtCxsC,GAAIorB,IACJhd,SAAUhoB,EAAKkV,SAASjI,SACxBo5C,WAAY,CACVtB,YAAaA,EACbuB,SAAU,CACR,CACEC,SAAUvmD,EAAKwmD,qBAAqBC,SACpCzsD,OAAQ,EACRuR,OAAQy5C,EACR0B,UAAW,EACXz5B,UAAWk4B,GAEb,CACEoB,SAAUvmD,EAAKwmD,qBAAqBG,GACpC3sD,OAAQ6rD,EACRt6C,OAAQ65C,EACRsB,UAAW,EACXz5B,UAAWo4B,GAEb,CACEkB,SAAUvmD,EAAKwmD,qBAAqBI,OACpC5sD,OAAQ6rD,EAAiBE,EACzBx6C,OAAQ+5C,EACRoB,UAAW,EACXz5B,UAAWs4B,KAIjB3a,UAAW,GACXn9B,KAAMzN,EAAK6mD,aAAaC,UACxBC,YAAad,EACbe,YAAanB,EAAiBE,EAAYC,EAC1C9tB,OAAQ+uB,GAAiBzB,GAI7B,CAEO,SAAS/E,GAA8ByG,qBAW5BA,IAAAA,EADeA,EACfA,EAFR5rB,EAgMV,SAAuB8kB,GACrB,GAAIA,EAAUxyC,UACZ,OAAOwyC,EAAUxyC,UACZ,GAAIwyC,EAAUj6C,QACnB,OAAOi6C,EAAUj6C,QAAQ1N,KAAKlC,OAE9B,IAAIqX,EAAY,EAOhB,OAJAwyC,EAAUn6C,WAAWK,SAAQqiB,SAAAA,GAC3B/a,EAAY+a,EAAOlwB,KAAKlC,OAASoyB,EAAOvuB,IAC1C,IAEOwT,CAEX,CA/MkB2f,CAAa25B,EAActwD,IACnCoD,EAASmtD,GAAcD,OAAAA,EAAAA,EAActwD,GAAG+W,WAAjBu5C,EAA8B,GACrD1mD,SAAQ0mD,SAAAA,EAAAA,EAAc,GAAG/gD,gBAAjB+gD,EAA0BzuD,KAAKoP,mBAA/Bq/C,EAAoD,EAGlE,GADAtc,EAAUzyC,KAAK,CAAE6B,OAAQA,EAASwG,EAAO4mD,WAAY9rB,EAAOypB,YAAazpB,IACrE1kC,EAAG,CACL,IAAMywD,EAAQH,EAAc,GACtBI,EAAQJ,EAActwD,GAExB2wD,GAAS,EAcb,GAZAvyD,OAAOqR,KAAKghD,EAAMphD,YAAYK,SAAQ5I,SAAAA,GACpC,IAEM8pD,EAFSH,EAAMphD,WAAWvI,GAEVjF,KAEhBgvD,EAASH,EAAMrhD,WAAWvI,GAAMjF,KAElC+uD,EAAOjxD,SAAWkxD,EAAOlxD,QAAUixD,EAAO,KAAOC,EAAO,KAC1DF,GAAS,EAEb,IAEIA,EACEF,EAAMlhD,SAAWmhD,EAAMnhD,UACzBkhD,EAAMlhD,QAAQ1N,KAAOivD,GAAgBL,EAAMlhD,QAAQ1N,KAAM6uD,EAAMnhD,QAAQ1N,WAEpE,CACL,GAAI4uD,EAAMlhD,SAAWmhD,EAAMnhD,QAAS,CAClC,IAAM4+C,EAoLhB,SAAyB3E,GACvB,IAAI2E,EAAc,EASlB,OAPA/vD,OAAOqR,KAAK+5C,EAAUn6C,YAAYK,SAAQ5I,SAAAA,GACxC,IAAMirB,EAASy3B,EAAUn6C,WAAWvI,GAGpCqnD,EAAcp8B,EAAOlwB,KAAKlC,OAASoyB,EAAOvuB,IAC5C,IAEO2qD,CACT,CA/L8B4C,CAAeN,GAEnCA,EAAMlhD,QAAQ1N,KAAOivD,GAAgBL,EAAMlhD,QAAQ1N,KAAM6uD,EAAMnhD,QAAQ1N,KAAMssD,EAC/E,CAEA/vD,OAAOqR,KAAKghD,EAAMphD,YAAYK,SAAQ5I,SAAAA,GACpC,IAAMirB,EAAS0+B,EAAMphD,WAAWvI,GAE1B8pD,EAAS7+B,EAAOlwB,KAEhBgvD,EAASH,EAAMrhD,WAAWvI,GAAMjF,KAGtCkwB,EAAOlwB,KAAOivD,GAAgBF,EAAQC,EACxC,GACF,CAEF,CACAN,EAAantD,EAASshC,CACxB,EAxDA,KAAI4rB,EAAc3wD,QAAU,GAA5B,CAOA,IAHA,IAAI4wD,EAAa,EACXvc,EAA4B,GAEzBh0C,EAAI,EAAGA,EAAIswD,EAAc3wD,OAAQK,IAAAA,EAAAA,GAmD1C,OAgBF,SAA6BiI,EAAsB+rC,GACjD,IAAIgd,EAAkB,EAEtB,IAAK,IAAMj/B,KAAU9pB,EAAMoH,WAAY,CAIrC2hD,GAHmB/oD,EAAMoH,WAAW0iB,GAGNlwB,KAAKkP,UACrC,CAEI9I,EAAMsH,UACRyhD,GAAmB/oD,EAAMsH,QAAQ1N,KAAKkP,YAGxC,IAAIo9C,EAAc,EACd8C,EAAe,EACb3vB,EAAS,IAAIrxB,WAAW+gD,GACxBE,EAAuC,GAE7C,IAAK,IAAMn/B,KAAU9pB,EAAMoH,WAAY,CACrC,IACiB8hD,EAOiBn/B,EAR5BA,EAAa/pB,EAAMoH,WAAW0iB,GAC9B49B,SAAWwB,EAAAA,GAAwBp/B,IAAxBo/B,EAAmCp/B,EAGpDo8B,EAAcn8B,EAAWnwB,KAAKlC,OAASqyB,EAAWxuB,KAClD,IAAM4tD,EAAoC,CACxCzB,SAAAA,EACAvsD,OAAQ6tD,EACRt8C,OAAQq6C,EAAwBh9B,OAAAA,EAAAA,EAAWjsB,MAAXisB,EAAmBpd,EAAUgC,OAC7Dk5C,UAAW99B,EAAWxuB,KACtB6yB,UAAWrE,EAAWqE,WAGxB66B,EAAe3vD,KAAK6vD,GAEpB,IAAMvvD,EAAOmwB,EAAWnwB,KAClBwvD,EAAY,IAAIphD,WAAWpO,EAAKy/B,OAAQz/B,EAAKyvD,WAAYzvD,EAAKkP,YAEpEuwB,EAAOv2B,IAAIsmD,EAAWJ,GACtBA,GAAgBI,EAAUtgD,UAC5B,CAEA,IAAM64C,EAAkC,CACtC5mC,GAAIorB,IACJhd,SAAUhoB,EAAKkV,SAASjI,SACxBo5C,WAAY,CACVtB,YAAaA,EACbuB,SAAUwB,GAEZld,UAAAA,EACAn9B,KAAMzN,EAAK6mD,aAAaC,UACxBC,YAAa/mD,EAAKkmD,gBAAgBiC,KAClCnB,YAAa,EACb9uB,OAAQ,IAGV,GAAIr5B,EAAMsH,QAAS,CACjB,IAAMA,EAAUtH,EAAMsH,QAAQ1N,KACxBwvD,EAAY,IAAIphD,WAAWV,EAAQ+xB,OAAQ/xB,EAAQ+hD,WAAY/hD,EAAQwB,YAE7EuwB,EAAOv2B,IAAIsmD,EAAWJ,GACtBrH,EAAawG,YAAca,EAChBjyD,EAAPuQ,EAAmBmB,aACrBk5C,EAAauG,YAAc/mD,EAAKkmD,gBAAgBE,OAEhD5F,EAAauG,YAAc/mD,EAAKkmD,gBAAgBC,MAEpD,CAIA,OAFA3F,EAAatoB,OA6Cf,SAAyBnP,GAIvB,IAFA,IAAIq/B,EAAe,GAEVxxD,EAAI,EAAGA,EAAImyB,EAAMxyB,OAAQK,IAChCwxD,GAAgBC,OAAOC,aAAav/B,EAAMnyB,IAI5C,OAAO2xD,KAAKH,EACd,CAvDwBI,CAAetwB,GAE9BsoB,CACT,CAxFSiI,CAAmBvB,EAAc,GAAItc,EAxD5C,CAyDF,CAEA,SAASkb,GAAW4C,EAAmChC,EAAmBprB,GACxE,OAAQotB,GACN,KAAK1oD,EAAKilD,iBAAiB0D,KAC3B,KAAK3oD,EAAKilD,iBAAiB2D,MACzB,OAAOlC,EAAYprB,EACrB,KAAKt7B,EAAKilD,iBAAiB4D,MAC3B,KAAK7oD,EAAKilD,iBAAiBkB,OACzB,OAAOO,EAAYprB,EAAQ,EAC7B,QACE,OAAOorB,EAAYprB,EAAQ,EAEjC,CA4EA,SAAS2rB,GAAkBzB,GACzB,IAAMC,EAAW,IAAI5+C,WAAW2+C,EAAUC,SAASvtB,OAAQstB,EAAUC,SAASyC,WAAY1C,EAAUC,SAAS99C,YACvG+9C,EAAM,IAAI7+C,WAAW2+C,EAAUE,IAAIxtB,OAAQstB,EAAUE,IAAIwC,WAAY1C,EAAUE,IAAI/9C,YACnFg+C,EAAU,IAAI9+C,WAAW2+C,EAAUG,QAAQztB,OAAQstB,EAAUG,QAAQuC,WAAY1C,EAAUG,QAAQh+C,YACnGxB,EAAU,IAAIU,WAAW2+C,EAAUr/C,QAAQ+xB,OAAQstB,EAAUr/C,QAAQ+hD,WAAY1C,EAAUr/C,QAAQwB,YAGnGmhD,EAAYrD,EAAS99C,WAAa+9C,EAAI/9C,WAAag+C,EAAQh+C,WAAaxB,EAAQwB,WAGhFuwB,EAAS,IAAI6wB,YAAYD,GAG3B3lC,EAAY,IAAItc,WAAWqxB,EAAQ,EAAGutB,EAAS99C,YAEnDwb,EAAUxhB,IAAI8jD,IACdtiC,EAAY,IAAItc,WAAWqxB,EAAQutB,EAAS99C,WAAY+9C,EAAI/9C,aAClDhG,IAAI+jD,IACdviC,EAAY,IAAItc,WAAWqxB,EAAQutB,EAAS99C,WAAa+9C,EAAI/9C,WAAYg+C,EAAQh+C,aACvEhG,IAAIgkD,GAGK,IAAI9+C,WAAWqxB,EAAQutB,EAAS99C,WAAa+9C,EAAI/9C,WAAag+C,EAAQh+C,WAAYxB,EAAQwB,YAElGhG,IAAIwE,GAQf,IALA,IAAM6iD,EAAY,IAAIniD,WAAWqxB,GAG7BkwB,EAAe,GAEVxxD,EAAI,EAAGA,EAAIoyD,EAAUzyD,OAAQK,IACpCwxD,GAAgBC,OAAOC,aAAaU,EAAUpyD,IAIhD,OAAO2xD,KAAKH,EACd,CA4CA,SAASV,GAAiBF,EAAyBC,EAAyBztD,GAC1E,GAAUpE,EAAN4xD,EAAkBttD,cAAc,CAClC,IAAMD,EAAS,IAAIC,aAAastD,EAAOjxD,OAASkxD,EAAOlxD,QAKvD,OAHA0D,EAAO0H,IAAI6lD,GACXvtD,EAAO0H,IAAI8lD,EAAQD,EAAOjxD,QAEnB0D,CACT,CAAO,GAAUrE,EAAN4xD,EAAkBpgD,YAAY,CACvC,IAAMnN,EAAS,IAAImN,WAAWogD,EAAOjxD,OAASkxD,EAAOlxD,QAKrD,OAHA0D,EAAO0H,IAAI6lD,GACXvtD,EAAO0H,IAAI8lD,EAAQD,EAAOjxD,QAEnB0D,CACT,CAAO,GAAUrE,EAAN4xD,EAAkBlgD,aAAa,CACxC,IAAMrN,EAAS,IAAIqN,YAAYkgD,EAAOjxD,OAASkxD,EAAOlxD,QAItD,GAFA0D,EAAO0H,IAAI6lD,GACXvtD,EAAO0H,IAAI8lD,EAAQD,EAAOjxD,QACtByD,EACF,IAAK,IAAIpD,EAAI,EAAGA,EAAI6wD,EAAOlxD,OAAQK,IACjCqD,EAAOutD,EAAOjxD,OAASK,IAAMoD,EAIjC,OAAOC,CACT,CAAO,GAAUrE,EAAN4xD,EAAkBzgD,YAAY,CACvC,IAAM9M,EAAS,IAAI8M,WAAWygD,EAAOjxD,OAASkxD,EAAOlxD,QAKrD,OAHA0D,EAAO0H,IAAI6lD,GACXvtD,EAAO0H,IAAI8lD,EAAQD,EAAOjxD,QAEnB0D,CACT,CAAO,GAAUrE,EAAN4xD,EAAkBvgD,aAAa,CACxC,IAAMhN,EAAS,IAAIgN,YAAYugD,EAAOjxD,OAASkxD,EAAOlxD,QAItD,GAFA0D,EAAO0H,IAAI6lD,GACXvtD,EAAO0H,IAAI8lD,EAAQD,EAAOjxD,QACtByD,EACF,IAAK,IAAIpD,EAAI,EAAGA,EAAI6wD,EAAOlxD,OAAQK,IACjCqD,EAAOutD,EAAOjxD,OAASK,IAAMoD,EAIjC,OAAOC,CACT,CAAO,GAAUrE,EAAN4xD,EAAkB7gD,WAAW,CACtC,IAAM1M,EAAS,IAAI0M,UAAU6gD,EAAOjxD,OAASkxD,EAAOlxD,QAKpD,OAHA0D,EAAO0H,IAAI6lD,GACXvtD,EAAO0H,IAAI8lD,EAAQD,EAAOjxD,QAEnB0D,EAEP,IAAMA,EAAS,IAAI4M,WAAW2gD,EAAOjxD,OAASkxD,EAAOlxD,QAKrD,OAHA0D,EAAO0H,IAAI6lD,GACXvtD,EAAO0H,IAAI8lD,EAAQD,EAAOjxD,QAEnB0D,CAEX,CAEA,IC90CIgvD,GD80CElB,GAAkD,CACtDx6C,KAAM,WACN2W,IAAK,YACLglC,KAAM,YACN9kC,QAAS,SACT+kC,SAAU,UACVC,OAAQ,QACRC,QAAS,SACTC,SAAU,UAEVC,WAAY,WACZC,KAAM,YACNC,MAAO,YACPC,MAAO,YACPC,SAAU,SACVC,UAAW,UACXC,QAAS,QACTC,SAAU,SACVC,SAAU,SACVC,UAAW,UACXC,UAAW,UAEXC,mBAAoB,eACpBC,mBAAoB,eACpBC,mBAAoB,eACpBC,mBAAoB,eACpBC,mBAAoB,eACpBC,mBAAoB,eACpBC,mBAAoB,eACpBC,mBAAoB,eACpBC,iBAAkB,aAClBC,iBAAkB,aAClBC,iBAAkB,aAClBC,iBAAkB,aAClBC,kBAAmB,cACnBC,kBAAmB,cACnBC,kBAAmB,cACnBC,kBAAmB,eCj4Cd,SAASC,GAA6B/+C,EAAgBxB,GAO3D,OANKs+C,KACHA,GAAoB,IAAIkC,IAGzBlC,GAAiCtgB,QAAQx8B,EAAQxB,GAE3Cs+C,EACT,CAEO,SAASmC,GAA6BC,GAC3CpC,GAAoBoC,CACtB,CAMO,IAAAF,GAAK,WAACA,SAAAA,EAwBElhD,GArBLqhD,KAAAA,UAAwB,GACxBC,KAAAA,aAA8B,GAC9BC,KAAAA,cAAgC,GAChCC,KAAAA,eAAkC,GAClCC,KAAAA,qBAA8C,QAGtDC,gBAA0B,GAC1B9rC,KAAAA,OAAuB,GACvB+rC,KAAAA,cAAkC,GAClC9rC,KAAAA,SAAiC,GACjC3V,KAAAA,MAA4B,GAC5B2d,KAAAA,WAAmC,GACnCzT,KAAAA,UAAiC,GACjCgqC,KAAAA,QAA6B,GAC7Br8B,KAAAA,WAAkC,GAClCuV,KAAAA,WAAuC,GACvCif,KAAAA,UAAY,IAAIh4C,GAKVyL,EACF1V,KAAK0V,YAAcA,GAEnB1V,KAAKo3D,gBAAkB3mB,IACvBzwC,KAAK0V,YAAc,CACjB2P,GAAI,IACJlc,KAAM,QACNoa,SAAU,MACVy9B,YAAav1C,EAAK6rD,YAAYC,QAC9Bv1C,OAAQ,CACNK,IAAK,GACLF,IAAK,IACLF,KAAM,KACN/U,SAAU,CAAC,EAAG,EAAG,GACjBlB,SAAU,CAAC,EAAG,EAAG,GACjB6kB,SAAUplB,EAAKsnC,eAAeI,UAGhCv9B,MAAO,GACP4hD,cAAe,CAAEnyC,GAAIrlB,KAAKo3D,iBAC1BK,cAAe,KA7CVb,IAAAA,EAAAA,EAAAA,UAAAA,OAkDXvxD,EAAMqyD,UAAN,SAAiBthD,qBAAjBvW,GAAA,WAqDE,IAAA83D,EACAC,EACAC,EA+BAC,EAlFMC,EA6CAC,EAQErzC,EAGEhC,EACArd,oDAvDV,GALAwL,EAAK2L,QACL3L,EAAKmnD,aAAe7hD,EACpBtF,EAAKonD,cAAgB,CAAE1oD,eAAgB4G,EAAQ+hD,KAAK3oD,gBAGxB,iBAFtBuoD,EAAe3hD,EAAQ+hD,KAAKC,WAEML,EAAAA,EAAwBzlD,YAC9D,MAAM,IAAIkI,MAAM,mDAYG,OATrB1J,EAAKwa,OAASysC,EAAazsC,OAAO5R,KAAI2+C,SAAAA,GACwBA,IAAAA,EAAtD9uC,EAAO,IAAIQ,KAAK,CAACsuC,EAAU1uC,UAAUga,QAAS,CAAEv7B,YAAMiwD,EAAAA,EAAUruC,UAAVquC,EAAsB,cAElF,MAAO,CACLhzC,GAAIgzC,EAAUhzC,GACduP,IAAK1K,IAAIE,gBAAgBb,GAE7B,IAEqB,GAAM5pB,QAAQ6rB,IAAI1a,EAAKwa,OAAO5R,IAAI7Z,GAAA,SAAMupB,8BAC3D,MAAA,GAAO+D,EAAU/D,EAAMwL,QACzB,cAmCA,GArCA9jB,EAAKumD,cAAgB3rC,EAAA3oB,OAIrB+N,EAAKwnD,oBAAoBP,EAAcjnD,EAAKumD,eAC5CvmD,EAAKimD,UAAYgB,EAAahqC,OAC9Bjd,EAAKkmD,aAAee,EAAaxsC,SACjCza,EAAKmmD,cAAgBc,EAAaj4C,UAClChP,EAAKomD,eAAiBa,EAAa/0B,WACnClyB,EAAKqmD,qBAAuBY,EAAaQ,iBAEzCznD,EAAKya,SAAWza,EAAKkmD,aAAat9C,KAAI3C,SAAAA,GACpC,IAAMoV,EAAiBpV,EAAQoV,eACzBphB,EAASohB,EAAephB,OAQ9B,MANsB,iBAAXA,IACTohB,EAAephB,OAAS,CACtBsa,GAAIvU,EAAKwa,OAAOvgB,GAAQsa,KAIrB8G,CACT,IACArb,EAAKgP,UAAYhP,EAAKmmD,cAAcv9C,KAAI5B,SAAAA,GACtC,OAAOA,EAAS0gD,YAClB,IAEAT,EAAahqC,OAAOhc,SAAQmE,SAAAA,GAC1BpF,EAAK2c,WAAW7pB,KAAKsS,EAAK+1C,aAC5B,KACM+L,EAAYD,EAAaU,OAAO,IAE5BC,oBAAoB3mD,SAAQmE,SAAAA,UAAQpF,EAAK6nD,uBAAuBziD,EAAM6hD,OAEhFJ,EAAA7mD,EAAKyiB,YAAW3vB,KAAhBzD,MAAAw3D,EAAwBK,GAAAA,OAAAA,EAAUY,wBAClChB,EAAA9mD,EAAKyiB,YAAW3vB,KAAhBzD,MAAAy3D,EAAwBI,GAAAA,OAAAA,EAAUa,uBAClChB,EAAA/mD,EAAKyiB,YAAW3vB,KAAhBzD,MAAA03D,EAAwBG,GAAAA,OAAAA,EAAUU,sBACe,IAA7CV,EAAUc,wBAAwB92D,OAC9B2iB,EAAYqzC,EAAUc,wBAAwB,GAE/C1iD,EAAQ2iD,QAAQC,uBAAsD34D,IAAlC+V,EAAQ2iD,QAAQE,gBACjDt2C,EAAQgC,EAAU9B,gBAClBvd,EAAQ8Q,EAAQ2iD,QAAQE,gBAEjB,GAAK3zD,EAAQqd,EAAM3gB,OAC9B2iB,EAAU9B,eAAc,CAAIF,EAAMrd,IAElCqf,EAAU9B,eAAc,IAG5B/R,EAAKyiB,WAAW3vB,KAAK+gB,QAChB,GAAIqzC,EAAUc,wBAAwB92D,OAAS,EACpD,MAAM,IAAIwY,MAAO,sCAAqCw9C,EAAUc,wBAAwB92D,QAU1F,OAPA8O,EAAKkyB,WAAU,GACflyB,EAAKomD,eAAenlD,SAAQkxB,SAAAA,GAC1BnyB,EAAKkyB,WAAWp/B,KAAKq/B,EAAKi2B,kBAC5B,IAEApoD,EAAK8E,MAAK,GAEV,GAAM9E,EAAKqoD,aAAa,CACtBroB,WAAY16B,EAAQ+hD,KAAKrnB,WACzB5O,WAAY9rB,EAAQ+hD,KAAKiB,oBAU3B,OAZA1tC,EAAA3oB,QAKA+0D,EAAAhnD,EAAK8E,OAAMhS,KAAXzD,MAAA23D,EAAA,GAAA5mB,OAAmB6mB,EAAaU,OAAO,GAAGY,cAC1CvoD,EAAK8E,MAAM7D,SAAQ8D,SAAAA,GACC,SAAdA,EAAKzN,OACPyN,EAAKzN,KAAO,MAEhB,IAEA,GAAO0I,EAAKwoD,oBACd,GA9FAz5D,IAgGAy4D,EAAAA,oBAAAA,SAAqBF,EAAyBf,oBAqCjCkC,IAAAA,EAAAA,EAAAA,MACT,GAAIC,EAAcplD,IAAImlD,GAAc,CAClC,IAAME,EAAUluC,EAAS04B,MAAKx4B,SAAAA,UAAOA,EAAIU,eAAe9G,KAAOk0C,KAE/D,GAAIE,EAAS,CACX,IAAMC,EAAQjpB,IACRkpB,EAAaF,EAAQ5zC,QAE3B8zC,EAAWxtC,eAAe9G,GAAKq0C,EAC/BnuC,EAAS3nB,KAAK+1D,GACdC,EAAeF,GAASC,EAAWxtC,eACnC0tC,EAAaN,GAAeG,EAC5BI,GAAe,CACjB,CACF,CACF,SAnDMF,EAAuD,CAAA,EACrDruC,EAAkD6sC,EAAlD7sC,SAAUzL,EAAwCs4C,EAAxCt4C,UAAW24C,EAA6BL,EAA7BK,OAAQF,EAAqBH,EAArBG,iBAErChtC,EAASxZ,SAAQ0Z,SAAAA,GACf,IAAMguC,EAAUhuC,EAAIU,eACdyH,EAAQ6lC,EAA+Cp0C,GAEzDuO,GACEgmC,EAAehmC,IACjBhgB,QAAQnU,MAAO,yBAAwBm0B,EAAM,SAAQgmC,EAAehmC,GAAO,SAAQ6lC,EAAQ,KAE7FG,EAAehmC,GAAS6lC,GAExB7lD,QAAQnU,MAAM,4BAA4Bg6D,EAAQ,IAEtD,IAEA,IAAMM,EAA8B,IAAIx9C,IAClCi9C,EAA6B,IAAIj9C,IAEvCuD,EAAU/N,SAAQjF,SAAAA,OAES0rD,EACDA,EAFlBA,EAAe1rD,EAAI0rD,aACnB94B,EAA6D,OAA1C84B,EAAAA,EAAajtC,SAA6B,wBAAA,EAA1CitC,EAA4CzhD,QAC/DgqB,EAA2D,OAAzCy3B,EAAAA,EAAajtC,SAA4B,uBAAA,EAAzCitC,EAA2CzhD,QAE/D2oB,GACFq6B,EAAet7C,IAAIihB,EAAiBra,IAElC0b,GACFy4B,EAAc/6C,IAAIsiB,EAAgB1b,GAEtC,IAKA,IAHA,IAG0B00C,EAHtBD,EAAc,EACZD,EAAuC,CAAA,EAEnBE,EAAAA,EAAAA,KAAAA,EAAAA,KAAAA,MAAAA,IAiBtBD,EAAc,GAChBlmD,QAAQmR,KAAM,0BAAyB+0C,GAGzCh6C,EAAU/N,SAAQjF,SAAAA,OAKZ0rD,EAEOA,EANLA,EAAe1rD,EAAI0rD,aAIzB,GAFA1nD,EAAKkpD,oBAAoBxB,WAErBA,EAAAA,EAAaxgD,eAAbwgD,EAAqBnzC,MAAOzZ,GAC9BkF,EAAKmpD,uBAAuBzB,EAAc,qBAAqB,EAAMoB,EAAgBvC,QAChF,IAAImB,OAAAA,EAAAA,EAAaxgD,aAAbwgD,EAAAA,EAAqBnzC,MAAO7Z,GAAe,CAC5BgtD,IAAAA,EAAlBz3B,EAA2D,OAAzCy3B,EAAAA,EAAajtC,SAA4B,uBAAA,EAAzCitC,EAA2CzhD,QAE/DgqB,GAAmB84B,EAAa94B,EAAgB1b,MAClD0b,EAAgB1b,GAAKw0C,EAAa94B,EAAgB1b,KAGpDvU,EAAKmpD,uBAAuBzB,EAAc,qBAAqB,EAAMoB,EAAgBvC,GACrFvmD,EAAKmpD,uBAAuBzB,EAAc,6BAA6B,EAAOoB,EAAgBvC,GAC9FvmD,EAAKmpD,uBAAuBzB,EAAc,kBAAkB,EAAOoB,EAAgBvC,GACnFvmD,EAAKmpD,uBAAuBzB,EAAc,qBAAqB,EAAOoB,EAAgBvC,GACtFvmD,EAAKmpD,uBAAuBzB,EAAc,oBAAoB,EAAOoB,EAAgBvC,EACvF,CACF,IAEA,IAAMW,EAAYS,EAAO,GAEzBT,EAAUY,qBAAqB7mD,SAAQyhB,SAAAA,GAAQ,OAAA1iB,EAAKopD,2BAA2B1mC,MAC/EwkC,EAAUa,oBAAoB9mD,SAAQyhB,SAAAA,GAAQ,OAAA1iB,EAAKqpD,0BAA0B3mC,MAE7E,IAAM4mC,EAAuC,GAE7C7B,EAAiBxmD,SAAQsoD,SAAAA,GACvB,IAAMn2D,EAAOm2D,EAAIC,mBAMjB,QAJkCj6D,IAA9B6D,EAAKi+B,uBACPj+B,EAAKi+B,qBAAuBj+B,EAAKgsB,WAG/BhsB,EAAK4c,aAAc,CACrB,IAAMy5C,EAAiBX,EAAe11D,EAAK4c,aAAauE,IAExDnG,EAAQk7C,EAAcG,EACxB,CACA,GAAIr2D,EAAK6c,cAAe,CACtB,IAAMA,EAAgB64C,EAAe11D,EAAK6c,cAAcsE,IAExDnG,EAAQk7C,EAAcr5C,EACxB,CACF,IAEAq5C,EAAaroD,SAAQ0Z,SAAAA,GACnB,GAAIA,EAAI7pB,SAAWqV,EAAUqV,iBAAkB,CAC7C,IAAMQ,EAAOrB,EAEbqB,EAAKd,QAAQja,SAAQ4+B,SAAAA,SACM6pB,EAAA,CAAC7pB,EAAO,GAAIA,EAAO,IAA3CA,EAAO,GAAIA,EAAAA,GAAAA,EAAO,GAAE6pB,EAAA,EACvB,IAE4B,IAAxB1tC,EAAKd,QAAQhqB,QACf8qB,EAAK1V,UAAYH,EAAUK,OAC3BwV,EAAKvV,UAAYN,EAAUK,SAE3BwV,EAAK1V,UAAYH,EAAUuT,qBAC3BsC,EAAKvV,UAAYN,EAAUK,OAE/B,CACF,GACF,EAEAmjD,EAAAA,qBAAAA,SAAsBlnC,cACpBA,EAAWxhB,SAAQyhB,SAAAA,GACbA,EAAKC,WAAahoB,EAAKkV,SAASY,eAClCzQ,EAAKqpD,0BAA0B3mC,GACtBA,EAAKC,WAAahoB,EAAKkV,SAAS4B,gBACzCzR,EAAKopD,2BAA2B1mC,GACvBA,EAAKC,WAAahoB,EAAKkV,SAASO,iBACzCpQ,EAAK4pD,2BAA2BlnC,EAEpC,GACF,EAEA2mC,EAAAA,0BAAAA,SAA2BnqC,GACpBA,EAAMC,QACTD,EAAMC,MAAQ,CAAEhuB,EAAG,EAAGiB,EAAG,EAAG4kB,EAAG,EAAGD,EAAG,IAGlCmI,EAAME,YACTF,EAAME,UAAY,GAGhBF,EAAMG,YAAc1kB,EAAK0pC,UAAUld,MAChCjI,EAAMI,QACTJ,EAAMI,MAAQ,GAEPJ,EAAMG,YAAc1kB,EAAK0pC,UAAUC,OACvCplB,EAAMI,QACTJ,EAAMI,MAAQ,GAGXJ,EAAMK,iBACTL,EAAMK,eAAiB,GAGpBL,EAAMM,iBACTN,EAAMM,eAAiB3oB,KAAK4oB,GAAK,GAGvC,EAEA2pC,EAAAA,2BAAAA,SAA4Bl4C,GACtBA,EAAO5Z,OAASqD,EAAKkvD,WAAWlqC,aAC9BzO,EAAOK,MACTL,EAAOK,KAAO1a,KAAK4oB,GAAK,IAG9B,EAEAmqC,EAAAA,2BAAAA,SAA4BhnC,QACDrzB,IAArBqzB,EAAOxD,YACTwD,EAAOxD,UAAY,QAGe7vB,IAAhCqzB,EAAOyO,uBACTzO,EAAOyO,qBAAuB,EAElC,EAEA63B,EAAAA,oBAAAA,SAAqBliD,OACfA,EAwBOA,UAxBPA,EAAAA,EAASE,eAATF,EAAiBuN,MAAOzZ,IACrBkM,EAAS22C,0BACZ32C,EAAS22C,OAAO,iBAAsB,CAAExsD,EAAG,EAAGiB,EAAG,EAAG4kB,EAAG,EAAGD,EAAG,SAGvBxnB,IAApCyX,EAAS02C,OAAO,eAClB12C,EAAS02C,OAAO,aAAkB,QAGFnuD,IAA9ByX,EAAS02C,OAAO,SAClB12C,EAAS02C,OAAO,OAAY,QAGGnuD,IAA7ByX,EAAS02C,OAAO,QAClB12C,EAAS02C,OAAO,MAAW,GAGxB12C,EAAS2zB,wBACZ3zB,EAAS2zB,WAAW,WAAgBhgC,EAAKo9B,WAAWC,QAGjDhxB,EAAS2zB,wBACZ3zB,EAAS2zB,WAAW,WAAgBhgC,EAAKy9B,WAAWC,SAE7CrxB,OAAAA,EAAAA,EAASE,aAATF,EAAAA,EAAiBuN,MAAO7Z,IAC5BsM,EAAS22C,0BACZ32C,EAAS22C,OAAO,iBAAsB,CAAExsD,EAAG,EAAGiB,EAAG,EAAG4kB,EAAG,EAAGD,EAAG,SAGxBxnB,IAAnCyX,EAAS02C,OAAO,cAClB12C,EAAS02C,OAAO,YAAiB,QAGQnuD,IAAvCyX,EAAS02C,OAAO,kBAClB12C,EAAS02C,OAAO,gBAAqB,QAGKnuD,IAAxCyX,EAAS02C,OAAO,mBAClB12C,EAAS02C,OAAO,iBAAsB,QAGAnuD,IAApCyX,EAAS02C,OAAO,eAClB12C,EAAS02C,OAAO,aAAkB,QAGUnuD,IAA1CyX,EAAS02C,OAAO,qBAClB12C,EAAS02C,OAA4B,mBAAGxuD,KAAKoQ,eAAiB,EAAI,GAG/D0H,EAAS22C,yBACZ32C,EAAS22C,OAAO,gBAAqB,CAAExsD,EAAG,EAAGiB,EAAG,EAAG4kB,EAAG,EAAGD,EAAG,SAGhBxnB,IAA1CyX,EAAS02C,OAAO,qBAClB12C,EAAS02C,OAAO,mBAAwB,QAGFnuD,IAApCyX,EAAS02C,OAAO,eAClB12C,EAAS02C,OAAO,aAAkB,QAGFnuD,IAA9ByX,EAAS02C,OAAO,SAClB12C,EAAS02C,OAAO,OAAY,QAGGnuD,IAA7ByX,EAAS02C,OAAO,QAClB12C,EAAS02C,OAAO,MAAW,GAGxB12C,EAAS2zB,wBACZ3zB,EAAS2zB,WAAW,WAAgBhgC,EAAKo9B,WAAWC,QAGjDhxB,EAAS2zB,wBACZ3zB,EAAS2zB,WAAW,WAAgBhgC,EAAKy9B,WAAWC,QAGtDv1B,QAAQnU,MAAO,sDAAqDqY,EAASuN,GAAG,IAEpF,EAEAu1C,EAAAA,sBAAAA,SAAuBxkD,EAA+BiT,EAAsBD,GAC1E,IACgBhT,EADZqU,GAAmB,EACnBrT,EAAYhB,OAAAA,EAAAA,EAAQgB,WAARhB,EAAqBa,EAAUuT,qBAE3CxqB,KAAKoQ,iBACPgH,EAAYH,EAAUuT,qBAClBpB,IACGF,GAAYwB,OAAOtB,EAAMzH,QAAWuH,GAAYwB,OAAOtB,EAAMvH,UAChEzK,EAAYH,EAAUK,SAI1BmT,GAAmBpB,GAGrB,IAKgBjT,EACAA,EACIA,EAPduU,EAAiBvT,GAAaH,EAAU2T,wBACzCxT,GAAaH,EAAU4T,uBACvBzT,GAAaH,EAAU6T,uBACvB1T,GAAaH,EAAUuT,qBAE5BpU,EAAQ2U,MAAqB,OAAb3U,EAAAA,EAAQ2U,OAAR3U,EAAiBa,EAAU+T,OAC3C5U,EAAQ6U,MAAqB,OAAb7U,EAAAA,EAAQ6U,OAAR7U,EAAiBa,EAAU+T,OAC3C5U,EAAQmB,UAA6B,OAAjBnB,EAAAA,EAAQmB,WAARnB,EAAqBa,EAAUK,OACnDlB,EAAQgB,UAAYA,EACpBhB,EAAQ8U,YAAc,EACtB9U,EAAQqU,iBAAmBA,EAC3BrU,EAAQuU,eAAiBA,CAC3B,EAEAypB,EAAAA,QAAAA,SAASx8B,EAAgBxB,GACvBpW,KAAK4X,OAASA,EACd5X,KAAKk4D,cAAgB9hD,MAAAA,EAAAA,EAAW,CAAA,CAClC,EAEAuiD,EAAAA,uBAAAA,SAAwBziD,EAA8BkiD,GACpD,GAAIliD,EAAK4J,UAAU9d,QAAU,EAC3B,MAAM,IAAIwY,MAAO,4CAA2CtE,EAAKmP,GAAG,KAGtE,IAAI4mC,EAQJ,GANAmM,EAASrqC,OAAOhc,SAAQokC,SAAAA,GAClBA,EAAS8V,aAAa5mC,KAAOnP,EAAKuC,SAAS4M,KAC7C4mC,EAAe9V,EAAS8V,aAE5B,SAEqB5rD,IAAjB4rD,EACF,MAAM,IAAIzxC,MAAM,kDAAkDtE,EAAKuC,SAAS4M,GAAG,KAGrF,GAAI4mC,EAAa5V,UAAUr0C,SAAWkU,EAAK4J,UAAU9d,OACnD,MAAM,IAAIwY,MAAM,qCAAqCyxC,EAAa5V,UAAUr0C,OAAO,0BAAyBkU,EAAK4J,UAAU9d,OAAO,KAEtI,EAEAi4D,EAAAA,uBAAAA,SAAwBniD,EAA6B+iD,EAAqBxxC,EAAsBuwC,EAAsDvC,GACpJ,IAAMtgD,EAAUe,EAASyT,SAASsvC,GAElC,GAAI9jD,EAAS,CACX,IAEI2S,EADE+vC,EAAUG,EADL7iD,EAAQA,QAAQsO,IAK3B,GAA8B,iBAAnBo0C,EAAQ1uD,OAEjB,MAAM,IAAIyP,MAAM,uCAAuCi/C,EAAQ1uD,QAG/D2e,EAAW2tC,EAAcoC,EAAQ1uD,QAE/B0uD,GACFz5D,KAAK46D,sBAAsBnB,EAASpwC,EAAaK,EAErD,CACF,EAEA4vC,EAAAA,cAAAA,WACE,IAAMwB,EAA2B,GAEjC96D,KAAK4V,MAAM7D,SAAQ8D,SAAAA,GAAQilD,OAAAA,EAAQl3D,KAAK,CAAEyhB,GAAIxP,EAAKwP,QAEnDrlB,KAAK0V,YAAYE,MAAQklD,EAEzB,IAAM3nC,EAA4B,CAChCq2B,QAAS/9C,EAAKi+C,iBAAiB,OAC/BC,cAAe,CACbC,IAAK,MACLC,OAAQ,OAEVzhD,KAAM,KACNijD,cAAerrD,KAAK0V,YAAY2P,GAChC86B,aAAc,CAACngD,KAAK0V,aACpB4V,OAAQtrB,KAAKsrB,OACbyvC,QAAS,CAAC,SACVxvC,SAAUvrB,KAAKurB,SACf3V,MAAO5V,KAAK4V,MACZ2d,WAAYvzB,KAAKuzB,WACjBzT,UAAW9f,KAAK8f,UAChBgqC,QAAS9pD,KAAK8pD,QACdr8B,WAAYztB,KAAKytB,WACjBuV,WAAYhjC,KAAKgjC,WACjBg4B,MAAO,CACL,CACE31C,GAAIrlB,KAAKo3D,gBACT3jC,SAAUhoB,EAAKkV,SAASs6C,iBAKxBhZ,EAAYjiD,KAAKk7D,mBAEvB,MAAO,CACLnwD,OAAQ/K,KAAKm7D,kBACbhoC,UAAAA,EACA8uB,UAAW,CACTz7B,IAAKy7B,EAAUz7B,IAAI+7B,UACnB9+B,IAAKw+B,EAAUx+B,IAAI8+B,WAGzB,EAEA6Y,EAAAA,SAAAA,SAAUl3D,GACR,IAAM+kB,EAASwnB,IACT9rB,EAA0C,CAC9CU,GAAIorB,IACJ56B,KAAM,CAAEwP,GAAI4D,GACZwK,SAAUhoB,EAAKkV,SAASY,eAExB4O,UAAWjsB,EAAKisB,UAChBF,MAAO/rB,EAAK+rB,MACZC,UAAWhsB,EAAKgsB,UAChBE,MAAOlsB,EAAKksB,MACZC,eAAgBnsB,EAAKmsB,eACrBC,eAAgBpsB,EAAKosB,eACrB4kB,aAAchxC,EAAKgxC,cAEfr/B,EAAyB,CAC7BwP,GAAI4D,EACJ9f,KAAMjF,EAAKiF,KACXoa,SAAUrf,EAAKqf,SACfnb,KAAMqD,EAAK4vD,SAASrrC,MACpB68B,GAAI,EACJx7C,SAAS,EACT2vC,YAAa98C,EAAK88C,YAClBn0C,UAAW,CACTK,SAAU,CACRO,EAAGvJ,EAAKgJ,SAAS,GACjBvK,EAAGuB,EAAKgJ,SAAS,GACjBQ,EAAGxJ,EAAKgJ,SAAS,IAEnBwiD,UAAW,CACTjiD,EAAGvJ,EAAK8H,SAAS,GACjBrJ,EAAGuB,EAAK8H,SAAS,GACjB0B,EAAGxJ,EAAK8H,SAAS,IAEnBC,MAAO,CACLwB,EAAGvJ,EAAK+H,MAAM,GACdtJ,EAAGuB,EAAK+H,MAAM,GACdyB,EAAGxJ,EAAK+H,MAAM,KAGlBsnB,WAAY,CACV,CAAElO,GAAIV,EAAUU,KAElBpP,QAAS,CAAC,EACVwd,SAAUhoB,EAAKkV,SAAS+rC,aAG1B1sD,KAAK4V,MAAMhS,KAAKiS,GAChB7V,KAAKuzB,WAAW3vB,KAAK+gB,EACvB,EAEA22C,EAAAA,UAAAA,SAAWt5C,GACT,IAAMiH,EAASwnB,IACT9rB,EAA2C,CAC/CU,GAAIorB,IACJ56B,KAAM,CAAEwP,GAAI4D,GACZwK,SAAUhoB,EAAKkV,SAAS4B,gBACxBF,IAAKL,EAAOK,IACZJ,KAAMD,EAAOC,KACbE,IAAKH,EAAOG,IACZ0O,SAAU7O,EAAO6O,UAEbhb,EAAyB,CAC7BwP,GAAI4D,EACJ9f,KAAM6Y,EAAO7Y,KACboa,SAAUvB,EAAOuB,SAEjBnb,KAAM,SACNykD,GAAI,EACJx7C,SAAS,EACT2vC,YAAah/B,EAAOg/B,YACpBn0C,UAAW,CACTK,SAAU,CACRO,EAAGuU,EAAO9U,SAAS,GACnBvK,EAAGqf,EAAO9U,SAAS,GACnBQ,EAAGsU,EAAO9U,SAAS,IAErBwiD,UAAW,CACTjiD,EAAGuU,EAAOhW,SAAS,GACnBrJ,EAAGqf,EAAOhW,SAAS,GACnB0B,EAAGsU,EAAOhW,SAAS,IAErBC,MAAO,CACLwB,EAAG,EACH9K,EAAG,EACH+K,EAAG,IAGP6lB,WAAY,CACV,CAAElO,GAAIV,EAAUU,KAElBpP,QAAS,CAAC,EACVwd,SAAUhoB,EAAKkV,SAAS+rC,aAG1B1sD,KAAK4V,MAAMhS,KAAKiS,GAChB7V,KAAKuzB,WAAW3vB,KAAK+gB,EACvB,EAEA42C,EAAAA,UAAAA,SAAW7nC,GA8CT,IAAA8nC,EAEAC,EApCuB/nC,EAXjBzK,EAASwnB,IACTirB,EAAapsB,GAAea,0BAA0Bzc,GACpD8b,EAA6CksB,EAA7ClsB,UAAWgB,EAAkCkrB,EAAlClrB,mBAAoB7rB,EAAc+2C,EAAd/2C,UAEvCA,EAAU9O,KAAKwP,GAAK4D,OACK5oB,IAArBqzB,EAAOxD,YACTvL,EAAUuL,UAAYwD,EAAOxD,gBAEK7vB,IAAhCqzB,EAAOyO,uBACTxd,EAAUwd,qBAAuBzO,EAAOyO,sBAE1Cxd,EAAUud,kBAAaxO,EAAAA,EAAOwO,aAAPxO,EAEvB,IAAM7d,EAAyB,CAC7BwP,GAAI4D,EACJ9f,KAAM,mBACNoa,SAAU,IACVnb,KAAMqD,EAAK4vD,SAAS3nC,OACpBm5B,GAAI,EACJx7C,SAAS,EACT2vC,YAAav1C,EAAK6rD,YAAYqE,OAC9B9uD,UAAW,CACTK,SAAU,CACRO,EAAG,EACH9K,EAAG,EACH+K,EAAG,GAELgiD,UAAW,CACTjiD,EAAG,EACH9K,EAAG,EACH+K,EAAG,GAELzB,MAAO,CACLwB,EAAG,EACH9K,EAAG,EACH+K,EAAG,IAGP6lB,WAAY,CACV,CAAElO,GAAIV,EAAUU,KAElBpP,QAAS,CAAC,EACVwd,SAAUhoB,EAAKkV,SAAS+rC,cAG1B8O,EAAAx7D,KAAKsrB,QAAO1nB,KAAZzD,MAAAq7D,EAAoBhsB,GAAAA,OAAAA,KAEpBisB,EAAAz7D,KAAKurB,UAAS3nB,KAAdzD,MAAAs7D,EAAsBjrB,GAAAA,OAAAA,IACtBxwC,KAAK4V,MAAMhS,KAAKiS,GAChB7V,KAAKuzB,WAAW3vB,KAAK+gB,EACvB,EAEAtf,EAAc8zD,aAAd,SAA4BzlC,qBAA5B7zB,GAAA,WAEUw6D,IAAAA,EAiDNmB,EAEAC,EA/CMxyC,EACAyyC,EACElsB,EAAWgB,EAAoB7rB,EAShB+O,EAKXA,EAHN7d,oCAlBJ/E,EAAKqmD,qBAAqBn1D,OAAS,IAAM8O,EAAK8qD,gBAC1CvB,EAAMvpD,EAAKqmD,qBAAqB,GAEtCrmD,EAAKyiB,WAAW3vB,KAAKy2D,EAAIC,0BACMj6D,IAAtBqzB,EAAOod,aACV7nB,EAASwnB,IACTirB,EAAa5qD,EAAKq/B,0BAA0Bzc,EAAOod,YACjDtB,EAA6CksB,EAA7ClsB,UAAWgB,EAAkCkrB,EAAlClrB,oBAAoB7rB,EAAc+2C,EAAd/2C,WAE7B9O,KAAKwP,GAAK4D,OACK5oB,IAArBqzB,EAAOxD,YACTvL,EAAUuL,UAAYwD,EAAOxD,gBAEK7vB,IAAhCqzB,EAAOyO,uBACTxd,EAAUwd,qBAAuBzO,EAAOyO,sBAE1Cxd,EAAUud,kBAAaxO,EAAAA,EAAOwO,aAAPxO,EAEjB7d,EAAyB,CAC7BwP,GAAI4D,EACJ9f,KAAO,UAASuqB,EAAOod,WACvBvtB,gBAAUmQ,EAAAA,EAAOnQ,UAAPmQ,EAAmB,IAC7BtrB,KAAMqD,EAAK4vD,SAAS3nC,OACpBm5B,GAAI,EACJx7C,SAAS,EACT2vC,YAAav1C,EAAK6rD,YAAYqE,OAC9B9uD,UAAW,CACTK,SAAU,CACRO,EAAG,EACH9K,EAAG,EACH+K,EAAG,GAELgiD,UAAW,CACTjiD,EAAG,EACH9K,EAAG,EACH+K,EAAG,GAELzB,MAAO,CACLwB,EAAG,EACH9K,EAAG,EACH+K,EAAG,IAGP6lB,WAAU,CACR,CAAElO,GAAIV,EAAUU,KAElBpP,QAAS,CAAC,EACVwd,SAAUhoB,EAAKkV,SAAS+rC,cAG1B8O,EAAA1qD,EAAKwa,QAAO1nB,KAAZzD,MAAAq7D,EAAoBhsB,GAAAA,OAAAA,KAEpBisB,EAAA3qD,EAAKya,UAAS3nB,KAAdzD,MAAAs7D,EAAsBjrB,GAAAA,OAAAA,IACtB1/B,EAAK8E,MAAMhS,KAAKiS,GAChB/E,EAAKyiB,WAAW3vB,KAAK+gB,UAEzB,GAzDA9kB,IA2DAswC,EAAAA,0BAAAA,SAA2B0rB,GACzB,GAAiB,QAAbA,GAAmC,SAAbA,EACxB,MAAM,IAAIrhD,MAAM,mCAAmCqhD,EAAS,sCAG9D,IAAMC,EAAmB,QAAbD,EAAqBxsB,GAAY0sB,IAAM1sB,GAAY2sB,KACzD9/C,EAASozB,GAAeuB,gBAAgBirB,GAE9C,OAAOxsB,GAAea,0BAA0Bj0B,EAClD,EAEA9W,EAAAA,QAAAA,WACEpF,KAAKyc,QAELzc,KAAK4X,OAAS,IAChB,EAEA6E,EAAAA,MAAAA,WACEzc,KAAK+2D,UAAY,GACjB/2D,KAAKg3D,aAAe,GACpBh3D,KAAKi3D,cAAgB,GACrBj3D,KAAKk3D,eAAiB,GACtBl3D,KAAKm3D,qBAAuB,GAE5Bn3D,KAAKsrB,OAAS,GACdtrB,KAAKq3D,cAAgB,GACrBr3D,KAAKurB,SAAW,GAChBvrB,KAAK4V,MAAQ,GACb5V,KAAKuzB,WAAa,GAClBvzB,KAAK8f,UAAY,GACjB9f,KAAK8pD,QAAU,GACf9pD,KAAKytB,WAAa,GAClBztB,KAAKgjC,WAAa,EACpB,EAEA39B,EAAQ61D,iBAAR,WACE,IAAMe,EAA4C,CAAA,EAElDj8D,KAAK+2D,UAAUhlD,SAAQmE,SAAAA,GACrB,IAAMmP,EAAKnP,EAAK+1C,aAAa5mC,GAE7B42C,EAAgB52C,GAAMnP,CACxB,IACA,IAAMgmD,EAA6C,CAAA,EAEnDl8D,KAAKuzB,WAAWxhB,SAAQ4S,SAAAA,GACtB,GAAIA,EAAU8O,WAAahoB,EAAKkV,SAASC,cAAe,CACtD,IAAM9K,EAAgB6O,EAEtBu3C,EAAiBv3C,EAAUU,IAAM42C,EAAgBnmD,EAAc2C,SAAS4M,GAC1E,CACF,IAEA,IAAM48B,EAAY,IAAIh4C,GAChBkyD,EAAgD,CAAA,EA2BtD,OAzBAn8D,KAAK4V,MAAM7D,SAAQ8D,SAAAA,GACAA,IAAAA,EACOsmD,EADlBh9C,SAAWtJ,EAAAA,EAAKsJ,UAALtJ,EAAiB,GAC5BysC,EAA8C,OAA5B6Z,EAAAA,EAAmBh9C,IAAnBg9C,EAAgC,IAAInpC,EACtD1oB,EAAwB,CAAA,EAE1BuL,EAAKhJ,YACPvC,EAAM4C,UAAW,IAAIzD,IAAUoF,SAASgH,EAAKhJ,UAAUK,UACvD5C,EAAM0B,SAAWlC,GAAMsyD,YAAYvmD,EAAKhJ,UAAU6iD,WAClDplD,EAAM2B,OAAQ,IAAIxC,IAAUoF,SAASgH,EAAKhJ,UAAUZ,QAEtD,IAAMY,EAAY,IAAImmB,EAAU1oB,EAAOg4C,GAEvC6Z,EAAmBtmD,EAAKwP,IAAMxY,EAC9BgJ,EAAK0d,WAAWxhB,SAAQ4S,SAAAA,GACtB,IAAMzO,EAAOgmD,EAAiBv3C,EAAUU,IAExC,GAAInP,GAAQA,EAAKmmD,OAAQ,CACvB,IAAMtkB,EAAStuC,GAAQ4E,UAAU6H,EAAKmmD,OAAO5+C,IAAI+I,KAC3CwxB,EAASvuC,GAAQ4E,UAAU6H,EAAKmmD,OAAO5+C,IAAIgG,KAEjDw+B,EAAUzJ,MAAM,IAAIvuC,GAAK8tC,EAAQC,GACnC,CACF,GACF,IAEOiK,CACT,EAEAqa,EAAAA,gBAAAA,WACE,YAAmDj8D,IAA5CL,KAAKi4D,aAAac,QAAQE,aACnC,EAEAsD,EAAAA,mBAAAA,WACE,OAAsD,IAA/Cv8D,KAAKi4D,aAAac,QAAQC,gBACnC,EAEAmC,EAAAA,gBAAAA,WACE,IAAMqB,EAASx8D,KAAKi4D,aAAaE,KAAKqE,OAEtC,YAAen8D,IAAXm8D,EACK,UACoB,iBAAXA,EACTA,EAEA,cAEX,EAEAC,EAAAA,uBAAAA,WACE,OAAOz8D,KAAK0V,YAAY6N,QAC1B,EAEAnT,EAAAA,aAAAA,WACE,MAA6C,WAAtCpQ,KAAKk4D,cAAc1oD,cAC5B,EAEAktD,EAAAA,gBAAAA,WACS,IAAAC,EAAP,OAAyC,OAAlCA,EAAA38D,KAAKi4D,aAAac,QAAQx1C,UAA1Bo5C,EAAsC,IAC/C,EAEAC,EAAAA,eAAAA,WACS,IAAAC,EAAP,OAAO,OAAAA,EAAA78D,KAAKi4D,aAAac,QAAQ/X,aAA1B6b,EAAyCpxD,EAAK6rD,YAAYC,OACnE,EAEAuF,EAAAA,cAAAA,WAGE,OAFiB98D,KAAKi4D,aAAaE,KAAKrnB,YAGtC,IAAK,MAAO,OAAOzB,GAAY0sB,IAC/B,IAAK,OAAQ,OAAO1sB,GAAY2sB,KAEpC,EAEAe,EAAAA,YAAAA,WACE,OAA4C,IAArC/8D,KAAKi4D,aAAaE,KAAKiB,SAChC,EAEAwC,EAAAA,aAAAA,WACE,OAA+C,IAAxC57D,KAAKi4D,aAAaE,KAAKyD,YAChC,EAEAoB,EAAAA,kBAAAA,WACE,MAA6C,iBAAlCh9D,KAAKi4D,aAAaE,KAAKqE,QACzBx8D,KAAKi4D,aAAaE,KAAKqE,OAAOS,SAAS,kBAIlD,EAMAC,EAAAA,aAAAA,SAAcC,EAAqBC,cACjCD,EAAOprD,SAAQsrD,SAAAA,QACGh9D,IAAZg9D,EAAEptC,MACYotC,EAAEptC,MAAdmtC,EAAsB,CAAC,IAAK,IAAK,IAAK,KAAyB,CAAC,EAAG,EAAG,EAAG,IAE7EC,EAAEptC,MAAM,GAAKnf,EAAKwsD,cAAcD,EAAEptC,MAAM,GAAImtC,GAC5CC,EAAEptC,MAAM,GAAKnf,EAAKwsD,cAAcD,EAAEptC,MAAM,GAAImtC,GAC5CC,EAAEptC,MAAM,GAAKnf,EAAKwsD,cAAcD,EAAEptC,MAAM,GAAImtC,GAC5CC,EAAEptC,MAAM,GAAKnf,EAAKwsD,cAAcD,EAAEptC,MAAM,GAAImtC,GAEhD,GACF,EAEAG,EAAAA,cAAAA,SAAeC,EAAuBJ,GACpC,IAAMnxD,EAAQmxD,EAAW,IAAQz1D,KAAK4oB,GAAK5oB,KAAK4oB,GAAK,IAErDitC,EAAQzrD,SAAQiQ,SAAAA,QACa3hB,IAAvB2hB,EAAOyO,cACTzO,EAAOyO,YAAYG,MAAQ3kB,EAE/B,GACF,EAEAwxD,EAAAA,gBAAAA,SAAiB39C,EAA2Bs9C,cAC1Ct9C,EAAU/N,SAAQjF,SAAAA,QACYzM,IAAxByM,EAAI2yB,gBACU3yB,EAAI2yB,gBAAhB29B,EAAkC,CAAC,IAAK,IAAK,IAAK,KAAqC,CAAC,EAAG,EAAG,EAAG,IAErGtwD,EAAI2yB,gBAAgB,GAAK3uB,EAAKwsD,cAAcxwD,EAAI2yB,gBAAgB,GAAI29B,GACpEtwD,EAAI2yB,gBAAgB,GAAK3uB,EAAKwsD,cAAcxwD,EAAI2yB,gBAAgB,GAAI29B,GACpEtwD,EAAI2yB,gBAAgB,GAAK3uB,EAAKwsD,cAAcxwD,EAAI2yB,gBAAgB,GAAI29B,GACpEtwD,EAAI2yB,gBAAgB,GAAK3uB,EAAKwsD,cAAcxwD,EAAI2yB,gBAAgB,GAAI29B,SAG3C/8D,IAAvByM,EAAI+zB,eACU/zB,EAAI+zB,eAAhBu8B,EAAiC,CAAC,IAAK,IAAK,IAAK,KAAoC,CAAC,EAAG,EAAG,EAAG,IAEnGtwD,EAAI+zB,eAAe,GAAK/vB,EAAKwsD,cAAcxwD,EAAI+zB,eAAe,GAAIu8B,GAClEtwD,EAAI+zB,eAAe,GAAK/vB,EAAKwsD,cAAcxwD,EAAI+zB,eAAe,GAAIu8B,GAClEtwD,EAAI+zB,eAAe,GAAK/vB,EAAKwsD,cAAcxwD,EAAI+zB,eAAe,GAAIu8B,GAClEtwD,EAAI+zB,eAAe,GAAK/vB,EAAKwsD,cAAcxwD,EAAI+zB,eAAe,GAAIu8B,IAGhEA,QAAqC/8D,IAAzByM,EAAI2zB,uBAAoEpgC,IAAlCyM,EAAI2zB,iBAAiBi9B,WACzE5wD,EAAI2zB,iBAAiBi9B,SAAW5sD,EAAKV,eAAiB,EAAI,EAE9D,GACF,EAEAutD,EAAAA,iBAAAA,SAAkB36B,GAChB,OAAOA,EAAWtpB,KAAIupB,SAAAA,GACpB,IAAMH,EAASG,EAAK8uB,SAASr4C,KAAIkkD,SAAAA,GAS/B,MARqC,CACnCl7B,MAAOk7B,EAAQl7B,MAAMlO,MACrBmO,OAAQi7B,EAAQj7B,OAAOnO,MACvBiO,KAAMm7B,EAAQh8D,OAAO6gC,KACrBn6B,KAAMs1D,EAAQh8D,OAAO0G,KACrBs6B,cAAeg7B,EAAQh7B,cAI3B,IAOA,MALuC,CACrCz5B,KAAM85B,EAAK95B,KACX25B,OAAQA,EAIZ,GACF,EAEA9O,EAAAA,eAAAA,SAAgB6pC,EAA0BC,GAGxC,OAFc,IAAIC,GAAc/9D,KAAK4X,OAAQimD,EAAWC,GAE3CrlD,QACf,EAEAulD,EAAAA,eAAAA,SAAgBlmD,GAGd,OAFc,IAAImmD,GAAcnmD,EAAU,GAAI9X,KAAKoQ,gBAEtC0H,QACf,EAEAqR,EAAAA,gBAAAA,SAAiBC,EAAkBrS,EAAsBsS,GACvD,OAAOH,GAAYC,gBAAgBnpB,KAAK4X,OAAQwR,EAAOrS,EAASsS,EAAarpB,KAAKoQ,eACpF,EAEA8tD,EAAAA,kBAAAA,SAAmBzxC,EAAyBO,cAC1C,GAAyB,GAArBP,EAAWzqB,OAAe,MAAM,IAAIwY,MAAO,gDAA+CiS,GAE9F,IAAMT,EAAgC,GAwBtC,OAtBAS,EAAW1a,SAAQma,SAAAA,GACjB,GAAwB,GAApBA,EAAUlqB,OAAe,MAAM,IAAIwY,MAAO,0DAAyD0R,GAEvG,MAAMiyC,EAA8B,IAEpCjyC,EAAUna,SAAQ04C,SAAAA,GAChB,QAAsBpqD,IAAlBoqD,EAAI9gC,UAA2B,MAAM,IAAInP,MAAO,8CAA6CiwC,GAEjG0T,EAAQv6D,KAAK,CACXwE,KAAM,SACNlE,KAAMumD,EAAI9gC,UACVK,SAAUygC,EAAIzgC,UAElB,IAEIlZ,EAAKV,kBACoBoqD,EAAA,CAAC2D,EAAQ,GAAIA,EAAQ,IAA/CA,EAAQ,GAAIA,EAAAA,GAAAA,EAAQ,GAAE3D,EAAA,IAGzBxuC,EAAQpoB,KAAKu6D,EACf,IAEsB,GAAlBnyC,EAAQhqB,OAEHknB,GAAY0D,4BAA4B5sB,KAAK4X,OAAQoU,EAAQ,IAG7D9C,GAAY6D,kCAAkC/sB,KAAK4X,OAAQoU,EAASgB,MAAAA,EAAAA,EAAcrlB,KAAKulB,IAAI,EAAGlB,EAAQhqB,OAAS,GAE1H,EAEAo8D,EAAAA,aAAAA,SAAc/D,OACiBA,EAqBHA,SArBpBl4B,EAAuBk4B,OAAAA,EAAAA,EAAIl4B,sBAAJk4B,EAA4BA,EAAInqC,UACvDkS,EAAmBi4B,EAAIgE,uBAEvBC,EADmBjE,EAAIiE,eACW5kD,KAAI4R,SAAAA,GAC1C,MAAM6+B,EAAY7+B,EAAO5R,KAAI+wC,SAAAA,GAO3B,MANiC,CAC/BriD,KAAM,SACNlE,KAAMumD,EAAI9gC,UACVK,SAAUygC,EAAIzgC,SAIlB,IAEIlZ,EAAKV,iBACwBoqD,EAAA,CAACrQ,EAAU,GAAIA,EAAU,IAAvDA,EAAU,GAAIA,EAAAA,GAAAA,EAAU,GAAEqQ,EAAA,IAG7B,OAAOrQ,CACT,IACM7nB,EAAmBg8B,EAAet8D,OAAS,EAC3CqgC,SAAoBg4B,EAAAA,EAAIh4B,mBAAJg4B,EAAyB1yD,KAAKulB,IAAI,EAAGoV,GAEzDi8B,EAAgC,GAEtCn8B,EAAiBrwB,SAAQq9B,SAAAA,GACvBmvB,IAAAA,GAAAA,EAAAA,GAAoB36D,KAApB26D,MAAAA,EAA4BnvB,GAAAA,OAAAA,GAC9B,IAEA,IAAMlzB,EAA8B,CAClC9T,KAAM,SACN85B,WAAYliC,KAAK+8D,cACjB7sC,UAAWmqC,EAAInqC,UACfiS,qBAAsBA,EACtBC,iBAAkBm8B,EAClBx9C,cAAeu9C,EACfh8B,iBAAkBA,EAClBD,kBAAmBA,GAGrB,OAAOiN,GAAeU,oBAAoBhwC,KAAK4X,OAAQsE,EACzD,EAEAsiD,EAAAA,oBAAAA,SAAqB3C,GACnB,GAAiB,QAAbA,GAAmC,SAAbA,EAAuB,MAAM,IAAIrhD,MAAO,4BAA2BqhD,GAE7F,IAAMC,EAAmB,QAAbD,EAAqBxsB,GAAY0sB,IAAM1sB,GAAY2sB,KACzD9/C,EAASozB,GAAeuB,gBAAgBirB,GAE9C,OAAOxsB,GAAeU,oBAAoBhwC,KAAK4X,OAAQsE,EACzD,EAEAohD,EAAAA,cAAAA,SAAe9vD,EAAa4vD,GAC1B,OAAOA,EAAWjW,GAAap2B,WAAWvjB,GAAO25C,GAAaj2B,SAAS1jB,EACzE,EAEAixD,EAAAA,cAAAA,SAAeC,EAAetB,cAC5B,OAAOsB,EAAIhlD,KAAIlM,SAAAA,UAAOsD,EAAKwsD,cAAc9vD,EAAK4vD,KAChD,EArjCWxG,CAsjCZ,CAtjCW,GAwjCL,SAAS+H,KACd,MAAQ,ooBAgBV,CAEO,SAASC,KACd,MAAQ,mJAKV,CAEO,SAASC,KAiDd,MAhDoC,CAClCx5C,GAAM,mCACNlc,KAAQ,eACRsqB,SAAYhoB,EAAKkV,SAAS5I,SAC1B0zB,WAAc,CACZ5C,WAAcp9B,EAAKo9B,WAAWC,OAC9BI,WAAc,SAEhB4lB,OAAU,GACV92C,OAAU,CACRqN,GAAM,oCAER0pC,KAAQ,CAER,EACAP,OAAU,CACR9lB,OAAU,EACVC,MAAS,EACTm2B,YAAe,EACf5P,gBAAmB,EACnBC,iBAAoB,EACpB4P,aAAgB,EAChBC,mBAAsB,EACtBC,mBAAsB,EACtBC,aAAgB,IAElBlQ,SAAY,CAEZ,EACAP,OAAU,CACRC,iBAAoB,CAClBzsD,EAAK,EACLiB,EAAK,EACL4kB,EAAK,EACLD,EAAK,GAEPunC,gBAAmB,CACjBntD,EAAK,EACLiB,EAAK,EACL4kB,EAAK,EACLD,EAAK,IAGT0D,SAAY,CAEZ,EAIJ,CAEO,SAAS4zC,KAqCd,MApCoC,CAClC95C,GAAM,mCACNlc,KAAQ,iBACRsqB,SAAYhoB,EAAKkV,SAAS5I,SAC1B0zB,WAAc,CACZ/C,OAAU,OACVC,MAAS,OACTE,WAAcp9B,EAAKo9B,WAAWC,OAC9Bs2B,KAAQ,SAEVtQ,OAAU,GACV92C,OAAU,CACRqN,GAAM5Z,EAAKC,kBAAkBG,aAE/BkjD,KAAQ,CAER,EACAP,OAAU,CACR0Q,aAAgB,IAElBlQ,SAAY,CAEZ,EACAP,OAAU,CACRC,iBAAoB,CAClBzsD,EAAK,EACLiB,EAAK,EACL4kB,EAAK,EACLD,EAAK,IAGT0D,SAAY,CAEZ,EAIJ,CAEA,IAAMwyC,GAAD,WAACA,SAAAA,EAGFnmD,EACAynD,EACAC,QAFQ1nD,OAAAA,OACAynD,aAAAA,OACAC,iBAAAA,EALNvB,IAAAA,EAAAA,EAAAA,UAAAA,OAoGJ14D,EAAQk6D,iBAAR,SAA0B/mC,GAUxB,MATuC,CACrCpwB,KAAMowB,EAASpwB,KACfvC,KAAM2yB,EAASgnC,SAGft7D,KAAMs0B,EAAShE,MACfkE,UAAWF,EAASinC,WAIxB,EAcAC,EAAAA,eAAAA,SAAgBp6D,GACd,OAAOtF,KAAKq/D,aAAaM,YAAYr6D,EACvC,EA2EAs6D,EAAAA,kBAAAA,SAAmBt6D,GACjB,OAAOtF,KAAKq/D,aAAaQ,aAAa,WAAWv6D,EACnD,EAEAw6D,EAAAA,gBAAAA,SAAiBx6D,GACf,OAAOtF,KAAKq/D,aAAaQ,aAAa,SAASv6D,EACjD,EAEAy6D,EAAAA,iBAAAA,SAAkBz6D,GAChB,OAAOtF,KAAKq/D,aAAaQ,aAAa,UAAUv6D,EAClD,EApNIy4D,GAAAA,EAAAA,EAQAtlD,IAAAA,WAAJpE,IAAA,sBACQ3C,EAAwC,CAAA,EAE9C,IAAI1R,KAAKggE,YAKP,MAAM,IAAIxlD,MAAM,8BAJhB,IAAM4Z,EAASp0B,KAAKk5B,eAMtB,GAJExnB,EAAwB,WAAG1R,KAAKu/D,iBAAiBnrC,GAI/Cp0B,KAAKigE,UAAW,CAClB,IAAM7rC,EAASp0B,KAAKkgE,kBAEL7/D,IAAX+zB,IACF1iB,EAAsB,SAAG1R,KAAKu/D,iBAAiBnrC,GAEnD,CACA,GAAIp0B,KAAKmgE,WAAY,CACnB,IAAM/rC,EAASp0B,KAAKogE,mBAEL//D,IAAX+zB,IACF1iB,EAAuB,UAAG1R,KAAKu/D,iBAAiBnrC,GAEpD,CAOA,GANAp0B,KAAKqgE,aAAatuD,SAAQvE,SAAAA,GACxB,IAAM4mB,EAAStjB,EAAK4uD,eAAelyD,GAGnCkE,EAFoB,QAAMlE,EAAM,IAEPsD,EAAKyuD,iBAAiBnrC,EACjD,IACIp0B,KAAKs/D,iBAAkB,CACzB,IAAMjmC,EAAcr5B,KAAKsgE,oBAELjgE,IAAhBg5B,IACF3nB,EAAsB,SAAG1R,KAAKu/D,iBAAiBlmC,IAEjD,IAAMC,EAAet5B,KAAKugE,qBAELlgE,IAAjBi5B,IACF5nB,EAAuB,UAAG1R,KAAKu/D,iBAAiBjmC,GAEpD,CAKA,IAAK,IAAIj3B,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,IAAM62B,EAAiBl5B,KAAK4/D,kBAAkBv9D,QAEvBhC,IAAnB64B,IACFxnB,EAAW,oBAAoBrP,GAAOrC,KAAKu/D,iBAAiBrmC,IAG9D,IAAMgnC,EAAelgE,KAAK8/D,gBAAgBz9D,QAErBhC,IAAjB6/D,IACFxuD,EAAW,kBAAkBrP,GAAOrC,KAAKu/D,iBAAiBW,IAG5D,IAAME,EAAgBpgE,KAAK+/D,iBAAiB19D,QAEtBhC,IAAlB+/D,IACF1uD,EAAW,mBAAmBrP,GAAOrC,KAAKu/D,iBAAiBa,GAE/D,CAEA,IAAMnkB,EAAaj8C,KAAKi8C,WAExB,YAAmB57C,IAAf47C,EACKvjC,EAASzX,OACdjB,KAAK4X,OACL,CACElG,WAAYA,EACZE,QAAS,CAAE1N,KAAM+3C,GACjB7iC,UAAW,EACXC,UAAW4iC,EAAWj6C,OACtBkX,KAAMjC,EAAUs7C,YAIb75C,EAASzX,OACdjB,KAAK4X,OACL,CACElG,WAAYA,EACZ0H,UAAW,EACXC,UAAWrZ,KAAKk5B,eAAe1E,MAAMxyB,OAAS,EAC9CkX,KAAMjC,EAAUs7C,WAIxB,IAeIr5B,IAAAA,iBAAJ7kB,IAAA,WACE,OAAOrU,KAAKq/D,aAAa1xD,aAC3B,IAEIuyD,IAAAA,eAAJ7rD,IAAA,WACE,OAAOrU,KAAKq/D,aAAamB,WAC3B,IAEIJ,IAAAA,gBAAJ/rD,IAAA,WACE,OAAOrU,KAAKq/D,aAAaoB,YAC3B,IAMIH,IAAAA,iBAAJjsD,IAAA,WACE,OAAOrU,KAAKq/D,aAAaqB,UAAU,EACrC,IAEIH,IAAAA,kBAAJlsD,IAAA,WACE,OAAOrU,KAAKq/D,aAAasB,WAAW,EACtC,IAEIX,IAAAA,cAAJ3rD,IAAA,WACE,YAA+BhU,IAAxBL,KAAKk5B,cACd,IAEI+mC,IAAAA,YAAJ5rD,IAAA,WACE,YAA6BhU,IAAtBL,KAAKkgE,YACd,IAEIC,IAAAA,aAAJ9rD,IAAA,WACE,YAA8BhU,IAAvBL,KAAKogE,aACd,IAEIQ,IAAAA,cAAJvsD,IAAA,WACE,OAAOrU,KAAK6gE,cAAgB,CAC9B,IAEIA,IAAAA,gBAAJxsD,IAAA,WACE,IAAK,IAAIhS,EAAI,EAAGA,EAAI,GAAIA,IACtB,QAA+BhC,IAA3BL,KAAK0/D,eAAer9D,GAAoB,OAAOA,EAGrD,OAAO,CACT,IAEIy+D,IAAAA,oBAAJzsD,IAAA,WACE,YAA+BhU,IAAxBL,KAAKsgE,cACd,IAEIS,IAAAA,qBAAJ1sD,IAAA,WACE,YAAgChU,IAAzBL,KAAKugE,eACd,IAEItkB,IAAAA,aAAJ5nC,IAAA,WACE,QAAkChU,IAA9BL,KAAKq/D,aAAaztD,QAEtB,OAAQ5R,KAAKq/D,aAAaztD,QAAQxJ,MAChC,KAAKqM,sBAAqC,aAE1C,KAAKA,sBAAuC,eAE5C,KAAKA,sBAAsC,cACzC,OAAOzU,KAAKq/D,aAAaztD,QAAQ4iB,MAIvC,IAEIq+B,IAAAA,aAAJx+C,IAAA,WACE,YAAkChU,IAA9BL,KAAKq/D,aAAaztD,QAAgC5R,KAAKq/D,aAAaztD,QAAQ4iB,MAAMxyB,OAAwB,CAChH,IAEIq+D,IAAAA,eAAJhsD,IAAA,WAGE,IAFA,IAAM2sD,EAAsB,GAEnB3+D,EAAI,EAAGA,EAAI,SACahC,IAA3BL,KAAK0/D,eAAer9D,GADFA,IAEpB2+D,EAAUp9D,KAAKvB,GAMnB,OAAO2+D,CACT,KAxMIjD,EAAD,GAwNCE,GAAD,WAACA,SAAAA,EAMSnmD,EAAwByT,EAAqBjC,GACxDtpB,KAAKihE,aAAenpD,EACpB9X,KAAKurB,SAAWA,EAChBvrB,KAAKspB,WAAaA,EAThB20C,IAAAA,EAAAA,EAAAA,UAAAA,OAiGJ54D,EAAQ67D,iBAAR,SAA0B57D,GACxB,KAAIA,EAAQ,GAAKA,GAAStF,KAAKurB,SAASvpB,QAExC,OAAOhC,KAAKurB,SAASjmB,EACvB,EAEAovB,EAAAA,cAAAA,SAAeysC,GACb,OAAOA,EAAUnhE,KAAKkhE,iBAAiBC,EAAQ77D,YAASjF,CAC1D,EAEA+gE,EAAAA,gBAAAA,SAAiBD,GACf,OAAOA,EAAUA,EAAQE,cAAWhhE,CACtC,EAEAihE,EAAAA,oBAAAA,SAAqBH,GACDA,IAAAA,EAAZt0D,EAAYs0D,MAAAA,GAAmB,OAAnBA,EAAAA,EAASI,iBAATJ,EAAAA,EAAqBK,sBAEvC,QAAkBnhE,IAAdwM,SAIqBxM,IAArBwM,EAAUpH,aAA+CpF,IAAvBwM,EAAUb,eAA8C3L,IAApBwM,EAAUZ,OAIpF,MAAO,CACLxG,OAAQoH,EAAUpH,OAClBuG,SAAUa,EAAUb,SACpBC,MAAOY,EAAUZ,MAErB,EA0EAw1D,EAAAA,cAAAA,WACS,IAAAC,EAAP,OAA+B,OAAxBA,EAAA1hE,KAAKihE,aAAaU,aAAM,EAAxBD,EAA0B3hC,aACnC,EA3MIk+B,GAAAA,EAAAA,EAYAnmD,IAAAA,WAAJzD,IAAA,WACE,IAAMvH,EAAM9M,KAAKihE,aACXW,EAAUC,GAAWvmB,gBAAgBxuC,GAEvCuhB,EAAW5iB,EAAKsyB,iBAAiBC,OAErC,OAAQlxB,EAAIg1D,WACV,IAAK,SACHzzC,EAAW5iB,EAAKsyB,iBAAiBC,OAEjC,MACF,IAAK,OACH3P,EAAW5iB,EAAKsyB,iBAAiBE,OAEjC,MACF,IAAK,QACH5P,EAAW5iB,EAAKsyB,iBAAiBG,YAKrC,IAIoBpxB,EAaLA,EAsCAA,EAvDT+yB,EAAO/yB,EAAI+tB,YAAcpvB,EAAK4yB,SAASE,OAAS9yB,EAAK4yB,SAASG,MAI9DsB,SAAchzB,EAAAA,EAAIgzB,aAAJhzB,EAAmB,GAEjC3D,EAAO2D,EAAI3D,KAEjB,OAAIy4D,EACK,CACLz4D,KAAMA,EACNf,KAAMqD,EAAK+zB,aAAatlB,MACxBwlB,iBAAkB1/B,KAAK+hE,oBACvBniC,2BAA4B5/B,KAAKgiE,sBACjCriC,0BAA2B3/B,KAAKiiE,0BAChCxiC,gBAAiBz/B,KAAKy/B,gBAEtBlnB,UAAqB,OAAVzL,EAAAA,EAAI60D,aAAM,EAAV70D,EAAYyL,UACvB8V,SAAUA,EACVyR,YAAaA,EACbD,KAAMA,GAGD,CACL12B,KAAMA,EACNf,KAAMqD,EAAK+zB,aAAarlB,IACxBulB,iBAAkB1/B,KAAK+hE,oBACvBniC,2BAA4B5/B,KAAKgiE,sBACjCriC,0BAA2B3/B,KAAKiiE,0BAChCxiC,gBAAiBz/B,KAAKy/B,gBAEtBM,cAAe//B,KAAKyhE,gBAEpBvhC,yBAA0BlgC,KAAKkiE,4BAC/B9hC,mCAAoCpgC,KAAKmiE,8BACzChiC,kCAAmCngC,KAAKoiE,kCACxCpiC,eAAgBhgC,KAAKqiE,cACrBpiC,gBAAiBjgC,KAAKigC,gBAEtBI,cAAergC,KAAKsiE,iBACpB9hC,wBAAyBxgC,KAAKuiE,mBAC9BhiC,uBAAwBvgC,KAAKwiE,uBAC7BliC,mBAAoBtgC,KAAKsgC,mBAEzBG,iBAAkBzgC,KAAKyiE,oBACvB7hC,2BAA4B5gC,KAAK0iE,sBACjC/hC,0BAA2B3gC,KAAK2iE,0BAChCjiC,yBAA0B1gC,KAAK0gC,yBAE/BK,gBAAiB/gC,KAAK4iE,mBACtB3hC,0BAA2BjhC,KAAK6iE,qBAChC7hC,yBAA0BhhC,KAAK8iE,yBAC/BjiC,eAAgB7gC,KAAK6gC,eACrBC,kBAAmB,EAEnBvoB,UAAqB,OAAVzL,EAAAA,EAAI60D,aAAM,EAAV70D,EAAYyL,UACvB8V,SAAUA,EACVyR,YAAaA,EACbD,KAAMA,EACNkjC,cAzDiB,EA4DvB,IAkCIhB,IAAAA,sBAAJ1tD,IAAA,WACE,OAAOrU,KAAK00B,cAAc10B,KAAKihE,aAAavhC,iBAC9C,IAEIsiC,IAAAA,wBAAJ3tD,IAAA,WACE,OAAOrU,KAAKohE,gBAAgBphE,KAAKihE,aAAavhC,iBAChD,IAEIuiC,IAAAA,4BAAJ5tD,IAAA,WACE,OAAOrU,KAAKshE,oBAAoBthE,KAAKihE,aAAavhC,iBACpD,IAEIwiC,IAAAA,8BAAJ7tD,IAAA,WACE,OAAOrU,KAAK00B,cAAc10B,KAAKihE,aAAa/gC,yBAC9C,IAEIiiC,IAAAA,gCAAJ9tD,IAAA,WACE,OAAOrU,KAAKohE,gBAAgBphE,KAAKihE,aAAa/gC,yBAChD,IAEIkiC,IAAAA,oCAAJ/tD,IAAA,WACE,OAAOrU,KAAKshE,oBAAoBthE,KAAKihE,aAAa/gC,yBACpD,IAEIoiC,IAAAA,mBAAJjuD,IAAA,WACE,OAAOrU,KAAK00B,cAAc10B,KAAKihE,aAAa5gC,cAC9C,IAEIkiC,IAAAA,qBAAJluD,IAAA,WACE,OAAOrU,KAAKohE,gBAAgBphE,KAAKihE,aAAa5gC,cAChD,IAEImiC,IAAAA,yBAAJnuD,IAAA,WACE,OAAOrU,KAAKshE,oBAAoBthE,KAAKihE,aAAa5gC,cACpD,IAEIoiC,IAAAA,sBAAJpuD,IAAA,WACE,OAAOrU,KAAK00B,cAAc10B,KAAKihE,aAAaxgC,iBAC9C,IAEIiiC,IAAAA,wBAAJruD,IAAA,WACE,OAAOrU,KAAKohE,gBAAgBphE,KAAKihE,aAAaxgC,iBAChD,IAEIkiC,IAAAA,4BAAJtuD,IAAA,WACE,OAAOrU,KAAKshE,oBAAoBthE,KAAKihE,aAAaxgC,iBACpD,IAEImiC,IAAAA,qBAAJvuD,IAAA,WACE,OAAOrU,KAAK00B,cAAc10B,KAAKihE,aAAalgC,gBAC9C,IAEI8hC,IAAAA,uBAAJxuD,IAAA,WACE,OAAOrU,KAAKohE,gBAAgBphE,KAAKihE,aAAalgC,gBAChD,IAEI+hC,IAAAA,2BAAJzuD,IAAA,WACE,OAAOrU,KAAKshE,oBAAoBthE,KAAKihE,aAAalgC,gBACpD,IAEIiiC,IAAAA,cAAJ3uD,IAAA,WACE,IAAM4uD,EAASjjE,KAAK6gC,eAEpB,OAAOoiC,EAAO,GAAKA,EAAO,GAAKA,EAAO,GAAK,CAC7C,IAEIxjC,IAAAA,kBAAJprB,IAAA,WACE,IAAM3R,EAAI1C,KAAKihE,aAAaxhC,gBAE5B,YAAUp/B,IAANqC,GAA+B,GAAZA,EAAEV,OAAsB,CAAC,EAAG,EAAG,EAAG,GAAoB,CAACU,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,GACpG,IAMI2/D,IAAAA,gBAAJhuD,IAAA,WACS,IAAA6uD,EAAP,cAAOA,EAAAljE,KAAKihE,aAAajhC,gBAAlBkjC,EAAoC,CAC7C,IAEIjjC,IAAAA,kBAAJ5rB,IAAA,WACS,IAAA8uD,EAAP,cAAOA,EAAAnjE,KAAKihE,aAAahhC,iBAAlBkjC,EAAqC,CAC9C,IAEI7iC,IAAAA,qBAAJjsB,IAAA,WACS,IAAA+uD,EAAAC,EAAP,OAA6C,OAAtCA,EAAA,OAAAD,EAAApjE,KAAKihE,aAAa5gC,oBAAlB,EAAA+iC,EAAiCn3D,OAAjCo3D,EAA0C,CACnD,IAEI3iC,IAAAA,2BAAJrsB,IAAA,WACS,IAAAivD,EAAAC,EAAP,OAAmD,OAA5CA,EAAA,OAAAD,EAAAtjE,KAAKihE,aAAaxgC,uBAAlB,EAAA6iC,EAAoC5F,UAApC6F,EAAgD,CACzD,IAEI1iC,IAAAA,iBAAJxsB,IAAA,WACE,IAAM3R,EAAI1C,KAAKihE,aAAapgC,eAE5B,YAAUxgC,IAANqC,GAA+B,GAAZA,EAAEV,OAChB,CAAC,EAAG,EAAG,EAAG,GAEV,CAACU,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAI,EAE9B,KArOIu7D,EAAD,GAyOC4D,GAAD,WAACA,SAAAA,IAAAA,CAAAA,OAAAA,EACGvmB,gBAAP,SAAwBxuC,GACfA,IAAAA,EAAP,YAA+CzM,KAAxCyM,OAAAA,EAAAA,EAAIy0D,iBAAJz0D,EAAAA,EAAgB02D,oBACzB,EAHI3B,EAKG4B,uBAAP,SAA+BC,GAC7B,IAAMv9C,EAAS1c,GAAQ4E,UAAUq1D,EAAMjmD,IAAI+I,KACrCH,EAAS5c,GAAQ4E,UAAUq1D,EAAMjmD,IAAIgG,KAE3C,OAAO,IAAIxZ,GAAKkc,EAAQE,EAC1B,EAVIw7C,EAAD,GC9pDL8B,EAAe,QAAS3jB,GAAakB,GAKxBsI,IAAAA,GAAU,gBAqDvBoa,EAAOrkE,KAAK,yBAAyBiqD,GAAQ,KAEzCA,KAAYqa,EAAQra,SACtB51C,QAAQnU,MACN,gDACA"}