{"version":3,"file":"weapp.mjs","sources":["../../../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/_instanceof.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_type_of.js","../../../node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.es6.mjs","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-browser/rng.js","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-browser/stringify.js","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-browser/native.js","../../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-browser/v4.js","../../effects-core/src/utils/array.ts","../../../node_modules/.pnpm/@galacean+effects-math@1.1.0/node_modules/@galacean/effects-math/es/core/utils.js","../../../node_modules/.pnpm/@galacean+effects-math@1.1.0/node_modules/@galacean/effects-math/es/core/vector2.js","../../../node_modules/.pnpm/@galacean+effects-math@1.1.0/node_modules/@galacean/effects-math/es/core/vector3.js","../../../node_modules/.pnpm/@galacean+effects-math@1.1.0/node_modules/@galacean/effects-math/es/core/vector4.js","../../../node_modules/.pnpm/@galacean+effects-math@1.1.0/node_modules/@galacean/effects-math/es/core/color.js","../../effects-core/src/utils/color.ts","../../effects-core/src/utils/device.ts","../../effects-core/src/utils/image-data.ts","../../effects-core/src/utils/sortable.ts","../../effects-core/src/utils/asserts.ts","../../effects-core/src/utils/text.ts","../../effects-core/src/utils/promise-util.ts","../../effects-core/src/utils/logger.ts","../../effects-core/src/utils/index.ts","../../effects-core/src/plugin-system.ts","../../effects-core/src/plugins/plugin.ts","../../../node_modules/.pnpm/@galacean+effects-specification@2.7.2/node_modules/@galacean/effects-specification/es/scene.js","../../../node_modules/.pnpm/@galacean+effects-specification@2.7.2/node_modules/@galacean/effects-specification/es/type.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/@galacean+effects-specification@2.7.2/node_modules/@galacean/effects-specification/es/constants.js","../../../node_modules/.pnpm/@galacean+effects-specification@2.7.2/node_modules/@galacean/effects-specification/es/composition.js","../../../node_modules/.pnpm/@galacean+effects-specification@2.7.2/node_modules/@galacean/effects-specification/es/number-expression.js","../../../node_modules/.pnpm/@galacean+effects-specification@2.7.2/node_modules/@galacean/effects-specification/es/item/base-item.js","../../../node_modules/.pnpm/@galacean+effects-specification@2.7.2/node_modules/@galacean/effects-specification/es/item/particle-item.js","../../../node_modules/.pnpm/@galacean+effects-specification@2.7.2/node_modules/@galacean/effects-specification/es/item/particle-shape.js","../../../node_modules/.pnpm/@galacean+effects-specification@2.7.2/node_modules/@galacean/effects-specification/es/item/model/light.js","../../../node_modules/.pnpm/@galacean+effects-specification@2.7.2/node_modules/@galacean/effects-specification/es/item/model/mesh.js","../../../node_modules/.pnpm/@galacean+effects-specification@2.7.2/node_modules/@galacean/effects-specification/es/item/model/camera.js","../../../node_modules/.pnpm/@galacean+effects-specification@2.7.2/node_modules/@galacean/effects-specification/es/item/model/material.js","../../../node_modules/.pnpm/@galacean+effects-specification@2.7.2/node_modules/@galacean/effects-specification/es/item/model/render.js","../../../node_modules/.pnpm/@galacean+effects-specification@2.7.2/node_modules/@galacean/effects-specification/es/text.js","../../../node_modules/.pnpm/@galacean+effects-specification@2.7.2/node_modules/@galacean/effects-specification/es/buitin-object-guid.js","../../../node_modules/.pnpm/@galacean+effects-specification@2.7.2/node_modules/@galacean/effects-specification/es/shape/shape-component-data.js","../../../node_modules/.pnpm/@galacean+effects-specification@2.7.2/node_modules/@galacean/effects-specification/es/shape/shape-primitive-type.js","../../../node_modules/.pnpm/@galacean+effects-specification@2.7.2/node_modules/@galacean/effects-specification/es/shape/shape-stroke-param.js","../../../node_modules/.pnpm/@galacean+effects-specification@2.7.2/node_modules/@galacean/effects-specification/es/animation-graph/graph-node-datas.js","../../../node_modules/.pnpm/@galacean+effects-specification@2.7.2/node_modules/@galacean/effects-specification/es/assets.js","../../../node_modules/.pnpm/@galacean+effects-specification@2.7.2/node_modules/@galacean/effects-specification/es/data-type.js","../../../node_modules/.pnpm/@galacean+effects-specification@2.7.2/node_modules/@galacean/effects-specification/es/geometry-data.js","../../../node_modules/.pnpm/@galacean+effects-specification@2.7.2/node_modules/@galacean/effects-specification/es/index.js","../../../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","../../effects-core/src/decorators.ts","../../effects-core/src/effects-object.ts","../../effects-core/src/plugins/animation-graph/graph-data-set.ts","../../effects-core/src/plugins/animation-graph/node-asset-type.ts","../../effects-core/src/plugins/animation-graph/graph-node.ts","../../effects-core/src/plugins/animation-graph/animation-graph-asset.ts","../../effects-core/src/plugins/animation-graph/graph-context.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_extends.js","../../effects-core/src/plugins/animation-graph/nodes/animation-clip-node.ts","../../../node_modules/.pnpm/@galacean+effects-math@1.1.0/node_modules/@galacean/effects-math/es/core/quaternion.js","../../effects-core/src/plugins/animation-graph/blender.ts","../../effects-core/src/plugins/animation-graph/pose.ts","../../effects-core/src/plugins/animation-graph/pose-result.ts","../../effects-core/src/plugins/animation-graph/nodes/apply-additive-node.ts","../../effects-core/src/plugins/animation-graph/nodes/blend-node.ts","../../effects-core/src/plugins/animation-graph/nodes/bool-nodes.ts","../../effects-core/src/plugins/animation-graph/nodes/const-value-nodes.ts","../../effects-core/src/plugins/animation-graph/nodes/control-parameter-nodes.ts","../../effects-core/src/plugins/animation-graph/nodes/layer-blend-node.ts","../../effects-core/src/plugins/animation-graph/nodes/operator-nodes.ts","../../effects-core/src/plugins/animation-graph/nodes/state-machine-node.ts","../../effects-core/src/plugins/animation-graph/nodes/state-node.ts","../../effects-core/src/plugins/animation-graph/nodes/transition-node.ts","../../effects-core/src/plugins/animation-graph/skeleton.ts","../../effects-core/src/plugins/animation-graph/graph-instance.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_create_class.js","../../effects-core/src/components/component.ts","../../effects-core/src/components/animator.ts","../../effects-core/src/components/renderer-component.ts","../../../node_modules/.pnpm/@galacean+effects-math@1.1.0/node_modules/@galacean/effects-math/es/core/matrix4.js","../../../node_modules/.pnpm/@galacean+effects-math@1.1.0/node_modules/@galacean/effects-math/es/core/euler.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_assert_this_initialized.js","../../../node_modules/.pnpm/@galacean+effects-math@1.1.0/node_modules/@galacean/effects-math/es/core/matrix3.js","../../../node_modules/.pnpm/@galacean+effects-math@1.1.0/node_modules/@galacean/effects-math/es/core/ray.js","../../../node_modules/.pnpm/@galacean+effects-math@1.1.0/node_modules/@galacean/effects-math/es/core/box3.js","../../effects-core/src/math/float16array-wrapper.ts","../../../node_modules/.pnpm/@galacean+effects-math@1.1.0/node_modules/@galacean/effects-math/es/core/sphere.js","../../effects-core/src/transform.ts","../../effects-core/src/camera.ts","../../effects-core/src/constants.ts","../../effects-core/src/math/translate.ts","../../effects-core/src/math/utils.ts","../../effects-core/src/math/keyframe-info.ts","../../effects-core/src/math/bezier.ts","../../effects-core/src/math/value-getters/value-getter.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_is_native_reflect_construct.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_construct.js","../../effects-core/src/math/value-getters/vector-curves.ts","../../effects-core/src/math/value-getters/bezier-curve.ts","../../effects-core/src/math/value-getters/value-getter-map.ts","../../effects-core/src/math/value-getters/color-curve.ts","../../effects-core/src/render/create-copy-shader.ts","../../effects-core/src/texture/types.ts","../../effects-core/src/render/framebuffer.ts","../../effects-core/src/gl/create-gl-context.ts","../../effects-core/src/gl/gpu-time.ts","../../effects-core/src/gl/index.ts","../../effects-core/src/downloader.ts","../../effects-core/src/texture/utils.ts","../../effects-core/src/texture/texture.ts","../../effects-core/src/texture/texture-loader.ts","../../effects-core/src/texture/texture-factory.ts","../../effects-core/src/render/render-pass.ts","../../effects-core/src/render/draw-object-pass.ts","../../effects-core/src/render/shader.ts","../../effects-core/src/material/utils.ts","../../effects-core/src/material/types.ts","../../effects-core/src/material/material-data-block.ts","../../effects-core/src/material/material.ts","../../effects-core/src/render/geometry.ts","../../effects-core/src/material/mask-ref-manager.ts","../../effects-core/src/render/mesh.ts","../../effects-core/src/shader/shader-factory.ts","../../effects-core/src/render/post-process-pass.ts","../../effects-core/src/render/render-frame.ts","../../effects-core/src/render/renderbuffer.ts","../../effects-core/src/render/render-target-pool.ts","../../effects-core/src/render/gpu-capability.ts","../../effects-core/src/render/renderer.ts","../../effects-core/src/events/event-emitter.ts","../../effects-core/src/composition/scene-ticking.ts","../../effects-core/src/composition.ts","../../effects-core/src/vfx-item.ts","../../effects-core/src/components/composition-component.ts","../../effects-core/src/components/mesh-component.ts","../../effects-core/src/components/effect-component.ts","../../effects-core/src/components/position-constraint.ts","../../effects-core/src/components/post-process-volume.ts","../../effects-core/src/components/base-render-component.ts","../../effects-core/src/components/shape-component.ts","../../effects-core/src/components/fake-3d-component.ts","../../effects-core/src/plugins/camera/camera-controller-node.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_get_prototype_of.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_wrap_native_super.js","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_is_native_function.js","../../effects-core/src/plugins/camera/camera-vfx-item-loader.ts","../../effects-core/src/plugins/interact/click-handler.ts","../../effects-core/src/plugins/interact/event-system.ts","../../effects-core/src/plugins/interact/interact-loader.ts","../../effects-core/src/plugins/interact/interact-mesh.ts","../../effects-core/src/plugins/interact/interact-item.ts","../../effects-core/src/plugins/interact/mesh-collider.ts","../../effects-core/src/plugins/sprite/sprite-loader.ts","../../effects-core/src/plugins/timeline/playable.ts","../../effects-core/src/animation/color-playable.ts","../../effects-core/src/animation/animation-clip.ts","../../effects-core/src/shape/cone.ts","../../effects-core/src/shape/2d-shape.ts","../../effects-core/src/shape/shape.ts","../../effects-core/src/shape/donut.ts","../../effects-core/src/shape/sphere.ts","../../effects-core/src/shape/texture-shape.ts","../../effects-core/src/libs/earcut.js","../../effects-core/src/shape/earcut.ts","../../effects-core/src/shape/geometry.ts","../../effects-core/src/plugins/particle/burst.ts","../../effects-core/src/plugins/particle/link.ts","../../effects-core/src/config.ts","../../effects-core/src/plugins/particle/trail-mesh.ts","../../effects-core/src/plugins/particle/particle-vfx-item.ts","../../effects-core/src/plugins/particle/particle-mesh.ts","../../effects-core/src/plugins/particle/particle-system-renderer.ts","../../effects-core/src/plugins/particle/particle-system.ts","../../effects-core/src/plugins/timeline/playables/track-mixer-playable.ts","../../effects-core/src/plugins/timeline/playables/activation-mixer-playable.ts","../../effects-core/src/plugins/timeline/playables/activation-playable.ts","../../effects-core/src/plugins/timeline/playables/property-clip-playable.ts","../../effects-core/src/plugins/timeline/playables/property-mixer-playable.ts","../../effects-core/src/plugins/timeline/playables/color-property-mixer-playable.ts","../../effects-core/src/plugins/timeline/playables/float-property-mixer-playable.ts","../../effects-core/src/plugins/timeline/playables/particle-mixer-playable.ts","../../effects-core/src/plugins/timeline/playables/sprite-color-mixer-playable.ts","../../effects-core/src/plugins/timeline/playables/sub-composition-clip-playable.ts","../../effects-core/src/plugins/timeline/playables/sub-composition-mixer-playable.ts","../../effects-core/src/plugins/timeline/playables/transform-mixer-playable.ts","../../effects-core/src/plugins/timeline/playables/vector-property-mixer-playable.ts","../../effects-core/src/plugins/timeline/playables/transform-playable.ts","../../effects-core/src/plugins/timeline/track.ts","../../effects-core/src/plugins/timeline/tracks/activation-track.ts","../../effects-core/src/plugins/timeline/tracks/property-track.ts","../../effects-core/src/plugins/timeline/tracks/float-property-track.ts","../../effects-core/src/plugins/timeline/tracks/sprite-color-track.ts","../../effects-core/src/plugins/timeline/tracks/sub-composition-track.ts","../../effects-core/src/plugins/timeline/tracks/transform-track.ts","../../effects-core/src/plugins/timeline/tracks/material-track.ts","../../effects-core/src/plugins/timeline/tracks/particle-track.ts","../../effects-core/src/plugins/timeline/tracks/vector-property-track.ts","../../effects-core/src/plugins/timeline/tracks/color-property-track.ts","../../effects-core/src/plugins/timeline/tracks/object-binding-track.ts","../../effects-core/src/plugins/timeline/playable-assets/activation-playable-asset.ts","../../effects-core/src/plugins/timeline/playable-assets/color-property-playable-asset.ts","../../effects-core/src/plugins/timeline/playable-assets/float-property-playable-asset.ts","../../effects-core/src/plugins/timeline/playable-assets/sub-composition-playable-asset.ts","../../effects-core/src/plugins/timeline/playable-assets/vector-property-playable-assets.ts","../../effects-core/src/plugins/timeline/track-instance.ts","../../effects-core/src/plugins/timeline/timeline-asset.ts","../../effects-core/src/plugins/sprite/sprite-item.ts","../../effects-core/src/plugins/particle/particle-loader.ts","../../effects-core/src/plugins/shape/point.ts","../../effects-core/src/plugins/shape/build-line.ts","../../effects-core/src/plugins/shape/shape-primitive.ts","../../../node_modules/.pnpm/libtess@1.2.2/node_modules/libtess/libtess.min.js","../../effects-core/src/plugins/shape/triangulate.ts","../../effects-core/src/plugins/shape/polygon.ts","../../effects-core/src/plugins/shape/build-adaptive-bezier.ts","../../effects-core/src/plugins/shape/ellipse.ts","../../effects-core/src/plugins/shape/poly-star.ts","../../effects-core/src/plugins/shape/rectangle.ts","../../effects-core/src/plugins/shape/shape-path.ts","../../effects-core/src/plugins/shape/graphics-path.ts","../../effects-core/src/canvas-pool.ts","../../effects-core/src/plugins/text/text-layout.ts","../../effects-core/src/plugins/text/text-style.ts","../../effects-core/src/plugins/text/text-component-base.ts","../../effects-core/src/plugins/text/text-item.ts","../../effects-core/src/plugins/text/text-loader.ts","../../effects-core/src/asset.ts","../../effects-core/src/binary-asset.ts","../../effects-core/src/serialization-helper.ts","../../effects-core/src/asset-loader.ts","../../effects-core/src/fallback/utils.ts","../../effects-core/src/fallback/migration.ts","../../effects-core/src/fallback/sprite.ts","../../effects-core/src/fallback/index.ts","../../effects-core/src/pass-render-level.ts","../../effects-core/src/fallback/particle.ts","../../effects-core/src/fallback/interact.ts","../../effects-core/src/fallback/camera.ts","../../effects-core/src/template-image.ts","../../effects-core/src/scene.ts","../../effects-core/src/asset-manager.ts","../../effects-core/src/asset-service.ts","../../../node_modules/.pnpm/flatbuffers@24.3.25/node_modules/flatbuffers/mjs/encoding.js","../../../node_modules/.pnpm/flatbuffers@24.3.25/node_modules/flatbuffers/mjs/utils.js","../../../node_modules/.pnpm/flatbuffers@24.3.25/node_modules/flatbuffers/mjs/byte-buffer.js","../../../node_modules/.pnpm/flatbuffers@24.3.25/node_modules/flatbuffers/mjs/constants.js","../../../node_modules/.pnpm/flatbuffers@24.3.25/node_modules/flatbuffers/mjs/builder.js","../../effects-core/src/__definations__/fbeffects-object-data.ts","../../effects-core/src/__definations__/fbeffects-package-data.ts","../../effects-core/src/__definations__/fbsub-mesh.ts","../../effects-core/src/__definations__/fbvertex-channel.ts","../../effects-core/src/__definations__/fbvertex-data.ts","../../effects-core/src/__definations__/fbgeometry-data.ts","../../effects-core/src/effects-package.ts","../../effects-core/src/ticker.ts","../../effects-core/src/engine.ts","../../effects-core/src/paas-texture-cache.ts","../../effects-core/src/scene-loader.ts","../../effects-core/src/index.ts","../../effects-webgl/src/gl-renderer-internal.ts","../../effects-webgl/src/gl-gpu-buffer.ts","../../effects-webgl/src/gl-geometry.ts","../../effects-webgl/src/gl-vertex-array-object.ts","../../effects-webgl/src/gl-program.ts","../../effects-webgl/src/gl-shader.ts","../../effects-webgl/src/gl-shader-library.ts","../../effects-webgl/src/gl-renderer.ts","../../effects-webgl/src/gl-texture.ts","../../effects-webgl/src/gl-material-state.ts","../../effects-webgl/src/gl-material.ts","../../effects-webgl/src/gl-renderbuffer.ts","../../effects-webgl/src/gl-framebuffer.ts","../../effects-webgl/src/gl-context-manager.ts","../../effects-webgl/src/gl-engine.ts","../src/constants.ts","../src/player-map.ts","../src/player.ts","../../../node_modules/.pnpm/@swc+helpers@0.5.15/node_modules/@swc/helpers/esm/_possible_constructor_return.js","../src/utils.ts","../src/index.ts"],"sourcesContent":["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 _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","function _type_of(obj) {\n    \"@swc/helpers - typeof\";\n\n    return obj && typeof Symbol !== \"undefined\" && obj.constructor === Symbol ? \"symbol\" : typeof obj;\n}\nexport { _type_of 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","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n  // lazy load so that environments that need to polyfill have a chance to do so\n  if (!getRandomValues) {\n    // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n    getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n    if (!getRandomValues) {\n      throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n    }\n  }\n\n  return getRandomValues(rnds8);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n  byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n  // Note: Be careful editing this code!  It's been tuned for performance\n  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n  return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n  const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID.  If this throws, it's likely due to one\n  // of the following:\n  // - One or more input array values don't map to a hex octet (leading to\n  // \"undefined\" in the uuid)\n  // - Invalid input values for the RFC `version` or `variant` fields\n\n  if (!validate(uuid)) {\n    throw TypeError('Stringified UUID is invalid');\n  }\n\n  return uuid;\n}\n\nexport default stringify;","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n  randomUUID\n};","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n  if (native.randomUUID && !buf && !options) {\n    return native.randomUUID();\n  }\n\n  options = options || {};\n  const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n  rnds[6] = rnds[6] & 0x0f | 0x40;\n  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n  if (buf) {\n    offset = offset || 0;\n\n    for (let i = 0; i < 16; ++i) {\n      buf[offset + i] = rnds[i];\n    }\n\n    return buf;\n  }\n\n  return unsafeStringify(rnds);\n}\n\nexport default v4;","import type { TypedArray } from '@galacean/effects-specification';\n\nexport function addItem<T> (arr: T[], value: T): T[] {\n  if (!arr.includes(value)) {\n    arr.push(value);\n  }\n\n  return arr;\n}\n\n/**\n * 性能测试：https://blog.mutoe.com/2019/compare-filter-vs-splice-in-javascript/\n * @param arr\n * @param value\n * @returns\n */\nexport function removeItem<T> (arr: T[], value: T): T[] {\n  const index = arr.indexOf(value);\n\n  if (index > -1) {\n    arr.splice(index, 1);\n  }\n\n  return arr;\n}\n\n/**\n * 原 arrAddWithOrder 根据property的大小在arr中插入item\n * @param arr\n * @param item\n * @param property\n * @param descending\n * @returns\n */\nexport function addItemWithOrder<T extends Record<string, any>> (arr: T[], item: T, property: string, descending = false) {\n  if (arr.includes(item)) {\n    return;\n  }\n  arr.push(item);\n  if (arr.length === 1) {\n    return;\n  }\n  //单次插入排序\n  let index = arr.length - 1;\n\n  if (index) {\n    const currentItem = arr[index];\n\n    if (descending) {\n      while (arr[index - 1][property] < currentItem[property]) {\n        arr[index] = arr[index - 1];\n        index--;\n        if (index === 0) {\n          break;\n        }\n      }\n    } else {\n      while (arr[index - 1][property] > currentItem[property]) {\n        arr[index] = arr[index - 1];\n        index--;\n        if (index === 0) {\n          break;\n        }\n      }\n    }\n    arr[index] = currentItem;\n  }\n}\n\nexport function enlargeBuffer<T extends TypedArray> (\n  typeArray: T,\n  length: number,\n  maxSize: number,\n  increase = 1,\n): T {\n  const buffer = typeArray.buffer;\n\n  if (buffer.byteLength < typeArray.BYTES_PER_ELEMENT * length) {\n    let size = Math.ceil(length * increase);\n\n    if (!Number.isNaN(maxSize)) {\n      size = Math.min(size, maxSize);\n    }\n    const nbuffer = new ArrayBuffer(typeArray.BYTES_PER_ELEMENT * size);\n    const nArr = new (typeArray.constructor as { new(buffer: ArrayBuffer): T })(nbuffer);\n\n    nArr.set(typeArray);\n\n    return nArr;\n  }\n\n  return typeArray;\n}\n","export const PI2 = Math.PI * 2;\nexport const DEG2RAD = Math.PI / 180;\nexport const RAD2DEG = 180 / Math.PI;\nexport const NumberEpsilon = 1e-6;\nexport function isZero(v) {\n    return isNaN(v) || Math.abs(v) < NumberEpsilon;\n}\nexport function isEqual(a, b) {\n    return Math.abs(a - b) < NumberEpsilon || (a === Infinity && b === Infinity) || (a === -Infinity && b === -Infinity);\n}\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\nexport const damp = (x, y, lambda, dt) => lerp(x, y, 1 - Math.exp(-lambda * dt));\n// https://en.wikipedia.org/wiki/Linear_interpolation\nexport const lerp = (x, y, t) => (1 - t) * x + t * y;\nexport const degToRad = (degrees) => degrees * DEG2RAD;\nexport const radToDeg = (radians) => radians * RAD2DEG;\nexport function clamp(value, min, max) {\n    const fixedMin = isNaN(min) ? -Infinity : min;\n    const fixedMax = isNaN(max) ? Infinity : max;\n    const lower = Math.min(fixedMin, fixedMax);\n    const upper = Math.max(fixedMin, fixedMax);\n    return Math.min(Math.max(value, lower), upper);\n}\n","import { NumberEpsilon } from './utils';\n/**\n * 二维向量\n */\nexport class Vector2 {\n    x;\n    y;\n    /**\n     * 二维向量的常量\n     */\n    static ONE = new Vector2(1.0, 1.0);\n    static ZERO = new Vector2(0.0, 0.0);\n    /**\n     * 构造函数，默认为零向量\n     * @param [x=0] - x 分量\n     * @param [y=0] - y 分量\n     */\n    constructor(x = 0, y = 0) {\n        this.x = x;\n        this.y = y;\n    }\n    /**\n     * 设置向量\n     * @param x - x 轴分量\n     * @param y - y 轴分量\n     * @returns\n     */\n    set(x, y) {\n        this.x = x;\n        this.y = y;\n        return this;\n    }\n    /**\n     * 设置零向量\n     * @returns 向量\n     */\n    setZero() {\n        this.x = 0;\n        this.y = 0;\n        return this;\n    }\n    /**\n     * 通过标量数值创建向量\n     * @param num - 数值\n     * @returns 向量\n     */\n    setFromNumber(num) {\n        this.x = num;\n        this.y = num;\n        return this;\n    }\n    /**\n     * 通过数组创建向量\n     * @param array - 数组\n     * @param [offset=0] - 起始偏移值\n     * @returns 向量\n     */\n    setFromArray(array, offset = 0) {\n        this.x = array[offset] ?? 0;\n        this.y = array[offset + 1] ?? 0;\n        return this;\n    }\n    /**\n     * 拷贝向量\n     * @param src - 要拷贝的对象\n     * @returns 向量\n     */\n    copyFrom(src) {\n        this.x = src.x;\n        this.y = src.y;\n        return this;\n    }\n    /**\n     * 克隆向量\n     * @returns 克隆结果\n     */\n    clone() {\n        return new Vector2(this.x, this.y);\n    }\n    /**\n     * 根据下标设置元素值\n     * @param index - 下标值\n     * @param value - 数字\n     * @returns 向量\n     */\n    setElement(index, value) {\n        switch (index) {\n            case 0:\n                this.x = value;\n                break;\n            case 1:\n                this.y = value;\n                break;\n            default: console.error('index is out of range: ' + index);\n        }\n        return this;\n    }\n    /**\n     * 根据下标获取值\n     * @param index - 下标\n     * @returns 值\n     */\n    getElement(index) {\n        switch (index) {\n            case 0: return this.x;\n            case 1: return this.y;\n            default: console.error('index is out of range: ' + index);\n        }\n        return 0;\n    }\n    /**\n     * 向量相加\n     * @param right - 向量 | 数字\n     * @returns 向量\n     */\n    add(right) {\n        if (typeof right === 'number') {\n            this.x += right;\n            this.y += right;\n        }\n        else if (right instanceof Array) {\n            this.x += right[0];\n            this.y += right[1];\n        }\n        else {\n            this.x += right.x;\n            this.y += right.y;\n        }\n        return this;\n    }\n    /**\n     * 向量相加\n     * @param left - 向量\n     * @param right - 向量\n     * @returns 相加结果\n     */\n    addVectors(left, right) {\n        this.x = left.x + right.x;\n        this.y = left.y + right.y;\n        return this;\n    }\n    /**\n     * 向量相减\n     * @param right - 向量 |  数字\n     * @returns 相减结果\n     */\n    subtract(right) {\n        if (typeof right === 'number') {\n            this.x -= right;\n            this.y -= right;\n        }\n        else if (right instanceof Array) {\n            this.x -= right[0];\n            this.y -= right[1];\n        }\n        else {\n            this.x -= right.x;\n            this.y -= right.y;\n        }\n        return this;\n    }\n    /**\n     * 向量相减\n     * @param left - 向量\n     * @param right - 向量\n     * @returns 相减结果\n     */\n    subtractVectors(left, right) {\n        this.x = left.x - right.x;\n        this.y = left.y - right.y;\n        return this;\n    }\n    /**\n     * 向量相乘\n     * @param right - 向量 | 数字\n     * @returns 相乘结果\n     */\n    multiply(right) {\n        if (typeof right === 'number') {\n            this.x *= right;\n            this.y *= right;\n        }\n        else if (right instanceof Array) {\n            this.x *= right[0];\n            this.y *= right[1];\n        }\n        else {\n            this.x *= right.x;\n            this.y *= right.y;\n        }\n        return this;\n    }\n    /**\n     * 向量相乘\n     * @param left - 向量\n     * @param right - 向量\n     * @returns 相乘结果\n     */\n    multiplyVectors(left, right) {\n        this.x = left.x * right.x;\n        this.y = left.y * right.y;\n        return this;\n    }\n    /**\n     * 向量相除\n     * @param right - 向量 | 数字\n     * @returns 相除结果\n     */\n    divide(right) {\n        if (typeof right === 'number') {\n            this.x /= right;\n            this.y /= right;\n        }\n        else if (right instanceof Array) {\n            this.x /= right[0];\n            this.y /= right[1];\n        }\n        else {\n            this.x /= right.x;\n            this.y /= right.y;\n        }\n        return this;\n    }\n    /**\n     * 向量缩放\n     * @param v - 数字\n     * @returns 缩放结果\n     */\n    scale(v) {\n        this.x *= v;\n        this.y *= v;\n        return this;\n    }\n    /**\n     * 分量求和\n     * @returns 求和结果\n     */\n    sum() {\n        return this.x + this.y;\n    }\n    /**\n     * 向量求最小值\n     * @param v - 向量\n     * @returns 最小值\n     */\n    min(v) {\n        if (typeof v === 'number') {\n            this.x = Math.min(this.x, v);\n            this.y = Math.min(this.y, v);\n        }\n        else {\n            this.x = Math.min(this.x, v.x);\n            this.y = Math.min(this.y, v.y);\n        }\n        return this;\n    }\n    /**\n     * 向量求最大值\n     * @param v - 向量\n     * @returns 最大值\n     */\n    max(v) {\n        if (typeof v === 'number') {\n            this.x = Math.max(this.x, v);\n            this.y = Math.max(this.y, v);\n        }\n        else {\n            this.x = Math.max(this.x, v.x);\n            this.y = Math.max(this.y, v.y);\n        }\n        return this;\n    }\n    /**\n     * 向量阈值约束\n     * @param min - 极小值\n     * @param max - 极大值\n     * @returns 向量\n     */\n    clamp(min, max) {\n        return this.max(min).min(max);\n    }\n    /**\n     * 向量向下取整\n     * @returns 取整结果\n     */\n    floor() {\n        this.x = Math.floor(this.x);\n        this.y = Math.floor(this.y);\n        return this;\n    }\n    /**\n     * 向量向上取整\n     * @returns 取整结果\n     */\n    ceil() {\n        this.x = Math.ceil(this.x);\n        this.y = Math.ceil(this.y);\n        return this;\n    }\n    /**\n     * 向量取四舍五入\n     * @returns 四舍五入结果\n     */\n    round() {\n        this.x = Math.round(this.x);\n        this.y = Math.round(this.y);\n        return this;\n    }\n    /**\n     * 向量取绝对值\n     * @returns 向量\n     */\n    abs() {\n        this.x = Math.abs(this.x);\n        this.y = Math.abs(this.y);\n        return this;\n    }\n    /**\n     * 向量取反\n     * @returns 取反结果\n     */\n    negate() {\n        this.x = -this.x;\n        this.y = -this.y;\n        return this;\n    }\n    /**\n     * 向量长度\n     * @returns 求值结果\n     */\n    length() {\n        return Math.sqrt(this.x * this.x + this.y * this.y);\n    }\n    /**\n     * 向量长度平方\n     * @returns 求值结果\n     */\n    lengthSquared() {\n        return this.x * this.x + this.y * this.y;\n    }\n    /**\n     * 向量归一化\n     * @returns 归一化结果\n     */\n    normalize() {\n        return this.divide(this.length() || 1);\n    }\n    /**\n     * 设置向量长度\n     * @param length - 长度\n     * @returns 向量\n     */\n    setLength(length) {\n        return this.normalize().multiply(length);\n    }\n    /**\n     * 向量线性插值\n     * @param other - 向量\n     * @param alpha - 插值比\n     * @returns 计算结果\n     */\n    lerp(other, alpha) {\n        this.x += (other.x - this.x) * alpha;\n        this.y += (other.y - this.y) * alpha;\n        return this;\n    }\n    /**\n     * 向量线性插值\n     * @param v1 - 向量\n     * @param v2 - 向量\n     * @param alpha - 插值比\n     * @returns 计算结果\n     */\n    lerpVectors(v1, v2, alpha) {\n        this.x = v1.x + (v2.x - v1.x) * alpha;\n        this.y = v1.y + (v2.y - v1.y) * alpha;\n        return this;\n    }\n    /**\n     * 向量点乘\n     * @param v - 向量\n     * @returns 点乘结果\n     */\n    dot(v) {\n        return this.x * v.x + this.y * v.y;\n    }\n    /**\n     * 向量叉乘\n     * @param v - 向量\n     * @returns 叉乘结果\n     */\n    cross(v) {\n        return this.x * v.y - this.y * v.x;\n    }\n    /**\n     * 点距离\n     * @param v - 点\n     * @returns 距离\n     */\n    distance(v) {\n        const dx = this.x - v.x;\n        const dy = this.y - v.y;\n        return Math.sqrt(dx * dx + dy * dy);\n    }\n    /**\n     * 点距离平方\n     * @param v - 点\n     * @returns 距离平方\n     */\n    distanceSquared(v) {\n        const dx = this.x - v.x;\n        const dy = this.y - v.y;\n        return dx * dx + dy * dy;\n    }\n    /**\n     * 向量判等\n     * @param v - 向量\n     * @returns 判等结果\n     */\n    equals(v) {\n        return this.x === v.x && this.y === v.y;\n    }\n    /**\n     * 是否零向量\n     * @returns 是否零向量\n     */\n    isZero() {\n        const eps = NumberEpsilon;\n        const { x, y } = this;\n        return Math.abs(x) <= eps && Math.abs(y) <= eps;\n    }\n    /**\n     * 向量转数组\n     * @returns 数组\n     */\n    toArray() {\n        return [this.x, this.y];\n    }\n    fill(array, offset = 0) {\n        array[offset] = this.x;\n        array[offset + 1] = this.y;\n    }\n    /**\n     * 随机生成向量\n     * @returns 向量\n     */\n    random() {\n        this.x = Math.random();\n        this.y = Math.random();\n        return this;\n    }\n    /**\n     * 通过标量创建向量\n     * @param num - 数值\n     * @returns 向量\n     */\n    static fromNumber(num) {\n        return new Vector2().setFromNumber(num);\n    }\n    /**\n     * 通过数组创建向量\n     * @param array - 数组\n     * @param [offset=0] - 起始偏移值\n     * @returns 向量\n     */\n    static fromArray(array, offset = 0) {\n        return new Vector2().setFromArray(array, offset);\n    }\n}\n","import { NumberEpsilon } from './utils';\nimport { Vector2 } from './vector2';\n/**\n * 三维向量\n */\nexport class Vector3 {\n    x;\n    y;\n    z;\n    /**\n     * 三维向量的常量\n     */\n    static X = new Vector3(1.0, 0.0, 0.0);\n    static Y = new Vector3(0.0, 1.0, 0.0);\n    static Z = new Vector3(0.0, 0.0, 1.0);\n    static ONE = new Vector3(1.0, 1.0, 1.0);\n    static ZERO = new Vector3(0.0, 0.0, 0.0);\n    /**\n     * 构造函数，默认值为零向量\n     * @param [x=0]\n     * @param [y=0]\n     * @param [z=0]\n     */\n    constructor(x = 0, y = 0, z = 0) {\n        this.x = x;\n        this.y = y;\n        this.z = z;\n    }\n    /**\n     * 设置向量\n     * @param x - x 轴分量\n     * @param y - y 轴分量\n     * @param z - z 轴分量\n     * @returns 向量\n     */\n    set(x, y, z) {\n        this.x = x;\n        this.y = y;\n        this.z = z;\n        return this;\n    }\n    /**\n     * 设置零向量\n     * @returns 向量\n     */\n    setZero() {\n        this.x = 0;\n        this.y = 0;\n        this.z = 0;\n        return this;\n    }\n    /**\n     * 通过标量数值设置向量\n     * @param num - 数值\n     * @returns 向量\n     */\n    setFromNumber(num) {\n        this.x = num;\n        this.y = num;\n        this.z = num;\n        return this;\n    }\n    /**\n     * 通过数组设置向量\n     * @param array - 数组\n     * @param [offset=0] - 起始偏移值\n     * @returns 向量\n     */\n    setFromArray(array, offset = 0) {\n        this.x = array[offset] ?? 0;\n        this.y = array[offset + 1] ?? 0;\n        this.z = array[offset + 2] ?? 0;\n        return this;\n    }\n    /**\n     * 拷贝向量\n     * @param v - 要拷贝的对象\n     * @returns 向量\n     */\n    copyFrom(v) {\n        this.x = v.x;\n        this.y = v.y;\n        this.z = v.z;\n        return this;\n    }\n    /**\n     * 克隆向量\n     * @returns 向量\n     */\n    clone() {\n        return new Vector3(this.x, this.y, this.z);\n    }\n    /**\n     * 根据下标设置向量分量\n     * @param index - 下标值\n     * @param value - 数字\n     * @returns 向量\n     */\n    setElement(index, value) {\n        switch (index) {\n            case 0:\n                this.x = value;\n                break;\n            case 1:\n                this.y = value;\n                break;\n            case 2:\n                this.z = value;\n                break;\n            default: console.error('index is out of range: ' + index);\n        }\n        return this;\n    }\n    /**\n     * 根据下标获取向量分量\n     * @param index - 下标\n     * @returns\n     */\n    getElement(index) {\n        switch (index) {\n            case 0: return this.x;\n            case 1: return this.y;\n            case 2: return this.z;\n            default: console.error('index is out of range: ' + index);\n        }\n        return 0;\n    }\n    /**\n     * 向量相加\n     * @param right - 向量 | 数字\n     * @returns 相加结果\n     */\n    add(right) {\n        if (typeof right === 'number') {\n            this.x += right;\n            this.y += right;\n            this.z += right;\n        }\n        else if (right instanceof Array) {\n            this.x += right[0];\n            this.y += right[1];\n            this.z += right[2];\n        }\n        else {\n            this.x += right.x;\n            this.y += right.y;\n            this.z += right.z;\n        }\n        return this;\n    }\n    /**\n     * 向量相加\n     * @param left - 向量\n     * @param right - 向量\n     * @returns 相加结果\n     */\n    addVectors(left, right) {\n        this.x = left.x + right.x;\n        this.y = left.y + right.y;\n        this.z = left.z + right.z;\n        return this;\n    }\n    /**\n     * 向量乘比例后相加\n     * @param right - 向量\n     * @param s - 比例\n     * @returns 相加结果\n     */\n    addScaledVector(right, s) {\n        this.x += right.x * s;\n        this.y += right.y * s;\n        this.z += right.z * s;\n        return this;\n    }\n    /**\n     * 向量相减\n     * @param right - 向量 | 数字\n     * @returns 相减\n     */\n    subtract(right) {\n        if (typeof right === 'number') {\n            this.x -= right;\n            this.y -= right;\n            this.z -= right;\n        }\n        else if (right instanceof Array) {\n            this.x -= right[0];\n            this.y -= right[1];\n            this.z -= right[2];\n        }\n        else {\n            this.x -= right.x;\n            this.y -= right.y;\n            this.z -= right.z;\n        }\n        return this;\n    }\n    /**\n     * 向量相减\n     * @param left - 向量\n     * @param right - 向量\n     * @returns 相减结果\n     */\n    subtractVectors(left, right) {\n        this.x = left.x - right.x;\n        this.y = left.y - right.y;\n        this.z = left.z - right.z;\n        return this;\n    }\n    /**\n     * 向量相乘\n     * @param right - 向量 | 数字\n     * @returns 相乘结果\n     */\n    multiply(right) {\n        if (typeof right === 'number') {\n            this.x *= right;\n            this.y *= right;\n            this.z *= right;\n        }\n        else if (right instanceof Array) {\n            this.x *= right[0];\n            this.y *= right[1];\n            this.z *= right[2];\n        }\n        else {\n            this.x *= right.x;\n            this.y *= right.y;\n            this.z *= right.z;\n        }\n        return this;\n    }\n    /**\n     * 向量相乘\n     * @param left - 向量\n     * @param right - 向量\n     * @returns 相乘结果\n     */\n    multiplyVectors(left, right) {\n        this.x = left.x * right.x;\n        this.y = left.y * right.y;\n        this.z = left.z * right.z;\n        return this;\n    }\n    /**\n     * 向量相除\n     * @param right - 向量 | 数字\n     * @returns 相除结果\n     */\n    divide(right) {\n        if (typeof right === 'number') {\n            this.x /= right;\n            this.y /= right;\n            this.z /= right;\n        }\n        else if (right instanceof Array) {\n            this.x /= right[0];\n            this.y /= right[1];\n            this.z /= right[2];\n        }\n        else {\n            this.x /= right.x;\n            this.y /= right.y;\n            this.z /= right.z;\n        }\n        return this;\n    }\n    /**\n     * 向量缩放\n     * @param v - 数字\n     * @returns 缩放结果\n     */\n    scale(v) {\n        this.x *= v;\n        this.y *= v;\n        this.z *= v;\n        return this;\n    }\n    /**\n     * 分量求和\n     * @returns 求和结果\n     */\n    sum() {\n        return this.x + this.y + this.z;\n    }\n    /**\n     * 向量求最小值\n     * @param v - 向量或数值\n     * @returns 求值结果\n     */\n    min(v) {\n        if (typeof v === 'number') {\n            this.x = Math.min(this.x, v);\n            this.y = Math.min(this.y, v);\n            this.z = Math.min(this.z, v);\n        }\n        else {\n            this.x = Math.min(this.x, v.x);\n            this.y = Math.min(this.y, v.y);\n            this.z = Math.min(this.z, v.z);\n        }\n        return this;\n    }\n    /**\n     * 向量求最大值\n     * @param v - 向量或数值\n     * @returns 求值结果\n     */\n    max(v) {\n        if (typeof v === 'number') {\n            this.x = Math.max(this.x, v);\n            this.y = Math.max(this.y, v);\n            this.z = Math.max(this.z, v);\n        }\n        else {\n            this.x = Math.max(this.x, v.x);\n            this.y = Math.max(this.y, v.y);\n            this.z = Math.max(this.z, v.z);\n        }\n        return this;\n    }\n    /**\n     * 向量阈值约束\n     * @param min - 向量\n     * @param max - 向量\n     * @returns 求值结果\n     */\n    clamp(min, max) {\n        return this.max(min).min(max);\n    }\n    /**\n     * 向量向下取整\n     * @returns 取整结果\n     */\n    floor() {\n        this.x = Math.floor(this.x);\n        this.y = Math.floor(this.y);\n        this.z = Math.floor(this.z);\n        return this;\n    }\n    /**\n     * 向量向上取整\n     * @returns 取整结果\n     */\n    ceil() {\n        this.x = Math.ceil(this.x);\n        this.y = Math.ceil(this.y);\n        this.z = Math.ceil(this.z);\n        return this;\n    }\n    /**\n     * 向量四舍五入\n     * @returns 计算结果\n     */\n    round() {\n        this.x = Math.round(this.x);\n        this.y = Math.round(this.y);\n        this.z = Math.round(this.z);\n        return this;\n    }\n    /**\n     * 向量取绝对值\n     * @returns 向量\n     */\n    abs() {\n        this.x = Math.abs(this.x);\n        this.y = Math.abs(this.y);\n        this.z = Math.abs(this.z);\n        return this;\n    }\n    /**\n     * 向量取反\n     * @returns 向量\n     */\n    negate() {\n        this.x = -this.x;\n        this.y = -this.y;\n        this.z = -this.z;\n        return this;\n    }\n    /**\n     * 向量长度\n     * @returns 长度\n     */\n    length() {\n        return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n    }\n    /**\n     * 向量长度平方\n     * @returns 长度平方\n     */\n    lengthSquared() {\n        return this.x * this.x + this.y * this.y + this.z * this.z;\n    }\n    /**\n     * 向量归一化\n     * @returns 向量\n     */\n    normalize() {\n        return this.divide(this.length() || 1);\n    }\n    /**\n     * 设置向量长度\n     * @param length - 长度\n     * @returns 向量\n     */\n    setLength(length) {\n        return this.normalize().multiply(length);\n    }\n    /**\n     * 向量间求线性插值\n     * @param other - 向量\n     * @param alpha - 插值比例\n     * @returns 插值结果\n     */\n    lerp(other, alpha) {\n        this.x += (other.x - this.x) * alpha;\n        this.y += (other.y - this.y) * alpha;\n        this.z += (other.z - this.z) * alpha;\n        return this;\n    }\n    /**\n     * 向量间求线性插值\n     * @param v1 - 第一个向量\n     * @param v2 - 第二个向量\n     * @param alpha - 插值比例\n     * @returns 求值结果\n     */\n    lerpVectors(v1, v2, alpha) {\n        this.x = v1.x + (v2.x - v1.x) * alpha;\n        this.y = v1.y + (v2.y - v1.y) * alpha;\n        this.z = v1.z + (v2.z - v1.z) * alpha;\n        return this;\n    }\n    /**\n     * 向量求点积，点积为零表示两向量垂直\n     * @param v - 向量\n     * @returns 点积结果\n     */\n    dot(v) {\n        return this.x * v.x + this.y * v.y + this.z * v.z;\n    }\n    /**\n     * 向量求叉积\n     * @param right - 向量\n     * @returns 叉积结果\n     */\n    cross(right) {\n        return this.crossVectors(this, right);\n    }\n    /**\n     * 向量（a 与 b）求叉积\n     * @param left - 向量\n     * @param right - 向量\n     * @returns 叉积结果\n     */\n    crossVectors(left, right) {\n        const { x: ax, y: ay, z: az } = left;\n        const { x: bx, y: by, z: bz } = right;\n        this.x = ay * bz - az * by;\n        this.y = az * bx - ax * bz;\n        this.z = ax * by - ay * bx;\n        return this;\n    }\n    /**\n     * 向量反射\n     * @param normal - 法线\n     * @returns 反射结果\n     */\n    reflect(normal) {\n        // reflect incident vector off plane orthogonal to normal\n        // normal is assumed to have unit length\n        return this.subtract(normal.clone().multiply(2 * this.dot(normal)));\n    }\n    /**\n     * 计算向量距离\n     * @param v - 向量\n     * @returns 距离\n     */\n    distance(v) {\n        return Math.sqrt(this.distanceSquared(v));\n    }\n    /**\n     * 计算向量距离平方\n     * @param v - 向量\n     * @returns 距离平方\n     */\n    distanceSquared(v) {\n        const dx = this.x - v.x;\n        const dy = this.y - v.y;\n        const dz = this.z - v.z;\n        return dx * dx + dy * dy + dz * dz;\n    }\n    /**\n     * 向量判等\n     * @param v - 向量\n     * @returns 判等结果\n     */\n    equals(v) {\n        return v.x === this.x && v.y === this.y && v.z === this.z;\n    }\n    /**\n     * 是否零向量\n     * @returns 是否零向量\n     */\n    isZero() {\n        const eps = NumberEpsilon;\n        const { x, y, z } = this;\n        return Math.abs(x) <= eps && Math.abs(y) <= eps && Math.abs(z) <= eps;\n    }\n    /**\n     * 向量转数组\n     * @param array - 目标保存对象\n     * @returns 数组\n     */\n    toArray() {\n        return [this.x, this.y, this.z];\n    }\n    toVector2() {\n        return new Vector2(this.x, this.y);\n    }\n    fill(array, offset = 0) {\n        array[offset] = this.x;\n        array[offset + 1] = this.y;\n        array[offset + 2] = this.z;\n    }\n    /**\n     * 获取随机向量\n     * @returns\n     */\n    random() {\n        this.x = Math.random();\n        this.y = Math.random();\n        this.z = Math.random();\n        return this;\n    }\n    /**\n     * 用欧拉角旋转向量\n     * @param euler - 欧拉角\n     * @param [out] - 输出结果，如果没有就覆盖当前向量值\n     * @returns 旋转结果\n     */\n    applyEuler(euler, out) {\n        return euler.rotateVector3(this, out);\n    }\n    /**\n     * 用四元数旋转向量\n     * @param q - 四元数\n     * @param [out] - 输出结果，如果没有就覆盖当前向量值\n     * @returns 旋转结果\n     */\n    applyQuaternion(q, out) {\n        return q.rotateVector3(this, out);\n    }\n    /**\n     * 用矩阵变换点\n     * @param m - 变换矩阵\n     * @param [out] - 输出结果，如果没有就覆盖当前向量值\n     * @returns 结果点\n     */\n    applyMatrix(m, out) {\n        return m.transformPoint(this, out);\n    }\n    /**\n     * 用法向量矩阵变换法向量\n     * @param m - 法向量矩阵\n     * @param [out] - 输出结果，如果没有就覆盖当前向量值\n     * @returns 向量\n     */\n    applyNormalMatrix(m, out) {\n        return m.transformNormal(this, out);\n    }\n    /**\n     * 用投影矩阵变换点\n     * @param m - 投影矩阵\n     * @param [out] - 输出结果，如果没有就覆盖当前向量值\n     * @returns 结果点\n     */\n    applyProjectionMatrix(m, out) {\n        return m.projectPoint(this, out);\n    }\n    /**\n     * 通过标量数值创建向量\n     * @param num - 数值\n     * @returns 向量\n     */\n    static fromNumber(num) {\n        return new Vector3().setFromNumber(num);\n    }\n    /**\n     * 通过数组创建向量\n     * @param array - 数组\n     * @param [offset=0] - 起始偏移值\n     * @returns 向量\n     */\n    static fromArray(array, offset = 0) {\n        return new Vector3().setFromArray(array, offset);\n    }\n}\n","import { NumberEpsilon } from './utils';\nimport { Vector3 } from './vector3';\n/**\n * 四维向量\n */\nexport class Vector4 {\n    x;\n    y;\n    z;\n    w;\n    /**\n     * 四维向量的常量\n     */\n    static ONE = new Vector4(1.0, 1.0, 1.0, 1.0);\n    static ZERO = new Vector4(0.0, 0.0, 0.0, 0.0);\n    /**\n     * 构造函数\n     * @param [x=0] - x 轴分量\n     * @param [y=0] - y 轴分量\n     * @param [z=0] - z 轴分量\n     * @param [w=1] - w 轴分量\n     */\n    constructor(x = 0, y = 0, z = 0, w = 0) {\n        this.x = x;\n        this.y = y;\n        this.z = z;\n        this.w = w;\n    }\n    /**\n     * 设置向量\n     * @param x - x 轴分量\n     * @param y - y 轴分量\n     * @param z - z 轴分量\n     * @param w - w 轴分量\n     * @returns\n     */\n    set(x, y, z, w) {\n        this.x = x;\n        this.y = y;\n        this.z = z;\n        this.w = w;\n        return this;\n    }\n    /**\n     * 设置零向量\n     * @returns 向量\n     */\n    setZero() {\n        this.x = 0;\n        this.y = 0;\n        this.z = 0;\n        this.w = 0;\n        return this;\n    }\n    /**\n     * 通过标量数值设置向量\n     * @param num - 数值\n     * @returns 向量\n     */\n    setFromNumber(num) {\n        this.x = num;\n        this.y = num;\n        this.z = num;\n        this.w = num;\n        return this;\n    }\n    /**\n     * 通过数组创建向量\n     * @param array - 数组\n     * @param [offset=0] - 起始偏移值\n     * @returns 向量\n     */\n    setFromArray(array, offset = 0) {\n        this.x = array[offset] ?? 0;\n        this.y = array[offset + 1] ?? 0;\n        this.z = array[offset + 2] ?? 0;\n        this.w = array[offset + 3] ?? 0;\n        return this;\n    }\n    /**\n     * 拷贝向量\n     * @param v - 复制对象\n     * @returns 拷贝结果\n     */\n    copyFrom(v) {\n        this.x = v.x;\n        this.y = v.y;\n        this.z = v.z;\n        this.w = v.w;\n        return this;\n    }\n    /**\n     * 克隆向量\n     * @returns 克隆结果\n     */\n    clone() {\n        return new Vector4(this.x, this.y, this.z, this.w);\n    }\n    /**\n     * 根据下标设置向量分量\n     * @param index - 下标值\n     * @param value - 分量值\n     * @returns 向量\n     */\n    setElement(index, value) {\n        switch (index) {\n            case 0:\n                this.x = value;\n                break;\n            case 1:\n                this.y = value;\n                break;\n            case 2:\n                this.z = value;\n                break;\n            case 3:\n                this.w = value;\n                break;\n            default: console.error('index is out of range: ' + index);\n        }\n        return this;\n    }\n    /**\n     * 根据下标获取向量分量\n     * @param index - 下标\n     * @returns 分量值\n     */\n    getElement(index) {\n        switch (index) {\n            case 0: return this.x;\n            case 1: return this.y;\n            case 2: return this.z;\n            case 3: return this.w;\n            default: console.error('index is out of range: ' + index);\n        }\n        return 0;\n    }\n    /**\n     * 向量相加\n     * @param right - 相加对象，向量 | 数字\n     * @returns 相加结果\n     */\n    add(right) {\n        if (typeof right === 'number') {\n            this.x += right;\n            this.y += right;\n            this.z += right;\n            this.w += right;\n        }\n        else if (right instanceof Array) {\n            this.x += right[0];\n            this.y += right[1];\n            this.z += right[2];\n            this.w += right[3];\n        }\n        else {\n            this.x += right.x;\n            this.y += right.y;\n            this.z += right.z;\n            this.w += right.w;\n        }\n        return this;\n    }\n    /**\n     * 向量相加\n     * @param left - 向量\n     * @param right - 向量\n     * @returns 求和结果\n     */\n    addVectors(left, right) {\n        this.x = left.x + right.x;\n        this.y = left.y + right.y;\n        this.z = left.z + right.z;\n        this.w = left.w + right.w;\n        return this;\n    }\n    /**\n     * 向量比例缩放后相加\n     * @param right - 向量\n     * @param s - 比例\n     * @returns 求和结果\n     */\n    addScaledVector(right, s) {\n        this.x += right.x * s;\n        this.y += right.y * s;\n        this.z += right.z * s;\n        this.w += right.w * s;\n        return this;\n    }\n    /**\n     * 向量相减\n     * @param right - 相减对象，向量 | 数字\n     * @returns 相减结果\n     */\n    subtract(right) {\n        if (typeof right === 'number') {\n            this.x -= right;\n            this.y -= right;\n            this.z -= right;\n            this.w -= right;\n        }\n        else if (right instanceof Array) {\n            this.x -= right[0];\n            this.y -= right[1];\n            this.z -= right[2];\n            this.w -= right[3];\n        }\n        else {\n            this.x -= right.x;\n            this.y -= right.y;\n            this.z -= right.z;\n            this.w -= right.w;\n        }\n        return this;\n    }\n    /**\n     * 向量相减\n     * @param left - 向量\n     * @param right - 向量\n     * @returns 向量\n     */\n    subtractVectors(left, right) {\n        this.x = left.x - right.x;\n        this.y = left.y - right.y;\n        this.z = left.z - right.z;\n        this.w = left.w - right.w;\n        return this;\n    }\n    /**\n     * 向量相乘\n     * @param right - 相乘对象，对象 | 数字\n     * @returns 向量\n     */\n    multiply(right) {\n        if (typeof right === 'number') {\n            this.x *= right;\n            this.y *= right;\n            this.z *= right;\n            this.w *= right;\n        }\n        else if (right instanceof Array) {\n            this.x *= right[0];\n            this.y *= right[1];\n            this.z *= right[2];\n            this.w *= right[3];\n        }\n        else {\n            this.x *= right.x;\n            this.y *= right.y;\n            this.z *= right.z;\n            this.w *= right.w;\n        }\n        return this;\n    }\n    /**\n     * 向量相乘\n     * @param left - 向量\n     * @param right - 向量\n     * @returns 向量\n     */\n    multiplyVectors(left, right) {\n        this.x = left.x * right.x;\n        this.y = left.y * right.y;\n        this.z = left.z * right.z;\n        this.w = left.w * right.w;\n        return this;\n    }\n    /**\n     * 向量相除\n     * @param right - 相除对象，对象 | 数字\n     * @returns 向量\n     */\n    divide(right) {\n        if (typeof right === 'number') {\n            this.x /= right;\n            this.y /= right;\n            this.z /= right;\n            this.w /= right;\n        }\n        else if (right instanceof Array) {\n            this.x /= right[0];\n            this.y /= right[1];\n            this.z /= right[2];\n            this.w /= right[3];\n        }\n        else {\n            this.x /= right.x;\n            this.y /= right.y;\n            this.z /= right.z;\n            this.w /= right.w;\n        }\n        return this;\n    }\n    /**\n     * 向量缩放\n     * @param v - 数字\n     * @returns 缩放结果\n     */\n    scale(v) {\n        this.x *= v;\n        this.y *= v;\n        this.z *= v;\n        this.w *= v;\n        return this;\n    }\n    /**\n     * 分量求和\n     * @returns 求和结果\n     */\n    sum() {\n        return this.x + this.y + this.z + this.w;\n    }\n    /**\n     * 向量求最小值\n     * @param v - 向量或数值\n     * @returns 最小值\n     */\n    min(v) {\n        if (typeof v === 'number') {\n            this.x = Math.min(this.x, v);\n            this.y = Math.min(this.y, v);\n            this.z = Math.min(this.z, v);\n            this.w = Math.min(this.w, v);\n        }\n        else {\n            this.x = Math.min(this.x, v.x);\n            this.y = Math.min(this.y, v.y);\n            this.z = Math.min(this.z, v.z);\n            this.w = Math.min(this.w, v.w);\n        }\n        return this;\n    }\n    /**\n     * 向量求最大值\n     * @param v - 向量或数值\n     * @returns 最大值\n     */\n    max(v) {\n        if (typeof v === 'number') {\n            this.x = Math.max(this.x, v);\n            this.y = Math.max(this.y, v);\n            this.z = Math.max(this.z, v);\n            this.w = Math.max(this.w, v);\n        }\n        else {\n            this.x = Math.max(this.x, v.x);\n            this.y = Math.max(this.y, v.y);\n            this.z = Math.max(this.z, v.z);\n            this.w = Math.max(this.w, v.w);\n        }\n        return this;\n    }\n    /**\n     * 向量阈值约束\n     * @param min - 最小值\n     * @param max - 最大值\n     * @returns 向量\n     */\n    clamp(min, max) {\n        return this.max(min).min(max);\n    }\n    /**\n     * 向量向下取整\n     * @returns 取整结果\n     */\n    floor() {\n        this.x = Math.floor(this.x);\n        this.y = Math.floor(this.y);\n        this.z = Math.floor(this.z);\n        this.w = Math.floor(this.w);\n        return this;\n    }\n    /**\n     * 向量向上取整\n     * @returns 取整结果\n     */\n    ceil() {\n        this.x = Math.ceil(this.x);\n        this.y = Math.ceil(this.y);\n        this.z = Math.ceil(this.z);\n        this.w = Math.ceil(this.w);\n        return this;\n    }\n    /**\n     * 向量四舍五入\n     * @returns 求值结果\n     */\n    round() {\n        this.x = Math.round(this.x);\n        this.y = Math.round(this.y);\n        this.z = Math.round(this.z);\n        this.w = Math.round(this.w);\n        return this;\n    }\n    /**\n     * 向量取绝对值\n     * @returns 向量\n     */\n    abs() {\n        this.x = Math.abs(this.x);\n        this.y = Math.abs(this.y);\n        this.z = Math.abs(this.z);\n        this.w = Math.abs(this.w);\n        return this;\n    }\n    /**\n     * 向量取反\n     * @returns 取反结果\n     */\n    negate() {\n        this.x = -this.x;\n        this.y = -this.y;\n        this.z = -this.z;\n        this.w = -this.w;\n        return this;\n    }\n    /**\n     * 向量长度平方\n     * @returns 长度平方\n     */\n    lengthSquared() {\n        return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n    }\n    /**\n     * 向量长度\n     * @returns 长度\n     */\n    length() {\n        return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\n    }\n    /**\n     * 向量归一化\n     * @returns 归一化结果\n     */\n    normalize() {\n        return this.divide(this.length() || 1);\n    }\n    /**\n     * 设置向量长度\n     * @param length - 长度\n     * @returns 向量\n     */\n    setLength(length) {\n        return this.normalize().multiply(length);\n    }\n    /**\n     * 向量求线性插值\n     * @param v - 向量\n     * @param alpha - 插值比例\n     * @returns 插值结果\n     */\n    lerp(v, alpha) {\n        this.x += (v.x - this.x) * alpha;\n        this.y += (v.y - this.y) * alpha;\n        this.z += (v.z - this.z) * alpha;\n        this.w += (v.w - this.w) * alpha;\n        return this;\n    }\n    /**\n     * 两向量求线性插值\n     * @param v1 - 第一个向量\n     * @param v2 - 第二个向量\n     * @param alpha - 插值比例\n     * @returns 插值结果\n     */\n    lerpVectors(v1, v2, alpha) {\n        this.x = v1.x + (v2.x - v1.x) * alpha;\n        this.y = v1.y + (v2.y - v1.y) * alpha;\n        this.z = v1.z + (v2.z - v1.z) * alpha;\n        this.w = v1.w + (v2.w - v1.w) * alpha;\n        return this;\n    }\n    /**\n     * 向量求点积\n     * @param v - 向量\n     * @returns 点积结果\n     */\n    dot(v) {\n        return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n    }\n    /**\n     * 向量判等\n     * @param v - 向量\n     * @returns 判等结果\n     */\n    equals(v) {\n        return v.x === this.x && v.y === this.y && v.z === this.z && v.w === this.w;\n    }\n    /**\n     * 是否零向量\n     * @returns 是否零向量\n     */\n    isZero() {\n        const eps = NumberEpsilon;\n        const { x, y, z, w } = this;\n        return Math.abs(x) <= eps && Math.abs(y) <= eps && Math.abs(z) <= eps && Math.abs(w) <= eps;\n    }\n    /**\n     * 向量转数组\n     * @returns 数组\n     */\n    toArray() {\n        return [this.x, this.y, this.z, this.w];\n    }\n    toVector3() {\n        return new Vector3(this.x, this.y, this.z);\n    }\n    fill(array, offset = 0) {\n        array[offset] = this.x;\n        array[offset + 1] = this.y;\n        array[offset + 2] = this.z;\n        array[offset + 3] = this.w;\n    }\n    /**\n     * 生成随机向量\n     * @returns 向量\n     */\n    random() {\n        this.x = Math.random();\n        this.y = Math.random();\n        this.z = Math.random();\n        this.w = Math.random();\n        return this;\n    }\n    /**\n     * 变换矩阵作用于向量\n     * @param m - 变换矩阵\n     * @param [out] - 输出结果，如果没有设置就直接覆盖当前值\n     * @returns 向量\n     */\n    applyMatrix(m, out) {\n        return m.transformVector4(this, out);\n    }\n    /**\n     * 通过标量数值创建向量\n     * @param num - 数值\n     * @returns 向量\n     */\n    static fromNumber(num) {\n        return new Vector4().setFromNumber(num);\n    }\n    /**\n     * 通过数组创建向量\n     * @param array - 数组\n     * @param [offset=0] - 起始偏移值\n     * @returns 向量\n     */\n    static fromArray(array, offset = 0) {\n        return new Vector4().setFromArray(array, offset);\n    }\n}\n","import { Vector4 } from './vector4';\nexport class Color {\n    r;\n    g;\n    b;\n    a;\n    /**\n     * 颜色的常量\n     */\n    static BLACK = new Color(0, 0, 0, 1); // 纯黑色\n    static BLUE = new Color(0, 0, 1, 1); // 纯蓝色\n    static CLEAR = new Color(0, 0, 0, 0); // 完全透明\n    static CYAN = new Color(0, 1, 1, 1); // 青色\n    static GRAY = new Color(0.5, 0.5, 0.5, 1); // 灰色\n    static GREEN = new Color(0, 1, 0, 1); // 纯绿色\n    static MAGENTA = new Color(1, 0, 1, 1); // 洋红色\n    static RED = new Color(1, 0, 0, 1); // 纯红色\n    static WHITE = new Color(1, 1, 1, 1); // 纯白色\n    static YELLOW = new Color(1, 0.92, 0.016, 1); // 黄色\n    /**\n     * 构造函数，默认值为黑色\n     * @param [r=0]\n     * @param [g=0]\n     * @param [b=0]\n     * @param [a=0]\n     */\n    constructor(r = 0, g = 0, b = 0, a = 0) {\n        this.r = r;\n        this.g = g;\n        this.b = b;\n        this.a = a;\n    }\n    /**\n     * 设置颜色\n     * @param r - r 分量\n     * @param g - g 分量\n     * @param b - b 分量\n     * @param a - a 分量\n     * @returns\n     */\n    set(r, g, b, a) {\n        this.r = r;\n        this.g = g;\n        this.b = b;\n        this.a = a;\n        return this;\n    }\n    /**\n     * 设置零颜色\n     * @returns\n     */\n    setZero() {\n        this.r = 0;\n        this.g = 0;\n        this.b = 0;\n        this.a = 0;\n        return this;\n    }\n    /**\n     * 通过标量数值设置颜色\n     * @param num - 数值\n     * @returns\n     */\n    setFromNumber(num) {\n        this.r = num;\n        this.g = num;\n        this.b = num;\n        this.a = num;\n        return this;\n    }\n    /**\n     * 通过Vector4创建颜色\n     * @param v - Vector4\n     * @returns\n     */\n    setFromVector4(v) {\n        this.r = v.x;\n        this.g = v.y;\n        this.b = v.z;\n        this.a = v.w;\n        return this;\n    }\n    /**\n     * 通过数组创建颜色\n     * @param array - 数组\n     * @param [offset=0] - 起始偏移值\n     * @returns\n     */\n    setFromArray(array, offset = 0) {\n        this.r = array[offset] ?? 0;\n        this.g = array[offset + 1] ?? 0;\n        this.b = array[offset + 2] ?? 0;\n        this.a = array[offset + 3] ?? 0;\n        return this;\n    }\n    setFromHSV(hue, saturation, value, alpha = 1) {\n        const chroma = value * saturation;\n        const h = hue / 60;\n        const x = chroma * (1 - Math.abs((h % 2) - 1));\n        let r = 0;\n        let g = 0;\n        let b = 0;\n        if (h >= 0 && h <= 1) {\n            r = chroma;\n            g = x;\n        }\n        else if (h >= 1 && h <= 2) {\n            r = x;\n            g = chroma;\n        }\n        else if (h >= 2 && h <= 3) {\n            g = chroma;\n            b = x;\n        }\n        else if (h >= 3 && h <= 4) {\n            g = x;\n            b = chroma;\n        }\n        else if (h >= 4 && h <= 5) {\n            r = x;\n            b = chroma;\n        }\n        else if (h >= 5 && h <= 6) {\n            r = chroma;\n            b = x;\n        }\n        const m = value - chroma;\n        return this.set(r + m, g + m, b + m, alpha);\n    }\n    setFromHexString(hex) {\n        if (hex.substring(0, 1) !== '#' || (hex.length !== 9 && hex.length !== 7)) {\n            return this;\n        }\n        const r = parseInt(hex.substring(1, 3), 16) / 255.0;\n        const g = parseInt(hex.substring(3, 5), 16) / 255.0;\n        const b = parseInt(hex.substring(5, 7), 16) / 255.0;\n        const a = hex.length === 9 ? parseInt(hex.substring(7, 9), 16) / 255.0 : 1.0;\n        return this.set(r, g, b, a);\n    }\n    /**\n     * 拷贝颜色\n     * @param v - 复制对象\n     * @returns 拷贝结果\n     */\n    copyFrom(v) {\n        this.r = v.r;\n        this.g = v.g;\n        this.b = v.b;\n        this.a = v.a;\n        return this;\n    }\n    /**\n     * 克隆颜色\n     * @returns 克隆结果\n     */\n    clone() {\n        return new Color(this.r, this.g, this.b, this.a);\n    }\n    /**\n     * 根据下标设置颜色分量\n     * @param index - 下标值\n     * @param value - 分量值\n     * @returns\n     */\n    setElement(index, value) {\n        switch (index) {\n            case 0:\n                this.r = value;\n                break;\n            case 1:\n                this.g = value;\n                break;\n            case 2:\n                this.b = value;\n                break;\n            case 3:\n                this.a = value;\n                break;\n            default: console.error('index is out of range: ' + index);\n        }\n        return this;\n    }\n    /**\n     * 根据下标获取颜色分量\n     * @param index - 下标\n     * @returns 分量值\n     */\n    getElement(index) {\n        switch (index) {\n            case 0: return this.r;\n            case 1: return this.g;\n            case 2: return this.b;\n            case 3: return this.a;\n            default: console.error('index is out of range: ' + index);\n        }\n        return 0;\n    }\n    /**\n     * 颜色相加\n     * @param right - 相加对象，颜色 | 数字\n     * @returns 相加结果\n     */\n    add(right) {\n        if (typeof right === 'number') {\n            this.r += right;\n            this.g += right;\n            this.b += right;\n            this.a += right;\n        }\n        else if (right instanceof Array) {\n            this.r += right[0];\n            this.g += right[1];\n            this.b += right[2];\n            this.a += right[3];\n        }\n        else {\n            this.r += right.r;\n            this.g += right.g;\n            this.b += right.b;\n            this.a += right.a;\n        }\n        return this;\n    }\n    /**\n     * 颜色相减\n     * @param right - 相减对象，颜色 | 数字\n     * @returns 相减结果\n     */\n    subtract(right) {\n        if (typeof right === 'number') {\n            this.r -= right;\n            this.g -= right;\n            this.b -= right;\n            this.a -= right;\n        }\n        else if (right instanceof Array) {\n            this.r -= right[0];\n            this.g -= right[1];\n            this.b -= right[2];\n            this.a -= right[3];\n        }\n        else {\n            this.r -= right.r;\n            this.g -= right.g;\n            this.b -= right.b;\n            this.a -= right.a;\n        }\n        return this;\n    }\n    /**\n     * 颜色相乘\n     * @param right - 相乘对象，对象 | 数字\n     * @returns 颜色\n     */\n    multiply(right) {\n        if (typeof right === 'number') {\n            this.r *= right;\n            this.g *= right;\n            this.b *= right;\n            this.a *= right;\n        }\n        else if (right instanceof Array) {\n            this.r *= right[0];\n            this.g *= right[1];\n            this.b *= right[2];\n            this.a *= right[3];\n        }\n        else {\n            this.r *= right.r;\n            this.g *= right.g;\n            this.b *= right.b;\n            this.a *= right.a;\n        }\n        return this;\n    }\n    /**\n     * 颜色相除\n     * @param right - 相除对象，对象 | 数字\n     * @returns 颜色\n     */\n    divide(right) {\n        if (typeof right === 'number') {\n            this.r /= right;\n            this.g /= right;\n            this.b /= right;\n            this.a /= right;\n        }\n        else if (right instanceof Array) {\n            this.r /= right[0];\n            this.g /= right[1];\n            this.b /= right[2];\n            this.a /= right[3];\n        }\n        else {\n            this.r /= right.r;\n            this.g /= right.g;\n            this.b /= right.b;\n            this.a /= right.a;\n        }\n        return this;\n    }\n    /**\n     * 颜色缩放\n     * @param v - 数字\n     * @returns 缩放结果\n     */\n    scale(v) {\n        this.r *= v;\n        this.g *= v;\n        this.b *= v;\n        this.a *= v;\n        return this;\n    }\n    /**\n     * 颜色求最小值\n     * @param v - 颜色或数值\n     * @returns 最小值\n     */\n    min(v) {\n        if (typeof v === 'number') {\n            this.r = Math.min(this.r, v);\n            this.g = Math.min(this.g, v);\n            this.b = Math.min(this.b, v);\n            this.a = Math.min(this.a, v);\n        }\n        else {\n            this.r = Math.min(this.r, v.r);\n            this.g = Math.min(this.g, v.g);\n            this.b = Math.min(this.b, v.b);\n            this.a = Math.min(this.a, v.a);\n        }\n        return this;\n    }\n    /**\n     * 颜色求最大值\n     * @param v - 颜色或数值\n     * @returns 最大值\n     */\n    max(v) {\n        if (typeof v === 'number') {\n            this.r = Math.max(this.r, v);\n            this.g = Math.max(this.g, v);\n            this.b = Math.max(this.b, v);\n            this.a = Math.max(this.a, v);\n        }\n        else {\n            this.r = Math.max(this.r, v.r);\n            this.g = Math.max(this.g, v.g);\n            this.b = Math.max(this.b, v.b);\n            this.a = Math.max(this.a, v.a);\n        }\n        return this;\n    }\n    /**\n     * 颜色阈值约束\n     * @param min - 最小值\n     * @param max - 最大值\n     * @returns 颜色\n     */\n    clamp(min, max) {\n        return this.max(min).min(max);\n    }\n    /**\n     * 颜色求线性插值\n     * @param v - 颜色\n     * @param alpha - 插值比例\n     * @returns 插值结果\n     */\n    lerp(v, alpha) {\n        this.r += (v.r - this.r) * alpha;\n        this.g += (v.g - this.g) * alpha;\n        this.b += (v.b - this.b) * alpha;\n        this.a += (v.a - this.a) * alpha;\n        return this;\n    }\n    /**\n     * 计算颜色亮度值\n     * @returns 亮度值\n     */\n    luminance() {\n        return this.r * 0.3 + this.g * 0.59 + this.b * 0.11;\n    }\n    /**\n     * 颜色判等\n     * @param v - 颜色\n     * @returns 判等结果\n     */\n    equals(v) {\n        return v.r === this.r && v.g === this.g && v.b === this.b && v.a === this.a;\n    }\n    toLinear() {\n        this.r = Color.gammaToLinear(this.r);\n        this.g = Color.gammaToLinear(this.g);\n        this.b = Color.gammaToLinear(this.b);\n        return this;\n    }\n    toGamma() {\n        this.r = Color.linearToGamma(this.r);\n        this.g = Color.linearToGamma(this.g);\n        this.b = Color.linearToGamma(this.b);\n        return this;\n    }\n    /**\n     * 颜色转数组\n     * @returns 数组\n     */\n    toArray() {\n        return [this.r, this.g, this.b, this.a];\n    }\n    toVector4() {\n        return new Vector4(this.r, this.g, this.b, this.a);\n    }\n    /**\n     * RGB 颜色空间转 HSV\n     * @param result HSV 值\n     */\n    toHSV() {\n        const { r, g, b, a } = this;\n        const max = Math.max(r, g, b);\n        const min = Math.min(r, g, b);\n        const v = max;\n        const dm = max - min;\n        let h = 0;\n        let s = 0;\n        if (max !== 0) {\n            s = dm / max;\n        }\n        if (max != min) {\n            if (max == r) {\n                h = (g - b) / dm;\n                if (g < b) {\n                    h += 6;\n                }\n            }\n            else if (max == g) {\n                h = (b - r) / dm + 2;\n            }\n            else if (max == b) {\n                h = (r - g) / dm + 4;\n            }\n            h *= 60;\n        }\n        return new Color(h, s, v, a);\n    }\n    toHexString(includeAlpha = true) {\n        const R = Color.ToHex(Math.round(this.r * 255));\n        const G = Color.ToHex(Math.round(this.g * 255));\n        const B = Color.ToHex(Math.round(this.b * 255));\n        const A = Color.ToHex(Math.round(this.a * 255));\n        if (includeAlpha) {\n            return '#' + R + G + B + A;\n        }\n        else {\n            return '#' + R + G + B;\n        }\n    }\n    fill(array, offset = 0) {\n        array[offset] = this.r;\n        array[offset + 1] = this.g;\n        array[offset + 2] = this.b;\n        array[offset + 3] = this.a;\n    }\n    /**\n     * 通过标量数值创建颜色\n     * @param num - 数值\n     * @returns\n     */\n    static fromNumber(num) {\n        return new Color().setFromNumber(num);\n    }\n    /**\n     * 通过数组创建颜色\n     * @param array - 数组\n     * @param [offset=0] - 起始偏移值\n     * @returns\n     */\n    static fromArray(array, offset = 0) {\n        return new Color().setFromArray(array, offset);\n    }\n    /**\n     * 通过 hex 字符串创建颜色\n     * @param hex - hex 字符串\n     * @returns\n     */\n    static fromHexString(hex) {\n        return new Color().setFromHexString(hex);\n    }\n    static fromHSV(hue, saturation, value, alpha = 1) {\n        return new Color().setFromHSV(hue, saturation, value, alpha);\n    }\n    /**\n     * 颜色值从 Gamma 空间转到线性空间\n     * @param v - Gamma 空间颜色值\n     * @returns 线性空间颜色值\n     */\n    static gammaToLinear(v) {\n        if (v <= 0.0) {\n            return 0.0;\n        }\n        else if (v <= 0.04045) {\n            return v / 12.92;\n        }\n        else if (v < 1.0) {\n            return Math.pow((v + 0.055) / 1.055, 2.4);\n        }\n        else {\n            return Math.pow(v, 2.4);\n        }\n    }\n    /**\n     * 颜色值从线性空间转到 Gamma 空间\n     * @param value - 线性空间颜色值\n     * @returns Gamma 空间颜色值\n     */\n    static linearToGamma(value) {\n        if (value <= 0.0) {\n            return 0.0;\n        }\n        else if (value < 0.0031308) {\n            return 12.92 * value;\n        }\n        else if (value < 1.0) {\n            return 1.055 * Math.pow(value, 0.41666) - 0.055;\n        }\n        else {\n            return Math.pow(value, 0.41666);\n        }\n    }\n    static ToHex(i) {\n        const str = i.toString(16);\n        if (i <= 15) {\n            return ('0' + str).toUpperCase();\n        }\n        return str.toUpperCase();\n    }\n}\n","import { Color } from '@galacean/effects-math/es/core/color';\nimport { isString } from './index';\n\nexport interface ColorStop {\n  time: number,\n  color: Color,\n}\n\nexport function colorToArr (hex: string | number[], normalized?: boolean): number[] {\n  let ret: number[] = [0, 0, 0, 0];\n\n  if (isString(hex)) {\n    hex = hex.replace(/[\\s\\t\\r\\n]/g, '');\n    let m = /rgba?\\(([.\\d]+),([.\\d]+),([.\\d]+),?([.\\d]+)?\\)/.exec(hex);\n\n    if (m) {\n      const a = +m[4];\n\n      ret = [+m[1], +m[2], +m[3], isNaN(a) ? 255 : a * 255];\n    } else if (/^#[a-f\\d]{3}$/i.test(hex)) {\n      ret = [parseInt(hex[1] + hex[1], 16), parseInt(hex[2] + hex[2], 16), parseInt(hex[3] + hex[3], 16), 255];\n      // eslint-disable-next-line no-cond-assign\n    } else if (m = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex)) {\n      ret = [parseInt(m[1], 16), parseInt(m[2], 16), parseInt(m[3], 16), 255];\n    }\n  } else if (hex instanceof Array) {\n    ret = [hex[0], hex[1], hex[2], isNaN(hex[3]) ? 255 : hex[3]];\n  }\n\n  if (normalized) {\n    for (let i = 0; i < 4; i++) {\n      ret[i] /= 255;\n    }\n  }\n\n  return ret;\n}\n\nexport function getColorFromGradientStops (stops: ColorStop[], key: number, normalize?: boolean): number[] {\n  if (stops.length) {\n    let color: number[] | undefined;\n\n    for (let j = 1; j <= stops.length - 1; j++) {\n      const s0 = stops[j - 1];\n      const s1 = stops[j];\n\n      if (s0.time <= key && key <= s1.time) {\n        color = interpolateColor(s0.color.toArray(), s1.color.toArray(), (key - s0.time) / (s1.time - s0.time));\n\n        break;\n      }\n    }\n    if (!color) {\n      color = stops[stops.length - 1].color.toArray();\n    }\n\n    return normalize ? color.map(n => n / 255) : color;\n  }\n\n  return [0, 0, 0, 0];\n}\n\nexport function colorStopsFromGradient (gradient: number[][] | Record<string, string | number[]>): ColorStop[] {\n  let stops: ColorStop[] = [];\n\n  if (gradient instanceof Array) {\n    gradient.forEach(val => {\n      const [s, r, g, b, a] = val;\n\n      stops.push({\n        // TODO\n        // @ts-expect-error\n        time: parsePercent(s),\n        color: new Color(r, g, b, a),\n      });\n    });\n  } else {\n    Object.keys(gradient).forEach(stop => {\n      const colorRGB = gradient[stop];\n      const color = new Color().setFromArray(colorToArr(colorRGB));\n\n      stops.push({\n        time: parsePercent(stop),\n        color,\n      });\n    });\n  }\n  stops = stops.sort((a, b) => a.time - b.time);\n  if (stops.length) {\n    if (stops[0].time !== 0) {\n      stops.unshift({ time: 0, color: stops[0].color.clone() });\n    }\n    const lastStop = stops[stops.length - 1];\n\n    if (lastStop.time !== 1) {\n      stops.push({ time: 1, color: lastStop.color.clone() });\n    }\n  }\n\n  return stops;\n}\n\nexport function interpolateColor (a: number[], b: number[], s: number, origin?: boolean): number[] {\n  const ret = [];\n  const ms = 1 - s;\n\n  if (origin) {\n    for (let i = 0; i < 4; i++) {\n      ret[i] = a[i] * ms + b[i] * s;\n    }\n  } else {\n    for (let i = 0; i < 3; i++) {\n      ret[i] = Math.round(Math.sqrt(a[i] * a[i] * ms + b[i] * b[i] * s));\n    }\n    ret[3] = Math.round(a[3] * ms + b[3] * s);\n  }\n\n  return ret;\n}\n\nexport function parsePercent (c: string): number {\n  const match = /^(-)?([\\d+.]+)%$/.exec(c);\n\n  if (match) {\n    return +match[2] / 100 * (match[1] ? -1 : 1);\n  }\n\n  return +c;\n}\n","export function getPixelRatio (): number {\n  if (typeof window === 'object') {\n    return Math.min(2, window.devicePixelRatio || 1);\n  }\n\n  return 1;\n}\n\n// window 对象不存在时需要判断\nexport const canUseBOM = typeof window !== 'undefined';\n\nexport function isIOS (): boolean {\n  // real ios device not in simulator\n  return !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform);\n}\n\nexport function isIOSByUA () {\n  const str = navigator.userAgent.toLowerCase();\n  const ver = str.match(/cpu (iphone )?os (.*?) like mac os/);\n\n  return ver ? parseInt(ver[2], 10) : 0;\n}\n\nexport function isAndroid (): boolean {\n  return /\\b[Aa]ndroid\\b/.test(navigator.userAgent);\n}\n\nexport function isOpenHarmony (): boolean {\n  return /\\bOpenHarmony\\b/.test(navigator.userAgent);\n}\n\nexport function isSimulatorCellPhone (): boolean {\n  return isAndroid() || isOpenHarmony() || /\\b(iPad|iPhone|iPod)\\b/.test(navigator.userAgent);\n}\n\nexport function isMiniProgram () {\n  return isAlipayMiniApp() || isWechatMiniApp();\n}\n\nexport function isAlipayMiniApp (): boolean {\n  return typeof my !== 'undefined' && my?.renderTarget === 'web';\n}\n\nexport function isWechatMiniApp () {\n  return window.__wxjs_environment === 'miniprogram';\n}\n","import { isString } from './index';\nimport type { ColorStop } from './color';\nimport { colorStopsFromGradient, colorToArr, interpolateColor } from './color';\n\nexport function imageDataFromColor (value: string | number[]) {\n  if (isString(value)) {\n    value = colorToArr(value);\n  }\n\n  const color = value;\n  const image = {\n    width: 1,\n    height: 1,\n    data: new Uint8Array(1 * 1 * 4),\n  };\n  const data = image.data;\n\n  for (let i = 0; i < 4; i++) {\n    data[i] = color[i];\n  }\n\n  return image;\n}\n\nexport function imageDataFromGradient (gradient: number[][] | Record<string, string | number[]>) {\n  const width = 128;\n  const image = {\n    width,\n    height: 1,\n    data: new Uint8Array(width * 1 * 4),\n  };\n  const data = image.data;\n  const stops = colorStopsFromGradient(gradient);\n\n  if (stops.length) {\n    data.set(stops[0].color.toArray(), 0);\n    for (let i = 1, cursor = 0; i < width - 1; i++) {\n      const index = i / width;\n      let s0!: ColorStop;\n      let s1!: ColorStop;\n\n      for (let j = cursor; j < stops.length; j++) {\n        s0 = stops[j];\n        s1 = stops[j + 1];\n        if (s0.time <= index && s1.time > index) {\n          break;\n        }\n      }\n      const color = interpolateColor(s0.color.toArray(), s1.color.toArray(), (index - s0.time) / (s1.time - s0.time));\n\n      data.set(color, i * 4);\n    }\n    data.set(stops[stops.length - 1].color.toArray(), (width - 1) * 4);\n  }\n\n  return image;\n}\n","export interface Sortable {\n  readonly priority: number,\n}\n\nexport enum OrderType {\n  none = 1,\n  ascending = 2,\n  descending = 3\n}\n\n/**\n * 按照指定排序方式对数组排序\n * @param arr - 要排序的数组\n * @param order - 排序方式\n * @returns\n */\nexport function sortByOrder<T extends Sortable> (arr: T[], order = OrderType.ascending): T[] {\n  const length = arr.length;\n\n  if (length <= 1 || order === OrderType.none) {\n    return arr;\n  }\n  if (length <= 30) {\n    for (let i = 1; i < length; i++) {\n      insertionSort(arr, i, order);\n    }\n\n    return arr;\n  } else {\n    return fastSort(arr, order);\n  }\n}\n\n/**\n * 按照指定排序方式往Sortable数组中添加成员\n * @param arr - 被添加的数组\n * @param item - 要添加的成员\n * @param order - 排序方式\n * @returns\n */\nexport function addByOrder<T extends Sortable> (arr: T[], item: T, order: OrderType = OrderType.ascending): T[] {\n  if (arr.includes(item)) {\n    return arr;\n  }\n  arr.push(item);\n  if (arr.length === 1) {\n    return arr;\n  }\n  if (order !== OrderType.none) {\n    insertionSort(arr, arr.length - 1, order);\n  }\n\n  return arr;\n}\n\nfunction insertionSort<T extends Sortable> (array: T[], index: number, order: OrderType) {\n  const currentItem = array[index];\n\n  if (order !== OrderType.ascending) {\n    while (index >= 1 && array[index - 1].priority < currentItem.priority) {\n      array[index] = array[index - 1];\n      index--;\n      if (index === 0) {\n        break;\n      }\n    }\n  } else {\n    while (index >= 1 && array[index - 1].priority > currentItem.priority) {\n      array[index] = array[index - 1];\n      index--;\n      if (index === 0) {\n        break;\n      }\n    }\n  }\n  array[index] = currentItem;\n}\n\nfunction fastSort<T extends Sortable> (\n  arr: T[],\n  order: OrderType,\n  start = 0,\n  end = arr.length - 1,\n): T[] {\n  // 终止条件\n  if (start >= end) {\n    return arr;\n  }\n\n  const base = arr[start];\n  let left = start;\n  let right = end;\n\n  while (left < right) {\n    if (order === OrderType.ascending) {\n      // 从右向左，寻找第一个小于base的值\n      while (arr[right].priority > base.priority && right >= left) { right--; }\n      // 从左向右，寻找第一个大于base的值\n      while (arr[left].priority <= base.priority && left < right) { left++; }\n    } else {\n      // 从右向左，寻找第一个大于base的值\n      while (arr[right].priority < base.priority && right >= left) { right--; }\n      // 从左向右，寻找第一个小于base的值\n      while (arr[left].priority >= base.priority && left < right) { left++; }\n    }\n    // 将两个值交换位置\n    [arr[left], arr[right]] = [arr[right], arr[left]];\n  }\n  // 将最后两个游标相遇的位置的值与base值交换\n  [arr[start], arr[left]] = [arr[left], arr[start]];\n  fastSort(arr, order, start, left - 1);\n  fastSort(arr, order, right + 1, end);\n\n  return arr;\n}\n","export function assertExist<T> (item?: T | void | null, msg = 'item doesn\\'t exist'): asserts item is T {\n  if (item === undefined || item === null) {\n    throw new Error(msg);\n  }\n}\n\nexport function asserts (condition: any, msg = 'asserts failed'): asserts condition {\n  if (!condition) {\n    throw new Error(msg);\n  }\n}\n","import { isSimulatorCellPhone } from './device';\n\n/**\n * 判断是否为可解析的字体\n * - 首字母不能为数字或 `.`\n * - 不能包含特殊字符，`_-` 是被允许的\n * @param fontFamily - 字体名称\n * @returns\n */\nexport function isValidFontFamily (fontFamily: string): boolean {\n  // iOS 11/12 不支持自定义字体开头为数字的名称，特殊字符也有风险\n  return isSafeFontFamily(fontFamily) || !isSimulatorCellPhone();\n}\n\n/**\n * @internal\n */\nexport function isSafeFontFamily (fontFamily: string): boolean {\n  return /^[^\\d.][\\w-]*$/.test(fontFamily);\n}","/**\n * Simple implementation of the deferred pattern.\n * An object that exposes a promise and functions to resolve and reject it.\n */\nexport class Deferred<T> {\n  resolve: (value: T | PromiseLike<T>) => void;\n  reject: (err?: any) => void;\n\n  promise = new Promise<T>((resolve, reject) => {\n    this.resolve = resolve;\n    this.reject = reject;\n  });\n}\n","import { isFunction } from './index';\n\ntype LogType = 'info' | 'error' | 'warn';\n\nconst prefix = '[Galacean Effects]';\nlet localLogger: ((type: LogType, message: string, ...args: any[]) => void) | undefined;\n\nfunction format (message: string) {\n  return [\n    `%c${prefix}`,\n    'color: #AA0100',\n    `${message}`,\n  ];\n}\n\nfunction error (message: string, ...args: any[]) {\n  console.error(...format(message), args);\n  localLogger?.('error', message, args);\n}\n\n/**\n * info 会转换成浏览器的 console.debug\n * @param message\n * @param args\n */\nfunction info (message: string, ...args: any[]) {\n  console.debug(...format(message));\n  localLogger?.('info', message, args);\n}\n\nfunction warn (message: string, ...args: any[]) {\n  console.warn(...format(message));\n  localLogger?.('warn', message, args);\n}\n\n/**\n * 注册自定义埋点函数\n *\n * @param fn\n */\nfunction register (fn: (type: LogType, message: string, ...args: any[]) => void) {\n  if (fn && isFunction(fn)) {\n    localLogger = fn;\n  }\n}\n\nexport const logger = {\n  error,\n  info,\n  warn,\n  register,\n};\n","import { v4 as uuidv4 } from 'uuid';\n\nexport * from './array';\nexport * from './color';\nexport * from './device';\nexport * from './image-data';\nexport * from './sortable';\nexport * from './asserts';\nexport * from './text';\nexport * from './promise-util';\nexport * from './logger';\n\nexport type Immutable<O> = O extends Record<any, any>\n  ? { readonly [key in keyof O]: Immutable<O[key]> }\n  : O extends Array<infer X> ? ReadonlyArray<X> : O;\n\nexport type PickEnum<T, K extends T> = {\n  [P in keyof K]: P extends K ? P : never;\n};\n\nexport interface Constructor<T = unknown> {\n  new(...args: any[]): T,\n}\n\nexport type Nullable<T> = T | null;\n\nexport enum DestroyOptions {\n  destroy = 0,\n  keep = 1,\n  force = destroy,\n}\n\n/**\n *\n */\nexport interface Disposable {\n  dispose (): void,\n}\n\nexport interface RestoreHandler {\n  restore (): void,\n}\n\nexport interface LostHandler {\n  lost (e: Event): void,\n}\n\nexport function noop () {\n}\n\n/**\n * 判断对象是否是`String`类型\n *\n * @static\n * @function isString\n * @param obj - 要判断的对象\n * @return\n */\nexport function isString (obj: unknown): obj is string {\n  return typeof obj === 'string';\n}\n\n/**\n * 判断对象是否是`Array`类型\n *\n * @static\n * @function isArray\n * @param obj - 要判断的对象\n * @return\n */\nexport const isArray = (Array.isArray || function (obj) {\n  return Object.prototype.toString.call(obj) === '[object Array]';\n});\n\n/**\n * 判断对象是否是函数类型\n *\n * @static\n * @function isFunction\n * @param obj - 要判断的对象\n * @return\n */\nexport function isFunction (obj: unknown): obj is Function {\n  return Object.prototype.toString.call(obj) === '[object Function]';\n}\n\n/**\n * 判断对象是否是`Object`类型\n *\n * @static\n * @function isObject\n * @param obj - 要判断的对象\n * @return\n */\nexport function isObject (obj: unknown): obj is Record<string | symbol, unknown> {\n  return Object.prototype.toString.call(obj) === '[object Object]';\n}\n\n/**\n * 判断对象是否是`Plain Object`类型\n *\n * @param obj - 要判断的对象\n * @returns\n */\nexport function isPlainObject (obj: unknown): obj is Record<string | symbol, unknown> {\n  if (obj === null || typeof obj !== 'object') { return false; }\n  // 先排除 Array/Date/Map/Set/RegExp 等\n  if (Object.prototype.toString.call(obj) !== '[object Object]') { return false; }\n\n  const proto = Object.getPrototypeOf(obj);\n\n  if (proto === null) { return true; } // Object.create(null)\n\n  const hasOwn = Object.prototype.hasOwnProperty;\n  const Ctor = hasOwn.call(proto, 'constructor') && proto.constructor;\n\n  // 构造器需要是 Object（跨 realm 用函数源码比对）\n  return typeof Ctor === 'function' &&\n    Function.prototype.toString.call(Ctor) === Function.prototype.toString.call(Object);\n}\n\nexport function isCanvas (canvas: HTMLCanvasElement) {\n  // 小程序 Canvas 无法使用 instanceof HTMLCanvasElement 判断\n  return typeof canvas === 'object' && canvas !== null && canvas.tagName?.toUpperCase() === 'CANVAS';\n}\n\nexport function isPowerOfTwo (value: number) {\n  return (value & (value - 1)) === 0 && value !== 0;\n}\n\n/**\n * 生成一个位于 min 和 max 之间的随机数\n * @param min\n * @param max\n * @returns\n */\nexport function randomInRange (min: number, max: number) {\n  return min + Math.random() * (max - min);\n}\n\nexport function throwDestroyedError () {\n  throw new Error('Destroyed item cannot be used again.');\n}\n\nexport function generateGUID (): string {\n  return uuidv4().replace(/-/g, '');\n}\n\nexport function base64ToFile (\n  base64: string,\n  filename = 'base64File',\n  contentType = '',\n) {\n  // 去掉 Base64 字符串的 Data URL 部分（如果存在）\n  const base64WithoutPrefix = base64.split(',')[1] || base64;\n\n  // 将 base64 编码的字符串转换为二进制字符串\n  const byteCharacters = atob(base64WithoutPrefix);\n  // 创建一个 8 位无符号整数值的数组，即“字节数组”\n  const byteArrays = [];\n\n  // 切割二进制字符串为多个片段，并将每个片段转换成一个字节数组\n  for (let offset = 0; offset < byteCharacters.length; offset += 512) {\n    const slice = byteCharacters.slice(offset, offset + 512);\n    const byteNumbers = new Array(slice.length);\n\n    for (let i = 0; i < slice.length; i++) {\n      byteNumbers[i] = slice.charCodeAt(i);\n    }\n    const byteArray = new Uint8Array(byteNumbers);\n\n    byteArrays.push(byteArray);\n  }\n\n  // 使用字节数组创建 Blob 对象\n  const blob = new Blob(byteArrays, { type: contentType });\n\n  // 创建 File 对象\n  const file = new File([blob], filename, { type: contentType });\n\n  return file;\n}\n\nexport function applyMixins<T extends Constructor, K extends Constructor> (\n  derivedCtrl: T,\n  baseCtrls: K[],\n) {\n  baseCtrls.forEach(baseCtrl => {\n    Object.getOwnPropertyNames(baseCtrl.prototype).forEach(name => {\n      const propertyDescriptor = Object.getOwnPropertyDescriptor(baseCtrl.prototype, name);\n\n      if (!propertyDescriptor) {\n        throw new Error(`Cannot find property descriptor of class ${baseCtrl}`);\n      }\n      Object.defineProperty(\n        derivedCtrl.prototype,\n        name,\n        propertyDescriptor,\n      );\n    });\n  });\n}\n","import type { Composition } from './composition';\nimport type { Plugin, PluginConstructor } from './plugins';\nimport type { Scene, SceneLoadOptions } from './scene';\nimport { logger } from './utils';\nimport type { Engine } from './engine';\n\nexport const pluginLoaderMap: Record<string, PluginConstructor> = {};\n\nconst plugins: Plugin[] = [];\n\n/**\n * 注册 plugin\n * @param name\n * @param pluginClass class of plugin\n * @param itemClass class of item\n * @param isDefault load\n */\nexport function registerPlugin (name: string, pluginClass: PluginConstructor) {\n  if (pluginLoaderMap[name]) {\n    logger.error(`Duplicate registration for plugin ${name}.`);\n  }\n\n  pluginLoaderMap[name] = pluginClass;\n\n  const pluginInstance = new pluginClass();\n\n  pluginInstance.name = name;\n\n  plugins.push(pluginInstance);\n  plugins.sort((a, b) => a.order - b.order);\n}\n\n/**\n * 注销 plugin\n */\nexport function unregisterPlugin (name: string) {\n  delete pluginLoaderMap[name];\n  const pluginIndex = plugins.findIndex(plugin => plugin.name === name);\n\n  if (pluginIndex !== -1) {\n    plugins.splice(pluginIndex, 1);\n  }\n}\n\nexport class PluginSystem {\n  static getPlugins (): Plugin[] {\n    return plugins;\n  }\n\n  static initializeComposition (composition: Composition, scene: Scene) {\n    plugins.forEach(loader => loader.onCompositionCreated(composition, scene));\n  }\n\n  static destroyComposition (comp: Composition) {\n    plugins.forEach(loader => loader.onCompositionDestroy(comp));\n  }\n\n  static async onAssetsLoadStart (scene: Scene, options?: SceneLoadOptions) {\n    return Promise.all(\n      plugins.map(plugin => plugin.onAssetsLoadStart(scene, options)),\n    );\n  }\n\n  static onAssetsLoadFinish (scene: Scene, options: SceneLoadOptions, engine: Engine) {\n    plugins.forEach(loader => loader.onAssetsLoadFinish(scene, options, engine));\n  }\n}\n\nconst pluginInfoMap: Record<string, string> = {\n  'alipay-downgrade': '@galacean/effects-plugin-alipay-downgrade',\n  'downgrade': '@galacean/effects-plugin-downgrade',\n  'editor-gizmo': '@galacean/effects-plugin-editor-gizmo',\n  'ffd': '@galacean/effects-plugin-ffd',\n  'ktx2': '@galacean/effects-plugin-ktx2',\n  'model': '@galacean/effects-plugin-model',\n  'video': '@galacean/effects-plugin-multimedia',\n  'audio': '@galacean/effects-plugin-multimedia',\n  'orientation-transformer': '@galacean/effects-plugin-orientation-transformer',\n  'rich-text': '@galacean/effects-plugin-rich-text',\n  'spine': '@galacean/effects-plugin-spine',\n};\n\nexport function getPluginUsageInfo (name: string) {\n  const info = pluginInfoMap[name];\n\n  if (info) {\n    return `\n请按如下命令进行操作（Please follow the commands below to proceed）：\n1、使用 npm 安装插件（Install Plugin）：npm i ${info}@latest --save\n2、导入插件（Import Plugin）：import '${info}'`;\n  } else {\n    return '';\n  }\n}\n","import type { Scene, SceneLoadOptions } from '../scene';\nimport type { Composition } from '../composition';\nimport type { Engine } from '../engine';\n\nexport interface PluginConstructor {\n  new(): Plugin,\n\n  [key: string]: any,\n}\n\n/**\n * 抽象插件类\n * 注册合成不同生命周期的回调函数\n */\nexport abstract class Plugin {\n  order = 100;\n  name = 'Plugin';\n\n  /**\n   * 场景加载时触发，用于加载插件所需的自定义资源。\n   * 此阶段适合发起异步资源请求。\n   * @param scene - 场景对象\n   * @param options - 场景加载选项\n   */\n  async onAssetsLoadStart (scene: Scene, options?: SceneLoadOptions): Promise<void> { }\n\n  /**\n   * 场景资源加载完成后触发。\n   * 此时 JSON 中的图片和二进制已加载完成，可对资源做进一步处理。\n   * @param scene - 场景对象\n   * @param options - 场景加载选项\n   * @param engine - 引擎实例\n   */\n  onAssetsLoadFinish (scene: Scene, options: SceneLoadOptions, engine: Engine): void { }\n\n  /**\n   * 合成创建完成后触发。\n   * @param composition - 合成对象\n   * @param scene - 场景对象\n   */\n  onCompositionCreated (composition: Composition, scene: Scene): void { }\n\n  /**\n   * 合成销毁时触发。\n   * @param composition - 合成对象\n   */\n  onCompositionDestroy (composition: Composition): void { }\n}\n","/**\n * JSON 版本\n */\nexport var JSONSceneVersion;\n(function (JSONSceneVersion) {\n    JSONSceneVersion[\"1_0\"] = \"1.0\";\n    JSONSceneVersion[\"1_1\"] = \"1.1\";\n    JSONSceneVersion[\"1_2\"] = \"1.2\";\n    JSONSceneVersion[\"1_3\"] = \"1.3\";\n    JSONSceneVersion[\"1_5\"] = \"1.5\";\n    JSONSceneVersion[\"1_8\"] = \"1.8\";\n    JSONSceneVersion[\"2_0\"] = \"2.0\";\n    JSONSceneVersion[\"2_1\"] = \"2.1\";\n    JSONSceneVersion[\"2_2\"] = \"2.2\";\n    JSONSceneVersion[\"2_3\"] = \"2.3\";\n    JSONSceneVersion[\"2_4\"] = \"2.4\";\n    JSONSceneVersion[\"3_0\"] = \"3.0\";\n    JSONSceneVersion[\"3_1\"] = \"3.1\";\n    JSONSceneVersion[\"3_2\"] = \"3.2\";\n    JSONSceneVersion[\"3_3\"] = \"3.3\";\n    JSONSceneVersion[\"3_4\"] = \"3.4\";\n    JSONSceneVersion[\"3_5\"] = \"3.5\";\n    JSONSceneVersion[\"3_6\"] = \"3.6\";\n    JSONSceneVersion[\"LATEST\"] = \"3.6\";\n})(JSONSceneVersion || (JSONSceneVersion = {}));\n","/*********************************************/\n/*               元素属性参数类型               */\n/*********************************************/\n/**\n * 渲染等级\n */\nexport var RenderLevel;\n(function (RenderLevel) {\n    RenderLevel[\"S\"] = \"S\";\n    RenderLevel[\"APlus\"] = \"A+\";\n    RenderLevel[\"A\"] = \"A\";\n    RenderLevel[\"BPlus\"] = \"B+\";\n    RenderLevel[\"B\"] = \"B\";\n})(RenderLevel || (RenderLevel = {}));\n/**\n * 混合模式\n */\nexport var BlendingMode;\n(function (BlendingMode) {\n    /**\n     * 普通混合模式\n     */\n    BlendingMode[BlendingMode[\"ALPHA\"] = 0] = \"ALPHA\";\n    /**\n     * 叠加混合模式\n     */\n    BlendingMode[BlendingMode[\"ADD\"] = 1] = \"ADD\";\n    /**\n     * 相乘混合模式\n     */\n    BlendingMode[BlendingMode[\"MULTIPLY\"] = 2] = \"MULTIPLY\";\n    /**\n     * 亮度混合模式\n     */\n    BlendingMode[BlendingMode[\"BRIGHTNESS\"] = 3] = \"BRIGHTNESS\";\n    /**\n     * 减色混合模式\n     */\n    BlendingMode[BlendingMode[\"SUBTRACTION\"] = 4] = \"SUBTRACTION\";\n    /**\n     * 强光混合模式\n     */\n    BlendingMode[BlendingMode[\"STRONG_LIGHT\"] = 5] = \"STRONG_LIGHT\";\n    /**\n     * 弱光混合模式\n     */\n    BlendingMode[BlendingMode[\"WEAK_LIGHT\"] = 6] = \"WEAK_LIGHT\";\n    /**\n     * 亮度叠加混合模式\n     */\n    BlendingMode[BlendingMode[\"SUPERPOSITION\"] = 7] = \"SUPERPOSITION\";\n})(BlendingMode || (BlendingMode = {}));\n/**\n * 单双面模式\n */\nexport var SideMode;\n(function (SideMode) {\n    /**\n     * 双面模式\n     */\n    SideMode[SideMode[\"DOUBLE\"] = 1032] = \"DOUBLE\";\n    /**\n     * 正面模式\n     */\n    SideMode[SideMode[\"FRONT\"] = 1028] = \"FRONT\";\n    /**\n     * 背面模式\n     */\n    SideMode[SideMode[\"BACK\"] = 1029] = \"BACK\";\n})(SideMode || (SideMode = {}));\n/**\n *  元素是否被蒙版遮挡/反向遮挡\n */\nexport var ObscuredMode;\n(function (ObscuredMode) {\n    /**\n     * 无\n     */\n    // NONE = 0,\n    // /**\n    //  * 蒙版\n    //  */\n    // MASK = 1,\n    /**\n     * 被遮挡\n     */\n    ObscuredMode[ObscuredMode[\"OBSCURED\"] = 2] = \"OBSCURED\";\n    /**\n     * 被反向遮挡\n     */\n    ObscuredMode[ObscuredMode[\"REVERSE_OBSCURED\"] = 3] = \"REVERSE_OBSCURED\";\n})(ObscuredMode || (ObscuredMode = {}));\n/**\n * 发射器形状\n */\nexport var ParticleEmitterShapeType;\n(function (ParticleEmitterShapeType) {\n    /**\n     * 没有类型\n     */\n    ParticleEmitterShapeType[ParticleEmitterShapeType[\"NONE\"] = 0] = \"NONE\";\n    /**\n     * 圆球\n     */\n    ParticleEmitterShapeType[ParticleEmitterShapeType[\"SPHERE\"] = 1] = \"SPHERE\";\n    /**\n     * 圆锥\n     */\n    ParticleEmitterShapeType[ParticleEmitterShapeType[\"CONE\"] = 2] = \"CONE\";\n    /**\n     * 半球\n     */\n    ParticleEmitterShapeType[ParticleEmitterShapeType[\"HEMISPHERE\"] = 3] = \"HEMISPHERE\";\n    /**\n     * 圆\n     */\n    ParticleEmitterShapeType[ParticleEmitterShapeType[\"CIRCLE\"] = 4] = \"CIRCLE\";\n    /**\n     * 圆环\n     */\n    ParticleEmitterShapeType[ParticleEmitterShapeType[\"DONUT\"] = 5] = \"DONUT\";\n    /**\n     * 矩形\n     */\n    ParticleEmitterShapeType[ParticleEmitterShapeType[\"RECTANGLE\"] = 6] = \"RECTANGLE\";\n    /**\n     * 矩形框\n     */\n    ParticleEmitterShapeType[ParticleEmitterShapeType[\"RECTANGLE_EDGE\"] = 7] = \"RECTANGLE_EDGE\";\n    /**\n     * 直线\n     */\n    ParticleEmitterShapeType[ParticleEmitterShapeType[\"EDGE\"] = 8] = \"EDGE\";\n    /**\n     * 贴图\n     */\n    ParticleEmitterShapeType[ParticleEmitterShapeType[\"TEXTURE\"] = 9] = \"TEXTURE\";\n})(ParticleEmitterShapeType || (ParticleEmitterShapeType = {}));\n/**\n * 插件类型\n */\nexport var PluginType;\n(function (PluginType) {\n    /**\n     * 陀螺仪\n     */\n    PluginType[PluginType[\"GYROSCOPE\"] = 0] = \"GYROSCOPE\";\n    /**\n     * Spine\n     */\n    PluginType[PluginType[\"SPINE\"] = 1] = \"SPINE\";\n})(PluginType || (PluginType = {}));\n/**\n * 交互类型\n */\nexport var InteractType;\n(function (InteractType) {\n    /**\n     * 点击\n     */\n    InteractType[InteractType[\"CLICK\"] = 0] = \"CLICK\";\n    /**\n     * 消息\n     * 前端收到 onMessageItem 回调\n     */\n    InteractType[InteractType[\"MESSAGE\"] = 1] = \"MESSAGE\";\n    /**\n     * 拖拽\n     */\n    InteractType[InteractType[\"DRAG\"] = 2] = \"DRAG\";\n})(InteractType || (InteractType = {}));\n/**\n * 交互行为\n */\nexport var InteractBehavior;\n(function (InteractBehavior) {\n    /**\n     * 无\n     */\n    InteractBehavior[InteractBehavior[\"NONE\"] = 0] = \"NONE\";\n    /**\n     * 通知\n     */\n    InteractBehavior[InteractBehavior[\"NOTIFY\"] = 1] = \"NOTIFY\";\n    /**\n     * 重置播放器\n     */\n    InteractBehavior[InteractBehavior[\"RESUME_PLAYER\"] = 2] = \"RESUME_PLAYER\";\n    /**\n     * 清除元素\n     */\n    InteractBehavior[InteractBehavior[\"REMOVE\"] = 3] = \"REMOVE\";\n    /**\n     * 暂停播放器\n     */\n    InteractBehavior[InteractBehavior[\"PAUSE\"] = 4] = \"PAUSE\";\n})(InteractBehavior || (InteractBehavior = {}));\n/**\n * 元素类型\n */\nexport var ItemType;\n(function (ItemType) {\n    /**\n     * 错误元素\n     */\n    ItemType[\"base\"] = \"0\";\n    /**\n     * 图层元素\n     */\n    ItemType[\"sprite\"] = \"1\";\n    /**\n     * 粒子元素\n     */\n    ItemType[\"particle\"] = \"2\";\n    /**\n     * 空节点元素\n     */\n    ItemType[\"null\"] = \"3\";\n    /**\n     * 交互元素\n     */\n    ItemType[\"interact\"] = \"4\";\n    /**\n     * 插件元素\n     */\n    ItemType[\"plugin\"] = \"5\";\n    /**\n     * 相机元素\n     */\n    ItemType[\"camera\"] = \"6\";\n    /**\n     * 预合成元素\n     */\n    ItemType[\"composition\"] = \"7\";\n    /**\n     * Spine 元素\n     */\n    ItemType[\"spine\"] = \"spine\";\n    /**\n     * Mesh 元素\n     */\n    ItemType[\"mesh\"] = \"mesh\";\n    /**\n     * 节点树元素\n     */\n    ItemType[\"tree\"] = \"tree\";\n    /**\n     * 文本元素\n     */\n    ItemType[\"text\"] = \"text\";\n    /**\n     * 灯光元素\n     */\n    ItemType[\"light\"] = \"light\";\n    /**\n     * 天空盒元素\n     */\n    ItemType[\"skybox\"] = \"skybox\";\n    /**\n     * 特效元素\n     */\n    ItemType[\"effect\"] = \"effect\";\n    /**\n     * 形状元素\n     */\n    ItemType[\"shape\"] = \"shape\";\n    /**\n     * 后处理元素\n     */\n    ItemType[\"postProcessVolume\"] = \"postProcessVolume\";\n    /**\n     * 节点元素\n     */\n    ItemType[\"node\"] = \"node\";\n    /**\n     * 视频元素\n     */\n    ItemType[\"video\"] = \"video\";\n    /**\n     * 音频元素\n     */\n    ItemType[\"audio\"] = \"audio\";\n    /**\n     * 富文本元素\n     */\n    ItemType[\"richtext\"] = \"richtext\";\n})(ItemType || (ItemType = {}));\n/**\n * 渲染模式\n */\nexport var RenderMode;\n(function (RenderMode) {\n    /**\n     * 广告牌模式\n     */\n    RenderMode[RenderMode[\"BILLBOARD\"] = 0] = \"BILLBOARD\";\n    /**\n     * 网格模式\n     */\n    RenderMode[RenderMode[\"MESH\"] = 1] = \"MESH\";\n    /**\n     * 垂直广告牌模式\n     */\n    RenderMode[RenderMode[\"VERTICAL_BILLBOARD\"] = 2] = \"VERTICAL_BILLBOARD\";\n    /**\n     * 水平广告牌模式\n     */\n    RenderMode[RenderMode[\"HORIZONTAL_BILLBOARD\"] = 3] = \"HORIZONTAL_BILLBOARD\";\n})(RenderMode || (RenderMode = {}));\n/**\n * 变换中心\n */\nexport var ParticleOrigin;\n(function (ParticleOrigin) {\n    /**\n     * 水平和垂直中点\n     */\n    ParticleOrigin[ParticleOrigin[\"PARTICLE_ORIGIN_CENTER\"] = 0] = \"PARTICLE_ORIGIN_CENTER\";\n    /**\n     * 水平左侧 垂直顶部\n     */\n    ParticleOrigin[ParticleOrigin[\"PARTICLE_ORIGIN_LEFT_TOP\"] = 1] = \"PARTICLE_ORIGIN_LEFT_TOP\";\n    /**\n     * 水平左侧 垂直中间\n     */\n    ParticleOrigin[ParticleOrigin[\"PARTICLE_ORIGIN_LEFT_CENTER\"] = 2] = \"PARTICLE_ORIGIN_LEFT_CENTER\";\n    /**\n     * 水平左侧 垂直底部\n     */\n    ParticleOrigin[ParticleOrigin[\"PARTICLE_ORIGIN_LEFT_BOTTOM\"] = 3] = \"PARTICLE_ORIGIN_LEFT_BOTTOM\";\n    /**\n     * 水平中间 垂直顶部\n     */\n    ParticleOrigin[ParticleOrigin[\"PARTICLE_ORIGIN_CENTER_TOP\"] = 4] = \"PARTICLE_ORIGIN_CENTER_TOP\";\n    /**\n     * 水平中间 垂直底部\n     */\n    ParticleOrigin[ParticleOrigin[\"PARTICLE_ORIGIN_CENTER_BOTTOM\"] = 5] = \"PARTICLE_ORIGIN_CENTER_BOTTOM\";\n    /**\n     * 水平右侧 垂直顶部\n     */\n    ParticleOrigin[ParticleOrigin[\"PARTICLE_ORIGIN_RIGHT_TOP\"] = 6] = \"PARTICLE_ORIGIN_RIGHT_TOP\";\n    /**\n     * 水平右侧 垂直中间\n     */\n    ParticleOrigin[ParticleOrigin[\"PARTICLE_ORIGIN_RIGHT_CENTER\"] = 7] = \"PARTICLE_ORIGIN_RIGHT_CENTER\";\n    /**\n     * 水平右侧 垂直底部\n     */\n    ParticleOrigin[ParticleOrigin[\"PARTICLE_ORIGIN_RIGHT_BOTTOM\"] = 8] = \"PARTICLE_ORIGIN_RIGHT_BOTTOM\";\n})(ParticleOrigin || (ParticleOrigin = {}));\nexport var RenderType;\n(function (RenderType) {\n    RenderType[\"Opaque\"] = \"Opaque\";\n    RenderType[\"Transparent\"] = \"Transparent\";\n})(RenderType || (RenderType = {}));\nexport var RenderFace;\n(function (RenderFace) {\n    RenderFace[\"Both\"] = \"Both\";\n    RenderFace[\"Back\"] = \"Back\";\n    RenderFace[\"Front\"] = \"Front\";\n})(RenderFace || (RenderFace = {}));\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","/**\n * 销毁\n */\nexport const END_BEHAVIOR_DESTROY = 0;\n/**\n * 暂停\n * @deprecated since 2.0 - use `END_BEHAVIOR_FREEZE` instead\n */\nexport const END_BEHAVIOR_PAUSE = 1;\n/**\n * 无限播放\n */\nexport const END_BEHAVIOR_FORWARD = 2;\n/**\n * 销毁并保留最后一帧\n * @deprecated since 2.0\n */\nexport const END_BEHAVIOR_PAUSE_AND_DESTROY = 3;\n/**\n * 冻结\n */\nexport const END_BEHAVIOR_FREEZE = 4;\n/**\n * 重播\n */\nexport const END_BEHAVIOR_RESTART = 5;\n/**\n *\n */\nexport const END_BEHAVIOR_DESTROY_CHILDREN = 6;\nexport const CAMERA_CLIP_MODE_VERTICAL = 1;\nexport const CAMERA_CLIP_MODE_NORMAL = 0;\n/**\n * 消息开始\n */\nexport const MESSAGE_ITEM_PHRASE_BEGIN = 2;\n/**\n * 消息结束\n */\nexport const MESSAGE_ITEM_PHRASE_END = 1;\n","import { CAMERA_CLIP_MODE_NORMAL, CAMERA_CLIP_MODE_VERTICAL } from './constants';\nexport var CameraClipMode;\n(function (CameraClipMode) {\n    /**\n     * 剪裁上下\n     */\n    CameraClipMode[CameraClipMode[\"portrait\"] = 1] = \"portrait\";\n    /**\n     * 剪裁左右\n     */\n    CameraClipMode[CameraClipMode[\"landscape\"] = 0] = \"landscape\";\n})(CameraClipMode || (CameraClipMode = {}));\n","/*********************************************/\n/*               基本数值属性参数              */\n/*********************************************/\nexport var ValueType;\n(function (ValueType) {\n    /**\n     * 常数\n     */\n    ValueType[ValueType[\"CONSTANT\"] = 0] = \"CONSTANT\";\n    /**\n     * 二维常数向量\n     */\n    ValueType[ValueType[\"CONSTANT_VEC2\"] = 1] = \"CONSTANT_VEC2\";\n    /**\n     * 三维常数向量\n     */\n    ValueType[ValueType[\"CONSTANT_VEC3\"] = 2] = \"CONSTANT_VEC3\";\n    /**\n     * 四维常数向量\n     */\n    ValueType[ValueType[\"CONSTANT_VEC4\"] = 3] = \"CONSTANT_VEC4\";\n    /**\n     * 随机数\n     */\n    ValueType[ValueType[\"RANDOM\"] = 4] = \"RANDOM\";\n    /**\n     * 直线\n     */\n    ValueType[ValueType[\"LINE\"] = 5] = \"LINE\";\n    /**\n     * 曲线\n     */\n    ValueType[ValueType[\"CURVE\"] = 6] = \"CURVE\";\n    /**\n     * 贝塞尔路径\n     */\n    ValueType[ValueType[\"BEZIER_PATH\"] = 7] = \"BEZIER_PATH\";\n    /**\n     * 颜色\n     */\n    ValueType[ValueType[\"RGBA_COLOR\"] = 8] = \"RGBA_COLOR\";\n    /**\n     * 渐变色\n     */\n    ValueType[ValueType[\"GRADIENT_COLOR\"] = 9] = \"GRADIENT_COLOR\";\n    /**\n     * 蒙版形状点集\n     */\n    ValueType[ValueType[\"SHAPE_POINTS\"] = 10] = \"SHAPE_POINTS\";\n    /**\n     * 蒙版形状切分\n     */\n    ValueType[ValueType[\"SHAPE_SPLITS\"] = 11] = \"SHAPE_SPLITS\";\n    /**\n     * 直线路径\n     */\n    ValueType[ValueType[\"LINEAR_PATH\"] = 12] = \"LINEAR_PATH\";\n    /**\n     * 多色\n     */\n    ValueType[ValueType[\"COLORS\"] = 13] = \"COLORS\";\n    /**\n     * 二进制指针\n     */\n    ValueType[ValueType[\"BINARY\"] = 20] = \"BINARY\";\n    /**\n     * 贝塞尔曲线\n     */\n    ValueType[ValueType[\"BEZIER_CURVE\"] = 21] = \"BEZIER_CURVE\";\n    /**\n     * 贝塞尔曲线路径\n     */\n    ValueType[ValueType[\"BEZIER_CURVE_PATH\"] = 22] = \"BEZIER_CURVE_PATH\";\n    /**\n     * 贝塞尔曲线四元数\n     */\n    ValueType[ValueType[\"BEZIER_CURVE_QUAT\"] = 23] = \"BEZIER_CURVE_QUAT\";\n    /**\n     * 颜色曲线\n     */\n    ValueType[ValueType[\"COLOR_CURVE\"] = 24] = \"COLOR_CURVE\";\n    /**\n     * Vector4 曲线\n     */\n    ValueType[ValueType[\"VECTOR4_CURVE\"] = 25] = \"VECTOR4_CURVE\";\n    /**\n     * Vector2 曲线\n     */\n    ValueType[ValueType[\"VECTOR2_CURVE\"] = 26] = \"VECTOR2_CURVE\";\n    /**\n     * Vector3 曲线\n     */\n    ValueType[ValueType[\"VECTOR3_CURVE\"] = 27] = \"VECTOR3_CURVE\";\n})(ValueType || (ValueType = {}));\n/**\n * 关键帧类型\n */\nexport var BezierKeyframeType;\n(function (BezierKeyframeType) {\n    BezierKeyframeType[BezierKeyframeType[\"AUTO\"] = 0] = \"AUTO\";\n    BezierKeyframeType[BezierKeyframeType[\"EASE\"] = 1] = \"EASE\";\n    BezierKeyframeType[BezierKeyframeType[\"EASE_IN\"] = 2] = \"EASE_IN\";\n    BezierKeyframeType[BezierKeyframeType[\"EASE_OUT\"] = 3] = \"EASE_OUT\";\n    BezierKeyframeType[BezierKeyframeType[\"LINE\"] = 4] = \"LINE\";\n    BezierKeyframeType[BezierKeyframeType[\"HOLD\"] = 5] = \"HOLD\";\n    BezierKeyframeType[BezierKeyframeType[\"LINE_OUT\"] = 6] = \"LINE_OUT\";\n})(BezierKeyframeType || (BezierKeyframeType = {}));\n","import { END_BEHAVIOR_DESTROY, END_BEHAVIOR_FORWARD, END_BEHAVIOR_FREEZE, END_BEHAVIOR_RESTART, } from '../constants';\n/**\n * 结束行为\n */\nexport var EndBehavior;\n(function (EndBehavior) {\n    /**\n     * 销毁\n     */\n    EndBehavior[EndBehavior[\"destroy\"] = 0] = \"destroy\";\n    /**\n     * 重播\n     */\n    EndBehavior[EndBehavior[\"restart\"] = 5] = \"restart\";\n    /**\n     * 无限播放\n     */\n    EndBehavior[EndBehavior[\"forward\"] = 2] = \"forward\";\n    /**\n     * 冻结\n     */\n    EndBehavior[EndBehavior[\"freeze\"] = 4] = \"freeze\";\n})(EndBehavior || (EndBehavior = {}));\n","/**\n * 粒子交互行为\n */\nexport var ParticleInteractionBehavior;\n(function (ParticleInteractionBehavior) {\n    /**\n     * 无\n     */\n    ParticleInteractionBehavior[ParticleInteractionBehavior[\"none\"] = 0] = \"none\";\n    /**\n     * 移出粒子\n     */\n    ParticleInteractionBehavior[ParticleInteractionBehavior[\"removeParticle\"] = 1] = \"removeParticle\";\n})(ParticleInteractionBehavior || (ParticleInteractionBehavior = {}));\n","export var ShapeArcMode;\n(function (ShapeArcMode) {\n    /**\n     * 随机\n     */\n    ShapeArcMode[ShapeArcMode[\"RANDOM\"] = 0] = \"RANDOM\";\n    /**\n     * 单向循环\n     */\n    ShapeArcMode[ShapeArcMode[\"UNIDIRECTIONAL_CYCLE\"] = 1] = \"UNIDIRECTIONAL_CYCLE\";\n    /**\n     * 双向循环\n     */\n    ShapeArcMode[ShapeArcMode[\"BIDIRECTIONAL_CYCLE\"] = 2] = \"BIDIRECTIONAL_CYCLE\";\n    /**\n     * 均匀爆发\n     */\n    ShapeArcMode[ShapeArcMode[\"UNIFORM_BURST\"] = 3] = \"UNIFORM_BURST\";\n})(ShapeArcMode || (ShapeArcMode = {}));\n","export var LightType;\n(function (LightType) {\n    /**\n     * 点光源\n     */\n    LightType[\"point\"] = \"point\";\n    /**\n     * 聚光灯\n     */\n    LightType[\"spot\"] = \"spot\";\n    /**\n     * 方向光\n     */\n    LightType[\"directional\"] = \"directional\";\n    /**\n     * 环境光\n     */\n    LightType[\"ambient\"] = \"ambient\";\n})(LightType || (LightType = {}));\n","export var ModelBoundingType;\n(function (ModelBoundingType) {\n    ModelBoundingType[ModelBoundingType[\"box\"] = 2] = \"box\";\n    ModelBoundingType[ModelBoundingType[\"sphere\"] = 3] = \"sphere\";\n})(ModelBoundingType || (ModelBoundingType = {}));\n","export var CameraType;\n(function (CameraType) {\n    CameraType[\"orthographic\"] = \"orthographic\";\n    CameraType[\"perspective\"] = \"perspective\";\n})(CameraType || (CameraType = {}));\n","// 材质类型\nexport var MaterialType;\n(function (MaterialType) {\n    MaterialType[\"unlit\"] = \"unlit\";\n    MaterialType[\"pbr\"] = \"pbr\";\n    // 头发材质，在 pbr 材质基础上扩展\n    MaterialType[\"hair\"] = \"hair\";\n})(MaterialType || (MaterialType = {}));\n// 混合模式\nexport var MaterialBlending;\n(function (MaterialBlending) {\n    MaterialBlending[MaterialBlending[\"opaque\"] = 100] = \"opaque\";\n    MaterialBlending[MaterialBlending[\"masked\"] = 101] = \"masked\";\n    MaterialBlending[MaterialBlending[\"translucent\"] = 102] = \"translucent\";\n    MaterialBlending[MaterialBlending[\"additive\"] = 103] = \"additive\";\n})(MaterialBlending || (MaterialBlending = {}));\n","/**\n * 3D渲染模式：将渲染过程中的中间结果输出，主要用于排查渲染效果问题，支持 pbr 和 unlit 材质\n */\nexport var RenderMode3D;\n(function (RenderMode3D) {\n    /**\n     * 正常渲染\n     */\n    RenderMode3D[\"none\"] = \"none\";\n    /**\n     * 纹理坐标\n     */\n    RenderMode3D[\"uv\"] = \"uv\";\n    /**\n     * 世界坐标法线\n     */\n    RenderMode3D[\"normal\"] = \"normal\";\n    /**\n     * 基础颜色\n     */\n    RenderMode3D[\"basecolor\"] = \"basecolor\";\n    /**\n     * 基础颜色 Alpha\n     */\n    RenderMode3D[\"alpha\"] = \"alpha\";\n    /**\n     * 金属度\n     */\n    RenderMode3D[\"metallic\"] = \"metallic\";\n    /**\n     * 粗超度\n     */\n    RenderMode3D[\"roughness\"] = \"roughness\";\n    /**\n     * 环境遮蔽\n     */\n    RenderMode3D[\"ao\"] = \"ao\";\n    /**\n     * 自发光\n     */\n    RenderMode3D[\"emissive\"] = \"emissive\";\n    /**\n     * 漫反射\n     */\n    RenderMode3D[\"diffuse\"] = \"diffuse\";\n})(RenderMode3D || (RenderMode3D = {}));\n","export var TextOverflow;\n(function (TextOverflow) {\n    /**\n     * visible 模式下，文本内容超出边界框时，会继续显示内容，不进行裁剪或缩放。\n     */\n    TextOverflow[TextOverflow[\"visible\"] = 0] = \"visible\";\n    /**\n     * display 模式下，会显示所有文本，文本字号大小会根据边界框调整。\n     */\n    TextOverflow[TextOverflow[\"display\"] = 1] = \"display\";\n    /**\n     * clip 模式下，当文本内容超出边界框时，多余的会被截断。\n     */\n    TextOverflow[TextOverflow[\"clip\"] = 2] = \"clip\";\n    /**\n     * ellipsis 模式下，会使用（...）来代替超出边界框的内容。\n     */\n    TextOverflow[TextOverflow[\"ellipsis\"] = 3] = \"ellipsis\";\n})(TextOverflow || (TextOverflow = {}));\nexport var TextSizeMode;\n(function (TextSizeMode) {\n    /**\n     * 自适应宽度\n     */\n    TextSizeMode[TextSizeMode[\"autoWidth\"] = 0] = \"autoWidth\";\n    /**\n     * 自适应高度\n     */\n    TextSizeMode[TextSizeMode[\"autoHeight\"] = 1] = \"autoHeight\";\n    /**\n     * 固定宽高\n     */\n    TextSizeMode[TextSizeMode[\"fixed\"] = 2] = \"fixed\";\n})(TextSizeMode || (TextSizeMode = {}));\nexport var TextBaseline;\n(function (TextBaseline) {\n    /**\n     * 文本顶对齐。\n     */\n    TextBaseline[TextBaseline[\"top\"] = 0] = \"top\";\n    /**\n     * 文本垂直居中对齐。\n     */\n    TextBaseline[TextBaseline[\"middle\"] = 1] = \"middle\";\n    /**\n     * 文本底对齐。\n     */\n    TextBaseline[TextBaseline[\"bottom\"] = 2] = \"bottom\";\n})(TextBaseline || (TextBaseline = {}));\nexport var TextAlignment;\n(function (TextAlignment) {\n    /**\n     * text alignment starts from（x,y) to right direction\n     * 从 (x,y) 开始第一个字符，向右边延伸\n     */\n    TextAlignment[TextAlignment[\"left\"] = 0] = \"left\";\n    /**\n     * (x,y) is middle position of text, where (left + right)/2 =(x,y)\n     * (x,y) 为文字中间位置，（最左位置 + 最右位置)/2 = (x,y)\n     */\n    TextAlignment[TextAlignment[\"middle\"] = 1] = \"middle\";\n    /**\n     * text alignment ends with（x,y) from left direction\n     * 从 (x,y) 结束最后一个字符，向左边延伸\n     */\n    TextAlignment[TextAlignment[\"right\"] = 2] = \"right\";\n})(TextAlignment || (TextAlignment = {}));\nexport var TextVerticalAlign;\n(function (TextVerticalAlign) {\n    /**\n     * 文本顶对齐。\n     */\n    TextVerticalAlign[TextVerticalAlign[\"top\"] = 0] = \"top\";\n    /**\n     * 文本垂直居中对齐。\n     */\n    TextVerticalAlign[TextVerticalAlign[\"middle\"] = 1] = \"middle\";\n    /**\n     * 文本底对齐。\n     */\n    TextVerticalAlign[TextVerticalAlign[\"bottom\"] = 2] = \"bottom\";\n})(TextVerticalAlign || (TextVerticalAlign = {}));\n/**\n * 文本字重\n */\nexport var TextWeight;\n(function (TextWeight) {\n    /**\n     * 正常\n     */\n    TextWeight[\"normal\"] = \"normal\";\n    /**\n     * 粗体\n     */\n    TextWeight[\"bold\"] = \"bold\";\n    /**\n     * 瘦体\n     */\n    TextWeight[\"lighter\"] = \"lighter\";\n})(TextWeight || (TextWeight = {}));\n/**\n * 文本样式\n */\nexport var FontStyle;\n(function (FontStyle) {\n    /**\n     * 正常\n     */\n    FontStyle[\"normal\"] = \"normal\";\n    /**\n     * 斜体\n     */\n    FontStyle[\"italic\"] = \"italic\";\n    /**\n     * 倾斜体\n     */\n    FontStyle[\"oblique\"] = \"oblique\";\n})(FontStyle || (FontStyle = {}));\n","export const BuiltinObjectGUID = {\n    WhiteTexture: 'whitetexture00000000000000000000',\n    TransparentTexture: 'transparenttexture00000000000000000000',\n    PBRShader: 'pbr00000000000000000000000000000',\n    UnlitShader: 'unlit000000000000000000000000000',\n};\n","export var FillType;\n(function (FillType) {\n    FillType[FillType[\"Solid\"] = 0] = \"Solid\";\n    FillType[FillType[\"GradientLinear\"] = 1] = \"GradientLinear\";\n    FillType[FillType[\"GradientRadial\"] = 2] = \"GradientRadial\";\n    FillType[FillType[\"GradientAngular\"] = 3] = \"GradientAngular\";\n    FillType[FillType[\"Texture\"] = 4] = \"Texture\";\n})(FillType || (FillType = {}));\nexport var TexturePaintScaleMode;\n(function (TexturePaintScaleMode) {\n    TexturePaintScaleMode[TexturePaintScaleMode[\"Fill\"] = 0] = \"Fill\";\n    TexturePaintScaleMode[TexturePaintScaleMode[\"Fit\"] = 1] = \"Fit\";\n    TexturePaintScaleMode[TexturePaintScaleMode[\"Crop\"] = 2] = \"Crop\";\n    TexturePaintScaleMode[TexturePaintScaleMode[\"Tile\"] = 3] = \"Tile\";\n})(TexturePaintScaleMode || (TexturePaintScaleMode = {}));\n","/**\n * 矢量图形类型\n */\nexport var ShapePrimitiveType;\n(function (ShapePrimitiveType) {\n    /**\n     * 自定义图形\n     */\n    ShapePrimitiveType[ShapePrimitiveType[\"Custom\"] = 0] = \"Custom\";\n    /**\n     * 矩形\n     */\n    ShapePrimitiveType[ShapePrimitiveType[\"Rectangle\"] = 1] = \"Rectangle\";\n    /**\n     * 椭圆\n     */\n    ShapePrimitiveType[ShapePrimitiveType[\"Ellipse\"] = 2] = \"Ellipse\";\n    /**\n     * 多边形\n     */\n    ShapePrimitiveType[ShapePrimitiveType[\"Polygon\"] = 3] = \"Polygon\";\n    /**\n     * 星形\n     */\n    ShapePrimitiveType[ShapePrimitiveType[\"Star\"] = 4] = \"Star\";\n})(ShapePrimitiveType || (ShapePrimitiveType = {}));\n","export var LineCap;\n(function (LineCap) {\n    /** 默认值。向线条的每个末端添加平直的边缘 */\n    LineCap[LineCap[\"Butt\"] = 0] = \"Butt\";\n    /** 向线条的每个末端添加圆形线帽 */\n    LineCap[LineCap[\"Round\"] = 1] = \"Round\";\n    /** 向线条的每个末端添加正方形线帽 */\n    LineCap[LineCap[\"Square\"] = 2] = \"Square\";\n})(LineCap || (LineCap = {}));\nexport var LineJoin;\n(function (LineJoin) {\n    /** 创建圆角 */\n    LineJoin[LineJoin[\"Round\"] = 0] = \"Round\";\n    /** 创建斜角 */\n    LineJoin[LineJoin[\"Bevel\"] = 1] = \"Bevel\";\n    /** 创建尖角 */\n    LineJoin[LineJoin[\"Miter\"] = 2] = \"Miter\";\n})(LineJoin || (LineJoin = {}));\n","export var NodeDataType;\n(function (NodeDataType) {\n    NodeDataType[\"AnimationClipNodeData\"] = \"AnimationClipNodeData\";\n    NodeDataType[\"BlendNodeData\"] = \"BlendNodeData\";\n    NodeDataType[\"ApplyAdditiveNodeData\"] = \"ApplyAdditiveNodeData\";\n    NodeDataType[\"LayerBlendNodeData\"] = \"LayerBlendNodeData\";\n    NodeDataType[\"StateMachineNodeData\"] = \"StateMachineNodeData\";\n    NodeDataType[\"TransitionNodeData\"] = \"TransitionNodeData\";\n    NodeDataType[\"StateNodeData\"] = \"StateNodeData\";\n    NodeDataType[\"ConstFloatNodeData\"] = \"ConstFloatNodeData\";\n    NodeDataType[\"ConstBoolNodeData\"] = \"ConstBoolNodeData\";\n    NodeDataType[\"ControlParameterBoolNodeData\"] = \"ControlParameterBoolNodeData\";\n    NodeDataType[\"ControlParameterFloatNodeData\"] = \"ControlParameterFloatNodeData\";\n    NodeDataType[\"ControlParameterTriggerNodeData\"] = \"ControlParameterTriggerNodeData\";\n    NodeDataType[\"NotNodeData\"] = \"NotNodeData\";\n    NodeDataType[\"AndNodeData\"] = \"AndNodeData\";\n    NodeDataType[\"OrNodeData\"] = \"OrNodeData\";\n    NodeDataType[\"EqualNodeData\"] = \"EqualNodeData\";\n    NodeDataType[\"GreaterNodeData\"] = \"GreaterNodeData\";\n    NodeDataType[\"LessNodeData\"] = \"LessNodeData\";\n})(NodeDataType || (NodeDataType = {}));\n","/**\n * 动态换图类型\n * @since 1.1.0\n */\nexport var BackgroundType;\n(function (BackgroundType) {\n    BackgroundType[\"video\"] = \"video\";\n    BackgroundType[\"image\"] = \"image\";\n})(BackgroundType || (BackgroundType = {}));\n/**\n * 多媒体资源类型\n * @since 2.1.0\n */\nexport var MultimediaType;\n(function (MultimediaType) {\n    MultimediaType[\"video\"] = \"video\";\n    MultimediaType[\"audio\"] = \"audio\";\n})(MultimediaType || (MultimediaType = {}));\nexport var HevcVideoCodec;\n(function (HevcVideoCodec) {\n    HevcVideoCodec[\"L30\"] = \"hev1.1.0.L30.B0\";\n    HevcVideoCodec[\"L60\"] = \"hev1.1.0.L60.B0\";\n    HevcVideoCodec[\"L63\"] = \"hev1.1.0.L63.B0\";\n    HevcVideoCodec[\"L90\"] = \"hev1.1.0.L90.B0\";\n    HevcVideoCodec[\"L93\"] = \"hev1.1.0.L93.B0\";\n    HevcVideoCodec[\"L120\"] = \"hev1.1.0.L120.B0\";\n    HevcVideoCodec[\"L150\"] = \"hev1.1.0.L150.B0\";\n    HevcVideoCodec[\"L180\"] = \"hev1.1.0.L180.B0\";\n})(HevcVideoCodec || (HevcVideoCodec = {}));\n","export var DataType;\n(function (DataType) {\n    DataType[\"VFXItemData\"] = \"VFXItemData\";\n    // Assets\n    DataType[\"Material\"] = \"Material\";\n    DataType[\"Shader\"] = \"Shader\";\n    DataType[\"Geometry\"] = \"Geometry\";\n    DataType[\"Texture\"] = \"Texture\";\n    DataType[\"Image\"] = \"Image\";\n    DataType[\"AnimationClip\"] = \"AnimationClip\";\n    DataType[\"BinaryAsset\"] = \"BinaryAsset\";\n    // Timeline\n    DataType[\"TrackAsset\"] = \"TrackAsset\";\n    DataType[\"TimelineAsset\"] = \"TimelineAsset\";\n    DataType[\"ObjectBindingTrack\"] = \"ObjectBindingTrack\";\n    DataType[\"TransformTrack\"] = \"TransformTrack\";\n    DataType[\"SpriteColorTrack\"] = \"SpriteColorTrack\";\n    DataType[\"ActivationTrack\"] = \"ActivationTrack\";\n    DataType[\"SubCompositionTrack\"] = \"SubCompositionTrack\";\n    DataType[\"FloatPropertyTrack\"] = \"FloatPropertyTrack\";\n    DataType[\"ColorPropertyTrack\"] = \"ColorPropertyTrack\";\n    DataType[\"Vector2PropertyTrack\"] = \"Vector2PropertyTrack\";\n    DataType[\"Vector3PropertyTrack\"] = \"Vector3PropertyTrack\";\n    DataType[\"Vector4PropertyTrack\"] = \"Vector4PropertyTrack\";\n    DataType[\"TransformPlayableAsset\"] = \"TransformPlayableAsset\";\n    DataType[\"SpriteColorPlayableAsset\"] = \"SpriteColorPlayableAsset\";\n    DataType[\"ActivationPlayableAsset\"] = \"ActivationPlayableAsset\";\n    DataType[\"SubCompositionPlayableAsset\"] = \"SubCompositionPlayableAsset\";\n    DataType[\"FloatPropertyPlayableAsset\"] = \"FloatPropertyPlayableAsset\";\n    DataType[\"ColorPropertyPlayableAsset\"] = \"ColorPropertyPlayableAsset\";\n    DataType[\"Vector2PropertyPlayableAsset\"] = \"Vector2PropertyPlayableAsset\";\n    DataType[\"Vector3PropertyPlayableAsset\"] = \"Vector3PropertyPlayableAsset\";\n    DataType[\"Vector4PropertyPlayableAsset\"] = \"Vector4PropertyPlayableAsset\";\n    // Components\n    DataType[\"MeshComponent\"] = \"MeshComponent\";\n    DataType[\"SkyboxComponent\"] = \"SkyboxComponent\";\n    DataType[\"LightComponent\"] = \"LightComponent\";\n    DataType[\"CameraComponent\"] = \"CameraComponent\";\n    DataType[\"ModelPluginComponent\"] = \"ModelPluginComponent\";\n    DataType[\"TreeComponent\"] = \"TreeComponent\";\n    DataType[\"AnimationComponent\"] = \"AnimationComponent\";\n    DataType[\"SpineComponent\"] = \"SpineComponent\";\n    DataType[\"VideoComponent\"] = \"VideoComponent\";\n    DataType[\"AudioComponent\"] = \"AudioComponent\";\n    DataType[\"RichTextComponent\"] = \"RichTextComponent\";\n    DataType[\"OrientationComponent\"] = \"OrientationComponent\";\n    DataType[\"ShapeComponent\"] = \"ShapeComponent\";\n    DataType[\"SpriteComponent\"] = \"SpriteComponent\";\n    DataType[\"ParticleSystem\"] = \"ParticleSystem\";\n    DataType[\"InteractComponent\"] = \"InteractComponent\";\n    DataType[\"CameraController\"] = \"CameraController\";\n    DataType[\"PostProcessVolume\"] = \"PostProcessVolume\";\n    DataType[\"EffectComponent\"] = \"EffectComponent\";\n    DataType[\"TextComponent\"] = \"TextComponent\";\n    DataType[\"AnimationGraphAsset\"] = \"AnimationGraphAsset\";\n    DataType[\"CompositionComponent\"] = \"CompositionComponent\";\n    DataType[\"FFDComponent\"] = \"FFDComponent\";\n    DataType[\"Animator\"] = \"Animator\";\n    // Non-EffectObject\n    DataType[\"TimelineClip\"] = \"TimelineClip\";\n})(DataType || (DataType = {}));\n","export var GeometryType;\n(function (GeometryType) {\n    /**\n     * Draw single points.\n     */\n    GeometryType[GeometryType[\"POINTS\"] = 0] = \"POINTS\";\n    /**\n     * Draw lines. Each vertex connects to the one after it.\n     */\n    GeometryType[GeometryType[\"LINES\"] = 1] = \"LINES\";\n    /**\n     * Draw lines. Each set of two vertices is treated as a separate line segment.\n     */\n    GeometryType[GeometryType[\"LINE_LOOP\"] = 2] = \"LINE_LOOP\";\n    /**\n     * Draw a connected group of line segments from the first vertex to the last.\n     */\n    GeometryType[GeometryType[\"LINE_STRIP\"] = 3] = \"LINE_STRIP\";\n    /**\n     * Draw triangles. Each set of three vertices creates a separate triangle.\n     */\n    GeometryType[GeometryType[\"TRIANGLES\"] = 4] = \"TRIANGLES\";\n    /**\n     * Draw a connected strip of triangles.\n     */\n    GeometryType[GeometryType[\"TRIANGLE_STRIP\"] = 5] = \"TRIANGLE_STRIP\";\n    /**\n     * Draw a connected group of triangles. Each vertex connects to the previous and the first vertex in the fan.\n     */\n    GeometryType[GeometryType[\"TRIANGLE_FAN\"] = 6] = \"TRIANGLE_FAN\";\n})(GeometryType || (GeometryType = {}));\nexport var VertexFormatType;\n(function (VertexFormatType) {\n    VertexFormatType[VertexFormatType[\"Float16\"] = 0] = \"Float16\";\n    VertexFormatType[VertexFormatType[\"Float32\"] = 1] = \"Float32\";\n    VertexFormatType[VertexFormatType[\"Int8\"] = 2] = \"Int8\";\n    VertexFormatType[VertexFormatType[\"Int16\"] = 3] = \"Int16\";\n    VertexFormatType[VertexFormatType[\"Int32\"] = 4] = \"Int32\";\n    VertexFormatType[VertexFormatType[\"UInt8\"] = 5] = \"UInt8\";\n    VertexFormatType[VertexFormatType[\"UInt16\"] = 6] = \"UInt16\";\n    VertexFormatType[VertexFormatType[\"UInt32\"] = 7] = \"UInt32\";\n})(VertexFormatType || (VertexFormatType = {}));\nexport var IndexFormatType;\n(function (IndexFormatType) {\n    IndexFormatType[IndexFormatType[\"None\"] = -1] = \"None\";\n    IndexFormatType[IndexFormatType[\"UInt8\"] = 0] = \"UInt8\";\n    IndexFormatType[IndexFormatType[\"UInt16\"] = 1] = \"UInt16\";\n    IndexFormatType[IndexFormatType[\"UInt32\"] = 2] = \"UInt32\";\n})(IndexFormatType || (IndexFormatType = {}));\n// BINORMAL[n]\tBinormal\tfloat4\n// BLENDINDICES[n]\t混合索引\tuint\n// BLENDWEIGHT[n]\t混合权重\tFLOAT\n// COLOR[n]\t漫射和反射颜色\tfloat4\n// NORMAL[n]\t法向矢量\tfloat4\n// POSITION[n]\t对象空间中的顶点位置。\tfloat4\n// POSITIONT\t变换的顶点位置。\tfloat4\n// PSIZE[n]\t点大小\tFLOAT\n// TANGENT[n]\t正切\tfloat4\n// TEXCOORD[n]\t纹理坐标\tfloat4\n// POSITION_BS[n]\tBlend Shape 空间中的顶点位置\tfloat4\n// NORMAL_BS[n]\tBlend Shape 空间中的法向矢量\tfloat4\n// TANGENT_BS[n]\tBlend Shape 空间中的正切矢量\tfloat4\nexport var VertexBufferSemantic;\n(function (VertexBufferSemantic) {\n    VertexBufferSemantic[\"Position\"] = \"POSITION\";\n    VertexBufferSemantic[\"Uv\"] = \"TEXCOORD0\";\n    VertexBufferSemantic[\"Uv2\"] = \"TEXCOORD1\";\n    VertexBufferSemantic[\"Normal\"] = \"NORMAL\";\n    VertexBufferSemantic[\"Tangent\"] = \"TANGENT\";\n    VertexBufferSemantic[\"Color\"] = \"COLOR\";\n    VertexBufferSemantic[\"Joints\"] = \"JOINTS\";\n    VertexBufferSemantic[\"Weights\"] = \"WEIGHTS\";\n    //\n    VertexBufferSemantic[\"PositionBS0\"] = \"POSITION_BS0\";\n    VertexBufferSemantic[\"PositionBS1\"] = \"POSITION_BS1\";\n    VertexBufferSemantic[\"PositionBS2\"] = \"POSITION_BS2\";\n    VertexBufferSemantic[\"PositionBS3\"] = \"POSITION_BS3\";\n    VertexBufferSemantic[\"PositionBS4\"] = \"POSITION_BS4\";\n    VertexBufferSemantic[\"PositionBS5\"] = \"POSITION_BS5\";\n    VertexBufferSemantic[\"PositionBS6\"] = \"POSITION_BS6\";\n    VertexBufferSemantic[\"PositionBS7\"] = \"POSITION_BS7\";\n    VertexBufferSemantic[\"NormalBS0\"] = \"NORMAL_BS0\";\n    VertexBufferSemantic[\"NormalBS1\"] = \"NORMAL_BS1\";\n    VertexBufferSemantic[\"NormalBS2\"] = \"NORMAL_BS2\";\n    VertexBufferSemantic[\"NormalBS3\"] = \"NORMAL_BS3\";\n    VertexBufferSemantic[\"TangentBS0\"] = \"TANGENT_BS0\";\n    VertexBufferSemantic[\"TangentBS1\"] = \"TANGENT_BS1\";\n    VertexBufferSemantic[\"TangentBS2\"] = \"TANGENT_BS2\";\n    VertexBufferSemantic[\"TangentBS3\"] = \"TANGENT_BS3\";\n})(VertexBufferSemantic || (VertexBufferSemantic = {}));\n","import { JSONSceneVersion } from './scene';\nexport * from './type';\nexport * from './composition';\nexport * from './texture';\nexport * from './constants';\nexport * from './number-expression';\nexport * from './scene';\nexport * from './math';\nexport * from './item';\nexport * from './item/base-item';\nexport * from './item/camera-item';\nexport * from './item/composition-item';\nexport * from './item/interact-item';\nexport * from './item/null-item';\nexport * from './item/particle-item';\nexport * from './item/particle-shape';\nexport * from './item/plugin-item';\nexport * from './item/sprite-item';\nexport * from './item/spine-item';\nexport * from './item/effect-item';\nexport * from './item/text-item';\nexport * from './item/rich-text-item';\nexport * from './item/video-item';\nexport * from './item/audio-item';\nexport * from './item/model';\nexport * from './vfx-item-data';\nexport * from './animation-clip-data';\nexport * from './binary';\nexport * from './text';\nexport * from './components';\nexport * from './buitin-object-guid';\nexport * from './shape';\nexport * from './animation-graph';\nexport * from './timeline';\nexport * from './assets';\nexport * from './render-settings';\nexport * from './curve-data';\nexport * from './data-type';\nexport * from './effects-object-data';\nexport * from './material-data';\nexport * from './geometry-data';\nexport * from './shader-data';\nexport * from './effects-package-data';\nexport const LATEST_VERSION = JSONSceneVersion.LATEST;\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 type { Constructor } from './utils';\n\ntype PropertyDescriptor = { type?: Constructor, sourceName?: string };\ntype SerializableMemberStoreType = Map<Function, Record<string | symbol, PropertyDescriptor>>;\n\nconst decoratorInitialStore: SerializableMemberStoreType = new Map();\nconst mergedStore: SerializableMemberStoreType = new Map();\n\nexport const effectsClassStore: Record<string, any> = {};\n\nexport function getClass (className: string) {\n  return effectsClassStore[className];\n}\n\nexport function effectsClass (className: string) {\n  return (target: Object, context?: unknown) => {\n    if (effectsClassStore[className]) {\n      console.warn(`Class ${className} is already registered.`);\n    }\n    // TODO: three修改json dataType, 这边重复注册直接 return\n    effectsClassStore[className] = target;\n  };\n}\n\nexport function serialize (type?: Constructor, sourceName?: string) {\n  return generateSerializableMember(type, sourceName); // value member\n}\n\nexport function getMergedStore (target: Object): Record<string, any> | undefined {\n  const classKey = target.constructor;\n\n  if (mergedStore.get(classKey)) {\n    return mergedStore.get(classKey);\n  }\n\n  const store: Record<string | symbol, PropertyDescriptor> = {};\n\n  mergedStore.set(classKey, store);\n\n  let currentTarget = target;\n  let currentKey = classKey;\n\n  while (currentKey) {\n    const initialStore = decoratorInitialStore.get(currentKey);\n\n    for (const property in initialStore) {\n      store[property] = initialStore[property];\n    }\n\n    const parent = Object.getPrototypeOf(currentTarget);\n\n    currentKey = Object.getPrototypeOf(parent).constructor;\n    if (currentKey === Object) {\n      break;\n    }\n    currentTarget = parent;\n  }\n\n  return store;\n}\n\nfunction generateSerializableMember (type?: Constructor, sourceName?: string) {\n  return (target: Object, propertyKey: string | symbol) => {\n    const classStore = getDirectStore(target);\n\n    if (!classStore) {\n      return;\n    }\n    if (!classStore[propertyKey]) {\n      classStore[propertyKey] = { type, sourceName };\n    }\n  };\n}\n\nfunction getDirectStore (target: Object) {\n  const classKey = target.constructor;\n\n  if (!decoratorInitialStore.get(classKey)) {\n    decoratorInitialStore.set(classKey, {});\n  }\n\n  return decoratorInitialStore.get(classKey);\n}\n\n","import type * as spec from '@galacean/effects-specification';\nimport type { Engine } from './engine';\nimport { generateGUID } from './utils';\n\n/**\n * @since 2.0.0\n */\nexport abstract class EffectsObject {\n  /**\n   *\n   * @param obj\n   * @returns\n   */\n  static is (obj: unknown): obj is EffectsObject {\n    return obj instanceof EffectsObject && 'guid' in obj;\n  }\n\n  protected guid: string;\n  /**\n   * 存储需要序列化的数据\n   */\n  defination: Record<string, any>;\n\n  /**\n   *\n   * @param engine\n   */\n  constructor (\n    public engine: Engine,\n  ) {\n    this.guid = generateGUID();\n    this.defination = {};\n    this.engine.addInstance(this);\n  }\n\n  /**\n   *\n   * @returns\n   */\n  getInstanceId () {\n    return this.guid;\n  }\n\n  /**\n   *\n   * @param guid\n   */\n  setInstanceId (guid: string) {\n    this.engine.removeInstance(this.guid);\n    this.guid = guid;\n    this.engine.addInstance(this);\n  }\n\n  /**\n   *\n   */\n  toData () { }\n\n  /**\n   * 反序列化函数\n   *\n   * @param data - 对象的序列化的数据\n   */\n  fromData (data: spec.EffectsObjectData) {\n    if (data.id !== undefined) {\n      this.setInstanceId(data.id);\n    }\n  }\n\n  /**\n   * 销毁当前对象\n   */\n  dispose () {\n    this.engine.removeInstance(this.guid);\n  }\n}\n","import type { AnimationClip } from '../../animation/animation-clip';\n\nexport class GraphDataSet {\n  resources: AnimationClip[] = [];\n\n  getResource (index: number): AnimationClip | null {\n    return this.resources[index];\n  }\n}","import type { Constructor } from '../../utils';\n\nconst nodeDataClassStore: Record<string, any> = {};\n\nexport function nodeDataClass (className: string) {\n  return (target: Object, context?: unknown) => {\n    if (nodeDataClassStore[className]) {\n      console.warn(`NodeData Class ${className} is already registered.`);\n    }\n    nodeDataClassStore[className] = target;\n  };\n}\n\nexport function getNodeDataClass<T> (className: string): Constructor<T> | null {\n  return nodeDataClassStore[className];\n}\n","import type * as spec from '@galacean/effects-specification';\nimport type { GraphContext, InstantiationContext } from './graph-context';\nimport type { PoseResult } from './pose-result';\n\nexport const InvalidIndex = -1;\n\nexport class GraphNode {\n  /**\n   * @internal\n   */\n  asset: GraphNodeData;\n\n  private initializationCount = 0;\n  private lastUpdateID = -1;\n\n  constructor () {\n  }\n\n  getNodeData<T extends GraphNodeData> (): T {\n    return this.asset as T;\n  }\n\n  isValid () {\n    return true;\n  }\n\n  isInitialized (): boolean {\n    return this.initializationCount > 0;\n  }\n\n  initialize (context: GraphContext) {\n    if (this.isInitialized()) {\n      this.initializationCount++;\n    } else {\n      this.initializeInternal(context);\n    }\n  }\n\n  /**\n   * Shutdown this node\n   */\n  shutdown (context: GraphContext): void {\n    if (!this.isInitialized()) {\n      throw new Error('Node not initialized!');\n    }\n\n    if (--this.initializationCount === 0) {\n      this.shutdownInternal(context);\n    }\n  }\n\n  isNodeActive (updateID: number) {\n    return this.lastUpdateID === updateID;\n  }\n\n  isUpdated (context: GraphContext) {\n    return this.isNodeActive(context.updateID);\n  }\n\n  /**\n   * Mark this node as active for the current update\n   */\n  markNodeActive (context: GraphContext): void {\n    this.lastUpdateID = context.updateID;\n  }\n\n  /**\n   * Internal initialization logic\n   */\n  protected initializeInternal (context: GraphContext) {\n    this.initializationCount++;\n  }\n\n  /**\n   * Internal shutdown logic\n   */\n  protected shutdownInternal (context: GraphContext): void {\n    if (this.isInitialized()) {\n      throw new Error('Node still initialized!');\n    }\n    this.lastUpdateID = -1;\n  }\n}\n\nexport abstract class GraphNodeData {\n  index: number;\n\n  abstract instantiate (context: InstantiationContext): void;\n\n  load (data: spec.GraphNodeData) {\n    this.index = data.index;\n  }\n\n  protected createNode<T extends GraphNode> (nodeType: new () => T, context: InstantiationContext) {\n    const node = new nodeType();\n\n    context.nodes[this.index] = node;\n    node.asset = this;\n\n    return node;\n  }\n}\n\nexport interface PoseNodeDebugInfo {\n  duration: number,\n  currentTime: number,\n  previousTime: number,\n}\n\nexport abstract class PoseNode extends GraphNode {\n  protected duration: number = 0;\n  protected previousTime: number = 0;\n  protected currentTime: number = 0;\n\n  /**\n   * Get current clamped percentage over the duration\n   */\n  getCurrentTime (): number {\n    return this.currentTime;\n  }\n\n  /**\n   * Get previous clamped percentage over the duration\n   */\n  getPreviousTime (): number {\n    return this.previousTime;\n  }\n\n  /**\n   * Get node duration\n   */\n  getDuration (): number {\n    return this.duration;\n  }\n\n  getDebugInfo (): PoseNodeDebugInfo {\n    const info: PoseNodeDebugInfo = {\n      duration: this.duration,\n      currentTime:  this.currentTime,\n      previousTime: this.previousTime,\n    };\n\n    return info;\n  }\n\n  abstract evaluate (context: GraphContext, result: PoseResult): PoseResult;\n\n  protected override initializeInternal (context: GraphContext): void {\n    super.initializeInternal(context);\n\n    // Reset node state\n    this.previousTime = 0;\n    this.currentTime = this.previousTime;\n\n    // Set the duration to 0 even though this is an invalid value as it is expected that nodes will set this correctly at initialization time\n    this.duration = 0;\n  }\n}\n\nexport abstract class ValueNode extends GraphNode {\n\n  setValue <T>(value: T) {\n    // OVERRIDE\n  }\n\n  abstract getValue<T>(context: GraphContext): T;\n}\n\nexport abstract class FloatValueNode extends ValueNode {\n\n}\n\nexport abstract class BoolValueNode extends ValueNode {\n\n}","import type * as spec from '@galacean/effects-specification';\nimport { effectsClass } from '../../decorators';\nimport { EffectsObject } from '../../effects-object';\nimport { GraphDataSet } from './graph-data-set';\nimport { getNodeDataClass } from './node-asset-type';\nimport { InvalidIndex, type GraphNodeData } from './graph-node';\nimport type { AnimationClip } from '../../animation/animation-clip';\n\n@effectsClass('AnimationGraphAsset')\nexport class AnimationGraphAsset extends EffectsObject {\n  nodeDatas: GraphNodeData[] = [];\n  graphDataSet = new GraphDataSet();\n  controlParameterIDs: string[] = [];\n  parameterLookupMap = new Map<string, number>();\n  rootNodeIndex = InvalidIndex;\n\n  static createNodeData (type: spec.NodeDataType) {\n    const classConstructor = getNodeDataClass<GraphNodeData>(type);\n\n    if (classConstructor) {\n      return new classConstructor();\n    } else {\n      throw new Error(`Unknown node type: ${type}.`);\n    }\n  }\n\n  override fromData (data: spec.AnimationGraphAssetData) {\n    const graphAssetData = data;\n    const nodeDatas = graphAssetData.nodeDatas;\n\n    this.rootNodeIndex = graphAssetData.rootNodeIndex;\n    this.controlParameterIDs = graphAssetData.controlParameterIDs;\n\n    // Create parameter lookup map\n    //-------------------------------------------------------------------------\n    const numControlParameters = graphAssetData.controlParameterIDs.length;\n\n    for (let i = 0; i < numControlParameters; i++) {\n      this.parameterLookupMap.set(graphAssetData.controlParameterIDs[i], i);\n    }\n\n    // Deserialize node asset\n    //-------------------------------------------------------------------------\n    this.nodeDatas = [];\n\n    for (let i = 0; i < nodeDatas.length; i++) {\n      this.nodeDatas[i] = AnimationGraphAsset.createNodeData(nodeDatas[i].type as spec.NodeDataType);\n      this.nodeDatas[i].load(nodeDatas[i]);\n    }\n\n    // Deserialize graph data set\n    //-------------------------------------------------------------------------\n    this.graphDataSet = new GraphDataSet();\n    this.graphDataSet.resources = [];\n    for (const animationClipData of graphAssetData.graphDataSet.resources) {\n      const animationClip = this.engine.findObject<AnimationClip>(animationClipData);\n\n      this.graphDataSet.resources.push(animationClip);\n    }\n  }\n}\n","import type { GraphDataSet } from './graph-data-set';\nimport type { GraphNode, GraphNodeData } from './graph-node';\nimport type { Skeleton } from './skeleton';\n\n// Used to signify if a node or node output is coming from an active state (i.e. a state we are not transitioning away from)\nexport enum BranchState {\n  Active,\n  Inactive,\n}\n\nexport class GraphContext {\n  deltaTime = 0;\n  updateID = 0;\n  skeleton: Skeleton;\n  branchState = BranchState.Active;\n\n  update (deltaTime: number) {\n    this.deltaTime = deltaTime;\n    this.updateID++;\n    this.branchState = BranchState.Active;\n  }\n}\n\nexport class InstantiationContext {\n  nodeDatas: GraphNodeData[] = [];\n  nodes: GraphNode[] = [];\n  dataSet: GraphDataSet;\n\n  getNode<T extends GraphNode> (index: number): T {\n    if (this.nodes[index]) {\n      return this.nodes[index] as T;\n    }\n    if (!this.nodeDatas[index]) {\n      return null as unknown as T;\n    }\n    this.nodeDatas[index].instantiate(this);\n\n    return this.nodes[index] as T;\n  }\n}\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 { clamp } from '@galacean/effects-math/es/core/utils';\nimport * as spec from '@galacean/effects-specification';\nimport type { GraphContext, InstantiationContext } from '../graph-context';\nimport { GraphNodeData, PoseNode } from '../graph-node';\nimport { nodeDataClass } from '../node-asset-type';\nimport type { PoseResult } from '../pose-result';\nimport type { Skeleton } from '../skeleton';\nimport type { Pose } from '../pose';\nimport type { AnimationClip, AnimationCurve, FloatAnimationCurve, ColorAnimationCurve } from '../../../animation';\n\n@nodeDataClass(spec.NodeDataType.AnimationClipNodeData)\nexport class AnimationClipNodeData extends GraphNodeData {\n  playRate = 1.0;\n  loopAnimation = true;\n  dataSlotIndex = -1;\n\n  override instantiate (context: InstantiationContext) {\n    const node = this.createNode(AnimationClipNode, context);\n\n    node.animation = context.dataSet.getResource(this.dataSlotIndex);\n  }\n\n  override load (data: spec.AnimationClipNodeData): void {\n    super.load(data);\n\n    const fullData = {\n      playRate: 1.0,\n      loopAnimation: true,\n      ...data,\n    };\n\n    this.dataSlotIndex = data.dataSlotIndex;\n    this.playRate = fullData.playRate;\n    this.loopAnimation = fullData.loopAnimation;\n  }\n}\n\nexport class AnimationClipNode extends PoseNode {\n  animation: AnimationClip | null = null;\n\n  private animatable: Animatable | null = null;\n\n  override evaluate (context: GraphContext, result: PoseResult): PoseResult {\n    if (!this.animatable) {\n      return result;\n    }\n\n    this.markNodeActive(context);\n\n    const nodeData = this.getNodeData<AnimationClipNodeData>();\n\n    this.previousTime = this.currentTime;\n    this.currentTime = this.previousTime + context.deltaTime / this.duration * nodeData.playRate;\n\n    if (!nodeData.loopAnimation) {\n      this.currentTime = clamp(this.currentTime, 0, 1);\n    } else {\n      if (this.currentTime > 1) {\n        this.currentTime = this.currentTime % 1;\n      }\n    }\n\n    const time = this.currentTime * this.duration;\n\n    this.animatable.getPose(time, result.pose);\n\n    return result;\n  }\n\n  protected override initializeInternal (context: GraphContext): void {\n    super.initializeInternal(context);\n    this.duration = this.animation?.duration ?? 0;\n    this.previousTime = this.currentTime = 0;\n\n    if (this.animation) {\n      this.animatable = new Animatable(context.skeleton, this.animation);\n    }\n  }\n}\n\nenum TransformCurveType {\n  Position,\n  Scale,\n  Rotation,\n  Euler\n}\n\nexport interface TransformCurveInfo {\n  type: TransformCurveType,\n  curve: AnimationCurve,\n  boneIndex: number,\n}\n\nexport interface FloatCurveInfo {\n  curve: FloatAnimationCurve,\n  animatedObjectIndex: number,\n}\n\nexport interface ColorCurveInfo {\n  curve: ColorAnimationCurve,\n  animatedObjectIndex: number,\n}\n\nexport class Animatable {\n  private transformCurveInfos: TransformCurveInfo[] = [];\n\n  private floatCurveInfos: FloatCurveInfo[] = [];\n  private colorCurveInfos: ColorCurveInfo[] = [];\n\n  constructor (\n    private skeleton: Skeleton,\n    private animationClip: AnimationClip,\n  ) {\n    for (const curve of animationClip.positionCurves) {\n      this.addTransformCurveInfo(curve, TransformCurveType.Position);\n    }\n    for (const curve of animationClip.scaleCurves) {\n      this.addTransformCurveInfo(curve, TransformCurveType.Scale);\n    }\n    for (const curve of animationClip.rotationCurves) {\n      this.addTransformCurveInfo(curve, TransformCurveType.Rotation);\n    }\n    for (const curve of animationClip.eulerCurves) {\n      this.addTransformCurveInfo(curve, TransformCurveType.Euler);\n    }\n    for (const curve of animationClip.floatCurves) {\n      this.addFloatCurveInfo(curve);\n    }\n    for (const curve of animationClip.colorCurves) {\n      this.addColorCurveInfo(curve);\n    }\n  }\n\n  getPose (time: number, outPose: Pose) {\n    const life = clamp(time, 0, this.animationClip.duration);\n\n    for (const curveInfo of this.transformCurveInfos) {\n      const curveValue = curveInfo.curve.keyFrames.getValue(life);\n      const outTransform = outPose.parentSpaceTransforms[curveInfo.boneIndex];\n\n      switch (curveInfo.type) {\n        case TransformCurveType.Position:\n          outTransform.position.copyFrom(curveValue);\n\n          break;\n        case TransformCurveType.Scale:\n          outTransform.scale.copyFrom(curveValue);\n\n          break;\n        case TransformCurveType.Rotation:\n          outTransform.rotation.copyFrom(curveValue);\n\n          break;\n        case TransformCurveType.Euler:\n          outTransform.euler.copyFrom(curveValue);\n\n          break;\n      }\n    }\n\n    for (const curveInfo of this.floatCurveInfos) {\n      const floatValue = curveInfo.curve.keyFrames.getValue(life);\n\n      outPose.floatPropertyValues[curveInfo.animatedObjectIndex] = floatValue;\n    }\n\n    for (const curveInfo of this.colorCurveInfos) {\n      const colorValue = curveInfo.curve.keyFrames.getValue(life);\n\n      outPose.colorPropertyValues[curveInfo.animatedObjectIndex] = colorValue;\n    }\n  }\n\n  private addTransformCurveInfo (curve: AnimationCurve, type: TransformCurveType) {\n    const boneIndex = this.skeleton.pathToBoneIndex.get(curve.path);\n\n    if (boneIndex !== undefined) {\n      this.transformCurveInfos.push({\n        curve,\n        boneIndex,\n        type,\n      });\n    }\n  }\n\n  private addFloatCurveInfo (curve: FloatAnimationCurve) {\n    const animatedObjectIndex = this.skeleton.pathToObjectIndex.get(curve.path + curve.className + curve.property);\n\n    if (animatedObjectIndex !== undefined) {\n      this.floatCurveInfos.push({\n        curve,\n        animatedObjectIndex,\n      });\n    }\n  }\n\n  private addColorCurveInfo (curve: ColorAnimationCurve) {\n    const animatedObjectIndex = this.skeleton.pathToObjectIndex.get(curve.path + curve.className + curve.property);\n\n    if (animatedObjectIndex !== undefined) {\n      this.colorCurveInfos.push({\n        curve,\n        animatedObjectIndex,\n      });\n    }\n  }\n}\n","import { clamp } from './utils';\nimport { Vector3 } from './vector3';\n/**\n * 四元数\n */\nexport class Quaternion {\n    x;\n    y;\n    z;\n    w;\n    static tempVec0 = new Vector3();\n    /**\n     * 构造函数\n     * @param [x=0] - x 分量\n     * @param [y=0] - y 分量\n     * @param [z=0] - z 分量\n     * @param [w=1] - w 分量\n     */\n    constructor(x = 0, y = 0, z = 0, w = 1) {\n        this.x = x;\n        this.y = y;\n        this.z = z;\n        this.w = w;\n    }\n    /**\n     * 四元数设置\n     * @param x - x 分量\n     * @param y - y 分量\n     * @param z - z 分量\n     * @param w - w 分量\n     * @returns 四元数\n     */\n    set(x, y, z, w) {\n        this.x = x;\n        this.y = y;\n        this.z = z;\n        this.w = w;\n        return this;\n    }\n    /**\n     * 通过欧拉角设置四元数\n     * @param euler - 欧拉角\n     * @returns\n     */\n    setFromEuler(euler) {\n        euler.toQuaternion(this);\n        return this;\n    }\n    /**\n     * 通过旋转轴和旋转角度设置四元数\n     * @param axis - 旋转轴\n     * @param angle - 旋转角度（弧度）\n     * @returns\n     */\n    setFromAxisAngle(axis, angle) {\n        const halfAngle = angle / 2;\n        const s = Math.sin(halfAngle);\n        const v = Quaternion.tempVec0;\n        v.copyFrom(axis).normalize();\n        this.x = v.x * s;\n        this.y = v.y * s;\n        this.z = v.z * s;\n        this.w = Math.cos(halfAngle);\n        return this;\n    }\n    /**\n     * 通过 Vector4Like 创建四元数\n     * @param v - Vector4Like\n     * @returns\n     */\n    setFromVector4(v) {\n        this.x = v.x;\n        this.y = v.y;\n        this.z = v.z;\n        this.w = v.w;\n        return this;\n    }\n    /**\n     * 通过数组设置四元数\n     * @param array - 数组\n     * @param [offset=0] - 起始偏移值\n     * @returns\n     */\n    setFromArray(array, offset = 0) {\n        this.x = array[offset];\n        this.y = array[offset + 1];\n        this.z = array[offset + 2];\n        this.w = array[offset + 3];\n        return this;\n    }\n    /**\n     * 通过矩阵设置四元数\n     * @param m - 矩阵\n     * @returns\n     */\n    setFromRotationMatrix(m) {\n        // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n        // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n        const te = m.elements;\n        const m11 = te[0];\n        const m12 = te[4];\n        const m13 = te[8];\n        const m21 = te[1];\n        const m22 = te[5];\n        const m23 = te[9];\n        const m31 = te[2];\n        const m32 = te[6];\n        const m33 = te[10];\n        const trace = m11 + m22 + m33;\n        if (trace > 0) {\n            const s = 0.5 / Math.sqrt(trace + 1.0);\n            this.w = 0.25 / s;\n            this.x = (m32 - m23) * s;\n            this.y = (m13 - m31) * s;\n            this.z = (m21 - m12) * s;\n        }\n        else if (m11 > m22 && m11 > m33) {\n            const s = 2.0 * Math.sqrt(1.0 + m11 - m22 - m33);\n            this.w = (m32 - m23) / s;\n            this.x = 0.25 * s;\n            this.y = (m12 + m21) / s;\n            this.z = (m13 + m31) / s;\n            this.negate();\n        }\n        else if (m22 > m33) {\n            const s = 2.0 * Math.sqrt(1.0 + m22 - m11 - m33);\n            this.w = (m13 - m31) / s;\n            this.x = (m12 + m21) / s;\n            this.y = 0.25 * s;\n            this.z = (m23 + m32) / s;\n            this.negate();\n        }\n        else {\n            const s = 2.0 * Math.sqrt(1.0 + m33 - m11 - m22);\n            this.w = (m21 - m12) / s;\n            this.x = (m13 + m31) / s;\n            this.y = (m23 + m32) / s;\n            this.z = 0.25 * s;\n            this.negate();\n        }\n        // 兼容原先数学库\n        return this;\n    }\n    /**\n     * 通过开始和结束向量设置四元数\n     * @param from - 开始向量\n     * @param to - 结束向量\n     * @returns\n     */\n    setFromUnitVectors(from, to) {\n        // assumes direction vectors vFrom and vTo are normalized\n        let r = from.dot(to) + 1;\n        if (r < Number.EPSILON) {\n            r = 0;\n            if (Math.abs(from.x) > Math.abs(from.z)) {\n                this.x = -from.y;\n                this.y = from.x;\n                this.z = 0;\n                this.w = r;\n            }\n            else {\n                this.x = 0;\n                this.y = -from.z;\n                this.z = from.y;\n                this.w = r;\n            }\n        }\n        else {\n            this.x = from.y * to.z - from.z * to.y;\n            this.y = from.z * to.x - from.x * to.z;\n            this.z = from.x * to.y - from.y * to.x;\n            this.w = r;\n        }\n        return this.normalize();\n    }\n    /**\n     * 四元数拷贝\n     * @param quat - 拷贝目标四元数\n     * @returns 拷贝四元数\n     */\n    copyFrom(quat) {\n        this.x = quat.x;\n        this.y = quat.y;\n        this.z = quat.z;\n        this.w = quat.w;\n        return this;\n    }\n    /**\n     * 四元数克隆\n     * @returns 克隆结果\n     */\n    clone() {\n        return new Quaternion(this.x, this.y, this.z, this.w);\n    }\n    /**\n     * 四元数间的夹角计算\n     * @param other - 其他四元数\n     * @returns 夹角\n     */\n    angleTo(other) {\n        return 2 * Math.acos(Math.abs(clamp(this.dot(other), -1, 1)));\n    }\n    /**\n     * 四元数向目标旋转\n     * @param q - 四元数\n     * @param step - 旋转弧度\n     * @returns 目标四元数\n     */\n    rotateTowards(q, step) {\n        const angle = this.angleTo(q);\n        if (angle === 0) {\n            return this;\n        }\n        const t = Math.min(1, step / angle);\n        this.slerp(q, t);\n        return this;\n    }\n    /**\n     * 四元数单位化\n     * @returns 单位四元数\n     */\n    identity() {\n        return this.set(0, 0, 0, 1);\n    }\n    /**\n     * 四元数求逆\n     * @returns 四元数的逆\n     */\n    invert() {\n        return this.conjugate();\n    }\n    /**\n     * 四元数取负\n     * @returns 负四元数\n     */\n    negate() {\n        this.x = -this.x;\n        this.y = -this.y;\n        this.z = -this.z;\n        this.w = -this.w;\n        return this;\n    }\n    /**\n     * 四元数求共轭值\n     * @returns 四元数的共轭值\n     */\n    conjugate() {\n        this.x = -this.x;\n        this.y = -this.y;\n        this.z = -this.z;\n        return this;\n    }\n    /**\n     * 四元数点乘结果\n     * @param v\n     * @return\n     */\n    dot(v) {\n        return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n    }\n    /**\n     * 四元数的模平方\n     * @return\n     */\n    lengthSquared() {\n        return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n    }\n    /**\n     * 四元数的欧式长度\n     * @returns 长度\n     */\n    length() {\n        return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\n    }\n    /**\n     * 四元数归一化\n     * @returns 归一化值\n     */\n    normalize() {\n        let l = this.length();\n        if (l === 0) {\n            this.x = 0;\n            this.y = 0;\n            this.z = 0;\n            this.w = 1;\n        }\n        else {\n            l = 1 / l;\n            this.x = this.x * l;\n            this.y = this.y * l;\n            this.z = this.z * l;\n            this.w = this.w * l;\n        }\n        return this;\n    }\n    /**\n     * 四元数右乘\n     * @param right - 右乘的四元数\n     * @returns\n     */\n    multiply(right) {\n        return this.multiplyQuaternions(this, right);\n    }\n    /**\n     * 四元数左乘\n     * @param left - 左乘的四元数\n     * @returns\n     */\n    premultiply(left) {\n        return this.multiplyQuaternions(left, this);\n    }\n    /**\n     * 四元数乘法\n     * @param left - 四元数\n     * @param right - 四元数\n     * @returns 四元数\n     */\n    multiplyQuaternions(left, right) {\n        // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n        const qax = left.x;\n        const qay = left.y;\n        const qaz = left.z;\n        const qaw = left.w;\n        const qbx = right.x;\n        const qby = right.y;\n        const qbz = right.z;\n        const qbw = right.w;\n        this.x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n        this.y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n        this.z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n        this.w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n        return this;\n    }\n    /**\n     * 四元数线性插值\n     * @see http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n     * @param other - 四元数\n     * @param t - 插值比\n     * @returns 插值结果\n     */\n    slerp(other, t) {\n        if (t === 0) {\n            return this;\n        }\n        if (t === 1) {\n            return this.copyFrom(other);\n        }\n        const { x, y, z, w } = this;\n        let cosHalfTheta = w * other.w + x * other.x + y * other.y + z * other.z;\n        if (cosHalfTheta < 0) {\n            this.w = -other.w;\n            this.x = -other.x;\n            this.y = -other.y;\n            this.z = -other.z;\n            cosHalfTheta = -cosHalfTheta;\n        }\n        else {\n            this.copyFrom(other);\n        }\n        if (cosHalfTheta >= 1.0) {\n            this.w = w;\n            this.x = x;\n            this.y = y;\n            this.z = z;\n            return this;\n        }\n        const sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;\n        if (sqrSinHalfTheta <= Number.EPSILON) {\n            const s = 1 - t;\n            this.w = s * w + t * this.w;\n            this.x = s * x + t * this.x;\n            this.y = s * y + t * this.y;\n            this.z = s * z + t * this.z;\n            this.normalize();\n            return this;\n        }\n        const sinHalfTheta = Math.sqrt(sqrSinHalfTheta);\n        const halfTheta = Math.atan2(sinHalfTheta, cosHalfTheta);\n        const ratioA = Math.sin((1 - t) * halfTheta) / sinHalfTheta;\n        const ratioB = Math.sin(t * halfTheta) / sinHalfTheta;\n        this.w = (w * ratioA + this.w * ratioB);\n        this.x = (x * ratioA + this.x * ratioB);\n        this.y = (y * ratioA + this.y * ratioB);\n        this.z = (z * ratioA + this.z * ratioB);\n        return this;\n    }\n    /**\n     * 两个四元数的线性插值\n     * @param qa - 四元数\n     * @param qb - 四元数\n     * @param t - 插值比\n     */\n    slerpQuaternions(qa, qb, t) {\n        this.copyFrom(qa).slerp(qb, t);\n    }\n    /**\n     * 通过四元数旋转向量\n     * @param v - 待旋转向量\n     * @param [out] - 旋转结果，如果没有传入直接覆盖输入值\n     * @returns\n     */\n    rotateVector3(v, out) {\n        const { x: qx, y: qy, z: qz, w: qw } = this;\n        const { x: vx, y: vy, z: vz } = v;\n        const ix = qw * vx + qy * vz - qz * vy;\n        const iy = qw * vy + qz * vx - qx * vz;\n        const iz = qw * vz + qx * vy - qy * vx;\n        const iw = -qx * vx - qy * vy - qz * vz;\n        const res = out ?? v;\n        res.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n        res.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n        res.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n        return res;\n    }\n    /**\n     * 四元数判等\n     * @param quaternion - 四元数\n     * @returns 判等结果\n     */\n    equals(quaternion) {\n        return quaternion.x === this.x\n            && quaternion.y === this.y\n            && quaternion.z === this.z\n            && quaternion.w === this.w;\n    }\n    /**\n     * 四元数保存为数组\n     * @returns\n     */\n    toArray() {\n        return [this.x, this.y, this.z, this.w];\n    }\n    /**\n     * 四元数转四维向量数组\n     * @param vec - 目标保存对象\n     * @returns 保存结果\n     */\n    toVector4(vec) {\n        return vec.set(this.x, this.y, this.z, this.w);\n    }\n    /**\n     * 四元数转欧拉角\n     * @param euler - 目标欧拉角\n     * @returns 欧拉角\n     */\n    toEuler(euler) {\n        return euler.setFromQuaternion(this);\n    }\n    /**\n     * 四元数转矩阵\n     * @param mat - 目标矩阵\n     * @returns\n     */\n    toMatrix4(mat) {\n        return mat.compose(Vector3.ZERO, this, Vector3.ONE);\n    }\n    /**\n     * 通过欧拉角创建四元数\n     * @param euler - 欧拉角\n     * @returns 四元数\n     */\n    static fromEuler(euler) {\n        return new Quaternion().setFromEuler(euler);\n    }\n    /**\n     * 通过旋转轴和旋转角度创建四元数\n     * @param axis - 旋转轴\n     * @param angle - 旋转角（弧度值）\n     * @returns 四元数\n     */\n    static fromAxisAngle(axis, angle) {\n        return new Quaternion().setFromAxisAngle(axis, angle);\n    }\n    /**\n     * 通过 Vector4Like 创建四元数\n     * @param v - Vector4Like\n     * @returns 四元数\n     */\n    static fromVector4(v) {\n        return new Quaternion().setFromVector4(v);\n    }\n    /**\n     * 通过数组创建四元数\n     * @param array - 数组\n     * @param [offset=0] - 起始偏移值\n     * @returns 四元数\n     */\n    static fromArray(array, offset = 0) {\n        return new Quaternion().setFromArray(array, offset);\n    }\n    /**\n     * 通过旋转矩阵创建四元数\n     * @param m - 旋转矩阵\n     * @returns 四元数\n     */\n    static fromRotationMatrix(m) {\n        return new Quaternion().setFromRotationMatrix(m);\n    }\n    /**\n     * 通过开始和结束向量创建四元数\n     * @param from - 开始向量\n     * @param to - 结束向量\n     * @returns\n     */\n    static fromUnitVectors(from, to) {\n        return new Quaternion().setFromUnitVectors(from, to);\n    }\n}\n","import type { Color, Vector3 } from '@galacean/effects-math/es/core';\nimport { Quaternion } from '@galacean/effects-math/es/core/quaternion';\nimport type { Pose } from './pose';\n\nconst tempQuaternion = new Quaternion();\n\nexport abstract class BlendFunction {\n  abstract blendVector3 (source: Vector3, target: Vector3, weight: number, result: Vector3): void;\n  abstract blendQuaternion (source: Quaternion, target: Quaternion, weight: number, result: Quaternion): void;\n  abstract blendEuler (source: Vector3, target: Vector3, weight: number, result: Vector3): void;\n  abstract blendColor (source: Color, target: Color, weight: number, result: Color): void;\n  abstract blendFloat (source: number, target: number, weight: number): number;\n}\n\nexport class NormalBlend extends BlendFunction {\n  override blendVector3 (source: Vector3, target: Vector3, weight: number, result: Vector3): void {\n    result.x = source.x + (target.x - source.x) * weight;\n    result.y = source.y + (target.y - source.y) * weight;\n    result.z = source.z + (target.z - source.z) * weight;\n  }\n\n  override blendQuaternion (source: Quaternion, target: Quaternion, weight: number, result: Quaternion): void {\n    result.copyFrom(source).slerp(target, weight);\n  }\n\n  override blendEuler (source: Vector3, target: Vector3, weight: number, result: Vector3): void {\n    this.lerpEuler(source, target, weight, result);\n  }\n\n  override blendFloat (source: number, target: number, weight: number): number {\n    return source + (target - source) * weight;\n  }\n\n  override blendColor (source: Color, target: Color, weight: number, result: Color): void {\n    result.r = source.r + (target.r - source.r) * weight;\n    result.g = source.g + (target.g - source.g) * weight;\n    result.b = source.b + (target.b - source.b) * weight;\n    result.a = source.a + (target.a - source.a) * weight;\n  }\n\n  private lerpEuler (from: Vector3, to: Vector3, t: number, res: Vector3): void {\n    res.x = this.lerpAngle(from.x, to.x, t);\n    res.y = this.lerpAngle(from.y, to.y, t);\n    res.z = this.lerpAngle(from.z, to.z, t);\n  }\n\n  private normalizeAngle (angle: number): number {\n    return ((angle % 360) + 360) % 360;\n  }\n\n  /**\n   * 计算两个角度之间的最短路径差\n   */\n  private shortestAngleDiff (from: number, to: number): number {\n    let diff = this.normalizeAngle(to) - this.normalizeAngle(from);\n\n    if (diff > 180) { diff -= 360; }\n    if (diff < -180) { diff += 360; }\n\n    return diff;\n  }\n\n  private lerpAngle (fromAngle: number, toAngle: number, t: number): number {\n    const diff = this.shortestAngleDiff(fromAngle, toAngle);\n\n    return this.normalizeAngle(fromAngle + diff * t);\n  }\n}\n\nexport class AdditiveBlend extends BlendFunction {\n  override blendVector3 (source: Vector3, target: Vector3, weight: number, result: Vector3): void {\n    result.x = source.x + (target.x * weight);\n    result.y = source.y + (target.y * weight);\n    result.z = source.z + (target.z * weight);\n  }\n\n  override blendQuaternion (source: Quaternion, target: Quaternion, weight: number, result: Quaternion): void {\n    const targetQuaternion = tempQuaternion.copyFrom(source).multiply(target);\n\n    result.copyFrom(source).slerp(targetQuaternion, weight);\n  }\n\n  override blendEuler (source: Vector3, target: Vector3, weight: number, result: Vector3): void {\n    this.blendVector3(source, target, weight, result);\n  }\n\n  override blendFloat (source: number, target: number, weight: number): number {\n    return source + (target * weight);\n  }\n\n  override blendColor (source: Color, target: Color, weight: number, result: Color): void {\n    result.r = source.r + (target.r * weight);\n    result.g = source.g + (target.g * weight);\n    result.b = source.b + (target.b * weight);\n    result.a = source.a + (target.a * weight);\n  }\n}\n\nexport class Blender {\n  private static normalBlendFunction = new NormalBlend();\n  private static additiveBlendFunction = new AdditiveBlend();\n\n  static localBlend (sourcePose: Pose, targetPose: Pose, blendWeight: number, resultPose: Pose) {\n    Blender.localBlendInternal(sourcePose, targetPose, blendWeight, resultPose, Blender.normalBlendFunction);\n  }\n\n  static additiveBlend (sourcePose: Pose, targetPose: Pose, blendWeight: number, resultPose: Pose) {\n    Blender.localBlendInternal(sourcePose, targetPose, blendWeight, resultPose, Blender.additiveBlendFunction);\n  }\n\n  private static localBlendInternal (sourcePose: Pose, targetPose: Pose, blendWeight: number, resultPose: Pose, blendFunction: BlendFunction): void {\n\n    // Blend transform\n    //-------------------------------------------------------------------------\n\n    for (let i = 0; i < sourcePose.parentSpaceTransforms.length; i++) {\n      const sourceTransform = sourcePose.parentSpaceTransforms[i];\n      const targetTransform = targetPose.parentSpaceTransforms[i];\n      const resultTransform = resultPose.parentSpaceTransforms[i];\n\n      const sourcePosition = sourceTransform.position;\n      const targetPosition = targetTransform.position;\n      const resultPosition = resultTransform.position;\n\n      blendFunction.blendVector3(sourcePosition, targetPosition, blendWeight, resultPosition);\n\n      const sourceRotation = sourceTransform.rotation;\n      const targetRotation = targetTransform.rotation;\n      const resultRotation = resultTransform.rotation;\n\n      blendFunction.blendQuaternion(sourceRotation, targetRotation, blendWeight, resultRotation);\n\n      const sourceScale = sourceTransform.scale;\n      const targetScale = targetTransform.scale;\n      const resultScale = resultTransform.scale;\n\n      blendFunction.blendVector3(sourceScale, targetScale, blendWeight, resultScale);\n\n      const sourceEuler = sourceTransform.euler;\n      const targetEuler = targetTransform.euler;\n      const resultEuler = resultTransform.euler;\n\n      blendFunction.blendEuler(sourceEuler, targetEuler, blendWeight, resultEuler);\n    }\n\n    // Blend float value\n    //-------------------------------------------------------------------------\n\n    for (let i = 0; i < sourcePose.floatPropertyValues.length; i++) {\n      const sourceFloat = sourcePose.floatPropertyValues[i];\n      const targetFloat = targetPose.floatPropertyValues[i];\n\n      resultPose.floatPropertyValues[i] = blendFunction.blendFloat(sourceFloat, targetFloat, blendWeight);\n    }\n\n    // Blend color value\n    //-------------------------------------------------------------------------\n\n    for (let i = 0; i < sourcePose.colorPropertyValues.length; i++) {\n      const sourceColor = sourcePose.colorPropertyValues[i];\n      const targetColor = targetPose.colorPropertyValues[i];\n      const resultColor = resultPose.colorPropertyValues[i];\n\n      blendFunction.blendColor(sourceColor, targetColor, blendWeight, resultColor);\n    }\n  }\n}","import { Quaternion } from '@galacean/effects-math/es/core/quaternion';\nimport { Vector3 } from '@galacean/effects-math/es/core/vector3';\nimport { Color } from '@galacean/effects-math/es/core/color';\nimport type { Skeleton } from './skeleton';\nimport type { Transform } from '../../transform';\n\nexport class NodeTransform {\n  position = new Vector3();\n  rotation = new Quaternion();\n  scale = new Vector3();\n  euler = new Vector3();\n\n  constructor (transform?: Transform) {\n    if (transform) {\n      this.position.copyFrom(transform.position);\n      this.rotation.copyFrom(transform.quat);\n      this.scale.copyFrom(transform.scale);\n      this.euler.copyFrom(transform.rotation);\n    }\n  }\n\n  copyFrom (transform: NodeTransform) {\n    this.position.copyFrom(transform.position);\n    this.rotation.copyFrom(transform.rotation);\n    this.scale.copyFrom(transform.scale);\n    this.euler.copyFrom(transform.euler);\n\n    return this;\n  }\n}\n\nexport class Pose {\n  parentSpaceTransforms: NodeTransform[] = [];\n  floatPropertyValues: number[] = [];\n  colorPropertyValues: Color[] = [];\n\n  constructor (\n    public skeleton: Skeleton,\n  ) {\n    for (const transform of skeleton.parentSpaceTransforms) {\n      this.parentSpaceTransforms.push(new NodeTransform().copyFrom(transform));\n    }\n\n    for (const defaultFloat of skeleton.defaultFloatPropertyValues) {\n      this.floatPropertyValues.push(defaultFloat);\n    }\n\n    for (const defaultColor of skeleton.defaultColorPropertyValues) {\n      this.colorPropertyValues.push(new Color().copyFrom(defaultColor));\n    }\n  }\n\n  setPosition (path: string, position: Vector3) {\n    const boneIndex = this.skeleton.pathToBoneIndex.get(path);\n\n    if (boneIndex !== undefined) {\n      this.parentSpaceTransforms[boneIndex].position.copyFrom(position);\n    }\n  }\n\n  setRotation (path: string, rotation: Quaternion) {\n    const boneIndex = this.skeleton.pathToBoneIndex.get(path);\n\n    if (boneIndex !== undefined) {\n      this.parentSpaceTransforms[boneIndex].rotation.copyFrom(rotation);\n    }\n  }\n\n  setEuler (path: string, euler: Vector3) {\n    const boneIndex = this.skeleton.pathToBoneIndex.get(path);\n\n    if (boneIndex !== undefined) {\n      this.parentSpaceTransforms[boneIndex].euler.copyFrom(euler);\n    }\n  }\n\n  setScale (path: string, scale: Vector3) {\n    const boneIndex = this.skeleton.pathToBoneIndex.get(path);\n\n    if (boneIndex !== undefined) {\n      this.parentSpaceTransforms[boneIndex].scale.copyFrom(scale);\n    }\n  }\n\n  setFloat (path: string, value: number) {\n    const animatedObjectIndex = this.skeleton.pathToObjectIndex.get(path);\n\n    if (animatedObjectIndex !== undefined) {\n      this.floatPropertyValues[animatedObjectIndex] = value;\n    }\n  }\n\n  copyFrom (pose: Pose) {\n    for (let i = 0;i < this.parentSpaceTransforms.length;i++) {\n      this.parentSpaceTransforms[i].copyFrom(pose.parentSpaceTransforms[i]);\n    }\n\n    for (let i = 0;i < this.colorPropertyValues.length;i++) {\n      this.colorPropertyValues[i].copyFrom(pose.colorPropertyValues[i]);\n    }\n\n    for (let i = 0;i < this.floatPropertyValues.length;i++) {\n      this.floatPropertyValues[i] = pose.floatPropertyValues[i];\n    }\n  }\n}\n","import { Pose } from './pose';\nimport type { Skeleton } from './skeleton';\n\nexport class PoseResult {\n  pose: Pose;\n\n  constructor (skeleton: Skeleton) {\n    this.pose = new Pose(skeleton);\n  }\n}","import * as spec from '@galacean/effects-specification';\nimport { Blender } from '../blender';\nimport type { GraphContext, InstantiationContext } from '../graph-context';\nimport { PoseResult } from '../pose-result';\nimport { nodeDataClass } from '../node-asset-type';\nimport type { FloatValueNode } from '../graph-node';\nimport { GraphNodeData, PoseNode } from '../graph-node';\nimport type { Pose } from '../pose';\n\n@nodeDataClass(spec.NodeDataType.ApplyAdditiveNodeData)\nexport class ApplyAdditiveNodeData extends GraphNodeData {\n  baseNodeIndex: number;\n  additiveNodeIndex: number;\n  inputParameterValueNodeIndex: number;\n\n  override instantiate (context: InstantiationContext) {\n    const node = this.createNode(ApplyAdditiveNode, context);\n\n    node.baseNode = context.getNode<PoseNode>(this.baseNodeIndex);\n    node.additiveNode = context.getNode<PoseNode>(this.additiveNodeIndex);\n    node.inputParameterValueNode = context.getNode<FloatValueNode>(this.inputParameterValueNodeIndex);\n  }\n\n  override load (data: spec.ApplyAdditiveNodeData): void {\n    super.load(data);\n    this.baseNodeIndex = data.baseNodeIndex;\n    this.additiveNodeIndex = data.additiveNodeIndex;\n    this.inputParameterValueNodeIndex = data.inputParameterValueNodeIndex;\n  }\n}\n\nexport class ApplyAdditiveNode extends PoseNode {\n  baseNode: PoseNode | null = null;\n  additiveNode: PoseNode | null = null;\n\n  inputParameterValueNode: FloatValueNode | null = null;\n\n  baseNodeResult: PoseResult;\n  additiveNodeResult: PoseResult;\n\n  protected override initializeInternal (context: GraphContext): void {\n    super.initializeInternal(context);\n    this.baseNodeResult = new PoseResult(context.skeleton);\n    this.additiveNodeResult = new PoseResult(context.skeleton);\n\n    this.baseNode?.initialize(context);\n    this.additiveNode?.initialize(context);\n    this.inputParameterValueNode?.initialize(context);\n  }\n\n  protected override shutdownInternal (context: GraphContext): void {\n    this.baseNode?.shutdown(context);\n    this.additiveNode?.shutdown(context);\n    this.inputParameterValueNode?.shutdown(context);\n    super.shutdownInternal(context);\n  }\n\n  override evaluate (context: GraphContext, result: PoseResult): PoseResult {\n    if (!this.inputParameterValueNode) {\n      return result;\n    }\n\n    this.markNodeActive(context);\n\n    const blendWeight = this.inputParameterValueNode.getValue<number>(context);\n\n    if (this.baseNode && !this.additiveNode) {\n      this.baseNode.evaluate(context, this.baseNodeResult);\n      this.applyAdditive(this.baseNodeResult.pose, this.additiveNodeResult.pose, blendWeight, result.pose);\n    } else if (this.baseNode && this.additiveNode) {\n      this.baseNode.evaluate(context, this.baseNodeResult);\n      this.additiveNode.evaluate(context, this.additiveNodeResult);\n      this.applyAdditive(this.baseNodeResult.pose, this.additiveNodeResult.pose, blendWeight, result.pose);\n    }\n\n    return result;\n  }\n\n  private applyAdditive (sourcePose: Pose, targetPose: Pose, blendWeight: number, resultPose: Pose) {\n    Blender.additiveBlend(sourcePose, targetPose, blendWeight, resultPose);\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport type { GraphContext, InstantiationContext } from '../graph-context';\nimport type { FloatValueNode } from '../graph-node';\nimport { GraphNodeData, PoseNode } from '../graph-node';\nimport type { Pose } from '../pose';\nimport { PoseResult } from '../pose-result';\nimport { nodeDataClass } from '../node-asset-type';\nimport { Blender } from '../blender';\n\n@nodeDataClass(spec.NodeDataType.BlendNodeData)\nexport class BlendNodeData extends GraphNodeData {\n  sourceNodeIndex0: number;\n  sourceNodeIndex1: number;\n  inputParameterValueNodeIndex: number;\n\n  override instantiate (context: InstantiationContext) {\n    const node = this.createNode(BlendNode, context);\n\n    node.source0 = context.getNode<PoseNode>(this.sourceNodeIndex0);\n    node.source1 = context.getNode<PoseNode>(this.sourceNodeIndex1);\n    node.inputParameterValueNode = context.getNode<FloatValueNode>(this.inputParameterValueNodeIndex);\n  }\n\n  override load (data: spec.BlendNodeData): void {\n    super.load(data);\n    this.sourceNodeIndex0 = data.sourceNodeIndex0;\n    this.sourceNodeIndex1 = data.sourceNodeIndex1;\n    this.inputParameterValueNodeIndex = data.inputParameterValueNodeIndex;\n  }\n}\n\nexport class BlendNode extends PoseNode {\n  source0: PoseNode | null = null;\n  source1: PoseNode | null = null;\n\n  inputParameterValueNode: FloatValueNode | null = null;\n\n  source0Result: PoseResult;\n  source1Result: PoseResult;\n\n  protected override initializeInternal (context: GraphContext): void {\n    super.initializeInternal(context);\n    this.source0Result = new PoseResult(context.skeleton);\n    this.source1Result = new PoseResult(context.skeleton);\n\n    this.source0?.initialize(context);\n    this.source1?.initialize(context);\n    this.inputParameterValueNode?.initialize(context);\n  }\n\n  protected override shutdownInternal (context: GraphContext): void {\n    this.source0?.shutdown(context);\n    this.source1?.shutdown(context);\n    this.inputParameterValueNode?.shutdown(context);\n    super.shutdownInternal(context);\n  }\n\n  override evaluate (context: GraphContext, result: PoseResult): PoseResult {\n    if (!this.inputParameterValueNode) {\n      return result;\n    }\n\n    this.markNodeActive(context);\n\n    const blendWeight = this.inputParameterValueNode.getValue<number>(context);\n\n    if (this.source0 && !this.source1) {\n      this.source0.evaluate(context, this.source0Result);\n      this.localBlend(this.source0Result.pose, this.source1Result.pose, blendWeight, result.pose);\n    } else if (this.source0 && this.source1) {\n      this.source0.evaluate(context, this.source0Result);\n      this.source1.evaluate(context, this.source1Result);\n      this.localBlend(this.source0Result.pose, this.source1Result.pose, blendWeight, result.pose);\n    }\n\n    return result;\n  }\n\n  private localBlend (sourcePose: Pose, targetPose: Pose, blendWeight: number, resultPose: Pose) {\n    Blender.localBlend(sourcePose, targetPose, blendWeight, resultPose);\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport type { InstantiationContext, GraphContext } from '../graph-context';\nimport { nodeDataClass } from '../node-asset-type';\nimport { BoolValueNode, GraphNodeData, InvalidIndex } from '../graph-node';\n\n@nodeDataClass(spec.NodeDataType.AndNodeData)\nexport class AndNodeData extends GraphNodeData {\n  private conditionNodeIndices: number[] = [];\n\n  override instantiate (context: InstantiationContext) {\n    const node = this.createNode(AndNode, context);\n\n    for (const conditionNodeIndex of this.conditionNodeIndices) {\n      node.conditionNodes.push(context.getNode<BoolValueNode>(conditionNodeIndex));\n    }\n  }\n\n  override load (data: spec.AndNodeData): void {\n    super.load(data);\n    this.conditionNodeIndices = data.conditionNodeIndices;\n  }\n}\n\nexport class AndNode extends BoolValueNode {\n  conditionNodes: BoolValueNode[] = [];\n\n  private result = false;\n\n  override getValue<T> (context: GraphContext): T {\n    if (!this.isUpdated(context)) {\n      this.markNodeActive(context);\n      this.result = true;\n      for (const condition of this.conditionNodes) {\n        if (!condition.getValue<boolean>(context)) {\n          this.result = false;\n\n          break;\n        }\n      }\n    }\n\n    return this.result as T;\n  }\n\n  protected override initializeInternal (context: GraphContext): void {\n    super.initializeInternal(context);\n\n    for (const node of this.conditionNodes) {\n      node.initialize(context);\n    }\n\n    this.result = false;\n  }\n\n  protected override shutdownInternal (context: GraphContext): void {\n    for (const node of this.conditionNodes) {\n      node.shutdown(context);\n    }\n\n    super.shutdownInternal(context);\n  }\n}\n\n//-------------------------------------------------------------------------\n\n@nodeDataClass(spec.NodeDataType.OrNodeData)\nexport class OrNodeData extends GraphNodeData {\n  private conditionNodeIndices: number[] = [];\n\n  override instantiate (context: InstantiationContext) {\n    const node = this.createNode(OrNode, context);\n\n    for (const conditionNodeIndex of this.conditionNodeIndices) {\n      node.conditionNodes.push(context.getNode<BoolValueNode>(conditionNodeIndex));\n    }\n  }\n\n  override load (data: spec.OrNodeData): void {\n    super.load(data);\n    this.conditionNodeIndices = data.conditionNodeIndices;\n  }\n}\n\nexport class OrNode extends BoolValueNode {\n  conditionNodes: BoolValueNode[] = [];\n\n  private result = false;\n\n  override getValue<T> (context: GraphContext): T {\n    if (!this.isUpdated(context)) {\n      this.markNodeActive(context);\n      this.result = false;\n      for (const condition of this.conditionNodes) {\n        if (condition.getValue<boolean>(context)) {\n          this.result = true;\n\n          break;\n        }\n      }\n    }\n\n    return this.result as T;\n  }\n\n  protected override initializeInternal (context: GraphContext): void {\n    super.initializeInternal(context);\n\n    for (const node of this.conditionNodes) {\n      node.initialize(context);\n    }\n\n    this.result = false;\n  }\n\n  protected override shutdownInternal (context: GraphContext): void {\n    for (const node of this.conditionNodes) {\n      node.shutdown(context);\n    }\n\n    super.shutdownInternal(context);\n  }\n}\n\n//-------------------------------------------------------------------------\n\n@nodeDataClass(spec.NodeDataType.NotNodeData)\nexport class NotNodeData extends GraphNodeData {\n  private inputValueNodeIndex = InvalidIndex;\n\n  override instantiate (context: InstantiationContext) {\n    const node = this.createNode(NotNode, context);\n\n    node.inputValueNode = context.getNode<BoolValueNode>(this.inputValueNodeIndex);\n  }\n\n  override load (data: spec.NotNodeData): void {\n    super.load(data);\n    this.inputValueNodeIndex = data.inputValueNodeIndex;\n  }\n}\n\nexport class NotNode extends BoolValueNode {\n  inputValueNode: BoolValueNode | null = null;\n\n  private result = false;\n\n  override getValue<T> (context: GraphContext): T {\n    if (!this.isUpdated(context)) {\n      this.markNodeActive(context);\n      if (this.inputValueNode) {\n        this.result = !this.inputValueNode.getValue<boolean>(context);\n      }\n    }\n\n    return this.result as T;\n  }\n\n  protected override initializeInternal (context: GraphContext): void {\n    super.initializeInternal(context);\n    this.inputValueNode?.initialize(context);\n    this.result = false;\n  }\n\n  protected override shutdownInternal (context: GraphContext): void {\n    this.inputValueNode?.shutdown(context);\n    super.shutdownInternal(context);\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport type { GraphContext, InstantiationContext } from '../graph-context';\nimport { BoolValueNode, FloatValueNode, GraphNodeData } from '../graph-node';\nimport { nodeDataClass } from '../node-asset-type';\n\n@nodeDataClass(spec.NodeDataType.ConstFloatNodeData)\nexport class ConstFloatNodeData extends GraphNodeData {\n  value = 0;\n\n  override instantiate (context: InstantiationContext) {\n    const node = this.createNode(ConstFloatNode, context);\n\n    node.value = this.value;\n  }\n\n  override load (data: spec.ConstFloatNodeData): void {\n    super.load(data);\n    this.value = data.value;\n  }\n}\n\nexport class ConstFloatNode extends FloatValueNode {\n  value = 0;\n\n  override getValue<T> (context: GraphContext): T {\n    if (!this.isUpdated(context)) {\n      this.markNodeActive(context);\n    }\n\n    return this.value as T;\n  }\n}\n\n@nodeDataClass(spec.NodeDataType.ConstBoolNodeData)\nexport class ConstBoolNodeData extends GraphNodeData {\n  value = true;\n\n  override instantiate (context: InstantiationContext) {\n    const node = this.createNode(ConstBoolNode, context);\n\n    node.value = this.value;\n  }\n\n  override load (data: spec.ConstBoolNodeData): void {\n    super.load(data);\n    this.value = data.value;\n  }\n}\n\nexport class ConstBoolNode extends BoolValueNode {\n  value = true;\n\n  override getValue<T> (context: GraphContext): T {\n    if (!this.isUpdated(context)) {\n      this.markNodeActive(context);\n    }\n\n    return this.value as T;\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport { nodeDataClass } from '../node-asset-type';\nimport type { GraphContext, InstantiationContext } from '../graph-context';\nimport { BoolValueNode, FloatValueNode, GraphNodeData } from '../graph-node';\n\n@nodeDataClass(spec.NodeDataType.ControlParameterFloatNodeData)\nexport class ControlParameterFloatNodeData extends GraphNodeData {\n  value = 0;\n\n  override instantiate (context: InstantiationContext) {\n    const node = this.createNode(ControlParameterFloatNode, context);\n\n    node.setValue(this.value);\n  }\n\n  override load (data: spec.ControlParameterFloatNodeData): void {\n    super.load(data);\n    this.value = data.value;\n  }\n}\n\nexport class ControlParameterFloatNode extends FloatValueNode {\n  private value = 0;\n\n  override getValue<T> (context: GraphContext): T {\n    if (!this.isUpdated(context)) {\n      this.markNodeActive(context);\n    }\n\n    return this.value as T;\n  }\n\n  override setValue<T> (value: T): void {\n    this.value = value as number;\n  }\n}\n\n@nodeDataClass(spec.NodeDataType.ControlParameterBoolNodeData)\nexport class ControlParameterBoolNodeData extends GraphNodeData {\n  private value = false;\n\n  override instantiate (context: InstantiationContext) {\n    const node = this.createNode(ControlParameterBoolNode, context);\n\n    node.setValue(this.value);\n  }\n\n  override load (data: spec.ControlParameterBoolNodeData): void {\n    super.load(data);\n    this.value = data.value;\n  }\n}\n\nexport class ControlParameterBoolNode extends BoolValueNode {\n  private value = false;\n\n  override getValue<T> (context: GraphContext): T {\n    if (!this.isUpdated(context)) {\n      this.markNodeActive(context);\n    }\n\n    return this.value as T;\n  }\n\n  override setValue<T> (value: T): void {\n    this.value = value as boolean;\n  }\n}\n\n@nodeDataClass(spec.NodeDataType.ControlParameterTriggerNodeData)\nexport class ControlParameterTriggerNodeData extends GraphNodeData {\n  override instantiate (context: InstantiationContext) {\n    this.createNode(ControlParameterTriggerNode, context);\n  }\n\n  override load (data: spec.ControlParameterTriggerNodeData): void {\n    super.load(data);\n  }\n}\n\nexport class ControlParameterTriggerNode extends BoolValueNode {\n  private value = false;\n\n  override getValue<T> (context: GraphContext): T {\n    if (!this.isUpdated(context)) {\n      this.markNodeActive(context);\n    }\n\n    return this.value as T;\n  }\n\n  override setValue<T> (value: T): void {\n    this.value = value as boolean;\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport type { GraphContext, InstantiationContext } from '../graph-context';\nimport { PoseResult } from '../pose-result';\nimport { nodeDataClass } from '../node-asset-type';\nimport type { FloatValueNode } from '../graph-node';\nimport { GraphNodeData, InvalidIndex, PoseNode } from '../graph-node';\nimport { Blender } from '../blender';\n\ntype LayerData = Required<spec.LayerData>;\n\ninterface Layer {\n  inputNode: PoseNode | null,\n  weightValueNode: FloatValueNode | null,\n  weight: number,\n}\n\n@nodeDataClass(spec.NodeDataType.LayerBlendNodeData)\nexport class LayerBlendNodeData extends GraphNodeData {\n  baseNodeIndex = InvalidIndex;\n  layerDatas: LayerData[] = [];\n\n  override instantiate (context: InstantiationContext) {\n    const node = this.createNode(LayerBlendNode, context);\n\n    node.baseLayerNode = context.getNode<PoseNode>(this.baseNodeIndex);\n    for (const layerData of this.layerDatas) {\n      node.layers.push({\n        inputNode: context.getNode<PoseNode>(layerData.inputNodeIndex),\n        weightValueNode: context.getNode<FloatValueNode>(layerData.weightValueNodeIndex),\n        weight: 0,\n      });\n    }\n  }\n\n  override load (data: spec.LayerBlendNodeData): void {\n    super.load(data);\n\n    this.baseNodeIndex = data.baseNodeIndex ?? InvalidIndex;\n\n    if (data.layerDatas) {\n      for (const layerData of data.layerDatas) {\n        this.layerDatas.push({\n          inputNodeIndex: InvalidIndex,\n          weightValueNodeIndex: InvalidIndex,\n          ...layerData,\n        });\n      }\n    }\n  }\n}\n\nexport class LayerBlendNode extends PoseNode {\n  baseLayerNode: PoseNode | null = null;\n  layers: Layer[] = [];\n\n  private layerNodeResult: PoseResult;\n\n  protected override initializeInternal (context: GraphContext): void {\n    super.initializeInternal(context);\n\n    //-------------------------------------------------------------------------\n\n    this.layerNodeResult = new PoseResult(context.skeleton);\n\n    //-------------------------------------------------------------------------\n\n    this.baseLayerNode?.initialize(context);\n\n    for (const layer of this.layers) {\n      layer.inputNode?.initialize(context);\n      layer.weightValueNode?.initialize(context);\n    }\n  }\n\n  protected override shutdownInternal (context: GraphContext): void {\n    this.baseLayerNode?.shutdown(context);\n\n    for (const layer of this.layers) {\n      layer.inputNode?.shutdown(context);\n      layer.weightValueNode?.shutdown(context);\n    }\n\n    super.shutdownInternal(context);\n  }\n\n  override evaluate (context: GraphContext, result: PoseResult): PoseResult {\n    if (!(this.baseLayerNode && this.baseLayerNode.isValid())) {\n      return result;\n    }\n\n    this.markNodeActive(context);\n\n    this.previousTime = this.baseLayerNode.getCurrentTime();\n    result = this.baseLayerNode.evaluate(context, result);\n    this.currentTime = this.baseLayerNode.getCurrentTime();\n    this.duration = this.baseLayerNode.getDuration();\n\n    this.updateLayers(context, result);\n\n    return result;\n  }\n\n  private updateLayers (context: GraphContext, result: PoseResult) {\n    for (const layer of this.layers) {\n      if (layer.inputNode && layer.weightValueNode) {\n        this.layerNodeResult.pose.copyFrom(result.pose);\n        layer.inputNode.evaluate(context, this.layerNodeResult);\n        const layerWeight = layer.weightValueNode.getValue<number>(context);\n\n        Blender.localBlend(result.pose, this.layerNodeResult.pose, layerWeight, result.pose);\n      }\n    }\n\n    return result;\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport type { GraphContext, InstantiationContext } from '../graph-context';\nimport { nodeDataClass } from '../node-asset-type';\nimport type { FloatValueNode, ValueNode } from '../graph-node';\nimport { BoolValueNode, GraphNodeData, InvalidIndex } from '../graph-node';\n\n@nodeDataClass(spec.NodeDataType.EqualNodeData)\nexport class EqualNodeData extends GraphNodeData {\n  private inputValueNodeIndex = InvalidIndex;\n  private comparandValueNodeIndex = InvalidIndex;\n\n  override instantiate (context: InstantiationContext): void {\n    const node = this.createNode(EqualNode, context);\n\n    node.inputValueNode = context.getNode<ValueNode>(this.inputValueNodeIndex);\n    node.comparandValueNode = context.getNode<ValueNode>(this.comparandValueNodeIndex);\n  }\n\n  override load (data: spec.EqualNodeData): void {\n    super.load(data);\n    this.inputValueNodeIndex = data.inputValueNodeIndex;\n    this.comparandValueNodeIndex = data.comparandValueNodeIndex;\n  }\n}\n\nclass EqualNode extends BoolValueNode {\n  inputValueNode: ValueNode | null = null;\n  comparandValueNode: ValueNode | null = null;\n\n  private result = false;\n\n  protected override initializeInternal (context: GraphContext): void {\n    super.initializeInternal(context);\n\n    if (this.inputValueNode) {\n      this.inputValueNode.initialize(context);\n    }\n\n    if (this.comparandValueNode) {\n      this.comparandValueNode.initialize(context);\n    }\n  }\n\n  protected override shutdownInternal (context: GraphContext): void {\n    if (this.inputValueNode) {\n      this.inputValueNode.shutdown(context);\n    }\n\n    if (this.comparandValueNode) {\n      this.comparandValueNode.shutdown(context);\n    }\n\n    super.shutdownInternal(context);\n  }\n\n  override getValue<T> (context: GraphContext): T {\n    if (!this.isUpdated(context)) {\n      this.markNodeActive(context);\n      if (this.inputValueNode && this.comparandValueNode) {\n        const a = this.inputValueNode.getValue(context);\n        const b = this.comparandValueNode.getValue(context);\n\n        this.result = (a === b);\n      }\n    }\n\n    return this.result as T;\n  }\n}\n\n//-------------------------------------------------------------------------\n\nexport abstract class FloatComparisonNodeData extends GraphNodeData {\n  protected inputValueNodeIndex = InvalidIndex;\n  protected comparandValueNodeIndex = InvalidIndex;\n\n  override load (data: spec.FloatComparisonNodeData): void {\n    super.load(data);\n    this.inputValueNodeIndex = data.inputValueNodeIndex;\n    this.comparandValueNodeIndex = data.comparandValueNodeIndex;\n  }\n}\n\nenum Comparison {\n  GreaterThan,\n  LessThan,\n}\n\nexport class FloatComparisonNode extends BoolValueNode {\n  inputValueNode: FloatValueNode | null = null;\n  comparandValueNode: FloatValueNode | null = null;\n  comparison = Comparison.GreaterThan;\n\n  private result = false;\n\n  protected override initializeInternal (context: GraphContext): void {\n    super.initializeInternal(context);\n\n    if (this.inputValueNode) {\n      this.inputValueNode.initialize(context);\n    }\n\n    if (this.comparandValueNode) {\n      this.comparandValueNode.initialize(context);\n    }\n  }\n\n  protected override shutdownInternal (context: GraphContext): void {\n    if (this.inputValueNode) {\n      this.inputValueNode.shutdown(context);\n    }\n\n    if (this.comparandValueNode) {\n      this.comparandValueNode.shutdown(context);\n    }\n\n    super.shutdownInternal(context);\n  }\n\n  override getValue<T> (context: GraphContext): T {\n    if (!this.isUpdated(context)) {\n      this.markNodeActive(context);\n\n      if (this.inputValueNode && this.comparandValueNode) {\n        const a = this.inputValueNode.getValue<number>(context);\n        const b = this.comparandValueNode.getValue<number>(context);\n\n        switch (this.comparison) {\n          case Comparison.GreaterThan:\n            this.result = a > b;\n\n            break;\n          case Comparison.LessThan:\n            this.result = a < b;\n\n            break;\n        }\n      }\n    }\n\n    return this.result as T;\n  }\n}\n\n//-------------------------------------------------------------------------\n\n@nodeDataClass(spec.NodeDataType.GreaterNodeData)\nexport class GreaterNodeData extends FloatComparisonNodeData {\n  override instantiate (context: InstantiationContext): void {\n    const node = this.createNode(FloatComparisonNode, context);\n\n    node.comparison = Comparison.GreaterThan;\n    node.inputValueNode = context.getNode<ValueNode>(this.inputValueNodeIndex);\n    node.comparandValueNode = context.getNode<ValueNode>(this.comparandValueNodeIndex);\n  }\n}\n\n//-------------------------------------------------------------------------\n\n@nodeDataClass(spec.NodeDataType.LessNodeData)\nexport class LessNodeData extends FloatComparisonNodeData {\n  override instantiate (context: InstantiationContext): void {\n    const node = this.createNode(FloatComparisonNode, context);\n\n    node.comparison = Comparison.LessThan;\n    node.inputValueNode = context.getNode<ValueNode>(this.inputValueNodeIndex);\n    node.comparandValueNode = context.getNode<ValueNode>(this.comparandValueNodeIndex);\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport type { GraphContext, InstantiationContext } from '../graph-context';\nimport { BranchState } from '../graph-context';\nimport type { PoseResult } from '../pose-result';\nimport { nodeDataClass } from '../node-asset-type';\nimport type { BoolValueNode } from '../graph-node';\nimport { GraphNodeData, InvalidIndex, PoseNode } from '../graph-node';\nimport type { StateNode, StateNodeData } from './state-node';\nimport type { TransitionNode } from './transition-node';\n\n@nodeDataClass(spec.NodeDataType.StateMachineNodeData)\nexport class StateMachineNodeData extends GraphNodeData {\n  machineName: string;\n  stateDatas: spec.StateData[];\n  defaultStateIndex: number;\n\n  override instantiate (context: InstantiationContext): void {\n    const node = this.createNode(StateMachineNode, context);\n\n    for (const stateData of this.stateDatas) {\n      const state: StateInfo = {\n        stateNode: context.getNode<StateNode>(stateData.stateNodeIndex),\n        transitions: [],\n      };\n\n      node.states.push(state);\n\n      for (const transitionData of stateData.transitionDatas) {\n        const transition: TransitionInfo = {\n          transitionNode: context.getNode<TransitionNode>(transitionData.transitionNodeIndex),\n          conditionNode: context.getNode<BoolValueNode>(transitionData.conditionNodeIndex),\n          targetStateIndex: transitionData.targetStateIndex,\n        };\n\n        state.transitions.push(transition);\n      }\n    }\n  }\n\n  override load (data: spec.StateMachineNodeData): void {\n    super.load(data);\n\n    this.stateDatas = data.stateDatas;\n    this.defaultStateIndex = data.defaultStateIndex;\n    this.machineName = data.machineName;\n  }\n}\n\nexport interface TransitionInfo {\n  transitionNode: TransitionNode,\n  conditionNode: BoolValueNode,\n  targetStateIndex: number,\n}\n\nexport interface StateInfo {\n  stateNode: StateNode,\n  transitions: TransitionInfo[],\n}\n\n/**\n * 状态机节点\n */\nexport class StateMachineNode extends PoseNode {\n  states: StateInfo[] = [];\n  private activeTransition: TransitionNode | null = null;\n  private activeStateIndex = InvalidIndex;\n\n  /**\n   * 获取当前激活状态的名称\n   * @since 2.7.0\n   * @returns 当前状态名\n   */\n  getCurrentStateName (): string {\n    return this.states[this.activeStateIndex].stateNode.getNodeData<StateNodeData>().stateName;\n  }\n\n  override evaluate (context: GraphContext, result: PoseResult): PoseResult {\n    this.markNodeActive(context);\n\n    // Check active transition\n    if (this.activeTransition !== null) {\n      if (this.activeTransition.isComplete(context)) {\n        this.activeTransition.shutdown(context);\n        this.activeTransition = null;\n      }\n    }\n\n    if (this.activeTransition === null) {\n      // Update state directly\n      const activeState = this.states[this.activeStateIndex].stateNode;\n\n      result = activeState.evaluate(context, result);\n\n      // Update node time\n      this.duration = activeState.getDuration();\n      this.previousTime = activeState.getPreviousTime();\n      this.currentTime = activeState.getCurrentTime();\n    } else {\n      // Update transition\n      result = this.activeTransition.evaluate(context, result);\n\n      // Update node time\n      this.duration = this.activeTransition.getDuration();\n      this.previousTime = this.activeTransition.getPreviousTime();\n      this.currentTime = this.activeTransition.getCurrentTime();\n    }\n\n    // Check for transitions\n    if (context.branchState === BranchState.Active) {\n      this.evaluateTransitions(context, result);\n    }\n\n    return result;\n  }\n\n  private evaluateTransitions (\n    context: GraphContext,\n    sourceNodeResult: PoseResult\n  ): void {\n    const currentlyActiveStateInfo = this.states[this.activeStateIndex];\n\n    // Check for a valid transition\n    let transitionIdx = InvalidIndex;\n    const numTransitions = currentlyActiveStateInfo.transitions.length;\n\n    for (let i = 0; i < numTransitions; i++) {\n      const transition = currentlyActiveStateInfo.transitions[i];\n\n      if (transition.targetStateIndex === InvalidIndex) {\n        throw new Error('Invalid target state index.');\n      }\n\n      // Disallow transitions to already transitioning states unless forced\n      if (this.states[transition.targetStateIndex].stateNode.isTransitioning()) {\n        continue;\n      }\n\n      let canEnterTransition = false;\n\n      // HasExitTime override transition condition\n      if (transition.transitionNode.hasExitTime) {\n        const stateNode = currentlyActiveStateInfo.stateNode;\n\n        if (stateNode.getElapsedTimeInState() / stateNode.getDuration() > transition.transitionNode.exitTime) {\n          canEnterTransition = true;\n        }\n      } else if (transition.conditionNode !== null && transition.conditionNode.getValue<boolean>(context)) {  // Check transition conditions\n        canEnterTransition = true;\n      }\n\n      if (canEnterTransition) {\n        transitionIdx = i;\n\n        break;\n      }\n    }\n\n    // Start new transition if found\n    if (transitionIdx !== InvalidIndex) {\n      const transition = currentlyActiveStateInfo.transitions[transitionIdx];\n      // const targetStateInfo = this.states[transition.targetStateIndex];\n\n      // if (this.activeTransition) {\n      //   this.activeTransition.notifyNewTransitionStarting(context, targetStateInfo.stateNode);\n      // }\n\n      // Start the new transition\n      // Initialize target state based on transition settings\n      transition.transitionNode.initialize(context);\n\n      if (this.activeTransition !== null) {\n        sourceNodeResult = transition.transitionNode.startTransitionFromTransition(\n          context,\n          sourceNodeResult,\n          this.activeTransition,\n          sourceNodeResult\n        );\n      } else {\n        sourceNodeResult = transition.transitionNode.startTransitionFromState(\n          context,\n          sourceNodeResult,\n          this.states[this.activeStateIndex].stateNode,\n          sourceNodeResult\n        );\n      }\n\n      this.activeTransition = transition.transitionNode;\n\n      // Update state data\n      this.shutdownTransitionConditions(context);\n      this.activeStateIndex = transition.targetStateIndex;\n      this.initializeTransitionConditions(context);\n\n      // Update timing info\n      this.duration = this.states[this.activeStateIndex].stateNode.getDuration();\n      this.previousTime = this.states[this.activeStateIndex].stateNode.getPreviousTime();\n      this.currentTime = this.states[this.activeStateIndex].stateNode.getCurrentTime();\n    }\n  }\n\n  private selectDefaultState (context: GraphContext): number {\n    const selectedStateIndex = this.getNodeData<StateMachineNodeData>().defaultStateIndex;\n\n    return selectedStateIndex;\n  }\n\n  protected override initializeInternal (context: GraphContext): void {\n    super.initializeInternal(context);\n\n    this.activeStateIndex = this.selectDefaultState(context);\n    const activeState = this.states[this.activeStateIndex].stateNode;\n\n    activeState.initialize(context);\n\n    this.duration = activeState.getDuration();\n    this.previousTime = activeState.getPreviousTime();\n    this.currentTime = activeState.getCurrentTime();\n\n    this.initializeTransitionConditions(context);\n  }\n\n  protected override shutdownInternal (context: GraphContext): void {\n    if (this.activeTransition !== null) {\n      this.activeTransition.shutdown(context);\n    }\n\n    this.shutdownTransitionConditions(context);\n\n    this.states[this.activeStateIndex].stateNode.shutdown(context);\n    this.activeStateIndex = InvalidIndex;\n    this.activeTransition = null;\n\n    super.shutdownInternal(context);\n  }\n\n  private initializeTransitionConditions (context: GraphContext): void {\n    for (const transition of this.states[this.activeStateIndex].transitions) {\n      if (transition.conditionNode !== null) {\n        transition.conditionNode.initialize(context);\n      }\n    }\n  }\n\n  private shutdownTransitionConditions (context: GraphContext): void {\n    for (const transition of this.states[this.activeStateIndex].transitions) {\n      if (transition.conditionNode !== null) {\n        transition.conditionNode.shutdown(context);\n      }\n    }\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport type { GraphContext, InstantiationContext } from '../graph-context';\nimport type { PoseResult } from '../pose-result';\nimport { nodeDataClass } from '../node-asset-type';\nimport { GraphNodeData, InvalidIndex, PoseNode } from '../graph-node';\n\nexport enum TransitionState {\n  None,\n  TransitioningIn,\n  TransitioningOut,\n}\n\n@nodeDataClass(spec.NodeDataType.StateNodeData)\nexport class StateNodeData extends GraphNodeData {\n  stateName: string;\n  childNodeIndex = InvalidIndex;\n\n  override instantiate (context: InstantiationContext): void {\n    const node = this.createNode(StateNode, context);\n\n    node.childNode = context.getNode<PoseNode>(this.childNodeIndex);\n  }\n\n  override load (data: spec.StateNodeData): void {\n    super.load(data);\n\n    this.childNodeIndex = data.childNodeIndex;\n    this.stateName = data.stateName;\n  }\n}\n\nexport class StateNode extends PoseNode {\n  childNode: PoseNode | null = null;\n\n  private transitionState = TransitionState.None;\n  private elapsedTimeInState = 0;\n  private isFirstStateUpdate = false;\n\n  isTransitioning () {\n    return this.transitionState !== TransitionState.None;\n  }\n\n  isTransitioningIn () {\n    return this.transitionState === TransitionState.TransitioningIn;\n  }\n\n  isTransitioningOut () {\n    return this.transitionState === TransitionState.TransitioningOut;\n  }\n\n  startTransitionIn (context: GraphContext) {\n    this.transitionState = TransitionState.TransitioningIn;\n  }\n\n  startTransitionOut (context: GraphContext) {\n    this.transitionState = TransitionState.TransitioningOut;\n  }\n\n  setTransitioningState (newState: TransitionState) {\n    this.transitionState = newState;\n  }\n\n  getElapsedTimeInState () {\n    return this.elapsedTimeInState;\n  }\n\n  override evaluate (context: GraphContext, result: PoseResult): PoseResult {\n    this.markNodeActive(context);\n\n    // 更新子节点\n    if (this.childNode !== null && this.childNode.isValid()) {\n      result = this.childNode.evaluate(context, result);\n      this.duration = this.childNode.getDuration();\n      this.previousTime = this.childNode.getPreviousTime();\n      this.currentTime = this.childNode.getCurrentTime();\n    }\n\n    // 跟踪在状态中花费的时间\n    this.elapsedTimeInState += context.deltaTime;\n    this.isFirstStateUpdate = false;\n\n    return result;\n  }\n\n  protected override initializeInternal (context: GraphContext): void {\n    super.initializeInternal(context);\n    this.transitionState = TransitionState.None;\n    this.elapsedTimeInState = 0;\n    this.previousTime = this.currentTime = 0;\n    this.duration = 0;\n    if (this.childNode !== null) {\n      this.childNode.initialize(context);\n      if (this.childNode.isValid()) {\n        this.duration = this.childNode.getDuration();\n        this.previousTime = this.childNode.getPreviousTime();\n        this.currentTime = this.childNode.getCurrentTime();\n      }\n    }\n\n    // Flag this as the first update for this state, this will cause state entry events to be sampled for at least one update\n    this.isFirstStateUpdate = true;\n  }\n\n  protected override shutdownInternal (context: GraphContext): void {\n    if (this.childNode !== null) {\n      this.childNode.shutdown(context);\n    }\n    this.transitionState = TransitionState.None;\n    super.shutdownInternal(context);\n  }\n}\n","import { clamp, lerp } from '@galacean/effects-math/es/core/utils';\nimport * as spec from '@galacean/effects-specification';\nimport { assertExist } from '../../../utils/asserts';\nimport { Blender } from '../blender';\nimport type { InstantiationContext, GraphContext } from '../graph-context';\nimport { BranchState } from '../graph-context';\nimport { PoseResult } from '../pose-result';\nimport { nodeDataClass } from '../node-asset-type';\nimport { GraphNodeData, InvalidIndex, PoseNode } from '../graph-node';\nimport { TransitionState, type StateNode } from './state-node';\n\nexport enum SourceType {\n  State,\n  Transition,\n  CachedPose\n}\n\n@nodeDataClass(spec.NodeDataType.TransitionNodeData)\nexport class TransitionNodeData extends GraphNodeData {\n  duration = 0;\n  hasExitTime = false;\n  exitTime = 0.75;\n  targetStateNodeIndex = InvalidIndex;\n\n  override instantiate (context: InstantiationContext): void {\n    const node = this.createNode(TransitionNode, context);\n\n    node.targetNode = context.getNode(this.targetStateNodeIndex);\n    node.hasExitTime = this.hasExitTime;\n    node.exitTime = this.exitTime;\n  }\n\n  override load (data: spec.TransitionNodeData): void {\n    super.load(data);\n\n    this.duration = data.duration;\n    this.hasExitTime = data.hasExitTime;\n    this.exitTime = data.exitTime;\n    this.targetStateNodeIndex = data.targetStateNodeIndex;\n  }\n}\n\nexport class TransitionNode extends PoseNode {\n  targetNode: StateNode;\n  hasExitTime = false;\n  exitTime = 0.75;\n\n  private transitionLength = 0;\n  private transitionProgress = 0;\n  private blendWeight = 0;\n\n  private sourceNode: PoseNode | null = null;\n  private sourceNodeResult: PoseResult;\n  private sourceType = SourceType.State;\n  private targetNodeResult: PoseResult;\n  private blendedDuration = 0;\n\n  override evaluate (context: GraphContext, result: PoseResult): PoseResult {\n    assertExist(this.sourceNode);\n\n    this.markNodeActive(context);\n\n    // Handle source transition completion\n    if (this.isSourceATransition() && this.getSourceTransitionNode().isComplete(context)) {\n      this.endSourceTransition(context);\n    }\n\n    this.transitionProgress = this.transitionProgress + context.deltaTime / this.transitionLength;\n    this.transitionProgress = clamp(this.transitionProgress, 0.0, 1.0);\n\n    // 计算混合权重\n    this.calculateBlendWeight();\n\n    // 更新源状态\n    let sourceNodeResult = this.sourceNodeResult;\n\n    // 设置分支状态\n    const previousBranchState = context.branchState;\n\n    context.branchState = BranchState.Inactive;\n    sourceNodeResult = this.sourceNode.evaluate(context, sourceNodeResult);\n\n    // 恢复分支状态\n    context.branchState = previousBranchState;\n\n    // 更新目标状态节点\n    const targetNodeResult = this.targetNode.evaluate(\n      context,\n      this.targetNodeResult\n    );\n\n    const finalResult = result;\n\n    this.registerPoseTasksAndUpdateRootMotion(\n      sourceNodeResult,\n      targetNodeResult,\n      finalResult\n    );\n\n    // 更新内部时间\n    this.blendedDuration = lerp(\n      this.sourceNode.getDuration(),\n      this.targetNode.getDuration(),\n      this.blendWeight\n    );\n    if (this.blendedDuration > 0.0) {\n      const deltaPercentage = context.deltaTime / this.blendedDuration;\n\n      this.previousTime = this.currentTime;\n      this.currentTime = (this.currentTime + deltaPercentage) % 1;\n    } else {\n      this.previousTime = this.currentTime = 1.0;\n    }\n\n    // 设置转换的暴露持续时间为目标，以确保任何\"状态完成\"节点正确触发\n    this.duration = this.targetNode.getDuration();\n\n    return finalResult;\n  }\n\n  // Transition Info\n  //-------------------------------------------------------------------------\n\n  isComplete (context: GraphContext): boolean {\n    if (this.transitionLength <= 0) {\n      return true;\n    }\n\n    return (this.transitionProgress + (context.deltaTime / this.transitionLength)) >= 1.0;\n  }\n\n  getProgressPercentage (): number {\n    return this.transitionProgress;\n  }\n\n  getSourceType (): SourceType {\n    return this.sourceType;\n  }\n\n  isSourceATransition (): boolean {\n    return this.sourceType === SourceType.Transition;\n  }\n\n  isSourceAState (): boolean {\n    return this.sourceType === SourceType.State;\n  }\n\n  // Secondary initialization\n  //-------------------------------------------------------------------------\n\n  startTransitionFromState (\n    context: GraphContext,\n    sourceNodeResult: PoseResult,\n    sourceState: StateNode,\n    outResult: PoseResult\n  ): PoseResult {\n    this.sourceNode = sourceState;\n    this.sourceType = SourceType.State;\n\n    return this.initializeTargetStateAndUpdateTransition(context, sourceNodeResult, outResult);\n  }\n\n  startTransitionFromTransition (\n    context: GraphContext,\n    sourceNodeResult: PoseResult,\n    sourceTransition: TransitionNode,\n    outResult: PoseResult) {\n    this.sourceNode = sourceTransition;\n    this.sourceType = SourceType.Transition;\n\n    return this.initializeTargetStateAndUpdateTransition(context, sourceNodeResult, outResult);\n  }\n\n  // Source Node\n  //-------------------------------------------------------------------------\n\n  getSourceStateNode () {\n    return this.sourceNode as StateNode;\n  }\n\n  getSourceTransitionNode () {\n    return this.sourceNode as TransitionNode;\n  }\n\n  // Forceable transitions\n  //-------------------------------------------------------------------------\n\n  notifyNewTransitionStarting (context: GraphContext, targetStateNode: StateNode) {\n    if (this.isSourceATransition()) {\n      const sourceTransitionNode = this.getSourceTransitionNode();\n      const sourceTransitionTargetState = sourceTransitionNode.targetNode;\n\n      if (sourceTransitionTargetState === targetStateNode) {\n        this.sourceType = SourceType.CachedPose;\n\n        sourceTransitionTargetState.shutdown(context);\n        this.sourceNode = null;\n      }\n    } else if (this.isSourceAState()) {\n      if (this.sourceNode === targetStateNode) {\n        this.sourceType = SourceType.CachedPose;\n        this.sourceNode.shutdown(context);\n        this.sourceNode = null;\n      }\n    }\n\n    if (this.isSourceATransition()) {\n      const sourceTransitionNode = this.getSourceTransitionNode();\n\n      sourceTransitionNode.notifyNewTransitionStarting(context, targetStateNode);\n    }\n  }\n\n  protected override initializeInternal (context: GraphContext): void {\n    super.initializeInternal(context);\n    this.sourceNodeResult = new PoseResult(context.skeleton);\n    this.targetNodeResult = new PoseResult(context.skeleton);\n\n    this.transitionLength = this.getNodeData<TransitionNodeData>().duration;\n\n    this.transitionProgress = 0;\n    this.blendWeight = 0;\n  }\n\n  protected override shutdownInternal (context: GraphContext): void {\n    this.targetNode.setTransitioningState(TransitionState.None);\n    this.currentTime = 1.0;\n\n    if (this.sourceNode) {\n      if (this.isSourceATransition()) {\n        this.endSourceTransition(context);\n      }\n      this.sourceNode.shutdown(context);\n      this.sourceNode = null;\n    }\n    super.shutdownInternal(context);\n  }\n\n  private endSourceTransition (context: GraphContext) {\n    const sourceTransitionNode = this.getSourceTransitionNode();\n    const sourceTransitionTargetState = sourceTransitionNode.targetNode;\n\n    this.sourceNode?.shutdown(context);\n    this.sourceNode = sourceTransitionTargetState;\n    this.sourceType = SourceType.State;\n\n    this.getSourceStateNode().setTransitioningState(TransitionState.TransitioningOut);\n  }\n\n  private initializeTargetStateAndUpdateTransition (\n    context: GraphContext,\n    sourceNodeResult: PoseResult,\n    outResult: PoseResult\n  ): PoseResult {\n    this.markNodeActive(context);\n\n    let targetNodeResult = this.targetNodeResult;\n\n    // 处理源状态的过渡开始\n    const startTransitionOutForSource = () => {\n      if (this.sourceType === SourceType.State) {\n        this.getSourceStateNode().startTransitionOut(context);\n      }\n    };\n\n    // 非同步转换的处理\n    startTransitionOutForSource();\n    this.targetNode.initialize(context);\n    this.targetNode.startTransitionIn(context);\n    targetNodeResult = this.targetNode.evaluate(context, targetNodeResult);\n\n    // 计算混合权重\n    this.calculateBlendWeight();\n\n    // 注册姿势任务并更新根运动\n    this.registerPoseTasksAndUpdateRootMotion(\n      sourceNodeResult,\n      targetNodeResult,\n      outResult\n    );\n\n    // Update internal time\n    this.previousTime = 0;\n    this.currentTime = 0;\n    this.blendedDuration = lerp(this.sourceNode!.getDuration(), this.targetNode.getDuration(), this.blendWeight);\n\n    // Set the exposed-duration of the transition to the target to ensure that any \"state completed\" nodes trigger correctly\n    this.duration = this.targetNode.getDuration();\n\n    return outResult;\n  }\n\n  private calculateBlendWeight () {\n    if (this.transitionLength === 0) {\n      this.blendWeight = 1;\n    } else {\n      // Linear\n      this.blendWeight = this.transitionProgress;\n      this.blendWeight = clamp(this.blendWeight, 0, 1);\n    }\n  }\n\n  private registerPoseTasksAndUpdateRootMotion (\n    sourceResult: PoseResult,\n    targetResult: PoseResult,\n    outResult: PoseResult\n  ): void {\n    const poseBlendWeight = this.blendWeight;\n\n    Blender.localBlend(sourceResult.pose, targetResult.pose, poseBlendWeight, outResult.pose);\n  }\n}\n","import { Color } from '@galacean/effects-math/es/core/color';\nimport type { VFXItem } from '../../vfx-item';\nimport type { Transform } from '../../transform';\nimport { NodeTransform } from './pose';\nimport type { Constructor } from '../../utils';\nimport type { Component } from '../../components';\nimport { getClass } from '../../decorators';\nimport type { ColorAnimationCurve, FloatAnimationCurve } from '../../animation/animation-clip';\n\nexport interface AnimationRecordData {\n  position: string[],\n  scale: string[],\n  rotation: string[],\n  euler: string[],\n  floats: FloatAnimationCurve[],\n  colors: ColorAnimationCurve[],\n}\n\nexport enum AnimatedPropertyType {\n  Float,\n  Color,\n}\n\nexport interface AnimatedObject {\n  propertyPath: string,\n  propertyName: string,\n  target: Record<string, any>,\n  directTarget: Record<string, any>,\n}\n\nexport const VFXItemType = 'VFXItem';\n\nexport class Skeleton {\n  useEuler = false;\n\n  pathToObjectIndex = new Map<string, number>();\n\n  floatAnimatedObjects: AnimatedObject[] = [];\n  defaultFloatPropertyValues: number[] = [];\n\n  colorAnimatedObjects: AnimatedObject[] = [];\n  defaultColorPropertyValues: Color[] = [];\n\n  animatedTransforms: Transform[] = [];\n  parentSpaceTransforms: NodeTransform[] = [];\n  pathToBoneIndex = new Map<string, number>();\n\n  constructor (\n    public rootBone: VFXItem,\n    recordedProperties: AnimationRecordData,\n  ) {\n    for (const path of recordedProperties.position) {\n      this.addReferenceTransform(path);\n    }\n    for (const path of recordedProperties.rotation) {\n      this.addReferenceTransform(path);\n    }\n    for (const path of recordedProperties.scale) {\n      this.addReferenceTransform(path);\n    }\n    for (const path of recordedProperties.euler) {\n      this.addReferenceTransform(path);\n      this.useEuler = true;\n    }\n\n    for (let i = 0; i < recordedProperties.floats.length; i++) {\n      const floatRecords = recordedProperties.floats[i];\n\n      this.addRecordedProperty(floatRecords.path, floatRecords.className, floatRecords.property, AnimatedPropertyType.Float);\n    }\n\n    for (let i = 0; i < recordedProperties.colors.length; i++) {\n      const colorRecords = recordedProperties.colors[i];\n\n      this.addRecordedProperty(colorRecords.path, colorRecords.className, colorRecords.property, AnimatedPropertyType.Color);\n    }\n  }\n\n  private addReferenceTransform (itemPath: string) {\n    if (this.pathToBoneIndex.get(itemPath)) {\n      return;\n    }\n    const targetBone = this.findTarget(itemPath);\n\n    if (!targetBone) {\n      return;\n    }\n\n    this.parentSpaceTransforms.push(new NodeTransform(targetBone.transform));\n    this.animatedTransforms.push(targetBone.transform);\n    this.pathToBoneIndex.set(itemPath, this.parentSpaceTransforms.length - 1);\n  }\n\n  private addRecordedProperty (itemPath: string, className: string, propertyPath: string, type: AnimatedPropertyType) {\n    const totalPath = itemPath + className + propertyPath;\n\n    if (this.pathToObjectIndex.get(totalPath) !== undefined) {\n      return;\n    }\n\n    const targetBone = this.findTarget(itemPath);\n\n    if (!targetBone) {\n      return;\n    }\n\n    let animatedComponentOrItem: VFXItem | Component;\n\n    // Find target component or VFXItem\n    if (className === VFXItemType) {\n      animatedComponentOrItem = targetBone;\n    } else {\n      animatedComponentOrItem = targetBone.getComponent(getClass(className) as Constructor<Component>);\n    }\n\n    if (!animatedComponentOrItem) {\n      console.error(`The ${className} Component was not found.`);\n    }\n\n    // Find last animated object by path\n    const propertyPathSegments = propertyPath.split('.');\n    const lastPropertyName = propertyPathSegments[propertyPathSegments.length - 1];\n    let directTarget: Record<string, any> = animatedComponentOrItem;\n\n    for (let i = 0; i < propertyPathSegments.length - 1; i++) {\n      const property = directTarget[propertyPathSegments[i]];\n\n      if (property === undefined) {\n        console.error(`The ${propertyPathSegments[i]} property of ${directTarget} was not found.`);\n      }\n      directTarget = property;\n    }\n\n    const animatedObject: AnimatedObject = {\n      target: animatedComponentOrItem,\n      propertyPath: propertyPath,\n      directTarget: directTarget,\n      propertyName: lastPropertyName,\n    };\n\n    switch (type) {\n      case AnimatedPropertyType.Float:\n        this.floatAnimatedObjects.push(animatedObject);\n        this.defaultFloatPropertyValues.push(directTarget[lastPropertyName]);\n        this.pathToObjectIndex.set(totalPath, this.floatAnimatedObjects.length - 1);\n\n        break;\n      case AnimatedPropertyType.Color:\n        this.colorAnimatedObjects.push(animatedObject);\n        this.defaultColorPropertyValues.push(new Color().copyFrom(directTarget[lastPropertyName]));\n        this.pathToObjectIndex.set(totalPath, this.colorAnimatedObjects.length - 1);\n    }\n  }\n\n  private findTarget (boneName: string) {\n    if (boneName === '') {\n      return this.rootBone;\n    }\n\n    const itemNames = boneName.split('/');\n    let currentItem = this.rootBone;\n\n    for (const itemName of itemNames) {\n      const target = currentItem.find(itemName);\n\n      if (!target) {\n        return null;\n      }\n\n      currentItem = target;\n    }\n\n    return currentItem;\n  }\n}\n","import type { VFXItem } from '../../vfx-item';\nimport type { AnimationGraphAsset } from './animation-graph-asset';\nimport { GraphContext, InstantiationContext } from './graph-context';\nimport type { GraphNode, PoseNode, PoseNodeDebugInfo, ValueNode } from './graph-node';\nimport { InvalidIndex } from './graph-node';\nimport type { StateMachineNodeData } from './nodes';\nimport { ControlParameterTriggerNode, StateMachineNode } from './nodes';\nimport { PoseResult } from './pose-result';\nimport type { AnimationRecordData } from './skeleton';\nimport { Skeleton } from './skeleton';\n\nexport class GraphInstance {\n  nodes: GraphNode[] = [];\n  skeleton: Skeleton;\n\n  private rootNode: PoseNode;\n  private context = new GraphContext();\n  private result: PoseResult;\n\n  constructor (\n    private graphAsset: AnimationGraphAsset,\n    rootBone: VFXItem,\n  ) {\n    // Initialize skeleton\n    const recordProperties: AnimationRecordData = {\n      position: [],\n      scale: [],\n      rotation: [],\n      euler: [],\n      floats: [],\n      colors: [],\n    };\n\n    for (const animationClip of graphAsset.graphDataSet.resources) {\n      if (!animationClip) {\n        continue;\n      }\n      for (const positionCurve of animationClip.positionCurves) {\n        recordProperties.position.push(positionCurve.path);\n      }\n      for (const rotationCurve of animationClip.rotationCurves) {\n        recordProperties.rotation.push(rotationCurve.path);\n      }\n      for (const scaleCurve of animationClip.scaleCurves) {\n        recordProperties.scale.push(scaleCurve.path);\n      }\n      for (const eulerCurve of animationClip.eulerCurves) {\n        recordProperties.euler.push(eulerCurve.path);\n      }\n      for (const floatCurve of animationClip.floatCurves) {\n        recordProperties.floats.push(floatCurve);\n      }\n      for (const colorCurve of animationClip.colorCurves) {\n        recordProperties.colors.push(colorCurve);\n      }\n    }\n    this.skeleton = new Skeleton(rootBone, recordProperties);\n\n    // Create PoseResult\n    this.result = new PoseResult(this.skeleton);\n    this.context.skeleton = this.skeleton;\n\n    // Instantiate graph nodes\n    const instantiationContext = new InstantiationContext();\n\n    instantiationContext.nodes = this.nodes;\n    instantiationContext.nodeDatas = graphAsset.nodeDatas;\n    instantiationContext.dataSet = graphAsset.graphDataSet;\n\n    for (let i = 0; i < graphAsset.nodeDatas.length; i++) {\n      if (!instantiationContext.nodes[i]) {\n        graphAsset.nodeDatas[i].instantiate(instantiationContext);\n      }\n    }\n    this.rootNode = this.nodes[graphAsset.rootNodeIndex] as PoseNode;\n  }\n\n  evaluateGraph (deltaTime: number) {\n    this.context.update(deltaTime);\n\n    if (!this.rootNode.isInitialized()) {\n      this.resetGraphState();\n    }\n\n    // Evaluate the entire animation graph starting from the rootNode\n    if (this.rootNode) {\n      this.result = this.rootNode.evaluate(this.context, this.result);\n    }\n\n    // Reset trigger nodes\n    for (let i = 0; i < this.getNumControlParameters(); i++) {\n      const controlParameterNode = this.nodes[i];\n\n      if (controlParameterNode instanceof ControlParameterTriggerNode) {\n        controlParameterNode.setValue(false);\n      }\n    }\n\n    return this.result;\n  }\n\n  isInitialized () {\n    return this.rootNode && this.rootNode.isInitialized();\n  }\n\n  // General Node Info\n  //-------------------------------------------------------------------------\n\n  isNodeActive (nodeIdx: number): boolean {\n    return this.isControlParameter(nodeIdx) || this.nodes[nodeIdx].isNodeActive(this.context.updateID);\n  }\n\n  getStateMachineNode (machineName: string): StateMachineNode | null {\n    let result: StateMachineNode | null = null;\n\n    for (const node of this.nodes) {\n      if (node instanceof StateMachineNode && node.getNodeData<StateMachineNodeData>().machineName === machineName) {\n        result = node;\n      }\n    }\n\n    return result;\n  }\n\n  // Graph State\n  //-------------------------------------------------------------------------\n\n  resetGraphState () {\n    if (this.rootNode.isInitialized()) {\n      this.rootNode.shutdown(this.context);\n    }\n\n    this.context.updateID++; // Bump the update ID to ensure that any initialization code that relies on it is dirtied.\n    this.rootNode.initialize(this.context);\n  }\n\n  // Control Parameters\n  //-------------------------------------------------------------------------\n\n  getNumControlParameters (): number {\n    return this.graphAsset.controlParameterIDs.length;\n  }\n\n  getControlParameterIndex (parameterID: string): number {\n    const parameterLookupMap = this.graphAsset.parameterLookupMap;\n    const res = parameterLookupMap.get(parameterID);\n\n    if (res !== undefined) {\n      return res;\n    }\n\n    console.warn(`Parameter '${parameterID}' does not exist.`);\n\n    return InvalidIndex;\n  }\n\n  getControlParameterID (parameterNodeIndex: number): string {\n    return this.graphAsset.controlParameterIDs[parameterNodeIndex];\n  }\n\n  setBool (name: string, value: boolean) {\n    this.setControlParameterValue<boolean>(name, value);\n  }\n\n  setFloat (name: string, value: number) {\n    this.setControlParameterValue<number>(name, value);\n  }\n\n  setTrigger (name: string) {\n    this.setControlParameterValue<boolean>(name, true);\n  }\n\n  resetTrigger (name: string) {\n    this.setControlParameterValue<boolean>(name, false);\n  }\n\n  // Debug Information\n  //-------------------------------------------------------------------------\n\n  getPoseNodeDebugInfo (nodeIdx: number): PoseNodeDebugInfo {\n    const node = this.nodes[nodeIdx] as PoseNode;\n\n    return node.getDebugInfo();\n  }\n\n  getRuntimeNodeDebugValue<T> (nodeIdx: number): T {\n    const valueNode = this.nodes[nodeIdx] as ValueNode;\n\n    return valueNode.getValue<T>(this.context);\n  }\n\n  getNodeDebugInstance (nodeIdx: number): GraphNode {\n    return this.nodes[nodeIdx];\n  }\n\n  private isControlParameter (nodeIdx: number) {\n    return nodeIdx < this.getNumControlParameters();\n  }\n\n  private setControlParameterValue<T> (name: string, value: T) {\n    const index = this.getControlParameterIndex(name);\n\n    if (index !== InvalidIndex) {\n      (this.nodes[index] as ValueNode).setValue(value);\n    }\n  }\n}\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","import { serialize } from '../decorators';\nimport { EffectsObject } from '../effects-object';\nimport { removeItem } from '../utils';\nimport type { VFXItem } from '../vfx-item';\n\n/**\n * @since 2.0.0\n */\nexport abstract class Component extends EffectsObject {\n  name: string;\n  /**\n   * 附加到的 VFXItem 对象\n   */\n  @serialize()\n  item: VFXItem;\n  isAwakeCalled = false;\n  isStartCalled = false;\n  isEnableCalled = false;\n\n  @serialize()\n  private _enabled = true;\n\n  /**\n   * 附加到的 VFXItem 对象 Transform 组件\n   */\n  get transform () {\n    return this.item.transform;\n  }\n\n  /**\n   * 组件是否可以更新，true 更新，false 不更新\n   */\n  get isActiveAndEnabled () {\n    return this.item.isActive && this.enabled;\n  }\n\n  get enabled () {\n    return this._enabled;\n  }\n\n  set enabled (value: boolean) {\n    if (this.enabled !== value) {\n      this._enabled = value;\n      if (value) {\n        if (this.isActiveAndEnabled) {\n          this.enable();\n          if (!this.isStartCalled) {\n            this.onStart();\n            this.isStartCalled = true;\n          }\n        }\n      } else {\n        if (this.isEnableCalled) {\n          this.disable();\n        }\n      }\n    }\n  }\n\n  /**\n   * 生命周期函数，初始化后调用，生命周期内只调用一次\n   */\n  onAwake () {\n    // OVERRIDE\n  }\n\n  /**\n   * 在 enabled 变为 true 时触发\n   */\n  onEnable () {\n    // OVERRIDE\n  }\n\n  /**\n   * 在 enabled 变为 false 时触发\n   */\n  onDisable () {\n    // OVERRIDE\n  }\n\n  /**\n   * 生命周期函数，在第一次 update 前调用，生命周期内只调用一次\n   */\n  onStart () {\n    // OVERRIDE\n  }\n\n  /**\n   * 生命周期函数，每帧调用一次\n   */\n  onUpdate (dt: number) {\n    // OVERRIDE\n  }\n\n  /**\n   * 生命周期函数，每帧调用一次，在 update 之后调用\n   */\n  onLateUpdate (dt: number) {\n    // OVERRIDE\n  }\n\n  /**\n   * 生命周期函数，在组件销毁时调用\n   */\n  onDestroy () {\n    // OVERRIDE\n  }\n\n  /**\n   * 当属性被动画修改时调用\n   */\n  onApplyAnimationProperties () {\n    // OVERRIDE\n  }\n\n  /**\n   * @internal\n   */\n  enable () {\n    if (this.item.composition) {\n      this.item.composition.sceneTicking.addComponent(this);\n      this.isEnableCalled = true;\n    }\n    this.onEnable();\n  }\n\n  /**\n   * @internal\n   */\n  disable () {\n    this.onDisable();\n    if (this.item.composition) {\n      this.isEnableCalled = false;\n      this.item.composition.sceneTicking.removeComponent(this);\n    }\n  }\n\n  setVFXItem (item: VFXItem) {\n    this.item = item;\n    if (item.isDuringPlay) {\n      if (!this.isAwakeCalled) {\n        this.onAwake();\n        this.isAwakeCalled = true;\n      }\n      if (item.isActive && this.enabled) {\n        this.start();\n        this.enable();\n      }\n    }\n  }\n\n  override fromData (data: any): void {\n    super.fromData(data);\n  }\n\n  override dispose (): void {\n    if (this.isEnableCalled) {\n      this.disable();\n    }\n    if (this.isAwakeCalled) {\n      this.isAwakeCalled = false;\n      this.onDestroy();\n    }\n    if (this.item) {\n      removeItem(this.item.components, this);\n    }\n\n    super.dispose();\n  }\n\n  private start () {\n    if (this.isStartCalled) {\n      return;\n    }\n    this.isStartCalled = true;\n    this.onStart();\n  }\n}\n\n/**\n * @since 2.0.0\n * @deprecated 2.4.0 Please use Component instead\n */\nexport abstract class Behaviour extends Component {\n\n  override setVFXItem (item: VFXItem): void {\n    super.setVFXItem(item);\n  }\n\n  override dispose (): void {\n    super.dispose();\n  }\n}\n","import type * as spec from '@galacean/effects-specification';\nimport type { AnimationGraphAsset, StateMachineNode } from '../plugins/animation-graph';\nimport { GraphInstance } from '../plugins/animation-graph';\nimport { Component } from './component.js';\nimport { effectsClass } from '../decorators';\n\n/**\n * @since 2.6.0\n */\n@effectsClass('Animator')\nexport class Animator extends Component {\n  /**\n   * @internal\n   */\n  graphInstance: GraphInstance | null = null;\n  private graphAsset: AnimationGraphAsset | null = null;\n\n  /**\n   * 设置布尔类型参数\n   * @param name - 参数名\n   * @param value - 参数值\n   * @since 2.7.0\n   */\n  setBool (name: string, value: boolean) {\n    if (this.graphInstance) {\n      this.graphInstance.setBool(name, value);\n    }\n  }\n\n  /**\n   * 设置浮点类型参数\n   * @param name - 参数名\n   * @param value - 参数值\n   * @since 2.7.0\n   */\n  setFloat (name: string, value: number) {\n    if (this.graphInstance) {\n      this.graphInstance.setFloat(name, value);\n    }\n  }\n\n  /**\n   * 设置触发器参数\n   * @since 2.7.0\n   * @param name - 参数名\n   */\n  setTrigger (name: string) {\n    if (this.graphInstance) {\n      this.graphInstance.setTrigger(name);\n    }\n  }\n\n  /**\n   * 重置触发器参数\n   * @since 2.7.0\n   * @param name - 参数名\n   */\n  resetTrigger (name: string) {\n    if (this.graphInstance) {\n      this.graphInstance.resetTrigger(name);\n    }\n  }\n\n  /**\n   * 获取状态机节点\n   * @param machineName - 状态机名称\n   * @since 2.7.0\n   * @returns 状态机节点\n   */\n  getStateMachineNode (machineName: string): StateMachineNode | null {\n    let result: StateMachineNode | null = null;\n\n    if (this.graphInstance) {\n      result = this.graphInstance.getStateMachineNode(machineName);\n    }\n\n    return result;\n  }\n\n  override onStart (): void {\n    if (this.graphAsset) {\n      this.graphInstance = new GraphInstance(this.graphAsset, this.item);\n    }\n  }\n\n  override onUpdate (dt: number): void {\n    if (!this.graphInstance) {\n      return;\n    }\n\n    const result = this.graphInstance.evaluateGraph(dt / 1000);\n\n    // Apply transform animation\n    //-------------------------------------------------------------------------\n    const animatedTransforms = this.graphInstance.skeleton.animatedTransforms;\n\n    for (let i = 0; i < animatedTransforms.length; i++) {\n      const position = result.pose.parentSpaceTransforms[i].position;\n      const rotation = result.pose.parentSpaceTransforms[i].rotation;\n      const scale = result.pose.parentSpaceTransforms[i].scale;\n      const euler = result.pose.parentSpaceTransforms[i].euler;\n\n      animatedTransforms[i].setPosition(position.x, position.y, position.z);\n      animatedTransforms[i].setScale(scale.x, scale.y, scale.z);\n\n      if (this.graphInstance.skeleton.useEuler) {\n        animatedTransforms[i].setRotation(euler.x, euler.y, euler.z);\n      } else {\n        animatedTransforms[i].setQuaternion(rotation.x, rotation.y, rotation.z, rotation.w);\n      }\n    }\n\n    // Apply property animation\n    //-------------------------------------------------------------------------\n    const floatAnimatedObjects = this.graphInstance.skeleton.floatAnimatedObjects;\n\n    for (let i = 0; i < floatAnimatedObjects.length; i++) {\n      const animatedObject = floatAnimatedObjects[i];\n      const property = animatedObject.propertyName;\n\n      animatedObject.directTarget[property] = result.pose.floatPropertyValues[i];\n\n      if (animatedObject.target instanceof Component) {\n        animatedObject.target.onApplyAnimationProperties();\n      }\n    }\n\n    const colorAnimatedObjects = this.graphInstance.skeleton.colorAnimatedObjects;\n\n    for (let i = 0; i < colorAnimatedObjects.length; i++) {\n      const animatedObject = colorAnimatedObjects[i];\n      const property = animatedObject.propertyName;\n\n      animatedObject.directTarget[property] = result.pose.colorPropertyValues[i];\n\n      if (animatedObject.target instanceof Component) {\n        animatedObject.target.onApplyAnimationProperties();\n      }\n    }\n  }\n\n  override fromData (data: spec.AnimatorData): void {\n    this.graphAsset = this.engine.findObject<AnimationGraphAsset>(data.graphAsset);\n  }\n}\n","import { serialize } from '../decorators';\nimport type { Material } from '../material';\nimport type { Renderer } from '../render';\nimport { Component } from './component';\n\n/**\n * 所有渲染组件的基类\n * @since 2.0.0\n */\nexport class RendererComponent extends Component {\n\n  @serialize()\n  materials: Material[] = [];\n\n  @serialize()\n  protected _priority = 0;\n\n  get priority (): number {\n    return this._priority;\n  }\n  set priority (value: number) {\n    this._priority = value;\n  }\n\n  get material (): Material {\n    return this.materials[0];\n  }\n  set material (material: Material) {\n    if (this.materials.length === 0) {\n      this.materials.push(material);\n    } else {\n      this.materials[0] = material;\n    }\n  }\n\n  render (renderer: Renderer): void { }\n\n  override onEnable (): void {\n    this.item.composition?.renderFrame.addMeshToDefaultRenderPass(this);\n  }\n\n  override onDisable (): void {\n    this.item.composition?.renderFrame.removeMeshFromDefaultRenderPass(this);\n  }\n}\n","import { Vector3 } from './vector3';\nimport { isEqual } from './utils';\nimport { Quaternion } from './quaternion';\n/**\n * 四阶矩阵（列优先矩阵）\n */\nexport class Matrix4 {\n    static IDENTITY = new Matrix4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n    static ZERO = new Matrix4(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n    static tempVec0 = new Vector3();\n    static tempVec1 = new Vector3();\n    static tempVec2 = new Vector3();\n    static tempMat0 = new Matrix4();\n    /**\n     * 矩阵值数组\n     */\n    elements;\n    /**\n     * 构造函数，初始值为单位矩阵\n     * @param [m11=1] - 第 1 行，第 1 列\n     * @param [m21=0] - 第 2 行，第 1 列\n     * @param [m31=0] - 第 3 行，第 1 列\n     * @param [m41=0] - 第 4 行，第 1 列\n     * @param [m12=0] - 第 1 行，第 2 列\n     * @param [m22=1] - 第 2 行，第 2 列\n     * @param [m32=0] - 第 3 行，第 2 列\n     * @param [m42=0] - 第 4 行，第 2 列\n     * @param [m13=0] - 第 1 行，第 3 列\n     * @param [m23=0] - 第 2 行，第 3 列\n     * @param [m33=1] - 第 3 行，第 3 列\n     * @param [m43=0] - 第 4 行，第 3 列\n     * @param [m14=0] - 第 1 行，第 4 列\n     * @param [m24=0] - 第 2 行，第 4 列\n     * @param [m34=0] - 第 3 行，第 4 列\n     * @param [m44=1] - 第 4 行，第 4 列\n     */\n    constructor(m11 = 1, m21 = 0, m31 = 0, m41 = 0, m12 = 0, m22 = 1, m32 = 0, m42 = 0, m13 = 0, m23 = 0, m33 = 1, m43 = 0, m14 = 0, m24 = 0, m34 = 0, m44 = 1) {\n        this.elements = [\n            m11, m21, m31, m41,\n            m12, m22, m32, m42,\n            m13, m23, m33, m43,\n            m14, m24, m34, m44,\n        ];\n    }\n    /**\n     * 设置矩阵\n     * @param m11 - 第 1 行，第 1 列\n     * @param m21 - 第 2 行，第 1 列\n     * @param m31 - 第 3 行，第 1 列\n     * @param m41 - 第 4 行，第 1 列\n     * @param m12 - 第 1 行，第 2 列\n     * @param m22 - 第 2 行，第 2 列\n     * @param m32 - 第 3 行，第 2 列\n     * @param m42 - 第 4 行，第 2 列\n     * @param m13 - 第 1 行，第 3 列\n     * @param m23 - 第 2 行，第 3 列\n     * @param m33 - 第 3 行，第 3 列\n     * @param m43 - 第 4 行，第 3 列\n     * @param m14 - 第 1 行，第 4 列\n     * @param m24 - 第 2 行，第 4 列\n     * @param m34 - 第 3 行，第 4 列\n     * @param m44 - 第 4 行，第 4 列\n     * @returns 矩阵\n     */\n    set(m11, m21, m31, m41, m12, m22, m32, m42, m13, m23, m33, m43, m14, m24, m34, m44) {\n        const e = this.elements;\n        e[0] = m11;\n        e[1] = m21;\n        e[2] = m31;\n        e[3] = m41;\n        e[4] = m12;\n        e[5] = m22;\n        e[6] = m32;\n        e[7] = m42;\n        e[8] = m13;\n        e[9] = m23;\n        e[10] = m33;\n        e[11] = m43;\n        e[12] = m14;\n        e[13] = m24;\n        e[14] = m34;\n        e[15] = m44;\n        return this;\n    }\n    /**\n     * 通过行优先数据设置矩阵\n     * @param m11 - 第 1 行，第 1 列\n     * @param m12 - 第 1 行，第 2 列\n     * @param m13 - 第 1 行，第 3 列\n     * @param m14 - 第 1 行，第 4 列\n     * @param m21 - 第 2 行，第 1 列\n     * @param m22 - 第 2 行，第 2 列\n     * @param m23 - 第 2 行，第 3 列\n     * @param m24 - 第 2 行，第 4 列\n     * @param m31 - 第 3 行，第 1 列\n     * @param m32 - 第 3 行，第 2 列\n     * @param m33 - 第 3 行，第 3 列\n     * @param m34 - 第 3 行，第 4 列\n     * @param m41 - 第 4 行，第 1 列\n     * @param m42 - 第 4 行，第 2 列\n     * @param m43 - 第 4 行，第 3 列\n     * @param m44 - 第 4 行，第 4 列\n     * @returns 矩阵\n     */\n    setFromRowMajorData(m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44) {\n        const e = this.elements;\n        e[0] = m11;\n        e[4] = m12;\n        e[8] = m13;\n        e[12] = m14;\n        e[1] = m21;\n        e[5] = m22;\n        e[9] = m23;\n        e[13] = m24;\n        e[2] = m31;\n        e[6] = m32;\n        e[10] = m33;\n        e[14] = m34;\n        e[3] = m41;\n        e[7] = m42;\n        e[11] = m43;\n        e[15] = m44;\n        return this;\n    }\n    /**\n     * 通过四个列向量设置矩阵\n     * @param c1 - 第一列\n     * @param c2 - 第二列\n     * @param c3 - 第三列\n     * @param c4 - 第四列\n     * @returns 矩阵\n     */\n    setFromColumnVectors(c1, c2, c3, c4) {\n        return this.set(c1.x, c1.y, c1.z, c1.w, c2.x, c2.y, c2.z, c2.w, c3.x, c3.y, c3.z, c3.w, c4.x, c4.y, c4.z, c4.w);\n    }\n    /**\n     * 通过三维矩阵设置矩阵\n     * @param m - 三维矩阵\n     * @returns 设置结果\n     */\n    setFromMatrix3(m) {\n        const me = m.elements;\n        this.set(me[0], me[1], me[2], 0, me[3], me[4], me[5], 0, me[6], me[7], me[8], 0, 0, 0, 0, 1);\n        return this;\n    }\n    /**\n     * 通过数组设置矩阵\n     * @param array - 数组\n     * @param [offset=0] - 起始偏移值\n     * @returns 矩阵\n     */\n    setFromArray(array, offset = 0) {\n        for (let i = 0; i < 16; i++) {\n            this.elements[i] = array[offset + i];\n        }\n        return this;\n    }\n    /**\n     * 通过缩放设置矩阵\n     * @param x - x 方向缩放\n     * @param y - y 方向缩放\n     * @param z - z 方向缩放\n     * @returns 缩放矩阵\n     */\n    setFromScale(x, y, z) {\n        return this.set(x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1);\n    }\n    /**\n     * 通过平移设置矩阵\n     * @param x - x 方向平移\n     * @param y - y 方向平移\n     * @param z - z 方向平移\n     * @returns 平移矩阵\n     */\n    setFromTranslation(x, y, z) {\n        return this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1);\n    }\n    /**\n     * 通过 x 轴旋转角度设置矩阵\n     * @param theta - x 轴旋转弧度\n     * @returns 矩阵\n     */\n    setFromRotationX(theta) {\n        const c = Math.cos(theta);\n        const s = Math.sin(theta);\n        return this.set(1, 0, 0, 0, 0, c, s, 0, 0, -s, c, 0, 0, 0, 0, 1);\n    }\n    /**\n     * 通过 y 轴旋转角度设置矩阵\n     * @param theta - y 轴旋转弧度\n     * @returns 矩阵\n     */\n    setFromRotationY(theta) {\n        const c = Math.cos(theta);\n        const s = Math.sin(theta);\n        return this.set(c, 0, -s, 0, 0, 1, 0, 0, s, 0, c, 0, 0, 0, 0, 1);\n    }\n    /**\n     * 通过 z 轴旋转角度设置矩阵\n     * @param theta - z 轴旋转弧度\n     * @returns 矩阵\n     */\n    setFromRotationZ(theta) {\n        const c = Math.cos(theta);\n        const s = Math.sin(theta);\n        return this.set(c, s, 0, 0, -s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n    }\n    /**\n     * 根据三维旋转轴与弧度设置矩阵\n     * @param axis - 三维旋转轴\n     * @param angle - 旋转弧度\n     * @returns 矩阵\n     */\n    setFromRotationAxis(axis, angle) {\n        // Based on http://www.gamedev.net/reference/articles/article1199.asp\n        const v = Matrix4.tempVec0;\n        v.copyFrom(axis).normalize();\n        const c = Math.cos(angle);\n        const s = Math.sin(angle);\n        const t = 1 - c;\n        const { x, y, z } = v;\n        const tx = t * x;\n        const ty = t * y;\n        return this.set(tx * x + c, tx * y + s * z, tx * z - s * y, 0, tx * y - s * z, ty * y + c, ty * z + s * x, 0, tx * z + s * y, ty * z - s * x, t * z * z + c, 0, 0, 0, 0, 1);\n    }\n    /**\n     * 通过欧拉角设置矩阵\n     * @param euler - 欧拉角\n     * @returns 矩阵\n     */\n    setFromEuler(euler) {\n        euler.toMatrix4(this);\n        return this;\n    }\n    /**\n     * 通过四元数设置矩阵\n     * @param quat - 四元数\n     * @returns 矩阵\n     */\n    setFromQuaternion(quat) {\n        return this.compose(Vector3.ZERO, quat, Vector3.ONE);\n    }\n    /**\n     * 通过倾斜参数设置矩阵\n     * @param x - x 方向倾斜分量\n     * @param y - y 方向倾斜分量\n     * @param z - z 方向倾斜分量\n     * @returns 倾斜矩阵\n     */\n    setFromShear(x, y, z) {\n        return this.set(1, x, x, 0, y, 1, y, 0, z, z, 1, 0, 0, 0, 0, 1);\n    }\n    /**\n     * 通过基轴设置矩阵\n     * @param xAxis - x 轴\n     * @param yAxis - y 轴\n     * @param zAxis - z 轴\n     * @returns 倾斜矩阵\n     */\n    setFromBasis(xAxis, yAxis, zAxis) {\n        return this.set(xAxis.x, xAxis.y, xAxis.z, 0, yAxis.x, yAxis.y, yAxis.z, 0, zAxis.x, zAxis.y, zAxis.z, 0, 0, 0, 0, 1);\n    }\n    /**\n     * 矩阵清零\n     * @returns 零矩阵\n     */\n    setZero() {\n        for (let i = 0; i < 16; i++) {\n            this.elements[i] = 0;\n        }\n        return this;\n    }\n    /**\n     * 矩阵单位化\n     * @returns 单位矩阵\n     */\n    identity() {\n        return this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n    }\n    /**\n     * 单位阵判断\n     * @returns 判断结果\n     */\n    isIdentity() {\n        const e = this.elements;\n        return e[0] === 1 && e[4] === 0 && e[8] === 0 && e[12] === 0\n            && e[1] === 0 && e[5] === 1 && e[9] === 0 && e[13] === 0\n            && e[2] === 0 && e[6] === 0 && e[10] === 1 && e[14] === 0\n            && e[3] === 0 && e[7] === 0 && e[11] === 0 && e[15] === 1;\n    }\n    /**\n     * 矩阵克隆\n     * @returns 克隆结果\n     */\n    clone() {\n        const e = this.elements;\n        return new Matrix4(e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7], e[8], e[9], e[10], e[11], e[12], e[13], e[14], e[15]);\n    }\n    /**\n     * 矩阵复制\n     * @param m - 复制对象\n     * @returns 复制结果\n     */\n    copyFrom(m) {\n        this.elements = [...m.elements];\n        return this;\n    }\n    /**\n     * 得到列向量\n     * @param i - 列向量索引，从 0 开始\n     * @param v\n     * @returns 矩阵\n     */\n    getColumnVector(i, v) {\n        return v.set(this.elements[i * 4], this.elements[i * 4 + 1], this.elements[i * 4 + 2], this.elements[i * 4 + 3]);\n    }\n    /**\n     * 设置相机矩阵\n     * @param eye - 相机位置\n     * @param target - 目标位置\n     * @param up - 相机方向\n     * @returns 矩阵\n     */\n    lookAt(eye, target, up) {\n        const vX = Matrix4.tempVec0;\n        const vY = Matrix4.tempVec1;\n        const vZ = Matrix4.tempVec2;\n        vZ.subtractVectors(eye, target);\n        vZ.normalize();\n        vX.crossVectors(up, vZ);\n        vX.normalize();\n        vY.crossVectors(vZ, vX);\n        const te = this.elements;\n        te[0] = vX.x;\n        te[1] = vY.x;\n        te[2] = vZ.x;\n        te[3] = 0;\n        te[4] = vX.y;\n        te[5] = vY.y;\n        te[6] = vZ.y;\n        te[7] = 0;\n        te[8] = vX.z;\n        te[9] = vY.z;\n        te[10] = vZ.z;\n        te[11] = 0;\n        te[12] = -vX.dot(eye);\n        te[13] = -vY.dot(eye);\n        te[14] = -vZ.dot(eye);\n        te[15] = 1;\n        return this;\n    }\n    /**\n     * 矩阵乘比例后相加\n     * @param right - 矩阵\n     * @param s - 比例\n     * @returns 相加结果\n     */\n    addScaledMatrix(right, s) {\n        const te = this.elements;\n        const re = right.elements;\n        for (let i = 0; i < 16; i++) {\n            te[i] += re[i] * s;\n        }\n        return this;\n    }\n    /**\n     * 矩阵右乘\n     * @param right - 右侧矩阵或数值\n     * @returns 右乘结果\n     */\n    multiply(right) {\n        if (typeof right === 'number') {\n            for (let i = 0; i < 16; i++) {\n                this.elements[i] *= right;\n            }\n            return this;\n        }\n        else {\n            return this.multiplyMatrices(this, right);\n        }\n    }\n    /**\n     * 矩阵左乘\n     * @param left - 左侧矩阵\n     * @returns 左乘结果\n     */\n    premultiply(left) {\n        return this.multiplyMatrices(left, this);\n    }\n    /**\n     * 矩阵相乘\n     * @param left - 矩阵\n     * @param right - 矩阵\n     * @returns 相乘结果\n     */\n    multiplyMatrices(left, right) {\n        const ae = left.elements;\n        const be = right.elements;\n        const te = this.elements;\n        const a11 = ae[0], a12 = ae[4], a13 = ae[8], a14 = ae[12];\n        const a21 = ae[1], a22 = ae[5], a23 = ae[9], a24 = ae[13];\n        const a31 = ae[2], a32 = ae[6], a33 = ae[10], a34 = ae[14];\n        const a41 = ae[3], a42 = ae[7], a43 = ae[11], a44 = ae[15];\n        const b11 = be[0], b12 = be[4], b13 = be[8], b14 = be[12];\n        const b21 = be[1], b22 = be[5], b23 = be[9], b24 = be[13];\n        const b31 = be[2], b32 = be[6], b33 = be[10], b34 = be[14];\n        const b41 = be[3], b42 = be[7], b43 = be[11], b44 = be[15];\n        te[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n        te[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n        te[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n        te[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n        te[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n        te[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n        te[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n        te[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n        te[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n        te[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n        te[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n        te[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n        te[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n        te[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n        te[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n        te[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n        return this;\n    }\n    /**\n     * 矩阵缩放\n     * @param s - 缩放比例\n     * @returns 缩放结果\n     */\n    multiplyScalar(s) {\n        const e = this.elements;\n        e[0] *= s;\n        e[4] *= s;\n        e[8] *= s;\n        e[12] *= s;\n        e[1] *= s;\n        e[5] *= s;\n        e[9] *= s;\n        e[13] *= s;\n        e[2] *= s;\n        e[6] *= s;\n        e[10] *= s;\n        e[14] *= s;\n        e[3] *= s;\n        e[7] *= s;\n        e[11] *= s;\n        e[15] *= s;\n        return this;\n    }\n    /**\n     * 矩阵求行列式值\n     * @returns 行列式值\n     */\n    determinant() {\n        const e = this.elements;\n        const m11 = e[0], m12 = e[4], m13 = e[8], m14 = e[12];\n        const m21 = e[1], m22 = e[5], m23 = e[9], m24 = e[13];\n        const m31 = e[2], m32 = e[6], m33 = e[10], m34 = e[14];\n        const m41 = e[3], m42 = e[7], m43 = e[11], m44 = e[15];\n        return (m41 * (+m14 * m23 * m32\n            - m13 * m24 * m32\n            - m14 * m22 * m33\n            + m12 * m24 * m33\n            + m13 * m22 * m34\n            - m12 * m23 * m34) +\n            m42 * (+m11 * m23 * m34\n                - m11 * m24 * m33\n                + m14 * m21 * m33\n                - m13 * m21 * m34\n                + m13 * m24 * m31\n                - m14 * m23 * m31) +\n            m43 * (+m11 * m24 * m32\n                - m11 * m22 * m34\n                - m14 * m21 * m32\n                + m12 * m21 * m34\n                + m14 * m22 * m31\n                - m12 * m24 * m31) +\n            m44 * (-m13 * m22 * m31\n                - m11 * m23 * m32\n                + m11 * m22 * m33\n                + m13 * m21 * m32\n                - m12 * m21 * m33\n                + m12 * m23 * m31));\n    }\n    /**\n     * 矩阵转置\n     * @returns 转置结果\n     */\n    transpose() {\n        const e = this.elements;\n        let t;\n        t = e[1];\n        e[1] = e[4];\n        e[4] = t;\n        t = e[2];\n        e[2] = e[8];\n        e[8] = t;\n        t = e[3];\n        e[3] = e[12];\n        e[12] = t;\n        //\n        t = e[6];\n        e[6] = e[9];\n        e[9] = t;\n        t = e[7];\n        e[7] = e[13];\n        e[13] = t;\n        t = e[11];\n        e[11] = e[14];\n        e[14] = t;\n        return this;\n    }\n    /**\n     * 矩阵求逆\n     * @returns 逆矩阵\n     */\n    invert() {\n        // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n        const e = this.elements;\n        const m11 = e[0], m21 = e[1], m31 = e[2], m41 = e[3];\n        const m12 = e[4], m22 = e[5], m32 = e[6], m42 = e[7];\n        const m13 = e[8], m23 = e[9], m33 = e[10], m43 = e[11];\n        const m14 = e[12], m24 = e[13], m34 = e[14], m44 = e[15];\n        const t11 = m23 * m34 * m42 - m24 * m33 * m42 + m24 * m32 * m43 - m22 * m34 * m43 - m23 * m32 * m44 + m22 * m33 * m44;\n        const t12 = m14 * m33 * m42 - m13 * m34 * m42 - m14 * m32 * m43 + m12 * m34 * m43 + m13 * m32 * m44 - m12 * m33 * m44;\n        const t13 = m13 * m24 * m42 - m14 * m23 * m42 + m14 * m22 * m43 - m12 * m24 * m43 - m13 * m22 * m44 + m12 * m23 * m44;\n        const t14 = m14 * m23 * m32 - m13 * m24 * m32 - m14 * m22 * m33 + m12 * m24 * m33 + m13 * m22 * m34 - m12 * m23 * m34;\n        const det = m11 * t11 + m21 * t12 + m31 * t13 + m41 * t14;\n        if (det === 0) {\n            return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n        }\n        const detInv = 1 / det;\n        e[0] = t11 * detInv;\n        e[1] = (m24 * m33 * m41 - m23 * m34 * m41 - m24 * m31 * m43 + m21 * m34 * m43 + m23 * m31 * m44 - m21 * m33 * m44) * detInv;\n        e[2] = (m22 * m34 * m41 - m24 * m32 * m41 + m24 * m31 * m42 - m21 * m34 * m42 - m22 * m31 * m44 + m21 * m32 * m44) * detInv;\n        e[3] = (m23 * m32 * m41 - m22 * m33 * m41 - m23 * m31 * m42 + m21 * m33 * m42 + m22 * m31 * m43 - m21 * m32 * m43) * detInv;\n        e[4] = t12 * detInv;\n        e[5] = (m13 * m34 * m41 - m14 * m33 * m41 + m14 * m31 * m43 - m11 * m34 * m43 - m13 * m31 * m44 + m11 * m33 * m44) * detInv;\n        e[6] = (m14 * m32 * m41 - m12 * m34 * m41 - m14 * m31 * m42 + m11 * m34 * m42 + m12 * m31 * m44 - m11 * m32 * m44) * detInv;\n        e[7] = (m12 * m33 * m41 - m13 * m32 * m41 + m13 * m31 * m42 - m11 * m33 * m42 - m12 * m31 * m43 + m11 * m32 * m43) * detInv;\n        e[8] = t13 * detInv;\n        e[9] = (m14 * m23 * m41 - m13 * m24 * m41 - m14 * m21 * m43 + m11 * m24 * m43 + m13 * m21 * m44 - m11 * m23 * m44) * detInv;\n        e[10] = (m12 * m24 * m41 - m14 * m22 * m41 + m14 * m21 * m42 - m11 * m24 * m42 - m12 * m21 * m44 + m11 * m22 * m44) * detInv;\n        e[11] = (m13 * m22 * m41 - m12 * m23 * m41 - m13 * m21 * m42 + m11 * m23 * m42 + m12 * m21 * m43 - m11 * m22 * m43) * detInv;\n        e[12] = t14 * detInv;\n        e[13] = (m13 * m24 * m31 - m14 * m23 * m31 + m14 * m21 * m33 - m11 * m24 * m33 - m13 * m21 * m34 + m11 * m23 * m34) * detInv;\n        e[14] = (m14 * m22 * m31 - m12 * m24 * m31 - m14 * m21 * m32 + m11 * m24 * m32 + m12 * m21 * m34 - m11 * m22 * m34) * detInv;\n        e[15] = (m12 * m23 * m31 - m13 * m22 * m31 + m13 * m21 * m32 - m11 * m23 * m32 - m12 * m21 * m33 + m11 * m22 * m33) * detInv;\n        return this;\n    }\n    /**\n     * 提取基轴\n     * @param xAxis - 提取的 x 轴\n     * @param yAxis - 提取的 y 轴\n     * @param zAxis - 提取的 z 轴\n     * @returns\n     */\n    extractBasis(xAxis, yAxis, zAxis) {\n        const te = this.elements;\n        xAxis.set(te[0], te[1], te[2]);\n        yAxis.set(te[4], te[5], te[6]);\n        zAxis.set(te[8], te[9], te[10]);\n        return this;\n    }\n    /**\n     * 根据基础信息组装矩阵\n     * @param translation - 位置信息\n     * @param rotation - 旋转信息\n     * @param scale - 缩放信息\n     * @param [anchor] - 锚点信息\n     * @returns 矩阵\n     */\n    compose(translation, rotation, scale, anchor = Vector3.ZERO) {\n        const te = this.elements;\n        const { x, y, z, w } = rotation;\n        const l = -anchor.x;\n        const m = -anchor.y;\n        const n = -anchor.z;\n        const x2 = x + x;\n        const y2 = y + y;\n        const z2 = z + z;\n        const xx = x * x2;\n        const xy = x * y2;\n        const xz = x * z2;\n        const yy = y * y2;\n        const yz = y * z2;\n        const zz = z * z2;\n        const wx = w * x2;\n        const wy = w * y2;\n        const wz = w * z2;\n        const { x: sx, y: sy, z: sz } = scale;\n        te[0] = (1 - (yy + zz)) * sx;\n        te[1] = (xy + wz) * sx;\n        te[2] = (xz - wy) * sx;\n        te[3] = 0;\n        te[4] = (xy - wz) * sy;\n        te[5] = (1 - (xx + zz)) * sy;\n        te[6] = (yz + wx) * sy;\n        te[7] = 0;\n        te[8] = (xz + wy) * sz;\n        te[9] = (yz - wx) * sz;\n        te[10] = (1 - (xx + yy)) * sz;\n        te[11] = 0;\n        te[12] = l * te[0] + m * te[4] + n * te[8] - l + translation.x;\n        te[13] = l * te[1] + m * te[5] + n * te[9] - m + translation.y;\n        te[14] = l * te[2] + m * te[6] + n * te[10] - n + translation.z;\n        return this;\n    }\n    /**\n     * 矩阵拆分为基础信息\n     * @param translation - 位置信息\n     * @param rotation - 旋转信息\n     * @param scale - 缩放信息\n     * @returns 矩阵\n     */\n    decompose(translation, rotation, scale) {\n        const v = Matrix4.tempVec0;\n        const te = this.elements;\n        let sx = v.set(te[0], te[1], te[2]).length();\n        const sy = v.set(te[4], te[5], te[6]).length();\n        const sz = v.set(te[8], te[9], te[10]).length();\n        // if determine is negative, we need to invert one scale\n        const det = this.determinant();\n        if (det < 0) {\n            sx = -sx;\n        }\n        translation.x = te[12];\n        translation.y = te[13];\n        translation.z = te[14];\n        // scale the rotation part\n        const m = Matrix4.tempMat0;\n        m.copyFrom(this);\n        const invSX = 1 / sx;\n        const invSY = 1 / sy;\n        const invSZ = 1 / sz;\n        m.elements[0] *= invSX;\n        m.elements[1] *= invSX;\n        m.elements[2] *= invSX;\n        m.elements[4] *= invSY;\n        m.elements[5] *= invSY;\n        m.elements[6] *= invSY;\n        m.elements[8] *= invSZ;\n        m.elements[9] *= invSZ;\n        m.elements[10] *= invSZ;\n        rotation.setFromRotationMatrix(m);\n        scale.x = sx;\n        scale.y = sy;\n        scale.z = sz;\n        return this;\n    }\n    getTranslation(translation) {\n        const te = this.elements;\n        return translation.set(te[12], te[13], te[14]);\n    }\n    getScale(scale) {\n        const te = this.elements;\n        return scale.set(Math.hypot(te[0], te[1], te[2]), Math.hypot(te[4], te[5], te[6]), Math.hypot(te[8], te[9], te[10]));\n    }\n    /**\n     * 获得矩阵分解的结果\n     * @returns 分解的结果\n     */\n    getTransform() {\n        const translation = new Vector3();\n        const rotation = new Quaternion();\n        const scale = new Vector3();\n        this.decompose(translation, rotation, scale);\n        return { translation, rotation, scale };\n    }\n    /**\n     * 根据视窗信息设置正交相机投影矩阵\n     * @param left - 视窗左平面位置\n     * @param right - 视窗右平面位置\n     * @param top - 视窗上平面位置\n     * @param bottom - 视窗下平面位置\n     * @param near - 视窗近平面位置\n     * @param far - 视窗远平面位置\n     * @returns 矩阵\n     */\n    orthographic(left, right, top, bottom, near, far) {\n        let a = 1.0 / (right - left);\n        let b = 1.0 / (top - bottom);\n        let c = 1.0 / (far - near);\n        const tx = -(right + left) * a;\n        const ty = -(top + bottom) * b;\n        const tz = -(far + near) * c;\n        a *= 2.0;\n        b *= 2.0;\n        c *= -2.0;\n        const te = this.elements;\n        te[0] = a;\n        te[1] = 0.0;\n        te[2] = 0.0;\n        te[3] = 0.0;\n        //\n        te[4] = 0.0;\n        te[5] = b;\n        te[6] = 0.0;\n        te[7] = 0.0;\n        //\n        te[8] = 0.0;\n        te[9] = 0.0;\n        te[10] = c;\n        te[11] = 0.0;\n        //\n        te[12] = tx;\n        te[13] = ty;\n        te[14] = tz;\n        te[15] = 1.0;\n        return this;\n    }\n    /**\n     * 通过透视相机基础参数设置投影矩阵\n     * @param fov - 视角(弧度)\n     * @param aspect - 视窗比例\n     * @param near - 近平面\n     * @param far - 远平面\n     * @param [reverse] - 视锥体长宽反转(3D这里反了？)\n     * @returns 投影矩阵\n     */\n    perspective(fov, aspect, near, far, reverse) {\n        const f = 1.0 / Math.tan(fov * 0.5);\n        const nf = 1 / (near - far);\n        const te = this.elements;\n        te[0] = reverse ? f : f / aspect;\n        te[1] = 0;\n        te[2] = 0;\n        te[3] = 0;\n        //\n        te[4] = 0;\n        te[5] = reverse ? f * aspect : f;\n        te[6] = 0;\n        te[7] = 0;\n        //\n        te[8] = 0;\n        te[9] = 0;\n        te[10] = (far + near) * nf;\n        te[11] = -1;\n        //\n        te[12] = 0;\n        te[13] = 0;\n        te[14] = 2 * far * near * nf;\n        te[15] = 0;\n        if (far === null || far === Infinity) {\n            te[10] = -1;\n            te[14] = -2 * near;\n        }\n        return this;\n    }\n    /**\n     * 对点进行投影变换\n     * @param v - 输入点\n     * @param [out] - 输出点，如果没有就覆盖输入的数据\n     * @returns 投影后的点\n     */\n    projectPoint(v, out) {\n        const { x, y, z } = v;\n        const e = this.elements;\n        const res = out ?? v;\n        res.x = e[0] * x + e[4] * y + e[8] * z + e[12];\n        res.y = e[1] * x + e[5] * y + e[9] * z + e[13];\n        res.z = e[2] * x + e[6] * y + e[10] * z + e[14];\n        const w = e[3] * x + e[7] * y + e[11] * z + e[15];\n        return res.multiply(1 / w);\n    }\n    /**\n     * 对点进行矩阵变换\n     * @param v - 输入点\n     * @param [out] - 输出点，如果没有就覆盖输入的数据\n     * @returns 变换后的点\n     */\n    transformPoint(v, out) {\n        const { x, y, z } = v;\n        const e = this.elements;\n        const res = out ?? v;\n        res.x = e[0] * x + e[4] * y + e[8] * z + e[12];\n        res.y = e[1] * x + e[5] * y + e[9] * z + e[13];\n        res.z = e[2] * x + e[6] * y + e[10] * z + e[14];\n        return res;\n    }\n    /**\n     * 对法向量进行矩阵变换\n     * @param v - 输入法向量\n     * @param [out] - 输出法向量，如果没有就覆盖输入的数据\n     * @returns 变换后的法向量\n     */\n    transformNormal(v, out) {\n        const { x, y, z } = v;\n        const e = this.elements;\n        const res = out ?? v;\n        res.x = e[0] * x + e[4] * y + e[8] * z;\n        res.y = e[1] * x + e[5] * y + e[9] * z;\n        res.z = e[2] * x + e[6] * y + e[10] * z;\n        return res.normalize();\n    }\n    /**\n     * 对四维向量进行矩阵变换\n     * @param v - 输入向量\n     * @param [out] - 输出向量，如果没有就覆盖输入的数据\n     * @returns 变换后向量\n     */\n    transformVector4(v, out) {\n        const { x, y, z, w } = v;\n        const e = this.elements;\n        const res = out ?? v;\n        res.x = e[0] * x + e[4] * y + e[8] * z + e[12] * w;\n        res.y = e[1] * x + e[5] * y + e[9] * z + e[13] * w;\n        res.z = e[2] * x + e[6] * y + e[10] * z + e[14] * w;\n        res.w = e[3] * x + e[7] * y + e[11] * z + e[15] * w;\n        return res;\n    }\n    /**\n     * 矩阵判等\n     * @param matrix - 矩阵\n     * @returns 判等结果\n     */\n    equals(matrix) {\n        const te = this.elements;\n        const me = matrix.elements;\n        for (let i = 0; i < 16; i++) {\n            if (!isEqual(te[i], me[i])) {\n                return false;\n            }\n        }\n        return true;\n    }\n    /**\n     * 矩阵转数组\n     * @returns\n     */\n    toArray() {\n        return [...this.elements];\n    }\n    fill(array, offset = 0) {\n        const te = this.elements;\n        array[offset] = te[0];\n        array[offset + 1] = te[1];\n        array[offset + 2] = te[2];\n        array[offset + 3] = te[3];\n        array[offset + 4] = te[4];\n        array[offset + 5] = te[5];\n        array[offset + 6] = te[6];\n        array[offset + 7] = te[7];\n        array[offset + 8] = te[8];\n        array[offset + 9] = te[9];\n        array[offset + 10] = te[10];\n        array[offset + 11] = te[11];\n        array[offset + 12] = te[12];\n        array[offset + 13] = te[13];\n        array[offset + 14] = te[14];\n        array[offset + 15] = te[15];\n    }\n    /**\n     * 创建单位阵\n     * @returns 单位矩阵\n     */\n    static fromIdentity() {\n        return new Matrix4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n    }\n    /**\n     * 创建相机矩阵\n     * @param eye - 相机位置\n     * @param target - 目标位置\n     * @param up - 相机方向\n     * @returns 矩阵\n     */\n    static fromLookAt(eye, target, up) {\n        return new Matrix4().lookAt(eye, target, up);\n    }\n    /**\n     * 创建投影矩阵\n     * @param fov - 视角\n     * @param aspect - 视窗比例\n     * @param near - 近平面\n     * @param far - 远平面\n     * @param [reverse] - 视锥体长宽反转\n     * @returns 投影矩阵\n     */\n    static fromPerspective(fov, aspect, near, far, reverse) {\n        return new Matrix4().perspective(fov, aspect, near, far, reverse);\n    }\n    /**\n     * 通过四个列向量创建矩阵\n     * @param c1 - 第一列\n     * @param c2 - 第二列\n     * @param c3 - 第三列\n     * @param c4 - 第四列\n     * @returns\n     */\n    static fromColumnVectors(c1, c2, c3, c4) {\n        return new Matrix4().setFromColumnVectors(c1, c2, c3, c4);\n    }\n    /**\n     * 通过三阶矩阵创建矩阵\n     * @param m - 三阶矩阵\n     * @returns 创建的矩阵\n     */\n    static fromMatrix3(m) {\n        return new Matrix4().setFromMatrix3(m);\n    }\n    /**\n     * 通过数组创建矩阵\n     * @param array - 数组\n     * @param [offset=0] - 起始偏移值\n     * @returns 矩阵\n     */\n    static fromArray(array, offset = 0) {\n        return new Matrix4().setFromArray(array, offset);\n    }\n    /**\n     * 通过缩放创建矩阵\n     * @param x - x 缩放\n     * @param y - y 缩放\n     * @param z - z 缩放\n     * @returns 缩放结果\n     */\n    static fromScale(x, y, z) {\n        return new Matrix4().setFromScale(x, y, z);\n    }\n    /**\n     * 通过平移创建矩阵\n     * @param x - x 平移\n     * @param y - y 平移\n     * @param z - z 平移\n     * @returns 平移结果\n     */\n    static fromTranslation(x, y, z) {\n        return new Matrix4().setFromTranslation(x, y, z);\n    }\n    /**\n     * 通过 x 轴旋转创建矩阵\n     * @param theta - x 轴旋转弧度\n     * @returns 矩阵\n     */\n    static fromRotationX(theta) {\n        return new Matrix4().setFromRotationX(theta);\n    }\n    /**\n     * 通过 y 轴旋转创建矩阵\n     * @param theta - y 轴旋转弧度\n     * @returns 矩阵\n     */\n    static fromRotationY(theta) {\n        return new Matrix4().setFromRotationY(theta);\n    }\n    /**\n     * 通过 z 轴旋转创建矩阵\n     * @param theta - z 轴旋转弧度\n     * @returns\n     */\n    static fromRotationZ(theta) {\n        return new Matrix4().setFromRotationZ(theta);\n    }\n    /**\n     * 通过旋转轴与旋转弧度创建矩阵\n     * @param axis - 旋转轴\n     * @param angle - 旋转弧度\n     * @returns\n     */\n    static fromRotationAxis(axis, angle) {\n        return new Matrix4().setFromRotationAxis(axis, angle);\n    }\n    /**\n     * 通过欧拉角创建矩阵\n     * @param euler - 欧拉角\n     * @returns\n     */\n    static fromEuler(euler) {\n        return new Matrix4().setFromEuler(euler);\n    }\n    /**\n     * 通过四元数创建矩阵\n     * @param quat - 四元数\n     * @returns\n     */\n    static fromQuaternion(quat) {\n        return new Matrix4().setFromQuaternion(quat);\n    }\n    /**\n     * 通过倾斜创建矩阵\n     * @param x - x 方向倾斜分量\n     * @param y - y 方向倾斜分量\n     * @param z - z 方向倾斜分量\n     * @returns 倾斜矩阵\n     */\n    static fromShear(x, y, z) {\n        return new Matrix4().setFromShear(x, y, z);\n    }\n    /**\n     * 通过基轴创建矩阵\n     * @param xAxis - x 轴\n     * @param yAxis - y 轴\n     * @param zAxis - z 轴\n     * @returns\n     */\n    static fromBasis(xAxis, yAxis, zAxis) {\n        return new Matrix4().setFromBasis(xAxis, yAxis, zAxis);\n    }\n    /**\n     * 通过行优先数据设置矩阵\n     * @param m11 - 第 1 行，第 1 列\n     * @param m12 - 第 1 行，第 2 列\n     * @param m13 - 第 1 行，第 3 列\n     * @param m14 - 第 1 行，第 4 列\n     * @param m21 - 第 2 行，第 1 列\n     * @param m22 - 第 2 行，第 2 列\n     * @param m23 - 第 2 行，第 3 列\n     * @param m24 - 第 2 行，第 4 列\n     * @param m31 - 第 3 行，第 1 列\n     * @param m32 - 第 3 行，第 2 列\n     * @param m33 - 第 3 行，第 3 列\n     * @param m34 - 第 3 行，第 4 列\n     * @param m41 - 第 4 行，第 1 列\n     * @param m42 - 第 4 行，第 2 列\n     * @param m43 - 第 4 行，第 3 列\n     * @param m44 - 第 4 行，第 4 列\n     * @returns\n     */\n    static fromRowMajorData(m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44) {\n        return new Matrix4(m11, m21, m31, m41, m12, m22, m32, m42, m13, m23, m33, m43, m14, m24, m34, m44);\n    }\n}\n","import { Quaternion } from './quaternion';\nimport { Matrix4 } from './matrix4';\nimport { RAD2DEG, clamp } from './utils';\nimport { DEG2RAD } from './utils';\n/**\n * 欧拉角顺序\n */\nexport var EulerOrder;\n(function (EulerOrder) {\n    EulerOrder[EulerOrder[\"XYZ\"] = 0] = \"XYZ\";\n    EulerOrder[EulerOrder[\"XZY\"] = 1] = \"XZY\";\n    EulerOrder[EulerOrder[\"YXZ\"] = 2] = \"YXZ\";\n    EulerOrder[EulerOrder[\"YZX\"] = 3] = \"YZX\";\n    EulerOrder[EulerOrder[\"ZXY\"] = 4] = \"ZXY\";\n    EulerOrder[EulerOrder[\"ZYX\"] = 5] = \"ZYX\";\n})(EulerOrder || (EulerOrder = {}));\n/**\n * 欧拉角\n */\nexport class Euler {\n    x;\n    y;\n    z;\n    order;\n    static DEFAULT_ORDER = EulerOrder.ZYX;\n    static tempQuat0 = new Quaternion();\n    static tempMat0 = new Matrix4();\n    /**\n     * 构造函数，传入值为 x, y, z 方向分量以及欧拉角顺序\n     * @param [x=0] - x 方向分量\n     * @param [y=0] - y 方向分量\n     * @param [z=0] - z 方向分量\n     * @param [order=Euler.DEFAULT_ORDER] - 欧拉角顺序\n     */\n    constructor(x = 0, y = 0, z = 0, order = Euler.DEFAULT_ORDER) {\n        this.x = x;\n        this.y = y;\n        this.z = z;\n        this.order = order;\n    }\n    /**\n     * 设置欧拉角\n     * @param x - x 方向分量\n     * @param y - y 方向分量\n     * @param z - z 方向分量\n     * @param [order] - 欧拉角顺序\n     * @returns\n     */\n    set(x, y, z, order = this.order) {\n        this.x = x;\n        this.y = y;\n        this.z = z;\n        this.order = order;\n        return this;\n    }\n    setZero(order = this.order) {\n        return this.set(0, 0, 0, order);\n    }\n    /**\n     * 通过矩阵设置欧拉角\n     * @param m - 矩阵\n     * @param [order] - 欧拉角顺序\n     * @returns\n     */\n    setFromRotationMatrix4(m, order = this.order) {\n        const te = m.elements;\n        const m11 = te[0];\n        const m12 = te[4];\n        const m13 = te[8];\n        const m21 = te[1];\n        const m22 = te[5];\n        const m23 = te[9];\n        const m31 = te[2];\n        const m32 = te[6];\n        const m33 = te[10];\n        switch (order) {\n            case EulerOrder.XYZ:\n                this.y = Math.asin(clamp(m13, -1, 1));\n                if (Math.abs(m13) < 0.9999999) {\n                    this.x = Math.atan2(-m23, m33);\n                    this.z = Math.atan2(-m12, m11);\n                }\n                else {\n                    this.x = Math.atan2(m32, m22);\n                    this.z = 0;\n                }\n                break;\n            case EulerOrder.YXZ:\n                this.x = Math.asin(-clamp(m23, -1, 1));\n                if (Math.abs(m23) < 0.9999999) {\n                    this.y = Math.atan2(m13, m33);\n                    this.z = Math.atan2(m21, m22);\n                }\n                else {\n                    this.y = Math.atan2(-m31, m11);\n                    this.z = 0;\n                }\n                break;\n            case EulerOrder.ZXY:\n                this.x = Math.asin(clamp(m32, -1, 1));\n                if (Math.abs(m32) < 0.9999999) {\n                    this.y = Math.atan2(-m31, m33);\n                    this.z = Math.atan2(-m12, m22);\n                }\n                else {\n                    this.y = 0;\n                    this.z = Math.atan2(m21, m11);\n                }\n                break;\n            case EulerOrder.ZYX:\n                this.y = Math.asin(-clamp(m31, -1, 1));\n                if (Math.abs(m31) < 0.9999999) {\n                    this.x = Math.atan2(m32, m33);\n                    this.z = Math.atan2(m21, m11);\n                }\n                else {\n                    this.x = 0;\n                    this.z = Math.atan2(-m12, m22);\n                }\n                break;\n            case EulerOrder.YZX:\n                this.z = Math.asin(clamp(m21, -1, 1));\n                if (Math.abs(m21) < 0.9999999) {\n                    this.x = Math.atan2(-m23, m22);\n                    this.y = Math.atan2(-m31, m11);\n                }\n                else {\n                    this.x = 0;\n                    this.y = Math.atan2(m13, m33);\n                }\n                break;\n            case EulerOrder.XZY:\n                this.z = Math.asin(-clamp(m12, -1, 1));\n                if (Math.abs(m12) < 0.9999999) {\n                    this.x = Math.atan2(m32, m22);\n                    this.y = Math.atan2(m13, m11);\n                }\n                else {\n                    this.x = Math.atan2(-m23, m33);\n                    this.y = 0;\n                }\n                break;\n            default:\n                console.error('setFromRotationMatrix: unknown order: ' + order);\n        }\n        this.x *= RAD2DEG;\n        this.y *= RAD2DEG;\n        this.z *= RAD2DEG;\n        this.order = order;\n        return this;\n    }\n    /**\n     * 通过四元数设置欧拉角\n     * @param quat - 四元数\n     * @param [order] - 欧拉角顺序\n     * @returns\n     */\n    setFromQuaternion(quat, order = this.order) {\n        const matrix = Euler.tempMat0;\n        matrix.setFromQuaternion(quat);\n        return this.setFromRotationMatrix4(matrix, order);\n    }\n    /**\n     * 通过三维向量设置欧拉角\n     * @param v - 三维向量\n     * @param [order] - 欧拉角顺序\n     * @returns\n     */\n    setFromVector3(v, order = this.order) {\n        return this.set(v.x, v.y, v.z, order);\n    }\n    /**\n     * 通过数组设置欧拉角\n     * @param array - 数组\n     * @param [offset=0] - 偏移\n     * @param [order] - 欧拉角顺序\n     * @returns\n     */\n    setFromArray(array, offset = 0, order = this.order) {\n        this.x = array[offset] ?? 0;\n        this.y = array[offset + 1] ?? 0;\n        this.z = array[offset + 2] ?? 0;\n        this.order = array[offset + 3] ?? order;\n        return this;\n    }\n    /**\n     * 克隆欧拉角\n     * @returns 克隆结果\n     */\n    clone() {\n        return new Euler(this.x, this.y, this.z, this.order);\n    }\n    /**\n     * 复制欧拉角\n     * @param euler - 复制对象\n     * @returns 复制结果\n     */\n    copyFrom(euler) {\n        this.x = euler.x;\n        this.y = euler.y;\n        this.z = euler.z;\n        this.order = euler.order;\n        return this;\n    }\n    add(euler) {\n        if (this.order != euler.order) {\n            console.error('add euler with different order');\n            return this;\n        }\n        this.x += euler.x;\n        this.y += euler.y;\n        this.z += euler.z;\n        return this;\n    }\n    addEulers(left, right) {\n        if (left.order != right.order) {\n            console.error('add euler with different order');\n            return this;\n        }\n        this.x = left.x + right.x;\n        this.y = left.y + right.y;\n        this.z = left.z + right.z;\n        this.order = left.order;\n        return this;\n    }\n    negate() {\n        this.x = -this.x;\n        this.y = -this.y;\n        this.z = -this.z;\n        return this;\n    }\n    /**\n     * 修改欧拉角顺序\n     * @param newOrder - 欧拉角顺序\n     * @returns 修改结果\n     */\n    reorder(newOrder) {\n        const quaternion = new Quaternion();\n        quaternion.setFromEuler(this);\n        return this.setFromQuaternion(quaternion, newOrder);\n    }\n    /**\n     * 通过四元数旋转向量\n     * @param v - 待旋转向量\n     * @param out - 旋转结果，如果没有传入直接覆盖输入值\n     * @returns\n     */\n    rotateVector3(v, out) {\n        const q = Euler.tempQuat0;\n        return q.setFromEuler(this).rotateVector3(v, out);\n    }\n    /**\n     * 欧拉角相等判断\n     * @param euler - 欧拉角\n     * @returns 判断结果\n     */\n    equals(euler) {\n        return euler.x === this.x\n            && euler.y === this.y\n            && euler.z === this.z\n            && euler.order === this.order;\n    }\n    /**\n     * 欧拉角保存于三维向量\n     * @param vec - 目标保存对象\n     * @returns 保存结果\n     */\n    toVector3(vec) {\n        return vec.set(this.x, this.y, this.z);\n    }\n    /**\n     * 欧拉角转数组\n     * @returns 保存结果\n     */\n    toArray() {\n        return [this.x, this.y, this.z];\n    }\n    /**\n     * 欧拉角转四元数\n     * @param quat - 目标四元数\n     * @returns 目标四元数\n     */\n    toQuaternion(quat) {\n        const { x, y, z, order } = this;\n        const c1 = Math.cos(x * DEG2RAD * 0.5);\n        const c2 = Math.cos(y * DEG2RAD * 0.5);\n        const c3 = Math.cos(z * DEG2RAD * 0.5);\n        const s1 = Math.sin(x * DEG2RAD * 0.5);\n        const s2 = Math.sin(y * DEG2RAD * 0.5);\n        const s3 = Math.sin(z * DEG2RAD * 0.5);\n        switch (order) {\n            case EulerOrder.XYZ:\n                quat.set(s1 * c2 * c3 + c1 * s2 * s3, c1 * s2 * c3 - s1 * c2 * s3, c1 * c2 * s3 + s1 * s2 * c3, c1 * c2 * c3 - s1 * s2 * s3);\n                break;\n            case EulerOrder.YXZ:\n                quat.set(s1 * c2 * c3 + c1 * s2 * s3, c1 * s2 * c3 - s1 * c2 * s3, c1 * c2 * s3 - s1 * s2 * c3, c1 * c2 * c3 + s1 * s2 * s3);\n                break;\n            case EulerOrder.ZXY:\n                quat.set(s1 * c2 * c3 - c1 * s2 * s3, c1 * s2 * c3 + s1 * c2 * s3, c1 * c2 * s3 + s1 * s2 * c3, c1 * c2 * c3 - s1 * s2 * s3);\n                break;\n            case EulerOrder.ZYX:\n                quat.set(s1 * c2 * c3 - c1 * s2 * s3, c1 * s2 * c3 + s1 * c2 * s3, c1 * c2 * s3 - s1 * s2 * c3, c1 * c2 * c3 + s1 * s2 * s3);\n                break;\n            case EulerOrder.YZX:\n                quat.set(s1 * c2 * c3 + c1 * s2 * s3, c1 * s2 * c3 + s1 * c2 * s3, c1 * c2 * s3 - s1 * s2 * c3, c1 * c2 * c3 - s1 * s2 * s3);\n                break;\n            case EulerOrder.XZY:\n                quat.set(s1 * c2 * c3 - c1 * s2 * s3, c1 * s2 * c3 - s1 * c2 * s3, c1 * c2 * s3 + s1 * s2 * c3, c1 * c2 * c3 + s1 * s2 * s3);\n                break;\n            default:\n                console.error('unknown euler order: ' + order);\n        }\n        return quat;\n    }\n    /**\n     * 欧拉角转矩阵\n     * @param mat - 目标矩阵\n     * @returns 返回目标矩阵\n     */\n    toMatrix4(mat) {\n        const me = mat.elements;\n        const { x, y, z, order } = this;\n        const cosX = Math.cos(x * DEG2RAD), sinX = Math.sin(x * DEG2RAD);\n        const cosY = Math.cos(y * DEG2RAD), sinY = Math.sin(y * DEG2RAD);\n        const cosZ = Math.cos(z * DEG2RAD), sinZ = Math.sin(z * DEG2RAD);\n        if (order === EulerOrder.XYZ) {\n            const cosXcosZ = cosX * cosZ;\n            const cosXsinZ = cosX * sinZ;\n            const sinXcosZ = sinX * cosZ;\n            const sinXsinZ = sinX * sinZ;\n            me[0] = cosY * cosZ;\n            me[4] = -cosY * sinZ;\n            me[8] = sinY;\n            me[1] = cosXsinZ + sinXcosZ * sinY;\n            me[5] = cosXcosZ - sinXsinZ * sinY;\n            me[9] = -sinX * cosY;\n            me[2] = sinXsinZ - cosXcosZ * sinY;\n            me[6] = sinXcosZ + cosXsinZ * sinY;\n            me[10] = cosX * cosY;\n        }\n        else if (order === EulerOrder.YXZ) {\n            const cosYcosZ = cosY * cosZ;\n            const cosYsinZ = cosY * sinZ;\n            const sinYcosZ = sinY * cosZ;\n            const sinYsinZ = sinY * sinZ;\n            me[0] = cosYcosZ + sinYsinZ * sinX;\n            me[4] = sinYcosZ * sinX - cosYsinZ;\n            me[8] = cosX * sinY;\n            me[1] = cosX * sinZ;\n            me[5] = cosX * cosZ;\n            me[9] = -sinX;\n            me[2] = cosYsinZ * sinX - sinYcosZ;\n            me[6] = sinYsinZ + cosYcosZ * sinX;\n            me[10] = cosX * cosY;\n        }\n        else if (order === EulerOrder.ZXY) {\n            const cosYcosZ = cosY * cosZ;\n            const cosYsinZ = cosY * sinZ;\n            const sinYcosZ = sinY * cosZ;\n            const sinYsinZ = sinY * sinZ;\n            me[0] = cosYcosZ - sinYsinZ * sinX;\n            me[4] = -cosX * sinZ;\n            me[8] = sinYcosZ + cosYsinZ * sinX;\n            me[1] = cosYsinZ + sinYcosZ * sinX;\n            me[5] = cosX * cosZ;\n            me[9] = sinYsinZ - cosYcosZ * sinX;\n            me[2] = -cosX * sinY;\n            me[6] = sinX;\n            me[10] = cosX * cosY;\n        }\n        else if (order === EulerOrder.ZYX) {\n            const cosXcosZ = cosX * cosZ;\n            const cosXsinZ = cosX * sinZ;\n            const sinXcosZ = sinX * cosZ;\n            const sinXsinZ = sinX * sinZ;\n            me[0] = cosY * cosZ;\n            me[4] = sinXcosZ * sinY - cosXsinZ;\n            me[8] = cosXcosZ * sinY + sinXsinZ;\n            me[1] = cosY * sinZ;\n            me[5] = sinXsinZ * sinY + cosXcosZ;\n            me[9] = cosXsinZ * sinY - sinXcosZ;\n            me[2] = -sinY;\n            me[6] = sinX * cosY;\n            me[10] = cosX * cosY;\n        }\n        else if (order === EulerOrder.YZX) {\n            const cosXcosY = cosX * cosY;\n            const cosXsinY = cosX * sinY;\n            const sinXcosY = sinX * cosY;\n            const sinXsinY = sinX * sinY;\n            me[0] = cosY * cosZ;\n            me[4] = sinXsinY - cosXcosY * sinZ;\n            me[8] = sinXcosY * sinZ + cosXsinY;\n            me[1] = sinZ;\n            me[5] = cosX * cosZ;\n            me[9] = -sinX * cosZ;\n            me[2] = -sinY * cosZ;\n            me[6] = cosXsinY * sinZ + sinXcosY;\n            me[10] = cosXcosY - sinXsinY * sinZ;\n        }\n        else if (order === EulerOrder.XZY) {\n            const cosXcosY = cosX * cosY;\n            const cosXsinY = cosX * sinY;\n            const sinXcosY = sinX * cosY;\n            const sinXsinY = sinX * sinY;\n            me[0] = cosY * cosZ;\n            me[4] = -sinZ;\n            me[8] = sinY * cosZ;\n            me[1] = cosXcosY * sinZ + sinXsinY;\n            me[5] = cosX * cosZ;\n            me[9] = cosXsinY * sinZ - sinXcosY;\n            me[2] = sinXcosY * sinZ - cosXsinY;\n            me[6] = sinX * cosZ;\n            me[10] = sinXsinY * sinZ + cosXcosY;\n        }\n        else {\n            console.error('toMatrix4: Invalid order ' + order);\n        }\n        // bottom row\n        me[3] = 0;\n        me[7] = 0;\n        me[11] = 0;\n        // last column\n        me[12] = 0;\n        me[13] = 0;\n        me[14] = 0;\n        me[15] = 1;\n        return mat;\n    }\n    /**\n     * 通过矩阵创建欧拉角\n     * @param m - 矩阵\n     * @param [order=Euler.DEFAULT_ORDER] - 欧拉角顺序\n     * @returns 创建结果\n     */\n    static fromRotationMatrix4(m, order = Euler.DEFAULT_ORDER) {\n        return new Euler().setFromRotationMatrix4(m, order);\n    }\n    /**\n     * 通过四元数创建欧拉角\n     * @param quat - 四元数\n     * @param [order=Euler.DEFAULT_ORDER] - 欧拉角顺序\n     * @returns 创建结果\n     */\n    static fromQuaternion(quat, order = Euler.DEFAULT_ORDER) {\n        return new Euler().setFromQuaternion(quat, order);\n    }\n    /**\n     * 通过三维向量创建欧拉角\n     * @param v - 三维向量\n     * @param [order=Euler.DEFAULT_ORDER] - 欧拉角顺序\n     * @returns 创建结果\n     */\n    static fromVector3(v, order = Euler.DEFAULT_ORDER) {\n        return new Euler().setFromVector3(v, order);\n    }\n    /**\n     * 通过数组创建欧拉角\n     * @param array - 数组\n     * @param [offset=0] - 偏移\n     * @param [order=Euler.DEFAULT_ORDER] - 欧拉角顺序\n     * @returns 创建结果\n     */\n    static fromArray(array, offset = 0, order = Euler.DEFAULT_ORDER) {\n        return new Euler().setFromArray(array, offset, order);\n    }\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 { isEqual } from './utils';\n/**\n * 三维矩阵（列优先矩阵）\n */\nexport class Matrix3 {\n    /**\n     * 矩阵值数组\n     */\n    elements;\n    /**\n     * 构造函数，初始值为零矩阵\n     * @param [m11=1] - 第 1 行，第 1 列\n     * @param [m21=0] - 第 2 行，第 1 列\n     * @param [m31=0] - 第 3 行，第 1 列\n     * @param [m12=0] - 第 1 行，第 2 列\n     * @param [m22=1] - 第 2 行，第 2 列\n     * @param [m32=0] - 第 3 行，第 2 列\n     * @param [m13=0] - 第 1 行，第 3 列\n     * @param [m23=0] - 第 2 行，第 3 列\n     * @param [m33=1] - 第 3 行，第 3 列\n     */\n    constructor(m11 = 1, m21 = 0, m31 = 0, m12 = 0, m22 = 1, m32 = 0, m13 = 0, m23 = 0, m33 = 1) {\n        this.elements = [\n            m11, m21, m31,\n            m12, m22, m32,\n            m13, m23, m33,\n        ];\n    }\n    /**\n     * 设置矩阵\n     * @param m11 - 第 1 行，第 1 列\n     * @param m21 - 第 2 行，第 1 列\n     * @param m31 - 第 3 行，第 1 列\n     * @param m12 - 第 1 行，第 2 列\n     * @param m22 - 第 2 行，第 2 列\n     * @param m32 - 第 3 行，第 2 列\n     * @param m13 - 第 1 行，第 3 列\n     * @param m23 - 第 2 行，第 3 列\n     * @param m33 - 第 3 行，第 3 列\n     * @returns\n     */\n    set(m11, m21, m31, m12, m22, m32, m13, m23, m33) {\n        const e = this.elements;\n        e[0] = m11;\n        e[3] = m12;\n        e[6] = m13;\n        e[1] = m21;\n        e[4] = m22;\n        e[7] = m23;\n        e[2] = m31;\n        e[5] = m32;\n        e[8] = m33;\n        return this;\n    }\n    /**\n     * 设置矩阵通过行优先数据\n     * @param m11 - 第 1 行，第 1 列\n     * @param m12 - 第 1 行，第 2 列\n     * @param m13 - 第 1 行，第 3 列\n     * @param m21 - 第 2 行，第 1 列\n     * @param m22 - 第 2 行，第 2 列\n     * @param m23 - 第 2 行，第 3 列\n     * @param m31 - 第 3 行，第 1 列\n     * @param m32 - 第 3 行，第 2 列\n     * @param m33 - 第 3 行，第 3 列\n     * @returns 矩阵\n     */\n    setFromRowMajorData(m11, m12, m13, m21, m22, m23, m31, m32, m33) {\n        const e = this.elements;\n        e[0] = m11;\n        e[3] = m12;\n        e[6] = m13;\n        e[1] = m21;\n        e[4] = m22;\n        e[7] = m23;\n        e[2] = m31;\n        e[5] = m32;\n        e[8] = m33;\n        return this;\n    }\n    /**\n     * 通过列向量设置矩阵\n     * @param c1 - 第一列\n     * @param c2 - 第二列\n     * @param c3 - 第三列\n     * @returns 矩阵\n     */\n    setFromColumnVectors(c1, c2, c3) {\n        return this.set(c1.x, c1.y, c1.z, c2.x, c2.y, c2.z, c3.x, c3.y, c3.z);\n    }\n    /**\n     * 通过四阶矩阵设置三阶矩阵\n     * @param m - 四阶矩阵\n     * @returns 矩阵\n     */\n    setFromMatrix4(m) {\n        const me = m.elements;\n        return this.set(me[0], me[1], me[2], me[4], me[5], me[6], me[8], me[9], me[10]);\n    }\n    /**\n     * 通过数组设置矩阵\n     * @param array - 数组\n     * @param [offset=0] - 起始偏移值\n     * @returns 矩阵\n     */\n    setFromArray(array, offset = 0) {\n        for (let i = 0; i < 9; i++) {\n            this.elements[i] = array[offset + i];\n        }\n        return this;\n    }\n    /**\n     * 通过四元数设置矩阵\n     * @param quat - 四元数\n     * @returns 矩阵\n     */\n    setFromQuaternion(quat) {\n        const { x, y, z, w } = quat;\n        const x2 = x + x;\n        const y2 = y + y;\n        const z2 = z + z;\n        const xx = x * x2;\n        const xy = x * y2;\n        const xz = x * z2;\n        const yy = y * y2;\n        const yz = y * z2;\n        const zz = z * z2;\n        const wx = w * x2;\n        const wy = w * y2;\n        const wz = w * z2;\n        const te = this.elements;\n        te[0] = 1 - (yy + zz);\n        te[1] = xy + wz;\n        te[2] = xz - wy;\n        te[3] = xy - wz;\n        te[4] = 1 - (xx + zz);\n        te[5] = yz + wx;\n        te[6] = xz + wy;\n        te[7] = yz - wx;\n        te[8] = 1 - (xx + yy);\n        return this;\n    }\n    /**\n     * 矩阵清零\n     * @returns 零矩阵\n     */\n    setZero() {\n        for (let i = 0; i < 9; i++) {\n            this.elements[i] = 0;\n        }\n        return this;\n    }\n    /**\n     * 矩阵单位化\n     * @returns 单位矩阵\n     */\n    identity() {\n        return this.set(1, 0, 0, 0, 1, 0, 0, 0, 1);\n    }\n    /**\n     * 矩阵克隆\n     * @returns 克隆结果\n     */\n    clone() {\n        const e = this.elements;\n        return new Matrix3(e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7], e[8]);\n    }\n    /**\n     * 矩阵复制\n     * @param m - 复制对象\n     * @returns 复制结果\n     */\n    copyFrom(m) {\n        this.elements = [...m.elements];\n        return this;\n    }\n    /**\n     * 得到列向量\n     * @param i - 列向量索引，从 0 开始\n     * @returns 列向量\n     */\n    getColumnVector(i, v) {\n        return v.set(this.elements[i * 3], this.elements[i * 3 + 1], this.elements[i * 3 + 2]);\n    }\n    /**\n     * 矩阵缩放\n     * @param sx - x 轴缩放分量\n     * @param sy - y 轴缩放分量\n     * @returns 缩放结果\n     */\n    scale(sx, sy) {\n        const e = this.elements;\n        e[0] *= sx;\n        e[3] *= sx;\n        e[6] *= sx;\n        e[1] *= sy;\n        e[4] *= sy;\n        e[7] *= sy;\n        return this;\n    }\n    /**\n     * 矩阵旋转\n     * @param theta - 旋转角度（弧度）\n     * @returns 旋转结果\n     */\n    rotate(theta) {\n        const c = Math.cos(theta);\n        const s = Math.sin(theta);\n        const e = this.elements;\n        const m11 = e[0], m12 = e[3], m13 = e[6];\n        const m21 = e[1], m22 = e[4], m23 = e[7];\n        e[0] = c * m11 + s * m21;\n        e[3] = c * m12 + s * m22;\n        e[6] = c * m13 + s * m23;\n        e[1] = -s * m11 + c * m21;\n        e[4] = -s * m12 + c * m22;\n        e[7] = -s * m13 + c * m23;\n        return this;\n    }\n    /**\n     * 矩阵平移\n     * @param x - x 轴平移分量\n     * @param y - y 轴平移分量\n     * @returns 平移结果\n     */\n    translate(x, y) {\n        const e = this.elements;\n        e[0] += x * e[2];\n        e[3] += x * e[5];\n        e[6] += x * e[8];\n        e[1] += y * e[2];\n        e[4] += y * e[5];\n        e[7] += y * e[8];\n        return this;\n    }\n    /**\n     * 矩阵右乘\n     * @param right - 相乘矩阵\n     * @returns 右乘结果\n     */\n    multiply(right) {\n        if (typeof right === 'number') {\n            for (let i = 0; i < 9; i++) {\n                this.elements[i] *= right;\n            }\n            return this;\n        }\n        else {\n            return this.multiplyMatrices(this, right);\n        }\n    }\n    /**\n     * 矩阵左乘\n     * @param left - 相乘矩阵\n     * @returns 左乘结果\n     */\n    premultiply(left) {\n        return this.multiplyMatrices(left, this);\n    }\n    /**\n     * 矩阵乘法\n     * @param left - 矩阵\n     * @param right - 矩阵\n     * @returns 相乘结果\n     */\n    multiplyMatrices(left, right) {\n        const ae = left.elements;\n        const be = right.elements;\n        const te = this.elements;\n        const a11 = ae[0], a12 = ae[3], a13 = ae[6];\n        const a21 = ae[1], a22 = ae[4], a23 = ae[7];\n        const a31 = ae[2], a32 = ae[5], a33 = ae[8];\n        const b11 = be[0], b12 = be[3], b13 = be[6];\n        const b21 = be[1], b22 = be[4], b23 = be[7];\n        const b31 = be[2], b32 = be[5], b33 = be[8];\n        te[0] = a11 * b11 + a12 * b21 + a13 * b31;\n        te[3] = a11 * b12 + a12 * b22 + a13 * b32;\n        te[6] = a11 * b13 + a12 * b23 + a13 * b33;\n        te[1] = a21 * b11 + a22 * b21 + a23 * b31;\n        te[4] = a21 * b12 + a22 * b22 + a23 * b32;\n        te[7] = a21 * b13 + a22 * b23 + a23 * b33;\n        te[2] = a31 * b11 + a32 * b21 + a33 * b31;\n        te[5] = a31 * b12 + a32 * b22 + a33 * b32;\n        te[8] = a31 * b13 + a32 * b23 + a33 * b33;\n        return this;\n    }\n    /**\n     * 矩阵求行列式值\n     * @returns 行列式结果\n     */\n    determinant() {\n        const e = this.elements;\n        const m11 = e[0], m21 = e[3], m31 = e[6];\n        const m12 = e[1], m22 = e[4], m32 = e[7];\n        const m13 = e[2], m23 = e[5], m33 = e[8];\n        return (m11 * (m22 * m33 - m23 * m32) +\n            m12 * (m23 * m31 - m21 * m33) +\n            m13 * (m21 * m32 - m22 * m31));\n    }\n    /**\n     * 矩阵求逆\n     * @returns 逆矩阵\n     */\n    invert() {\n        const e = this.elements;\n        const m11 = e[0], m12 = e[3], m13 = e[6];\n        const m21 = e[1], m22 = e[4], m23 = e[7];\n        const m31 = e[2], m32 = e[5], m33 = e[8];\n        const t11 = m33 * m22 - m32 * m23;\n        const t12 = m32 * m13 - m33 * m12;\n        const t13 = m23 * m12 - m22 * m13;\n        const det = m11 * t11 + m21 * t12 + m31 * t13;\n        if (det === 0) {\n            return this.set(0, 0, 0, 0, 0, 0, 0, 0, 0);\n        }\n        const detInv = 1 / det;\n        e[0] = t11 * detInv;\n        e[1] = (m31 * m23 - m33 * m21) * detInv;\n        e[2] = (m32 * m21 - m31 * m22) * detInv;\n        e[3] = t12 * detInv;\n        e[4] = (m33 * m11 - m31 * m13) * detInv;\n        e[5] = (m31 * m12 - m32 * m11) * detInv;\n        e[6] = t13 * detInv;\n        e[7] = (m21 * m13 - m23 * m11) * detInv;\n        e[8] = (m22 * m11 - m21 * m12) * detInv;\n        return this;\n    }\n    /**\n     * 矩阵转置\n     * @returns 转置结果\n     */\n    transpose() {\n        let t;\n        const m = this.elements;\n        t = m[1];\n        m[1] = m[3];\n        m[3] = t;\n        t = m[2];\n        m[2] = m[6];\n        m[6] = t;\n        t = m[5];\n        m[5] = m[7];\n        m[7] = t;\n        return this;\n    }\n    /**\n     * 对点进行矩阵变换\n     * @param v - 输入点\n     * @param out - 输出点，如果没有会覆盖输入的数据\n     * @returns 变换后的结果\n     */\n    transformPoint(v, out) {\n        const { x, y, z } = v;\n        const e = this.elements;\n        const res = out ?? v;\n        res.x = e[0] * x + e[3] * y + e[6] * z;\n        res.y = e[1] * x + e[4] * y + e[7] * z;\n        res.z = e[2] * x + e[5] * y + e[8] * z;\n        return res;\n    }\n    /**\n     * 对法向量进行矩阵变换\n     * @param v - 输入向量\n     * @param out - 输出向量，如果没有会覆盖输入的数据\n     * @returns 变换后的结果\n     */\n    transformNormal(v, out) {\n        return this.transformPoint(v, out).normalize();\n    }\n    /**\n     * 矩阵判等\n     * @param matrix - 矩阵\n     * @returns 判等结果\n     */\n    equals(matrix) {\n        const te = this.elements;\n        const me = matrix.elements;\n        for (let i = 0; i < 9; i++) {\n            if (!isEqual(te[i], me[i])) {\n                return false;\n            }\n        }\n        return true;\n    }\n    /**\n     * 矩阵转为数组\n     * @returns\n     */\n    toArray() {\n        return [...this.elements];\n    }\n    fill(array, offset = 0) {\n        const e = this.elements;\n        array[offset] = e[0];\n        array[offset + 1] = e[1];\n        array[offset + 2] = e[2];\n        array[offset + 3] = e[3];\n        array[offset + 4] = e[4];\n        array[offset + 5] = e[5];\n        array[offset + 6] = e[6];\n        array[offset + 7] = e[7];\n        array[offset + 8] = e[8];\n    }\n    /**\n     * 创建单位阵\n     * @returns 单位矩阵\n     */\n    static fromIdentity() {\n        return new Matrix3(1, 0, 0, 0, 1, 0, 0, 0, 1);\n    }\n    /**\n     * 通过列向量创建矩阵\n     * @param c1 - 第一列\n     * @param c2 - 第二列\n     * @param c3 - 第三列\n     * @returns 矩阵\n     */\n    static fromColumnVectors(c1, c2, c3) {\n        return new Matrix3().setFromColumnVectors(c1, c2, c3);\n    }\n    /**\n     * 通过四阶矩阵创建矩阵（获取空间变换矩阵旋转缩放部分）\n     * @param m - 四阶矩阵\n     * @returns 矩阵\n     */\n    static fromMatrix4(m) {\n        return new Matrix3().setFromMatrix4(m);\n    }\n    /**\n     * 通过数组创建矩阵\n     * @param array - 数组（列优先）\n     * @param [offset=0] - 起始偏移值\n     * @returns 矩阵\n     */\n    static fromArray(array, offset = 0) {\n        return new Matrix3().setFromArray(array, offset);\n    }\n    /**\n     * 通过四元数创建矩阵\n     * @param quat - 四元数\n     * @returns 矩阵\n     */\n    static fromQuaternion(quat) {\n        return new Matrix3().setFromQuaternion(quat);\n    }\n    /**\n     * 设置矩阵通过行优先数据\n     * @param m11 - 第 1 行，第 1 列\n     * @param m12 - 第 1 行，第 2 列\n     * @param m13 - 第 1 行，第 3 列\n     * @param m21 - 第 2 行，第 1 列\n     * @param m22 - 第 2 行，第 2 列\n     * @param m23 - 第 2 行，第 3 列\n     * @param m31 - 第 3 行，第 1 列\n     * @param m32 - 第 3 行，第 2 列\n     * @param m33 - 第 3 行，第 3 列\n     * @returns 矩阵\n     */\n    static fromRowMajorData(m11, m12, m13, m21, m22, m23, m31, m32, m33) {\n        return new Matrix3(m11, m21, m31, m12, m22, m32, m13, m23, m33);\n    }\n}\n","import { Vector3 } from './vector3';\n/**\n * 光线类\n */\nexport class Ray {\n    static tempVec0 = new Vector3();\n    static tempVec1 = new Vector3();\n    static tempVec2 = new Vector3();\n    static tempVec3 = new Vector3();\n    /**\n     * 光线的原点\n     */\n    origin = new Vector3();\n    /**\n     * 光线的方向\n     */\n    direction = new Vector3();\n    /**\n     * 构造函数\n     * @param [origin] - 原点，默认是 (0, 0, 0)\n     * @param [direction] - 方向，默认是 (1, 0, 0)\n     */\n    constructor(origin = Vector3.ZERO, direction = Vector3.X) {\n        // 注意这里必须拷贝\n        this.origin.copyFrom(origin);\n        this.direction.copyFrom(direction).normalize();\n    }\n    /**\n     * 光线设置\n     * @param origin - 原点\n     * @param direction - 方向\n     * @returns\n     */\n    set(origin, direction) {\n        this.origin.copyFrom(origin);\n        this.direction.copyFrom(direction).normalize();\n        return this;\n    }\n    /**\n     * 光线克隆\n     * @returns 克隆结果\n     */\n    clone() {\n        return new Ray(this.origin, this.direction);\n    }\n    /**\n     * 光线拷贝\n     * @param ray - 要拷贝对象\n     * @returns 拷贝结果\n     */\n    copyFrom(ray) {\n        return this.set(ray.origin, ray.direction);\n    }\n    /**\n     * 根据t计算新的光线原点\n     * @param t - 光线的系数 t\n     * @returns\n     */\n    recast(t) {\n        this.origin.copyFrom(this.at(t, Ray.tempVec0));\n        return this;\n    }\n    /**\n     * 根据t值计算光线上的点\n     * @param t - 光线的系数 t\n     * @param [out] - 计算的点\n     * @returns\n     */\n    at(t, out) {\n        const ret = out ? out : new Vector3();\n        ret.copyFrom(this.origin);\n        return ret.addScaledVector(this.direction, t);\n    }\n    /**\n     * 光线相等判断\n     * @param other - 其他对象\n     * @returns\n     */\n    equals(other) {\n        return this.origin.equals(other.origin) && this.direction.equals(other.direction);\n    }\n    /**\n     * 根据矩阵对光线进行变换\n     * @param m - 变换矩阵\n     * @returns\n     */\n    applyMatrix(m) {\n        this.origin.applyProjectionMatrix(m);\n        this.direction.applyNormalMatrix(m);\n        return this;\n    }\n    /**\n     * 光线和包围盒求交\n     * @param box - 类包围盒对象\n     * @param [out] - 交点\n     * @returns\n     */\n    intersectBox(box, out) {\n        const { x: ox, y: oy, z: oz } = this.origin;\n        const { x: dx, y: dy, z: dz } = this.direction;\n        const { x: bxmin, y: bymin, z: bzmin } = box.min;\n        const { x: bxmax, y: bymax, z: bzmax } = box.max;\n        let tmin, tmax, tymin, tymax, tzmin, tzmax;\n        const invdirx = 1 / dx;\n        const invdiry = 1 / dy;\n        const invdirz = 1 / dz;\n        if (invdirx >= 0) {\n            tmin = (bxmin - ox) * invdirx;\n            tmax = (bxmax - ox) * invdirx;\n        }\n        else {\n            tmin = (bxmax - ox) * invdirx;\n            tmax = (bxmin - ox) * invdirx;\n        }\n        if (invdiry >= 0) {\n            tymin = (bymin - oy) * invdiry;\n            tymax = (bymax - oy) * invdiry;\n        }\n        else {\n            tymin = (bymax - oy) * invdiry;\n            tymax = (bymin - oy) * invdiry;\n        }\n        if ((tmin > tymax) || (tymin > tmax)) {\n            return;\n        }\n        if (tymin > tmin || tmin !== tmin) {\n            tmin = tymin;\n        }\n        if (tymax < tmax || tmax !== tmax) {\n            tmax = tymax;\n        }\n        if (tymin > tmin || tmin !== tmin) {\n            tmin = tymin;\n        }\n        if (tymax < tmax || tmax !== tmax) {\n            tmax = tymax;\n        }\n        if (invdirz >= 0) {\n            tzmin = (bzmin - oz) * invdirz;\n            tzmax = (bzmax - oz) * invdirz;\n        }\n        else {\n            tzmin = (bzmax - oz) * invdirz;\n            tzmax = (bzmin - oz) * invdirz;\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            tmax = tzmax;\n        }\n        if (tmax < 0) {\n            return;\n        }\n        return tmin >= 0 ? this.at(tmin, out) : this.at(tmax, out);\n    }\n    /**\n     * 光线和平面求交\n     * @param plane - 类平面对象\n     * @param [out] - 交点\n     * @returns\n     */\n    intersectPlane(plane, out) {\n        const normal = plane.normal;\n        const distance = plane.distance;\n        const denominator = normal.dot(this.direction);\n        if (denominator === 0) {\n            // line is coplanar, return origin\n            const t = normal.dot(this.origin) + distance;\n            if (t === 0) {\n                const ret = out ? out : new Vector3();\n                return ret.copyFrom(this.origin);\n            }\n            // Null is preferable to undefined since undefined means.... it is undefined\n            return;\n        }\n        const t = -(this.origin.dot(normal) + distance) / denominator;\n        // Return if the ray never intersects the plane\n        return t >= 0 ? this.at(t, out) : undefined;\n    }\n    /**\n     * 光线和圆求交\n     * @param sphere - 类球对象\n     * @param [out] - 交点\n     * @returns\n     */\n    intersectSphere(sphere, out) {\n        const center = sphere.center;\n        const vector = Ray.tempVec0.subtractVectors(center, this.origin);\n        const tca = vector.dot(this.direction);\n        const d2 = vector.dot(vector) - tca * tca;\n        const radius2 = sphere.radius * sphere.radius;\n        if (d2 > radius2) {\n            return;\n        }\n        const thc = Math.sqrt(radius2 - d2);\n        // t0 = first intersect point - entrance on front of sphere\n        const t0 = tca - thc;\n        // t1 = second intersect point - exit point on back of sphere\n        const t1 = tca + thc;\n        // test to see if t1 is behind the ray - if so, return null\n        if (t1 < 0) {\n            return;\n        }\n        // test to see if t0 is behind the ray:\n        // if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n        // in order to always return an intersect point that is in front of the ray.\n        // else t0 is in front of the ray, so return the first collision point scaled by t0\n        return t0 >= 0 ? this.at(t0, out) : this.at(t1, out);\n    }\n    /**\n     * 光线和三角形求交\n     * @param triangle - 类三角形对象\n     * @param [out] - 交点\n     * @param [backfaceCulling] - 是否背面剔除\n     * @returns\n     */\n    intersectTriangle(triangle, out, backfaceCulling) {\n        // FIXME: 交换out和backfaceCulling\n        // Compute the offset origin, edges, and normal.\n        // from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n        const a = triangle.p0;\n        const b = triangle.p1;\n        const c = triangle.p2;\n        const edge1 = Ray.tempVec0.subtractVectors(b, a);\n        const edge2 = Ray.tempVec1.subtractVectors(c, a);\n        const diff = Ray.tempVec2.subtractVectors(this.origin, a);\n        const normal = Ray.tempVec3.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        //   |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n        //   |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n        //   |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n        let DdN = this.direction.dot(normal);\n        let sign;\n        if (DdN > 0) {\n            if (backfaceCulling) {\n                return;\n            }\n            sign = 1;\n        }\n        else if (DdN < 0) {\n            sign = -1;\n            DdN = -DdN;\n        }\n        else {\n            return;\n        }\n        edge2.crossVectors(diff, edge2);\n        const DdQxE2 = sign * this.direction.dot(edge2);\n        // b1 < 0, no intersection\n        if (DdQxE2 < 0) {\n            return;\n        }\n        edge1.cross(diff);\n        const DdE1xQ = sign * this.direction.dot(edge1);\n        // b2 < 0, no intersection\n        if (DdE1xQ < 0) {\n            return;\n        }\n        // b1+b2 > 1, no intersection\n        if (DdQxE2 + DdE1xQ > DdN) {\n            return;\n        }\n        // Line intersects triangle, check if ray does.\n        const QdN = -sign * diff.dot(normal);\n        // t < 0, no intersection\n        if (QdN < 0) {\n            return;\n        }\n        // Ray intersects triangle.\n        return this.at(QdN / DdN, out);\n    }\n}\n","import { Vector3 } from './vector3';\n/**\n * 三维包围盒\n */\nexport class Box3 {\n    min;\n    max;\n    /**\n     * 构造函数，传入值为空时表示空包围盒\n     * @param [min=new Vector3(Infinity)] - 最小角点\n     * @param [max=new Vector3(-Infinity)] - 最大角点\n     */\n    constructor(min = new Vector3(Infinity, Infinity, Infinity), max = new Vector3(-Infinity, -Infinity, -Infinity)) {\n        this.min = min.clone();\n        this.max = max.clone();\n    }\n    /**\n     * 设置三维包围盒的值\n     * @param min - 三维包围盒最小点\n     * @param max - 三维包围盒最大点\n     * @returns\n     */\n    set(min, max) {\n        this.min.copyFrom(min);\n        this.max.copyFrom(max);\n        return this;\n    }\n    /**\n     * 通过数组构建三维包围盒\n     * @param array - 数组集合（每三个数视为一个三维空间点）\n     * @returns 三维包围盒\n     */\n    setFromArray(array) {\n        let minX = Number(Infinity);\n        let minY = Number(Infinity);\n        let minZ = Number(Infinity);\n        let maxX = -Infinity;\n        let maxY = -Infinity;\n        let maxZ = -Infinity;\n        for (let i = 0, l = array.length; i < l; i += 3) {\n            const x = array[i];\n            const y = array[i + 1];\n            const z = array[i + 2];\n            if (x < minX) {\n                minX = x;\n            }\n            if (y < minY) {\n                minY = y;\n            }\n            if (z < minZ) {\n                minZ = z;\n            }\n            if (x > maxX) {\n                maxX = x;\n            }\n            if (y > maxY) {\n                maxY = y;\n            }\n            if (z > maxZ) {\n                maxZ = z;\n            }\n        }\n        this.min.set(minX, minY, minZ);\n        this.max.set(maxX, maxY, maxZ);\n        return this;\n    }\n    /**\n     * 通过三维空间点构建三维包围盒\n     * @param points - 三维空间点集合\n     * @returns 三维包围盒\n     */\n    setFromPoints(points) {\n        this.makeEmpty();\n        for (let i = 0, il = points.length; i < il; i++) {\n            this.expandByPoint(points[i]);\n        }\n        return this;\n    }\n    /**\n     * 通过三维空间点（包围盒中心）和大小确定包围盒\n     * @param center - 三维包围盒中心点\n     * @param size - 三维包围盒大小值\n     * @returns 三维包围盒\n     */\n    setFromCenterAndSize(center, size) {\n        const halfSize = size.clone().multiply(0.5);\n        this.min.copyFrom(center).subtract(halfSize);\n        this.max.copyFrom(center).add(halfSize);\n        return this;\n    }\n    // TODO\n    /**\n     * 通过实体构建包围盒\n     * @param object - 构件实体\n     * @returns 三维包围盒\n     */\n    setFromObject(object) {\n        this.makeEmpty();\n        return this.expandByObject(object);\n    }\n    /**\n     * 克隆三维包围盒\n     * @returns 克隆结果\n     */\n    clone() {\n        return new Box3().copyFrom(this);\n    }\n    /**\n     * 复制三维包围盒\n     * @param box - 复制对象\n     * @returns 复制结果\n     */\n    copyFrom(box) {\n        this.min.copyFrom(box.min);\n        this.max.copyFrom(box.max);\n        return this;\n    }\n    /**\n     * 三维包围盒置空\n     * @returns 置空结果\n     */\n    makeEmpty() {\n        this.min.x = this.min.y = this.min.z = Number(Infinity);\n        this.max.x = this.max.y = this.max.z = -Infinity;\n        return this;\n    }\n    /**\n     * 三维包围盒判空\n     * @returns 判空结果\n     */\n    isEmpty() {\n        // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n        return this.max.x < this.min.x\n            || this.max.y < this.min.y\n            || this.max.z < this.min.z;\n    }\n    /**\n     * 获取三维包围盒中心\n     * @param [target=new Vector3()]\n     * @returns\n     */\n    getCenter(target = new Vector3()) {\n        return this.isEmpty() ? target.set(0, 0, 0) : target.addVectors(this.min, this.max).multiply(0.5);\n    }\n    /**\n     * 获取三维包围盒大小\n     * @param [target=new Vector3()] - 结果保存对象\n     * @returns 三维包围盒大小\n     */\n    getSize(target = new Vector3()) {\n        return this.isEmpty() ? target.set(0, 0, 0) : target.subtractVectors(this.max, this.min);\n    }\n    /**\n     * 通过三维空间点扩展三维包围盒\n     * @param point - 三维空间点\n     * @returns 扩展结果\n     */\n    expandByPoint(point) {\n        this.min.min(point);\n        this.max.max(point);\n        return this;\n    }\n    /**\n     * 通过三维向量扩展三维包围盒\n     * @param vector - 三维向量\n     * @returns 扩展结果\n     */\n    expandByVector(vector) {\n        this.min.subtract(vector);\n        this.max.add(vector);\n        return this;\n    }\n    /**\n     * 通过实数扩展三维包围盒\n     * @param scalar - 扩展大小\n     * @returns 扩展结果\n     */\n    expandByScalar(scalar) {\n        this.min.add(-scalar);\n        this.max.add(scalar);\n        return this;\n    }\n    /**\n     * 通过包围盒扩展三维包围盒\n     * @param box\n     * @returns\n     */\n    expandByBox(box) {\n        this.min.min(box.min);\n        this.max.max(box.max);\n        return this;\n    }\n    // TODO\n    /**\n     * 通过实体扩展三维包围盒\n     * @param object - 构件实体\n     * @returns 扩展结果\n     */\n    expandByObject(object) {\n        // Computes the world-axis-aligned bounding box of an object (including its children),\n        // accounting for both the object's, and children's, world transforms\n        object.updateWorldMatrix(false, false);\n        const geometry = object.geometry;\n        if (geometry !== undefined) {\n            if (geometry.boundingBox === null) {\n                geometry.computeBoundingBox();\n            }\n            const box3 = new Box3();\n            box3.copyFrom(geometry.boundingBox);\n            box3.applyMatrix4(object.matrixWorld);\n            this.union(box3);\n        }\n        const children = object.children;\n        for (let i = 0, l = children.length; i < l; i++) {\n            this.expandByObject(children[i]);\n        }\n        return this;\n    }\n    /**\n     * 判断三维包围盒相交关系(if this intersect other)\n     * @param point - 三维空间点\n     * @returns 点包含判断结果\n     */\n    containsPoint(point) {\n        return !(point.x < this.min.x\n            || point.x > this.max.x\n            || point.y < this.min.y\n            || point.y > this.max.y\n            || point.z < this.min.z\n            || point.z > this.max.z);\n    }\n    /**\n     * 判断三维包围盒与三维包围盒的包含关系\n     * @param other - 三维包围盒\n     * @returns 包围盒包含结果（true 表示包含 other, false 表示不包含 other）\n     */\n    containsBox(other) {\n        return this.min.x <= other.min.x\n            && this.max.x >= other.max.x\n            && this.min.y <= other.min.y\n            && this.max.y >= other.max.y\n            && this.min.z <= other.min.z\n            && this.max.z >= other.max.z;\n    }\n    // TODO\n    /**\n     * 获取点在三维包围盒的比例位置\n     * @param point - 三维空间点\n     * @param [target=new Vector3()] - 结果保存对象\n     * @returns 点在包围盒比例位置\n     */\n    getParameter(point, target = new Vector3()) {\n        // This can potentially have a divide by zero if the box\n        // has a size dimension of 0.\n        return target.set((point.x - this.min.x) / (this.max.x - this.min.x), (point.y - this.min.y) / (this.max.y - this.min.y), (point.z - this.min.z) / (this.max.z - this.min.z));\n    }\n    /**\n     * 判断三维包围盒相交关系(if this intersect other)\n     * @param other - 三维包围盒\n     * @returns 相交判断结果\n     */\n    intersectsBox(other) {\n        // using 6 splitting planes to rule out intersections.\n        return !(other.max.x < this.min.x || other.min.x > this.max.x\n            || other.max.y < this.min.y || other.min.y > this.max.y\n            || other.max.z < this.min.z || other.min.z > this.max.z);\n    }\n    /**\n     * 判断三维包围盒和球是否相交\n     * @param sphere\n     * @returns\n     */\n    intersectsSphere(sphere) {\n        // Find the point on the AABB closest to the sphere center.\n        const vector = new Vector3();\n        this.clampPoint(sphere.center, vector);\n        // If that point is inside the sphere, the AABB and sphere intersect.\n        return vector.distanceSquared(sphere.center) <= (sphere.radius * sphere.radius);\n    }\n    /**\n     * 求点与三维包围盒的最近点\n     * @param point - 三维空间点\n     * @param [target=new Vector3()] - 结果存放对象\n     * @returns 计算结果\n     */\n    clampPoint(point, target = new Vector3()) {\n        return target.copyFrom(point).clamp(this.min, this.max);\n    }\n    /**\n     * 三维空间点到三维包围盒的距离\n     * @param point - 三维包围盒\n     * @returns 距离结果\n     */\n    distanceToPoint(point) {\n        const clampedPoint = point.clone().clamp(this.min, this.max);\n        return clampedPoint.subtract(point).length();\n    }\n    /**\n     * 三维包围盒求交集\n     * @param box - 三维包围盒\n     * @returns 求交结果\n     */\n    intersect(box) {\n        this.min.max(box.min);\n        this.max.min(box.max);\n        // ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n        if (this.isEmpty()) {\n            this.makeEmpty();\n        }\n        return this;\n    }\n    /**\n     * 三维包围盒求并集\n     * @param box - 三维包围盒\n     * @returns 求并结果\n     */\n    union(box) {\n        this.min.min(box.min);\n        this.max.max(box.max);\n        return this;\n    }\n    /**\n     * 通过三维变换矩阵变化三维包围盒\n     * @param matrix - 三维变换矩阵\n     * @returns 变换结果\n     */\n    applyMatrix4(matrix, center = new Vector3()) {\n        // transform of empty box is an empty box.\n        if (this.isEmpty()) {\n            return this;\n        }\n        const points = this.getOBBPoints(matrix, center);\n        this.setFromPoints(points);\n        return this;\n    }\n    getOBBPoints(matrix, center = new Vector3()) {\n        // transform of empty box is an empty box.\n        if (this.isEmpty()) {\n            return [];\n        }\n        const points = [];\n        // NOTE: I am using a binary pattern to specify all 2^3 combinations below\n        points[0] = new Vector3(this.min.x, this.min.y, this.min.z); // 000\n        points[1] = new Vector3(this.min.x, this.min.y, this.max.z); // 001\n        points[2] = new Vector3(this.min.x, this.max.y, this.min.z); // 010\n        points[3] = new Vector3(this.min.x, this.max.y, this.max.z); // 011\n        points[4] = new Vector3(this.max.x, this.min.y, this.min.z); // 100\n        points[5] = new Vector3(this.max.x, this.min.y, this.max.z); // 101\n        points[6] = new Vector3(this.max.x, this.max.y, this.min.z); // 110\n        points[7] = new Vector3(this.max.x, this.max.y, this.max.z); // 111\n        points.forEach(p => {\n            p.subtract(center);\n            p.applyMatrix(matrix);\n            p.add(center);\n        });\n        return points;\n    }\n    /**\n     * 通过包围盒获取包围球\n     * @param target\n     * @returns\n     */\n    getBoundingSphere(target) {\n        this.getCenter(target.center);\n        const vector = new Vector3();\n        target.radius = this.getSize(vector).length() * 0.5;\n        return target;\n    }\n    /**\n     * 三维包围盒位移\n     * @param offset - 三维位移向量\n     * @returns 位移结果\n     */\n    translate(offset) {\n        this.min.add(offset);\n        this.max.add(offset);\n        return this;\n    }\n    /**\n     * 三维包围盒判等\n     * @param other - 三维包围盒\n     * @returns 判等结果\n     */\n    equals(other) {\n        return other.min.equals(this.min) && other.max.equals(this.max);\n    }\n}\n","const toHalf = (function () {\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: number) {\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\nexport class Float16ArrayWrapper {\n  data: Uint16Array;\n\n  constructor (num: number | ArrayLike<number>) {\n    if (Number.isInteger(num)) {\n      this.data = new Uint16Array(num as number);\n    } else if (num && typeof num === 'object' && Number.isInteger(num.length)) {\n      const data = this.data = new Uint16Array(num.length);\n\n      for (let i = 0; i < data.length; i++) {\n        data[i] = toHalf(num[i]);\n      }\n    }\n  }\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","import { Box3 } from './box3';\nimport { Vector3 } from './vector3';\n/**\n * 球\n */\nexport class Sphere {\n    center;\n    radius;\n    /**\n     * 构造函数\n     * @param [center=Vector3.ZERO] - 球心，默认值为(0, 0, 0)\n     * @param [radius=-1] - 半径\n     */\n    constructor(center = Vector3.ZERO, radius = -1) {\n        this.center = center.clone();\n        this.radius = radius;\n    }\n    /**\n     * 通过参数设置球\n     * @param center - 球心\n     * @param radius - 半径\n     * @returns\n     */\n    set(center, radius) {\n        this.center.copyFrom(center);\n        this.radius = radius;\n        return this;\n    }\n    /**\n     * 通过空间点与球心设置球\n     * @param points - 三维空间点\n     * @param [optionalCenter] - 指定球心\n     * @returns\n     */\n    setFromPoints(points, optionalCenter) {\n        const { center } = this;\n        if (optionalCenter !== undefined) {\n            center.copyFrom(optionalCenter);\n            let maxRadiusSq = 0;\n            for (let i = 0; i < points.length; i++) {\n                maxRadiusSq = Math.max(maxRadiusSq, center.distanceSquared(points[i]));\n            }\n            this.radius = Math.sqrt(maxRadiusSq);\n        }\n        else {\n            const box = new Box3().setFromPoints(points);\n            box.getCenter(center);\n            this.radius = box.getSize().length() / 2;\n        }\n        return this;\n    }\n    /**\n     * 复制球\n     * @param sphere - 球信息\n     * @returns 复制结果\n     */\n    copyFrom(sphere) {\n        this.center.copyFrom(sphere.center);\n        this.radius = sphere.radius;\n        return this;\n    }\n    /**\n     * 球判空\n     * @returns 判空结果\n     */\n    isEmpty() {\n        return this.radius < 0;\n    }\n    /**\n     * 球置空\n     * @returns 置空结果\n     */\n    makeEmpty() {\n        this.center.set(0, 0, 0);\n        this.radius = -1;\n        return this;\n    }\n    /**\n     * 三维空间点包围判断\n     * @param point - 三维空间点\n     * @returns 空间点包含判断\n     */\n    containsPoint(point) {\n        return point.distanceSquared(this.center) <= (this.radius * this.radius);\n    }\n    /**\n     * 空间点与球表面的最短距离\n     * @param point - 三维空间点\n     * @returns 距离结果\n     */\n    distanceToPoint(point) {\n        return (point.distance(this.center) - this.radius);\n    }\n    /**\n     * 与球相交判断\n     * @param sphere - 球\n     * @returns 相交判断结果\n     */\n    intersectsSphere(sphere) {\n        const radiusSum = this.radius + sphere.radius;\n        return sphere.center.distanceSquared(this.center) <= (radiusSum * radiusSum);\n    }\n    /**\n     * 与包围盒相交判断\n     * @param box - 三维包围盒\n     * @returns 相交判断结果\n     */\n    intersectsBox(box) {\n        return box.intersectsSphere(this);\n    }\n    /**\n     * 收敛空间点在球范围内\n     * 注：乘法的效率要比开方高很多\n     * @param point - 三维空间点\n     * @param [target] - 结果保存对象\n     * @returns 收敛结果\n     */\n    clampPoint(point, target) {\n        const deltaLengthSq = this.center.distanceSquared(point);\n        if (target === undefined) {\n            target = new Vector3();\n        }\n        target.copyFrom(point);\n        if (deltaLengthSq > (this.radius * this.radius)) {\n            target.subtract(this.center).normalize();\n            target.multiply(this.radius).add(this.center);\n        }\n        return target;\n    }\n    /**\n     * 根据包围盒获取球\n     * @param target - 包围盒\n     * @returns 球\n     */\n    getBoundingBox(target) {\n        if (target === undefined) {\n            target = new Box3();\n        }\n        if (this.isEmpty()) {\n            // Empty sphere produces empty bounding box\n            target.makeEmpty();\n            return target;\n        }\n        target.set(this.center, this.center);\n        target.expandByScalar(this.radius);\n        return target;\n    }\n    /**\n     * 球空间变换\n     * @param matrix - 空间变化矩阵\n     * @returns 变换结果\n     */\n    applyMatrix4(matrix) {\n        const mt = matrix.elements;\n        const scaleXSq = mt[0] * mt[0] + mt[1] * mt[1] + mt[2] * mt[2];\n        const scaleYSq = mt[4] * mt[4] + mt[5] * mt[5] + mt[6] * mt[6];\n        const scaleZSq = mt[8] * mt[8] + mt[9] * mt[9] + mt[10] * mt[10];\n        const maxScale = Math.sqrt(Math.max(scaleXSq, scaleYSq, scaleZSq));\n        this.center.applyMatrix(matrix);\n        this.radius = this.radius * maxScale;\n        return this;\n    }\n    /**\n     * 球位移\n     * @param offset - 位移信息\n     * @returns 位移结果\n     */\n    translate(offset) {\n        this.center.add(offset);\n        return this;\n    }\n    /**\n     * 通过三维空间点对球进行扩展\n     * @param point - 扩展点\n     * @returns 扩展结果\n     */\n    expandByPoint(point) {\n        const vector = new Vector3().subtractVectors(point, this.center);\n        const lengthSquared = vector.lengthSquared();\n        if (lengthSquared > (this.radius * this.radius)) {\n            const length = Math.sqrt(lengthSquared);\n            const missingRadiusHalf = (length - this.radius) * 0.5;\n            // Nudge this sphere towards the target point. Add half the missing distance to radius,\n            // and the other half to position. This gives a tighter enclosure, instead of if\n            // the whole missing distance were just added to radius.\n            this.center.add(vector.multiply(missingRadiusHalf / length));\n            this.radius += missingRadiusHalf;\n        }\n        return this;\n    }\n    /**\n     * 包围球求并集\n     * @param sphere - 包围球\n     * @returns 求并结果\n     */\n    union(sphere) {\n        // To enclose another sphere into this sphere, we only need to enclose two points:\n        // 1) Enclose the farthest point on the other sphere into this sphere.\n        // 2) Enclose the opposite point of the farthest point into this sphere.\n        const v1 = new Vector3();\n        const toFarthestPoint = new Vector3();\n        toFarthestPoint.subtractVectors(sphere.center, this.center).normalize().multiply(sphere.radius);\n        this.expandByPoint(v1.copyFrom(sphere.center).add(toFarthestPoint));\n        this.expandByPoint(v1.copyFrom(sphere.center).subtract(toFarthestPoint));\n        return this;\n    }\n    /**\n     * 包围球求交集\n     * @param other - 其它包围球\n     * @returns 求交结果\n     */\n    intersect(other) {\n        const vector = new Vector3().subtractVectors(this.center, other.center);\n        const distance = vector.length();\n        const radiusSum = this.radius + other.radius;\n        if (distance > radiusSum) {\n            return this.makeEmpty();\n        }\n        this.center = this.center.add(vector.normalize().multiply(distance / 2));\n        this.radius = this.radius + other.radius - distance;\n        return this;\n    }\n    /**\n     * 包围球判等\n     * @param sphere - 包围球\n     * @returns 判等结果\n     */\n    equals(sphere) {\n        return sphere.center.equals(this.center) && (sphere.radius === this.radius);\n    }\n    /**\n     * 包围球克隆\n     * @returns 克隆结果\n     */\n    clone() {\n        return new Sphere().copyFrom(this);\n    }\n}\n","import { Euler, Matrix4, Quaternion, Vector2, Vector3 } from '@galacean/effects-math/es/core/index';\nimport type * as spec from '@galacean/effects-specification';\nimport type { Disposable } from './utils';\nimport { addItem, removeItem } from './utils';\nimport type { Engine } from './engine';\n\nexport interface TransformProps {\n  position?: spec.vec3 | Vector3,\n  rotation?: spec.vec3 | Euler,\n  quat?: spec.vec4 | Quaternion,\n  scale?: spec.vec3 | Vector3,\n  size?: Vector2,\n  name?: string,\n  anchor?: spec.vec2 | Vector2,\n  valid?: boolean,\n}\n\nconst tempQuat = new Quaternion();\nconst tempVector3 = new Vector3();\nconst tempVector3Second = new Vector3();\nlet seed = 1;\n\n/**\n * 变换组件，用于描述元素的位置、旋转、缩放等信息\n */\nexport class Transform implements Disposable {\n  /**\n   * 转换右手坐标系左手螺旋对应的四元数到对应的旋转角\n   * @param quat - 四元数\n   * @param out - 欧拉角\n   * @returns\n   */\n  static getRotation (quat: Quaternion, out: Euler): Euler {\n    const newQuat = tempQuat.copyFrom(quat);\n\n    newQuat.conjugate();\n\n    return out.setFromQuaternion(newQuat);\n  }\n\n  engine: Engine;\n  name: string;\n  taggedProperties = {} as spec.TransformData;\n  /**\n   * 自身位移\n   */\n  readonly position = new Vector3(0, 0, 0);\n  /**\n   * 自身旋转对应的四元数，右手坐标系，旋转正方向左手螺旋（轴向的顺时针），旋转欧拉角的顺序为 ZYX\n   */\n  readonly quat = new Quaternion(0, 0, 0, 1);\n  /**\n   * 自身旋转角度\n   */\n  readonly rotation = new Euler(0, 0, 0);\n  /**\n   * 自身缩放\n   */\n  readonly scale = new Vector3(1, 1, 1);\n  /**\n   * 自身锚点\n   */\n  readonly anchor = new Vector3(0, 0, 0);\n\n  /**\n   * 元素矩形宽高\n   */\n  readonly size = new Vector2(1, 1);\n  /**\n   * 子变换，可以有多个\n   */\n  private children: Transform[] = [];\n  /**\n   * 父变换，只能有一个\n   */\n  private parent: Transform | null;\n  /**\n   * 所有父变换对应的联合矩阵\n   */\n  private parentMatrix: Matrix4;\n  /**\n   * 包含父变换的最终模型矩阵\n   */\n  private worldMatrix = Matrix4.fromIdentity();\n  /**\n   * 仅包含自身变换的模型矩阵\n   */\n  private localMatrix = Matrix4.fromIdentity();\n  /**\n   * 变换是否需要生效，不生效返回的模型矩阵为单位矩阵，需要随元素生命周期改变\n   */\n  private valid = true;\n  /**\n   * 数据变化标志位\n   */\n  private dirtyFlags = {\n    /* 自身变换是否有修改，若修改，localMatrix 需要更新 */\n    localData: false,\n    /* localMatrix 是否有修改，若修改，WorldMatrix 需要更新 */\n    localMatrix: false,\n    /* worldMatrix 是否有修改，若修改，worldTRS 需要更新 */\n    worldMatrix: false,\n    /* parentMatrix 是否有修改，若修改，WorldMatrix需要更新 */\n    parentMatrix: false,\n  };\n  /**\n   * 最终模型矩阵对应变换的缓存，当自身矩阵或父矩阵有修改时需要更新\n   */\n  private readonly worldTRSCache = { position: new Vector3(0, 0, 0), quat: new Quaternion(0, 0, 0, 1), scale: new Vector3(1, 1, 1) };\n\n  /**\n   *\n   * @param props\n   * @param parent\n   */\n  constructor (props: TransformProps = {}, parent?: Transform) {\n    this.name = `transform_${seed++}`;\n    if (props) {\n      this.setTransform(props);\n    }\n    if (parent) {\n      this.parentTransform = parent;\n    }\n    if (props.valid !== undefined) {\n      this.setValid(props.valid);\n    }\n  }\n\n  set parentTransform (transform: Transform | null) {\n    if (!transform || this.parent === transform || this === transform) {\n      return;\n    }\n    if (this.parent) {\n      this.parent.removeChild(this);\n    }\n    transform.addChild(this);\n    this.parent = transform;\n    this.parentMatrixDirty = true;\n  }\n\n  get parentTransform () {\n    return this.parent;\n  }\n\n  set parentMatrixDirty (val: boolean) {\n    if (this.dirtyFlags.parentMatrix !== val) {\n      this.dirtyFlags.parentMatrix = val;\n      this.dispatchValueChange();\n    }\n  }\n\n  get parentMatrixDirty () {\n    return this.dirtyFlags.parentMatrix;\n  }\n\n  // /**\n  //  * 自身数据修改 /  父变换修改 / 父变换的数据修改\n  //  * @returns\n  //  */\n  // get traceDirty (): boolean {\n  //   if (this.dirty || this.parentDirty) {\n  //     return true;\n  //   }\n  //\n  //   return !!(this.parent && this.parent.traceDirty);\n  // }\n\n  /**\n   * 设置位置\n   * @param x\n   * @param y\n   * @param z\n   */\n  setPosition (x: number, y: number, z: number) {\n    if (this.position.x !== x || this.position.y !== y || this.position.z !== z) {\n      this.position.x = x;\n      this.position.y = y;\n      this.position.z = z;\n      this.dirtyFlags.localData = true;\n      this.dispatchValueChange();\n    }\n  }\n\n  /**\n   * 在当前位置的基础上添加位置偏移\n   * @param x\n   * @param y\n   * @param z\n   */\n  translate (x: number, y: number, z: number) {\n    if (x !== 0 || y !== 0 || z !== 0) {\n      this.position.x += x;\n      this.position.y += y;\n      this.position.z += z;\n      this.dirtyFlags.localData = true;\n      this.dispatchValueChange();\n    }\n  }\n  /**\n   * 设置旋转\n   * @param x\n   * @param y\n   * @param z\n   */\n  setRotation (x: number, y: number, z: number) {\n    if (this.rotation.x !== x || this.rotation.y !== y || this.rotation.z !== z) {\n      this.rotation.x = x;\n      this.rotation.y = y;\n      this.rotation.z = z;\n      this.quat.setFromEuler(this.rotation);\n      // TODO 修正 GE 四元数旋转共轭问题\n      this.quat.conjugate();\n      this.dirtyFlags.localData = true;\n      this.dispatchValueChange();\n    }\n  }\n\n  /**\n   * 设置四元数\n   * @param x\n   * @param y\n   * @param z\n   * @param w\n   * @private\n   */\n  setQuaternion (x: number, y: number, z: number, w: number) {\n    if (this.quat.x !== x || this.quat.y !== y || this.quat.z !== z || this.quat.w !== w) {\n      this.quat.x = x;\n      this.quat.y = y;\n      this.quat.z = z;\n      this.quat.w = w;\n      this.rotation.setFromQuaternion(this.quat);\n      this.dirtyFlags.localData = true;\n      this.dispatchValueChange();\n    }\n  }\n\n  /**\n   * 设置缩放\n   * @param x\n   * @param y\n   * @param z\n   */\n  setScale (x: number, y: number, z: number) {\n    if (this.scale.x !== x || this.scale.y !== y || this.scale.z !== z) {\n      this.scale.x = x;\n      this.scale.y = y;\n      this.scale.z = z;\n      this.dirtyFlags.localData = true;\n      this.dispatchValueChange();\n    }\n  }\n\n  setSize (x: number, y: number) {\n    if (this.size.x !== x || this.size.y !== y) {\n      this.size.x = x;\n      this.size.y = y;\n      this.dirtyFlags.localData = true;\n      this.dispatchValueChange();\n    }\n  }\n\n  /**\n   * 在当前旋转的基础上使用四元素添加旋转\n   * @param quat\n   */\n  rotateByQuat (quat: Quaternion) {\n    this.quat.multiply(quat);\n    this.rotation.setFromQuaternion(this.quat);\n    this.dirtyFlags.localData = true;\n    this.dispatchValueChange();\n  }\n\n  /**\n   * 在当前缩放基础上设置缩放系数\n   * @param x\n   * @param y\n   * @param z\n   */\n  scaleBy (x: number, y: number, z: number) {\n    this.scale.x *= x;\n    this.scale.y *= y;\n    this.scale.z *= z;\n    this.dirtyFlags.localData = true;\n    this.dispatchValueChange();\n  }\n\n  /**\n   * 设置锚点\n   * @param x\n   * @param y\n   */\n  setAnchor (x: number, y: number) {\n    if (this.anchor.x !== x || this.anchor.y !== y) {\n      this.anchor.x = x;\n      this.anchor.y = y;\n      this.dirtyFlags.localData = true;\n      this.dispatchValueChange();\n    }\n  }\n\n  /**\n   * 批量设置 transform 属性\n   * @param props - 要设置的属性\n   * @param reverseEuler - 设置 rotation时，欧拉角是否需要取负值\n   */\n  setTransform (props: TransformProps, reverseEuler?: boolean) {\n    const { position, rotation, scale, size, quat, name, anchor } = props;\n\n    if (name) {\n      this.name = name;\n    }\n    if (position) {\n      if (position instanceof Vector3) {\n        this.setPosition(position.x, position.y, position.z);\n      } else {\n        this.setPosition(position[0], position[1], position[2]);\n      }\n    }\n    if (quat) {\n      if (quat instanceof Quaternion) {\n        this.setQuaternion(quat.x, quat.y, quat.z, quat.w);\n      } else {\n        this.setQuaternion(quat[0], quat[1], quat[2], quat[3]);\n      }\n    } else if (rotation) {\n      const mul = reverseEuler ? -1 : 1;\n\n      if (rotation instanceof Euler) {\n        this.setRotation(rotation.x * mul, rotation.y * mul, rotation.z * mul);\n      } else {\n        this.setRotation(rotation[0] * mul, rotation[1] * mul, rotation[2] * mul);\n      }\n    }\n    if (scale) {\n      if (scale instanceof Vector3) {\n        this.setScale(scale.x, scale.y, scale.z);\n      } else {\n        this.setScale(scale[0], scale[1], scale[2]);\n      }\n    }\n    if (size) {\n      this.setSize(size.x, size.y);\n    }\n    if (anchor) {\n      if (anchor instanceof Vector2) {\n        this.setAnchor(anchor.x, anchor.y);\n      } else {\n        this.setAnchor(anchor[0], anchor[1]);\n      }\n    }\n  }\n\n  /**\n   * 添加子变换\n   * @param child - 要添加的子变换\n   */\n  addChild (child: Transform) {\n    addItem(this.children, child);\n  }\n\n  /**\n   * 移除子变换\n   */\n  removeChild (child: Transform) {\n    removeItem(this.children, child);\n  }\n\n  /**\n   * 获取当前的旋转量\n   * @returns\n   */\n  getRotation (): Euler {\n    return Transform.getRotation(this.quat, new Euler());\n  }\n\n  /**\n   * 获取当前的四元数\n   * @returns\n   */\n  getQuaternion (): Quaternion {\n    return this.quat;\n  }\n\n  /**\n   * 更新元素自身变换矩阵\n   */\n  updateLocalMatrix () {\n    if (this.valid) {\n      if (this.dirtyFlags.localData) {\n        this.localMatrix.compose(this.position, this.quat, this.scale, this.anchor);\n        this.dirtyFlags.localMatrix = true;\n      }\n      this.dirtyFlags.localData = false;\n    } else {\n      if (!this.localMatrix.isIdentity()) {\n        this.localMatrix.identity();\n        this.dirtyFlags.localMatrix = true;\n      }\n    }\n  }\n\n  /**\n   * 获取自身变换对应的模型矩阵\n   * 数据修改且需要生效时更新自身矩阵\n   * 当变换不需要生效时返回单位矩阵\n   * @returns\n   */\n  getMatrix (): Matrix4 {\n    this.updateLocalMatrix();\n\n    return this.localMatrix;\n  }\n  /**\n   * 获取父矩阵，如果有多级父节点，返回整体变换\n   * @returns\n   */\n  getParentMatrix (): Matrix4 | undefined {\n    if (this.parent) {\n      this.parentMatrix = this.parent.getWorldMatrix();\n      this.dirtyFlags.parentMatrix = this.dirtyFlags.parentMatrix || this.parent.dirtyFlags.localMatrix || this.parent.dirtyFlags.worldMatrix;\n    }\n\n    return this.parentMatrix;\n  }\n\n  /**\n   * 获取包含自身变换和父变换的模型变换矩阵\n   * @returns\n   */\n  getWorldMatrix (): Matrix4 {\n    const localMatrix = this.getMatrix();\n    const parentMatrix = this.getParentMatrix();\n\n    if (this.dirtyFlags.localMatrix || this.dirtyFlags.parentMatrix) {\n      if (parentMatrix) {\n        this.worldMatrix.multiplyMatrices(parentMatrix, localMatrix);\n      } else {\n        this.worldMatrix.copyFrom(localMatrix);\n      }\n      this.dirtyFlags.worldMatrix = true;\n      this.dirtyFlags.localMatrix = false;\n      this.dirtyFlags.parentMatrix = false;\n    }\n\n    return this.worldMatrix;\n  }\n\n  /**\n   * 获取联合变换后的最终缩放因子\n   * @returns\n   */\n  getWorldScale (): Vector3 {\n    const cache = this.worldTRSCache;\n\n    if (this.dirtyFlags.worldMatrix) {\n      const mat = this.getWorldMatrix();\n\n      mat.decompose(cache.position, cache.quat, cache.scale);\n      this.dirtyFlags.worldMatrix = false;\n    }\n\n    return this.worldTRSCache.scale.clone();\n  }\n\n  /**\n   * 获取联合变换后的最终位置\n   * @returns\n   */\n  getWorldPosition (): Vector3 {\n    this.updateTRSCache();\n\n    return this.worldTRSCache.position.clone();\n  }\n\n  /**\n   * 设置世界坐标位置\n   * @param x - 世界坐标 x\n   * @param y - 世界坐标 y\n   * @param z - 世界坐标 z\n   */\n  setWorldPosition (x: number, y: number, z: number) {\n    const parentMatrix = this.getParentMatrix();\n\n    if (parentMatrix) {\n      // 有父节点：需要将世界坐标转换为局部坐标\n      // 提取父矩阵的变换信息\n      tempVector3.set(0, 0, 0);\n      tempQuat.set(0, 0, 0, 1);\n      tempVector3Second.set(1, 1, 1);\n\n      parentMatrix.decompose(tempVector3, tempQuat, tempVector3Second);\n\n      // 计算局部位置：先减去父位置，再应用逆旋转和逆缩放\n      // 复用 tempVector3 作为 localPos\n      tempVector3.set(x - tempVector3.x, y - tempVector3.y, z - tempVector3.z);\n\n      // 应用逆旋转\n      tempQuat.invert();\n      tempVector3.applyQuaternion(tempQuat);\n\n      // 应用逆缩放\n      tempVector3.x = tempVector3Second.x !== 0 ? tempVector3.x / tempVector3Second.x : 0;\n      tempVector3.y = tempVector3Second.y !== 0 ? tempVector3.y / tempVector3Second.y : 0;\n      tempVector3.z = tempVector3Second.z !== 0 ? tempVector3.z / tempVector3Second.z : 0;\n\n      this.setPosition(tempVector3.x, tempVector3.y, tempVector3.z);\n    } else {\n      // 没有父节点：世界坐标 = 局部坐标\n      this.setPosition(x, y, z);\n    }\n  }\n\n  /**\n   * 获取联合变换后的最终旋转量\n   * @returns\n   */\n  getWorldRotation (): Euler {\n    this.updateTRSCache();\n\n    return Transform.getRotation(this.worldTRSCache.quat, new Euler());\n  }\n\n  /**\n   * 根据世界变换矩阵计算位移、旋转、缩放向量\n   * @param position\n   * @param quat\n   * @param scale\n   */\n  assignWorldTRS (position?: Vector3, quat?: Quaternion, scale?: Vector3) {\n    this.updateTRSCache();\n    if (position) {\n      position.copyFrom(this.worldTRSCache.position);\n    }\n    if (quat) {\n      quat.copyFrom(this.worldTRSCache.quat);\n    }\n    if (scale) {\n      scale.copyFrom(this.worldTRSCache.scale);\n    }\n  }\n\n  /**\n   * 拆解并复制指定矩阵到自身变换\n   * @param m4\n   * @param scale\n   * @returns\n   */\n  cloneFromMatrix (m4: Matrix4, scale?: Vector3) {\n    m4.decompose(this.position, this.quat, this.scale);\n    this.rotation.setFromQuaternion(this.quat.clone().conjugate());\n    if (scale) {\n      scale.copyFrom(this.scale);\n    }\n    this.dirtyFlags.localData = true;\n    this.dispatchValueChange();\n  }\n\n  /**\n   * 设置 Transform 生效 / 失效， 默认元素生命周期开始后生效，结束后失效\n   */\n  setValid (val: boolean) {\n    if (this.valid !== val) {\n      this.valid = val;\n      if (!val) {\n        this.localMatrix.identity();\n        this.dirtyFlags.localMatrix = true;\n      } else {\n        this.dirtyFlags.localData = true;\n      }\n      this.dispatchValueChange();\n    }\n  }\n\n  /**\n   * 获取 Transform 是否生效\n   */\n  getValid (): boolean {\n    return this.valid;\n  }\n\n  toData () {\n    const transformData = this.taggedProperties;\n\n    transformData.position = this.position.clone();\n    transformData.eulerHint = { x: this.rotation.x, y: this.rotation.y, z: this.rotation.z };\n    transformData.scale = this.scale.clone();\n\n    return transformData;\n  }\n\n  fromData (data: spec.TransformData) {\n    const transformProps: TransformProps = {};\n\n    transformProps.position = new Vector3().copyFrom(data.position);\n    //@ts-expect-error\n    if (data.quat) {\n      //@ts-expect-error\n      transformProps.quat = new Quaternion(data.quat.x, data.quat.y, data.quat.z, data.quat.w);\n    } else {\n      transformProps.rotation = new Euler(data.eulerHint.x, data.eulerHint.y, data.eulerHint.z);\n    }\n    transformProps.scale = new Vector3().copyFrom(data.scale);\n    if (data.size) {\n      transformProps.size = new Vector2().copyFrom(data.size);\n    }\n    if (data.anchor) {\n      transformProps.anchor = new Vector2().copyFrom(data.anchor);\n    }\n    this.setTransform(transformProps);\n  }\n\n  dispose (): void { }\n\n  private updateTRSCache () {\n    const worldMatrix = this.getWorldMatrix();\n\n    if (this.dirtyFlags.worldMatrix) {\n      const cache = this.worldTRSCache;\n\n      worldMatrix.decompose(cache.position, cache.quat, cache.scale);\n      this.dirtyFlags.worldMatrix = false;\n    }\n  }\n\n  private dispatchValueChange () {\n    this.children.forEach(c => {\n      c.parentMatrixDirty = true;\n    });\n  }\n}\n","import { Vector3 } from '@galacean/effects-math/es/core/vector3';\nimport { Quaternion } from '@galacean/effects-math/es/core/quaternion';\nimport { Matrix4 } from '@galacean/effects-math/es/core/matrix4';\nimport { Euler } from '@galacean/effects-math/es/core/euler';\nimport { DEG2RAD } from '@galacean/effects-math/es/core/utils';\nimport * as spec from '@galacean/effects-specification';\nimport { Transform } from './transform';\n\ninterface CameraOptionsBase {\n  /**\n   * 相机近平面\n   */\n  near: number,\n  /**\n   * 相机远平面\n   */\n  far: number,\n  /**\n   * 视锥体垂直视野角度\n   */\n  fov: number,\n  /**\n   * 视锥体的长宽比\n   */\n  aspect: number,\n  /**\n   * 相机的裁剪模式\n   */\n  clipMode: spec.CameraClipMode,\n}\n\n/**\n *\n */\nexport interface CameraOptions extends CameraOptionsBase {\n  /**\n   * 相机的位置\n   */\n  position: spec.vec3,\n  /**\n   * 相机的旋转，欧拉角\n   */\n  rotation: spec.vec3,\n  /**\n   * 相机的旋转，四元数\n   */\n  quat?: spec.vec4,\n  /**\n   * 画布的像素宽度\n   */\n  pixelWidth: number,\n  /**\n   * 画布的像素高度\n   */\n  pixelHeight: number,\n}\n\nexport interface CameraOptionsEx extends CameraOptionsBase {\n  /**\n   * 相机的位置\n   */\n  position: Vector3,\n  /**\n   * 相机的旋转，欧拉角\n   */\n  rotation: Euler,\n  /**\n   * 相机的旋转，四元数\n   */\n  quat?: Quaternion,\n}\n\nconst tmpScale = new Vector3(1, 1, 1);\n\n/**\n * 合成的相机对象，采用透视投影\n */\nexport class Camera {\n\n  /**\n   * @internal\n   */\n  transform: Transform = new Transform();\n  /**\n   * 画布的像素宽度\n   */\n  pixelWidth = 0;\n  /**\n   * 画布的像素高度\n   */\n  pixelHeight = 0;\n  /**\n   * 编辑器用于缩放画布\n   */\n  private viewportMatrix = Matrix4.fromIdentity();\n  private options: CameraOptionsBase;\n  private viewMatrix = Matrix4.fromIdentity();\n  private projectionMatrix = Matrix4.fromIdentity();\n  private viewProjectionMatrix = Matrix4.fromIdentity();\n  private inverseViewMatrix = Matrix4.fromIdentity();\n  private inverseProjectionMatrix: Matrix4 | null;\n  private inverseViewProjectionMatrix: Matrix4 | null;\n  private dirty = true;\n\n  /**\n   *\n   * @param name - 相机名称\n   * @param options\n   */\n  constructor (\n    public name: string,\n    options: Partial<CameraOptions> = {},\n  ) {\n    const {\n      near = 0.1,\n      far = 20,\n      fov = 60,\n      aspect = 1,\n      clipMode = spec.CameraClipMode.portrait,\n      position = [0, 0, 8],\n      rotation = [0, 0, 0],\n      pixelWidth = 0,\n      pixelHeight = 0,\n    } = options;\n\n    const euler = new Euler(rotation[0], rotation[1], rotation[2]);\n    const quat = new Quaternion().setFromEuler(euler);\n\n    this.options = { near, far, fov, aspect, clipMode };\n    this.pixelWidth = pixelWidth;\n    this.pixelHeight = pixelHeight;\n\n    this.transform.setPosition(position[0], position[1], position[2]);\n    this.transform.setQuaternion(quat.x, quat.y, quat.z, quat.w);\n    this.dirty = true;\n    this.updateMatrix();\n  }\n\n  /**\n   * 设置相机近平面\n   * @param near\n   */\n  set near (near: number) {\n    if (this.options.near !== near) {\n      this.options.near = near;\n      this.dirty = true;\n    }\n  }\n  get near (): number {\n    return this.options.near;\n  }\n\n  /**\n   * 设置相机远平面\n   * @param far\n   */\n  set far (far: number) {\n    if (this.options.far !== far) {\n      this.options.far = far;\n      this.dirty = true;\n    }\n  }\n  get far (): number {\n    return this.options.far;\n  }\n\n  /**\n   * 设置相机视锥体垂直视野角度\n   * @param fov\n   */\n  set fov (fov: number) {\n    if (this.options.fov !== fov) {\n      this.options.fov = fov;\n      this.dirty = true;\n    }\n  }\n  get fov () {\n    return this.options.fov;\n  }\n\n  /**\n   * 设置相机视锥体的长宽比\n   * @param aspect\n   */\n  set aspect (aspect: number) {\n    if (this.options.aspect !== aspect) {\n      this.options.aspect = aspect;\n      this.dirty = true;\n    }\n  }\n  get aspect () {\n    return this.options.aspect;\n  }\n\n  /**\n   * 相机的裁剪模式\n   * @param clipMode\n   */\n  set clipMode (clipMode: spec.CameraClipMode | undefined) {\n    if (clipMode !== undefined && this.options.clipMode !== clipMode) {\n      this.options.clipMode = clipMode;\n      this.dirty = true;\n    }\n  }\n  get clipMode () {\n    return this.options.clipMode;\n  }\n\n  /**\n   * 设置相机的本地位置\n   * @param value\n   */\n  set position (value: Vector3) {\n    if (!this.transform.position.equals(value)) {\n      this.transform.setPosition(value.x, value.y, value.z);\n      this.dirty = true;\n    }\n  }\n  /**\n   * 获取相机的本地位置\n   */\n  get position () {\n    return this.transform.position.clone();\n  }\n\n  /**\n   * 获取相机的世界位置\n   * @since 2.3.0\n   */\n  get worldPosition () {\n    return this.transform.getWorldPosition();\n  }\n\n  /**\n   * 设置相机的旋转角度\n   * @param value\n   */\n  set rotation (value: Euler) {\n    if (!this.transform.rotation.equals(value)) {\n      this.transform.setRotation(value.x, value.y, value.z);\n      this.dirty = true;\n    }\n  }\n  get rotation () {\n    return this.transform.rotation.clone();\n  }\n\n  /**\n   * 设置相机变换\n   * @since 2.3.0\n   * @param transform\n   */\n  setTransform (transform: Transform) {\n    this.transform.parentTransform = transform.parentTransform;\n    this.transform.cloneFromMatrix(transform.getMatrix());\n    this.dirty = true;\n  }\n\n  setViewportMatrix (matrix: Matrix4) {\n    this.viewportMatrix = matrix.clone();\n    this.dirty = true;\n  }\n\n  getViewportMatrix () {\n    return this.viewportMatrix;\n  }\n\n  /**\n   * 获取相机的视图变换矩阵\n   * @return\n   */\n  getViewMatrix (): Matrix4 {\n    this.updateMatrix();\n\n    return this.viewMatrix.clone();\n  }\n\n  /**\n   * 获取视图变换的逆矩阵\n   */\n  getInverseViewMatrix (): Matrix4 {\n    this.updateMatrix();\n\n    return this.inverseViewMatrix.clone();\n  }\n\n  /**\n   * 获取相机的投影矩阵\n   * @return\n   */\n  getProjectionMatrix (): Matrix4 {\n    this.updateMatrix();\n\n    return this.projectionMatrix.clone();\n  }\n\n  /**\n   * 获取相机投影矩阵的逆矩阵\n   * @return\n   */\n  getInverseProjectionMatrix (): Matrix4 {\n    this.updateMatrix();\n\n    return this.inverseProjectionMatrix?.clone() as Matrix4;\n  }\n\n  /**\n   * 获取相机的 VP 矩阵\n   * @return\n   */\n  getViewProjectionMatrix (): Matrix4 {\n    this.updateMatrix();\n\n    return this.viewProjectionMatrix.clone();\n  }\n\n  /**\n   * 获取相机 VP 矩阵的逆矩阵\n   * @return\n   */\n  getInverseViewProjectionMatrix (): Matrix4 {\n    this.updateMatrix();\n    if (!this.inverseViewProjectionMatrix) {\n      this.inverseViewProjectionMatrix = this.viewProjectionMatrix.clone();\n      this.inverseViewProjectionMatrix.invert();\n    }\n\n    return this.inverseViewProjectionMatrix.clone();\n  }\n\n  /**\n   * 根据相机的视图投影矩阵对指定模型矩阵做变换\n   * @param out - 结果矩阵\n   * @param model - 模型变换矩阵\n   */\n  getModelViewProjection (out: Matrix4, model: Matrix4) {\n    return out.multiplyMatrices(this.viewProjectionMatrix, model);\n  }\n\n  /**\n   * 获取归一化坐标和 3D 世界坐标的换算比例，使用 ViewProjection 矩阵\n   * @param z - 当前的位置 z\n   */\n  getInverseVPRatio (z: number) {\n    const pos = new Vector3(this.position.x, this.position.y, z);\n    const mat = this.getViewProjectionMatrix();\n    const inverseMat = this.getInverseViewProjectionMatrix();\n\n    if (!this.viewportMatrix.isIdentity()) {\n      const viewportMatrix = this.viewportMatrix.clone();\n\n      inverseMat.premultiply(viewportMatrix);\n      mat.multiply(viewportMatrix.invert());\n    }\n\n    const { z: nz } = mat.projectPoint(pos);\n    const { x: xMax, y: yMax } = inverseMat.projectPoint(new Vector3(1, 1, nz));\n    const { x: xMin, y: yMin } = inverseMat.projectPoint(new Vector3(-1, -1, nz));\n\n    return new Vector3((xMax - xMin) / 2, (yMax - yMin) / 2, 0);\n  }\n\n  /**\n   * 设置相机的旋转四元数\n   * @param value - 旋转四元数\n   */\n  setQuat (value: Quaternion) {\n    if (!this.transform.getQuaternion().equals(value)) {\n      this.transform.setQuaternion(value.x, value.y, value.z, value.w);\n      this.dirty = true;\n    }\n  }\n\n  /**\n   * 获取相机旋转对应的四元数\n   * @returns\n   */\n  getQuat (): Quaternion {\n    return this.transform.quat.clone();\n  }\n\n  /**\n   * 获取相机内部的 options\n   * @returns 相机 options\n   */\n  getOptions (): CameraOptionsEx {\n    return {\n      ...this.options,\n      position: this.position.clone(),\n      rotation: this.rotation.clone(),\n    };\n  }\n\n  /**\n   * 复制指定相机元素的属性到当前相机\n   * @param camera\n   */\n  copy (camera: Camera) {\n    const {\n      near,\n      far,\n      fov,\n      clipMode,\n      aspect,\n      position,\n      rotation,\n    } = camera;\n\n    this.near = near;\n    this.far = far;\n    this.fov = fov;\n    this.clipMode = clipMode;\n    this.aspect = aspect;\n    this.position = position;\n    this.rotation = rotation;\n    this.updateMatrix();\n  }\n\n  /**\n   * 更新相机相关的矩阵，获取矩阵前会自动调用\n   */\n  updateMatrix () {\n    if (this.dirty) {\n      const { fov, aspect, near, far, clipMode } = this.options;\n\n      this.projectionMatrix.perspective(\n        fov * DEG2RAD, aspect, near, far,\n        clipMode === spec.CameraClipMode.portrait\n      );\n      this.projectionMatrix.premultiply(this.viewportMatrix);\n      this.inverseViewMatrix.compose(this.position, this.getQuat(), tmpScale);\n      this.inverseViewMatrix.premultiply(this.transform.getParentMatrix() ?? Matrix4.IDENTITY);\n      this.viewMatrix.copyFrom(this.inverseViewMatrix).invert();\n      this.viewProjectionMatrix.multiplyMatrices(this.projectionMatrix, this.viewMatrix);\n      this.inverseViewProjectionMatrix = null;\n      this.dirty = false;\n    }\n  }\n\n  /**\n   * 将世界坐标转换为屏幕像素坐标\n   * @param position - 世界坐标\n   * @param out - 输出的屏幕坐标，如果不传则创建新的 Vector3\n   * @returns 屏幕坐标 (x, y 为像素坐标，左下角为(0,0)，右上角为(width,height)，z 为深度比例 [0,1]，0=近平面，1=远平面)\n   */\n  worldToScreenPoint (position: Vector3, out?: Vector3): Vector3 {\n    this.updateMatrix();\n\n    const result = out ?? new Vector3();\n    const vpMatrix = this.getViewProjectionMatrix();\n\n    // 应用视图投影矩阵，得到 NDC 坐标 [-1, 1]\n    result.set(position.x, position.y, position.z);\n    vpMatrix.projectPoint(result, result);\n\n    // 将 NDC 坐标转换为像素坐标\n    // NDC: x,y in [-1, 1], 其中 (-1,-1) 是左下角，(1,1) 是右上角\n    // Screen: x,y in [0, width/height], 其中 (0,0) 是左下角\n    result.x = (result.x + 1) * 0.5 * this.pixelWidth;\n    result.y = (result.y + 1) * 0.5 * this.pixelHeight;\n    // 将 NDC z 值从 [-1, 1] 转换为深度比例 [0, 1]\n    // -1 (近平面) -> 0, 1 (远平面) -> 1\n    result.z = (result.z + 1) * 0.5;\n\n    return result;\n  }\n\n  /**\n   * 将屏幕像素坐标转换为世界坐标\n   * @param position - 屏幕坐标 (x, y 为像素坐标，左下角为(0,0)，z 为深度比例 [0,1]，0=近平面，1=远平面)\n   * @param out - 输出的世界坐标，如果不传则创建新的 Vector3\n   * @returns 世界坐标\n   */\n  screenToWorldPoint (position: Vector3, out?: Vector3): Vector3 {\n    this.updateMatrix();\n\n    const result = out ?? new Vector3();\n    const invVPMatrix = this.getInverseViewProjectionMatrix();\n\n    // 将像素坐标转换为 NDC 坐标 [-1, 1]\n    const ndcX = (position.x / this.pixelWidth) * 2 - 1;\n    const ndcY = (position.y / this.pixelHeight) * 2 - 1;\n    // 将深度比例 [0, 1] 转换为 NDC z 值 [-1, 1]\n    // 0 (近平面) -> -1, 1 (远平面) -> 1\n    const ndcZ = position.z * 2 - 1;\n\n    // 应用逆视图投影矩阵\n    result.set(ndcX, ndcY, ndcZ);\n    invVPMatrix.projectPoint(result, result);\n\n    return result;\n  }\n}\n","export const SPRITE_VERTEX_STRIDE = 6;\n\nexport const SEMANTIC_PRE_COLOR_ATTACHMENT_0 = 'PRE_COLOR_0';\nexport const SEMANTIC_PRE_COLOR_ATTACHMENT_SIZE_0 = 'PRE_COLOR_SIZE_0';\nexport const SEMANTIC_MAIN_PRE_COLOR_ATTACHMENT_0 = 'PRE_MAIN_COLOR_0';\nexport const SEMANTIC_MAIN_PRE_COLOR_ATTACHMENT_SIZE_0 = 'PRE_MAIN_COLOR_SIZE_0';\n\nexport const PLAYER_OPTIONS_ENV_EDITOR = 'editor';\n\nexport const HELP_LINK = {\n  'Item duration can\\'t be less than 0': 'https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#AOnQS',\n  'ValueType: 21/22 is not supported': 'https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#smO1b',\n  'Container size overflowed': 'https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#MvjnY',\n  'Container is not an HTMLElement': 'https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#WZaWg',\n  'Invalid container size': 'https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#lLlSW',\n  'DPI overflowed': 'https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#ulfNT',\n};\n","import { Euler } from '@galacean/effects-math/es/core/euler';\nimport { Matrix4 } from '@galacean/effects-math/es/core/matrix4';\nimport { Vector3 } from '@galacean/effects-math/es/core/vector3';\nimport type { ValueGetter } from './value-getters';\n\nexport function translatePoint (x: number, y: number): number[] {\n  const origin = [-.5, .5, -.5, -.5, .5, .5, .5, -.5];\n\n  for (let i = 0; i < 8; i += 2) {\n    origin[i] += x;\n    origin[i + 1] += y;\n  }\n\n  return origin;\n}\n\nconst tempEuler = new Euler();\nconst tempMat4 = new Matrix4();\n\nexport type ItemLinearVelOverLifetime = {\n  asMovement?: boolean,\n  x?: ValueGetter<number>,\n  y?: ValueGetter<number>,\n  z?: ValueGetter<number>,\n  enabled?: boolean,\n};\n\nexport interface TranslateTarget {\n  speedOverLifetime?: ValueGetter<number>,\n  gravityModifier?: ValueGetter<number>,\n  linearVelOverLifetime?: ItemLinearVelOverLifetime,\n  orbitalVelOverLifetime?: any,\n}\n\nexport function calculateTranslation (\n  out: Vector3,\n  target: TranslateTarget,\n  acc: Vector3,\n  time: number,\n  duration: number,\n  posData: Vector3,\n  velData: Vector3,\n): Vector3 {\n  const ret = out;\n  const lifetime = time / duration;\n  let speedIntegrate = time;\n  const speedOverLifetime = target.speedOverLifetime;\n\n  if (speedOverLifetime) {\n    speedIntegrate = speedOverLifetime.getIntegrateValue(0, time, duration);\n  }\n\n  const d = target.gravityModifier ? target.gravityModifier.getIntegrateByTime(0, time) : 0;\n\n  ret.copyFrom(posData);\n  ret.addScaledVector(velData, speedIntegrate);\n  ret.addScaledVector(acc, d);\n\n  const linearVelocityOverLifetime = target.linearVelOverLifetime || {};\n  const orbVelOverLifetime = target.orbitalVelOverLifetime || {};\n  const map = ['x', 'y', 'z'];\n\n  if (orbVelOverLifetime.enabled) {\n    const center = new Vector3();\n\n    if (orbVelOverLifetime.center) {\n      center.setFromArray(orbVelOverLifetime.center);\n    }\n    const pos = ret.clone().subtract(center);\n    const asRotation = orbVelOverLifetime.asRotation;\n    const orbVel = map.map(pro => {\n      const value = orbVelOverLifetime[pro];\n\n      if (value) {\n        return (asRotation ? value.getValue(lifetime) : value.getIntegrateValue(0, time, duration));\n      }\n\n      return 0;\n    });\n\n    tempEuler.setFromArray(orbVel).negate();\n    tempMat4.setFromEuler(tempEuler);\n    const rot = tempMat4.transformPoint(pos);\n\n    ret.addVectors(center, rot);\n  }\n\n  if (linearVelocityOverLifetime.enabled) {\n    const asMovement = linearVelocityOverLifetime.asMovement;\n\n    const velocityXCurve = linearVelocityOverLifetime.x;\n    const velocityYCurve = linearVelocityOverLifetime.y;\n    const velocityZCurve = linearVelocityOverLifetime.z;\n\n    if (velocityXCurve) {\n      const curveValue = asMovement ? velocityXCurve.getValue(lifetime) : velocityXCurve.getIntegrateValue(0, time, duration);\n\n      ret.x = ret.x + curveValue;\n    }\n\n    if (velocityYCurve) {\n      const curveValue = asMovement ? velocityYCurve.getValue(lifetime) : velocityYCurve.getIntegrateValue(0, time, duration);\n\n      ret.y = ret.y + curveValue;\n    }\n\n    if (velocityZCurve) {\n      const curveValue = asMovement ? velocityZCurve.getValue(lifetime) : velocityZCurve.getIntegrateValue(0, time, duration);\n\n      ret.z = ret.z + curveValue;\n    }\n  }\n\n  return ret;\n}\n","import * as spec from '@galacean/effects-specification';\nimport type { vec2, vec3, vec4 } from '@galacean/effects-specification';\nimport { Vector3 } from '@galacean/effects-math/es/core/vector3';\nimport { Ray } from '@galacean/effects-math/es/core/ray';\nimport type { TriangleLike } from '@galacean/effects-math/es/core/type';\nimport type { Camera } from '../camera';\n\nexport type vec = number[];\n\nexport function ensureVec3 (num?: any): vec3 {\n  return Array.isArray(num) ? [num[0], num[1], num[2]] : [0, 0, 0];\n}\n\nexport function vecFill<T extends vec | vec3 | vec4 | vec2> (out: T | number[], number: number): T {\n  for (let i = 0, len = out.length; i < len; i++) {\n    out[i] = number;\n  }\n\n  return out as T;\n}\n\nexport function vecMulCombine<T extends vec | vec3 | vec4 | vec2> (out: T | number[] | Float32Array, a?: T, b?: T): T {\n  if (a && b) {\n    for (let i = 0, len = a.length; i < len; i++) {\n      out[i] = a[i] * b[i];\n    }\n  } else if (a) {\n    if (out !== a) {\n      for (let i = 0; i < a.length; i++) {\n        out[i] = a[i];\n      }\n    }\n  } else if (b) {\n    if (out !== b) {\n      for (let i = 0; i < b.length; i++) {\n        out[i] = b[i];\n      }\n    }\n  }\n\n  return out as T;\n}\n\nexport const particleOriginTranslateMap: Record<number, vec2> = {\n  [spec.ParticleOrigin.PARTICLE_ORIGIN_CENTER]: [0, 0],\n  [spec.ParticleOrigin.PARTICLE_ORIGIN_CENTER_BOTTOM]: [0, -0.5],\n  [spec.ParticleOrigin.PARTICLE_ORIGIN_CENTER_TOP]: [0, 0.5],\n  [spec.ParticleOrigin.PARTICLE_ORIGIN_LEFT_TOP]: [-0.5, 0.5],\n  [spec.ParticleOrigin.PARTICLE_ORIGIN_LEFT_CENTER]: [-0.5, 0],\n  [spec.ParticleOrigin.PARTICLE_ORIGIN_LEFT_BOTTOM]: [-0.5, -0.5],\n  [spec.ParticleOrigin.PARTICLE_ORIGIN_RIGHT_CENTER]: [0.5, 0],\n  [spec.ParticleOrigin.PARTICLE_ORIGIN_RIGHT_BOTTOM]: [0.5, -0.5],\n  [spec.ParticleOrigin.PARTICLE_ORIGIN_RIGHT_TOP]: [0.5, 0.5],\n};\n\nexport function nearestPowerOfTwo (value: number): number {\n  return 2 ** Math.round(Math.log(value) / Math.LN2);\n}\n\nexport function setRayFromCamera (x: number, y: number, camera: Camera) {\n  const origin = camera.position;\n  const direction = new Vector3(x, y, 0);\n  const dir = new Vector3();\n\n  const mat = camera.getInverseViewProjectionMatrix();\n\n  mat.projectPoint(direction, dir);\n  dir.subtract(origin);\n\n  return new Ray(origin, dir);\n}\n\nexport function trianglesFromRect (position: Vector3, halfWidth: number, halfHeight: number): TriangleLike[] {\n  const { x, y, z } = position;\n  const p0 = new Vector3(x - halfWidth, y + halfHeight, z);\n  const p1 = new Vector3(x - halfWidth, y - halfHeight, z);\n  const p2 = new Vector3(x + halfWidth, y - halfHeight, z);\n  const p3 = new Vector3(x + halfWidth, y + halfHeight, z);\n\n  return [\n    { p0, p1, p2 },\n    { p0: p0.clone(), p1: p2.clone(), p2: p3 },\n  ];\n}\n\nexport function decimalEqual (a: number, b: number, epsilon = 0.000001) {\n  return Math.abs(a - b) < epsilon;\n}\n\nexport function numberToFix (a: number, fixed = 2) {\n  const base = Math.pow(10, fixed);\n\n  return Math.floor(a * base) / base;\n}\n","import { Vector2 } from '@galacean/effects-math/es/core/vector2';\nimport * as spec from '@galacean/effects-specification';\n\nexport const keyframeInfo = {\n  pointIndexCache : {\n    xIndex: 0,\n    yIndex: 0,\n  },\n  /**\n   * 根据不同关键帧类型，获取位于曲线上的点\n   */\n  getPointInCurve (keyframe: spec.BezierKeyframeValue): Vector2 {\n    const [_, data] = keyframe;\n    const { xIndex, yIndex } = this.getPointIndexInCurve(keyframe, this.pointIndexCache);\n    const time = data[xIndex];\n    const value = data[yIndex];\n\n    return new Vector2(time, value);\n  },\n\n  /**\n   * 根据不同关键帧类型，获取位于曲线上的点的索引\n   */\n  getPointIndexInCurve (keyframe: spec.BezierKeyframeValue, res?: {\n    xIndex: number,\n    yIndex: number,\n  }): {\n      xIndex: number,\n      yIndex: number,\n    } {\n    const [type, , markType] = keyframe;\n    // 不同类型，存放的时间不同\n    const index = type === spec.BezierKeyframeType.LINE ? 0\n      : type === spec.BezierKeyframeType.EASE_OUT ? 0\n        : type === spec.BezierKeyframeType.EASE_IN ? 2\n          : type === spec.BezierKeyframeType.EASE ? 2\n            : type === spec.BezierKeyframeType.HOLD ? (markType === spec.BezierKeyframeType.EASE_IN ? 2 : 0)\n              : 0;\n\n    if (res) {\n      res.xIndex = index;\n      res.yIndex = index + 1;\n\n      return res;\n    } else {\n      return { xIndex: index, yIndex: index + 1 };\n    }\n  },\n\n  /**\n   * 关键帧左侧是否为缓动类型（否则为线段）\n   */\n  isLeftSideEase (keyframe: spec.BezierKeyframeValue): keyframe is spec.EaseInKeyframeValue | spec.EaseKeyframeValue | spec.EaseHoldOutKeyframeValue {\n    const [keyframeType, _, markType] = keyframe;\n\n    // 定格关键帧的左侧类型，需要借助markType判断\n    if (keyframeType === spec.BezierKeyframeType.HOLD && this.isKeyframeTypeLeftSideEase(markType)) {\n      return true;\n    }\n\n    return this.isKeyframeTypeLeftSideEase(keyframeType);\n  },\n\n  /**\n   * 关键帧右侧是否为缓动类型（否则为线段）\n   */\n  isRightSideEase (keyframe: spec.BezierKeyframeValue): keyframe is spec.EaseOutKeyframeValue | spec.EaseKeyframeValue | spec.EaseHoldInKeyframeValue {\n    const [keyframeType, _, markType] = keyframe;\n\n    // 定格关键帧的右侧类型，需要借助markType判断\n    if (keyframeType === spec.BezierKeyframeType.HOLD && this.isKeyframeTypeRightSideEase(markType)) {\n      return true;\n    }\n\n    return this.isKeyframeTypeRightSideEase(keyframeType);\n  },\n\n  /**\n   * 关键帧左侧是否为缓动类型（否则为线段）\n   */\n  isKeyframeTypeLeftSideEase (keyframeType: spec.BezierKeyframeType) {\n    return [spec.BezierKeyframeType.EASE, spec.BezierKeyframeType.EASE_IN, spec.BezierKeyframeType.AUTO].includes(keyframeType);\n  },\n\n  /**\n   * 关键帧右侧是否为缓动类型（否则为线段）\n   */\n  isKeyframeTypeRightSideEase (keyframeType: spec.BezierKeyframeType) {\n    return [spec.BezierKeyframeType.EASE, spec.BezierKeyframeType.EASE_OUT, spec.BezierKeyframeType.AUTO].includes(keyframeType);\n  },\n\n  /**\n   * 是否为定格进关键帧\n   */\n  isHoldInKeyframe (keyframe: spec.BezierKeyframeValue) {\n    const [keyframeType, _, leftSubType] = keyframe;\n\n    return keyframeType === spec.BezierKeyframeType.HOLD && [spec.BezierKeyframeType.HOLD, spec.BezierKeyframeType.LINE_OUT, spec.BezierKeyframeType.EASE_OUT].includes(leftSubType);\n  },\n\n  /**\n   * 是否为定格出关键帧\n   */\n  isHoldOutKeyframe (keyframe: spec.BezierKeyframeValue) {\n    const [keyframeType, _, leftSubType] = keyframe;\n\n    return keyframeType === spec.BezierKeyframeType.HOLD && [spec.BezierKeyframeType.HOLD, spec.BezierKeyframeType.LINE, spec.BezierKeyframeType.EASE_IN].includes(leftSubType);\n  },\n};\n","import type * as spec from '@galacean/effects-specification';\nimport { Vector2 } from '@galacean/effects-math/es/core/vector2';\nimport { Vector3 } from '@galacean/effects-math/es/core/vector3';\nimport { Quaternion } from '@galacean/effects-math/es/core/quaternion';\nimport { keyframeInfo } from './keyframe-info';\nimport { decimalEqual, numberToFix } from './utils';\nimport { assertExist } from '../utils';\n\nexport class BezierLengthData {\n  constructor (\n    public points: Array<{ partialLength: number, point: Vector3 }>,\n    public totalLength: number,\n  ) {\n  }\n}\nexport const BezierMap: Record<string, BezierEasing> = {};\nexport const BezierDataMap: Record<string, BezierLengthData> = {};\nconst NEWTON_ITERATIONS = 4;\nconst NEWTON_MIN_SLOPE = 0.001;\nconst SUBDIVISION_PRECISION = 0.0000001;\nconst SUBDIVISION_MAX_ITERATIONS = 10;\nconst CURVE_SEGMENTS = 300;\n\nconst kSplineTableSize = 11;\nconst kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\nfunction A (a1: number, a2: number) { return 1.0 - 3.0 * a2 + 3.0 * a1; }\nfunction B (a1: number, a2: number) { return 3.0 * a2 - 6.0 * a1; }\nfunction C (a1: number) { return 3.0 * a1; }\n\n// A * t ^ 3 + B * t ^ 2 + C * t\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nfunction calcBezier (t: number, a1: number, a2: number) {\n  return ((A(a1, a2) * t + B(a1, a2)) * t + C(a1)) * t;\n}\n\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\nfunction getSlope (t: number, a1: number, a2: number) {\n  return 3.0 * A(a1, a2) * t * t + 2.0 * B(a1, a2) * t + C(a1);\n}\n\nfunction binarySubdivide (aX: number, aA: number, aB: number, mX1: number, mX2: number) {\n  let currentX, currentT, i = 0;\n\n  do {\n    currentT = aA + (aB - aA) / 2.0;\n    currentX = calcBezier(currentT, mX1, mX2) - aX;\n    if (currentX > 0.0) {\n      aB = currentT;\n    } else {\n      aA = currentT;\n    }\n  } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n\n  return currentT;\n}\n\nfunction newtonRaphsonIterate (aX: number, aGuessT: number, mX1: number, mX2: number) {\n  for (let i = 0; i < NEWTON_ITERATIONS; ++i) {\n    const currentSlope = getSlope(aGuessT, mX1, mX2);\n\n    if (currentSlope === 0.0) { return aGuessT; }\n    const currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n\n    aGuessT -= currentX / currentSlope;\n  }\n\n  return aGuessT;\n}\n\n// de Casteljau算法构建曲线\n/**\n * @param p1 起始点\n * @param p2 终点\n * @param p3 起始控制点\n * @param p4 终止控制点\n * @returns\n */\nexport function buildBezierData (p1: Vector3, p2: Vector3, p3: Vector3, p4: Vector3): {\n  data: BezierLengthData,\n  interval: Vector3,\n} {\n  // 使用平移后的终点、控制点作为key\n  const s1 = numberToFix(p2.x - p1.x, 3) + '_' + numberToFix(p2.y - p1.y, 3) + '_' + numberToFix(p2.z - p1.z, 3);\n  const s2 = numberToFix(p3.x - p1.x, 3) + '_' + numberToFix(p3.y - p1.y, 3) + '_' + numberToFix(p3.z - p1.z, 3);\n  const s3 = numberToFix(p4.x - p1.x, 3) + '_' + numberToFix(p4.y - p1.y, 3) + '_' + numberToFix(p4.z - p1.z, 3);\n\n  const str = s1 + '&' + s2 + '&' + s3;\n\n  if (BezierDataMap[str]) {\n    return {\n      data: BezierDataMap[str],\n      interval: p1,\n    };\n  } else {\n    const samples = [];\n    let lastPoint = null, addedLength = 0, ptDistance = 0;\n    const curveSegments = CURVE_SEGMENTS;\n\n    for (let k = 0; k < curveSegments; k += 1) {\n      const point = new Vector3();\n      const perc = k / (curveSegments - 1);\n\n      ptDistance = 0;\n\n      point.x = 3 * Math.pow(1 - perc, 2) * perc * (p3.x - p1.x) + 3 * (1 - perc) * Math.pow(perc, 2) * (p4.x - p1.x) + Math.pow(perc, 3) * (p2.x - p1.x);\n      point.y = 3 * Math.pow(1 - perc, 2) * perc * (p3.y - p1.y) + 3 * (1 - perc) * Math.pow(perc, 2) * (p4.y - p1.y) + Math.pow(perc, 3) * (p2.y - p1.y);\n      point.z = 3 * Math.pow(1 - perc, 2) * perc * (p3.z - p1.z) + 3 * (1 - perc) * Math.pow(perc, 2) * (p4.z - p1.z) + Math.pow(perc, 3) * (p2.z - p1.z);\n\n      if (lastPoint !== null) {\n        ptDistance += Math.pow(point.x - lastPoint.x, 2);\n        ptDistance += Math.pow(point.y - lastPoint.y, 2);\n        ptDistance += Math.pow(point.z - lastPoint.z, 2);\n      }\n      lastPoint = point;\n      ptDistance = Math.sqrt(ptDistance);\n      addedLength += ptDistance;\n      samples[k] = {\n        partialLength: ptDistance,\n        point,\n      };\n\n    }\n    const data = new BezierLengthData(samples, addedLength);\n\n    BezierDataMap[str] = data;\n\n    return {\n      data,\n      interval: new Vector3(p1.x, p1.y, p1.z),\n    };\n  }\n\n}\n\nexport class BezierPath {\n  public readonly lengthData: BezierLengthData;\n  public readonly interval: Vector3;\n  public readonly totalLength: number;\n  private catching: {\n    lastPoint: number,\n    lastAddedLength: number,\n  } = {\n      lastPoint: 0,\n      lastAddedLength: 0,\n    };\n\n  constructor (public p1: Vector3, public p2: Vector3, public p3: Vector3, public p4: Vector3) {\n    const { data, interval } = buildBezierData(p1, p2, p3, p4);\n\n    this.lengthData = data;\n    this.interval = interval;\n    this.totalLength = data.totalLength;\n  }\n\n  /**\n   * 获取路径在指定比例长度上点的坐标\n   * @param percent 路径长度的比例\n   */\n  getPointInPercent (percent: number) {\n    const bezierData = this.lengthData;\n\n    if (percent === 0) {\n      return bezierData.points[0].point.clone().add(this.interval);\n    }\n\n    if (decimalEqual(1 - percent, 0)) {\n      return bezierData.points[CURVE_SEGMENTS - 1].point.clone().add(this.interval);\n    }\n    if (decimalEqual(bezierData.totalLength, 0)) {\n      return this.p1.clone();\n    }\n\n    const point = new Vector3();\n    const segmentLength = numberToFix(bezierData.totalLength * percent, 4);\n\n    let addedLength = this.catching.lastAddedLength;\n    let j = this.catching.lastPoint;\n\n    if (decimalEqual(addedLength, segmentLength)) {\n      return bezierData.points[j].point.clone().add(this.interval);\n    }\n\n    let flag = true;\n    let dir = 1;\n\n    if (segmentLength < addedLength) {\n      dir = -1;\n    }\n\n    while (flag) {\n      if (segmentLength >= addedLength) {\n        if (j === CURVE_SEGMENTS - 1) {\n          point.x = bezierData.points[j].point.x;\n          point.y = bezierData.points[j].point.y;\n          point.z = bezierData.points[j].point.z;\n\n          break;\n        }\n        if (segmentLength < addedLength + bezierData.points[j + 1].partialLength) {\n          const segmentPerc = (segmentLength - addedLength) / bezierData.points[j + 1].partialLength;\n\n          point.x = bezierData.points[j].point.x + (bezierData.points[j + 1].point.x - bezierData.points[j].point.x) * segmentPerc;\n          point.y = bezierData.points[j].point.y + (bezierData.points[j + 1].point.y - bezierData.points[j].point.y) * segmentPerc;\n          point.z = bezierData.points[j].point.z + (bezierData.points[j + 1].point.z - bezierData.points[j].point.z) * segmentPerc;\n\n          break;\n        }\n      }\n      if (dir > 0 && j < (CURVE_SEGMENTS - 1)) {\n        j += dir;\n        addedLength += numberToFix(bezierData.points[j].partialLength, 5);\n      } else if (dir < 0 && j > 0) {\n        addedLength -= numberToFix(bezierData.points[j].partialLength, 5);\n        j += dir;\n      } else {\n        flag = false;\n      }\n    }\n    this.catching.lastPoint = j;\n    this.catching.lastAddedLength = addedLength;\n\n    point.add(this.interval);\n\n    return point;\n  }\n\n}\n\nexport class BezierQuat {\n  private temp = new Quaternion();\n  public readonly totalLength: number;\n\n  constructor (public p1: Quaternion, public p2: Quaternion, public p3: Quaternion, public p4: Quaternion) {\n    this.totalLength = 0;\n  }\n\n  /**\n   * 获取路径在指定比例长度上点的坐标\n   * @param percent 路径长度的比例\n   */\n  getPointInPercent (percent: number) {\n    if (percent === 0) {\n      return this.temp.copyFrom(this.p1);\n    }\n\n    if (decimalEqual(1 - percent, 0)) {\n      return this.temp.copyFrom(this.p2);\n    }\n\n    QuaternionInner.slerpFlat(this.temp, this.p1, this.p2, percent);\n\n    return this.temp;\n  }\n\n}\n\nexport class BezierEasing {\n  private precomputed = false;\n  private mSampleValues: number[];\n\n  private control1 = new Vector2();\n  private control2 = new Vector2();\n  private weighted = false;\n  private isConstant = false;\n\n  constructor ();\n  constructor (control1: number, control2: number);\n  constructor (control1X: number, control1Y: number, control2X: number, control2Y: number);\n  constructor (control1YOrControl1X?: number, control2YOrControl1Y?: number, control2X?: number, control2Y?: number) {\n    this.mSampleValues = new Array(kSplineTableSize);\n\n    if (control1YOrControl1X !== undefined && control2YOrControl1Y !== undefined && control2X !== undefined && control2Y !== undefined) {\n      this.control1.x = control1YOrControl1X;\n      this.control1.y = control2YOrControl1Y;\n      this.control2.x = control2X;\n      this.control2.y = control2Y;\n      this.weighted = true;\n    } else if (control1YOrControl1X !== undefined && control2YOrControl1Y !== undefined) {\n      this.control1.x = 1 / 3;\n      this.control1.y = control1YOrControl1X;\n      this.control2.x = 2 / 3;\n      this.control2.y = control2YOrControl1Y;\n    } else {\n      this.isConstant = true;\n    }\n  }\n\n  getValue (x: number) {\n    if (this.isConstant) {\n      return 0;\n    }\n    if (this.control1.x === this.control1.y && this.control2.x === this.control2.y) {\n      return x;\n    }\n    if (x === 0 || x === 1) {\n      return x;\n    }\n    if (!this.weighted) {\n      return this.bezierInterpolate(0, this.control1.y, this.control2.y, 1, x);\n    }\n    if (!this.precomputed) {\n      this.precompute();\n    }\n    const value = calcBezier(this.getTForX(x), this.control1.y, this.control2.y);\n\n    return value;\n  }\n\n  private bezierInterpolate (pStart: number, pControl1: number, pControl2: number, pEnd: number, t: number): number {\n    // Formula from Wikipedia article on Bezier curves\n    const omt = (1.0 - t);\n    const omt2 = omt * omt;\n    const omt3 = omt2 * omt;\n    const t2 = t * t;\n    const t3 = t2 * t;\n\n    return pStart * omt3 + pControl1 * omt2 * t * 3.0 + pControl2 * omt * t2 * 3.0 + pEnd * t3;\n  }\n\n  private calcSampleValues () {\n    for (let i = 0; i < kSplineTableSize; ++i) {\n      this.mSampleValues[i] = calcBezier(i * kSampleStepSize, this.control1.x, this.control2.x);\n    }\n  }\n\n  private getTForX (aX: number) {\n    const mSampleValues = this.mSampleValues, lastSample = kSplineTableSize - 1;\n    let intervalStart = 0, currentSample = 1;\n\n    for (; currentSample !== lastSample && mSampleValues[currentSample] <= aX; ++currentSample) {\n      intervalStart += kSampleStepSize;\n    }\n    --currentSample;\n\n    // Interpolate to provide an initial guess for t\n    const dist = (aX - mSampleValues[currentSample]) / (mSampleValues[currentSample + 1] - mSampleValues[currentSample]);\n    const guessForT = intervalStart + dist * kSampleStepSize;\n\n    const initialSlope = getSlope(guessForT, this.control1.x, this.control2.x);\n\n    if (initialSlope >= NEWTON_MIN_SLOPE) {\n      return newtonRaphsonIterate(aX, guessForT, this.control1.x, this.control2.x);\n    } if (initialSlope === 0.0) {\n      return guessForT;\n    }\n\n    return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, this.control1.x, this.control2.x);\n  }\n\n  private precompute () {\n    this.precomputed = true;\n    if (this.control1.x !== this.control1.y || this.control2.x !== this.control2.y) {\n      this.calcSampleValues();\n    }\n  }\n\n}\n\nexport function buildEasingCurve (leftKeyframe: spec.BezierKeyframeValue, rightKeyframe: spec.BezierKeyframeValue): {\n  points: Vector2[],\n  timeInterval: number,\n  valueInterval: number,\n  curve: BezierEasing,\n} {\n  // 获取控制点和曲线类型\n  const { p0, p1, p2, p3 } = getControlPoints(leftKeyframe, rightKeyframe, true);\n\n  assertExist(p2);\n  assertExist(p3);\n  const timeInterval = p3.x - p0.x;\n  const valueInterval = p3.y - p0.y;\n  let y1, y2;\n  let x1 = numberToFix((p1.x - p0.x) / timeInterval, 5);\n  let x2 = numberToFix((p2.x - p0.x) / timeInterval, 5);\n\n  if (decimalEqual(valueInterval, 0)) {\n    y1 = y2 = NaN;\n  } else {\n    y1 = numberToFix((p1.y - p0.y) / valueInterval, 5);\n    y2 = numberToFix((p2.y - p0.y) / valueInterval, 5);\n  }\n\n  if (x1 < 0) {\n    console.error('Invalid bezier points, x1 < 0', p0, p1, p2, p3);\n    x1 = 0;\n  }\n  if (x2 < 0) {\n    console.error('Invalid bezier points, x2 < 0', p0, p1, p2, p3);\n    x2 = 0;\n  }\n  if (x1 > 1) {\n    console.error('Invalid bezier points, x1 >= 1', p0, p1, p2, p3);\n    x1 = 1;\n  }\n  if (x2 > 1) {\n    console.error('Invalid bezier points, x2 >= 1', p0, p1, p2, p3);\n    x2 = 1;\n  }\n\n  const str = ('bez_' + x1 + '_' + y1 + '_' + x2 + '_' + y2).replace(/\\./g, 'p');\n  let bezEasing;\n\n  if (BezierMap[str]) {\n    bezEasing = BezierMap[str];\n  } else {\n    if (decimalEqual(valueInterval, 0)) {\n      bezEasing = new BezierEasing();\n    } else {\n      bezEasing = new BezierEasing(x1, y1, x2, y2);\n    }\n    BezierMap[str] = bezEasing;\n  }\n\n  return {\n    points: [p0, p1, p2, p3],\n    timeInterval,\n    valueInterval,\n    curve: bezEasing,\n  };\n}\n\n/**\n * 根据关键帧类型获取贝塞尔曲线上的关键点\n */\nexport function getControlPoints (\n  leftKeyframe: spec.BezierKeyframeValue,\n  rightKeyframe: spec.BezierKeyframeValue,\n  lineToBezier: boolean,\n): ({ type: 'ease', p0: Vector2, p1: Vector2, p2: Vector2, p3: Vector2, isHold?: boolean, leftHoldLine?: boolean, rightHoldLine?: boolean } | { type: 'line', p0: Vector2, p1: Vector2, p2?: Vector2, p3?: Vector2, isHold?: boolean, leftHoldLine?: boolean, rightHoldLine?: boolean }) {\n  const [, leftValue] = leftKeyframe;\n  const leftHoldLine = keyframeInfo.isHoldOutKeyframe(leftKeyframe);\n  const rightHoldLine = keyframeInfo.isHoldInKeyframe(rightKeyframe);\n\n  const leftEase = !rightHoldLine && keyframeInfo.isRightSideEase(leftKeyframe);\n  const rightEase = !leftHoldLine && keyframeInfo.isLeftSideEase(rightKeyframe);\n\n  // 1. 左边为ease，右边为line（补充右边的控制点，该点在曲线上的点的偏左边位置）\n  if (leftEase && !rightEase && !rightHoldLine) {\n    const p0 = new Vector2(leftValue[leftValue.length - 4], leftValue[leftValue.length - 3]);\n    const p1 = new Vector2(leftValue[leftValue.length - 2], leftValue[leftValue.length - 1]);\n    const rightPoint = keyframeInfo.getPointInCurve(rightKeyframe);\n    const p3 = new Vector2(rightPoint.x, rightPoint.y);\n    const p2 = new Vector2(p3.x - (p3.x - p0.x) / 10, p3.y);\n\n    return { type: 'ease', p0, p1, p2, p3 };\n  }\n\n  // 2. 左边为line，右边为ease（补充左边的控制点，该点在曲线上的点的偏右边位置）\n  if (!leftEase && rightEase && !leftHoldLine) {\n    const [, rightValue] = rightKeyframe;\n    const leftPoint = keyframeInfo.getPointInCurve(leftKeyframe);\n    const p0 = new Vector2(leftPoint.x, leftPoint.y);\n    const p2 = new Vector2(rightValue[0], rightValue[1]);\n    const p3 = new Vector2(rightValue[2], rightValue[3]);\n    const p1 = new Vector2(p0.x + (p3.x - p0.x) / 10, p0.y);\n\n    return { type: 'ease', p0, p1, p2, p3 };\n  }\n\n  // 3. 左边为ease，右边为ease\n  if (leftEase && rightEase) {\n    const [, rightValue] = rightKeyframe;\n    const p0 = new Vector2(leftValue[leftValue.length - 4], leftValue[leftValue.length - 3]);\n    const p1 = new Vector2(leftValue[leftValue.length - 2], leftValue[leftValue.length - 1]);\n    const p2 = new Vector2(rightValue[0], rightValue[1]);\n    const p3 = new Vector2(rightValue[2], rightValue[3]);\n\n    return { type: 'ease', p0, p1, p2, p3 };\n  }\n\n  // 4. 左边为line，右边为line\n  const p0 = keyframeInfo.getPointInCurve(leftKeyframe);\n  const p1 = keyframeInfo.getPointInCurve(rightKeyframe);\n\n  if (leftHoldLine) {\n    p1.y = p0.y; // 定格关键帧使用相同的点\n  } else if (rightHoldLine) {\n    p0.y = p1.y;\n  }\n\n  if (lineToBezier) {\n    // 补上两个在直线上的控制点\n    const p2 = new Vector2((p1.x - p0.x) / 3 + p0.x, (p1.y - p0.y) / 3 + p0.y);\n    const p3 = new Vector2((p1.x - p0.x) / 3 * 2 + p0.x, (p1.y - p0.y) / 3 * 2 + p0.y);\n\n    return { type: 'line', p0, p1: p2, p2: p3, p3: p1, isHold: leftHoldLine || rightHoldLine, leftHoldLine, rightHoldLine };\n  } else {\n    return { type: 'line', p0, p1, isHold: leftHoldLine || rightHoldLine, leftHoldLine, rightHoldLine };\n  }\n}\n\nclass QuaternionInner {\n\n  static slerpFlat (dst: Quaternion, src0: Quaternion, src1: Quaternion, t: number) {\n    // fuzz-free, array-based Quaternion SLERP operation\n    let x0 = src0.x;\n    let y0 = src0.y;\n    let z0 = src0.z;\n    let w0 = src0.w;\n\n    const x1 = src1.x;\n    const y1 = src1.y;\n    const z1 = src1.z;\n    const w1 = src1.w;\n\n    if (t === 0) {\n      dst.x = x0;\n      dst.y = y0;\n      dst.z = z0;\n      dst.w = w0;\n\n      return;\n    }\n\n    if (t === 1) {\n      dst.x = x1;\n      dst.y = y1;\n      dst.z = z1;\n      dst.w = 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.x = x0;\n    dst.y = y0;\n    dst.z = z0;\n    dst.w = w0;\n  }\n}\n","import { Quaternion } from '@galacean/effects-math/es/core/quaternion';\nimport { clamp } from '@galacean/effects-math/es/core/utils';\nimport type { Vector2 } from '@galacean/effects-math/es/core/vector2';\nimport { Vector3 } from '@galacean/effects-math/es/core/vector3';\nimport * as spec from '@galacean/effects-specification';\nimport type { ColorStop } from '../../utils';\nimport { colorStopsFromGradient, interpolateColor } from '../../utils';\nimport type { BezierEasing } from '../bezier';\nimport { BezierPath, BezierQuat, buildEasingCurve } from '../bezier';\nimport { Float16ArrayWrapper } from '../float16array-wrapper';\nimport { numberToFix } from '../utils';\nimport type { BezierCurve } from './bezier-curve';\n\nexport interface KeyFrameMeta {\n  curves: ValueGetter<any>[],\n  index: number,\n  max: number,\n  lineSegCount: number,\n  curveCount: number,\n}\n\nconst CURVE_PRO_TIME = 0;\nconst CURVE_PRO_VALUE = 1;\nconst CURVE_PRO_IN_TANGENT = 2;\nconst CURVE_PRO_OUT_TANGENT = 3;\nconst NOT_IMPLEMENT = 'not_implement';\n\nexport class ValueGetter<T> {\n  static getAllData (meta: KeyFrameMeta, halfFloat?: boolean): Uint16Array | Float32Array {\n    const ret = new (halfFloat ? Float16ArrayWrapper : Float32Array)(meta.index * 4);\n\n    for (let i = 0, cursor = 0, curves = meta.curves; i < curves.length; i++) {\n      const data = (curves[i] as BezierCurve).toData();\n\n      ret.set(data, cursor);\n      cursor += data.length;\n    }\n\n    return halfFloat ? (ret as Float16ArrayWrapper).data : (ret as Float32Array);\n  }\n\n  constructor (arg: any) {\n    this.onCreate(arg);\n  }\n\n  onCreate (props: any) {\n    throw new Error(NOT_IMPLEMENT);\n  }\n\n  getIntegrateValue (t0: number, t1: number, timeScale = 1): T {\n    throw new Error(NOT_IMPLEMENT);\n  }\n\n  getIntegrateByTime (t0: number, time: number): T {\n    throw new Error(NOT_IMPLEMENT);\n  }\n\n  getValue (time?: number): T {\n    throw new Error(NOT_IMPLEMENT);\n  }\n\n  getMaxTime (): number {\n    throw new Error(NOT_IMPLEMENT);\n  }\n\n  toUniform (meta: KeyFrameMeta): Float32Array {\n    throw new Error(NOT_IMPLEMENT);\n  }\n\n  map (func: (n: T) => T) {\n    throw new Error(NOT_IMPLEMENT);\n  }\n\n  scaleXCoord (scale: number): ValueGetter<T> {\n    return this;\n  }\n\n  toData (): ArrayLike<number> {\n    throw new Error(NOT_IMPLEMENT);\n  }\n}\n\nexport class StaticValue extends ValueGetter<number> {\n  private value: number;\n\n  override onCreate (arg: number) {\n    this.value = arg;\n  }\n\n  override getIntegrateValue (t0: number, t1: number, ts: number) {\n    return this.value * (t1 - t0);\n  }\n\n  override getIntegrateByTime (t0: number, t1: number) {\n    return 0.5 * this.value * (t1 * t1 - t0 * t0);\n  }\n\n  override getValue (time?: number): number {\n    return this.value;\n  }\n\n  override toUniform () {\n    return new Float32Array([0, this.value, 0, 0]);\n  }\n\n  override map (func: (n: number) => number) {\n    const val = this.value;\n\n    this.value = func(val);\n\n    return this;\n  }\n\n  override getMaxTime (): number {\n    return 0;\n  }\n}\n\nexport class RandomSetValue<T> extends ValueGetter<T> {\n  private items: T[];\n\n  override onCreate (arg: T[]) {\n    this.items = arg;\n  }\n\n  override getValue (t: number): T {\n    const items = this.items;\n\n    return items[Math.floor(Math.random() * items.length)];\n  }\n\n  override map (func: (v: T) => T) {\n    this.items = this.items.map(func);\n\n    return this;\n  }\n}\n\nexport class RandomValue extends ValueGetter<number> {\n  private min: number;\n  private max: number;\n\n  override onCreate (props: [min: number, max: number]) {\n    this.min = props[0];\n    this.max = props[1];\n  }\n\n  override getValue (time?: number, seed?: number): number {\n    const randomSeed = seed ?? Math.random();\n\n    return this.min + randomSeed * (this.max - this.min);\n  }\n\n  override getIntegrateValue (t0: number, t1: number, timeScale?: number): number {\n    const seed = timeScale ?? 1.0;\n\n    return (this.min + seed * (this.max - this.min)) * (t1 - t0);\n  }\n\n  override toUniform () {\n    return new Float32Array([4, this.min, this.max, 0]);\n  }\n\n  override map (func: any) {\n    this.min = func(this.min);\n    this.max = func(this.max);\n\n    return this;\n  }\n}\n\nexport class RandomVectorValue extends ValueGetter<number[]> {\n  private min: number[];\n  private max: number[];\n\n  override onCreate (props: [min: number[], max: number[]]) {\n    this.min = props[0];\n    this.max = props[1];\n  }\n\n  override getValue (time: number): number[] {\n    const min = this.min;\n    const max = this.max;\n    const ret = [];\n\n    for (let i = 0; i < min.length; i++) {\n      const t = Math.random();\n\n      ret[i] = min[i] * (1 - t) + max[i] * t;\n    }\n\n    return ret;\n  }\n\n  // TODO:\n  override map (func: any) {\n    this.min = this.min.map(func);\n    this.max = this.max.map(func);\n\n    return this;\n  }\n}\n\nexport class LinearValue extends ValueGetter<number> {\n  private min: number;\n  private max: number;\n  private xCoord: number;\n\n  override onCreate (props: [min: number, max: number]) {\n    this.min = props[0];\n    this.max = props[1];\n    this.xCoord = 1;\n  }\n\n  override getValue (t: number) {\n    t /= this.xCoord;\n\n    return this.min * (1 - t) + this.max * t;\n  }\n\n  override toUniform () {\n    return new Float32Array([1, this.min, this.max, this.xCoord]);\n  }\n\n  override getIntegrateValue (t0: number, t1: number, timeScale = 1) {\n    const min = this.min;\n    const max = this.max;\n    const ts = this.xCoord * timeScale;\n    const v1 = min + (max - min) * (t1 / ts);\n    const v0 = min + (max - min) * (t0 / ts);\n\n    return ((v1 + min) * t1 - (v0 + min) * t0) / 2;\n  }\n\n  override getIntegrateByTime (t0: number, t1: number) {\n    return lineSegIntegrateByTime(t1, 0, this.xCoord, this.min, this.max) - lineSegIntegrateByTime(t0, 0, this.xCoord, this.min, this.max);\n  }\n\n  override map (func: (num: number) => number) {\n    this.min = func(this.min);\n    this.max = func(this.max);\n\n    return this;\n  }\n\n  override scaleXCoord (scale: number): LinearValue {\n    this.xCoord = scale;\n\n    return this;\n  }\n}\n\nexport class GradientValue extends ValueGetter<number[]> {\n  stops: ColorStop[];\n\n  override onCreate (props: spec.GradientStop[] | Record<string, string>) {\n    this.stops = colorStopsFromGradient(props);\n  }\n\n  getStops () {\n    return this.stops;\n  }\n\n  override getValue (time: number) {\n    const stops = this.stops;\n    const last = stops.length - 1;\n\n    for (let i = 0; i < last; i++) {\n      const a = stops[i];\n      const b = stops[i + 1];\n\n      if (a.time <= time && b.time > time) {\n        const t = (time - a.time) / (b.time - a.time);\n\n        return interpolateColor(a.color.toArray(), b.color.toArray(), t, true);\n      }\n    }\n\n    return stops[last].color.toArray();\n  }\n}\n\nexport class LineSegments extends ValueGetter<number> {\n  isLineSeg: boolean;\n\n  keys: number[][];\n\n  override onCreate (props: ({ time: number, value: number } & number[])[]) {\n    this.keys = props\n      .map(p => {\n        if (p.slice) {\n          return p.slice(0, 2);\n        }\n\n        return [p.time, p.value];\n      })\n      .sort((a, b) => a[0] - b[0]);\n\n    const last = this.keys[this.keys.length - 1];\n\n    if (last[0] < 1) {\n      this.keys.push([1, last[1]]);\n    }\n    const first = this.keys[0];\n\n    if (first[0] > 0) {\n      this.keys.unshift([0, first[1]]);\n    }\n    this.isLineSeg = true;\n  }\n\n  override getValue (time: number): number {\n    const keys = this.keys;\n\n    if (time < keys[0][0]) {\n      return keys[0][1];\n    }\n    const end = keys.length - 1;\n\n    for (let i = 0; i < end; i++) {\n      const key = keys[i];\n      const k2 = keys[i + 1];\n      const x0 = key[0];\n      const x1 = k2[0];\n\n      if (time >= x0 && time <= x1) {\n        const p = (time - x0) / (x1 - x0);\n        const y0 = key[1];\n\n        return y0 + p * (k2[1] - y0);\n      }\n    }\n\n    return keys[end][1];\n  }\n\n  override getIntegrateValue (t0: number, t1: number, ts = 1) {\n    return (this.integrate(t1, false) - this.integrate(t0, false)) * ts;\n  }\n\n  override getIntegrateByTime (t0: number, t1: number) {\n    return this.integrate(t1, true) - this.integrate(t0, true);\n  }\n\n  private integrate (time: number, byTime: boolean): number {\n    const keys = this.keys;\n\n    if (time <= keys[0][0]) {\n      return 0;\n    }\n\n    let ret = 0;\n    const end = keys.length - 1;\n    const func = byTime ? lineSegIntegrateByTime : lineSegIntegrate;\n\n    for (let i = 0; i < end; i++) {\n      const k1 = keys[i];\n      const k2 = keys[i + 1];\n      const t0 = k1[0];\n      const t1 = k2[0];\n\n      if (time > t0 && time <= t1) {\n        return ret + func(time, t0, t1, k1[1], k2[1]);\n      } else {\n        ret += func(t1, t0, t1, k1[1], k2[1]);\n      }\n    }\n\n    return ret;\n  }\n\n  override toData () {\n    const keys = this.keys;\n    const data = new Float32Array(Math.ceil(keys.length / 2) * 4);\n\n    for (let i = 0, cursor = 0; i < keys.length; i++, cursor += 2) {\n      data.set(keys[i], cursor);\n    }\n    data.set(keys[keys.length - 1], data.length - 2);\n\n    return data;\n  }\n\n  override toUniform (meta: any) {\n    const index = meta.index;\n    const keys = this.keys;\n    const uniformCount = Math.ceil(keys.length / 2);\n\n    meta.lineSegCount += uniformCount;\n    meta.curves.push(this);\n    meta.index += uniformCount;\n    meta.max = Math.max(meta.max, uniformCount);\n\n    return new Float32Array([3, index, uniformCount, 0]);\n  }\n\n  override map (func: (k: number) => number) {\n    this.keys.forEach(k => k[1] = func(k[1]));\n\n    return this;\n  }\n\n  override scaleXCoord (scale: number) {\n    this.keys.forEach(k => k[0] = scale * k[0]);\n\n    return this;\n  }\n}\n\nexport class PathSegments extends ValueGetter<number[]> {\n  keys: number[][];\n  values: number[][];\n\n  override onCreate (props: number[][][]) {\n    this.keys = props[0];\n    this.values = props[1];\n  }\n\n  override getValue (time: number) {\n    const keys = this.keys;\n    const values = this.values;\n\n    for (let i = 0; i < keys.length - 1; i++) {\n      const k0 = keys[i];\n      const k1 = keys[i + 1];\n\n      if (k0[0] <= time && k1[0] >= time) {\n        const dis = k1[1] - k0[1];\n        let dt;\n\n        if (dis === 0) {\n          dt = (time - k0[0]) / (k1[0] - k0[0]);\n        } else {\n          const val = curveValueEvaluate(time, k0, k1);\n\n          dt = (val - k0[1]) / dis;\n        }\n\n        return this.calculateVec(i, dt);\n      }\n    }\n    if (time <= keys[0][0]) {\n      return values[0].slice();\n    }\n\n    return values[values.length - 1].slice();\n  }\n\n  calculateVec (i: number, dt: number) {\n    const vec0 = this.values[i];\n    const vec1 = this.values[i + 1];\n    const ret = [0, 0, 0];\n\n    for (let j = 0; j < vec0.length; j++) {\n      ret[j] = vec0[j] * (1 - dt) + vec1[j] * dt;\n    }\n\n    return ret;\n  }\n}\n\nexport class BezierCurvePath extends ValueGetter<Vector3> {\n  curveSegments: Record<string, {\n    points: Vector2[],\n    // 缓动曲线\n    easingCurve: BezierEasing,\n    timeInterval: number,\n    valueInterval: number,\n    // 路径曲线\n    pathCurve: BezierPath,\n    timeStart: number,\n    timeEnd: number,\n  }>;\n\n  keys: number[][];\n  keyTimeData: string[];\n\n  override onCreate (props: spec.BezierCurvePathValue) {\n    const [keyframes, points, controlPoints] = props;\n\n    this.curveSegments = {};\n    if (!controlPoints.length) {\n      return;\n    }\n\n    for (let i = 0; i < keyframes.length - 1; i++) {\n      const leftKeyframe = keyframes[i];\n      const rightKeyframe = keyframes[i + 1];\n      const ps1 = new Vector3(points[i][0], points[i][1], points[i][2]), ps2 = new Vector3(points[i + 1][0], points[i + 1][1], points[i + 1][2]);\n\n      const cp1 = new Vector3(controlPoints[2 * i][0], controlPoints[2 * i][1], controlPoints[2 * i][2]), cp2 = new Vector3(controlPoints[2 * i + 1][0], controlPoints[2 * i + 1][1], controlPoints[2 * i + 1][2]);\n\n      const { points: ps, curve: easingCurve, timeInterval, valueInterval } = buildEasingCurve(leftKeyframe, rightKeyframe);\n      const s = ps[0];\n      const e = ps[ps.length - 1];\n\n      const pathCurve = new BezierPath(ps1, ps2, cp1, cp2);\n\n      this.curveSegments[`${s.x}&${e.x}`] = {\n        points: ps,\n        timeInterval,\n        valueInterval,\n        easingCurve,\n        pathCurve: pathCurve,\n        timeStart: Number(s.x),\n        timeEnd: Number(e.x),\n      };\n    }\n    this.keyTimeData = Object.keys(this.curveSegments);\n  }\n\n  override getValue (time: number): Vector3 {\n    const t = numberToFix(time, 5);\n    let perc = 0, point = new Vector3();\n    const keyTimeData = this.keyTimeData;\n\n    if (!keyTimeData.length) {\n      return point;\n    }\n    const keyTimeStart = this.curveSegments[keyTimeData[0]].timeStart;\n    const keyTimeEnd = this.curveSegments[keyTimeData[keyTimeData.length - 1]].timeEnd;\n\n    if (t <= keyTimeStart) {\n      const pathCurve = this.curveSegments[keyTimeData[0]].pathCurve;\n\n      point = pathCurve.getPointInPercent(0);\n\n      return point;\n\n    }\n    if (t >= keyTimeEnd) {\n      const pathCurve = this.curveSegments[keyTimeData[keyTimeData.length - 1]].pathCurve;\n\n      point = pathCurve.getPointInPercent(1);\n\n      return point;\n    }\n\n    for (let i = 0; i < keyTimeData.length; i++) {\n      const xMin = this.curveSegments[keyTimeData[i]].timeStart;\n      const xMax = this.curveSegments[keyTimeData[i]].timeEnd;\n\n      if (t >= Number(xMin) && t < Number(xMax)) {\n        const bezierPath = this.curveSegments[keyTimeData[i]].pathCurve;\n\n        perc = this.getPercValue(keyTimeData[i], t);\n\n        point = bezierPath.getPointInPercent(perc);\n      }\n    }\n\n    return point;\n  }\n\n  getPercValue (curveKey: string, time: number) {\n    const curveInfo = this.curveSegments[curveKey];\n    const [p0] = curveInfo.points;\n\n    const timeInterval = curveInfo.timeInterval;\n    const normalizeTime = numberToFix((time - p0.x) / timeInterval, 4);\n    const value = curveInfo.easingCurve.getValue(normalizeTime);\n\n    // TODO 测试用 编辑器限制值域后移除clamp\n    return clamp(value, 0, 1);\n  }\n\n  override getMaxTime (): number {\n    const keyTimeData = this.keyTimeData;\n\n    return this.curveSegments[keyTimeData[keyTimeData.length - 1]].timeEnd;\n  }\n}\n\nexport class BezierCurveQuat extends ValueGetter<Quaternion> {\n  curveSegments: Record<string, {\n    points: Vector2[],\n    // 缓动曲线\n    easingCurve: BezierEasing,\n    timeInterval: number,\n    valueInterval: number,\n    // 路径曲线\n    pathCurve: BezierQuat,\n  }>;\n\n  override onCreate (props: spec.BezierCurveQuatValue) {\n    const [keyframes, points, controlPoints] = props;\n\n    this.curveSegments = {};\n    if (!controlPoints.length) {\n      return;\n    }\n\n    for (let i = 0; i < keyframes.length - 1; i++) {\n      const leftKeyframe = keyframes[i];\n      const rightKeyframe = keyframes[i + 1];\n      const ps1 = Quaternion.fromArray(points[i]);\n      const ps2 = Quaternion.fromArray(points[i + 1]);\n\n      const cp1 = Quaternion.fromArray(controlPoints[2 * i]);\n      const cp2 = Quaternion.fromArray(controlPoints[2 * i + 1]);\n\n      const { points: ps, curve: easingCurve, timeInterval, valueInterval } = buildEasingCurve(leftKeyframe, rightKeyframe);\n      const s = ps[0];\n      const e = ps[ps.length - 1];\n\n      const pathCurve = new BezierQuat(ps1, ps2, cp1, cp2);\n\n      this.curveSegments[`${s.x}&${e.x}`] = {\n        points: ps,\n        timeInterval,\n        valueInterval,\n        easingCurve,\n        pathCurve: pathCurve,\n      };\n    }\n\n  }\n\n  override getValue (time: number): Quaternion {\n    let perc = 0;\n    const t = numberToFix(time, 5);\n    const keyTimeData = Object.keys(this.curveSegments);\n\n    const keyTimeStart = Number(keyTimeData[0].split('&')[0]);\n    const keyTimeEnd = Number(keyTimeData[keyTimeData.length - 1].split('&')[1]);\n\n    if (t <= keyTimeStart) {\n      const pathCurve = this.curveSegments[keyTimeData[0]].pathCurve;\n\n      return pathCurve.getPointInPercent(0);\n\n    }\n    if (t >= keyTimeEnd) {\n      const pathCurve = this.curveSegments[keyTimeData[keyTimeData.length - 1]].pathCurve;\n\n      return pathCurve.getPointInPercent(1);\n    }\n\n    for (let i = 0; i < keyTimeData.length; i++) {\n      const [xMin, xMax] = keyTimeData[i].split('&');\n\n      if (t >= Number(xMin) && t < Number(xMax)) {\n        const pathCurve = this.curveSegments[keyTimeData[i]].pathCurve;\n\n        perc = this.getPercValue(keyTimeData[i], t);\n\n        return pathCurve.getPointInPercent(perc);\n      }\n    }\n\n    const pathCurve = this.curveSegments[keyTimeData[0]].pathCurve;\n\n    return pathCurve.getPointInPercent(0);\n  }\n\n  getPercValue (curveKey: string, time: number) {\n    const curveInfo = this.curveSegments[curveKey];\n    const [p0] = curveInfo.points;\n\n    const timeInterval = curveInfo.timeInterval;\n    const normalizeTime = numberToFix((time - p0.x) / timeInterval, 4);\n    const value = curveInfo.easingCurve.getValue(normalizeTime);\n\n    // TODO 测试用 编辑器限制值域后移除clamp\n    return clamp(value, 0, 1);\n  }\n\n  override getMaxTime (): number {\n    const keyTimeData = Object.keys(this.curveSegments);\n\n    return Number(keyTimeData[keyTimeData.length - 1].split('&')[1]);\n  }\n}\n\nfunction lineSegIntegrate (t: number, t0: number, t1: number, y0: number, y1: number) {\n  const h = t - t0;\n\n  return (y0 + y0 + (y1 - y0) * h / (t1 - t0)) * h / 2;\n}\n\nfunction lineSegIntegrateByTime (t: number, t0: number, t1: number, y0: number, y1: number) {\n  const t2 = t * t;\n  const t3 = t2 * t;\n  const t02 = t0 * t0;\n  const t03 = t02 * t0;\n\n  return (2 * t3 * (y0 - y1) + 3 * t2 * (t0 * y1 - t1 * y0) - t03 * (2 * y0 + y1) + 3 * t02 * t1 * y0) / (6 * (t0 - t1));\n}\n\nfunction curveValueEvaluate (time: number, keyframe0: number[], keyframe1: number[]) {\n  const dt = keyframe1[CURVE_PRO_TIME] - keyframe0[CURVE_PRO_TIME];\n\n  const m0 = keyframe0[CURVE_PRO_OUT_TANGENT] * dt;\n  const m1 = keyframe1[CURVE_PRO_IN_TANGENT] * dt;\n\n  const t = (time - keyframe0[CURVE_PRO_TIME]) / dt;\n  const t2 = t * t;\n  const t3 = t2 * t;\n\n  const a = 2 * t3 - 3 * t2 + 1;\n  const b = t3 - 2 * t2 + t;\n  const c = t3 - t2;\n  const d = -2 * t3 + 3 * t2;\n\n  //(2*v0+m0+m1-2*v1)*(t-t0)^3/k^3+(3*v1-3*v0-2*m0-m1)*(t-t0)^2/k^2+m0 *(t-t0)/k+v0\n  return a * keyframe0[CURVE_PRO_VALUE] + b * m0 + c * m1 + d * keyframe1[CURVE_PRO_VALUE];\n}\n\nexport function getKeyFrameMetaByRawValue (meta: KeyFrameMeta, value?: [type: spec.ValueType, value: any]) {\n  if (value) {\n    const type = value[0];\n    const keys = value[1] as spec.vec4[];\n\n    if (type === spec.ValueType.CURVE) {\n      meta.curves.push(keys as any);\n      let keyLen = keys.length;\n\n      if (keys[0][0] > 0) {\n        keyLen++;\n      }\n      if (keys[keys.length - 1][0] < 1) {\n        keyLen++;\n      }\n      meta.index += keyLen;\n      meta.max = Math.max(meta.max, keyLen);\n      meta.curveCount += keyLen;\n    } else if (type === spec.ValueType.LINE) {\n      let keyLen = keys.length;\n\n      if (keyLen === 2 && keys[0][0] === 0 && keys[1][0] === 1) {\n        return;\n      }\n      if (keys[0][0] > 0) {\n        keyLen++;\n      }\n      if (keys[keys.length - 1][0] < 1) {\n        keyLen++;\n      }\n      const uniformCount = Math.ceil(keyLen / 2);\n\n      meta.lineSegCount += uniformCount;\n      meta.curves.push(keys as any);\n      meta.index += uniformCount;\n      meta.max = Math.max(meta.max, uniformCount);\n    } else if (type === spec.ValueType.BEZIER_CURVE) {\n      const keyLen = keys.length - 1;\n\n      meta.index += 2 * keyLen;\n      meta.curves.push(keys as any);\n      meta.max = Math.max(meta.max, 2 * keyLen);\n      meta.curveCount += 2 * keyLen;\n    }\n  }\n}\n\nexport function createKeyFrameMeta () {\n  return {\n    curves: [],\n    index: 0,\n    max: 0,\n    lineSegCount: 0,\n    curveCount: 0,\n  };\n}\n","function _is_native_reflect_construct() {\n    // Since Reflect.construct can't be properly polyfilled, some\n    // implementations (e.g. core-js@2) don't set the correct internal slots.\n    // Those polyfills don't allow us to subclass built-ins, so we need to\n    // use our fallback implementation.\n    try {\n        // If the internal slots aren't set, this throws an error similar to\n        //   TypeError: this is not a Boolean object.\n        var result = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {}));\n    } catch (_) {}\n    return (_is_native_reflect_construct = function() {\n        return !!result;\n    })();\n}\n\nexport { _is_native_reflect_construct as _ };\n","import { _ as _is_native_reflect_construct } from \"./_is_native_reflect_construct.js\";\nimport { _ as _set_prototype_of } from \"./_set_prototype_of.js\";\nfunction _construct(Parent, args, Class) {\n    if (_is_native_reflect_construct()) _construct = Reflect.construct;\n    else {\n        _construct = function construct(Parent, args, Class) {\n            var a = [null];\n            a.push.apply(a, args);\n            var Constructor = Function.bind.apply(Parent, a);\n            var instance = new Constructor();\n\n            if (Class) _set_prototype_of(instance, Class.prototype);\n\n            return instance;\n        };\n    }\n\n    return _construct.apply(null, arguments);\n}\nexport { _construct as _ };\n","import { Vector2 } from '@galacean/effects-math/es/core/vector2';\nimport { Vector3 } from '@galacean/effects-math/es/core/vector3';\nimport { Vector4 } from '@galacean/effects-math/es/core/vector4';\nimport type * as spec from '@galacean/effects-specification';\nimport { ValueGetter } from './value-getter';\nimport { createValueGetter } from './value-getter-map';\nimport type { BezierCurve } from './bezier-curve';\n\nexport class Vector4Curve extends ValueGetter<Vector4> {\n  private value = new Vector4();\n\n  private xCurve: BezierCurve;\n  private yCurve: BezierCurve;\n  private zCurve: BezierCurve;\n  private wCurve: BezierCurve;\n\n  override onCreate (arg: spec.Vector4CurveData) {\n    this.xCurve = createValueGetter(arg[0]) as BezierCurve;\n    this.yCurve = createValueGetter(arg[1]) as BezierCurve;\n    this.zCurve = createValueGetter(arg[2]) as BezierCurve;\n    this.wCurve = createValueGetter(arg[3]) as BezierCurve;\n  }\n\n  override getValue (t: number): Vector4 {\n    const x = this.xCurve.getValue(t);\n    const y = this.yCurve.getValue(t);\n    const z = this.zCurve.getValue(t);\n    const w = this.wCurve.getValue(t);\n\n    this.value.set(x, y, z, w);\n\n    return this.value;\n  }\n\n  override getMaxTime (): number {\n    return Math.max(\n      this.xCurve.getMaxTime(),\n      this.yCurve.getMaxTime(),\n      this.zCurve.getMaxTime(),\n      this.wCurve.getMaxTime(),\n    );\n  }\n}\n\nexport class Vector3Curve extends ValueGetter<Vector3> {\n  private value = new Vector3();\n\n  private xCurve: BezierCurve;\n  private yCurve: BezierCurve;\n  private zCurve: BezierCurve;\n\n  override onCreate (arg: spec.Vector3CurveData) {\n    this.xCurve = createValueGetter(arg[0]) as BezierCurve;\n    this.yCurve = createValueGetter(arg[1]) as BezierCurve;\n    this.zCurve = createValueGetter(arg[2]) as BezierCurve;\n  }\n\n  override getValue (t: number): Vector3 {\n    const x = this.xCurve.getValue(t);\n    const y = this.yCurve.getValue(t);\n    const z = this.zCurve.getValue(t);\n\n    this.value.set(x, y, z);\n\n    return this.value;\n  }\n\n  override getMaxTime (): number {\n    return Math.max(\n      this.xCurve.getMaxTime(),\n      this.yCurve.getMaxTime(),\n      this.zCurve.getMaxTime(),\n    );\n  }\n}\n\nexport class Vector2Curve extends ValueGetter<Vector2> {\n  private value = new Vector2();\n\n  private xCurve: BezierCurve;\n  private yCurve: BezierCurve;\n\n  override onCreate (arg: spec.Vector2CurveData) {\n    this.xCurve = createValueGetter(arg[0]) as BezierCurve;\n    this.yCurve = createValueGetter(arg[1]) as BezierCurve;\n  }\n\n  override getValue (t: number): Vector2 {\n    const x = this.xCurve.getValue(t);\n    const y = this.yCurve.getValue(t);\n\n    this.value.set(x, y);\n\n    return this.value;\n  }\n\n  override getMaxTime (): number {\n    return Math.max(\n      this.xCurve.getMaxTime(),\n      this.yCurve.getMaxTime(),\n    );\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport { Vector2 } from '@galacean/effects-math/es/core/vector2';\nimport type { Vector2Like } from '@galacean/effects-math/es/core/type';\nimport { NumberEpsilon } from '@galacean/effects-math/es/core/utils';\nimport { BezierEasing, BezierMap, getControlPoints } from '../bezier';\nimport type { KeyFrameMeta } from './value-getter';\nimport { ValueGetter } from './value-getter';\nimport { assertExist } from '../../utils';\nimport { decimalEqual, numberToFix } from '../utils';\n\ninterface CurveInfo {\n  points: Vector2[],\n  timeInterval: number,\n  valueInterval: number,\n  curve: BezierEasing,\n  timeStart: number,\n  timeEnd: number,\n}\n\nexport interface Keyframe {\n  time: number,\n  value: number,\n  inSlope: number,\n  outSlope: number,\n  inWeight: number,\n  outWeight: number,\n  weightedMode: WeightedMode,\n  tangentMode: TangentMode,\n}\n\nexport enum TangentMode {\n  Cubic,\n  Linear,\n  Constant\n}\n\nexport enum WeightedMode {\n  None,\n  In,\n  Out,\n  Both\n}\n\nexport class BezierCurve extends ValueGetter<number> {\n  curveMap: Record<string, CurveInfo>;\n  keys: number[][];\n\n  private keyFrames: Keyframe[];\n  private curveInfos: CurveInfo[];\n\n  override onCreate (props: spec.BezierKeyframeValue[]) {\n    this.keyFrames = oldBezierKeyFramesToNew(props);\n    const keyframes = this.keyFrames;\n\n    this.curveMap = {};\n    this.keys = [];\n    this.curveInfos = [];\n\n    for (let i = 0; i < keyframes.length - 1; i++) {\n      const leftKeyframe = keyframes[i];\n      const rightKeyframe = keyframes[i + 1];\n\n      const { points, curve, timeInterval, valueInterval } = buildBezierEasing(leftKeyframe, rightKeyframe);\n      const s = points[0];\n      const e = points[points.length - 1];\n\n      this.keys.push([...s.toArray(), ...points[1].toArray()]);\n      this.keys.push([...e.toArray(), ...points[2].toArray()]);\n\n      const curveInfo = {\n        points,\n        timeInterval,\n        valueInterval,\n        curve,\n        timeStart: Number(s.x),\n        timeEnd: Number(e.x),\n      };\n\n      this.curveMap[`${s.x}&${e.x}`] = curveInfo;\n      this.curveInfos.push(curveInfo);\n    }\n  }\n\n  override getValue (time: number) {\n    let result = 0;\n    const keysNumber = this.keyFrames.length;\n\n    if (time <= this.keyFrames[0].time) {\n      result = this.keyFrames[0].value;\n    } else if (time < this.keyFrames[keysNumber - 1].time) {\n      for (let i = 0; i < this.keyFrames.length - 1; i++) {\n        const xMin = this.keyFrames[i].time;\n        const xMax = this.keyFrames[i + 1].time;\n\n        if (time >= xMin && time < xMax) {\n          const curveInfo = this.curveInfos[i];\n          const p0 = curveInfo.points[0];\n          const timeInterval = curveInfo.timeInterval;\n          const valueInterval = curveInfo.valueInterval;\n          const normalizeTime = (time - p0.x) / timeInterval;\n          let value = 0;\n\n          if (this.keyFrames[i].tangentMode === TangentMode.Linear) {\n            value = normalizeTime;\n          } else {\n            value = curveInfo.curve.getValue(normalizeTime);\n          }\n\n          result = p0.y + valueInterval * value;\n\n          break;\n        }\n      }\n    } else if (time >= this.keyFrames[keysNumber - 1].time) {\n      result = this.keyFrames[keysNumber - 1].value;\n    }\n\n    return result;\n  }\n\n  override getIntegrateValue (t0: number, t1: number, ts = 1) {\n    const time = (t1 - t0) / ts;\n\n    let result = 0;\n    const keyTimeData = Object.keys(this.curveMap);\n    const keyTimeStart = this.curveMap[keyTimeData[0]].timeStart;\n\n    if (time <= keyTimeStart) {\n      return 0;\n    }\n    for (let i = 0; i < keyTimeData.length; i++) {\n      const xMin = this.curveMap[keyTimeData[i]].timeStart;\n      const xMax = this.curveMap[keyTimeData[i]].timeEnd;\n\n      if (time >= Number(xMax)) {\n        result += ts * this.getCurveIntegrateValue(keyTimeData[i], Number(xMax));\n      }\n\n      if (time >= Number(xMin) && time < Number(xMax)) {\n        result += ts * this.getCurveIntegrateValue(keyTimeData[i], time);\n\n        break;\n      }\n    }\n\n    return result;\n  }\n\n  override getIntegrateByTime (t0: number, t1: number) {\n    return this.getIntegrateValue(0, t1) - this.getIntegrateValue(0, t0);\n  }\n  // 速度变化曲线面板移除后下线\n  getCurveIntegrateValue (curveKey: string, time: number) {\n    const curveInfo = this.curveMap[curveKey];\n    const [p0] = curveInfo.points;\n    const timeInterval = curveInfo.timeInterval;\n    const valueInterval = curveInfo.valueInterval;\n    const segments = 20;\n    let total = 0;\n    const h = (time - p0.x) / segments;\n\n    for (let i = 0; i <= segments; i++) {\n      const t = i * h;\n      const normalizeTime = t / timeInterval;\n      const y = p0.y + valueInterval * curveInfo.curve.getValue(normalizeTime);\n\n      if (i === 0 || i === segments) {\n        total += y;\n      } else if (i % 2 === 1) {\n        total += 4 * y;\n      } else {\n        total += 2 * y;\n      }\n\n    }\n    total *= h / 3;\n\n    return total;\n  }\n\n  override toUniform (meta: KeyFrameMeta): Float32Array {\n    const index = meta.index;\n    const count = this.keys.length;\n\n    meta.curves.push(this);\n    meta.index = index + count;\n    // 兼容 WebGL1\n    meta.max = Math.max(meta.max, count);\n    meta.curveCount += count;\n\n    return new Float32Array([5, index + 1 / count, index, count]);\n  }\n\n  override toData (): Float32Array {\n    const keys = this.keys;\n    const data = new Float32Array(keys.length * 4);\n\n    for (let i = 0, cursor = 0; i < keys.length; i++, cursor += 4) {\n      data.set(keys[i], cursor);\n    }\n\n    return data;\n  }\n\n  override getMaxTime (): number {\n    return this.keyFrames[this.keyFrames.length - 1].time;\n  }\n}\n\nfunction buildBezierEasing (leftKeyframe: Keyframe, rightKeyframe: Keyframe): {\n  points: Vector2[],\n  timeInterval: number,\n  valueInterval: number,\n  curve: BezierEasing,\n} {\n  const p0 = new Vector2(leftKeyframe.time, leftKeyframe.value);\n  const p1 = new Vector2();\n  const p2 = new Vector2();\n  const p3 = new Vector2();\n\n  const isWeighted = leftKeyframe.weightedMode === WeightedMode.Out ||\n    leftKeyframe.weightedMode === WeightedMode.Both ||\n    rightKeyframe.weightedMode === WeightedMode.In ||\n    rightKeyframe.weightedMode === WeightedMode.Both;\n\n  const isConstant = leftKeyframe.tangentMode === TangentMode.Constant;\n\n  const rightDeltaX = (isWeighted ? leftKeyframe.outWeight : 1) * (rightKeyframe.time - leftKeyframe.time) / 3;\n\n  p1.x = leftKeyframe.time + rightDeltaX;\n  p1.y = leftKeyframe.value + rightDeltaX * (isConstant ? 0 : leftKeyframe.outSlope);\n\n  const leftDeltaX = (isWeighted ? rightKeyframe.inWeight : 1) * (rightKeyframe.time - leftKeyframe.time) / 3;\n\n  p2.x = rightKeyframe.time - leftDeltaX;\n  p2.y = rightKeyframe.value - leftDeltaX * (isConstant ? 0 : rightKeyframe.inSlope);\n\n  p3.x = rightKeyframe.time;\n  p3.y = isConstant ? leftKeyframe.value : rightKeyframe.value;\n\n  assertExist(p2);\n  assertExist(p3);\n  const timeInterval = p3.x - p0.x;\n  const valueInterval = p3.y - p0.y;\n  let y1, y2;\n  let x1 = numberToFix((p1.x - p0.x) / timeInterval, 5);\n  let x2 = numberToFix((p2.x - p0.x) / timeInterval, 5);\n\n  if (decimalEqual(valueInterval, 0)) {\n    y1 = y2 = NaN;\n  } else {\n    y1 = numberToFix((p1.y - p0.y) / valueInterval, 5);\n    y2 = numberToFix((p2.y - p0.y) / valueInterval, 5);\n  }\n\n  if (x1 < 0) {\n    console.error('Invalid bezier points, x1 < 0', p0, p1, p2, p3);\n    x1 = 0;\n  }\n  if (x2 < 0) {\n    console.error('Invalid bezier points, x2 < 0', p0, p1, p2, p3);\n    x2 = 0;\n  }\n  if (x1 > 1) {\n    console.error('Invalid bezier points, x1 >= 1', p0, p1, p2, p3);\n    x1 = 1;\n  }\n  if (x2 > 1) {\n    console.error('Invalid bezier points, x2 >= 1', p0, p1, p2, p3);\n    x2 = 1;\n  }\n\n  const str = ('bez_' + x1 + '_' + y1 + '_' + x2 + '_' + y2).replace(/\\./g, 'p');\n  let bezEasing;\n\n  if (BezierMap[str]) {\n    bezEasing = BezierMap[str];\n  } else {\n    if (decimalEqual(valueInterval, 0)) {\n      bezEasing = new BezierEasing();\n    } else if (isWeighted) {\n      bezEasing = new BezierEasing(x1, y1, x2, y2);\n    } else {\n      bezEasing = new BezierEasing(y1, y2);\n    }\n    BezierMap[str] = bezEasing;\n  }\n\n  return {\n    points: [p0, p1, p2, p3],\n    timeInterval,\n    valueInterval,\n    curve: bezEasing,\n  };\n}\n\ninterface KeyData {\n  leftControl: Vector2Like,\n  value: Vector2Like,\n  rightControl: Vector2Like,\n  tangentMode: TangentMode,\n}\n\nexport function oldBezierKeyFramesToNew (props: spec.BezierKeyframeValue[]): Keyframe[] {\n  const oldKeyframes = props;\n  const keyframes: Keyframe[] = [];\n  const keyDatas: KeyData[] = [];\n\n  let lastControl: Vector2Like = { x: 0, y: 0 };\n\n  for (let i = 0; i < oldKeyframes.length; i++) {\n    const leftKeyframe = oldKeyframes[i];\n    const rightKeyframe = i + 1 < oldKeyframes.length ? oldKeyframes[i + 1] : oldKeyframes[i];\n\n    const { p0, p1, p2, p3, type } = getControlPoints(leftKeyframe, rightKeyframe, true);\n\n    assertExist(p2);\n    assertExist(p3);\n    const keyData = {\n      leftControl: lastControl,\n      value: p0,\n      rightControl: p1,\n      tangentMode: type === 'line' ? TangentMode.Linear : TangentMode.Cubic,\n    };\n\n    if (leftKeyframe[0] === spec.BezierKeyframeType.HOLD) {\n      keyData.tangentMode = TangentMode.Constant;\n    }\n\n    keyDatas.push(keyData);\n    lastControl = p2;\n  }\n\n  const calculateSlope = (p0: Vector2Like, p1: Vector2Like) => {\n    return (p1.y - p0.y) / (p1.x - p0.x + NumberEpsilon);\n  };\n\n  for (let i = 0; i < keyDatas.length; i++) {\n    const leftControl = keyDatas[i].leftControl;\n    const value = keyDatas[i].value;\n    const rightControl = keyDatas[i].rightControl;\n\n    let inSlope = 0;\n    let outSlope = 0;\n\n    if (i > 0) {\n      inSlope = calculateSlope(leftControl, value);\n    }\n    if (i < keyDatas.length - 1) {\n      outSlope = calculateSlope(value, rightControl);\n    }\n\n    const keyframe: Keyframe = {\n      time: value.x,\n      value: value.y,\n      inSlope: inSlope,\n      outSlope: outSlope,\n      inWeight: 0,\n      outWeight: 0,\n      tangentMode: keyDatas[i].tangentMode,\n      weightedMode: WeightedMode.Both,\n    };\n\n    keyframes.push(keyframe);\n\n    if (i > 0) {\n      keyframe.inWeight = (value.x - leftControl.x) / ((value.x - keyDatas[i - 1].value.x) / 3);\n    }\n\n    if (i + 1 < keyDatas.length) {\n      keyframe.outWeight = (rightControl.x - value.x) / ((keyDatas[i + 1].value.x - value.x) / 3);\n    }\n  }\n\n  return keyframes;\n}\n","import * as spec from '@galacean/effects-specification';\nimport { colorToArr, isFunction } from '../../utils';\nimport { BezierCurvePath, BezierCurveQuat, GradientValue, LinearValue, LineSegments, PathSegments, RandomSetValue, RandomValue, RandomVectorValue, StaticValue } from './value-getter';\nimport { Vector3 } from '@galacean/effects-math/es/core/vector3';\nimport { Quaternion } from '@galacean/effects-math/es/core/quaternion';\nimport { ColorCurve } from './color-curve';\nimport { Vector2Curve, Vector3Curve, Vector4Curve } from './vector-curves';\nimport { ValueGetter } from './value-getter';\nimport { HELP_LINK } from '../../constants';\nimport { BezierCurve } from './bezier-curve';\n\n/**\n * Vector2 曲线\n * TODO: add spec\n */\nconst VECTOR3_CURVE = 27;\n\nconst map: Record<any, any> = {\n  [spec.ValueType.RANDOM] (props: number[][]) {\n    if (props[0] instanceof Array) {\n      return new RandomVectorValue(props);\n    }\n\n    return new RandomValue(props);\n  },\n  [spec.ValueType.CONSTANT] (props: number) {\n    return new StaticValue(props);\n  },\n  [spec.ValueType.CONSTANT_VEC2] (props: number) {\n    return new StaticValue(props);\n  },\n  [spec.ValueType.CONSTANT_VEC3] (props: number) {\n    return new StaticValue(props);\n  },\n  [spec.ValueType.CONSTANT_VEC4] (props: number) {\n    return new StaticValue(props);\n  },\n  [spec.ValueType.RGBA_COLOR] (props: number) {\n    return new StaticValue(props);\n  },\n  [spec.ValueType.COLORS] (props: number[][]) {\n    return new RandomSetValue(props.map(c => colorToArr(c, false)));\n  },\n  [spec.ValueType.LINE] (props: number[][]) {\n    if (props.length === 2 && props[0][0] === 0 && props[1][0] === 1) {\n      return new LinearValue([props[0][1], props[1][1]]);\n    }\n\n    return new LineSegments(props);\n  },\n  [spec.ValueType.GRADIENT_COLOR] (props: number[][] | Record<string, string>) {\n    return new GradientValue(props);\n  },\n  [spec.ValueType.LINEAR_PATH] (pros: number[][][]) {\n    return new PathSegments(pros);\n  },\n  [spec.ValueType.BEZIER_CURVE] (props: number[][][]) {\n    if (props.length === 1) {\n      return new StaticValue(props[0][1][1]);\n    }\n\n    return new BezierCurve(props as spec.BezierKeyframeValue[]);\n  },\n  [spec.ValueType.BEZIER_CURVE_PATH] (props: number[][][]) {\n    if (props[0].length === 1) {\n      return new StaticValue(new Vector3(...props[1][0]));\n    }\n\n    return new BezierCurvePath(props);\n  },\n  [spec.ValueType.BEZIER_CURVE_QUAT] (props: number[][][]) {\n    if (props[0].length === 1) {\n      return new StaticValue(new Quaternion(...props[1][0]));\n    }\n\n    return new BezierCurveQuat(props);\n  },\n  [spec.ValueType.COLOR_CURVE] (props: spec.ColorCurveData) {\n    return new ColorCurve(props);\n  },\n  [spec.ValueType.VECTOR4_CURVE] (props: spec.Vector4CurveData) {\n    return new Vector4Curve(props);\n  },\n  [spec.ValueType.VECTOR2_CURVE] (props: spec.Vector2CurveData) {\n    return new Vector2Curve(props);\n  },\n  // TODO: add spec\n  [VECTOR3_CURVE] (props: spec.Vector3CurveData) {\n    return new Vector3Curve(props);\n  },\n};\n\nexport function createValueGetter (args: any): ValueGetter<any> {\n  if (!args || !isNaN(+args)) {\n    return new StaticValue(args || 0);\n  }\n\n  if (args instanceof ValueGetter) {\n    return args;\n  }\n\n  if (isFunction(map[args[0]])) {\n    return map[args[0]](args[1]);\n  } else {\n    throw new Error(`ValueType: ${args[0]} is not supported, see ${HELP_LINK['ValueType: 21/22 is not supported']}.`);\n  }\n}","import { Color } from '@galacean/effects-math/es/core/color';\nimport { ValueGetter } from './value-getter';\nimport type * as spec from '@galacean/effects-specification';\nimport { createValueGetter } from './value-getter-map';\nimport type { BezierCurve } from './bezier-curve';\n\nexport class ColorCurve extends ValueGetter<Color> {\n  private value = new Color();\n\n  private rCurve: BezierCurve;\n  private gCurve: BezierCurve;\n  private bCurve: BezierCurve;\n  private aCurve: BezierCurve;\n\n  override onCreate (arg: spec.ColorCurveData) {\n    this.rCurve = createValueGetter(arg[0]) as BezierCurve;\n    this.gCurve = createValueGetter(arg[1]) as BezierCurve;\n    this.bCurve = createValueGetter(arg[2]) as BezierCurve;\n    this.aCurve = createValueGetter(arg[3]) as BezierCurve;\n  }\n\n  override getValue (t: number): Color {\n    const r = this.rCurve.getValue(t);\n    const g = this.gCurve.getValue(t);\n    const b = this.bCurve.getValue(t);\n    const a = this.aCurve.getValue(t);\n\n    this.value.set(r, g, b, a);\n\n    return this.value;\n  }\n\n  override getMaxTime (): number {\n    return Math.max(\n      this.rCurve.getMaxTime(),\n      this.gCurve.getMaxTime(),\n      this.bCurve.getMaxTime(),\n      this.aCurve.getMaxTime(),\n    );\n  }\n}","export const EFFECTS_COPY_MESH_NAME = 'effects-internal-copy';\nexport const COPY_MESH_SHADER_ID = 'effects-internal-copy-mesh';\n\nexport const COPY_VERTEX_SHADER = `\nprecision highp float;\nattribute vec2 aPos;\nvarying vec2 vTex;\nvoid main(){\n    gl_Position = vec4(aPos,0.,1.0);\n    vTex = (aPos + vec2(1.0))/2.;\n}`;\n\nexport const COPY_FRAGMENT_SHADER = `precision mediump float;\nvarying vec2 vTex;\n\n#ifdef DEPTH_TEXTURE\nuniform sampler2D uDepth;\n#extension GL_EXT_frag_depth : enable\n#endif\nvoid main(){\n    #ifdef DEPTH_TEXTURE\n    gl_FragDepthEXT = texture2D(uDepth,vTex).r;\n    #endif\n}\n`;","import type * as spec from '@galacean/effects-specification';\n\ntype DataRange = [start: number, length: number];\ntype ImageSource = HTMLImageElement | HTMLCanvasElement;\n\nexport enum TextureLoadAction {\n  whatever = 0,\n  //preserve previous attachment\n  //load = 1,\n  //clear attachment\n  clear = 2,\n}\n\nexport enum TextureSourceType {\n  none = 0,\n  data = 1,\n  image = 2,\n  compressed = 3,\n  video = 4,\n  canvas = 5,\n  framebuffer = 6,\n  mipmaps = 7\n}\n\nexport type TextureSourceCubeData = [\n  TEXTURE_CUBE_MAP_POSITIVE_X: ImageSource | { data: spec.TypedArray, width: number, height: number },\n  TEXTURE_CUBE_MAP_NEGATIVE_X: ImageSource | { data: spec.TypedArray, width: number, height: number },\n  TEXTURE_CUBE_MAP_POSITIVE_Y: ImageSource | { data: spec.TypedArray, width: number, height: number },\n  TEXTURE_CUBE_MAP_NEGATIVE_Y: ImageSource | { data: spec.TypedArray, width: number, height: number },\n  TEXTURE_CUBE_MAP_POSITIVE_Z: ImageSource | { data: spec.TypedArray, width: number, height: number },\n  TEXTURE_CUBE_MAP_NEGATIVE_Z: ImageSource | { data: spec.TypedArray, width: number, height: number }\n];\n\nexport type TextureCubeSourceURLMap = [\n  TEXTURE_CUBE_MAP_POSITIVE_X: string,\n  TEXTURE_CUBE_MAP_NEGATIVE_X: string,\n  TEXTURE_CUBE_MAP_POSITIVE_Y: string,\n  TEXTURE_CUBE_MAP_NEGATIVE_Y: string,\n  TEXTURE_CUBE_MAP_POSITIVE_Z: string,\n  TEXTURE_CUBE_MAP_NEGATIVE_Z: string\n];\n\nexport type TextureFactorySource2DBinaryMipmapsFrom = {\n  target?: WebGLRenderingContext['TEXTURE_2D'],\n  type: TextureSourceType.mipmaps,\n  bin: string,\n  mipmaps: DataRange[],\n};\n\nexport type TextureFactorySourceCubeBinaryMipmapsFrom = {\n  target: WebGLRenderingContext['TEXTURE_CUBE_MAP'],\n  type: TextureSourceType.mipmaps,\n  bin: string,\n  mipmaps: [\n    TEXTURE_CUBE_MAP_POSITIVE_X: DataRange,\n    TEXTURE_CUBE_MAP_NEGATIVE_X: DataRange,\n    TEXTURE_CUBE_MAP_POSITIVE_Y: DataRange,\n    TEXTURE_CUBE_MAP_NEGATIVE_Y: DataRange,\n    TEXTURE_CUBE_MAP_POSITIVE_Z: DataRange,\n    TEXTURE_CUBE_MAP_NEGATIVE_Z: DataRange\n  ][],\n};\n\nexport interface TextureFactorySource2DFrom {\n  type: TextureSourceType.image | TextureSourceType.video,\n  url: string,\n  target?: WebGLRenderingContext['TEXTURE_2D'],\n}\n\nexport type TextureFactorySourceCubeFrom = {\n  type: TextureSourceType.image,\n  map: TextureCubeSourceURLMap | string[],\n  target: WebGLRenderingContext['TEXTURE_CUBE_MAP'],\n};\n\nexport interface TextureFactorySourceCubeMipmapsFrom {\n  type: TextureSourceType.mipmaps,\n  target: WebGLRenderingContext['TEXTURE_CUBE_MAP'],\n  maps: TextureCubeSourceURLMap[] | string[][],\n}\n\nexport interface TextureFactorySource2DMipmapsFrom {\n  type: TextureSourceType.mipmaps,\n  target?: WebGLRenderingContext['TEXTURE_2D'],\n  urls: string[],\n}\n\nexport interface TextureFactorySourceFromCompressed {\n  type: TextureSourceType.compressed,\n  url: string,\n  // TODO 临时添加，通过下层setTexture类型检查，考虑该类型是否需要target。\n  target?: number,\n}\n\nexport type TextureFactorySourceFrom =\n  | TextureFactorySource2DBinaryMipmapsFrom\n  | TextureFactorySourceCubeBinaryMipmapsFrom\n  | TextureFactorySource2DFrom\n  | TextureFactorySourceCubeFrom\n  | TextureFactorySourceCubeMipmapsFrom\n  | TextureFactorySource2DMipmapsFrom\n  | TextureFactorySourceFromCompressed;\n\nexport interface TextureConfigOptions extends spec.TextureConfigOptionsBase {\n  sourceFrom?: TextureFactorySourceFrom,\n}\n\nexport interface TextureOptionsBase extends TextureConfigOptions, spec.TextureFormatOptions {\n}\n\nexport interface TextureCubeSourceOptionsImage extends TextureOptionsBase {\n  sourceType: TextureSourceType.image | TextureSourceType.data,\n  target: WebGLRenderingContext['TEXTURE_CUBE_MAP'],\n  cube: TextureSourceCubeData,\n}\n\nexport interface TextureCubeSourceOptionsImageMipmaps extends TextureOptionsBase {\n  sourceType?: TextureSourceType.mipmaps,\n  mipmaps: TextureSourceCubeData[],\n  target: WebGLRenderingContext['TEXTURE_CUBE_MAP'],\n}\n\nexport type TextureCubeSourceOptions = TextureCubeSourceOptionsImage | TextureCubeSourceOptionsImageMipmaps;\n\nexport type TextureDataType = {\n  data: spec.TypedArray,\n  width: number,\n  height: number,\n};\n\nexport interface Texture2DSourceOptionsImage extends TextureOptionsBase {\n  sourceType?: TextureSourceType.image,\n  image: ImageSource,\n  target?: WebGLRenderingContext['TEXTURE_2D'],\n  generateMipmap?: boolean,\n}\n\nexport interface Texture2DSourceOptionsData extends TextureOptionsBase {\n  sourceType?: TextureSourceType.data,\n  data: TextureDataType,\n  target?: WebGLRenderingContext['TEXTURE_2D'],\n}\n\nexport interface Texture2DSourceOptionsVideo extends TextureOptionsBase {\n  sourceType?: TextureSourceType.video,\n  video: HTMLVideoElement,\n  target?: WebGLRenderingContext['TEXTURE_2D'],\n  generateMipmap?: boolean,\n}\n\nexport interface Texture2DSourceOptionsImageMipmaps extends TextureOptionsBase {\n  sourceType?: TextureSourceType.mipmaps,\n  mipmaps: (ImageSource | TextureDataType)[],\n  target?: WebGLRenderingContext['TEXTURE_2D'],\n}\n\nexport interface Texture2DSourceOptionsCompressed extends TextureOptionsBase {\n  sourceType?: TextureSourceType.compressed,\n  mipmaps: TextureDataType[],\n  target?: WebGLRenderingContext['TEXTURE_2D'] | WebGLRenderingContext['TEXTURE_CUBE_MAP'],\n}\n\nexport interface Texture2DSourceOptionsFramebuffer extends TextureOptionsBase {\n  sourceType: TextureSourceType.framebuffer,\n  data?: { width: number, height: number },\n  target?: WebGLRenderingContext['TEXTURE_2D'],\n}\n\nexport interface Texture2DSourceOptionsNone extends TextureOptionsBase {\n  sourceType?: TextureSourceType.none,\n  target?: GLenum,\n}\n\nexport type Texture2DSourceOptions =\n  | Texture2DSourceOptionsImage\n  | Texture2DSourceOptionsData\n  | Texture2DSourceOptionsVideo\n  | Texture2DSourceOptionsImageMipmaps\n  | Texture2DSourceOptionsCompressed\n  | Texture2DSourceOptionsFramebuffer\n  | Texture2DSourceOptionsNone;\n\n// TODO texture的options太复杂，需要精简，构造函数很多参数传进去后没有给对象赋值，导致获取不到真实值（比如width和height）\nexport type TextureSourceOptions = Texture2DSourceOptions | TextureCubeSourceOptions;\n","import type { Texture } from '../texture';\nimport type { Renderbuffer } from './renderbuffer';\nimport type { RenderPassAttachmentStorageType, RenderPassDepthStencilAttachmentOptions } from './render-pass';\nimport type { RenderPassDestroyAttachmentType, RenderPassStoreAction } from './render-pass';\nimport type { Renderer } from './renderer';\n\nexport interface FramebufferProps {\n  attachments: Texture[],\n  depthStencilAttachment?: RenderPassDepthStencilAttachmentOptions,\n  viewport: [x: number, y: number, width: number, height: number],\n  storeAction: RenderPassStoreAction,\n  name?: string,\n}\n\nexport enum FilterMode {\n  Nearest,\n  Linear,\n}\n\nexport enum RenderTextureFormat {\n  RGBA32,\n  RGBAHalf,\n}\n\n/**\n *\n */\nexport class Framebuffer {\n  depthStencilStorageType: RenderPassAttachmentStorageType;\n  name: string;\n  viewport: [x: number, y: number, width: number, height: number];\n  ready: boolean;\n  externalStorage: boolean;\n  storeAction: RenderPassStoreAction;\n\n  static create: (props: FramebufferProps, renderer: Renderer) => Framebuffer;\n\n  resize (x: number, y: number, width: number, height: number) {\n    // OVERRIDE\n  }\n\n  resetColorTextures (textures: Texture[]) {\n    // OVERRIDE\n  }\n\n  unbind () {\n    // OVERRIDE\n  }\n\n  bind () {\n    // OVERRIDE\n  }\n\n  get stencilStorage (): Renderbuffer | undefined {\n    // OVERRIDE\n    return undefined;\n  }\n\n  get depthStorage (): Renderbuffer | undefined {\n    // OVERRIDE\n    return undefined;\n  }\n\n  getDepthTexture (): Texture | undefined {\n    // OVERRIDE\n    return undefined;\n  }\n\n  getStencilTexture (): Texture | undefined {\n    // OVERRIDE\n    return undefined;\n  }\n\n  getColorTextures (): Texture[] {\n    // OVERRIDE\n    return [];\n  }\n\n  dispose (options?: { depthStencilAttachment?: RenderPassDestroyAttachmentType }) {\n    // OVERRIDE\n  }\n}\n","export type GLType = 'webgl' | 'webgl2';\n\n/**\n * Helper class to create a WebGL Context\n *\n * @param canvas\n * @param glType\n * @param options\n * @returns\n */\nexport function createGLContext (\n  canvas: HTMLCanvasElement | OffscreenCanvas,\n  glType: GLType = 'webgl',\n  options: WebGLContextAttributes,\n): WebGLRenderingContext | WebGL2RenderingContext {\n  let context: WebGLRenderingContext | WebGL2RenderingContext | undefined;\n\n  if (glType === 'webgl2') {\n    context = canvas.getContext('webgl2', options) as WebGL2RenderingContext;\n    if (!context) {\n      console.debug('WebGL2 context retrieval failed, falling back to WebGL context.');\n    }\n  }\n  if (!context || glType === 'webgl') {\n    context = canvas.getContext('webgl', options) as WebGLRenderingContext;\n  }\n  if (!context) {\n    throw new Error('This browser does not support WebGL or the WebGL version is incorrect. Please check your WebGL version.');\n  }\n\n  return context;\n}\n","export function gpuTimer (gl: WebGL2RenderingContext) {\n  const ext = gl.getExtension('EXT_disjoint_timer_query_webgl2');\n\n  if (ext) {\n    let query = gl.createQuery();\n    const getTime = async () => {\n      return new Promise<number | null>((resolve, reject) => {\n        if (query) {\n          const available = gl.getQueryParameter(query, gl.QUERY_RESULT_AVAILABLE);\n          const disjoint = gl.getParameter(ext.GPU_DISJOINT_EXT);\n\n          if (available && !disjoint) {\n            // See how much time the rendering of the object took in nanoseconds.\n            const timeElapsed = gl.getQueryParameter(query, gl.QUERY_RESULT); // Do something useful with the time.  Note that care should be\n\n            // taken to use all significant bits of the result, not just the\n            // least significant 32 bits.\n            resolve(timeElapsed / 1000 / 1000);\n          }\n          if (available || disjoint) {\n            // Clean up the query object.\n            gl.deleteQuery(query); // Don't re-enter this polling loop.\n\n            query = null;\n          }\n          available !== null && query && window.setTimeout(() => {\n            getTime().then(resolve).catch;\n          }, 1);\n        }\n      });\n    };\n\n    if (!query) {\n      return;\n    }\n\n    return {\n      begin: () => {\n        query && gl.beginQuery(ext.TIME_ELAPSED_EXT, query);\n      },\n      end: () => {\n        gl.endQuery(ext.TIME_ELAPSED_EXT);\n      },\n      getTime,\n    };\n  }\n}\n\n","import * as spec from '@galacean/effects-specification';\nimport { canUseBOM, isIOS } from '../utils';\n\nexport * from './create-gl-context';\nexport * from './gpu-time';\n\nexport const initErrors: string[] = [];\nexport const glContext: WebGL2RenderingContext = {} as WebGL2RenderingContext;\n\nconst IOS16_LOCKDOWN_MODE = 'iOS16 lockdown mode, WebGL Constants not in global';\nconst WEBGL_CONSTANTS_NOT_IN_GLOBAL = 'WebGL Constants not in global, please check your environment';\n\nif (!initErrors.length) {\n  initGLContext();\n}\n\nexport function initGLContext () {\n  // 重要：iOS 9/10 低版本需要拷贝 gl context 的 prototype，要不然会有属性值的缺失\n  if (typeof WebGL2RenderingContext === 'function') {\n    copy(WebGL2RenderingContext);\n  } else if (typeof WebGLRenderingContext !== 'undefined') {\n    copy(WebGLRenderingContext);\n    copy(WebGLRenderingContext.prototype);\n  } else {\n    if (canUseBOM) {\n      initErrors.push(\n        // iOS 16 lockdown mode\n        isIOS() ? IOS16_LOCKDOWN_MODE : WEBGL_CONSTANTS_NOT_IN_GLOBAL,\n      );\n    } else {\n      initErrors.push(WEBGL_CONSTANTS_NOT_IN_GLOBAL);\n    }\n  }\n  if (!initErrors.length && !('HALF_FLOAT' in glContext)) {\n    // @ts-expect-error set default value\n    glContext['HALF_FLOAT'] = 5131;\n  }\n}\n\nexport function isWebGL2 (gl: WebGLRenderingContext | WebGL2RenderingContext): gl is WebGL2RenderingContext {\n  return typeof WebGL2RenderingContext !== 'undefined' && gl.constructor.name === 'WebGL2RenderingContext';\n}\n\nfunction copy (target: any) {\n  for (const name in target) {\n    if (/^[A-Z_]/.test(name)) {\n      // @ts-expect-error safe to assign\n      glContext[name] = target[name];\n    }\n  }\n}\n\nexport function vertexFormatType2GLType (formatType: spec.VertexFormatType): spec.BufferType {\n  switch (formatType) {\n    case spec.VertexFormatType.Float32:\n      return WebGLRenderingContext['FLOAT'];\n    case spec.VertexFormatType.Int16:\n      return WebGLRenderingContext['SHORT'];\n    case spec.VertexFormatType.Int8:\n      return WebGLRenderingContext['BYTE'];\n    case spec.VertexFormatType.UInt16:\n      return WebGLRenderingContext['UNSIGNED_SHORT'];\n    case spec.VertexFormatType.UInt8:\n      return WebGLRenderingContext['UNSIGNED_BYTE'];\n    default:\n      return WebGLRenderingContext['FLOAT'];\n  }\n}\n\nexport function glType2VertexFormatType (webglType: spec.BufferType): spec.VertexFormatType {\n  switch (webglType) {\n    case WebGLRenderingContext['FLOAT']:\n      return spec.VertexFormatType.Float32;\n    case WebGLRenderingContext['SHORT']:\n      return spec.VertexFormatType.Int16;\n    case WebGLRenderingContext['BYTE']:\n      return spec.VertexFormatType.Int8;\n    case WebGLRenderingContext['UNSIGNED_SHORT']:\n      return spec.VertexFormatType.UInt16;\n    case WebGLRenderingContext['UNSIGNED_BYTE']:\n      return spec.VertexFormatType.UInt8;\n    default:\n      return spec.VertexFormatType.Float32;\n  }\n}\n","import { isAndroid } from './utils';\n\n/**\n * 成功处理程序\n * @template T\n */\ntype SuccessHandler<T> = (data: T) => void;\n/**\n * 错误处理程序\n * @param status - HTTP 状态码\n * @param responseText - 响应文本\n */\ntype ErrorHandler = (status: number, responseText: string) => void;\n\n/**\n * JSON 值，它可以是字符串、数字、布尔值、对象或者 JSON 值的数组。\n *\n * @typedef {string | number | boolean | {[key: string]: JSONValue} | JSONValue[]} JSONValue\n */\nexport type JSONValue =\n  | string\n  | number\n  | boolean\n  | { [key: string]: JSONValue }\n  | JSONValue[];\n\n/**\n * 负责下载各种资源，并提供了一些异步加载和缓存管理的功能\n */\nexport class Downloader {\n\n  /**\n   * 是否信任 XMLHttpRequest 的状态码为 0 的响应\n   * 某些浏览器在本地文件协议（file://）下会返回状态码 0，但实际上请求是成功的\n   * 设置为 true 可以让 Downloader 将状态码 0 视为成功\n   */\n  static trustXHRStatusZero = false;\n\n  /**\n   * 存储多个回调函数的对象\n   */\n  private callbacks: Record<string, Function[]> = {};\n\n  /**\n   * 下载一个 JSON 文件\n   * @param url - 要下载的 JSON 文件的 URL\n   * @param onSuccess - 下载成功后的回调函数\n   * @param onError - 下载失败后的回调函数\n   */\n  downloadJSON (url: string, onSuccess: SuccessHandler<JSONValue>, onError: ErrorHandler) {\n    this.download(url, 'json', onSuccess, onError);\n  }\n\n  /**\n   * 下载一个二进制文件\n   * @param url - 要下载的二进制文件的 URL\n   * @param onSuccess - 下载成功后的回调函数\n   * @param onError - 下载失败后的回调函数\n   */\n  downloadBinary (url: string, onSuccess: SuccessHandler<ArrayBuffer>, onError: ErrorHandler) {\n    this.download(url, 'arraybuffer', onSuccess, onError);\n  }\n\n  /**\n   * 下载一个 Blob 文件\n   * @param url - 要下载的 Blob 文件的 URL\n   * @param onSuccess - 下载成功后的回调函数\n   * @param onError - 下载失败后的回调函数\n   */\n  downloadBlob (url: string, onSuccess: SuccessHandler<Blob>, onError: ErrorHandler) {\n    this.download(url, 'blob', onSuccess, onError);\n  }\n\n  /**\n   * 下载一个文本文件\n   * @param url - 要下载的文本文件的 URL\n   * @param onSuccess - 下载成功后的回调函数\n   * @param onError - 下载失败后的回调函数\n   */\n  downloadText (url: string, onSuccess: SuccessHandler<string>, onError: ErrorHandler) {\n    this.download(url, 'text', onSuccess, onError);\n  }\n\n  private download (url: string, responseType: XMLHttpRequestResponseType = 'json', onSuccess: SuccessHandler<any>, onError: ErrorHandler) {\n    if (this.start(url, onSuccess, onError)) {\n      return;\n    }\n\n    const xhr = new XMLHttpRequest();\n    const handleError = () => {\n      this.finish(url, xhr.status, xhr.response);\n    };\n    const handleLoad = () => {\n      if (xhr.status == 200 || (xhr.status == 0 && Downloader.trustXHRStatusZero)) {\n        this.finish(url, 200, xhr.response);\n      } else {\n        handleError();\n      }\n    };\n\n    xhr.responseType = responseType;\n    xhr.addEventListener('load', handleLoad);\n    xhr.addEventListener('error', handleError);\n    xhr.open('GET', url, true);\n    xhr.send();\n  }\n\n  private start (url: string, onSuccess: SuccessHandler<any>, onError: ErrorHandler) {\n    let callbacks = this.callbacks[url];\n\n    try {\n      if (callbacks) { return true; }\n      this.callbacks[url] = callbacks = [];\n    } finally {\n      callbacks.push(onSuccess, onError);\n    }\n  }\n\n  private finish (url: string, status: number, data: any) {\n    const callbacks = this.callbacks[url];\n\n    delete this.callbacks[url];\n    const args = status == 200 || (status == 0 && Downloader.trustXHRStatusZero) ? [data] : [status, data];\n\n    for (let i = args.length - 1, n = callbacks.length; i < n; i += 2) {\n      callbacks[i].apply(null, args);\n    }\n  }\n}\n\nlet webPFailed = false;\nlet avifFailed = false;\n\n/**\n * 异步加载一个 WebP 图片文件，如果不支持 WebP，则加载 PNG 图片文件\n * @param png - PNG 图片文件的 URL\n * @param webp - WebP 图片文件的 URL\n */\nexport async function loadWebPOptional (png: string, webp?: string) {\n  if (webPFailed || !webp) {\n    const image = await loadImage(png);\n\n    return { image, url: png };\n  }\n\n  try {\n    const image = await loadImage(webp);\n\n    return { image, url: webp };\n  } catch (_) {\n    webPFailed = true;\n    const image = await loadImage(png);\n\n    return { image, url: png };\n  }\n}\n\n/**\n * 异步加载一个 AVIF 图片文件，如果不支持 AVIF，则加载 PNG 图片文件\n * @param png - PNG 图片文件的 URL\n * @param avif - AVIF 图片文件的 URL\n */\nexport async function loadAVIFOptional (png: string, avif?: string) {\n  if (avifFailed || !avif) {\n    const image = await loadImage(png);\n\n    return { image, url: png };\n  }\n\n  try {\n    const image = await loadImage(avif);\n\n    return { image, url: avif };\n  } catch (_) {\n    avifFailed = true;\n    const image = await loadImage(png);\n\n    return { image, url: png };\n  }\n}\n\n/**\n * 异步加载一个图片文件\n * @param source - 图片文件的 URL、Blob 或 HTMLImageElement 对象\n */\nexport async function loadImage (\n  source: string | Blob | HTMLImageElement,\n): Promise<HTMLImageElement> {\n  let url = '';\n  let revokeURL: boolean;\n\n  // 1. string | Blob | HTMLImageElement 处理逻辑\n  if (source instanceof HTMLImageElement) {\n    if (source.complete) {\n      return source;\n    }\n    url = source.src;\n  } else if (source instanceof Blob) {\n    url = URL.createObjectURL(source);\n    revokeURL = true;\n  } else if (typeof source === 'string') {\n    url = source;\n  }\n\n  // 2. 非法类型\n  if (!url) {\n    throw new Error(`Invalid url type: ${JSON.stringify(source)}.`);\n  }\n\n  return new Promise<HTMLImageElement>((resolve, reject) => {\n    const img = new Image();\n\n    if (!/^data:/.test(url)) {\n      img.crossOrigin = '*';\n    }\n    img.onload = () => {\n      img.onload = null;\n      if (revokeURL) {\n        URL.revokeObjectURL(url);\n      }\n\n      return resolve(img);\n    };\n    img.onerror = e => {\n      img.onerror = null;\n      if (revokeURL) {\n        URL.revokeObjectURL(url);\n      }\n\n      return reject(`Load image fail: ${url}, reason: ${JSON.stringify(e)}`);\n    };\n    img.src = url;\n  });\n\n}\n\n/**\n * 异步加载一个二进制文件\n * @param url - 二进制文件的 URL\n */\nexport async function loadBinary (url: string): Promise<ArrayBuffer> {\n  return new Promise<ArrayBuffer>((resolve, reject) => {\n    new Downloader().downloadBinary(\n      url,\n      resolve,\n      (status, responseText) => {\n        reject(`Couldn't load bins ${url}: status ${status}, ${responseText}`);\n      });\n  });\n}\n\n/**\n * 异步加载一个 Blob 文件\n * @param url - Blob 文件的 URL\n */\nexport async function loadBlob (url: string): Promise<Blob> {\n  return new Promise<Blob>((resolve, reject) => {\n    new Downloader().downloadBlob(\n      url,\n      resolve,\n      (status, responseText) => {\n        reject(`Couldn't load blob ${url}: status ${status}, ${responseText}`);\n      });\n  });\n}\n\n/**\n * 异步加载一个视频文件\n * @param url - 视频文件的 URL 或 MediaProvider 对象\n */\nexport async function loadVideo (url: string | MediaProvider): Promise<HTMLVideoElement> {\n  const video = document.createElement('video');\n\n  if (typeof url === 'string') {\n    video.src = url;\n  } else {\n    video.srcObject = url;\n  }\n  video.crossOrigin = 'anonymous';\n  video.muted = true;\n  video.autoplay = false;\n  if (isAndroid()) {\n    video.setAttribute('renderer', 'standard');\n  }\n  video.setAttribute('playsinline', 'playsinline');\n\n  return new Promise<HTMLVideoElement>((resolve, reject) => {\n    let settled = false;\n\n    const handleSuccess = () => {\n      if (settled) {return;}\n      settled = true;\n      cleanup();\n      resolve(video);\n    };\n\n    const handleError = () => {\n      if (settled) {return;}\n      settled = true;\n      cleanup();\n      reject('Load video fail.');\n    };\n\n    const cleanup = () => {\n      video.removeEventListener('loadeddata', handleSuccess);\n      video.removeEventListener('canplay', handleSuccess);\n      video.removeEventListener('error', handleError);\n    };\n\n    video.addEventListener('loadeddata', handleSuccess);\n    video.addEventListener('canplay', handleSuccess);\n    video.addEventListener('error', handleError);\n\n    video.play().catch(err => {\n      console.warn('Autoplay blocked:', err);\n    });\n  });\n}\n\n/**\n * 异步加载一个媒体文件\n * @param url\n * @param loadFn\n * @returns\n */\nexport async function loadMedia (url: string | string[], loadFn: (url: string) => Promise<HTMLImageElement | HTMLVideoElement>) {\n  if (Array.isArray(url)) {\n    try {\n      return await loadFn(url[0]);\n    } catch (_) {\n      return await loadFn(url[1]);\n    }\n  }\n\n  return loadFn(url);\n}\n","import type * as spec from '@galacean/effects-specification';\nimport type { Texture2DSourceOptions, TextureCubeSourceOptions } from './types';\nimport { TextureSourceType } from './types';\nimport { loadImage } from '../downloader';\n\ntype TextureJSONOptions = spec.SerializedTextureSource & spec.TextureConfigOptionsBase & spec.TextureFormatOptions;\n\nexport async function deserializeMipmapTexture (\n  textureOptions: TextureJSONOptions,\n  bins: ArrayBuffer[],\n  assets: Record<string, any>,\n  files: spec.BinaryFile[] = [],\n): Promise<Texture2DSourceOptions | TextureCubeSourceOptions> {\n  if (textureOptions.target === 34067) {\n    const { mipmaps, target } = textureOptions as spec.SerializedTextureCube;\n    const jobs = mipmaps.map(mipmap => Promise.all(mipmap.map(pointer => {\n      // @ts-expect-error\n      if (pointer.id) {\n        // @ts-expect-error\n        const loadedImage = assets[pointer.id];\n\n        return loadedImage;\n      } else {\n        return loadMipmapImage(pointer, bins);\n      }\n    })));\n\n    const loadedMipmaps = await Promise.all(jobs);\n\n    return {\n      keepImageSource: false,\n      ...textureOptions,\n      ...{\n        mipmaps: loadedMipmaps,\n        sourceFrom: {\n          target,\n          // bin,\n          type: TextureSourceType.mipmaps,\n          // mipmaps: mipmaps.map(mipmap => mipmap.map(pointer => [pointer[1][1], pointer[1][2]])),\n        },\n      } as TextureCubeSourceOptions,\n    };\n  } else {\n    // TODO: 补充测试用例\n    const { mipmaps, target } = textureOptions as spec.SerializedTexture2DMipmapSource;\n    const jobs = mipmaps.map(pointer => loadMipmapImage(pointer, bins));\n    const loadedMipmaps = await Promise.all(jobs);\n    const bin = files[mipmaps[0][1][0]].url;\n\n    return {\n      keepImageSource: false,\n      ...textureOptions,\n      ...{\n        mipmaps: loadedMipmaps,\n        sourceType: TextureSourceType.mipmaps,\n        sourceFrom: {\n          target,\n          bin,\n          type: TextureSourceType.mipmaps,\n          mipmaps: mipmaps.map(pointer => [pointer[1][1], pointer[1][2]]),\n        },\n      } as Texture2DSourceOptions,\n    };\n  }\n}\n\nasync function 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 loadImage(new Blob([new Uint8Array(bin, start, length)]));\n}\n","import * as spec from '@galacean/effects-specification';\nimport { TextureSourceType } from './types';\nimport type { TextureFactorySourceFrom, TextureSourceOptions, TextureDataType, TextureOptionsBase } from './types';\nimport { glContext } from '../gl';\nimport type { Engine } from '../engine';\nimport { EffectsObject } from '../effects-object';\nimport { loadImage, loadVideo } from '../downloader';\nimport { generateGUID } from '../utils';\n\nlet seed = 1;\n\n/**\n * Texture 抽象类\n */\nexport abstract class Texture extends EffectsObject {\n  /**\n   * Texture 名称\n   */\n  name: string;\n  sourceFrom?: TextureFactorySourceFrom;\n  sourceType?: TextureSourceType;\n  source: TextureSourceOptions;\n\n  /**\n   * Texture 高度\n   */\n  width: number;\n  /**\n   * Texture 宽度\n   */\n  height: number;\n  /**\n   * Texture 的全局唯一 id\n   */\n  readonly id: string;\n\n  protected destroyed = false;\n  protected offloaded: boolean;\n\n  /**\n   * 创建一个新的 Texture 对象。\n   */\n  static create: (engine: Engine, options?: TextureSourceOptions) => Texture;\n\n  /**\n   * 通过 URL 创建 Texture 对象。\n   * @param url - 要创建的 Texture URL\n   * @since 2.0.0\n   */\n  static async fromImage (\n    url: string,\n    engine: Engine,\n    options?: TextureOptionsBase,\n  ): Promise<Texture> {\n    const image = await loadImage(url);\n\n    const texture = Texture.create(engine, {\n      sourceType: TextureSourceType.image,\n      image,\n      target: glContext.TEXTURE_2D,\n      id: generateGUID(),\n      flipY: true,\n      ...options,\n    });\n\n    texture.initialize();\n\n    return texture;\n  }\n\n  /**\n   * 通过视频 URL 创建 Texture 对象。\n   * @param url - 要创建的 Texture URL\n   * @param engine - 引擎对象\n   * @param options - 可选的 Texture 选项\n   * @since 2.1.0\n   * @returns\n   */\n  static async fromVideo (\n    url: string,\n    engine: Engine,\n    options?: TextureOptionsBase,\n  ): Promise<Texture> {\n    const video = await loadVideo(url);\n    const texture = Texture.create(engine, {\n      sourceType: TextureSourceType.video,\n      video,\n      id: generateGUID(),\n      flipY: true,\n      ...options,\n    });\n\n    texture.initialize();\n\n    return texture;\n  }\n\n  /**\n   * 通过数据创建 Texture 对象。\n   * @param data - 要创建的 Texture 数据\n   * @param options - 可选的 Texture 选项\n   */\n  static createWithData: (\n    engine: Engine,\n    data?: TextureDataType,\n    options?: Record<string, any>,\n  ) => Texture;\n\n  constructor (engine: Engine) {\n    super(engine);\n    this.id = 'Tex' + seed++;\n  }\n\n  get isDestroyed (): boolean {\n    return this.destroyed;\n  }\n\n  /**\n   * 获取 Texture 的宽度。\n   */\n  getWidth () {\n    return this.width || 0;\n  }\n\n  /**\n   * 获取 Texture 的高度。\n   */\n  getHeight () {\n    return this.height || 0;\n  }\n\n  uploadCurrentVideoFrame () {\n    // OVERRIDE\n  }\n\n  /**\n   * 释放 Texture GPU 资源。\n   * 注意：该方法只释放资源，并不销毁 GPU textureBuffer 对象。\n   * @override\n   */\n  offloadData () {\n    // OVERRIDE\n  }\n\n  /**\n   * 重新加载 Texture  GPU 资源。\n   * @override\n   */\n  reloadData () {\n    // OVERRIDE\n  }\n\n  /**\n   * 更新 Texture 源数据。\n   * @param options - 创建 Texture 选项\n   */\n  abstract updateSource (options: TextureSourceOptions): void;\n\n  /**\n   * 初始化 GPU 资源\n   * @override\n   */\n  initialize (): void {\n    // OVERRIDE\n  }\n\n  protected assembleOptions (options: TextureSourceOptions): TextureSourceOptions {\n    const { target = glContext.TEXTURE_2D, format: internalFormat = glContext.RGBA } = options;\n\n    if (!options.sourceType) {\n      if ('image' in options) {\n        options.sourceType = TextureSourceType.image;\n      } else if ('data' in options) {\n        options.sourceType = TextureSourceType.data;\n      } else if ('video' in options) {\n        options.sourceType = TextureSourceType.video;\n      } else {\n        options.sourceType = 0; // TextureSourceType.none\n      }\n    }\n\n    return {\n      minFilter: glContext.NEAREST,\n      magFilter: glContext.NEAREST,\n      wrapS: glContext.CLAMP_TO_EDGE,\n      wrapT: glContext.CLAMP_TO_EDGE,\n      target: target as WebGLRenderingContext['TEXTURE_2D'],\n      format: glContext.RGBA,\n      internalFormat,\n      type: glContext.UNSIGNED_BYTE,\n      ...options,\n    };\n  }\n}\n\nexport function generateHalfFloatTexture (engine: Engine, data: Uint16Array, width: number, height: number): Texture {\n  const channel = data.length / width / height;\n  let format;\n  let internalFormat;\n\n  if (channel === 4 || channel === 0) {\n    internalFormat = format = glContext.RGBA;\n  } else if (channel === 3) {\n    internalFormat = format = glContext.RGB;\n  } else if (channel === 2) {\n    internalFormat = format = glContext.LUMINANCE_ALPHA;\n  } else {\n    internalFormat = format = glContext.LUMINANCE;\n  }\n\n  return Texture.createWithData(\n    engine,\n    {\n      data, width, height,\n    },\n    {\n      type: glContext.HALF_FLOAT,\n      format,\n      internalFormat,\n      wrapS: glContext.CLAMP_TO_EDGE,\n      wrapT: glContext.CLAMP_TO_EDGE,\n    });\n}\n\nconst sourceOptions = {\n  type: glContext.UNSIGNED_BYTE,\n  format: glContext.RGBA,\n  internalFormat: glContext.RGBA,\n  wrapS: glContext.MIRRORED_REPEAT,\n  wrapT: glContext.MIRRORED_REPEAT,\n  minFilter: glContext.NEAREST,\n  magFilter: glContext.NEAREST,\n};\n\nexport function generateWhiteTexture (engine: Engine) {\n  return Texture.create(\n    engine,\n    {\n      id: spec.BuiltinObjectGUID.WhiteTexture,\n      data: {\n        width: 1,\n        height: 1,\n        data: new Uint8Array([255, 255, 255, 255]),\n      },\n      sourceType: TextureSourceType.data,\n      ...sourceOptions,\n    },\n  );\n}\n\nexport function generateTransparentTexture (engine: Engine) {\n  return Texture.create(\n    engine,\n    {\n      id: spec.BuiltinObjectGUID.TransparentTexture,\n      data: {\n        width: 1,\n        height: 1,\n        data: new Uint8Array([0, 0, 0, 0]),\n      },\n      sourceType: TextureSourceType.data,\n      ...sourceOptions,\n    },\n  );\n}","import type { Texture2DSourceOptions } from './types';\r\nimport type { GPUCapability } from '../render/gpu-capability';\r\n\r\nexport interface TextureLoader {\r\n  /**\r\n   * 从 ArrayBuffer 加载纹理\r\n   */\r\n  loadFromBuffer(\r\n    arrBuffer: ArrayBuffer,\r\n    gpuCapability?: GPUCapability\r\n  ): Promise<Texture2DSourceOptions>,\r\n\r\n  /**\r\n   * 从 URL 加载纹理\r\n   */\r\n  loadFromURL(\r\n    url: string,\r\n    gpuCapability?: GPUCapability\r\n  ): Promise<Texture2DSourceOptions>,\r\n\r\n  /**\r\n   * 释放资源\r\n   */\r\n  dispose(): void,\r\n\r\n}\r\n\r\n/**\r\n * 纹理加载器工厂类型\r\n */\r\nexport type TextureLoaderFactory = () => TextureLoader;\r\n\r\n/**\r\n * 纹理加载器注册表\r\n */\r\nclass TextureLoaderRegistry {\r\n  private loaders: Map<string, TextureLoaderFactory> = new Map();\r\n  private instances: Map<string, TextureLoader> = new Map();\r\n\r\n  /**\r\n   * 注册纹理加载器\r\n   * @param type - 加载器类型（如 'ktx2', 'hdr'）\r\n   * @param factory - 加载器工厂函数\r\n   */\r\n  register (type: string, factory: TextureLoaderFactory): void {\r\n    if (this.loaders.has(type)) {\r\n      console.warn(`TextureLoader for type \"${type}\" is already registered, skipping.`);\r\n\r\n      return; // 阻止重复注册\r\n    }\r\n    this.loaders.set(type, factory);\r\n  }\r\n\r\n  /**\r\n   * 注销纹理加载器\r\n   * @param type - 加载器类型\r\n   */\r\n  unregister (type: string): void {\r\n    const instance = this.instances.get(type);\r\n\r\n    if (instance) {\r\n      instance.dispose();\r\n      this.instances.delete(type);\r\n    }\r\n    this.loaders.delete(type);\r\n  }\r\n\r\n  /**\r\n   * 获取纹理加载器实例（单例）\r\n   * @param type - 加载器类型\r\n   */\r\n  getLoader (type: string): TextureLoader | null {\r\n    // 如果已有实例，直接返回\r\n    if (this.instances.has(type)) {\r\n      return this.instances.get(type)!;\r\n    }\r\n\r\n    // 创建新实例\r\n    const factory = this.loaders.get(type);\r\n\r\n    if (!factory) {\r\n      console.error(`TextureLoader for type \"${type}\" is not registered.`);\r\n\r\n      return null;\r\n    }\r\n\r\n    const instance = factory();\r\n\r\n    this.instances.set(type, instance);\r\n\r\n    return instance;\r\n  }\r\n\r\n  /**\r\n   * 检查是否已注册某类型加载器\r\n   */\r\n  has (type: string): boolean {\r\n    return this.loaders.has(type);\r\n  }\r\n\r\n  /**\r\n   * 获取所有已注册的加载器类型\r\n   */\r\n  getRegisteredTypes (): string[] {\r\n    return Array.from(this.loaders.keys());\r\n  }\r\n\r\n  /**\r\n   * 清理所有加载器\r\n   */\r\n  dispose (): void {\r\n    this.instances.forEach(instance => instance.dispose());\r\n    this.instances.clear();\r\n    this.loaders.clear();\r\n  }\r\n}\r\n\r\n/**\r\n * 全局纹理加载器注册表实例\r\n */\r\nexport const textureLoaderRegistry = new TextureLoaderRegistry();\r\n","import type { vec2 } from '@galacean/effects-specification';\nimport type { TextureConfigOptions, TextureCubeSourceURLMap, TextureFactorySource2DFrom, TextureFactorySource2DMipmapsFrom, TextureFactorySourceCubeBinaryMipmapsFrom, TextureFactorySourceCubeFrom, TextureFactorySourceCubeMipmapsFrom, TextureFactorySourceFrom, TextureSourceOptions, TextureSourceCubeData, Texture2DSourceOptionsImageMipmaps } from './types';\nimport { TextureSourceType } from './types';\nimport { glContext } from '../gl';\nimport { isString } from '../utils';\nimport { loadBinary, loadImage, loadVideo } from '../downloader';\nimport type { Texture } from './texture';\nimport { textureLoaderRegistry } from './texture-loader';\n\nexport class TextureFactory {\n  reloadPending: Record<string, boolean>;\n\n  constructor () {\n    this.reloadPending = {};\n  }\n\n  async reload (texture: Texture): Promise<void> {\n    const id = texture.id;\n\n    if (this.reloadPending[id]) {\n      return;\n    }\n    if (texture.sourceFrom) {\n      this.reloadPending[id] = true;\n      const sourceOpts = await this.loadSource(texture.sourceFrom);\n\n      texture.updateSource(sourceOpts);\n      this.reloadPending[id] = false;\n    } else {\n      throw new Error('No source from.');\n    }\n  }\n\n  canOffloadTexture (sourceFrom?: TextureFactorySourceFrom): boolean {\n    if (sourceFrom) {\n      const type = sourceFrom.type;\n\n      if (\n        type === TextureSourceType.compressed ||\n        type === TextureSourceType.image\n      ) {\n        const { target, map } = sourceFrom as TextureFactorySourceCubeFrom;\n        const { url } = sourceFrom as TextureFactorySource2DFrom;\n\n        if (target === glContext.TEXTURE_CUBE_MAP) {\n          return typeof map === 'object' && !!map;\n        }\n\n        return isString(url) && url.length > 0;\n      }\n      if (type === TextureSourceType.mipmaps) {\n        const { bin, mipmaps } = sourceFrom as TextureFactorySourceCubeBinaryMipmapsFrom;\n        const { target, maps } = sourceFrom as TextureFactorySourceCubeMipmapsFrom;\n        const { urls } = sourceFrom as TextureFactorySource2DMipmapsFrom;\n\n        if (bin) {\n          return mipmaps.length > 0;\n        }\n        if (target === glContext.TEXTURE_CUBE_MAP) {\n          return maps.every(map => typeof map === 'object' && map);\n        }\n\n        return urls.every(url => isString(url) && url.length > 0);\n      }\n    }\n\n    return false;\n  }\n\n  async loadSource (sourceFrom: TextureFactorySourceFrom, config?: TextureConfigOptions): Promise<TextureSourceOptions> {\n    const { type, target } = sourceFrom;\n    const { map } = sourceFrom as TextureFactorySourceCubeFrom;\n    const { url } = sourceFrom as TextureFactorySource2DFrom;\n    const { bin, mipmaps } = sourceFrom as TextureFactorySourceCubeBinaryMipmapsFrom;\n    const { urls } = sourceFrom as TextureFactorySource2DMipmapsFrom;\n    const { maps } = sourceFrom as TextureFactorySourceCubeMipmapsFrom;\n\n    // cube without mipmap\n    if (target === glContext.TEXTURE_CUBE_MAP && type !== TextureSourceType.mipmaps) {\n      const cube = await this.loadCubeMap(map);\n\n      return {\n        ...config,\n        cube,\n        target: glContext.TEXTURE_CUBE_MAP,\n        sourceType: TextureSourceType.image,\n        sourceFrom: { type: TextureSourceType.image, map: { ...map }, target: glContext.TEXTURE_CUBE_MAP },\n      };\n    } else if (type === TextureSourceType.image) {\n      // image without mipmap\n      const image = await loadImage(url);\n\n      return {\n        ...config,\n        image,\n        sourceType: TextureSourceType.image,\n        sourceFrom: { type, url, target: glContext.TEXTURE_2D },\n      };\n    } else if (type === TextureSourceType.video) {\n      const video = await loadVideo(url);\n\n      return {\n        ...config,\n        video,\n        sourceType: TextureSourceType.video,\n      };\n    } else if (type === TextureSourceType.compressed) {\n      const buffer = await loadBinary(url);\n\n      const loader = textureLoaderRegistry.getLoader('ktx2');\n\n      if (loader) {\n        try {\n          const textureData = await loader.loadFromBuffer(buffer);\n\n          if (textureData.sourceType === TextureSourceType.compressed) {\n            return {\n              sourceType: textureData.sourceType,\n              type: textureData.type,\n              target: textureData.target,\n              internalFormat: textureData.internalFormat,\n              format: textureData.format,\n              mipmaps: textureData.mipmaps,\n              minFilter: glContext.LINEAR,\n              magFilter: glContext.LINEAR,\n              sourceFrom,\n              ...config,\n            };\n          }\n        } catch (e) {\n          throw new Error(`Failed to parse KTX2 from ${sourceFrom?.url ?? 'buffer'}: ${(e as Error).message || e}`);\n        }\n      } else {\n        throw new Error('KTX2 loader not found. Please register it first.');\n      }\n    } else if (type === TextureSourceType.mipmaps) {\n      if (bin) {\n        const data = await loadBinary(bin);\n        const newTarget = target ?? glContext.TEXTURE_2D;\n        const newMipmaps = newTarget === glContext.TEXTURE_2D ? mipmaps.slice() : mipmaps.map(s => s.slice());\n        let loadedMipmaps;\n\n        if (target === glContext.TEXTURE_CUBE_MAP) {\n          loadedMipmaps = await Promise.all(mipmaps.map(mipmap => this.loadMipmapImages(mipmap, data)));\n        } else {\n          loadedMipmaps = this.loadMipmapImages(mipmaps as unknown as vec2[], data);\n        }\n\n        return {\n          ...config,\n          mipmaps: loadedMipmaps,\n          target: newTarget,\n          sourceType: TextureSourceType.mipmaps,\n          sourceFrom: { bin, mipmaps: newMipmaps, target: newTarget, type: TextureSourceType.mipmaps },\n        } as unknown as Texture2DSourceOptionsImageMipmaps;\n      }\n\n      if (target === glContext.TEXTURE_2D || !target) {\n        const loadedMipmaps = await Promise.all(urls.map(url => loadImage(url)));\n\n        return {\n          ...config,\n          mipmaps: loadedMipmaps,\n          target: glContext.TEXTURE_2D,\n          sourceType: TextureSourceType.mipmaps,\n          sourceFrom: { type, urls: urls.slice(), target: glContext.TEXTURE_2D },\n        };\n      } else if (target === glContext.TEXTURE_CUBE_MAP) {\n        const loadedMipmaps = await Promise.all(maps.map(map => this.loadCubeMap(map)));\n\n        return {\n          ...config,\n          mipmaps: loadedMipmaps,\n          target: glContext.TEXTURE_CUBE_MAP,\n          sourceType: TextureSourceType.mipmaps,\n          sourceFrom: { type, maps: maps.map(map => ({ ...map })), target: glContext.TEXTURE_CUBE_MAP },\n        };\n      }\n    }\n\n    throw new Error(`Invalid resource type: ${type}.`);\n  }\n\n  private async loadMipmapImages (pointers: vec2[], bin: ArrayBuffer) {\n    return Promise.all(pointers.map(pointer => {\n      const blob = new Blob([new Uint8Array(bin, pointer[0], pointer[1])]);\n\n      return loadImage(blob);\n    }));\n  }\n\n  private async loadCubeMap (cubemap: TextureCubeSourceURLMap | string[]): Promise<TextureSourceCubeData> {\n    return Promise.all(cubemap.map(key => loadImage(key))) as Promise<TextureSourceCubeData>;\n  }\n}\n\nlet g: TextureFactory;\n\nexport function getDefaultTextureFactory (): TextureFactory {\n  if (!g) {\n    g = new TextureFactory();\n  }\n\n  return g;\n}\n\nexport function setDefaultTextureFactory (factory: TextureFactory) {\n  g = factory;\n}\n","import type * as spec from '@galacean/effects-specification';\nimport type { vec4 } from '@galacean/effects-specification';\nimport type { RendererComponent } from '../components';\nimport type { Engine } from '../engine';\nimport { glContext } from '../gl';\nimport type { Mesh, MeshDestroyOptions, Renderer } from '../render';\nimport type { Framebuffer } from '../render';\nimport type { TextureConfigOptions, TextureLoadAction } from '../texture';\nimport { Texture, TextureSourceType } from '../texture';\nimport type { Disposable, Sortable } from '../utils';\nimport { addByOrder, DestroyOptions, removeItem } from '../utils';\nimport type { Renderbuffer } from './renderbuffer';\n\nexport const RenderPassPriorityPrepare = 0;\nexport const RenderPassPriorityNormal = 1000;\nexport const RenderPassPriorityPostprocess = 3000;\n\n/**\n * RenderPass Attachment 存储类型\n */\nexport enum RenderPassAttachmentStorageType {\n  none = 0,\n  color = 1,\n  //stencil 8 render buffer\n  stencil_8_opaque = 2,\n  //depth 16 render buffer\n  depth_16_opaque = 3,\n  //depth 16 & stencil 8 render buffer\n  depth_stencil_opaque = 4,\n  //depth 16 texture, need gpu.capability.readableDepthStencilTextures\n  depth_16_texture = 5,\n  //depth 24 texture, need gpu.capability.readableDepthStencilTextures\n  depth_24_stencil_8_texture = 6,\n}\n\n/**\n * Attachment 结束后清除行为\n */\nexport enum TextureStoreAction {\n  /**\n   * 不清除 Attachment\n   */\n  store = 0,\n  /**\n   * 清除 Attachment\n   */\n  clear = 2,\n}\n\n/**\n * RenderPass 开始前的清除行为\n */\nexport interface RenderPassClearAction {\n  clearColor?: vec4,\n  colorAction?: TextureLoadAction,\n  clearDepth?: number,\n  depthAction?: TextureLoadAction,\n  clearStencil?: number,\n  stencilAction?: TextureLoadAction,\n}\n\n/**\n * RenderPass 结束后的清除行为\n */\nexport interface RenderPassStoreAction {\n  colorAction?: TextureStoreAction,\n  depthAction?: TextureStoreAction,\n  stencilAction?: TextureStoreAction,\n}\n\nexport interface RenderPassColorAttachmentTextureOptions extends spec.TextureFormatOptions, TextureConfigOptions {\n  size?: [x: number, y: number],\n}\n\n/**\n * RenderPass ColorAttachment 选项\n */\nexport interface RenderPassColorAttachmentOptions {\n  size?: [x: number, y: number],\n  name?: string,\n  /**\n   * ColorAttachment 的纹理参数\n   */\n  texture?: Texture | RenderPassColorAttachmentTextureOptions,\n  /**\n   * ColorAttachment 的 Buffer 参数\n   */\n  buffer?: Renderbuffer,\n  /**\n   * WebGL2 下 Renderbuffer 超采数目。默认是0，即不启用超采。\n   * @default 0\n   */\n  multiSample?: number,\n  /**\n   * 是否持久的对象\n   */\n  persistent?: boolean,\n}\n\nexport class RenderTargetHandle implements Disposable {\n  texture: Texture;\n  readonly textureOptions?: RenderPassColorAttachmentTextureOptions;\n  readonly externalTexture: boolean;\n  protected destroyed = false;\n\n  constructor (engine: Engine, options?: RenderPassColorAttachmentOptions) {\n    if (!options) {\n      return;\n    }\n    const { texture, size } = options;\n\n    if (texture instanceof Texture) {\n      this.texture = texture;\n      this.externalTexture = true;\n    } else if (texture) {\n      const {\n        wrapT, wrapS, minFilter, magFilter, internalFormat,\n        format = glContext.RGBA,\n        type = glContext.UNSIGNED_BYTE,\n      } = texture;\n\n      this.externalTexture = false;\n      this.textureOptions = {\n        size,\n        format,\n        type,\n        internalFormat: internalFormat || format,\n        wrapT,\n        wrapS,\n        minFilter,\n        magFilter,\n        name: options.name,\n      };\n      this.texture = Texture.create(\n        engine,\n        {\n          ...this.textureOptions,\n          sourceType: TextureSourceType.framebuffer,\n          data: { width: size![0], height: size![1] },\n        }\n      );\n    } else {\n      //throw new Error('Color attachment must use texture.');\n    }\n  }\n\n  dispose (): void {\n    if (this.destroyed) {\n      return;\n    }\n    this.texture.dispose();\n    this.destroyed = true;\n  }\n\n  get isDestroyed () {\n    return this.destroyed;\n  }\n\n  get storageType () {\n    return RenderPassAttachmentStorageType.color;\n  }\n\n  get size (): [x: number, y: number] {\n    const tex = this.texture;\n\n    return tex ? [tex.getWidth(), tex.getHeight()] : [0, 0];\n  }\n\n  get width (): number {\n    return this.texture.getWidth() || 0;\n  }\n\n  get height (): number {\n    return this.texture.getHeight() || 0;\n  }\n}\n\nexport interface RenderPassDepthStencilAttachmentOptions {\n  storageType: RenderPassAttachmentStorageType,\n  storage?: Renderbuffer,\n  texture?: Texture,\n}\n\n/**\n * RenderPass Attachment 销毁类型\n */\nexport enum RenderPassDestroyAttachmentType {\n  /**\n   * 强制销毁\n   */\n  force = 0,\n  /**\n   * 保留，不销毁\n   */\n  keep = 1,\n  /**\n   * 如果是外部传入的 Attachment，就不销毁\n   */\n  keepExternal = 2,\n  /**\n   * 强制销毁\n   */\n  destroy = force\n}\n\nexport type RenderPassDestroyOptions = {\n  meshes?: MeshDestroyOptions | DestroyOptions.keep,\n  colorAttachment?: RenderPassDestroyAttachmentType,\n  depthStencilAttachment?: RenderPassDestroyAttachmentType,\n};\n\nlet seed = 1;\n\n/**\n * RenderPass 抽象类\n */\nexport class RenderPass implements Disposable, Sortable {\n  /**\n   * 优先级\n   */\n  priority: number = 0;\n  /**\n   * 名称\n   */\n  name: string = 'RenderPass' + seed++;\n  /**\n   * 包含的 Mesh 列表\n   */\n  readonly meshes: RendererComponent[] = [];\n\n  protected disposed = false;\n  protected framebuffer: Framebuffer | null = null;\n  protected renderer: Renderer;\n\n  constructor (renderer: Renderer) {\n    this.renderer = renderer;\n  }\n\n  get isDisposed (): boolean {\n    return this.disposed;\n  }\n\n  get viewport () {\n    return this.getViewport();\n  }\n\n  addMesh (mesh: RendererComponent): void {\n    addByOrder(this.meshes, mesh);\n  }\n\n  removeMesh (mesh: RendererComponent): void {\n    removeItem(this.meshes, mesh);\n  }\n\n  /**\n   * 配置当前pass的RT，在每帧渲染前调用\n   */\n  configure (renderer: Renderer) {\n    // OVERRIDE\n  }\n\n  /**\n   * 执行当前pass，每帧调用一次\n   */\n  execute (renderer: Renderer) {\n    // OVERRIDE\n  }\n\n  /**\n   * 每帧所有的pass渲染完后调用，用于清空临时的RT资源\n   */\n  onCameraCleanup (renderer: Renderer) {\n    // OVERRIDE\n  }\n\n  /**\n   * 获取当前视口大小，格式：[x偏移，y偏移，宽度，高度]\n   */\n  getViewport (): vec4 {\n    const ret = this.framebuffer?.viewport;\n\n    if (ret) {\n      return ret;\n    }\n    const renderer = this.renderer;\n\n    return renderer ? [0, 0, renderer.getWidth(), renderer.getHeight()] : [0, 0, 0, 0];\n  }\n\n  /**\n   * 销毁 RenderPass\n   * @param options - 有选择销毁内部对象\n   */\n  dispose (options?: RenderPassDestroyOptions) {\n    if (this.disposed) {\n      return;\n    }\n    const destroyMeshOption = options?.meshes || undefined;\n\n    if (destroyMeshOption !== DestroyOptions.keep) {\n      this.meshes.forEach(mesh => {\n        (mesh as Mesh).dispose(destroyMeshOption);\n      });\n    }\n    this.meshes.length = 0;\n\n    this.disposed = true;\n  }\n}\n","import { TextureLoadAction } from '../texture/types';\nimport { FilterMode, RenderTextureFormat } from './framebuffer';\nimport { RenderPass, RenderPassPriorityNormal } from './render-pass';\nimport type { Renderer } from './renderer';\n\nexport class DrawObjectPass extends RenderPass {\n  private useRenderTarget = false;\n\n  constructor (renderer: Renderer) {\n    super(renderer);\n\n    this.priority = RenderPassPriorityNormal;\n    this.name = 'DrawObjectPass';\n  }\n\n  setup (useRenderTarget: boolean) {\n    this.useRenderTarget = useRenderTarget;\n  }\n\n  override configure (renderer: Renderer): void {\n    if (this.useRenderTarget) {\n      this.framebuffer = renderer.getTemporaryRT('DrawObjectPass', renderer.getWidth(), renderer.getHeight(), 16, FilterMode.Linear, RenderTextureFormat.RGBAHalf);\n      renderer.setFramebuffer(this.framebuffer);\n    }\n  }\n\n  override execute (renderer: Renderer) {\n    if (this.useRenderTarget) {\n      renderer.clear({\n        colorAction: TextureLoadAction.clear,\n        depthAction: TextureLoadAction.clear,\n        stencilAction: TextureLoadAction.clear,\n      });\n    }\n\n    this.meshes.sort((a, b) => a.priority - b.priority);\n\n    renderer.renderMeshes(this.meshes);\n  }\n\n  override onCameraCleanup (renderer: Renderer): void {\n    if (this.useRenderTarget && this.framebuffer) {\n      renderer.releaseTemporaryRT(this.framebuffer);\n    }\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport { effectsClass } from '../decorators';\nimport { EffectsObject } from '../effects-object';\nimport type { Engine } from '../engine';\n\nexport type ShaderMacros = [key: string, value: string | number | boolean][];\n\nexport enum ShaderCompileResultStatus {\n  noShader = 0,\n  success = 1,\n  fail = 2,\n  compiling = 3,\n}\n\nexport interface ShaderCompileResult {\n  status: ShaderCompileResultStatus,\n  cacheId?: string,\n  error?: string | null,\n  shared?: boolean,\n  compileTime?: number,\n}\n\nexport enum GLSLVersion {\n  'GLSL1' = '100',\n  'GLSL3' = '300 es',\n}\n\nexport interface SharedShaderWithSource {\n  /**\n   * fragment shader字符串\n   */\n  fragment: string,\n  /**\n   * vertex shader字符串\n   */\n  vertex: string,\n  /**\n   * shader 字符串的版本，用于添加版本头\n   */\n  glslVersion?: GLSLVersion,\n  /**\n   * shader的name\n   */\n  name?: string,\n  /**\n   * shader的宏定义\n   */\n  macros?: ShaderMacros,\n  /**\n   * 是否共用GLProgram\n   * shared为true时，\n   * 如果提供了cacheId，cacheId相同的shader会共用一个GLProgram\n   * 如果没有提供cacheId，会根据字符串hash计算出cacheId，字符串相同的shader将会使用同一个GLProgram\n   */\n  shared?: boolean,\n  /**\n   * 相同cacheId的shader会使用同一个GLProgram\n   */\n  cacheId?: string,\n}\n\nexport type ShaderWithSource = SharedShaderWithSource;\n\nexport abstract class ShaderVariant extends EffectsObject {\n  shader: Shader;\n  constructor (\n    engine: Engine,\n    public readonly source: ShaderWithSource,\n  ) {\n    super(engine);\n  }\n}\n\n@effectsClass(spec.DataType.Shader)\nexport class Shader extends EffectsObject {\n  shaderData: spec.ShaderData;\n\n  createVariant (macros?: Record<string, number | boolean>) {\n    const shaderMacros: ShaderMacros = [];\n\n    if (macros) {\n      for (const key of Object.keys(macros)) {\n        shaderMacros.push([key, macros[key]]);\n      }\n    }\n    const shaderVariant = this.engine.getShaderLibrary().createShader(this.shaderData, shaderMacros);\n\n    shaderVariant.shader = this;\n\n    return shaderVariant;\n  }\n\n  override fromData (data: spec.ShaderData): void {\n    super.fromData(data);\n    this.shaderData = data;\n  }\n}\n\n// TODO: 临时用，待移除\nexport interface ShaderLibrary {\n  readonly shaderResults: { [cacheId: string]: ShaderCompileResult },\n\n  addShader (shader: ShaderWithSource): void,\n\n  createShader (shaderSource: ShaderWithSource, macros?: ShaderMacros): ShaderVariant,\n\n  /**\n   * @param cacheId\n   */\n  deleteShader (cacheId: string): void,\n\n  /***\n   * 编译现有的所有shader\n   * @param asyncCallback 如果传入，则会启用异步编译，当所有编译完成后被回调\n   */\n  compileAllShaders (asyncCallback?: (results: ShaderCompileResult[]) => void): void,\n}\n","import * as spec from '@galacean/effects-specification';\nimport { glContext } from '../gl';\nimport { MaskMode } from './types';\nimport type { Material } from './material';\n\nexport function valIfUndefined<T> (val: any, def: T): T {\n  if (val === undefined || val === null) {\n    return def;\n  }\n\n  return val;\n}\n\nexport function getPreMultiAlpha (blending?: spec.BlendingMode): number {\n  switch (blending) {\n    case spec.BlendingMode.ALPHA:\n      return 1;\n    case spec.BlendingMode.ADD:\n      return 1;\n    case spec.BlendingMode.SUBTRACTION:\n      return 1;\n    case spec.BlendingMode.STRONG_LIGHT:\n      return 1;\n    case spec.BlendingMode.WEAK_LIGHT:\n      return 1;\n    case spec.BlendingMode.SUPERPOSITION:\n      return 2;\n    case spec.BlendingMode.BRIGHTNESS:\n      return 3;\n    case spec.BlendingMode.MULTIPLY:\n      return 0;\n    default:\n      // 处理undefined\n      return 1;\n  }\n}\n\nexport function setBlendMode (material: Material, blendMode?: number) {\n  switch (blendMode) {\n    case undefined:\n      material.blendFunction = [glContext.ONE, glContext.ONE_MINUS_SRC_ALPHA, glContext.ONE, glContext.ONE_MINUS_SRC_ALPHA];\n\n      break;\n    case spec.BlendingMode.ALPHA:\n      material.blendFunction = [glContext.ONE, glContext.ONE_MINUS_SRC_ALPHA, glContext.ONE, glContext.ONE_MINUS_SRC_ALPHA];\n\n      break;\n    case spec.BlendingMode.ADD:\n      material.blendFunction = [glContext.ONE, glContext.ONE, glContext.ONE, glContext.ONE];\n\n      break;\n    case spec.BlendingMode.SUBTRACTION:\n      material.blendFunction = [glContext.ONE, glContext.ONE, glContext.ZERO, glContext.ONE];\n      material.blendEquation = [glContext.FUNC_REVERSE_SUBTRACT, glContext.FUNC_REVERSE_SUBTRACT];\n\n      break;\n    case spec.BlendingMode.SUPERPOSITION:\n      material.blendFunction = [glContext.ONE, glContext.ONE, glContext.ONE, glContext.ONE];\n\n      break;\n    case spec.BlendingMode.MULTIPLY:\n      material.blendFunction = [glContext.DST_COLOR, glContext.ONE_MINUS_SRC_ALPHA, glContext.DST_COLOR, glContext.ONE_MINUS_SRC_ALPHA];\n\n      break;\n    case spec.BlendingMode.BRIGHTNESS:\n      material.blendFunction = [glContext.ONE, glContext.ONE_MINUS_SRC_ALPHA, glContext.ONE, glContext.ONE_MINUS_SRC_ALPHA];\n\n      break;\n    case spec.BlendingMode.STRONG_LIGHT:\n      material.blendFunction = [glContext.DST_COLOR, glContext.DST_ALPHA, glContext.ZERO, glContext.ONE];\n\n      break;\n    case spec.BlendingMode.WEAK_LIGHT:\n      material.blendFunction = [glContext.DST_COLOR, glContext.ZERO, glContext.ZERO, glContext.ONE];\n\n      break;\n    default:\n      console.warn(`BlendMode ${blendMode} not in specification, please set blend params separately.`);\n  }\n}\n\nexport function setSideMode (material: Material, side: spec.SideMode) {\n  if (side === spec.SideMode.DOUBLE) {\n    material.culling = false;\n  } else {\n    material.culling = true;\n    material.frontFace = glContext.CW;\n    material.cullFace = side === spec.SideMode.BACK ? glContext.BACK : glContext.FRONT;\n  }\n}\n\nexport function setMaskMode (material: Material, maskMode: MaskMode) {\n  switch (maskMode) {\n    case undefined:\n      material.stencilTest = false;\n\n      break;\n    case MaskMode.MASK:\n      material.stencilTest = true;\n      material.stencilFunc = [glContext.ALWAYS, glContext.ALWAYS];\n      material.stencilOpZPass = [glContext.REPLACE, glContext.REPLACE];\n\n      break;\n    case MaskMode.OBSCURED:\n      material.stencilTest = true;\n      material.stencilFunc = [glContext.EQUAL, glContext.EQUAL];\n\n      break;\n    case MaskMode.REVERSE_OBSCURED:\n      material.stencilTest = true;\n      material.stencilFunc = [glContext.NOTEQUAL, glContext.NOTEQUAL];\n\n      break;\n    case MaskMode.NONE:\n      material.stencilTest = false;\n\n      break;\n    default:\n      console.warn(`MaskMode ${maskMode} not in specification, please set stencil params seperately.`);\n  }\n}\n","import type * as spec from '@galacean/effects-specification';\nimport type { Matrix3, Matrix4, Vector2, Vector3, Vector4 } from '@galacean/effects-math/es/core/index';\nimport type { Texture } from '../texture';\nimport type { DestroyOptions } from '../utils';\nimport type { Renderer } from '../render';\n\nexport type UniformSemantic =\n  | 'VIEW'\n  | 'MODEL'\n  | 'MODELVIEW'\n  | 'PROJECTION'\n  | 'VIEWPROJECTION'\n  | 'VIEWINVERSE'\n  | 'EDITOR_TRANSFORM'\n  | 'MODELVIEWPROJECTION'\n  ;\n\nexport interface MaterialBlendingStates {\n  blending?: boolean,\n  blendFunction?: [blendSrc: GLenum, blendDst: GLenum, blendSrcAlpha: GLenum, blendDstAlpha: GLenum],\n  blendEquation?: [blendEquationRGB: GLenum, blendEquationAlpha: GLenum],\n  blendColor?: [r: number, g: number, b: number, a: number],\n}\n\nexport interface MaterialStencilStates {\n  stencilTest?: boolean,\n  stencilMask?: [front: GLenum, back: GLenum],\n  stencilRef?: [front: GLenum, back: GLenum],\n  stencilFunc?: [front: GLenum, back: GLenum],\n  stencilOpFail?: [front: GLenum, back: GLenum],\n  stencilOpZFail?: [front: GLenum, back: GLenum],\n  stencilOZPass?: [front: GLenum, back: GLenum],\n}\n\nexport interface MaterialSideStates {\n  culling?: boolean,\n  cullFace?: GLenum,\n  frontFace?: GLenum,\n}\n\nexport interface MaterialStates extends MaterialBlendingStates, MaterialStencilStates, MaterialSideStates {\n  sampleAlphaToCoverage?: boolean,\n  colorMask?: [r: boolean, g: boolean, b: boolean, a: boolean],\n  depthTest?: boolean,\n  depthMask?: boolean,\n  depthFunc?: number,\n  depthRange?: [zNear: number, zFar: number],\n  polygonOffset?: [factor: number, units: number],\n  polygonOffsetFill?: boolean,\n}\n\nexport interface MaterialDataBlockDestroyOptions {\n  textures?: DestroyOptions,\n}\n\n//使用提前编译的shader进行绘制，传递提前编译的shaderCacheId\n/**\n * @example\n * const mtl0 = new Material({\n *  shader:{\n *   fragment:'...',\n *   vertex:'...',\n *   cacheId:'mtl_01'\n * }});\n *\n * const mtl2 = new Material({\n *   shader:{\n *     cacheId:'mtl_01'\n *   }\n * });\n * mtl2 use the same program with mtl0\n */\nexport type UniformValueDataType = spec.TypedArray | number | number[] | Texture | Texture[] | number[][] | Vector2 | Vector3 | Vector4 | Matrix3 | Matrix4;\nexport type UniformStruct = Record<string, UniformValueDataType>;\n\n// 支持结构体Uniform数据\nexport type UniformValue =\n  | UniformValueDataType\n  | UniformStruct\n  | UniformStruct[];\n\nexport enum ShaderType {\n  vertex = 0,\n  fragment = 1\n}\n\n/**\n *\n */\nexport interface Maskable {\n  drawStencilMask (renderer: Renderer): void,\n}\n\nexport enum MaskMode {\n  /**\n   * 无\n   */\n  NONE = 0,\n  /**\n   * 蒙版\n   */\n  MASK = 1,\n  /**\n   * 被遮挡\n   */\n  OBSCURED = 2,\n  /**\n   * 被反向遮挡\n   */\n  REVERSE_OBSCURED = 3,\n}\n","import type * as spec from '@galacean/effects-specification';\nimport type { MaterialDataBlockDestroyOptions, UniformValue } from './types';\nimport { Texture } from '../texture';\nimport type { Disposable } from '../utils';\n\nexport interface MaterialDataBlockProps {\n  uniformValues?: Record<string, UniformValue>,\n  name?: string,\n  keepUboData?: boolean,\n}\n\n/**\n * 引擎接入暂时不需要实现\n */\nexport abstract class MaterialDataBlock implements Disposable {\n  readonly name: string;\n  protected destroyed = false;\n\n  protected constructor (props: MaterialDataBlockProps) {\n    const { name = 'defaultDataBlock' } = props;\n\n    this.name = name;\n  }\n\n  setUniformValues (uniformValue: Record<string, UniformValue>): void {\n    Object.keys(uniformValue).forEach(key => {\n      this.setUniformValue(key, uniformValue[key]);\n    });\n  }\n\n  invalidAllFlags () {\n    // OVERRIDE\n  }\n\n  updateUniformSubData (name: string, start: number, count: number) {\n    // OVERRIDE\n  }\n\n  abstract hasUniformValue (name: string): boolean;\n\n  abstract getUniformValue (name: string): UniformValue | undefined;\n\n  abstract getUniformValues (): Record<string, UniformValue>;\n\n  abstract setUniformValue (name: string, value: UniformValue): void;\n\n  abstract removeUniformValue (name: string): void;\n\n  abstract dispose (options?: MaterialDataBlockDestroyOptions): void;\n\n  static create: (props: MaterialDataBlockProps) => MaterialDataBlock;\n}\n\nexport function isUniformStruct (value: UniformValue) {\n  return typeof value === 'object' && value && (value as (number[] | string | Texture[] | number[][] | spec.TypedArray)).length === undefined && value instanceof Texture;\n}\n\nexport function isUniformStructArray (value: UniformValue) {\n  return value && (value as Array<number>).length !== undefined && isUniformStruct((value as Array<number>)[0]);\n}\n","import type { Matrix3, Matrix4, Quaternion, Vector2, Vector3, Vector4, Color } from '@galacean/effects-math/es/core/index';\nimport type { GlobalUniforms, Renderer, Shader, ShaderVariant, ShaderWithSource } from '../render';\nimport type { Texture } from '../texture';\nimport type { DestroyOptions, Disposable } from '../utils';\nimport type { UniformValue } from './types';\nimport type { Engine } from '../engine';\nimport { EffectsObject } from '../effects-object';\n\n/**\n * 材质销毁设置\n */\nexport interface MaterialDestroyOptions {\n  /**\n   * 纹理的销毁设置\n   */\n  textures?: DestroyOptions,\n}\n\n/**\n * 材质渲染类型\n */\nexport enum MaterialRenderType {\n  normal = 0,\n  transformFeedback = 1,\n}\n\nexport type UndefinedAble<U> = U | undefined;\n\n/**\n * 材质属性\n */\nexport interface MaterialProps {\n  /**\n   * shader 文本和属性\n   */\n  shader: ShaderWithSource,\n  /**\n   * 材质的名称，未传入会自动设置为 `Material[seed]`\n   */\n  name?: string,\n  /**\n   * 渲染类型\n   */\n  renderType?: MaterialRenderType,\n  /**\n   * uniform 数据\n   */\n  uniformValues?: Record<string, UniformValue>,\n}\n\n/**\n * 用于设置材质默认名称的自增序号\n * @internal\n */\nlet seed = 1;\n\n/**\n * Material 抽象类\n */\nexport abstract class Material extends EffectsObject implements Disposable {\n  shaderVariant: ShaderVariant;\n\n  // TODO: 待移除\n  shaderSource: ShaderWithSource;\n  stringTags: Record<string, string> = {};\n  readonly enabledMacros: Record<string, number | boolean> = {};\n  readonly renderType: MaterialRenderType;\n  readonly name: string;\n  readonly props: MaterialProps;\n\n  protected destroyed = false;\n  protected initialized = false;\n  protected shaderDirty = true;\n\n  private _shader: Shader;\n\n  /**\n   *\n   * @param props - 材质属性\n   */\n  constructor (\n    engine: Engine,\n    props?: MaterialProps,\n  ) {\n    super(engine);\n\n    if (props) {\n      const {\n        name = 'Material' + seed++,\n        renderType = MaterialRenderType.normal,\n        shader,\n      } = props;\n\n      this.name = name;\n      this.renderType = renderType; // TODO 没有地方用到\n      this.shaderSource = shader;\n      this.props = props;\n    } else {\n      this.name = 'Material' + seed++;\n      this.renderType = MaterialRenderType.normal;\n    }\n  }\n\n  get shader () {\n    return this._shader;\n  }\n\n  set shader (value: Shader) {\n    if (this._shader === value) {\n      return;\n    }\n    this._shader = value;\n    this.shaderDirty = true;\n  }\n\n  /**\n   * 材质的主纹理\n   */\n  get mainTexture () {\n    return this.getTexture('_MainTex') as Texture;\n  }\n\n  set mainTexture (value: Texture) {\n    this.setTexture('_MainTex', value);\n  }\n\n  /**\n   * 材质的主颜色\n   */\n  get color () {\n    return this.getColor('_Color') as Color;\n  }\n\n  set color (value: Color) {\n    this.setColor('_Color', value);\n  }\n\n  /******** effects-core 中会调用 引擎必须实现 ***********************/\n  /**\n   * 设置 Material 的颜色融合开关\n   * @param blending - 是否开启混合效果\n   */\n  set blending (blending: UndefinedAble<boolean>) { }\n\n  /**\n   * 分别指定 Material 的颜色混合函数乘数\n   * @param func - 混合函数参数\n   */\n  set blendFunction (func: UndefinedAble<[blendSrc: number, blendDst: number, blendSrcAlpha: number, blendDstAlpha: number]>) { }\n\n  /**\n   * 分别指定 Material 的颜色混合方式\n   * @param equation - 混合方程参数\n   */\n  set blendEquation (equation: UndefinedAble<[rgb: number, alpha: number]>) { }\n\n  /**\n   * 设置 Material 的深度测试开关\n   * @param value - 是否开启深度测试\n   */\n  set depthTest (value: UndefinedAble<boolean>) { }\n\n  /**\n   * 设置 Material 的写入深度缓冲开关\n   * @param value - 是否开启深度写入\n   */\n  set depthMask (value: UndefinedAble<boolean>) { }\n\n  /**\n   * 设置 Material 的模板测试开关\n   * @param value - 是否开启模板测试\n   */\n  set stencilTest (value: UndefinedAble<boolean>) { }\n\n  /**\n   * 分别指定 Material 的模板测试参考值\n   * @param value  - 模板测试参考值参数\n   */\n  set stencilRef (value: UndefinedAble<[front: number, back: number]>) { }\n\n  /**\n   * 分别指定 Material 的模板测试函数\n   * @param value - 模板测试函数参数\n   */\n  set stencilFunc (value: UndefinedAble<[front: number, back: number]>) { }\n\n  /**\n   * 分别指定 Material 的模板测试和深度测试都通过时使用的函数\n   * @param value - 模板测试深度测试通过时的操作参数\n   */\n  set stencilOpZPass (value: UndefinedAble<[front: number, back: number]>) { }\n\n  /**\n   * 设置 Material 的正反面剔除开关\n   * @param value - 是否开启剔除\n   */\n  set culling (value: UndefinedAble<boolean>) { }\n\n  /**\n   * 设置 Material 的正反面计算方向\n   * @param value\n   */\n  set frontFace (value: UndefinedAble<number>) { }\n\n  /**\n   * 设置 Material 要剔除的面\n   * @param value - 剔除面参数\n   */\n  set cullFace (value: UndefinedAble<number>) { }\n  /***************************************************/\n\n  /******** effects-core 中暂无调用 引擎可以先不实现 ***********************/\n  /**\n   * 设置 Material 的源和目标混合因子\n   * @param color\n   */\n  set blendColor (color: UndefinedAble<[r: number, g: number, b: number, a: number]>) { }\n\n  /**\n   * 设置 Material 的深度映射范围\n   * @param value\n   */\n  set depthRange (value: UndefinedAble<[zNear: number, zFar: number]>) { }\n\n  /**\n   * 设置 Material 的深度比较函数\n   * @param value - 深度测试函数参数\n   */\n  set depthFunc (value: UndefinedAble<number>) { }\n\n  /**\n   * 设置 Material 的多边形偏移（实现类似深度偏移的效果）\n   * @param value - 多边形偏移参数\n   */\n  set polygonOffsetFill (value: UndefinedAble<boolean>) { }\n\n  /**\n   * 指定 Material 计算深度值的比例因子 factor 和单位 units\n   * @param value\n   */\n  set polygonOffset (value: UndefinedAble<[factor: number, units: number]>) { }\n\n  /**\n   * 设置 Material 的通过 alpha 值决定临时覆盖值计算的开关\n   * @param value - 是否开启 alpha 抖动\n   */\n  set sampleAlphaToCoverage (value: UndefinedAble<boolean>) { }\n\n  /**\n   * 设置 Material 颜色缓冲区的写入开关\n   * @param value\n   */\n  abstract set colorMask (value: boolean);\n\n  /**\n   * 获取 Material 颜色缓冲区的写入开关\n   * @param value\n   */\n  abstract get colorMask (): boolean;\n\n  /**\n   * 分别指定 Material 的模板测试掩码\n   * @param value - 模板测试写入掩码参数\n   */\n  set stencilMask (value: UndefinedAble<[front: number, back: number]>) { }\n\n  /**\n   * 分别指定 Material 模板测试失败时要使用的函数\n   * @param value - 模板测试失败时的操作参数\n   */\n  set stencilOpFail (value: UndefinedAble<[front: number, back: number]>) { }\n\n  /**\n   * 分别指定 Material 模板测试通过但深度测试失败时要使用的函数\n   * @param value - 模板测试深度测试失败时的操作参数\n   */\n  set stencilOpZFail (value: UndefinedAble<[front: number, back: number]>) { }\n  /***************************************************/\n\n  /**\n   * 获取 Material 的 float 类型的 uniform 数据\n   * @param name\n   */\n  abstract getFloat (name: string): number | null;\n  /**\n   * 设置 float 类型的 uniform 数据\n   * @param name - uniform 名称\n   * @param value - 要设置的 uniform 数据\n   */\n  abstract setFloat (name: string, value: number): void;\n\n  /**\n   * 获取 Material 的 float 类型的 uniform 数据\n   * @param name\n   */\n  abstract getInt (name: string): number | null;\n  /**\n   * 设置 int 类型的 uniform 的数据\n   * @param name - uniform 名称\n   * @param value - 要设置的 uniform 数据\n   */\n  abstract setInt (name: string, value: number): void;\n\n  /**\n   * 获取 Material 的 float 数组类型的 uniform 数据\n   * @param name\n   */\n  abstract getFloats (name: string): number[] | null;\n  /**\n   * 设置 float 数组类型的 uniform 的数据\n   * @param name - uniform 名称\n   * @param value - 要设置的 uniform 数据\n   */\n  abstract setFloats (name: string, value: number[]): void;\n\n  /**\n   * 获取 Material 的 vec2 类型的 uniform 数据\n   * @param name\n   */\n  abstract getVector2 (name: string): Vector2 | null;\n  /**\n   * 设置 vec2 类型的 uniform 的数据\n   * @param name - uniform 名称\n   * @param value - 要设置的 uniform 数据\n   */\n  abstract setVector2 (name: string, value: Vector2): void;\n\n  /**\n   * 获取 Material 的 vec3 类型的 uniform 数据\n   * @param name\n   */\n  abstract getVector3 (name: string): Vector3 | null;\n  /**\n   * 设置 vec3 类型的 uniform 的数据\n   * @param name - uniform 名称\n   * @param value - 要设置的 uniform 数据\n   */\n  abstract setVector3 (name: string, value: Vector3): void;\n\n  /**\n   * 获取 Material 的 vec4 类型的 uniform 数据\n   * @param name\n   */\n  abstract getVector4 (name: string): Vector4 | null;\n  /**\n   * 设置 vec4 类型的 uniform 的数据\n   * @param name - uniform 名称\n   * @param value - 要设置的 uniform 数据\n   */\n  abstract setVector4 (name: string, value: Vector4): void;\n\n  /**\n   * 获取 Material 的 Color 类型的 uniform 数据\n   * @param name\n   */\n  abstract getColor (name: string): Color | null;\n  /**\n   * 设置 Color 类型的 uniform 的数据\n   * @param name - uniform 名称\n   * @param value - 要设置的 uniform 数据\n   */\n  abstract setColor (name: string, value: Color): void;\n\n  /**\n   * 获取 Material 的 Quaternion 类型的 uniform 数据\n   * @param name\n   */\n  abstract getQuaternion (name: string): Quaternion | null;\n  /**\n   * 设置 Quaternion 类型的 uniform 的数据\n   * @param name - uniform 名称\n   * @param value - 要设置的 uniform 数据\n   */\n  abstract setQuaternion (name: string, value: Quaternion): void;\n\n  /**\n   * 获取 Material 的 vec4 数组类型的 uniform 数据\n   * @param name\n   */\n  abstract getVector4Array (name: string): number[];\n  /**\n   * 设置 vec4 数组类型的 uniform 的数据\n   * @param name - uniform 名称\n   * @param value - 要设置的 uniform 数据\n   */\n  abstract setVector4Array (name: string, value: Vector4[]): void;\n\n  /**\n   * 获取 Material 的 mat4 类型的 uniform 数据\n   * @param name\n   */\n  abstract getMatrix (name: string): Matrix4 | null;\n  /**\n   * 设置 mat4 类型的 uniform 的数据\n   * @param name - uniform 名称\n   * @param value - 要设置的 uniform 数据\n   */\n  abstract setMatrix (name: string, value: Matrix4): void;\n  /**\n   * 设置 mat3 类型的 uniform 的数据\n   * @param name - uniform 名称\n   * @param value - 要设置的 uniform 数据\n   */\n  abstract setMatrix3 (name: string, value: Matrix3): void;\n\n  /**\n   * 获取 Material 的 mat4 数组类型的 uniform 数据\n   * @param name\n   */\n  abstract getMatrixArray (name: string): number[] | null;\n  /**\n   * 设置 mat 数组类型的 uniform 的数据\n   * @param name - uniform 名称\n   * @param array - 要设置的 uniform 数据\n   */\n  abstract setMatrixArray (name: string, array: Matrix4[]): void;\n  /**\n   * 设置 mat 数组类型的 uniform 的数据，传入 number 数组\n   * @param name - uniform 名称\n   * @param array - 要设置的 uniform 数据，number 类型数组\n   */\n  abstract setMatrixNumberArray (name: string, array: number[]): void;\n\n  /**\n   * 获取 Material 的 sampler2D 类型的 uniform 数据\n   * @param name\n   */\n  abstract getTexture (name: string): Texture | null;\n  /**\n   * 设置 sampler2D 类型的 uniform 的数据\n   * @param name - uniform 名称\n   * @param texture - 要设置的 uniform 数据\n   */\n  abstract setTexture (name: string, texture: Texture): void;\n\n  /**\n   * 获取 Material 的 float 类型的 uniform 数据\n   * @param name\n   */\n  abstract hasUniform (name: string): boolean;\n\n  /******** 预留接口，暂时不用实现 ***********************/\n  abstract enableMacro (keyword: string, value?: boolean | number): void;\n  abstract disableMacro (keyword: string): void;\n  abstract isMacroEnabled (keyword: string): boolean;\n  /***************************************************/\n\n  /**\n   * Material 的克隆方法（不接入滤镜，本方法可以不做实现）\n   * @param props 新的材质属性\n   */\n  abstract clone (props?: MaterialProps): Material;\n\n  abstract cloneUniforms (sourceMaterial: Material): void;\n\n  /**\n   * 创建 Material\n   */\n  static create: (engine: Engine, props?: MaterialProps) => Material;\n\n  /**\n   * 初始化 GPU 资源\n   * @override\n   */\n  initialize (): void {\n    // OVERRIDE\n  }\n\n  createShaderVariant () {\n    // OVERRIDE\n  }\n\n  use (render: Renderer, globalUniforms: GlobalUniforms) {\n    // OVERRIDE\n  }\n}\n","import type * as spec from '@galacean/effects-specification';\nimport { glContext } from '../gl';\nimport type { Engine } from '../engine';\nimport { EffectsObject } from '../effects-object';\n\nexport const BYTES_TYPE_MAP: Record<string, number> = {\n  [glContext.FLOAT]: Float32Array.BYTES_PER_ELEMENT,\n  [glContext.INT]: Int32Array.BYTES_PER_ELEMENT,\n  [glContext.SHORT]: Int16Array.BYTES_PER_ELEMENT,\n  [glContext.BYTE]: Int8Array.BYTES_PER_ELEMENT,\n};\n\n/**\n * Geometry 的绘制模式\n */\nexport type GeometryDrawMode =\n  | WebGLRenderingContext['POINTS']\n  | WebGLRenderingContext['TRIANGLES']\n  | WebGLRenderingContext['TRIANGLE_STRIP']\n  | WebGLRenderingContext['TRIANGLE_FAN']\n  | WebGLRenderingContext['LINES']\n  | WebGLRenderingContext['LINE_STRIP']\n  | WebGLRenderingContext['LINE_LOOP']\n  ;\n\nexport type Attribute =\n  | spec.AttributeWithData\n  | spec.AttributeWithDataPointer\n  | spec.AttributeWithType\n  | spec.AttributeWithDataSource\n  ;\n\nexport interface GeometryProps {\n  name?: string,\n  attributes: Record<string, Attribute>,\n  indices?: { data: spec.TypedArray, releasable?: boolean },\n  mode?: GeometryDrawMode,\n  drawCount?: number,\n  drawStart?: number,\n  instanceCount?: number,\n  bufferUsage?: WebGLRenderingContext['STATIC_DRAW'] | WebGLRenderingContext['DYNAMIC_DRAW'],\n  /**\n   * 粒子最大数量，适用于无法更新 GPU 缓存长度的引擎接入\n   */\n  maxVertex?: number,\n}\n\nexport interface SkinProps {\n  boneNames?: string[],\n  rootBoneName?: string,\n  inverseBindMatrices?: number[],\n}\n\n/**\n * Geometry 抽象类\n */\nexport abstract class Geometry extends EffectsObject {\n  /**\n   * Geometry 的名称\n   */\n  name: string = '';\n\n  /**\n   * 子网格数据\n   */\n  subMeshes: spec.SubMesh[] = [];\n  /**\n   * Geometry 创建函数\n   */\n  static create: (engine: Engine, opts?: GeometryProps) => Geometry;\n\n  /**\n   * 获取 Geometry 的 attribute 数据。\n   * @param name - attribute 名称\n   */\n  abstract getAttributeData (name: string): spec.TypedArray | undefined;\n\n  /**\n   * 设置 Geometry 的 attribute 数据。\n   * @param name - attribute 名称\n   * @param data - 要设置的 attribute 数据\n   */\n  abstract setAttributeData (name: string, data: spec.TypedArray): void;\n\n  /**\n   * 设置 attribute 的部分数据，当 attribute 数据只有部分更新时，可调用此函数。\n   * @param name - attribute 名称\n   * @param offset - 更新数据在 attribute 数组的起始位置 index\n   * @param data - 要设置的 attribute 数据\n   */\n  abstract setAttributeSubData (name: string, offset: number, data: spec.TypedArray): void;\n\n  /**\n   * 获取 attribute 的步长\n   * @param name - attribute 名称\n   */\n  abstract getAttributeStride (name: string): number;\n\n  /**\n   * 获取当前 Geometry 所有的 attribute 名称。\n   */\n  abstract getAttributeNames (): string[];\n\n  /**\n   * 获取当前 Geometry 的 indices 数据。\n   */\n  abstract getIndexData (): spec.TypedArray | undefined;\n\n  /**\n   * 设置 Geometry 的 indices 数据。\n   * @param data - 要设置的 indices 数据\n   */\n  abstract setIndexData (data: spec.TypedArray): void;\n\n  /**\n   * 设置 indices 的部分数据，当 indices 数据只有部分更新时，可调用此函数。\n   * @param offset - 更新数据在 indices 数组的起始位置 index\n   * @param data - 要设置的 indices 数据\n   */\n  abstract setIndexSubData (offset: number, data: spec.TypedArray): void;\n\n  /**\n   * 设置 Geometry 绘制的 drawStart\n   * @param value 要设置的 drawStart 值\n   */\n  abstract setDrawStart (count: number): void;\n\n  /**\n   * 获取当前 Geometry 的 drawStart\n   */\n  abstract getDrawStart (): number;\n\n  /**\n   * 设置 Geometry 绘制的 drawCount。\n   * @param count 要设置的 drawCount 值\n   */\n  abstract setDrawCount (count: number): void;\n\n  /**\n   * 获取当前 Geometry 的 drawcount\n   */\n  abstract getDrawCount (): number;\n\n  /**\n   * 获取当前 Geometry 关联的蒙皮数据\n   */\n  abstract getSkinProps (): SkinProps;\n\n  /**\n   * 初始化 GPU 资源\n   * @override\n   */\n  initialize (): void {\n    // OVERRIDE\n  }\n\n  /**\n   * 几何数据刷新\n   */\n  flush (): void {\n    // OVERRIDE\n  }\n}\n\nexport function generateEmptyTypedArray (type: number) {\n  if (type === glContext.INT) {\n    return new Int32Array(0);\n  }\n  if (type === glContext.SHORT) {\n    return new Int16Array(0);\n  }\n\n  return new Float32Array(0);\n}\n","import type { Engine } from '../engine';\nimport type * as spec from '@galacean/effects-specification';\nimport type { Maskable } from './types';\nimport { MaskMode } from './types';\nimport type { Renderer } from '../render/renderer';\nimport { TextureLoadAction } from '../texture/types';\nimport type { RenderPassClearAction } from '../render/render-pass';\n\nexport class MaskProcessor {\n  alphaMaskEnabled = false;\n  maskMode: MaskMode = MaskMode.NONE;\n  maskable: Maskable | null = null;\n\n  private stencilClearAction: RenderPassClearAction;\n\n  constructor (public engine: Engine) {\n    this.stencilClearAction = { stencilAction:TextureLoadAction.clear };\n  }\n\n  getRefValue () {\n    return 1;\n  }\n\n  setMaskOptions (data: spec.MaskOptions) {\n    const { isMask = false, inverted = false, reference, alphaMaskEnabled = false } = data;\n\n    this.alphaMaskEnabled = alphaMaskEnabled;\n\n    if (isMask) {\n      this.maskMode = MaskMode.MASK;\n    } else {\n      this.maskMode = inverted ? MaskMode.REVERSE_OBSCURED : MaskMode.OBSCURED;\n      this.maskable = this.engine.findObject<Maskable>(reference);\n    }\n  }\n\n  drawStencilMask (renderer: Renderer) {\n    if (this.maskable) {\n      renderer.clear(this.stencilClearAction);\n      this.maskable.drawStencilMask(renderer);\n    }\n  }\n}\n","import { Matrix4 } from '@galacean/effects-math/es/core/index';\nimport type { Engine } from '../engine';\nimport type { Material, MaterialDestroyOptions } from '../material';\nimport type { Geometry, Renderer } from '../render';\nimport type { Disposable } from '../utils';\nimport { DestroyOptions } from '../utils';\nimport { RendererComponent } from '../components';\n\nexport interface MeshOptionsBase {\n  material: Material,\n  name?: string,\n  worldMatrix?: Matrix4,\n  priority?: number,\n}\n\nexport interface GeometryMeshProps extends MeshOptionsBase {\n  geometry: Geometry,\n}\n\nexport interface MeshDestroyOptions {\n  geometries?: DestroyOptions,\n  material?: MaterialDestroyOptions | DestroyOptions,\n}\n\nlet seed = 1;\n\n/**\n * Mesh 抽象类\n */\nexport class Mesh extends RendererComponent implements Disposable {\n  /**\n   * Mesh 的全局唯一 id\n   */\n  readonly id: string;\n  /**\n   * Mesh 的世界矩阵\n   */\n  worldMatrix: Matrix4;\n  /**\n   * Mesh 的 Geometry\n   */\n  geometry: Geometry;\n\n  protected destroyed = false;\n  private visible = true;\n\n  /**\n   * 创建一个新的 Mesh 对象。\n   */\n  static create: (engine: Engine, props?: GeometryMeshProps) => Mesh;\n\n  constructor (\n    engine: Engine,\n    props?: GeometryMeshProps,\n  ) {\n    super(engine);\n    if (props) {\n      const {\n        material,\n        geometry,\n        name = '<unnamed>',\n        priority = 0,\n        worldMatrix = Matrix4.fromIdentity(),\n      } = props;\n\n      this.id = 'Mesh' + seed++;\n      this.name = name;\n      this.geometry = geometry;\n      this.material = material;\n      this.priority = priority;\n      this.worldMatrix = worldMatrix;\n    } else {\n      this.id = 'Mesh' + seed++;\n      this.name = '<unnamed>';\n      this.worldMatrix = Matrix4.fromIdentity();\n      this._priority = 0;\n    }\n  }\n\n  get isDestroyed (): boolean {\n    return this.destroyed;\n  }\n\n  /**\n   * 设置当前 Mesh 的可见性。\n   * @param visible - true：可见，false：不可见\n   */\n  setVisible (visible: boolean) {\n    this.visible = visible;\n  }\n  /**\n   * 获取当前 Mesh 的可见性。\n   */\n  getVisible (): boolean {\n    return this.visible;\n  }\n\n  override render (renderer: Renderer) {\n    if (this.isDestroyed) {\n      // console.error(`mesh ${mesh.name} destroyed`, mesh);\n      return;\n    }\n    if (!this.getVisible()) {\n      return;\n    }\n    renderer.drawGeometry(this.geometry, this.worldMatrix, this.material);\n  }\n\n  /**\n   * 获取当前 Mesh 的第一个 geometry。\n   */\n  firstGeometry (): Geometry {\n    return this.geometry;\n  }\n\n  /**\n   * 设置当前 Mesh 的材质\n   * @param material - 要设置的材质\n   * @param destroy - 可选的材质销毁选项\n   */\n  setMaterial (material: Material, destroy?: MaterialDestroyOptions | DestroyOptions.keep) {\n    if (destroy !== DestroyOptions.keep) {\n      this.material.dispose();\n    }\n    this.material = material;\n  }\n\n  restore (): void {\n  }\n\n  /**\n   * 销毁当前资源\n   * @param options - 可选的销毁选项\n   */\n  override dispose (options?: MeshDestroyOptions) {\n    if (this.destroyed) {\n      //console.error('call mesh.destroy multiple times', this);\n      return;\n    }\n\n    if (options?.geometries !== DestroyOptions.keep) {\n      this.geometry.dispose();\n    }\n    const materialDestroyOption = options?.material;\n\n    if (materialDestroyOption !== DestroyOptions.keep) {\n      this.material.dispose();\n    }\n    this.destroyed = true;\n\n    if (this.engine !== undefined) {\n      this.engine.removeMesh(this);\n    }\n\n    super.dispose();\n  }\n}\n","import { logger } from '../utils';\nimport type { ShaderMacros } from '../render';\nimport { ShaderType } from '../material';\n\nexport interface ShaderCodeOptions {\n  level: number,\n  shaderType: ShaderType,\n  shader: string,\n  macros?: ShaderMacros,\n  removeVersion?: boolean,\n}\n\nconst shaderLib: Record<string, string> = {};\n\nexport class ShaderFactory {\n  static registerInclude (includeName: string, includeSource: string) {\n    if (shaderLib[includeName]) {\n      logger.warn(`The \"${includeName}\" shader include already exist.`);\n    }\n    shaderLib[includeName] = includeSource;\n  }\n\n  static unRegisterInclude (includeName: string) {\n    delete shaderLib[includeName];\n  }\n\n  static unRegisterAllIncludes () {\n    Object.keys(shaderLib).forEach(key => {\n      ShaderFactory.unRegisterInclude(key);\n    });\n  }\n\n  /**\n   * 生成 shader，检测到 WebGL1 上下文会降级\n   * @param macros - 宏定义数组\n   * @param shader - 原始 shader 文本\n   * @param shaderType - shader 类型\n   * @return 去除版本号的 shader 文本\n   */\n  static genFinalShaderCode (options: ShaderCodeOptions): string {\n    const { level, shaderType, shader, macros, removeVersion } = options;\n    const macroString = ShaderFactory.genMacroString(level, macros);\n    const versionString = ShaderFactory.genShaderVersion(level);\n    let source = ShaderFactory.parseIncludes(shader);\n    const isVersion300 = ShaderFactory.isVersion300(source);\n\n    source = ShaderFactory.removeWebGLVersion(source);\n\n    if (level === 2 && !isVersion300) {\n      source = ShaderFactory.convertTo300(source, shaderType === ShaderType.fragment);\n    }\n\n    if (removeVersion) {\n      return macroString + source;\n    }\n\n    return versionString + macroString + source;\n  }\n\n  /**\n   * Convert lower GLSL version to GLSL 300 es.\n   * @param source - code\n   * @param isFragment - Whether it is a fragment shader.\n   * */\n  private static convertTo300 (source: string, isFragment?: boolean) {\n    source = source.replace(/\\bvarying\\b/g, isFragment ? 'in' : 'out');\n    source = source.replace(/\\btexture(2D|Cube)\\b/g, 'texture');\n    // Remove extensions\n    const regex = /#extension.+(GL_OES_standard_derivatives|GL_EXT_shader_texture_lod|GL_EXT_frag_depth|GL_EXT_draw_buffers).+(enable|require)/g;\n\n    source = source.replace(regex, '');\n\n    if (isFragment) {\n      source = source.replace(/\\btexture(2D|Cube)LodEXT\\b/g, 'textureLod');\n      source = source.replace(/\\btexture(2D|Cube)GradEXT\\b/g, 'textureGrad');\n      source = source.replace(/\\bgl_FragDepthEXT\\b/g, 'gl_FragDepth');\n\n      if (!ShaderFactory.has300Output(source)) {\n        const isMRT = /\\bgl_FragData\\[.+?\\]/g.test(source);\n\n        if (isMRT) {\n          source = source.replace(/\\bgl_FragColor\\b/g, 'gl_FragData[0]');\n          const result = source.match(/\\bgl_FragData\\[.+?\\]/g);\n\n          if (result) {\n            source = ShaderFactory.replaceMRTShader(source, result);\n          }\n        } else {\n          source = source.replace(/void\\s+?main\\s*\\(/g, 'out vec4 glFragColor;\\nvoid main(');\n          source = source.replace(/\\bgl_FragColor\\b/g, 'glFragColor');\n        }\n      }\n    } else {\n      source = source.replace(/\\battribute\\b/g, 'in');\n    }\n\n    return source;\n  }\n\n  private static parseIncludes (source: string, regex = /#include <(.+)>/gm) {\n    let match: RegExpExecArray | null;\n\n    while ((match = regex.exec(source)) !== null) {\n      const shaderName = match[1];\n      const replace = shaderLib[shaderName];\n\n      if (replace === undefined) {\n        throw new Error(`Can't find include shader name ${shaderName}`);\n      }\n\n      source = source.replace(match[0], replace);\n    }\n\n    return source;\n  }\n\n  private static genMacroString (\n    level: number,\n    macros?: ShaderMacros,\n    addRuntimeMacro = true,\n  ) {\n    const macroList: string[] = [];\n    const webGLVersion = `WEBGL${level}`;\n\n    macroList.push(`#ifndef ${webGLVersion}`);\n    macroList.push(`#define ${webGLVersion}`);\n    macroList.push('#endif');\n\n    if (addRuntimeMacro) {\n      macroList.push('#define GE_RUNTIME');\n    }\n\n    if (macros && macros.length) {\n      macros.forEach(([key, value]) => {\n        if (value === true) {\n          macroList.push(`#define ${key}`);\n        } else if (Number.isFinite(value)) {\n          macroList.push(`#define ${key} ${value}`);\n        }\n      });\n    }\n\n    if (macroList.length) {\n      return macroList.join('\\n') + '\\n';\n    }\n\n    return '';\n  }\n\n  private static genShaderVersion (level: number) {\n    if (level === 1) {\n      return '#version 100\\n';\n    }\n\n    return '#version 300 es\\n';\n  }\n\n  private static isVersion300 (source: string) {\n    const versionTag = /#version\\s+\\b\\d{3}\\b\\s*(es)?/;\n    const match = source.match(versionTag);\n    const version = match ? match[0] : '';\n\n    return version.includes('300');\n  }\n\n  private static removeWebGLVersion (source: string) {\n    const versionTag = /#version\\s+\\b\\d{3}\\b\\s*(es)?/;\n    const match = source.match(versionTag);\n\n    if (match) {\n      return source.replace(match[0], '');\n    }\n\n    return source;\n  }\n\n  private static has300Output (fragmentShader: string): boolean {\n    // [layout(location = 0)] out [highp] vec4 [color];\n    const fragReg = /\\bout\\s+(?:\\w+\\s+)?(?:vec4)\\s+(?:\\w+)\\s*;/;\n\n    return fragReg.test(fragmentShader);\n  }\n\n  private static replaceMRTShader (source: string, result: string[]): string {\n    const mrtIndexSet = new Set<string>();\n    let declaration = '';\n\n    for (let i = 0; i < result.length; i++) {\n      const res = result[i].match(/\\bgl_FragData\\[(.+?)\\]/);\n\n      if (res) {\n        mrtIndexSet.add(res[1]);\n      }\n    }\n\n    mrtIndexSet.forEach(index => {\n      declaration += `layout(location=${index}) out vec4 fragOutColor${index};\\n`;\n    });\n    declaration += 'void main(';\n\n    source = source.replace(/\\bgl_FragData\\[(.+?)\\]/g, 'fragOutColor$1');\n    source = source.replace(/void\\s+?main\\s*\\(/g, declaration);\n\n    return source;\n  }\n}\n\n","import type * as spec from '@galacean/effects-specification';\nimport { Vector2 } from '@galacean/effects-math/es/core/vector2';\nimport { Vector3 } from '@galacean/effects-math/es/core/vector3';\nimport { GLSLVersion } from './shader';\nimport { glContext } from '../gl';\nimport { Material } from '../material';\nimport { TextureLoadAction, type Texture } from '../texture';\nimport { Geometry } from './geometry';\nimport { Mesh } from './mesh';\nimport { getTextureSize } from './render-frame';\nimport type { RenderPassDestroyOptions } from './render-pass';\nimport { RenderTargetHandle, RenderPass } from './render-pass';\nimport type { Renderer } from './renderer';\nimport { colorGradingFrag, gaussianDownHFrag, gaussianDownVFrag, gaussianUpFrag, screenMeshVert, thresholdFrag } from '../shader';\nimport { FilterMode, type Framebuffer, RenderTextureFormat } from './framebuffer';\n\n// Bloom Pass - 包含阈值提取、高斯模糊（Down Sample 和 Up Sample）\nexport class BloomPass extends RenderPass {\n  sceneTextureHandle: RenderTargetHandle;\n\n  private readonly iterationCount: number;\n  private thresholdMaterial: Material;\n  private downSampleHMaterial: Material;\n  private downSampleVMaterial: Material;\n  private upSampleMaterial: Material;\n  private tempRTs: Framebuffer[] = [];\n  private thresholdRT: Framebuffer;\n  private mainTexture: Texture;\n\n  constructor (renderer: Renderer, iterationCount = 4) {\n    super(renderer);\n    this.iterationCount = iterationCount;\n\n    const engine = this.renderer.engine;\n\n    // Threshold material\n    this.thresholdMaterial = Material.create(engine, {\n      shader: {\n        vertex: screenMeshVert,\n        fragment: thresholdFrag,\n        glslVersion: GLSLVersion.GLSL1,\n      },\n    });\n    this.thresholdMaterial.blending = false;\n    this.thresholdMaterial.depthTest = false;\n    this.thresholdMaterial.culling = false;\n\n    // Down sample H material\n    this.downSampleHMaterial = Material.create(engine, {\n      shader: {\n        vertex: screenMeshVert,\n        fragment: gaussianDownHFrag,\n        glslVersion: GLSLVersion.GLSL1,\n      },\n    });\n    this.downSampleHMaterial.blending = false;\n    this.downSampleHMaterial.depthTest = false;\n    this.downSampleHMaterial.culling = false;\n\n    // Down sample V material\n    this.downSampleVMaterial = Material.create(engine, {\n      shader: {\n        vertex: screenMeshVert,\n        fragment: gaussianDownVFrag,\n        glslVersion: GLSLVersion.GLSL1,\n      },\n    });\n    this.downSampleVMaterial.blending = false;\n    this.downSampleVMaterial.depthTest = false;\n    this.downSampleVMaterial.culling = false;\n\n    // Up sample material\n    this.upSampleMaterial = Material.create(engine, {\n      shader: {\n        vertex: screenMeshVert,\n        fragment: gaussianUpFrag,\n        glslVersion: GLSLVersion.GLSL1,\n      },\n    });\n    this.upSampleMaterial.blending = false;\n    this.upSampleMaterial.depthTest = false;\n    this.upSampleMaterial.culling = false;\n\n    this.priority = 5000;\n    this.name = 'BloomPass';\n  }\n\n  override configure (renderer: Renderer): void {\n    // 获取场景纹理用于 ToneMappingPass\n    this.mainTexture = renderer.getFramebuffer().getColorTextures()[0];\n    this.sceneTextureHandle.texture = this.mainTexture;\n  }\n\n  override execute (renderer: Renderer): void {\n    const baseWidth = renderer.getWidth();\n    const baseHeight = renderer.getHeight();\n\n    // 1. Threshold pass - 提取高亮区域\n    const threshold = renderer.renderingData.currentFrame.globalVolume?.bloom?.threshold ?? 1.0;\n\n    this.thresholdRT = renderer.getTemporaryRT('_BloomThreshold', baseWidth, baseHeight, 0, FilterMode.Linear, RenderTextureFormat.RGBAHalf);\n    this.thresholdMaterial.setFloat('_Threshold', threshold);\n    renderer.blit(this.mainTexture, this.thresholdRT, this.thresholdMaterial);\n\n    let currentTexture = this.thresholdRT.getColorTextures()[0];\n\n    // 2. Down sample passes\n    for (let i = 0; i < this.iterationCount; i++) {\n      const downWidth = Math.floor(baseWidth / Math.pow(2, i + 1));\n      const downHeight = Math.floor(baseHeight / Math.pow(2, i + 1));\n\n      // Horizontal pass\n      const tempH = renderer.getTemporaryRT(`_BloomDownH${i}`, downWidth, downHeight, 0, FilterMode.Linear, RenderTextureFormat.RGBAHalf);\n\n      this.downSampleHMaterial.setVector2('_TextureSize', getTextureSize(currentTexture));\n      renderer.blit(currentTexture, tempH, this.downSampleHMaterial);\n\n      // Vertical pass\n      const tempV = renderer.getTemporaryRT(`_BloomDownV${i}`, downWidth, downHeight, 0, FilterMode.Linear, RenderTextureFormat.RGBAHalf);\n\n      this.downSampleVMaterial.setVector2('_TextureSize', getTextureSize(tempH.getColorTextures()[0]));\n      renderer.blit(tempH.getColorTextures()[0], tempV, this.downSampleVMaterial);\n\n      // 释放 H pass RT，保留 V pass RT 用于 up sample\n      renderer.releaseTemporaryRT(tempH);\n      this.tempRTs.push(tempV);\n      currentTexture = tempV.getColorTextures()[0];\n    }\n\n    // 释放 threshold RT\n    renderer.releaseTemporaryRT(this.thresholdRT);\n\n    // 3. Up sample passes\n    for (let i = this.iterationCount - 1; i > 0; i--) {\n      const upWidth = Math.floor(baseWidth / Math.pow(2, i - 1));\n      const upHeight = Math.floor(baseHeight / Math.pow(2, i - 1));\n\n      const tempUp = renderer.getTemporaryRT(`_BloomUp${i}`, upWidth, upHeight, 0, FilterMode.Linear, RenderTextureFormat.RGBAHalf);\n\n      // 获取下一层的 down sample 结果\n      const downSampleTexture = this.tempRTs[i - 1].getColorTextures()[0];\n\n      this.upSampleMaterial.setTexture('_GaussianDownTex', downSampleTexture);\n      this.upSampleMaterial.setVector2('_GaussianDownTextureSize', getTextureSize(downSampleTexture));\n      renderer.blit(currentTexture, tempUp, this.upSampleMaterial);\n\n      currentTexture = tempUp.getColorTextures()[0];\n      this.tempRTs.push(tempUp);\n    }\n\n    // 设置最终输出到当前 framebuffer\n    renderer.setFramebuffer(this.tempRTs[this.tempRTs.length - 1]);\n  }\n\n  override onCameraCleanup (renderer: Renderer): void {\n    // 释放所有临时 RT\n    for (let i = 0; i < this.tempRTs.length; i++) {\n      renderer.releaseTemporaryRT(this.tempRTs[i]);\n    }\n\n    this.tempRTs = [];\n  }\n\n  override dispose (options?: RenderPassDestroyOptions): void {\n    this.thresholdMaterial.dispose();\n    this.downSampleHMaterial.dispose();\n    this.downSampleVMaterial.dispose();\n    this.upSampleMaterial.dispose();\n    super.dispose(options);\n  }\n}\n\n// 合并Bloom的高斯模糊结果，并应用ACES Tonemapping\nexport class ToneMappingPass extends RenderPass {\n  private screenMesh: Mesh;\n  private sceneTextureHandle: RenderTargetHandle;\n  private mainTexture: Texture;\n\n  constructor (renderer: Renderer, sceneTextureHandle?: RenderTargetHandle) {\n    super(renderer);\n    const name = 'PostProcess';\n    const engine = this.renderer.engine;\n\n    this.sceneTextureHandle = sceneTextureHandle ? sceneTextureHandle : new RenderTargetHandle(engine);\n    const geometry = Geometry.create(engine, {\n      name,\n      mode: glContext.TRIANGLE_STRIP,\n      attributes: {\n        aPos: {\n          type: glContext.FLOAT,\n          size: 2,\n          data: new Float32Array([-1, 1, -1, -1, 1, 1, 1, -1]),\n        },\n      },\n      drawCount: 4,\n    });\n\n    const material = Material.create(engine, {\n      name,\n      shader: {\n        vertex: screenMeshVert,\n        fragment: colorGradingFrag,\n        glslVersion: GLSLVersion.GLSL1,\n      },\n    });\n\n    material.blending = false;\n    material.depthTest = false;\n    material.culling = false;\n\n    this.screenMesh = Mesh.create(engine, {\n      name, geometry, material,\n      priority: 0,\n    });\n    this.priority = 5000;\n    this.name = 'ToneMappingPass';\n  }\n\n  override configure (renderer: Renderer): void {\n    this.mainTexture = renderer.getFramebuffer().getColorTextures()[0];\n    if (!this.sceneTextureHandle.texture) {\n      this.sceneTextureHandle.texture = this.mainTexture;\n    }\n    renderer.setFramebuffer(null);\n  }\n\n  override execute (renderer: Renderer): void {\n    renderer.clear({\n      colorAction: TextureLoadAction.clear,\n      depthAction: TextureLoadAction.clear,\n      stencilAction: TextureLoadAction.clear,\n    });\n    const globalVolume = renderer.renderingData.currentFrame.globalVolume;\n\n    const bloom: spec.Bloom = {\n      threshold: 0,\n      intensity: 0,\n      active: false,\n      ...globalVolume?.bloom,\n    };\n\n    const vignette: spec.Vignette = {\n      intensity: 0,\n      smoothness: 0,\n      roundness: 0,\n      active: false,\n      ...globalVolume?.vignette,\n    };\n\n    const colorAdjustments: spec.ColorAdjustments = {\n      brightness: 0,\n      saturation: 0,\n      contrast: 0,\n      active: false,\n      ...globalVolume?.colorAdjustments,\n    };\n\n    const tonemapping: spec.Tonemapping = {\n      active: false,\n      ...globalVolume?.tonemapping,\n    };\n\n    this.screenMesh.material.setTexture('_SceneTex', this.sceneTextureHandle.texture);\n\n    this.screenMesh.material.setFloat('_Brightness', Math.pow(2, colorAdjustments.brightness));\n    this.screenMesh.material.setFloat('_Saturation', (colorAdjustments.saturation * 0.01) + 1);\n    this.screenMesh.material.setFloat('_Contrast', (colorAdjustments.contrast * 0.01) + 1);\n\n    this.screenMesh.material.setInt('_UseBloom', Number(bloom.active));\n    if (bloom.active) {\n      this.screenMesh.material.setTexture('_GaussianTex', this.mainTexture);\n      this.screenMesh.material.setFloat('_BloomIntensity', bloom.intensity);\n    }\n    if (vignette.intensity > 0) {\n      this.screenMesh.material.setFloat('_VignetteIntensity', vignette.intensity);\n      this.screenMesh.material.setFloat('_VignetteSmoothness', vignette.smoothness);\n      this.screenMesh.material.setFloat('_VignetteRoundness', vignette.roundness);\n      this.screenMesh.material.setVector2('_VignetteCenter', new Vector2(0.5, 0.5));\n      this.screenMesh.material.setVector3('_VignetteColor', new Vector3(0.0, 0.0, 0.0));\n    }\n    this.screenMesh.material.setInt('_UseToneMapping', Number(tonemapping.active));\n    renderer.renderMeshes([this.screenMesh]);\n  }\n}\n","import type { Matrix4 } from '@galacean/effects-math/es/core/matrix4';\nimport { Vector2 } from '@galacean/effects-math/es/core/vector2';\nimport type { Vector3 } from '@galacean/effects-math/es/core/vector3';\nimport { Vector4 } from '@galacean/effects-math/es/core/vector4';\nimport type { vec4 } from '@galacean/effects-specification';\nimport type { Camera } from '../camera';\nimport type { PostProcessVolume, RendererComponent } from '../components';\nimport type { Texture } from '../texture';\nimport type { Disposable } from '../utils';\nimport { DestroyOptions, removeItem } from '../utils';\nimport { DrawObjectPass } from './draw-object-pass';\nimport { BloomPass, ToneMappingPass } from './post-process-pass';\nimport type { RenderPass, RenderPassDestroyOptions } from './render-pass';\nimport { RenderTargetHandle } from './render-pass';\nimport type { Renderer } from './renderer';\n\n/**\n * 渲染数据，保存了当前渲染使用到的数据。\n */\nexport interface RenderingData {\n  /**\n   * 当前渲染使用的 Camera\n   */\n  currentCamera: Camera,\n  /**\n   * 当前渲染的 RenderFrame\n   */\n  currentFrame: RenderFrame,\n  /**\n   * 当前渲染的 RenderPass\n   */\n  currentPass: RenderPass,\n}\n\n/**\n * 抽象 RenderFrame 选项\n */\nexport interface RenderFrameOptions {\n  camera: Camera,\n  /**\n   * 编辑器整体变换，Player 开发不需要关注\n   */\n  editorTransform?: vec4,\n  /**\n   * 后处理渲染配置\n   */\n  globalVolume?: PostProcessVolume,\n  /**\n   * 后处理是否开启\n   */\n  postProcessingEnabled?: boolean,\n  /**\n   * 名称\n   */\n  name?: string,\n  renderer: Renderer,\n}\n\nexport type RenderFrameDestroyOptions = {\n  passes?: RenderPassDestroyOptions | DestroyOptions.keep,\n  semantics?: DestroyOptions,\n};\n\nlet seed = 1;\n\n/**\n * RenderFrame 抽象类\n */\nexport class RenderFrame implements Disposable {\n  /**\n   * 当前使用的全部 RenderPass\n   */\n  _renderPasses: RenderPass[];\n  /**\n   * 渲染时的相机\n   */\n  camera: Camera;\n  /**\n   * 存放后处理的属性设置\n   */\n  globalVolume?: PostProcessVolume;\n  renderer: Renderer;\n  editorTransform: Vector4;\n  /**\n   * 名称\n   */\n  readonly name: string;\n  readonly globalUniforms: GlobalUniforms;\n\n  private disposed = false;\n  private drawObjectPass: DrawObjectPass;\n  private postProcessingEnabled: boolean = false;\n  private enableHDR: boolean = true;\n\n  constructor (options: RenderFrameOptions) {\n    const {\n      camera, renderer,\n      editorTransform = [1, 1, 0, 0],\n      globalVolume,\n      postProcessingEnabled = false,\n    } = options;\n    const engine = renderer.engine;\n\n    if (globalVolume) {\n      this.globalVolume = globalVolume;\n    }\n\n    this.postProcessingEnabled = postProcessingEnabled;\n    this.globalUniforms = new GlobalUniforms();\n    this.renderer = renderer;\n\n    if (postProcessingEnabled && this.enableHDR && !this.renderer.engine.gpuCapability.detail.halfFloatTexture) {\n      throw new Error('Half float texture is not supported.');\n    }\n\n    this.drawObjectPass = new DrawObjectPass(renderer);\n    const renderPasses = [this.drawObjectPass];\n\n    this.setRenderPasses(renderPasses);\n\n    if (postProcessingEnabled) {\n      const sceneTextureHandle = new RenderTargetHandle(engine);  //保存后处理前的屏幕图像\n\n      const gaussianStep = 7; // 高斯模糊的迭代次数，次数越高模糊范围越大\n\n      // Bloom Pass（包含阈值提取、高斯模糊）\n      const bloomPass = new BloomPass(renderer, gaussianStep);\n\n      bloomPass.sceneTextureHandle = sceneTextureHandle;\n      this.addRenderPass(bloomPass);\n\n      // Tone Mapping Pass\n      const postProcessPass = new ToneMappingPass(renderer, sceneTextureHandle);\n\n      this.addRenderPass(postProcessPass);\n    }\n\n    this.name = `RenderFrame${seed++}`;\n\n    this.camera = camera;\n    this.editorTransform = Vector4.fromArray(editorTransform);\n  }\n\n  get renderPasses () {\n    return this._renderPasses.slice();\n  }\n\n  get isDisposed () {\n    return this.disposed;\n  }\n\n  /**\n   * 设置 RenderPasses 参数，此函数每帧调用一次\n   */\n  setup () {\n    this.drawObjectPass.setup(this.postProcessingEnabled);\n  }\n\n  /**\n   * 根据 Mesh 优先级添加到 RenderPass\n   * @param mesh - 要添加的 Mesh 对象\n   */\n  addMeshToDefaultRenderPass (mesh: RendererComponent) {\n    this.drawObjectPass.addMesh(mesh);\n  }\n\n  /**\n   * 把 Mesh 从 RenderPass 中移除，\n   * 如果 renderPass 中没有 mesh，此 renderPass 会被删除\n   * @param mesh - 要删除的 Mesh 对象\n   */\n  removeMeshFromDefaultRenderPass (mesh: RendererComponent) {\n    this.drawObjectPass.removeMesh(mesh);\n  }\n\n  /**\n   * 销毁 RenderFrame\n   * @param options - 可以有选择销毁一些对象\n   */\n  dispose (options?: RenderFrameDestroyOptions) {\n    const pass = options?.passes ? options.passes : undefined;\n\n    if (pass !== DestroyOptions.keep) {\n      this._renderPasses.forEach(renderPass => {\n        renderPass.dispose(pass);\n      });\n    }\n    this._renderPasses.length = 0;\n    this.disposed = true;\n  }\n\n  /**\n   * 设置 RenderPass 数组，直接修改内部的 RenderPass 数组\n   * @param passes - RenderPass 数组\n   */\n  setRenderPasses (passes: RenderPass[]) {\n    this._renderPasses = passes.slice();\n  }\n\n  /**\n   * 添加 RenderPass\n   * @param pass - 需要添加的 RenderPass\n   */\n  addRenderPass (pass: RenderPass): void {\n    this._renderPasses.push(pass);\n  }\n\n  /**\n   * 移除 RenderPass\n   * @param pass - 需要移除的 RenderPass\n   */\n  removeRenderPass (pass: RenderPass): void {\n    removeItem(this._renderPasses, pass);\n  }\n}\n\nexport function getTextureSize (tex?: Texture): Vector2 {\n  return tex ? new Vector2(tex.getWidth(), tex.getHeight()) : new Vector2();\n}\n\nexport class GlobalUniforms {\n  floats: Record<string, number> = {};\n  ints: Record<string, number> = {};\n  vector3s: Record<string, Vector3> = {};\n  vector4s: Record<string, Vector4> = {};\n  matrices: Record<string, Matrix4> = {};\n  //...\n\n  samplers: string[] = [];  // 存放的sampler名称。\n  uniforms: string[] = [];  // 存放的uniform名称（不包括sampler）。\n}\n","import type { Disposable } from '../utils';\nimport type { RenderPassAttachmentStorageType } from './render-pass';\n\nexport interface RenderbufferProps {\n  storageType: RenderPassAttachmentStorageType,\n  format: GLenum,\n  attachment: GLenum,\n}\n\nexport abstract class Renderbuffer implements Disposable {\n  readonly size: [x: number, y: number] = [0, 0];\n  readonly multiSample = 1;\n  readonly storageType: RenderPassAttachmentStorageType;\n  readonly format: GLenum;\n  readonly attachment: GLenum;\n\n  protected destroyed = false;\n\n  static create: (props: RenderbufferProps) => Renderbuffer;\n\n  constructor (props: RenderbufferProps) {\n    const { storageType, format, attachment } = props;\n\n    this.storageType = storageType;\n    this.format = format;\n    this.attachment = attachment;\n  }\n\n  get isDestroyed (): boolean {\n    return this.destroyed;\n  }\n\n  abstract setSize (width: number, height: number): void;\n\n  abstract dispose (): void;\n}\n\n","import type { Engine } from '../engine';\nimport { glContext } from '../gl';\nimport { Texture, TextureSourceType } from '../texture';\nimport { FilterMode, Framebuffer, RenderTextureFormat } from './framebuffer';\nimport { RenderPassAttachmentStorageType } from './render-pass';\n\ninterface Entry {\n  RT: Framebuffer,\n  lastFrameReleased: number,\n  descriptionHash: string,\n  isOccupied: boolean,\n}\n\nexport class RenderTargetPool {\n  private temporaryRTs: Entry[] = [];\n  private currentFrame = 0;\n  private readonly maxUnusedFrames = 4;\n\n  constructor (\n    public engine: Engine,\n  ) { }\n\n  /**\n   * 清理 RenderTarget 池\n   * @param force - 是否强制清理所有未占用的 RT\n   * @param framesOffset - 自定义未使用帧数阈值，-1 表示使用默认值\n   */\n  flush (force = false, framesOffset = -1): void {\n    this.currentFrame++;\n\n    const threshold = framesOffset >= 0 ? framesOffset : this.maxUnusedFrames;\n\n    for (let i = 0; i < this.temporaryRTs.length; i++) {\n      const entry = this.temporaryRTs[i];\n\n      // 强制清理所有未占用的 RT，或清理超过阈值帧数未使用的 RT\n      if (!entry.isOccupied && (force || (this.currentFrame - entry.lastFrameReleased) > threshold)) {\n        entry.RT.dispose();\n        this.temporaryRTs.splice(i--, 1);\n      }\n    }\n  }\n\n  get (\n    name: string,\n    width: number,\n    height: number,\n    depthBuffer = 0,\n    filter = FilterMode.Linear,\n    format = RenderTextureFormat.RGBA32,\n  ): Framebuffer {\n    // 使用参数计算 hash 值作为缓存 key\n    const hash = `${width}_${height}_${depthBuffer}_${filter}_${format}`;\n\n    for (const entry of this.temporaryRTs) {\n      if (!entry.isOccupied && entry.descriptionHash === hash) {\n        entry.isOccupied = true;\n        entry.RT.name = name;\n\n        return entry.RT;\n      }\n    }\n\n    let textureFilter;\n    let textureType;\n    let depthType = RenderPassAttachmentStorageType.none;\n\n    // TODO 建立Map映射\n    if (filter === FilterMode.Linear) {\n      textureFilter = glContext.LINEAR;\n    } else if (filter === FilterMode.Nearest) {\n      textureFilter = glContext.NEAREST;\n    }\n    if (format === RenderTextureFormat.RGBA32) {\n      textureType = glContext.UNSIGNED_BYTE;\n    } else if (format === RenderTextureFormat.RGBAHalf) {\n      textureType = glContext.HALF_FLOAT;\n    }\n    if (depthBuffer === 0) {\n      depthType = RenderPassAttachmentStorageType.none;\n    } else if (depthBuffer === 16) {\n      depthType = RenderPassAttachmentStorageType.depth_stencil_opaque;\n    } else if (depthBuffer === 24) {\n      depthType = RenderPassAttachmentStorageType.depth_24_stencil_8_texture;\n    }\n\n    const colorAttachment = Texture.create(this.engine, {\n      sourceType: TextureSourceType.framebuffer,\n      minFilter: textureFilter,\n      magFilter: textureFilter,\n      internalFormat: glContext.RGBA,\n      format: glContext.RGBA,\n      type: textureType,\n    });\n\n    const newFramebuffer = Framebuffer.create({\n      name,\n      storeAction: {},\n      viewport: [0, 0, width, height],\n      attachments: [colorAttachment],\n      depthStencilAttachment: { storageType: depthType },\n    }, this.engine.renderer);\n\n    const entry: Entry = {\n      RT: newFramebuffer,\n      lastFrameReleased: 0,\n      descriptionHash: hash,\n      isOccupied: true,\n    };\n\n    this.temporaryRTs.push(entry);\n\n    return entry.RT;\n  }\n\n  /**\n   * 释放 RenderTarget，使其可以被复用\n   * @param rt - 要释放的 Framebuffer\n   */\n  release (rt: Framebuffer): void {\n    for (const entry of this.temporaryRTs) {\n      if (entry.RT === rt) {\n        entry.isOccupied = false;\n        entry.lastFrameReleased = this.currentFrame;\n\n        break;\n      }\n    }\n  }\n\n  dispose (): void {\n    for (const entry of this.temporaryRTs) {\n      entry.RT.dispose();\n    }\n  }\n}\n","import type { GLType } from '../gl';\nimport type { Immutable } from '../utils';\n\nexport interface GPUCapabilityDetail {\n  floatTexture: number,\n  halfFloatTexture: number,\n  //set currentPass color attachment type FLOAT\n  floatColorAttachment?: boolean,\n  //set currentPass color attachment type HALF_FLOAT\n  halfFloatColorAttachment?: boolean,\n  maxVertexUniforms: number,\n  maxVertexTextures: number,\n  maxFragmentUniforms: number,\n  maxFragmentTextures: number,\n  maxShaderTexCount: number,\n  maxTextureSize: number,\n  maxTextureAnisotropy: number,\n  shaderTextureLod: boolean,\n  instanceDraw?: boolean,\n  ktx2Support: boolean,\n  drawBuffers?: boolean,\n  asyncShaderCompile: boolean,\n  //draw elements use uint32 Array\n  intIndexElementBuffer?: boolean,\n  //render pass depth and stencil texture readable\n  //in webgl, if not readable,use Renderbuffer which cannot readable\n  readableDepthStencilTextures?: boolean,\n  writableFragDepth?: boolean,\n  standardDerivatives: boolean,\n  halfFloatLinear: boolean,\n  floatLinear: boolean,\n  maxSample: number,\n}\n\nconst isWebGL2Available = typeof WebGL2RenderingContext === 'function';\n\nexport class GPUCapability {\n  type: GLType;\n  level: number;\n  detail: Immutable<GPUCapabilityDetail>;\n  private compressTextureCapabilityList: Map<CompressTextureCapabilityType, boolean>;\n\n  UNSIGNED_INT_24_8: number;\n  internalFormatDepth16: number;\n  internalFormatDepth24_stencil8: number;\n\n  private drawBufferExtension: WEBGL_draw_buffers | null;\n  private textureMaxAnisotropyExt: number;\n  glAsyncCompileExt: KHR_parallel_shader_compile | null;\n  vaoExt: OES_vertex_array_object | null;\n\n  constructor (\n    gl: WebGLRenderingContext | WebGL2RenderingContext,\n  ) {\n    this.setupCapability(gl);\n  }\n  get isWebGL2 (): boolean {\n    return this.level === 2;\n  }\n  isCompressedFormatSupported (cap: CompressTextureCapabilityType): boolean {\n    return !!this.compressTextureCapabilityList.get(cap);\n  }\n  private setupCapability (gl: WebGLRenderingContext | WebGL2RenderingContext) {\n    const level = isWebGL2Available && gl instanceof WebGL2RenderingContext ? 2 : 1;\n    const level2 = level === 2;\n    const textureAnisotropicExt = gl.getExtension('EXT_texture_filter_anisotropic') || gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic') as EXT_texture_filter_anisotropic;\n    const depthTextureExtension = gl.getExtension('WEBGL_depth_texture');\n    let halfFloatLinear = !!gl.getExtension('OES_texture_half_float_linear');\n    let floatLinear = !!gl.getExtension('OES_texture_float_linear');\n\n    this.level = level;\n    this.type = level2 ? 'webgl2' : 'webgl';\n    this.vaoExt = gl.getExtension('OES_vertex_array_object');\n    this.glAsyncCompileExt = gl.getExtension('KHR_parallel_shader_compile');\n\n    this.UNSIGNED_INT_24_8 = (gl as WebGL2RenderingContext).UNSIGNED_INT_24_8;\n    this.drawBufferExtension = gl.getExtension('WEBGL_draw_buffers');\n    if (depthTextureExtension) {\n      this.UNSIGNED_INT_24_8 = depthTextureExtension.UNSIGNED_INT_24_8_WEBGL;\n    }\n    if (level2 && !halfFloatLinear) {\n      halfFloatLinear = checkLinearTextureFilter(gl as WebGL2RenderingContext, (gl as WebGL2RenderingContext).HALF_FLOAT);\n    }\n    if (level2 && !floatLinear) {\n      floatLinear = checkLinearTextureFilter(gl as WebGL2RenderingContext, (gl as WebGL2RenderingContext).FLOAT);\n    }\n    this.internalFormatDepth16 = level2 ? (gl as WebGL2RenderingContext).DEPTH_COMPONENT16 : gl.DEPTH_COMPONENT;\n    this.internalFormatDepth24_stencil8 = level2 ? (gl as WebGL2RenderingContext).DEPTH24_STENCIL8 : gl.DEPTH_STENCIL;\n    const floatTexture = (level2 || gl.getExtension('OES_texture_float')) ? gl.FLOAT : 0;\n    const halfFloatTexture = level2 ? WebGL2RenderingContext.HALF_FLOAT : (gl.getExtension('OES_texture_half_float')?.HALF_FLOAT_OES || 0);\n\n    this.compressTextureCapabilityList = new Map([\n      [CompressTextureCapabilityType.astc, !!gl.getExtension('WEBGL_compressed_texture_astc')],\n      [CompressTextureCapabilityType.astc_webkit, !!gl.getExtension('WEBKIT_WEBGL_compressed_texture_astc')],\n      [CompressTextureCapabilityType.etc, !!gl.getExtension('WEBGL_compressed_texture_etc')],\n      [CompressTextureCapabilityType.etc_webkit, !!gl.getExtension('WEBKIT_WEBGL_compressed_texture_etc')],\n      [CompressTextureCapabilityType.etc1, !!gl.getExtension('WEBGL_compressed_texture_etc1')],\n      [CompressTextureCapabilityType.pvrtc, !!gl.getExtension('WEBGL_compressed_texture_pvrtc') || !!gl.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc')],\n      [CompressTextureCapabilityType.pvrtc_webkit, !!gl.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc')],\n      [CompressTextureCapabilityType.sRGB, !!gl.getExtension('EXT_sRGB')],\n    ]);\n    const detail: GPUCapabilityDetail = {\n      floatTexture,\n      halfFloatTexture,\n      maxSample: level2 ? gl.getParameter((gl as WebGL2RenderingContext).MAX_SAMPLES) : 1,\n      maxVertexUniforms: gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS),\n      maxVertexTextures: gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS),\n      maxFragmentUniforms: gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS),\n      maxFragmentTextures: gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS),\n      floatColorAttachment: level2 ? !!gl.getExtension('EXT_color_buffer_float') : (floatTexture > 0 && !!gl.getExtension('WEBGL_color_buffer_float')),\n      halfFloatColorAttachment: level2 ? !!gl.getExtension('EXT_color_buffer_float') : (halfFloatTexture > 0 && !!gl.getExtension('EXT_color_buffer_half_float')),\n      maxTextureSize: gl.getParameter(gl.MAX_TEXTURE_SIZE),\n      maxShaderTexCount: gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS),\n      halfFloatLinear,\n      floatLinear,\n      maxTextureAnisotropy: textureAnisotropicExt ? gl.getParameter(textureAnisotropicExt.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 0,\n      shaderTextureLod: level2 || !!gl.getExtension('EXT_shader_texture_lod'),\n      instanceDraw: level2 || !!gl.getExtension('ANGLE_instanced_arrays'),\n      ktx2Support: detectKTX2Support(this.compressTextureCapabilityList),\n      drawBuffers: level2 || !!this.drawBufferExtension,\n      asyncShaderCompile: !!this.glAsyncCompileExt,\n      intIndexElementBuffer: !!gl.getExtension('OES_element_index_uint'),\n      standardDerivatives: level2 || !!gl.getExtension('OES_standard_derivatives'),\n      readableDepthStencilTextures: level2 || !!depthTextureExtension,\n      writableFragDepth: level2 || !!gl.getExtension('EXT_frag_depth'),\n    };\n\n    this['detail'] = detail;\n    if (textureAnisotropicExt) {\n      this.textureMaxAnisotropyExt = textureAnisotropicExt.TEXTURE_MAX_ANISOTROPY_EXT;\n    }\n  }\n\n  framebufferTexture2D (\n    gl: WebGLRenderingContext | WebGL2RenderingContext,\n    target: GLenum,\n    index: number,\n    textarget: number,\n    texture: WebGLTexture | null,\n  ) {\n    const ext = this.drawBufferExtension;\n\n    if (this.level === 1 && !ext && index > 0) {\n      throw new Error('Draw multiple color buffers not available.');\n    }\n    const attachment = ext ?\n      ext[`COLOR_ATTACHMENT${index}_WEBGL` as keyof WEBGL_draw_buffers] as number :\n      gl[`COLOR_ATTACHMENT${index}` as keyof WebGLRenderingContext] as number;\n\n    if (attachment) {\n      gl.framebufferTexture2D(target, attachment, textarget, texture, 0);\n    } else {\n      console.error(`Invalid color attachment index: ${index}.`);\n    }\n  }\n\n  drawBuffers (gl: WebGLRenderingContext | WebGL2RenderingContext, bufferStates: boolean[]) {\n    const ext = this.drawBufferExtension;\n\n    if (this.level === 1 && !ext) {\n      if (bufferStates.length > 1) {\n        throw new Error('Draw buffers not available.');\n      } else {\n        return;\n      }\n    }\n    const buffers = bufferStates.map((enabled, index) => {\n      if (enabled) {\n        return ext ?\n          ext[`COLOR_ATTACHMENT${index}_WEBGL` as keyof WEBGL_draw_buffers] as number :\n          gl[`COLOR_ATTACHMENT${index}` as keyof WebGLRenderingContext] as number;\n      }\n\n      return gl.NONE;\n    });\n\n    if (ext) {\n      ext.drawBuffersWEBGL(buffers);\n    } else {\n      (gl as WebGL2RenderingContext).drawBuffers(buffers);\n    }\n  }\n\n  setTextureAnisotropic (gl: WebGLRenderingContext | WebGL2RenderingContext, target: GLenum, level: number) {\n    const { maxTextureAnisotropy } = this.detail;\n\n    if (maxTextureAnisotropy) {\n      gl.texParameterf(target, this.textureMaxAnisotropyExt, Math.min(maxTextureAnisotropy, level || 4));\n    }\n  }\n}\n\nfunction checkLinearTextureFilter (gl: WebGL2RenderingContext, type: number): boolean {\n  const tex = gl.createTexture();\n  let ret = false;\n\n  gl.getError();\n  gl.bindTexture(gl.TEXTURE_2D, tex);\n  gl.texImage2D(gl.TEXTURE_2D, 0, gl.R16F, 1, 1, 0, gl.RED, type, null);\n  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n  if (!gl.getError()) {\n    ret = true;\n  }\n  gl.deleteTexture(tex);\n\n  return ret;\n}\n\n/**\n * GL Capabilities\n * Some capabilities can be smoothed out by extension, and some capabilities must use WebGL 2.0.\n * */\nexport enum CompressTextureCapabilityType {\n  astc = 'WEBGL_compressed_texture_astc',\n  astc_webkit = 'WEBKIT_WEBGL_compressed_texture_astc',\n  etc = 'WEBGL_compressed_texture_etc',\n  etc_webkit = 'WEBKIT_WEBGL_compressed_texture_etc',\n  etc1 = 'WEBGL_compressed_texture_etc1',\n  pvrtc = 'WEBGL_compressed_texture_pvrtc',\n  pvrtc_webkit = 'WEBKIT_WEBGL_compressed_texture_pvrtc',\n  sRGB = 'EXT_sRGB'\n}\n\n/**\n * 检测 KTX2 支持\n * KTX2 可以包含多种压缩格式，需要检测是否支持至少一种\n */\nfunction detectKTX2Support (compressTextureCapabilityList: Map<CompressTextureCapabilityType, boolean>): boolean {\n  // KTX2 文件可以包含多种压缩格式，检测是否支持至少一种\n  const hasCompressedTextureSupport =\n    compressTextureCapabilityList.get(CompressTextureCapabilityType.astc) ||\n    compressTextureCapabilityList.get(CompressTextureCapabilityType.astc_webkit);\n\n  // KTX2 可以回退到未压缩的格式（如 RGBA8），所以即使不支持压缩格式也可以使用\n  // 但为了性能考虑，至少支持一种压缩格式\n  return !!hasCompressedTextureSupport;\n}\n","import type { Matrix4, Vector3, Vector4 } from '@galacean/effects-math/es/core/index';\nimport type { RendererComponent } from '../components';\nimport type { Engine } from '../engine';\nimport type { Material } from '../material';\nimport type { LostHandler, RestoreHandler } from '../utils';\nimport type { FilterMode, Framebuffer, RenderTextureFormat } from './framebuffer';\nimport type { Geometry } from './geometry';\nimport type { RenderFrame, RenderingData } from './render-frame';\nimport type { RenderPassClearAction } from './render-pass';\nimport type { ShaderLibrary } from './shader';\nimport { RenderTargetPool } from './render-target-pool';\nimport type { Texture } from '../texture';\n\nexport class Renderer implements LostHandler, RestoreHandler {\n  static create: (engine: Engine) => Renderer;\n\n  /**\n  * 存放渲染需要用到的数据\n  */\n  renderingData: RenderingData;\n  renderTargetPool: RenderTargetPool;\n  protected currentFramebuffer: Framebuffer | null = null;\n\n  constructor (\n    public engine: Engine,\n  ) {\n    this.renderTargetPool = new RenderTargetPool(engine);\n  }\n\n  setGlobalFloat (name: string, value: number) {\n    // OVERRIDE\n  }\n\n  setGlobalInt (name: string, value: number) {\n    // OVERRIDE\n  }\n\n  setGlobalVector4 (name: string, value: Vector4) {\n    // OVERRIDE\n  }\n\n  setGlobalVector3 (name: string, value: Vector3) {\n    // OVERRIDE\n  }\n\n  setGlobalMatrix (name: string, value: Matrix4) {\n    // OVERRIDE\n  }\n\n  getFramebuffer (): Framebuffer {\n    return this.currentFramebuffer as Framebuffer;\n  }\n\n  setFramebuffer (framebuffer: Framebuffer | null) {\n    // OVERRIDE\n  }\n\n  setViewport (x: number, y: number, width: number, height: number) {\n    // OVERRIDE\n  }\n\n  resize (canvasWidth: number, canvasHeight: number) {\n    // OVERRIDE\n  }\n\n  clear (action: RenderPassClearAction) {\n    // OVERRIDE\n  }\n\n  getWidth (): number {\n    // OVERRIDE\n    return 0;\n  }\n\n  getHeight (): number {\n    // OVERRIDE\n    return 0;\n  }\n\n  /**\n   * @override\n   * @param e\n   */\n  lost (e: Event): void {\n    // OVERRIDE\n  }\n\n  /**\n   * @override\n   */\n  restore (): void {\n    // OVERRIDE\n  }\n\n  /**\n   *\n   * @override\n   * @returns\n   */\n  getShaderLibrary (): ShaderLibrary | undefined {\n    // OVERRIDE\n    return undefined;\n  }\n\n  renderRenderFrame (renderFrame: RenderFrame) {\n    // OVERRIDE\n  }\n\n  renderMeshes (meshes: RendererComponent[]) {\n    // OVERRIDE\n  }\n\n  drawGeometry (geometry: Geometry, matrix: Matrix4, material: Material, subMeshIndex = 0) {\n    // OVERRIDE\n  }\n\n  getTemporaryRT (\n    name: string,\n    width: number,\n    height: number,\n    depthBuffer: number,\n    filter: FilterMode,\n    format: RenderTextureFormat,\n  ): Framebuffer {\n    return this.renderTargetPool.get(name, width, height, depthBuffer, filter, format);\n  }\n\n  releaseTemporaryRT (rt: Framebuffer): void {\n    this.renderTargetPool.release(rt);\n  }\n\n  /**\n   * 将源纹理复制到目标 Framebuffer，可使用自定义材质进行处理\n   * @param source - 源纹理\n   * @param destination - 目标 Framebuffer，如果为 null 则渲染到屏幕\n   * @param material - 可选的自定义材质，不传则使用默认复制材质\n   */\n  blit (source: Texture, destination: Framebuffer | null, material?: Material): void {\n    // OVERRIDE\n  }\n\n  dispose (): void {\n    // OVERRIDE\n  }\n}\n","/**\n *\n */\nexport type EventEmitterListener<P extends any[]> = (...callbackArgs: P) => void;\n\n/**\n * 事件监听器选项\n */\nexport type EventEmitterOptions = {\n  /**\n   * 是否只监听一次\n   */\n  once?: boolean,\n};\n\n/**\n * 事件监听器\n */\nexport class EventEmitter<T extends Record<string, any[]>> {\n  private listeners: Record<string, Array<{ listener: EventEmitterListener<any[]>, options?: EventEmitterOptions }>> = {};\n\n  /**\n   * 移除事件监听器\n   * @param eventName - 事件名称\n   * @param listener - 事件监听器\n   * @returns\n   */\n  off = <E extends keyof T & string> (\n    eventName: E,\n    listener: EventEmitterListener<T[E]>,\n  ): void => {\n    if (!this.listeners[eventName]) {\n      return;\n    }\n\n    this.listeners[eventName] = this.listeners[eventName].filter(({ listener: l }) => l !== listener);\n  };\n\n  /**\n   * 监听事件\n   * @param eventName - 事件名称\n   * @param listener - 事件监听器\n   * @param options - 事件监听器选项\n   * @returns\n   */\n  on = <E extends keyof T & string> (\n    eventName: E,\n    listener: EventEmitterListener<T[E]>,\n    options?: EventEmitterOptions,\n  ) => {\n    this.listeners[eventName] = this.listeners[eventName] || [];\n    this.listeners[eventName].push({ listener, options });\n\n    return () => this.off(eventName, listener);\n  };\n\n  /**\n   * 一次性监听事件\n   * @param eventName - 事件名称\n   * @param listener - 事件监听器\n   */\n  once = <E extends keyof T & string> (\n    eventName: E,\n    listener: EventEmitterListener<T[E]>,\n  ): void => {\n    this.on(eventName, listener, { once: true });\n  };\n\n  /**\n   * 触发事件\n   * @param eventName - 事件名称\n   * @param args - 事件参数\n   */\n  emit = <E extends keyof T & string> (eventName: E, ...args: T[E]): void => {\n    this.listeners[eventName]?.forEach(({ listener, options }) => {\n      listener(...args);\n      if (options?.once) {\n        this.off(eventName, listener);\n      }\n    });\n  };\n\n  /**\n   * 获取事件名称对应的所有监听器\n   * @param eventName - 事件名称\n   * @returns - 返回事件名称对应的所有监听器\n   */\n  getListeners = <E extends keyof T & string> (eventName: E): EventEmitterListener<T[E]>[] => {\n    return this.listeners[eventName]?.map(({ listener }) => listener) || [];\n  };\n}\n","import { Component } from '../components';\n\n/**\n *\n */\nexport class SceneTicking {\n  update: UpdateTickData = new UpdateTickData();\n  lateUpdate: LateUpdateTickData = new LateUpdateTickData();\n\n  /**\n   *\n   * @param obj\n   */\n  addComponent (obj: Component): void {\n    if (obj.onUpdate !== Component.prototype.onUpdate) {\n      this.update.addComponent(obj);\n    }\n    if (obj.onLateUpdate !== Component.prototype.onLateUpdate) {\n      this.lateUpdate.addComponent(obj);\n    }\n  }\n\n  /**\n   *\n   * @param obj\n   */\n  removeComponent (obj: Component): void {\n    if (obj.onUpdate !== Component.prototype.onUpdate) {\n      this.update.removeComponent(obj);\n    }\n    if (obj.onLateUpdate !== Component.prototype.onLateUpdate) {\n      this.lateUpdate.removeComponent(obj);\n    }\n  }\n\n  /**\n   *\n   */\n  clear (): void {\n    this.update.clear();\n    this.lateUpdate.clear();\n  }\n}\n\nclass TickData {\n  components: Component[] = [];\n  ticks: ((dt: number) => void)[] = [];\n\n  constructor () {\n  }\n\n  tick (dt: number) {\n    this.tickComponents(this.components, dt);\n\n    for (let i = 0;i < this.ticks.length;i++) {\n      this.ticks[i](dt);\n    }\n  }\n\n  tickComponents (components: Component[], dt: number): void {\n    // To be implemented in derived classes\n  }\n\n  addComponent (component: Component): void {\n    if (!this.components.includes(component)) {\n      this.components.push(component);\n    }\n  }\n\n  removeComponent (component: Component): void {\n    const index = this.components.indexOf(component);\n\n    if (index > -1) {\n      this.components.splice(index, 1);\n    }\n  }\n\n  addTick (method: (dt: number) => void, callee: object) {\n    const tick = method.bind(callee);\n\n    if (!this.ticks.includes(tick)) {\n      this.ticks.push(tick);\n    }\n  }\n\n  clear (): void {\n    this.components = [];\n  }\n}\n\nclass UpdateTickData extends TickData {\n  override tickComponents (components: Component[], dt: number): void {\n    for (const component of components) {\n      component.onUpdate(dt);\n    }\n  }\n}\n\nclass LateUpdateTickData extends TickData {\n  override tickComponents (components: Component[], dt: number): void {\n    for (const component of components) {\n      component.onLateUpdate(dt);\n    }\n  }\n}\n\n// function compareComponents (a: Component, b: Component): number {\n//   const itemA = a.item;\n//   const itemB = b.item;\n\n//   if (VFXItem.isAncestor(itemA, itemB)) {\n//     return -1;\n//   } else {\n//     return 1;\n//   }\n// }\n","import * as spec from '@galacean/effects-specification';\nimport type { Ray } from '@galacean/effects-math/es/core/ray';\nimport type { Matrix4 } from '@galacean/effects-math/es/core/matrix4';\nimport { Camera } from './camera';\nimport type { Component, PostProcessVolume } from './components';\nimport { CompositionComponent } from './components';\nimport { PLAYER_OPTIONS_ENV_EDITOR } from './constants';\nimport { setRayFromCamera } from './math';\nimport { PluginSystem } from './plugin-system';\nimport type { EventSystem, Region } from './plugins';\nimport { PlayState } from './plugins';\nimport type { Renderer } from './render';\nimport { RenderFrame } from './render';\nimport type { Scene } from './scene';\nimport type { Texture } from './texture';\nimport { TextureLoadAction } from './texture';\nimport type { Constructor, Disposable, LostHandler } from './utils';\nimport { assertExist, logger, noop } from './utils';\nimport { VFXItem } from './vfx-item';\nimport type { CompositionEvent } from './events';\nimport { EventEmitter } from './events';\nimport { SceneTicking } from './composition/scene-ticking';\n\n/**\n * 合成统计信息\n */\nexport interface CompositionStatistic {\n  loadStart: number,\n  /**\n   * 加载耗时\n   */\n  loadTime: number,\n  /**\n   * Shader 编译耗时\n   */\n  compileTime: number,\n  /**\n   * 从加载到渲染第一帧的时间（含 Shader 编译）\n   */\n  firstFrameTime: number,\n}\n\n/**\n * 合成消息对象\n */\nexport interface MessageItem {\n  /**\n   * 元素 ID\n   */\n  id: string,\n  /**\n   * 元素名称\n   */\n  name: string,\n  /**\n   * 消息阶段（2：开始，1：结束）\n   */\n  phrase: typeof spec.MESSAGE_ITEM_PHRASE_BEGIN | typeof spec.MESSAGE_ITEM_PHRASE_END,\n  /**\n   * 合成 ID\n   */\n  compositionId: string,\n}\n\n/**\n *\n */\nexport interface CompositionHitTestOptions {\n  /**\n   *\n   */\n  maxCount?: number,\n  /**\n   *\n   * @param region\n   * @returns\n   */\n  stop?: (region: Region) => boolean,\n  /**\n   *\n   * @param item\n   * @returns\n   */\n  skip?: (item: VFXItem) => boolean,\n}\n\n/**\n *\n */\nexport interface CompositionProps {\n  /**\n   *\n   */\n  reusable?: boolean,\n  /**\n   *\n   */\n  baseRenderOrder?: number,\n  /**\n   *\n   */\n  renderer: Renderer,\n  /**\n   *\n   * @param message\n   * @returns\n   */\n  onItemMessage?: (message: MessageItem) => void,\n  /**\n   *\n   */\n  event?: EventSystem,\n  /**\n   *\n   */\n  width: number,\n  /**\n   *\n   */\n  height: number,\n  /**\n   *\n   */\n  speed?: number,\n}\n\n/**\n * 合成抽象类：核心对象，通常一个场景只包含一个合成，可能会有多个合成。\n * 合成中包含了相关的 Item 元素，支持对 Item 元素的创建、更新和销毁。\n * 也负责 Item 相关的动画播放控制，和持有渲染帧数据。\n */\nexport class Composition extends EventEmitter<CompositionEvent<Composition>> implements Disposable, LostHandler {\n  renderer: Renderer;\n  /**\n   *\n   */\n  sceneTicking = new SceneTicking();\n  /**\n   * 当前帧的渲染数据对象\n   */\n  renderFrame: RenderFrame;\n  /**\n   * 动画播放速度\n   */\n  speed = 1;\n  /**\n   * 是否卸载纹理贴图，就是将纹理贴图大小设置为1x1\n   */\n  textureOffloaded: boolean;\n  /*\n   * 场景中视频的播放进度\n   */\n  videoState: (number | undefined)[];\n  /**\n   * 合成渲染顺序，默认按升序渲染\n   */\n  renderOrder: number;\n  /**\n   * 播放完成后是否需要再使用，是的话生命周期结束后不会自动 dispose\n   */\n  reusable: boolean;\n  /**\n   * 合成内的元素否允许点击、拖拽交互\n   * @since 1.6.0\n   */\n  interactive: boolean;\n  /**\n   * 合成是否结束\n   */\n  isEnded = false;\n  /**\n   * 合成id\n   */\n  readonly id: string;\n  /**\n   * 画布宽度\n   */\n  readonly width: number;\n  /**\n   * 画布高度\n   */\n  readonly height: number;\n  /**\n   * 鼠标和触屏处理系统\n   */\n  readonly event?: EventSystem;\n  /**\n   * 当前合成名称\n   */\n  readonly name: string;\n  /**\n   * 用于保存与当前合成相关的插件数据\n   */\n  readonly loaderData: Record<string, any> = {};\n  /**\n   * 场景加载和首帧渲染时间\n   */\n  readonly statistic: CompositionStatistic;\n  /**\n   * 合成对应的 url 或者 JSON\n   */\n  readonly url: Scene.LoadType;\n  /**\n   * 合成根元素\n   */\n  readonly rootItem: VFXItem;\n  /**\n   * 预合成数组\n   */\n  readonly refContent: VFXItem[] = [];\n  /**\n   * 合成的相机对象\n   */\n  readonly camera: Camera;\n  /**\n   * 合成开始渲染的时间\n   */\n  readonly startTime: number = 0;\n  /**\n   * 后处理渲染配置\n   */\n  globalVolume?: PostProcessVolume;\n  /**\n   * 是否开启后处理\n   */\n  postProcessingEnabled = false;\n  /**\n   * 合成中消息元素创建/销毁时触发的回调\n   */\n  onItemMessage?: (message: MessageItem) => void;\n  /**\n   * 销毁状态位\n   */\n  protected destroyed = false;\n  protected rootComposition: CompositionComponent;\n\n  /**\n   * 合成暂停/播放 标识\n   */\n  private paused = true;\n  private isEndCalled = false;\n  private _textures: Texture[] = [];\n  private videos: HTMLVideoElement[] = [];\n\n  /**\n   * @internal\n   * 构建父子树，同时保存到 itemCacheMap 中便于查找\n   */\n  static buildItemTree (compVFXItem: VFXItem) {\n    const itemMap = new Map<string, VFXItem>();\n    const contentItems = compVFXItem.getComponent(CompositionComponent).items;\n\n    for (const item of contentItems) {\n      itemMap.set(item.id, item);\n    }\n\n    for (const item of contentItems) {\n      if (item.parentId === undefined) {\n        item.setParent(compVFXItem);\n      } else {\n        const parent = itemMap.get(item.parentId);\n\n        if (parent) {\n          item.setParent(parent);\n        } else {\n          throw new Error('The element references a non-existent element, please check the data.');\n        }\n      }\n    }\n  }\n\n  /**\n   * Composition 构造函数\n   * @param props - composition 的创建参数\n   * @param scene\n   */\n  constructor (\n    props: CompositionProps,\n    scene: Scene,\n  ) {\n    super();\n\n    const {\n      reusable = false,\n      speed = 1,\n      baseRenderOrder = 0,\n      renderer, event, width, height,\n      onItemMessage,\n    } = props;\n\n    this.renderer = renderer;\n    this.renderer.engine.addComposition(this);\n    this._textures = scene.textures;\n\n    for (const key of Object.keys(scene.assets)) {\n      const videoAsset = scene.assets[key];\n\n      if (videoAsset instanceof HTMLVideoElement) {\n        this.videos.push(videoAsset);\n      }\n    }\n\n    this.postProcessingEnabled = scene.jsonScene.renderSettings?.postProcessingEnabled ?? false;\n    this.getEngine().renderLevel = scene.renderLevel;\n\n    if (reusable) {\n      scene.consumed = true;\n    }\n\n    let sourceContent: spec.CompositionData = scene.jsonScene.compositions[0];\n\n    for (const composition of scene.jsonScene.compositions) {\n      if (composition.id === scene.jsonScene.compositionId) {\n        sourceContent = composition;\n      }\n    }\n\n    assertExist(sourceContent);\n\n    // Instantiate composition rootItem\n    this.rootItem = new VFXItem(this.getEngine());\n    this.rootItem.setInstanceId(sourceContent.id);\n    this.rootItem.name = 'rootItem';\n    this.rootItem.duration = sourceContent.duration;\n    this.rootItem.endBehavior = sourceContent.endBehavior;\n    this.rootItem.composition = this;\n\n    // Create rootItem components\n    const componentPaths = sourceContent.components;\n\n    for (const componentPath of componentPaths) {\n      const component = this.getEngine().findObject<Component>(componentPath);\n\n      this.rootItem.components.push(component);\n      component.item = this.rootItem;\n    }\n    this.rootComposition = this.rootItem.getComponent(CompositionComponent);\n\n    this.width = width;\n    this.height = height;\n    this.renderOrder = baseRenderOrder;\n    this.id = sourceContent.id;\n    this.startTime = sourceContent.startTime ?? 0;\n    this.renderer = renderer;\n    this.event = event;\n    this.statistic = {\n      loadStart: scene.startTime ?? 0,\n      loadTime: scene.totalTime ?? 0,\n      compileTime: 0,\n      firstFrameTime: 0,\n    };\n    this.reusable = reusable;\n    this.speed = speed;\n    this.name = sourceContent.name;\n    this.camera = new Camera(this.name, {\n      ...sourceContent?.camera,\n      aspect: width / height,\n      pixelWidth: width,\n      pixelHeight: height,\n    });\n    this.url = scene.url;\n    this.interactive = true;\n    if (onItemMessage) {\n      this.onItemMessage = onItemMessage;\n    }\n    this.createRenderFrame();\n\n    Composition.buildItemTree(this.rootItem);\n    this.rootComposition.setChildrenRenderOrder(0);\n\n    PluginSystem.initializeComposition(this, scene);\n  }\n\n  /**\n   * 所有合成 Item 的根变换\n   */\n  get transform () {\n    return this.rootItem.transform;\n  }\n\n  /**\n   * 获取场景中的纹理数组\n   */\n  get textures () {\n    return this._textures;\n  }\n\n  /**\n   * 获取合成中所有元素\n   */\n  get items (): VFXItem[] {\n    return this.rootItem.getDescendants();\n  }\n\n  /**\n   * 获取合成当前时间\n   */\n  get time () {\n    return this.rootComposition.time;\n  }\n\n  /**\n   * 获取销毁状态\n   */\n  get isDestroyed (): boolean {\n    return this.destroyed;\n  }\n\n  set viewportMatrix (matrix: Matrix4) {\n    this.camera.setViewportMatrix(matrix);\n  }\n  get viewportMatrix () {\n    return this.camera.getViewportMatrix();\n  }\n\n  /**\n   * 获取合成的时长\n   */\n  getDuration () {\n    return this.rootItem.duration;\n  }\n\n  /**\n   * 重新开始合成\n   */\n  restart () {\n    this.reset();\n    this.forwardTime(this.startTime);\n  }\n\n  /**\n   * 设置当前合成的渲染顺序\n   * @param index - 序号，大的后绘制\n   */\n  setIndex (index: number) {\n    this.renderOrder = index;\n  }\n\n  /**\n   * 获取当前合成的渲染顺序\n   * @returns\n   */\n  getIndex (): number {\n    return this.renderOrder;\n  }\n\n  /**\n   * 设置合成的动画速度\n   * @param speed - 速度\n   */\n  setSpeed (speed: number) {\n    this.speed = speed;\n  }\n\n  /**\n   * 设置合成的可见性\n   * @since 2.0.0\n   * @param visible - 是否可见\n   */\n  setVisible (visible: boolean) {\n    this.rootItem.setVisible(visible);\n  }\n\n  /**\n   * 获取合成的动画速度\n   * @returns\n   */\n  getSpeed () {\n    return this.speed;\n  }\n\n  /**\n   *\n   */\n  play () {\n    if (this.isEnded && this.reusable) {\n      this.restart();\n    }\n    if (this.rootComposition.isStartCalled) {\n      this.setTime(this.time - this.startTime);\n      this.resume();\n    } else {\n      this.setTime(0);\n      this.resume();\n    }\n  }\n\n  /**\n   * 暂停合成的播放\n   */\n  pause () {\n    this.paused = true;\n    this.emit('pause');\n  }\n\n  /**\n   *\n   * @returns\n   */\n  getPaused () {\n    return this.paused;\n  }\n\n  /**\n   * 恢复合成的播放\n   */\n  resume () {\n    this.paused = false;\n    if (this.isEnded && this.reusable) {\n      this.restart();\n    }\n    const time = this.time;\n\n    this.emit('play', { time });\n  }\n\n  /**\n   * 跳转合成到指定时间播放\n   * @param time - 相对 startTime 的时间\n   */\n  gotoAndPlay (time: number) {\n    this.setTime(time);\n    this.emit('goto', { time });\n    this.resume();\n  }\n\n  /**\n   * 跳转合成到指定时间并暂停\n   * @param time - 相对 startTime 的时间\n   */\n  gotoAndStop (time: number) {\n    this.setTime(time);\n    this.emit('goto', { time });\n    this.pause();\n  }\n\n  /**\n   *\n   */\n  createRenderFrame () {\n    this.renderFrame = new RenderFrame({\n      camera: this.camera,\n      renderer: this.renderer,\n      globalVolume: this.globalVolume,\n      postProcessingEnabled: this.postProcessingEnabled,\n    });\n  }\n\n  /**\n   * 跳到指定时间点（不做任何播放行为）\n   * @param time - 相对 startTime 的时间\n   */\n  setTime (time: number) {\n    const speed = this.speed;\n    const pause = this.getPaused();\n\n    if (pause) {\n      this.resume();\n    }\n    this.setSpeed(1);\n    this.forwardTime(time + this.startTime);\n    this.setSpeed(speed);\n    if (pause) {\n      this.paused = true;\n    }\n  }\n\n  addItem (item: VFXItem) {\n    item.setParent(this.rootItem);\n  }\n\n  /**\n   * 获取合成上某一类型的组件\n   * @since 2.6.0\n   * @param classConstructor - 要获取的组件类型\n   * @returns 查询结果中符合类型的第一个组件\n   */\n  getComponent<T extends Component> (classConstructor: Constructor<T>): T {\n    return this.rootItem.getComponent(classConstructor);\n  }\n\n  /**\n   * 前进合成到指定时间\n   * @param time - 相对0时刻的时间\n   */\n  private forwardTime (time: number) {\n    const deltaTime = time * 1000 - this.time * 1000;\n    const reverse = deltaTime < 0;\n    const step = 15;\n    let t = Math.abs(deltaTime);\n    const ss = reverse ? -step : step;\n\n    // FIXME Update 中可能会修改合成时间，这边需要优化更新逻辑\n    for (t; t > step; t -= step) {\n      this.update(ss);\n    }\n    this.update(reverse ? -t : t);\n  }\n\n  /**\n   * 重置状态函数\n   */\n  protected reset () {\n    this.isEnded = false;\n    this.isEndCalled = false;\n    this.rootComposition.time = 0;\n  }\n\n  prepareRender () { }\n\n  /**\n   * 合成更新，针对所有 item 的更新\n   * @param deltaTime - 更新的时间步长\n   */\n  update (deltaTime: number) {\n    if (this.getPaused()) {\n      return;\n    }\n\n    // Scene VFXItem components lifetime function\n    if (!this.rootItem.isDuringPlay) {\n      this.rootItem.awake();\n      this.rootItem.beginPlay();\n    }\n\n    const previousCompositionTime = this.time;\n\n    this.updateCompositionTime(deltaTime * this.speed / 1000);\n    const deltaTimeInMs = (this.time - previousCompositionTime) * 1000;\n\n    this.sceneTicking.update.tick(deltaTimeInMs);\n    this.sceneTicking.lateUpdate.tick(deltaTimeInMs);\n\n    this.updateCamera();\n    this.prepareRender();\n\n    if (this.isEnded && !this.isEndCalled) {\n      this.isEndCalled = true;\n      this.emit('end', { composition: this });\n    }\n    if (this.shouldDispose()) {\n      this.dispose();\n    }\n  }\n\n  private shouldDispose () {\n    return this.isEnded && this.rootItem.endBehavior === spec.EndBehavior.destroy && !this.reusable;\n  }\n\n  /**\n   * 更新相机\n   * @override\n   */\n  private updateCamera () {\n    this.camera.updateMatrix();\n  }\n\n  /**\n   * 更新主合成组件\n   */\n  private updateCompositionTime (deltaTime: number) {\n    if (this.rootComposition.state === PlayState.Paused || !this.rootComposition.isActiveAndEnabled) {\n      return;\n    }\n\n    // 相对于合成开始时间的时间\n    let localTime = this.time + deltaTime - this.startTime;\n\n    if (deltaTime < 0 && localTime < 0) {\n      localTime = 0;\n    }\n\n    const duration = this.rootItem.duration;\n    const endBehavior = this.rootItem.endBehavior;\n\n    let isEnded = false;\n\n    if (localTime >= duration) {\n\n      isEnded = true;\n\n      switch (endBehavior) {\n        case spec.EndBehavior.restart: {\n          localTime = localTime % duration;\n          this.restart();\n\n          break;\n        }\n        case spec.EndBehavior.freeze: {\n          localTime = Math.min(duration, localTime);\n\n          break;\n        }\n        case spec.EndBehavior.forward: {\n\n          break;\n        }\n        case spec.EndBehavior.destroy: {\n\n          break;\n        }\n      }\n    }\n\n    this.rootComposition.time = localTime + this.startTime;\n\n    // end state changed, handle onEnd flags\n    if (this.isEnded !== isEnded) {\n      if (isEnded) {\n        this.isEnded = true;\n      } else {\n        this.isEnded = false;\n        this.isEndCalled = false;\n      }\n    }\n  }\n\n  /**\n   * 通过名称获取元素\n   * @param name - 元素名称\n   * @returns 元素对象\n   */\n  getItemByName (name: string) {\n    return this.rootItem.find(name);\n  }\n\n  /**\n   * 获取指定位置和相机连成的射线\n   * @param x\n   * @param y\n   * @returns\n   */\n  getHitTestRay (x: number, y: number): Ray {\n    const { x: a, y: b, z: c, w: d } = this.renderFrame.editorTransform;\n\n    return setRayFromCamera((x - c) / a, (y - d) / b, this.camera);\n  }\n\n  /**\n   * 获取 engine 对象\n   * @returns\n   */\n  getEngine () {\n    return this.renderer?.engine;\n  }\n\n  /**\n   * Item 求交测试，返回求交结果列表，x 和 y 是归一化到[-1, 1]区间的值，x 向右，y 向上\n   * @param x - 鼠标或触点的 x，已经归一化到[-1, 1]\n   * @param y - 鼠标或触点的 y，已经归一化到[-1, 1]\n   * @param force - 是否强制求交，没有交互信息的 Item 也要进行求交测试\n   * @param options - 最大求交数和求交时的回调\n   */\n  hitTest (x: number, y: number, force?: boolean, options?: CompositionHitTestOptions): Region[] {\n    if (this.isDestroyed || !this.interactive) {\n      return [];\n    }\n    const regions: Region[] = [];\n    const ray = this.getHitTestRay(x, y);\n\n    this.rootComposition.hitTest(ray, x, y, regions, force, options);\n\n    return regions;\n  }\n\n  /**\n   * InteractItem 生命周期开始时的调用\n   * @param item - 交互元素\n   * @param type - 交互类型\n   */\n  addInteractiveItem (item: VFXItem, type: spec.InteractType) {\n    if (type === spec.InteractType.MESSAGE) {\n      this.onItemMessage?.({\n        name: item.name,\n        phrase: spec.MESSAGE_ITEM_PHRASE_BEGIN,\n        id: item.id,\n        compositionId: this.id,\n      });\n      item.emit('message', {\n        name: item.name,\n        phrase: spec.MESSAGE_ITEM_PHRASE_BEGIN,\n        id: item.id,\n      });\n\n      return item.id;\n    }\n  }\n\n  /**\n   * InteractItem 生命周期结束时的调用\n   * @param item - 交互元素\n   * @param type - 交互类型\n   */\n  removeInteractiveItem (item: VFXItem, type: spec.InteractType) {\n    // MESSAGE ITEM 的结束行为\n    if (type === spec.InteractType.MESSAGE) {\n      this.onItemMessage?.({\n        name: item.name,\n        phrase: spec.MESSAGE_ITEM_PHRASE_END,\n        id: item.id,\n        compositionId: this.id,\n      });\n      item.emit('message', {\n        name: item.name,\n        phrase: spec.MESSAGE_ITEM_PHRASE_END,\n        id: item.id,\n      });\n    }\n  }\n\n  /**\n   * 销毁 Item\n   * @internal\n   * @param item - 需要销毁的 item\n   */\n  destroyItem (item: VFXItem) {\n    // 预合成元素销毁时销毁其中的item\n    // if (item.type !== spec.ItemType.composition) {\n    // this.content.removeItem(item);\n    // 预合成中的元素移除\n    // this.refContent.forEach(content => content.removeItem(item));\n    // removeItem(this.items, item);\n    // }\n  }\n\n  lost (e: Event): void {\n    this.videoState = this.textures.map(tex => {\n      if ('video' in tex.source) {\n        tex.source.video.pause();\n\n        return tex.source.video.currentTime;\n      }\n    });\n\n    this.textures.map(tex => tex.dispose());\n    this.dispose();\n  }\n\n  /**\n   * 合成对象销毁\n   */\n  dispose (): void {\n    if (this.destroyed) {\n      return;\n    }\n    this.destroyed = true;\n\n    for (const texture of this.textures) {\n      texture.dispose();\n    }\n    this._textures = [];\n\n    for (const video of this.videos) {\n      video.pause();\n      video.removeAttribute('src');\n      video.load();\n    }\n    this.videos = [];\n\n    this.rootItem.dispose();\n    // FIXME: 注意这里增加了renderFrame销毁\n    this.renderFrame.dispose();\n    PluginSystem.destroyComposition(this);\n\n    this.update = () => {\n      if (!__DEBUG__) {\n        logger.error(`Update disposed composition: ${this.name}.`);\n      }\n    };\n\n    this.dispose = noop;\n    this.renderer.engine.removeComposition(this);\n\n    if (this.getEngine().env === PLAYER_OPTIONS_ENV_EDITOR) {\n      return;\n    }\n\n    this.renderer.clear({\n      stencilAction: TextureLoadAction.clear,\n      clearStencil: 0,\n      depthAction: TextureLoadAction.clear,\n      clearDepth: 1,\n      colorAction: TextureLoadAction.clear,\n      clearColor: [0, 0, 0, 0],\n    });\n  }\n\n  /**\n   * 编辑器使用的 transform 修改方法\n   * @internal\n   * @param scale - 缩放比例\n   * @param dx - x偏移量\n   * @param dy - y偏移量\n   */\n  setEditorTransform (scale: number, dx: number, dy: number) {\n    this.renderFrame.editorTransform.set(scale, scale, dx, dy);\n  }\n\n  /**\n   * 合成整体在水平方向移动 x 像素，垂直方向移动 y 像素\n   */\n  translateByPixel (x: number, y: number) {\n    if (!this.renderer) {\n      console.warn('Renderer not assigned. Operation aborted.');\n\n      return;\n    }\n    this.rootItem.translateByPixel(x, y);\n  }\n\n  /**\n   * 设置合成在画布上的像素位置\n   * Tips:\n   *  - 坐标原点在 canvas 左上角，x 正方向水平向右， y 正方向垂直向下\n   *  - 设置后会覆盖原有的位置信息\n   * @param x - x 坐标\n   * @param y - y 坐标\n   */\n  setPositionByPixel (x: number, y: number) {\n    if (!this.renderer) {\n      console.warn('Renderer not assigned. Operation aborted.');\n\n      return;\n    }\n    this.rootItem.setPositionByPixel(x, y);\n  }\n\n  /**\n   * 设置合成在 3D 坐标轴上相对当前的位移\n   */\n  translate (x: number, y: number, z: number) {\n    this.rootItem.translate(x, y, z);\n  }\n\n  /**\n   * 设置合成在 3D 坐标轴上相对原点的位移\n   */\n  setPosition (x: number, y: number, z: number) {\n    this.rootItem.setPosition(x, y, z);\n  }\n\n  /**\n   * 设置合成在 3D 坐标轴上相对当前的旋转（角度）\n   */\n  rotate (x: number, y: number, z: number) {\n    this.rootItem.rotate(x, y, z);\n  }\n\n  /**\n   * 设置合成在 3D 坐标轴上的相对原点的旋转（角度）\n   */\n  setRotation (x: number, y: number, z: number) {\n    this.rootItem.setRotation(x, y, z);\n  }\n  /**\n   * 设置合成在 3D 坐标轴上相对当前的缩放\n   */\n  scale (x: number, y: number, z: number) {\n    this.rootItem.scale(x, y, z);\n  }\n\n  /**\n   * 设置合成在 3D 坐标轴上的缩放\n   */\n  setScale (x: number, y: number, z: number) {\n    this.rootItem.setScale(x, y, z);\n  }\n\n  /**\n   * 卸载贴图纹理方法，减少内存\n   */\n  offloadTexture () {\n    if (!this.textureOffloaded) {\n      this.textures.forEach(tex => tex && tex.offloadData());\n      this.textureOffloaded = true;\n    }\n  }\n\n  /**\n   * 重新加载纹理\n   */\n  async reloadTexture () {\n    if (this.textureOffloaded) {\n      await Promise.all(this.textures.map(tex => tex?.reloadData()));\n      this.textureOffloaded = false;\n    }\n  }\n}\n","import { Euler } from '@galacean/effects-math/es/core/euler';\nimport { Quaternion } from '@galacean/effects-math/es/core/quaternion';\nimport { Vector3 } from '@galacean/effects-math/es/core/vector3';\nimport * as spec from '@galacean/effects-specification';\nimport type { Component } from './components';\nimport { EffectComponent, RendererComponent } from './components';\nimport { Composition } from './composition';\nimport { HELP_LINK } from './constants';\nimport { effectsClass } from './decorators';\nimport { EffectsObject } from './effects-object';\nimport type { Engine } from './engine';\nimport type { EventEmitterListener, EventEmitterOptions, ItemEvent } from './events';\nimport { EventEmitter } from './events';\nimport type {\n  BoundingBoxData, HitTestBoxParams, HitTestCustomParams, HitTestSphereParams,\n  HitTestTriangleParams,\n} from './plugins';\nimport { ParticleSystem } from './plugins';\nimport { Transform } from './transform';\nimport type { Constructor, Disposable } from './utils';\nimport { generateGUID, removeItem } from './utils';\n\n/**\n * VFX 元素，包含元素的变换、组件、子元素等信息。\n */\n@effectsClass(spec.DataType.VFXItemData)\nexport class VFXItem extends EffectsObject implements Disposable {\n  /**\n   * 元素绑定的父元素\n   */\n  parent?: VFXItem;\n  /**\n   * 元素的子元素列表\n   */\n  children: VFXItem[] = [];\n  /**\n   * 元素的变换包含位置、旋转、缩放。\n   */\n  transform: Transform = new Transform();\n  /**\n   * 元素动画的当前时间\n   */\n  time = -1;\n  /**\n   * 元素动画的持续时间\n   */\n  duration = 0;\n  /**\n   * 父元素的 id\n   */\n  parentId?: string;\n  /**\n   * 元素动画结束时行为（如何处理元素）\n   */\n  endBehavior: spec.EndBehavior = spec.EndBehavior.forward;\n  /**\n   * 元素名称\n   */\n  name: string;\n  /**\n   * 元素 id 唯一\n   * @deprecated 2.7.0 Please use `getInstanceId` instead\n   */\n  id: string;\n  type: spec.ItemType = spec.ItemType.base;\n  props: spec.VFXItemData;\n  components: Component[] = [];\n  isDuringPlay = false;\n\n  /**\n   * 元素是否激活\n   */\n  private active = true;\n  /**\n   * 元素组件是否显示，用于批量开关元素组件\n   */\n  private visible = true;\n  private listIndex = 0;\n  private isEnabled = false;\n  private eventProcessor: EventEmitter<ItemEvent> = new EventEmitter();\n  /**\n   * 合成属性\n   */\n  private _composition: Composition | null;\n\n  /**\n   *\n   * @param item\n   * @returns\n   */\n  static isComposition (item: VFXItem) {\n    return item.type === spec.ItemType.composition;\n  }\n\n  /**\n   *\n   * @param item\n   * @returns\n   */\n  static isSprite (item: VFXItem) {\n    return item.type === spec.ItemType.sprite;\n  }\n\n  /**\n   *\n   * @param item\n   * @returns\n   */\n  static isParticle (item: VFXItem) {\n    return item.type === spec.ItemType.particle;\n  }\n\n  /**\n   *\n   * @param item\n   * @returns\n   */\n  static isNull (item: VFXItem) {\n    return item.type === spec.ItemType.null;\n  }\n\n  /**\n   *\n   * @param item\n   * @returns\n   */\n  static isTree (item: VFXItem) {\n    return item.type === spec.ItemType.tree;\n  }\n\n  /**\n   *\n   * @param item\n   * @returns\n   */\n  static isCamera (item: VFXItem) {\n    return item.type === spec.ItemType.camera;\n  }\n\n  /**\n   *\n   * @param ancestorCandidate\n   * @param descendantCandidate\n   * @returns\n   */\n  static isAncestor (\n    ancestorCandidate: VFXItem,\n    descendantCandidate: VFXItem,\n  ) {\n    let current = descendantCandidate.parent;\n\n    while (current) {\n      if (current === ancestorCandidate) {\n        return true;\n      }\n      current = current.parent;\n    }\n\n    return false;\n  }\n\n  /**\n   *\n   * @param engine\n   * @param props\n   */\n  constructor (\n    engine: Engine,\n    props?: spec.Item,\n  ) {\n    super(engine);\n    this.name = 'VFXItem';\n    this.transform.name = this.name;\n    this.transform.engine = engine;\n    if (props) {\n      this.fromData(props as spec.VFXItemData);\n    }\n  }\n\n  /**\n   * 获取元素的合成\n   */\n  get composition (): Composition | null {\n    return this._composition;\n  }\n\n  /**\n   * 设置元素的合成\n   */\n  set composition (value: Composition) {\n    this._composition = value;\n\n    for (const child of this.children) {\n      if (!child.composition) {\n        child.composition = value;\n      }\n    }\n  }\n\n  /**\n   * 播放完成后是否需要再使用，是的话生命周期结束后不会 dispose\n   */\n  get compositionReusable (): boolean {\n    return this.composition?.reusable ?? false;\n  }\n\n  /**\n   * 元素在合成中的索引\n   */\n  get renderOrder () {\n    return this.listIndex;\n  }\n  set renderOrder (value: number) {\n    if (this.listIndex !== value) {\n      this.listIndex = value;\n      for (const component of this.components) {\n        if (component instanceof RendererComponent) {\n          component.priority = value;\n        }\n      }\n    }\n  }\n\n  /**\n   * 元素监听事件\n   * @param eventName - 事件名称\n   * @param listener - 事件监听器\n   * @param options - 事件监听器选项\n   * @returns\n   */\n  on<E extends keyof ItemEvent> (\n    eventName: E,\n    listener: EventEmitterListener<ItemEvent[E]>,\n    options?: EventEmitterOptions,\n  ) {\n    this.eventProcessor.on(eventName, listener, options);\n  }\n\n  /**\n   * 移除事件监听器\n   * @param eventName - 事件名称\n   * @param listener - 事件监听器\n   * @returns\n   */\n  off<E extends keyof ItemEvent> (\n    eventName: E,\n    listener: EventEmitterListener<ItemEvent[E]>,\n  ) {\n    this.eventProcessor.off(eventName, listener);\n  }\n\n  /**\n   * 一次性监听事件\n   * @param eventName - 事件名称\n   * @param listener - 事件监听器\n   */\n  once<E extends keyof ItemEvent> (\n    eventName: E,\n    listener: EventEmitterListener<ItemEvent[E]>,\n  ) {\n    this.eventProcessor.once(eventName, listener);\n  }\n\n  /**\n   * 触发事件\n   * @param eventName - 事件名称\n   * @param args - 事件参数\n   */\n  emit<E extends keyof ItemEvent> (\n    eventName: E,\n    ...args: ItemEvent[E]\n  ) {\n    this.eventProcessor.emit(eventName, ...args);\n  }\n\n  /**\n   * 获取事件名称对应的所有监听器\n   * @param eventName - 事件名称\n   * @returns - 返回事件名称对应的所有监听器\n   */\n  getListeners<E extends keyof ItemEvent> (eventName: E) {\n    return this.eventProcessor.getListeners(eventName);\n  }\n\n  /**\n   * 添加组件\n   * @param classConstructor - 要添加的组件\n   */\n  addComponent<T extends Component> (classConstructor: Constructor<T>): T {\n    const newComponent = new classConstructor(this.engine);\n\n    this.components.push(newComponent);\n    newComponent.setVFXItem(this);\n\n    return newComponent;\n  }\n\n  /**\n   * 获取某一类型的组件。如果当前元素绑定了多个同类型的组件只返回第一个\n   * @param classConstructor - 要获取的组件类型\n   * @returns 查询结果中符合类型的第一个组件\n   */\n  getComponent<T extends Component> (classConstructor: Constructor<T>): T {\n    let res;\n\n    for (const com of this.components) {\n      if (com instanceof classConstructor) {\n        res = com;\n\n        break;\n      }\n    }\n\n    return res as T;\n  }\n\n  /**\n   * 获取某一类型的所有组件\n   * @param classConstructor - 要获取的组件\n   * @returns 一个组件列表，包含所有符合类型的组件\n   */\n  getComponents<T extends Component> (classConstructor: Constructor<T>) {\n    const res = [];\n\n    for (const com of this.components) {\n      if (com instanceof classConstructor) {\n        res.push(com);\n      }\n    }\n\n    return res;\n  }\n\n  getDescendants (directDescendantsOnly?: boolean, predicate?: (node: VFXItem) => boolean): VFXItem[] {\n    const results: VFXItem[] = [];\n\n    this.getDescendantsInternal(results, directDescendantsOnly, predicate);\n\n    return results;\n  }\n\n  setParent (vfxItem: VFXItem) {\n    if (vfxItem === this && !vfxItem) {\n      return;\n    }\n    if (this.parent) {\n      removeItem(this.parent.children, this);\n    }\n    this.parent = vfxItem;\n    this.transform.parentTransform = vfxItem.transform;\n    vfxItem.children.push(this);\n    if (!this.composition && vfxItem.composition) {\n      this.composition = vfxItem.composition;\n    }\n    if (!this.isDuringPlay && vfxItem.isDuringPlay) {\n      this.awake();\n      this.beginPlay();\n    }\n  }\n\n  /**\n   * 通过指定 r、g、b、a 值设置元素的颜色\n   * @param {number} r\n   * @param {number} g\n   * @param {number} b\n   * @param {number} a\n   * @internal\n   * @deprecated 2.6.0 Please use `Component.setColor` instead\n   */\n  setColor (r: number, g: number, b: number, a: number) {\n  }\n\n  /**\n   * 设置元素的透明度\n   * @param opacity - 透明度值，范围 [0,1]\n   * @internal\n   * @deprecated 2.6.0 Please use `Component.setColor` instead\n   */\n  setOpacity (opacity: number) {\n  }\n\n  /**\n   * 激活或停用 VFXItem\n   */\n  setActive (value: boolean) {\n    if (this.active !== !!value) {\n      this.active = !!value;\n      this.onActiveChanged();\n    }\n  }\n\n  /**\n   * 当前 VFXItem 是否激活\n   */\n  get isActive () {\n    return this.active;\n  }\n  /**\n   * @since 2.6.0\n   */\n  set isActive (value: boolean) {\n    this.setActive(value);\n  }\n\n  /**\n   * 设置元素的显隐，该设置会批量开关元素组件\n   */\n  setVisible (visible: boolean) {\n    for (const component of this.components) {\n      component.enabled = visible;\n    }\n    this.visible = visible;\n  }\n\n  /**\n   * 元素组件显隐状态\n   */\n  get isVisible () {\n    return this.visible;\n  }\n\n  /**\n   * 元素组件显隐状态\n   * @deprecated use isVisible instead\n   */\n  getVisible () {\n    return this.visible;\n  }\n\n  /**\n   * 获取元素变换包括位置、旋转、缩放\n   * @param transform 将元素变换拷贝到该对象，并将其作为返回值\n   * @returns 元素变换的拷贝\n   */\n  getWorldTransform (transform?: Transform): Transform {\n    const tf = transform ?? new Transform({\n      valid: true,\n    });\n\n    tf.cloneFromMatrix(this.transform.getWorldMatrix());\n\n    return tf;\n  }\n\n  /**\n   * 设置元素在 3D 坐标轴上相对移动\n   */\n  translate (x: number, y: number, z: number) {\n    this.transform.translate(x, y, z);\n  }\n  /**\n   * 设置元素在 3D 坐标轴上相对旋转（角度）\n   */\n  rotate (x: number, y: number, z: number) {\n    const euler = new Euler(x, y, z);\n    const q = Quaternion.fromEuler(euler);\n\n    q.conjugate();\n    this.transform.rotateByQuat(q);\n  }\n  /**\n   * 设置元素在 3D 坐标轴上相对缩放\n   */\n  scale (x: number, y: number, z: number) {\n    this.transform.scaleBy(x, y, z);\n  }\n\n  /**\n   * 设置本地坐标位置\n   */\n  setPosition (x: number, y: number, z: number) {\n    this.transform.setPosition(x, y, z);\n  }\n  /**\n   * 设置本地坐标欧拉旋转\n   */\n  setRotation (x: number, y: number, z: number) {\n    this.transform.setRotation(x, y, z);\n  }\n  /**\n   * 设置本地坐标缩放\n   */\n  setScale (x: number, y: number, z: number) {\n    this.transform.setScale(x, y, z);\n  }\n\n  /**\n   * 设置世界坐标位置\n   * @param x - 世界坐标 x\n   * @param y - 世界坐标 y\n   * @param z - 世界坐标 z\n   */\n  setWorldPosition (x: number, y: number, z: number) {\n    this.transform.setWorldPosition(x, y, z);\n  }\n\n  /**\n   * 设置元素在画布上的像素位置\n   * Tips:\n   *  - 坐标原点在 canvas 左上角，x 正方向水平向右， y 正方向垂直向下\n   *  - 设置后会覆盖原有的位置信息\n   * @param x - x 坐标\n   * @param y - y 坐标\n   */\n  setPositionByPixel (x: number, y: number) {\n    if (this.composition) {\n      const { z } = this.transform.getWorldPosition();\n      const { x: rx, y: ry } = this.composition.camera.getInverseVPRatio(z);\n      const { width, height } = this.composition.getEngine().canvas.getBoundingClientRect();\n\n      this.transform.setPosition((2 * x / width - 1) * rx, (1 - 2 * y / height) * ry, z);\n    }\n  }\n\n  translateByPixel (x: number, y: number) {\n    if (this.composition) {\n      const { width, height } = this.composition.getEngine().canvas.getBoundingClientRect();\n      const { z } = this.transform.getWorldPosition();\n      const { x: rx, y: ry } = this.composition.camera.getInverseVPRatio(z);\n\n      this.transform.translate(2 * x * rx / width, -2 * y * ry / height, 0);\n    }\n  }\n\n  /**\n   * 获取元素包围盒\n   * @override\n   */\n  getBoundingBox (): void | BoundingBoxData {\n    // OVERRIDE\n  }\n\n  /**\n   * 获取元素用于计算光线投射的面片类型和参数\n   * @override\n   * @param force - 元素没有开启交互也返回参数\n   */\n  getHitTestParams (force?: boolean): void | HitTestBoxParams | HitTestTriangleParams | HitTestSphereParams | HitTestCustomParams {\n    // OVERRIDE\n  }\n\n  /**\n   * 获取元素当前世界坐标\n   */\n  getCurrentPosition (): Vector3 {\n    const pos = new Vector3();\n\n    this.transform.assignWorldTRS(pos);\n\n    return pos;\n  }\n\n  find (name: string): VFXItem | undefined {\n    if (this.name === name) {\n      return this;\n    }\n\n    const queue: VFXItem[] = [];\n\n    queue.push(...this.children);\n    let index = 0;\n\n    while (index < queue.length) {\n      const item = queue[index];\n\n      index++;\n      if (item.name === name) {\n        return item;\n      }\n      queue.push(...item.children);\n    }\n\n    return undefined;\n  }\n\n  /**\n   * 复制 VFXItem，返回一个新的 VFXItem\n   * @since 2.4.0\n   * @returns 复制的新 VFXItem\n   */\n  duplicate () {\n    const previousObjectIDMap: Map<EffectsObject, string> = new Map();\n\n    this.gatherPreviousObjectID(previousObjectIDMap);\n    // 重新设置当前元素和组件的 ID 以及子元素和子元素组件的 ID，避免实例化新的对象时产生碰撞\n    this.resetGUID();\n    const newItem = this.engine.findObject<VFXItem>({ id: this.defination.id });\n\n    newItem.resetGUID();\n    this.resetGUID(previousObjectIDMap);\n\n    if (this.composition) {\n      newItem.setParent(this.composition.rootItem);\n    }\n\n    return newItem;\n  }\n\n  /**\n   * @internal\n   */\n  beginPlay () {\n    this.isDuringPlay = true;\n\n    if (this.composition && this.active && !this.isEnabled) {\n      this.onEnable();\n    }\n\n    for (const child of this.children) {\n      if (!child.isDuringPlay) {\n        child.beginPlay();\n      }\n    }\n  }\n\n  /**\n   * @internal\n   */\n  awake () {\n    for (const component of this.components) {\n      if (!component.isAwakeCalled) {\n        component.onAwake();\n        component.isAwakeCalled = true;\n      }\n    }\n    for (const child of this.children) {\n      child.awake();\n    }\n  }\n\n  /**\n   * @internal\n   */\n  onActiveChanged () {\n    if (!this.isEnabled) {\n      this.onEnable();\n    } else {\n      this.onDisable();\n    }\n  }\n\n  /**\n   * @internal\n   */\n  onEnable () {\n    this.isEnabled = true;\n    for (const component of this.components) {\n      if (component.enabled && !component.isStartCalled) {\n        component.onStart();\n        component.isStartCalled = true;\n      }\n    }\n    for (const component of this.components) {\n      if (component.enabled && !component.isEnableCalled) {\n        component.enable();\n      }\n    }\n  }\n\n  /**\n   * @internal\n   */\n  onDisable () {\n    this.isEnabled = false;\n    for (const component of this.components) {\n      if (component.enabled && component.isEnableCalled) {\n        component.disable();\n      }\n    }\n  }\n\n  override fromData (data: spec.VFXItemData): void {\n    super.fromData(data);\n    const {\n      id, name, parentId, endBehavior, transform,\n      duration = 0, visible = true,\n    } = data;\n\n    this.props = data;\n    this.type = data.type;\n    this.id = id.toString(); // TODO 老数据 id 是 number，需要转换\n    this.name = name;\n\n    if (transform) {\n      this.transform.fromData(transform);\n    }\n\n    this.transform.name = this.name;\n    this.transform.engine = this.engine;\n    this.parentId = parentId;\n    this.duration = duration;\n    this.endBehavior = endBehavior;\n\n    if (!data.content) {\n      data.content = { options: {} };\n    }\n\n    if (duration < 0) {\n      throw new Error(`Item duration can't be less than 0, see ${HELP_LINK['Item duration can\\'t be less than 0']}.`);\n    }\n\n    if (data.components) {\n      this.components.length = 0;\n      for (const componentPath of data.components) {\n        const component = this.engine.findObject<Component>(componentPath);\n\n        this.components.push(component);\n        // TODO ParticleSystemRenderer 现在是动态生成的，后面需要在 json 中单独表示为一个组件\n        if (component instanceof ParticleSystem) {\n          if (!this.components.includes(component.renderer)) {\n            this.components.push(component.renderer);\n          }\n        }\n      }\n    }\n\n    if (VFXItem.isComposition(this)) {\n      this.instantiatePreComposition();\n    }\n\n    this.setVisible(visible);\n  }\n\n  override toData (): void {\n    this.defination.id = this.guid;\n    this.defination.transform = this.transform.toData();\n    this.defination.dataType = spec.DataType.VFXItemData;\n    if (this.parent?.name !== 'rootItem') {\n      this.defination.parentId = this.parent?.guid;\n    }\n\n    // TODO 统一 sprite 等其他组件的序列化逻辑\n    if (!this.defination.components) {\n      this.defination.components = [];\n      for (const component of this.components) {\n        if (component instanceof EffectComponent) {\n          this.defination.components.push(component);\n        }\n      }\n    }\n    this.defination.content = {};\n  }\n\n  /**\n   * 销毁元素\n   */\n  override dispose (): void {\n    this.resetChildrenParent();\n\n    if (this.composition) {\n      this.composition.destroyItem(this);\n      // component 调用 dispose() 会将自身从 this.components 数组删除，slice() 避免迭代错误\n      for (const component of this.components.slice()) {\n        component.dispose();\n      }\n      this.components = [];\n      this._composition = null;\n      this.transform.setValid(false);\n    }\n\n    super.dispose();\n  }\n\n  private resetChildrenParent () {\n    // GE 父元素销毁子元素继承逻辑\n    // 如果有父对象，销毁时子对象继承父对象。\n    for (const child of this.children) {\n      if (this.parent) {\n        child.setParent(this.parent);\n      }\n    }\n    if (this.parent) {\n      removeItem(this.parent?.children, this);\n    }\n    // const contentItems = compositonVFXItem.getComponent(CompositionComponent)!.items;\n\n    // contentItems.splice(contentItems.indexOf(this), 1);\n\n    // else {\n    //   // 普通元素正常销毁逻辑, 子元素不继承\n    // if (this.parent) {\n    //   removeItem(this.parent?.children, this);\n    // }\n    // }\n  }\n\n  private instantiatePreComposition () {\n    const compositionContent = this.props.content as unknown as spec.CompositionContent;\n    const refId = compositionContent.options.refId;\n    const props = this.engine.findEffectsObjectData(refId);\n\n    if (!props) {\n      throw new Error(`Referenced precomposition with Id: ${refId} does not exist.`);\n    }\n\n    //@ts-expect-error TODO update spec.\n    const componentPaths = props.components as spec.DataPath[];\n    const prevInstanceId = this.getInstanceId();\n\n    // Set the current preComposition item id to the referenced composition id to prevent the composition component from not finding the correct item\n    this.setInstanceId(props.id);\n    for (const componentPath of componentPaths) {\n      const component = this.engine.findObject<Component>(componentPath);\n\n      component.item = this;\n      this.components.push(component);\n      component.setInstanceId(generateGUID());\n    }\n\n    Composition.buildItemTree(this);\n\n    const resetGUIDRecursive = (item: VFXItem) => {\n      item.setInstanceId(generateGUID());\n\n      for (const component of item.components) {\n        component.setInstanceId(generateGUID());\n      }\n\n      if (!VFXItem.isComposition(item)) {\n        for (const child of item.children) {\n          resetGUIDRecursive(child);\n        }\n      }\n    };\n\n    for (const child of this.children) {\n      resetGUIDRecursive(child);\n    }\n\n    this.setInstanceId(prevInstanceId);\n  }\n\n  private resetGUID (previousObjectIDMap?: Map<EffectsObject, string>) {\n    const itemGUID = previousObjectIDMap?.get(this) ?? generateGUID();\n\n    this.setInstanceId(itemGUID);\n    for (const component of this.components) {\n      const componentGUID = previousObjectIDMap?.get(component) ?? generateGUID();\n\n      component.setInstanceId(componentGUID);\n    }\n\n    for (const child of this.children) {\n      child.resetGUID(previousObjectIDMap);\n    }\n  }\n\n  private gatherPreviousObjectID (previousObjectIDMap: Map<EffectsObject, string>) {\n    previousObjectIDMap.set(this, this.getInstanceId());\n    for (const component of this.components) {\n      previousObjectIDMap.set(component, component.getInstanceId());\n    }\n\n    for (const child of this.children) {\n      child.gatherPreviousObjectID(previousObjectIDMap);\n    }\n  }\n\n  private getDescendantsInternal (\n    results: VFXItem[],\n    directDescendantsOnly = false,\n    predicate?: (node: VFXItem) => boolean,\n  ): void {\n    if (!this.children) {\n      return;\n    }\n\n    for (let index = 0; index < this.children.length; index++) {\n      const item = this.children[index];\n\n      if (!predicate || predicate(item)) {\n        results.push(item);\n      }\n\n      if (!directDescendantsOnly) {\n        item.getDescendantsInternal(results, false, predicate);\n      }\n    }\n  }\n}\n\nexport namespace Item {\n  export function is<T extends spec.Item> (item: spec.Item, type: spec.ItemType): item is T {\n    return item.type === type;\n  }\n\n  export function isComposition (item: spec.Item): item is spec.CompositionItem {\n    return item.type === spec.ItemType.composition;\n  }\n\n  export function isParticle (item: spec.Item): item is spec.ParticleItem {\n    return item.type === spec.ItemType.particle;\n  }\n\n  export function isNull (item: spec.Item): item is spec.NullItem {\n    return item.type === spec.ItemType.null;\n  }\n}\n","import type { Ray } from '@galacean/effects-math/es/core/ray';\nimport { Vector2 } from '@galacean/effects-math/es/core/vector2';\nimport { Vector3 } from '@galacean/effects-math/es/core/vector3';\nimport * as spec from '@galacean/effects-specification';\nimport type { Composition, CompositionHitTestOptions } from '../composition';\nimport type { Region, TrackAsset } from '../plugins';\nimport { TimelineInstance, HitTestType, PlayState, TimelineAsset } from '../plugins';\nimport { noop } from '../utils';\nimport { VFXItem } from '../vfx-item';\nimport { effectsClass, serialize } from '../decorators';\nimport { Component } from './component';\n\nexport interface SceneBinding {\n  key: TrackAsset,\n  value: VFXItem,\n}\n\nexport interface SceneBindingData {\n  key: spec.DataPath,\n  value: spec.DataPath,\n}\n\n/**\n * @since 2.0.0\n */\n@effectsClass('CompositionComponent')\nexport class CompositionComponent extends Component {\n  time = 0;\n  @serialize()\n  items: VFXItem[] = [];  // 场景的所有元素\n\n  /**\n   * @internal\n   */\n  state: PlayState = PlayState.Playing;\n\n  private reusable = false;\n  @serialize()\n  private sceneBindings: SceneBinding[] = [];\n  @serialize()\n  private timelineAsset: TimelineAsset;\n  private timelineInstance: TimelineInstance;\n\n  override onStart (): void {\n    if (!this.timelineAsset) {\n      this.timelineAsset = new TimelineAsset(this.engine);\n    }\n    // this.resolveBindings();\n    this.timelineInstance = new TimelineInstance(this.timelineAsset, this.sceneBindings);\n\n    this.item.composition?.refContent.push(this.item);\n  }\n\n  getReusable () {\n    return this.reusable;\n  }\n\n  pause () {\n    this.state = PlayState.Paused;\n  }\n\n  resume () {\n    this.state = PlayState.Playing;\n  }\n\n  override onUpdate (dt: number): void {\n    if (this.state === PlayState.Paused) {\n      return;\n    }\n    const time = this.time;\n\n    this.timelineInstance.setTime(time);\n\n    this.timelineInstance.evaluate(dt / 1000);\n  }\n\n  override onEnable () {\n    this.item.getDescendants(false, item => {\n      item.setActive(true);\n\n      return false;\n    });\n  }\n\n  override onDisable () {\n    this.item.getDescendants(false, item => {\n      item.setActive(false);\n\n      return false;\n    });\n  }\n\n  override onDestroy (): void {\n    const items = this.item.getDescendants();\n\n    items.forEach(item => item.dispose());\n  }\n\n  hitTest (\n    ray: Ray,\n    x: number,\n    y: number,\n    regions: Region[],\n    force?: boolean,\n    options?: CompositionHitTestOptions,\n  ): boolean {\n    const isHitTestSuccess = this.hitTestRecursive(this.item, ray, x, y, regions, force, options);\n\n    // 子元素碰撞测试成功加入当前预合成元素，判断是否是合成根元素，根元素不加入\n    if (isHitTestSuccess && this.item !== this.item.composition?.rootItem) {\n      const item = this.item;\n      const lastRegion = regions[regions.length - 1];\n      const hitPositions: Vector3[] = lastRegion.hitPositions;\n\n      const region = {\n        id: item.getInstanceId(),\n        name: item.name,\n        position: hitPositions[hitPositions.length - 1],\n        parentId: item.parentId,\n        hitPositions,\n        behavior: spec.InteractBehavior.NONE,\n        item: item,\n        composition: item.composition as Composition,\n      };\n\n      regions.push(region);\n    }\n\n    return isHitTestSuccess;\n  }\n\n  private hitTestRecursive (\n    item: VFXItem,\n    ray: Ray,\n    x: number,\n    y: number,\n    regions: Region[],\n    force?: boolean,\n    options?: CompositionHitTestOptions\n  ): boolean {\n    const hitPositions: Vector3[] = [];\n    const stop = options?.stop || noop;\n    const skip = options?.skip || noop;\n    const maxCount = options?.maxCount;\n\n    if (maxCount !== undefined && regions.length >= maxCount) {\n      return false;\n    }\n\n    let hitTestSuccess = false;\n\n    for (const hitTestItem of item.children) {\n      if (\n        hitTestItem.isActive\n        && hitTestItem.transform.getValid()\n        && !skip(hitTestItem)\n      ) {\n        const hitParams = hitTestItem.getHitTestParams(force);\n\n        if (hitParams) {\n          let success = false;\n          const intersectPoint = new Vector3();\n\n          if (hitParams.type === HitTestType.triangle) {\n\n            const { triangles, backfaceCulling } = hitParams;\n\n            for (let j = 0; j < triangles.length; j++) {\n              const triangle = triangles[j];\n\n              if (ray.intersectTriangle(triangle, intersectPoint, backfaceCulling)) {\n                success = true;\n                hitPositions.push(intersectPoint);\n\n                break;\n              }\n            }\n          } else if (hitParams.type === HitTestType.box) {\n            const { center, size } = hitParams;\n            const boxMin = center.clone().addScaledVector(size, 0.5);\n            const boxMax = center.clone().addScaledVector(size, -0.5);\n\n            if (ray.intersectBox({ min: boxMin, max: boxMax }, intersectPoint)) {\n              success = true;\n              hitPositions.push(intersectPoint);\n            }\n          } else if (hitParams.type === HitTestType.sphere) {\n            const { center, radius } = hitParams;\n\n            if (ray.intersectSphere({ center, radius }, intersectPoint)) {\n              success = true;\n              hitPositions.push(intersectPoint);\n            }\n          } else if (hitParams.type === HitTestType.custom) {\n            const tempPosition = hitParams.collect(ray, new Vector2(x, y));\n\n            if (tempPosition && tempPosition.length > 0) {\n              tempPosition.forEach(pos => {\n                hitPositions.push(pos);\n              });\n              success = true;\n            }\n          }\n          if (success) {\n            const region = {\n              id: hitTestItem.getInstanceId(),\n              name: hitTestItem.name,\n              position: hitPositions[hitPositions.length - 1],\n              parentId: hitTestItem.parentId,\n              hitPositions,\n              behavior: hitParams.behavior,\n              item: hitTestItem,\n              composition: this.item.composition as Composition,\n            };\n\n            regions.push(region);\n            hitTestSuccess = true;\n\n            if (stop(region)) {\n              return true;\n            }\n          }\n        }\n      }\n\n      if (VFXItem.isComposition(hitTestItem)) {\n        if (hitTestItem.getComponent(CompositionComponent).hitTest(ray, x, y, regions, force, options)) {\n          hitTestSuccess = true;\n        }\n      } else {\n        if (this.hitTestRecursive(hitTestItem, ray, x, y, regions, force, options)) {\n          hitTestSuccess = true;\n        }\n      }\n    }\n\n    return hitTestSuccess;\n  }\n\n  /**\n   * 设置当前合成子元素的渲染顺序\n   * @internal\n   */\n  setChildrenRenderOrder (startOrder: number): number {\n    for (const item of this.items) {\n      item.renderOrder = startOrder++;\n\n      const subCompositionComponent = item.getComponent(CompositionComponent);\n\n      if (subCompositionComponent) {\n        startOrder = subCompositionComponent.setChildrenRenderOrder(startOrder);\n      }\n    }\n\n    return startOrder;\n  }\n\n  override fromData (data: any): void {\n    super.fromData(data);\n  }\n}\n","import { serialize } from '../decorators';\nimport type { Engine } from '../engine';\nimport { MaskProcessor } from '../material/mask-ref-manager';\nimport type { Maskable } from '../material/types';\nimport { setMaskMode } from '../material/utils';\nimport type { BoundingBoxTriangle, HitTestTriangleParams } from '../plugins';\nimport { MeshCollider } from '../plugins';\nimport type { Geometry } from '../render/geometry';\nimport type { Renderer } from '../render/renderer';\nimport { RendererComponent } from './renderer-component';\n\n/**\n * Mesh 组件\n */\nexport class MeshComponent extends RendererComponent implements Maskable {\n  /**\n   * 渲染的 Geometry\n   */\n  @serialize()\n  protected geometry: Geometry;\n  /**\n   * 用于点击测试的碰撞器\n   */\n  protected meshCollider = new MeshCollider();\n  private readonly maskManager: MaskProcessor;\n\n  constructor (engine: Engine) {\n    super(engine);\n    this.maskManager = new MaskProcessor(engine);\n  }\n\n  override render (renderer: Renderer) {\n    for (let i = 0;i < this.materials.length;i++) {\n      const material = this.materials[i];\n\n      renderer.drawGeometry(this.geometry, this.transform.getWorldMatrix(), material, i);\n    }\n  }\n\n  drawStencilMask (renderer: Renderer): void {\n    if (!this.isActiveAndEnabled) {\n      return;\n    }\n\n    for (let i = 0;i < this.materials.length;i++) {\n      const material = this.materials[i];\n      const previousColorMask = material.colorMask;\n\n      material.colorMask = false;\n      renderer.drawGeometry(this.geometry, this.transform.getWorldMatrix(), material, i);\n      material.colorMask = previousColorMask;\n    }\n  }\n\n  // TODO 点击测试后续抽象一个 Collider 组件\n  getHitTestParams = (force?: boolean): HitTestTriangleParams | void => {\n    const worldMatrix = this.transform.getWorldMatrix();\n\n    this.meshCollider.setGeometry(this.geometry, worldMatrix);\n    const area = this.meshCollider.getBoundingBoxData();\n\n    if (area) {\n      return {\n        type: area.type,\n        triangles: area.area,\n      };\n    }\n  };\n\n  getBoundingBox (): BoundingBoxTriangle | void {\n    const worldMatrix = this.transform.getWorldMatrix();\n\n    this.meshCollider.setGeometry(this.geometry, worldMatrix);\n    const boundingBox = this.meshCollider.getBoundingBox();\n\n    return boundingBox;\n  }\n\n  // TODO: Update data spec\n  override fromData (data: any): void {\n    super.fromData(data);\n\n    const maskableRendererData = data;\n    const maskOptions = maskableRendererData.mask;\n\n    if (maskOptions) {\n      this.maskManager.setMaskOptions(maskOptions);\n    }\n\n    for (const material of this.materials) {\n      const stencilRef = this.maskManager.getRefValue();\n\n      material.stencilRef = [stencilRef, stencilRef];\n      setMaskMode(material, this.maskManager.maskMode);\n    }\n  }\n}\n","import { Vector4 } from '@galacean/effects-math/es/core/vector4';\nimport * as spec from '@galacean/effects-specification';\nimport { effectsClass } from '../decorators';\nimport type { Engine } from '../engine';\nimport { MeshComponent } from './mesh-component';\n\n/**\n * @since 2.0.0\n */\n@effectsClass(spec.DataType.EffectComponent)\nexport class EffectComponent extends MeshComponent {\n  time = 0;\n\n  constructor (engine: Engine) {\n    super(engine);\n    this.name = 'EffectComponent';\n  }\n\n  override onStart (): void {\n    this.item.getHitTestParams = this.getHitTestParams;\n  }\n\n  override onUpdate (dt: number): void {\n    const time = this.time;\n    const _Time = this.material.getVector4('_Time') ?? new Vector4();\n\n    this.material.setVector4('_Time', _Time.set(time / 20, time, time * 2, time * 3));\n\n    this.time += dt / 1000;\n  }\n\n  override fromData (data: spec.EffectComponentData): void {\n    super.fromData(data);\n    this.material = this.materials[0];\n  }\n}","import { Vector3 } from '@galacean/effects-math/es/core/vector3';\nimport type { VFXItem } from '../vfx-item';\nimport { Component } from './component';\nimport { effectsClass } from '../decorators';\nimport type { ComponentData } from '@galacean/effects-specification';\nimport type * as spec from '@galacean/effects-specification';\n\nconst tempVector3 = new Vector3(0, 0, 0);\nconst tempVector3Second = new Vector3(0, 0, 0);\n\nexport class ConstraintTarget {\n  target: VFXItem | null = null;\n  weight = 1.0;\n}\n\nexport interface ConstraintTargetData {\n  target: spec.DataPath,\n  weight: number,\n}\n\nexport interface PositionConstraintData extends ComponentData {\n  positionAtRest: spec.Vector3Data,\n  positionOffset: spec.Vector3Data,\n  weight: number,\n  constrainX: boolean,\n  constrainY: boolean,\n  constrainZ: boolean,\n  targets: ConstraintTargetData[],\n}\n\n/**\n * 位置约束组件\n * 用于约束物体跟随目标对象的位置\n */\n@effectsClass('PositionConstraint')\nexport class PositionConstraint extends Component {\n  /**\n   * 初始位置（当前元素的初始世界位置）\n   */\n  private positionAtRest = new Vector3(0, 0, 0);\n  /**\n   * 位置偏移\n   */\n  private positionOffset = new Vector3(0, 0, 0);\n  /**\n   * 约束权重 (0-1)\n   */\n  private weight = 1.0;\n  /**\n   * 是否约束 X 轴\n   */\n  private constrainX = true;\n  /**\n   * 是否约束 Y 轴\n   */\n  private constrainY = true;\n  /**\n   * 是否约束 Z 轴\n   */\n  private constrainZ = true;\n  /**\n   * 约束目标\n   */\n  private targets: ConstraintTarget[] = [];\n\n  override onStart (): void {\n    // 保存当前元素的初始世界位置\n    const pos = this.item.transform.getWorldPosition();\n\n    this.positionAtRest.copyFrom(pos);\n  }\n\n  override onUpdate (dt: number): void {\n    if (this.targets.length === 0) {\n      return;\n    }\n\n    // 重置 tempVector3 用于计算融合位置\n    tempVector3.set(0, 0, 0);\n    let totalWeight = 0;\n\n    // 计算所有目标的加权平均位置\n    for (const constraintTarget of this.targets) {\n      if (constraintTarget.target) {\n        const targetPos = constraintTarget.target.transform.getWorldPosition();\n        const weight = constraintTarget.weight;\n\n        tempVector3.x += targetPos.x * weight;\n        tempVector3.y += targetPos.y * weight;\n        tempVector3.z += targetPos.z * weight;\n        totalWeight += weight;\n      }\n    }\n\n    // 归一化加权位置\n    if (totalWeight > 0) {\n      tempVector3.x /= totalWeight;\n      tempVector3.y /= totalWeight;\n      tempVector3.z /= totalWeight;\n    }\n\n    // 应用偏移\n    tempVector3.x += this.positionOffset.x;\n    tempVector3.y += this.positionOffset.y;\n    tempVector3.z += this.positionOffset.z;\n\n    // 根据全局权重在初始位置和融合位置之间插值，结果存入 tempVector3Second\n    tempVector3Second.set(\n      this.lerp(this.positionAtRest.x, tempVector3.x, this.weight),\n      this.lerp(this.positionAtRest.y, tempVector3.y, this.weight),\n      this.lerp(this.positionAtRest.z, tempVector3.z, this.weight),\n    );\n\n    // 应用轴约束，复用 tempVector3 存储当前位置\n    tempVector3.copyFrom(this.item.transform.getWorldPosition());\n    const finalX = this.constrainX ? tempVector3Second.x : tempVector3.x;\n    const finalY = this.constrainY ? tempVector3Second.y : tempVector3.y;\n    const finalZ = this.constrainZ ? tempVector3Second.z : tempVector3.z;\n\n    // 设置新的世界位置\n    this.item.transform.setWorldPosition(finalX, finalY, finalZ);\n  }\n\n  /**\n   * 添加约束目标\n   * @param target - 目标元素\n   * @param weight - 权重值 (0-1)\n   */\n  addTarget (target: VFXItem, weight = 1.0): void {\n    const constraintTarget = new ConstraintTarget();\n\n    constraintTarget.target = target;\n    constraintTarget.weight = Math.max(0, Math.min(1, weight));\n    this.targets.push(constraintTarget);\n  }\n\n  /**\n   * 移除约束目标\n   * @param target - 要移除的目标元素\n   */\n  removeTarget (target: VFXItem): void {\n    const index = this.targets.findIndex(ct => ct.target === target);\n\n    if (index !== -1) {\n      this.targets.splice(index, 1);\n    }\n  }\n\n  /**\n   * 清除所有约束目标\n   */\n  clearTargets (): void {\n    this.targets = [];\n  }\n\n  /**\n   * 设置位置偏移\n   * @param x - X 轴偏移\n   * @param y - Y 轴偏移\n   * @param z - Z 轴偏移\n   */\n  setPositionOffset (x: number, y: number, z: number): void {\n    this.positionOffset.set(x, y, z);\n  }\n\n  /**\n   * 设置全局约束权重\n   * @param weight - 权重值 (0-1)，0 表示保持初始位置，1 表示完全跟随目标\n   */\n  setWeight (weight: number): void {\n    this.weight = Math.max(0, Math.min(1, weight));\n  }\n\n  /**\n   * 线性插值\n   * @param start - 起始值\n   * @param end - 结束值\n   * @param t - 插值因子 (0-1)\n   */\n  private lerp (start: number, end: number, t: number): number {\n    return start + (end - start) * t;\n  }\n\n  override fromData (data: PositionConstraintData): void {\n    super.fromData(data);\n\n    // Deserialize all properties\n    this.positionAtRest.copyFrom(data.positionAtRest);\n    this.positionOffset.copyFrom(data.positionOffset);\n    this.weight = data.weight;\n    this.constrainX = data.constrainX;\n    this.constrainY = data.constrainY;\n    this.constrainZ = data.constrainZ;\n\n    this.targets = [];\n    for (const targetData of data.targets) {\n      const constraintTarget = new ConstraintTarget();\n\n      constraintTarget.target = this.engine.findObject(targetData.target);\n      constraintTarget.weight = targetData.weight;\n      this.targets.push(constraintTarget);\n    }\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport { effectsClass, serialize } from '../decorators';\nimport { Component } from './component';\nimport type { Engine } from '../engine';\n\n/**\n * @since 2.1.0\n */\n@effectsClass(spec.DataType.PostProcessVolume)\nexport class PostProcessVolume extends Component {\n\n  @serialize()\n  bloom: spec.Bloom;\n\n  @serialize()\n  vignette: spec.Vignette;\n\n  @serialize()\n  tonemapping: spec.Tonemapping;\n\n  @serialize()\n  colorAdjustments: spec.ColorAdjustments;\n\n  constructor (engine: Engine) {\n    super(engine);\n\n    this.bloom = {\n      threshold: 0,\n      intensity: 0,\n      active: false,\n    };\n\n    this.vignette = {\n      intensity: 0,\n      smoothness: 0,\n      roundness: 0,\n      active: false,\n    };\n\n    this.tonemapping = {\n      active: false,\n    };\n\n    this.colorAdjustments = {\n      brightness: 0,\n      saturation: 0,\n      contrast: 0,\n      active: false,\n    };\n  }\n\n  override onStart (): void {\n    const composition = this.item.composition;\n\n    if (composition) {\n      composition.renderFrame.globalVolume = this;\n    }\n  }\n}\n","import { Color } from '@galacean/effects-math/es/core/color';\nimport { Matrix4 } from '@galacean/effects-math/es/core/matrix4';\nimport { Vector4 } from '@galacean/effects-math/es/core/vector4';\nimport * as spec from '@galacean/effects-specification';\nimport type { Engine } from '../engine';\nimport { glContext } from '../gl';\nimport type { Maskable } from '../material';\nimport {\n  MaskMode, MaskProcessor, Material, getPreMultiAlpha, setBlendMode, setMaskMode, setSideMode,\n} from '../material';\nimport type { BoundingBoxTriangle, HitTestTriangleParams } from '../plugins';\nimport { MeshCollider } from '../plugins';\nimport type { Renderer } from '../render';\nimport { Geometry } from '../render';\nimport { itemFrag, itemVert } from '../shader';\nimport { Texture } from '../texture';\nimport { RendererComponent } from './renderer-component';\n\n/**\n * 图层元素渲染属性, 经过处理后的 spec.SpriteContent.renderer\n */\nexport interface ItemRenderer extends Required<Omit<spec.RendererOptions, 'texture' | 'shape' | 'anchor' | 'particleOrigin' | 'mask'>> {\n  texture: Texture,\n  mask: number,\n}\n\n// TODO: Add to spec\ninterface MaskableGraphicData extends spec.ComponentData {\n  renderer: spec.RendererOptions,\n  mask?: spec.MaskOptions,\n}\n\n/**\n * @since 2.7.0\n */\nexport class MaskableGraphic extends RendererComponent implements Maskable {\n  interaction?: { behavior: spec.InteractBehavior };\n  renderer: ItemRenderer;\n  geometry: Geometry;\n\n  protected visible = true;\n  protected readonly maskManager: MaskProcessor;\n\n  /**\n   * 用于点击测试的碰撞器\n   */\n  protected meshCollider = new MeshCollider();\n  protected defaultGeometry: Geometry;\n\n  private _color = new Color(1, 1, 1, 1);\n\n  /**\n   *\n   * @param engine\n   */\n  constructor (engine: Engine) {\n    super(engine);\n\n    this.renderer = {\n      renderMode: spec.RenderMode.MESH,\n      blending: spec.BlendingMode.ALPHA,\n      texture: this.engine.whiteTexture,\n      occlusion: false,\n      transparentOcclusion: false,\n      side: spec.SideMode.DOUBLE,\n      mask: 0,\n    };\n\n    this.defaultGeometry = Geometry.create(this.engine, {\n      attributes: {\n        aPos: {\n          type: glContext.FLOAT,\n          size: 3,\n          data: new Float32Array([\n            -0.5, 0.5, 0, //左上\n            -0.5, -0.5, 0, //左下\n            0.5, 0.5, 0, //右上\n            0.5, -0.5, 0, //右下\n          ]),\n        },\n        aUV: {\n          size: 2,\n          offset: 0,\n          releasable: true,\n          type: glContext.FLOAT,\n          data: new Float32Array([0, 1, 0, 0, 1, 1, 1, 0]),\n        },\n      },\n      indices: { data: new Uint16Array([0, 1, 2, 2, 1, 3]), releasable: true },\n      mode: glContext.TRIANGLES,\n      drawCount: 6,\n    });\n    this.geometry = this.defaultGeometry;\n\n    const material = Material.create(this.engine, {\n      shader: {\n        fragment: itemFrag,\n        vertex: itemVert,\n        shared: true,\n      },\n    });\n\n    this.material = material;\n    this.material.setColor('_Color', new Color(1, 1, 1, 1));\n    this.maskManager = new MaskProcessor(engine);\n\n    this.configureMaterial(this.renderer);\n  }\n\n  /**\n   * 设置当前 Mesh 的可见性。\n   * @param visible - true：可见，false：不可见\n   * @deprecated 2.4.0 Please use enabled instead\n   */\n  setVisible (visible: boolean) {\n    this.visible = visible;\n  }\n\n  /**\n   * 获取当前 Mesh 的可见性。\n   * @deprecated 2.4.0 Please use enabled instead\n   */\n  getVisible (): boolean {\n    return this.visible;\n  }\n\n  /**\n   * 设置当前图层的颜色\n   * > Tips: 透明度也属于颜色的一部分，当有透明度/颜色 K 帧变化时，该 API 会失效\n   * @since 2.4.0\n   * @param color - 颜色值\n   */\n  setColor (color: Color): void;\n  /**\n   * 设置当前图层的颜色\n   * > Tips: 透明度也属于颜色的一部分，当有透明度/颜色 K 帧变化时，该 API 会失效\n   * @since 2.0.0\n   * @param color - 颜色值\n   */\n  setColor (color: spec.vec4): void;\n  setColor (color: spec.vec4 | Color) {\n    if (color instanceof Color) {\n      this._color.copyFrom(color);\n    } else {\n      this._color.setFromArray(color);\n    }\n    this.material.setColor('_Color', this._color);\n  }\n\n  /**\n   * 获取当前图层的颜色\n   * @since 2.5.0\n   */\n  get color () {\n    return this._color;\n  }\n  /**\n   * 设置当前图层的颜色\n   * @since 2.5.0\n   */\n  set color (value: Color) {\n    this.setColor(value);\n  }\n\n  /**\n   * 使用纹理对象设置当前 Mesh 的纹理\n   * @since 2.0.0\n   * @param input - 纹理对象\n   */\n  setTexture (input: Texture): void;\n  /**\n   * 使用资源链接异步设置当前 Mesh 的纹理\n   * @param input - 资料链接\n   * @since 2.3.0\n   */\n  async setTexture (input: string): Promise<void>;\n  async setTexture (input: Texture | string): Promise<void> {\n    let texture: Texture;\n\n    if (typeof input === 'string') {\n      texture = await Texture.fromImage(input, this.item.engine);\n    } else {\n      texture = input;\n    }\n\n    this.renderer.texture = texture;\n    this.material.setTexture('_MainTex', texture);\n  }\n\n  override onUpdate (dt: number): void {\n    for (let i = 0; i < this.materials.length; i++) {\n      const material = this.materials[i];\n\n      material.setVector2('_Size', this.transform.size);\n\n      if (this.renderer.renderMode === spec.RenderMode.BILLBOARD ||\n        this.renderer.renderMode === spec.RenderMode.VERTICAL_BILLBOARD ||\n        this.renderer.renderMode === spec.RenderMode.HORIZONTAL_BILLBOARD\n      ) {\n        material.setVector3('_Scale', this.transform.scale);\n      }\n    }\n  }\n\n  override render (renderer: Renderer) {\n    if (!this.getVisible()) {\n      return;\n    }\n\n    this.maskManager.drawStencilMask(renderer);\n\n    this.draw(renderer);\n  }\n\n  /**\n   * @internal\n   */\n  drawStencilMask (renderer: Renderer) {\n    if (!this.isActiveAndEnabled) {\n      return;\n    }\n    const previousColorMask = this.material.colorMask;\n\n    this.material.colorMask = false;\n    this.draw(renderer);\n    this.material.colorMask = previousColorMask;\n  }\n\n  override onStart (): void {\n    this.item.getHitTestParams = this.getHitTestParams;\n  }\n\n  // TODO 点击测试后续抽象一个 Collider 组件\n  getHitTestParams = (force?: boolean): HitTestTriangleParams | undefined => {\n    const sizeMatrix = Matrix4.fromScale(this.transform.size.x, this.transform.size.y, 1);\n    const worldMatrix = sizeMatrix.premultiply(this.transform.getWorldMatrix());\n    const ui = this.interaction;\n\n    if (force || ui) {\n      this.meshCollider.setGeometry(this.geometry, worldMatrix);\n      const area = this.meshCollider.getBoundingBoxData();\n\n      if (area) {\n        return {\n          behavior: this.interaction?.behavior || 0,\n          type: area.type,\n          triangles: area.area,\n          backfaceCulling: this.renderer.side === spec.SideMode.FRONT,\n        };\n      }\n    }\n  };\n\n  getBoundingBox (): BoundingBoxTriangle {\n    const worldMatrix = this.transform.getWorldMatrix();\n\n    this.meshCollider.setGeometry(this.geometry, worldMatrix);\n    const boundingBox = this.meshCollider.getBoundingBox();\n\n    return boundingBox;\n  }\n\n  private configureMaterial (renderer: ItemRenderer): Material {\n    const { side, occlusion, blending: blendMode, mask, texture } = renderer;\n    const maskMode = this.maskManager.maskMode;\n    const material = this.material;\n\n    material.blending = true;\n    material.depthTest = true;\n    material.depthMask = occlusion;\n    material.stencilRef = mask !== undefined ? [mask, mask] : undefined;\n\n    setBlendMode(material, blendMode);\n    // 兼容旧数据中模板需要渲染的情况\n    setMaskMode(material, maskMode);\n    setSideMode(material, side);\n\n    material.shader.shaderData.properties = '_MainTex(\"_MainTex\",2D) = \"white\" {}';\n    material.setVector4('_TexOffset', new Vector4(0, 0, 1, 1));\n    material.setTexture('_MainTex', texture);\n\n    const preMultiAlpha = getPreMultiAlpha(blendMode);\n    const texParams = new Vector4();\n\n    texParams.x = renderer.occlusion ? +(renderer.transparentOcclusion) : 1;\n    texParams.y = preMultiAlpha;\n    texParams.z = renderer.renderMode;\n    texParams.w = maskMode;\n    material.setVector4('_TexParams', texParams);\n\n    if (texParams.x === 0 || (this.maskManager.alphaMaskEnabled)) {\n      material.enableMacro('ALPHA_CLIP');\n    } else {\n      material.disableMacro('ALPHA_CLIP');\n    }\n\n    return material;\n  }\n\n  private draw (renderer: Renderer) {\n    for (let i = 0; i < this.materials.length; i++) {\n      renderer.drawGeometry(this.geometry, this.transform.getWorldMatrix(), this.materials[i], i);\n    }\n  }\n\n  override fromData (data: unknown): void {\n    super.fromData(data);\n\n    const maskableGraphicData = (data as MaskableGraphicData);\n    const renderer = maskableGraphicData.renderer ?? {};\n\n    const maskOptions = maskableGraphicData.mask;\n\n    if (maskOptions) {\n      this.maskManager.setMaskOptions(maskOptions);\n    }\n\n    this.renderer = {\n      renderMode: renderer.renderMode ?? spec.RenderMode.MESH,\n      blending: renderer.blending ?? spec.BlendingMode.ALPHA,\n      texture: renderer.texture ? this.engine.findObject<Texture>(renderer.texture) : this.engine.whiteTexture,\n      occlusion: !!renderer.occlusion,\n      transparentOcclusion: !!renderer.transparentOcclusion || (this.maskManager.maskMode === MaskMode.MASK),\n      side: renderer.side ?? spec.SideMode.DOUBLE,\n      mask: this.maskManager.getRefValue(),\n    };\n\n    this.configureMaterial(this.renderer);\n  }\n}\n","import { Color } from '@galacean/effects-math/es/core/color';\nimport { Vector2 } from '@galacean/effects-math/es/core/vector2';\nimport * as spec from '@galacean/effects-specification';\nimport { effectsClass } from '../decorators';\nimport type { Engine } from '../engine';\nimport type { Maskable, MaterialProps } from '../material';\nimport { MaskMode, MaskProcessor, getPreMultiAlpha, setBlendMode, setSideMode } from '../material';\nimport { Material, setMaskMode } from '../material';\nimport type { BoundingBoxTriangle, HitTestTriangleParams, Polygon, ShapePath, StrokeAttributes } from '../plugins';\nimport { MeshCollider } from '../plugins';\nimport { GraphicsPath, StarType, buildLine } from '../plugins';\nimport type { Renderer } from '../render';\nimport { GLSLVersion, Geometry } from '../render';\nimport type { GradientValue } from '../math';\nimport { createValueGetter } from '../math';\nimport { Vector4 } from '@galacean/effects-math/es/core/vector4';\nimport { RendererComponent } from './renderer-component';\nimport type { Texture } from '../texture/texture';\nimport { glContext } from '../gl';\nimport { Matrix4 } from '@galacean/effects-math/es/core/matrix4';\nimport vert from '../plugins/shape/shaders/shape.vert.glsl';\nimport frag from '../plugins/shape/shaders/shape.frag.glsl';\nimport { Matrix3 } from '@galacean/effects-math/es/core/matrix3';\nimport type { ItemRenderer } from './base-render-component';\n\ntype Paint = SolidPaint | GradientPaint | TexturePaint;\n\nexport interface SolidPaint {\n  type: spec.FillType.Solid,\n  color: Color,\n}\n\nexport interface GradientPaint {\n  type: spec.FillType.GradientLinear | spec.FillType.GradientAngular | spec.FillType.GradientRadial,\n  gradientStops: GradientValue,\n  startPoint: Vector2,\n  endPoint: Vector2,\n}\n\nexport interface TextureTransform {\n  offset: Vector2,\n  rotation: number,\n  scale: Vector2,\n}\n\nexport interface TexturePaint {\n  type: spec.FillType.Texture,\n  texture: Texture,\n  scaleMode: TexturePaintScaleMode,\n  scalingFactor: number,\n  opacity: number,\n  textureTransform: TextureTransform,\n}\n\nexport enum TexturePaintScaleMode {\n  Fill,\n  Fit,\n  Crop,\n  Tile\n}\n\ninterface ShapeAttributes {\n  /**\n   * 矢量图形类型\n   */\n  type: spec.ShapePrimitiveType,\n}\n\n/**\n * 自定义图形参数\n */\ninterface CustomShapeAttribute extends ShapeAttributes {\n  type: spec.ShapePrimitiveType.Custom,\n  /**\n   * 路径点\n   */\n  points: Vector2[],\n  /**\n   * 入射控制点\n   */\n  easingIns: Vector2[],\n  /**\n   * 入射控制点\n   */\n  easingOuts: Vector2[],\n  /**\n   * 自定义形状\n   */\n  shapes: spec.CustomShape[],\n}\n\n/**\n * 椭圆组件参数\n */\nexport interface EllipseAttribute extends ShapeAttributes {\n  type: spec.ShapePrimitiveType.Ellipse,\n  /**\n   * x 轴半径\n   * -- TODO 后续完善类型\n   * -- TODO 可以看一下用xRadius/yRadius 还是 width/height\n   */\n  xRadius: number,\n  /**\n   * y 轴半径\n   */\n  yRadius: number,\n}\n\n/**\n * 矩形参数\n */\nexport interface RectangleAttribute extends ShapeAttributes {\n  /**\n   * 宽度\n   */\n  width: number,\n  /**\n   * 高度\n   */\n  height: number,\n  /**\n   * 角点元素\n   */\n  roundness: number,\n}\n\n/**\n * 星形参数\n */\nexport interface StarAttribute extends ShapeAttributes {\n  /**\n   * 顶点数 - 内外顶点同数\n   */\n  pointCount: number,\n  /**\n   * 内径\n   */\n  innerRadius: number,\n  /**\n   * 外径\n   */\n  outerRadius: number,\n  /**\n   * 内径点圆度\n   */\n  innerRoundness: number,\n  /**\n   * 外径点圆度\n   */\n  outerRoundness: number,\n}\n\n/**\n * 多边形参数\n */\nexport interface PolygonAttribute extends ShapeAttributes {\n  /**\n   * 顶点数\n   */\n  pointCount: number,\n  /**\n   * 外切圆半径\n   */\n  radius: number,\n  /**\n   * 角点圆度\n   */\n  roundness: number,\n}\n\n/**\n * 图形组件\n * @since 2.1.0\n */\n@effectsClass('ShapeComponent')\nexport class ShapeComponent extends RendererComponent implements Maskable {\n  private shapeDirty = true;\n  private materialDirty = true;\n  private graphicsPath = new GraphicsPath();\n\n  private fills: Paint[] = [];\n  private strokeAttributes: StrokeAttributes = {\n    width: 1,\n    alignment: 0.5,\n    cap: spec.LineCap.Butt,\n    join: spec.LineJoin.Miter,\n    miterLimit: 10,\n  };\n\n  private strokeWidth = 1;\n  private strokeCap = spec.LineCap.Butt;\n  private strokeJoin = spec.LineJoin.Miter;\n  private strokes: Paint[] = [];\n  private shapeAttributes: ShapeAttributes;\n\n  /**\n   * 用于点击测试的碰撞器\n   */\n  private meshCollider = new MeshCollider();\n  private rendererOptions: ItemRenderer;\n  private geometry: Geometry;\n  private fillMaterials: Material[] = [];\n  private strokeMaterials: Material[] = [];\n  private readonly maskManager: MaskProcessor;\n\n  get shape () {\n    return this.shapeAttributes;\n  }\n\n  /**\n   *\n   * @param engine\n   */\n  constructor (engine: Engine) {\n    super(engine);\n\n    this.rendererOptions = {\n      renderMode: spec.RenderMode.MESH,\n      blending: spec.BlendingMode.ALPHA,\n      texture: this.engine.whiteTexture,\n      occlusion: false,\n      transparentOcclusion: false,\n      side: spec.SideMode.DOUBLE,\n      mask: 0,\n    };\n\n    this.maskManager = new MaskProcessor(this.engine);\n\n    // Create Shape Attrributes\n    //-------------------------------------------------------------------------\n\n    const gradientStrokeFill: SolidPaint = {\n      type: spec.FillType.Solid,\n      color: new Color(1, 1, 1, 1),\n    };\n\n    this.strokes.push(gradientStrokeFill);\n\n    const gradientLayerFill: SolidPaint = {\n      type: spec.FillType.Solid,\n      color: new Color(1, 1, 1, 1),\n    };\n\n    this.fills.push(gradientLayerFill);\n\n    this.shapeAttributes = {\n      type: spec.ShapePrimitiveType.Custom,\n      points: [],\n      easingIns: [],\n      easingOuts: [],\n      shapes: [],\n    } as CustomShapeAttribute;\n\n    // Create Geometry\n    //-------------------------------------------------------------------------\n\n    this.geometry = Geometry.create(this.engine, {\n      attributes: {\n        aPos: {\n          type: glContext.FLOAT,\n          size: 3,\n          data: new Float32Array([\n            -0.5, 0.5, 0, //左上\n            -0.5, -0.5, 0, //左下\n            0.5, 0.5, 0, //右上\n            0.5, -0.5, 0, //右下\n          ]),\n        },\n        aUV: {\n          size: 2,\n          offset: 0,\n          releasable: true,\n          type: glContext.FLOAT,\n          data: new Float32Array([0, 1, 0, 0, 1, 1, 1, 0]),\n        },\n      },\n      indices: { data: new Uint16Array([0, 1, 2, 2, 1, 3]), releasable: true },\n      mode: glContext.TRIANGLES,\n      drawCount: 6,\n    });\n\n    this.geometry.subMeshes.push({\n      offset: 0,\n      indexCount: 0,\n      vertexCount: 0,\n    }, {\n      offset: 0,\n      indexCount: 0,\n      vertexCount: 0,\n    });\n  }\n\n  override onStart (): void {\n    this.item.getHitTestParams = this.getHitTestParams;\n  }\n\n  override onUpdate (dt: number): void {\n    if (this.shapeDirty) {\n      this.buildPath(this.shapeAttributes);\n      this.buildGeometryFromPath(this.graphicsPath.shapePath);\n      this.shapeDirty = false;\n    }\n\n    if (this.materialDirty) {\n      this.updateMaterials();\n      this.materialDirty = false;\n    }\n  }\n\n  override render (renderer: Renderer) {\n    this.maskManager.drawStencilMask(renderer);\n\n    this.draw(renderer);\n  }\n\n  /**\n   * @internal\n   */\n  drawStencilMask (renderer: Renderer) {\n    if (!this.isActiveAndEnabled) {\n      return;\n    }\n\n    let previousColorMask = false;\n\n    for (let i = 0; i < this.fillMaterials.length; i++) {\n      previousColorMask = this.fillMaterials[i].colorMask;\n      this.fillMaterials[i].colorMask = false;\n      renderer.drawGeometry(this.geometry, this.transform.getWorldMatrix(), this.fillMaterials[i], 0);\n      this.fillMaterials[i].colorMask = previousColorMask;\n    }\n\n    for (let i = 0; i < this.strokeMaterials.length; i++) {\n      previousColorMask = this.strokeMaterials[i].colorMask;\n      this.strokeMaterials[i].colorMask = false;\n      renderer.drawGeometry(this.geometry, this.transform.getWorldMatrix(), this.strokeMaterials[i], 1);\n      this.strokeMaterials[i].colorMask = previousColorMask;\n    }\n  }\n\n  private draw (renderer: Renderer) {\n    for (let i = 0; i < this.fillMaterials.length; i++) {\n      renderer.drawGeometry(this.geometry, this.transform.getWorldMatrix(), this.fillMaterials[i], 0);\n    }\n\n    for (let i = 0; i < this.strokeMaterials.length; i++) {\n      renderer.drawGeometry(this.geometry, this.transform.getWorldMatrix(), this.strokeMaterials[i], 1);\n    }\n  }\n\n  getHitTestParams = (force?: boolean): HitTestTriangleParams | undefined => {\n    const sizeMatrix = Matrix4.fromScale(this.transform.size.x, this.transform.size.y, 1);\n    const worldMatrix = sizeMatrix.premultiply(this.transform.getWorldMatrix());\n\n    if (force) {\n      this.meshCollider.setGeometry(this.geometry, worldMatrix);\n      const area = this.meshCollider.getBoundingBoxData();\n\n      if (area) {\n        return {\n          behavior: 0,\n          type: area.type,\n          triangles: area.area,\n          backfaceCulling: this.rendererOptions.side === spec.SideMode.FRONT,\n        };\n      }\n    }\n  };\n\n  getBoundingBox (): BoundingBoxTriangle {\n    const worldMatrix = this.transform.getWorldMatrix();\n\n    this.meshCollider.setGeometry(this.geometry, worldMatrix);\n    const boundingBox = this.meshCollider.getBoundingBox();\n\n    return boundingBox;\n  }\n\n  private buildGeometryFromPath (shapePath: ShapePath) {\n    const shapePrimitives = shapePath.shapePrimitives;\n    const vertices: number[] = [];\n    const indices: number[] = [];\n\n    // Triangulate shapePrimitives, build fill and stroke shape geometry\n    if (this.fills.length > 0) {\n      for (const shapePrimitive of shapePrimitives) {\n        const shape = shapePrimitive.shape;\n        const points: number[] = [];\n        const indexOffset = indices.length;\n        const vertOffset = vertices.length / 2;\n\n        shape.build(points);\n        shape.triangulate(points, vertices, vertOffset, indices, indexOffset);\n      }\n    }\n\n    const fillIndexCount = indices.length;\n\n    if (this.strokes.length > 0) {\n      for (const shapePrimitive of shapePrimitives) {\n        const shape = shapePrimitive.shape;\n        const points: number[] = [];\n        const indexOffset = indices.length;\n        const vertOffset = vertices.length / 2;\n        const lineStyle = this.strokeAttributes;\n\n        lineStyle.cap = this.strokeCap;\n        lineStyle.join = this.strokeJoin;\n        lineStyle.width = this.strokeWidth;\n\n        let close = true;\n\n        if (this.shapeAttributes.type === spec.ShapePrimitiveType.Custom) {\n          close = (shape as Polygon).closePath;\n        }\n\n        shape.build(points);\n        buildLine(points, lineStyle, false, close, vertices, 2, vertOffset, indices, indexOffset);\n      }\n    }\n\n    const strokeIndexCount = indices.length - fillIndexCount;\n    const vertexCount = vertices.length / 2;\n\n    // Get the current attribute and index arrays from the geometry, avoiding re-creation\n    let positionArray = this.geometry.getAttributeData('aPos');\n    let uvArray = this.geometry.getAttributeData('aUV');\n    let indexArray = this.geometry.getIndexData();\n\n    if (!positionArray || positionArray.length < vertexCount * 3) {\n      positionArray = new Float32Array(vertexCount * 3);\n    }\n\n    if (!uvArray || uvArray.length < vertexCount * 2) {\n      uvArray = new Float32Array(vertexCount * 2);\n    }\n\n    if (!indexArray || indexArray.length < indices.length) {\n      indexArray = new Uint16Array(indices.length);\n    }\n\n    // Set position attribute array, calculate bounding box for uv scaling\n    let minX = Number.MAX_VALUE;\n    let minY = Number.MAX_VALUE;\n    let maxX = Number.MIN_VALUE;\n    let maxY = Number.MIN_VALUE;\n\n    for (let i = 0; i < vertexCount; i++) {\n      const pointsOffset = i * 3;\n      const positionArrayOffset = i * 2;\n\n      const x = vertices[positionArrayOffset];\n      const y = vertices[positionArrayOffset + 1];\n\n      positionArray[pointsOffset] = x;\n      positionArray[pointsOffset + 1] = y;\n      positionArray[pointsOffset + 2] = 0;\n\n      minX = Math.min(minX, x);\n      minY = Math.min(minY, y);\n      maxX = Math.max(maxX, x);\n      maxY = Math.max(maxY, y);\n    }\n\n    // Set uv attribute array\n    const sizeX = maxX - minX;\n    const sizeY = maxY - minY;\n\n    for (let i = 0; i < vertexCount; i++) {\n      const pointsOffset = i * 3;\n      const uvOffset = i * 2;\n\n      uvArray[uvOffset] = (positionArray[pointsOffset] - minX) / sizeX;\n      uvArray[uvOffset + 1] = (positionArray[pointsOffset + 1] - minY) / sizeY;\n    }\n\n    // Set index array\n    indexArray.set(indices);\n\n    // Rewrite to geometry\n    this.geometry.setAttributeData('aPos', positionArray);\n    this.geometry.setAttributeData('aUV', uvArray);\n    this.geometry.setIndexData(indexArray);\n    this.geometry.setDrawCount(indices.length);\n\n    const u16Size = 2;\n    const fillSubMesh = this.geometry.subMeshes[0];\n    const strokeSubMesh = this.geometry.subMeshes[1];\n\n    fillSubMesh.indexCount = fillIndexCount;\n    strokeSubMesh.offset = fillIndexCount * u16Size;\n    strokeSubMesh.indexCount = strokeIndexCount;\n  }\n\n  private buildPath (shapeAttribute: ShapeAttributes) {\n    this.graphicsPath.clear();\n\n    switch (shapeAttribute.type) {\n      case spec.ShapePrimitiveType.Custom: {\n        const customShapeAtribute = this.shapeAttributes as CustomShapeAttribute;\n        const points = customShapeAtribute.points;\n        const easingIns = customShapeAtribute.easingIns;\n        const easingOuts = customShapeAtribute.easingOuts;\n\n        for (const shape of customShapeAtribute.shapes) {\n          const indices = shape.indexes;\n          const startPoint = points[indices[0].point];\n\n          this.graphicsPath.moveTo(startPoint.x, startPoint.y);\n\n          for (let i = 1; i < indices.length; i++) {\n            const pointIndex = indices[i];\n            const lastPointIndex = indices[i - 1];\n            const point = points[pointIndex.point];\n            const lastPoint = points[lastPointIndex.point];\n            const control1 = easingOuts[lastPointIndex.easingOut];\n            const control2 = easingIns[pointIndex.easingIn];\n\n            this.graphicsPath.bezierCurveTo(control1.x + lastPoint.x, control1.y + lastPoint.y, control2.x + point.x, control2.y + point.y, point.x, point.y, 1);\n          }\n\n          if (shape.close) {\n            const pointIndex = indices[0];\n            const lastPointIndex = indices[indices.length - 1];\n            const point = points[pointIndex.point];\n            const lastPoint = points[lastPointIndex.point];\n            const control1 = easingOuts[lastPointIndex.easingOut];\n            const control2 = easingIns[pointIndex.easingIn];\n\n            this.graphicsPath.bezierCurveTo(control1.x + lastPoint.x, control1.y + lastPoint.y, control2.x + point.x, control2.y + point.y, point.x, point.y, 1);\n            this.graphicsPath.closePath();\n          }\n        }\n\n        break;\n      }\n      case spec.ShapePrimitiveType.Ellipse: {\n        const ellipseData = shapeAttribute as EllipseAttribute;\n\n        this.graphicsPath.ellipse(0, 0, ellipseData.xRadius, ellipseData.yRadius);\n\n        break;\n      }\n      case spec.ShapePrimitiveType.Rectangle: {\n        const rectangleData = shapeAttribute as RectangleAttribute;\n\n        this.graphicsPath.rect(-rectangleData.width / 2, -rectangleData.height / 2, rectangleData.width, rectangleData.height, rectangleData.roundness);\n\n        break;\n      }\n      case spec.ShapePrimitiveType.Star: {\n        const starData = shapeAttribute as StarAttribute;\n\n        this.graphicsPath.polyStar(starData.pointCount, starData.outerRadius, starData.innerRadius, starData.outerRoundness, starData.innerRoundness, StarType.Star);\n\n        break;\n      }\n      case spec.ShapePrimitiveType.Polygon: {\n        const polygonData = shapeAttribute as PolygonAttribute;\n\n        this.graphicsPath.polyStar(polygonData.pointCount, polygonData.radius, polygonData.radius, polygonData.roundness, polygonData.roundness, StarType.Polygon);\n\n        break;\n      }\n    }\n  }\n\n  private updateMaterials () {\n    for (let i = 0; i < this.fills.length; i++) {\n      this.updatePaintMaterial(this.fillMaterials[i], this.fills[i]);\n    }\n\n    for (let i = 0; i < this.strokes.length; i++) {\n      this.updatePaintMaterial(this.strokeMaterials[i], this.strokes[i]);\n    }\n  }\n\n  private updatePaintMaterial (material: Material, paint: Paint) {\n    material.setFloat('_FillType', paint.type);\n\n    if (paint.type === spec.FillType.Solid) {\n      material.color = paint.color;\n    } else if (paint.type === spec.FillType.GradientLinear || paint.type === spec.FillType.GradientAngular || paint.type === spec.FillType.GradientRadial) {\n      this.updateGradientMaterial(material, paint.gradientStops, paint.startPoint, paint.endPoint);\n    } else if (paint.type === spec.FillType.Texture) {\n      material.setInt('_ImageScaleMode', paint.scaleMode);\n      material.setVector2('_ImageSize', new Vector2(paint.texture.getWidth(), paint.texture.getHeight()));\n\n      const boundingBox = this.getBoundingBox();\n      const topRight = boundingBox.area[0].p1;\n      const bottomLeft = boundingBox.area[1].p2;\n\n      material.setVector2('_DestSize', new Vector2(topRight.x - bottomLeft.x, topRight.y - bottomLeft.y));\n      material.setFloat('_ImageOpacity', paint.opacity);\n      material.setFloat('_ImageScalingFactor', paint.scalingFactor);\n      material.setTexture('_ImageTex', paint.texture);\n\n      const transform = paint.textureTransform;\n\n      material.setMatrix3('_TextureTransform', new Matrix3()\n        .scale(transform.scale.x, transform.scale.y)\n        .rotate(transform.rotation)\n        .translate(transform.offset.x, transform.offset.y)\n        .invert()\n      );\n    }\n  }\n\n  private updateGradientMaterial (material: Material, gradient: GradientValue, startPoint: Vector2, endPoint: Vector2) {\n    const gradientColors: Vector4[] = [];\n    const gradientStops: number[] = [];\n\n    for (const stop of gradient.stops) {\n      const stopColor = stop.color;\n\n      gradientColors.push(new Vector4(stopColor.r, stopColor.g, stopColor.b, stopColor.a));\n      gradientStops.push(stop.time);\n    }\n\n    material.setVector4Array('_Colors', gradientColors);\n    material.setFloats('_Stops', gradientStops);\n    material.setInt('_StopsCount', gradientStops.length);\n    material.setVector2('_StartPoint', startPoint);\n    material.setVector2('_EndPoint', endPoint);\n  }\n\n  private createMaterialFromRendererOptions (rendererOptions: ItemRenderer): Material {\n    const materialProps: MaterialProps = {\n      shader: {\n        vertex: vert,\n        fragment: frag,\n        glslVersion: GLSLVersion.GLSL1,\n      },\n    };\n    const material = Material.create(this.engine, materialProps);\n\n    const renderer = rendererOptions;\n    const { side, occlusion, blending: blendMode, mask, texture } = renderer;\n    const maskMode = this.maskManager.maskMode;\n\n    material.blending = true;\n    material.depthTest = true;\n    material.depthMask = occlusion;\n    material.stencilRef = mask !== undefined ? [mask, mask] : undefined;\n\n    setBlendMode(material, blendMode);\n    // 兼容旧数据中模板需要渲染的情况\n    setMaskMode(material, maskMode);\n    setSideMode(material, side);\n\n    material.shader.shaderData.properties = '_ImageTex(\"_ImageTex\",2D) = \"white\" {}';\n    material.setVector4('_TexOffset', new Vector4(0, 0, 1, 1));\n    material.setTexture('_ImageTex', texture);\n\n    const preMultiAlpha = getPreMultiAlpha(blendMode);\n    const texParams = new Vector4();\n\n    texParams.x = renderer.occlusion ? +(renderer.transparentOcclusion) : 1;\n    texParams.y = preMultiAlpha;\n    texParams.z = renderer.renderMode;\n    texParams.w = maskMode;\n    material.setVector4('_TexParams', texParams);\n\n    if (texParams.x === 0 || (this.maskManager.alphaMaskEnabled)) {\n      material.enableMacro('ALPHA_CLIP');\n    } else {\n      material.disableMacro('ALPHA_CLIP');\n    }\n\n    return material;\n  }\n\n  override fromData (data: spec.ShapeComponentData): void {\n    super.fromData(data);\n    this.shapeDirty = true;\n\n    if (data.mask) {\n      this.maskManager.setMaskOptions(data.mask);\n    }\n\n    const renderer = data.renderer ?? {};\n\n    this.rendererOptions = {\n      renderMode: spec.RenderMode.MESH,\n      blending: renderer.blending ?? spec.BlendingMode.ALPHA,\n      texture: renderer.texture ? this.engine.findObject<Texture>(renderer.texture) : this.engine.whiteTexture,\n      occlusion: !!renderer.occlusion,\n      transparentOcclusion: !!renderer.transparentOcclusion || (this.maskManager.maskMode === MaskMode.MASK),\n      side: renderer.side ?? spec.SideMode.DOUBLE,\n      mask: this.maskManager.getRefValue(),\n    };\n\n    this.strokeCap = data.strokeCap ?? spec.LineCap.Butt;\n    this.strokeWidth = data.strokeWidth ?? 1;\n    this.strokeJoin = data.strokeJoin ?? spec.LineJoin.Miter;\n\n    this.fills.length = 0;\n    this.fillMaterials.length = 0;\n    for (const fill of data.fills) {\n      this.fills.push(this.createPaint(fill));\n      this.fillMaterials.push(this.createMaterialFromRendererOptions(this.rendererOptions));\n    }\n\n    this.strokes.length = 0;\n    this.strokeMaterials.length = 0;\n    for (const stroke of data.strokes) {\n      this.strokes.push(this.createPaint(stroke));\n      this.strokeMaterials.push(this.createMaterialFromRendererOptions(this.rendererOptions));\n    }\n\n    this.materials = [...this.fillMaterials, ...this.strokeMaterials];\n\n    switch (data.type) {\n      case spec.ShapePrimitiveType.Custom: {\n        const customShapeData = data as spec.CustomShapeData;\n        const customShapeAttribute: CustomShapeAttribute = {\n          type: spec.ShapePrimitiveType.Custom,\n          points: [],\n          easingIns: [],\n          easingOuts: [],\n          shapes: [],\n        };\n\n        for (const point of customShapeData.points) {\n          customShapeAttribute.points.push(new Vector2(point.x, point.y));\n        }\n        for (const easingIn of customShapeData.easingIns) {\n          customShapeAttribute.easingIns.push(new Vector2(easingIn.x, easingIn.y));\n        }\n        for (const easingOut of customShapeData.easingOuts) {\n          customShapeAttribute.easingOuts.push(new Vector2(easingOut.x, easingOut.y));\n        }\n        customShapeAttribute.shapes = customShapeData.shapes;\n\n        this.shapeAttributes = customShapeAttribute;\n\n        break;\n      }\n      case spec.ShapePrimitiveType.Ellipse: {\n        const ellipseData = data as spec.EllipseData;\n        const ellipseAttribute: EllipseAttribute = {\n          type: spec.ShapePrimitiveType.Ellipse,\n          xRadius: ellipseData.xRadius,\n          yRadius: ellipseData.yRadius,\n        };\n\n        this.shapeAttributes = ellipseAttribute;\n\n        break;\n      }\n      case spec.ShapePrimitiveType.Rectangle: {\n        const rectangleData = data as spec.RectangleData;\n        const rectangleAttribute: RectangleAttribute = {\n          type: spec.ShapePrimitiveType.Rectangle,\n          width: rectangleData.width,\n          height: rectangleData.height,\n          roundness: rectangleData.roundness,\n        };\n\n        this.shapeAttributes = rectangleAttribute;\n\n        break;\n      }\n      case spec.ShapePrimitiveType.Star: {\n        const starData = data as spec.StarData;\n        const starAttribute: StarAttribute = {\n          type: spec.ShapePrimitiveType.Star,\n          pointCount: starData.pointCount,\n          innerRadius: starData.innerRadius,\n          outerRadius: starData.outerRadius,\n          innerRoundness: starData.innerRoundness,\n          outerRoundness: starData.outerRoundness,\n        };\n\n        this.shapeAttributes = starAttribute;\n\n        break;\n      }\n      case spec.ShapePrimitiveType.Polygon: {\n        const polygonData = data as spec.PolygonData;\n        const polygonAttribute: PolygonAttribute = {\n          type: spec.ShapePrimitiveType.Polygon,\n          pointCount: polygonData.pointCount,\n          radius: polygonData.radius,\n          roundness: polygonData.roundness,\n        };\n\n        this.shapeAttributes = polygonAttribute;\n\n        break;\n      }\n    }\n  }\n\n  private createPaint (paintData: spec.PaintData): Paint {\n    let paint: Paint;\n\n    switch (paintData.type) {\n      case spec.FillType.Solid: {\n        paint = {\n          type: paintData.type,\n          color: new Color().copyFrom(paintData.color),\n        };\n\n        break;\n      }\n      case spec.FillType.GradientLinear:\n      case spec.FillType.GradientAngular:\n      case spec.FillType.GradientRadial: {\n        paint = {\n          type: paintData.type,\n          gradientStops: createValueGetter(paintData.gradientStops) as GradientValue,\n          startPoint: new Vector2().copyFrom(paintData.startPoint),\n          endPoint: new Vector2().copyFrom(paintData.endPoint),\n        };\n\n        break;\n      }\n      case spec.FillType.Texture: {\n\n        const textureTransform = {\n          offset: { x: 0, y: 0 },\n          rotation: 0,\n          scale: { x: 1, y: 1 },\n          ...(paintData.textureTransform ?? {}),\n        };\n\n        paint = {\n          type: paintData.type,\n          texture: this.engine.findObject<Texture>(paintData.texture),\n          scaleMode: paintData.scaleMode,\n          scalingFactor: paintData.scalingFactor ?? 1,\n          opacity: paintData.opacity ?? 1,\n          textureTransform: {\n            offset: new Vector2().copyFrom(textureTransform.offset),\n            rotation: textureTransform.rotation,\n            scale: new Vector2().copyFrom(textureTransform.scale),\n          },\n        };\n\n        break;\n      }\n    }\n\n    return paint;\n  }\n\n  override onApplyAnimationProperties (): void {\n    this.shapeDirty = true;\n    this.materialDirty = true;\n  }\n}","import { effectsClass, serialize } from '../decorators';\nimport { Component } from './component';\nimport { EffectComponent } from './effect-component';\n\n@effectsClass('Fake3DComponent')\nexport class Fake3DComponent extends Component {\n  @serialize()\n  loop = false;\n\n  @serialize()\n  amountOfMotion = 1.0;\n\n  @serialize()\n  animationLength = 2.0;\n\n  @serialize()\n  mode = Fake3DAnimationMode.Linear;\n\n  @serialize()\n  startPositionX = 0;\n  @serialize()\n  startPositionY = 0;\n  @serialize()\n  startPositionZ = 0;\n\n  @serialize()\n  endPositionX = 0;\n  @serialize()\n  endPositionY = 0;\n  @serialize()\n  endPositionZ = 0;\n\n  @serialize()\n  amplitudeX = 0;\n  @serialize()\n  amplitudeY = 0;\n  @serialize()\n  amplitudeZ = 0;\n\n  @serialize()\n  phaseX = 0;\n  @serialize()\n  phaseY = 0;\n  @serialize()\n  phaseZ = 0;\n\n  effectComponent: EffectComponent;\n\n  override onStart (): void {\n    this.effectComponent = this.item.getComponent(EffectComponent);\n  }\n\n  override onUpdate (dt: number): void {\n    this.updateFake3D();\n  }\n\n  updateFake3D () {\n    if (!this.effectComponent) {\n      return;\n    }\n\n    const time = this.item.time % this.animationLength / this.animationLength;\n\n    let _PosX = 0;\n    let _PosY = 0;\n    let _PosZ = 0;\n\n    switch (this.mode) {\n      case Fake3DAnimationMode.Circular:{\n        const PI = Math.PI;\n\n        _PosX = Math.sin(2.0 * PI * (time + this.phaseX)) * this.amplitudeX;\n        _PosY = Math.sin(2.0 * PI * (time + this.phaseY)) * this.amplitudeY;\n        _PosZ = Math.sin(2.0 * PI * (time + this.phaseZ)) * this.amplitudeZ;\n\n        break;\n      }\n      case Fake3DAnimationMode.Linear:{\n        let localTime = time;\n\n        if (this.loop) {\n          if (localTime > 0.5) {\n            localTime = 1 - localTime;\n          }\n\n          localTime *= 2;\n        }\n\n        _PosX = this.startPositionX * (1 - localTime) + localTime * this.endPositionX;\n        _PosY = this.startPositionY * (1 - localTime) + localTime * this.endPositionY;\n        _PosZ = this.startPositionZ * (1 - localTime) + localTime * this.endPositionZ;\n\n        break;\n      }\n    }\n\n    const material = this.effectComponent.material;\n\n    material.setFloat('_PosX', _PosX * this.amountOfMotion);\n    material.setFloat('_PosY', _PosY * this.amountOfMotion);\n    material.setFloat('_PosZ', _PosZ * this.amountOfMotion);\n  }\n}\n\nexport enum Fake3DAnimationMode {\n  Circular,\n  Linear\n}","import * as spec from '@galacean/effects-specification';\nimport { Component } from '../../components';\nimport { effectsClass } from '../../decorators';\nimport type { Engine } from '../../engine';\n\n@effectsClass(spec.DataType.CameraController)\nexport class CameraController extends Component {\n  private options: CameraControllerOptions;\n\n  constructor (\n    engine: Engine,\n    props?: spec.CameraContent,\n  ) {\n    super(engine);\n\n    if (props) {\n      this.fromData(props);\n    }\n  }\n\n  override onUpdate () {\n    if (this.item.composition && this.item.transform.getValid()) {\n      const camera = this.item.composition.camera;\n\n      camera.near = this.options.near;\n      camera.far = this.options.far;\n      camera.fov = this.options.fov;\n      camera.clipMode = this.options.clipMode;\n\n      camera.transform.parentTransform = this.transform.parentTransform;\n      camera.position = this.transform.position;\n      // TODO 修正 GE 四元数旋转共轭问题\n      camera.setQuat(this.transform.getQuaternion().clone().conjugate());\n    }\n  }\n\n  override fromData (data: spec.CameraContent): void {\n    super.fromData(data);\n\n    this.options = data.options;\n  }\n}\n\ninterface CameraControllerOptions {\n  fov: number,\n  far: number,\n  near: number,\n  clipMode?: spec.CameraClipMode,\n  aspect?: number,\n}\n","function _get_prototype_of(o) {\n    _get_prototype_of = Object.setPrototypeOf ? Object.getPrototypeOf : function getPrototypeOf(o) {\n        return o.__proto__ || Object.getPrototypeOf(o);\n    };\n\n    return _get_prototype_of(o);\n}\nexport { _get_prototype_of as _ };\n","import { _ as _construct } from \"./_construct.js\";\nimport { _ as _get_prototype_of } from \"./_get_prototype_of.js\";\nimport { _ as _is_native_function } from \"./_is_native_function.js\";\nimport { _ as _set_prototype_of } from \"./_set_prototype_of.js\";\n\nfunction _wrap_native_super(Class) {\n    var _cache = typeof Map === \"function\" ? new Map() : undefined;\n    _wrap_native_super = function(Class) {\n        if (Class === null || !_is_native_function(Class)) return Class;\n        if (typeof Class !== \"function\") throw new TypeError(\"Super expression must either be null or a function\");\n        if (typeof _cache !== \"undefined\") {\n            if (_cache.has(Class)) return _cache.get(Class);\n            _cache.set(Class, Wrapper);\n        }\n\n        function Wrapper() {\n            return _construct(Class, arguments, _get_prototype_of(this).constructor);\n        }\n        Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } });\n\n        return _set_prototype_of(Wrapper, Class);\n    };\n\n    return _wrap_native_super(Class);\n}\nexport { _wrap_native_super as _ };\n","function _is_native_function(fn) {\n    return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n}\nexport { _is_native_function as _ };\n","import { Plugin } from '../plugin';\n\nexport class CameraVFXItemLoader extends Plugin {\n}\n","import type { Matrix4, Ray, TriangleLike, Vector3 } from '@galacean/effects-math/es/core/index';\nimport { Vector2 } from '@galacean/effects-math/es/core/vector2';\nimport type * as spec from '@galacean/effects-specification';\nimport type { VFXItem } from '../../vfx-item';\nimport type { Composition } from '../../composition';\n\nexport enum HitTestType {\n  triangle = 1,\n  box = 2,\n  sphere = 3,\n  custom = 4,\n}\n\nexport interface BoundingBoxData {\n  type: HitTestType,\n  area: (TriangleLike | Record<string, Vector3>)[],\n}\n\nexport interface BoundingBoxTriangle extends BoundingBoxData {\n  type: HitTestType.triangle,\n  area: TriangleLike[],\n}\n\nexport interface BoundingBoxSphere extends BoundingBoxData {\n  type: HitTestType.sphere,\n  area: {\n    center: Vector3,\n    size: Vector3,\n  }[],\n}\n\nexport interface HitTestTriangleParams {\n  type: HitTestType.triangle,\n  triangles: TriangleLike[],\n  backfaceCulling?: boolean,\n  behavior?: spec.InteractBehavior,\n}\n\nexport interface HitTestBoxParams {\n  type: HitTestType.box,\n  center: Vector3,\n  size: Vector3,\n  behavior?: spec.InteractBehavior,\n}\n\nexport interface HitTestSphereParams {\n  type: HitTestType.sphere,\n  center: Vector3,\n  radius: number,\n  behavior?: spec.InteractBehavior,\n}\n\nexport interface HitTestCustomParams {\n  type: HitTestType.custom,\n  collect (ray: Ray, pointInCanvas: Vector2): Vector3[] | void,\n  behavior?: spec.InteractBehavior,\n}\n\nexport type Region = {\n  name: string,\n  id: string,\n  position: Vector3,\n  behavior?: spec.InteractBehavior,\n  parentId?: string,\n  hitPositions: Vector3[],\n  item: VFXItem,\n  composition: Composition,\n};\n\nexport type HitTestParams = {\n  camera: {\n    position: Vector3,\n    direction: Vector3,\n    viewProjection: Matrix4,\n  },\n  x: number,\n  y: number,\n  inRect: (position: Vector3, width: number, height: number) => boolean,\n};\n\nexport class PointerEventData {\n  position = new Vector2();\n  delta = new Vector2();\n  pointerCurrentRaycast: RaycastResult = new RaycastResult();\n}\n\nexport class RaycastResult {\n  point: Vector3 | null = null;\n  item: VFXItem | null = null;\n}","import type { Composition } from '../../composition';\nimport type { Engine } from '../../engine';\nimport type { Disposable } from '../../utils';\nimport { addItem, isSimulatorCellPhone, logger, removeItem } from '../../utils';\nimport { PointerEventData, type Region } from './click-handler';\n\nexport const EVENT_TYPE_CLICK = 'click';\nexport const EVENT_TYPE_TOUCH_START = 'touchstart';\nexport const EVENT_TYPE_TOUCH_MOVE = 'touchmove';\nexport const EVENT_TYPE_TOUCH_END = 'touchend';\n\nexport type TouchEventType = {\n  x: number,\n  y: number,\n  vx: number,\n  vy: number,\n  ts: number,\n  dx: number,\n  dy: number,\n  width: number,\n  height: number,\n  origin: Event,\n};\n\nexport type TouchParams = {\n  clientX: number,\n  clientY: number,\n  target: EventTarget,\n};\n\nexport enum PointerEventType {\n  PointerDown,\n  PointerUp,\n  PointerMove\n}\n\nexport class EventSystem implements Disposable {\n  enabled = true;\n  skipPointerMovePicking = true;\n\n  private handlers: Record<string, ((event: TouchEventType) => void)[]> = {};\n  private nativeHandlers: Record<string, (event: Event) => void> = {};\n  private target: HTMLCanvasElement | null = null;\n\n  constructor (\n    public engine: Engine,\n    public allowPropagation = false,\n  ) { }\n\n  bindListeners (target: HTMLCanvasElement | null) {\n    this.target = target;\n    let x: number;\n    let y: number;\n    let currentTouch: Record<string, number> | 0;\n    let lastTouch: Record<string, number> | 0;\n    let getTouch: (event: Event) => TouchParams;\n\n    getTouch = event => {\n      return event as MouseEvent as TouchParams;\n    };\n    let touchstart = 'mousedown';\n    let touchmove = 'mousemove';\n    let touchend = 'mouseup';\n    let touchcancel = 'mouseleave';\n\n    const getTouchEventValue = (event: Event, x: number, y: number, dx = 0, dy = 0): TouchEventType => {\n      let vx = 0;\n      let vy = 0;\n      const ts = performance.now();\n\n      if (!this.target) {\n        logger.warn('Trigger TouchEvent after EventSystem is disposed.');\n\n        return {\n          x, y, vx: 0, vy, dx, dy, ts, width: 0, height: 0, origin: event,\n        };\n      }\n      const { width, height } = this.target;\n\n      if (lastTouch) {\n        const dt = ts - lastTouch.ts;\n\n        vx = ((dx - lastTouch.dx) / dt) || 0;\n        vy = ((dy - lastTouch.dy) / dt) || 0;\n        lastTouch = { dx, dy, ts };\n      }\n\n      return { x, y, vx, vy, dx, dy, ts, width, height, origin: event };\n    };\n\n    if (isSimulatorCellPhone()) {\n      getTouch = event => {\n        const { touches, changedTouches } = event as TouchEvent;\n\n        return touches[0] || changedTouches[0];\n      };\n      touchstart = 'touchstart';\n      touchmove = 'touchmove';\n      touchend = 'touchend';\n      touchcancel = 'touchcancel';\n    }\n    this.nativeHandlers = {\n      [touchstart]: event => {\n        if (this.enabled) {\n          const touch = getTouch(event);\n          const cood = getCoord(touch);\n\n          x = cood.x;\n          y = cood.y;\n          lastTouch = currentTouch = {\n            clientX: touch.clientX,\n            clientY: touch.clientY,\n            ts: performance.now(),\n            x,\n            y,\n          };\n          this.dispatchEvent(EVENT_TYPE_TOUCH_START, getTouchEventValue(event, x, y));\n        }\n      },\n      [touchmove]: event => {\n        if (currentTouch && this.enabled) {\n          const cood = getCoord(getTouch(event));\n\n          x = cood.x;\n          y = cood.y;\n          this.dispatchEvent(EVENT_TYPE_TOUCH_MOVE, getTouchEventValue(event, x, y, x - currentTouch.x, y - currentTouch.y));\n        }\n      },\n      [touchend]: event => {\n        if (currentTouch && this.enabled) {\n          if (!this.allowPropagation && event.cancelable) {\n            event.preventDefault();\n            event.stopPropagation();\n          }\n          const touch = getTouch(event);\n          const cood = getCoord(touch);\n          const dt = Math.abs(currentTouch.clientX - touch.clientX) + Math.abs(currentTouch.clientY - touch.clientY);\n\n          x = cood.x;\n          y = cood.y;\n          if (dt < 4) {\n            this.dispatchEvent(EVENT_TYPE_CLICK, getTouchEventValue(event, x, y));\n          }\n          this.dispatchEvent(EVENT_TYPE_TOUCH_END, getTouchEventValue(event, x, y, x - currentTouch.x, y - currentTouch.y));\n        }\n        currentTouch = 0;\n      },\n    };\n    this.nativeHandlers[touchcancel] = this.nativeHandlers[touchend];\n\n    Object.keys(this.nativeHandlers).forEach(name => {\n      this.target?.addEventListener(String(name), this.nativeHandlers[name]);\n    });\n\n    this.addEventListener(EVENT_TYPE_CLICK, this.onClick.bind(this));\n    this.addEventListener(EVENT_TYPE_TOUCH_START, this.onPointerDown.bind(this));\n    this.addEventListener(EVENT_TYPE_TOUCH_END, this.onPointerUp.bind(this));\n    this.addEventListener(EVENT_TYPE_TOUCH_MOVE, this.onPointerMove.bind(this));\n  }\n\n  dispatchEvent (type: string, event: TouchEventType) {\n    const handlers = this.handlers[type];\n\n    handlers?.forEach(fn => fn(event));\n  }\n\n  addEventListener (type: string, callback: (event: TouchEventType) => void): () => void {\n    let handlers = this.handlers[type];\n\n    if (!handlers) {\n      handlers = this.handlers[type] = [];\n    }\n    addItem(handlers, callback);\n\n    return () => {\n      removeItem(handlers, callback);\n    };\n  }\n\n  removeEventListener (type: string, callback: (event: TouchEventType) => void) {\n    const handlers = this.handlers[type];\n\n    if (handlers) {\n      removeItem(handlers, callback);\n    }\n  }\n\n  private onClick (e: TouchEventType) {\n    const { x, y } = e;\n    const hitResults: Region[] = [];\n\n    // 收集所有的点击测试结果，click 回调执行可能会对 composition 点击结果有影响，放在点击测试执行完后再统一触发。\n    for (const composition of this.engine.compositions) {\n      hitResults.push(...composition.hitTest(x, y));\n    }\n\n    for (const hitResult of hitResults) {\n      const hitComposition = hitResult.item.composition;\n\n      if (!hitComposition) {\n        continue;\n      }\n\n      const clickInfo = {\n        ...hitResult,\n        compositionId: hitComposition.id,\n        compositionName: hitComposition.name,\n      };\n\n      hitResult.item.emit('click', hitResult);\n      hitComposition.emit('click', clickInfo);\n      this.engine.emit('click', clickInfo);\n    }\n  }\n\n  private onPointerDown (e: TouchEventType) {\n    this.handlePointerEvent(e, PointerEventType.PointerDown);\n  }\n\n  private onPointerUp (e: TouchEventType) {\n    this.handlePointerEvent(e, PointerEventType.PointerUp);\n  }\n\n  private onPointerMove (e: TouchEventType) {\n    this.handlePointerEvent(e, PointerEventType.PointerMove);\n  }\n\n  private handlePointerEvent (e: TouchEventType, type: PointerEventType) {\n    let hitRegion: Region | null = null;\n    const { x, y, width, height } = e;\n\n    if (!(type === PointerEventType.PointerMove && this.skipPointerMovePicking)) {\n      for (const composition of this.engine.compositions) {\n        const regions = composition.hitTest(x, y);\n\n        if (regions.length > 0) {\n          hitRegion = regions[regions.length - 1];\n        }\n      }\n    }\n\n    const eventData = new PointerEventData();\n\n    eventData.position.x = (x + 1) / 2 * width;\n    eventData.position.y = (y + 1) / 2 * height;\n    eventData.delta.x = e.vx * width;\n    eventData.delta.y = e.vy * height;\n\n    const raycast = eventData.pointerCurrentRaycast;\n\n    if (hitRegion) {\n      raycast.point = hitRegion.position;\n      raycast.item = hitRegion.item;\n    }\n\n    let eventName: 'pointerdown' | 'pointerup' | 'pointermove' = 'pointerdown';\n\n    switch (type) {\n      case PointerEventType.PointerDown:\n        eventName = 'pointerdown';\n\n        break;\n      case PointerEventType.PointerUp:\n        eventName = 'pointerup';\n\n        break;\n      case PointerEventType.PointerMove:\n        eventName = 'pointermove';\n\n        break;\n    }\n\n    if (hitRegion) {\n      const hitItem = hitRegion.item;\n      const hitComposition = hitItem.composition as Composition;\n\n      hitItem.emit(eventName, eventData);\n      hitComposition.emit(eventName, eventData);\n      this.engine.emit(eventName, eventData);\n    }\n  }\n\n  dispose (): void {\n    if (this.target) {\n      this.handlers = {};\n\n      Object.keys(this.nativeHandlers).forEach(name => {\n        this.target?.removeEventListener(String(name), this.nativeHandlers[name]);\n      });\n      this.nativeHandlers = {};\n    }\n  }\n}\n\nfunction getCoord (event: TouchParams) {\n  const ele = event.target as HTMLElement;\n  const { clientX, clientY } = event;\n  const { left, top, width, height } = ele.getBoundingClientRect();\n  const x = ((clientX - left) / width) * 2 - 1;\n  const y = 1 - ((clientY - top) / height) * 2;\n\n  return { x, y };\n}\n","import { Plugin } from '../plugin';\n\nexport class InteractLoader extends Plugin {\n}\n","import { Matrix4, Quaternion, Vector2, Vector3, Vector4 } from '@galacean/effects-math/es/core/index';\nimport type * as spec from '@galacean/effects-specification';\nimport { PLAYER_OPTIONS_ENV_EDITOR } from '../../constants';\nimport type { Engine } from '../../engine';\nimport { glContext } from '../../gl';\nimport type { MaterialProps } from '../../material';\nimport { Material } from '../../material';\nimport { createValueGetter } from '../../math';\nimport type { ShaderMacros } from '../../render';\nimport { GLSLVersion, Geometry, Mesh } from '../../render';\nimport type { Transform } from '../../transform';\n\nconst vertex = `\nprecision highp float;\n\nattribute vec2 aPoint;\nuniform vec4 uPos;\nuniform vec2 uSize;\nuniform vec4 uQuat;\nuniform vec4 uColor;\nuniform mat4 effects_ObjectToWorld;\nuniform mat4 effects_MatrixInvV;\nuniform mat4 effects_MatrixVP;\nvarying vec4 vColor;\n\nvec3 rotateByQuat(vec3 a, vec4 quat){\n  vec3 qvec = quat.xyz;\n  vec3 uv = cross(qvec, a);\n  vec3 uuv = cross(qvec, uv) * 2.;\n  return a +(uv * 2. * quat.w + uuv);\n}\n\nvoid main() {\n  vec4 _pos = uPos;\n  vec3 point = rotateByQuat(vec3(aPoint.xy * uSize, 0.),uQuat);\n  vec4 pos = vec4(_pos.xyz, 1.0);\n  pos = effects_ObjectToWorld * pos;\n  pos.xyz += effects_MatrixInvV[0].xyz * point.x+ effects_MatrixInvV[1].xyz * point.y;\n  gl_Position = effects_MatrixVP * pos;\n  vColor = uColor;\n}\n`;\nconst fragment = `\nprecision highp float;\n\n#define fragColor gl_FragColor\n\nvarying vec4 vColor;\nvoid main() {\n  gl_FragColor = vColor*vColor.a;\n}\n`;\n\nlet seed = 1;\n\nexport class InteractMesh {\n  mesh: Mesh;\n  private readonly color: spec.RGBAColor | spec.RGBAColorValue;\n\n  constructor (\n    props: spec.InteractContent,\n    private readonly transform: Transform,\n    private readonly engine: Engine,\n  ) {\n    this.color = (props.options as spec.ClickInteractOption).previewColor;\n    const material = this.createMaterial();\n    const geometry = this.createGeometry();\n\n    this.mesh = this.createMesh(geometry, material);\n    this.updateMesh();\n  }\n\n  updateMesh () {\n    const { material } = this.mesh;\n    const uSize = material.getVector2('uSize')!.clone();\n    const uPos = material.getVector4('uPos')!.clone();\n\n    const tempPos = new Vector3();\n    const tempQuat = new Quaternion();\n    const tempScale = this.transform.scale.clone();\n\n    this.transform.assignWorldTRS(tempPos, tempQuat, tempScale);\n\n    uSize.x = tempScale.x;\n    uSize.y = tempScale.y;\n    uPos.x = tempPos.x;\n    uPos.y = tempPos.y;\n    uPos.z = tempPos.z;\n\n    material.setVector2('uSize', uSize);\n    material.setVector4('uPos', uPos);\n    material.setQuaternion('uQuat', tempQuat);\n  }\n\n  private createMaterial (): Material {\n    const macros: ShaderMacros = [\n      ['ENV_EDITOR', this.engine.env === PLAYER_OPTIONS_ENV_EDITOR],\n    ];\n    const color = createValueGetter(this.color).getValue(0);\n    const materialProps: MaterialProps = {\n      shader: {\n        vertex,\n        fragment,\n        glslVersion: GLSLVersion.GLSL1,\n        macros,\n      },\n    };\n\n    const material = Material.create(this.engine, materialProps);\n\n    material.blending = true;\n    material.depthTest = false;\n    material.setVector4('uPos', new Vector4(0, 0, 0, 0));\n    material.setVector2('uSize', new Vector2(1, 1));\n    material.setVector4('uColor', new Vector4(color[0] / 255, color[1] / 255, color[2] / 255, color[3]));\n    material.setQuaternion('uQuat', new Quaternion(0, 0, 0, 0));\n\n    return material;\n  }\n\n  private createGeometry () {\n    const indexData = new Uint8Array([0, 1, 1, 2, 2, 3, 3, 0]);\n\n    return Geometry.create(\n      this.engine,\n      {\n        attributes: {\n          aPoint: {\n            size: 2,\n            offset: 0,\n            stride: 2 * Float32Array.BYTES_PER_ELEMENT,\n            data: new Float32Array([\n              -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, -0.5,\n            ]),\n          },\n        },\n        drawCount: indexData.length,\n        indices: { data: indexData },\n        mode: glContext.LINES,\n        maxVertex: 4,\n      });\n  }\n\n  private createMesh (geometry: Geometry, material: Material) {\n    return Mesh.create(\n      this.engine,\n      {\n        name: 'Interact_preview' + seed++,\n        priority: 0,\n        worldMatrix: Matrix4.fromIdentity(),\n        geometry,\n        material,\n      });\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport { clamp } from '@galacean/effects-math/es/core/utils';\nimport { Vector3 } from '@galacean/effects-math/es/core/vector3';\nimport { PLAYER_OPTIONS_ENV_EDITOR } from '../../constants';\nimport { trianglesFromRect } from '../../math';\nimport type { BoundingBoxTriangle, HitTestTriangleParams } from './click-handler';\nimport { HitTestType } from './click-handler';\nimport type { EventSystem, TouchEventType } from './event-system';\nimport { InteractMesh } from './interact-mesh';\nimport { RendererComponent } from '../../components';\nimport type { DragEventType } from './interact-vfx-item';\nimport type { Renderer } from '../../render';\nimport { effectsClass } from '../../decorators';\nimport { isArray } from '../../utils';\n\n/**\n * 交互组件\n * @since 2.0.0\n */\n@effectsClass(spec.DataType.InteractComponent)\nexport class InteractComponent extends RendererComponent {\n  clickable: boolean;\n  dragEvent: DragEventType | null;\n  bouncingArg: TouchEventType | null;\n  previewContent: InteractMesh | null;\n  interactData: spec.InteractContent;\n  /**\n   * 拖拽后的惯性衰减系数，范围[0, 1], 越大惯性越强\n   * @default 0.95\n   */\n  downgrade = 0.95;\n  /**\n   * 拖拽后的惯性速度，范围[0, +∞), 越大惯性越强\n   * @default 25\n   * @since 2.6.0\n   */\n  speed = 25;\n  /**\n   * 拖拽时的距离映射系数，越大越容易拖动\n   * @default [1, 1]\n   */\n  dragRatio: number[] = [1, 1];\n  /**\n   * 拖拽范围（编辑器制作时已经设置好，特殊情况可运行时修改）\n   */\n  dragRange: {\n    dxRange: [min: number, max: number],\n    dyRange: [min: number, max: number],\n  } = {\n      dxRange: [0, 0],\n      dyRange: [0, 0],\n    };\n\n  /**\n   * 滑动失效区域，范围[0, 1]，单位 %，避免滑动触控冲突（如 iOS 右滑退出时不执行）\n   * > 若是数组形式，格式为：[top、right、bottom、left]\n   * @since 2.6.0\n   * @default 0\n   */\n  invalidBorderRange: number | number[] = 0;\n\n  private invalidByBorderRange = false;\n  private duringPlay = false;\n\n  /** 是否响应点击和拖拽交互事件 */\n  private _interactive = true;\n\n  private lastTime = -1;\n\n  /**\n   * 是否响应点击和拖拽交互事件\n   */\n  set interactive (enable: boolean) {\n    this._interactive = enable;\n    if (!enable) {\n      // 立刻停止惯性滑动\n      this.bouncingArg = null;\n    }\n  }\n  get interactive () {\n    return this._interactive;\n  }\n\n  /**\n   * 获取拖拽范围 X 轴\n   * @returns 拖拽范围 [min, max]\n   */\n  getDragRangeX (): [min: number, max: number] {\n    return this.dragRange.dxRange;\n  }\n\n  /**\n   * 设置拖拽范围 X 轴\n   * @param min 最小值\n   * @param max 最大值\n   */\n  setDragRangeX (min: number, max: number) {\n    this.dragRange.dxRange = [min, max];\n  }\n\n  /**\n   * 获取拖拽范围 Y 轴\n   * @returns 拖拽范围 [min, max]\n   */\n  getDragRangeY (): [min: number, max: number] {\n    return this.dragRange.dyRange;\n  }\n\n  /**\n   * 设置拖拽范围 Y 轴\n   * @param min 最小值\n   * @param max 最大值\n   */\n  setDragRangeY (min: number, max: number) {\n    this.dragRange.dyRange = [min, max];\n  }\n\n  override onStart (): void {\n    const { env } = this.item.engine;\n    const { type, showPreview } = this.interactData.options as spec.ClickInteractOption;\n\n    if (type === spec.InteractType.CLICK) {\n      this.clickable = true;\n      if (showPreview && env === PLAYER_OPTIONS_ENV_EDITOR) {\n        this.previewContent = new InteractMesh((this.item.props as spec.InteractItem).content, this.transform, this.engine);\n      }\n    }\n    if (this.previewContent) {\n      this.previewContent.mesh.item = this.item;\n      this.materials = this.previewContent.mesh.materials;\n    }\n    this.item.getHitTestParams = this.getHitTestParams;\n  }\n\n  override onDisable (): void {\n    super.onDisable();\n    if (this.item && this.item.composition) {\n      // Triggers the Message end event, do not trigger when reverse playback\n      if (this.duringPlay && !this.item.transform.getValid() && this.item.composition.getSpeed() > 0) {\n        this.item.composition.removeInteractiveItem(this.item, (this.item.props as spec.InteractItem).content.options.type);\n        this.duringPlay = false;\n      }\n      this.clickable = false;\n      this.endDragTarget();\n    }\n  }\n\n  override onEnable (): void {\n    super.onEnable();\n    const { type } = this.interactData.options as spec.ClickInteractOption;\n    const { env } = this.item.engine;\n\n    if (type === spec.InteractType.CLICK) {\n      this.clickable = true;\n    } else if (type === spec.InteractType.DRAG) {\n      const options = this.interactData.options as spec.DragInteractOption;\n      const enableInEditor = options.enableInEditor;\n\n      if (env !== PLAYER_OPTIONS_ENV_EDITOR || enableInEditor) {\n        const { event } = this.item.composition ?? {};\n\n        if (event) {\n          this.beginDragTarget(options, event);\n        }\n      }\n    }\n  }\n\n  override onUpdate (dt: number): void {\n    this.duringPlay = true;\n\n    // Trigger messageBegin when item enter\n    if (this.lastTime <= this.item.time) {\n      if (this.item.time >= 0 && this.lastTime < 0) {\n        const options = this.item.props.content.options as spec.DragInteractOption;\n\n        this.item.composition?.addInteractiveItem(this.item, options.type);\n      }\n    } else {\n      // Loop trigger, do not trigger when reverse playback\n      if (this.item.time >= 0 && dt > 0) {\n        const options = this.item.props.content.options as spec.DragInteractOption;\n\n        this.item.composition?.addInteractiveItem(this.item, options.type);\n      }\n    }\n\n    this.lastTime = this.item.time;\n\n    this.previewContent?.updateMesh();\n\n    if (!this.dragEvent || !this.bouncingArg) {\n      return;\n    }\n\n    this.bouncingArg.vx *= this.downgrade;\n    this.bouncingArg.vy *= this.downgrade;\n    this.bouncingArg.dy += this.bouncingArg.vy;\n    this.bouncingArg.dx += this.bouncingArg.vx;\n\n    if (shouldIgnoreBouncing(this.bouncingArg)) {\n      this.dragEvent = null;\n      this.bouncingArg = null;\n    } else {\n      this.handleDragMove(this.dragEvent, this.bouncingArg);\n    }\n  }\n\n  override render (renderer: Renderer): void {\n    if (this.previewContent) {\n      this.previewContent.mesh.render(renderer);\n    }\n  }\n\n  override onDestroy (): void {\n    this.previewContent?.mesh.dispose();\n  }\n\n  endDragTarget () {\n    // OVERRIDE\n  }\n\n  handleDragMove (evt: Partial<DragEventType>, event: TouchEventType) {\n    if (!evt?.cameraParam || !this.canInteract() || !this.item.composition) {\n      return;\n    }\n\n    const { position, fov } = evt.cameraParam;\n    const dy = event.dy;\n    const dx = event.dx * event.width / event.height;\n    const depth = position[2];\n    const sp = Math.tan(fov * Math.PI / 180 / 2) * Math.abs(depth);\n    const height = dy * sp;\n    const width = dx * sp;\n    const { dxRange, dyRange } = this.dragRange;\n    let nx = position[0] - this.dragRatio[0] * width;\n    let ny = position[1] - this.dragRatio[1] * height;\n\n    const [xMin, xMax] = dxRange;\n    const [yMin, yMax] = dyRange;\n\n    nx = clamp(nx, xMin, xMax);\n    ny = clamp(ny, yMin, yMax);\n    if (nx !== xMin && nx !== xMax && xMin !== xMax) {\n      event.origin?.preventDefault();\n    }\n    if (ny !== yMin && ny !== yMax && yMin !== yMax) {\n      event.origin?.preventDefault();\n    }\n    this.item.composition.camera.position = new Vector3(nx, ny, depth);\n  }\n\n  beginDragTarget (options: spec.DragInteractOption, eventSystem: EventSystem) {\n    if (options.target !== 'camera') {\n      return;\n    }\n    let dragEvent: Partial<DragEventType> | null;\n    const handlerMap: Record<string, (event: TouchEventType) => void> = {\n      touchstart: (event: TouchEventType) => {\n        if (!this.canInteract()) {\n          return;\n        }\n        this.invalidByBorderRange = this.checkInvalidBorderRange({ x: event.x, y: event.y });\n\n        if (this.invalidByBorderRange) {\n          return;\n        }\n        this.dragEvent = null;\n        this.bouncingArg = null;\n        const camera = this.item.composition?.camera;\n\n        dragEvent = {\n          x: event.x,\n          y: event.y,\n          cameraParam: {\n            position: camera?.position.toArray() || [0, 0, 8],\n            fov: camera?.fov || 60,\n          },\n        };\n      },\n      touchmove: (event: TouchEventType) => {\n        if (this.invalidByBorderRange) {\n          return;\n        }\n\n        this.handleDragMove(dragEvent as Partial<DragEventType>, event);\n        this.bouncingArg = event;\n      },\n      touchend: (event: TouchEventType) => {\n        if (!this.canInteract()) {\n          return;\n        }\n        const bouncingArg = this.bouncingArg as TouchEventType;\n\n        if (!shouldIgnoreBouncing(bouncingArg, 3) && bouncingArg) {\n          bouncingArg.vx *= this.speed;\n          bouncingArg.vy *= this.speed;\n          this.dragEvent = { ...dragEvent as DragEventType };\n        }\n        dragEvent = null;\n      },\n    };\n\n    Object.keys(handlerMap).forEach(name => {\n      eventSystem.addEventListener(name, handlerMap[name]);\n    });\n\n    handlerMap.touchmove({ dx: 0, dy: 0, width: 1, height: 1 } as TouchEventType);\n    this.item.getComponent(InteractComponent).endDragTarget = () => {\n      Object.keys(handlerMap).forEach(name => {\n        eventSystem.removeEventListener(name, handlerMap[name]);\n      });\n    };\n  }\n\n  getHitTestParams = (force?: boolean): HitTestTriangleParams | void => {\n    if (!this.clickable) {\n      return;\n    }\n    const { behavior } = (this.item.props as spec.InteractItem).content.options as spec.ClickInteractOption;\n    const area = this.getBoundingBox();\n\n    if (area) {\n      return {\n        type: area.type,\n        triangles: area.area,\n        behavior,\n      };\n    }\n  };\n\n  getBoundingBox (): BoundingBoxTriangle | void {\n    const worldMatrix = this.transform.getWorldMatrix();\n    const triangles = trianglesFromRect(Vector3.ZERO, 0.5 * this.transform.size.x, 0.5 * this.transform.size.y);\n\n    triangles.forEach(triangle => {\n      worldMatrix.transformPoint(triangle.p0 as Vector3);\n      worldMatrix.transformPoint(triangle.p1 as Vector3);\n      worldMatrix.transformPoint(triangle.p2 as Vector3);\n    });\n\n    return {\n      type: HitTestType.triangle,\n      area: triangles,\n    };\n  }\n\n  override fromData (data: spec.InteractContent): void {\n    super.fromData(data);\n    this.interactData = data;\n    if (data.options.type === spec.InteractType.DRAG) {\n      const options = data.options as spec.DragInteractOption;\n\n      if (options.dxRange) {\n        this.dragRange.dxRange = options.dxRange;\n      }\n      if (options.dyRange) {\n        this.dragRange.dyRange = options.dyRange;\n      }\n    }\n  }\n\n  /**\n   * 是否可以交互\n   * @returns\n   */\n  canInteract (): boolean {\n    return Boolean(this.item.composition?.interactive) && this._interactive;\n  }\n\n  /**\n   * 检查滑动手势边界\n   * @param position\n   */\n  private checkInvalidBorderRange (\n    position: { x: number, y: number },\n  ) {\n    const invalidBorderRange = this.invalidBorderRange;\n\n    if (invalidBorderRange) {\n      let top = 0;\n      let right = 0;\n      let bottom = 0;\n      let left = 0;\n\n      if (typeof invalidBorderRange === 'number') {\n        top = invalidBorderRange;\n        right = invalidBorderRange;\n        bottom = invalidBorderRange;\n        left = invalidBorderRange;\n      } else if (isArray(invalidBorderRange)) {\n        [top = 0, right = 0, bottom = 0, left = 0] = invalidBorderRange;\n      }\n\n      if (\n        position.x < left - 1 ||\n        position.x > (1 - right) ||\n        position.y < top - 1 ||\n        position.y > (1 - bottom)\n      ) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n}\n\nfunction shouldIgnoreBouncing (arg: TouchEventType, mul?: number) {\n  const threshold = 0.00001 * (mul || 1);\n\n  return arg && Math.abs(arg.vx || 0) < threshold && Math.abs(arg.vy || 0) < threshold;\n}\n","import type { TypedArray } from '@galacean/effects-specification';\nimport type { TriangleLike } from '@galacean/effects-math/es/core/type';\nimport { Matrix4 } from '@galacean/effects-math/es/core/matrix4';\nimport { Vector3 } from '@galacean/effects-math/es/core/vector3';\nimport type { Geometry } from '../../render/geometry';\nimport type { BoundingBoxTriangle } from './click-handler';\nimport { HitTestType } from './click-handler';\n\n/**\n *\n */\nexport class MeshCollider {\n  private boundingBoxData: BoundingBoxTriangle;\n  private triangles: TriangleLike[] = [];\n  private worldMatrix = new Matrix4();\n\n  getBoundingBoxData (): BoundingBoxTriangle {\n    this.applyWorldMatrix(this.boundingBoxData.area);\n\n    return this.boundingBoxData;\n  }\n\n  getBoundingBox (): BoundingBoxTriangle {\n    let maxX = -Number.MAX_VALUE;\n    let maxY = -Number.MAX_VALUE;\n\n    let minX = Number.MAX_VALUE;\n    let minY = Number.MAX_VALUE;\n\n    for (const triangle of this.boundingBoxData.area) {\n      maxX = Math.max(triangle.p0.x, triangle.p1.x, triangle.p2.x, maxX);\n      maxY = Math.max(triangle.p0.y, triangle.p1.y, triangle.p2.y, maxY);\n      minX = Math.min(triangle.p0.x, triangle.p1.x, triangle.p2.x, minX);\n      minY = Math.min(triangle.p0.y, triangle.p1.y, triangle.p2.y, minY);\n    }\n\n    const area = [];\n\n    const point0 = new Vector3(minX, maxY, 0);\n    const point1 = new Vector3(maxX, maxY, 0);\n    const point2 = new Vector3(maxX, minY, 0);\n    const point3 = new Vector3(minX, minY, 0);\n\n    area.push({ p0: point0, p1: point1, p2: point2 });\n    area.push({ p0: point0, p1: point2, p2: point3 });\n\n    this.applyWorldMatrix(area);\n\n    return {\n      type: HitTestType.triangle,\n      area,\n    };\n  }\n\n  setGeometry (geometry: Geometry, worldMatrix?: Matrix4) {\n    this.triangles = this.geometryToTriangles(geometry);\n    const area = [];\n\n    for (const triangle of this.triangles) {\n      area.push({ p0: triangle.p0, p1: triangle.p1, p2: triangle.p2 });\n    }\n    if (worldMatrix) {\n      this.worldMatrix.copyFrom(worldMatrix);\n    }\n\n    this.boundingBoxData = {\n      type: HitTestType.triangle,\n      area,\n    };\n  }\n\n  private geometryToTriangles (geometry: Geometry) {\n    const indices = geometry.getIndexData();\n    const vertices = geometry.getAttributeData('aPos');\n    const res: TriangleLike[] = [];\n\n    if (!indices || !vertices) {\n      return res;\n    }\n\n    if (geometry.subMeshes.length === 0) {\n      this.assemblyTriangles(vertices, indices, 0, indices.length, res);\n    } else {\n      for (const subMesh of geometry.subMeshes) {\n        if (subMesh.indexCount === undefined) {\n          continue;\n        }\n\n        const elementSize = indices.BYTES_PER_ELEMENT;\n        const start = subMesh.offset / elementSize;\n        const end = start + subMesh.indexCount;\n\n        this.assemblyTriangles(vertices, indices, start, end, res);\n      }\n    }\n\n    return res;\n  }\n\n  private assemblyTriangles = (vertices: TypedArray, indices: TypedArray, indexStart: number, indexEnd: number, res: TriangleLike[]) => {\n    for (let i = indexStart; i < indexEnd; i += 3) {\n      const index0 = indices[i] * 3;\n      const index1 = indices[i + 1] * 3;\n      const index2 = indices[i + 2] * 3;\n      const p0 = { x: vertices[index0], y: vertices[index0 + 1], z: vertices[index0 + 2] };\n      const p1 = { x: vertices[index1], y: vertices[index1 + 1], z: vertices[index1 + 2] };\n      const p2 = { x: vertices[index2], y: vertices[index2 + 1], z: vertices[index2 + 2] };\n\n      res.push({ p0, p1, p2 });\n    }\n  };\n\n  private applyWorldMatrix (area: TriangleLike[]) {\n    area.forEach(triangle => {\n      triangle.p0 = this.worldMatrix.transformPoint(triangle.p0 as Vector3, new Vector3());\n      triangle.p1 = this.worldMatrix.transformPoint(triangle.p1 as Vector3, new Vector3());\n      triangle.p2 = this.worldMatrix.transformPoint(triangle.p2 as Vector3, new Vector3());\n    });\n\n    return area;\n  }\n}\n","import { Plugin } from '../plugin';\n\nexport class SpriteLoader extends Plugin {\n  override name = 'sprite';\n}\n","import { EffectsObject } from '../../effects-object';\nimport type { Disposable } from '../../utils';\n\n/**\n * 动画图可播放节点对象\n * @since 2.0.0\n */\nexport class Playable implements Disposable {\n  onPlayablePlayFlag = true;\n  onPlayablePauseFlag = false;\n\n  private duration = 0;\n  private destroyed = false;\n  private playState: PlayState = PlayState.Playing;\n\n  /**\n   * 当前本地播放的时间\n   */\n  protected time: number = 0;\n\n  constructor () {}\n\n  play () {\n    switch (this.playState) {\n      case PlayState.Playing:\n        break;\n      case PlayState.Paused:\n        this.playState = PlayState.Playing;\n        this.onPlayablePlayFlag = true;\n        this.onPlayablePauseFlag = false;\n\n        break;\n    }\n  }\n\n  pause () {\n    switch (this.playState) {\n      case PlayState.Playing:\n        this.playState = PlayState.Paused;\n        this.onPlayablePauseFlag = true;\n        this.onPlayablePlayFlag = false;\n\n        break;\n      case PlayState.Paused:\n        break;\n    }\n  }\n\n  setTime (time: number) {\n    this.time = time;\n  }\n\n  getTime () {\n    return this.time;\n  }\n\n  setDuration (duration: number) {\n    this.duration = duration;\n  }\n\n  getDuration () {\n    return this.duration;\n  }\n\n  getPlayState () {\n    return this.playState;\n  }\n\n  // onPlayablePlay (context: FrameContext) {\n\n  // }\n\n  // onPlayablePause (context: FrameContext) {\n\n  // }\n\n  prepareFrame (context: FrameContext) {\n\n  }\n\n  processFrame (context: FrameContext) {\n\n  }\n\n  onPlayableDestroy () {\n\n  }\n\n  dispose (): void {\n    if (this.destroyed) {\n      return;\n    }\n    this.onPlayableDestroy();\n    // TODO 将节点从动画图中移除\n    this.destroyed = true;\n  }\n}\n\n/**\n * 动画图输出节点对象，将动画数据采样到绑定的元素属性上\n * @since 2.0.0\n */\nexport class PlayableOutput {\n  /**\n   * 绑定到的动画 item\n   */\n  userData: object;\n  context: FrameContext;\n  /**\n   * 当前本地播放的时间\n   */\n  protected time: number;\n\n  constructor () {\n    this.context = {\n      deltaTime: 0,\n      output: this,\n    };\n  }\n\n  setUserData (value: object) {\n    this.userData = value;\n  }\n\n  getUserData () {\n    return this.userData;\n  }\n\n  // onGraphStart () {\n\n  // }\n\n  prepareFrame () {\n\n  }\n\n  processFrame () {\n\n  }\n}\n\nexport abstract class PlayableAsset extends EffectsObject {\n  abstract createPlayable (): Playable;\n}\n\nexport interface FrameContext {\n  deltaTime: number,\n  output: PlayableOutput,\n}\n\nexport enum PlayState {\n  Playing,\n  Paused,\n}\n","import * as spec from '@galacean/effects-specification';\nimport { createValueGetter, vecFill, vecMulCombine, type ValueGetter } from '../math';\nimport type { FrameContext } from '../plugins/timeline/playable';\nimport { Playable } from '../plugins/timeline/playable';\nimport { VFXItem } from '../vfx-item';\nimport type { Material } from '../material';\nimport type { ColorStop } from '../utils';\nimport { colorStopsFromGradient, getColorFromGradientStops } from '../utils';\nimport { MaskableGraphic } from '../components';\n\nexport interface ColorPlayableAssetData extends spec.EffectsObjectData {\n  colorOverLifetime?: spec.ColorOverLifetime,\n}\n\nconst tempColor: spec.RGBAColorValue = [1, 1, 1, 1];\n\nexport class ColorPlayable extends Playable {\n  clipData: { colorOverLifetime?: spec.ColorOverLifetime, startColor?: spec.RGBAColorValue };\n  colorOverLifetime: ColorStop[];\n  opacityOverLifetime: ValueGetter<number>;\n  startColor: spec.RGBAColorValue;\n  renderColor: spec.vec4 = [1, 1, 1, 1];\n  activeComponent?: MaskableGraphic;\n  activeMaterial?: Material;\n\n  override processFrame (context: FrameContext): void {\n    const boundObject = context.output.getUserData();\n\n    if (!(boundObject instanceof VFXItem)) {\n      return;\n    }\n    if (!this.activeComponent) {\n      this.activeComponent = this.getActiveComponent(boundObject);\n    }\n    if (!this.activeMaterial) {\n      this.activeMaterial = this.activeComponent?.material;\n      const startColor = this.activeMaterial?.getColor('_Color');\n\n      if (startColor) {\n        this.startColor = startColor.toArray();\n      }\n    }\n\n    let colorInc = vecFill(tempColor, 1);\n    let colorChanged;\n    const life = this.time / this.getDuration();\n\n    const opacityOverLifetime = this.opacityOverLifetime;\n    const colorOverLifetime = this.colorOverLifetime;\n\n    if (colorOverLifetime) {\n      colorInc = getColorFromGradientStops(colorOverLifetime, life, true) as spec.vec4;\n      colorChanged = true;\n    }\n    if (opacityOverLifetime) {\n      colorInc[3] *= opacityOverLifetime.getValue(life);\n      colorChanged = true;\n    }\n\n    if (colorChanged) {\n      vecMulCombine<spec.vec4>(this.renderColor, colorInc, this.startColor);\n      this.activeMaterial?.getColor('_Color')?.setFromArray(this.renderColor);\n    }\n  }\n\n  create (clipData: ColorPlayableAssetData) {\n    this.clipData = clipData;\n    const colorOverLifetime = clipData.colorOverLifetime;\n\n    if (colorOverLifetime) {\n      this.opacityOverLifetime = createValueGetter(colorOverLifetime.opacity ?? 1);\n      if (colorOverLifetime.color && colorOverLifetime.color[0] === spec.ValueType.GRADIENT_COLOR) {\n        this.colorOverLifetime = colorStopsFromGradient(colorOverLifetime.color[1]);\n      }\n    }\n\n    return this;\n  }\n\n  getActiveComponent (boundObject: VFXItem): MaskableGraphic {\n    return boundObject.getComponent(MaskableGraphic);\n  }\n\n}\n","import type { Euler } from '@galacean/effects-math/es/core/euler';\nimport type { Quaternion } from '@galacean/effects-math/es/core/quaternion';\nimport { clamp } from '@galacean/effects-math/es/core/utils';\nimport * as spec from '@galacean/effects-specification';\nimport { effectsClass } from '../decorators';\nimport { EffectsObject } from '../effects-object';\nimport type { ValueGetter, Vector3Curve, BezierCurve, ColorCurve } from '../math';\nimport { createValueGetter } from '../math';\nimport type { VFXItem } from '../vfx-item';\n\nexport interface AnimationCurve {\n  path: string,\n  keyFrames: ValueGetter<any>,\n}\n\nexport interface PositionAnimationCurve extends AnimationCurve {\n  keyFrames: Vector3Curve,\n}\n\nexport interface EulerAnimationCurve extends AnimationCurve {\n  keyFrames: ValueGetter<Euler>,\n}\n\nexport interface RotationAnimationCurve extends AnimationCurve {\n  keyFrames: ValueGetter<Quaternion>,\n}\n\nexport interface ScaleAnimationCurve extends AnimationCurve {\n  keyFrames: Vector3Curve,\n}\n\nexport interface FloatAnimationCurve extends AnimationCurve {\n  property: string,\n  className: string,\n  keyFrames: BezierCurve,\n}\n\nexport interface ColorAnimationCurve extends AnimationCurve {\n  property: string,\n  className: string,\n  keyFrames: ColorCurve,\n}\n\n@effectsClass(spec.DataType.AnimationClip)\nexport class AnimationClip extends EffectsObject {\n  duration = 0;\n  positionCurves: PositionAnimationCurve[] = [];\n  rotationCurves: RotationAnimationCurve[] = [];\n  eulerCurves: EulerAnimationCurve[] = [];\n  scaleCurves: ScaleAnimationCurve[] = [];\n  floatCurves: FloatAnimationCurve[] = [];\n  colorCurves: ColorAnimationCurve[] = [];\n\n  sampleAnimation (vfxItem: VFXItem, time: number) {\n    const life = clamp(time, 0, this.duration);\n\n    for (const curve of this.positionCurves) {\n      const value = curve.keyFrames.getValue(life);\n      const target = this.findTarget(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);\n      const target = this.findTarget(vfxItem, curve.path);\n\n      target?.transform.setQuaternion(value.x, value.y, value.z, value.w);\n    }\n\n    for (const curve of this.eulerCurves) {\n      const value = curve.keyFrames.getValue(life);\n      const target = this.findTarget(vfxItem, curve.path);\n\n      target?.transform.setRotation(value.x, value.y, value.z);\n    }\n\n    for (const curve of this.scaleCurves) {\n      const value = curve.keyFrames.getValue(life);\n      const target = this.findTarget(vfxItem, curve.path);\n\n      target?.transform.setScale(value.x, value.y, value.z);\n    }\n\n    // TODO float curves 采样\n  }\n\n  override fromData (data: spec.AnimationClipData): void {\n    this.positionCurves.length = 0;\n    this.scaleCurves.length = 0;\n    this.rotationCurves.length = 0;\n    this.eulerCurves.length = 0;\n    this.floatCurves.length = 0;\n    this.colorCurves.length = 0;\n\n    let keyFramesDuration = 0;\n\n    if (data.positionCurves) {\n      for (const positionCurveData of data.positionCurves) {\n        const curve: PositionAnimationCurve = {\n          path: positionCurveData.path,\n          keyFrames: createValueGetter(positionCurveData.keyFrames) as Vector3Curve,\n        };\n\n        keyFramesDuration = Math.max(keyFramesDuration, curve.keyFrames.getMaxTime());\n\n        this.positionCurves.push(curve);\n      }\n    }\n\n    if (data.rotationCurves) {\n      for (const rotationCurveData of data.rotationCurves) {\n        const curve: RotationAnimationCurve = {\n          path: rotationCurveData.path,\n          keyFrames: createValueGetter(rotationCurveData.keyFrames),\n        };\n\n        keyFramesDuration = Math.max(keyFramesDuration, curve.keyFrames.getMaxTime());\n\n        this.rotationCurves.push(curve);\n      }\n    }\n\n    if (data.eulerCurves) {\n      for (const eulerCurvesData of data.eulerCurves) {\n        const curve: EulerAnimationCurve = {\n          path: eulerCurvesData.path,\n          keyFrames: createValueGetter(eulerCurvesData.keyFrames),\n        };\n\n        keyFramesDuration = Math.max(keyFramesDuration, curve.keyFrames.getMaxTime());\n\n        this.eulerCurves.push(curve);\n      }\n    }\n\n    if (data.scaleCurves) {\n      for (const scaleCurvesData of data.scaleCurves) {\n        const curve: ScaleAnimationCurve = {\n          path: scaleCurvesData.path,\n          keyFrames: createValueGetter(scaleCurvesData.keyFrames) as Vector3Curve,\n        };\n\n        keyFramesDuration = Math.max(keyFramesDuration, curve.keyFrames.getMaxTime());\n\n        this.scaleCurves.push(curve);\n      }\n    }\n\n    if (data.floatCurves) {\n      for (const floatCurveData of data.floatCurves) {\n        const curve: FloatAnimationCurve = {\n          path: floatCurveData.path,\n          keyFrames: createValueGetter(floatCurveData.keyFrames) as BezierCurve,\n          property: floatCurveData.property,\n          className: floatCurveData.className,\n        };\n\n        keyFramesDuration = Math.max(keyFramesDuration, curve.keyFrames.getMaxTime());\n\n        this.floatCurves.push(curve);\n      }\n    }\n\n    if (data.colorCurves) {\n      for (const colorCurveData of data.colorCurves) {\n        const curve: ColorAnimationCurve = {\n          path: colorCurveData.path,\n          keyFrames: createValueGetter(colorCurveData.keyFrames) as ColorCurve,\n          property: colorCurveData.property,\n          className: colorCurveData.className,\n        };\n\n        keyFramesDuration = Math.max(keyFramesDuration, curve.keyFrames.getMaxTime());\n\n        this.colorCurves.push(curve);\n      }\n    }\n\n    if (data.duration !== undefined) {\n      this.duration = data.duration;\n    } else {\n      this.duration = keyFramesDuration;\n    }\n  }\n\n  private findTarget (vfxItem: VFXItem, path: string) {\n    let target = vfxItem;\n    const paths = path.split('.');\n\n    for (const name of paths) {\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        return;\n      }\n    }\n\n    return target;\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport { DEG2RAD, Vector3 } from '@galacean/effects-math/es/core/index';\nimport { randomInRange } from '../utils';\nimport type { Shape, ShapeGeneratorOptions, ShapeParticle } from './index';\n\nexport class Cone implements Shape {\n  radius: number;\n  angle: number;\n  arc: number;\n  arcMode: number;\n\n  constructor (props: Record<string, any>) {\n    Object.keys(props).forEach(key => {\n      this[key as keyof Shape] = props[key];\n    });\n  }\n\n  generate (opt: ShapeGeneratorOptions): ShapeParticle {\n    const arc = getArcAngle(this.arc, this.arcMode, opt);\n    const a = arc * DEG2RAD;\n    const x = Math.cos(a) * this.radius;\n    const y = Math.sin(a) * this.radius;\n\n    const position = new Vector3(x, y, 0);\n    const l = Math.tan(this.angle * DEG2RAD);\n    const dir = position.clone().multiply(l);\n\n    // dir + [0,0,1]\n    dir.z += 1;\n\n    return {\n      position: position.multiply(randomInRange(0, 1)),\n      direction: dir.normalize(),\n    };\n  }\n}\n\nexport function getArcAngle (arc: number, arcMode: spec.ShapeArcMode, opt: ShapeGeneratorOptions): number {\n  if (arcMode === spec.ShapeArcMode.RANDOM) {\n    arc = randomInRange(0, arc);\n  } else if (arcMode === spec.ShapeArcMode.UNIDIRECTIONAL_CYCLE) {\n    const d = opt.index % (opt.total + 1);\n\n    arc = arc / opt.total * d;\n  } else if (arcMode === spec.ShapeArcMode.BIDIRECTIONAL_CYCLE) {\n    const d = opt.index / (opt.total + 1);\n    const i = d - Math.floor(d);\n\n    arc = arc * ((Math.floor(d) % 2) ? (1 - i) : i);\n  } else if (arcMode === spec.ShapeArcMode.UNIFORM_BURST) {\n    arc = arc * opt.burstIndex / opt.burstCount;\n  }\n\n  return arc;\n}\n","import * as spec from '@galacean/effects-specification';\nimport { DEG2RAD, Vector3 } from '@galacean/effects-math/es/core/index';\nimport { randomInRange } from '../utils';\nimport { getArcAngle } from './cone';\nimport type { Shape, ShapeGeneratorOptions, ShapeParticle } from './shape';\n\nexport class Circle implements Shape {\n  radius: number;\n  arc: number;\n  arcMode: number;\n\n  constructor (props: Record<string, any>) {\n    Object.keys(props).forEach(key => {\n      this[key as keyof Shape] = props[key];\n    });\n  }\n\n  generate (opt: ShapeGeneratorOptions): ShapeParticle {\n    const arc = getArcAngle(this.arc, this.arcMode, opt) * DEG2RAD;\n    const direction = new Vector3(Math.cos(arc), Math.sin(arc), 0);\n    const radius = this.radius;\n\n    return {\n      direction,\n      position: direction.clone().multiply(radius),\n    };\n  }\n}\n\nexport class Rectangle implements Shape {\n  _d: number;\n  _h: number;\n\n  constructor (arg: any) {\n    this._d = (arg.width || 1) / 2;\n    this._h = (arg.height || 1) / 2;\n  }\n\n  generate (opt: ShapeGeneratorOptions): ShapeParticle {\n    const x = randomInRange(-this._d, this._d);\n    const y = randomInRange(-this._h, this._h);\n\n    return {\n      direction: new Vector3(0, 0, 1),\n      position: new Vector3(x, y, 0),\n    };\n  }\n\n}\n\nexport class RectangleEdge implements Shape {\n  width: number;\n  height: number;\n  arcMode: number;\n  arc: number;\n  _d: number;\n  _h: number;\n\n  constructor (arg: any) {\n    this._d = (arg.width || 1) / 2;\n    this._h = (arg.height || 1) / 2;\n    this.arcMode = arg.arcMode;\n    this.arc = arg.arc;\n  }\n\n  generate (opt: ShapeGeneratorOptions): ShapeParticle {\n    const arc = getArcAngle(this.arc, this.arcMode, opt) * DEG2RAD;\n    const direction = new Vector3(Math.cos(arc), Math.sin(arc), 0);\n    const w = this._d;\n    const h = this._h;\n    const r0 = Math.atan2(h, w);\n    const tan = Math.tan(arc);\n    const position = new Vector3();\n\n    if (arc < r0) {\n      position.set(w, w * tan, 0);\n    } else if (arc >= r0 && arc < Math.PI - r0) {\n      position.set(h / tan, h, 0);\n    } else if (arc < Math.PI + r0) {\n      position.set(-w, -w * tan, 0);\n    } else if (arc < Math.PI * 2 - r0) {\n      position.set(-h / tan, -h, 0);\n    } else {\n      position.set(w, w * tan, 0);\n    }\n\n    return {\n      direction,\n      position,\n    };\n  }\n}\n\nexport class Edge implements Shape {\n  width: number;\n\n  arcMode: spec.ShapeArcMode;\n  _d: number;\n\n  constructor (args: any) {\n    this._d = (args.width || 1);\n    this.arcMode = args.arcMode;\n  }\n\n  generate (options: ShapeGeneratorOptions): ShapeParticle {\n    const x = this.arcMode === spec.ShapeArcMode.UNIFORM_BURST ? ((options.burstIndex % options.burstCount) / (options.burstCount - 1)) : randomInRange(0, 1);\n\n    return {\n      direction: new Vector3(0, 1, 0),\n      position: new Vector3(this._d * (x - 0.5), 0, 0),\n    };\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport { Vector3 } from '@galacean/effects-math/es/core/index';\nimport { Circle, Edge, Rectangle, RectangleEdge } from './2d-shape';\nimport { Cone } from './cone';\nimport { Donut } from './donut';\nimport { Hemisphere, Sphere } from './sphere';\nimport { TextureShape } from './texture-shape';\n\nexport type ShapeGeneratorOptions = {\n  total: number,\n  index: number,\n  burstIndex: number,\n  burstCount: number,\n};\n\nexport type ShapeParticle = {\n  direction: Vector3,\n  position: Vector3,\n};\n\nexport interface Shape {\n  generate (options: ShapeGeneratorOptions): ShapeParticle,\n}\n\nexport type ShapeGenerator =\n  Shape\n  & { reverseDirection?: boolean, alignSpeedDirection?: boolean, upDirection?: Vector3 };\n\nclass ShapeNone implements Shape {\n  generate () {\n    return {\n      position: new Vector3(),\n      direction: new Vector3(),\n    };\n  }\n}\n\nconst map: Record<string, { new(options: Record<string, any>): ShapeGenerator }> = {\n  [spec.ParticleEmitterShapeType.NONE]: ShapeNone,\n  [spec.ParticleEmitterShapeType.CONE]: Cone,\n  [spec.ParticleEmitterShapeType.SPHERE]: Sphere,\n  [spec.ParticleEmitterShapeType.HEMISPHERE]: Hemisphere,\n  [spec.ParticleEmitterShapeType.CIRCLE]: Circle,\n  [spec.ParticleEmitterShapeType.DONUT]: Donut,\n  [spec.ParticleEmitterShapeType.RECTANGLE]: Rectangle,\n  [spec.ParticleEmitterShapeType.EDGE]: Edge,\n  [spec.ParticleEmitterShapeType.RECTANGLE_EDGE]: RectangleEdge,\n  [spec.ParticleEmitterShapeType.TEXTURE]: TextureShape,\n};\n\nexport function createShape (shapeOptions?: spec.ParticleShape): Shape {\n  if (!shapeOptions) {\n    return new ShapeNone();\n  }\n  const options = {\n    radius: 1,\n    arc: 360,\n    angle: 0,\n    arcMode: spec.ShapeArcMode.RANDOM,\n    ...shapeOptions,\n  };\n  const { type } = shapeOptions;\n  const Ctrl = map[type];\n\n  if (!Ctrl) {\n    throw new Error(`Invalid shape: ${type}.`);\n  }\n  const ctrl = new Ctrl(options);\n\n  if (type !== spec.ParticleEmitterShapeType.NONE) {\n    const { alignSpeedDirection, upDirection = [0, 0, 1] } = shapeOptions as spec.ParticleShapeBase;\n\n    ctrl.alignSpeedDirection = alignSpeedDirection;\n    ctrl.upDirection = Vector3.fromArray(upDirection).normalize();\n  }\n\n  return ctrl;\n}\n","import { DEG2RAD, Matrix4, Vector3 } from '@galacean/effects-math/es/core/index';\nimport { randomInRange } from '../utils';\nimport { getArcAngle } from './cone';\nimport type { Shape, ShapeGeneratorOptions, ShapeParticle } from './shape';\n\nconst tempMat4 = new Matrix4();\n\nexport class Donut implements Shape {\n  radius: number;\n  donutRadius: number;\n  arc: number;\n  arcMode: number;\n\n  constructor (props: Record<string, any>) {\n    Object.keys(props).forEach(key => {\n      this[key as keyof Shape] = props[key];\n    });\n  }\n\n  generate (opt: ShapeGeneratorOptions): ShapeParticle {\n    const dradius = this.donutRadius;\n    const center = this.radius - dradius;\n    const angle = randomInRange(0, Math.PI * 2);\n    const arc = getArcAngle(this.arc, this.arcMode, opt) * DEG2RAD;\n    const rot = tempMat4.setFromRotationZ(arc);\n    const direction = new Vector3(Math.cos(angle), Math.sin(angle), 0);\n    const position = new Vector3(center + Math.cos(angle) * dradius, 0, Math.sin(angle) * dradius);\n\n    return {\n      direction: rot.transformNormal(direction),\n      position: rot.transformPoint(position),\n    };\n  }\n\n}\n","import { DEG2RAD, Matrix4, Vector3 } from '@galacean/effects-math/es/core/index';\nimport { randomInRange } from '../utils';\nimport { getArcAngle } from './cone';\nimport type { Shape, ShapeGeneratorOptions, ShapeParticle } from '.';\n\nconst tempMat4 = new Matrix4();\n\nexport class Sphere implements Shape {\n  arc: number;\n  radius: number;\n  arcMode: number;\n\n  constructor (props: Record<string, any>) {\n    Object.keys(props).forEach(key => {\n      this[key as keyof Shape] = props[key];\n    });\n  }\n\n  getHorizontalAngle () {\n    return randomInRange(-90, 90);\n  }\n\n  generate (opt: ShapeGeneratorOptions): ShapeParticle {\n    const rz = getArcAngle(this.arc, this.arcMode, opt) * DEG2RAD;\n    const rh = this.getHorizontalAngle() * DEG2RAD;\n    const radius = this.radius;\n    const point = new Vector3(Math.cos(rh), 0, Math.sin(rh));\n    const mat4 = tempMat4.setFromRotationZ(rz);\n    const p = mat4.transformNormal(point);\n\n    return {\n      position: p.clone().multiply(radius),\n      direction: p,\n    };\n  }\n}\n\nexport class Hemisphere extends Sphere {\n  override getHorizontalAngle () {\n    return randomInRange(0, 90);\n  }\n}\n\n","import { Vector3, clamp } from '@galacean/effects-math/es/core/index';\nimport { getArcAngle } from './cone';\nimport type { Shape, ShapeGeneratorOptions, ShapeParticle } from '.';\n\nexport class TextureShape implements Shape {\n  width: number;\n  height: number;\n  block: number[];\n  anchors: Float32Array;\n  arcMode: number;\n  random: number;\n\n  constructor (arg: any) {\n    const detail = arg.detail || { anchors: [0.5, 0.5], block: [0, 0] };\n\n    this.anchors = new Float32Array(detail.anchors);\n    this.width = arg.width || 1;\n    this.height = arg.height || 1;\n    this.block = detail.block;\n    this.arcMode = arg.arcMode;\n    this.random = clamp(arg.random || 0, 0, 1);\n  }\n\n  generate (opt: ShapeGeneratorOptions): ShapeParticle {\n    const anchors = this.anchors;\n    const pointCount = (anchors.length / 2 - 1);\n    const index = Math.floor(getArcAngle(pointCount, this.arcMode, opt));\n\n    const pointX = (anchors[index * 2] + this.block[0] * this.random * Math.random()) % 1 - 0.5;\n    const pointY = (anchors[index * 2 + 1] + this.block[1] * this.random * Math.random()) % 1 - 0.5;\n    const dir = new Vector3(pointX, pointY, 0);\n\n    return {\n      position: new Vector3(pointX * this.width, pointY * this.height, 0),\n      direction: dir.normalize(),\n    };\n  }\n}\n","/**\n * Earcut.js from: https://github.com/mapbox/earcut/tree/v2.2.2\n */\n\nexport function earcut(data, holeIndices, dim) {\n\n    dim = dim || 2;\n\n    var hasHoles = holeIndices && holeIndices.length,\n        outerLen = hasHoles ? holeIndices[0] * dim : data.length,\n        outerNode = linkedList(data, 0, outerLen, dim, true),\n        triangles = [];\n\n    if (!outerNode || outerNode.next === outerNode.prev) return triangles;\n\n    var minX, minY, maxX, maxY, x, y, invSize;\n\n    if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n    // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n    if (data.length > 80 * dim) {\n        minX = maxX = data[0];\n        minY = maxY = data[1];\n\n        for (var i = dim; i < outerLen; i += dim) {\n            x = data[i];\n            y = data[i + 1];\n            if (x < minX) minX = x;\n            if (y < minY) minY = y;\n            if (x > maxX) maxX = x;\n            if (y > maxY) maxY = y;\n        }\n\n        // minX, minY and invSize are later used to transform coords into integers for z-order calculation\n        invSize = Math.max(maxX - minX, maxY - minY);\n        invSize = invSize !== 0 ? 1 / invSize : 0;\n    }\n\n    earcutLinked(outerNode, triangles, dim, minX, minY, invSize);\n\n    return triangles;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nexport function linkedList(data, start, end, dim, clockwise) {\n    var i, last;\n\n    if (clockwise === (signedArea(data, start, end, dim) > 0)) {\n        for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);\n    } else {\n        for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);\n    }\n\n    if (last && equals(last, last.next)) {\n        removeNode(last);\n        last = last.next;\n    }\n\n    return last;\n}\n\n// eliminate colinear or duplicate points\nexport function filterPoints(start, end) {\n    if (!start) return start;\n    if (!end) end = start;\n\n    var p = start,\n        again;\n    do {\n        again = false;\n\n        if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n            removeNode(p);\n            p = end = p.prev;\n            if (p === p.next) break;\n            again = true;\n\n        } else {\n            p = p.next;\n        }\n    } while (again || p !== end);\n\n    return end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n    if (!ear) return;\n\n    // interlink polygon nodes in z-order\n    if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\n\n    var stop = ear,\n        prev, next;\n\n    // iterate through ears, slicing them one by one\n    while (ear.prev !== ear.next) {\n        prev = ear.prev;\n        next = ear.next;\n\n        if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n            // cut off the triangle\n            triangles.push(prev.i / dim);\n            triangles.push(ear.i / dim);\n            triangles.push(next.i / dim);\n\n            removeNode(ear);\n\n            // skipping the next vertex leads to less sliver triangles\n            ear = next.next;\n            stop = next.next;\n\n            continue;\n        }\n\n        ear = next;\n\n        // if we looped through the whole remaining polygon and can't find any more ears\n        if (ear === stop) {\n            // try filtering points and slicing again\n            if (!pass) {\n                earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n\n            // if this didn't work, try curing all small self-intersections locally\n            } else if (pass === 1) {\n                ear = cureLocalIntersections(filterPoints(ear), triangles, dim);\n                earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n\n            // as a last resort, try splitting the remaining polygon into two\n            } else if (pass === 2) {\n                splitEarcut(ear, triangles, dim, minX, minY, invSize);\n            }\n\n            break;\n        }\n    }\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nexport function isEar(ear) {\n    var a = ear.prev,\n        b = ear,\n        c = ear.next;\n\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n    // now make sure we don't have other points inside the potential ear\n    var p = ear.next.next;\n\n    while (p !== ear.prev) {\n        if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n            area(p.prev, p, p.next) >= 0) return false;\n        p = p.next;\n    }\n\n    return true;\n}\n\nexport function isEarHashed(ear, minX, minY, invSize) {\n    var a = ear.prev,\n        b = ear,\n        c = ear.next;\n\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n    // triangle bbox; min & max are calculated like this for speed\n    var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),\n        minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),\n        maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),\n        maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);\n\n    // z-order range for the current triangle bbox;\n    var minZ = zOrder(minTX, minTY, minX, minY, invSize),\n        maxZ = zOrder(maxTX, maxTY, minX, minY, invSize);\n\n    var p = ear.prevZ,\n        n = ear.nextZ;\n\n    // look for points inside the triangle in both directions\n    while (p && p.z >= minZ && n && n.z <= maxZ) {\n        if (p !== ear.prev && p !== ear.next &&\n            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n            area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n\n        if (n !== ear.prev && n !== ear.next &&\n            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&\n            area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n\n    // look for remaining points in decreasing z-order\n    while (p && p.z >= minZ) {\n        if (p !== ear.prev && p !== ear.next &&\n            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n            area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n    }\n\n    // look for remaining points in increasing z-order\n    while (n && n.z <= maxZ) {\n        if (n !== ear.prev && n !== ear.next &&\n            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&\n            area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n\n    return true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles, dim) {\n    var p = start;\n    do {\n        var a = p.prev,\n            b = p.next.next;\n\n        if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\n            triangles.push(a.i / dim);\n            triangles.push(p.i / dim);\n            triangles.push(b.i / dim);\n\n            // remove two nodes involved\n            removeNode(p);\n            removeNode(p.next);\n\n            p = start = b;\n        }\n        p = p.next;\n    } while (p !== start);\n\n    return filterPoints(p);\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\n    // look for a valid diagonal that divides the polygon into two\n    var a = start;\n    do {\n        var b = a.next.next;\n        while (b !== a.prev) {\n            if (a.i !== b.i && isValidDiagonal(a, b)) {\n                // split the polygon in two by the diagonal\n                var c = splitPolygon(a, b);\n\n                // filter colinear points around the cuts\n                a = filterPoints(a, a.next);\n                c = filterPoints(c, c.next);\n\n                // run earcut on each half\n                earcutLinked(a, triangles, dim, minX, minY, invSize);\n                earcutLinked(c, triangles, dim, minX, minY, invSize);\n                return;\n            }\n            b = b.next;\n        }\n        a = a.next;\n    } while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nexport function eliminateHoles(data, holeIndices, outerNode, dim) {\n    var queue = [],\n        i, len, start, end, list;\n\n    for (i = 0, len = holeIndices.length; i < len; i++) {\n        start = holeIndices[i] * dim;\n        end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n        list = linkedList(data, start, end, dim, false);\n        if (list === list.next) list.steiner = true;\n        queue.push(getLeftmost(list));\n    }\n\n    queue.sort(compareX);\n\n    // process holes from left to right\n    for (i = 0; i < queue.length; i++) {\n        eliminateHole(queue[i], outerNode);\n        outerNode = filterPoints(outerNode, outerNode.next);\n    }\n\n    return outerNode;\n}\n\nfunction compareX(a, b) {\n    return a.x - b.x;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and and link it\nfunction eliminateHole(hole, outerNode) {\n    outerNode = findHoleBridge(hole, outerNode);\n    if (outerNode) {\n        var b = splitPolygon(outerNode, hole);\n\n        // filter collinear points around the cuts\n        filterPoints(outerNode, outerNode.next);\n        filterPoints(b, b.next);\n    }\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n    var p = outerNode,\n        hx = hole.x,\n        hy = hole.y,\n        qx = -Infinity,\n        m;\n\n    // find a segment intersected by a ray from the hole's leftmost point to the left;\n    // segment's endpoint with lesser x will be potential connection point\n    do {\n        if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n            var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n            if (x <= hx && x > qx) {\n                qx = x;\n                if (x === hx) {\n                    if (hy === p.y) return p;\n                    if (hy === p.next.y) return p.next;\n                }\n                m = p.x < p.next.x ? p : p.next;\n            }\n        }\n        p = p.next;\n    } while (p !== outerNode);\n\n    if (!m) return null;\n\n    if (hx === qx) return m; // hole touches outer segment; pick leftmost endpoint\n\n    // look for points inside the triangle of hole point, segment intersection and endpoint;\n    // if there are no points found, we have a valid connection;\n    // otherwise choose the point of the minimum angle with the ray as connection point\n\n    var stop = m,\n        mx = m.x,\n        my = m.y,\n        tanMin = Infinity,\n        tan;\n\n    p = m;\n\n    do {\n        if (hx >= p.x && p.x >= mx && hx !== p.x &&\n                pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n\n            tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n            if (locallyInside(p, hole) &&\n                (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {\n                m = p;\n                tanMin = tan;\n            }\n        }\n\n        p = p.next;\n    } while (p !== stop);\n\n    return m;\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector(m, p) {\n    return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\n\n// interlink polygon nodes in z-order\nexport function indexCurve(start, minX, minY, invSize) {\n    var p = start;\n    do {\n        if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n        p.prevZ = p.prev;\n        p.nextZ = p.next;\n        p = p.next;\n    } while (p !== start);\n\n    p.prevZ.nextZ = null;\n    p.prevZ = null;\n\n    sortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n    var i, p, q, e, tail, numMerges, pSize, qSize,\n        inSize = 1;\n\n    do {\n        p = list;\n        list = null;\n        tail = null;\n        numMerges = 0;\n\n        while (p) {\n            numMerges++;\n            q = p;\n            pSize = 0;\n            for (i = 0; i < inSize; i++) {\n                pSize++;\n                q = q.nextZ;\n                if (!q) break;\n            }\n            qSize = inSize;\n\n            while (pSize > 0 || (qSize > 0 && q)) {\n\n                if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n                    e = p;\n                    p = p.nextZ;\n                    pSize--;\n                } else {\n                    e = q;\n                    q = q.nextZ;\n                    qSize--;\n                }\n\n                if (tail) tail.nextZ = e;\n                else list = e;\n\n                e.prevZ = tail;\n                tail = e;\n            }\n\n            p = q;\n        }\n\n        tail.nextZ = null;\n        inSize *= 2;\n\n    } while (numMerges > 1);\n\n    return list;\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder(x, y, minX, minY, invSize) {\n    // coords are transformed into non-negative 15-bit integer range\n    x = 32767 * (x - minX) * invSize;\n    y = 32767 * (y - minY) * invSize;\n\n    x = (x | (x << 8)) & 0x00FF00FF;\n    x = (x | (x << 4)) & 0x0F0F0F0F;\n    x = (x | (x << 2)) & 0x33333333;\n    x = (x | (x << 1)) & 0x55555555;\n\n    y = (y | (y << 8)) & 0x00FF00FF;\n    y = (y | (y << 4)) & 0x0F0F0F0F;\n    y = (y | (y << 2)) & 0x33333333;\n    y = (y | (y << 1)) & 0x55555555;\n\n    return x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n    var p = start,\n        leftmost = start;\n    do {\n        if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;\n        p = p.next;\n    } while (p !== start);\n\n    return leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n    return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&\n           (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&\n           (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nexport function isValidDiagonal(a, b) {\n    return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges\n           (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible\n            (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors\n            equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n    return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nexport function equals(p1, p2) {\n    return p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nexport function intersects(p1, q1, p2, q2) {\n    var o1 = sign(area(p1, q1, p2));\n    var o2 = sign(area(p1, q1, q2));\n    var o3 = sign(area(p2, q2, p1));\n    var o4 = sign(area(p2, q2, q1));\n\n    if (o1 !== o2 && o3 !== o4) return true; // general case\n\n    if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n    if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n    if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n    if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n    return false;\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment(p, q, r) {\n    return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\n}\n\nfunction sign(num) {\n    return num > 0 ? 1 : num < 0 ? -1 : 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n    var p = a;\n    do {\n        if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n                intersects(p, p.next, a, b)) return true;\n        p = p.next;\n    } while (p !== a);\n\n    return false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nexport function locallyInside(a, b) {\n    return area(a.prev, a, a.next) < 0 ?\n        area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n        area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n    var p = a,\n        inside = false,\n        px = (a.x + b.x) / 2,\n        py = (a.y + b.y) / 2;\n    do {\n        if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&\n                (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n            inside = !inside;\n        p = p.next;\n    } while (p !== a);\n\n    return inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nexport function splitPolygon(a, b) {\n    var a2 = new Node(a.i, a.x, a.y),\n        b2 = new Node(b.i, b.x, b.y),\n        an = a.next,\n        bp = b.prev;\n\n    a.next = b;\n    b.prev = a;\n\n    a2.next = an;\n    an.prev = a2;\n\n    b2.next = a2;\n    a2.prev = b2;\n\n    bp.next = b2;\n    b2.prev = bp;\n\n    return b2;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n    var p = new Node(i, x, y);\n\n    if (!last) {\n        p.prev = p;\n        p.next = p;\n\n    } else {\n        p.next = last.next;\n        p.prev = last;\n        last.next.prev = p;\n        last.next = p;\n    }\n    return p;\n}\n\nexport function removeNode(p) {\n    p.next.prev = p.prev;\n    p.prev.next = p.next;\n\n    if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n    if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nexport function Node(i, x, y) {\n    // vertex index in coordinates array\n    this.i = i;\n\n    // vertex coordinates\n    this.x = x;\n    this.y = y;\n\n    // previous and next vertex nodes in a polygon ring\n    this.prev = null;\n    this.next = null;\n\n    // z-order curve value\n    this.z = null;\n\n    // previous and next nodes in z-order\n    this.prevZ = null;\n    this.nextZ = null;\n\n    // indicates whether this is a steiner point\n    this.steiner = false;\n}\n\n// return a percentage difference between the polygon area and its triangulation area;\n// used to verify correctness of triangulation\nearcut.deviation = function (data, holeIndices, dim, triangles) {\n    var hasHoles = holeIndices && holeIndices.length;\n    var outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n\n    var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));\n    if (hasHoles) {\n        for (var i = 0, len = holeIndices.length; i < len; i++) {\n            var start = holeIndices[i] * dim;\n            var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n            polygonArea -= Math.abs(signedArea(data, start, end, dim));\n        }\n    }\n\n    var trianglesArea = 0;\n    for (i = 0; i < triangles.length; i += 3) {\n        var a = triangles[i] * dim;\n        var b = triangles[i + 1] * dim;\n        var c = triangles[i + 2] * dim;\n        trianglesArea += Math.abs(\n            (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -\n            (data[a] - data[b]) * (data[c + 1] - data[a + 1]));\n    }\n\n    return polygonArea === 0 && trianglesArea === 0 ? 0 :\n        Math.abs((trianglesArea - polygonArea) / polygonArea);\n};\n\nfunction signedArea(data, start, end, dim) {\n    var sum = 0;\n    for (var i = start, j = end - dim; i < end; i += dim) {\n        sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n        j = i;\n    }\n    return sum;\n}\n\n// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts\nearcut.flatten = function (data) {\n    var dim = data[0][0].length,\n        result = {vertices: [], holes: [], dimensions: dim},\n        holeIndex = 0;\n\n    for (var i = 0; i < data.length; i++) {\n        for (var j = 0; j < data[i].length; j++) {\n            for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]);\n        }\n        if (i > 0) {\n            holeIndex += data[i - 1].length;\n            result.holes.push(holeIndex);\n        }\n    }\n    return result;\n};\n","import type { Node } from '../libs/earcut';\nimport { indexCurve, isEarHashed, eliminateHoles, splitPolygon, isValidDiagonal, isEar, linkedList, equals, intersects, locallyInside, removeNode, filterPoints } from '../libs/earcut';\n\nlet indexBase = 0;\n\nexport function earcut (data: number[], holeIndices: number[] | null, dim: number, ib: number) {\n  dim = dim || 2;\n  indexBase = ib || 0;\n\n  const hasHoles = holeIndices && holeIndices.length;\n  const outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n  let outerNode = linkedList(data, 0, outerLen, dim, true);\n  const triangles: number[] = [];\n\n  if (!outerNode || outerNode.next === outerNode.prev) {\n    return triangles;\n  }\n\n  let minX: number | undefined, minY: number | undefined, maxX, maxY, x, y, invSize: number | undefined;\n\n  if (hasHoles) {\n    outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n  }\n\n  // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n  if (data.length > 80 * dim) {\n    minX = maxX = data[0];\n    minY = maxY = data[1];\n\n    for (let i = dim; i < outerLen; i += dim) {\n      x = data[i];\n      y = data[i + 1];\n      if (x < minX) {\n        minX = x;\n      }\n      if (y < minY) {\n        minY = y;\n      }\n      if (x > maxX) {\n        maxX = x;\n      }\n      if (y > maxY) {\n        maxY = y;\n      }\n    }\n\n    // minX, minY and invSize are later used to transform coords into integers for z-order calculation\n    invSize = Math.max(maxX - minX, maxY - minY);\n    invSize = invSize !== 0 ? 1 / invSize : 0;\n  }\n\n  hackEarcutLinked(outerNode, triangles, dim, minX, minY, invSize);\n\n  return triangles;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction hackEarcutLinked (ear: Node, triangles: number[], dim: number, minX?: number, minY?: number, invSize?: number, pass?: number) {\n  if (!ear) {\n    return;\n  }\n\n  // interlink polygon nodes in z-order\n  if (!pass && invSize) {\n    indexCurve(ear, minX!, minY!, invSize);\n  }\n\n  let stop = ear, prev, next;\n\n  // iterate through ears, slicing them one by one\n  while (ear.prev !== ear.next) {\n    prev = ear.prev;\n    next = ear.next;\n\n    if (invSize ? isEarHashed(ear, minX!, minY!, invSize) : isEar(ear)) {\n      // cut off the triangle\n      triangles.push(prev.i / dim + indexBase);\n      triangles.push(ear.i / dim + indexBase);\n      triangles.push(next.i / dim + indexBase);\n\n      removeNode(ear);\n\n      // skipping the next vertex leads to less sliver triangles\n      ear = next.next;\n      stop = next.next;\n\n      continue;\n    }\n\n    ear = next;\n\n    // if we looped through the whole remaining polygon and can't find any more ears\n    if (ear === stop) {\n      // try filtering triangles and slicing again\n      if (!pass) {\n        hackEarcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n\n        // if this didn't work, try curing all small self-intersections locally\n      } else if (pass === 1) {\n        ear = hackCureLocalIntersections(filterPoints(ear), triangles, dim);\n        hackEarcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n\n        // as a last resort, try splitting the remaining polygon into two\n      } else if (pass === 2) {\n        hackSplitEarcut(ear, triangles, dim, minX, minY, invSize);\n      }\n\n      break;\n    }\n  }\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction hackCureLocalIntersections (start: Node, triangles: number[], dim: number) {\n  let p = start;\n\n  do {\n    const a = p.prev, b = p.next.next;\n\n    if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n      triangles.push(a.i / dim + indexBase);\n      triangles.push(p.i / dim + indexBase);\n      triangles.push(b.i / dim + indexBase);\n\n      // remove two nodes involved\n      removeNode(p);\n      removeNode(p.next);\n\n      p = start = b;\n    }\n    p = p.next;\n  } while (p !== start);\n\n  return filterPoints(p);\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction hackSplitEarcut (start: Node, triangles: number[], dim: number, minX?: number, minY?: number, invSize?: number) {\n  // look for a valid diagonal that divides the polygon into two\n  let a = start;\n\n  do {\n    let b = a.next.next;\n\n    while (b !== a.prev) {\n      if (a.i !== b.i && isValidDiagonal(a, b)) {\n        // split the polygon in two by the diagonal\n        let c = splitPolygon(a, b);\n\n        // filter colinear triangles around the cuts\n        a = filterPoints(a, a.next);\n        c = filterPoints(c, c.next);\n\n        // run earcut on each half\n        hackEarcutLinked(a, triangles, dim, minX, minY, invSize);\n        hackEarcutLinked(c, triangles, dim, minX, minY, invSize);\n\n        return;\n      }\n      b = b.next;\n    }\n    a = a.next;\n  } while (a !== start);\n}\n","import * as spec from '@galacean/effects-specification';\nimport type { vec2 } from '@galacean/effects-specification';\nimport { SPRITE_VERTEX_STRIDE } from '../constants';\nimport { earcut } from './earcut';\n\ntype BezierPoint = [x: number, y: number, inx: number, iny: number, outx: number, outy: number];\n// type Geometry = {\n//   s: number[][],\n//   p: BezierPoint[],\n//   c?: vec2,\n//   t: number,\n// };\n\nexport type Shape2D = {\n  gs?: spec.ShapeGeometry[], // multiple geometries\n  t: number,\n  g: spec.ShapeGeometry, // single geometry\n};\n\nexport type GeometryFromShape = {\n  aPoint: number[] | Float32Array,\n  index: number[] | Uint16Array,\n};\n\ntype ShapeGeometryPre = { p: spec.ShapePoints[1], s: spec.ShapeSplits[1] };\n\n// FIXME: 考虑合并 Shape2D\nexport type ShapeGeometryData = { gs: ShapeGeometryPre[] } | { g: ShapeGeometryPre } | spec.ShapeGeometry;\n\nconst POINT_INDEX = 2;\n\nexport function getGeometryTriangles (geometry: spec.ShapeGeometry, options: { indexBase?: number, uvTransform?: number[] }) {\n  const { s, p } = geometry;\n  const segments = s[1];\n  const points = p[1];\n  let pointCount = 0;\n\n  for (let i = 0; i < segments.length; i++) {\n    const segment = segments[i];\n\n    pointCount += segment.length - 1;\n  }\n\n  const pointData = new Float32Array(pointCount * SPRITE_VERTEX_STRIDE);\n  const { indexBase = 0, uvTransform } = options;\n  let index = 0;\n  let dx = 0, dy = 0, sw = 1, sh = 1, r;\n\n  if (uvTransform) {\n    dx = uvTransform[0];\n    dy = uvTransform[1];\n    r = uvTransform[4];\n    sw = r ? uvTransform[3] : uvTransform[2];\n    sh = r ? uvTransform[2] : uvTransform[3];\n  }\n\n  const temp: vec2 = [0, 0];\n  const angle = r === 0 ? 0 : -Math.PI / 2;\n\n  for (let i = 0; i < segments.length; i++) {\n    const segment = segments[i];\n    const p0 = points[i];\n    const p1 = points[i + 1] || points[0];\n    const keys = segment;\n    const point: vec2 = [0, 0];\n\n    for (let j = 0; j < keys.length - 1; j++) {\n      const key = keys[j];\n\n      getBezier2DValue(point, key, p0, p1, p0[4], p0[5], p1[2], p1[3]);\n      setPoint(point[0], point[1]);\n    }\n  }\n\n  const indices = earcut(Array.from(pointData), null, SPRITE_VERTEX_STRIDE, indexBase);\n\n  return { aPoint: pointData, index: new Uint16Array(indices) };\n\n  function setPoint (x: number, y: number) {\n    pointData[index++] = x / 2;\n    pointData[index++] = y / 2;\n    if (uvTransform) {\n      temp[0] = x;\n      temp[1] = y;\n      rotateVec2(temp, temp, angle);\n      pointData[index++] = dx + (temp[0] + 1) / 2 * sw;\n      pointData[index++] = dy + (temp[1] + 1) / 2 * sh;\n    } else {\n      pointData[index++] = (x + 1) / 2;\n      pointData[index++] = (y + 1) / 2;\n    }\n    index += POINT_INDEX;\n  }\n}\n\n/**\n * 根据新老版形状数据获取形状几何数据\n * @param shape 新老版形状数据\n */\nfunction getGeometriesByShapeData (shape: ShapeGeometryData) {\n  const geometries: spec.ShapeGeometry[] = [];\n\n  // 该版本的单个形状数据可以包含多个形状，可以加个埋点，五福之后没有就可以下掉\n  if ('gs' in shape) {\n    shape.gs.forEach(gs => {\n      geometries.push({\n        p: [spec.ValueType.SHAPE_POINTS, gs.p],\n        s: [spec.ValueType.SHAPE_SPLITS, gs.s],\n      });\n    });\n  } else if ('g' in shape) {\n    geometries.push({\n      p: [spec.ValueType.SHAPE_POINTS, shape.g.p],\n      s: [spec.ValueType.SHAPE_SPLITS, shape.g.s],\n    });\n  } else {\n    geometries.push(shape);\n  }\n\n  return geometries;\n}\n\nexport function getGeometryByShape (shape: ShapeGeometryData, uvTransform?: number[]): GeometryFromShape {\n  const datas = [];\n  // 老数据兼容处理\n  const geometries = getGeometriesByShapeData(shape);\n  let indexBase = 0;\n  let aPoint = 0;\n  let index = 0;\n\n  for (let i = 0; i < geometries.length; i++) {\n    const geometry = geometries[i];\n    const data = getGeometryTriangles(geometry, { indexBase, uvTransform });\n\n    indexBase += data.aPoint.length / 5;\n    datas.push(data);\n    aPoint += data.aPoint.length;\n    index += data.index.length;\n  }\n\n  if (datas.length === 1) {\n    return datas[0];\n  }\n\n  const aPointData = new Float32Array(aPoint);\n  const indexData = new Uint16Array(index);\n\n  // @ts-expect-error\n  for (let i = 0, pointIndex = 0, idx = 0; i < datas[i]; i++) {\n    const data = datas[i];\n\n    aPointData.set(data.aPoint, pointIndex);\n    pointIndex += data.aPoint.length;\n    indexData.set(data.index, idx);\n    idx += data.index.length;\n  }\n\n  return {\n    aPoint: aPointData,\n    index: indexData,\n  };\n}\n\nexport function rotateVec2 (out: vec2 | number[], vec2: vec2, angleInRad: number): vec2 {\n  const c = Math.cos(angleInRad);\n  const s = Math.sin(angleInRad);\n  const x = vec2[0];\n  const y = vec2[1];\n\n  out[0] = c * x + s * y;\n  out[1] = -s * x + c * y;\n\n  return out as vec2;\n}\n\nfunction getBezier2DValue (\n  out: vec2,\n  t: number,\n  p0: vec2 | BezierPoint | number[],\n  p1: vec2 | BezierPoint | number[],\n  cpx0: number,\n  cpy0: number,\n  cpx1: number,\n  cpy1: number,\n) {\n  const ddt = 1 - t;\n  const a = ddt * ddt * ddt;\n  const b = 3 * t * ddt * ddt;\n  const c = 3 * t * t * ddt;\n  const d = t * t * t;\n\n  out[0] = a * p0[0] + b * cpx0 + c * cpx1 + d * p1[0];\n  out[1] = a * p0[1] + b * cpy0 + c * cpy1 + d * p1[1];\n\n  return out;\n}\n","import { createValueGetter, ValueGetter } from '../../math';\n\ninterface BurstOptions {\n  time: number,\n  interval: number,\n  count: number | ValueGetter<number>,\n  cycles: number,\n  probability: number,\n}\n\nexport class Burst {\n  once: boolean;\n  disabled: boolean;\n\n  private now: number;\n  private index: number;\n  private internalCycles: number;\n\n  private readonly time: number;\n  private readonly interval: number;\n  private readonly count: ValueGetter<number>;\n  private readonly cycles: number;\n  private readonly probability: number;\n\n  constructor (options: BurstOptions) {\n    const { time, interval, count, cycles, probability } = options;\n\n    this.time = +time || 0;\n    this.interval = +interval || 1;\n    this.count = count instanceof ValueGetter ? count : createValueGetter(count);\n    this.cycles = +cycles || Infinity;\n    this.probability = isNaN(probability) ? 1 : +probability;\n    this.reset();\n  }\n\n  getGeneratorOptions (timePassed: number, lifetime: number) {\n    const dt = timePassed - this.time - this.now;\n\n    if (dt > this.interval * this.index && this.internalCycles > 0) {\n      this.internalCycles--;\n      this.index++;\n\n      return Math.random() <= this.probability ? {\n        index: this.index,\n        total: 1 / this.interval,\n        count: this.count.getValue(lifetime),\n        cycleIndex: this.cycles - this.internalCycles - 1,\n      } : null;\n    }\n  }\n\n  reset () {\n    this.internalCycles = this.cycles;\n    this.index = 0;\n    this.now = 0;\n  }\n\n  clone (): Burst {\n    const options = {\n      time: this.time,\n      interval: this.interval,\n      count: this.count,\n      cycles: this.cycles,\n      probability: this.probability,\n    };\n\n    return new Burst(options);\n  }\n}\n","export class LinkNode<T> {\n  next: LinkNode<T> | null;\n  pre: LinkNode<T> | null;\n\n  constructor (\n    public content: T,\n  ) { }\n}\n\nexport class Link<T> {\n  first: LinkNode<T>;\n  last: LinkNode<T>;\n  length = 0;\n\n  constructor (\n    private readonly sort: (a: T, b: T) => number,\n  ) { }\n\n  findNodeByContent (filter: (d: T) => boolean) {\n    let node = this.first;\n\n    if (node) {\n      do {\n        if (filter(node.content)) {\n          return node;\n        }\n        // @ts-expect-error\n        // eslint-disable-next-line no-cond-assign\n      } while (node = node.next);\n    }\n  }\n\n  private insertNode (a: LinkNode<T>, next: LinkNode<T>) {\n    const b = a.next;\n\n    a.next = next;\n    next.pre = a;\n    next.next = b;\n    if (b) {\n      b.pre = next;\n    }\n    // a -> next -> b\n  }\n\n  shiftNode (content: T): LinkNode<T> | undefined {\n    const node = new LinkNode(content);\n\n    this.length++;\n    if (this.length === 1) {\n      return this.first = this.last = node;\n    }\n    let current = this.first;\n\n    while (current) {\n      if (this.sort(current.content, node.content) <= 0) {\n        if (current.next) {\n          current = current.next;\n        } else {\n          this.insertNode(current, node);\n\n          return this.last = node;\n        }\n      } else {\n        if (current.pre) {\n          this.insertNode(current.pre, node);\n        } else {\n          this.first = node;\n          node.next = current;\n          current.pre = node;\n        }\n\n        return node;\n      }\n    }\n  }\n\n  pushNode (content: T): LinkNode<T> | undefined {\n    const node = new LinkNode(content);\n\n    this.length++;\n    if (this.length === 1) {\n      return this.last = this.first = node;\n    }\n    let current = this.last;\n\n    while (current) {\n      if (this.sort(node.content, current.content) <= 0) {\n        if (this.first === current) {\n          current.pre = node;\n          node.next = current;\n\n          return this.first = node;\n        } else {\n          // @ts-expect-error\n          current = current.pre;\n        }\n      } else {\n        this.insertNode(current, node);\n        if (current === this.last) {\n          this.last = node;\n        }\n\n        return node;\n      }\n    }\n  }\n\n  removeNode (node: LinkNode<T>) {\n    let current = this.first;\n\n    this.length--;\n    if (current === node) {\n      // @ts-expect-error\n      const a = this.first = current.next;\n\n      if (a) {\n        a.pre = null;\n      }\n    } else if ((current = this.last) === node) {\n      // @ts-expect-error\n      const a = this.last = current.pre;\n\n      if (a) {\n        a.next = null;\n      }\n    } else if (node) {\n      const pre = node.pre;\n      const next = node.next;\n\n      // @ts-expect-error\n      pre.next = next;\n      if (next) {\n        next.pre = pre;\n      }\n    }\n    node.pre = null;\n    node.next = null;\n  }\n\n  forEach (func: (content: T, index: number) => void, thisObj?: any) {\n    let node = this.first;\n    let i = 0;\n\n    if (node) {\n      do {\n        func.call(thisObj || this, node.content, i++);\n        // @ts-expect-error\n        // eslint-disable-next-line no-cond-assign\n      } while (node = node.next);\n    }\n  }\n\n  forEachReverse (func: (content: T, index: number) => void, thisObj?: any) {\n    let node = this.last;\n    let i = this.length - 1;\n\n    if (node) {\n      do {\n        func.call(thisObj || this, node.content, i--);\n        // @ts-expect-error\n        // eslint-disable-next-line no-cond-assign\n      } while (node = node.pre);\n    }\n  }\n\n  getNodeByIndex (index: number) {\n    let i = 0, res = this.first;\n\n    if (!res || index >= this.length || index < 0) {\n      return null;\n    }\n\n    while (i < index) {\n      res = res.next!;\n      i++;\n    }\n\n    return res;\n  }\n\n}\n","export const RUNTIME_ENV = 'runtime_env';\n\nexport const RENDER_PREFER_LOOKUP_TEXTURE = 'lookup_texture';\n// 文本元素使用 offscreen canvas 绘制\nexport const TEMPLATE_USE_OFFSCREEN_CANVAS = 'offscreen_canvas';\n// 后处理配置相关\nexport const POST_PROCESS_SETTINGS = 'post_process_settings';\n\nconst config: Record<string, number | boolean | string | Record<string, any>> = {};\n\n/**\n * 获取全局配置项\n * @param name\n * @returns\n */\nexport function getConfig<T extends number | boolean | string | Record<string, any>> (name: string) {\n  return config[name] as T;\n}\n\n/**\n * 设置全局配置项\n * @param name\n * @param value\n * @returns\n */\nexport function setConfig<T extends number | boolean | string | Record<string, any>> (name: string, value: T) {\n  return config[name] = value;\n}\n","import type { Matrix4 } from '@galacean/effects-math/es/core/index';\nimport { Vector2, Vector3, Vector4 } from '@galacean/effects-math/es/core/index';\nimport type * as spec from '@galacean/effects-specification';\nimport type { GradientStop, vec3, vec4 } from '@galacean/effects-specification';\nimport { RENDER_PREFER_LOOKUP_TEXTURE, getConfig } from '../../config';\nimport { PLAYER_OPTIONS_ENV_EDITOR } from '../../constants';\nimport type { Engine } from '../../engine';\nimport { glContext } from '../../gl';\nimport type { MaterialProps } from '../../material';\nimport { Material, getPreMultiAlpha, setBlendMode, setMaskMode } from '../../material';\nimport { createKeyFrameMeta, createValueGetter, getKeyFrameMetaByRawValue, ValueGetter } from '../../math';\nimport type { GPUCapability, GeometryProps, ShaderMacros, ShaderWithSource } from '../../render';\nimport { GLSLVersion, Geometry, Mesh } from '../../render';\nimport { particleFrag, trailVert } from '../../shader';\nimport { Texture, generateHalfFloatTexture } from '../../texture';\nimport { assertExist, imageDataFromGradient } from '../../utils';\n\nexport type TrailMeshProps = {\n  maxTrailCount: number,\n  pointCountPerTrail: number,\n  colorOverLifetime?: Array<GradientStop>,\n  texture?: Texture,\n  minimumVertexDistance: number,\n  blending: number,\n  widthOverTrail: ValueGetter<number>,\n  colorOverTrail?: Array<GradientStop>,\n  // order: number,\n  matrix?: Matrix4,\n  opacityOverLifetime: ValueGetter<number>,\n  occlusion: boolean,\n  transparentOcclusion: boolean,\n  lifetime: ValueGetter<number>,\n  mask: number,\n  shaderCachePrefix: string,\n  maskMode: number,\n  textureMap: vec4,\n  name: string,\n};\n\nexport type TrailPointOptions = {\n  lifetime: number,\n  color: number[],\n  size: number,\n  time: number,\n};\n\nconst tmp0 = new Vector3();\nconst tmp1 = new Vector3();\n\nexport class TrailMesh {\n  mesh: Mesh;\n  maxTrailCount;\n  geometry: Geometry;\n  lifetime: ValueGetter<number>;\n  pointCountPerTrail: number;\n  minimumVertexDistance: number;\n  useAttributeTrailStart: boolean;\n  checkVertexDistance: boolean;\n\n  private pointStart: Vector3[] = [];\n  private trailCursors: Uint16Array;\n\n  constructor (\n    engine: Engine,\n    props: TrailMeshProps,\n  ) {\n    const {\n      colorOverLifetime,\n      colorOverTrail,\n      maxTrailCount,\n      opacityOverLifetime = createValueGetter(1),\n      widthOverTrail,\n      name,\n      occlusion,\n      blending,\n      maskMode,\n      mask,\n      // order,\n      textureMap = [0, 0, 1, 1],\n      texture,\n      transparentOcclusion,\n      minimumVertexDistance,\n      lifetime,\n      matrix,\n    } = props;\n\n    const { detail, level } = engine.gpuCapability;\n    const pointCountPerTrail = Math.max(props.pointCountPerTrail, 2);\n    const keyFrameMeta = createKeyFrameMeta();\n    const enableVertexTexture = detail.maxVertexTextures > 0;\n    const { env } = engine ?? {};\n    const uniformValues: any = {};\n    // const lookUpTexture = getConfig(RENDER_PREFER_LOOKUP_TEXTURE) ? 1 : 0;\n    const lookUpTexture = 0;\n    const macros: ShaderMacros = [\n      ['ENABLE_VERTEX_TEXTURE', enableVertexTexture],\n      ['LOOKUP_TEXTURE_CURVE', lookUpTexture],\n      ['ENV_EDITOR', env === PLAYER_OPTIONS_ENV_EDITOR],\n    ];\n    const useAttributeTrailStart = maxTrailCount > 64;\n    let shaderCacheId = 0;\n\n    if (colorOverLifetime) {\n      macros.push(['COLOR_OVER_LIFETIME', true]);\n      shaderCacheId |= 1;\n      uniformValues.uColorOverLifetime = Texture.createWithData(engine, imageDataFromGradient(colorOverLifetime));\n    }\n    if (colorOverTrail) {\n      macros.push(['COLOR_OVER_TRAIL', true]);\n      shaderCacheId |= 1 << 2;\n      uniformValues.uColorOverTrail = Texture.createWithData(engine, imageDataFromGradient(colorOverTrail));\n    }\n    if (useAttributeTrailStart) {\n      macros.push(['ATTR_TRAIL_START', 1]);\n      shaderCacheId |= 1 << 3;\n    } else {\n      uniformValues.uTrailStart = new Float32Array(maxTrailCount);\n    }\n\n    uniformValues.uOpacityOverLifetimeValue = opacityOverLifetime.toUniform(keyFrameMeta);\n    const uWidthOverTrail = widthOverTrail.toUniform(keyFrameMeta);\n\n    macros.push(\n      ['VERT_CURVE_VALUE_COUNT', keyFrameMeta.index],\n      ['VERT_MAX_KEY_FRAME_COUNT', keyFrameMeta.max]);\n\n    if (enableVertexTexture && lookUpTexture) {\n      const tex = generateHalfFloatTexture(engine, ValueGetter.getAllData(keyFrameMeta, true) as Uint16Array, keyFrameMeta.index, 1);\n\n      uniformValues.uVCurveValueTexture = tex;\n    } else {\n      uniformValues.uVCurveValues = ValueGetter.getAllData(keyFrameMeta);\n    }\n\n    const vertex = trailVert;\n    const fragment = particleFrag;\n    const mtl: MaterialProps = ({\n      shader: {\n        vertex,\n        fragment,\n        macros,\n        glslVersion: level === 1 ? GLSLVersion.GLSL1 : GLSLVersion.GLSL3,\n        shared: true,\n        name: `trail#${name}`,\n        cacheId: `-t:+${shaderCacheId}+${keyFrameMeta.index}+${keyFrameMeta.max}`,\n      },\n    });\n\n    const maxVertexCount = pointCountPerTrail * maxTrailCount * 2;\n    const maxTriangleCount = (pointCountPerTrail - 1) * maxTrailCount;\n    const bpe = Float32Array.BYTES_PER_ELEMENT;\n    const v12 = 12 * bpe;\n    const geometryOptions: GeometryProps = {\n      attributes: {\n        aColor: { size: 4, stride: v12, data: new Float32Array(maxVertexCount * 12) },\n        aSeed: { size: 1, stride: v12, offset: 4 * bpe, dataSource: 'aColor' },\n        aInfo: { size: 3, stride: v12, offset: 5 * bpe, dataSource: 'aColor' },\n        aPos: { size: 4, stride: v12, offset: 8 * bpe, dataSource: 'aColor' },\n        //\n        aTime: { size: 1, data: new Float32Array(maxVertexCount) },\n        //\n        aDir: { size: 3, data: new Float32Array(maxVertexCount * 3) },\n      },\n      indices: { data: new Uint16Array(maxVertexCount * 6) },\n      drawCount: maxTriangleCount * 6,\n      name: `trail#${name}`,\n      bufferUsage: glContext.DYNAMIC_DRAW,\n    };\n\n    if (useAttributeTrailStart) {\n      geometryOptions.attributes.aTrailStart = { size: 1, data: new Float32Array(maxVertexCount) };\n    } else {\n      const indexData = new Float32Array(maxVertexCount);\n\n      geometryOptions.attributes.aTrailStartIndex = { size: 1, data: indexData };\n      for (let i = 0; i < maxTrailCount; i++) {\n        const c = pointCountPerTrail * 2;\n        const s = i * c;\n\n        for (let j = 0; j < c; j++) {\n          indexData[s + j] = i;\n        }\n      }\n    }\n\n    const preMulAlpha = getPreMultiAlpha(blending);\n    const material = Material.create(engine, mtl);\n\n    material.blending = true;\n    material.depthMask = occlusion;\n    material.depthTest = true;\n    material.stencilRef = mask ? [mask, mask] : undefined;\n    setMaskMode(material, maskMode);\n    setBlendMode(material, blending);\n\n    const mesh = this.mesh = Mesh.create(\n      engine,\n      {\n        name: `MTrail_${name}`,\n        material,\n        geometry: Geometry.create(engine, geometryOptions),\n        // priority: order,\n      }\n    );\n    const uMaskTex = texture ?? Texture.createWithData(engine);\n\n    Object.keys(uniformValues).map(name => {\n      const value = uniformValues[name];\n\n      if (value instanceof Texture) {\n        material.setTexture(name, value);\n      } else if (name === 'uTrailStart') {\n        material.setFloats('uTrailStart', value);\n      } else if (name === 'uVCurveValues') {\n        const array: Vector4[] = [];\n\n        for (let i = 0; i < value.length; i = i + 4) {\n          const v = new Vector4(value[i], value[i + 1], value[i + 2], value[i + 3]);\n\n          array.push(v);\n        }\n        material.setVector4Array(name, array);\n      } else {\n        material.setVector4(name, Vector4.fromArray(value));\n      }\n    });\n\n    material.setFloat('uTime', 0);\n    // TODO: 修改下长度\n    material.setVector4('uWidthOverTrail', Vector4.fromArray(uWidthOverTrail));\n    material.setVector2('uTexOffset', new Vector2(0, 0));\n    material.setVector4('uTextureMap', Vector4.fromArray(textureMap));\n    material.setVector4('uParams', new Vector4(0, pointCountPerTrail - 1, 0, 0));\n    material.setTexture('uMaskTex', uMaskTex);\n    material.setVector4('uColorParams', new Vector4(texture ? 1 : 0, +preMulAlpha, 0, +(occlusion && !transparentOcclusion)));\n\n    this.maxTrailCount = maxTrailCount;\n    this.pointCountPerTrail = pointCountPerTrail;\n    this.checkVertexDistance = minimumVertexDistance > 0;\n    this.minimumVertexDistance = Math.pow(minimumVertexDistance || 0.001, 2);\n    this.useAttributeTrailStart = useAttributeTrailStart;\n    this.lifetime = lifetime;\n    if (matrix) {\n      this.mesh.worldMatrix = matrix;\n    }\n    this.geometry = mesh.firstGeometry();\n    this.trailCursors = new Uint16Array(maxTrailCount);\n  }\n\n  get time () {\n    return this.mesh.material.getFloat('uTime') || 0;\n  }\n  set time (t: number) {\n    this.mesh.material.setFloat('uTime', t ?? 0);\n  }\n\n  addPoint (trailIndex: number, position: Vector3, opt: TrailPointOptions) {\n    opt = opt || ({} as TrailPointOptions);\n    let cursor = this.trailCursors[trailIndex];\n    const pointCountPerTrail = this.pointCountPerTrail;\n    const geometry = this.geometry;\n    const segmentPerTrail = pointCountPerTrail - 1;\n    const pointIndex = cursor % pointCountPerTrail;\n    const previousIndex = (cursor - 1) % pointCountPerTrail;\n    const bpreviousIndex = (cursor - 2) % pointCountPerTrail;\n    const previousPoint = this.getTrailPosition(trailIndex, previousIndex, tmp0);\n    // point too close\n\n    if (previousPoint && this.checkVertexDistance && previousPoint?.distanceSquared(position) < this.minimumVertexDistance) {\n      return;\n    }\n\n    const pointStartIndex = trailIndex * pointCountPerTrail + pointIndex;\n    const dir = calculateDirection(previousPoint, position);\n    const time = opt.time || this.time;\n    const info = [Math.random(), opt.lifetime || this.lifetime, cursor] as vec3;\n    const size = opt.size || 1;\n\n    const dirStartIndex = pointStartIndex * 6;\n    const dirData = new Float32Array(6);\n\n    dirData.set(dir, 0);\n    dirData.set(dir, 3);\n\n    geometry.setAttributeSubData('aDir', dirStartIndex, dirData);\n    geometry.setAttributeSubData('aTime', pointStartIndex * 2, new Float32Array([time, time]));\n\n    const color = opt.color || [1, 1, 1, 1];\n    const colorData = new Float32Array(24);\n    const positionData = position.toArray();\n\n    colorData.set(color, 0);\n    colorData.set(info, 4);\n    colorData[7] = 0;\n    colorData.set(positionData, 8);\n    colorData[11] = 0.5 * size;\n\n    colorData.set(color, 12);\n    colorData.set(info, 16);\n    colorData[19] = 1;\n    colorData.set(positionData, 20);\n    colorData[23] = -0.5 * size;\n\n    geometry.setAttributeSubData('aColor', pointStartIndex * 24, colorData);\n\n    if (previousIndex >= 0) {\n      const bPreviousPoint = this.getTrailPosition(trailIndex, bpreviousIndex, tmp1) as Vector3;\n      const previousDir = new Float32Array(calculateDirection(bPreviousPoint, previousPoint as Vector3, position));\n      const previousDirStartIndex = (trailIndex * pointCountPerTrail + previousIndex) * 6;\n\n      geometry.setAttributeSubData('aDir', previousDirStartIndex, previousDir);\n      geometry.setAttributeSubData('aDir', previousDirStartIndex + 3, previousDir);\n      const indicesStart = trailIndex * pointCountPerTrail * 2;\n      const indicesData = new Uint16Array([\n        previousIndex * 2 + indicesStart,\n        previousIndex * 2 + 1 + indicesStart,\n        pointIndex * 2 + indicesStart,\n        pointIndex * 2 + indicesStart,\n        previousIndex * 2 + 1 + indicesStart,\n        pointIndex * 2 + 1 + indicesStart,\n      ]);\n      const start = (trailIndex * segmentPerTrail + (cursor - 1) % segmentPerTrail) * 6;\n\n      geometry.setIndexSubData(start, indicesData);\n    }\n\n    cursor = ++this.trailCursors[trailIndex];\n    const mtl = this.mesh.material;\n    const params = mtl.getVector4('uParams');\n    const trailStart = info[2];\n\n    if (this.useAttributeTrailStart) {\n      const len = pointCountPerTrail * 2;\n      const startData: Float32Array = new Float32Array(len);\n\n      for (let i = 0; i < len; i++) {\n        startData[i] = trailStart;\n      }\n      geometry.setAttributeSubData('aTrailStart', trailIndex * startData.length, startData);\n    } else {\n      const value = mtl.getFloats('uTrailStart');\n\n      if (value != undefined) {\n        value[trailIndex] = trailStart;\n        mtl.setFloats('uTrailStart', value);\n      }\n    }\n\n    if (params) {\n      params.y = Math.max(params.y, cursor - 1) - Math.max(0, cursor - pointCountPerTrail);\n      mtl.setVector4('uParams', params);\n    }\n  }\n\n  getTrailPosition (trail: number, index: number, out: Vector3): Vector3 | undefined {\n    const pointCountPerTrail = this.pointCountPerTrail;\n\n    if (index >= 0 && index < pointCountPerTrail) {\n      const startIndex = (trail * pointCountPerTrail + index) * 24 + 8;\n      const data = this.geometry.getAttributeData('aColor');\n\n      assertExist(data);\n\n      out.x = data[startIndex];\n      out.y = data[1 + startIndex];\n      out.z = data[2 + startIndex];\n\n      return out;\n    }\n  }\n\n  clearAllTrails () {\n    const indexData = this.geometry.getIndexData();\n\n    assertExist(indexData);\n\n    this.trailCursors = new Uint16Array(this.trailCursors.length);\n    this.geometry.setIndexData(new Uint16Array(indexData.length));\n  }\n\n  minusTime (time: number) {\n    const data = this.geometry.getAttributeData('aTime');\n\n    assertExist(data);\n\n    for (let i = 0; i < data.length; i++) {\n      data[i] -= time;\n    }\n    this.geometry.setAttributeData('aTime', data);\n    this.time -= time;\n  }\n\n  clearTrail (index: number) {\n    if (this.trailCursors[index] !== 0) {\n      const pointCountPerTrail = this.pointCountPerTrail;\n      const indicesPerTrail = (pointCountPerTrail - 1) * 6;\n      const indices = this.geometry.getIndexData();\n\n      assertExist(indices);\n\n      indices.set(new Uint16Array(indicesPerTrail), index * indicesPerTrail);\n      this.geometry.setIndexData(indices);\n\n      this.trailCursors[index] = 0;\n    }\n  }\n\n  getPointStartPos (index: number) {\n    return this.pointStart[index];\n  }\n\n  setPointStartPos (index: number, pos: Vector3) {\n    this.pointStart[index] = pos;\n  }\n\n  onUpdate (escapeTime: number): any {\n  }\n\n}\n\nconst tempDir = new Vector3();\nconst tempDa = new Vector3();\nconst tempDb = new Vector3();\n\n// TODO: prePoint 可选，point 必选，顺序有问题\nfunction calculateDirection (prePoint: Vector3 | undefined, point: Vector3, nextPoint?: Vector3): vec3 {\n  const dir = tempDir;\n\n  if (!prePoint && !nextPoint) {\n    return [0, 0, 0];\n  } else if (!prePoint) {\n    dir.subtractVectors(nextPoint!, point);\n  } else if (!nextPoint) {\n    dir.subtractVectors(point, prePoint);\n  } else {\n    tempDa.subtractVectors(point, prePoint).normalize();\n    // FIXME: 这里有bug。。。\n    tempDa.subtractVectors(nextPoint, point);\n    tempDb.copyFrom(tempDa).normalize();\n    dir.addVectors(tempDa, tempDb);\n  }\n\n  return dir.normalize().toArray();\n}\n\nexport function getTrailMeshShader (\n  trails: spec.ParticleTrail,\n  particleMaxCount: number,\n  name: string,\n  gpuCapability: GPUCapability,\n  env = '',\n): ShaderWithSource {\n  let shaderCacheId = 0;\n  const lookUpTexture = getConfig(RENDER_PREFER_LOOKUP_TEXTURE) ? 1 : 0;\n  const enableVertexTexture = gpuCapability.detail.maxVertexTextures > 0;\n  const macros: ShaderMacros = [\n    ['ENABLE_VERTEX_TEXTURE', enableVertexTexture],\n    ['LOOKUP_TEXTURE_CURVE', lookUpTexture],\n    ['ENV_EDITOR', env === PLAYER_OPTIONS_ENV_EDITOR],\n  ];\n  const keyFrameMeta = createKeyFrameMeta();\n\n  if (trails.colorOverLifetime) {\n    macros.push(['COLOR_OVER_LIFETIME', true]);\n    shaderCacheId |= 1;\n  }\n  if (trails.colorOverTrail) {\n    macros.push(['COLOR_OVER_TRAIL', true]);\n    shaderCacheId |= 1 << 2;\n  }\n\n  const useAttributeTrailStart = particleMaxCount > 64;\n\n  if (useAttributeTrailStart) {\n    macros.push(['ATTR_TRAIL_START', 1]);\n    shaderCacheId |= 1 << 3;\n  }\n  getKeyFrameMetaByRawValue(keyFrameMeta, trails.opacityOverLifetime);\n  getKeyFrameMetaByRawValue(keyFrameMeta, trails.widthOverTrail);\n  macros.push(\n    ['VERT_CURVE_VALUE_COUNT', keyFrameMeta.index],\n    ['VERT_MAX_KEY_FRAME_COUNT', keyFrameMeta.max]);\n\n  return {\n    vertex: trailVert,\n    fragment: particleFrag,\n    macros,\n    shared: true,\n    name: 'trail#' + name,\n    cacheId: `-t:+${shaderCacheId}+${keyFrameMeta.index}+${keyFrameMeta.max}`,\n  };\n}\n","import { VFXItem } from '../../vfx-item';\nimport type { FrameContext } from '../timeline/playable';\nimport { Playable, PlayableAsset } from '../timeline/playable';\nimport { ParticleSystem } from './particle-system';\n\n/**\n * @since 2.0.0\n */\nexport class ParticleBehaviourPlayable extends Playable {\n  lastTime = 0;\n  particleSystem: ParticleSystem;\n\n  start (context: FrameContext): void {\n    const boundObject = context.output.getUserData();\n\n    if (this.particleSystem || !(boundObject instanceof VFXItem)) {\n      return;\n    }\n    this.particleSystem = boundObject.getComponent(ParticleSystem);\n\n    if (this.particleSystem) {\n      this.particleSystem.name = boundObject.name;\n    }\n  }\n\n  override processFrame (context: FrameContext): void {\n    if (this.time >= 0) {\n      this.start(context);\n    }\n    const particleSystem = this.particleSystem;\n\n    if (particleSystem) {\n      if (\n        this.time >= 0 &&\n        this.time < particleSystem.item.duration &&\n        particleSystem.isEnded()\n      ) {\n        particleSystem.reset();\n      }\n\n      // TODO: There is one less conversion from second to millisecond here,\n      // which is retained for frame test.\n      particleSystem.update(this.time - particleSystem.time);\n    }\n    this.lastTime = this.time;\n  }\n}\n\nexport class ParticleBehaviourPlayableAsset extends PlayableAsset {\n  override createPlayable (): Playable {\n    return new ParticleBehaviourPlayable();\n  }\n}\n\nexport const particleUniformTypeMap: Record<string, string> = {\n  'uSprite': 'vec4',\n  'uParams': 'vec4',\n  'uAcceleration': 'vec4',\n  'uGravityModifierValue': 'vec4',\n  'uOpacityOverLifetimeValue': 'vec4',\n  'uRXByLifeTimeValue': 'vec4',\n  'uRYByLifeTimeValue': 'vec4',\n  'uRZByLifeTimeValue': 'vec4',\n  'uLinearXByLifetimeValue': 'vec4',\n  'uLinearYByLifetimeValue': 'vec4',\n  'uLinearZByLifetimeValue': 'vec4',\n  'uSpeedLifetimeValue': 'vec4',\n  'uOrbXByLifetimeValue': 'vec4',\n  'uOrbYByLifetimeValue': 'vec4',\n  'uOrbZByLifetimeValue': 'vec4',\n  'uSizeByLifetimeValue': 'vec4',\n  'uSizeYByLifetimeValue': 'vec4',\n  'uColorParams': 'vec4',\n  'uFSprite': 'vec4',\n  'uPreviewColor': 'vec4',\n  'uVCurveValues': 'vec4Array',\n  'uFCurveValues': 'vec4',\n  'uFinalTarget': 'vec3',\n  'uForceCurve': 'vec4',\n  'uOrbCenter': 'vec3',\n  'uTexOffset': 'vec2',\n  'uPeriodValue': 'vec4',\n  'uMovementValue': 'vec4',\n  'uStrengthValue': 'vec4',\n  'uWaveParams': 'vec4',\n};\n","import type * as spec from '@galacean/effects-specification';\nimport type { Matrix4 } from '@galacean/effects-math/es/core/matrix4';\nimport { Euler } from '@galacean/effects-math/es/core/euler';\nimport { Quaternion } from '@galacean/effects-math/es/core/quaternion';\nimport { Vector2 } from '@galacean/effects-math/es/core/vector2';\nimport { Vector3 } from '@galacean/effects-math/es/core/vector3';\nimport { Vector4 } from '@galacean/effects-math/es/core/vector4';\nimport { Matrix3 } from '@galacean/effects-math/es/core/matrix3';\nimport { clamp } from '@galacean/effects-math/es/core/utils';\nimport type { Engine } from '../../engine';\nimport { getConfig, RENDER_PREFER_LOOKUP_TEXTURE } from '../../config';\nimport { PLAYER_OPTIONS_ENV_EDITOR } from '../../constants';\nimport type { MaterialProps } from '../../material';\nimport {\n  getPreMultiAlpha, Material, setBlendMode, setMaskMode, setSideMode,\n} from '../../material';\nimport {\n  createKeyFrameMeta, createValueGetter, ValueGetter, getKeyFrameMetaByRawValue,\n  RandomValue,\n} from '../../math';\nimport type {\n  Attribute, GPUCapability, GeometryProps, ShaderMacros, SharedShaderWithSource,\n} from '../../render';\nimport { GLSLVersion, Geometry, Mesh } from '../../render';\nimport { particleFrag, particleVert } from '../../shader';\nimport { Texture, generateHalfFloatTexture } from '../../texture';\nimport { Transform } from '../../transform';\nimport { assertExist, enlargeBuffer, imageDataFromGradient } from '../../utils';\nimport { particleUniformTypeMap } from './particle-vfx-item';\n\nexport type Point = {\n  vel: Vector3,\n  lifetime: number,\n  color: spec.vec4,\n  uv: number[],\n  dirX: Vector3,\n  dirY: Vector3,\n  delay: number,\n  sprite?: [start: number, duration: number, cycles: number],\n  transform: Transform,\n  gravity: spec.vec3,\n  size: Vector2,\n};\n\nexport interface ParticleMeshData {\n  gravityModifier: ValueGetter<number>,\n  sizeOverLifetime?: {\n    x: ValueGetter<number>,\n    y?: ValueGetter<number>,\n    separateAxes?: boolean,\n  },\n  meshSlots?: number[],\n  forceTarget?: {\n    curve: ValueGetter<number>,\n    target: spec.vec3,\n  },\n  colorOverLifetime?: {\n    color?: number[][] | Texture,\n    opacity?: ValueGetter<number>,\n    separateAxes?: boolean,\n  },\n  linearVelOverLifetime?: {\n    asMovement?: boolean,\n    x?: ValueGetter<number>,\n    y?: ValueGetter<number>,\n    z?: ValueGetter<number>,\n    enabled?: boolean,\n  } & Record<string, any>,\n  orbitalVelOverLifetime?: {\n    asRotation?: boolean,\n    x?: ValueGetter<number>,\n    y?: ValueGetter<number>,\n    z?: ValueGetter<number>,\n    enabled?: boolean,\n    center?: spec.vec3,\n  } & Record<string, any>,\n  rotationOverLifetime?: {\n    asRotation?: boolean,\n    x?: ValueGetter<number>,\n    y?: ValueGetter<number>,\n    z?: ValueGetter<number>,\n  },\n  speedOverLifetime?: ValueGetter<number>,\n}\n\nexport interface ParticleMeshProps extends ParticleMeshData {\n  renderMode?: number,\n  blending?: number,\n  mask: number,\n  maskMode: number,\n  side: number,\n  transparentOcclusion?: boolean,\n  matrix?: Matrix4,\n  sprite?: {\n    animate?: boolean,\n    blend?: boolean,\n    col: number,\n    row: number,\n    total: number,\n  },\n  gravity?: spec.vec3,\n  useSprite?: boolean,\n  textureFlip?: boolean,\n  occlusion?: boolean,\n  diffuse?: Texture,\n  forceTarget?: {\n    curve: ValueGetter<number>,\n    target: spec.vec3,\n  },\n  // listIndex: number,\n  // duration: number,\n  maxCount: number,\n  shaderCachePrefix: string,\n  name: string,\n  anchor: Vector2,\n}\nexport class ParticleMesh implements ParticleMeshData {\n  duration: number;\n  geometry: Geometry;\n  mesh: Mesh;\n  particleCount = 0;\n  maxParticleBufferCount: number;\n  gravityModifier: ValueGetter<number>;\n  sizeOverLifetime?: { x: ValueGetter<number>, y?: ValueGetter<number>, separateAxes?: boolean };\n  forceTarget?: { curve: ValueGetter<number>, target: spec.vec3 };\n  colorOverLifetime?: { color?: number[][], opacity?: ValueGetter<number>, separateAxes?: boolean };\n  linearVelOverLifetime?: { asMovement?: boolean, x?: ValueGetter<number>, y?: ValueGetter<number>, z?: ValueGetter<number>, enabled?: boolean };\n  orbitalVelOverLifetime?: { asRotation?: boolean, x?: ValueGetter<number>, y?: ValueGetter<number>, z?: ValueGetter<number>, enabled?: boolean, center?: spec.vec3 };\n  rotationOverLifetime?: { asRotation?: boolean, x?: ValueGetter<number>, y?: ValueGetter<number>, z?: ValueGetter<number> };\n  speedOverLifetime?: ValueGetter<number>;\n  time: number;\n  maxCount: number;\n\n  readonly useSprite?: boolean;\n  readonly textureOffsets: number[];\n  readonly anchor: Vector2;\n\n  private cachedRotationVector3 = new Vector3();\n  private cachedRotationMatrix = new Matrix3();\n  private cachedLinearMove = new Vector3();\n  private tempMatrix3 = new Matrix3();\n\n  VERT_MAX_KEY_FRAME_COUNT = 0;\n\n  constructor (\n    engine: Engine,\n    props: ParticleMeshProps,\n  ) {\n    const { env } = engine ?? {};\n    const {\n      speedOverLifetime, colorOverLifetime, linearVelOverLifetime, orbitalVelOverLifetime, sizeOverLifetime, rotationOverLifetime,\n      sprite, gravityModifier, maxCount, textureFlip, useSprite, name,\n      gravity, forceTarget, side, occlusion, anchor, blending,\n      maskMode, mask, transparentOcclusion, meshSlots,\n      renderMode = 0,\n      diffuse = Texture.createWithData(engine),\n    } = props;\n    const { detail } = engine.gpuCapability;\n    const { halfFloatTexture, maxVertexUniforms } = detail;\n    const macros: ShaderMacros = [\n      // spec.RenderMode\n      ['RENDER_MODE', +renderMode],\n      ['ENV_EDITOR', env === PLAYER_OPTIONS_ENV_EDITOR],\n    ];\n    const { level } = engine.gpuCapability;\n    const vertexKeyFrameMeta = createKeyFrameMeta();\n    const fragmentKeyFrameMeta = createKeyFrameMeta();\n    const enableVertexTexture = maxVertexUniforms > 0;\n    const uniformValues: Record<string, any> = {};\n    let vertex_lookup_texture = 0;\n    let shaderCacheId = 0;\n    let useOrbitalVel;\n\n    this.useSprite = useSprite;\n    if (enableVertexTexture) {\n      macros.push(['ENABLE_VERTEX_TEXTURE', true]);\n    }\n    if (speedOverLifetime) {\n      macros.push(['SPEED_OVER_LIFETIME', true]);\n      shaderCacheId |= 1 << 1;\n      uniformValues.uSpeedLifetimeValue = speedOverLifetime.toUniform(vertexKeyFrameMeta);\n    }\n    if (sprite?.animate) {\n      macros.push(['USE_SPRITE', true]);\n      shaderCacheId |= 1 << 2;\n      uniformValues.uFSprite = uniformValues.uSprite = new Float32Array([sprite.col, sprite.row, sprite.total, sprite.blend ? 1 : 0]);\n      this.useSprite = true;\n    }\n    if (colorOverLifetime?.color) {\n      macros.push(['COLOR_OVER_LIFETIME', true]);\n      shaderCacheId |= 1 << 4;\n      uniformValues.uColorOverLifetime = colorOverLifetime.color instanceof Texture ? colorOverLifetime.color : Texture.createWithData(engine, imageDataFromGradient(colorOverLifetime.color));\n    }\n    if (colorOverLifetime?.opacity) {\n      uniformValues.uOpacityOverLifetimeValue = colorOverLifetime.opacity.toUniform(vertexKeyFrameMeta);\n    } else {\n      uniformValues.uOpacityOverLifetimeValue = createValueGetter(1).toUniform(vertexKeyFrameMeta);\n    }\n\n    ['x', 'y', 'z'].forEach((pro, i) => {\n      let defL = 0;\n      let defO = 0;\n\n      if (linearVelOverLifetime?.[pro]) {\n        uniformValues[`uLinear${pro.toUpperCase()}ByLifetimeValue`] = linearVelOverLifetime[pro].toUniform(vertexKeyFrameMeta);\n        defL = 1;\n        shaderCacheId |= 1 << (7 + i);\n        linearVelOverLifetime.enabled = true;\n      }\n      macros.push([`LINEAR_VEL_${pro.toUpperCase()}`, defL]);\n      if (orbitalVelOverLifetime?.[pro]) {\n        uniformValues[`uOrb${pro.toUpperCase()}ByLifetimeValue`] = orbitalVelOverLifetime[pro].toUniform(vertexKeyFrameMeta);\n        defO = 1;\n        shaderCacheId |= 1 << (10 + i);\n        useOrbitalVel = true;\n        orbitalVelOverLifetime.enabled = true;\n      }\n      macros.push([`ORB_VEL_${pro.toUpperCase()}`, defO]);\n    });\n    if (linearVelOverLifetime?.asMovement) {\n      macros.push(['AS_LINEAR_MOVEMENT', true]);\n      shaderCacheId |= 1 << 5;\n    }\n\n    if (useOrbitalVel) {\n      if (orbitalVelOverLifetime?.asRotation) {\n        macros.push(['AS_ORBITAL_MOVEMENT', true]);\n        shaderCacheId |= 1 << 6;\n      }\n      uniformValues.uOrbCenter = new Float32Array(orbitalVelOverLifetime?.center || [0, 0, 0]);\n    }\n\n    uniformValues.uSizeByLifetimeValue = sizeOverLifetime?.x.toUniform(vertexKeyFrameMeta);\n    if (sizeOverLifetime?.separateAxes) {\n      macros.push(['SIZE_Y_BY_LIFE', 1]);\n      shaderCacheId |= 1 << 14;\n      uniformValues.uSizeYByLifetimeValue = sizeOverLifetime?.y?.toUniform(vertexKeyFrameMeta);\n    }\n    if (rotationOverLifetime?.z) {\n      uniformValues.uRZByLifeTimeValue = rotationOverLifetime.z.toUniform(vertexKeyFrameMeta);\n      shaderCacheId |= 1 << 15;\n      macros.push(['ROT_Z_LIFETIME', 1]);\n    }\n    if (rotationOverLifetime?.x) {\n      uniformValues.uRXByLifeTimeValue = rotationOverLifetime.x.toUniform(vertexKeyFrameMeta);\n      shaderCacheId |= 1 << 16;\n      macros.push(['ROT_X_LIFETIME', 1]);\n    }\n    if (rotationOverLifetime?.y) {\n      uniformValues.uRYByLifeTimeValue = rotationOverLifetime.y.toUniform(vertexKeyFrameMeta);\n      shaderCacheId |= 1 << 17;\n      macros.push(['ROT_Y_LIFETIME', 1]);\n    }\n    if (rotationOverLifetime?.asRotation) {\n      macros.push(['ROT_LIFETIME_AS_MOVEMENT', 1]);\n      shaderCacheId |= 1 << 18;\n    }\n    uniformValues.uGravityModifierValue = gravityModifier.toUniform(vertexKeyFrameMeta);\n\n    if (forceTarget) {\n      macros.push(['FINAL_TARGET', true]);\n      shaderCacheId |= 1 << 19;\n      uniformValues.uFinalTarget = new Float32Array(forceTarget.target || [0, 0, 0]);\n      uniformValues.uForceCurve = forceTarget.curve.toUniform(vertexKeyFrameMeta);\n    }\n\n    if (halfFloatTexture && fragmentKeyFrameMeta.max) {\n      shaderCacheId |= 1 << 20;\n      uniformValues.uFCurveValueTexture = generateHalfFloatTexture(engine, ValueGetter.getAllData(fragmentKeyFrameMeta, true) as Uint16Array, fragmentKeyFrameMeta.index, 1);\n    } else {\n      uniformValues.uFCurveValues = ValueGetter.getAllData(fragmentKeyFrameMeta);\n    }\n    const vertexCurveTexture = vertexKeyFrameMeta.max + vertexKeyFrameMeta.curves.length - 32 > maxVertexUniforms;\n\n    // if (getConfig(RENDER_PREFER_LOOKUP_TEXTURE)) {\n    //   vertexCurveTexture = true;\n    // }\n    if (level === 2) {\n      vertexKeyFrameMeta.max = -1;\n      vertexKeyFrameMeta.index = meshSlots ? meshSlots[0] : getSlot(vertexKeyFrameMeta.index);\n      if (fragmentKeyFrameMeta.index > 0) {\n        fragmentKeyFrameMeta.max = -1;\n        fragmentKeyFrameMeta.index = meshSlots ? meshSlots[1] : getSlot(fragmentKeyFrameMeta.index);\n      }\n    }\n    if (vertexCurveTexture && halfFloatTexture && enableVertexTexture) {\n      const tex = generateHalfFloatTexture(engine, ValueGetter.getAllData(vertexKeyFrameMeta, true) as Uint16Array, vertexKeyFrameMeta.index, 1);\n\n      uniformValues.uVCurveValueTexture = tex;\n      vertex_lookup_texture = 1;\n    } else {\n      uniformValues.uVCurveValues = ValueGetter.getAllData(vertexKeyFrameMeta);\n    }\n    const shaderCache = ['-p:', renderMode, shaderCacheId, vertexKeyFrameMeta.index, vertexKeyFrameMeta.max, fragmentKeyFrameMeta.index, fragmentKeyFrameMeta.max].join('+');\n\n    macros.push(\n      ['VERT_CURVE_VALUE_COUNT', vertexKeyFrameMeta.index],\n      ['FRAG_CURVE_VALUE_COUNT', fragmentKeyFrameMeta.index],\n      ['VERT_MAX_KEY_FRAME_COUNT', vertexKeyFrameMeta.max],\n      ['FRAG_MAX_KEY_FRAME_COUNT', fragmentKeyFrameMeta.max],\n    );\n    this.VERT_MAX_KEY_FRAME_COUNT = vertexKeyFrameMeta.max;\n\n    const fragment = particleFrag;\n    const originalVertex = `#define LOOKUP_TEXTURE_CURVE ${vertex_lookup_texture}\\n${particleVert}`;\n    const vertex = originalVertex;\n\n    const shader = {\n      fragment,\n      vertex,\n      glslVersion: level === 1 ? GLSLVersion.GLSL1 : GLSLVersion.GLSL3,\n      shared: true,\n      cacheId: shaderCache,\n      macros,\n      name: `particle#${name}`,\n    };\n    const mtlOptions: MaterialProps = {\n      shader,\n    };\n    const preMulAlpha = getPreMultiAlpha(blending);\n\n    uniformValues.uTexOffset = new Float32Array(diffuse ? [1 / diffuse.getWidth(), 1 / diffuse.getHeight()] : [0, 0]);\n    uniformValues.uMaskTex = diffuse;\n    uniformValues.uColorParams = new Float32Array([diffuse ? 1 : 0, +preMulAlpha, 0, +(!!occlusion && !transparentOcclusion)]);\n    uniformValues.uParams = [0, 0, 0, 0];\n    uniformValues.uAcceleration = [gravity?.[0] || 0, gravity?.[1] || 0, gravity?.[2] || 0, 0];\n    // mtlOptions.uniformValues = uniformValues;\n\n    const material = Material.create(engine, mtlOptions);\n\n    material.blending = true;\n    material.depthTest = true;\n    material.depthMask = !!occlusion;\n    material.stencilRef = mask ? [mask, mask] : undefined;\n    setMaskMode(material, maskMode);\n    setBlendMode(material, blending);\n    setSideMode(material, side);\n\n    Object.keys(uniformValues).map(name => {\n      const value = uniformValues[name];\n\n      if (value instanceof Texture) {\n        material.setTexture(name, value);\n\n        return;\n      }\n      const res: Vector4[] = [];\n\n      switch (particleUniformTypeMap[name]) {\n        case 'vec4':\n          material.setVector4(name, Vector4.fromArray(value));\n\n          break;\n        case 'vec3':\n          material.setVector3(name, Vector3.fromArray(value));\n\n          break;\n        case 'vec2':\n          material.setVector2(name, Vector2.fromArray(value));\n\n          break;\n        case 'vec4Array':\n\n          for (let i = 0; i < value.length; i = i + 4) {\n            const v = new Vector4(value[i], value[i + 1], value[i + 2], value[i + 3]);\n\n            res.push(v);\n          }\n          material.setVector4Array(name, res);\n          res.length = 0;\n\n          break;\n        default:\n          console.warn(`Uniform ${name}'s type not in typeMap.`);\n      }\n    });\n\n    material.setVector3('emissionColor', new Vector3(0, 0, 0));\n    material.setFloat('emissionIntensity', 0.0);\n\n    const geometry = Geometry.create(engine, generateGeometryProps(maxCount * 4, this.useSprite, `particle#${name}`));\n    const mesh = Mesh.create(engine, {\n      name: `MParticle_${name}`,\n      // priority: listIndex,\n      material,\n      geometry,\n    });\n\n    this.anchor = anchor;\n    this.mesh = mesh;\n    this.geometry = mesh.firstGeometry();\n    this.forceTarget = forceTarget;\n    this.sizeOverLifetime = sizeOverLifetime;\n    this.speedOverLifetime = speedOverLifetime;\n    this.linearVelOverLifetime = linearVelOverLifetime;\n    this.orbitalVelOverLifetime = orbitalVelOverLifetime;\n    this.orbitalVelOverLifetime = orbitalVelOverLifetime;\n    this.gravityModifier = gravityModifier;\n    this.rotationOverLifetime = rotationOverLifetime;\n    this.maxCount = maxCount;\n    // this.duration = duration;\n    this.textureOffsets = textureFlip ? [0, 0, 1, 0, 0, 1, 1, 1] : [0, 1, 0, 0, 1, 1, 1, 0];\n    this.time = 0;\n  }\n  // get time () {\n  //   // const value = this.mesh.material.getVector4('uParams')!;\n\n  //   // return value.x;\n  //   return this._time;\n  // }\n  // set time (value: number) {\n  //   this._time = value;\n  //   // this.mesh.material.setVector4('uParams', new Vector4(+v, this.duration, 0, 0));\n  // }\n\n  getPointColor (index: number) {\n    const data = this.geometry.getAttributeData('aRot');\n    const i = index * 32 + 4;\n\n    assertExist(data);\n\n    return [data[i], data[i + 1], data[i + 2], data[i + 3]];\n  }\n\n  clearPoints () {\n    this.resetGeometryData(this.geometry);\n    this.particleCount = 0;\n    this.geometry.setDrawCount(0);\n    this.maxParticleBufferCount = 0;\n  }\n\n  resetGeometryData (geometry: Geometry) {\n    const names = geometry.getAttributeNames();\n    const index = geometry.getIndexData();\n\n    for (let i = 0; i < names.length; i++) {\n      const name = names[i];\n      const data = geometry.getAttributeData(name);\n\n      if (data) {\n        // @ts-expect-error\n        geometry.setAttributeData(name, new data.constructor(0));\n      }\n    }\n    // @ts-expect-error\n    geometry.setIndexData(new index.constructor(0));\n  }\n\n  onUpdate (dt: number) {\n    const aPosArray = this.geometry.getAttributeData('aPos') as Float32Array; // vector3\n    const vertexCount = Math.ceil(aPosArray.length / 12);\n\n    this.applyTranslation(vertexCount, dt);\n    this.applyRotation(vertexCount, dt);\n    this.applyLinearMove(vertexCount, dt);\n  }\n\n  minusTime (time: number) {\n    const aOffset = this.geometry.getAttributeData('aOffset') as Float32Array;\n\n    for (let i = 0; i < aOffset.length; i += 4) {\n      aOffset[i + 2] -= time;\n    }\n    this.geometry.setAttributeData('aOffset', aOffset);\n    this.time -= time;\n  }\n\n  removePoint (index: number) {\n    if (index < this.particleCount) {\n      this.geometry.setAttributeSubData('aOffset', index * 16, new Float32Array(16));\n    }\n  }\n\n  setPoint (index: number, point: Point) {\n    const maxCount = this.maxCount;\n\n    if (index < maxCount) {\n      const particleCount = index + 1;\n      const vertexCount = particleCount * 4;\n      const geometry = this.geometry;\n      const increaseBuffer = particleCount > this.maxParticleBufferCount;\n      let inc = 1;\n\n      if (this.particleCount > 300) {\n        inc = (this.particleCount + 100) / this.particleCount;\n      } else if (this.particleCount > 100) {\n        inc = 1.4;\n      } else if (this.particleCount > 0) {\n        inc = 2;\n      }\n      const pointData: Record<string, Float32Array> = {\n        aPos: new Float32Array(48),\n        aRot: new Float32Array(32),\n        aOffset: new Float32Array(16),\n        aTranslation: new Float32Array(12),\n        aLinearMove:new Float32Array(12),\n        aRotation0: new Float32Array(36),\n      };\n      const useSprite = this.useSprite;\n\n      if (useSprite) {\n        pointData.aSprite = new Float32Array(12);\n      }\n\n      const tempPos = new Vector3();\n      const tempQuat = new Quaternion();\n      const scale = new Vector3(1, 1, 1);\n\n      point.transform.assignWorldTRS(tempPos, tempQuat, scale);\n      const tempEuler = Transform.getRotation(tempQuat, new Euler());\n\n      const position = tempPos.toArray();\n      const rotation = tempEuler.toArray();\n\n      const offsets = this.textureOffsets;\n      const off = [0, 0, point.delay, point.lifetime];\n      const wholeUV = [0, 0, 1, 1];\n      const vel = point.vel;\n      const color: number[] = point.color;\n      const sizeOffsets = [-.5, .5, -.5, -.5, .5, .5, .5, -.5];\n      const seed = Math.random();\n      let sprite;\n\n      if (useSprite) {\n        sprite = point.sprite;\n      }\n\n      for (let j = 0; j < 4; j++) {\n        const offset = j * 2;\n        const j3 = j * 3;\n        const j4 = j * 4;\n        const j12 = j * 12;\n        const j8 = j * 8;\n\n        pointData.aPos.set(position, j12);\n        vel.fill(pointData.aPos, j12 + 3);\n        pointData.aRot.set(rotation, j8);\n        pointData.aRot[j8 + 3] = seed;\n        pointData.aRot.set(color, j8 + 4);\n\n        if (useSprite) {\n          // @ts-expect-error\n          pointData.aSprite.set(sprite, j3);\n        }\n        const uv = point.uv || wholeUV;\n\n        if (uv) {\n          const uvy = useSprite ? (1 - offsets[offset + 1]) : offsets[offset + 1];\n\n          off[0] = uv[0] + offsets[offset] * uv[2];\n          off[1] = uv[1] + uvy * uv[3];\n        }\n        pointData.aOffset.set(off, j4);\n        const ji = (j + j);\n        const sx = (sizeOffsets[ji] - this.anchor.x) * scale.x;\n        const sy = (sizeOffsets[ji + 1] - this.anchor.y) * scale.y;\n\n        for (let k = 0; k < 3; k++) {\n          pointData.aPos[j12 + 6 + k] = point.dirX.getElement(k) * sx;\n          pointData.aPos[j12 + 9 + k] = point.dirY.getElement(k) * sy;\n        }\n      }\n      const indexData = new Uint16Array([0, 1, 2, 2, 1, 3].map(x => x + index * 4));\n\n      if (increaseBuffer) {\n        const baseIndexData = geometry.getIndexData() as Uint16Array;\n        const idx = enlargeBuffer(baseIndexData, particleCount * 6, maxCount * 6, inc);\n\n        idx.set(indexData, index * 6);\n        geometry.setIndexData(idx);\n        this.maxParticleBufferCount = idx.length / 6;\n      } else {\n        geometry.setIndexSubData(index * 6, indexData);\n      }\n\n      Object.keys(pointData).forEach(name => {\n        const data = pointData[name];\n        const attrSize = geometry.getAttributeStride(name) / Float32Array.BYTES_PER_ELEMENT;\n\n        if (increaseBuffer) {\n          const baseData = geometry.getAttributeData(name);\n\n          assertExist(baseData);\n\n          const geoData = enlargeBuffer(baseData, vertexCount * attrSize, maxCount * 4 * attrSize, inc);\n\n          geoData.set(data, data.length * index);\n          geometry.setAttributeData(name, geoData);\n        } else {\n          geometry.setAttributeSubData(name, data.length * index, data);\n        }\n      });\n      this.particleCount = Math.max(particleCount, this.particleCount);\n      geometry.setDrawCount(this.particleCount * 6);\n    }\n  }\n\n  private applyTranslation (vertexCount: number, deltaTime: number) {\n    const localTime = this.time;\n    let aTranslationArray = this.geometry.getAttributeData('aTranslation') as Float32Array;\n    const aVelArray = this.geometry.getAttributeData('aVel') as Float32Array; // vector3\n    const aOffsetArray = this.geometry.getAttributeData('aOffset') as Float32Array;\n\n    if (aTranslationArray.length < vertexCount * 3) {\n      aTranslationArray = this.expandArray(aTranslationArray, vertexCount * 3);\n    }\n    // const velocity = this.cachedVelocity;\n    let velocityX = 0;\n    let velocityY = 0;\n    let velocityZ = 0;\n    const uAcceleration = this.mesh.material.getVector4('uAcceleration');\n    const uGravityModifierValue = this.mesh.material.getVector4('uGravityModifierValue');\n\n    for (let i = 0; i < vertexCount; i += 4) {\n      const velOffset = i * 12 + 3;\n\n      velocityX = aVelArray[velOffset];\n      velocityY = aVelArray[velOffset + 1];\n      velocityZ = aVelArray[velOffset + 2];\n      // velocity.set(aVelArray[velOffset], aVelArray[velOffset + 1], aVelArray[velOffset + 2]);\n      const dt = localTime - aOffsetArray[i * 4 + 2];// 相对delay的时间\n      const duration = aOffsetArray[i * 4 + 3];\n\n      if (uAcceleration && uGravityModifierValue) {\n        const d = this.gravityModifier.getIntegrateValue(0, dt, duration);\n        // const acc = this.tempVector3.set(uAcceleration.x * d, uAcceleration.y * d, uAcceleration.z * d);\n        const accX = uAcceleration.x * d;\n        const accY = uAcceleration.y * d;\n        const accZ = uAcceleration.z * d;\n\n        // speedIntegrate = speedOverLifetime.getIntegrateValue(0, time, duration);\n        if (this.speedOverLifetime) {\n        // dt / dur 归一化\n          const speed = this.speedOverLifetime.getValue(dt / duration);\n\n          velocityX = velocityX * speed + accX;\n          velocityY = velocityY * speed + accY;\n          velocityZ = velocityZ * speed + accZ;\n          // velocity.multiply(speed).add(acc);\n        } else {\n          velocityX = velocityX + accX;\n          velocityY = velocityY + accY;\n          velocityZ = velocityZ + accZ;\n          // velocity.add(acc);\n        }\n      }\n\n      const aTranslationOffset = i * 3;\n\n      if (aOffsetArray[i * 4 + 2] < localTime) {\n        // const translation = velocity.multiply(deltaTime / 1000);\n        const aTranslationX = velocityX * (deltaTime / 1000);\n        const aTranslationY = velocityY * (deltaTime / 1000);\n        const aTranslationZ = velocityZ * (deltaTime / 1000);\n\n        aTranslationArray[aTranslationOffset] += aTranslationX;\n        aTranslationArray[aTranslationOffset + 1] += aTranslationY;\n        aTranslationArray[aTranslationOffset + 2] += aTranslationZ;\n\n        aTranslationArray[aTranslationOffset + 3] += aTranslationX;\n        aTranslationArray[aTranslationOffset + 4] += aTranslationY;\n        aTranslationArray[aTranslationOffset + 5] += aTranslationZ;\n\n        aTranslationArray[aTranslationOffset + 6] += aTranslationX;\n        aTranslationArray[aTranslationOffset + 7] += aTranslationY;\n        aTranslationArray[aTranslationOffset + 8] += aTranslationZ;\n\n        aTranslationArray[aTranslationOffset + 9] += aTranslationX;\n        aTranslationArray[aTranslationOffset + 10] += aTranslationY;\n        aTranslationArray[aTranslationOffset + 11] += aTranslationZ;\n      }\n    }\n    this.geometry.setAttributeData('aTranslation', aTranslationArray);\n  }\n\n  private applyRotation (vertexCount: number, deltaTime: number) {\n    let aRotationArray = this.geometry.getAttributeData('aRotation0') as Float32Array;\n    const aOffsetArray = this.geometry.getAttributeData('aOffset') as Float32Array;\n    const aRotArray = this.geometry.getAttributeData('aRot') as Float32Array; // vector3\n    const aSeedArray = this.geometry.getAttributeData('aSeed') as Float32Array; // float\n    const localTime = this.time;\n    const aRotationMatrix = this.cachedRotationMatrix;\n\n    if (aRotationArray.length < vertexCount * 9) {\n      aRotationArray = this.expandArray(aRotationArray, vertexCount * 9);\n    }\n\n    for (let i = 0; i < vertexCount; i += 4) {\n      const time = localTime - aOffsetArray[i * 4 + 2];\n      const duration = aOffsetArray[i * 4 + 3];\n      const life = clamp(time / duration, 0.0, 1.0);\n      const aRotOffset = i * 8;\n      const aRot = this.cachedRotationVector3.set(aRotArray[aRotOffset], aRotArray[aRotOffset + 1], aRotArray[aRotOffset + 2]);\n      const aSeed = aSeedArray[i * 8 + 3];\n\n      const rotation = aRot;\n\n      if (!this.rotationOverLifetime) {\n        aRotationMatrix.setZero();\n      } else {\n      // Adjust rotation based on the specified lifetime components\n        if (this.rotationOverLifetime.x) {\n          if (this.rotationOverLifetime.x instanceof RandomValue) {\n            rotation.x += this.rotationOverLifetime.x.getValue(life, aSeed);\n          } else {\n            rotation.x += this.rotationOverLifetime.x.getValue(life);\n          }\n        }\n        if (this.rotationOverLifetime.y) {\n          if (this.rotationOverLifetime.y instanceof RandomValue) {\n            rotation.y += this.rotationOverLifetime.y.getValue(life, aSeed);\n          } else {\n            rotation.y += this.rotationOverLifetime.y.getValue(life);\n          }\n        }\n        if (this.rotationOverLifetime.z) {\n          if (this.rotationOverLifetime.z instanceof RandomValue) {\n            rotation.z += this.rotationOverLifetime.z.getValue(life, aSeed);\n          } else {\n            rotation.z += this.rotationOverLifetime.z.getValue(life);\n          }\n        }\n      }\n      // else {\n      // // Adjust rotation based on the specified lifetime components\n      //   if (this.rotationOverLifetime.x) {\n      //     if (this.rotationOverLifetime.x instanceof RandomValue) {\n      //       rotation.x += this.rotationOverLifetime.x.getIntegrateValue(0.0, life, aSeed) * duration;\n      //     } else {\n      //       rotation.x += this.rotationOverLifetime.x.getIntegrateValue(0.0, life, duration) * duration;\n      //     }\n      //   }\n      //   if (this.rotationOverLifetime.y) {\n      //     if (this.rotationOverLifetime.y instanceof RandomValue) {\n      //       rotation.y += this.rotationOverLifetime.y.getIntegrateValue(0.0, life, aSeed) * duration;\n      //     } else {\n      //       rotation.y += this.rotationOverLifetime.y.getIntegrateValue(0.0, life, duration) * duration;\n      //     }\n      //   }\n      //   if (this.rotationOverLifetime.z) {\n      //     if (this.rotationOverLifetime.z instanceof RandomValue) {\n      //       rotation.z += this.rotationOverLifetime.z.getIntegrateValue(0.0, life, aSeed) * duration;\n      //     } else {\n      //       rotation.z += this.rotationOverLifetime.z.getIntegrateValue(0.0, life, duration) * duration;\n      //     }\n      //   }\n      // }\n\n      // If the rotation vector is zero, return the identity matrix\n      if (rotation.dot(rotation) === 0.0) {\n        aRotationMatrix.identity();\n      }\n\n      const d2r = Math.PI / 180;\n      const rotationXD2r = rotation.x * d2r;\n      const rotationYD2r = rotation.y * d2r;\n      const rotationZD2r = rotation.z * d2r;\n\n      const sinRX = Math.sin(rotationXD2r);\n      const sinRY = Math.sin(rotationYD2r);\n      const sinRZ = Math.sin(rotationZD2r);\n\n      const cosRX = Math.cos(rotationXD2r);\n      const cosRY = Math.cos(rotationYD2r);\n      const cosRZ = Math.cos(rotationZD2r);\n\n      // rotZ * rotY * rotX\n      aRotationMatrix.set(cosRZ, -sinRZ, 0., sinRZ, cosRZ, 0., 0., 0., 1.); //rotZ\n      aRotationMatrix.multiply(this.tempMatrix3.set(cosRY, 0., sinRY, 0., 1., 0., -sinRY, 0, cosRY)); //rotY\n      aRotationMatrix.multiply(this.tempMatrix3.set(1., 0., 0., 0, cosRX, -sinRX, 0., sinRX, cosRX)); //rotX\n\n      const aRotationOffset = i * 9;\n      const matrixArray = aRotationMatrix.elements;\n\n      aRotationArray.set(matrixArray, aRotationOffset);\n      if (i + 4 <= vertexCount) {\n        aRotationArray.set(matrixArray, aRotationOffset + 9);\n        aRotationArray.set(matrixArray, aRotationOffset + 18);\n        aRotationArray.set(matrixArray, aRotationOffset + 27);\n      }\n    }\n\n    this.geometry.setAttributeData('aRotation0', aRotationArray);\n  }\n\n  private applyLinearMove (vertexCount: number, deltaTime: number) {\n    let aLinearMoveArray = this.geometry.getAttributeData('aLinearMove') as Float32Array;\n    const aOffsetArray = this.geometry.getAttributeData('aOffset') as Float32Array;\n    const aSeedArray = this.geometry.getAttributeData('aSeed') as Float32Array; // float\n    const localTime = this.time;\n\n    if (aLinearMoveArray.length < vertexCount * 3) {\n      aLinearMoveArray = this.expandArray(aLinearMoveArray, vertexCount * 3);\n    }\n\n    const linearMove = this.cachedLinearMove;\n\n    if (this.linearVelOverLifetime && this.linearVelOverLifetime.enabled) {\n      for (let i = 0; i < vertexCount; i += 4) {\n        const time = localTime - aOffsetArray[i * 4 + 2];\n        const duration = aOffsetArray[i * 4 + 3];\n        // const life = math.clamp(time / duration, 0.0, 1.0);\n        const lifetime = time / duration;\n        const aSeed = aSeedArray[i * 8 + 3];\n\n        linearMove.setZero();\n\n        if (this.linearVelOverLifetime.asMovement) {\n          if (this.linearVelOverLifetime.x) {\n            if (this.linearVelOverLifetime.x instanceof RandomValue) {\n              linearMove.x = this.linearVelOverLifetime.x.getValue(lifetime, aSeed);\n            } else {\n              linearMove.x = this.linearVelOverLifetime.x.getValue(lifetime);\n            }\n          }\n          if (this.linearVelOverLifetime.y) {\n            if (this.linearVelOverLifetime.y instanceof RandomValue) {\n              linearMove.y = this.linearVelOverLifetime.y.getValue(lifetime, aSeed);\n            } else {\n              linearMove.y = this.linearVelOverLifetime.y.getValue(lifetime);\n            }\n          }\n          if (this.linearVelOverLifetime.z) {\n            if (this.linearVelOverLifetime.z instanceof RandomValue) {\n              linearMove.z = this.linearVelOverLifetime.z.getValue(lifetime, aSeed);\n            } else {\n              linearMove.z = this.linearVelOverLifetime.z.getValue(lifetime);\n            }\n          }\n        } else {\n        // Adjust rotation based on the specified lifetime components\n          if (this.linearVelOverLifetime.x) {\n            if (this.linearVelOverLifetime.x instanceof RandomValue) {\n              linearMove.x = this.linearVelOverLifetime.x.getIntegrateValue(0.0, time, aSeed);\n            } else {\n              linearMove.x = this.linearVelOverLifetime.x.getIntegrateValue(0.0, time, duration);\n            }\n          }\n          if (this.linearVelOverLifetime.y) {\n            if (this.linearVelOverLifetime.y instanceof RandomValue) {\n              linearMove.y = this.linearVelOverLifetime.y.getIntegrateValue(0.0, time, aSeed);\n            } else {\n              linearMove.y = this.linearVelOverLifetime.y.getIntegrateValue(0.0, time, duration);\n            }\n          }\n          if (this.linearVelOverLifetime.z) {\n            if (this.linearVelOverLifetime.z instanceof RandomValue) {\n              linearMove.z = this.linearVelOverLifetime.z.getIntegrateValue(0.0, time, aSeed);\n            } else {\n              linearMove.z = this.linearVelOverLifetime.z.getIntegrateValue(0.0, time, duration);\n            }\n          }\n        }\n        const aLinearMoveOffset = i * 3;\n\n        aLinearMoveArray[aLinearMoveOffset] = linearMove.x;\n        aLinearMoveArray[aLinearMoveOffset + 1] = linearMove.y;\n        aLinearMoveArray[aLinearMoveOffset + 2] = linearMove.z;\n\n        aLinearMoveArray[aLinearMoveOffset + 3] = linearMove.x;\n        aLinearMoveArray[aLinearMoveOffset + 4] = linearMove.y;\n        aLinearMoveArray[aLinearMoveOffset + 5] = linearMove.z;\n\n        aLinearMoveArray[aLinearMoveOffset + 6] = linearMove.x;\n        aLinearMoveArray[aLinearMoveOffset + 7] = linearMove.y;\n        aLinearMoveArray[aLinearMoveOffset + 8] = linearMove.z;\n\n        aLinearMoveArray[aLinearMoveOffset + 9] = linearMove.x;\n        aLinearMoveArray[aLinearMoveOffset + 10] = linearMove.y;\n        aLinearMoveArray[aLinearMoveOffset + 11] = linearMove.z;\n      }\n    }\n    this.geometry.setAttributeData('aLinearMove', aLinearMoveArray);\n  }\n\n  private expandArray (array: Float32Array, newSize: number): Float32Array {\n    const newArr = new Float32Array(newSize);\n\n    newArr.set(array);\n\n    return newArr;\n  }\n}\n\nconst gl2UniformSlots = [10, 32, 64, 160];\n\nfunction getSlot (count: number): number {\n  for (let w = 0; w < gl2UniformSlots.length; w++) {\n    const slot = gl2UniformSlots[w];\n\n    if (slot > count) {\n      return slot;\n    }\n  }\n\n  return count || gl2UniformSlots[0];\n}\n\nfunction generateGeometryProps (\n  maxVertex: number,\n  useSprite?: boolean,\n  name?: string,\n): GeometryProps {\n  const bpe = Float32Array.BYTES_PER_ELEMENT;\n  const j12 = bpe * 12;\n  const attributes: Record<string, Attribute> = {\n    aPos: { size: 3, offset: 0, stride: j12, data: new Float32Array(0) },\n    aVel: { size: 3, offset: 3 * bpe, stride: j12, dataSource: 'aPos' },\n    aDirX: { size: 3, offset: 6 * bpe, stride: j12, dataSource: 'aPos' },\n    aDirY: { size: 3, offset: 9 * bpe, stride: j12, dataSource: 'aPos' },\n    //\n    aRot: { size: 3, offset: 0, stride: 8 * bpe, data: new Float32Array(0) },\n    aSeed: { size: 1, offset: 3 * bpe, stride: 8 * bpe, dataSource: 'aRot' },\n    aColor: { size: 4, offset: 4 * bpe, stride: 8 * bpe, dataSource: 'aRot' },\n    //\n    aOffset: { size: 4, stride: 4 * bpe, data: new Float32Array(0) },\n    aTranslation: { size: 3, data: new Float32Array(0) },\n    aLinearMove: { size: 3, data: new Float32Array(0) },\n    aRotation0: { size: 3, offset: 0, stride: 9 * bpe, data: new Float32Array(0) },\n    aRotation1: { size: 3, offset: 3 * bpe, stride: 9 * bpe, dataSource: 'aRotation0' },\n    aRotation2: { size: 3, offset: 6 * bpe, stride: 9 * bpe, dataSource: 'aRotation0' },\n  };\n\n  if (useSprite) {\n    attributes['aSprite'] = { size: 3, stride: 3 * bpe, data: new Float32Array(0) };\n  }\n\n  return { attributes, indices: { data: new Uint16Array(0) }, name, maxVertex };\n}\n\nexport function getParticleMeshShader (\n  item: spec.ParticleItem,\n  gpuCapability: GPUCapability,\n  env = '',\n) {\n  const props = item.content;\n  const renderMode = +(props.renderer?.renderMode || 0);\n  const macros: ShaderMacros = [\n    ['RENDER_MODE', renderMode],\n    ['ENV_EDITOR', env === PLAYER_OPTIONS_ENV_EDITOR],\n  ];\n  const { level, detail } = gpuCapability;\n  const vertexKeyFrameMeta = createKeyFrameMeta();\n  const fragmentKeyFrameMeta = createKeyFrameMeta();\n  const enableVertexTexture = detail.maxVertexUniforms > 0;\n  const { speedOverLifetime } = props.positionOverLifetime ?? {};\n  let vertex_lookup_texture = 0;\n  let shaderCacheId = 0;\n\n  if (enableVertexTexture) {\n    macros.push(['ENABLE_VERTEX_TEXTURE', true]);\n  }\n\n  if (speedOverLifetime) {\n    macros.push(['SPEED_OVER_LIFETIME', true]);\n    shaderCacheId |= 1 << 1;\n    getKeyFrameMetaByRawValue(vertexKeyFrameMeta, speedOverLifetime);\n  }\n  const sprite = props.textureSheetAnimation;\n\n  if (sprite && sprite.animate) {\n    macros.push(['USE_SPRITE', true]);\n    shaderCacheId |= 1 << 2;\n  }\n\n  const colorOverLifetime = props.colorOverLifetime;\n\n  if (colorOverLifetime && colorOverLifetime.color) {\n    macros.push(['COLOR_OVER_LIFETIME', true]);\n    shaderCacheId |= 1 << 4;\n  }\n\n  const opacity = colorOverLifetime && colorOverLifetime.opacity;\n\n  if (opacity) {\n    getKeyFrameMetaByRawValue(vertexKeyFrameMeta, opacity);\n  }\n  const positionOverLifetime = props.positionOverLifetime;\n  let useOrbitalVel;\n\n  ['x', 'y', 'z'].forEach((pro, i) => {\n    let defL = 0;\n    const linearPro = 'linear' + pro.toUpperCase();\n    const orbitalPro = 'orbital' + pro.toUpperCase();\n\n    if (positionOverLifetime?.[linearPro as keyof spec.ParticlePositionOverLifetime]) {\n      getKeyFrameMetaByRawValue(vertexKeyFrameMeta, positionOverLifetime[linearPro as keyof spec.ParticlePositionOverLifetime] as spec.NumberExpression);\n      defL = 1;\n      shaderCacheId |= 1 << (7 + i);\n    }\n    macros.push([`LINEAR_VEL_${pro.toUpperCase()}`, defL]);\n    let defO = 0;\n\n    if (positionOverLifetime?.[orbitalPro as keyof spec.ParticlePositionOverLifetime]) {\n      getKeyFrameMetaByRawValue(vertexKeyFrameMeta, positionOverLifetime[orbitalPro as keyof spec.ParticlePositionOverLifetime] as spec.NumberExpression);\n      defO = 1;\n      shaderCacheId |= 1 << (10 + i);\n      useOrbitalVel = true;\n    }\n    macros.push([`ORB_VEL_${pro.toUpperCase()}`, defO]);\n  });\n  if (positionOverLifetime?.asMovement) {\n    macros.push(['AS_LINEAR_MOVEMENT', true]);\n    shaderCacheId |= 1 << 5;\n  }\n  if (useOrbitalVel) {\n    if (positionOverLifetime?.asRotation) {\n      macros.push(['AS_ORBITAL_MOVEMENT', true]);\n      shaderCacheId |= 1 << 6;\n    }\n  }\n\n  if (props.sizeOverLifetime) {\n    const sizeOverLifetime = props.sizeOverLifetime;\n    const separateAxes = sizeOverLifetime.separateAxes;\n\n    if (separateAxes) {\n      getKeyFrameMetaByRawValue(vertexKeyFrameMeta, sizeOverLifetime.x);\n      macros.push(['SIZE_Y_BY_LIFE', 1]);\n      shaderCacheId |= 1 << 14;\n      getKeyFrameMetaByRawValue(vertexKeyFrameMeta, sizeOverLifetime.y);\n    } else {\n      getKeyFrameMetaByRawValue(vertexKeyFrameMeta, sizeOverLifetime.size);\n    }\n  }\n\n  if (props.rotationOverLifetime) {\n    const rot = props.rotationOverLifetime;\n\n    if (rot.z) {\n      getKeyFrameMetaByRawValue(vertexKeyFrameMeta, rot?.z);\n      shaderCacheId |= 1 << 15;\n      macros.push(['ROT_Z_LIFETIME', 1]);\n    }\n    if (rot.separateAxes) {\n      if (rot.x) {\n        getKeyFrameMetaByRawValue(vertexKeyFrameMeta, rot.x);\n        shaderCacheId |= 1 << 16;\n        macros.push(['ROT_X_LIFETIME', 1]);\n      }\n      if (rot.y) {\n        getKeyFrameMetaByRawValue(vertexKeyFrameMeta, rot.y);\n        shaderCacheId |= 1 << 17;\n        macros.push(['ROT_Y_LIFETIME', 1]);\n      }\n    }\n    if (rot?.asRotation) {\n      macros.push(['ROT_LIFETIME_AS_MOVEMENT', 1]);\n      shaderCacheId |= 1 << 18;\n    }\n  }\n\n  getKeyFrameMetaByRawValue(vertexKeyFrameMeta, positionOverLifetime?.gravityOverLifetime);\n  const forceOpt = positionOverLifetime?.forceTarget;\n\n  if (forceOpt) {\n    macros.push(['FINAL_TARGET', true]);\n    shaderCacheId |= 1 << 19;\n    getKeyFrameMetaByRawValue(vertexKeyFrameMeta, positionOverLifetime.forceCurve);\n  }\n  const HALF_FLOAT = detail.halfFloatTexture;\n\n  if (HALF_FLOAT && fragmentKeyFrameMeta.max) {\n    shaderCacheId |= 1 << 20;\n  }\n  const maxVertexUniforms = detail.maxVertexUniforms;\n  let vertexCurveTexture = vertexKeyFrameMeta.max + vertexKeyFrameMeta.curves.length - 32 > maxVertexUniforms;\n\n  if (getConfig(RENDER_PREFER_LOOKUP_TEXTURE)) {\n    vertexCurveTexture = true;\n  }\n  if (level === 2) {\n    vertexKeyFrameMeta.max = -1;\n    // vertexKeyFrameMeta.index = getSlot(vertexKeyFrameMeta.index);\n    if (fragmentKeyFrameMeta.index > 0) {\n      fragmentKeyFrameMeta.max = -1;\n      // fragmentKeyFrameMeta.index = getSlot(fragmentKeyFrameMeta.index);\n    }\n  }\n  if (vertexCurveTexture && HALF_FLOAT && enableVertexTexture) {\n    vertex_lookup_texture = 1;\n  }\n  const shaderCache = ['-p:', renderMode, shaderCacheId, vertexKeyFrameMeta.index, vertexKeyFrameMeta.max, fragmentKeyFrameMeta.index, fragmentKeyFrameMeta.max].join('+');\n  const shader: SharedShaderWithSource = {\n    fragment: particleFrag,\n    vertex: `#define LOOKUP_TEXTURE_CURVE ${vertex_lookup_texture}\\n${particleVert}`,\n    shared: true,\n    cacheId: shaderCache,\n    macros,\n    name: `particle#${item.name}`,\n  };\n\n  macros.push(\n    ['VERT_CURVE_VALUE_COUNT', vertexKeyFrameMeta.index],\n    ['FRAG_CURVE_VALUE_COUNT', fragmentKeyFrameMeta.index],\n    ['VERT_MAX_KEY_FRAME_COUNT', vertexKeyFrameMeta.max],\n    ['FRAG_MAX_KEY_FRAME_COUNT', fragmentKeyFrameMeta.max],\n  );\n\n  return { shader, vertex: vertexKeyFrameMeta.index, fragment: fragmentKeyFrameMeta.index };\n}\n\nexport function modifyMaxKeyframeShader (shader: SharedShaderWithSource, maxVertex: number, maxFrag: number) {\n  const shaderIds = shader.cacheId?.split('+') as Array<string | number>;\n\n  shaderIds[3] = maxVertex;\n  shaderIds[5] = maxFrag;\n  shader.cacheId = shaderIds.join('+');\n\n  if (!shader.macros) {\n    return;\n  }\n\n  for (let i = 0; i < shader.macros.length; i++) {\n    const marco = shader.macros[i];\n\n    if (marco[0] === 'VERT_CURVE_VALUE_COUNT') {\n      marco[1] = maxVertex;\n    } else if (marco[0] === 'FRAG_CURVE_VALUE_COUNT') {\n      marco[1] = maxFrag;\n\n      break;\n    }\n  }\n}\n","import type { Matrix4 } from '@galacean/effects-math/es/core/matrix4';\nimport type { Vector3 } from '@galacean/effects-math/es/core/vector3';\nimport { Vector4 } from '@galacean/effects-math/es/core/vector4';\nimport type { Texture } from '../../texture';\nimport type { TrailMeshProps, TrailPointOptions } from './trail-mesh';\nimport { TrailMesh } from './trail-mesh';\nimport type { ParticleMeshProps, Point } from './particle-mesh';\nimport { ParticleMesh } from './particle-mesh';\nimport type { Mesh, Renderer } from '../../render';\nimport type { Engine } from '../../engine';\nimport { RendererComponent } from '../../components';\nimport type { MaskProcessor } from '../../material/mask-ref-manager';\n\n/**\n * @since 2.0.0\n */\nexport class ParticleSystemRenderer extends RendererComponent {\n  meshes: Mesh[];\n  particleMesh: ParticleMesh;\n  maskManager: MaskProcessor;\n\n  private trailMesh?: TrailMesh;\n\n  constructor (\n    engine: Engine,\n    particleMeshProps?: ParticleMeshProps,\n    trailMeshProps?: TrailMeshProps,\n  ) {\n    super(engine);\n\n    this.name = 'ParticleSystemRenderer';\n    if (particleMeshProps) {\n      this.particleMesh = new ParticleMesh(engine, particleMeshProps);\n    }\n\n    if (trailMeshProps) {\n      this.trailMesh = new TrailMesh(engine, trailMeshProps);\n    }\n\n    const meshes = [this.particleMesh.mesh];\n\n    this.materials.push(this.particleMesh.mesh.material);\n\n    if (this.trailMesh) {\n      meshes.push(this.trailMesh.mesh);\n      this.materials.push(this.trailMesh.mesh.material);\n    }\n\n    this.meshes = meshes;\n  }\n\n  override onStart (): void {\n    this._priority = this.item.renderOrder;\n    for (const mesh of this.meshes) {\n      mesh.onStart();\n    }\n  }\n\n  override onUpdate (dt: number): void {\n    const time = this.particleMesh.time;\n    const uParams = this.particleMesh.mesh.material.getVector4('uParams') ?? new Vector4();\n\n    this.particleMesh.mesh.material.setVector4('uParams', uParams.set(time, this.item.duration, 0, 0));\n  }\n\n  override render (renderer: Renderer): void {\n    this.maskManager.drawStencilMask(renderer);\n    for (const mesh of this.meshes) {\n      mesh.render(renderer);\n    }\n  }\n\n  reset () {\n    this.particleMesh.clearPoints();\n    this.trailMesh?.clearAllTrails();\n  }\n\n  updateTime (now: number, delta: number) {\n    this.particleMesh.time = now;\n    this.particleMesh.onUpdate(delta);\n    if (this.trailMesh) {\n      this.trailMesh.time = now;\n      this.trailMesh.onUpdate(delta);\n    }\n  }\n\n  minusTimeForLoop (duration: number) {\n    this.particleMesh.minusTime(duration);\n    this.trailMesh?.minusTime(duration);\n  }\n\n  updateWorldMatrix (worldMatrix: Matrix4) {\n    this.particleMesh.mesh.worldMatrix = worldMatrix;\n    if (this.trailMesh) {\n      this.trailMesh.mesh.worldMatrix = worldMatrix;\n    }\n  }\n\n  setVisible (visible: boolean) {\n    this.particleMesh.mesh.setVisible(visible);\n    this.trailMesh?.mesh.setVisible(visible);\n  }\n\n  getTextures (): Texture[] {\n    const textures: Texture[] = [];\n    // @ts-expect-error textures 是否可以考虑挂在 Material 上\n    const particleMeshTextures = this.particleMesh.mesh.material.textures;\n\n    Object.keys(particleMeshTextures).forEach(key => {\n      textures.push(particleMeshTextures[key]);\n    });\n    if (this.trailMesh) {\n      // @ts-expect-error 同上\n      const trailMeshTextures = this.trailMesh.mesh.material.textures;\n\n      Object.keys(trailMeshTextures).forEach(key => {\n        textures.push(trailMeshTextures[key]);\n      });\n    }\n\n    return textures;\n  }\n\n  setParticlePoint (index: number, point: Point) {\n    this.particleMesh.setPoint(index, point);\n  }\n\n  removeParticlePoint (index: number) {\n    this.particleMesh.removePoint(index);\n  }\n\n  getParticlePointColor (index: number) {\n    return this.particleMesh.getPointColor(index);\n  }\n\n  hasTrail () {\n    return this.trailMesh !== undefined;\n  }\n\n  clearTrail (pointIndex: number) {\n    this.trailMesh?.clearTrail(pointIndex);\n  }\n\n  addTrailPoint (index: number, position: Vector3, options: TrailPointOptions) {\n    this.trailMesh?.addPoint(index, position, options);\n  }\n\n  setTrailStartPosition (index: number, position: Vector3) {\n    this.trailMesh?.setPointStartPos(index, position);\n  }\n\n  getTrailStartPosition (index: number) {\n    return (this.trailMesh as TrailMesh).getPointStartPos(index);\n  }\n}\n","import type { Ray } from '@galacean/effects-math/es/core/index';\nimport { Euler, Matrix4, Vector2, Vector3 } from '@galacean/effects-math/es/core/index';\nimport type { vec2, vec3, vec4 } from '@galacean/effects-specification';\nimport * as spec from '@galacean/effects-specification';\nimport { Component } from '../../components';\nimport { effectsClass } from '../../decorators';\nimport type { Engine } from '../../engine';\nimport type { ValueGetter } from '../../math';\nimport { calculateTranslation, createValueGetter, ensureVec3 } from '../../math';\nimport type { Mesh, Renderer } from '../../render';\nimport type { Maskable } from '../../material';\nimport { MaskProcessor } from '../../material';\nimport type { ShapeGenerator, ShapeGeneratorOptions, ShapeParticle } from '../../shape';\nimport { createShape } from '../../shape';\nimport { Texture } from '../../texture';\nimport { Transform } from '../../transform';\nimport type { BoundingBoxSphere, HitTestCustomParams } from '../interact/click-handler';\nimport { HitTestType } from '../interact/click-handler';\nimport { Burst } from './burst';\nimport type { LinkNode } from './link';\nimport { Link } from './link';\nimport type { ParticleMeshProps, Point } from './particle-mesh';\nimport { ParticleSystemRenderer } from './particle-system-renderer';\nimport type { TrailMeshProps } from './trail-mesh';\n\ntype ParticleSystemRayCastOptions = {\n  ray: Ray,\n  radius: number,\n  removeParticle?: boolean,\n  multiple: boolean,\n};\n\ntype ParticleOptions = {\n  startSpeed: ValueGetter<number>,\n  startLifetime: ValueGetter<number>,\n  startDelay: ValueGetter<number>,\n  startColor: ValueGetter<spec.RGBAColorValue>,\n  start3DRotation?: boolean,\n  startRotationX?: ValueGetter<number>,\n  startRotationY?: ValueGetter<number>,\n  startRotationZ?: ValueGetter<number>,\n  startRotation?: ValueGetter<number>,\n  start3DSize: boolean,\n  startSizeX?: ValueGetter<number>,\n  startSizeY?: ValueGetter<number>,\n  startSize?: ValueGetter<number>,\n  sizeAspect?: ValueGetter<number>,\n  startTurbulence: boolean,\n  turbulenceX?: ValueGetter<number>,\n  turbulenceY?: ValueGetter<number>,\n  turbulenceZ?: ValueGetter<number>,\n  turbulence?: [\n    turbulenceX: ValueGetter<number>,\n    turbulenceY: ValueGetter<number>,\n    turbulenceZ: ValueGetter<number>,\n  ],\n  // duration: number,\n  looping: boolean,\n  maxCount: number,\n  gravity: vec3,\n  gravityModifier: ValueGetter<number>,\n  renderLevel?: spec.RenderLevel,\n  particleFollowParent?: boolean,\n  forceTarget?: { curve: ValueGetter<number>, target: spec.vec3 },\n  speedOverLifetime?: ValueGetter<number>,\n  linearVelOverLifetime?: { asMovement?: boolean, x?: ValueGetter<number>, y?: ValueGetter<number>, z?: ValueGetter<number>, enabled?: boolean },\n  orbitalVelOverLifetime?: { asRotation?: boolean, x?: ValueGetter<number>, y?: ValueGetter<number>, z?: ValueGetter<number>, enabled?: boolean, center?: spec.vec3 },\n};\n\ntype ParticleEmissionOptions = {\n  rateOverTime: ValueGetter<number>,\n  bursts: Burst[],\n  burstOffsets: Record<string, vec3[] | null>,\n};\n\ninterface ParticleTransform {\n  position: Vector3,\n  rotation?: Euler,\n  path?: ValueGetter<vec3>,\n}\n\ntype TrailOptions = {\n  lifetime: ValueGetter<number>,\n  minimumVertexDistance: number,\n  dieWithParticles: boolean,\n  sizeAffectsWidth: boolean,\n  sizeAffectsLifetime: boolean,\n  parentAffectsPosition: boolean,\n  inheritParticleColor: boolean,\n  maxPointPerTrail: number,\n  colorOverLifetime: number[],\n  widthOverTrail: ValueGetter<number>,\n  colorOverTrail: number[],\n  opacityOverLifetime: ValueGetter<number>,\n  texture?: Texture,\n  orderOffset?: number,\n  blending: number,\n  occlusion: boolean,\n  transparentOcclusion: boolean,\n  textureMap?: vec4,\n};\n\ninterface ParticleTextureSheetAnimation {\n  col: number,\n  row: number,\n  total: number,\n  animate: boolean,\n  animationDelay: ValueGetter<number>,\n  animationDuration: ValueGetter<number>,\n  cycles: ValueGetter<number>,\n  endAtLifetime?: ValueGetter<number>,\n  blend?: boolean,\n}\n\ntype ParticleInteraction = {\n  behavior?: spec.ParticleInteractionBehavior,\n  multiple?: boolean,\n  radius: number,\n};\n\nexport interface ParticleSystemOptions extends spec.ParticleOptions {\n  meshSlots?: number[],\n}\n\nexport interface ParticleSystemProps extends Omit<spec.ParticleContent, 'options' | 'renderer' | 'trails' | 'mask'> {\n  options: ParticleSystemOptions,\n  renderer: ParticleSystemRendererOptions,\n  trails?: ParticleTrailProps,\n  mask?: spec.MaskOptions,\n}\n\n// spec.RenderOptions 经过处理\nexport interface ParticleSystemRendererOptions extends Required<Omit<spec.RendererOptions, 'texture' | 'anchor' | 'particleOrigin'>> {\n  // mask: number,\n  texture: Texture,\n  anchor?: vec2,\n  particleOrigin?: spec.ParticleOrigin,\n}\n\nexport interface ParticleTrailProps extends Omit<spec.ParticleTrail, 'texture' | 'mask'> {\n  texture: Texture,\n  textureMap: vec4,\n  mask?: spec.MaskOptions,\n}\n\n// 粒子节点包含的数据\nexport type ParticleContent = [number, number, number, Point]; // delay + lifetime, particleIndex, delay, pointData\n\n@effectsClass(spec.DataType.ParticleSystem)\nexport class ParticleSystem extends Component implements Maskable {\n  renderer: ParticleSystemRenderer;\n  options: ParticleOptions;\n  shape: ShapeGenerator;\n  emission: ParticleEmissionOptions;\n  trails: Pick<TrailOptions, 'lifetime' | 'dieWithParticles' | 'sizeAffectsLifetime' | 'sizeAffectsWidth' | 'inheritParticleColor' | 'parentAffectsPosition'>;\n  meshes: Mesh[];\n  textureSheetAnimation?: ParticleTextureSheetAnimation;\n  interaction?: ParticleInteraction;\n  emissionStopped: boolean;\n  destroyed = false;\n  props: ParticleSystemProps;\n  time: number;\n\n  readonly maskManager: MaskProcessor;\n\n  private generatedCount: number;\n  private loopStartTime: number;\n  private particleLink: Link<ParticleContent>;\n  private started: boolean;\n  private ended: boolean;\n  private lastEmitTime: number;\n  private frozen: boolean;\n  private upDirectionWorld: Vector3 | null;\n  private uvs: number[][];\n  private basicTransform: ParticleTransform;\n  private clickedPoint: LinkNode<ParticleContent>;\n\n  constructor (\n    engine: Engine,\n    props?: ParticleSystemProps,\n  ) {\n    super(engine);\n\n    this.maskManager = new MaskProcessor(engine);\n    if (props) {\n      this.fromData(props);\n    }\n  }\n\n  get timePassed () {\n    return this.time - this.loopStartTime;\n  }\n\n  get lifetime () {\n    return this.timePassed / this.item.duration;\n  }\n\n  get particleCount () {\n    return this.particleLink.length;\n  }\n\n  /**\n   * 获取当前粒子系统的最大粒子数。当系统的粒子数量达到最大值时，发射器会暂时停止发射粒子。\n   * @since 2.3.0\n   */\n  get maxParticles () {\n    return this.options.maxCount;\n  }\n\n  /**\n   * 设置当前粒子系统的最大粒子数。当系统的粒子数量达到最大值时，发射器会暂时停止发射粒子。\n   * 注意：暂时不支持增加拖尾数量\n   * @since 2.3.0\n   */\n  set maxParticles (count: number) {\n    this.options.maxCount = count;\n    if (this.renderer?.particleMesh) {\n      this.renderer.particleMesh.maxCount = count;\n    }\n  }\n\n  isFrozen () {\n    return this.frozen;\n  }\n\n  isEnded () {\n    return this.ended;\n  }\n\n  initEmitterTransform () {\n    const position = this.item.transform.position.clone();\n    const rotation = this.item.transform.rotation.clone();\n    const transformPath = this.props.emitterTransform && this.props.emitterTransform.path;\n    let path;\n\n    if (transformPath) {\n      if (transformPath[0] === spec.ValueType.CONSTANT_VEC3) {\n        position.add(transformPath[1]);\n      } else {\n        path = createValueGetter(transformPath);\n      }\n    }\n    this.basicTransform = {\n      position, rotation, path,\n    };\n\n    const selfPos = position.clone();\n\n    if (path) {\n      selfPos.add(path.getValue(0));\n    }\n    this.transform.setPosition(selfPos.x, selfPos.y, selfPos.z);\n\n    if (this.options.particleFollowParent) {\n      const worldMatrix = this.transform.getWorldMatrix();\n\n      this.renderer.updateWorldMatrix(worldMatrix);\n    }\n  }\n\n  private updateEmitterTransform (time: number) {\n    const { path, position } = this.basicTransform;\n    const selfPos = position.clone();\n\n    if (path) {\n      const duration = this.item.duration;\n\n      selfPos.add(path.getValue(time / duration));\n    }\n    this.transform.setPosition(selfPos.x, selfPos.y, selfPos.z);\n\n    if (this.options.particleFollowParent) {\n      const worldMatrix = this.transform.getWorldMatrix();\n\n      this.renderer.updateWorldMatrix(worldMatrix);\n    }\n  }\n\n  private addParticle (point: Point, maxCount: number) {\n    const link = this.particleLink;\n    const linkContent: ParticleContent = [point.delay + point.lifetime, 0, point.delay, point];\n    let pointIndex;\n\n    if (link.length < maxCount) {\n      pointIndex = linkContent[1] = link.length;\n    } else {\n      const first = link.first;\n\n      link.removeNode(first);\n      pointIndex = linkContent[1] = first.content[1];\n    }\n    link.pushNode(linkContent);\n    this.renderer.setParticlePoint(pointIndex, point);\n    this.clearPointTrail(pointIndex);\n    if (this.transform.parentTransform) {\n      this.renderer.setTrailStartPosition(pointIndex, this.transform.parentTransform.position.clone());\n    }\n  }\n\n  setVisible (visible: boolean) {\n    this.renderer.setVisible(visible);\n  }\n\n  getTextures (): Texture[] {\n    return this.renderer.getTextures();\n  }\n\n  startEmit () {\n    if (!this.started || this.ended) {\n      this.reset();\n      this.started = true;\n      this.ended = false;\n    }\n  }\n\n  stop () {\n    this.ended = true;\n    this.started = false;\n  }\n\n  reset () {\n    this.renderer.reset();\n    this.time = 0;\n    this.loopStartTime = 0;\n    this.lastEmitTime = -1 / this.emission.rateOverTime.getValue(0);\n    this.generatedCount = 0;\n    this.particleLink = new Link((a, b) => a[0] - b[0]);\n    this.emission.bursts.forEach(b => b.reset());\n    this.frozen = false;\n    this.ended = false;\n    this.destroyed = false;\n  }\n\n  override onStart (): void {\n    this.startEmit();\n    this.initEmitterTransform();\n\n    this.item.on('click', ()=>{\n      if (this.interaction?.behavior === spec.ParticleInteractionBehavior.removeParticle) {\n        const pointIndex = this.clickedPoint.content[1];\n\n        this.renderer.removeParticlePoint(pointIndex);\n        this.clearPointTrail(pointIndex);\n        this.clickedPoint.content = [0] as unknown as ParticleContent;\n      }\n    });\n  }\n\n  override onUpdate (dt: number): void {\n    this.update(dt);\n  }\n\n  update (delta: number) {\n    if (this.started && !this.frozen) {\n      const now = this.time + delta / 1000;\n      const options = this.options;\n      const loopStartTime = this.loopStartTime;\n      const emission = this.emission;\n\n      this.time = now;\n      this.upDirectionWorld = null;\n      this.renderer.updateTime(now, delta);\n\n      const link = this.particleLink;\n      const emitterLifetime = (now - loopStartTime) / this.item.duration;\n      const timePassed = this.timePassed;\n      let trailUpdated = false;\n      const updateTrail = () => {\n        if (this.trails && !trailUpdated) {\n          trailUpdated = true;\n          link.forEach(([time, pointIndex, delay, point]) => {\n            if (time < timePassed) {\n              this.clearPointTrail(pointIndex);\n            } else if (timePassed > delay) {\n              this.updatePointTrail(pointIndex, emitterLifetime, point, delay);\n            }\n          });\n        }\n      };\n\n      if (!this.ended) {\n        const duration = this.item.duration;\n        const lifetime = this.lifetime;\n\n        if (timePassed < duration) {\n          const interval = 1 / emission.rateOverTime.getValue(lifetime);\n          const pointCount = Math.floor((timePassed - this.lastEmitTime) / interval);\n          const maxEmissionCount = pointCount;\n          const timeDelta = interval / pointCount;\n          const meshTime = now;\n          const maxCount = options.maxCount;\n\n          this.updateEmitterTransform(timePassed);\n          const shouldSkipGenerate = () => {\n            const first = link.first;\n\n            return this.emissionStopped || (link.length === maxCount && first && (first.content[0] - loopStartTime) > timePassed);\n          };\n\n          for (let i = 0; i < maxEmissionCount && i < maxCount; i++) {\n            if (shouldSkipGenerate()) {\n              break;\n            }\n            const p = this.createPoint(lifetime);\n\n            p.delay += meshTime + i * timeDelta;\n            this.addParticle(p, maxCount);\n            this.lastEmitTime = timePassed;\n          }\n          const bursts = emission.bursts;\n\n          for (let j = bursts?.length - 1, cursor = 0; j >= 0 && cursor < maxCount; j--) {\n            if (shouldSkipGenerate()) {\n              break;\n            }\n            const burst = bursts[j];\n            const opts = !burst.disabled && burst.getGeneratorOptions(timePassed, lifetime);\n\n            if (opts) {\n              const originVec = [0, 0, 0] as vec3;\n              const offsets = emission.burstOffsets[j];\n              const burstOffset = (offsets && offsets[opts.cycleIndex]) || originVec;\n\n              if (burst.once) {\n                this.removeBurst(j);\n              }\n\n              for (let i = 0; i < opts.count && cursor < maxCount; i++) {\n                if (shouldSkipGenerate()) {\n                  break;\n                }\n                const p = this.initPoint(this.shape.generate({\n                  total: opts.total,\n                  index: opts.index,\n                  burstIndex: i,\n                  burstCount: opts.count,\n                }));\n\n                p.delay += meshTime;\n                cursor++;\n                p.transform.translate(...burstOffset);\n\n                this.addParticle(p, maxCount);\n              }\n            }\n          }\n        } else if (this.item.endBehavior === spec.EndBehavior.restart) {\n          updateTrail();\n          this.loopStartTime = now - duration;\n          this.lastEmitTime -= duration;\n          this.time -= duration;\n          emission.bursts.forEach(b => b.reset());\n          this.particleLink.forEach(content => {\n            content[0] -= duration;\n            content[2] -= duration;\n\n            // TODO 优化粒子销毁逻辑\n            if (content[3]) {\n              content[3].delay -= duration;\n            }\n          });\n\n          this.renderer.minusTimeForLoop(duration);\n        } else {\n          this.ended = true;\n          const endBehavior = this.item.endBehavior;\n\n          if (endBehavior === spec.EndBehavior.freeze) {\n            this.frozen = true;\n          }\n        }\n      } else if (this.item.endBehavior !== spec.EndBehavior.restart) {\n        if (spec.EndBehavior.destroy === this.item.endBehavior) {\n          const node = link.last;\n\n          if (node && (node.content[0]) < this.time) {\n            this.destroyed = true;\n          }\n        }\n      }\n      updateTrail();\n    }\n  }\n\n  drawStencilMask (renderer: Renderer): void {\n    if (!this.isActiveAndEnabled) {\n      return;\n    }\n    const previousColorMasks: boolean[] = [];\n\n    for (let i = 0; i < this.renderer.meshes.length; i++) {\n      const material = this.renderer.meshes[i].material;\n\n      previousColorMasks.push(material.colorMask);\n      material.colorMask = false;\n    }\n\n    for (const mesh of this.renderer.meshes) {\n      mesh.render(renderer);\n    }\n\n    for (let i = 0; i < this.renderer.meshes.length; i++) {\n      const material = this.renderer.meshes[i].material;\n\n      material.colorMask = previousColorMasks[i];\n    }\n  }\n\n  override onDestroy (): void {\n    if (this.item && this.item.composition) {\n      this.meshes.forEach(mesh => mesh.dispose());\n    }\n  }\n\n  getParticleBoxes (): { center: Vector3, size: Vector3 }[] {\n    const link = this.particleLink;\n    const renderer = this.renderer;\n    const res: { center: Vector3, size: Vector3 }[] = [];\n    const maxCount = this.particleCount;\n    let counter = 0;\n\n    if (!(link && renderer)) {\n      return res;\n    }\n    let node = link.last;\n    let finish = false;\n\n    while (!finish) {\n      const currentTime = node.content[0];\n      const point = node.content[3];\n\n      if (currentTime > this.timePassed) {\n        const pos = this.getPointPosition(point);\n\n        res.push({\n          center: pos,\n          size: point.transform.scale,\n        });\n        if (node.pre) {\n          node = node.pre;\n        } else {\n          finish = true;\n        }\n      }\n      counter++;\n      if (counter > maxCount) {\n        finish = true;\n      }\n    }\n\n    return res;\n  }\n\n  raycast (options: ParticleSystemRayCastOptions): Vector3[] | undefined {\n    const link = this.particleLink;\n    const renderer = this.renderer;\n\n    if (!(link && renderer)) {\n      return;\n    }\n    let node = link.last;\n    const hitPositions = [];\n    const temp = new Vector3();\n    let finish = false;\n\n    if (node && node.content) {\n      do {\n        const [currentTime,, _, point] = node.content;\n\n        if (currentTime > this.timePassed) {\n          const pos = this.getPointPosition(point);\n          const ray = options.ray;\n          let pass = false;\n\n          if (ray) {\n            pass = !!ray.intersectSphere({\n              center: pos,\n              radius: options.radius,\n            }, temp);\n          }\n          if (pass) {\n            this.clickedPoint = node;\n            hitPositions.push(pos);\n            if (!options.multiple) {\n              finish = true;\n            }\n          }\n        }\n        // @ts-expect-error\n      } while ((node = node.pre) && !finish);\n    }\n\n    return hitPositions;\n  }\n\n  clearPointTrail (pointIndex: number) {\n    if (this.trails && this.trails.dieWithParticles) {\n      this.renderer.clearTrail(pointIndex);\n    }\n  }\n\n  updatePointTrail (pointIndex: number, emitterLifetime: number, point: Point, startTime: number) {\n    const renderer = this.renderer;\n\n    if (!renderer.hasTrail()) {\n      return;\n    }\n    const trails = this.trails;\n    const position = this.getPointPosition(point);\n    const color = trails.inheritParticleColor ? renderer.getParticlePointColor(pointIndex) : [1, 1, 1, 1];\n    const size: vec3 = point.transform.getWorldScale().toArray();\n\n    let width = 1;\n    let lifetime = trails.lifetime.getValue(emitterLifetime);\n\n    if (trails.sizeAffectsWidth) {\n      width *= size[0];\n    }\n    if (trails.sizeAffectsLifetime) {\n      lifetime *= size[0];\n    }\n    if (trails.parentAffectsPosition && this.transform.parentTransform) {\n      position.add(this.transform.parentTransform.position);\n      const pos = renderer.getTrailStartPosition(pointIndex);\n\n      if (pos) {\n        position.subtract(pos);\n      }\n    }\n    renderer.addTrailPoint(pointIndex, position, {\n      color,\n      lifetime,\n      size: width,\n      time: startTime,\n    });\n  }\n\n  /**\n   * 通过索引获取指定index粒子当前时刻的位置\n   * @params index - 粒子索引\n   */\n  getPointPositionByIndex (index: number): Vector3 | null {\n    const point = this.particleLink.getNodeByIndex(index);\n\n    if (!point) {\n      console.error('Get point error.');\n\n      return null;\n    } else {\n      return this.getPointPosition(point.content[3]);\n    }\n  }\n\n  /**\n   * 通过粒子参数获取当前时刻粒子的位置\n   */\n  getPointPosition (point: Point): Vector3 {\n    const {\n      transform,\n      vel,\n      lifetime,\n      delay,\n      gravity = [],\n    } = point;\n\n    const forceTarget = this.options.forceTarget;\n    const time = this.time - delay;\n\n    const tempPos = new Vector3();\n    const acc = Vector3.fromArray(gravity);\n\n    transform.assignWorldTRS(tempPos);\n    const ret = calculateTranslation(new Vector3(), this.options, acc, time, lifetime, tempPos, vel);\n\n    if (forceTarget) {\n      const target = forceTarget.target || [0, 0, 0];\n      const life = forceTarget.curve.getValue(time / lifetime);\n      const dl = 1 - life;\n\n      ret.x = ret.x * dl + target[0] * life;\n      ret.y = ret.y * dl + target[1] * life;\n      ret.z = ret.z * dl + target[2] * life;\n    }\n\n    return ret;\n  }\n\n  initPoint (data: ShapeParticle): Point {\n    const options = this.options;\n    const lifetime = this.lifetime;\n    const shape = this.shape;\n    const speed = options.startSpeed.getValue(lifetime);\n    const matrix4 = options.particleFollowParent ? Matrix4.IDENTITY : this.transform.getWorldMatrix();\n    const pointPosition: Vector3 = data.position;\n\n    // 粒子的位置受发射器的位置影响，自身的旋转和缩放不受影响\n    const position = matrix4.transformPoint(pointPosition, new Vector3());\n    const transform = new Transform({\n      position,\n      valid: true,\n    });\n\n    let direction = data.direction;\n\n    direction = matrix4.transformNormal(direction, tempDir).normalize();\n    if (options.startTurbulence && options.turbulence) {\n      for (let i = 0; i < 3; i++) {\n        tempVec3.setElement(i, options.turbulence[i].getValue(lifetime));\n      }\n      tempEuler.setFromVector3(tempVec3.negate());\n      const mat4 = tempMat4.setFromEuler(tempEuler);\n\n      mat4.transformNormal(direction).normalize();\n    }\n    const dirX = tmpDirX;\n    const dirY = tmpDirY;\n\n    if (shape.alignSpeedDirection) {\n      dirY.copyFrom(direction);\n      if (!this.upDirectionWorld) {\n        if (shape.upDirection) {\n          this.upDirectionWorld = shape.upDirection.clone();\n        } else {\n          this.upDirectionWorld = Vector3.Z.clone();\n        }\n        matrix4.transformNormal(this.upDirectionWorld);\n      }\n      dirX.crossVectors(dirY, this.upDirectionWorld).normalize();\n      // FIXME: 原先因为有精度问题，这里dirX不是0向量\n      if (dirX.isZero()) {\n        dirX.set(1, 0, 0);\n      }\n    } else {\n      dirX.set(1, 0, 0);\n      dirY.set(0, 1, 0);\n    }\n    let sprite;\n    const tsa = this.textureSheetAnimation;\n\n    if (tsa && tsa.animate) {\n      sprite = tempSprite;\n      sprite[0] = tsa.animationDelay.getValue(lifetime);\n      sprite[1] = tsa.animationDuration.getValue(lifetime);\n      sprite[2] = tsa.cycles.getValue(lifetime);\n    }\n    const rot = tempRot;\n\n    if (options.start3DRotation) {\n      // @ts-expect-error\n      rot.set(options.startRotationX.getValue(lifetime), options.startRotationY.getValue(lifetime), options.startRotationZ.getValue(lifetime));\n    } else if (options.startRotation) {\n      rot.set(0, 0, options.startRotation.getValue(lifetime));\n    } else {\n      rot.set(0, 0, 0);\n    }\n    transform.setRotation(rot.x, rot.y, rot.z);\n    const color = options.startColor.getValue(lifetime) as number[];\n\n    if (color.length === 3) {\n      color[3] = 1;\n    }\n    const size = tempSize;\n\n    if (options.start3DSize) {\n      size.x = options.startSizeX!.getValue(lifetime);\n      size.y = options.startSizeY!.getValue(lifetime);\n    } else {\n      const n = options.startSize!.getValue(lifetime);\n      const aspect = options.sizeAspect!.getValue(lifetime);\n\n      size.x = n;\n      // 兼容aspect为0的情况\n      size.y = aspect === 0 ? 0 : n / aspect;\n      // size[1] = n / aspect;\n    }\n\n    const vel = direction.clone();\n\n    vel.multiply(speed);\n\n    // 粒子的大小受发射器父节点的影响\n    if (!options.particleFollowParent) {\n      const tempScale = new Vector3();\n\n      this.transform.assignWorldTRS(undefined, undefined, tempScale);\n      size.x *= tempScale.x;\n      size.y *= tempScale.y;\n    }\n    transform.setScale(size.x, size.y, 1);\n\n    return {\n      size,\n      vel,\n      color: color as vec4,\n      delay: options.startDelay.getValue(lifetime),\n      lifetime: options.startLifetime.getValue(lifetime),\n      uv: randomArrItem(this.uvs, true),\n      gravity: options.gravity,\n      sprite,\n      dirY,\n      dirX,\n      transform,\n    };\n  }\n\n  addBurst (burst: Burst, offsets: vec3[]) {\n    let willAdd = false;\n\n    if (!this.emission.bursts.includes(burst)) {\n      this.emission.bursts.push(burst);\n      willAdd = true;\n    }\n    if (willAdd && offsets instanceof Array) {\n      const index = this.emission.bursts.indexOf(burst);\n\n      this.emission.burstOffsets[index] = offsets;\n\n      return index;\n    }\n\n    return -1;\n  }\n\n  removeBurst (index: number) {\n    if (index < this.emission.bursts.length) {\n      this.emission.burstOffsets[index] = null;\n      this.emission.bursts.splice(index, 1);\n    }\n  }\n\n  createPoint (lifetime: number): Point {\n    const generator: ShapeGeneratorOptions = {\n      total: this.emission.rateOverTime.getValue(lifetime),\n      index: this.generatedCount,\n      burstIndex: 0,\n      burstCount: 0,\n    };\n\n    this.generatedCount++;\n\n    return this.initPoint(this.shape.generate(generator));\n  }\n\n  stopParticleEmission () {\n    this.emissionStopped = true;\n  }\n\n  resumeParticleEmission () {\n    this.emissionStopped = false;\n  }\n\n  getBoundingBox (): void | BoundingBoxSphere {\n    const area = this.getParticleBoxes();\n\n    return {\n      type: HitTestType.sphere,\n      area,\n    };\n  }\n\n  getHitTestParams = (force?: boolean): void | HitTestCustomParams => {\n    const interactParams = this.interaction;\n\n    if (force || interactParams) {\n      return {\n        type: HitTestType.custom,\n        collect: (ray: Ray): Vector3[] | void =>\n          this.raycast({\n            radius: interactParams?.radius || 0.4,\n            multiple: !!interactParams?.multiple,\n            removeParticle: interactParams?.behavior === spec.ParticleInteractionBehavior.removeParticle,\n            ray,\n          }),\n      };\n    }\n  };\n\n  override fromData (data: unknown): void {\n    super.fromData(data);\n    const props = data as ParticleSystemProps;\n\n    this.props = props;\n    this.destroyed = false;\n    const cachePrefix = '';\n    const { options, positionOverLifetime = {}, shape } = props;\n    const gravityModifier = positionOverLifetime?.gravityOverLifetime;\n    const gravity = ensureVec3(positionOverLifetime?.gravity);\n    const _textureSheetAnimation = props.textureSheetAnimation;\n    const textureSheetAnimation = _textureSheetAnimation ? {\n      animationDelay: createValueGetter(_textureSheetAnimation.animationDelay || 0),\n      animationDuration: createValueGetter(_textureSheetAnimation.animationDuration || 1),\n      cycles: createValueGetter(_textureSheetAnimation.cycles || 1),\n      animate: _textureSheetAnimation.animate,\n      col: _textureSheetAnimation.col,\n      row: _textureSheetAnimation.row,\n      total: _textureSheetAnimation.total || _textureSheetAnimation.col * _textureSheetAnimation.row,\n    } : undefined;\n    const startTurbulence = !!(shape && shape.turbulenceX || shape?.turbulenceY || shape?.turbulenceZ);\n    let turbulence: ParticleOptions['turbulence'];\n\n    if (startTurbulence) {\n      turbulence = [\n        createValueGetter(shape.turbulenceX ?? 0),\n        createValueGetter(shape.turbulenceY ?? 0),\n        createValueGetter(shape.turbulenceZ ?? 0),\n      ];\n    }\n\n    this.name = 'ParticleSystem';\n    this.shape = createShape(shape);\n    this.emission = {\n      rateOverTime: createValueGetter(props.emission.rateOverTime),\n      burstOffsets: getBurstOffsets(props.emission.burstOffsets ?? []),\n      bursts: (props.emission.bursts || []).map((c: any) => new Burst(c)),\n    };\n    this.textureSheetAnimation = textureSheetAnimation;\n    const renderer = props.renderer || {};\n    let rotationOverLifetime: ParticleMeshProps['rotationOverLifetime'];\n    const rotOverLt = props.rotationOverLifetime;\n\n    if (rotOverLt) {\n      rotationOverLifetime = {};\n      rotationOverLifetime.asRotation = !!rotOverLt.asRotation;\n      rotationOverLifetime.z = rotOverLt.z ? createValueGetter(rotOverLt.z) : createValueGetter(0);\n      if (rotOverLt.separateAxes) {\n        rotationOverLifetime.x = rotOverLt.x && createValueGetter(rotOverLt.x);\n        rotationOverLifetime.y = rotOverLt.y && createValueGetter(rotOverLt.y);\n      }\n    }\n\n    let forceTarget;\n\n    if (positionOverLifetime?.forceTarget) {\n      forceTarget = {\n        target: positionOverLifetime.target || [0, 0, 0],\n        curve: createValueGetter(positionOverLifetime.forceCurve || [spec.ValueType.LINE, [[0, 0], [1, 1]]]),\n      };\n    }\n    const linearVelOverLifetime = {\n      x: positionOverLifetime.linearX && createValueGetter(positionOverLifetime.linearX || 0),\n      y: positionOverLifetime.linearY && createValueGetter(positionOverLifetime.linearY || 0),\n      z: positionOverLifetime.linearZ && createValueGetter(positionOverLifetime.linearZ || 0),\n      asMovement: positionOverLifetime.asMovement,\n    };\n    const orbitalVelOverLifetime = {\n      x: positionOverLifetime.orbitalX && createValueGetter(positionOverLifetime.orbitalX),\n      y: positionOverLifetime.orbitalY && createValueGetter(positionOverLifetime.orbitalY),\n      z: positionOverLifetime.orbitalZ && createValueGetter(positionOverLifetime.orbitalZ),\n      center: positionOverLifetime.orbCenter,\n      asRotation: positionOverLifetime.asRotation,\n    };\n    const sizeOverLifetime = props.sizeOverLifetime || {};\n    const colorOverLifetime = props.colorOverLifetime;\n    const shaderCachePrefix = cachePrefix;\n    const sizeOverLifetimeGetter = sizeOverLifetime?.separateAxes ?\n      {\n        separateAxes: true,\n        x: createValueGetter(sizeOverLifetime.x),\n        y: createValueGetter(sizeOverLifetime.y),\n      } :\n      {\n        separateAxes: false,\n        x: createValueGetter(('size' in sizeOverLifetime ? sizeOverLifetime.size : sizeOverLifetime.x) || 1),\n      };\n\n    renderer.anchor = renderer.anchor || [0, 0];\n    const anchor = Vector2.fromArray(renderer.anchor);\n\n    this.options = {\n      particleFollowParent: !!options.particleFollowParent,\n      startLifetime: createValueGetter(options.startLifetime),\n      startDelay: createValueGetter(options.startDelay || 0),\n      startSpeed: createValueGetter(positionOverLifetime.startSpeed || 0),\n      startColor: createValueGetter(options.startColor),\n      // duration:vfxItem.duration || 1,\n      looping: false,\n      maxCount: options.maxCount ?? 0,\n      gravityModifier: createValueGetter(gravityModifier || 0),\n      gravity,\n      start3DSize: !!options.start3DSize,\n      startTurbulence,\n      turbulence,\n      speedOverLifetime: positionOverLifetime.speedOverLifetime && createValueGetter(positionOverLifetime.speedOverLifetime),\n      linearVelOverLifetime,\n      orbitalVelOverLifetime,\n      forceTarget,\n    };\n    if (options.startRotationZ) {\n      this.options.startRotation = createValueGetter(options.startRotationZ || 0);\n    }\n    if (options.startRotationX || options.startRotationY) {\n      this.options.start3DRotation = true;\n      this.options.startRotationX = createValueGetter(options.startRotationX || 0);\n      this.options.startRotationY = createValueGetter(options.startRotationY || 0);\n      this.options.startRotationZ = createValueGetter(options.startRotationZ || 0);\n    }\n\n    if (options.start3DSize) {\n      this.options.startSizeX = createValueGetter(options.startSizeX);\n      this.options.startSizeY = createValueGetter(options.startSizeY);\n    } else {\n      this.options.startSize = createValueGetter(options.startSize);\n      this.options.sizeAspect = createValueGetter(options.sizeAspect || 1);\n    }\n\n    if (props.mask) {\n      this.maskManager.setMaskOptions(props.mask);\n    }\n\n    const particleMeshProps: ParticleMeshProps = {\n      // listIndex: vfxItem.listIndex,\n      meshSlots: options.meshSlots,\n      name: this.name,\n      matrix: Matrix4.IDENTITY,\n      shaderCachePrefix,\n      renderMode: renderer.renderMode || spec.RenderMode.BILLBOARD,\n      side: renderer.side || spec.SideMode.DOUBLE,\n      gravity,\n      // duration: vfxItem.duration,\n      blending: renderer.blending || spec.BlendingMode.ALPHA,\n      rotationOverLifetime,\n      gravityModifier: this.options.gravityModifier,\n      linearVelOverLifetime: this.options.linearVelOverLifetime,\n      orbitalVelOverLifetime: this.options.orbitalVelOverLifetime,\n      speedOverLifetime: this.options.speedOverLifetime,\n      sprite: textureSheetAnimation,\n      occlusion: !!renderer.occlusion,\n      transparentOcclusion: !!renderer.transparentOcclusion,\n      maxCount: options.maxCount,\n      mask: this.maskManager.getRefValue(),\n      maskMode: this.maskManager.maskMode,\n      forceTarget,\n      diffuse: renderer.texture ? this.engine.findObject(renderer.texture) : undefined,\n      sizeOverLifetime: sizeOverLifetimeGetter,\n      anchor,\n    };\n\n    if (colorOverLifetime) {\n      const { color, opacity } = colorOverLifetime;\n\n      particleMeshProps.colorOverLifetime = {};\n      if (opacity) {\n        particleMeshProps.colorOverLifetime.opacity = createValueGetter(colorOverLifetime.opacity);\n      }\n      if (color) {\n        if (color[0] === spec.ValueType.GRADIENT_COLOR) {\n          particleMeshProps.colorOverLifetime.color = (colorOverLifetime.color as spec.GradientColor)[1];\n        } else if (color[0] === spec.ValueType.RGBA_COLOR) {\n          particleMeshProps.colorOverLifetime.color = Texture.createWithData(\n            this.engine,\n            {\n              data: new Uint8Array(color[1] as unknown as number[]),\n              width: 1,\n              height: 1,\n            });\n        } else if (color instanceof Texture) {\n          particleMeshProps.colorOverLifetime.color = color;\n        }\n      }\n    }\n\n    const uvs = [];\n    let textureMap = [0, 0, 1, 1];\n    let flip;\n\n    if (props.splits) {\n      const s = props.splits[0];\n\n      flip = s[4];\n      textureMap = flip ? [s[0], s[1], s[3], s[2]] : [s[0], s[1], s[2], s[3]];\n    }\n    if (textureSheetAnimation && !textureSheetAnimation.animate) {\n      const col = flip ? textureSheetAnimation.row : textureSheetAnimation.col;\n      const row = flip ? textureSheetAnimation.col : textureSheetAnimation.row;\n      const total = textureSheetAnimation.total || col * row;\n      let index = 0;\n\n      for (let x = 0; x < col; x++) {\n        for (let y = 0; y < row && index < total; y++, index++) {\n          uvs.push([\n            x * textureMap[2] / col + textureMap[0],\n            y * textureMap[3] / row + textureMap[1],\n            textureMap[2] / col,\n            textureMap[3] / row]);\n        }\n      }\n    } else {\n      uvs.push(textureMap);\n    }\n    this.uvs = uvs;\n    // @ts-expect-error\n    particleMeshProps.textureFlip = flip;\n\n    const trails = props.trails;\n    let trailMeshProps: TrailMeshProps | undefined;\n\n    if (trails) {\n      this.trails = {\n        lifetime: createValueGetter(trails.lifetime),\n        dieWithParticles: trails.dieWithParticles !== false,\n        sizeAffectsWidth: !!trails.sizeAffectsWidth,\n        sizeAffectsLifetime: !!trails.sizeAffectsLifetime,\n        inheritParticleColor: !!trails.inheritParticleColor,\n        parentAffectsPosition: !!trails.parentAffectsPosition,\n      };\n\n      if (trails.mask) {\n        this.maskManager.setMaskOptions(trails.mask);\n      }\n\n      trailMeshProps = {\n        name: 'Trail',\n        matrix: Matrix4.IDENTITY,\n        minimumVertexDistance: trails.minimumVertexDistance || 0.02,\n        maxTrailCount: options.maxCount,\n        pointCountPerTrail: Math.round(trails.maxPointPerTrail) || 32,\n        blending: trails.blending,\n        texture: trails.texture ? this.engine.findObject(trails.texture) : undefined,\n        opacityOverLifetime: createValueGetter(trails.opacityOverLifetime || 1),\n        widthOverTrail: createValueGetter(trails.widthOverTrail || 1),\n        // order: vfxItem.listIndex + (trails.orderOffset || 0),\n        shaderCachePrefix,\n        lifetime: this.trails.lifetime,\n        occlusion: !!trails.occlusion,\n        transparentOcclusion: !!trails.transparentOcclusion,\n        textureMap: trails.textureMap,\n        mask: this.maskManager.getRefValue(),\n        maskMode: this.maskManager.maskMode,\n      };\n\n      if (trails.colorOverLifetime && trails.colorOverLifetime[0] === spec.ValueType.GRADIENT_COLOR) {\n        trailMeshProps.colorOverLifetime = trails.colorOverLifetime[1];\n      }\n      if (trails.colorOverTrail && trails.colorOverTrail[0] === spec.ValueType.GRADIENT_COLOR) {\n        trailMeshProps.colorOverTrail = trails.colorOverTrail[1];\n      }\n    }\n\n    this.renderer = new ParticleSystemRenderer(this.engine, particleMeshProps, trailMeshProps);\n    this.renderer.item = this.item;\n    this.renderer.maskManager = this.maskManager;\n    this.meshes = this.renderer.meshes;\n\n    const interaction = props.interaction;\n\n    if (interaction) {\n      this.interaction = {\n        multiple: interaction.multiple,\n        radius: interaction.radius ?? 0.4,\n        behavior: interaction.behavior,\n      };\n    }\n    this.item.getHitTestParams = this.getHitTestParams;\n  }\n}\n\n// array performance better for small memory than Float32Array\nconst tempDir = new Vector3();\nconst tempSize = new Vector2();\nconst tempRot = new Euler();\nconst tmpDirX = new Vector3();\nconst tmpDirY = new Vector3();\nconst tempVec3 = new Vector3();\nconst tempEuler = new Euler();\nconst tempSprite: vec3 = [0, 0, 0];\nconst tempMat4 = new Matrix4();\n\nfunction getBurstOffsets (burstOffsets: Record<string, number>[]): Record<string, vec3[]> {\n  const ret: Record<string, vec3[]> = {};\n\n  if (Array.isArray(burstOffsets)) {\n    burstOffsets.forEach(arr => {\n      const isArr = arr instanceof Array;\n      const index = isArr ? arr[0] : arr.index;\n      let offsets = ret[index];\n\n      if (!offsets) {\n        offsets = ret[index] = [];\n      }\n      if (isArr) {\n        offsets.push(arr.slice(1, 4) as vec3);\n      } else {\n        offsets.push([+arr.x, +arr.y, +arr.z]);\n      }\n    });\n  }\n\n  return ret;\n}\n\nfunction randomArrItem<T> (arr: T[], keepArr?: boolean): T {\n  const index = Math.floor(Math.random() * arr.length);\n  const item = arr[index];\n\n  if (!keepArr) {\n    arr.splice(index, 1);\n  }\n\n  return item;\n}\n","import type { FrameContext } from '../playable';\nimport { Playable } from '../playable';\nimport type { TrackInstance } from '../track-instance';\n\nexport class TrackMixerPlayable extends Playable {\n\n  trackInstance: TrackInstance;\n  clipPlayables: Playable[] = [];\n  clipWeights: number[] = [];\n\n  override processFrame (context: FrameContext): void {\n    for (const clipPlayable of this.clipPlayables) {\n      clipPlayable.processFrame(context);\n    }\n    this.evaluate(context);\n  }\n\n  setClipWeight (playable: Playable, weight: number): void;\n\n  setClipWeight (inputIndex: number, weight: number): void;\n\n  setClipWeight (playableOrIndex: Playable | number, weight: number): void {\n    if (playableOrIndex instanceof Playable) {\n      for (let i = 0; i < this.clipPlayables.length; i++) {\n        if (this.clipPlayables[i] === playableOrIndex) {\n          this.clipWeights[i] = weight;\n\n          return;\n        }\n      }\n    } else {\n      if (this.clipWeights.length < playableOrIndex + 1) {\n        this.clipWeights.length = playableOrIndex + 1;\n      }\n      this.clipWeights[playableOrIndex] = weight;\n    }\n  }\n\n  getClipWeight (inputIndex: number): number {\n    return this.clipWeights[inputIndex];\n  }\n\n  getClipPlayable (index: number) {\n    return this.clipPlayables[index];\n  }\n\n  evaluate (context: FrameContext) {\n    // Override\n  }\n\n}\n","import { VFXItem } from '../../../vfx-item';\nimport type { FrameContext } from '../playable';\nimport { TrackMixerPlayable } from './track-mixer-playable';\n\nexport class ActivationMixerPlayable extends TrackMixerPlayable {\n\n  override evaluate (context: FrameContext): void {\n    const boundObject = context.output.getUserData();\n\n    if (!(boundObject instanceof VFXItem)) {\n      return;\n    }\n\n    const boundItem = boundObject;\n\n    let hasInput = false;\n\n    for (let i = 0; i < this.clipPlayables.length; i++) {\n      if (this.getClipWeight(i) > 0) {\n        hasInput = true;\n\n        break;\n      }\n    }\n\n    if (hasInput) {\n      boundItem.transform.setValid(true);\n      boundItem.setActive(true);\n    } else {\n      boundItem.transform.setValid(false);\n      boundItem.setActive(false);\n    }\n  }\n}\n","import { VFXItem } from '../../../vfx-item';\nimport type { FrameContext } from '../playable';\nimport { Playable } from '../playable';\n\n/**\n * @since 2.0.0\n */\nexport class ActivationPlayable extends Playable {\n\n  override processFrame (context: FrameContext): void {\n    const vfxItem = context.output.getUserData();\n\n    if (!(vfxItem instanceof VFXItem)) {\n      return;\n    }\n\n    vfxItem.time = this.time;\n  }\n}","import type { ValueGetter } from '../../../math';\nimport type { FrameContext } from '../playable';\nimport { Playable } from '../playable';\n\nexport class PropertyClipPlayable<T> extends Playable {\n  value: T;\n  curve: ValueGetter<T>;\n\n  override processFrame (context: FrameContext): void {\n    this.value = this.curve.getValue(this.time / this.getDuration());\n  }\n}","import { Component } from '../../../components/component';\nimport type { FrameContext } from '../playable';\nimport { PropertyClipPlayable } from './property-clip-playable';\nimport { TrackMixerPlayable } from './track-mixer-playable';\n\nexport abstract class PropertyMixerPlayable<T> extends TrackMixerPlayable {\n  propertyPath = '';\n\n  protected propertyName = '';\n  protected propertyValue: T;\n\n  private directTarget: Record<string, any>;\n\n  abstract resetPropertyValue (): void;\n  abstract addWeightedValue (curveValue: T, weight: number): void;\n\n  override evaluate (context: FrameContext): void {\n    const boundObject = context.output.getUserData() as Record<string, any>;\n\n    if (!boundObject) {\n      return;\n    }\n\n    if (!this.directTarget) {\n      this.preparePath(boundObject);\n    }\n\n    let hasInput = false;\n\n    this.propertyValue = this.directTarget[this.propertyName] as T;\n\n    if (this.propertyValue === undefined || this.propertyValue === null) {\n      return;\n    }\n\n    this.resetPropertyValue();\n\n    // evaluate the curve\n    for (let i = 0; i < this.clipPlayables.length; i++) {\n      const weight = this.getClipWeight(i);\n\n      if (weight > 0) {\n        const propertyClipPlayable = this.getClipPlayable(i) as PropertyClipPlayable<T>;\n\n        if (!(propertyClipPlayable instanceof PropertyClipPlayable)) {\n          console.error('PropertyTrack added non-PropertyPlayableAsset');\n          continue;\n        }\n\n        const curveValue = propertyClipPlayable.value;\n\n        this.addWeightedValue(curveValue, weight);\n\n        hasInput = true;\n      }\n    }\n\n    // set value\n    if (hasInput) {\n      this.directTarget[this.propertyName] = this.propertyValue;\n\n      if (boundObject instanceof Component) {\n        boundObject.onApplyAnimationProperties();\n      }\n    }\n  }\n\n  private preparePath (target: object) {\n    const propertyPathSegments = this.propertyPath.split('.');\n\n    let directTarget = target as Record<string, any>;\n\n    for (let i = 0; i < propertyPathSegments.length - 1; i++) {\n      const property = directTarget[propertyPathSegments[i]];\n\n      if (property === undefined) {\n        console.error('The ' + propertyPathSegments[i] + ' property of ' + target + ' was not found');\n      }\n      directTarget = property;\n    }\n\n    if (propertyPathSegments.length > 0) {\n      this.propertyName = propertyPathSegments[propertyPathSegments.length - 1];\n    }\n\n    this.directTarget = directTarget;\n  }\n}","import type { Color } from '@galacean/effects-math/es/core/color';\nimport { PropertyMixerPlayable } from './property-mixer-playable';\n\nexport class ColorPropertyMixerPlayable extends PropertyMixerPlayable<Color> {\n  override resetPropertyValue (): void {\n    this.propertyValue.setZero();\n  }\n\n  override addWeightedValue (curveValue: Color, weight: number): void {\n    const result = this.propertyValue;\n\n    result.r += curveValue.r * weight;\n    result.g += curveValue.g * weight;\n    result.b += curveValue.b * weight;\n    result.a += curveValue.a * weight;\n  }\n}\n\n","import { PropertyMixerPlayable } from './property-mixer-playable';\n\nexport class FloatPropertyMixerPlayable extends PropertyMixerPlayable<number> {\n  override resetPropertyValue (): void {\n    this.propertyValue = 0;\n  }\n\n  override addWeightedValue (curveValue: number, weight: number): void {\n    this.propertyValue += curveValue * weight;\n  }\n}\n\n","import type { FrameContext } from '../playable';\nimport { TrackMixerPlayable } from './track-mixer-playable';\n\nexport class ParticleMixerPlayable extends TrackMixerPlayable {\n\n  override evaluate (context: FrameContext): void {\n  }\n}\n","import type { FrameContext } from '../playable';\nimport { TrackMixerPlayable } from './track-mixer-playable';\n\nexport class SpriteColorMixerPlayable extends TrackMixerPlayable {\n\n  override evaluate (context: FrameContext): void {\n  }\n}\n","import { CompositionComponent } from '../../../components';\nimport type { FrameContext } from '../playable';\nimport { Playable } from '../playable';\n\nexport class SubCompositionClipPlayable extends Playable {\n  override processFrame (context: FrameContext): void {\n    const boundObject = context.output.getUserData();\n\n    if (boundObject instanceof CompositionComponent) {\n      boundObject.time = this.getTime();\n    }\n  }\n}\n","import { CompositionComponent } from '../../../components';\nimport type { FrameContext } from '../playable';\nimport { TrackMixerPlayable } from './track-mixer-playable';\n\nexport class SubCompositionMixerPlayable extends TrackMixerPlayable {\n  override evaluate (context: FrameContext): void {\n    const boundObject = context.output.getUserData();\n\n    if (!(boundObject instanceof CompositionComponent)) {\n      return;\n    }\n\n    const compositionComponent = boundObject;\n\n    let hasInput = false;\n\n    for (let i = 0; i < this.clipPlayables.length; i++) {\n      if (this.getClipWeight(i) > 0) {\n        hasInput = true;\n\n        break;\n      }\n    }\n\n    if (hasInput) {\n      compositionComponent.item.setActive(true);\n    } else {\n      compositionComponent.item.setActive(false);\n    }\n  }\n}\n","import type { FrameContext } from '../playable';\nimport { TrackMixerPlayable } from './track-mixer-playable';\n\nexport class TransformMixerPlayable extends TrackMixerPlayable {\n\n  override evaluate (context: FrameContext): void {\n  }\n}\n","import type { Vector2 } from '@galacean/effects-math/es/core/vector2';\nimport type { Vector4 } from '@galacean/effects-math/es/core/vector4';\nimport { PropertyMixerPlayable } from './property-mixer-playable';\nimport type { Vector3 } from '@galacean/effects-math/es/core/vector3';\n\nexport class Vector4PropertyMixerPlayable extends PropertyMixerPlayable<Vector4> {\n  override resetPropertyValue (): void {\n    this.propertyValue.x = 0;\n    this.propertyValue.y = 0;\n    this.propertyValue.z = 0;\n    this.propertyValue.w = 0;\n  }\n\n  override addWeightedValue (curveValue: Vector4, weight: number): void {\n    const result = this.propertyValue;\n\n    result.x += curveValue.x * weight;\n    result.y += curveValue.y * weight;\n    result.z += curveValue.z * weight;\n    result.w += curveValue.w * weight;\n  }\n}\n\nexport class Vector3PropertyMixerPlayable extends PropertyMixerPlayable<Vector3> {\n  override resetPropertyValue (): void {\n    this.propertyValue.x = 0;\n    this.propertyValue.y = 0;\n    this.propertyValue.z = 0;\n  }\n\n  override addWeightedValue (curveValue: Vector3, weight: number): void {\n    const result = this.propertyValue;\n\n    result.x += curveValue.x * weight;\n    result.y += curveValue.y * weight;\n    result.z += curveValue.z * weight;\n  }\n}\n\nexport class Vector2PropertyMixerPlayable extends PropertyMixerPlayable<Vector2> {\n  override resetPropertyValue (): void {\n    this.propertyValue.x = 0;\n    this.propertyValue.y = 0;\n  }\n\n  override addWeightedValue (curveValue: Vector2, weight: number): void {\n    const result = this.propertyValue;\n\n    result.x += curveValue.x * weight;\n    result.y += curveValue.y * weight;\n  }\n}\n\n","import { Euler } from '@galacean/effects-math/es/core/euler';\nimport { Vector3 } from '@galacean/effects-math/es/core/vector3';\nimport * as spec from '@galacean/effects-specification';\nimport { effectsClass } from '../../../decorators';\nimport type { ItemLinearVelOverLifetime, ValueGetter } from '../../../math';\nimport { calculateTranslation, createValueGetter, ensureVec3 } from '../../../math';\nimport { VFXItem } from '../../../vfx-item';\nimport type { FrameContext } from '../playable';\nimport { Playable, PlayableAsset } from '../playable';\n\nconst tempRot = new Euler();\nconst tempSize = new Vector3(1, 1, 1);\nconst tempPos = new Vector3();\n\n/**\n * 基础位移属性数据\n */\nexport type ItemBasicTransform = {\n  position: Vector3,\n  rotation: Euler,\n  scale: Vector3,\n  path?: ValueGetter<Vector3>,\n};\n\n/**\n * @since 2.0.0\n */\nexport class TransformPlayable extends Playable {\n  originalTransform: ItemBasicTransform;\n  protected sizeSeparateAxes: boolean;\n  protected sizeXOverLifetime: ValueGetter<number>;\n  protected sizeYOverLifetime: ValueGetter<number>;\n  protected sizeZOverLifetime: ValueGetter<number>;\n  protected rotationOverLifetime: {\n    asRotation?: boolean,\n    separateAxes?: boolean,\n    enabled?: boolean,\n    x?: ValueGetter<number>,\n    y?: ValueGetter<number>,\n    z?: ValueGetter<number>,\n  };\n  gravityModifier: ValueGetter<number>;\n  orbitalVelOverLifetime: {\n    x?: ValueGetter<number>,\n    y?: ValueGetter<number>,\n    z?: ValueGetter<number>,\n    center: [x: number, y: number, z: number],\n    asRotation?: boolean,\n    enabled?: boolean,\n  };\n  speedOverLifetime?: ValueGetter<number>;\n  linearVelOverLifetime: ItemLinearVelOverLifetime;\n  positionOverLifetime: spec.PositionOverLifetime;\n  gravity: Vector3;\n  direction: Vector3;\n  startSpeed: number;\n  data: TransformPlayableAssetData;\n  private velocity: Vector3;\n  private boundObject: VFXItem;\n\n  start (): void {\n    const boundItem = this.boundObject;\n    const scale = boundItem.transform.scale;\n\n    this.originalTransform = {\n      position: boundItem.transform.position.clone(),\n      rotation: boundItem.transform.getRotation().clone(),\n      // TODO 编辑器 scale 没有z轴控制\n      scale: new Vector3(scale.x, scale.y, scale.x),\n    };\n    const positionOverLifetime = this.data.positionOverLifetime;\n    const rotationOverLifetime = this.data.rotationOverLifetime;\n    const sizeOverLifetime = this.data.sizeOverLifetime;\n\n    // TODO: 没有 K 帧数据的不需要传 positionOverLifetime 空对象\n    if (positionOverLifetime && Object.keys(positionOverLifetime).length !== 0) {\n      this.positionOverLifetime = positionOverLifetime;\n      if (positionOverLifetime.path) {\n        this.originalTransform.path = createValueGetter(positionOverLifetime.path);\n      }\n      const linearVelEnable = positionOverLifetime.linearX || positionOverLifetime.linearY || positionOverLifetime.linearZ;\n\n      if (linearVelEnable) {\n        this.linearVelOverLifetime = {\n          x: positionOverLifetime.linearX && createValueGetter(positionOverLifetime.linearX),\n          y: positionOverLifetime.linearY && createValueGetter(positionOverLifetime.linearY),\n          z: positionOverLifetime.linearZ && createValueGetter(positionOverLifetime.linearZ),\n          asMovement: positionOverLifetime.asMovement,\n          enabled: !!linearVelEnable,\n        };\n      }\n\n      const orbitalVelEnable = positionOverLifetime.orbitalX || positionOverLifetime.orbitalY || positionOverLifetime.orbitalZ;\n\n      if (orbitalVelEnable) {\n        this.orbitalVelOverLifetime = {\n          x: positionOverLifetime.orbitalX && createValueGetter(positionOverLifetime.orbitalX),\n          y: positionOverLifetime.orbitalY && createValueGetter(positionOverLifetime.orbitalY),\n          z: positionOverLifetime.orbitalZ && createValueGetter(positionOverLifetime.orbitalZ),\n          center: ensureVec3(positionOverLifetime.orbCenter),\n          asRotation: positionOverLifetime.asRotation,\n          enabled: !!orbitalVelEnable,\n        };\n      }\n      this.speedOverLifetime = positionOverLifetime.speedOverLifetime && createValueGetter(positionOverLifetime.speedOverLifetime);\n    }\n\n    if (sizeOverLifetime) {\n      if (sizeOverLifetime.separateAxes) {\n        this.sizeSeparateAxes = true;\n        this.sizeXOverLifetime = createValueGetter(sizeOverLifetime.x || 1);\n        this.sizeYOverLifetime = createValueGetter(sizeOverLifetime.y || 1);\n        this.sizeZOverLifetime = createValueGetter(sizeOverLifetime.z || 1);\n      } else {\n        this.sizeXOverLifetime = createValueGetter(sizeOverLifetime.size || 1);\n      }\n    }\n\n    if (rotationOverLifetime) {\n      this.rotationOverLifetime = {\n        asRotation: rotationOverLifetime.asRotation,\n        separateAxes: rotationOverLifetime.separateAxes,\n        z: createValueGetter(rotationOverLifetime.z || 0),\n      };\n      if (rotationOverLifetime.separateAxes) {\n        const rotLt = this.rotationOverLifetime;\n\n        rotLt.x = createValueGetter(rotationOverLifetime.x || 0);\n        rotLt.y = createValueGetter(rotationOverLifetime.y || 0);\n      }\n    }\n    this.gravity = Vector3.fromArray(positionOverLifetime?.gravity || []);\n    this.gravityModifier = createValueGetter(positionOverLifetime?.gravityOverLifetime ?? 0);\n    this.direction = positionOverLifetime?.direction ? Vector3.fromArray(positionOverLifetime.direction).normalize() : new Vector3();\n    this.startSpeed = positionOverLifetime?.startSpeed || 0;\n\n    this.velocity = this.direction.clone();\n    this.velocity.multiply(this.startSpeed);\n  }\n\n  override processFrame (context: FrameContext): void {\n    if (!this.boundObject) {\n      const boundObject = context.output.getUserData();\n\n      if (boundObject instanceof VFXItem) {\n        this.boundObject = boundObject;\n        this.start();\n      }\n    }\n    if (this.boundObject && this.boundObject.composition) {\n      this.sampleAnimation();\n    }\n  }\n\n  /**\n   * 应用时间轴K帧数据到对象\n   */\n  private sampleAnimation () {\n    const boundItem = this.boundObject;\n    const duration = this.getDuration();\n    let life = this.time / duration;\n\n    life = life < 0 ? 0 : (life > 1 ? 1 : life);\n\n    if (this.sizeXOverLifetime) {\n      tempSize.x = this.sizeXOverLifetime.getValue(life);\n      if (this.sizeSeparateAxes) {\n        tempSize.y = this.sizeYOverLifetime.getValue(life);\n        tempSize.z = this.sizeZOverLifetime.getValue(life);\n      } else {\n        tempSize.z = tempSize.y = tempSize.x;\n      }\n      const startSize = this.originalTransform.scale;\n\n      boundItem.transform.setScale(tempSize.x * startSize.x, tempSize.y * startSize.y, tempSize.z * startSize.z);\n    }\n\n    if (this.rotationOverLifetime) {\n      const func = (v: ValueGetter<number>) => this.rotationOverLifetime.asRotation ? v.getValue(life) : v.getIntegrateValue(0, life, duration);\n      const incZ = func(this.rotationOverLifetime.z!);\n      const separateAxes = this.rotationOverLifetime.separateAxes;\n\n      tempRot.x = separateAxes ? func(this.rotationOverLifetime.x!) : 0;\n      tempRot.y = separateAxes ? func(this.rotationOverLifetime.y!) : 0;\n      tempRot.z = incZ;\n      const rot = tempRot.addEulers(this.originalTransform.rotation, tempRot);\n\n      boundItem.transform.setRotation(rot.x, rot.y, rot.z);\n    }\n\n    if (this.positionOverLifetime) {\n      const pos = tempPos;\n\n      calculateTranslation(pos, this, this.gravity, this.time, duration, this.originalTransform.position, this.velocity);\n      if (this.originalTransform.path) {\n        pos.add(this.originalTransform.path.getValue(life));\n      }\n      boundItem.transform.setPosition(pos.x, pos.y, pos.z);\n    }\n  }\n}\n\n@effectsClass(spec.DataType.TransformPlayableAsset)\nexport class TransformPlayableAsset extends PlayableAsset {\n  transformAnimationData: TransformPlayableAssetData;\n\n  override createPlayable (): Playable {\n    const transformPlayable = new TransformPlayable();\n\n    transformPlayable.data = this.transformAnimationData;\n\n    return transformPlayable;\n  }\n\n  override fromData (data: TransformPlayableAssetData): void {\n    this.transformAnimationData = data;\n  }\n}\n\nexport interface TransformPlayableAssetData extends spec.EffectsObjectData {\n  /**\n   * 元素大小变化属性\n   */\n  sizeOverLifetime?: spec.SizeOverLifetime,\n  /**\n   * 元素旋转变化属性\n   */\n  rotationOverLifetime?: spec.RotationOverLifetime,\n  /**\n   * 元素位置变化属性\n   */\n  positionOverLifetime?: spec.PositionOverLifetime,\n}\n","import * as spec from '@galacean/effects-specification';\nimport { effectsClass, serialize } from '../../decorators';\nimport { VFXItem } from '../../vfx-item';\nimport { PlayState, Playable, PlayableAsset, PlayableOutput } from './playable';\nimport { ParticleSystem } from '../particle/particle-system';\nimport type { Constructor } from '../../utils';\nimport { TrackMixerPlayable } from './playables';\n\n/**\n * @since 2.0.0\n */\nexport class TimelineClip {\n  id: string;\n  name: string;\n  start = 0;\n  duration = 0;\n  asset: PlayableAsset;\n  endBehavior: spec.EndBehavior;\n\n  constructor () {\n  }\n\n  toLocalTime (time: number) {\n    let localTime = time - this.start;\n    const duration = this.duration;\n\n    if (localTime - duration > 0) {\n      if (this.endBehavior === spec.EndBehavior.restart) {\n        localTime = localTime % duration;\n      } else if (this.endBehavior === spec.EndBehavior.freeze) {\n        localTime = Math.min(duration, localTime);\n      }\n    }\n\n    return localTime;\n  }\n}\n\n/**\n * @since 2.0.0\n */\n@effectsClass(spec.DataType.TrackAsset)\nexport class TrackAsset extends PlayableAsset {\n  name: string;\n  parent: TrackAsset;\n  trackType = TrackType.MasterTrack;\n\n  private clipSeed = 0;\n\n  @serialize(TimelineClip)\n  private clips: TimelineClip[] = [];\n\n  @serialize()\n  protected children: TrackAsset[] = [];\n\n  /**\n   * 重写该方法以获取自定义对象绑定\n   */\n  updateAnimatedObject (boundObject: object): object {\n    return boundObject;\n  }\n\n  /**\n   * 重写该方法以创建自定义混合器\n   */\n  createTrackMixer (): TrackMixerPlayable {\n    return new TrackMixerPlayable();\n  }\n\n  createOutput (): PlayableOutput {\n    const output = new PlayableOutput();\n\n    return output;\n  }\n\n  createPlayableGraph (runtimeClips: RuntimeClip[]) {\n    const mixerPlayable = this.createMixerPlayableGraph(runtimeClips);\n\n    return mixerPlayable;\n  }\n\n  createMixerPlayableGraph (runtimeClips: RuntimeClip[]) {\n    const clips: TimelineClip[] = [];\n\n    for (const clip of this.clips) {\n      clips.push(clip);\n    }\n    const mixerPlayable = this.compileClips(clips, runtimeClips);\n\n    return mixerPlayable;\n  }\n\n  compileClips (timelineClips: TimelineClip[], runtimeClips: RuntimeClip[]) {\n    const mixer = this.createTrackMixer();\n\n    for (const timelineClip of timelineClips) {\n      const clipPlayable = this.createClipPlayable(timelineClip);\n\n      clipPlayable.setDuration(timelineClip.duration);\n\n      const clip = new RuntimeClip(timelineClip, clipPlayable, mixer);\n\n      runtimeClips.push(clip);\n\n      mixer.clipPlayables.push(clipPlayable);\n      mixer.setClipWeight(clipPlayable, 0.0);\n    }\n\n    return mixer;\n  }\n\n  override createPlayable (): Playable {\n    return new Playable();\n  }\n\n  getChildTracks () {\n    return this.children;\n  }\n\n  addChild (child: TrackAsset) {\n    this.children.push(child);\n    child.parent = this;\n  }\n\n  createClip<T extends PlayableAsset> (\n    classConstructor: Constructor<T>,\n    name?: string,\n  ): TimelineClip {\n    const newClip = new TimelineClip();\n\n    newClip.asset = new classConstructor(this.engine);\n    newClip.name = name ? name : 'TimelineClip' + newClip.id;\n    this.addClip(newClip);\n\n    return newClip;\n  }\n\n  getClips (): TimelineClip[] {\n    return this.clips;\n  }\n\n  findClip (name: string): TimelineClip | undefined {\n    for (const clip of this.clips) {\n      if (clip.name === name) {\n        return clip;\n      }\n    }\n  }\n\n  addClip (clip: TimelineClip): void {\n    clip.id = (this.clipSeed++).toString();\n    this.clips.push(clip);\n  }\n\n  private createClipPlayable (clip: TimelineClip) {\n    return clip.asset.createPlayable();\n  }\n\n  override fromData (data: spec.EffectsObjectData): void {\n    super.fromData(data);\n    for (const child of this.children) {\n      child.parent = this;\n    }\n  }\n}\n\nexport enum TrackType {\n  MasterTrack,\n  ObjectTrack,\n}\n\nexport class RuntimeClip {\n  clip: TimelineClip;\n  playable: Playable;\n  parentMixer: TrackMixerPlayable;\n\n  // TODO: 粒子结束行为有特殊逻辑，这里 cache 一下避免每帧查询组件导致 GC。粒子结束行为判断统一后可移除\n  private particleSystem: ParticleSystem;\n\n  constructor (clip: TimelineClip, clipPlayable: Playable, parentMixer: TrackMixerPlayable) {\n    this.clip = clip;\n    this.playable = clipPlayable;\n    this.parentMixer = parentMixer;\n  }\n\n  set enable (value: boolean) {\n    if (value) {\n      this.playable.play();\n    } else {\n      this.parentMixer.setClipWeight(this.playable, 0);\n      this.playable.pause();\n    }\n  }\n\n  getParticleSystem () {\n    if (!this.particleSystem) {\n      if (this.parentMixer.trackInstance.boundObject instanceof VFXItem) {\n        this.particleSystem = this.parentMixer.trackInstance.boundObject.getComponent(ParticleSystem);\n      }\n    }\n\n    return this.particleSystem;\n  }\n\n  evaluateAt (localTime: number) {\n    const clip = this.clip;\n\n    let weight = 1.0;\n    let ended = false;\n    let started = false;\n    const boundObject = this.parentMixer.trackInstance.boundObject;\n\n    if (localTime >= clip.start + clip.duration && clip.endBehavior === spec.EndBehavior.destroy) {\n      if (boundObject instanceof VFXItem && VFXItem.isParticle(boundObject) && this.getParticleSystem() && !this.getParticleSystem().destroyed) {\n        weight = 1.0;\n      } else {\n        weight = 0.0;\n        ended = true;\n      }\n    } else if (localTime - this.clip.start >= 0) {\n      weight = 1.0;\n      started = true;\n    } else if (localTime < clip.start) {\n      weight = 0.0;\n    }\n\n    if (started && this.playable.getPlayState() !== PlayState.Playing) {\n      this.playable.play();\n    }\n    this.parentMixer.setClipWeight(this.playable, weight);\n\n    const clipTime = clip.toLocalTime(localTime);\n\n    this.playable.setTime(clipTime);\n\n    // 判断动画是否结束\n    if (ended) {\n      if (this.playable.getPlayState() === PlayState.Playing) {\n        this.playable.pause();\n      }\n    }\n  }\n}\n\n/**\n * @since 2.0.0\n */\nexport interface TimelineClipData {\n  asset: PlayableAsset,\n}\n","import * as spec from '@galacean/effects-specification';\nimport { effectsClass } from '../../../decorators';\nimport { ActivationMixerPlayable } from '../playables/activation-mixer-playable';\nimport { TrackAsset } from '../track';\nimport type { TrackMixerPlayable } from '../playables/track-mixer-playable';\n\n@effectsClass(spec.DataType.ActivationTrack)\nexport class ActivationTrack extends TrackAsset {\n  override createTrackMixer (): TrackMixerPlayable {\n    return new ActivationMixerPlayable();\n  }\n}\n","import type { EffectsObjectData } from '@galacean/effects-specification';\nimport { serialize } from '../../../decorators';\nimport { TrackAsset } from '../track';\n\nexport abstract class PropertyTrack extends TrackAsset {\n\n  protected propertyNames: string[] = [];\n\n  @serialize()\n  protected path = '';\n\n  override fromData (data: EffectsObjectData): void {\n    super.fromData(data);\n    const propertyNames = this.path.split('.');\n\n    this.propertyNames = propertyNames;\n  }\n}","import * as spec from '@galacean/effects-specification';\nimport { effectsClass } from '../../../decorators';\nimport type { TrackMixerPlayable } from '../playables';\nimport { FloatPropertyMixerPlayable } from '../playables';\nimport { PropertyTrack } from './property-track';\n\n@effectsClass(spec.DataType.FloatPropertyTrack)\nexport class FloatPropertyTrack extends PropertyTrack {\n\n  override createTrackMixer (): TrackMixerPlayable {\n    const mixer = new FloatPropertyMixerPlayable();\n\n    mixer.propertyPath = this.path;\n\n    return mixer;\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport { effectsClass } from '../../../decorators';\nimport type { TrackMixerPlayable } from '../playables';\nimport { SpriteColorMixerPlayable } from '../playables';\nimport { TrackAsset } from '../track';\n\n@effectsClass(spec.DataType.SpriteColorTrack)\nexport class SpriteColorTrack extends TrackAsset {\n  override createTrackMixer (): TrackMixerPlayable {\n    return new SpriteColorMixerPlayable();\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport { CompositionComponent } from '../../../components';\nimport { effectsClass } from '../../../decorators';\nimport { VFXItem } from '../../../vfx-item';\nimport type { TrackMixerPlayable } from '../playables';\nimport { SubCompositionMixerPlayable } from '../playables';\nimport { TrackAsset } from '../track';\n\n@effectsClass(spec.DataType.SubCompositionTrack)\nexport class SubCompositionTrack extends TrackAsset {\n\n  override updateAnimatedObject (boundObject: object): object {\n    if (!(boundObject instanceof VFXItem)) {\n      throw new Error('SubCompositionTrack needs to be set under the VFXItem track.');\n    }\n\n    return boundObject.getComponent(CompositionComponent);\n  }\n\n  override createTrackMixer (): TrackMixerPlayable {\n    return new SubCompositionMixerPlayable();\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport { effectsClass } from '../../../decorators';\nimport type { TrackMixerPlayable } from '../playables';\nimport { TransformMixerPlayable } from '../playables';\nimport { TrackAsset } from '../track';\n\n@effectsClass(spec.DataType.TransformTrack)\nexport class TransformTrack extends TrackAsset {\n\n  override createTrackMixer (): TrackMixerPlayable {\n    return new TransformMixerPlayable();\n  }\n}\n","import { RendererComponent } from '../../../components';\nimport { effectsClass, serialize } from '../../../decorators';\nimport { TrackAsset } from '../track';\n\n@effectsClass('MaterialTrack')\nexport class MaterialTrack extends TrackAsset {\n\n  @serialize()\n  index: number;\n\n  override updateAnimatedObject (boundObject: object): object {\n    if (!(boundObject instanceof RendererComponent)) {\n      throw new Error('MaterialTrack: expected a RendererComponent bound object.');\n    }\n\n    const materials = boundObject.materials;\n\n    if (this.index >= materials.length) {\n      throw new Error(`MaterialTrack: material index ${this.index} out of bounds (length=${materials.length}).`);\n    }\n\n    return materials[this.index];\n  }\n}\n","import type { TrackMixerPlayable } from '../playables';\nimport { ParticleMixerPlayable } from '../playables';\nimport { TrackAsset } from '../track';\n\nexport class ParticleTrack extends TrackAsset {\n\n  override createTrackMixer (): TrackMixerPlayable {\n    return new ParticleMixerPlayable();\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport { effectsClass } from '../../../decorators';\nimport type { TrackMixerPlayable } from '../playables';\nimport { Vector2PropertyMixerPlayable, Vector3PropertyMixerPlayable, Vector4PropertyMixerPlayable } from '../playables';\nimport { PropertyTrack } from './property-track';\n\n@effectsClass(spec.DataType.Vector4PropertyTrack)\nexport class Vector4PropertyTrack extends PropertyTrack {\n  override createTrackMixer (): TrackMixerPlayable {\n    const mixer = new Vector4PropertyMixerPlayable();\n\n    mixer.propertyPath = this.path;\n\n    return mixer;\n  }\n}\n\n@effectsClass(spec.DataType.Vector3PropertyTrack)\nexport class Vector3PropertyTrack extends PropertyTrack {\n  override createTrackMixer (): TrackMixerPlayable {\n    const mixer = new Vector3PropertyMixerPlayable();\n\n    mixer.propertyPath = this.path;\n\n    return mixer;\n  }\n}\n\n@effectsClass(spec.DataType.Vector2PropertyTrack)\nexport class Vector2PropertyTrack extends PropertyTrack {\n  override createTrackMixer (): TrackMixerPlayable {\n    const mixer = new Vector2PropertyMixerPlayable();\n\n    mixer.propertyPath = this.path;\n\n    return mixer;\n  }\n}","import * as spec from '@galacean/effects-specification';\nimport { effectsClass } from '../../../decorators';\nimport type { TrackMixerPlayable } from '../playables';\nimport { ColorPropertyMixerPlayable } from '../playables';\nimport { PropertyTrack } from './property-track';\n\n@effectsClass(spec.DataType.ColorPropertyTrack)\nexport class ColorPropertyTrack extends PropertyTrack {\n  override createTrackMixer (): TrackMixerPlayable {\n    const mixer = new ColorPropertyMixerPlayable();\n\n    mixer.propertyPath = this.path;\n\n    return mixer;\n  }\n}","import * as spec from '@galacean/effects-specification';\nimport { effectsClass } from '../../../decorators';\nimport { VFXItem } from '../../../vfx-item';\nimport { ParticleSystem } from '../../particle/particle-system';\nimport { ParticleBehaviourPlayableAsset } from '../../particle/particle-vfx-item';\nimport { SpriteComponent, ComponentTimePlayableAsset, EffectComponentTimeTrack, SpriteComponentTimeTrack } from '../../sprite/sprite-item';\nimport { EffectComponent } from '../../../components';\nimport { TrackAsset } from '../track';\nimport type { TimelineAsset } from '../timeline-asset';\nimport { ActivationTrack } from './activation-track';\nimport { ParticleTrack } from './particle-track';\n\n/**\n * @since 2.0.0\n */\n@effectsClass(spec.DataType.ObjectBindingTrack)\nexport class ObjectBindingTrack extends TrackAsset {\n\n  create (timelineAsset: TimelineAsset, sceneBindingMap: Record<string, VFXItem>): void {\n    const boundItem = sceneBindingMap[this.getInstanceId()];\n\n    if (!(boundItem instanceof VFXItem)) {\n      return;\n    }\n\n    for (const childTrack of this.getChildTracks()) {\n      if (childTrack instanceof ActivationTrack) {\n\n        // 添加粒子动画 clip // TODO 待移除\n        if (boundItem.getComponent(ParticleSystem)) {\n          const particleTrack = timelineAsset.createTrack(ParticleTrack, this, 'ParticleTrack');\n\n          for (const activationClip of childTrack.getClips()) {\n            const particleClip = particleTrack.createClip(ParticleBehaviourPlayableAsset);\n\n            particleClip.start = activationClip.start;\n            particleClip.duration = activationClip.duration;\n            particleClip.endBehavior = activationClip.endBehavior;\n          }\n\n        }\n\n        // 添加图层帧动画动画时间 clip // TODO 待移除\n        if (boundItem.getComponent(SpriteComponent)) {\n          const componentTimeTrack = timelineAsset.createTrack(SpriteComponentTimeTrack, this, 'SpriteComponentTimeTrack');\n\n          for (const activationClip of childTrack.getClips()) {\n            const clip = componentTimeTrack.createClip(ComponentTimePlayableAsset);\n\n            clip.start = activationClip.start;\n            clip.duration = activationClip.duration;\n            clip.endBehavior = activationClip.endBehavior;\n          }\n        }\n\n        // 添加图层帧动画动画时间 clip // TODO 待移除\n        if (boundItem.getComponent(EffectComponent)) {\n          const componentTimeTrack = timelineAsset.createTrack(EffectComponentTimeTrack, this, 'EffectComponentTimeTrack');\n\n          for (const activationClip of childTrack.getClips()) {\n            const clip = componentTimeTrack.createClip(ComponentTimePlayableAsset);\n\n            clip.start = activationClip.start;\n            clip.duration = activationClip.duration;\n            clip.endBehavior = activationClip.endBehavior;\n          }\n        }\n\n        break;\n      }\n    }\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport { effectsClass } from '../../../decorators';\nimport type { Playable } from '../playable';\nimport { PlayableAsset } from '../playable';\nimport { ActivationPlayable } from '../playables';\n\n@effectsClass(spec.DataType.ActivationPlayableAsset)\nexport class ActivationPlayableAsset extends PlayableAsset {\n  override createPlayable (): Playable {\n    return new ActivationPlayable();\n  }\n}","import { effectsClass, serialize } from '../../../decorators';\nimport type { Playable } from '../playable';\nimport { PlayableAsset } from '../playable';\nimport { PropertyClipPlayable } from '../playables';\nimport { createValueGetter } from '../../../math';\nimport type { Color } from '@galacean/effects-math/es/core';\nimport * as spec from '@galacean/effects-specification';\n\n@effectsClass(spec.DataType.ColorPropertyPlayableAsset)\nexport class ColorPropertyPlayableAsset extends PlayableAsset {\n  @serialize()\n  curveData: spec.ColorCurveValue;\n\n  override createPlayable (): Playable {\n    const clipPlayable = new PropertyClipPlayable<Color>();\n\n    clipPlayable.curve = createValueGetter(this.curveData);\n    clipPlayable.value = clipPlayable.curve.getValue(0);\n\n    return clipPlayable;\n  }\n}\n","import type { FixedNumberExpression } from '@galacean/effects-specification';\nimport { effectsClass, serialize } from '../../../decorators';\nimport type { Playable } from '../playable';\nimport { PlayableAsset } from '../playable';\nimport { PropertyClipPlayable } from '../playables';\nimport { createValueGetter } from '../../../math';\nimport * as spec from '@galacean/effects-specification';\n\n@effectsClass(spec.DataType.FloatPropertyPlayableAsset)\nexport class FloatPropertyPlayableAsset extends PlayableAsset {\n  @serialize()\n  curveData: FixedNumberExpression;\n\n  override createPlayable (): Playable {\n    const clipPlayable = new PropertyClipPlayable();\n\n    clipPlayable.curve = createValueGetter(this.curveData);\n    clipPlayable.value = clipPlayable.curve.getValue(0);\n\n    return clipPlayable;\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport { effectsClass } from '../../../decorators';\nimport type { Playable } from '../playable';\nimport { PlayableAsset } from '../playable';\nimport { SubCompositionClipPlayable } from '../playables';\n\n@effectsClass(spec.DataType.SubCompositionPlayableAsset)\nexport class SubCompositionPlayableAsset extends PlayableAsset {\n  override createPlayable (): Playable {\n    return new SubCompositionClipPlayable();\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport type { Vector2, Vector3, Vector4 } from '@galacean/effects-math/es/core';\nimport { effectsClass, serialize } from '../../../decorators';\nimport type { Playable } from '../playable';\nimport { PlayableAsset } from '../playable';\nimport { PropertyClipPlayable } from '../playables';\nimport { createValueGetter } from '../../../math';\n\n@effectsClass(spec.DataType.Vector4PropertyPlayableAsset)\nexport class Vector4PropertyPlayableAsset extends PlayableAsset {\n  @serialize()\n  curveData: spec.Vector4CurveValue;\n\n  override createPlayable (): Playable {\n    const clipPlayable = new PropertyClipPlayable<Vector4>();\n\n    clipPlayable.curve = createValueGetter(this.curveData);\n    clipPlayable.value = clipPlayable.curve.getValue(0);\n\n    return clipPlayable;\n  }\n}\n\n@effectsClass(spec.DataType.Vector3PropertyPlayableAsset)\nexport class Vector3ropertyPlayableAsset extends PlayableAsset {\n  @serialize()\n  curveData: spec.Vector3CurveValue;\n\n  override createPlayable (): Playable {\n    const clipPlayable = new PropertyClipPlayable<Vector3>();\n\n    clipPlayable.curve = createValueGetter(this.curveData);\n    clipPlayable.value = clipPlayable.curve.getValue(0);\n\n    return clipPlayable;\n  }\n}\n\n@effectsClass(spec.DataType.Vector2PropertyPlayableAsset)\nexport class Vector2PropertyPlayableAsset extends PlayableAsset {\n  @serialize()\n  curveData: spec.Vector2CurveValue;\n\n  override createPlayable (): Playable {\n    const clipPlayable = new PropertyClipPlayable<Vector2>();\n\n    clipPlayable.curve = createValueGetter(this.curveData);\n    clipPlayable.value = clipPlayable.curve.getValue(0);\n\n    return clipPlayable;\n  }\n}\n","import type { PlayableOutput } from './playable';\nimport type { TrackMixerPlayable } from './playables';\nimport type { TrackAsset } from './track';\n\n/**\n * A class that stores track assets and the generated mixer playables and playable outputs.\n * It is used to query the corresponding playable object based on the track asset.\n */\nexport class TrackInstance {\n  boundObject: object;\n\n  trackAsset: TrackAsset;\n  mixer: TrackMixerPlayable;\n  output: PlayableOutput;\n\n  children: TrackInstance[] = [];\n\n  constructor (trackAsset: TrackAsset, mixer: TrackMixerPlayable, output: PlayableOutput) {\n    this.trackAsset = trackAsset;\n    this.mixer = mixer;\n    this.output = output;\n\n    this.mixer.trackInstance = this;\n  }\n\n  addChild (trackInstance: TrackInstance) {\n    this.children.push(trackInstance);\n  }\n}","import * as spec from '@galacean/effects-specification';\nimport { effectsClass, serialize } from '../../decorators';\nimport type { VFXItem } from '../../vfx-item';\nimport type { RuntimeClip, TrackAsset } from './track';\nimport { ObjectBindingTrack } from './tracks';\nimport { PlayState } from './playable';\nimport type { Constructor } from '../../utils';\nimport { TrackInstance } from './track-instance';\nimport type { SceneBinding } from '../../components';\nimport { EffectsObject } from '../../effects-object';\n\n@effectsClass(spec.DataType.TimelineAsset)\nexport class TimelineAsset extends EffectsObject {\n  @serialize()\n  tracks: TrackAsset[] = [];\n\n  private cacheFlattenedTracks: TrackAsset[] | null = null;\n\n  get flattenedTracks () {\n    if (!this.cacheFlattenedTracks) {\n      this.cacheFlattenedTracks = [];\n      // flatten track tree\n      for (const masterTrack of this.tracks) {\n        this.cacheFlattenedTracks.push(masterTrack);\n        this.addSubTracksRecursive(masterTrack, this.cacheFlattenedTracks);\n      }\n    }\n\n    return this.cacheFlattenedTracks;\n  }\n\n  createTrack<T extends TrackAsset> (classConstructor: Constructor<T>, parent: TrackAsset, name?: string): T {\n    const newTrack = new classConstructor(this.engine);\n\n    newTrack.name = name ? name : classConstructor.name;\n    parent.addChild(newTrack);\n\n    this.invalidate();\n\n    return newTrack;\n  }\n\n  /**\n   * Invalidates the asset, called when tracks data changed\n   */\n  private invalidate () {\n    this.cacheFlattenedTracks = null;\n  }\n\n  private addSubTracksRecursive (track: TrackAsset, allTracks: TrackAsset[]) {\n    for (const subTrack of track.getChildTracks()) {\n      allTracks.push(subTrack);\n    }\n    for (const subTrack of track.getChildTracks()) {\n      this.addSubTracksRecursive(subTrack, allTracks);\n    }\n  }\n}\n\nexport class TimelineInstance {\n  private time = 0;\n  private clips: RuntimeClip[] = [];\n  private masterTrackInstances: TrackInstance[] = [];\n\n  constructor (timelineAsset: TimelineAsset, sceneBindings: SceneBinding[]) {\n    const sceneBindingMap: Record<string, VFXItem> = {};\n\n    for (const sceneBinding of sceneBindings) {\n      sceneBindingMap[sceneBinding.key.getInstanceId()] = sceneBinding.value;\n    }\n\n    // TODO: Hack 临时生成轨道, 待移除\n    for (const track of timelineAsset.tracks) {\n      if (track instanceof ObjectBindingTrack) {\n        track.create(timelineAsset, sceneBindingMap);\n      }\n    }\n\n    this.compileTracks(timelineAsset.flattenedTracks, sceneBindings);\n  }\n\n  setTime (time: number) {\n    this.time = time;\n  }\n\n  getTime () {\n    return this.time;\n  }\n\n  evaluate (deltaTime: number) {\n    const time = this.getTime();\n\n    // TODO search active clips\n\n    for (const clip of this.clips) {\n      clip.evaluateAt(time);\n    }\n\n    for (const track of this.masterTrackInstances) {\n      this.tickTrack(track, deltaTime);\n    }\n  }\n\n  compileTracks (tracks: TrackAsset[], sceneBindings: SceneBinding[]) {\n\n    const outputTrack: TrackAsset[] = tracks;\n\n    // Map for searching track instance with track asset guid\n    const trackInstanceMap: Record<string, TrackInstance> = {};\n\n    for (const track of outputTrack) {\n      // Create track mixer and track output\n      const trackMixPlayable = track.createPlayableGraph(this.clips);\n\n      const trackOutput = track.createOutput();\n\n      // Create track instance\n      const trackInstance = new TrackInstance(track, trackMixPlayable, trackOutput);\n\n      trackInstanceMap[track.getInstanceId()] = trackInstance;\n\n      if (!track.parent) {\n        this.masterTrackInstances.push(trackInstance);\n      }\n    }\n\n    // Build trackInstance tree\n    for (const track of outputTrack) {\n      const trackInstance = trackInstanceMap[track.getInstanceId()];\n\n      for (const child of track.getChildTracks()) {\n        const childTrackInstance = trackInstanceMap[child.getInstanceId()];\n\n        trackInstance.addChild(childTrackInstance);\n      }\n    }\n\n    for (const sceneBinding of sceneBindings) {\n      trackInstanceMap[sceneBinding.key.getInstanceId()].boundObject = sceneBinding.value;\n    }\n\n    for (const trackInstance of this.masterTrackInstances) {\n      this.updateTrackAnimatedObject(trackInstance);\n    }\n  }\n\n  private tickTrack (track: TrackInstance, deltaTime: number) {\n\n    const context = track.output.context;\n\n    context.deltaTime = deltaTime;\n\n    track.output.setUserData(track.boundObject);\n\n    for (const clip of track.mixer.clipPlayables) {\n      if (clip.getPlayState() === PlayState.Playing) {\n        clip.processFrame(context);\n      }\n    }\n\n    track.mixer.evaluate(context);\n\n    for (const child of track.children) {\n      this.tickTrack(child, deltaTime);\n    }\n  }\n\n  private updateTrackAnimatedObject (trackInstance: TrackInstance) {\n    for (const subTrack of trackInstance.children) {\n      if (!subTrack.boundObject) {\n        const boundObject = subTrack.trackAsset.updateAnimatedObject(trackInstance.boundObject);\n\n        subTrack.boundObject = boundObject;\n      }\n      this.updateTrackAnimatedObject(subTrack);\n    }\n  }\n}\n","import { Color } from '@galacean/effects-math/es/core/color';\nimport * as spec from '@galacean/effects-specification';\nimport type { ColorPlayableAssetData } from '../../animation';\nimport { ColorPlayable } from '../../animation';\nimport { effectsClass } from '../../decorators';\nimport type { Engine } from '../../engine';\nimport { TextureSourceType, type Texture2DSourceOptionsVideo } from '../../texture';\nimport type { FrameContext } from '../timeline';\nimport { Playable, PlayableAsset, TrackMixerPlayable, TrackAsset } from '../timeline';\nimport type { VFXItem } from '../../vfx-item';\nimport type { Geometry } from '../../render';\nimport { rotateVec2 } from '../../shape';\nimport { MaskableGraphic, EffectComponent } from '../../components';\n\n/**\n * 图层元素基础属性, 经过处理后的 spec.SpriteContent.options\n */\nexport type SpriteItemOptions = {\n  startColor: spec.vec4,\n  renderLevel?: spec.RenderLevel,\n};\n\nexport type splitsDataType = [r: number, x: number, y: number, w: number, h: number | undefined][];\n\nconst singleSplits: splitsDataType = [[0, 0, 1, 1, 0]];\n\nlet seed = 0;\n\n@effectsClass(spec.DataType.SpriteColorPlayableAsset)\nexport class SpriteColorPlayableAsset extends PlayableAsset {\n  data: ColorPlayableAssetData;\n\n  override createPlayable (): Playable {\n    const spriteColorPlayable = new ColorPlayable();\n\n    spriteColorPlayable.create(this.data);\n\n    return spriteColorPlayable;\n  }\n\n  override fromData (data: ColorPlayableAssetData): void {\n    this.data = data;\n  }\n}\n\nexport class ComponentTimeTrack extends TrackAsset {\n  override createTrackMixer (): TrackMixerPlayable {\n    return new TrackMixerPlayable();\n  }\n}\n\nexport class SpriteComponentTimeTrack extends ComponentTimeTrack {\n  override updateAnimatedObject (boundObject: object): object {\n\n    return (boundObject as VFXItem).getComponent(SpriteComponent);\n  }\n}\n\nexport class EffectComponentTimeTrack extends ComponentTimeTrack {\n  override updateAnimatedObject (boundObject: object): object {\n    return (boundObject as VFXItem).getComponent(EffectComponent);\n  }\n}\n\nexport class ComponentTimePlayableAsset extends PlayableAsset {\n  override createPlayable (): Playable {\n    const componentTimePlayable = new ComponentTimePlayable();\n\n    return componentTimePlayable;\n  }\n}\n\nexport class ComponentTimePlayable extends Playable {\n  override processFrame (context: FrameContext): void {\n    const boundObject = context.output.getUserData();\n\n    if (!('time' in boundObject)) {\n      return;\n    }\n\n    boundObject.time = this.time;\n  }\n}\n\n/**\n * Sprite component class\n */\n@effectsClass(spec.DataType.SpriteComponent)\nexport class SpriteComponent extends MaskableGraphic {\n  time = 0;\n  duration = 1;\n  /**\n   * @internal\n  */\n  splits: splitsDataType = singleSplits;\n\n  protected textureSheetAnimation?: spec.TextureSheetAnimation;\n\n  constructor (engine: Engine, props?: spec.SpriteComponentData) {\n    super(engine);\n\n    this.name = 'MSprite' + seed++;\n    if (props) {\n      this.fromData(props);\n    }\n  }\n\n  override onUpdate (dt: number): void {\n    super.onUpdate(dt);\n    let time = this.time;\n    const duration = this.duration;\n    const textureAnimation = this.textureSheetAnimation;\n    const loop = textureAnimation?.loop ?? true;\n\n    if (time > duration && loop) {\n      time = time % duration;\n    }\n\n    const life = Math.min(Math.max(time / duration, 0.0), 1.0);\n    const { video } = this.renderer.texture.source as Texture2DSourceOptionsVideo;\n\n    if (video) {\n      if (time === 0) {\n        video.pause();\n      } else {\n        video.play().catch(e => { this.engine.renderErrors.add(e); });\n      }\n      this.renderer.texture.uploadCurrentVideoFrame();\n    }\n    if (textureAnimation) {\n      const total = textureAnimation.total || (textureAnimation.row * textureAnimation.col);\n      let texRectX = 0;\n      let texRectY = 0;\n      let texRectW = 1;\n      let texRectH = 1;\n      let flip;\n\n      if (this.splits) {\n        const sp = this.splits[0];\n\n        flip = sp[4];\n        texRectX = sp[0];\n        texRectY = sp[1];\n        if (flip) {\n          texRectW = sp[3];\n          texRectH = sp[2];\n        } else {\n          texRectW = sp[2];\n          texRectH = sp[3];\n        }\n      }\n      let dx, dy;\n\n      if (flip) {\n        dx = 1 / textureAnimation.row * texRectW;\n        dy = 1 / textureAnimation.col * texRectH;\n      } else {\n        dx = 1 / textureAnimation.col * texRectW;\n        dy = 1 / textureAnimation.row * texRectH;\n      }\n      let texOffset;\n\n      if (textureAnimation.animate) {\n        const frameIndex = Math.round(life * (total - 1));\n        const yIndex = Math.floor(frameIndex / textureAnimation.col);\n        const xIndex = frameIndex - yIndex * textureAnimation.col;\n\n        texOffset = flip ? [dx * yIndex, dy * (textureAnimation.col - xIndex)] : [dx * xIndex, dy * (1 + yIndex)];\n      } else {\n        texOffset = [0, dy];\n      }\n      this.material.getVector4('_TexOffset')?.setFromArray([\n        texRectX + texOffset[0],\n        texRectH + texRectY - texOffset[1],\n        dx, dy,\n      ]);\n    }\n\n    this.time = time + dt / 1000;\n  }\n\n  override onDisable (): void {\n    super.onDisable();\n    this.time = 0;\n  }\n\n  override onDestroy (): void {\n    const texture = this.renderer.texture;\n    const source = texture.source;\n\n    if (source.sourceType === TextureSourceType.video && source?.video) {\n      source.video.pause();\n      source.video.src = '';\n      source.video.load();\n    }\n  }\n\n  protected updateGeometry (geometry: Geometry) {\n    const split: number[] = this.textureSheetAnimation ? [0, 0, 1, 1, this.splits[0][4] as number] : this.splits[0] as number[];\n    const uvTransform = split;\n    const x = uvTransform[0];\n    const y = uvTransform[1];\n    const isRotate90 = Boolean(uvTransform[4]);\n    const width = isRotate90 ? uvTransform[3] : uvTransform[2];\n    const height = isRotate90 ? uvTransform[2] : uvTransform[3];\n    const angle = isRotate90 ? -Math.PI / 2 : 0;\n\n    const aUV = geometry.getAttributeData('aUV');\n    const aPos = geometry.getAttributeData('aPos');\n    const indices = geometry.getIndexData();\n\n    const tempPosition: spec.vec2 = [0, 0];\n\n    if (aUV && aPos && indices) {\n      const vertexCount = aUV.length / 2;\n\n      for (let i = 0; i < vertexCount; i++) {\n        const positionOffset = i * 3;\n        const uvOffset = i * 2;\n        const positionX = aPos[positionOffset];\n        const positionY = aPos[positionOffset + 1];\n\n        tempPosition[0] = positionX;\n        tempPosition[1] = positionY;\n        rotateVec2(tempPosition, tempPosition, angle);\n\n        aUV[uvOffset] = (tempPosition[0] + 0.5) * width + x;\n        aUV[uvOffset + 1] = (tempPosition[1] + 0.5) * height + y;\n      }\n\n      this.geometry.setAttributeData('aPos', aPos.slice());\n      this.geometry.setAttributeData('aUV', aUV.slice());\n      this.geometry.setIndexData(indices.slice());\n      this.geometry.setDrawCount(indices.length);\n    }\n\n    this.geometry.subMeshes.length = 0;\n    for (const subMesh of geometry.subMeshes) {\n      this.geometry.subMeshes.push({\n        offset: subMesh.offset,\n        indexCount: subMesh.indexCount,\n        vertexCount: subMesh.vertexCount,\n      });\n    }\n  }\n\n  /**\n   * @deprecated\n   * 原有打包纹理拆分逻辑，待移除\n   */\n  protected updateGeometryFromMultiSplit () {\n    const { splits, textureSheetAnimation } = this;\n    const sx = 1, sy = 1;\n    const geometry = this.defaultGeometry;\n\n    const originData = [-.5, .5, -.5, -.5, .5, .5, .5, -.5];\n    const aUV = [];\n    const index = [];\n    const position = [];\n    const col = 2;\n    const row = 2;\n\n    for (let x = 0; x < col; x++) {\n      for (let y = 0; y < row; y++) {\n        const base = (y * 2 + x) * 4;\n        // @ts-expect-error\n        const split: number[] = textureSheetAnimation ? [0, 0, 1, 1, splits[0][4]] : splits[y * 2 + x];\n        const texOffset = split[4] ? [0, 0, 1, 0, 0, 1, 1, 1] : [0, 1, 0, 0, 1, 1, 1, 0];\n        const dw = ((x + x + 1) / col - 1) / 2;\n        const dh = ((y + y + 1) / row - 1) / 2;\n        const tox = split[0];\n        const toy = split[1];\n        const tsx = split[4] ? split[3] : split[2];\n        const tsy = split[4] ? split[2] : split[3];\n        const origin = [\n          originData[0] / col + dw,\n          originData[1] / row + dh,\n          originData[2] / col + dw,\n          originData[3] / row + dh,\n          originData[4] / col + dw,\n          originData[5] / row + dh,\n          originData[6] / col + dw,\n          originData[7] / row + dh,\n        ];\n\n        aUV.push(\n          texOffset[0] * tsx + tox, texOffset[1] * tsy + toy,\n          texOffset[2] * tsx + tox, texOffset[3] * tsy + toy,\n          texOffset[4] * tsx + tox, texOffset[5] * tsy + toy,\n          texOffset[6] * tsx + tox, texOffset[7] * tsy + toy,\n        );\n        position.push((origin[0]) * sx, (origin[1]) * sy, 0.0,\n          (origin[2]) * sx, (origin[3]) * sy, 0.0,\n          (origin[4]) * sx, (origin[5]) * sy, 0.0,\n          (origin[6]) * sx, (origin[7]) * sy, 0.0);\n        index.push(base, 1 + base, 2 + base, 2 + base, 1 + base, 3 + base);\n      }\n    }\n    geometry.setAttributeData('aPos', new Float32Array(position));\n    geometry.setIndexData(new Uint16Array(index));\n    geometry.setAttributeData('aUV', new Float32Array(aUV));\n    geometry.setDrawCount(index.length);\n  }\n\n  override fromData (data: spec.SpriteComponentData): void {\n    super.fromData(data);\n\n    const splits = data.splits ?? singleSplits;\n    const textureSheetAnimation = data.textureSheetAnimation;\n\n    this.splits = splits;\n    this.textureSheetAnimation = textureSheetAnimation;\n\n    // @ts-expect-error\n    const geometry = data.geometry ? this.engine.findObject<Geometry>(data.geometry) : this.defaultGeometry;\n\n    if (splits.length === 1) {\n      this.updateGeometry(geometry);\n    } else {\n      // TODO: 原有打包纹理拆分逻辑，待移除\n      //-------------------------------------------------------------------------\n      this.updateGeometryFromMultiSplit();\n    }\n\n    this.interaction = data.interaction;\n\n    const startColor = data.options.startColor || [1, 1, 1, 1];\n\n    this.material.setColor('_Color', new Color().setFromArray(startColor));\n\n    //@ts-expect-error\n    this.duration = data.duration ?? this.item.duration;\n  }\n}\n","import type { Engine } from '../../engine';\nimport { Plugin } from '../plugin';\n\nexport class ParticleLoader extends Plugin {\n  engine: Engine;\n}\n","// Based on:\n// https://github.com/pixijs/pixijs/blob/dev/src/maths/point/Point.ts\n\nimport type { PointData } from './point-data';\nimport type { PointLike } from './point-like';\n\n/**\n * The Point object represents a location in a two-dimensional coordinate system, where `x` represents\n * the position on the horizontal axis and `y` represents the position on the vertical axis.\n */\nexport class Point implements PointLike {\n  /**\n   * Position of the point on the x axis\n   */\n  x = 0;\n  /**\n   * Position of the point on the y axis\n   */\n  y = 0;\n\n  /**\n   * Creates a new `Point`\n   * @param {number} [x=0] - position of the point on the x axis\n   * @param {number} [y=0] - position of the point on the y axis\n   */\n  constructor (x = 0, y = 0) {\n    this.x = x;\n    this.y = y;\n  }\n\n  /**\n   * Creates a clone of this point\n   * @returns A clone of this point\n   */\n  clone (): Point {\n    return new Point(this.x, this.y);\n  }\n\n  /**\n   * Copies `x` and `y` from the given point into this point\n   * @param p - The point to copy from\n   * @returns The point instance itself\n   */\n  copyFrom (p: PointData): this {\n    this.set(p.x, p.y);\n\n    return this;\n  }\n\n  /**\n   * Copies this point's x and y into the given point (`p`).\n   * @param p - The point to copy to. Can be any of type that is or extends `PointData`\n   * @returns The point (`p`) with values updated\n   */\n  copyTo<T extends PointLike> (p: T): T {\n    p.set(this.x, this.y);\n\n    return p;\n  }\n\n  /**\n   * Accepts another point (`p`) and returns `true` if the given point is equal to this point\n   * @param p - The point to check\n   * @returns Returns `true` if both `x` and `y` are equal\n   */\n  equals (p: PointData): boolean {\n    return (p.x === this.x) && (p.y === this.y);\n  }\n\n  /**\n   * Sets the point to a new `x` and `y` position.\n   * If `y` is omitted, both `x` and `y` will be set to `x`.\n   * @param {number} [x=0] - position of the point on the `x` axis\n   * @param {number} [y=x] - position of the point on the `y` axis\n   * @returns The point instance itself\n   */\n  set (x = 0, y: number = x): this {\n    this.x = x;\n    this.y = y;\n\n    return this;\n  }\n\n  /**\n   * A static Point object with `x` and `y` values of `0`. Can be used to avoid creating new objects multiple times.\n   * @readonly\n   */\n  static get shared (): Point {\n    tempPoint.x = 0;\n    tempPoint.y = 0;\n\n    return tempPoint;\n  }\n}\n\nconst tempPoint = new Point();\n","// Based on:\n// https://github.com/pixijs/pixijs/blob/dev/src/scene/graphics/shared/buildCommands/buildLine.ts\n\nimport { NumberEpsilon } from '@galacean/effects-math/es/core/utils';\nimport * as spec from '@galacean/effects-specification';\nimport { Point } from './point';\n\nexport const closePointEps = 1e-4;\nexport const curveEps = 0.0001;\n\n/**\n * Buffers vertices to draw a square cap.\n *\n * @internal\n * @private\n * @param x - X-coord of end point\n * @param y - Y-coord of end point\n * @param nx - X-coord of line normal pointing inside\n * @param ny - Y-coord of line normal pointing inside\n * @param innerWeight - Weight of inner points\n * @param outerWeight - Weight of outer points\n * @param clockwise - Whether the cap is drawn clockwise\n * @param verts - vertex buffer\n * @returns - no. of vertices pushed\n */\nfunction square (\n  x: number,\n  y: number,\n  nx: number,\n  ny: number,\n  innerWeight: number,\n  outerWeight: number,\n  clockwise: boolean, /* rotation for square (true at left end, false at right end) */\n  verts: Array<number>\n): number {\n  const ix = x - (nx * innerWeight);\n  const iy = y - (ny * innerWeight);\n  const ox = x + (nx * outerWeight);\n  const oy = y + (ny * outerWeight);\n\n  /* Rotate nx,ny for extension vector */\n  let exx;\n  let eyy;\n\n  if (clockwise) {\n    exx = ny;\n    eyy = -nx;\n  } else {\n    exx = -ny;\n    eyy = nx;\n  }\n\n  /* [i|0]x,y extended at cap */\n  const eix = ix + exx;\n  const eiy = iy + eyy;\n  const eox = ox + exx;\n  const eoy = oy + eyy;\n\n  /* Square itself must be inserted clockwise*/\n  verts.push(eix, eiy);\n  verts.push(eox, eoy);\n\n  return 2;\n}\n\n/**\n * Buffers vertices to draw an arc at the line joint or cap.\n *\n * @internal\n * @private\n * @param cx - X-coord of center\n * @param cy - Y-coord of center\n * @param sx - X-coord of arc start\n * @param sy - Y-coord of arc start\n * @param ex - X-coord of arc end\n * @param ey - Y-coord of arc end\n * @param verts - buffer of vertices\n * @param clockwise - orientation of vertices\n * @returns - no. of vertices pushed\n */\nfunction round (\n  cx: number,\n  cy: number,\n  sx: number,\n  sy: number,\n  ex: number,\n  ey: number,\n  verts: number[],\n  clockwise: boolean, /* if not cap, then clockwise is turn of joint, otherwise rotation from angle0 to angle1 */\n): number {\n  const cx2p0x = sx - cx;\n  const cy2p0y = sy - cy;\n\n  let angle0 = Math.atan2(cx2p0x, cy2p0y);\n  let angle1 = Math.atan2(ex - cx, ey - cy);\n\n  if (clockwise && angle0 < angle1) {\n    angle0 += Math.PI * 2;\n  } else if (!clockwise && angle0 > angle1) {\n    angle1 += Math.PI * 2;\n  }\n\n  let startAngle = angle0;\n  const angleDiff = angle1 - angle0;\n  const absAngleDiff = Math.abs(angleDiff);\n\n  const radius = Math.sqrt((cx2p0x * cx2p0x) + (cy2p0y * cy2p0y));\n  const segCount = ((15 * absAngleDiff * Math.sqrt(radius) / Math.PI) >> 0) + 1;\n  const angleInc = angleDiff / segCount;\n\n  startAngle += angleInc;\n\n  if (clockwise) {\n    verts.push(cx, cy);\n    verts.push(sx, sy);\n\n    for (let i = 1, angle = startAngle; i < segCount; i++, angle += angleInc) {\n      verts.push(cx, cy);\n      verts.push(cx + ((Math.sin(angle) * radius)),\n        cy + ((Math.cos(angle) * radius)));\n    }\n\n    verts.push(cx, cy);\n    verts.push(ex, ey);\n  } else {\n    verts.push(sx, sy);\n    verts.push(cx, cy);\n\n    for (let i = 1, angle = startAngle; i < segCount; i++, angle += angleInc) {\n      verts.push(cx + ((Math.sin(angle) * radius)),\n        cy + ((Math.cos(angle) * radius)));\n      verts.push(cx, cy);\n    }\n\n    verts.push(ex, ey);\n    verts.push(cx, cy);\n  }\n\n  return segCount * 2;\n}\n\nfunction getOrientationOfPoints (points: number[]): number {\n  const m = points.length;\n\n  if (m < 6) {\n    return 1;\n  }\n\n  let area = 0;\n\n  for (let i = 0, x1 = points[m - 2], y1 = points[m - 1]; i < m; i += 2) {\n    const x2 = points[i];\n    const y2 = points[i + 1];\n\n    area += (x2 - x1) * (y2 + y1);\n\n    x1 = x2;\n    y1 = y2;\n  }\n\n  if (area < 0) {\n    return -1;\n  }\n\n  return 1;\n}\n\n/**\n * A stroke attribute object, used to define properties for a stroke.\n */\nexport interface StrokeAttributes {\n  /** The width of the stroke. */\n  width: number,\n  /** The alignment of the stroke. */\n  alignment: number,\n  /** The line cap style to use. */\n  cap: spec.LineCap,\n  /** The line join style to use. */\n  join: spec.LineJoin,\n  /** The miter limit to use. */\n  miterLimit: number,\n  /** Stroke color */\n}\n\n/**\n * Builds a line to draw using the polygon method.\n * @param points\n * @param lineStyle\n * @param flipAlignment\n * @param closed\n * @param vertices\n * @param _verticesStride\n * @param _verticesOffset\n * @param indices\n * @param _indicesOffset\n */\nexport function buildLine (\n  points: number[],\n  lineStyle: StrokeAttributes,\n  flipAlignment: boolean,\n  closed: boolean,\n  // alignment:number,\n\n  vertices: number[],\n  _verticesStride: number,\n  _verticesOffset: number,\n\n  indices: number[],\n  _indicesOffset: number,\n): void {\n  // const shape = graphicsData.shape as Polygon;\n  // let points = graphicsData.points || shape.points.slice();\n  const eps = closePointEps;\n\n  if (points.length === 0) {\n    return;\n  }\n\n  const style = lineStyle;\n\n  let alignment = style.alignment;\n\n  if (lineStyle.alignment !== 0.5) {\n    // rotate the points!\n    let orientation = getOrientationOfPoints(points);\n\n    if (flipAlignment) { orientation *= -1; }\n\n    alignment = ((alignment - 0.5) * orientation) + 0.5;\n  }\n\n  // get first and last point.. figure out the middle!\n  const firstPoint = new Point(points[0], points[1]);\n  const lastPoint = new Point(points[points.length - 2], points[points.length - 1]);\n  const closedShape = closed;\n  const closedPath = Math.abs(firstPoint.x - lastPoint.x) < eps\n    && Math.abs(firstPoint.y - lastPoint.y) < eps;\n\n  // if the first point is the last point - gonna have issues :)\n  if (closedShape) {\n    // need to clone as we are going to slightly modify the shape..\n    points = points.slice();\n\n    if (closedPath) {\n      points.pop();\n      points.pop();\n      lastPoint.set(points[points.length - 2], points[points.length - 1]);\n    }\n\n    const midPointX = (firstPoint.x + lastPoint.x) * 0.5;\n    const midPointY = (lastPoint.y + firstPoint.y) * 0.5;\n\n    points.unshift(midPointX, midPointY);\n    points.push(midPointX, midPointY);\n  }\n\n  const verts = vertices;\n\n  const length = points.length / 2;\n  let indexCount = points.length;\n  const indexStart = verts.length / 2;\n\n  // Max. inner and outer width\n  const width = style.width / 2;\n  const widthSquared = width * width;\n  const miterLimitSquared = style.miterLimit * style.miterLimit;\n\n  /* Line segments of interest where (x1,y1) forms the corner. */\n  let x0 = points[0];\n  let y0 = points[1];\n  let x1 = points[2];\n  let y1 = points[3];\n  let x2 = 0;\n  let y2 = 0;\n\n  /* perp[?](x|y) = the line normal with magnitude lineWidth. */\n  let perpX = -(y0 - y1);\n  let perpY = x0 - x1;\n  let perp1x = 0;\n  let perp1y = 0;\n\n  // 计算向量长度并添加极小值 NumberEpsilon 以避免除以零的情况。\n  let dist = Math.sqrt((perpX * perpX) + (perpY * perpY)) + NumberEpsilon;\n\n  perpX /= dist;\n  perpY /= dist;\n  perpX *= width;\n  perpY *= width;\n\n  const ratio = alignment;// 0.5;\n  const innerWeight = (1 - ratio) * 2;\n  const outerWeight = ratio * 2;\n\n  if (!closedShape) {\n    if (style.cap === spec.LineCap.Round) {\n      indexCount += round(\n        x0 - (perpX * (innerWeight - outerWeight) * 0.5),\n        y0 - (perpY * (innerWeight - outerWeight) * 0.5),\n        x0 - (perpX * innerWeight),\n        y0 - (perpY * innerWeight),\n        x0 + (perpX * outerWeight),\n        y0 + (perpY * outerWeight),\n        verts,\n        true,\n      ) + 2;\n    } else if (style.cap === spec.LineCap.Square) {\n      indexCount += square(x0, y0, perpX, perpY, innerWeight, outerWeight, true, verts);\n    }\n  }\n\n  // Push first point (below & above vertices)\n  verts.push(\n    x0 - (perpX * innerWeight),\n    y0 - (perpY * innerWeight));\n  verts.push(\n    x0 + (perpX * outerWeight),\n    y0 + (perpY * outerWeight));\n\n  for (let i = 1; i < length - 1; ++i) {\n    x0 = points[(i - 1) * 2];\n    y0 = points[((i - 1) * 2) + 1];\n\n    x1 = points[i * 2];\n    y1 = points[(i * 2) + 1];\n\n    x2 = points[(i + 1) * 2];\n    y2 = points[((i + 1) * 2) + 1];\n\n    perpX = -(y0 - y1);\n    perpY = x0 - x1;\n\n    dist = Math.sqrt((perpX * perpX) + (perpY * perpY)) + NumberEpsilon;\n    perpX /= dist;\n    perpY /= dist;\n    perpX *= width;\n    perpY *= width;\n\n    perp1x = -(y1 - y2);\n    perp1y = x1 - x2;\n\n    dist = Math.sqrt((perp1x * perp1x) + (perp1y * perp1y)) + NumberEpsilon;\n    perp1x /= dist;\n    perp1y /= dist;\n    perp1x *= width;\n    perp1y *= width;\n\n    /* d[x|y](0|1) = the component displacement between points p(0,1|1,2) */\n    const dx0 = x1 - x0;\n    const dy0 = y0 - y1;\n    const dx1 = x1 - x2;\n    const dy1 = y2 - y1;\n\n    /* +ve if internal angle < 90 degree, -ve if internal angle > 90 degree. */\n    const dot = (dx0 * dx1) + (dy0 * dy1);\n    /* +ve if internal angle counterclockwise, -ve if internal angle clockwise. */\n    const cross = (dy0 * dx1) - (dy1 * dx0);\n    const clockwise = (cross < 0);\n\n    /* Going nearly parallel? */\n    /* atan(0.001) ~= 0.001 rad ~= 0.057 degree */\n    if (Math.abs(cross) < 0.001 * Math.abs(dot)) {\n      verts.push(\n        x1 - (perpX * innerWeight),\n        y1 - (perpY * innerWeight));\n      verts.push(\n        x1 + (perpX * outerWeight),\n        y1 + (perpY * outerWeight));\n\n      /* 180 degree corner? */\n      if (dot >= 0) {\n        if (style.join === spec.LineJoin.Round) {\n          indexCount += round(\n            x1, y1,\n            x1 - (perpX * innerWeight), y1 - (perpY * innerWeight),\n            x1 - (perp1x * innerWeight), y1 - (perp1y * innerWeight),\n            verts, false) + 4;\n        } else {\n          indexCount += 2;\n        }\n\n        verts.push(\n          x1 - (perp1x * outerWeight),\n          y1 - (perp1y * outerWeight));\n        verts.push(\n          x1 + (perp1x * innerWeight),\n          y1 + (perp1y * innerWeight));\n      }\n\n      continue;\n    }\n\n    /* p[x|y] is the miter point. pDist is the distance between miter point and p1. */\n    const c1 = ((-perpX + x0) * (-perpY + y1)) - ((-perpX + x1) * (-perpY + y0));\n    const c2 = ((-perp1x + x2) * (-perp1y + y1)) - ((-perp1x + x1) * (-perp1y + y2));\n    const px = ((dx0 * c2) - (dx1 * c1)) / cross;\n    const py = ((dy1 * c1) - (dy0 * c2)) / cross;\n    const pDist = ((px - x1) * (px - x1)) + ((py - y1) * (py - y1));\n\n    /* Inner miter point */\n    const imx = x1 + ((px - x1) * innerWeight);\n    const imy = y1 + ((py - y1) * innerWeight);\n    /* Outer miter point */\n    const omx = x1 - ((px - x1) * outerWeight);\n    const omy = y1 - ((py - y1) * outerWeight);\n\n    /* Is the inside miter point too far away, creating a spike? */\n    const smallerInsideSegmentSq = Math.min((dx0 * dx0) + (dy0 * dy0), (dx1 * dx1) + (dy1 * dy1));\n    const insideWeight = clockwise ? innerWeight : outerWeight;\n    const smallerInsideDiagonalSq = smallerInsideSegmentSq + (insideWeight * insideWeight * widthSquared);\n    const insideMiterOk = pDist <= smallerInsideDiagonalSq;\n\n    if (insideMiterOk) {\n      if (style.join === spec.LineJoin.Bevel || pDist / widthSquared > miterLimitSquared) {\n        if (clockwise) /* rotating at inner angle */ {\n          verts.push(imx, imy); // inner miter point\n          verts.push(x1 + (perpX * outerWeight), y1 + (perpY * outerWeight)); // first segment's outer vertex\n          verts.push(imx, imy); // inner miter point\n          verts.push(x1 + (perp1x * outerWeight), y1 + (perp1y * outerWeight)); // second segment's outer vertex\n        } else /* rotating at outer angle */ {\n          verts.push(x1 - (perpX * innerWeight), y1 - (perpY * innerWeight)); // first segment's inner vertex\n          verts.push(omx, omy); // outer miter point\n          verts.push(x1 - (perp1x * innerWeight), y1 - (perp1y * innerWeight)); // second segment's outer vertex\n          verts.push(omx, omy); // outer miter point\n        }\n\n        indexCount += 2;\n      } else if (style.join === spec.LineJoin.Round) {\n        if (clockwise) /* arc is outside */ {\n          verts.push(imx, imy);\n          verts.push(x1 + (perpX * outerWeight), y1 + (perpY * outerWeight));\n\n          indexCount += round(\n            x1, y1,\n            x1 + (perpX * outerWeight), y1 + (perpY * outerWeight),\n            x1 + (perp1x * outerWeight), y1 + (perp1y * outerWeight),\n            verts, true\n          ) + 4;\n\n          verts.push(imx, imy);\n          verts.push(x1 + (perp1x * outerWeight), y1 + (perp1y * outerWeight));\n        } else /* arc is inside */ {\n          verts.push(x1 - (perpX * innerWeight), y1 - (perpY * innerWeight));\n          verts.push(omx, omy);\n\n          indexCount += round(\n            x1, y1,\n            x1 - (perpX * innerWeight), y1 - (perpY * innerWeight),\n            x1 - (perp1x * innerWeight), y1 - (perp1y * innerWeight),\n            verts, false\n          ) + 4;\n\n          verts.push(x1 - (perp1x * innerWeight), y1 - (perp1y * innerWeight));\n          verts.push(omx, omy);\n        }\n      } else {\n        verts.push(imx, imy);\n        verts.push(omx, omy);\n      }\n    } else {\n      verts.push(x1 - (perpX * innerWeight), y1 - (perpY * innerWeight)); // first segment's inner vertex\n      verts.push(x1 + (perpX * outerWeight), y1 + (perpY * outerWeight)); // first segment's outer vertex\n      if (style.join === spec.LineJoin.Round) {\n        if (clockwise) /* arc is outside */ {\n          indexCount += round(\n            x1, y1,\n            x1 + (perpX * outerWeight), y1 + (perpY * outerWeight),\n            x1 + (perp1x * outerWeight), y1 + (perp1y * outerWeight),\n            verts, true\n          ) + 2;\n        } else /* arc is inside */ {\n          indexCount += round(\n            x1, y1,\n            x1 - (perpX * innerWeight), y1 - (perpY * innerWeight),\n            x1 - (perp1x * innerWeight), y1 - (perp1y * innerWeight),\n            verts, false\n          ) + 2;\n        }\n      } else if (style.join === spec.LineJoin.Miter && pDist / widthSquared <= miterLimitSquared) {\n        if (clockwise) {\n          verts.push(omx, omy); // inner miter point\n          verts.push(omx, omy); // inner miter point\n        } else {\n          verts.push(imx, imy); // outer miter point\n          verts.push(imx, imy); // outer miter point\n        }\n        indexCount += 2;\n      }\n      verts.push(x1 - (perp1x * innerWeight), y1 - (perp1y * innerWeight)); // second segment's inner vertex\n      verts.push(x1 + (perp1x * outerWeight), y1 + (perp1y * outerWeight)); // second segment's outer vertex\n      indexCount += 2;\n    }\n  }\n\n  x0 = points[(length - 2) * 2];\n  y0 = points[((length - 2) * 2) + 1];\n\n  x1 = points[(length - 1) * 2];\n  y1 = points[((length - 1) * 2) + 1];\n\n  perpX = -(y0 - y1);\n  perpY = x0 - x1;\n\n  dist = Math.sqrt((perpX * perpX) + (perpY * perpY)) + NumberEpsilon;\n  perpX /= dist;\n  perpY /= dist;\n  perpX *= width;\n  perpY *= width;\n\n  verts.push(x1 - (perpX * innerWeight), y1 - (perpY * innerWeight));\n  verts.push(x1 + (perpX * outerWeight), y1 + (perpY * outerWeight));\n\n  if (!closedShape) {\n    if (style.cap === spec.LineCap.Round) {\n      indexCount += round(\n        x1 - (perpX * (innerWeight - outerWeight) * 0.5),\n        y1 - (perpY * (innerWeight - outerWeight) * 0.5),\n        x1 - (perpX * innerWeight),\n        y1 - (perpY * innerWeight),\n        x1 + (perpX * outerWeight),\n        y1 + (perpY * outerWeight),\n        verts,\n        false\n      ) + 2;\n    } else if (style.cap === spec.LineCap.Square) {\n      indexCount += square(x1, y1, perpX, perpY, innerWeight, outerWeight, false, verts);\n    }\n  }\n\n  // const indices = graphicsGeometry.indices;\n  const eps2 = curveEps * curveEps;\n\n  // indices.push(indexStart);\n  for (let i = indexStart; i < indexCount + indexStart - 2; ++i) {\n    x0 = verts[(i * 2)];\n    y0 = verts[(i * 2) + 1];\n\n    x1 = verts[(i + 1) * 2];\n    y1 = verts[((i + 1) * 2) + 1];\n\n    x2 = verts[(i + 2) * 2];\n    y2 = verts[((i + 2) * 2) + 1];\n\n    /* Skip zero area triangles */\n    if (Math.abs((x0 * (y1 - y2)) + (x1 * (y2 - y0)) + (x2 * (y0 - y1))) < eps2) {\n      continue;\n    }\n\n    indices.push(i, i + 1, i + 2);\n  }\n}\n\n","// Based on:\n// https://github.com/pixijs/pixijs/blob/dev/src/maths/shapes/ShapePrimitive.ts\n\nexport abstract class ShapePrimitive {\n\n  /** Checks whether the x and y coordinates passed to this function are contained within this ShapePrimitive. */\n  // abstract contains (x: number, y: number): boolean;\n  /** Checks whether the x and y coordinates passed to this function are contained within the stroke of this shape */\n  //   abstract strokeContains (x: number, y: number, strokeWidth: number): boolean;\n  /** Creates a clone of this ShapePrimitive instance. */\n  abstract clone (): ShapePrimitive;\n  /** Copies the properties from another ShapePrimitive to this ShapePrimitive. */\n  abstract copyFrom (source: ShapePrimitive): void;\n  /** Copies the properties from this ShapePrimitive to another ShapePrimitive. */\n  abstract copyTo (destination: ShapePrimitive): void;\n  /** Returns the framing rectangle of the ShapePrimitive as a Rectangle object. */\n  //   getBounds(out?: Rectangle): Rectangle,\n\n  /** The X coordinate of the shape */\n  // abstract getX (): number;\n  /** The Y coordinate of the shape */\n  // abstract getY (): number;\n\n  abstract build (points: number[]): void;\n\n  abstract triangulate (points: number[], vertices: number[], verticesOffset: number, indices: number[], indicesOffset: number): void;\n}\n","/*\n\n Copyright 2000, Silicon Graphics, Inc. All Rights Reserved.\n Copyright 2015, Google Inc. All Rights Reserved.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to\n deal in the Software without restriction, including without limitation the\n rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n sell copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice including the dates of first publication and\n either this permission notice or a reference to http://oss.sgi.com/projects/FreeB/\n shall be included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\n IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n Original Code. The Original Code is: OpenGL Sample Implementation,\n Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,\n Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.\n Copyright in any portions created by third parties is as indicated\n elsewhere herein. All Rights Reserved.\n*/\n'use strict';var n;function t(a,b){return a.b===b.b&&a.a===b.a}function u(a,b){return a.b<b.b||a.b===b.b&&a.a<=b.a}function v(a,b,c){var d=b.b-a.b,e=c.b-b.b;return 0<d+e?d<e?b.a-a.a+d/(d+e)*(a.a-c.a):b.a-c.a+e/(d+e)*(c.a-a.a):0}function x(a,b,c){var d=b.b-a.b,e=c.b-b.b;return 0<d+e?(b.a-c.a)*d+(b.a-a.a)*e:0}function z(a,b){return a.a<b.a||a.a===b.a&&a.b<=b.b}function aa(a,b,c){var d=b.a-a.a,e=c.a-b.a;return 0<d+e?d<e?b.b-a.b+d/(d+e)*(a.b-c.b):b.b-c.b+e/(d+e)*(c.b-a.b):0}\nfunction ba(a,b,c){var d=b.a-a.a,e=c.a-b.a;return 0<d+e?(b.b-c.b)*d+(b.b-a.b)*e:0}function ca(a){return u(a.b.a,a.a)}function da(a){return u(a.a,a.b.a)}function A(a,b,c,d){a=0>a?0:a;c=0>c?0:c;return a<=c?0===c?(b+d)/2:b+a/(a+c)*(d-b):d+c/(a+c)*(b-d)};function ea(a){var b=B(a.b);C(b,a.c);C(b.b,a.c);D(b,a.a);return b}function E(a,b){var c=!1,d=!1;a!==b&&(b.a!==a.a&&(d=!0,F(b.a,a.a)),b.d!==a.d&&(c=!0,G(b.d,a.d)),H(b,a),d||(C(b,a.a),a.a.c=a),c||(D(b,a.d),a.d.a=a))}function I(a){var b=a.b,c=!1;a.d!==a.b.d&&(c=!0,G(a.d,a.b.d));a.c===a?F(a.a,null):(a.b.d.a=J(a),a.a.c=a.c,H(a,J(a)),c||D(a,a.d));b.c===b?(F(b.a,null),G(b.d,null)):(a.d.a=J(b),b.a.c=b.c,H(b,J(b)));fa(a)}\nfunction K(a){var b=B(a),c=b.b;H(b,a.e);b.a=a.b.a;C(c,b.a);b.d=c.d=a.d;b=b.b;H(a.b,J(a.b));H(a.b,b);a.b.a=b.a;b.b.a.c=b.b;b.b.d=a.b.d;b.f=a.f;b.b.f=a.b.f;return b}function L(a,b){var c=!1,d=B(a),e=d.b;b.d!==a.d&&(c=!0,G(b.d,a.d));H(d,a.e);H(e,b);d.a=a.b.a;e.a=b.a;d.d=e.d=a.d;a.d.a=e;c||D(d,a.d);return d}function B(a){var b=new M,c=new M,d=a.b.h;c.h=d;d.b.h=b;b.h=a;a.b.h=c;b.b=c;b.c=b;b.e=c;c.b=b;c.c=c;return c.e=b}function H(a,b){var c=a.c,d=b.c;c.b.e=b;d.b.e=a;a.c=d;b.c=c}\nfunction C(a,b){var c=b.f,d=new N(b,c);c.e=d;b.f=d;c=d.c=a;do c.a=d,c=c.c;while(c!==a)}function D(a,b){var c=b.d,d=new ga(b,c);c.b=d;b.d=d;d.a=a;d.c=b.c;c=a;do c.d=d,c=c.e;while(c!==a)}function fa(a){var b=a.h;a=a.b.h;b.b.h=a;a.b.h=b}function F(a,b){var c=a.c,d=c;do d.a=b,d=d.c;while(d!==c);c=a.f;d=a.e;d.f=c;c.e=d}function G(a,b){var c=a.a,d=c;do d.d=b,d=d.e;while(d!==c);c=a.d;d=a.b;d.d=c;c.b=d};function ha(a){var b=0;Math.abs(a[1])>Math.abs(a[0])&&(b=1);Math.abs(a[2])>Math.abs(a[b])&&(b=2);return b};var O=4*1E150;function P(a,b){a.f+=b.f;a.b.f+=b.b.f}function ia(a,b,c){a=a.a;b=b.a;c=c.a;if(b.b.a===a)return c.b.a===a?u(b.a,c.a)?0>=x(c.b.a,b.a,c.a):0<=x(b.b.a,c.a,b.a):0>=x(c.b.a,a,c.a);if(c.b.a===a)return 0<=x(b.b.a,a,b.a);b=v(b.b.a,a,b.a);a=v(c.b.a,a,c.a);return b>=a}function Q(a){a.a.i=null;var b=a.e;b.a.c=b.c;b.c.a=b.a;a.e=null}function ja(a,b){I(a.a);a.c=!1;a.a=b;b.i=a}function ka(a){var b=a.a.a;do a=R(a);while(a.a.a===b);a.c&&(b=L(S(a).a.b,a.a.e),ja(a,b),a=R(a));return a}\nfunction la(a,b,c){var d=new ma;d.a=c;d.e=na(a.f,b.e,d);return c.i=d}function oa(a,b){switch(a.s){case 100130:return 0!==(b&1);case 100131:return 0!==b;case 100132:return 0<b;case 100133:return 0>b;case 100134:return 2<=b||-2>=b}return!1}function pa(a){var b=a.a,c=b.d;c.c=a.d;c.a=b;Q(a)}function T(a,b,c){a=b;for(b=b.a;a!==c;){a.c=!1;var d=S(a),e=d.a;if(e.a!==b.a){if(!d.c){pa(a);break}e=L(b.c.b,e.b);ja(d,e)}b.c!==e&&(E(J(e),e),E(b,e));pa(a);b=d.a;a=d}return b}\nfunction U(a,b,c,d,e,f){var g=!0;do la(a,b,c.b),c=c.c;while(c!==d);for(null===e&&(e=S(b).a.b.c);;){d=S(b);c=d.a.b;if(c.a!==e.a)break;c.c!==e&&(E(J(c),c),E(J(e),c));d.f=b.f-c.f;d.d=oa(a,d.f);b.b=!0;!g&&qa(a,b)&&(P(c,e),Q(b),I(e));g=!1;b=d;e=c}b.b=!0;f&&ra(a,b)}function sa(a,b,c,d,e){var f=[b.g[0],b.g[1],b.g[2]];b.d=null;b.d=a.o?a.o(f,c,d,a.c)||null:null;null===b.d&&(e?a.n||(V(a,100156),a.n=!0):b.d=c[0])}\nfunction ta(a,b,c){var d=[null,null,null,null];d[0]=b.a.d;d[1]=c.a.d;sa(a,b.a,d,[.5,.5,0,0],!1);E(b,c)}function ua(a,b,c,d,e){var f=Math.abs(b.b-a.b)+Math.abs(b.a-a.a),g=Math.abs(c.b-a.b)+Math.abs(c.a-a.a),h=e+1;d[e]=.5*g/(f+g);d[h]=.5*f/(f+g);a.g[0]+=d[e]*b.g[0]+d[h]*c.g[0];a.g[1]+=d[e]*b.g[1]+d[h]*c.g[1];a.g[2]+=d[e]*b.g[2]+d[h]*c.g[2]}\nfunction qa(a,b){var c=S(b),d=b.a,e=c.a;if(u(d.a,e.a)){if(0<x(e.b.a,d.a,e.a))return!1;if(!t(d.a,e.a))K(e.b),E(d,J(e)),b.b=c.b=!0;else if(d.a!==e.a){var c=a.e,f=d.a.h;if(0<=f){var c=c.b,g=c.d,h=c.e,k=c.c,l=k[f];g[l]=g[c.a];k[g[l]]=l;l<=--c.a&&(1>=l?W(c,l):u(h[g[l>>1]],h[g[l]])?W(c,l):va(c,l));h[f]=null;k[f]=c.b;c.b=f}else for(c.c[-(f+1)]=null;0<c.a&&null===c.c[c.d[c.a-1]];)--c.a;ta(a,J(e),d)}}else{if(0>x(d.b.a,e.a,d.a))return!1;R(b).b=b.b=!0;K(d.b);E(J(e),d)}return!0}\nfunction wa(a,b){var c=S(b),d=b.a,e=c.a,f=d.a,g=e.a,h=d.b.a,k=e.b.a,l=new N;x(h,a.a,f);x(k,a.a,g);if(f===g||Math.min(f.a,h.a)>Math.max(g.a,k.a))return!1;if(u(f,g)){if(0<x(k,f,g))return!1}else if(0>x(h,g,f))return!1;var r=h,p=f,q=k,y=g,m,w;u(r,p)||(m=r,r=p,p=m);u(q,y)||(m=q,q=y,y=m);u(r,q)||(m=r,r=q,q=m,m=p,p=y,y=m);u(q,p)?u(p,y)?(m=v(r,q,p),w=v(q,p,y),0>m+w&&(m=-m,w=-w),l.b=A(m,q.b,w,p.b)):(m=x(r,q,p),w=-x(r,y,p),0>m+w&&(m=-m,w=-w),l.b=A(m,q.b,w,y.b)):l.b=(q.b+p.b)/2;z(r,p)||(m=r,r=p,p=m);z(q,y)||\n(m=q,q=y,y=m);z(r,q)||(m=r,r=q,q=m,m=p,p=y,y=m);z(q,p)?z(p,y)?(m=aa(r,q,p),w=aa(q,p,y),0>m+w&&(m=-m,w=-w),l.a=A(m,q.a,w,p.a)):(m=ba(r,q,p),w=-ba(r,y,p),0>m+w&&(m=-m,w=-w),l.a=A(m,q.a,w,y.a)):l.a=(q.a+p.a)/2;u(l,a.a)&&(l.b=a.a.b,l.a=a.a.a);r=u(f,g)?f:g;u(r,l)&&(l.b=r.b,l.a=r.a);if(t(l,f)||t(l,g))return qa(a,b),!1;if(!t(h,a.a)&&0<=x(h,a.a,l)||!t(k,a.a)&&0>=x(k,a.a,l)){if(k===a.a)return K(d.b),E(e.b,d),b=ka(b),d=S(b).a,T(a,S(b),c),U(a,b,J(d),d,d,!0),!0;if(h===a.a){K(e.b);E(d.e,J(e));f=c=b;g=f.a.b.a;\ndo f=R(f);while(f.a.b.a===g);b=f;f=S(b).a.b.c;c.a=J(e);e=T(a,c,null);U(a,b,e.c,d.b.c,f,!0);return!0}0<=x(h,a.a,l)&&(R(b).b=b.b=!0,K(d.b),d.a.b=a.a.b,d.a.a=a.a.a);0>=x(k,a.a,l)&&(b.b=c.b=!0,K(e.b),e.a.b=a.a.b,e.a.a=a.a.a);return!1}K(d.b);K(e.b);E(J(e),d);d.a.b=l.b;d.a.a=l.a;d.a.h=xa(a.e,d.a);d=d.a;e=[0,0,0,0];l=[f.d,h.d,g.d,k.d];d.g[0]=d.g[1]=d.g[2]=0;ua(d,f,h,e,0);ua(d,g,k,e,2);sa(a,d,l,e,!0);R(b).b=b.b=c.b=!0;return!1}\nfunction ra(a,b){for(var c=S(b);;){for(;c.b;)b=c,c=S(c);if(!b.b&&(c=b,b=R(b),null===b||!b.b))break;b.b=!1;var d=b.a,e=c.a,f;if(f=d.b.a!==e.b.a)a:{f=b;var g=S(f),h=f.a,k=g.a,l=void 0;if(u(h.b.a,k.b.a)){if(0>x(h.b.a,k.b.a,h.a)){f=!1;break a}R(f).b=f.b=!0;l=K(h);E(k.b,l);l.d.c=f.d}else{if(0<x(k.b.a,h.b.a,k.a)){f=!1;break a}f.b=g.b=!0;l=K(k);E(h.e,k.b);l.b.d.c=f.d}f=!0}f&&(c.c?(Q(c),I(e),c=S(b),e=c.a):b.c&&(Q(b),I(d),b=R(c),d=b.a));if(d.a!==e.a)if(d.b.a===e.b.a||b.c||c.c||d.b.a!==a.a&&e.b.a!==a.a)qa(a,\nb);else if(wa(a,b))break;d.a===e.a&&d.b.a===e.b.a&&(P(e,d),Q(b),I(d),b=R(c))}}\nfunction ya(a,b){a.a=b;for(var c=b.c;null===c.i;)if(c=c.c,c===b.c){var c=a,d=b,e=new ma;e.a=d.c.b;var f=c.f,g=f.a;do g=g.a;while(null!==g.b&&!f.c(f.b,e,g.b));var f=g.b,h=S(f),e=f.a,g=h.a;if(0===x(e.b.a,d,e.a))e=f.a,t(e.a,d)||t(e.b.a,d)||(K(e.b),f.c&&(I(e.c),f.c=!1),E(d.c,e),ya(c,d));else{var k=u(g.b.a,e.b.a)?f:h,h=void 0;f.d||k.c?(k===f?h=L(d.c.b,e.e):h=L(g.b.c.b,d.c).b,k.c?ja(k,h):(e=c,f=la(c,f,h),f.f=R(f).f+f.a.f,f.d=oa(e,f.f)),ya(c,d)):U(c,f,d.c,d.c,null,!0)}return}c=ka(c.i);e=S(c);f=e.a;e=T(a,\ne,null);if(e.c===f){var f=e,e=f.c,g=S(c),h=c.a,k=g.a,l=!1;h.b.a!==k.b.a&&wa(a,c);t(h.a,a.a)&&(E(J(e),h),c=ka(c),e=S(c).a,T(a,S(c),g),l=!0);t(k.a,a.a)&&(E(f,J(k)),f=T(a,g,null),l=!0);l?U(a,c,f.c,e,e,!0):(u(k.a,h.a)?d=J(k):d=h,d=L(f.c.b,d),U(a,c,d,d.c,d.c,!1),d.b.i.c=!0,ra(a,c))}else U(a,c,e.c,f,f,!0)}function za(a,b){var c=new ma,d=ea(a.b);d.a.b=O;d.a.a=b;d.b.a.b=-O;d.b.a.a=b;a.a=d.b.a;c.a=d;c.f=0;c.d=!1;c.c=!1;c.h=!0;c.b=!1;d=a.f;d=na(d,d.a,c);c.e=d};function Aa(a){this.a=new Ba;this.b=a;this.c=ia}function na(a,b,c){do b=b.c;while(null!==b.b&&!a.c(a.b,b.b,c));a=new Ba(c,b.a,b);b.a.c=a;return b.a=a};function Ba(a,b,c){this.b=a||null;this.a=b||this;this.c=c||this};function X(){this.d=Y;this.p=this.b=this.q=null;this.j=[0,0,0];this.s=100130;this.n=!1;this.o=this.a=this.e=this.f=null;this.m=!1;this.c=this.r=this.i=this.k=this.l=this.h=null}var Y=0;n=X.prototype;n.x=function(){Z(this,Y)};n.B=function(a,b){switch(a){case 100142:return;case 100140:switch(b){case 100130:case 100131:case 100132:case 100133:case 100134:this.s=b;return}break;case 100141:this.m=!!b;return;default:V(this,100900);return}V(this,100901)};\nn.y=function(a){switch(a){case 100142:return 0;case 100140:return this.s;case 100141:return this.m;default:V(this,100900)}return!1};n.A=function(a,b,c){this.j[0]=a;this.j[1]=b;this.j[2]=c};\nn.z=function(a,b){var c=b?b:null;switch(a){case 100100:case 100106:this.h=c;break;case 100104:case 100110:this.l=c;break;case 100101:case 100107:this.k=c;break;case 100102:case 100108:this.i=c;break;case 100103:case 100109:this.p=c;break;case 100105:case 100111:this.o=c;break;case 100112:this.r=c;break;default:V(this,100900)}};\nn.C=function(a,b){var c=!1,d=[0,0,0];Z(this,2);for(var e=0;3>e;++e){var f=a[e];-1E150>f&&(f=-1E150,c=!0);1E150<f&&(f=1E150,c=!0);d[e]=f}c&&V(this,100155);c=this.q;null===c?(c=ea(this.b),E(c,c.b)):(K(c),c=c.e);c.a.d=b;c.a.g[0]=d[0];c.a.g[1]=d[1];c.a.g[2]=d[2];c.f=1;c.b.f=-1;this.q=c};n.u=function(a){Z(this,Y);this.d=1;this.b=new Ca;this.c=a};n.t=function(){Z(this,1);this.d=2;this.q=null};n.v=function(){Z(this,2);this.d=1};\nn.w=function(){Z(this,1);this.d=Y;var a=this.j[0],b=this.j[1],c=this.j[2],d=!1,e=[a,b,c];if(0===a&&0===b&&0===c){for(var b=[-2*1E150,-2*1E150,-2*1E150],f=[2*1E150,2*1E150,2*1E150],c=[],g=[],d=this.b.c,a=d.e;a!==d;a=a.e)for(var h=0;3>h;++h){var k=a.g[h];k<f[h]&&(f[h]=k,g[h]=a);k>b[h]&&(b[h]=k,c[h]=a)}a=0;b[1]-f[1]>b[0]-f[0]&&(a=1);b[2]-f[2]>b[a]-f[a]&&(a=2);if(f[a]>=b[a])e[0]=0,e[1]=0,e[2]=1;else{b=0;f=g[a];c=c[a];g=[0,0,0];f=[f.g[0]-c.g[0],f.g[1]-c.g[1],f.g[2]-c.g[2]];h=[0,0,0];for(a=d.e;a!==d;a=\na.e)h[0]=a.g[0]-c.g[0],h[1]=a.g[1]-c.g[1],h[2]=a.g[2]-c.g[2],g[0]=f[1]*h[2]-f[2]*h[1],g[1]=f[2]*h[0]-f[0]*h[2],g[2]=f[0]*h[1]-f[1]*h[0],k=g[0]*g[0]+g[1]*g[1]+g[2]*g[2],k>b&&(b=k,e[0]=g[0],e[1]=g[1],e[2]=g[2]);0>=b&&(e[0]=e[1]=e[2]=0,e[ha(f)]=1)}d=!0}g=ha(e);a=this.b.c;b=(g+1)%3;c=(g+2)%3;g=0<e[g]?1:-1;for(e=a.e;e!==a;e=e.e)e.b=e.g[b],e.a=g*e.g[c];if(d){e=0;d=this.b.a;for(a=d.b;a!==d;a=a.b)if(b=a.a,!(0>=b.f)){do e+=(b.a.b-b.b.a.b)*(b.a.a+b.b.a.a),b=b.e;while(b!==a.a)}if(0>e)for(e=this.b.c,d=e.e;d!==\ne;d=d.e)d.a=-d.a}this.n=!1;e=this.b.b;for(a=e.h;a!==e;a=d)if(d=a.h,b=a.e,t(a.a,a.b.a)&&a.e.e!==a&&(ta(this,b,a),I(a),a=b,b=a.e),b.e===a){if(b!==a){if(b===d||b===d.b)d=d.h;I(b)}if(a===d||a===d.b)d=d.h;I(a)}this.e=e=new Da;d=this.b.c;for(a=d.e;a!==d;a=a.e)a.h=xa(e,a);Ea(e);this.f=new Aa(this);za(this,-O);for(za(this,O);null!==(e=Fa(this.e));){for(;;){a:if(a=this.e,0===a.a)d=Ga(a.b);else if(d=a.c[a.d[a.a-1]],0!==a.b.a&&(a=Ga(a.b),u(a,d))){d=a;break a}if(null===d||!t(d,e))break;d=Fa(this.e);ta(this,e.c,\nd.c)}ya(this,e)}this.a=this.f.a.a.b.a.a;for(e=0;null!==(d=this.f.a.a.b);)d.h||++e,Q(d);this.f=null;e=this.e;e.b=null;e.d=null;this.e=e.c=null;e=this.b;for(a=e.a.b;a!==e.a;a=d)d=a.b,a=a.a,a.e.e===a&&(P(a.c,a),I(a));if(!this.n){e=this.b;if(this.m)for(a=e.b.h;a!==e.b;a=d)d=a.h,a.b.d.c!==a.d.c?a.f=a.d.c?1:-1:I(a);else for(a=e.a.b;a!==e.a;a=d)if(d=a.b,a.c){for(a=a.a;u(a.b.a,a.a);a=a.c.b);for(;u(a.a,a.b.a);a=a.e);b=a.c.b;for(c=void 0;a.e!==b;)if(u(a.b.a,b.a)){for(;b.e!==a&&(ca(b.e)||0>=x(b.a,b.b.a,b.e.b.a));)c=\nL(b.e,b),b=c.b;b=b.c.b}else{for(;b.e!==a&&(da(a.c.b)||0<=x(a.b.a,a.a,a.c.b.a));)c=L(a,a.c.b),a=c.b;a=a.e}for(;b.e.e!==a;)c=L(b.e,b),b=c.b}if(this.h||this.i||this.k||this.l)if(this.m)for(e=this.b,d=e.a.b;d!==e.a;d=d.b){if(d.c){this.h&&this.h(2,this.c);a=d.a;do this.k&&this.k(a.a.d,this.c),a=a.e;while(a!==d.a);this.i&&this.i(this.c)}}else{e=this.b;d=!!this.l;a=!1;b=-1;for(c=e.a.d;c!==e.a;c=c.d)if(c.c){a||(this.h&&this.h(4,this.c),a=!0);g=c.a;do d&&(f=g.b.d.c?0:1,b!==f&&(b=f,this.l&&this.l(!!b,this.c))),\nthis.k&&this.k(g.a.d,this.c),g=g.e;while(g!==c.a)}a&&this.i&&this.i(this.c)}if(this.r){e=this.b;for(a=e.a.b;a!==e.a;a=d)if(d=a.b,!a.c){b=a.a;c=b.e;g=void 0;do g=c,c=g.e,g.d=null,null===g.b.d&&(g.c===g?F(g.a,null):(g.a.c=g.c,H(g,J(g))),f=g.b,f.c===f?F(f.a,null):(f.a.c=f.c,H(f,J(f))),fa(g));while(g!==b);b=a.d;a=a.b;a.d=b;b.b=a}this.r(this.b);this.c=this.b=null;return}}this.b=this.c=null};\nfunction Z(a,b){if(a.d!==b)for(;a.d!==b;)if(a.d<b)switch(a.d){case Y:V(a,100151);a.u(null);break;case 1:V(a,100152),a.t()}else switch(a.d){case 2:V(a,100154);a.v();break;case 1:V(a,100153),a.w()}}function V(a,b){a.p&&a.p(b,a.c)};function ga(a,b){this.b=a||this;this.d=b||this;this.a=null;this.c=!1};function M(){this.h=this;this.i=this.d=this.a=this.e=this.c=this.b=null;this.f=0}function J(a){return a.b.e};function Ca(){this.c=new N;this.a=new ga;this.b=new M;this.d=new M;this.b.b=this.d;this.d.b=this.b};function N(a,b){this.e=a||this;this.f=b||this;this.d=this.c=null;this.g=[0,0,0];this.h=this.a=this.b=0};function Da(){this.c=[];this.d=null;this.a=0;this.e=!1;this.b=new Ha}function Ea(a){a.d=[];for(var b=0;b<a.a;b++)a.d[b]=b;a.d.sort(function(a){return function(b,e){return u(a[b],a[e])?1:-1}}(a.c));a.e=!0;Ia(a.b)}function xa(a,b){if(a.e){var c=a.b,d=++c.a;2*d>c.f&&(c.f*=2,c.c=Ja(c.c,c.f+1));var e;0===c.b?e=d:(e=c.b,c.b=c.c[c.b]);c.e[e]=b;c.c[e]=d;c.d[d]=e;c.h&&va(c,d);return e}c=a.a++;a.c[c]=b;return-(c+1)}\nfunction Fa(a){if(0===a.a)return Ka(a.b);var b=a.c[a.d[a.a-1]];if(0!==a.b.a&&u(Ga(a.b),b))return Ka(a.b);do--a.a;while(0<a.a&&null===a.c[a.d[a.a-1]]);return b};function Ha(){this.d=Ja([0],33);this.e=[null,null];this.c=[0,0];this.a=0;this.f=32;this.b=0;this.h=!1;this.d[1]=1}function Ja(a,b){for(var c=Array(b),d=0;d<a.length;d++)c[d]=a[d];for(;d<b;d++)c[d]=0;return c}function Ia(a){for(var b=a.a;1<=b;--b)W(a,b);a.h=!0}function Ga(a){return a.e[a.d[1]]}function Ka(a){var b=a.d,c=a.e,d=a.c,e=b[1],f=c[e];0<a.a&&(b[1]=b[a.a],d[b[1]]=1,c[e]=null,d[e]=a.b,a.b=e,0<--a.a&&W(a,1));return f}\nfunction W(a,b){for(var c=a.d,d=a.e,e=a.c,f=b,g=c[f];;){var h=f<<1;h<a.a&&u(d[c[h+1]],d[c[h]])&&(h+=1);var k=c[h];if(h>a.a||u(d[g],d[k])){c[f]=g;e[g]=f;break}c[f]=k;e[k]=f;f=h}}function va(a,b){for(var c=a.d,d=a.e,e=a.c,f=b,g=c[f];;){var h=f>>1,k=c[h];if(0===h||u(d[k],d[g])){c[f]=g;e[g]=f;break}c[f]=k;e[k]=f;f=h}};function ma(){this.e=this.a=null;this.f=0;this.c=this.b=this.h=this.d=!1}function S(a){return a.e.c.b}function R(a){return a.e.a.b};this.libtess={GluTesselator:X,windingRule:{GLU_TESS_WINDING_ODD:100130,GLU_TESS_WINDING_NONZERO:100131,GLU_TESS_WINDING_POSITIVE:100132,GLU_TESS_WINDING_NEGATIVE:100133,GLU_TESS_WINDING_ABS_GEQ_TWO:100134},primitiveType:{GL_LINE_LOOP:2,GL_TRIANGLES:4,GL_TRIANGLE_STRIP:5,GL_TRIANGLE_FAN:6},errorType:{GLU_TESS_MISSING_BEGIN_POLYGON:100151,GLU_TESS_MISSING_END_POLYGON:100153,GLU_TESS_MISSING_BEGIN_CONTOUR:100152,GLU_TESS_MISSING_END_CONTOUR:100154,GLU_TESS_COORD_TOO_LARGE:100155,GLU_TESS_NEED_COMBINE_CALLBACK:100156},\ngluEnum:{GLU_TESS_MESH:100112,GLU_TESS_TOLERANCE:100142,GLU_TESS_WINDING_RULE:100140,GLU_TESS_BOUNDARY_ONLY:100141,GLU_INVALID_ENUM:100900,GLU_INVALID_VALUE:100901,GLU_TESS_BEGIN:100100,GLU_TESS_VERTEX:100101,GLU_TESS_END:100102,GLU_TESS_ERROR:100103,GLU_TESS_EDGE_FLAG:100104,GLU_TESS_COMBINE:100105,GLU_TESS_BEGIN_DATA:100106,GLU_TESS_VERTEX_DATA:100107,GLU_TESS_END_DATA:100108,GLU_TESS_ERROR_DATA:100109,GLU_TESS_EDGE_FLAG_DATA:100110,GLU_TESS_COMBINE_DATA:100111}};X.prototype.gluDeleteTess=X.prototype.x;\nX.prototype.gluTessProperty=X.prototype.B;X.prototype.gluGetTessProperty=X.prototype.y;X.prototype.gluTessNormal=X.prototype.A;X.prototype.gluTessCallback=X.prototype.z;X.prototype.gluTessVertex=X.prototype.C;X.prototype.gluTessBeginPolygon=X.prototype.u;X.prototype.gluTessBeginContour=X.prototype.t;X.prototype.gluTessEndContour=X.prototype.v;X.prototype.gluTessEndPolygon=X.prototype.w; if (typeof module !== 'undefined') { module.exports = this.libtess; }\n","import * as libtess from 'libtess';\n\nconst tessy = (function initTesselator () {\n  // function called for each vertex of tesselator output\n  function vertexCallback (\n    data: [x: number, y: number, z: number],\n    polyVertArray: number[],\n  ) {\n    polyVertArray[polyVertArray.length] = data[0];\n    polyVertArray[polyVertArray.length] = data[1];\n  }\n  function begincallback (type: number) {\n    if (type !== libtess.primitiveType.GL_TRIANGLES) {\n      console.info('expected TRIANGLES but got type: ' + type);\n    }\n  }\n  function errorcallback (errno: number) {\n    console.error('error callback, error number: ' + errno);\n  }\n  // callback for when segments intersect and must be split\n  function combinecallback (\n    coords: [number, number, number],\n    data: number[][],\n    weight: number[],\n  ) {\n    // console.log('combine callback');\n    return [coords[0], coords[1], coords[2]];\n  }\n  function edgeCallback (flag: boolean) {\n    // don't really care about the flag, but need no-strip/no-fan behavior\n    // console.log('edge flag: ' + flag);\n  }\n\n  const tessy = new libtess.GluTesselator();\n\n  // tessy.gluTessProperty(libtess.gluEnum.GLU_TESS_WINDING_RULE, libtess.windingRule.GLU_TESS_WINDING_POSITIVE);\n  tessy.gluTessCallback(libtess.gluEnum.GLU_TESS_VERTEX_DATA, vertexCallback);\n  tessy.gluTessCallback(libtess.gluEnum.GLU_TESS_BEGIN, begincallback);\n  tessy.gluTessCallback(libtess.gluEnum.GLU_TESS_ERROR, errorcallback);\n  tessy.gluTessCallback(libtess.gluEnum.GLU_TESS_COMBINE, combinecallback);\n  tessy.gluTessCallback(libtess.gluEnum.GLU_TESS_EDGE_FLAG, edgeCallback);\n\n  return tessy;\n})();\n\nexport function triangulate (contours: number[][]) {\n  // libtess will take 3d verts and flatten to a plane for tesselation\n  // since only doing 2d tesselation here, provide z=1 normal to skip\n  // iterating over verts only to get the same answer.\n  // comment out to test normal-generation code\n  tessy.gluTessNormal(0, 0, 1);\n\n  const triangleVerts: number[] = [];\n\n  tessy.gluTessBeginPolygon(triangleVerts);\n\n  for (let i = 0; i < contours.length; i++) {\n    tessy.gluTessBeginContour();\n    const contour = contours[i];\n\n    for (let j = 0; j < contour.length; j += 2) {\n      const coords = [contour[j], contour[j + 1], 0];\n\n      tessy.gluTessVertex(coords, coords);\n    }\n    tessy.gluTessEndContour();\n  }\n\n  // finish polygon\n  tessy.gluTessEndPolygon();\n\n  return triangleVerts;\n}\n","// Based on:\n// https://github.com/pixijs/pixijs/blob/dev/src/maths/shapes/Polygon.ts\n\nimport { ShapePrimitive } from './shape-primitive';\nimport type { PointData } from './point-data';\nimport { triangulate } from './triangulate';\n\n/**\n * A class to define a shape via user defined coordinates.\n */\nexport class Polygon extends ShapePrimitive {\n  /**\n   * An array of the points of this polygon.\n   */\n  points: number[] = [];\n\n  /**\n   * `false` after moveTo, `true` after `closePath`. In all other cases it is `true`.\n   */\n  closePath: boolean = false;\n\n  constructor (points: PointData[] | number[]);\n  constructor (...points: PointData[] | number[]);\n  /**\n   * @param points - This can be an array of Points\n   *  that form the polygon, a flat array of numbers that will be interpreted as [x,y, x,y, ...], or\n   *  the arguments passed can be all the points of the polygon e.g.\n   *  `new Polygon(new Point(), new Point(), ...)`, or the arguments passed can be flat\n   *  x,y values e.g. `new Polygon(x,y, x,y, x,y, ...)` where `x` and `y` are Numbers.\n   */\n  constructor (...points: (PointData[] | number[])[] | PointData[] | number[]) {\n    super();\n    let flat = Array.isArray(points[0]) ? points[0] : points;\n\n    // if this is an array of points, convert it to a flat array of numbers\n    if (typeof flat[0] !== 'number') {\n      const p: number[] = [];\n\n      for (let i = 0, il = flat.length; i < il; i++) {\n        p.push((flat[i] as PointData).x, (flat[i] as PointData).y);\n      }\n\n      flat = p;\n    }\n\n    this.points = flat as number[];\n    this.closePath = true;\n  }\n\n  /**\n   * Creates a clone of this polygon.\n   * @returns - A copy of the polygon.\n   */\n  clone (): Polygon {\n    const points = this.points.slice();\n    const polygon = new Polygon(points);\n\n    polygon.closePath = this.closePath;\n\n    return polygon;\n  }\n\n  /**\n   * Checks whether the x and y coordinates passed to this function are contained within this polygon.\n   * @param x - The X coordinate of the point to test.\n   * @param y - The Y coordinate of the point to test.\n   * @returns - Whether the x/y coordinates are within this polygon.\n   */\n  contains (x: number, y: number): boolean {\n    let inside = false;\n\n    // use some raycasting to test hits\n    // https://github.com/substack/point-in-polygon/blob/master/index.js\n    const length = this.points.length / 2;\n\n    for (let i = 0, j = length - 1; i < length; j = i++) {\n      const xi = this.points[i * 2];\n      const yi = this.points[(i * 2) + 1];\n      const xj = this.points[j * 2];\n      const yj = this.points[(j * 2) + 1];\n      const intersect = ((yi > y) !== (yj > y)) && (x < ((xj - xi) * ((y - yi) / (yj - yi))) + xi);\n\n      if (intersect) {\n        inside = !inside;\n      }\n    }\n\n    return inside;\n  }\n\n  /**\n   * Copies another polygon to this one.\n   * @param polygon - The polygon to copy from.\n   * @returns Returns itself.\n   */\n  copyFrom (polygon: Polygon): this {\n    this.points = polygon.points.slice();\n    this.closePath = polygon.closePath;\n\n    return this;\n  }\n\n  /**\n   * Copies this polygon to another one.\n   * @param polygon - The polygon to copy to.\n   * @returns Returns given parameter.\n   */\n  copyTo (polygon: Polygon): Polygon {\n    polygon.copyFrom(this);\n\n    return polygon;\n  }\n\n  /**\n   * Get the last X coordinate of the polygon\n   * @readonly\n   */\n  get lastX (): number {\n    return this.points[this.points.length - 2];\n  }\n\n  /**\n   * Get the last Y coordinate of the polygon\n   * @readonly\n   */\n  get lastY (): number {\n    return this.points[this.points.length - 1];\n  }\n\n  /**\n   * Get the first X coordinate of the polygon\n   * @readonly\n   */\n  getX (): number {\n    return this.points[this.points.length - 2];\n  }\n  /**\n   * Get the first Y coordinate of the polygon\n   * @readonly\n   */\n  getY (): number {\n    return this.points[this.points.length - 1];\n  }\n\n  override build (points: number[]): void {\n    for (let i = 0; i < this.points.length; i++) {\n      points[i] = this.points[i];\n    }\n  }\n\n  override triangulate (points: number[], vertices: number[], verticesOffset: number, indices: number[], indicesOffset: number): void {\n    const triangles = triangulate([points]);\n    const indexStart = vertices.length / 2;\n\n    // 当所有 points 在一条直线时, gluTess 三角化 triangles 会返回空数组，这边做一下额外处理返回线段左右端点组成的三角形，确保拿到的包围盒是正确的。\n    if (triangles.length === 0) {\n      this.getLineEndPointsTriangle(points, triangles);\n    }\n\n    for (let i = 0; i < triangles.length; i++) {\n      vertices[verticesOffset * 2 + i] = triangles[i];\n    }\n\n    const vertexCount = triangles.length / 2;\n\n    for (let i = 0; i < vertexCount; i++) {\n      indices[indicesOffset + i] = indexStart + i;\n    }\n  }\n\n  /**\n   * 获取直线上最远的两个端点坐标组成的三角形\n   */\n  private getLineEndPointsTriangle (points: number[], triangles: number[]): void {\n    // 参数检查\n    if (!points || points.length < 2 || points.length % 2 !== 0) {\n\n      throw new Error('Invalid points array');\n    }\n\n    if (points.length === 2) {\n      triangles.push(\n        points[0], points[1],\n        points[0], points[1],\n        points[0], points[1]\n      );\n\n      return;\n    }\n\n    // 取第一个线段计算斜率\n    const dx = points[2] - points[0];\n    const dy = points[3] - points[1];\n\n    // 存放结果坐标\n    let startX = points[0];\n    let startY = points[1];\n    let endX = points[0];\n    let endY = points[1];\n\n    // 根据斜率决定比较x还是y\n    if (Math.abs(dx) >= Math.abs(dy)) {\n      // 水平方向为主,比较x坐标\n      for (let i = 0; i < points.length; i += 2) {\n        const x = points[i];\n        const y = points[i + 1];\n\n        if (x < startX) {\n          startX = x;\n          startY = y;\n        }\n        if (x > endX) {\n          endX = x;\n          endY = y;\n        }\n      }\n    } else {\n      // 垂直方向为主,比较y坐标\n      for (let i = 0; i < points.length; i += 2) {\n        const x = points[i];\n        const y = points[i + 1];\n\n        if (y < startY) {\n          startX = x;\n          startY = y;\n        }\n        if (y > endY) {\n          endX = x;\n          endY = y;\n        }\n      }\n    }\n    triangles.push(startX, startY, endX, endY, endX, endY);\n  }\n}\n\n","// thanks to https://github.com/mattdesl/adaptive-bezier-curve\n// for the original code!\n\nconst RECURSION_LIMIT = 8;\nconst FLT_EPSILON = 1.19209290e-7;\nconst PATH_DISTANCE_EPSILON = 1.0;\n\nconst curveAngleToleranceEpsilon = 0.01;\nconst mAngleTolerance = 0;\nconst mCuspLimit = 0;\n\nconst defaultBezierSmoothness = 0.5;\n\nexport function buildAdaptiveBezier (\n  points: number[],\n  sX: number, sY: number,\n  cp1x: number, cp1y: number,\n  cp2x: number, cp2y: number,\n  eX: number, eY: number,\n  smoothness?: number,\n) {\n  // TODO expose as a parameter\n  const scale = 5;\n  const smoothing = Math.min(\n    0.99, // a value of 1.0 actually inverts smoothing, so we cap it at 0.99\n    Math.max(0, smoothness ?? defaultBezierSmoothness)\n  );\n  let distanceTolerance = (PATH_DISTANCE_EPSILON - smoothing) / scale;\n\n  distanceTolerance *= distanceTolerance;\n  begin(sX, sY, cp1x, cp1y, cp2x, cp2y, eX, eY, points, distanceTolerance);\n\n  return points;\n}\n\n//// Based on:\n//// https://github.com/pelson/antigrain/blob/master/agg-2.4/src/agg_curves.cpp\n\nfunction begin (\n  sX: number, sY: number,\n  cp1x: number, cp1y: number,\n  cp2x: number, cp2y: number,\n  eX: number, eY: number,\n  points: number[],\n  distanceTolerance: number,\n) {\n  // dont need to actually ad this!\n  // points.push(sX, sY);\n  recursive(sX, sY, cp1x, cp1y, cp2x, cp2y, eX, eY, points, distanceTolerance, 0);\n  points.push(eX, eY);\n}\n\n// eslint-disable-next-line max-params\nfunction recursive (\n  x1: number, y1: number,\n  x2: number, y2: number,\n  x3: number, y3: number,\n  x4: number, y4: number,\n  points: number[],\n  distanceTolerance: number,\n  level: number,\n) {\n  if (level > RECURSION_LIMIT) { return; }\n\n  const pi = Math.PI;\n\n  // Calculate all the mid-points of the line segments\n  // ----------------------\n  const x12 = (x1 + x2) / 2;\n  const y12 = (y1 + y2) / 2;\n  const x23 = (x2 + x3) / 2;\n  const y23 = (y2 + y3) / 2;\n  const x34 = (x3 + x4) / 2;\n  const y34 = (y3 + y4) / 2;\n  const x123 = (x12 + x23) / 2;\n  const y123 = (y12 + y23) / 2;\n  const x234 = (x23 + x34) / 2;\n  const y234 = (y23 + y34) / 2;\n  const x1234 = (x123 + x234) / 2;\n  const y1234 = (y123 + y234) / 2;\n\n  if (level > 0) { // Enforce subdivision first time\n    // Try to approximate the full cubic curve by a single straight line\n    // ------------------\n    let dx = x4 - x1;\n    let dy = y4 - y1;\n\n    const d2 = Math.abs(((x2 - x4) * dy) - ((y2 - y4) * dx));\n    const d3 = Math.abs(((x3 - x4) * dy) - ((y3 - y4) * dx));\n\n    let da1; let da2;\n\n    if (d2 > FLT_EPSILON && d3 > FLT_EPSILON) {\n      // Regular care\n      // -----------------\n      if ((d2 + d3) * (d2 + d3) <= distanceTolerance * ((dx * dx) + (dy * dy))) {\n        // If the curvature doesn't exceed the distanceTolerance value\n        // we tend to finish subdivisions.\n        // ----------------------\n        if (mAngleTolerance < curveAngleToleranceEpsilon) {\n          points.push(x1234, y1234);\n\n          return;\n        }\n\n        // Angle & Cusp Condition\n        // ----------------------\n        const a23 = Math.atan2(y3 - y2, x3 - x2);\n\n        da1 = Math.abs(a23 - Math.atan2(y2 - y1, x2 - x1));\n        da2 = Math.abs(Math.atan2(y4 - y3, x4 - x3) - a23);\n\n        if (da1 >= pi) { da1 = (2 * pi) - da1; }\n        if (da2 >= pi) { da2 = (2 * pi) - da2; }\n\n        if (da1 + da2 < mAngleTolerance) {\n          // Finally we can stop the recursion\n          // ----------------------\n          points.push(x1234, y1234);\n\n          return;\n        }\n\n        if (mCuspLimit !== 0.0) {\n          if (da1 > mCuspLimit) {\n            points.push(x2, y2);\n\n            return;\n          }\n\n          if (da2 > mCuspLimit) {\n            points.push(x3, y3);\n\n            return;\n          }\n        }\n      }\n    } else if (d2 > FLT_EPSILON) {\n      // p1,p3,p4 are collinear, p2 is considerable\n      // ----------------------\n      if (d2 * d2 <= distanceTolerance * ((dx * dx) + (dy * dy))) {\n        if (mAngleTolerance < curveAngleToleranceEpsilon) {\n          points.push(x1234, y1234);\n\n          return;\n        }\n\n        // Angle Condition\n        // ----------------------\n        da1 = Math.abs(Math.atan2(y3 - y2, x3 - x2) - Math.atan2(y2 - y1, x2 - x1));\n        if (da1 >= pi) { da1 = (2 * pi) - da1; }\n\n        if (da1 < mAngleTolerance) {\n          points.push(x2, y2);\n          points.push(x3, y3);\n\n          return;\n        }\n\n        if (mCuspLimit !== 0.0) {\n          if (da1 > mCuspLimit) {\n            points.push(x2, y2);\n\n            return;\n          }\n        }\n      }\n    } else if (d3 > FLT_EPSILON) {\n      // p1,p2,p4 are collinear, p3 is considerable\n      // ----------------------\n      if (d3 * d3 <= distanceTolerance * ((dx * dx) + (dy * dy))) {\n        if (mAngleTolerance < curveAngleToleranceEpsilon) {\n          points.push(x1234, y1234);\n\n          return;\n        }\n\n        // Angle Condition\n        // ----------------------\n        da1 = Math.abs(Math.atan2(y4 - y3, x4 - x3) - Math.atan2(y3 - y2, x3 - x2));\n        if (da1 >= pi) { da1 = (2 * pi) - da1; }\n\n        if (da1 < mAngleTolerance) {\n          points.push(x2, y2);\n          points.push(x3, y3);\n\n          return;\n        }\n\n        if (mCuspLimit !== 0.0) {\n          if (da1 > mCuspLimit) {\n            points.push(x3, y3);\n\n            return;\n          }\n        }\n      }\n    } else {\n      // Collinear case\n      // -----------------\n      dx = x1234 - ((x1 + x4) / 2);\n      dy = y1234 - ((y1 + y4) / 2);\n      if ((dx * dx) + (dy * dy) <= distanceTolerance) {\n        points.push(x1234, y1234);\n\n        return;\n      }\n    }\n  }\n\n  // Continue subdivision\n  // ----------------------\n  recursive(x1, y1, x12, y12, x123, y123, x1234, y1234, points, distanceTolerance, level + 1);\n  recursive(x1234, y1234, x234, y234, x34, y34, x4, y4, points, distanceTolerance, level + 1);\n}\n\n","// Based on:\n// https://github.com/pixijs/pixijs/blob/dev/src/maths/shapes/Ellipse.ts\n\nimport { ShapePrimitive } from './shape-primitive';\n\n/**\n * The Ellipse object is used to help draw graphics and can also be used to specify a hit area for containers.\n */\nexport class Ellipse extends ShapePrimitive {\n  /**\n   * The X coordinate of the center of this ellipse\n   * @default 0\n   */\n  x: number;\n\n  /**\n   * The Y coordinate of the center of this ellipse\n   * @default 0\n   */\n  y: number;\n\n  /**\n   * The half width of this ellipse\n   * @default 0\n   */\n  halfWidth: number;\n\n  /**\n   * The half height of this ellipse\n   * @default 0\n   */\n  halfHeight: number;\n\n  /**\n   * The type of the object, mainly used to avoid `instanceof` checks\n   * @default 'ellipse'\n   */\n  readonly type = 'ellipse';\n\n  /**\n   * @param x - The X coordinate of the center of this ellipse\n   * @param y - The Y coordinate of the center of this ellipse\n   * @param halfWidth - The half width of this ellipse\n   * @param halfHeight - The half height of this ellipse\n   */\n  constructor (x = 0, y = 0, halfWidth = 0, halfHeight = 0) {\n    super();\n    this.x = x;\n    this.y = y;\n    this.halfWidth = halfWidth;\n    this.halfHeight = halfHeight;\n  }\n\n  /**\n   * Creates a clone of this Ellipse instance\n   * @returns {Ellipse} A copy of the ellipse\n   */\n  clone (): Ellipse {\n    return new Ellipse(this.x, this.y, this.halfWidth, this.halfHeight);\n  }\n\n  /**\n   * Checks whether the x and y coordinates given are contained within this ellipse\n   * @param x - The X coordinate of the point to test\n   * @param y - The Y coordinate of the point to test\n   * @returns Whether the x/y coords are within this ellipse\n   */\n  contains (x: number, y: number): boolean {\n    if (this.halfWidth <= 0 || this.halfHeight <= 0) {\n      return false;\n    }\n\n    // normalize the coords to an ellipse with center 0,0\n    let normx = ((x - this.x) / this.halfWidth);\n    let normy = ((y - this.y) / this.halfHeight);\n\n    normx *= normx;\n    normy *= normy;\n\n    return (normx + normy <= 1);\n  }\n\n  /**\n   * Checks whether the x and y coordinates given are contained within this ellipse including stroke\n   * @param x - The X coordinate of the point to test\n   * @param y - The Y coordinate of the point to test\n   * @param width\n   * @returns Whether the x/y coords are within this ellipse\n   */\n  strokeContains (x: number, y: number, width: number): boolean {\n    const { halfWidth, halfHeight } = this;\n\n    if (halfWidth <= 0 || halfHeight <= 0) {\n      return false;\n    }\n\n    const halfStrokeWidth = width / 2;\n    const innerA = halfWidth - halfStrokeWidth;\n    const innerB = halfHeight - halfStrokeWidth;\n    const outerA = halfWidth + halfStrokeWidth;\n    const outerB = halfHeight + halfStrokeWidth;\n\n    const normalizedX = x - this.x;\n    const normalizedY = y - this.y;\n\n    const innerEllipse = ((normalizedX * normalizedX) / (innerA * innerA))\n      + ((normalizedY * normalizedY) / (innerB * innerB));\n    const outerEllipse = ((normalizedX * normalizedX) / (outerA * outerA))\n      + ((normalizedY * normalizedY) / (outerB * outerB));\n\n    return innerEllipse > 1 && outerEllipse <= 1;\n  }\n\n  /**\n   * Returns the framing rectangle of the ellipse as a Rectangle object\n   * @param out\n   * @returns The framing rectangle\n   */\n  //   getBounds (out?: Rectangle): Rectangle {\n  //     out = out || new Rectangle();\n\n  //     out.x = this.x - this.halfWidth;\n  //     out.y = this.y - this.halfHeight;\n  //     out.width = this.halfWidth * 2;\n  //     out.height = this.halfHeight * 2;\n\n  //     return out;\n  //   }\n\n  /**\n   * Copies another ellipse to this one.\n   * @param ellipse - The ellipse to copy from.\n   * @returns Returns itself.\n   */\n  copyFrom (ellipse: Ellipse): this {\n    this.x = ellipse.x;\n    this.y = ellipse.y;\n    this.halfWidth = ellipse.halfWidth;\n    this.halfHeight = ellipse.halfHeight;\n\n    return this;\n  }\n\n  /**\n   * Copies this ellipse to another one.\n   * @param ellipse - The ellipse to copy to.\n   * @returns Returns given parameter.\n   */\n  copyTo (ellipse: Ellipse): Ellipse {\n    ellipse.copyFrom(this);\n\n    return ellipse;\n  }\n\n  getX (): number {\n    return this.x;\n  }\n\n  getY (): number {\n    return this.y;\n  }\n\n  build (points: number[]) {\n    const x = this.x;\n    const y = this.y;\n    const rx = this.halfWidth;\n    const ry = this.halfHeight;\n    const dx = 0;\n    const dy = 0;\n\n    if (!(rx >= 0 && ry >= 0 && dx >= 0 && dy >= 0)) {\n      return points;\n    }\n\n    // Choose a number of segments such that the maximum absolute deviation from the circle is approximately 0.029\n    const sampleDensity = 5;\n    const n = Math.ceil(sampleDensity * Math.sqrt(rx + ry));\n    const m = (n * 8) + (dx ? 4 : 0) + (dy ? 4 : 0);\n\n    if (m === 0) {\n      return points;\n    }\n\n    if (n === 0) {\n      points[0] = points[6] = x + dx;\n      points[1] = points[3] = y + dy;\n      points[2] = points[4] = x - dx;\n      points[5] = points[7] = y - dy;\n\n      return points;\n    }\n\n    let j1 = 0;\n    let j2 = (n * 4) + (dx ? 2 : 0) + 2;\n    let j3 = j2;\n    let j4 = m;\n\n    let x0 = dx + rx;\n    let y0 = dy;\n    let x1 = x + x0;\n    let x2 = x - x0;\n    let y1 = y + y0;\n\n    points[j1++] = x1;\n    points[j1++] = y1;\n    points[--j2] = y1;\n    points[--j2] = x2;\n\n    if (dy) {\n      const y2 = y - y0;\n\n      points[j3++] = x2;\n      points[j3++] = y2;\n      points[--j4] = y2;\n      points[--j4] = x1;\n    }\n\n    for (let i = 1; i < n; i++) {\n      const a = Math.PI / 2 * (i / n);\n      const x0 = dx + (Math.cos(a) * rx);\n      const y0 = dy + (Math.sin(a) * ry);\n      const x1 = x + x0;\n      const x2 = x - x0;\n      const y1 = y + y0;\n      const y2 = y - y0;\n\n      points[j1++] = x1;\n      points[j1++] = y1;\n      points[--j2] = y1;\n      points[--j2] = x2;\n      points[j3++] = x2;\n      points[j3++] = y2;\n      points[--j4] = y2;\n      points[--j4] = x1;\n    }\n\n    x0 = dx;\n    y0 = dy + ry;\n    x1 = x + x0;\n    x2 = x - x0;\n    y1 = y + y0;\n    const y2 = y - y0;\n\n    points[j1++] = x1;\n    points[j1++] = y1;\n    points[--j4] = y2;\n    points[--j4] = x1;\n\n    if (dx) {\n      points[j1++] = x2;\n      points[j1++] = y1;\n      points[--j4] = y2;\n      points[--j4] = x2;\n    }\n\n    return points;\n  }\n\n  triangulate (points: number[], vertices: number[], verticesOffset: number, indices: number[], indicesOffset: number) {\n    if (points.length === 0) {\n      return;\n    }\n\n    // Compute center (average of all points)\n    let centerX = 0; let\n      centerY = 0;\n\n    for (let i = 0; i < points.length; i += 2) {\n      centerX += points[i];\n      centerY += points[i + 1];\n    }\n    centerX /= (points.length / 2);\n    centerY /= (points.length / 2);\n\n    // Set center vertex\n    let count = verticesOffset;\n\n    vertices[count * 2] = centerX;\n    vertices[(count * 2) + 1] = centerY;\n    const centerIndex = count++;\n\n    // Set edge vertices and indices\n    for (let i = 0; i < points.length; i += 2) {\n      vertices[count * 2] = points[i];\n      vertices[(count * 2) + 1] = points[i + 1];\n\n      if (i > 0) { // Skip first point for indices\n        indices[indicesOffset++] = count;\n        indices[indicesOffset++] = centerIndex;\n        indices[indicesOffset++] = count - 1;\n      }\n      count++;\n    }\n\n    // Connect last point to the first edge point\n    indices[indicesOffset++] = centerIndex + 1;\n    indices[indicesOffset++] = centerIndex;\n    indices[indicesOffset++] = count - 1;\n  }\n}\n","// Based on:\n// https://github.com/airbnb/lottie-web/blob/master/player/js/utils/shapes/ShapeProperty.js\n\nimport { buildAdaptiveBezier } from './build-adaptive-bezier';\nimport { ShapePrimitive } from './shape-primitive';\nimport { triangulate } from './triangulate';\n\nexport enum StarType {\n  Star,\n  Polygon,\n}\n\nexport class PolyStar extends ShapePrimitive {\n  /**\n   * bezier 顶点\n   */\n  private v: number[] = [];\n  /**\n   * bezier 缓入点\n   */\n  private in: number[] = [];\n  /**\n   * bezier 缓出点\n   */\n  private out: number[] = [];\n\n  /**\n   *\n   * @param pointCount - 多边形顶点数量\n   * @param outerRadius - 外半径大小\n   * @param innerRadius - 内半径大小\n   * @param outerRoundness - 外顶点圆滑度百分比\n   * @param innerRoundness - 内顶点圆滑度百分比\n   * @param starType - PolyStar 类型\n   */\n  constructor (\n    public pointCount = 0,\n    public outerRadius = 0,\n    public innerRadius = 0,\n    public outerRoundness = 0,\n    public innerRoundness = 0,\n    public starType = StarType.Star,\n  ) {\n    super();\n  }\n\n  override clone (): ShapePrimitive {\n    const polyStar = new PolyStar(\n      this.pointCount,\n      this.outerRadius,\n      this.innerRadius,\n      this.outerRoundness,\n      this.innerRoundness,\n      this.starType\n    );\n\n    return polyStar;\n  }\n\n  override copyFrom (source: PolyStar): void {\n    this.pointCount = source.pointCount;\n    this.outerRadius = source.outerRadius;\n    this.innerRadius = source.innerRadius;\n    this.outerRoundness = source.outerRoundness;\n    this.innerRoundness = source.innerRoundness;\n    this.starType = source.starType;\n  }\n\n  override copyTo (destination: PolyStar): void {\n    destination.copyFrom(this);\n  }\n\n  override build (points: number[]): void {\n    switch (this.starType) {\n      case StarType.Star: {\n        this.buildStarPath();\n\n        break;\n      }\n      case StarType.Polygon: {\n        this.buildPolygonPath();\n\n        break;\n      }\n    }\n\n    const smoothness = 1;\n\n    for (let i = 0; i < this.v.length - 2; i += 2) {\n      buildAdaptiveBezier(\n        points,\n        this.v[i], this.v[i + 1],\n        this.out[i], this.out[i + 1], this.in[i + 2], this.in[i + 3], this.v[i + 2], this.v[i + 3],\n        smoothness\n      );\n    }\n\n    // draw last curve\n    const lastIndex = this.v.length - 1;\n\n    buildAdaptiveBezier(\n      points,\n      this.v[lastIndex - 1], this.v[lastIndex],\n      this.out[lastIndex - 1], this.out[lastIndex], this.in[0], this.in[1], this.v[0], this.v[1],\n      smoothness\n    );\n\n  }\n\n  override triangulate (points: number[], vertices: number[], verticesOffset: number, indices: number[], indicesOffset: number): void {\n    const triangles = triangulate([points]);\n    const indexStart = vertices.length / 2;\n\n    for (let i = 0; i < triangles.length; i++) {\n      vertices[verticesOffset * 2 + i] = triangles[i];\n    }\n\n    const vertexCount = triangles.length / 2;\n\n    for (let i = 0; i < vertexCount; i++) {\n      indices[indicesOffset + i] = indexStart + i;\n    }\n  }\n\n  private buildStarPath () {\n    this.v = [];\n    this.in = [];\n    this.out = [];\n\n    const numPts = Math.floor(this.pointCount) * 2;\n    const angle = (Math.PI * 2) / numPts;\n    let longFlag = true;\n    const longRad = this.outerRadius;\n    const shortRad = this.innerRadius;\n    const longRound = this.outerRoundness / 100;\n    const shortRound = this.innerRoundness / 100;\n    const longPerimSegment = (2 * Math.PI * longRad) / (numPts * 2);\n    const shortPerimSegment = (2 * Math.PI * shortRad) / (numPts * 2);\n    let i;\n    let rad;\n    let roundness;\n    let perimSegment;\n    let currentAng = -Math.PI / 2;\n\n    const dir = 1;\n\n    for (i = 0; i < numPts; i++) {\n      rad = longFlag ? longRad : shortRad;\n      roundness = longFlag ? longRound : shortRound;\n      perimSegment = longFlag ? longPerimSegment : shortPerimSegment;\n      const x = rad * Math.cos(currentAng);\n      const y = rad * Math.sin(currentAng);\n      const ox = x === 0 && y === 0 ? 0 : y / Math.sqrt(x * x + y * y);\n      const oy = x === 0 && y === 0 ? 0 : -x / Math.sqrt(x * x + y * y);\n      const offset = i * 2;\n\n      this.v[offset] = x;\n      this.v[offset + 1] = y;\n      this.in[offset] = x + ox * perimSegment * roundness * dir;\n      this.in[offset + 1] = y + oy * perimSegment * roundness * dir;\n      this.out[offset] = x - ox * perimSegment * roundness * dir;\n      this.out[offset + 1] = y - oy * perimSegment * roundness * dir;\n      longFlag = !longFlag;\n      currentAng += angle * dir;\n    }\n  }\n\n  private buildPolygonPath () {\n    this.v = [];\n    this.in = [];\n    this.out = [];\n\n    const numPts = Math.floor(this.pointCount);\n    const angle = (Math.PI * 2) / numPts;\n    const rad = this.outerRadius;\n    const roundness = this.outerRoundness / 100;\n    const perimSegment = (2 * Math.PI * rad) / (numPts * 4);\n    let i;\n    let currentAng = -Math.PI * 0.5;\n    const dir = 1;\n\n    for (i = 0; i < numPts; i++) {\n      const x = rad * Math.cos(currentAng);\n      const y = rad * Math.sin(currentAng);\n      const ox = x === 0 && y === 0 ? 0 : y / Math.sqrt(x * x + y * y);\n      const oy = x === 0 && y === 0 ? 0 : -x / Math.sqrt(x * x + y * y);\n\n      const offset = i * 2;\n\n      this.v[offset] = x;\n      this.v[offset + 1] = y;\n      this.in[offset] = x + ox * perimSegment * roundness * dir;\n      this.in[offset + 1] = y + oy * perimSegment * roundness * dir;\n      this.out[offset] = x - ox * perimSegment * roundness * dir;\n      this.out[offset + 1] = y - oy * perimSegment * roundness * dir;\n      currentAng += angle * dir;\n    }\n  }\n}\n","// Based on:\n// https://github.com/pixijs/pixijs/blob/dev/src/maths/shapes/RoundedRectangle.ts\n\nimport { ShapePrimitive } from './shape-primitive';\n\n/**\n * The `Rectangle` object is an area defined by its position, as indicated by its top-left corner\n * point (`x`, `y`) and by its `width` and its `height`, including a `roundness` property that\n * defines the roundness of the rounded corners.\n * @memberof maths\n */\nexport class Rectangle extends ShapePrimitive {\n  /**\n   * The X coordinate of the upper-left corner of the rectangle\n   */\n  x: number;\n\n  /**\n   * The Y coordinate of the upper-left corner of the rectangle\n   */\n  y: number;\n\n  /**\n   * The overall width of this rectangle\n   */\n  width: number;\n\n  /**\n   * The overall height of this rectangle\n   */\n  height: number;\n\n  /**\n   * Controls the roundness of the rounded corners\n   */\n  roundness: number;\n\n  /**\n   * @param x - The X coordinate of the upper-left corner of the rectangle\n   * @param y - The Y coordinate of the upper-left corner of the rectangle\n   * @param width - The overall width of this rectangle\n   * @param height - The overall height of this rectangle\n   * @param roundness - Controls the roundness of the rounded corners\n   */\n  constructor (x = 0, y = 0, width = 0, height = 0, roundness = 20) {\n    super();\n    this.x = x;\n    this.y = y;\n    this.width = width;\n    this.height = height;\n    this.roundness = roundness;\n  }\n\n  /**\n   * Returns the framing rectangle of the rectangle as a Rectangle object\n   * @param out - optional rectangle to store the result\n   * @returns The framing rectangle\n   */\n  getBounds (out?: Rectangle): Rectangle {\n    out = out || new Rectangle();\n\n    out.x = this.x;\n    out.y = this.y;\n    out.width = this.width;\n    out.height = this.height;\n\n    return out;\n  }\n\n  /**\n   * Creates a clone of this rectangle.\n   * @returns - A copy of the rectangle.\n   */\n  clone (): Rectangle {\n    return new Rectangle(this.x, this.y, this.width, this.height, this.roundness);\n  }\n\n  /**\n   * Copies another rectangle to this one.\n   * @param rectangle - The rectangle to copy from.\n   * @returns Returns itself.\n   */\n  copyFrom (rectangle: Rectangle): this {\n    this.x = rectangle.x;\n    this.y = rectangle.y;\n    this.width = rectangle.width;\n    this.height = rectangle.height;\n    this.roundness = rectangle.roundness;\n\n    return this;\n  }\n\n  /**\n   * Copies this rectangle to another one.\n   * @param rectangle - The rectangle to copy to.\n   * @returns Returns given parameter.\n   */\n  copyTo (rectangle: Rectangle): Rectangle {\n    rectangle.copyFrom(this);\n\n    return rectangle;\n  }\n\n  override build (points: number[]): void {\n    let ry;\n\n    const halfWidth = this.width / 2;\n    const halfHeight = this.height / 2;\n\n    const x = this.x + halfWidth;\n    const y = this.y + halfHeight;\n    const rx = ry = Math.max(0, Math.min(this.roundness / 100, 1) * Math.min(halfWidth, halfHeight));\n    const dx = halfWidth - rx;\n    const dy = halfHeight - ry;\n\n    if (!(rx >= 0 && ry >= 0 && dx >= 0 && dy >= 0)) {\n      return;\n    }\n\n    // 控制边缘的平滑程度\n    const densityScale = 5;\n    // Choose a number of segments such that the maximum absolute deviation from the circle is approximately 0.029\n    const n = densityScale * Math.ceil(2.3 * Math.sqrt(rx + ry));\n    const m = (n * 8) + (dx ? 4 : 0) + (dy ? 4 : 0);\n\n    if (m === 0) {\n      return;\n    }\n\n    if (n === 0) {\n      points[0] = points[6] = x + dx;\n      points[1] = points[3] = y + dy;\n      points[2] = points[4] = x - dx;\n      points[5] = points[7] = y - dy;\n\n      return;\n    }\n\n    let j1 = 0;\n    let j2 = (n * 4) + (dx ? 2 : 0) + 2;\n    let j3 = j2;\n    let j4 = m;\n\n    let x0 = dx + rx;\n    let y0 = dy;\n    let x1 = x + x0;\n    let x2 = x - x0;\n    let y1 = y + y0;\n\n    points[j1++] = x1;\n    points[j1++] = y1;\n    points[--j2] = y1;\n    points[--j2] = x2;\n\n    if (dy) {\n      const y2 = y - y0;\n\n      points[j3++] = x2;\n      points[j3++] = y2;\n      points[--j4] = y2;\n      points[--j4] = x1;\n    }\n\n    for (let i = 1; i < n; i++) {\n      const a = Math.PI / 2 * (i / n);\n      const x0 = dx + (Math.cos(a) * rx);\n      const y0 = dy + (Math.sin(a) * ry);\n      const x1 = x + x0;\n      const x2 = x - x0;\n      const y1 = y + y0;\n      const y2 = y - y0;\n\n      points[j1++] = x1;\n      points[j1++] = y1;\n      points[--j2] = y1;\n      points[--j2] = x2;\n      points[j3++] = x2;\n      points[j3++] = y2;\n      points[--j4] = y2;\n      points[--j4] = x1;\n    }\n\n    x0 = dx;\n    y0 = dy + ry;\n    x1 = x + x0;\n    x2 = x - x0;\n    y1 = y + y0;\n    const y2 = y - y0;\n\n    points[j1++] = x1;\n    points[j1++] = y1;\n    points[--j4] = y2;\n    points[--j4] = x1;\n\n    if (dx) {\n      points[j1++] = x2;\n      points[j1++] = y1;\n      points[--j4] = y2;\n      points[--j4] = x2;\n    }\n  }\n\n  override triangulate (points: number[], vertices: number[], verticesOffset: number, indices: number[], indicesOffset: number): void {\n    if (points.length === 0) {\n      return;\n    }\n\n    // Compute center (average of all points)\n    let centerX = 0; let\n      centerY = 0;\n\n    for (let i = 0; i < points.length; i += 2) {\n      centerX += points[i];\n      centerY += points[i + 1];\n    }\n    centerX /= (points.length / 2);\n    centerY /= (points.length / 2);\n\n    // Set center vertex\n    let count = verticesOffset;\n\n    vertices[count * 2] = centerX;\n    vertices[(count * 2) + 1] = centerY;\n    const centerIndex = count++;\n\n    // Set edge vertices and indices\n    for (let i = 0; i < points.length; i += 2) {\n      vertices[count * 2] = points[i];\n      vertices[(count * 2) + 1] = points[i + 1];\n\n      if (i > 0) { // Skip first point for indices\n        indices[indicesOffset++] = count;\n        indices[indicesOffset++] = centerIndex;\n        indices[indicesOffset++] = count - 1;\n      }\n      count++;\n    }\n\n    // Connect last point to the first edge point\n    indices[indicesOffset++] = centerIndex + 1;\n    indices[indicesOffset++] = centerIndex;\n    indices[indicesOffset++] = count - 1;\n  }\n}\n","// Based on:\n// https://github.com/pixijs/pixijs/blob/dev/src/scene/graphics/shared/path/ShapePath.ts\n\nimport type { Matrix4 } from '@galacean/effects-math/es/core/matrix4';\nimport { Polygon } from './polygon';\nimport { buildAdaptiveBezier } from './build-adaptive-bezier';\nimport type { GraphicsPath } from './graphics-path';\nimport type { ShapePrimitive } from './shape-primitive';\nimport { Ellipse } from './ellipse';\nimport type { StarType } from './poly-star';\nimport { PolyStar } from './poly-star';\nimport { Rectangle } from './rectangle';\n\nexport class ShapePath {\n  currentPoly: Polygon | null = null;\n  shapePrimitives: { shape: ShapePrimitive, transform?: Matrix4 }[] = [];\n\n  constructor (\n    private graphicsPath: GraphicsPath,\n  ) { }\n\n  /** Builds the path. */\n  buildPath () {\n    this.currentPoly = null;\n    this.shapePrimitives.length = 0;\n    const path = this.graphicsPath;\n\n    for (const instruction of path.instructions) {\n      const action = instruction.action;\n      const data = instruction.data;\n\n      switch (action) {\n        case 'bezierCurveTo': {\n          this.bezierCurveTo(data[0], data[1], data[2], data[3], data[4], data[5], data[6]);\n\n          break;\n        }\n        case 'moveTo': {\n          this.moveTo(data[0], data[1]);\n\n          break;\n        }\n        case 'ellipse': {\n          this.ellipse(data[0], data[1], data[2], data[3], data[4]);\n\n          break;\n        }\n        case 'polyStar': {\n          this.polyStar(data[0], data[1], data[2], data[3], data[4], data[5], data[6]);\n\n          break;\n        }\n        case 'rect': {\n          this.rect(data[0], data[1], data[2], data[3], data[4]);\n\n          break;\n        }\n        case 'closePath':{\n          this.closePath();\n\n          break;\n        }\n      }\n    }\n    this.endPoly();\n  }\n\n  /**\n   * Adds a cubic Bezier curve to the path.\n   * It requires three points: the first two are control points and the third one is the end point.\n   * The starting point is the last point in the current path.\n   * @param cp1x - The x-coordinate of the first control point.\n   * @param cp1y - The y-coordinate of the first control point.\n   * @param cp2x - The x-coordinate of the second control point.\n   * @param cp2y - The y-coordinate of the second control point.\n   * @param x - The x-coordinate of the end point.\n   * @param y - The y-coordinate of the end point.\n   * @param smoothness - Optional parameter to adjust the smoothness of the curve.\n   * @returns The instance of the current object for chaining.\n   */\n  bezierCurveTo (\n    cp1x: number, cp1y: number, cp2x: number, cp2y: number,\n    x: number, y: number,\n    smoothness?: number,\n  ): ShapePath {\n    this.ensurePoly();\n    const currentPoly = this.currentPoly as Polygon;\n\n    buildAdaptiveBezier(\n      currentPoly.points,\n      currentPoly.lastX, currentPoly.lastY,\n      cp1x, cp1y, cp2x, cp2y, x, y,\n      smoothness,\n    );\n\n    return this;\n  }\n\n  moveTo (x: number, y: number): ShapePath {\n    this.startPoly(x, y);\n\n    return this;\n  }\n\n  /**\n   * Closes the current path by drawing a straight line back to the start.\n   * If the shape is already closed or there are no points in the path, this method does nothing.\n   * @returns The instance of the current object for chaining.\n   */\n  closePath (): this {\n    this.endPoly(true);\n\n    return this;\n  }\n\n  /**\n   * Draws an ellipse at the specified location and with the given x and y radii.\n   * An optional transformation can be applied, allowing for rotation, scaling, and translation.\n   * @param x - The x-coordinate of the center of the ellipse.\n   * @param y - The y-coordinate of the center of the ellipse.\n   * @param radiusX - The horizontal radius of the ellipse.\n   * @param radiusY - The vertical radius of the ellipse.\n   * @param transform - An optional `Matrix` object to apply a transformation to the ellipse. This can include rotations.\n   * @returns The instance of the current object for chaining.\n   */\n  ellipse (x: number, y: number, radiusX: number, radiusY: number, transform?: Matrix4): this {\n    // TODO apply rotation to transform...\n\n    this.drawShape(new Ellipse(x, y, radiusX, radiusY), transform);\n\n    return this;\n  }\n\n  polyStar (pointCount: number, outerRadius: number, innerRadius: number, outerRoundness: number, innerRoundness: number, starType: StarType, transform?: Matrix4) {\n    this.drawShape(new PolyStar(pointCount, outerRadius, innerRadius, outerRoundness, innerRoundness, starType), transform);\n\n    return this;\n  }\n\n  /**\n   * Draws a rectangle shape. This method adds a new rectangle path to the current drawing.\n   * @param x - The x-coordinate of the upper-left corner of the rectangle.\n   * @param y - The y-coordinate of the upper-left corner of the rectangle.\n   * @param w - The width of the rectangle.\n   * @param h - The height of the rectangle.\n   * @param transform - An optional `Matrix` object to apply a transformation to the rectangle.\n   * @returns The instance of the current object for chaining.\n   */\n  rect (x: number, y: number, w: number, h: number, roundness: number, transform?: Matrix4): this {\n    this.drawShape(new Rectangle(x, y, w, h, roundness), transform);\n\n    return this;\n  }\n\n  /**\n   * Draws a given shape on the canvas.\n   * This is a generic method that can draw any type of shape specified by the `ShapePrimitive` parameter.\n   * An optional transformation matrix can be applied to the shape, allowing for complex transformations.\n   * @param shape - The shape to draw, defined as a `ShapePrimitive` object.\n   * @param matrix - An optional `Matrix` for transforming the shape. This can include rotations,\n   * scaling, and translations.\n   * @returns The instance of the current object for chaining.\n   */\n  drawShape (shape: ShapePrimitive, matrix?: Matrix4): this {\n    this.endPoly();\n\n    this.shapePrimitives.push({ shape, transform: matrix });\n\n    return this;\n  }\n\n  /**\n   * Starts a new polygon path from the specified starting point.\n   * This method initializes a new polygon or ends the current one if it exists.\n   * @param x - The x-coordinate of the starting point of the new polygon.\n   * @param y - The y-coordinate of the starting point of the new polygon.\n   * @returns The instance of the current object for chaining.\n   */\n  private startPoly (x: number, y: number): this {\n    let currentPoly = this.currentPoly;\n\n    if (currentPoly) {\n      this.endPoly();\n    }\n\n    currentPoly = new Polygon();\n\n    currentPoly.points.push(x, y);\n\n    this.currentPoly = currentPoly;\n\n    return this;\n  }\n\n  /**\n   * Ends the current polygon path. If `closePath` is set to true,\n   * the path is closed by connecting the last point to the first one.\n   * This method finalizes the current polygon and prepares it for drawing or adding to the shape primitives.\n   * @param closePath - A boolean indicating whether to close the polygon by connecting the last point\n   *  back to the starting point. False by default.\n   * @returns The instance of the current object for chaining.\n   */\n  private endPoly (closePath = false): this {\n    const shape = this.currentPoly;\n\n    if (shape && shape.points.length > 2) {\n      shape.closePath = closePath;\n\n      this.shapePrimitives.push({ shape });\n    }\n\n    this.currentPoly = null;\n\n    return this;\n  }\n\n  private ensurePoly (start = true): void {\n    if (this.currentPoly) { return; }\n\n    this.currentPoly = new Polygon();\n    this.currentPoly.points.push(0, 0);\n  }\n}\n","// Based on:\n// https://github.com/pixijs/pixijs/blob/dev/src/scene/graphics/shared/path/GraphicsPath.ts\n\nimport type { Matrix4 } from '@galacean/effects-math/es/core/matrix4';\nimport { ShapePath } from './shape-path';\nimport type { StarType } from './poly-star';\n\nexport class GraphicsPath {\n  instructions: PathInstruction[] = [];\n\n  private dirty = false;\n  private _shapePath: ShapePath;\n\n  /**\n   * Provides access to the internal shape path, ensuring it is up-to-date with the current instructions.\n   * @returns The `ShapePath` instance associated with this `GraphicsPath`.\n   */\n  get shapePath (): ShapePath {\n    if (!this._shapePath) {\n      this._shapePath = new ShapePath(this);\n    }\n\n    if (this.dirty) {\n      this.dirty = false;\n      this._shapePath.buildPath();\n    }\n\n    return this._shapePath;\n  }\n\n  /**\n   * Adds a cubic Bezier curve to the path.\n   * It requires three points: the first two are control points and the third one is the end point.\n   * The starting point is the last point in the current path.\n   * @param cp1x - The x-coordinate of the first control point.\n   * @param cp1y - The y-coordinate of the first control point.\n   * @param cp2x - The x-coordinate of the second control point.\n   * @param cp2y - The y-coordinate of the second control point.\n   * @param x - The x-coordinate of the end point.\n   * @param y - The y-coordinate of the end point.\n   * @param smoothness - Optional parameter to adjust the smoothness of the curve.\n   * @returns The instance of the current object for chaining.\n   */\n  bezierCurveTo (\n    cp1x: number, cp1y: number, cp2x: number, cp2y: number,\n    x: number, y: number,\n    smoothness?: number,\n  ): GraphicsPath {\n    this.instructions.push({ action: 'bezierCurveTo', data: [cp1x, cp1y, cp2x, cp2y, x, y, smoothness] });\n\n    this.dirty = true;\n\n    return this;\n  }\n\n  /**\n   * Sets the starting point for a new sub-path. Any subsequent drawing commands are considered part of this path.\n   * @param x - The x-coordinate for the starting point.\n   * @param y - The y-coordinate for the starting point.\n   * @returns The instance of the current object for chaining.\n   */\n  moveTo (x: number, y: number): GraphicsPath {\n    this.instructions.push({ action: 'moveTo', data: [x, y] });\n\n    this.dirty = true;\n\n    return this;\n  }\n\n  /**\n   * Closes the current path by drawing a straight line back to the start.\n   * If the shape is already closed or there are no points in the path, this method does nothing.\n   * @returns The instance of the current object for chaining.\n   */\n  closePath (): this {\n    this.instructions.push({ action: 'closePath', data: [] });\n\n    this.dirty = true;\n\n    return this;\n  }\n\n  /**\n   * Draws an ellipse at the specified location and with the given x and y radii.\n   * An optional transformation can be applied, allowing for rotation, scaling, and translation.\n   * @param x - The x-coordinate of the center of the ellipse.\n   * @param y - The y-coordinate of the center of the ellipse.\n   * @param radiusX - The horizontal radius of the ellipse.\n   * @param radiusY - The vertical radius of the ellipse.\n   * @param transform - An optional `Matrix` object to apply a transformation to the ellipse. This can include rotations.\n   * @returns The instance of the current object for chaining.\n   */\n  ellipse (x: number, y: number, radiusX: number, radiusY: number, transform?: Matrix4) {\n    this.instructions.push({ action: 'ellipse', data: [x, y, radiusX, radiusY, transform] });\n\n    this.dirty = true;\n\n    return this;\n  }\n\n  /**\n   * Draws a rectangle shape. This method adds a new rectangle path to the current drawing.\n   * @param x - The x-coordinate of the upper-left corner of the rectangle.\n   * @param y - The y-coordinate of the upper-left corner of the rectangle.\n   * @param w - The width of the rectangle.\n   * @param h - The height of the rectangle.\n   * @param transform - An optional `Matrix` object to apply a transformation to the rectangle.\n   * @returns The instance of the current object for chaining.\n   */\n  rect (x: number, y: number, w: number, h: number, roundness: number, transform?: Matrix4): this {\n    this.instructions.push({ action: 'rect', data: [x, y, w, h, roundness, transform] });\n\n    this.dirty = true;\n\n    return this;\n  }\n\n  polyStar (pointCount: number, outerRadius: number, innerRadius: number, outerRoundness: number, innerRoundness: number, starType: StarType, transform?: Matrix4) {\n    this.instructions.push({ action: 'polyStar', data: [pointCount, outerRadius, innerRadius, outerRoundness, innerRoundness, starType, transform] });\n\n    this.dirty = true;\n\n    return this;\n  }\n\n  clear (): GraphicsPath {\n    this.instructions.length = 0;\n    this.dirty = true;\n\n    return this;\n  }\n}\n\nexport interface PathInstruction {\n  action:\n  | 'moveTo'\n  | 'lineTo'\n  | 'quadraticCurveTo'\n  | 'bezierCurveTo'\n  | 'arc'\n  | 'closePath'\n  | 'addPath'\n  | 'arcTo'\n  | 'ellipse'\n  | 'rect'\n  | 'roundRect'\n  | 'arcToSvg'\n  | 'poly'\n  | 'circle'\n  | 'regularPoly'\n  | 'roundPoly'\n  | 'roundShape'\n  | 'filletRect'\n  | 'chamferRect'\n  | 'polyStar'\n  ,\n  data: any[],\n}\n","import { addItem, assertExist } from './utils';\nimport { getConfig, TEMPLATE_USE_OFFSCREEN_CANVAS } from './config';\n\nclass CanvasPool {\n  readonly elements: HTMLCanvasElement[] = [];\n\n  constructor () {\n  }\n\n  dispose () {\n    this.elements.forEach(e => e.remove());\n    // clearing the array\n    this.elements.length = 0;\n  }\n\n  getCanvas (): HTMLCanvasElement {\n    if (this.elements.length !== 0) {\n      const canvas = this.elements.shift();\n\n      assertExist(canvas);\n\n      return canvas;\n    }\n    if (getConfig(TEMPLATE_USE_OFFSCREEN_CANVAS)) {\n      return window._createOffscreenCanvas(10, 10);\n    } else {\n      // in hongmeng system, create too many canvas will case render error\n      const defCanvas = document.createElement('canvas');\n\n      defCanvas.getContext('2d', { willReadFrequently: true });\n\n      return defCanvas;\n    }\n  }\n\n  saveCanvas (canvas: HTMLCanvasElement) {\n    canvas.width = 1;\n    canvas.height = 1;\n    if (this.elements.length < 3) {\n      addItem(this.elements, canvas);\n    } else {\n      canvas.remove();\n    }\n  }\n}\n\nexport const canvasPool = new CanvasPool();\n","import * as spec from '@galacean/effects-specification';\nimport type { TextStyle } from './text-style';\nimport type { BaseLayout } from './base-layout';\n\nexport class TextLayout implements BaseLayout {\n  textVerticalAlign: spec.TextVerticalAlign;\n  textAlign: spec.TextAlignment;\n  letterSpace: number;\n  overflow: spec.TextOverflow;\n  width = 0;\n  height = 0;\n\n  /**\n   * 自适应宽高开关\n   */\n  autoWidth: boolean;\n\n  maxTextWidth: number;\n  /**\n   * 行高\n   */\n  lineHeight: number;\n\n  constructor (options: spec.TextContentOptions) {\n    this.update(options);\n  }\n\n  update (options: spec.TextContentOptions): void {\n    const {\n      textHeight = 100,\n      textWidth = 100,\n      textOverflow = spec.TextOverflow.clip,\n      textVerticalAlign = spec.TextVerticalAlign.top,\n      textAlign = spec.TextAlignment.left,\n      letterSpace = 0,\n      autoWidth = false,\n      fontSize,\n      lineHeight = fontSize,\n    } = options;\n\n    this.letterSpace = letterSpace;\n    this.overflow = textOverflow;\n    this.textVerticalAlign = textVerticalAlign;\n    this.textAlign = textAlign;\n    this.width = textWidth;\n    this.height = textHeight;\n\n    this.lineHeight = lineHeight;\n    this.autoWidth = autoWidth;\n  }\n\n  /**\n   * 获取初始的行高偏移值\n   * @param style - 字体基础数据\n   * @param lineCount - 渲染行数\n   * @param lineHeight - 渲染时的字体行高\n   * @param fontSize - 渲染时的字体大小\n   * @param totalLineHeight - 可选的实际总行高，用于替代默认计算\n   * @returns - 行高偏移值\n   */\n  getOffsetY (style: TextStyle, lineCount: number, lineHeight: number, fontSize: number, totalLineHeight?: number) {\n    const { fontScale } = style;\n    // /3 计算Y轴偏移量，以匹配编辑器行为\n    const offsetY = (lineHeight - fontSize) / 3;\n    // 计算基础偏移量\n    const baseOffset = fontSize;\n    const commonCalculation = totalLineHeight !== undefined ? totalLineHeight : lineHeight * (lineCount - 1);\n    let offsetResult = 0;\n\n    switch (this.textVerticalAlign) {\n      case spec.TextVerticalAlign.top:\n        offsetResult = baseOffset + offsetY;\n\n        break;\n      case spec.TextVerticalAlign.middle:\n        offsetResult = (this.height * fontScale - commonCalculation + baseOffset) / 2;\n\n        break;\n      case spec.TextVerticalAlign.bottom:\n        offsetResult = (this.height * fontScale - commonCalculation) - offsetY;\n\n        break;\n      default:\n        break;\n    }\n\n    return offsetResult;\n  }\n\n  /**\n   * 获取初始的水平偏移值\n   * @param style - 字体基础数据\n   * @param maxWidth - 最大行宽\n   * @returns - 水平偏移值\n   */\n  getOffsetX (style: TextStyle, maxWidth: number) {\n    let offsetX = 0;\n\n    switch (this.textAlign) {\n      case spec.TextAlignment.left:\n        offsetX = 0;\n\n        break;\n      case spec.TextAlignment.middle:\n        offsetX = (this.width * style.fontScale - maxWidth) / 2;\n\n        break;\n      case spec.TextAlignment.right:\n        offsetX = (this.width * style.fontScale - maxWidth);\n\n        break;\n      default:\n        break;\n    }\n\n    return offsetX;\n  }\n\n  /**\n   * 设置文本框的宽度和高度\n   * @param width - 文本框宽度\n   * @param height - 文本框高度\n   */\n  setSize (width: number, height: number) {\n    this.width = width;\n    this.height = height;\n  }\n}\n","import * as spec from '@galacean/effects-specification';\n\nexport class TextStyle {\n  /**\n   * 字重\n   */\n  textWeight: spec.TextWeight; // ttf\n  /**\n   * 字体样式\n   */\n  fontStyle: spec.FontStyle; // ttf\n  /**\n   * 是否有下划线（暂时无效）\n   */\n  isUnderline = false; // ttf\n  /**\n   * 下划线高度（暂时无效）\n   */\n  underlineHeight = 1; // ttf\n  /**\n   * 是否有外描边\n   */\n  isOutlined = false; // both // ttf & char\n  /**\n   * 外描边颜色\n   */\n  outlineColor: spec.vec4;// both // ttf & char\n  /**\n   * 外描边宽度\n   */\n  outlineWidth = 0; // both // ttf & char\n  /**\n   * 是否有阴影\n   */\n  hasShadow = false; // ttf\n  /**\n   * 阴影颜色\n   */\n  shadowColor: spec.vec4; // ttf\n  /**\n   * 阴影模糊\n   */\n  shadowBlur: number; // ttf\n  /**\n   * 阴影水平偏移距离\n   */\n  shadowOffsetX: number; // ttf\n  /**\n   * 阴影高度偏移距离\n   */\n  shadowOffsetY: number; // ttf\n\n  /**\n   * 文本颜色\n   */\n  textColor: spec.vec4; // both\n\n  /**\n   * 字体大小\n   */\n  fontSize: number; // input fonSize // both\n  // private maxFontSize = 100;\n\n  // isSystemFontUsed = false; // both // ttf & char\n\n  // font info // todo merge to font\n  fontFamily: string; // both\n  fontDesc = ''; // both\n\n  /**\n   * 字体倍数\n   */\n  fontScale = 2;\n\n  fontOffset = 0;\n\n  constructor (options: spec.TextContentOptions) {\n    this.update(options);\n  }\n\n  update (options: spec.TextContentOptions): void {\n    const { textColor = [1, 1, 1, 1], fontSize = 40, outline, shadow, fontWeight = 'normal', fontStyle = 'normal', fontFamily = 'sans-serif' } = options;\n\n    this.textColor = [...textColor];\n    //@ts-expect-error\n    this.textWeight = fontWeight;\n    //@ts-expect-error\n    this.fontStyle = fontStyle;\n    this.fontFamily = fontFamily;\n    this.fontSize = fontSize; // 暂时取消字号限制 Math.min(fontSize, this.maxFontSize);\n\n    // 重置描边状态\n    this.isOutlined = false;\n    this.outlineColor = [1, 1, 1, 1];\n    this.outlineWidth = 0;\n\n    if (outline && (outline.outlineWidth ?? 0) > 0) {\n      this.isOutlined = true;\n      this.outlineColor = [...(outline.outlineColor ?? [1, 1, 1, 1])];\n      this.outlineWidth = outline.outlineWidth ?? 0;\n    }\n\n    // 重置阴影状态\n    this.hasShadow = false;\n    this.shadowBlur = 2;\n    this.shadowColor = [0, 0, 0, 1];\n    this.shadowOffsetX = 0;\n    this.shadowOffsetY = 0;\n\n    if (shadow) {\n      this.hasShadow = true;\n      this.shadowBlur = shadow.shadowBlur ?? 2;\n      this.shadowColor = [...(shadow.shadowColor ?? [0, 0, 0, 1])];\n      this.shadowOffsetX = shadow.shadowOffsetX ?? 0;\n      this.shadowOffsetY = shadow.shadowOffsetY ?? 0;\n    }\n\n    // 重置字体偏移\n    this.fontOffset = 0;\n    if (this.fontStyle !== spec.FontStyle.normal) {\n      // 0.0174532925 = 3.141592653 / 180\n      this.fontOffset += this.fontSize * Math.tan(12 * 0.0174532925);\n    }\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport type { Engine } from '../../engine';\nimport type { Material } from '../../material';\nimport { Texture } from '../../texture';\nimport type { ItemRenderer } from '../../components';\nimport type { VFXItem } from '../../vfx-item';\nimport type { BaseLayout } from './base-layout';\nimport type { TextStyle } from './text-style';\nimport { glContext } from '../../gl';\nimport { isValidFontFamily } from '../../utils';\nimport { canvasPool } from '../../canvas-pool';\n\n/**\n * 纯文本组件特有 API\n */\nexport interface ITextComponent {\n  setOutlineWidth (value: number): void,\n  setOutlineEnabled (value: boolean): void,\n  setShadowBlur (value: number): void,\n  setShadowColor (value: spec.RGBAColorValue): void,\n  setShadowOffsetX (value: number): void,\n  setShadowOffsetY (value: number): void,\n  setAutoWidth (value: boolean): void,\n  setFontSize (value: number): void,\n}\n\n/**\n * 富文本组件特有 API\n */\nexport interface IRichTextComponent extends ITextComponent { }\n\nexport class TextComponentBase {\n  // 状态与通用字段\n  textStyle: TextStyle;\n  textLayout: BaseLayout;\n  text: string;\n  canvas: HTMLCanvasElement;\n  context: CanvasRenderingContext2D | null;\n\n  // 通用状态字段\n  isDirty = true;\n  engine: Engine;\n  material: Material;\n  item: VFXItem;\n  renderer: ItemRenderer;\n  lineCount = 0;\n\n  protected maxLineWidth = 0;\n  // 常量\n  protected readonly ALPHA_FIX_VALUE = 1 / 255;\n\n  // 通用 setter 方法\n  setText (value: string): void {\n    if (this.text === value) {\n      return;\n    }\n    this.text = value.toString();\n    this.isDirty = true;\n  }\n\n  setTextAlign (value: spec.TextAlignment): void {\n    if (this.textLayout.textAlign === value) {\n      return;\n    }\n    this.textLayout.textAlign = value;\n    this.isDirty = true;\n  }\n\n  setTextVerticalAlign (value: spec.TextVerticalAlign): void {\n    if (this.textLayout.textVerticalAlign === (value as unknown as spec.TextVerticalAlign)) {\n      return;\n    }\n    this.textLayout.textVerticalAlign = value as unknown as spec.TextVerticalAlign;\n    this.isDirty = true;\n  }\n\n  /**\n   * @deprecated 2.8.0 本方法已废弃，请使用 setTextVerticalAlign 替代。\n   */\n  setTextBaseline (value: spec.TextBaseline): void {\n    console.warn(\n      'setTextBaseline 已废弃，请改用 setTextVerticalAlign。' +\n      '本次调用将转调用 setTextVerticalAlign。'\n    );\n\n    this.setTextVerticalAlign(value as unknown as spec.TextVerticalAlign);\n  }\n\n  setTextColor (value: spec.RGBAColorValue): void {\n    if (this.textStyle.textColor === value) {\n      return;\n    }\n    this.textStyle.textColor = value;\n    this.isDirty = true;\n  }\n\n  setFontFamily (value: string): void {\n    if (!isValidFontFamily(value)) {\n      console.warn('Risky font family, ignored:', value);\n\n      return;\n    }\n    if (this.textStyle.fontFamily === value) {\n      return;\n    }\n    this.textStyle.fontFamily = value;\n    this.isDirty = true;\n  }\n\n  setFontWeight (value: spec.TextWeight): void {\n    if (this.textStyle.textWeight === value) {\n      return;\n    }\n    this.textStyle.textWeight = value;\n    this.isDirty = true;\n  }\n\n  setFontStyle (value: spec.FontStyle): void {\n    if (this.textStyle.fontStyle === value) {\n      return;\n    }\n    this.textStyle.fontStyle = value;\n    this.isDirty = true;\n  }\n\n  setOutlineColor (value: spec.RGBAColorValue): void {\n    if (this.textStyle.outlineColor === value) {\n      return;\n    }\n    this.textStyle.outlineColor = value;\n    this.isDirty = true;\n  }\n\n  setOutlineEnabled (value: boolean): void {\n    if (this.textStyle.isOutlined === value) {\n      return;\n    }\n    this.textStyle.isOutlined = value;\n    this.isDirty = true;\n  }\n\n  setFontScale (value: number): void {\n    if (this.textStyle.fontScale === value) {\n      return;\n    }\n    this.textStyle.fontScale = value;\n    this.isDirty = true;\n  }\n\n  setOverflow (overflow: spec.TextOverflow): void {\n    this.textLayout.overflow = overflow;\n    this.isDirty = true;\n  }\n\n  // 通用工具方法\n  protected getFontDesc (size?: number): string {\n    const { fontSize, fontScale, fontFamily, textWeight, fontStyle } = this.textStyle;\n    let fontDesc = `${(size || fontSize * fontScale).toString()}px `;\n\n    if (!['serif', 'sans-serif', 'monospace', 'courier'].includes(fontFamily)) {\n      fontDesc += `\"${fontFamily}\"`;\n    } else {\n      fontDesc += fontFamily;\n    }\n    if (textWeight !== spec.TextWeight.normal) {\n      fontDesc = `${textWeight} ${fontDesc}`;\n    }\n\n    if (fontStyle !== spec.FontStyle.normal) {\n      fontDesc = `${fontStyle} ${fontDesc}`;\n    }\n\n    return fontDesc;\n  }\n\n  protected setupOutline (): void {\n    const context = this.context;\n    const { outlineColor, outlineWidth } = this.textStyle;\n    const [r, g, b, a] = outlineColor;\n\n    if (context) {\n      context.strokeStyle = `rgba(${r * 255}, ${g * 255}, ${b * 255}, ${a})`;\n      context.lineWidth = outlineWidth * 2;\n    }\n  }\n\n  protected setupShadow (): void {\n    const context = this.context;\n    const { shadowColor, shadowBlur, shadowOffsetX, shadowOffsetY } = this.textStyle;\n    const [r, g, b, a] = shadowColor;\n\n    if (context) {\n      context.shadowColor = `rgba(${r * 255}, ${g * 255}, ${b * 255}, ${a})`;\n      context.shadowBlur = shadowBlur;\n      context.shadowOffsetX = shadowOffsetX;\n      context.shadowOffsetY = -shadowOffsetY;\n    }\n  }\n\n  // 通用纹理生命周期管理\n  protected disposeTextTexture (): void {\n    const texture = this.renderer.texture;\n\n    if (texture && texture !== this.engine.whiteTexture) {\n      texture.dispose();\n    }\n  }\n\n  /**\n   * 通用纹理渲染辅助方法\n   */\n  protected renderToTexture (\n    width: number,\n    height: number,\n    flipY: boolean,\n    drawCallback: (ctx: CanvasRenderingContext2D) => void,\n    options: { disposeOld?: boolean } = {}\n  ): void {\n    if (!this.context || !this.canvas) {\n      return;\n    }\n\n    const context = this.context;\n\n    // 先保存状态\n    context.save();\n\n    // 设置canvas尺寸\n    this.canvas.width = width;\n    this.canvas.height = height;\n\n    //重置变换\n    context.setTransform(1, 0, 0, 1, 0, 0);\n\n    // 处理翻转\n    if (!flipY) {\n      context.translate(0, height);\n      context.scale(1, -1);\n    }\n\n    // 在翻转后清空画布\n    context.clearRect(0, 0, width, height);\n\n    // 设置 alpha 修复用填充色（不实际输出像素）\n    context.fillStyle = `rgba(255, 255, 255, ${this.ALPHA_FIX_VALUE})`;\n\n    // 执行绘制回调\n    drawCallback(context);\n\n    // 创建纹理前恢复状态\n    context.restore();\n\n    // 创建新纹理\n    const imageData = context.getImageData(0, 0, width, height);\n    const texture = Texture.createWithData(\n      this.engine,\n      {\n        data: new Uint8Array(imageData.data),\n        width: imageData.width,\n        height: imageData.height,\n      },\n      {\n        flipY,\n        magFilter: glContext.LINEAR,\n        minFilter: glContext.LINEAR,\n        wrapS: glContext.CLAMP_TO_EDGE,\n        wrapT: glContext.CLAMP_TO_EDGE,\n      },\n    );\n\n    // 根据选项决定是否释放旧纹理\n    if (options.disposeOld !== false) {\n      this.disposeTextTexture();\n    }\n    this.renderer.texture = texture;\n    this.material.setTexture('_MainTex', texture);\n  }\n\n  // 初始化方法，由子类调用\n  protected initTextBase (engine: Engine): void {\n    this.engine = engine;\n    this.canvas = canvasPool.getCanvas();\n    canvasPool.saveCanvas(this.canvas);\n    this.context = this.canvas.getContext('2d', { willReadFrequently: true });\n  }\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */\nimport { Color, Vector2 } from '@galacean/effects-math/es/core/index';\nimport * as spec from '@galacean/effects-specification';\nimport { canvasPool } from '../../canvas-pool';\nimport { MaskableGraphic } from '../../components';\nimport { effectsClass } from '../../decorators';\nimport type { Engine } from '../../engine';\nimport { applyMixins } from '../../utils';\nimport { TextLayout } from './text-layout';\nimport { TextStyle } from './text-style';\nimport type { ITextComponent } from './text-component-base';\nimport { TextComponentBase } from './text-component-base';\n\nexport const DEFAULT_FONTS = [\n  'serif',\n  'sans-serif',\n  'monospace',\n  'courier',\n];\n\ninterface CharInfo {\n  /**\n   * 段落 y 值\n   */\n  y: number,\n  /**\n   * 段落字符\n   */\n  chars: string[],\n  charOffsetX: number[],\n  /**\n   * 段落宽度\n   */\n  width: number,\n}\n\nexport interface TextComponent extends TextComponentBase { }\n\nlet seed = 0;\n\n/**\n * @since 2.0.0\n */\n@effectsClass(spec.DataType.TextComponent)\nexport class TextComponent extends MaskableGraphic implements ITextComponent {\n  isDirty = true;\n  /**\n   * 文本行数\n   */\n  lineCount = 0;\n  textStyle: TextStyle;\n  canvas: HTMLCanvasElement;\n  context: CanvasRenderingContext2D | null;\n  textLayout: TextLayout;\n  text: string;\n\n  /**\n   * 描边/阴影等特效导致的纹理扩容比例 X/Y\n   */\n  protected effectScaleX = 1;\n  protected effectScaleY = 1;\n\n  /**\n   * 每一行文本的最大宽度\n   */\n  protected maxLineWidth = 0;\n\n  /**\n   * 初始文本宽度，用于计算缩放比例\n   */\n  private baseTextWidth = 0;\n\n  /**\n   * 初始 `transform.size.x`，用于按比例更新显示宽度\n   */\n  private baseScaleX = 1;\n\n  private getDefaultProps (): spec.TextComponentData {\n    return {\n      id: `default-id-${Math.random().toString(36).substr(2, 9)}`,\n      item: { id: `default-item-${Math.random().toString(36).substr(2, 9)}` },\n      dataType: spec.DataType.TextComponent,\n      options: {\n        text: '默认文本',\n        fontFamily: 'AlibabaSans-BoldItalic',\n        fontSize: 40,\n        // 统一使用 0-1 颜色值\n        textColor: [1, 1, 1, 1],\n        fontWeight: spec.TextWeight.normal,\n        letterSpace: 0,\n        textAlign: 1,\n        fontStyle: spec.FontStyle.normal,\n        autoWidth: false,\n        textWidth: 200,\n        textHeight: 42,\n        lineHeight: 40.148,\n      },\n      renderer: {\n        renderMode: 1,\n        anchor: [0.5, 0.5],\n      },\n    };\n  }\n\n  constructor (engine: Engine) {\n    super(engine);\n\n    this.name = 'MText' + seed++;\n\n    // 初始化canvas资源\n    this.canvas = canvasPool.getCanvas();\n    canvasPool.saveCanvas(this.canvas);\n    this.context = this.canvas.getContext('2d', { willReadFrequently: true });\n\n    // 使用默认值初始化\n    const defaultData = this.getDefaultProps();\n\n    const { options } = defaultData;\n\n    this.updateWithOptions(options);\n  }\n\n  override onUpdate (dt: number): void {\n    super.onUpdate(dt);\n    this.updateTexture();\n\n    // 覆盖基类每帧更新 size 行为，应用扩容比例\n    for (const material of this.materials) {\n      let sizeX = this.transform.size.x;\n      let sizeY = this.transform.size.y;\n      const [scalex, scaley] = this.getTextureExpandScale();\n\n      sizeX *= scalex;\n      sizeY *= scaley;\n\n      material.setVector2('_Size', new Vector2(sizeX, sizeY));\n    }\n  }\n\n  override onDestroy (): void {\n    super.onDestroy();\n    this.disposeTextTexture();\n  }\n\n  override fromData (data: spec.TextComponentData): void {\n    super.fromData(data);\n    const { interaction, options } = data;\n\n    this.interaction = interaction;\n\n    this.resetState();\n\n    // TextComponentBase\n    this.updateWithOptions(options);\n    this.renderText(options);\n\n    // 记录初始的 textWidth 和 x 缩放，用于后续按比例更新显示宽度\n    // 添加兜底值 1 防止除 0\n    this.baseTextWidth = options.textWidth || this.textLayout.width || 1;\n    this.baseScaleX = this.item.transform.size.x;\n\n    // 恢复默认颜色\n    this.material.setColor('_Color', new Color(1, 1, 1, 1));\n  }\n\n  private resetState (): void {\n    // 清理纹理资源\n    this.disposeTextTexture();\n\n    // 重置状态变量\n    this.isDirty = true;\n    this.lineCount = 0;\n    this.maxLineWidth = 0;\n  }\n\n  // 在 TextComponent 类内新增覆盖 setText\n  setText (value: string): void {\n    if (this.text === value) {\n      return;\n    }\n    this.text = value.toString();\n    // 设置文本后立即重算行数\n    this.lineCount = this.getLineCount(this.text);\n    this.isDirty = true;\n  }\n\n  /**\n   * 根据配置更新文本样式和布局\n   */\n  updateWithOptions (options: spec.TextContentOptions): void {\n    // 初始化 textStyle 和 textLayout\n    if (!this.textStyle) {\n      this.textStyle = new TextStyle(options);\n    } else {\n      this.textStyle.update(options);\n    }\n\n    if (!this.textLayout) {\n      this.textLayout = new TextLayout(options);\n    } else {\n      this.textLayout.update(options);\n    }\n\n    this.text = options.text.toString();\n    this.lineCount = this.getLineCount(options.text);\n  }\n\n  getLineCount (text: string): number {\n    const context = this.context;\n    const { letterSpace, overflow } = this.textLayout;\n\n    this.maxLineWidth = 0;\n    const width = (this.textLayout.width + this.textStyle.fontOffset);\n    let lineCount = 1;\n    let x = 0;\n    let charCountInLine = 0; // 跟踪当前行的字符数\n\n    // 设置 context.font 的字号，确保 measureText 能正确计算字宽\n    if (context) {\n      context.font = this.getFontDesc(this.textStyle.fontSize);\n    }\n    for (let i = 0; i < text.length; i++) {\n      const str = text[i];\n      const textMetrics = context?.measureText(str)?.width ?? 0;\n\n      // 和浏览器行为保持一致\n      // 字符间距只应用在字符之间，每行第一个字符不加间距\n      if (charCountInLine > 0) {\n        x += letterSpace;\n      }\n      // 处理文本结束行为\n      if (overflow === spec.TextOverflow.display) {\n        if (str === '\\n') {\n          lineCount++;\n          x = 0;\n          charCountInLine = 0; // 重置行字符计数\n        } else {\n          x += textMetrics;\n          charCountInLine++;\n          this.maxLineWidth = Math.max(this.maxLineWidth, x);\n        }\n      } else {\n        if (((x + textMetrics) > width && i > 0) || str === '\\n') {\n          lineCount++;\n          this.maxLineWidth = Math.max(this.maxLineWidth, x);\n          x = 0;\n          charCountInLine = 0; // 重置行字符计数\n        }\n        if (str !== '\\n') {\n          x += textMetrics;\n          charCountInLine++;\n        }\n      }\n    }\n\n    return lineCount;\n  }\n\n  /**\n   * 设置行高\n   * 行高表示每行占用的总高度\n   * @param value - 行高像素值\n   */\n  setLineHeight (value: number): void {\n    const fontSize = this.textStyle.fontSize;\n    //设置行高不能小于字号大小\n    const safe = Math.max(fontSize, value);\n\n    if (this.textLayout.lineHeight === safe) {\n      return;\n    }\n\n    this.textLayout.lineHeight = safe;\n    this.isDirty = true;\n  }\n\n  /**\n   * 设置字重\n   * @param value - 字重类型\n   * @returns\n   */\n  setFontWeight (value: spec.TextWeight): void {\n    if (this.textStyle.textWeight === value) {\n      return;\n    }\n    this.textStyle.textWeight = value;\n    this.isDirty = true;\n  }\n\n  /**\n   * 设置字体样式\n   * @param value 设置字体样式\n   * @default \"normal\"\n   * @returns\n   */\n  setFontStyle (value: spec.FontStyle): void {\n    if (this.textStyle.fontStyle === value) {\n      return;\n    }\n    this.textStyle.fontStyle = value;\n    this.isDirty = true;\n  }\n\n  /**\n   * 设置文本水平布局\n   * @param value - 布局选项\n   * @returns\n   */\n  setTextAlign (value: spec.TextAlignment): void {\n    if (this.textLayout.textAlign === value) {\n      return;\n    }\n    this.textLayout.textAlign = value;\n    this.isDirty = true;\n  }\n\n  /**\n   * 设置文本颜色\n   * @param value - 颜色内容\n   * @returns\n   */\n  setTextColor (value: spec.RGBAColorValue): void {\n    if (this.textStyle.textColor === value) {\n      return;\n    }\n    this.textStyle.textColor = value;\n    this.isDirty = true;\n  }\n\n  /**\n   * 设置外描边文本颜色\n   * @param value - 颜色内容\n   * @returns\n   */\n  setOutlineColor (value: spec.RGBAColorValue): void {\n    if (this.textStyle.outlineColor === value) {\n      return;\n    }\n    this.textStyle.outlineColor = value;\n    this.isDirty = true;\n  }\n\n  /**\n   * 设置字体清晰度\n   * @param value - 字体清晰度\n   * @returns\n   */\n  setFontScale (value: number): void {\n    if (this.textStyle.fontScale === value) {\n      return;\n    }\n\n    this.textStyle.fontScale = value;\n    this.isDirty = true;\n  }\n\n  /**\n   * 更新文本\n   * @returns\n   */\n  protected updateTexture (flipY = true): void {\n    if (!this.isDirty || !this.context || !this.canvas) {\n      return;\n    }\n\n    const style = this.textStyle;\n    const layout = this.textLayout;\n    const fontScale = style.fontScale;\n\n    const baseWidth = (layout.width + style.fontOffset) * fontScale;\n    const finalHeight = layout.lineHeight * this.lineCount;\n\n    const fontSize = style.fontSize * fontScale;\n    const lineHeight = layout.lineHeight * fontScale;\n\n    style.fontDesc = this.getFontDesc(fontSize);\n    // 使用 Array.from 正确分割 Unicode 字符（包括 emoji）\n    const char = Array.from(this.text || '');\n\n    let baseHeight = 0;\n\n    if (layout.autoWidth) {\n      baseHeight = finalHeight * fontScale;\n      this.item.transform.size.set(1, finalHeight / layout.height);\n    } else {\n      baseHeight = layout.height * fontScale;\n    }\n\n    const { padL, padR, padT, padB } = this.getEffectPadding();\n    const hasEffect = (padL | padR | padT | padB) !== 0;\n\n    const texWidth = hasEffect ? Math.ceil(baseWidth + padL + padR) : baseWidth;\n    const texHeight = hasEffect ? Math.ceil(baseHeight + padT + padB) : baseHeight;\n\n    const shiftX = hasEffect ? padL : 0;\n    const shiftY = hasEffect ? (flipY ? padT : padB) : 0;\n\n    // 给渲染层用：扩容比例\n    this.effectScaleX = baseWidth > 0 ? (texWidth / baseWidth) : 1;\n    this.effectScaleY = baseHeight > 0 ? (texHeight / baseHeight) : 1;\n\n    this.renderToTexture(texWidth, texHeight, flipY, context => {\n      // canvas size 变化后重新刷新 context\n      if (this.maxLineWidth > baseWidth && layout.overflow === spec.TextOverflow.display) {\n        context.font = this.getFontDesc(fontSize * baseWidth / this.maxLineWidth);\n      } else {\n        context.font = style.fontDesc;\n      }\n\n      // textColor 统一是 0-1，写入 canvas 时乘 255\n      const [r, g, b, a] = style.textColor;\n\n      context.fillStyle = `rgba(${r * 255}, ${g * 255}, ${b * 255}, ${a})`;\n\n      const charsInfo: CharInfo[] = [];\n      let x = 0;\n      let y = layout.getOffsetY(style, this.lineCount, lineHeight, fontSize);\n      let charsArray = [];\n      let charOffsetX = [];\n\n      for (let i = 0; i < char.length; i++) {\n        const str = char[i];\n        const textMetrics = context.measureText(str);\n\n        // 和浏览器行为保持一致\n        // 字符间距只应用在字符之间，每行第一个字符不加间距\n        if (charsArray.length > 0) {\n          x += layout.letterSpace * fontScale;\n        }\n\n        if (((x + textMetrics.width) > baseWidth && i > 0) || str === '\\n') {\n          charsInfo.push({\n            y,\n            width: x,\n            chars: charsArray,\n            charOffsetX,\n          });\n          x = 0;\n          y += lineHeight;\n          charsArray = [];\n          charOffsetX = [];\n        }\n\n        if (str !== '\\n') {\n          charsArray.push(str);\n          charOffsetX.push(x);\n          x += textMetrics.width;\n        }\n      }\n\n      charsInfo.push({\n        y,\n        width: x,\n        chars: charsArray,\n        charOffsetX,\n      });\n\n      const hasOutline = style.isOutlined && style.outlineWidth > 0;\n\n      if (hasOutline) {\n        // 有描边：在描边时启用阴影\n        if (style.hasShadow) {\n          this.setupShadow();\n        }\n        this.setupOutline();\n\n        charsInfo.forEach(charInfo => {\n          const ox = layout.getOffsetX(style, charInfo.width);\n\n          for (let i = 0; i < charInfo.chars.length; i++) {\n            const str = charInfo.chars[i];\n            const drawX = shiftX + ox + charInfo.charOffsetX[i];\n            const drawY = shiftY + charInfo.y;\n\n            context.strokeText(str, drawX, drawY);\n          }\n        });\n\n        // 描边完成后立即禁用阴影，避免填充时重复绘制阴影\n        if (style.hasShadow) {\n          context.shadowColor = 'transparent';\n        }\n      }\n\n      // 填充阶段：无描边时才启用阴影\n      if (!hasOutline && style.hasShadow) {\n        this.setupShadow();\n      }\n\n      charsInfo.forEach(charInfo => {\n        const ox = layout.getOffsetX(style, charInfo.width);\n\n        for (let i = 0; i < charInfo.chars.length; i++) {\n          const str = charInfo.chars[i];\n          const drawX = shiftX + ox + charInfo.charOffsetX[i];\n          const drawY = shiftY + charInfo.y;\n\n          context.fillText(str, drawX, drawY);\n        }\n      });\n\n      // 清理阴影状态\n      if (style.hasShadow) {\n        context.shadowColor = 'transparent';\n      }\n    });\n\n    this.isDirty = false;\n  }\n\n  renderText (options: spec.TextContentOptions) {\n    this.updateTexture();\n  }\n\n  /**\n   * 给渲染层用：获取特效扩容比例（描边/阴影导致的纹理扩容）\n   * @returns\n   */\n  public getTextureExpandScale (): [number, number] {\n    return [this.effectScaleX, this.effectScaleY];\n  }\n\n  /**\n   * 获取描边和阴影的 padding 值（单位：px）\n   * @returns\n   */\n  protected getEffectPadding () {\n    const style = this.textStyle;\n\n    const hasDrawOutline = style.isOutlined && style.outlineWidth > 0;\n    const outlinePad = hasDrawOutline ? Math.ceil(style.outlineWidth * 2 * style.fontScale) : 0;\n\n    const hasShadow = style.hasShadow && (style.shadowBlur > 0 || style.shadowOffsetX !== 0 || style.shadowOffsetY !== 0);\n    const shadowPad = hasShadow\n      ? Math.ceil((Math.abs(style.shadowOffsetX) + Math.abs(style.shadowOffsetY) + style.shadowBlur) * style.fontScale)\n      : 0;\n\n    const pad = outlinePad + shadowPad;\n\n    return { padL: pad, padR: pad, padT: pad, padB: pad };\n  }\n\n  setAutoWidth (value: boolean): void {\n    const layout = this.textLayout;\n    const normalizedValue = !!value;\n\n    if (layout.autoWidth === normalizedValue) {\n      return;\n    }\n    layout.autoWidth = normalizedValue;\n    this.isDirty = true;\n  }\n\n  /**\n   * 设置文本框宽度\n   * 手动设置宽度时会自动关闭 `autoWidth`\n   * 同时会按比例更新 `transform.size.x`，让 UI 框宽度也跟着变化\n   * @param value - 文本框宽度\n   */\n  setTextWidth (value: number): void {\n    const width = Math.max(0, Number(value) || 0);\n    const layout = this.textLayout;\n\n    // 宽度没变且已是非 autoWidth 模式,直接返回\n    if (layout.width === width && layout.autoWidth === false) {\n      return;\n    }\n\n    // 手动设置宽度时关闭 autoWidth\n    layout.autoWidth = false;\n    layout.width = width;\n\n    // 按当前 overflow 模式重新计算行数和 maxLineWidth\n    this.lineCount = this.getLineCount(this.text || '');\n    this.isDirty = true;\n\n    // 同步更新外层显示宽度(按比例缩放 transform)\n    // 这样 UI 框的视觉宽度也会跟着文本宽度变化\n    if (this.baseTextWidth > 0) {\n      const scale = width / this.baseTextWidth;\n\n      this.item.transform.size.x = this.baseScaleX * scale;\n    }\n  }\n\n  /**\n   * 设置文本框高度\n   * @param value - 文本框高度\n   */\n  setTextHeight (value: number): void {\n    const height = Math.max(0, Number(value) || 0);\n\n    if (height === 0) {\n      return;\n    }\n\n    const layout = this.textLayout;\n\n    if (layout.height === height) {\n      return;\n    }\n\n    layout.height = height;\n    this.isDirty = true;\n  }\n\n  setFontSize (value: number): void {\n    const size = Math.max(1, Number(value) || 1);\n\n    if (this.textStyle.fontSize === size) {\n      return;\n    }\n\n    this.textStyle.fontSize = size;\n    this.isDirty = true;\n  }\n\n  setOutlineWidth (value: number): void {\n    const v = Math.max(0, Number(value) || 0);\n\n    if (this.textStyle.outlineWidth === v) {\n      return;\n    }\n    this.textStyle.outlineWidth = v;\n    this.isDirty = true;\n  }\n\n  /**\n   * 设置是否启用文本描边\n   * @param value - 是否启用描边\n   * @returns\n   */\n  setOutlineEnabled (value: boolean): void {\n    if (this.textStyle.isOutlined === value) {\n      return;\n    }\n    this.textStyle.isOutlined = value;\n    this.isDirty = true;\n  }\n\n  setShadowBlur (value: number): void {\n    const v = Math.max(0, Number(value) || 0);\n\n    if (this.textStyle.shadowBlur === v) {\n      return;\n    }\n    this.textStyle.shadowBlur = v;\n    this.isDirty = true;\n  }\n\n  // setupShadow 使用 outlineColor 作为阴影颜色，更新 shadowColor 不影响阴影颜色\n  setShadowColor (value: spec.RGBAColorValue): void {\n    const v = value ?? [0, 0, 0, 1];\n\n    if (this.textStyle.shadowColor === v) {\n      return;\n    }\n    this.textStyle.shadowColor = v;\n    this.isDirty = true;\n  }\n\n  setShadowOffsetX (value: number): void {\n    const v = Number(value) || 0;\n\n    if (this.textStyle.shadowOffsetX === v) {\n      return;\n    }\n    this.textStyle.shadowOffsetX = v;\n    this.isDirty = true;\n  }\n\n  setShadowOffsetY (value: number): void {\n    const v = Number(value) || 0;\n\n    if (this.textStyle.shadowOffsetY === v) {\n      return;\n    }\n    this.textStyle.shadowOffsetY = v;\n    this.isDirty = true;\n  }\n}\n\napplyMixins(TextComponent, [TextComponentBase]);\n","import { Plugin } from '../index';\n\n// TODO: 注册必须用\nexport class TextLoader extends Plugin {\n}\n","import { EffectsObject } from './effects-object';\n\nexport class Asset<T> extends EffectsObject {\n  data: T;\n}\n","import * as spec from '@galacean/effects-specification';\nimport { EffectsObject } from './effects-object';\nimport { effectsClass, serialize } from './decorators';\n\n@effectsClass(spec.DataType.BinaryAsset)\nexport class BinaryAsset extends EffectsObject {\n  @serialize()\n  buffer: ArrayBuffer;\n}\n","import type * as spec from '@galacean/effects-specification';\nimport { getMergedStore } from './decorators';\nimport { EffectsObject } from './effects-object';\nimport type { Engine } from './engine';\nimport type { Constructor } from './utils';\nimport { isArray, isCanvas, isObject, isPlainObject, isString } from './utils';\n\nexport class SerializationHelper {\n  static serialize (\n    effectsObject: EffectsObject,\n    serializedData?: Record<string, any>,\n  ) {\n    effectsObject.toData();\n\n    if (!serializedData) {\n      serializedData = {};\n    }\n\n    const serializedProperties = getMergedStore(effectsObject);\n\n    if (serializedProperties) {\n      for (const key of Object.keys(serializedProperties)) {\n        const value = effectsObject[key as keyof EffectsObject];\n\n        if (\n          typeof value === 'number' ||\n          typeof value === 'string' ||\n          typeof value === 'boolean' ||\n          SerializationHelper.checkTypedArray(value)\n        ) {\n          // TODO json 数据避免传 typedArray\n          serializedData[key] = value;\n        } else if (isArray(value)) {\n          if (!serializedData[key]) {\n            serializedData[key] = [];\n          }\n          SerializationHelper.serializeArrayProperty(value, serializedData[key], 0);\n        } else if (EffectsObject.is(value)) {\n          // TODO 处理 EffectsObject 递归序列化\n          serializedData[key] = { id: value.getInstanceId() };\n        } else if (isObject(value)) {\n          if (!serializedData[key]) {\n            serializedData[key] = {};\n          }\n          SerializationHelper.serializeObjectProperty(value, serializedData[key], 0);\n        }\n      }\n    }\n\n    // TODO 待移除 tagggedProperties 为没有装饰器的临时方案\n    for (const key of Object.keys(effectsObject.defination)) {\n      const value = effectsObject.defination[key];\n\n      if (\n        typeof value === 'number' ||\n        typeof value === 'string' ||\n        typeof value === 'boolean' ||\n        SerializationHelper.checkTypedArray(value)\n      ) {\n        // TODO json 数据避免传 typedArray\n        serializedData[key] = value;\n      } else if (isArray(value)) {\n        if (!serializedData[key]) {\n          serializedData[key] = [];\n        }\n        SerializationHelper.serializeArrayProperty(value, serializedData[key], 0);\n      } else if (EffectsObject.is(value)) {\n        // TODO 处理 EffectsObject 递归序列化\n        serializedData[key] = { id: value.getInstanceId() };\n      } else if (isObject(value)) {\n        if (!serializedData[key]) {\n          serializedData[key] = {};\n        }\n        SerializationHelper.serializeObjectProperty(value, serializedData[key], 0);\n      }\n    }\n\n    return serializedData;\n  }\n\n  static deserialize (\n    serializedData: spec.EffectsObjectData,\n    effectsObject: EffectsObject,\n  ) {\n    effectsObject.defination = serializedData;\n\n    const serializedProperties = getMergedStore(effectsObject);\n    const engine = effectsObject.engine;\n\n    if (serializedProperties) {\n      for (const key of Object.keys(serializedProperties)) {\n        const value = serializedData[key as keyof spec.EffectsObjectData];\n\n        if (value === undefined) {\n          continue;\n        }\n\n        const propertyType = serializedProperties[key].type;\n\n        // FIXME: taggedProperties 为 readonly，这里存在强制赋值\n        effectsObject[key as keyof EffectsObject] = SerializationHelper.deserializeProperty(value, engine, 0, propertyType);\n      }\n    }\n    effectsObject.fromData(effectsObject.defination as spec.EffectsObjectData);\n  }\n\n  static checkTypedArray (obj: unknown): boolean {\n    return obj instanceof Int8Array\n      || obj instanceof Uint8Array\n      || obj instanceof Uint8ClampedArray\n      || obj instanceof Int16Array\n      || obj instanceof Uint16Array\n      || obj instanceof Int32Array\n      || obj instanceof Uint32Array\n      || obj instanceof Float32Array\n      || obj instanceof Float64Array\n      || obj instanceof ArrayBuffer;\n  }\n\n  // check value is { id: 7e69662e964e4892ae8933f24562395b }\n  static checkDataPath (value: unknown): value is spec.DataPath {\n    return !!(isObject(value)\n      && Object.keys(value).length === 1\n      && 'id' in value\n      && isString(value.id));\n  }\n\n  // TODO 测试函数，2.0 上线后移除\n  static checkGLTFNode (value: any): boolean {\n    return isObject(value)\n      && value.nodeIndex !== undefined\n      && value.isJoint !== undefined;\n  }\n\n  static checkImageSource (value: HTMLCanvasElement): boolean {\n    return isCanvas(value) || value instanceof HTMLImageElement;\n  }\n\n  private static deserializeProperty<T> (\n    property: T,\n    engine: Engine,\n    level: number,\n    type?: Constructor<{}>,\n    overrideDataPath = true\n  ): any {\n    if (level > 14) {\n      console.error('The nested object layers of the serialized data exceed the maximum limit.');\n\n      return;\n    }\n    // 加载并链接 DataPath 字段表示的 EffectsObject 引用。Class 对象 copy [key, value] 会丢失对象信息，因此只递归数组对象和普通 js Object 结构对象。\n    if (isArray(property)) {\n      const res = [];\n\n      for (const value of property) {\n        res.push(SerializationHelper.deserializeProperty(value, engine, level + 1, type, overrideDataPath));\n      }\n\n      return res;\n      // TODO json 数据避免传 typedArray\n    } else if (SerializationHelper.checkDataPath(property)) {\n      const referenceObject = engine.findObject(property);\n\n      return overrideDataPath ? referenceObject : property;\n    } else if (isPlainObject(property)) {\n      let res: Record<string, EffectsObject>;\n\n      if (type) {\n        res = new type();\n      } else {\n        res = {};\n      }\n      for (const key of Object.keys(property)) {\n        res[key] = SerializationHelper.deserializeProperty(property[key], engine, level + 1, undefined, overrideDataPath);\n      }\n\n      return res;\n    } else {\n      return property;\n    }\n  }\n\n  private static serializeObjectProperty (\n    objectProperty: Record<string, unknown>,\n    serializedData: Record<string, unknown>,\n    level: number,\n  ) {\n    if (level > 14) {\n      console.error('The nested object layers of the serialized data exceed the maximum limit.');\n\n      return;\n    }\n    if (!serializedData) {\n      serializedData = {};\n    }\n\n    for (const key of Object.keys(objectProperty)) {\n      const value = objectProperty[key];\n\n      if (\n        typeof value === 'number' ||\n        typeof value === 'string' ||\n        typeof value === 'boolean' ||\n        SerializationHelper.checkTypedArray(objectProperty)\n      ) {\n        // TODO json 数据避免传 typedArray\n        serializedData[key] = value;\n      } else if (isArray(value)) {\n        if (!serializedData[key]) {\n          serializedData[key] = [];\n        }\n        SerializationHelper.serializeArrayProperty(\n          value,\n          serializedData[key] as unknown[],\n          level + 1,\n        );\n      } else if (EffectsObject.is(value)) {\n        // TODO 处理 EffectsObject 递归序列化\n        serializedData[key] = { id: value.getInstanceId() };\n      } else if (isObject(value)) {\n        if (!serializedData[key]) {\n          serializedData[key] = {};\n        }\n        SerializationHelper.serializeObjectProperty(\n          value,\n          serializedData[key] as Record<string, unknown>,\n          level + 1,\n        );\n      }\n    }\n  }\n\n  private static serializeArrayProperty (\n    arrayProperty: unknown[],\n    serializedData: unknown[],\n    level: number,\n  ) {\n    if (level > 14) {\n      console.error('The nested object layers of the serialized data exceed the maximum limit.');\n\n      return;\n    }\n    if (!serializedData) {\n      serializedData = [];\n    }\n\n    for (let i = 0; i < arrayProperty.length; i++) {\n      const value = arrayProperty[i];\n\n      if (\n        typeof value === 'number' ||\n        typeof value === 'string' ||\n        typeof value === 'boolean' ||\n        SerializationHelper.checkTypedArray(arrayProperty)\n      ) {\n        // TODO json 数据避免传 typedArray\n        serializedData[i] = value;\n      } else if (isArray(value)) {\n        if (!serializedData[i]) {\n          serializedData[i] = [];\n        }\n        SerializationHelper.serializeArrayProperty(\n          value,\n          serializedData[i] as unknown[],\n          level + 1,\n        );\n      } else if (EffectsObject.is(value)) {\n        // TODO 处理 EffectsObject 递归序列化\n        serializedData[i] = { id: value.getInstanceId() };\n      } else if (isObject(value)) {\n        if (!serializedData[i]) {\n          serializedData[i] = {};\n        }\n        SerializationHelper.serializeObjectProperty(\n          value,\n          serializedData[i] as Record<string, unknown>,\n          level + 1,\n        );\n      }\n    }\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport { getClass } from './decorators';\nimport type { EffectsObject } from './effects-object';\nimport type { Engine } from './engine';\nimport { Material } from './material';\nimport { Geometry } from './render';\nimport { SerializationHelper } from './serialization-helper';\nimport { Texture } from './texture';\n\n/**\n * @since 2.0.0\n */\nexport class AssetLoader {\n  constructor (\n    private engine: Engine,\n  ) { }\n\n  loadGUID<T> (dataPath: spec.DataPath): T {\n    if (!dataPath) {\n      return null as T;\n    }\n\n    const guid = dataPath.id;\n    const effectsObjectData = this.findData(guid);\n    let effectsObject: EffectsObject | undefined;\n\n    if (!effectsObjectData) {\n      console.error(`Object data with uuid: ${guid} not found.`);\n\n      return undefined as T;\n    }\n\n    switch (effectsObjectData.dataType) {\n      case spec.DataType.Material:\n        effectsObject = Material.create(this.engine);\n\n        break;\n      case spec.DataType.Geometry:\n        effectsObject = Geometry.create(this.engine);\n\n        break;\n      case spec.DataType.Texture:\n        effectsObject = Texture.create(this.engine);\n\n        break;\n      default: {\n        const classConstructor = getClass(effectsObjectData.dataType);\n\n        if (classConstructor) {\n          effectsObject = new classConstructor(this.engine);\n        }\n      }\n    }\n\n    if (!effectsObject) {\n      console.error(`Constructor for DataType: ${effectsObjectData.dataType} not found.`);\n\n      return undefined as T;\n    }\n\n    effectsObject.setInstanceId(effectsObjectData.id);\n    this.engine.addInstance(effectsObject);\n    SerializationHelper.deserialize(effectsObjectData, effectsObject);\n\n    return effectsObject as T;\n  }\n\n  private findData (uuid: string): spec.EffectsObjectData | undefined {\n    return this.engine.jsonSceneData[uuid];\n  }\n}\n\nexport class Database {\n  async loadGUID (guid: string): Promise<EffectsObject | undefined> {\n    return undefined;\n  }\n}\n\n// TODO: 待统一\nexport interface EffectComponentData extends spec.EffectsObjectData {\n  _priority: number,\n  item: spec.DataPath,\n  materials: spec.DataPath[],\n  geometry: spec.DataPath,\n}\n\nexport type VFXItemData = spec.Item & {\n  dataType: spec.DataType,\n  components: spec.DataPath[],\n};\n\nexport type SceneData = Record<string, spec.EffectsObjectData>;\n\n","import type {\n  FixedNumberExpression, RGBAColorValue, ColorExpression, NumberExpression, GradientColor,\n  GradientStop, FixedVec3Expression, vec2, vec3, vec4, BezierKeyframeValue,\n} from '@galacean/effects-specification';\nimport { BezierKeyframeType, ValueType, ParticleOrigin } from '@galacean/effects-specification';\n\nexport function arrAdd<T> (arr: T[], item: T): boolean | undefined {\n  if (!arr.includes(item)) {\n    arr.push(item);\n\n    return true;\n  }\n}\n\nexport function ensureFixedNumber (a: any): FixedNumberExpression | undefined {\n  if (Number.isFinite(a)) {\n    return [ValueType.CONSTANT, a];\n  }\n  if (a) {\n    const valueType = a[0];\n    const valueData = a[1];\n\n    if (Array.isArray(valueType)) {\n      // 没有数据类型的数据\n      return;\n    }\n\n    if (valueType === 'static' || valueType === ValueType.CONSTANT) {\n      return [ValueType.CONSTANT, a[1]];\n    }\n    if (valueType === 'lines') {\n      return [ValueType.LINE, a[1]];\n    }\n    if (valueType === ValueType.LINE) {\n      // @ts-expect-error\n      const keyframes: LineKeyframeValue[] = valueData.map(data => [BezierKeyframeType.LINE, data]);\n\n      return [ValueType.BEZIER_CURVE, keyframes];\n    }\n    if (valueType === 'curve' || valueType === ValueType.CURVE) {\n      return [ValueType.BEZIER_CURVE, getBezierCurveFromHermiteInGE(valueData)];\n    }\n\n    return a;\n  }\n}\n\nexport function ensureFixedNumberWithRandom (a: any, p: number): FixedNumberExpression | undefined {\n  if (Array.isArray(a) && a[0] === 'random') {\n    return [ValueType.CONSTANT, a[1][p]];\n  }\n\n  return ensureFixedNumber(a);\n}\n\nexport function ensureRGBAValue (a: any): RGBAColorValue {\n  if (a && a[0] === 'color') {\n    return colorToArr(a[1], true);\n  }\n\n  return [1, 1, 1, 1];\n}\n\nexport function ensureColorExpression (a: any, normalized?: boolean): ColorExpression | undefined {\n  if (a) {\n    if (a[0] === 'colors') {\n      return [ValueType.COLORS, a[1].map((color: any) => colorToArr(color, normalized))];\n    } else if (a[0] === 'gradient') {\n      return ensureGradient(a[1], normalized);\n    } else if (a[0] === 'color') {\n      return [ValueType.RGBA_COLOR, colorToArr(a[1], normalized)];\n    }\n\n    return a;\n  }\n}\n\nexport function ensureNumberExpression (a: any): NumberExpression | undefined {\n  if (a && a[0] === 'random') {\n    return [ValueType.RANDOM, a[1]];\n  }\n\n  return ensureFixedNumber(a);\n}\n\nexport function ensureValueGetter (a: any): any {\n  if (Array.isArray(a) && typeof a[0] === 'string') {\n    return ensureNumberExpression(a) || ensureFixedVec3(a) || ensureColorExpression(a) || a;\n  }\n\n  return a;\n}\n\nexport function ensureGradient (a: any, normalized?: boolean): GradientColor | undefined {\n  if (a) {\n    let stops: GradientStop[] = [];\n\n    Object.getOwnPropertyNames(a).forEach(p => {\n      const stop = parsePercent(p);\n      const color = colorToArr(a[p], normalized);\n\n      stops.push([stop, color[0], color[1], color[2], color[3]]);\n    });\n    stops = stops.sort((a, b) => a[0] - b[0]);\n\n    return [ValueType.GRADIENT_COLOR, stops];\n  }\n}\n\nexport function colorToArr (hex: string | number[], normalized?: boolean): vec4 {\n  let ret: vec4;\n\n  if (typeof hex === 'string') {\n    hex = hex.replace(/[\\s\\t\\r\\n]/g, '');\n    let m = /rgba?\\(([.\\d]+),([.\\d]+),([.\\d]+),?([.\\d]+)?\\)/.exec(hex);\n\n    if (m) {\n      const a = +m[4];\n\n      ret = [+m[1], +m[2], +m[3], isNaN(a) ? 255 : Math.round(a * 255)];\n    } else if (/^#[a-f\\d]{3}$/i.test(hex)) {\n      ret = [parseInt(hex[1] + hex[1], 16), parseInt(hex[2] + hex[2], 16), parseInt(hex[3] + hex[3], 16), 255];\n      // eslint-disable-next-line no-cond-assign\n    } else if (m = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex)) {\n      ret = [parseInt(m[1], 16), parseInt(m[2], 16), parseInt(m[3], 16), 255];\n    }\n  } else if (hex instanceof Array) {\n    ret = [hex[0], hex[1], hex[2], isNaN(hex[3]) ? 255 : Math.round(hex[3] * 255)];\n  }\n\n  if (normalized) {\n    // @ts-expect-error\n    ret = normalizeColor(ret) as unknown as vec4;\n  }\n\n  // @ts-expect-error\n  return ret;\n}\n\nexport function normalizeColor (a: number[]): number[] | undefined {\n  if (Array.isArray(a)) {\n    return a.map(i => Number.isFinite(i / 255) ? Number((i / 255).toFixed(6)) : 0);\n  }\n}\n\nexport function parsePercent (c: string): number {\n  const match = /^(-)?([\\d+.]+)%$/.exec(c);\n\n  if (match) {\n    return +match[2] / 100 * (match[1] ? -1 : 1);\n  }\n\n  return +c;\n}\n\nexport function getGradientColor (color: string | Array<string | number[]> | GradientColor, normalized?: boolean): GradientColor | undefined {\n  if (Array.isArray(color)) {\n    if (color[0] === ValueType.GRADIENT_COLOR) {\n      return color as GradientColor;\n    }\n\n    // @ts-expect-error\n    return (color[0] === 'gradient' || color[0] === 'color') && ensureGradient(color[1], normalized);\n  } else {\n    return ensureGradient(color, normalized);\n  }\n}\n\nexport function ensureFixedVec3 (a: any): FixedVec3Expression | undefined {\n  if (a) {\n    if (a.length === 3) {\n      return [ValueType.CONSTANT_VEC3, a];\n    }\n    const valueType = a[0];\n\n    if (\n      valueType === 'path' ||\n      valueType === 'bezier' ||\n      valueType === ValueType.BEZIER_PATH ||\n      valueType === ValueType.LINEAR_PATH\n    ) {\n      const valueData = a[1];\n      const easing = valueData[0];\n      const points = valueData[1];\n      let controlPoints = valueData[2];\n      const bezierEasing = getBezierCurveFromHermiteInGE(easing);\n\n      // linear path没有controlPoints\n      if (!controlPoints) {\n        controlPoints = [];\n        for (let keyframeIndex = 0; keyframeIndex < points.length; keyframeIndex++) {\n          const point = points[keyframeIndex].slice();\n\n          if (keyframeIndex === 0) {\n            controlPoints.push(point);\n          } else if (keyframeIndex < points.length - 1) {\n            controlPoints.push(point);\n            controlPoints.push(point);\n          } else {\n            controlPoints.push(point);\n          }\n        }\n      }\n\n      return [ValueType.BEZIER_CURVE_PATH, [bezierEasing, points, controlPoints]];\n    }\n\n    return a;\n  }\n}\n\nexport function objectValueToNumber (o: Record<string, any>): object {\n  for (const key of Object.keys(o)) {\n    o[key] = Number(o[key]);\n  }\n\n  return o;\n}\n\nexport function deleteEmptyValue (o: Record<string, any>): object {\n  for (const key of Object.keys(o)) {\n    if (o[key] === undefined) {\n      delete o[key];\n    }\n  }\n\n  return o;\n}\n\nconst cos = Math.cos;\nconst sin = Math.sin;\nconst d2r = Math.PI / 180;\nconst r2d = 180 / Math.PI;\n\nexport function quatFromXYZRotation (out: vec4 | number[], x: number, y: number, z: number): vec4 {\n  const c1 = cos((x * d2r) / 2);\n  const c2 = cos((y * d2r) / 2);\n  const c3 = cos((z * d2r) / 2);\n\n  const s1 = sin((x * d2r) / 2);\n  const s2 = sin((y * d2r) / 2);\n  const s3 = sin((z * d2r) / 2);\n\n  out[0] = s1 * c2 * c3 + c1 * s2 * s3;\n  out[1] = c1 * s2 * c3 - s1 * c2 * s3;\n  out[2] = c1 * c2 * s3 + s1 * s2 * c3;\n  out[3] = c1 * c2 * c3 - s1 * s2 * s3;\n\n  return out as vec4;\n}\n\nfunction clamp (v: number, min: number, max: number): number {\n  return v > max ? max : (v < min ? min : v);\n}\n\nexport function rotationZYXFromQuat (out: vec3 | number[], quat: vec4): vec3 {\n  const x = quat[0];\n  const y = quat[1];\n  const z = quat[2];\n  const w = quat[3];\n  const x2 = x + x;\n  const y2 = y + y;\n  const z2 = z + z;\n  const xx = x * x2;\n  const yx = y * x2;\n  const yy = y * y2;\n  const zx = z * x2;\n  const zy = z * y2;\n  const zz = z * z2;\n  const wx = w * x2;\n  const wy = w * y2;\n  const wz = w * z2;\n  const m11 = 1 - yy - zz, m12 = yx - wz, _m13 = zx + wy;\n  const m21 = yx + wz, m22 = 1 - xx - zz, _m23 = zy - wx;\n  const m31 = zx - wy, m32 = zy + wx, m33 = 1 - xx - yy;\n\n  out[1] = Math.asin(clamp(-m31, -1, 1)) * r2d;\n  if (Math.abs(m31) < 0.9999999) {\n    out[0] = Math.atan2(m32, m33) * r2d;\n    out[2] = Math.atan2(m21, m11) * r2d;\n  } else {\n    out[0] = 0;\n    out[2] = Math.atan2(-m12, m22) * r2d;\n  }\n\n  return out as vec3;\n}\n\n/**\n * 提取并转换 JSON 数据中的 anchor 值\n */\nexport function convertAnchor (\n  anchor?: vec2,\n  particleOrigin?: ParticleOrigin,\n): vec2 {\n  if (anchor) {\n    return [anchor[0] - 0.5, 0.5 - anchor[1]];\n  } else if (particleOrigin) {\n    return particleOriginTranslateMap[particleOrigin];\n  } else {\n    return [0, 0];\n  }\n}\n\nexport const particleOriginTranslateMap: Record<number, vec2> = {\n  [ParticleOrigin.PARTICLE_ORIGIN_CENTER]: [0, 0],\n  [ParticleOrigin.PARTICLE_ORIGIN_CENTER_BOTTOM]: [0, -0.5],\n  [ParticleOrigin.PARTICLE_ORIGIN_CENTER_TOP]: [0, 0.5],\n  [ParticleOrigin.PARTICLE_ORIGIN_LEFT_TOP]: [-0.5, 0.5],\n  [ParticleOrigin.PARTICLE_ORIGIN_LEFT_CENTER]: [-0.5, 0],\n  [ParticleOrigin.PARTICLE_ORIGIN_LEFT_BOTTOM]: [-0.5, -0.5],\n  [ParticleOrigin.PARTICLE_ORIGIN_RIGHT_CENTER]: [0.5, 0],\n  [ParticleOrigin.PARTICLE_ORIGIN_RIGHT_BOTTOM]: [0.5, -0.5],\n  [ParticleOrigin.PARTICLE_ORIGIN_RIGHT_TOP]: [0.5, 0.5],\n};\nfunction getBezierCurveFromHermite (m0: number, m1: number, p0: number[], p3: number[]) {\n  const xStart = p0[0];\n  const yStart = p0[1];\n  const xEnd = p3[0];\n  const yEnd = p3[1];\n  const dt = xEnd - xStart;\n\n  m0 = m0 * dt;\n  m1 = m1 * dt;\n  const bezierControlPoints = [[xStart + (xEnd - xStart) / 3, yStart + m0 / 3], [xEnd - (xEnd - xStart) / 3, yEnd - m1 / 3]];\n\n  return bezierControlPoints;\n}\n\nexport function getBezierCurveFromHermiteInGE (geHermiteCurves: number[][]): BezierKeyframeValue[] {\n  let ymax = -1000000;\n  let ymin = 1000000;\n\n  for (let i = 0; i < geHermiteCurves.length; i++) {\n    ymax = Math.max(ymax, geHermiteCurves[i][1]);\n    ymin = Math.min(ymin, geHermiteCurves[i][1]);\n  }\n  const geBezierCurves = [[geHermiteCurves[0][0], geHermiteCurves[0][1]]];\n\n  for (let i = 0; i < geHermiteCurves.length - 1; i++) {\n    const m0 = geHermiteCurves[i][3] * (ymax - ymin);\n    const m1 = geHermiteCurves[i + 1][2] * (ymax - ymin);\n    const p0 = [geHermiteCurves[i][0], geHermiteCurves[i][1]];\n    const p3 = [geHermiteCurves[i + 1][0], geHermiteCurves[i + 1][1]];\n\n    if (p0[0] != p3[0]) {\n      const bezierControlPoints = getBezierCurveFromHermite(m0, m1, p0, p3);\n      const p1 = bezierControlPoints[0];\n      const p2 = bezierControlPoints[1];\n\n      geBezierCurves[geBezierCurves.length - 1].push(p1[0]);\n      geBezierCurves[geBezierCurves.length - 1].push(p1[1]);\n      geBezierCurves.push([p2[0], p2[1], p3[0], p3[1]]);\n    } else {\n      geBezierCurves[geBezierCurves.length - 1].push(p3[0]);\n      geBezierCurves[geBezierCurves.length - 1].push(p3[1]);\n    }\n  }\n\n  // 添加关键帧类型\n  return geBezierCurves.map((curve, index) => {\n    return index === 0 ? [BezierKeyframeType.EASE_OUT, curve as [number, number, number, number]]\n      : index === geBezierCurves.length - 1 ? [BezierKeyframeType.EASE_IN, curve as [number, number, number, number]]\n        : [BezierKeyframeType.EASE, curve as [number, number, number, number, number, number]];\n  });\n}\n","import * as spec from '@galacean/effects-specification';\nimport type {\n  BaseContent, BinaryFile, CompositionData, Item, JSONScene, JSONSceneLegacy, SpineResource,\n  SpineContent, TimelineAssetData, CustomShapeData, ShapeComponentData, CompositionContent,\n} from '@galacean/effects-specification';\nimport {\n  DataType, END_BEHAVIOR_PAUSE, END_BEHAVIOR_PAUSE_AND_DESTROY, EndBehavior, ItemType,\n  JSONSceneVersion, ShapePrimitiveType,\n} from '@galacean/effects-specification';\nimport { MaskMode } from '../material';\nimport { generateGUID } from '../utils';\nimport { convertAnchor, ensureFixedNumber, ensureFixedVec3 } from './utils';\nimport { getGeometryByShape } from '../shape/geometry';\n/**\n * 2.1 以下版本数据适配（mars-player@2.4.0 及以上版本支持 2.1 以下数据的适配）\n */\nexport function version21Migration (json: JSONSceneLegacy): JSONSceneLegacy {\n  json.compositions.forEach(composition => {\n    composition.items.forEach(item => {\n      if (item.type === ItemType.null) {\n        if (item.endBehavior === EndBehavior.destroy) {\n          item.endBehavior = EndBehavior.freeze;\n        }\n      }\n    });\n  });\n\n  json.version = JSONSceneVersion['2_1'];\n\n  return json;\n}\n\n/**\n * 2.2 以下版本数据适配（mars-player@2.5.0 及以上版本支持 2.2 以下数据的适配）\n */\nexport function version22Migration (json: JSONSceneLegacy): JSONSceneLegacy {\n  const singleVersion = json.version?.split('.');\n\n  if (!singleVersion || Number(singleVersion[0]) > 2 || (Number(singleVersion[0]) === 2 && Number(singleVersion[1]) >= 2)) {\n    return json;\n  }\n\n  json.compositions.forEach(composition => {\n    composition.items.forEach(item => {\n      if (item.type === ItemType.mesh || item.type === ItemType.light) {\n        item.endBehavior = item.endBehavior as unknown === 1 ? EndBehavior.destroy : item.endBehavior;\n      }\n    });\n  });\n\n  return json;\n}\n\nlet currentMaskComponent: string;\nconst componentMap: Map<string, spec.ComponentData> = new Map();\nconst itemMap: Map<string, spec.VFXItemData> = new Map();\n\n/**\n * 3.1 版本数据适配\n * - 富文本插件名称的适配\n */\nexport function version31Migration (json: JSONScene): JSONScene {\n  // Custom shape fill 属性位置迁移\n  for (const component of json.components) {\n    if (component.dataType === DataType.ShapeComponent) {\n      const shapeComponent = component as ShapeComponentData;\n\n      if (shapeComponent.type === ShapePrimitiveType.Custom) {\n        const customShapeComponent = shapeComponent as CustomShapeData;\n\n        //@ts-expect-error\n        if (customShapeComponent.shapes?.length > 0 && customShapeComponent.shapes[0].fill) {\n          // @ts-expect-error\n          customShapeComponent.fill = customShapeComponent.shapes[0].fill;\n        }\n\n        // easingIn 和 easingOut 绝对坐标转相对坐标\n        const easingInFlag = new Array(customShapeComponent.easingIns.length);\n        const easingOutFlag = new Array(customShapeComponent.easingOuts.length).fill(false);\n\n        for (const shape of customShapeComponent.shapes) {\n          for (const index of shape.indexes) {\n            const point = customShapeComponent.points[index.point];\n            const easingIn = customShapeComponent.easingIns[index.easingIn];\n            const easingOut = customShapeComponent.easingOuts[index.easingOut];\n\n            if (!easingInFlag[index.easingIn]) {\n              easingIn.x -= point.x;\n              easingIn.y -= point.y;\n              easingInFlag[index.easingIn] = true;\n            }\n            if (!easingOutFlag[index.easingOut]) {\n              easingOut.x -= point.x;\n              easingOut.y -= point.y;\n              easingOutFlag[index.easingOut] = true;\n            }\n          }\n        }\n      }\n    }\n  }\n\n  json.version = JSONSceneVersion['3_2'];\n\n  return json;\n}\n\nexport function version32Migration (json: JSONScene): JSONScene {\n  componentMap.clear();\n  itemMap.clear();\n\n  const { compositions, items, components } = json;\n  // 处理旧蒙版数据\n\n  for (const component of components) {\n    componentMap.set(component.id, component);\n  }\n  for (const item of items) {\n    itemMap.set(item.id, item);\n  }\n\n  for (const comp of compositions) {\n    processContent(comp);\n  }\n\n  json.version = JSONSceneVersion['3_3'];\n\n  return json;\n}\n\nexport function version33Migration (json: JSONScene): JSONScene {\n  // 修正老版本数据中，富文本插件名称的问题\n  json.plugins?.forEach((plugin, index) => {\n    if (plugin === 'richtext') {\n      json.plugins[index] = 'rich-text';\n    }\n  });\n\n  // 老 shape 数据兼容\n  for (const item of json.items) {\n    if (item.type === spec.ItemType.sprite) {\n      const spriteComponent = componentMap.get(item.components[0].id) as spec.SpriteComponentData;\n\n      if (spriteComponent) {\n        const shape = spriteComponent.renderer.shape;\n        let shapeData;\n\n        if (Number.isInteger(shape)) {\n          // @ts-expect-error\n          shapeData = json.shapes?.[shape as number];\n        } else {\n          shapeData = shape;\n        }\n\n        spriteComponent.renderer.shape = shapeData;\n      }\n    }\n  }\n\n  // Composition id 转 guid, Composition 分离 CompositionComponent\n  const compositionId = json.compositionId;\n  const compositionIdToGUIDMap: Record<string, string> = {};\n\n  for (const composition of json.compositions) {\n    const guid = generateGUID();\n\n    compositionIdToGUIDMap[composition.id] = guid;\n    if (composition.id === compositionId) {\n      json.compositionId = guid;\n    }\n    composition.id = guid;\n\n    const compositionComponent = {\n      id: generateGUID(),\n      dataType: 'CompositionComponent',\n      //@ts-expect-error\n      items: composition.items,\n      //@ts-expect-error\n      timelineAsset: composition.timelineAsset,\n      //@ts-expect-error\n      sceneBindings: composition.sceneBindings,\n      item: { id: composition.id },\n    } as unknown as spec.ComponentData;\n\n    //@ts-expect-error\n    composition.timelineAsset = undefined;\n    //@ts-expect-error\n    composition.sceneBindings = undefined;\n    composition.components = [{ id: compositionComponent.id }];\n    json.components.push(compositionComponent);\n  }\n  // 预合成元素 refId 同步改为生成的合成 guid\n  for (const item of json.items) {\n    if (item.content) {\n      const compositionOptions = (item.content as CompositionContent).options;\n\n      if (compositionOptions && compositionOptions.refId !== undefined) {\n        compositionOptions.refId = compositionIdToGUIDMap[compositionOptions.refId];\n      }\n    }\n  }\n\n  json.version = JSONSceneVersion['3_4'];\n\n  return json;\n}\n\nexport function version34Migration (json: JSONScene): JSONScene {\n  const idToComponentMap: Record<string, spec.ComponentData> = {};\n\n  for (const componentData of json.components) {\n    idToComponentMap[componentData.id] = componentData;\n  }\n\n  // 修复合成组件的 item id 问题\n  for (const composition of json.compositions) {\n    for (const component of composition.components) {\n      const componentID = (component).id;\n\n      idToComponentMap[componentID].item.id = composition.id;\n    }\n  }\n\n  // 兼容老 Shape 资源\n  for (const componentData of json.components) {\n    if (componentData.dataType === spec.DataType.SpriteComponent) {\n      const spriteComponentData = componentData as spec.SpriteComponentData;\n      const renderer = spriteComponentData.renderer;\n      const shapeData = renderer.shape as spec.ShapeGeometry;\n\n      if (shapeData !== undefined && shapeData !== null && !('aPoint' in shapeData && 'index' in shapeData)) {\n        const geometryData = createGeometryDataByShape(shapeData);\n\n        //@ts-expect-error\n        spriteComponentData.geometry = { id: geometryData.id };\n        json.geometries.push(geometryData);\n      }\n    }\n\n    if (componentData.dataType === spec.DataType.ShapeComponent) {\n      const shapeComponentData = componentData as ShapeComponentData;\n\n      shapeComponentData.fills = [];\n      //@ts-expect-error\n      if (shapeComponentData.fill) {\n        const solidPaintData: spec.SolidPaintData = {\n          type: spec.FillType.Solid,\n          //@ts-expect-error\n          color: shapeComponentData.fill.color,\n        };\n\n        shapeComponentData.fills.push(solidPaintData);\n      }\n      //@ts-expect-error\n      delete shapeComponentData.fill;\n\n      shapeComponentData.strokes = [];\n      //@ts-expect-error\n      if (shapeComponentData.stroke) {\n        const solidPaintData: spec.SolidPaintData = {\n          type: spec.FillType.Solid,\n          //@ts-expect-error\n          color: shapeComponentData.stroke.color,\n        };\n\n        shapeComponentData.strokes.push(solidPaintData);\n\n        //@ts-expect-error\n        shapeComponentData.strokeWidth = shapeComponentData.stroke.width;\n        //@ts-expect-error\n        shapeComponentData.strokeCap = shapeComponentData.stroke.cap;\n        //@ts-expect-error\n        shapeComponentData.strokeJoin = shapeComponentData.stroke.join;\n\n        //@ts-expect-error\n        delete shapeComponentData.stroke;\n      }\n    }\n  }\n\n  //@ts-expect-error\n  json.version = '3.5';\n\n  return json;\n}\n\nexport function version35Migration (json: JSONScene): JSONScene {\n  // 处理富文本 lineGap 兼容性\n  if (json.components) {\n    // 遍历所有组件，处理富文本组件\n    for (const component of json.components) {\n      // 识别富文本组件并处理 lineGap 兼容性\n      if (\n        component.dataType === spec.DataType.RichTextComponent\n      ) {\n        const richTextComponent = component as spec.RichTextComponentData;\n\n        if (richTextComponent.options) {\n          // 检查是否已经处理过\n          //@ts-expect-error\n          if (richTextComponent.options.useLegacyRichText === undefined) {\n            // 根据是否存在 lineGap 字段来判断版本\n            if (richTextComponent.options.lineGap === undefined) {\n              // 旧版本（没有 lineGap 字段）\n              //@ts-expect-error\n              richTextComponent.options.useLegacyRichText = true;\n            } else {\n              // 新版本（有 lineGap 字段）\n              //@ts-expect-error\n              richTextComponent.options.useLegacyRichText = false;\n            }\n          }\n        }\n      }\n      // 识别富文本组件并处理 textVerticalAlign 兼容性\n      if (\n        component.dataType === spec.DataType.TextComponent ||\n        (\n          component.dataType === spec.DataType.RichTextComponent &&\n          (component as spec.RichTextComponentData).options\n        )\n      ) {\n        ensureTextVerticalAlign((component as spec.RichTextComponentData).options);\n      }\n      // 处理文本颜色从 0-255 到 0-1 的转换\n      if (\n        component.dataType === spec.DataType.TextComponent\n      ) {\n        convertTextColorTo01((component as spec.TextComponentData).options);\n      }\n    }\n  }\n\n  //@ts-expect-error\n  json.version = '3.6';\n\n  return json;\n}\n\n/**\n * 确保文本组件有版本标识字段\n */\nfunction ensureTextVerticalAlign (options: any) {\n  // 检查是否已经处理过\n  if (!options || options.TextVerticalAlign !== undefined) {\n    return;\n  }\n\n  // 根据是否存在TextVerticalAlign字段来判断版本\n  if (options.TextVerticalAlign === undefined) {\n    //旧版本（没有 TextVerticalAlign 字段）\n    options.TextVerticalAlign = options.textBaseline;\n  }\n}\n\n/**\n * 将文本颜色从 0-255 转换到 0-1\n */\nfunction convertTextColorTo01 (options: spec.TextContentOptions) {\n  if (!options || !options.textColor) {\n    return;\n  }\n\n  const textColor = options.textColor;\n\n  // 将 RGB 从 0-255 转换到 0-1（alpha 通道已经是 0-1，不需要转换）\n  options.textColor = [\n    textColor[0] / 255.0,\n    textColor[1] / 255.0,\n    textColor[2] / 255.0,\n    textColor[3] ?? 1, // alpha 保持不变\n  ];\n}\n\n/**\n * 根据形状获取形状几何体数据\n * @param shape - 形状\n * @returns 形状几何体数据\n */\nfunction createGeometryDataByShape (shape: spec.ShapeGeometry, geometryDataName = '形状') {\n  const targetGeometry = getGeometryByShape(shape);\n  const { index = [], aPoint = [] } = targetGeometry;\n  const point = new Float32Array(aPoint);\n  const position = [];\n  const atlasOffset = [];\n\n  for (let i = 0; i < point.length; i += 6) {\n    atlasOffset.push(aPoint[i + 2], aPoint[i + 3]);\n    position.push(point[i], point[i + 1], 0.0);\n  }\n\n  // 用 position altasOffset index 创建GeometryData\n  const subMeshes: {\n    offset: number,\n    indexCount: number,\n    vertexCount: number,\n  }[] = [];\n  const vertexCount = position.length / 3;\n  const indexCount = index.length;\n  const positionByteLength = position.length * 4;\n  const uvByteLength = atlasOffset.length * 4;\n  const vertexByteLength = positionByteLength + uvByteLength;\n  const indexByteLength = index.length * 2;\n\n  const geometryData: spec.GeometryData = {\n    mode: spec.GeometryType.TRIANGLES,\n    vertexData: {\n      vertexCount,\n      channels: [],\n    },\n    name: geometryDataName,\n    indexFormat: spec.IndexFormatType.UInt16,\n    indexOffset: vertexByteLength,\n    buffer: '',\n    id: generateGUID(),\n    dataType: spec.DataType.Geometry,\n    subMeshes,\n  };\n\n  geometryData.vertexData.channels.push({\n    semantic: spec.VertexBufferSemantic.Position,\n    offset: 0,\n    format: spec.VertexFormatType.Float32,\n    dimension: 3,\n  });\n\n  geometryData.vertexData.channels.push({\n    semantic: spec.VertexBufferSemantic.Uv,\n    offset: positionByteLength,\n    format: spec.VertexFormatType.Float32,\n    dimension: 2,\n  });\n\n  geometryData.subMeshes.push({\n    offset: 0,\n    indexCount,\n    vertexCount,\n  });\n\n  const supByteLength = indexByteLength % 4 === 0 ? 0 : 2;\n  const infoBuffer = new ArrayBuffer(vertexByteLength + indexByteLength + supByteLength);\n  const vertexArray = new Float32Array(infoBuffer);\n\n  vertexArray.set(position, 0);\n  vertexArray.set(atlasOffset, position.length);\n\n  const indexArray = new Uint16Array(infoBuffer, vertexByteLength);\n\n  indexArray.set(index, 0);\n\n  const uint8View = new Uint8Array(infoBuffer).slice(0, vertexByteLength + indexByteLength);\n\n  geometryData.binaryData = uint8View;\n\n  return geometryData;\n}\n\nexport function processContent (composition: spec.CompositionData) {\n  //@ts-expect-error\n  for (const item of composition.items) {\n    const itemProps = itemMap.get(item.id);\n\n    if (!itemProps) {\n      return;\n    }\n\n    if (\n      itemProps.type === spec.ItemType.sprite ||\n      itemProps.type === spec.ItemType.particle ||\n      itemProps.type === spec.ItemType.spine ||\n      itemProps.type === spec.ItemType.text ||\n      itemProps.type === spec.ItemType.richtext ||\n      itemProps.type === spec.ItemType.video ||\n      itemProps.type === spec.ItemType.shape\n    ) {\n      const component = componentMap.get(itemProps.components[0].id);\n\n      if (component) {\n        processMask(component);\n      }\n    }\n  }\n}\n\nexport function processMask (renderContent: any) {\n  const renderer = renderContent.renderer;\n  const maskMode = renderer?.maskMode;\n\n  if (!maskMode || maskMode === MaskMode.NONE) {\n\n    return;\n  }\n\n  if (maskMode === MaskMode.MASK) {\n    renderContent.mask = {\n      isMask: true,\n    };\n    currentMaskComponent = renderContent.id;\n  } else if (\n    maskMode === spec.ObscuredMode.OBSCURED ||\n    maskMode === spec.ObscuredMode.REVERSE_OBSCURED\n  ) {\n    renderContent.mask = {\n      inverted: maskMode === spec.ObscuredMode.REVERSE_OBSCURED ? true : false,\n      reference: {\n        'id': currentMaskComponent,\n      },\n    };\n  }\n}\n\n/**\n * 3.0 以下版本数据适配（runtime 2.0及以上版本支持）\n */\nexport function version30Migration (json: JSONSceneLegacy): JSONScene {\n  const result: JSONScene = {\n    ...json,\n    items: [],\n    compositions: [],\n    components: [],\n    materials: [],\n    shaders: [],\n    geometries: [],\n    animations: [],\n    miscs: [],\n  };\n\n  // image数据添加 guid\n  for (const image of result.images) {\n    image.id = generateGUID();\n  }\n\n  // 兼容老版本数据中不存在textures的情况\n  result.textures ??= [];\n  result.textures.forEach(textureOptions => {\n    textureOptions.id = generateGUID();\n    textureOptions.dataType = DataType.Texture;\n    // @ts-expect-error\n    textureOptions.source = { id: result.images[textureOptions.source]?.id };\n  });\n\n  if (result.textures.length < result.images.length) {\n    for (let i = result.textures.length; i < result.images.length; i++) {\n      result.textures.push({\n        id: generateGUID(),\n        dataType: DataType.Texture,\n        source: { id: result.images[i].id },\n        flipY: true,\n      });\n    }\n  }\n\n  // 处理老版本数据中 bins 没有 id 的情况\n  if (json.bins) {\n    convertBinaryAsset(json.bins, result);\n  }\n\n  const itemOldIdToGuidMap: Record<string, string> = {};\n  const guidToItemMap: Record<string, Item> = {};\n\n  // 更正Composition.endBehavior\n  for (const composition of json.compositions) {\n    // composition 的 endBehavior 兼容\n    if (\n      // @ts-expect-error\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison\n      composition.endBehavior === END_BEHAVIOR_PAUSE_AND_DESTROY ||\n      // @ts-expect-error\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison\n      composition.endBehavior === END_BEHAVIOR_PAUSE\n    ) {\n      composition.endBehavior = EndBehavior.freeze;\n    }\n\n    // 过滤掉滤镜元素\n    composition.items = composition.items.filter(item => item.type !== '8' as ItemType);\n\n    // 过滤掉粒子滤镜（扭曲）\n    composition.items.forEach(item => {\n      if (item.type === ItemType.particle) {\n        // @ts-expect-error\n        const filterData = item.content['filter'];\n\n        if (filterData) {\n          // @ts-expect-error\n          delete item.content['filter'];\n        }\n      }\n    });\n\n    for (const item of composition.items) {\n      itemOldIdToGuidMap[item.id] = generateGUID();\n      // TODO: 编辑器测试用，上线后删除\n      //@ts-expect-error\n      item.oldId = item.id;\n      item.id = itemOldIdToGuidMap[item.id];\n      guidToItemMap[item.id] = item;\n    }\n\n    composition.items.forEach((item, index) => {\n      if (item.parentId) {\n        if (item.parentId.includes('^')) {\n          const parentId = (item.parentId).split('^')[0];\n          const nodeId = (item.parentId).split('^')[1];\n\n          item.parentId = itemOldIdToGuidMap[parentId] + '^' + nodeId;\n        } else {\n          item.parentId = itemOldIdToGuidMap[item.parentId];\n        }\n      }\n\n      // @ts-expect-error fix item type\n      result.items.push(item);\n\n      // @ts-expect-error fix item type\n      composition.items[index] = { id: item.id };\n    });\n\n    const compositionData: CompositionData = {\n      ...composition,\n      //@ts-expect-error\n      timelineAsset: { id: '' },\n      sceneBindings: [],\n    };\n\n    result.compositions.push(compositionData);\n    // 生成时间轴数据\n    convertTimelineAsset(compositionData, guidToItemMap, result);\n\n  }\n\n  for (const item of result.items) {\n    // 原 texture 索引转为统一 guid 索引\n    if (item.content) {\n      if (item.content.renderer) {\n        if (item.content.renderer.texture !== undefined) {\n          const oldTextureId = item.content.renderer.texture;\n\n          item.content.renderer.texture = { id: result.textures[oldTextureId].id };\n        }\n      }\n\n      if (item.content.trails) {\n        if (item.content.trails.texture !== undefined) {\n          const oldTextureId = item.content.trails.texture;\n\n          item.content.trails.texture = { id: result.textures[oldTextureId].id };\n        }\n      }\n    }\n\n    // item 的 transform 属性由数组转为 {x:n, y:n, z:n}\n    if (item.transform) {\n      //@ts-expect-error\n      const position = [...item.transform.position ?? [0, 0, 0]];\n      //@ts-expect-error\n      const rotation = [...item.transform.rotation ?? [0, 0, 0]] as number[];\n      //@ts-expect-error\n      const scale = [...item.transform.scale ?? [1, 1, 1]];\n\n      Object.assign(item, {\n        transform: {\n          position: { x: position[0], y: position[1], z: position[2] },\n          eulerHint: { x: rotation[0], y: rotation[1], z: rotation[2] },\n          scale: { x: scale[0], y: scale[1], z: scale[0] },\n        },\n      });\n\n      // sprite 的 scale 转为 size\n      if (item.type === ItemType.sprite) {\n        item.transform.size = { x: scale[0], y: scale[1] };\n        item.transform.scale = { x: 1, y: 1, z: 1 };\n      }\n\n      // sprite 的 anchor 修正\n      if (item.type === ItemType.sprite) {\n        const content = item.content;\n\n        if (!content.renderer) {\n          content.renderer = {};\n        }\n        const renderer = content.renderer;\n        const realAnchor = convertAnchor(renderer.anchor, renderer.particleOrigin);\n        const startSize = item.transform.size;\n\n        // 兼容旧JSON（anchor和particleOrigin可能同时存在）\n        if (!renderer.anchor && renderer.particleOrigin !== undefined) {\n          item.transform.position.x += -realAnchor[0] * (startSize?.x ?? 1);\n          item.transform.position.y += -realAnchor[1] * (startSize?.y ?? 1);\n        }\n        item.transform.anchor = { x: realAnchor[0] * (startSize?.x ?? 1), y: realAnchor[1] * (startSize?.y ?? 1) };\n      }\n    }\n\n    if (item.type === ItemType.particle) {\n      const content = item.content;\n\n      if (!content.renderer) {\n        content.renderer = {};\n      }\n      const renderer = content.renderer;\n\n      content.renderer.anchor = convertAnchor(renderer.anchor, renderer.particleOrigin);\n    }\n\n    // 修复相机K帧缺失 asMovement 参数\n    if (item.type === ItemType.camera && item.content.positionOverLifetime && Object.keys(item.content.positionOverLifetime).length !== 0) {\n      item.content.positionOverLifetime.asMovement = true;\n    }\n\n    // 修正老 json 的 item.pluginName\n    if (item.pn !== undefined) {\n      const pn = item.pn;\n      const { plugins = [] } = json;\n\n      if (pn !== undefined && Number.isInteger(pn)) {\n        item.pluginName = plugins[pn];\n      }\n    }\n\n    // 修正老 json 的 item.type\n    if (item.pluginName === 'editor-gizmo') {\n      //@ts-expect-error\n      item.type = 'editor-gizmo';\n    }\n    if (item.pluginName === 'orientation-transformer') {\n      //@ts-expect-error\n      item.type = 'orientation-transformer';\n    }\n\n    // gizmo 的 target id 转换为新的 item guid\n    if (item.content.options.target && item.pluginName === 'editor-gizmo') {\n      item.content.options.target = itemOldIdToGuidMap[item.content.options.target];\n    }\n\n    // Spine 元素转为 guid 索引\n    if (\n      item.type === ItemType.spine\n      && json.spines\n      && json.spines.length !== 0\n    ) {\n      convertSpineData(json.spines[item.content.options.spine], item.content, result);\n    }\n\n    // item 的 content 转为 component data 加入 JSONScene.components\n    if (\n      item.type === ItemType.sprite ||\n      item.type === ItemType.particle ||\n      item.type === ItemType.mesh ||\n      item.type === ItemType.skybox ||\n      item.type === ItemType.light ||\n      item.type === 'camera' as ItemType ||\n      item.type === ItemType.tree ||\n      item.type === ItemType.interact ||\n      item.type === ItemType.camera ||\n      item.type === ItemType.text ||\n      item.type === ItemType.spine ||\n      item.type === 'editor-gizmo' as ItemType ||\n      item.type === 'orientation-transformer' as ItemType\n    ) {\n      item.components = [];\n      result.components.push(item.content);\n      item.content.id = generateGUID();\n      item.content.item = { id: item.id };\n      item.dataType = DataType.VFXItemData;\n      item.components.push({ id: item.content.id });\n    }\n\n    if (item.type === ItemType.null || item.type === ItemType.composition) {\n      item.components = [];\n      item.dataType = DataType.VFXItemData;\n    }\n\n    switch (item.type) {\n      case ItemType.sprite:\n        item.content.dataType = DataType.SpriteComponent;\n\n        break;\n      case ItemType.particle:\n        item.content.dataType = DataType.ParticleSystem;\n\n        break;\n      case ItemType.mesh:\n        item.content.dataType = DataType.MeshComponent;\n\n        break;\n      case ItemType.skybox:\n        item.content.dataType = DataType.SkyboxComponent;\n\n        break;\n      case ItemType.light:\n        item.content.dataType = DataType.LightComponent;\n\n        break;\n      case 'camera' as ItemType:\n        item.content.dataType = DataType.CameraComponent;\n\n        break;\n      case 'editor-gizmo' as ItemType:\n        item.content.dataType = 'GizmoComponent';\n\n        break;\n      case 'orientation-transformer' as ItemType:\n        item.content.dataType = 'OrientationComponent';\n\n        break;\n      case ItemType.tree:\n        item.content.dataType = DataType.TreeComponent;\n\n        break;\n      case ItemType.interact:\n        item.content.dataType = DataType.InteractComponent;\n\n        break;\n      case ItemType.camera:\n        item.content.dataType = DataType.CameraController;\n\n        break;\n      case ItemType.text:\n        item.content.dataType = DataType.TextComponent;\n\n        break;\n      case ItemType.spine:\n        item.content.dataType = DataType.SpineComponent;\n\n        break;\n    }\n  }\n\n  result.version = JSONSceneVersion['3_0'];\n\n  return result;\n}\n\n/**\n * 2.5 以下版本 赫尔米特数据转换成贝塞尔数据\n */\nexport function version24Migration (json: JSONScene): JSONScene {\n  // 曲线转换成贝塞尔\n  json.compositions.map((comp: any) => {\n    for (const item of comp.items) {\n      convertParam(item.content);\n    }\n  });\n\n  return json;\n}\n\nexport function convertParam (content?: BaseContent) {\n  if (!content) {\n    return;\n  }\n  for (const key of Object.keys(content)) {\n    const value = content[key];\n    const isArray = Array.isArray(value);\n\n    if (isArray && value.length === 2 && Array.isArray(value[1])) {\n      if (key === 'path') {\n        content[key] = ensureFixedVec3(value);\n      } else {\n        content[key] = ensureFixedNumber(value);\n      }\n    } else if (!isArray && typeof value === 'object') {\n      convertParam(value);\n    }\n  }\n}\n\nfunction convertTimelineAsset (composition: CompositionData, guidToItemMap: Record<string, Item>, jsonScene: JSONScene) {\n  const sceneBindings = [];\n  const trackDatas = [];\n  const playableAssetDatas = [];\n  const timelineAssetData: TimelineAssetData = {\n    tracks: [],\n    id: generateGUID(),\n    //@ts-expect-error\n    dataType: 'TimelineAsset',\n  };\n\n  //@ts-expect-error\n  for (const itemDataPath of composition.items) {\n    const item = guidToItemMap[itemDataPath.id];\n    const subTrackDatas = [];\n\n    const newActivationPlayableAsset = {\n      id: generateGUID(),\n      dataType: 'ActivationPlayableAsset',\n    };\n\n    playableAssetDatas.push(newActivationPlayableAsset);\n    const newActivationTrackData = {\n      id: generateGUID(),\n      dataType: 'ActivationTrack',\n      children: [],\n      clips: [\n        {\n          start: item.delay,\n          duration: item.duration,\n          endBehavior: item.endBehavior,\n          asset: {\n            id: newActivationPlayableAsset.id,\n          },\n        },\n      ],\n    };\n\n    subTrackDatas.push({ id: newActivationTrackData.id });\n    trackDatas.push(newActivationTrackData);\n\n    if (item.type !== ItemType.particle) {\n      const newTransformPlayableAssetData = {\n        id: generateGUID(),\n        dataType: 'TransformPlayableAsset',\n        //@ts-expect-error\n        sizeOverLifetime: item.content.sizeOverLifetime,\n        //@ts-expect-error\n        rotationOverLifetime: item.content.rotationOverLifetime,\n        //@ts-expect-error\n        positionOverLifetime: item.content.positionOverLifetime,\n      };\n\n      playableAssetDatas.push(newTransformPlayableAssetData);\n      const newTrackData = {\n        id: generateGUID(),\n        dataType: 'TransformTrack',\n        children: [],\n        clips: [\n          {\n            start: item.delay,\n            duration: item.duration,\n            endBehavior: item.endBehavior,\n            asset: {\n              id: newTransformPlayableAssetData.id,\n            },\n          },\n        ],\n      };\n\n      subTrackDatas.push({ id: newTrackData.id });\n      trackDatas.push(newTrackData);\n    }\n\n    if (item.type === ItemType.sprite || item.type === ItemType.text) {\n      const newSpriteColorPlayableAssetData = {\n        id: generateGUID(),\n        dataType: 'SpriteColorPlayableAsset',\n        colorOverLifetime: item.content.colorOverLifetime,\n      };\n\n      playableAssetDatas.push(newSpriteColorPlayableAssetData);\n      const newTrackData = {\n        id: generateGUID(),\n        dataType: 'SpriteColorTrack',\n        children: [],\n        clips: [\n          {\n            start: item.delay,\n            duration: item.duration,\n            endBehavior: item.endBehavior,\n            asset: {\n              id: newSpriteColorPlayableAssetData.id,\n            },\n          },\n        ],\n      };\n\n      subTrackDatas.push({ id: newTrackData.id });\n      trackDatas.push(newTrackData);\n    }\n\n    if (item.type === ItemType.composition) {\n      const newSubCompositionPlayableAssetData = {\n        id: generateGUID(),\n        dataType: 'SubCompositionPlayableAsset',\n      };\n\n      playableAssetDatas.push(newSubCompositionPlayableAssetData);\n      const newTrackData = {\n        id: generateGUID(),\n        dataType: 'SubCompositionTrack',\n        children: [],\n        clips: [\n          {\n            start: item.delay,\n            duration: item.duration,\n            endBehavior: item.endBehavior,\n            asset: {\n              id: newSubCompositionPlayableAssetData.id,\n            },\n          },\n        ],\n      };\n\n      subTrackDatas.push({ id: newTrackData.id });\n      trackDatas.push(newTrackData);\n    }\n\n    const bindingTrackData = {\n      id: generateGUID(),\n      dataType: 'ObjectBindingTrack',\n      children: subTrackDatas,\n      clips: [],\n    };\n\n    trackDatas.push(bindingTrackData);\n    timelineAssetData.tracks.push({ id: bindingTrackData.id });\n    sceneBindings.push({\n      key: { id: bindingTrackData.id },\n      value: { id: item.id },\n    });\n  }\n\n  const trackIds = [];\n\n  for (const trackData of trackDatas) {\n    trackIds.push({ id: trackData.id });\n  }\n\n  //@ts-expect-error\n  composition.timelineAsset = { id: timelineAssetData.id };\n  //@ts-expect-error\n  composition.sceneBindings = sceneBindings;\n\n  jsonScene.miscs.push(timelineAssetData);\n\n  for (const trackData of trackDatas) {\n    //@ts-expect-error\n    jsonScene.miscs.push(trackData);\n  }\n  for (const playableAsset of playableAssetDatas) {\n    //@ts-expect-error\n    jsonScene.miscs.push(playableAsset);\n  }\n}\n\nexport function convertBinaryAsset (bins: BinaryFile[], jsonScene: JSONScene) {\n  //@ts-expect-error\n  jsonScene.bins = bins.map(bin => ({\n    url: bin.url,\n    'dataType': 'BinaryAsset',\n    id: generateGUID(),\n  }));\n}\n\nexport function convertSpineData (resource: SpineResource, content: SpineContent, jsonScene: JSONScene) {\n  //@ts-expect-error\n  content.resource = {\n    'atlas': {\n      'bins': {\n        //@ts-expect-error\n        'id': jsonScene.bins[resource.atlas[1][0]].id,\n      },\n      'source': resource.atlas[1].slice(1),\n    },\n    'skeleton': {\n      'bins': {\n        //@ts-expect-error\n        'id': jsonScene.bins[resource.skeleton[1][0]].id,\n      },\n      'source': resource.skeleton[1].slice(1),\n    },\n    'skeletonType': resource.skeletonType,\n    'images': resource.images.map(i => ({\n      //@ts-expect-error\n      id: jsonScene.textures[i].id,\n    })),\n  };\n\n}\n","import type {\n  BaseItemTransform, NullContent, PositionOverLifetime, RotationOverLifetime,\n  ColorOverLifetime, SpriteContent,\n} from '@galacean/effects-specification';\nimport {\n  deleteEmptyValue, ensureFixedNumber, ensureFixedVec3, ensureRGBAValue, getGradientColor,\n} from './utils';\n\nexport function getStandardNullContent (sprite: any, transform: BaseItemTransform): NullContent {\n  const opt = sprite.options;\n  const velocityOverLifetime = sprite.velocityOverLifetime || {};\n  const positionOverLifetime: PositionOverLifetime = {\n    path: ensureFixedVec3(sprite.transform?.path),\n    gravity: opt.gravity,\n    gravityOverLifetime: ensureFixedNumber(opt.gravityModifier),\n    direction: opt.direction,\n    startSpeed: opt.startSpeed,\n    asMovement: velocityOverLifetime.asMovement,\n    linearX: ensureFixedNumber(velocityOverLifetime.linearX),\n    linearY: ensureFixedNumber(velocityOverLifetime.linearY),\n    linearZ: ensureFixedNumber(velocityOverLifetime.linearZ),\n    asRotation: velocityOverLifetime.asRotation,\n    orbCenter: velocityOverLifetime.orbCenter,\n    orbitalX: ensureFixedNumber(velocityOverLifetime.orbitalX),\n    orbitalY: ensureFixedNumber(velocityOverLifetime.orbitalY),\n    orbitalZ: ensureFixedNumber(velocityOverLifetime.orbitalZ),\n    speedOverLifetime: ensureFixedNumber(velocityOverLifetime.speedOverLifetime),\n  };\n\n  deleteEmptyValue(positionOverLifetime);\n  const ret: NullContent = {\n    options: {\n      startColor: ensureRGBAValue(opt.startColor),\n    },\n    positionOverLifetime,\n  };\n\n  if (opt.startSize) {\n    transform.scale = [opt.startSize, opt.startSize / (opt.sizeAspect || 1), 1];\n  }\n  if (opt.startRotation) {\n    if (!transform.rotation) {\n      transform.rotation = [0, 0, opt.startRotation];\n    } else {\n      transform.rotation[2] += opt.startRotation;\n    }\n  }\n  const rotationOverLifetime = sprite.rotationOverLifetime;\n\n  if (rotationOverLifetime) {\n    const rot: RotationOverLifetime = ret.rotationOverLifetime = {\n      separateAxes: rotationOverLifetime.separateAxes,\n      asRotation: rotationOverLifetime.asRotation,\n    };\n\n    if (rot.separateAxes) {\n      rot.x = ensureFixedNumber(rotationOverLifetime.x);\n      rot.y = ensureFixedNumber(rotationOverLifetime.y);\n      rot.z = ensureFixedNumber(rotationOverLifetime.z);\n    } else {\n      rot.z = ensureFixedNumber(rotationOverLifetime.angularVelocity);\n    }\n  }\n\n  const colorOverLifetime = sprite.colorOverLifetime;\n\n  if (colorOverLifetime) {\n    const col: ColorOverLifetime = ret.colorOverLifetime = {\n      opacity: ensureFixedNumber(colorOverLifetime.opacity),\n    };\n\n    if (colorOverLifetime.color) {\n      col.color = getGradientColor(colorOverLifetime.color);\n    }\n  }\n  const sizeOverLifetime = sprite.sizeOverLifetime;\n\n  if (sizeOverLifetime) {\n    ret.sizeOverLifetime = {\n      separateAxes: sizeOverLifetime.separateAxes,\n      size: ensureFixedNumber(sizeOverLifetime.size),\n      x: ensureFixedNumber(sizeOverLifetime.x),\n      y: ensureFixedNumber(sizeOverLifetime.y),\n      z: ensureFixedNumber(sizeOverLifetime.z),\n    };\n  }\n\n  return ret;\n}\n\nexport function getStandardSpriteContent (sprite: any, transform: BaseItemTransform): SpriteContent {\n  const ret = getStandardNullContent(sprite, transform) as SpriteContent;\n  const texAni = sprite.textureSheetAnimation;\n\n  if (texAni) {\n    ret.textureSheetAnimation = {\n      row: texAni.row,\n      col: texAni.col,\n      total: texAni.total || undefined,\n      animate: texAni.animate,\n    };\n  }\n  ret.renderer = sprite.renderer;\n  if (sprite.splits) {\n    ret.splits = sprite.splits;\n  }\n  if (sprite.interaction) {\n    ret.interaction = sprite.interaction;\n  }\n\n  return ret;\n}\n","import type {\n  BaseItem, BaseItemTransform, Composition, CompressedImage, Image, JSONScene, JSONSceneLegacy,\n  ParticleItem, RenderLevel, SpriteItem, TemplateImage,\n} from '@galacean/effects-specification';\nimport { CAMERA_CLIP_MODE_NORMAL, EndBehavior, ItemType, JSONSceneVersion } from '@galacean/effects-specification';\nimport { generateGUID } from '../utils';\nimport { getStandardCameraContent } from './camera';\nimport { getStandardInteractContent } from './interact';\nimport {\n  version21Migration, version22Migration, version24Migration, version30Migration,\n  version31Migration, version32Migration,\n  version33Migration,\n  version34Migration,\n  version35Migration,\n} from './migration';\nimport { getStandardParticleContent } from './particle';\nimport { getStandardNullContent, getStandardSpriteContent } from './sprite';\nimport { arrAdd, quatFromXYZRotation, rotationZYXFromQuat } from './utils';\n\nexport * from './utils';\n\nconst version = __VERSION__;\nconst v0 = /^(\\d+)\\.(\\d+)\\.(\\d+)(-(\\w+)\\.\\d+)?$/;\nconst standardVersion = /^(\\d+)\\.(\\d+)$/;\nlet reverseParticle = false;\n\nexport function getStandardJSON (json: any): JSONScene {\n  if (!json || typeof json !== 'object') {\n    throw new Error('Invalid input: Expected a JSON object.');\n  }\n\n  // 如果 JSON 中的 runtime 版本高于当前运行时版本，则发出警告\n  if (checkRuntimeVersion(json)) {\n    console.warn(`The JSON need higher than ${json.playerVersion?.web} runtime version(current: ${version}). Some features may not work as expected.`);\n  }\n\n  // 修正老版本数据中，meshItem 以及 lightItem 结束行为错误问题\n  version22Migration(json);\n\n  if (v0.test(json.version)) {\n    reverseParticle = (/^(\\d+)/).exec(json.version)?.[0] === '0';\n\n    return version35Migration(\n      version34Migration(\n        version33Migration(\n          version32Migration(\n            version31Migration(\n              version30Migration(\n                version21Migration(\n                  getStandardJSONFromV0(json))))))));\n  }\n\n  reverseParticle = false;\n\n  let vs = standardVersion.exec(json.version) || [];\n  let mainVersion = Number(vs[1]);\n  let minorVersion = Number(vs[2]);\n\n  if (mainVersion) {\n    if (mainVersion < 2 || (mainVersion === 2 && minorVersion < 4)) {\n      json = version24Migration(json);\n    }\n    if (mainVersion < 3) {\n      json = version30Migration(version21Migration(json));\n    }\n    // 版本号重新计算\n    vs = standardVersion.exec(json.version) || [];\n    mainVersion = Number(vs[1]);\n    minorVersion = Number(vs[2]);\n    // 3.x 版本格式转换\n    if (mainVersion < 4) {\n      if (minorVersion < 2) {\n        json = version31Migration(json);\n      }\n      if (minorVersion < 3) {\n        json = version32Migration(json);\n      }\n      if (minorVersion < 4) {\n        json = version33Migration(json);\n      }\n      if (minorVersion < 5) {\n        json = version34Migration(json);\n      }\n      if (minorVersion < 6) {\n        json = version35Migration(json);\n      }\n    }\n\n    return json;\n  }\n\n  throw new Error(`Invalid JSON version: ${json.version}.`);\n}\n\nlet currentVersion: JSONSceneVersion = JSONSceneVersion['1_0'];\n\nfunction getStandardJSONFromV0 (json: any): JSONSceneLegacy {\n  currentVersion = JSONSceneVersion['1_0'];\n  const plugins = json.plugins || [];\n\n  if (json.bins?.length) {\n    currentVersion = JSONSceneVersion['1_3'];\n  }\n  const requires: string[] = (json.requires || []).slice();\n  const images = json.images.map((img: any, index: number) => getStandardImage(img, index, json.imageTags || []));\n  const textures = json.textures || images.map((img: any, i: number) => ({ source: i, flipY: true }));\n  const ret: JSONSceneLegacy = {\n    plugins: plugins,\n    shapes: json.shapes || [],\n    type: 'ge',\n    version: currentVersion,\n    playerVersion: json.playerVersion ?? {\n      web: '',\n      native: '',\n    },\n    compositionId: json.compositionId + '',\n    compositions: json.compositions.map((comp: any) => getStandardComposition(comp, { plugins, requires })),\n    images,\n    imgUsage: json._imgs,\n    binUsage: json.binUsage,\n    spines: json.spines,\n    requires: json.requires,\n    textures,\n    bins: (json.bins || []).slice(),\n  };\n\n  if (json._textures) {\n    (ret as any)._textures = json._textures;\n  }\n\n  return ret;\n}\n\nexport function getStandardImage (image: any, index: number, imageTags: RenderLevel[]): TemplateImage | Image | CompressedImage {\n  const renderLevel = imageTags[index];\n\n  if (typeof image === 'string') {\n    return {\n      id: generateGUID(),\n      renderLevel,\n      url: image,\n    };\n  } else if (image.template) {\n    return {\n      id: generateGUID(),\n      url: image.url,\n      template: image.template,\n      webp: image.webp,\n      renderLevel,\n    };\n  } else if (image.compressed) {\n    return {\n      id: generateGUID(),\n      url: image.url,\n      // @ts-expect-error\n      compressed: {\n        astc: image.compressed.android,\n        pvrtc: image.compressed.iOS,\n      },\n      webp: image.webp,\n      renderLevel,\n    };\n  } else if (image.url) {\n    return {\n      id: generateGUID(),\n      url: image.url,\n      webp: image.webp,\n      renderLevel,\n    };\n  } else if (image && image.sourceType) {\n    return image;\n  }\n  throw new Error('Invalid image type.');\n}\n\nexport function getStandardComposition (composition: any, opt: { plugins?: string[], requires?: string[] } = {}): Composition {\n  const ret: Composition = {\n    id: composition.id + '',\n    camera: { clipMode: CAMERA_CLIP_MODE_NORMAL, ...composition.camera },\n    duration: composition.duration,\n    endBehavior: composition.endBehavior,\n    items: composition.items.map((item: any) => getStandardItem(item, opt)),\n    name: composition.name,\n  };\n  const startTime = composition.startTime || composition.st;\n\n  if (startTime) {\n    ret.startTime = startTime;\n  }\n  let previewSize = composition.meta?.previewSize;\n\n  if (previewSize && previewSize[0] === previewSize[1] && previewSize[0] === 0) {\n    previewSize = undefined;\n  }\n  if (previewSize) {\n    ret.previewSize = previewSize;\n  }\n\n  return ret;\n}\n\nconst tempQuat = [0, 0, 0, 1];\nconst stdAnchor = 0.5;\n\nexport function getStandardItem (item: any, opt: { plugins?: string[], requires?: string[] } = {}): SpriteItem | ParticleItem | BaseItem {\n  let type: ItemType | string = ItemType.base;\n  let transform: BaseItemTransform;\n  let originContent;\n  let content;\n  let endBehavior: EndBehavior = item.endBehavior;\n  let renderLevel: RenderLevel;\n  let pluginName: string;\n  let duration = NaN;\n  let pn: number;\n\n  if (item.content) {\n    type = item.type || ItemType.plugin;\n    pn = item.pn;\n    pluginName = item.pluginName;\n    content = item.content;\n    originContent = item.content;\n    if (isNaN(pn) && !pluginName) {\n      pluginName = content.options.type;\n    }\n    if (item.duration) {\n      duration = item.duration;\n    }\n    transform = item.transform || getTransform(originContent.transform);\n  } else if (item.particle) {\n    type = ItemType.particle;\n    originContent = item.particle;\n    transform = getTransform(originContent.transform, reverseParticle, true);\n    content = getStandardParticleContent(originContent);\n  } else if (item.sprite) {\n    type = ItemType.sprite;\n    originContent = item.sprite;\n    transform = getTransform(originContent.transform, false, true);\n    content = getStandardSpriteContent(originContent, transform);\n  } else if (item.cal) {\n    type = ItemType.null;\n    originContent = item.cal;\n    transform = getTransform(originContent.transform, false, true);\n    content = getStandardNullContent(originContent, transform);\n  } else if (item.ui) {\n    type = ItemType.interact;\n    originContent = item.ui;\n    transform = getTransform(originContent.transform);\n    content = getStandardInteractContent(originContent);\n    transform.scale = [originContent.options.width || 1, originContent.options.height || 1, 1];\n  } else if (item.model) {\n    originContent = item.model;\n    if (item.model.options.type === 1) {\n      type = ItemType.camera;\n      transform = getTransform(originContent.transform);\n      content = getStandardCameraContent(originContent);\n    }\n  }\n  if (content.renderer?.anchor) {\n    const anchor = new Float32Array(content.renderer.anchor);\n\n    if (anchor[0] == stdAnchor && anchor[1] == stdAnchor) {\n      delete content.renderer.anchor;\n    } else if (opt.requires) {\n      arrAdd(opt.requires, 'anchor');\n    }\n  }\n  if (originContent) {\n    const looping = originContent.options?.looping;\n\n    if (looping) {\n      if (Array.isArray(looping)) {\n        endBehavior = looping[1] ? EndBehavior.restart : EndBehavior.destroy;\n      } else {\n        endBehavior = EndBehavior.restart;\n      }\n    } else {\n      endBehavior = endBehavior || originContent?.options?.endBehavior || EndBehavior.destroy;\n    }\n    if (originContent.options.renderLevel) {\n      renderLevel = originContent.options.renderLevel;\n    }\n    if (isNaN(duration)) {\n      duration = originContent.options.duration;\n    }\n  }\n\n  const ret: BaseItem = {\n    type,\n    name: item.name,\n    delay: item.delay,\n    duration,\n    id: item.id + '',\n    // @ts-expect-error\n    transform,\n    endBehavior,\n    // @ts-expect-error\n    renderLevel,\n    content,\n  };\n\n  // @ts-expect-error\n  if (pluginName) {\n    if (opt.plugins) {\n      arrAdd(opt.plugins, pluginName);\n      ret.pn = opt.plugins.indexOf(pluginName);\n    } else {\n      ret.pluginName = pluginName;\n    }\n    // @ts-expect-error\n  } else if (Number.isInteger(pn)) {\n    // @ts-expect-error\n    ret.pn = pn;\n  }\n  if (item.parentId) {\n    ret.parentId = item.parentId + '';\n  }\n\n  return ret;\n\n  function getTransform (originTransform: BaseItemTransform, inverseRotation?: boolean, changeOrder?: boolean): BaseItemTransform {\n    if (originTransform) {\n      const transform: BaseItemTransform = {};\n      const rotation = originTransform.rotation;\n\n      if (rotation) {\n        if (inverseRotation) {\n          transform.rotation = [-rotation[0], -rotation[1], -rotation[2]];\n        } else {\n          transform.rotation = [rotation[0], rotation[1], rotation[2]];\n        }\n        if (changeOrder) {\n          const q = quatFromXYZRotation(tempQuat, transform.rotation[0], transform.rotation[1], transform.rotation[2]);\n\n          transform.rotation = rotationZYXFromQuat([], q);\n        }\n      }\n      const position = originTransform.position;\n\n      if (position) {\n        transform.position = originTransform.position;\n      }\n      if (Array.isArray(originTransform.scale)) {\n        transform.scale = [originTransform.scale[0] || 1, originTransform.scale[1] || 1, originTransform.scale[2] || 1];\n      }\n\n      return transform;\n    }\n\n    return {};\n  }\n}\n\n/**\n * 检查 json.playerVersion.web 的版本号是否低于当前 runtime 的版本\n */\nfunction checkRuntimeVersion (json: JSONScene) {\n  const { web = '' } = json.playerVersion || {};\n\n  if (web) {\n    const jsonVersionMatch = v0.exec(web) ?? [];\n    const runtimeVersionMatch = v0.exec(version) ?? [];\n    const [, major, minor] = jsonVersionMatch;\n    const [, currentMajor, currentMinor] = runtimeVersionMatch;\n\n    return (\n      Number(currentMajor) < Number(major) ||\n      (Number(currentMajor) === Number(major) && Number(currentMinor) < Number(minor))\n    );\n  }\n\n  return false;\n}\n","import * as spec from '@galacean/effects-specification';\nimport type { SceneRenderLevel } from './scene';\n\n/**\n * 机型和渲染等级对应表\n *\n * 机型：B-低端机、A-中端机、S-高端机\n * 渲染等级：B-低、A-中、S-高、A+-中高、B+-全部\n *\n * - S（高端机）：高、全部、中高\n * - A（中端机）：中、全部、中高\n * - B（低端机）：低、全部\n * - undefined（全部机型）\n */\nconst renderLevelPassSet: Record<SceneRenderLevel, spec.RenderLevel[]> = {\n  [spec.RenderLevel.S]: [spec.RenderLevel.S, spec.RenderLevel.BPlus, spec.RenderLevel.APlus],\n  [spec.RenderLevel.A]: [spec.RenderLevel.A, spec.RenderLevel.BPlus, spec.RenderLevel.APlus],\n  [spec.RenderLevel.B]: [spec.RenderLevel.B, spec.RenderLevel.BPlus],\n};\n\nexport function passRenderLevel (l?: spec.RenderLevel, renderLevel?: SceneRenderLevel): boolean {\n  if (!l || !renderLevel) {\n    return true;\n  }\n\n  const arr = renderLevelPassSet[renderLevel];\n\n  if (arr) {\n    return arr.includes(l);\n  }\n\n  return false;\n}\n","import type { ParticleContent, ParticleShape, ParticleShapeSphere, ColorOverLifetime } from '@galacean/effects-specification';\nimport { ParticleEmitterShapeType } from '@galacean/effects-specification';\nimport {\n  deleteEmptyValue, ensureColorExpression, ensureFixedNumber, ensureFixedNumberWithRandom,\n  ensureFixedVec3, ensureNumberExpression, getGradientColor, objectValueToNumber,\n} from './utils';\n\nexport function getStandardParticleContent (particle: any): ParticleContent {\n  const options = particle.options;\n  const transform = particle.transform;\n  let shape: ParticleShape = {\n    type: ParticleEmitterShapeType.NONE,\n  };\n\n  if (particle.shape) {\n    const shapeType = particle.shape.shape?.replace(/([A-Z])/g, '_$1').toUpperCase().replace(/^_/, '');\n\n    shape = {\n      ...particle.shape,\n      type: ParticleEmitterShapeType[shapeType as keyof typeof ParticleEmitterShapeType],\n    };\n    if (particle.shape.upDirection) {\n      const [x, y, z] = particle.shape.upDirection;\n\n      if (x === 0 && y === 0 && z === 0) {\n        delete (shape as ParticleShapeSphere).upDirection;\n      }\n    }\n  }\n  if (options.startTurbulence) {\n    shape.turbulenceX = ensureNumberExpression(options.turbulenceX);\n    shape.turbulenceY = ensureNumberExpression(options.turbulenceY);\n    shape.turbulenceZ = ensureNumberExpression(options.turbulenceZ);\n  }\n  const emission = particle.emission;\n\n  if (emission.bursts && emission.bursts.length > 0) {\n    emission.bursts = emission.bursts.map((b: any) => objectValueToNumber(b));\n  }\n  if (emission.burstOffsets && emission.burstOffsets.length > 0) {\n    emission.burstOffsets = emission.burstOffsets.map((b: any) => objectValueToNumber(b));\n  }\n  if (emission.rateOverTime) {\n    emission.rateOverTime = ensureNumberExpression(emission.rateOverTime);\n  }\n\n  const ret: ParticleContent = {\n    renderer: particle.renderer,\n    shape,\n    splits: particle.splits,\n    emission: emission,\n    options: {\n      startLifetime: ensureNumberExpression(options.startLifetime)!,\n      start3DSize: !!options.start3DSize,\n      startSize: ensureNumberExpression(options.startSize),\n      startSizeX: ensureNumberExpression(options.startSizeX),\n      startSizeY: ensureNumberExpression(options.startSizeY),\n      sizeAspect: ensureNumberExpression(options.sizeAspect),\n      maxCount: options.maxCount,\n      startDelay: ensureNumberExpression(options.startDelay),\n      startColor: ensureColorExpression(options.startColor, true),\n      startRotationZ: ensureNumberExpression(options.startRotation || options.startRotationZ),\n      particleFollowParent: options.particleFollowParent,\n    },\n  };\n\n  if (options.start3DRotation) {\n    ret.options.startRotationX = ensureNumberExpression(options.startRotationX);\n    ret.options.startRotationY = ensureNumberExpression(options.startRotationY);\n  }\n\n  if (transform && transform.path) {\n    ret.emitterTransform = {\n      path: ensureFixedVec3(transform.path),\n    };\n  }\n  const sizeOverLifetime = particle.sizeOverLifetime;\n\n  if (sizeOverLifetime) {\n    if (sizeOverLifetime.separateAxes) {\n      ret.sizeOverLifetime = {\n        separateAxes: true,\n        x: ensureNumberExpression(sizeOverLifetime.x),\n        y: ensureNumberExpression(sizeOverLifetime.y),\n      };\n    } else {\n      ret.sizeOverLifetime = {\n        size: ensureNumberExpression(sizeOverLifetime.size),\n      };\n    }\n  }\n  const velocityOverLifetime = particle.velocityOverLifetime || {};\n  let sol = velocityOverLifetime.speedOverLifetime;\n\n  if (sol) {\n    sol = ensureFixedNumber(sol);\n  } else {\n    sol = undefined;\n  }\n  ret.positionOverLifetime = {\n    gravity: options.gravity,\n    gravityOverLifetime: ensureFixedNumber(options.gravityModifier),\n    startSpeed: ensureNumberExpression(options.startSpeed),\n    speedOverLifetime: sol,\n    asMovement: velocityOverLifetime.asMovement,\n    linearX: ensureNumberExpression(velocityOverLifetime.linearX),\n    linearY: ensureNumberExpression(velocityOverLifetime.linearY),\n    linearZ: ensureNumberExpression(velocityOverLifetime.linearZ),\n    asRotation: velocityOverLifetime.asRotation,\n    orbCenter: velocityOverLifetime.orbCenter,\n    orbitalX: ensureNumberExpression(velocityOverLifetime.orbitalX),\n    orbitalY: ensureNumberExpression(velocityOverLifetime.orbitalY),\n    orbitalZ: ensureNumberExpression(velocityOverLifetime.orbitalZ),\n    forceTarget: velocityOverLifetime.forceTarget,\n    target: velocityOverLifetime.target,\n    forceCurve: ensureFixedNumber(velocityOverLifetime.forceCurve) as any,\n  };\n  deleteEmptyValue(ret.positionOverLifetime);\n  const rotationOverLifetime = particle.rotationOverLifetime;\n\n  if (rotationOverLifetime) {\n    ret.rotationOverLifetime = {\n      separateAxes: rotationOverLifetime.separateAxes,\n      asRotation: rotationOverLifetime.asRotation,\n      z: ensureNumberExpression(rotationOverLifetime.separateAxes ? rotationOverLifetime.z : rotationOverLifetime.angularVelocity),\n    };\n    if (rotationOverLifetime.separateAxes) {\n      ret.rotationOverLifetime.y = ensureFixedNumber(rotationOverLifetime.y);\n      ret.rotationOverLifetime.x = ensureFixedNumber(rotationOverLifetime.x);\n    }\n  }\n  const colorOverLifetime = particle.colorOverLifetime;\n\n  if (colorOverLifetime) {\n    const col: ColorOverLifetime = ret.colorOverLifetime = {\n      opacity: ensureFixedNumber(colorOverLifetime.opacity),\n    };\n\n    if (colorOverLifetime.color) {\n      col.color = getGradientColor(colorOverLifetime.color);\n    }\n  }\n  const textureSheetAnimation = particle.textureSheetAnimation;\n\n  if (textureSheetAnimation) {\n    ret.textureSheetAnimation = {\n      row: textureSheetAnimation.row,\n      col: textureSheetAnimation.col,\n      total: textureSheetAnimation.total,\n      animate: textureSheetAnimation.animate,\n      cycles: ensureFixedNumber(textureSheetAnimation.cycles)!,\n      animationDelay: ensureFixedNumberWithRandom(textureSheetAnimation.animationDelay, 0),\n      animationDuration: ensureFixedNumberWithRandom(textureSheetAnimation.animationDuration, 0)!,\n    };\n  }\n  const trials = particle.trails;\n\n  if (trials) {\n    ret.trails = {\n      lifetime: ensureNumberExpression(trials.lifetime)!,\n      dieWithParticles: trials.dieWithParticles,\n      maxPointPerTrail: trials.maxPointPerTrail,\n      minimumVertexDistance: trials.minimumVertexDistance,\n      widthOverTrail: ensureFixedNumber(trials.widthOverTrail)!,\n      colorOverTrail: trials.colorOverTrail && getGradientColor(trials.colorOverTrail, false),\n      blending: trials.blending,\n      colorOverLifetime: trials.colorOverLifetime && getGradientColor(trials.colorOverLifetime, false),\n      inheritParticleColor: trials.inheritParticleColor,\n      occlusion: trials.occlusion,\n      transparentOcclusion: trials.transparentOcclusion,\n      orderOffset: trials.orderOffset,\n      sizeAffectsLifetime: trials.sizeAffectsLifetime,\n      sizeAffectsWidth: trials.sizeAffectsWidth,\n      texture: trials.texture,\n      parentAffectsPosition: trials.parentAffectsPosition,\n      opacityOverLifetime: ensureNumberExpression(trials.opacityOverLifetime),\n    };\n  }\n  ret.trails && deleteEmptyValue(ret.trails);\n  const interaction = particle.interaction;\n\n  if (interaction) {\n    ret.interaction = {\n      behavior: interaction.behavior,\n      radius: interaction.radius,\n      multiple: interaction.multiple,\n    };\n  }\n\n  return ret;\n}\n","import type { InteractContent, InteractOption } from '@galacean/effects-specification';\nimport { InteractType, InteractBehavior } from '@galacean/effects-specification';\nimport { ensureRGBAValue } from './utils';\n\nexport function getStandardInteractContent (ui: any): InteractContent {\n  const options = ui.options;\n  let option: InteractOption;\n\n  switch (options.type) {\n    case 'click': {\n      option = {\n        type: InteractType.CLICK,\n        showPreview: options.showPreview,\n        previewColor: options.previewColor && ensureRGBAValue(options.previewColor),\n        behavior: options.behavior || InteractBehavior.NOTIFY,\n      };\n\n      break;\n    }\n    case 'drag': {\n      option = {\n        type: InteractType.DRAG,\n        enableInEditor: !!options.enableInEditor,\n        dxRange: options.dxRange,\n        dyRange: options.dyRange,\n        target: options.target,\n      };\n\n      break;\n    }\n    case 'message': {\n      option = {\n        type: InteractType.MESSAGE,\n      };\n\n      break;\n    }\n    default: {\n      break;\n    }\n  }\n\n  const ret: InteractContent = {\n    // @ts-expect-error\n    options: option,\n  };\n\n  return ret;\n}\n","import type { CameraContent, CameraPositionOverLifetime, RotationOverLifetime } from '@galacean/effects-specification';\nimport { deleteEmptyValue, ensureFixedNumber, ensureFixedVec3 } from './utils';\n\nexport function getStandardCameraContent (model: any): CameraContent {\n  const opt = model.options;\n  const ret: CameraContent = {\n    options: {\n      fov: opt.fov!,\n      far: opt.far!,\n      near: opt.near!,\n      clipMode: opt.clipMode,\n    },\n  };\n\n  const velocityOverLifetime = model.velocityOverLifetime;\n\n  if (velocityOverLifetime || model.transform?.path) {\n    const positionOverLifetime: CameraPositionOverLifetime = {\n      path: ensureFixedVec3(model.transform?.path),\n      linearX: ensureFixedNumber(velocityOverLifetime?.translateX),\n      linearY: ensureFixedNumber(velocityOverLifetime?.translateY),\n      linearZ: ensureFixedNumber(velocityOverLifetime?.translateZ),\n    };\n\n    deleteEmptyValue(positionOverLifetime);\n    ret.positionOverLifetime = positionOverLifetime;\n  }\n\n  const rol = model.rotationOverLifetime;\n\n  if (rol) {\n    const rotationOverLifetime: RotationOverLifetime = {\n      separateAxes: rol.separateAxes,\n      x: ensureFixedNumber(rol?.rotateX),\n      y: ensureFixedNumber(rol?.rotateY),\n      z: rol.separateAxes ? ensureFixedNumber(rol?.rotateZ) : ensureFixedNumber(rol.rotation),\n    };\n\n    deleteEmptyValue(rotationOverLifetime);\n    ret.rotationOverLifetime = rotationOverLifetime;\n  }\n\n  return ret;\n}\n","import type * as spec from '@galacean/effects-specification';\nimport { loadImage } from './downloader';\nimport { isString } from './utils';\n\nexport function getBackgroundImage (\n  template: spec.TemplateContent,\n  variables?: spec.TemplateVariables,\n) {\n  let templateBackground;\n  const { name, url } = template?.background ?? {};\n\n  if (name) {\n    if (variables && variables[name]) {\n      templateBackground = variables[name];\n    } else if (url) {\n      templateBackground = url;\n    }\n  }\n\n  return templateBackground;\n}\n\n/**\n * @param url\n * @param template\n * @param variables\n * @param options\n * @returns\n */\nexport async function combineImageTemplate (\n  url: string | HTMLImageElement,\n  template?: spec.TemplateContent,\n  variables?: spec.TemplateVariables,\n) {\n  let image;\n\n  if (typeof url === 'string') {\n    image = await loadImage(url);\n  } else {\n    image = url;\n  }\n\n  if (!image) {\n    throw new Error('Image not provided.');\n  }\n\n  if (!template) {\n    return image;\n  }\n\n  // 获取动态换图的图片对象或 url 地址\n  const templateBackground = getBackgroundImage(template, variables);\n\n  if (templateBackground) {\n    if (isString(templateBackground) && templateBackground !== image.src) {\n      return loadImage(templateBackground);\n    }\n    if (templateBackground instanceof HTMLImageElement) {\n      return templateBackground;\n    }\n  }\n\n  return image;\n}\n","import type * as spec from '@galacean/effects-specification';\nimport type { Texture } from './texture';\nimport type { PickEnum } from './utils';\nimport { isObject } from './utils';\n\nexport type ImageLike = spec.HTMLImageLike | ArrayBuffer | Texture;\nexport type SceneRenderLevel = PickEnum<spec.RenderLevel, spec.RenderLevel.A | spec.RenderLevel.B | spec.RenderLevel.S>;\n\n/**\n * 场景类型\n */\nexport interface Scene {\n  readonly jsonScene: spec.JSONScene,\n  readonly bins: ArrayBuffer[],\n  readonly storage: Record<string, any>,\n  renderLevel?: SceneRenderLevel,\n  textureOptions: Record<string, any>[],\n  textures: Texture[],\n  images: ImageLike[],\n  assets: Record<string, ImageLike>,\n  consumed?: boolean,\n  /**\n   * 加载总耗时\n   */\n  totalTime?: number,\n  /**\n   * 加载开始时间\n   */\n  startTime?: number,\n  /**\n   * 加载分段时长\n   */\n  timeInfos: Record<string, number>,\n  url: Scene.LoadType,\n}\n\nexport namespace Scene {\n  type URLType = { url: string, options?: SceneLoadOptions };\n\n  /**\n   * 接受用于加载的数据类型\n   */\n  export type LoadType = string | Scene | URLType | spec.JSONScene | Record<string, unknown>;\n\n  // JSON 对象\n  export function isJSONObject (scene: any): scene is Scene {\n    return isObject(scene) && 'jsonScene' in scene;\n  }\n\n  export function isURL (scene: any): scene is URLType {\n    return isObject(scene) && 'url' in scene;\n  }\n\n  export function isWithOptions (scene: any): scene is URLType {\n    return isObject(scene) && 'options' in scene;\n  }\n}\n\n/**\n * 场景加载参数\n */\nexport interface SceneLoadOptions {\n  /**\n   * 动态数据的参数\n   * key 是 JSON 中配置的字段名\n   * value 是要使用的值，图片使用 url 链接\n   * 图片链接可以使用数组传递，如果第一个加载失败，将尝试使用第二个地址\n   *\n   * @example\n   * ``` ts\n   * {\n   *   variables: {\n   *     bg: ['url','fallback_url'], // 如果两个图片都失败，将会触发加载失败\n   *     fg: 'url' // 如果图片加载失败，将会触发加载失败,\n   *     amount: 88.8,\n   *     name: 'abc'\n   *   }\n   * }\n   * ```\n   */\n  variables?: spec.TemplateVariables,\n\n  /**\n   * 是否使用压缩纹理\n   * @default undefined\n   */\n  useCompressedTexture?: boolean,\n\n  /**\n   * 是否使用 Hevc 视频\n   * @default undefined\n   */\n  useHevcVideo?: boolean,\n\n  /**\n   * 渲染分级。\n   * 分级之后，只会加载当前渲染等级的资源。\n   * 当渲染等级被设置为 B 后，player 的 fps 会降到 30 帧\n   * @default 'S'\n   */\n  renderLevel?: SceneRenderLevel,\n\n  /**\n   * 资源加载超时，时间单位秒\n   * @default 10s\n   */\n  timeout?: number,\n\n  /***\n   * 用于给 plugin 的加载数据\n   * key/value 的内容由 plugin 自己实现\n   */\n  pluginData?: Record<string, any>,\n\n  /**\n   * 场景加载时的环境（加载后把 env 结果写入 scene）\n   * @default '' - 编辑器中为 'editor'\n   */\n  env?: string,\n\n  /**\n   * 加载后是否自动播放\n   * @default true\n   */\n  autoplay?: boolean,\n  /**\n   * 合成播放完成后是否需要再使用，是的话生命周期结束后不会 `dispose`\n   * @default false\n   */\n  reusable?: boolean,\n  /**\n   * 播放速度，当速度为负数时，合成倒播\n   * @default 1\n   */\n  speed?: number,\n  /**\n   * 是否禁用 AVIF 图片\n   * @default undefined\n   */\n  disableAVIF?: boolean,\n  /**\n   * 是否禁用 WebP 图片\n   * @default undefined\n   */\n  disableWebP?: boolean,\n}\n","import * as spec from '@galacean/effects-specification';\nimport { getStandardJSON } from './fallback';\nimport { glContext } from './gl';\nimport { passRenderLevel } from './pass-render-level';\nimport { PluginSystem, getPluginUsageInfo, pluginLoaderMap } from './plugin-system';\nimport type { JSONValue } from './downloader';\nimport { Downloader, loadWebPOptional, loadImage, loadVideo, loadMedia, loadAVIFOptional } from './downloader';\nimport type { ImageLike, SceneLoadOptions } from './scene';\nimport { Scene } from './scene';\nimport type { Disposable } from './utils';\nimport { isObject, isString, logger, isValidFontFamily, isCanvas, base64ToFile } from './utils';\nimport type { TextureSourceOptions, Texture2DSourceOptionsCompressed } from './texture';\nimport { deserializeMipmapTexture, TextureSourceType, Texture } from './texture';\nimport type { Renderer } from './render';\nimport { combineImageTemplate, getBackgroundImage } from './template-image';\nimport { textureLoaderRegistry } from './texture/texture-loader';\n\nlet seed = 1;\n\n/**\n * 资源管理器\n * 用于加载和动效中所有的资源文件，包括图片、插件、图层粒子数据等\n */\nexport class AssetManager implements Disposable {\n  /**\n   * 相对 url 的基本路径\n   */\n  private baseUrl: string;\n  /**\n   * 图像资源，用于创建和释放 GPU 纹理资源\n   */\n  private assets: Record<string, ImageLike> = {};\n  /**\n   * TextureSource 来源\n   */\n  private sourceFrom: Record<string, { url: string, type: TextureSourceType }> = {};\n  /**\n   * 自定义文本缓存，随页面销毁而销毁\n   */\n  private static fontCache: Set<string> = new Set();\n\n  private id = seed++;\n  /**\n   * 加载超时时间\n   * @default 10\n   */\n  private timeout: number;\n  /**\n   * 场景加载的超时定时器\n   */\n  private timers: number[] = [];\n\n  /**\n   * 字体加载方法\n   * @param fonts - 字体定义数组\n   * @param [baseUrl=location.href] - URL 的 base 字段\n   * @returns\n   */\n  static async loadFontFamily (\n    fonts: spec.FontDefine[],\n    baseUrl = location.href,\n  ) {\n    // 对老数据的兼容\n    if (!fonts) {\n      return;\n    }\n\n    const jobs = fonts.map(async font => {\n      // 数据模版兼容判断\n      if (font.fontURL && !AssetManager.fontCache.has(font.fontFamily)) {\n        if (!isValidFontFamily(font.fontFamily)) {\n          // 在所有设备上提醒开发者\n          console.warn(`Risky font family: ${font.fontFamily}.`);\n        }\n        try {\n          const url = new URL(font.fontURL, baseUrl).href;\n          const fontFace = new FontFace(font.fontFamily ?? '', 'url(' + url + ')');\n\n          await fontFace.load();\n          document.fonts.add(fontFace);\n          AssetManager.fontCache.add(font.fontFamily);\n        } catch (_) {\n          logger.warn(`Invalid font family or font source: ${JSON.stringify(font.fontURL)}.`);\n        }\n      }\n    });\n\n    return Promise.all(jobs);\n  }\n\n  /**\n   * 构造函数\n   * @param options - 场景加载参数\n   * @param downloader - 资源下载对象\n   */\n  constructor (\n    public options: SceneLoadOptions = {},\n    private readonly downloader = new Downloader(),\n  ) {\n    this.updateOptions(options);\n  }\n\n  updateOptions (options: SceneLoadOptions = {}) {\n    this.options = options;\n    if (!options.pluginData) {\n      options.pluginData = {};\n    }\n    const { timeout = 10 } = options;\n\n    this.timeout = timeout;\n  }\n\n  /**\n   * 场景创建，通过 json 创建出场景对象，并进行提前编译等工作\n   * @param url - json 的 URL 链接或者 json 对象\n   * @param renderer - renderer 对象，用于获取管理、编译 shader 及 GPU 上下文的参数\n   * @param options - 扩展参数\n   * @returns\n   */\n  async loadScene (url: Scene.LoadType, renderer?: Renderer): Promise<Scene> {\n    let rawJSON: Scene.LoadType;\n    const assetUrl = isString(url) ? url : this.id;\n    const startTime = performance.now();\n    const timeInfoMessages: string[] = [];\n    const gpuInstance = renderer?.engine.gpuCapability;\n    const isKTX2Supported = gpuInstance?.detail.ktx2Support ?? false;\n    const timeInfos: Record<string, number> = {};\n    let loadTimer: number;\n    let cancelLoading = false;\n\n    const waitPromise = new Promise<Scene>((resolve, reject) => {\n      loadTimer = window.setTimeout(() => {\n        cancelLoading = true;\n        this.removeTimer(loadTimer);\n        const totalTime = performance.now() - startTime;\n\n        reject(new Error(`Load time out: totalTime: ${totalTime.toFixed(4)}ms ${timeInfoMessages.join(' ')}, url: ${assetUrl}.`));\n      }, this.timeout * 1000);\n      this.timers.push(loadTimer);\n    });\n\n    const hookTimeInfo = async<T> (label: string, func: () => Promise<T>) => {\n      if (!cancelLoading) {\n        const st = performance.now();\n\n        try {\n          const result = await func();\n          const time = performance.now() - st;\n\n          timeInfoMessages.push(`[${label}: ${time.toFixed(2)}]`);\n          timeInfos[label] = time;\n\n          return result;\n        } catch (e) {\n          throw new Error(`Load error in ${label}, ${e}.`);\n        }\n      }\n      throw new Error('Load canceled.');\n    };\n    const loadResourcePromise = async () => {\n      let scene: Scene;\n\n      if (isString(url)) {\n        // 兼容相对路径\n        const link = new URL(url, location.href).href;\n\n        this.baseUrl = link;\n        rawJSON = await hookTimeInfo('loadJSON', () => this.loadJSON(link) as unknown as Promise<spec.JSONScene>);\n\n        // 小程序环境下，如果产物是相对路径，adapter 返回的是字符串，需要兼容\n        if (isString(rawJSON)) {\n          rawJSON = JSON.parse(rawJSON);\n        }\n      } else {\n        // url 为 spec.JSONScene 或 Scene 对象\n        rawJSON = url;\n        this.baseUrl = location.href;\n      }\n\n      if (Scene.isJSONObject(rawJSON)) {\n        scene = {\n          ...rawJSON,\n        };\n      } else {\n        // TODO: JSONScene 中 bins 的类型可能为 ArrayBuffer[]\n        const { jsonScene } = await hookTimeInfo('processJSON', () => this.processJSON(rawJSON as JSONValue));\n\n        scene = {\n          timeInfos,\n          url,\n          storage: {},\n          jsonScene,\n          bins: [],\n          textureOptions: [],\n          textures: [],\n          images: [],\n          assets: this.assets,\n        };\n\n        await hookTimeInfo('plugin:onAssetsLoadStart', () => this.onPluginSceneLoadStart(scene));\n\n        const { bins = [], images, fonts } = jsonScene;\n\n        const [loadedBins, loadedImages] = await Promise.all([\n          hookTimeInfo('processBins', () => this.processBins(bins)),\n          hookTimeInfo('processImages', () => this.processImages(images, isKTX2Supported)),\n          hookTimeInfo('processFontURL', () => this.processFontURL(fonts as spec.FontDefine[])),\n        ]);\n        const loadedTextures = await hookTimeInfo('processTextures', () => this.processTextures(loadedImages, loadedBins, jsonScene));\n\n        scene.bins.push(...loadedBins);\n        scene.textureOptions.push(...loadedTextures);\n        scene.images.push(...loadedImages);\n\n        // 降级插件会修改 this.options.renderLevel, 在 processPluginAssets 后赋值\n        scene.renderLevel = this.options.renderLevel;\n      }\n\n      const totalTime = performance.now() - startTime;\n\n      logger.info(`Load asset: totalTime: ${totalTime.toFixed(4)}ms ${timeInfoMessages.join(' ')}, url: ${assetUrl}.`);\n      window.clearTimeout(loadTimer);\n      this.removeTimer(loadTimer);\n      scene.totalTime = totalTime;\n      scene.startTime = startTime;\n      // 各部分分段时长\n      scene.timeInfos = timeInfos;\n\n      return scene;\n    };\n\n    return Promise.race([waitPromise, loadResourcePromise()]);\n  }\n\n  getAssets () {\n    return this.assets;\n  }\n\n  private async processJSON (json: JSONValue) {\n    const jsonScene = getStandardJSON(json);\n    const { plugins = [] } = jsonScene;\n\n    for (const customPluginName of plugins) {\n      if (!pluginLoaderMap[customPluginName]) {\n        throw new Error(`The plugin '${customPluginName}' not found.` + getPluginUsageInfo(customPluginName));\n      }\n    }\n\n    return {\n      jsonScene,\n    };\n  }\n\n  private async processBins (bins: (spec.BinaryFile | ArrayBuffer)[]) {\n    const { renderLevel } = this.options;\n    const baseUrl = this.baseUrl;\n    const jobs = bins.map(bin => {\n      if (bin instanceof ArrayBuffer) {\n        return bin;\n      }\n      if (passRenderLevel(bin.renderLevel, renderLevel)) {\n        return this.loadBins(new URL(bin.url, baseUrl).href);\n      }\n\n      throw new Error(`Invalid bins source: ${JSON.stringify(bins)}.`);\n    });\n\n    return Promise.all(jobs);\n  }\n\n  private async processFontURL (fonts: spec.FontDefine[]) {\n    return AssetManager.loadFontFamily(fonts, this.baseUrl);\n  }\n\n  private async processImages (\n    images: spec.ImageSource[],\n    canUseKTX2 = false,\n  ): Promise<ImageLike[]> {\n    const { useCompressedTexture, variables, disableWebP, disableAVIF } = this.options;\n    const baseUrl = this.baseUrl;\n    const jobs = images.map(async (img, idx: number) => {\n      const { url: png, webp, avif } = img;\n      const { ktx2 } = img as spec.CompressedImage;\n      // eslint-disable-next-line compat/compat\n      const imageURL = new URL(png, baseUrl).href;\n      // eslint-disable-next-line compat/compat\n      const webpURL = (!disableWebP && webp) ? new URL(webp, baseUrl).href : undefined;\n      // eslint-disable-next-line compat/compat\n      const avifURL = (!disableAVIF && avif) ? new URL(avif, baseUrl).href : undefined;\n      // eslint-disable-next-line compat/compat\n      const ktx2URL = (ktx2 && useCompressedTexture && canUseKTX2) ? new URL(ktx2, baseUrl).href : undefined;\n\n      const id = img.id;\n\n      if ('template' in img) {\n        // 1. 数据模板\n        const template = img.template;\n        // 获取数据模板 background 参数\n        const background = template.background;\n\n        if (background) {\n          const url = getBackgroundImage(template, variables);\n          const isVideo = background.type === spec.BackgroundType.video;\n          // 根据背景类型确定加载函数\n          const loadFn = background && isVideo ? loadVideo : loadImage;\n\n          // 处理加载资源\n          try {\n            const resultImage = await loadMedia(url as string | string[], loadFn);\n\n            if (resultImage instanceof HTMLVideoElement) {\n              this.sourceFrom[id] = { url: resultImage.src, type: TextureSourceType.video };\n\n              return resultImage;\n            } else {\n              // 如果是加载图片且是数组，设置变量，视频情况下不需要\n              if (background && Array.isArray(url) && variables) {\n                variables[background.name] = resultImage.src;\n              }\n\n              this.sourceFrom[id] = { url: resultImage.src, type: TextureSourceType.image };\n\n              return await combineImageTemplate(\n                resultImage,\n                template,\n                variables,\n              );\n            }\n          } catch (e) {\n            throw new Error(`Failed to load. Check the template or if the URL is ${isVideo ? 'video' : 'image'} type, URL: ${url}, Error: ${(e as Error).message || e}.`);\n          }\n        }\n      } else if ('ktx2' in img && ktx2URL) {\n        // ktx2 压缩纹理\n        this.sourceFrom[id] = { url: ktx2URL, type: TextureSourceType.compressed };\n\n        return this.loadBins(ktx2URL);\n      } else if (\n        img instanceof HTMLImageElement ||\n        img instanceof HTMLCanvasElement ||\n        img instanceof HTMLVideoElement ||\n        img instanceof Texture\n      ) {\n        return img;\n      }\n\n      const { url, image } = avifURL\n        ? await loadAVIFOptional(imageURL, avifURL)\n        : await loadWebPOptional(imageURL, webpURL);\n\n      this.sourceFrom[id] = { url, type: TextureSourceType.image };\n\n      return image;\n    });\n    const loadedImages = await Promise.all(jobs);\n\n    this.assignImagesToAssets(images, loadedImages);\n\n    return loadedImages;\n  }\n\n  private async onPluginSceneLoadStart (scene: Scene) {\n    await PluginSystem.onAssetsLoadStart(scene, this.options);\n  }\n\n  private async processTextures (\n    images: ImageLike[],\n    bins: ArrayBuffer[],\n    jsonScene: spec.JSONScene,\n  ) {\n    const textures = jsonScene.textures ?? images.map((img, source: number) => ({ source })) as spec.SerializedTextureSource[];\n    const jobs = textures.map(async (textureOptions, idx) => {\n      if (textureOptions instanceof Texture) {\n        return textureOptions;\n      }\n      if ('mipmaps' in textureOptions) {\n        try {\n          return await deserializeMipmapTexture(textureOptions, bins, this.assets, jsonScene.bins);\n        } catch (e) {\n          throw new Error(`Load texture ${idx} fails, error message: ${e}.`);\n        }\n      }\n\n      const { source, id } = textureOptions;\n      let image: ImageLike | undefined;\n      let imageId = '';\n\n      if (isObject(source)) { // source 为 images 数组 id\n        image = this.assets[source.id as string];\n        imageId = source.id as string;\n      } else if (typeof source === 'string') { // source 为 base64 数据\n        image = await loadImage(base64ToFile(source));\n      }\n\n      if (image) {\n        const texture = await createTextureOptionsBySource(image, this.sourceFrom[imageId], id);\n\n        return texture.sourceType === TextureSourceType.compressed ? texture : { ...texture, ...textureOptions };\n      }\n      throw new Error(`Invalid texture source: ${source}.`);\n    });\n\n    return Promise.all(jobs);\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(`Couldn't load JSON ${JSON.stringify(url)}: status ${status}, ${responseText}`);\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 assignImagesToAssets (images: spec.ImageSource[], loadedImages: ImageLike[]) {\n    for (let i = 0; i < images.length; i++) {\n      this.assets[images[i].id] = loadedImages[i];\n    }\n  }\n\n  private removeTimer (id: number) {\n    const index = this.timers.indexOf(id);\n\n    if (index !== -1) {\n      this.timers.splice(index, 1);\n    }\n  }\n  /**\n   * 销毁方法\n   */\n  dispose (): void {\n    if (this.timers.length) {\n      this.timers.map(id => window.clearTimeout(id));\n    }\n    this.assets = {};\n    this.sourceFrom = {};\n    this.timers = [];\n  }\n}\n\nasync function createTextureOptionsBySource (\n  image: TextureSourceOptions | ImageLike,\n  sourceFrom: { url: string, type: TextureSourceType },\n  id?: string,\n) {\n  const options = {\n    id,\n    dataType: spec.DataType.Texture,\n  };\n\n  if (image instanceof Texture) {\n    return {\n      ...image.source,\n      ...options,\n    };\n  } else if (\n    image instanceof HTMLImageElement ||\n    isCanvas(image as HTMLCanvasElement)\n  ) {\n    return {\n      image,\n      sourceType: TextureSourceType.image,\n      sourceFrom,\n      keepImageSource: true,\n      minFilter: glContext.LINEAR,\n      magFilter: glContext.LINEAR,\n      ...options,\n    };\n  } else if (image instanceof HTMLVideoElement) {\n    // 视频\n    return {\n      sourceType: TextureSourceType.video,\n      video: image,\n      minFilter: glContext.LINEAR,\n      magFilter: glContext.LINEAR,\n      ...options,\n    };\n  } else if (image instanceof ArrayBuffer) {\n    // 压缩纹理\n    const loader = textureLoaderRegistry.getLoader('ktx2');\n\n    if (loader) {\n      try {\n        const textureData = await loader.loadFromBuffer(image) as Texture2DSourceOptionsCompressed;\n\n        return {\n          sourceType: textureData.sourceType,\n          type: textureData.type,\n          target: textureData.target,\n          internalFormat: textureData.internalFormat,\n          format: textureData.format,\n          mipmaps: textureData.mipmaps,\n          minFilter: glContext.LINEAR,\n          magFilter: glContext.LINEAR,\n          sourceFrom,\n          ...options,\n        };\n      } catch (e) {\n        throw new Error(`Failed to parse KTX2 from ${sourceFrom?.url ?? 'buffer'}: ${(e as Error).message || e}`);\n      }\n    } else {\n      throw new Error('KTX2 loader not found. Please register it first.');\n    }\n  } else if (\n    'width' in image &&\n    'height' in image &&\n    'data' in image\n  ) {\n    return {\n      sourceType: TextureSourceType.data,\n      data: image,\n      wrapS: glContext.CLAMP_TO_EDGE,\n      wrapT: glContext.CLAMP_TO_EDGE,\n      minFilter: glContext.NEAREST,\n      magFilter: glContext.NEAREST,\n      ...options,\n    };\n  }\n\n  throw new Error('Invalid texture options.');\n}\n","import * as spec from '@galacean/effects-specification';\nimport type { Disposable } from './utils';\nimport type { Engine } from './engine';\nimport type { ImageLike, SceneLoadOptions } from './scene';\nimport { Scene } from './scene';\nimport type { Texture } from './texture';\nimport type { EffectsObject } from './effects-object';\nimport { Asset } from './asset';\nimport { Material } from './material';\n\n/**\n *\n */\nexport class AssetService implements Disposable {\n  private readonly builtinObjects: EffectsObject[] = [];\n\n  /**\n   *\n   * @param engine\n   */\n  constructor (\n    private readonly engine: Engine,\n  ) {\n    this.builtinObjects.push(engine.whiteTexture);\n    this.builtinObjects.push(engine.transparentTexture);\n  }\n\n  /**\n   * @param url\n   * @param options\n   * @returns\n   */\n  assembleSceneLoadOptions (\n    url: Scene.LoadType,\n    options: SceneLoadOptions = {},\n  ) {\n    let source: Scene.LoadType = url;\n\n    // 加载多个合成链接并各自设置可选参数\n    if (Scene.isURL(url)) {\n      if (!Scene.isJSONObject(url)) {\n        source = url.url;\n      }\n      if (Scene.isWithOptions(url)) {\n        options = {\n          ...options,\n          ...url.options,\n        };\n      }\n    }\n\n    return {\n      source,\n      options,\n    };\n  }\n\n  /**\n   * 根据用户参数修改文本元素的原始数据\n   * @param scene\n   * @param options\n   */\n  updateTextVariables (\n    scene: Scene,\n    variables: spec.TemplateVariables = {},\n  ) {\n    scene.jsonScene.items.forEach(item => {\n      if (item.type === spec.ItemType.text || item.type === spec.ItemType.richtext) {\n        const textVariable = variables[item.name] as string;\n\n        if (textVariable === undefined || textVariable === null) {\n          return;\n        }\n\n        item.components.forEach(({ id }) => {\n          const componentData = this.engine.findEffectsObjectData(id) as spec.TextComponentData;\n\n          if (componentData?.dataType === spec.DataType.TextComponent || componentData?.dataType === spec.DataType.RichTextComponent) {\n            componentData.options.text = textVariable;\n          }\n        });\n      }\n    });\n  }\n\n  initializeTexture (scene: Scene) {\n    for (let i = 0; i < scene.textureOptions.length; i++) {\n      scene.textures[i] = this.engine.findObject<Texture>({ id: scene.textureOptions[i].id });\n      scene.textures[i].initialize();\n    }\n  }\n\n  prepareAssets (\n    scene: Scene,\n    assets: Record<string, ImageLike>,\n  ) {\n    for (const assetId of Object.keys(assets)) {\n      const asset = assets[assetId];\n      const engineAsset = new Asset(this.engine);\n\n      engineAsset.data = asset;\n      engineAsset.setInstanceId(assetId);\n    }\n\n    // 加入 json 资产数据\n    this.engine.addPackageDatas(scene);\n\n    // 加入内置引擎对象\n    for (const effectsObject of this.builtinObjects) {\n      this.engine.addInstance(effectsObject);\n    }\n  }\n\n  // TODO Material 单独存表, 加速查询\n  createShaderVariant () {\n    for (const guid of Object.keys(this.engine.objectInstance)) {\n      const effectsObject = this.engine.objectInstance[guid];\n\n      if (effectsObject instanceof Material) {\n        effectsObject.createShaderVariant();\n      }\n    }\n  }\n\n  private destroyBuiltinObjects () {\n    for (const effectsObject of this.builtinObjects) {\n      effectsObject.dispose();\n    }\n\n    this.builtinObjects.length = 0;\n  }\n\n  /**\n   *\n   */\n  dispose (): void {\n    this.destroyBuiltinObjects();\n    // Optionally remove references from engine if any\n  }\n}\n","export var Encoding;\n(function (Encoding) {\n    Encoding[Encoding[\"UTF8_BYTES\"] = 1] = \"UTF8_BYTES\";\n    Encoding[Encoding[\"UTF16_STRING\"] = 2] = \"UTF16_STRING\";\n})(Encoding || (Encoding = {}));\n","export const int32 = new Int32Array(2);\nexport const float32 = new Float32Array(int32.buffer);\nexport const float64 = new Float64Array(int32.buffer);\nexport const isLittleEndian = new Uint16Array(new Uint8Array([1, 0]).buffer)[0] === 1;\n","import { FILE_IDENTIFIER_LENGTH, SIZEOF_INT } from \"./constants.js\";\nimport { int32, isLittleEndian, float32, float64 } from \"./utils.js\";\nimport { Encoding } from \"./encoding.js\";\nexport class ByteBuffer {\n    /**\n     * Create a new ByteBuffer with a given array of bytes (`Uint8Array`)\n     */\n    constructor(bytes_) {\n        this.bytes_ = bytes_;\n        this.position_ = 0;\n        this.text_decoder_ = new TextDecoder();\n    }\n    /**\n     * Create and allocate a new ByteBuffer with a given size.\n     */\n    static allocate(byte_size) {\n        return new ByteBuffer(new Uint8Array(byte_size));\n    }\n    clear() {\n        this.position_ = 0;\n    }\n    /**\n     * Get the underlying `Uint8Array`.\n     */\n    bytes() {\n        return this.bytes_;\n    }\n    /**\n     * Get the buffer's position.\n     */\n    position() {\n        return this.position_;\n    }\n    /**\n     * Set the buffer's position.\n     */\n    setPosition(position) {\n        this.position_ = position;\n    }\n    /**\n     * Get the buffer's capacity.\n     */\n    capacity() {\n        return this.bytes_.length;\n    }\n    readInt8(offset) {\n        return this.readUint8(offset) << 24 >> 24;\n    }\n    readUint8(offset) {\n        return this.bytes_[offset];\n    }\n    readInt16(offset) {\n        return this.readUint16(offset) << 16 >> 16;\n    }\n    readUint16(offset) {\n        return this.bytes_[offset] | this.bytes_[offset + 1] << 8;\n    }\n    readInt32(offset) {\n        return this.bytes_[offset] | this.bytes_[offset + 1] << 8 | this.bytes_[offset + 2] << 16 | this.bytes_[offset + 3] << 24;\n    }\n    readUint32(offset) {\n        return this.readInt32(offset) >>> 0;\n    }\n    readInt64(offset) {\n        return BigInt.asIntN(64, BigInt(this.readUint32(offset)) + (BigInt(this.readUint32(offset + 4)) << BigInt(32)));\n    }\n    readUint64(offset) {\n        return BigInt.asUintN(64, BigInt(this.readUint32(offset)) + (BigInt(this.readUint32(offset + 4)) << BigInt(32)));\n    }\n    readFloat32(offset) {\n        int32[0] = this.readInt32(offset);\n        return float32[0];\n    }\n    readFloat64(offset) {\n        int32[isLittleEndian ? 0 : 1] = this.readInt32(offset);\n        int32[isLittleEndian ? 1 : 0] = this.readInt32(offset + 4);\n        return float64[0];\n    }\n    writeInt8(offset, value) {\n        this.bytes_[offset] = value;\n    }\n    writeUint8(offset, value) {\n        this.bytes_[offset] = value;\n    }\n    writeInt16(offset, value) {\n        this.bytes_[offset] = value;\n        this.bytes_[offset + 1] = value >> 8;\n    }\n    writeUint16(offset, value) {\n        this.bytes_[offset] = value;\n        this.bytes_[offset + 1] = value >> 8;\n    }\n    writeInt32(offset, value) {\n        this.bytes_[offset] = value;\n        this.bytes_[offset + 1] = value >> 8;\n        this.bytes_[offset + 2] = value >> 16;\n        this.bytes_[offset + 3] = value >> 24;\n    }\n    writeUint32(offset, value) {\n        this.bytes_[offset] = value;\n        this.bytes_[offset + 1] = value >> 8;\n        this.bytes_[offset + 2] = value >> 16;\n        this.bytes_[offset + 3] = value >> 24;\n    }\n    writeInt64(offset, value) {\n        this.writeInt32(offset, Number(BigInt.asIntN(32, value)));\n        this.writeInt32(offset + 4, Number(BigInt.asIntN(32, value >> BigInt(32))));\n    }\n    writeUint64(offset, value) {\n        this.writeUint32(offset, Number(BigInt.asUintN(32, value)));\n        this.writeUint32(offset + 4, Number(BigInt.asUintN(32, value >> BigInt(32))));\n    }\n    writeFloat32(offset, value) {\n        float32[0] = value;\n        this.writeInt32(offset, int32[0]);\n    }\n    writeFloat64(offset, value) {\n        float64[0] = value;\n        this.writeInt32(offset, int32[isLittleEndian ? 0 : 1]);\n        this.writeInt32(offset + 4, int32[isLittleEndian ? 1 : 0]);\n    }\n    /**\n     * Return the file identifier.   Behavior is undefined for FlatBuffers whose\n     * schema does not include a file_identifier (likely points at padding or the\n     * start of a the root vtable).\n     */\n    getBufferIdentifier() {\n        if (this.bytes_.length < this.position_ + SIZEOF_INT +\n            FILE_IDENTIFIER_LENGTH) {\n            throw new Error('FlatBuffers: ByteBuffer is too short to contain an identifier.');\n        }\n        let result = \"\";\n        for (let i = 0; i < FILE_IDENTIFIER_LENGTH; i++) {\n            result += String.fromCharCode(this.readInt8(this.position_ + SIZEOF_INT + i));\n        }\n        return result;\n    }\n    /**\n     * Look up a field in the vtable, return an offset into the object, or 0 if the\n     * field is not present.\n     */\n    __offset(bb_pos, vtable_offset) {\n        const vtable = bb_pos - this.readInt32(bb_pos);\n        return vtable_offset < this.readInt16(vtable) ? this.readInt16(vtable + vtable_offset) : 0;\n    }\n    /**\n     * Initialize any Table-derived type to point to the union at the given offset.\n     */\n    __union(t, offset) {\n        t.bb_pos = offset + this.readInt32(offset);\n        t.bb = this;\n        return t;\n    }\n    /**\n     * Create a JavaScript string from UTF-8 data stored inside the FlatBuffer.\n     * This allocates a new string and converts to wide chars upon each access.\n     *\n     * To avoid the conversion to string, pass Encoding.UTF8_BYTES as the\n     * \"optionalEncoding\" argument. This is useful for avoiding conversion when\n     * the data will just be packaged back up in another FlatBuffer later on.\n     *\n     * @param offset\n     * @param opt_encoding Defaults to UTF16_STRING\n     */\n    __string(offset, opt_encoding) {\n        offset += this.readInt32(offset);\n        const length = this.readInt32(offset);\n        offset += SIZEOF_INT;\n        const utf8bytes = this.bytes_.subarray(offset, offset + length);\n        if (opt_encoding === Encoding.UTF8_BYTES)\n            return utf8bytes;\n        else\n            return this.text_decoder_.decode(utf8bytes);\n    }\n    /**\n     * Handle unions that can contain string as its member, if a Table-derived type then initialize it,\n     * if a string then return a new one\n     *\n     * WARNING: strings are immutable in JS so we can't change the string that the user gave us, this\n     * makes the behaviour of __union_with_string different compared to __union\n     */\n    __union_with_string(o, offset) {\n        if (typeof o === 'string') {\n            return this.__string(offset);\n        }\n        return this.__union(o, offset);\n    }\n    /**\n     * Retrieve the relative offset stored at \"offset\"\n     */\n    __indirect(offset) {\n        return offset + this.readInt32(offset);\n    }\n    /**\n     * Get the start of data of a vector whose offset is stored at \"offset\" in this object.\n     */\n    __vector(offset) {\n        return offset + this.readInt32(offset) + SIZEOF_INT; // data starts after the length\n    }\n    /**\n     * Get the length of a vector whose offset is stored at \"offset\" in this object.\n     */\n    __vector_len(offset) {\n        return this.readInt32(offset + this.readInt32(offset));\n    }\n    __has_identifier(ident) {\n        if (ident.length != FILE_IDENTIFIER_LENGTH) {\n            throw new Error('FlatBuffers: file identifier must be length ' +\n                FILE_IDENTIFIER_LENGTH);\n        }\n        for (let i = 0; i < FILE_IDENTIFIER_LENGTH; i++) {\n            if (ident.charCodeAt(i) != this.readInt8(this.position() + SIZEOF_INT + i)) {\n                return false;\n            }\n        }\n        return true;\n    }\n    /**\n     * A helper function for generating list for obj api\n     */\n    createScalarList(listAccessor, listLength) {\n        const ret = [];\n        for (let i = 0; i < listLength; ++i) {\n            const val = listAccessor(i);\n            if (val !== null) {\n                ret.push(val);\n            }\n        }\n        return ret;\n    }\n    /**\n     * A helper function for generating list for obj api\n     * @param listAccessor function that accepts an index and return data at that index\n     * @param listLength listLength\n     * @param res result list\n     */\n    createObjList(listAccessor, listLength) {\n        const ret = [];\n        for (let i = 0; i < listLength; ++i) {\n            const val = listAccessor(i);\n            if (val !== null) {\n                ret.push(val.unpack());\n            }\n        }\n        return ret;\n    }\n}\n","export const SIZEOF_SHORT = 2;\nexport const SIZEOF_INT = 4;\nexport const FILE_IDENTIFIER_LENGTH = 4;\nexport const SIZE_PREFIX_LENGTH = 4;\n","import { ByteBuffer } from \"./byte-buffer.js\";\nimport { SIZEOF_SHORT, SIZE_PREFIX_LENGTH, SIZEOF_INT, FILE_IDENTIFIER_LENGTH } from \"./constants.js\";\nexport class Builder {\n    /**\n     * Create a FlatBufferBuilder.\n     */\n    constructor(opt_initial_size) {\n        /** Minimum alignment encountered so far. */\n        this.minalign = 1;\n        /** The vtable for the current table. */\n        this.vtable = null;\n        /** The amount of fields we're actually using. */\n        this.vtable_in_use = 0;\n        /** Whether we are currently serializing a table. */\n        this.isNested = false;\n        /** Starting offset of the current struct/table. */\n        this.object_start = 0;\n        /** List of offsets of all vtables. */\n        this.vtables = [];\n        /** For the current vector being built. */\n        this.vector_num_elems = 0;\n        /** False omits default values from the serialized data */\n        this.force_defaults = false;\n        this.string_maps = null;\n        this.text_encoder = new TextEncoder();\n        let initial_size;\n        if (!opt_initial_size) {\n            initial_size = 1024;\n        }\n        else {\n            initial_size = opt_initial_size;\n        }\n        /**\n         * @type {ByteBuffer}\n         * @private\n         */\n        this.bb = ByteBuffer.allocate(initial_size);\n        this.space = initial_size;\n    }\n    clear() {\n        this.bb.clear();\n        this.space = this.bb.capacity();\n        this.minalign = 1;\n        this.vtable = null;\n        this.vtable_in_use = 0;\n        this.isNested = false;\n        this.object_start = 0;\n        this.vtables = [];\n        this.vector_num_elems = 0;\n        this.force_defaults = false;\n        this.string_maps = null;\n    }\n    /**\n     * In order to save space, fields that are set to their default value\n     * don't get serialized into the buffer. Forcing defaults provides a\n     * way to manually disable this optimization.\n     *\n     * @param forceDefaults true always serializes default values\n     */\n    forceDefaults(forceDefaults) {\n        this.force_defaults = forceDefaults;\n    }\n    /**\n     * Get the ByteBuffer representing the FlatBuffer. Only call this after you've\n     * called finish(). The actual data starts at the ByteBuffer's current position,\n     * not necessarily at 0.\n     */\n    dataBuffer() {\n        return this.bb;\n    }\n    /**\n     * Get the bytes representing the FlatBuffer. Only call this after you've\n     * called finish().\n     */\n    asUint8Array() {\n        return this.bb.bytes().subarray(this.bb.position(), this.bb.position() + this.offset());\n    }\n    /**\n     * Prepare to write an element of `size` after `additional_bytes` have been\n     * written, e.g. if you write a string, you need to align such the int length\n     * field is aligned to 4 bytes, and the string data follows it directly. If all\n     * you need to do is alignment, `additional_bytes` will be 0.\n     *\n     * @param size This is the of the new element to write\n     * @param additional_bytes The padding size\n     */\n    prep(size, additional_bytes) {\n        // Track the biggest thing we've ever aligned to.\n        if (size > this.minalign) {\n            this.minalign = size;\n        }\n        // Find the amount of alignment needed such that `size` is properly\n        // aligned after `additional_bytes`\n        const align_size = ((~(this.bb.capacity() - this.space + additional_bytes)) + 1) & (size - 1);\n        // Reallocate the buffer if needed.\n        while (this.space < align_size + size + additional_bytes) {\n            const old_buf_size = this.bb.capacity();\n            this.bb = Builder.growByteBuffer(this.bb);\n            this.space += this.bb.capacity() - old_buf_size;\n        }\n        this.pad(align_size);\n    }\n    pad(byte_size) {\n        for (let i = 0; i < byte_size; i++) {\n            this.bb.writeInt8(--this.space, 0);\n        }\n    }\n    writeInt8(value) {\n        this.bb.writeInt8(this.space -= 1, value);\n    }\n    writeInt16(value) {\n        this.bb.writeInt16(this.space -= 2, value);\n    }\n    writeInt32(value) {\n        this.bb.writeInt32(this.space -= 4, value);\n    }\n    writeInt64(value) {\n        this.bb.writeInt64(this.space -= 8, value);\n    }\n    writeFloat32(value) {\n        this.bb.writeFloat32(this.space -= 4, value);\n    }\n    writeFloat64(value) {\n        this.bb.writeFloat64(this.space -= 8, value);\n    }\n    /**\n     * Add an `int8` to the buffer, properly aligned, and grows the buffer (if necessary).\n     * @param value The `int8` to add the buffer.\n     */\n    addInt8(value) {\n        this.prep(1, 0);\n        this.writeInt8(value);\n    }\n    /**\n     * Add an `int16` to the buffer, properly aligned, and grows the buffer (if necessary).\n     * @param value The `int16` to add the buffer.\n     */\n    addInt16(value) {\n        this.prep(2, 0);\n        this.writeInt16(value);\n    }\n    /**\n     * Add an `int32` to the buffer, properly aligned, and grows the buffer (if necessary).\n     * @param value The `int32` to add the buffer.\n     */\n    addInt32(value) {\n        this.prep(4, 0);\n        this.writeInt32(value);\n    }\n    /**\n     * Add an `int64` to the buffer, properly aligned, and grows the buffer (if necessary).\n     * @param value The `int64` to add the buffer.\n     */\n    addInt64(value) {\n        this.prep(8, 0);\n        this.writeInt64(value);\n    }\n    /**\n     * Add a `float32` to the buffer, properly aligned, and grows the buffer (if necessary).\n     * @param value The `float32` to add the buffer.\n     */\n    addFloat32(value) {\n        this.prep(4, 0);\n        this.writeFloat32(value);\n    }\n    /**\n     * Add a `float64` to the buffer, properly aligned, and grows the buffer (if necessary).\n     * @param value The `float64` to add the buffer.\n     */\n    addFloat64(value) {\n        this.prep(8, 0);\n        this.writeFloat64(value);\n    }\n    addFieldInt8(voffset, value, defaultValue) {\n        if (this.force_defaults || value != defaultValue) {\n            this.addInt8(value);\n            this.slot(voffset);\n        }\n    }\n    addFieldInt16(voffset, value, defaultValue) {\n        if (this.force_defaults || value != defaultValue) {\n            this.addInt16(value);\n            this.slot(voffset);\n        }\n    }\n    addFieldInt32(voffset, value, defaultValue) {\n        if (this.force_defaults || value != defaultValue) {\n            this.addInt32(value);\n            this.slot(voffset);\n        }\n    }\n    addFieldInt64(voffset, value, defaultValue) {\n        if (this.force_defaults || value !== defaultValue) {\n            this.addInt64(value);\n            this.slot(voffset);\n        }\n    }\n    addFieldFloat32(voffset, value, defaultValue) {\n        if (this.force_defaults || value != defaultValue) {\n            this.addFloat32(value);\n            this.slot(voffset);\n        }\n    }\n    addFieldFloat64(voffset, value, defaultValue) {\n        if (this.force_defaults || value != defaultValue) {\n            this.addFloat64(value);\n            this.slot(voffset);\n        }\n    }\n    addFieldOffset(voffset, value, defaultValue) {\n        if (this.force_defaults || value != defaultValue) {\n            this.addOffset(value);\n            this.slot(voffset);\n        }\n    }\n    /**\n     * Structs are stored inline, so nothing additional is being added. `d` is always 0.\n     */\n    addFieldStruct(voffset, value, defaultValue) {\n        if (value != defaultValue) {\n            this.nested(value);\n            this.slot(voffset);\n        }\n    }\n    /**\n     * Structures are always stored inline, they need to be created right\n     * where they're used.  You'll get this assertion failure if you\n     * created it elsewhere.\n     */\n    nested(obj) {\n        if (obj != this.offset()) {\n            throw new TypeError('FlatBuffers: struct must be serialized inline.');\n        }\n    }\n    /**\n     * Should not be creating any other object, string or vector\n     * while an object is being constructed\n     */\n    notNested() {\n        if (this.isNested) {\n            throw new TypeError('FlatBuffers: object serialization must not be nested.');\n        }\n    }\n    /**\n     * Set the current vtable at `voffset` to the current location in the buffer.\n     */\n    slot(voffset) {\n        if (this.vtable !== null)\n            this.vtable[voffset] = this.offset();\n    }\n    /**\n     * @returns Offset relative to the end of the buffer.\n     */\n    offset() {\n        return this.bb.capacity() - this.space;\n    }\n    /**\n     * Doubles the size of the backing ByteBuffer and copies the old data towards\n     * the end of the new buffer (since we build the buffer backwards).\n     *\n     * @param bb The current buffer with the existing data\n     * @returns A new byte buffer with the old data copied\n     * to it. The data is located at the end of the buffer.\n     *\n     * uint8Array.set() formally takes {Array<number>|ArrayBufferView}, so to pass\n     * it a uint8Array we need to suppress the type check:\n     * @suppress {checkTypes}\n     */\n    static growByteBuffer(bb) {\n        const old_buf_size = bb.capacity();\n        // Ensure we don't grow beyond what fits in an int.\n        if (old_buf_size & 0xC0000000) {\n            throw new Error('FlatBuffers: cannot grow buffer beyond 2 gigabytes.');\n        }\n        const new_buf_size = old_buf_size << 1;\n        const nbb = ByteBuffer.allocate(new_buf_size);\n        nbb.setPosition(new_buf_size - old_buf_size);\n        nbb.bytes().set(bb.bytes(), new_buf_size - old_buf_size);\n        return nbb;\n    }\n    /**\n     * Adds on offset, relative to where it will be written.\n     *\n     * @param offset The offset to add.\n     */\n    addOffset(offset) {\n        this.prep(SIZEOF_INT, 0); // Ensure alignment is already done.\n        this.writeInt32(this.offset() - offset + SIZEOF_INT);\n    }\n    /**\n     * Start encoding a new object in the buffer.  Users will not usually need to\n     * call this directly. The FlatBuffers compiler will generate helper methods\n     * that call this method internally.\n     */\n    startObject(numfields) {\n        this.notNested();\n        if (this.vtable == null) {\n            this.vtable = [];\n        }\n        this.vtable_in_use = numfields;\n        for (let i = 0; i < numfields; i++) {\n            this.vtable[i] = 0; // This will push additional elements as needed\n        }\n        this.isNested = true;\n        this.object_start = this.offset();\n    }\n    /**\n     * Finish off writing the object that is under construction.\n     *\n     * @returns The offset to the object inside `dataBuffer`\n     */\n    endObject() {\n        if (this.vtable == null || !this.isNested) {\n            throw new Error('FlatBuffers: endObject called without startObject');\n        }\n        this.addInt32(0);\n        const vtableloc = this.offset();\n        // Trim trailing zeroes.\n        let i = this.vtable_in_use - 1;\n        // eslint-disable-next-line no-empty\n        for (; i >= 0 && this.vtable[i] == 0; i--) { }\n        const trimmed_size = i + 1;\n        // Write out the current vtable.\n        for (; i >= 0; i--) {\n            // Offset relative to the start of the table.\n            this.addInt16(this.vtable[i] != 0 ? vtableloc - this.vtable[i] : 0);\n        }\n        const standard_fields = 2; // The fields below:\n        this.addInt16(vtableloc - this.object_start);\n        const len = (trimmed_size + standard_fields) * SIZEOF_SHORT;\n        this.addInt16(len);\n        // Search for an existing vtable that matches the current one.\n        let existing_vtable = 0;\n        const vt1 = this.space;\n        outer_loop: for (i = 0; i < this.vtables.length; i++) {\n            const vt2 = this.bb.capacity() - this.vtables[i];\n            if (len == this.bb.readInt16(vt2)) {\n                for (let j = SIZEOF_SHORT; j < len; j += SIZEOF_SHORT) {\n                    if (this.bb.readInt16(vt1 + j) != this.bb.readInt16(vt2 + j)) {\n                        continue outer_loop;\n                    }\n                }\n                existing_vtable = this.vtables[i];\n                break;\n            }\n        }\n        if (existing_vtable) {\n            // Found a match:\n            // Remove the current vtable.\n            this.space = this.bb.capacity() - vtableloc;\n            // Point table to existing vtable.\n            this.bb.writeInt32(this.space, existing_vtable - vtableloc);\n        }\n        else {\n            // No match:\n            // Add the location of the current vtable to the list of vtables.\n            this.vtables.push(this.offset());\n            // Point table to current vtable.\n            this.bb.writeInt32(this.bb.capacity() - vtableloc, this.offset() - vtableloc);\n        }\n        this.isNested = false;\n        return vtableloc;\n    }\n    /**\n     * Finalize a buffer, poiting to the given `root_table`.\n     */\n    finish(root_table, opt_file_identifier, opt_size_prefix) {\n        const size_prefix = opt_size_prefix ? SIZE_PREFIX_LENGTH : 0;\n        if (opt_file_identifier) {\n            const file_identifier = opt_file_identifier;\n            this.prep(this.minalign, SIZEOF_INT +\n                FILE_IDENTIFIER_LENGTH + size_prefix);\n            if (file_identifier.length != FILE_IDENTIFIER_LENGTH) {\n                throw new TypeError('FlatBuffers: file identifier must be length ' +\n                    FILE_IDENTIFIER_LENGTH);\n            }\n            for (let i = FILE_IDENTIFIER_LENGTH - 1; i >= 0; i--) {\n                this.writeInt8(file_identifier.charCodeAt(i));\n            }\n        }\n        this.prep(this.minalign, SIZEOF_INT + size_prefix);\n        this.addOffset(root_table);\n        if (size_prefix) {\n            this.addInt32(this.bb.capacity() - this.space);\n        }\n        this.bb.setPosition(this.space);\n    }\n    /**\n     * Finalize a size prefixed buffer, pointing to the given `root_table`.\n     */\n    finishSizePrefixed(root_table, opt_file_identifier) {\n        this.finish(root_table, opt_file_identifier, true);\n    }\n    /**\n     * This checks a required field has been set in a given table that has\n     * just been constructed.\n     */\n    requiredField(table, field) {\n        const table_start = this.bb.capacity() - table;\n        const vtable_start = table_start - this.bb.readInt32(table_start);\n        const ok = field < this.bb.readInt16(vtable_start) &&\n            this.bb.readInt16(vtable_start + field) != 0;\n        // If this fails, the caller will show what field needs to be set.\n        if (!ok) {\n            throw new TypeError('FlatBuffers: field ' + field + ' must be set');\n        }\n    }\n    /**\n     * Start a new array/vector of objects.  Users usually will not call\n     * this directly. The FlatBuffers compiler will create a start/end\n     * method for vector types in generated code.\n     *\n     * @param elem_size The size of each element in the array\n     * @param num_elems The number of elements in the array\n     * @param alignment The alignment of the array\n     */\n    startVector(elem_size, num_elems, alignment) {\n        this.notNested();\n        this.vector_num_elems = num_elems;\n        this.prep(SIZEOF_INT, elem_size * num_elems);\n        this.prep(alignment, elem_size * num_elems); // Just in case alignment > int.\n    }\n    /**\n     * Finish off the creation of an array and all its elements. The array must be\n     * created with `startVector`.\n     *\n     * @returns The offset at which the newly created array\n     * starts.\n     */\n    endVector() {\n        this.writeInt32(this.vector_num_elems);\n        return this.offset();\n    }\n    /**\n     * Encode the string `s` in the buffer using UTF-8. If the string passed has\n     * already been seen, we return the offset of the already written string\n     *\n     * @param s The string to encode\n     * @return The offset in the buffer where the encoded string starts\n     */\n    createSharedString(s) {\n        if (!s) {\n            return 0;\n        }\n        if (!this.string_maps) {\n            this.string_maps = new Map();\n        }\n        if (this.string_maps.has(s)) {\n            return this.string_maps.get(s);\n        }\n        const offset = this.createString(s);\n        this.string_maps.set(s, offset);\n        return offset;\n    }\n    /**\n     * Encode the string `s` in the buffer using UTF-8. If a Uint8Array is passed\n     * instead of a string, it is assumed to contain valid UTF-8 encoded data.\n     *\n     * @param s The string to encode\n     * @return The offset in the buffer where the encoded string starts\n     */\n    createString(s) {\n        if (s === null || s === undefined) {\n            return 0;\n        }\n        let utf8;\n        if (s instanceof Uint8Array) {\n            utf8 = s;\n        }\n        else {\n            utf8 = this.text_encoder.encode(s);\n        }\n        this.addInt8(0);\n        this.startVector(1, utf8.length, 1);\n        this.bb.setPosition(this.space -= utf8.length);\n        this.bb.bytes().set(utf8, this.space);\n        return this.endVector();\n    }\n    /**\n     * Create a byte vector.\n     *\n     * @param v The bytes to add\n     * @returns The offset in the buffer where the byte vector starts\n     */\n    createByteVector(v) {\n        if (v === null || v === undefined) {\n            return 0;\n        }\n        this.startVector(1, v.length, 1);\n        this.bb.setPosition(this.space -= v.length);\n        this.bb.bytes().set(v, this.space);\n        return this.endVector();\n    }\n    /**\n     * A helper function to pack an object\n     *\n     * @returns offset of obj\n     */\n    createObjectOffset(obj) {\n        if (obj === null) {\n            return 0;\n        }\n        if (typeof obj === 'string') {\n            return this.createString(obj);\n        }\n        else {\n            return obj.pack(this);\n        }\n    }\n    /**\n     * A helper function to pack a list of object\n     *\n     * @returns list of offsets of each non null object\n     */\n    createObjectOffsetList(list) {\n        const ret = [];\n        for (let i = 0; i < list.length; ++i) {\n            const val = list[i];\n            if (val !== null) {\n                ret.push(this.createObjectOffset(val));\n            }\n            else {\n                throw new TypeError('FlatBuffers: Argument for createObjectOffsetList cannot contain null.');\n            }\n        }\n        return ret;\n    }\n    createStructOffsetList(list, startFunc) {\n        startFunc(this, list.length);\n        this.createObjectOffsetList(list.slice().reverse());\n        return this.endVector();\n    }\n}\n","// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\n\n\nexport class FBEffectsObjectData implements flatbuffers.IUnpackableObject<FBEffectsObjectDataT> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):FBEffectsObjectData {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nstatic getRootAsFBEffectsObjectData(bb:flatbuffers.ByteBuffer, obj?:FBEffectsObjectData):FBEffectsObjectData {\n  return (obj || new FBEffectsObjectData()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsFBEffectsObjectData(bb:flatbuffers.ByteBuffer, obj?:FBEffectsObjectData):FBEffectsObjectData {\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n  return (obj || new FBEffectsObjectData()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\ndataType():string|null\ndataType(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null\ndataType(optionalEncoding?:any):string|Uint8Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n  return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n}\n\ndata(index: number):number|null {\n  const offset = this.bb!.__offset(this.bb_pos, 6);\n  return offset ? this.bb!.readUint8(this.bb!.__vector(this.bb_pos + offset) + index) : 0;\n}\n\ndataLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 6);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\ndataArray():Uint8Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 6);\n  return offset ? new Uint8Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\n}\n\nstatic startFBEffectsObjectData(builder:flatbuffers.Builder) {\n  builder.startObject(2);\n}\n\nstatic addDataType(builder:flatbuffers.Builder, dataTypeOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(0, dataTypeOffset, 0);\n}\n\nstatic addData(builder:flatbuffers.Builder, dataOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(1, dataOffset, 0);\n}\n\nstatic createDataVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset {\n  builder.startVector(1, data.length, 1);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addInt8(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startDataVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(1, numElems, 1);\n}\n\nstatic endFBEffectsObjectData(builder:flatbuffers.Builder):flatbuffers.Offset {\n  const offset = builder.endObject();\n  return offset;\n}\n\nstatic createFBEffectsObjectData(builder:flatbuffers.Builder, dataTypeOffset:flatbuffers.Offset, dataOffset:flatbuffers.Offset):flatbuffers.Offset {\n  FBEffectsObjectData.startFBEffectsObjectData(builder);\n  FBEffectsObjectData.addDataType(builder, dataTypeOffset);\n  FBEffectsObjectData.addData(builder, dataOffset);\n  return FBEffectsObjectData.endFBEffectsObjectData(builder);\n}\n\nunpack(): FBEffectsObjectDataT {\n  return new FBEffectsObjectDataT(\n    this.dataType(),\n    this.bb!.createScalarList<number>(this.data.bind(this), this.dataLength())\n  );\n}\n\n\nunpackTo(_o: FBEffectsObjectDataT): void {\n  _o.dataType = this.dataType();\n  _o.data = this.bb!.createScalarList<number>(this.data.bind(this), this.dataLength());\n}\n}\n\nexport class FBEffectsObjectDataT implements flatbuffers.IGeneratedObject {\nconstructor(\n  public dataType: string|Uint8Array|null = null,\n  public data: (number)[] = []\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  const dataType = (this.dataType !== null ? builder.createString(this.dataType!) : 0);\n  const data = FBEffectsObjectData.createDataVector(builder, this.data);\n\n  return FBEffectsObjectData.createFBEffectsObjectData(builder,\n    dataType,\n    data\n  );\n}\n}\n","// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport { FBEffectsObjectData, FBEffectsObjectDataT } from './fbeffects-object-data.js';\n\n\nexport class FBEffectsPackageData implements flatbuffers.IUnpackableObject<FBEffectsPackageDataT> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):FBEffectsPackageData {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nstatic getRootAsFBEffectsPackageData(bb:flatbuffers.ByteBuffer, obj?:FBEffectsPackageData):FBEffectsPackageData {\n  return (obj || new FBEffectsPackageData()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsFBEffectsPackageData(bb:flatbuffers.ByteBuffer, obj?:FBEffectsPackageData):FBEffectsPackageData {\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n  return (obj || new FBEffectsPackageData()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nexportObjects(index: number, obj?:FBEffectsObjectData):FBEffectsObjectData|null {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n  return offset ? (obj || new FBEffectsObjectData()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;\n}\n\nexportObjectsLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\nstatic startFBEffectsPackageData(builder:flatbuffers.Builder) {\n  builder.startObject(1);\n}\n\nstatic addExportObjects(builder:flatbuffers.Builder, exportObjectsOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(0, exportObjectsOffset, 0);\n}\n\nstatic createExportObjectsVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\n  builder.startVector(4, data.length, 4);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addOffset(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startExportObjectsVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(4, numElems, 4);\n}\n\nstatic endFBEffectsPackageData(builder:flatbuffers.Builder):flatbuffers.Offset {\n  const offset = builder.endObject();\n  return offset;\n}\n\nstatic finishFBEffectsPackageDataBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) {\n  builder.finish(offset);\n}\n\nstatic finishSizePrefixedFBEffectsPackageDataBuffer(builder:flatbuffers.Builder, offset:flatbuffers.Offset) {\n  builder.finish(offset, undefined, true);\n}\n\nstatic createFBEffectsPackageData(builder:flatbuffers.Builder, exportObjectsOffset:flatbuffers.Offset):flatbuffers.Offset {\n  FBEffectsPackageData.startFBEffectsPackageData(builder);\n  FBEffectsPackageData.addExportObjects(builder, exportObjectsOffset);\n  return FBEffectsPackageData.endFBEffectsPackageData(builder);\n}\n\nunpack(): FBEffectsPackageDataT {\n  return new FBEffectsPackageDataT(\n    this.bb!.createObjList<FBEffectsObjectData, FBEffectsObjectDataT>(this.exportObjects.bind(this), this.exportObjectsLength())\n  );\n}\n\n\nunpackTo(_o: FBEffectsPackageDataT): void {\n  _o.exportObjects = this.bb!.createObjList<FBEffectsObjectData, FBEffectsObjectDataT>(this.exportObjects.bind(this), this.exportObjectsLength());\n}\n}\n\nexport class FBEffectsPackageDataT implements flatbuffers.IGeneratedObject {\nconstructor(\n  public exportObjects: (FBEffectsObjectDataT)[] = []\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  const exportObjects = FBEffectsPackageData.createExportObjectsVector(builder, builder.createObjectOffsetList(this.exportObjects));\n\n  return FBEffectsPackageData.createFBEffectsPackageData(builder,\n    exportObjects\n  );\n}\n}\n","// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\n\n\nexport class FBSubMesh implements flatbuffers.IUnpackableObject<FBSubMeshT> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):FBSubMesh {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nstatic getRootAsFBSubMesh(bb:flatbuffers.ByteBuffer, obj?:FBSubMesh):FBSubMesh {\n  return (obj || new FBSubMesh()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsFBSubMesh(bb:flatbuffers.ByteBuffer, obj?:FBSubMesh):FBSubMesh {\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n  return (obj || new FBSubMesh()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\noffset():number {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n  return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n}\n\nindexCount():number {\n  const offset = this.bb!.__offset(this.bb_pos, 6);\n  return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n}\n\nvertexCount():number {\n  const offset = this.bb!.__offset(this.bb_pos, 8);\n  return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n}\n\nstatic startFBSubMesh(builder:flatbuffers.Builder) {\n  builder.startObject(3);\n}\n\nstatic addOffset(builder:flatbuffers.Builder, offset:number) {\n  builder.addFieldInt32(0, offset, 0);\n}\n\nstatic addIndexCount(builder:flatbuffers.Builder, indexCount:number) {\n  builder.addFieldInt32(1, indexCount, 0);\n}\n\nstatic addVertexCount(builder:flatbuffers.Builder, vertexCount:number) {\n  builder.addFieldInt32(2, vertexCount, 0);\n}\n\nstatic endFBSubMesh(builder:flatbuffers.Builder):flatbuffers.Offset {\n  const offset = builder.endObject();\n  return offset;\n}\n\nstatic createFBSubMesh(builder:flatbuffers.Builder, offset:number, indexCount:number, vertexCount:number):flatbuffers.Offset {\n  FBSubMesh.startFBSubMesh(builder);\n  FBSubMesh.addOffset(builder, offset);\n  FBSubMesh.addIndexCount(builder, indexCount);\n  FBSubMesh.addVertexCount(builder, vertexCount);\n  return FBSubMesh.endFBSubMesh(builder);\n}\n\nunpack(): FBSubMeshT {\n  return new FBSubMeshT(\n    this.offset(),\n    this.indexCount(),\n    this.vertexCount()\n  );\n}\n\n\nunpackTo(_o: FBSubMeshT): void {\n  _o.offset = this.offset();\n  _o.indexCount = this.indexCount();\n  _o.vertexCount = this.vertexCount();\n}\n}\n\nexport class FBSubMeshT implements flatbuffers.IGeneratedObject {\nconstructor(\n  public offset: number = 0,\n  public indexCount: number = 0,\n  public vertexCount: number = 0\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  return FBSubMesh.createFBSubMesh(builder,\n    this.offset,\n    this.indexCount,\n    this.vertexCount\n  );\n}\n}\n","// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\n\n\nexport class FBVertexChannel implements flatbuffers.IUnpackableObject<FBVertexChannelT> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):FBVertexChannel {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nstatic getRootAsFBVertexChannel(bb:flatbuffers.ByteBuffer, obj?:FBVertexChannel):FBVertexChannel {\n  return (obj || new FBVertexChannel()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsFBVertexChannel(bb:flatbuffers.ByteBuffer, obj?:FBVertexChannel):FBVertexChannel {\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n  return (obj || new FBVertexChannel()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nsemantic():string|null\nsemantic(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null\nsemantic(optionalEncoding?:any):string|Uint8Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n  return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n}\n\noffset():number {\n  const offset = this.bb!.__offset(this.bb_pos, 6);\n  return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n}\n\nformat():number {\n  const offset = this.bb!.__offset(this.bb_pos, 8);\n  return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n}\n\ndimension():number {\n  const offset = this.bb!.__offset(this.bb_pos, 10);\n  return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n}\n\nnormalize():boolean {\n  const offset = this.bb!.__offset(this.bb_pos, 12);\n  return offset ? !!this.bb!.readInt8(this.bb_pos + offset) : false;\n}\n\nstatic startFBVertexChannel(builder:flatbuffers.Builder) {\n  builder.startObject(5);\n}\n\nstatic addSemantic(builder:flatbuffers.Builder, semanticOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(0, semanticOffset, 0);\n}\n\nstatic addOffset(builder:flatbuffers.Builder, offset:number) {\n  builder.addFieldInt32(1, offset, 0);\n}\n\nstatic addFormat(builder:flatbuffers.Builder, format:number) {\n  builder.addFieldInt32(2, format, 0);\n}\n\nstatic addDimension(builder:flatbuffers.Builder, dimension:number) {\n  builder.addFieldInt32(3, dimension, 0);\n}\n\nstatic addNormalize(builder:flatbuffers.Builder, normalize:boolean) {\n  builder.addFieldInt8(4, +normalize, +false);\n}\n\nstatic endFBVertexChannel(builder:flatbuffers.Builder):flatbuffers.Offset {\n  const offset = builder.endObject();\n  return offset;\n}\n\nstatic createFBVertexChannel(builder:flatbuffers.Builder, semanticOffset:flatbuffers.Offset, offset:number, format:number, dimension:number, normalize:boolean):flatbuffers.Offset {\n  FBVertexChannel.startFBVertexChannel(builder);\n  FBVertexChannel.addSemantic(builder, semanticOffset);\n  FBVertexChannel.addOffset(builder, offset);\n  FBVertexChannel.addFormat(builder, format);\n  FBVertexChannel.addDimension(builder, dimension);\n  FBVertexChannel.addNormalize(builder, normalize);\n  return FBVertexChannel.endFBVertexChannel(builder);\n}\n\nunpack(): FBVertexChannelT {\n  return new FBVertexChannelT(\n    this.semantic(),\n    this.offset(),\n    this.format(),\n    this.dimension(),\n    this.normalize()\n  );\n}\n\n\nunpackTo(_o: FBVertexChannelT): void {\n  _o.semantic = this.semantic();\n  _o.offset = this.offset();\n  _o.format = this.format();\n  _o.dimension = this.dimension();\n  _o.normalize = this.normalize();\n}\n}\n\nexport class FBVertexChannelT implements flatbuffers.IGeneratedObject {\nconstructor(\n  public semantic: string|Uint8Array|null = null,\n  public offset: number = 0,\n  public format: number = 0,\n  public dimension: number = 0,\n  public normalize: boolean = false\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  const semantic = (this.semantic !== null ? builder.createString(this.semantic!) : 0);\n\n  return FBVertexChannel.createFBVertexChannel(builder,\n    semantic,\n    this.offset,\n    this.format,\n    this.dimension,\n    this.normalize\n  );\n}\n}\n","// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport { FBVertexChannel, FBVertexChannelT } from './fbvertex-channel.js';\n\n\nexport class FBVertexData implements flatbuffers.IUnpackableObject<FBVertexDataT> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):FBVertexData {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nstatic getRootAsFBVertexData(bb:flatbuffers.ByteBuffer, obj?:FBVertexData):FBVertexData {\n  return (obj || new FBVertexData()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsFBVertexData(bb:flatbuffers.ByteBuffer, obj?:FBVertexData):FBVertexData {\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n  return (obj || new FBVertexData()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nvertexCount():number {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n  return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n}\n\nchannels(index: number, obj?:FBVertexChannel):FBVertexChannel|null {\n  const offset = this.bb!.__offset(this.bb_pos, 6);\n  return offset ? (obj || new FBVertexChannel()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;\n}\n\nchannelsLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 6);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\nstatic startFBVertexData(builder:flatbuffers.Builder) {\n  builder.startObject(2);\n}\n\nstatic addVertexCount(builder:flatbuffers.Builder, vertexCount:number) {\n  builder.addFieldInt32(0, vertexCount, 0);\n}\n\nstatic addChannels(builder:flatbuffers.Builder, channelsOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(1, channelsOffset, 0);\n}\n\nstatic createChannelsVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\n  builder.startVector(4, data.length, 4);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addOffset(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startChannelsVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(4, numElems, 4);\n}\n\nstatic endFBVertexData(builder:flatbuffers.Builder):flatbuffers.Offset {\n  const offset = builder.endObject();\n  return offset;\n}\n\nstatic createFBVertexData(builder:flatbuffers.Builder, vertexCount:number, channelsOffset:flatbuffers.Offset):flatbuffers.Offset {\n  FBVertexData.startFBVertexData(builder);\n  FBVertexData.addVertexCount(builder, vertexCount);\n  FBVertexData.addChannels(builder, channelsOffset);\n  return FBVertexData.endFBVertexData(builder);\n}\n\nunpack(): FBVertexDataT {\n  return new FBVertexDataT(\n    this.vertexCount(),\n    this.bb!.createObjList<FBVertexChannel, FBVertexChannelT>(this.channels.bind(this), this.channelsLength())\n  );\n}\n\n\nunpackTo(_o: FBVertexDataT): void {\n  _o.vertexCount = this.vertexCount();\n  _o.channels = this.bb!.createObjList<FBVertexChannel, FBVertexChannelT>(this.channels.bind(this), this.channelsLength());\n}\n}\n\nexport class FBVertexDataT implements flatbuffers.IGeneratedObject {\nconstructor(\n  public vertexCount: number = 0,\n  public channels: (FBVertexChannelT)[] = []\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  const channels = FBVertexData.createChannelsVector(builder, builder.createObjectOffsetList(this.channels));\n\n  return FBVertexData.createFBVertexData(builder,\n    this.vertexCount,\n    channels\n  );\n}\n}\n","// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport { FBSubMesh, FBSubMeshT } from './fbsub-mesh.js';\nimport { FBVertexData, FBVertexDataT } from './fbvertex-data.js';\n\n\nexport class FBGeometryData implements flatbuffers.IUnpackableObject<FBGeometryDataT> {\n  bb: flatbuffers.ByteBuffer|null = null;\n  bb_pos = 0;\n  __init(i:number, bb:flatbuffers.ByteBuffer):FBGeometryData {\n  this.bb_pos = i;\n  this.bb = bb;\n  return this;\n}\n\nstatic getRootAsFBGeometryData(bb:flatbuffers.ByteBuffer, obj?:FBGeometryData):FBGeometryData {\n  return (obj || new FBGeometryData()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsFBGeometryData(bb:flatbuffers.ByteBuffer, obj?:FBGeometryData):FBGeometryData {\n  bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n  return (obj || new FBGeometryData()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nid():string|null\nid(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null\nid(optionalEncoding?:any):string|Uint8Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 4);\n  return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n}\n\nname():string|null\nname(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null\nname(optionalEncoding?:any):string|Uint8Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 6);\n  return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n}\n\nvertexData(obj?:FBVertexData):FBVertexData|null {\n  const offset = this.bb!.__offset(this.bb_pos, 8);\n  return offset ? (obj || new FBVertexData()).__init(this.bb!.__indirect(this.bb_pos + offset), this.bb!) : null;\n}\n\nindexFormat():number {\n  const offset = this.bb!.__offset(this.bb_pos, 10);\n  return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n}\n\nindexOffset():number {\n  const offset = this.bb!.__offset(this.bb_pos, 12);\n  return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n}\n\nsubMeshes(index: number, obj?:FBSubMesh):FBSubMesh|null {\n  const offset = this.bb!.__offset(this.bb_pos, 14);\n  return offset ? (obj || new FBSubMesh()).__init(this.bb!.__indirect(this.bb!.__vector(this.bb_pos + offset) + index * 4), this.bb!) : null;\n}\n\nsubMeshesLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 14);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\nmode():number {\n  const offset = this.bb!.__offset(this.bb_pos, 16);\n  return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;\n}\n\nbuffer():string|null\nbuffer(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null\nbuffer(optionalEncoding?:any):string|Uint8Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 18);\n  return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n}\n\nbinaryData(index: number):number|null {\n  const offset = this.bb!.__offset(this.bb_pos, 20);\n  return offset ? this.bb!.readUint8(this.bb!.__vector(this.bb_pos + offset) + index) : 0;\n}\n\nbinaryDataLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 20);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\nbinaryDataArray():Uint8Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 20);\n  return offset ? new Uint8Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\n}\n\nboneNames(index: number):string\nboneNames(index: number,optionalEncoding:flatbuffers.Encoding):string|Uint8Array\nboneNames(index: number,optionalEncoding?:any):string|Uint8Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 22);\n  return offset ? this.bb!.__string(this.bb!.__vector(this.bb_pos + offset) + index * 4, optionalEncoding) : null;\n}\n\nboneNamesLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 22);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\nrootBoneName():string|null\nrootBoneName(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null\nrootBoneName(optionalEncoding?:any):string|Uint8Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 24);\n  return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n}\n\ninverseBindMatrices(index: number):number|null {\n  const offset = this.bb!.__offset(this.bb_pos, 26);\n  return offset ? this.bb!.readFloat32(this.bb!.__vector(this.bb_pos + offset) + index * 4) : 0;\n}\n\ninverseBindMatricesLength():number {\n  const offset = this.bb!.__offset(this.bb_pos, 26);\n  return offset ? this.bb!.__vector_len(this.bb_pos + offset) : 0;\n}\n\ninverseBindMatricesArray():Float32Array|null {\n  const offset = this.bb!.__offset(this.bb_pos, 26);\n  return offset ? new Float32Array(this.bb!.bytes().buffer, this.bb!.bytes().byteOffset + this.bb!.__vector(this.bb_pos + offset), this.bb!.__vector_len(this.bb_pos + offset)) : null;\n}\n\nstatic startFBGeometryData(builder:flatbuffers.Builder) {\n  builder.startObject(12);\n}\n\nstatic addId(builder:flatbuffers.Builder, idOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(0, idOffset, 0);\n}\n\nstatic addName(builder:flatbuffers.Builder, nameOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(1, nameOffset, 0);\n}\n\nstatic addVertexData(builder:flatbuffers.Builder, vertexDataOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(2, vertexDataOffset, 0);\n}\n\nstatic addIndexFormat(builder:flatbuffers.Builder, indexFormat:number) {\n  builder.addFieldInt32(3, indexFormat, 0);\n}\n\nstatic addIndexOffset(builder:flatbuffers.Builder, indexOffset:number) {\n  builder.addFieldInt32(4, indexOffset, 0);\n}\n\nstatic addSubMeshes(builder:flatbuffers.Builder, subMeshesOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(5, subMeshesOffset, 0);\n}\n\nstatic createSubMeshesVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\n  builder.startVector(4, data.length, 4);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addOffset(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startSubMeshesVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(4, numElems, 4);\n}\n\nstatic addMode(builder:flatbuffers.Builder, mode:number) {\n  builder.addFieldInt32(6, mode, 0);\n}\n\nstatic addBuffer(builder:flatbuffers.Builder, bufferOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(7, bufferOffset, 0);\n}\n\nstatic addBinaryData(builder:flatbuffers.Builder, binaryDataOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(8, binaryDataOffset, 0);\n}\n\nstatic createBinaryDataVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset {\n  builder.startVector(1, data.length, 1);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addInt8(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startBinaryDataVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(1, numElems, 1);\n}\n\nstatic addBoneNames(builder:flatbuffers.Builder, boneNamesOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(9, boneNamesOffset, 0);\n}\n\nstatic createBoneNamesVector(builder:flatbuffers.Builder, data:flatbuffers.Offset[]):flatbuffers.Offset {\n  builder.startVector(4, data.length, 4);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addOffset(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startBoneNamesVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(4, numElems, 4);\n}\n\nstatic addRootBoneName(builder:flatbuffers.Builder, rootBoneNameOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(10, rootBoneNameOffset, 0);\n}\n\nstatic addInverseBindMatrices(builder:flatbuffers.Builder, inverseBindMatricesOffset:flatbuffers.Offset) {\n  builder.addFieldOffset(11, inverseBindMatricesOffset, 0);\n}\n\nstatic createInverseBindMatricesVector(builder:flatbuffers.Builder, data:number[]|Float32Array):flatbuffers.Offset;\n/**\n * @deprecated This Uint8Array overload will be removed in the future.\n */\nstatic createInverseBindMatricesVector(builder:flatbuffers.Builder, data:number[]|Uint8Array):flatbuffers.Offset;\nstatic createInverseBindMatricesVector(builder:flatbuffers.Builder, data:number[]|Float32Array|Uint8Array):flatbuffers.Offset {\n  builder.startVector(4, data.length, 4);\n  for (let i = data.length - 1; i >= 0; i--) {\n    builder.addFloat32(data[i]!);\n  }\n  return builder.endVector();\n}\n\nstatic startInverseBindMatricesVector(builder:flatbuffers.Builder, numElems:number) {\n  builder.startVector(4, numElems, 4);\n}\n\nstatic endFBGeometryData(builder:flatbuffers.Builder):flatbuffers.Offset {\n  const offset = builder.endObject();\n  return offset;\n}\n\n\nunpack(): FBGeometryDataT {\n  return new FBGeometryDataT(\n    this.id(),\n    this.name(),\n    (this.vertexData() !== null ? this.vertexData()!.unpack() : null),\n    this.indexFormat(),\n    this.indexOffset(),\n    this.bb!.createObjList<FBSubMesh, FBSubMeshT>(this.subMeshes.bind(this), this.subMeshesLength()),\n    this.mode(),\n    this.buffer(),\n    this.bb!.createScalarList<number>(this.binaryData.bind(this), this.binaryDataLength()),\n    this.bb!.createScalarList<string>(this.boneNames.bind(this), this.boneNamesLength()),\n    this.rootBoneName(),\n    this.bb!.createScalarList<number>(this.inverseBindMatrices.bind(this), this.inverseBindMatricesLength())\n  );\n}\n\n\nunpackTo(_o: FBGeometryDataT): void {\n  _o.id = this.id();\n  _o.name = this.name();\n  _o.vertexData = (this.vertexData() !== null ? this.vertexData()!.unpack() : null);\n  _o.indexFormat = this.indexFormat();\n  _o.indexOffset = this.indexOffset();\n  _o.subMeshes = this.bb!.createObjList<FBSubMesh, FBSubMeshT>(this.subMeshes.bind(this), this.subMeshesLength());\n  _o.mode = this.mode();\n  _o.buffer = this.buffer();\n  _o.binaryData = this.bb!.createScalarList<number>(this.binaryData.bind(this), this.binaryDataLength());\n  _o.boneNames = this.bb!.createScalarList<string>(this.boneNames.bind(this), this.boneNamesLength());\n  _o.rootBoneName = this.rootBoneName();\n  _o.inverseBindMatrices = this.bb!.createScalarList<number>(this.inverseBindMatrices.bind(this), this.inverseBindMatricesLength());\n}\n}\n\nexport class FBGeometryDataT implements flatbuffers.IGeneratedObject {\nconstructor(\n  public id: string|Uint8Array|null = null,\n  public name: string|Uint8Array|null = null,\n  public vertexData: FBVertexDataT|null = null,\n  public indexFormat: number = 0,\n  public indexOffset: number = 0,\n  public subMeshes: (FBSubMeshT)[] = [],\n  public mode: number = 0,\n  public buffer: string|Uint8Array|null = null,\n  public binaryData: (number)[] = [],\n  public boneNames: (string)[] = [],\n  public rootBoneName: string|Uint8Array|null = null,\n  public inverseBindMatrices: (number)[] = []\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n  const id = (this.id !== null ? builder.createString(this.id!) : 0);\n  const name = (this.name !== null ? builder.createString(this.name!) : 0);\n  const vertexData = (this.vertexData !== null ? this.vertexData!.pack(builder) : 0);\n  const subMeshes = FBGeometryData.createSubMeshesVector(builder, builder.createObjectOffsetList(this.subMeshes));\n  const buffer = (this.buffer !== null ? builder.createString(this.buffer!) : 0);\n  const binaryData = FBGeometryData.createBinaryDataVector(builder, this.binaryData);\n  const boneNames = FBGeometryData.createBoneNamesVector(builder, builder.createObjectOffsetList(this.boneNames));\n  const rootBoneName = (this.rootBoneName !== null ? builder.createString(this.rootBoneName!) : 0);\n  const inverseBindMatrices = FBGeometryData.createInverseBindMatricesVector(builder, this.inverseBindMatrices);\n\n  FBGeometryData.startFBGeometryData(builder);\n  FBGeometryData.addId(builder, id);\n  FBGeometryData.addName(builder, name);\n  FBGeometryData.addVertexData(builder, vertexData);\n  FBGeometryData.addIndexFormat(builder, this.indexFormat);\n  FBGeometryData.addIndexOffset(builder, this.indexOffset);\n  FBGeometryData.addSubMeshes(builder, subMeshes);\n  FBGeometryData.addMode(builder, this.mode);\n  FBGeometryData.addBuffer(builder, buffer);\n  FBGeometryData.addBinaryData(builder, binaryData);\n  FBGeometryData.addBoneNames(builder, boneNames);\n  FBGeometryData.addRootBoneName(builder, rootBoneName);\n  FBGeometryData.addInverseBindMatrices(builder, inverseBindMatrices);\n\n  return FBGeometryData.endFBGeometryData(builder);\n}\n}\n","import * as flatbuffers from 'flatbuffers';\nimport * as spec from '@galacean/effects-specification';\nimport {\n  FBEffectsObjectDataT, FBEffectsPackageData, FBEffectsPackageDataT, FBGeometryData,\n  FBGeometryDataT, FBSubMeshT, FBVertexChannelT, FBVertexDataT,\n} from './__definations__';\n\ninterface FileSummary {\n  assetType: string,\n  guid: string,\n}\n\n/**\n * @since 2.0.0\n */\nexport class EffectsPackage {\n  fileSummary: FileSummary;\n  exportObjectDatas: spec.EffectsObjectData[] = [];\n\n  addData (effectsObjectData: spec.EffectsObjectData) {\n    this.exportObjectDatas.push(effectsObjectData);\n  }\n\n  serializeToBinary (): Uint8Array {\n    const fbb = new flatbuffers.Builder(1);\n    const effectsPackage = new FBEffectsPackageDataT();\n    const exportObjects = [];\n\n    for (const effectsObjectData of this.exportObjectDatas) {\n      let fbEffectsObjectData;\n\n      if (effectsObjectData.dataType === spec.DataType.Geometry) {\n        fbEffectsObjectData = new FBEffectsObjectDataT(\n          'Geometry',\n          this.geometryDataToBinary(effectsObjectData as spec.GeometryData) as unknown as number[],\n        );\n      }\n\n      if (!fbEffectsObjectData) {\n        continue;\n      }\n      exportObjects.push(fbEffectsObjectData);\n    }\n    effectsPackage.exportObjects = exportObjects;\n\n    FBEffectsPackageData.finishFBEffectsPackageDataBuffer(fbb, effectsPackage.pack(fbb));\n\n    return fbb.asUint8Array(); // Of type `Uint8Array`.\n  }\n\n  deserializeFromBinary (buffer: Uint8Array) {\n    const buf = new flatbuffers.ByteBuffer(buffer);\n    const fbEffectsPackage = FBEffectsPackageData.getRootAsFBEffectsPackageData(buf);\n\n    for (let i = 0; i < fbEffectsPackage.exportObjectsLength(); i++) {\n      const fbEffectsObjectData = fbEffectsPackage.exportObjects(i);\n\n      if (!fbEffectsObjectData) {\n        continue;\n      }\n\n      const dataBuffer = fbEffectsObjectData.dataArray();\n      const dataType = fbEffectsObjectData.dataType();\n\n      if (!dataBuffer) {\n        continue;\n      }\n      let effectsObjectData;\n\n      if (dataType === spec.DataType.Geometry) {\n        effectsObjectData = this.binaryToGeometryData(dataBuffer);\n      }\n\n      if (!effectsObjectData) {\n        continue;\n      }\n      this.exportObjectDatas.push(effectsObjectData);\n    }\n  }\n\n  private geometryDataToBinary (geometryData: spec.GeometryData): Uint8Array {\n    const fbb = new flatbuffers.Builder(1);\n    const fbGeometryData = new FBGeometryDataT();\n    const {\n      indexFormat, indexOffset, mode, id, vertexData,\n      boneNames = [],\n      rootBoneName = '',\n      inverseBindMatrices = [],\n      binaryData = [],\n    } = geometryData;\n\n    fbGeometryData.indexFormat = indexFormat;\n    fbGeometryData.indexOffset = indexOffset;\n    fbGeometryData.mode = mode;\n    fbGeometryData.id = id;\n    fbGeometryData.boneNames = boneNames;\n    fbGeometryData.rootBoneName = rootBoneName;\n    fbGeometryData.inverseBindMatrices = inverseBindMatrices;\n    fbGeometryData.binaryData = binaryData as unknown as number[];\n    const fbVertexdata = new FBVertexDataT();\n\n    fbVertexdata.vertexCount = vertexData.vertexCount;\n    fbVertexdata.channels = [];\n    for (const channel of vertexData.channels) {\n      const { semantic, offset, format, dimension, normalize } = channel;\n      const fbChannel = new FBVertexChannelT(\n        semantic,\n        offset,\n        format,\n        dimension,\n        normalize,\n      );\n\n      fbVertexdata.channels.push(fbChannel);\n    }\n    fbGeometryData.vertexData = fbVertexdata;\n    const fbSubMeshes = [];\n\n    for (const subMesh of geometryData.subMeshes) {\n      const { offset, indexCount, vertexCount } = subMesh;\n      const fbSubMesh = new FBSubMeshT(\n        offset,\n        indexCount,\n        vertexCount,\n      );\n\n      fbSubMeshes.push(fbSubMesh);\n    }\n    fbGeometryData.subMeshes = fbSubMeshes;\n\n    FBEffectsPackageData.finishFBEffectsPackageDataBuffer(fbb, fbGeometryData.pack(fbb));\n\n    return fbb.asUint8Array(); // Of type `Uint8Array`.\n  }\n\n  private binaryToGeometryData (buffer: Uint8Array): spec.GeometryData {\n    const buf = new flatbuffers.ByteBuffer(buffer);\n    const fbGeometryData = FBGeometryData.getRootAsFBGeometryData(buf);\n    const vertexData: spec.VertexData = {\n      vertexCount: 0,\n      channels: [],\n    };\n    const fbVertexData = fbGeometryData.vertexData();\n\n    if (fbVertexData) {\n      vertexData.vertexCount = fbVertexData.vertexCount();\n\n      for (let i = 0; i < fbVertexData.channelsLength(); i++) {\n        const channel = fbVertexData.channels(i);\n\n        if (!channel) {\n          continue;\n        }\n        const vertexChannel: spec.VertexChannel = {\n          semantic: channel.semantic() ?? '',\n          offset: channel.offset(),\n          format: channel.format(),\n          dimension: channel.dimension(),\n          normalize:channel.normalize(),\n        };\n\n        vertexData.channels.push(vertexChannel);\n      }\n    }\n\n    const subMeshes: spec.SubMesh[] = [];\n\n    for (let i = 0; i < fbGeometryData.subMeshesLength(); i++) {\n      const fbSubMesh = fbGeometryData.subMeshes(i);\n\n      if (!fbSubMesh) {\n        continue;\n      }\n      const subMesh: spec.SubMesh = {\n        offset: fbSubMesh.offset(),\n        vertexCount: fbSubMesh.vertexCount(),\n        indexCount: fbSubMesh.indexCount(),\n      };\n\n      subMeshes.push(subMesh);\n    }\n\n    const boneNames = [];\n\n    for (let i = 0; i < fbGeometryData.boneNamesLength(); i++) {\n      const boneName = fbGeometryData.boneNames(i);\n\n      boneNames.push(boneName);\n    }\n\n    const inverseBindMatricesArray = fbGeometryData.inverseBindMatricesArray();\n    const geometryData: spec.GeometryData = {\n      vertexData,\n      indexFormat: fbGeometryData.indexFormat(),\n      indexOffset: fbGeometryData.indexOffset(),\n      subMeshes,\n      mode: fbGeometryData.mode(),\n      buffer: fbGeometryData.buffer() ?? '',\n      boneNames,\n      rootBoneName: fbGeometryData.rootBoneName() ?? '',\n      inverseBindMatrices: inverseBindMatricesArray ? Array.from(inverseBindMatricesArray) : undefined,\n      binaryData: fbGeometryData.binaryDataArray() ?? undefined,\n      id: fbGeometryData.id() ?? '',\n      dataType: spec.DataType.Geometry,\n    };\n\n    return geometryData;\n  }\n}\n","import { clamp } from '@galacean/effects-math/es/core/utils';\n\nexport const DEFAULT_FPS = 60;\n\n/**\n * 定时器类\n */\nexport class Ticker {\n  tickers: ((dt: number) => void)[];\n\n  private paused = true;\n  private lastTime = 0;\n  private targetFPS: number;\n  private interval: number;\n  private intervalId: number;\n  private resetTickers: boolean;\n  // deltaTime\n  private dt = 0;\n\n  constructor (fps = DEFAULT_FPS) {\n    this.setFPS(fps);\n    this.tickers = [];\n  }\n\n  /**\n   * 获取定时器当前帧更新的时间\n   */\n  get deltaTime () {\n    return this.dt;\n  }\n\n  /**\n   * FPS 帧率设置\n   */\n  getFPS () {\n    return this.targetFPS;\n  }\n  setFPS (fps: number) {\n    this.targetFPS = clamp(fps, 1, 120);\n    // 注意：-2 的原因是保证帧率稳定\n    // interval 在 fps 为 60 的时候设成 15 累计误差会很大，设成 14 较稳定\n    // requestanimationFrame 在不同的刷新率下时间间隔不一样，120hz 的误差在 8 以内，60hz 的误差在 16 以内\n    this.interval = Math.floor(1000 / fps) - 2;\n  }\n\n  /**\n   * 获取定时器暂停标志位\n   * @returns\n   */\n  getPaused () {\n    return this.paused;\n  }\n\n  /**\n   * 定时器开始方法\n   */\n  start () {\n    this.paused = false;\n    this.dt = 0;\n\n    if (!this.intervalId) {\n      this.lastTime = performance.now();\n      const raf = requestAnimationFrame || function (func) {\n        return window.setTimeout(func, 16.7);\n      };\n      const runLoop = () => {\n        this.intervalId = raf(runLoop);\n        if (!this.paused) {\n          this.tick();\n        }\n      };\n\n      runLoop();\n    }\n  }\n\n  /**\n   * 定时器停止方法\n   */\n  stop () {\n    (cancelAnimationFrame || window.clearTimeout)(this.intervalId);\n    this.intervalId = 0;\n    this.lastTime = 0;\n    this.paused = true;\n    this.dt = 0;\n    this.tickers = [];\n  }\n\n  /**\n   * 定时器暂停方法\n   */\n  pause () {\n    this.paused = true;\n    this.dt = 0;\n  }\n\n  /**\n   * 定时器恢复方法\n   */\n  resume () {\n    this.paused = false;\n    this.dt = 0;\n  }\n\n  /**\n   * 定时器 tick 方法\n   */\n  tick () {\n    if (this.paused) {\n      return;\n    }\n    const startTime = performance.now();\n\n    this.dt = startTime - this.lastTime;\n    if (this.dt >= this.interval) {\n      this.lastTime = startTime;\n\n      if (this.resetTickers) {\n        this.tickers = this.tickers.filter(tick => tick);\n        this.resetTickers = false;\n      }\n\n      for (const tick of this.tickers) {\n        tick(this.dt);\n      }\n    }\n  }\n\n  /**\n   * 定时器添加计时方法\n   * @param ticker - 定时器类\n   */\n  add (ticker: (dt: number) => void) {\n    if (typeof ticker !== 'function') {\n      throw new Error('The tick object must implement the tick method.');\n    }\n    this.tickers.push(ticker);\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport type { Database, SceneData } from './asset-loader';\nimport { AssetLoader } from './asset-loader';\nimport type { EffectsObject } from './effects-object';\nimport type { Material } from './material';\nimport type { GPUCapability, Geometry, Mesh, RenderPass, Renderer, ShaderLibrary } from './render';\nimport type { Scene, SceneRenderLevel } from './scene';\nimport type { Texture } from './texture';\nimport { TextureLoadAction, generateTransparentTexture, generateWhiteTexture } from './texture';\nimport type { Disposable } from './utils';\nimport { addItem, getPixelRatio, isPlainObject, logger, removeItem } from './utils';\nimport { EffectsPackage } from './effects-package';\nimport { passRenderLevel } from './pass-render-level';\nimport type { Composition } from './composition';\nimport type { AssetManager } from './asset-manager';\nimport { AssetService } from './asset-service';\nimport { Ticker } from './ticker';\nimport { EventSystem } from './plugins/interact/event-system';\nimport type { GLType } from './gl/create-gl-context';\nimport { HELP_LINK } from './constants';\nimport type { PointerEventData, Region } from './plugins/interact/click-handler';\nimport { EventEmitter } from './events';\n\nexport interface EngineOptions extends WebGLContextAttributes {\n  name?: string,\n  glType?: GLType,\n  fps?: number,\n  env?: string,\n  manualRender?: boolean,\n  pixelRatio?: number,\n  notifyTouch?: boolean,\n  interactive?: boolean,\n}\n\ntype EngineEvent = {\n  contextlost: [eventData: { engine: Engine, e: Event }],\n  contextrestored: [engine: Engine],\n  rendererror: [e: Event | Error],\n  resize: [Engine],\n  click: [eventData: Region],\n  pointerdown: [eventData: PointerEventData],\n  pointerup: [eventData: PointerEventData],\n  pointermove: [eventData: PointerEventData],\n};\n\n/**\n * Engine 基类，负责维护所有 GPU 资源的管理及销毁\n */\nexport class Engine extends EventEmitter<EngineEvent> implements Disposable {\n  name = 'NewEngine';\n  speed = 1;\n  displayAspect: number;\n  displayScale = 1;\n  offscreenMode = false;\n  /**\n   * 渲染器\n   */\n  renderer: Renderer;\n  /**\n   * 渲染等级\n   */\n  renderLevel?: SceneRenderLevel;\n  whiteTexture: Texture;\n  transparentTexture: Texture;\n  /**\n   * GPU 能力\n   */\n  gpuCapability: GPUCapability;\n  jsonSceneData: SceneData;\n  objectInstance: Record<string, EffectsObject>;\n  database?: Database; // TODO: 磁盘数据库，打包后 runtime 运行不需要\n  /**\n   * 渲染过程中错误队列\n   */\n  renderErrors: Set<Error> = new Set();\n  compositions: Composition[] = [];\n  assetManagers: AssetManager[] = [];\n  assetService: AssetService;\n  eventSystem: EventSystem;\n  env = '';\n  /**\n   * 计时器\n   * 手动渲染 `manualRender=true` 时不创建计时器\n   */\n  ticker: Ticker | null = null;\n  canvas: HTMLCanvasElement;\n  /**\n   * 引擎的像素比\n   */\n  pixelRatio: number;\n\n  protected _disposed = false;\n  protected textures: Texture[] = [];\n  protected materials: Material[] = [];\n  protected geometries: Geometry[] = [];\n  protected meshes: Mesh[] = [];\n  protected renderPasses: RenderPass[] = [];\n\n  private assetLoader: AssetLoader;\n\n  get disposed (): boolean {\n    return this._disposed;\n  }\n\n  /**\n   *\n   */\n  constructor (canvas: HTMLCanvasElement, options?: EngineOptions) {\n    super();\n    this.canvas = canvas;\n    this.env = options?.env ?? '';\n    this.name = options?.name ?? this.name;\n    this.pixelRatio = options?.pixelRatio ?? getPixelRatio();\n    this.jsonSceneData = {};\n    this.objectInstance = {};\n    this.whiteTexture = generateWhiteTexture(this);\n    this.transparentTexture = generateTransparentTexture(this);\n\n    if (!options?.manualRender) {\n      this.ticker = new Ticker(options?.fps);\n      this.runRenderLoop(this.render.bind(this));\n    }\n\n    this.eventSystem = new EventSystem(this, options?.notifyTouch ?? false);\n    this.eventSystem.enabled = options?.interactive ?? false;\n    this.eventSystem.bindListeners(this.canvas);\n\n    this.assetLoader = new AssetLoader(this);\n    this.assetService = new AssetService(this);\n  }\n\n  /**\n   * 创建 Engine 对象。\n   */\n  static create: (canvas: HTMLCanvasElement, options?: EngineOptions) => Engine;\n\n  clearResources () {\n    this.jsonSceneData = {};\n    this.objectInstance = {};\n  }\n\n  addEffectsObjectData (data: spec.EffectsObjectData) {\n    this.jsonSceneData[data.id] = data;\n  }\n\n  findEffectsObjectData (uuid: string) {\n    return this.jsonSceneData[uuid];\n  }\n\n  addInstance (effectsObject: EffectsObject) {\n    this.objectInstance[effectsObject.getInstanceId()] = effectsObject;\n  }\n\n  /**\n   * @ignore\n   */\n  findObject<T>(guid: spec.DataPath): T {\n    // 编辑器可能传 Class 对象，这边判断处理一下直接返回原对象。\n    if (!(isPlainObject(guid))) {\n      return guid as T;\n    }\n\n    if (this.objectInstance[guid.id]) {\n      return this.objectInstance[guid.id] as T;\n    }\n\n    const result = this.assetLoader.loadGUID<T>(guid);\n\n    return result;\n  }\n\n  removeInstance (id: string) {\n    delete this.objectInstance[id];\n  }\n\n  addPackageDatas (scene: Scene) {\n    const { jsonScene, textureOptions = [] } = scene;\n    const {\n      items = [], materials = [], shaders = [], geometries = [], components = [],\n      animations = [], bins = [], miscs = [], compositions,\n    } = jsonScene;\n\n    for (const compositionData of compositions) {\n      this.addEffectsObjectData(compositionData as unknown as spec.EffectsObjectData);\n    }\n    for (const vfxItemData of items) {\n      if (!passRenderLevel(vfxItemData.renderLevel, scene.renderLevel)) {\n        vfxItemData.components = [];\n        vfxItemData.type = spec.ItemType.null;\n      }\n      this.addEffectsObjectData(vfxItemData);\n    }\n    for (const materialData of materials) {\n      this.addEffectsObjectData(materialData);\n    }\n    for (const shaderData of shaders) {\n      this.addEffectsObjectData(shaderData);\n    }\n    for (const geometryData of geometries) {\n      this.addEffectsObjectData(geometryData);\n    }\n    for (const componentData of components) {\n      this.addEffectsObjectData(componentData);\n    }\n    for (const animationData of animations) {\n      this.addEffectsObjectData(animationData);\n    }\n    for (const miscData of miscs) {\n      this.addEffectsObjectData(miscData);\n    }\n    for (let i = 0; i < bins.length; i++) {\n      const binaryData = bins[i];\n      const binaryBuffer = scene.bins[i];\n\n      if (binaryData.dataType === spec.DataType.BinaryAsset) {\n        //@ts-expect-error\n        binaryData.buffer = binaryBuffer;\n        if (binaryData.id) {\n          this.addEffectsObjectData(binaryData);\n        }\n      } else {\n        const effectsPackage = new EffectsPackage();\n\n        effectsPackage.deserializeFromBinary(new Uint8Array(binaryBuffer));\n        for (const effectsObjectData of effectsPackage.exportObjectDatas) {\n          this.addEffectsObjectData(effectsObjectData);\n        }\n      }\n    }\n    for (const textureData of textureOptions) {\n      this.addEffectsObjectData(textureData as spec.EffectsObjectData);\n    }\n  }\n\n  runRenderLoop (renderFunction: (dt: number) => void): void {\n    this.ticker?.add(renderFunction);\n  }\n\n  render (dt: number): void {\n    const { renderErrors } = this;\n\n    if (renderErrors.size > 0) {\n      this.emit('rendererror', renderErrors.values().next().value);\n      // 有渲染错误时暂停播放\n      this.ticker?.pause();\n    }\n    dt = Math.min(dt, 33) * this.speed;\n    const comps = this.compositions;\n    let skipRender = false;\n\n    comps.sort((a, b) => a.getIndex() - b.getIndex());\n\n    for (let i = 0; i < comps.length; i++) {\n      const composition = comps[i];\n\n      if (composition.textureOffloaded) {\n        skipRender = true;\n        logger.error(`Composition ${composition.name} texture offloaded, skip render.`);\n        continue;\n      }\n      composition.update(dt);\n    }\n\n    if (skipRender) {\n      this.emit('rendererror', new Error('Play when texture offloaded.'));\n\n      return this.ticker?.pause();\n    }\n    this.renderer.setFramebuffer(null);\n    this.renderer.clear({\n      stencilAction: TextureLoadAction.clear,\n      clearStencil: 0,\n      depthAction: TextureLoadAction.clear,\n      clearDepth: 1,\n      colorAction: TextureLoadAction.clear,\n      clearColor: [0, 0, 0, 0],\n    });\n    for (let i = 0; i < comps.length; i++) {\n      !comps[i].renderFrame.isDisposed && this.renderer.renderRenderFrame(comps[i].renderFrame);\n    }\n\n    this.renderer.renderTargetPool.flush();\n  }\n\n  /**\n   * 将渲染器重新和父容器大小对齐\n   */\n  resize () {\n    const { parentElement } = this.canvas;\n    let containerWidth;\n    let containerHeight;\n    let canvasWidth;\n    let canvasHeight;\n\n    if (parentElement) {\n      const size = this.getTargetSize(parentElement);\n\n      containerWidth = size[0];\n      containerHeight = size[1];\n      canvasWidth = size[2];\n      canvasHeight = size[3];\n    } else {\n      containerWidth = canvasWidth = this.canvas.width;\n      containerHeight = canvasHeight = this.canvas.height;\n    }\n    const aspect = containerWidth / containerHeight;\n\n    if (containerWidth && containerHeight) {\n      const documentWidth = document.documentElement.clientWidth;\n\n      if (canvasWidth > documentWidth * 2) {\n        logger.error(`DPI overflowed, width ${canvasWidth} is more than 2x document width ${documentWidth}, see ${HELP_LINK['DPI overflowed']}.`);\n      }\n      const maxSize = this.env ? this.gpuCapability.detail.maxTextureSize : 2048;\n\n      if ((canvasWidth > maxSize || canvasHeight > maxSize)) {\n        logger.error(`Container size overflowed ${canvasWidth}x${canvasHeight}, see ${HELP_LINK['Container size overflowed']}.`);\n        if (aspect > 1) {\n          canvasWidth = Math.round(maxSize);\n          canvasHeight = Math.round(maxSize / aspect);\n        } else {\n          canvasHeight = Math.round(maxSize);\n          canvasWidth = Math.round(maxSize * aspect);\n        }\n      }\n\n      this.canvas.style.width = containerWidth + 'px';\n      this.canvas.style.height = containerHeight + 'px';\n      logger.info(`Resize engine ${this.name} [${canvasWidth},${canvasHeight},${containerWidth},${containerHeight}].`);\n\n      this.setSize(canvasWidth, canvasHeight);\n    }\n  }\n\n  setSize (width: number, height: number) {\n    // ios 14.1 -ios 14.3 resize canvas will cause memory leak\n    this.renderer.resize(width, height);\n    this.compositions?.forEach(comp => {\n      comp.camera.aspect = width / height;\n      comp.camera.pixelHeight = this.renderer.getHeight();\n      comp.camera.pixelWidth = this.renderer.getWidth();\n    });\n    this.emit('resize', this);\n  }\n\n  private getTargetSize (parentEle: HTMLElement) {\n    if (parentEle === undefined || parentEle === null) {\n      throw new Error(`Container is not an HTMLElement, see ${HELP_LINK['Container is not an HTMLElement']}.`);\n    }\n    const displayAspect = this.displayAspect;\n    // 小程序环境没有 getComputedStyle\n    const computedStyle = window.getComputedStyle?.(parentEle);\n    let targetWidth;\n    let targetHeight;\n    let finalWidth = 0;\n    let finalHeight = 0;\n\n    if (computedStyle) {\n      finalWidth = parseInt(computedStyle.width, 10);\n      finalHeight = parseInt(computedStyle.height, 10);\n    } else {\n      finalWidth = parentEle.clientWidth;\n      finalHeight = parentEle.clientHeight;\n    }\n\n    if (displayAspect) {\n      const parentAspect = finalWidth / finalHeight;\n\n      if (parentAspect > displayAspect) {\n        targetHeight = finalHeight * this.displayScale;\n        targetWidth = targetHeight * displayAspect;\n      } else {\n        targetWidth = finalWidth * this.displayScale;\n        targetHeight = targetWidth / displayAspect;\n      }\n    } else {\n      targetWidth = finalWidth;\n      targetHeight = finalHeight;\n    }\n    const ratio = this.pixelRatio;\n    let containerWidth = targetWidth;\n    let containerHeight = targetHeight;\n\n    targetWidth = Math.round(targetWidth * ratio);\n    targetHeight = Math.round(targetHeight * ratio);\n    if (targetWidth < 1 || targetHeight < 1) {\n      if (this.offscreenMode) {\n        targetWidth = targetHeight = containerWidth = containerHeight = 1;\n      } else {\n        throw new Error(`Invalid container size ${targetWidth}x${targetHeight}, see ${HELP_LINK['Invalid container size']}.`);\n      }\n    }\n\n    return [containerWidth, containerHeight, targetWidth, targetHeight];\n  }\n\n  addTexture (tex: Texture) {\n    if (this.disposed) {\n      return;\n    }\n    addItem(this.textures, tex);\n  }\n\n  removeTexture (tex: Texture) {\n    if (this.disposed) {\n      return;\n    }\n    removeItem(this.textures, tex);\n  }\n\n  addMaterial (mat: Material) {\n    if (this.disposed) {\n      return;\n    }\n    addItem(this.materials, mat);\n  }\n\n  removeMaterial (mat: Material) {\n    if (this.disposed) {\n      return;\n    }\n    removeItem(this.materials, mat);\n  }\n\n  addGeometry (geo: Geometry) {\n    if (this.disposed) {\n      return;\n    }\n    addItem(this.geometries, geo);\n  }\n\n  removeGeometry (geo: Geometry) {\n    if (this.disposed) {\n      return;\n    }\n    removeItem(this.geometries, geo);\n  }\n\n  addMesh (mesh: Mesh) {\n    if (this.disposed) {\n      return;\n    }\n    addItem(this.meshes, mesh);\n  }\n\n  removeMesh (mesh: Mesh) {\n    if (this.disposed) {\n      return;\n    }\n    removeItem(this.meshes, mesh);\n  }\n\n  addRenderPass (pass: RenderPass) {\n    if (this.disposed) {\n      return;\n    }\n    addItem(this.renderPasses, pass);\n  }\n\n  removeRenderPass (pass: RenderPass) {\n    if (this.disposed) {\n      return;\n    }\n    removeItem(this.renderPasses, pass);\n  }\n\n  addComposition (composition: Composition) {\n    if (this.disposed) {\n      return;\n    }\n    addItem(this.compositions, composition);\n  }\n\n  removeComposition (composition: Composition) {\n    if (this.disposed) {\n      return;\n    }\n    removeItem(this.compositions, composition);\n  }\n\n  getShaderLibrary (): ShaderLibrary {\n    return this.renderer.getShaderLibrary() as ShaderLibrary;\n  }\n\n  /**\n   * 销毁所有缓存的资源\n   */\n  dispose (): void {\n    if (this.disposed) {\n      return;\n    }\n    this._disposed = true;\n\n    const info: string[] = [];\n\n    if (this.renderPasses.length > 0) {\n      info.push(`Pass ${this.renderPasses.length}`);\n    }\n    if (this.meshes.length > 0) {\n      info.push(`Mesh ${this.meshes.length}`);\n    }\n    if (this.geometries.length > 0) {\n      info.push(`Geom ${this.geometries.length}`);\n    }\n    if (this.textures.length > 0) {\n      info.push(`Tex ${this.textures.length}`);\n    }\n\n    if (info.length > 0) {\n      logger.warn(`Release GPU memory: ${info.join(', ')}.`);\n    }\n\n    this.ticker?.stop();\n    this.eventSystem?.dispose();\n    this.assetService?.dispose();\n\n    this.renderPasses.forEach(pass => pass.dispose());\n    this.meshes.forEach(mesh => mesh.dispose());\n    this.geometries.forEach(geo => geo.dispose());\n    this.materials.forEach(mat => mat.dispose());\n    this.textures.forEach(tex => tex.dispose());\n    this.assetManagers.forEach(assetManager => assetManager.dispose());\n    this.compositions.forEach(comp => comp.dispose());\n\n    this.textures = [];\n    this.materials = [];\n    this.geometries = [];\n    this.meshes = [];\n    this.renderPasses = [];\n    this.compositions = [];\n  }\n}\n","import type { Engine } from './engine';\nimport { glContext } from './gl';\nimport type { TextureConfigOptions, TextureSourceOptions } from './texture';\nimport { Texture, TextureSourceType } from './texture';\nimport { assertExist, type Disposable } from './utils';\n\nexport interface TextureCacheRequest extends TextureConfigOptions {\n  width: number,\n  height: number,\n  name: string,\n  format?: typeof WebGLRenderingContext.RGBA | typeof WebGL2RenderingContext.RGB | typeof WebGLRenderingContext.LUMINANCE,\n  type?: typeof WebGLRenderingContext.UNSIGNED_BYTE | typeof WebGLRenderingContext.FLOAT | typeof WebGL2RenderingContext.HALF_FLOAT,\n  minFilter?: GLenum,\n  magFilter?: GLenum,\n  wrapS?: GLenum,\n  wrapT?: GLenum,\n}\n\nconst def: Record<string, number> = {\n  format: glContext.RGBA,\n  type: glContext.UNSIGNED_BYTE,\n  minFilter: glContext.LINEAR,\n  magFilter: glContext.LINEAR,\n  wrapS: glContext.CLAMP_TO_EDGE,\n  wrapT: glContext.CLAMP_TO_EDGE,\n};\nconst disposeSymbol = Symbol('dispose');\n\nexport class PassTextureCache implements Disposable {\n  private textureCache: Record<string, Texture> = {};\n  private textureRef: Record<string, number> = {};\n  private engine?: Engine;\n\n  constructor (engine: Engine) {\n    this.engine = engine;\n  }\n\n  requestColorAttachmentTexture (request: TextureCacheRequest): Texture {\n    const { width, height, name } = request;\n    const options: Record<string, any> = {\n      sourceType: TextureSourceType.framebuffer,\n      data: {\n        width,\n        height,\n      },\n      name,\n    };\n    const keys: (string | number)[] = [name];\n\n    Object.getOwnPropertyNames(def).forEach(name => {\n      const value = request[name as keyof TextureCacheRequest] as number | string ?? def[name];\n\n      options[name] = value;\n      keys.push(name, value);\n    });\n\n    const cacheId = keys.join(':');\n    let tex = this.textureCache[cacheId];\n\n    if (tex) {\n      this.textureRef[cacheId]++;\n      if (__DEBUG__) {\n        // consoleLog(`Texture cache hit: ${cacheId}.`);\n      }\n    } else {\n\n      const engine = this.engine;\n\n      assertExist(engine);\n      tex = Texture.create(engine, options as TextureSourceOptions);\n      this.textureCache[cacheId] = tex;\n      this.textureRef[cacheId] = 1;\n\n      // @ts-expect-error\n      tex[disposeSymbol] = tex.dispose;\n      tex.dispose = () => this.removeTexture(cacheId);\n    }\n\n    return tex;\n  }\n\n  removeTexture (id: string) {\n    const refCount = this.textureRef[id];\n\n    if (refCount <= 1) {\n      if (refCount < 0) {\n        console.error('Ref count < 0.');\n      }\n      const tex = this.textureCache[id];\n\n      if (tex) {\n        // @ts-expect-error\n        tex[disposeSymbol]();\n        // @ts-expect-error\n        tex.dispose = tex[disposeSymbol];\n      }\n      delete this.textureCache[id];\n      delete this.textureRef[id];\n    } else {\n      this.textureRef[id] = refCount - 1;\n    }\n  }\n\n  dispose () {\n    Object.keys(this.textureCache).forEach(key => {\n      const texture = this.textureCache[key];\n\n      // @ts-expect-error\n      texture[disposeSymbol]();\n      // @ts-expect-error\n      texture.dispose = texture[disposeSymbol];\n    });\n    this.textureCache = {};\n    this.textureRef = {};\n    this.engine = undefined;\n  }\n}\n","import * as spec from '@galacean/effects-specification';\nimport { AssetManager } from './asset-manager';\nimport { Composition } from './composition';\nimport { PLAYER_OPTIONS_ENV_EDITOR } from './constants';\nimport type { Engine } from './engine';\nimport type { Scene, SceneLoadOptions } from './scene';\nimport { logger } from './utils';\nimport { PluginSystem } from './plugin-system';\n\nexport class SceneLoader {\n  static async load (scene: Scene.LoadType, engine: Engine, options: SceneLoadOptions = {}): Promise<Composition> {\n    const last = performance.now();\n    const asyncShaderCompile = engine.gpuCapability?.detail?.asyncShaderCompile;\n    const compositionIndex = engine.compositions.length;\n\n    const assetManager = new AssetManager(options);\n\n    // TODO 多 json 之间目前不共用资源，如果后续需要多 json 共用，这边缓存机制需要额外处理\n    engine.assetManagers.push(assetManager);\n\n    const loadedScene = await assetManager.loadScene(scene, engine.renderer);\n\n    engine.clearResources();\n\n    // 触发插件系统 pluginSystem 的回调 onAssetsLoadFinish\n    PluginSystem.onAssetsLoadFinish(loadedScene, assetManager.options, engine);\n\n    engine.assetService.prepareAssets(loadedScene, loadedScene.assets);\n    engine.assetService.updateTextVariables(loadedScene, options.variables);\n    engine.assetService.initializeTexture(loadedScene);\n\n    const composition = this.createComposition(loadedScene, engine, options);\n\n    composition.setIndex(compositionIndex);\n    const compileStart = performance.now();\n\n    await new Promise(resolve => {\n      engine.renderer.getShaderLibrary()?.compileAllShaders(() => resolve(null));\n    });\n\n    const compileTime = performance.now() - compileStart;\n\n    engine.ticker?.start();\n\n    const compositionName = composition.name;\n    const firstFrameTime = performance.now() - last;\n\n    composition.statistic.compileTime = compileTime;\n    composition.statistic.firstFrameTime = firstFrameTime;\n    logger.info(`First frame [${compositionName}]: ${firstFrameTime.toFixed(4)}ms.`);\n    logger.info(`Shader ${asyncShaderCompile ? 'async' : 'sync'} compile [${compositionName}]: ${compileTime.toFixed(4)}ms.`);\n\n    return composition;\n  }\n\n  private static createComposition (scene: Scene, engine: Engine, options: SceneLoadOptions = {}): Composition {\n    const renderer = engine.renderer;\n    const composition = new Composition({\n      ...options,\n      renderer,\n      width: renderer.getWidth(),\n      height: renderer.getHeight(),\n      event: engine.eventSystem,\n    }, scene);\n\n    // 中低端设备降帧到 30fps·\n    if (engine.ticker && options.renderLevel === spec.RenderLevel.B) {\n      engine.ticker.setFPS(Math.min(engine.ticker.getFPS(), 30));\n    }\n\n    // TODO 目前编辑器会每帧调用 loadScene, 在这编译会导致闪帧，待编辑器渲染逻辑优化后移除。\n    if (engine.env !== PLAYER_OPTIONS_ENV_EDITOR) {\n      engine.assetService.createShaderVariant();\n    }\n\n    return composition;\n  }\n}\n","import { registerPlugin } from './plugin-system';\nimport {\n  CameraVFXItemLoader, InteractLoader, ParticleLoader, SpriteLoader, TextLoader,\n} from './plugins';\nimport { logger } from './utils';\n\nexport * as math from '@galacean/effects-math/es/core/index';\nexport * as spec from '@galacean/effects-specification';\nexport * from './asset';\nexport * from './binary-asset';\nexport * from './asset-loader';\nexport * from './asset-manager';\nexport * from './asset-service';\nexport * from './camera';\nexport * from './canvas-pool';\nexport * from './components';\nexport * from './animation';\nexport * from './composition';\nexport * from './config';\nexport * from './constants';\nexport * from './decorators';\nexport * from './downloader';\nexport * from './effects-object';\nexport * from './engine';\nexport {\n  ensureFixedNumber, getStandardComposition, getStandardImage, getStandardItem,\n  getStandardJSON, normalizeColor,\n} from './fallback';\nexport * from './gl';\nexport * from './material';\nexport * from './math';\nexport * from './paas-texture-cache';\nexport * from './plugin-system';\nexport * from './scene-loader';\nexport * from './plugins';\nexport * from './render';\nexport * from './scene';\nexport * from './serialization-helper';\nexport * from './shader';\nexport * from './shape';\nexport * from './template-image';\nexport * from './texture';\nexport * from './ticker';\nexport * from './transform';\nexport * from './utils';\nexport * from './vfx-item';\nexport * from './effects-object';\nexport * from './effects-package';\nexport * from './events';\nexport * from './pass-render-level';\n\nregisterPlugin('camera', CameraVFXItemLoader);\nregisterPlugin('text', TextLoader);\nregisterPlugin('sprite', SpriteLoader);\nregisterPlugin('particle', ParticleLoader);\nregisterPlugin('interact', InteractLoader);\n\nexport const version = __VERSION__;\n\nlogger.info(`Core version: ${version}.`);\n","export function assignInspectorName (\n  obj: Record<string, any> | null,\n  name?: string,\n  id?: string,\n) {\n  if (name === undefined || obj === null) {\n    return;\n  }\n\n  obj.__SPECTOR_Metadata = { name };\n  if (obj.__SPECTOR_Object_TAG) {\n    obj.__SPECTOR_Object_TAG.displayText = name;\n    if (id) {\n      obj.__SPECTOR_Object_TAG.id = id;\n    }\n  } else {\n    obj.__SPECTOR_Object_TAG = {\n      displayText: name,\n      id: '',\n    };\n  }\n}\n","import type { Disposable, spec } from '@galacean/effects-core';\nimport { isWebGL2, glContext } from '@galacean/effects-core';\nimport { assignInspectorName } from './gl-renderer-internal';\nimport type { GLEngine } from './gl-engine';\n\ntype GPUBufferTarget =\n  | WebGLRenderingContext['ARRAY_BUFFER']\n  | WebGLRenderingContext['ELEMENT_ARRAY_BUFFER']\n  | WebGL2RenderingContext['COPY_READ_BUFFER']\n  | WebGL2RenderingContext['COPY_WRITE_BUFFER']\n  | WebGL2RenderingContext['TRANSFORM_FEEDBACK_BUFFER']\n  | WebGL2RenderingContext['UNIFORM_BUFFER']\n  | WebGL2RenderingContext['PIXEL_PACK_BUFFER']\n  | WebGL2RenderingContext['PIXEL_UNPACK_BUFFER']\n  ;\n\ntype GPUBufferType =\n  | WebGLRenderingContext['UNSIGNED_INT']\n  | WebGLRenderingContext['UNSIGNED_SHORT']\n  | WebGLRenderingContext['UNSIGNED_BYTE']\n  | WebGLRenderingContext['FLOAT']\n  | WebGLRenderingContext['INT']\n  | WebGLRenderingContext['SHORT']\n  | WebGLRenderingContext['BYTE']\n  ;\n\nexport interface GLGPUBufferProps {\n  name?: string,\n  target?: GPUBufferTarget,\n  type?: GPUBufferType,\n  /**\n   * 数据元素的总量\n   */\n  elementCount?: number,\n  data?: spec.TypedArray,\n  usage?: WebGLRenderingContext['STATIC_DRAW'] | WebGLRenderingContext['DYNAMIC_DRAW'],\n}\n\nexport class GLGPUBuffer implements Disposable {\n  readonly bytesPerElement: number;\n  readonly target: GPUBufferTarget;\n  readonly type: GPUBufferType;\n  readonly usage: WebGLRenderingContext['STATIC_DRAW'] | WebGLRenderingContext['DYNAMIC_DRAW'] | WebGLRenderingContext['STREAM_DRAW'];\n  readonly glBuffer: WebGLBuffer | null;\n\n  private byteLength = 0;\n  private destroyed = false;\n\n  constructor (\n    public readonly engine: GLEngine,\n    props: GLGPUBufferProps,\n  ) {\n    const {\n      name, data, elementCount,\n      target = glContext.ARRAY_BUFFER,\n      type = glContext.FLOAT,\n      usage = glContext.STATIC_DRAW,\n    } = props;\n    const bytesPerElement = getBytesPerElementByGLType(type);\n\n    this.target = target;\n    this.type = type;\n    this.usage = usage;\n    this.glBuffer = this.createGLBuffer(name) as WebGLBuffer;\n    this.bytesPerElement = bytesPerElement;\n\n    if (data) {\n      this.bufferData(data);\n    } else if (elementCount) {\n      this.bufferData(bytesPerElement * elementCount);\n    }\n  }\n\n  get elementCount (): number {\n    return this.byteLength / this.bytesPerElement;\n  }\n\n  get isDestroyed (): boolean {\n    return this.destroyed;\n  }\n\n  private createGLBuffer (name?: string): WebGLBuffer | null {\n    const buffer = this.engine.gl.createBuffer();\n\n    assignInspectorName(buffer, name);\n\n    return buffer;\n  }\n\n  bind () {\n    this.engine.gl.bindBuffer(this.target, this.glBuffer);\n  }\n\n  bufferData (data: spec.TypedArray | number): void {\n    const byteLength = typeof data === 'number' ? data : data.byteLength;\n\n    if (this.engine) {\n      this.byteLength = byteLength;\n      const gl = this.engine.gl;\n      const target = this.target;\n\n      gl.bindBuffer(target, this.glBuffer);\n      if (byteLength === 0) {\n        // ios 12 13 cause error when byteLength == 0\n        gl.bufferData(target, 1, this.usage);\n      } else {\n        gl.bufferData(target, byteLength, this.usage);\n        if (typeof data !== 'number') {\n          gl.bufferSubData(target, 0, data);\n        }\n      }\n    } else {\n      this.byteLength = 0;\n    }\n  }\n\n  bufferSubData (elementOffset: number, data: spec.TypedArray): void {\n    if (this.engine) {\n      const gl = this.engine.gl;\n      const target = this.target;\n      const byteOffset = elementOffset * this.bytesPerElement;\n      const byteLength = byteOffset + data.byteLength;\n\n      gl.bindBuffer(target, this.glBuffer);\n      if (byteLength > this.byteLength) {\n        this.byteLength = byteLength;\n        gl.bufferData(target, byteLength, this.usage);\n      }\n      gl.bufferSubData(target, byteOffset, data);\n    } else {\n      this.byteLength = 0;\n    }\n  }\n\n  dispose (): void {\n    this.engine.gl.deleteBuffer(this.glBuffer);\n    // @ts-expect-error safe to assign\n    this.glBuffer = null;\n    this.destroyed = true;\n  }\n\n  // for test\n  readSubData (elementOffset: number, dstBuffer: spec.TypedArray): boolean {\n    if (isWebGL2(this.engine.gl)) {\n      this.engine.gl.getBufferSubData(this.target, elementOffset * this.bytesPerElement, dstBuffer);\n\n      return true;\n    }\n\n    return false;\n  }\n}\n\nconst map: Record<number, Int32ArrayConstructor | Float32ArrayConstructor | Int16ArrayConstructor | Int8ArrayConstructor | Uint8ArrayConstructor | Uint32ArrayConstructor | Uint16ArrayConstructor> = {\n  [glContext.INT]: Int32Array,\n  [glContext.FLOAT]: Float32Array,\n  [glContext.SHORT]: Int16Array,\n  [glContext.BYTE]: Int8Array,\n  [glContext.UNSIGNED_BYTE]: Uint8Array,\n  [glContext.UNSIGNED_INT]: Uint32Array,\n  [glContext.UNSIGNED_SHORT]: Uint16Array,\n};\n\nexport function getBytesPerElementByGLType (type: number): number {\n  return map[type]?.BYTES_PER_ELEMENT ?? 0;\n}\n","import type { Engine, GeometryProps, SkinProps } from '@galacean/effects-core';\nimport {\n  spec, assertExist, BYTES_TYPE_MAP, generateEmptyTypedArray, Geometry, glContext,\n  vertexFormatType2GLType,\n} from '@galacean/effects-core';\nimport type { GLEngine } from './gl-engine';\nimport type { GLGPUBufferProps } from './gl-gpu-buffer';\nimport { GLGPUBuffer } from './gl-gpu-buffer';\nimport type { GLVertexArrayObject } from './gl-vertex-array-object';\n\ntype BufferDirtyFlag = {\n  dirty: boolean,\n  discard?: boolean,\n  start?: number,\n  end?: number,\n};\n\nconst INDEX_TYPE_MAP = {\n  [Uint8Array.BYTES_PER_ELEMENT]: glContext.UNSIGNED_BYTE,\n  [Uint16Array.BYTES_PER_ELEMENT]: glContext.UNSIGNED_SHORT,\n  [Uint32Array.BYTES_PER_ELEMENT]: glContext.UNSIGNED_INT,\n};\n\nlet seed = 1;\n\n/**\n * 应用层 Geometry 对象，本身不直接保存 GPU 资源而是通过 geometryInternal 成员保存 GPU 资源\n */\nexport class GLGeometry extends Geometry {\n  /**\n   * 索引缓冲区\n   */\n  indicesBuffer?: GLGPUBuffer;\n  drawCount = 0;\n  drawStart: number;\n  mode: number;\n  /**\n   * 记录顶点属性信息用于 GLProgram 绑定顶点属性\n   */\n  attributes: Record<string, spec.AttributeWithType>;\n  /**\n   * JS 端记录数据，用于 flush\n   */\n  bufferProps: Record<string, GLGPUBufferProps>;\n  /**\n   * 记录了顶点属性与 GPUBuffer 对应关系\n   */\n  buffers: Record<string, GLGPUBuffer> = {};\n  indices?: spec.TypedArray;\n  readonly vaos: Record<string, GLVertexArrayObject | undefined> = {};\n\n  skin: SkinProps = {};\n\n  protected initialized = false;\n  private options?: GeometryProps;\n  private attributesReleasable: Record<string, boolean>;\n  private indicesReleasable = false;\n  // 记录 SubData 的变更范围\n  private dirtyFlags: Record<string, BufferDirtyFlag>;\n  private attributesName: string[] = [];\n  private destroyed = false;\n\n  // TODO: 参数必传的用 props，可选的用 options，如果 props里面还有 options，则 options 需要修改名字（如renderOptions）\n  constructor (engine: Engine, props?: GeometryProps) {\n    super(engine);\n    if (props) {\n      this.processProps(props);\n    }\n  }\n\n  get isDestroyed (): boolean {\n    return this.destroyed;\n  }\n\n  get isInitialized (): boolean {\n    return this.initialized;\n  }\n\n  getOptions () {\n    return { ...this.options };\n  }\n\n  /**\n   * Geometry 的 GPU 资源初始化方法，在绘制前调用\n   */\n  override initialize (): void {\n    if (this.initialized) {\n      return;\n    }\n\n    const engine = this.engine;\n\n    assertExist(engine);\n\n    engine.addGeometry(this);\n\n    // 创建vbo\n    Object.keys(this.bufferProps).forEach(name => {\n      this.buffers[name] = new GLGPUBuffer(this.engine as GLEngine, this.bufferProps[name]);\n    });\n    // 创建ibo\n    if (this.indices) {\n      this.indicesBuffer = this.createIndicesBuffer(this.indices);\n    }\n\n    this.initialized = true;\n    // 向 GPU 传输顶点数据\n    this.flush();\n    this.options = undefined;\n  }\n\n  getAttributeBuffer (name: string): GLGPUBuffer | undefined {\n    if (!this.initialized) { return undefined; }\n    const key = this.attributes[name].dataSource;\n\n    return this.buffers[key];\n  }\n\n  setAttributeData (name: string, data: spec.TypedArray): void {\n    if (this.bufferProps == undefined) { return; }\n\n    const bufferOption = this.getAttributeBufferOption(name);\n    const key = this.attributes[name].dataSource;\n\n    if (bufferOption) {\n      const { usage, target } = bufferOption;\n\n      this.bufferProps[key] = {\n        data,\n        usage,\n        target,\n        elementCount: data.length,\n      };\n      this.dirtyFlags[key].discard = true;\n      this.dirtyFlags[key].dirty = true;\n    }\n  }\n\n  getAttributeData (name: string): spec.TypedArray | undefined {\n    if (this.bufferProps == undefined) { return; }\n\n    const bufferOption = this.getAttributeBufferOption(name);\n\n    return bufferOption ? bufferOption.data : undefined;\n  }\n\n  setAttributeSubData (name: string, offset: number, data: spec.TypedArray): void {\n    if (this.bufferProps == undefined) { return; }\n\n    const attribute = this.getAttributeBufferOption(name);\n\n    if (attribute && attribute.data != undefined) {\n      const start = offset;\n      const length = offset + data.length;\n\n      if (attribute.data.length < length) {\n        // @ts-expect-error safe to use\n        const newData = new data.constructor(length);\n\n        newData.set(attribute.data);\n        attribute.data = newData;\n        this.dirtyFlags[name].discard = true;\n      } else if (!this.dirtyFlags[name].discard) {\n        const dirtyFlag = this.dirtyFlags[name];\n\n        if (dirtyFlag.start !== undefined) {\n          dirtyFlag.start = Math.min(dirtyFlag.start, start);\n        }\n        if (dirtyFlag.end !== undefined) {\n          dirtyFlag.end = Math.max(dirtyFlag.end, length - 1);\n        }\n      }\n      (attribute.data as spec.TypedArray).set(data, start);\n      this.dirtyFlags[name].dirty = true;\n    }\n  }\n\n  getIndexData (): spec.TypedArray | undefined {\n    return this.indices;\n  }\n\n  setIndexData (data: spec.TypedArray): void {\n    if (\n      data instanceof Uint8Array ||\n      data instanceof Uint16Array ||\n      data instanceof Uint32Array\n    ) {\n      this.indices = data as any;\n      this.dirtyFlags['index'].discard = true;\n      this.dirtyFlags['index'].dirty = true;\n    }\n  }\n\n  setIndexSubData (offset: number, data: spec.TypedArray): void {\n    if (this.indices) {\n      const start = offset;\n      const length = offset + data.length;\n\n      if (this.indices.length < length) {\n        // @ts-expect-error safe to use\n        const newData = new data.constructor(length);\n\n        newData.set(this.indices);\n        this.indices = newData;\n        this.dirtyFlags['index'].discard = true;\n      } else if (!this.dirtyFlags['index'].discard) {\n        const dirtyFlag = this.dirtyFlags['index'];\n\n        if (dirtyFlag.start !== undefined) {\n          dirtyFlag.start = Math.min(dirtyFlag.start, start);\n        }\n        if (dirtyFlag.end !== undefined) {\n          dirtyFlag.end = Math.max(dirtyFlag.end, length - 1);\n        }\n      }\n      this.indices?.set(data, start);\n      this.dirtyFlags['index'].dirty = true;\n    }\n  }\n\n  getAttributeStride (name: string): number {\n    const attr = this.attributes[name];\n    const { stride, size, type } = attr;\n\n    return stride ? stride : size * BYTES_TYPE_MAP[type];\n  }\n\n  getAttributeNames (): string[] {\n    return this.attributesName;\n  }\n\n  setDrawStart (count: number): void {\n    this.drawStart = count;\n  }\n\n  getDrawStart (): number {\n    return this.drawStart;\n  }\n\n  setDrawCount (count: number): void {\n    this.drawCount = count;\n  }\n\n  getDrawCount (): number {\n    return this.drawCount;\n  }\n\n  getSkinProps (): SkinProps {\n    return this.skin;\n  }\n\n  // 根据 attribute 的 datasource 获取 js 端 buffer\n  private getAttributeBufferOption (name: string): GLGPUBufferProps | undefined {\n    const attribute = this.attributes[name];\n\n    return attribute ? this.bufferProps[attribute.dataSource] : undefined;\n  }\n\n  createIndicesBuffer (data: spec.TypedArray): GLGPUBuffer {\n    const type = INDEX_TYPE_MAP[data.BYTES_PER_ELEMENT];\n    const indexProps = {\n      data,\n      target: glContext.ELEMENT_ARRAY_BUFFER,\n      type,\n      name: `${this.name}##index`,\n    };\n\n    return new GLGPUBuffer(this.engine as GLEngine, indexProps);\n  }\n\n  override flush () {\n    if (!this.initialized) { return; }\n\n    const attributes = this.attributes;\n    const bufferProps = this.bufferProps;\n    const indices = this.indices;\n\n    Object.keys(this.dirtyFlags).forEach(name => {\n      const flag = this.dirtyFlags[name];\n      let buffer;\n      let data;\n\n      if (name == 'index') {\n        buffer = this.indicesBuffer;\n        data = indices;\n      } else {\n        const bufferName = attributes[name].dataSource;\n\n        buffer = this.buffers[bufferName];\n        data = bufferProps[bufferName].data;\n      }\n\n      if ((flag.dirty || flag.discard) && buffer && data) {\n        if (flag.discard) {\n          buffer.bufferData(data);\n        } else {\n          if (flag.start !== undefined && flag.end !== undefined) {\n            const offset = flag.start * data.BYTES_PER_ELEMENT + data.byteOffset;\n            const length = flag.end - flag.start + 1;\n            // @ts-expect-error safe to use\n            const subData = new data.constructor(data.buffer, offset, length);\n\n            buffer.bufferSubData(flag.start, subData);\n          }\n        }\n        flag.start = Number.POSITIVE_INFINITY;\n        flag.end = 0;\n        flag.dirty = flag.discard = false;\n      }\n    });\n\n    // 需要释放的 attributes 数据\n    Object.keys(this.attributesReleasable).forEach(name => {\n      const releasable = this.attributesReleasable[name];\n      const bufferName = attributes[name].dataSource;\n\n      if (bufferProps[bufferName] && releasable) {\n        bufferProps[bufferName].data = undefined;\n      }\n    });\n\n    // 释放 indices buffer\n    if (this.indicesReleasable) {\n      //this.indices = undefined;\n    }\n  }\n\n  private processProps (data: GeometryProps): void {\n    const props = data;\n    const {\n      drawStart = 0, drawCount, mode, indices,\n      name = `effectsGeometry:${seed++}`,\n      bufferUsage = glContext.STATIC_DRAW,\n    } = props;\n\n    this.name = name;\n\n    // 记录顶点属性，需要与 Shader 中 attribute 进行关联\n    const bufferProps: Record<string, GLGPUBufferProps> = {};\n    const attributesName: string[] = [];\n    const attributes: Record<string, spec.AttributeWithType> = {};\n    // key为buffer的名字\n    const dirtyFlags: Record<string, BufferDirtyFlag> = {};\n    const attributesReleasable: Record<string, boolean> = {};\n    const usage = bufferUsage;\n\n    this.drawStart = drawStart;\n    if (drawCount !== undefined) {\n      this.drawCount = drawCount;\n    }\n    this.mode = (isNaN(mode as number) ? glContext.TRIANGLES : mode) as number;\n\n    Object.keys(props.attributes).forEach(name => {\n      const attr = props.attributes[name];\n      const { size, stride, offset, normalize } = attr;\n      const { type = glContext.FLOAT, releasable } = attr as spec.AttributeWithData;\n      let { data } = attr as spec.AttributeWithData;\n\n      if (type && !('dataSource' in attr) && !data) {\n        data = generateEmptyTypedArray(type);\n      }\n      if (data) {\n        const glType = data instanceof Float32Array ? glContext.FLOAT : glContext.INT;\n\n        // 使用 AttributeWithData 构造的 attribute\n        bufferProps[name] = {\n          data, usage, target: glContext.ARRAY_BUFFER, name,\n        };\n        attributes[name] = {\n          size,\n          stride,\n          offset,\n          type: type ?? glType,\n          normalize: !!normalize,\n          dataSource: name,\n        };\n        attributesReleasable[name] = releasable ?? false;\n        dirtyFlags[name] = {\n          dirty: true,\n          discard: true,\n          start: Number.POSITIVE_INFINITY,\n          end: 0,\n        };\n      } else {\n        // 使用 AttributeWithType 构造的 attribute\n        const { dataSource } = attr as spec.AttributeWithType;\n\n        if (dataSource) {\n          // 属性共享 buffer\n          attributes[name] = {\n            size,\n            stride,\n            offset,\n            type,\n            dataSource,\n            normalize: !!normalize,\n          };\n        }\n      }\n      attributesName.push(name);\n    });\n\n    dirtyFlags.index = {\n      dirty: true,\n      discard: true,\n      start: Number.POSITIVE_INFINITY,\n      end: 0,\n    };\n    // 顶点索引\n    this.indices = indices?.data;\n    this.indicesReleasable = indices?.releasable === true;\n    this.bufferProps = bufferProps;\n    this.attributes = attributes;\n    this.attributesName = attributesName;\n    this.attributesReleasable = attributesReleasable;\n    this.dirtyFlags = dirtyFlags;\n    this.options = props;\n    this.initialized = false;\n  }\n\n  override fromData (data: spec.GeometryData): void {\n    super.fromData(data);\n\n    this.subMeshes = data.subMeshes;\n    let buffer: Uint8Array | undefined;\n\n    if (data.buffer) {\n      buffer = new Uint8Array(decodeBase64ToArrays(data.buffer));\n    } else if (data.binaryData) {\n      buffer = data.binaryData;\n    }\n\n    if (!buffer) {\n      return;\n    }\n    const vertexCount = data.vertexData.vertexCount;\n\n    if (this.hasSemantic(data)) {\n      const geometryProps: GeometryProps = {\n        mode: glContext.TRIANGLES,\n        attributes: {},\n      };\n\n      data.vertexData.channels.forEach(channel => {\n        const attribName = vertexBufferSemanticMap[channel.semantic] ?? channel.semantic;\n        const attribBuffer = this.createVertexTypedArray(channel, buffer, vertexCount);\n\n        geometryProps.attributes[attribName] = {\n          type: vertexFormatType2GLType(channel.format),\n          size: channel.dimension,\n          data: attribBuffer,\n          normalize: channel.normalize,\n        };\n      });\n\n      if (data.indexFormat !== spec.IndexFormatType.None) {\n        const indexBuffer = this.createIndexTypedArray(data.indexFormat, buffer, data.indexOffset);\n\n        geometryProps.indices = { data: indexBuffer };\n        geometryProps.drawCount = indexBuffer.length;\n      } else {\n        geometryProps.drawCount = vertexCount;\n      }\n\n      this.processProps(geometryProps);\n    } else {\n      const positionChannel = data.vertexData.channels[0];\n      const uvChannel = data.vertexData.channels[1];\n      const normalChannel = data.vertexData.channels[2];\n\n      // 根据提供的长度信息创建 Float32Array\n      const positionBuffer = this.createVertexTypedArray(positionChannel, buffer, vertexCount);\n      const uvBuffer = this.createVertexTypedArray(uvChannel, buffer, vertexCount);\n      const normalBuffer = this.createVertexTypedArray(normalChannel, buffer, vertexCount);\n      // 根据提供的长度信息创建 Uint16Array，它紧随 Float32Array 数据之后\n      const indexBuffer = this.createIndexTypedArray(data.indexFormat, buffer, data.indexOffset);\n\n      const geometryProps: GeometryProps = {\n        mode: glContext.TRIANGLES,\n        attributes: {\n          aPos: {\n            type: vertexFormatType2GLType(positionChannel.format),\n            size: 3,\n            data: positionBuffer,\n            normalize: positionChannel.normalize,\n          },\n          aUV: {\n            type: vertexFormatType2GLType(uvChannel.format),\n            size: 2,\n            data: uvBuffer,\n            normalize: uvChannel.normalize,\n          },\n          aNormal: {\n            type: vertexFormatType2GLType(normalChannel.format),\n            size: 3,\n            data: normalBuffer,\n            normalize: normalChannel.normalize,\n          },\n        },\n      };\n\n      geometryProps.indices = { data: indexBuffer };\n      geometryProps.drawCount = indexBuffer.length;\n      this.processProps(geometryProps);\n    }\n\n    this.skin = {\n      boneNames: data.boneNames,\n      rootBoneName: data.rootBoneName,\n      inverseBindMatrices: data.inverseBindMatrices,\n    };\n  }\n\n  override dispose (): void {\n    this.drawStart = 0;\n    this.drawCount = NaN;\n    this.bufferProps = {};\n    this.indices = undefined;\n    this.attributes = {};\n    this.attributesName = [];\n    this.options = undefined;\n\n    if (this.initialized) {\n      Object.keys(this.buffers).forEach(name => {\n        this.buffers[name].dispose();\n      });\n      this.buffers = {};\n      this.indicesBuffer?.dispose();\n      Object.keys(this.vaos).forEach(name => {\n        this.vaos[name]?.dispose();\n        this.vaos[name] = undefined;\n      });\n      this.indicesBuffer = undefined;\n\n      if (this.engine !== undefined) {\n        this.engine.removeGeometry(this);\n      }\n    }\n    this.destroyed = true;\n\n    super.dispose();\n  }\n\n  private createVertexTypedArray (channel: spec.VertexChannel, baseBuffer: Uint8Array, vertexCount: number) {\n    const arrayBuffer = baseBuffer.buffer;\n\n    switch (channel.format) {\n      case spec.VertexFormatType.Float32:\n        return new Float32Array(arrayBuffer, baseBuffer.byteOffset + channel.offset, channel.dimension * vertexCount);\n      case spec.VertexFormatType.Int16:\n        return new Int16Array(arrayBuffer, baseBuffer.byteOffset + channel.offset, channel.dimension * vertexCount);\n      case spec.VertexFormatType.Int8:\n        return new Int8Array(arrayBuffer, baseBuffer.byteOffset + channel.offset, channel.dimension * vertexCount);\n      case spec.VertexFormatType.UInt16:\n        return new Uint16Array(arrayBuffer, baseBuffer.byteOffset + channel.offset, channel.dimension * vertexCount);\n      case spec.VertexFormatType.UInt8:\n        return new Uint8Array(arrayBuffer, baseBuffer.byteOffset + channel.offset, channel.dimension * vertexCount);\n      default:\n        console.error(`Invalid vertex format type: ${channel.format}.`);\n\n        return new Float32Array(arrayBuffer, baseBuffer.byteOffset + channel.offset, channel.dimension * vertexCount);\n    }\n  }\n\n  private createIndexTypedArray (type: spec.IndexFormatType, baseBuffer: Uint8Array, offset: number) {\n    const arrayBuffer = baseBuffer.buffer;\n    const byteOffset = baseBuffer.byteOffset + offset;\n    const byteLength = baseBuffer.byteLength - offset;\n\n    switch (type) {\n      case spec.IndexFormatType.UInt16:\n        return new Uint16Array(arrayBuffer, byteOffset, byteLength / Uint16Array.BYTES_PER_ELEMENT);\n      case spec.IndexFormatType.UInt32:\n        return new Uint32Array(arrayBuffer, byteOffset, byteLength / Uint32Array.BYTES_PER_ELEMENT);\n      default:\n        console.error(`Invalid index format type: ${type}.`);\n\n        return new Uint32Array(arrayBuffer, byteOffset, byteLength / Uint32Array.BYTES_PER_ELEMENT);\n    }\n  }\n\n  private hasSemantic (data: spec.GeometryData) {\n    let hasSemantic = false;\n    const { vertexData } = data;\n\n    vertexData.channels.forEach(channel => {\n      if (channel.semantic && channel.semantic.length > 0) {\n        hasSemantic = true;\n      }\n    });\n\n    return hasSemantic;\n  }\n\n}\n\nconst vertexBufferSemanticMap: Record<string, string> = {\n  POSITION: 'aPos',\n  TEXCOORD0: 'aUV',\n  TEXCOORD_0: 'aUV',\n  TEXCOORD1: 'aUV2',\n  NORMAL: 'aNormal',\n  TANGENT: 'aTangent',\n  COLOR: 'aColor',\n  JOINTS: 'aJoints',\n  JOINTS_0: 'aJoints',\n  WEIGHTS: 'aWeights',\n  WEIGHTS_0: 'aWeights',\n  //\n  POSITION_BS0: 'aTargetPosition0',\n  POSITION_BS1: 'aTargetPosition1',\n  POSITION_BS2: 'aTargetPosition2',\n  POSITION_BS3: 'aTargetPosition3',\n  POSITION_BS4: 'aTargetPosition4',\n  POSITION_BS5: 'aTargetPosition5',\n  POSITION_BS6: 'aTargetPosition6',\n  POSITION_BS7: 'aTargetPosition7',\n  NORMAL_BS0: 'aTargetNormal0',\n  NORMAL_BS1: 'aTargetNormal1',\n  NORMAL_BS2: 'aTargetNormal2',\n  NORMAL_BS3: 'aTargetNormal3',\n  TANGENT_BS0: 'aTargetTangent0',\n  TANGENT_BS1: 'aTargetTangent1',\n  TANGENT_BS2: 'aTargetTangent2',\n  TANGENT_BS3: 'aTargetTangent3',\n};\n\nfunction decodeBase64ToArrays (base64String: string) {\n  // 将 Base64 编码的字符串转换为二进制字符串\n  const binaryString = atob(base64String);\n\n  // 将二进制字符串转换为字节数组\n  const bytes = new Uint8Array(binaryString.length);\n\n  for (let i = 0; i < binaryString.length; i++) {\n    bytes[i] = binaryString.charCodeAt(i);\n  }\n\n  // 创建 ArrayBuffer 并为其创建视图\n  const buffer = bytes.buffer;\n\n  // 返回解码后的数组\n  return buffer;\n}\n","import type { Disposable } from '@galacean/effects-core';\nimport { isWebGL2 } from '@galacean/effects-core';\nimport { assignInspectorName } from './gl-renderer-internal';\nimport type { GLEngine } from './gl-engine';\n\nexport class GLVertexArrayObject implements Disposable {\n  ready = false;\n  disposed = false;\n\n  readonly vao: WebGLVertexArrayObject | null;\n\n  private vaoExt: OES_vertex_array_object | null;\n  private gl: WebGLRenderingContext | WebGL2RenderingContext;\n\n  constructor (\n    engine: GLEngine,\n    name?: string,\n  ) {\n    this.gl = engine.gl;\n    this.vaoExt = engine.gpuCapability.vaoExt;\n    this.vao = this.createVertexArray(name);\n  }\n\n  bind () {\n    this.bindVertexArray(this.vao);\n  }\n\n  unbind () {\n    this.bindVertexArray(null);\n  }\n\n  private createVertexArray (name?: string): WebGLVertexArrayObject | null {\n    let vao = null;\n\n    if (isWebGL2(this.gl)) {\n      vao = this.gl.createVertexArray();\n    }\n    if (!vao && this.vaoExt) {\n      vao = this.vaoExt.createVertexArrayOES();\n    }\n    assignInspectorName(vao, name);\n\n    return vao;\n  }\n\n  /**\n   * 根据 gpu level 选择对应的绑定函数\n   * @param vao\n   */\n  private bindVertexArray (vao: WebGLVertexArrayObject | null) {\n    if (isWebGL2(this.gl)) {\n      this.gl.bindVertexArray(vao);\n    } else {\n      this.vaoExt?.bindVertexArrayOES(vao);\n    }\n  }\n\n  dispose () {\n    if (isWebGL2(this.gl)) {\n      this.gl.deleteVertexArray(this.vao);\n    } else {\n      this.vaoExt?.deleteVertexArrayOES(this.vao as WebGLVertexArrayObjectOES);\n    }\n  }\n}\n","import type { Disposable } from '@galacean/effects-core';\nimport type { GLGeometry } from './gl-geometry';\nimport { GLVertexArrayObject } from './gl-vertex-array-object';\nimport type { GLEngine } from './gl-engine';\n\nexport interface ProgramAttributeInfo {\n  readonly name: string,\n  readonly size: number,\n  readonly type: number,\n  readonly loc: number,\n}\n\n// TODO: 待移除？\nexport interface ProgramUniformInfo {\n  readonly loc: WebGLUniformLocation,\n  readonly subInfos: ProgramUniformInfo[],\n  readonly name: string,\n  readonly size: number,\n  readonly type: number,\n  readonly textureIndex: number,\n  readonly isTexture: boolean,\n}\nexport class GLProgram implements Disposable {\n  private attribInfoMap: Record<string, ProgramAttributeInfo>;\n\n  constructor (\n    public engine: GLEngine,\n    public readonly program: WebGLProgram,\n    private readonly id: string,\n  ) {\n    this.engine.useProgram(program);\n\n    this.attribInfoMap = this.createAttribMap();\n\n    this.engine.useProgram(null);\n    //gl.activeTexture(gl.TEXTURE0);\n    //this.engine.activeTexture(gl.TEXTURE0);\n    //emptyTexture2D.bind();\n    //this.uniformInfoMap = uniformMap;\n  }\n\n  bind () {\n    this.engine.useProgram(this.program);\n  }\n\n  /**\n   * 绑定 vao 对象并设置顶点属性\n   * 如果当前环境不支持 vao，则使用 gl 函数依次设置属性。\n   * @param geometry\n   * @returns\n   */\n  setupAttributes (geometry: GLGeometry) {\n    const programId = this.id;\n    const gl = this.engine.gl;\n    let vao: GLVertexArrayObject | undefined;\n\n    if (geometry.vaos[programId]) {\n      vao = geometry.vaos[programId];\n    } else {\n      vao = new GLVertexArrayObject(this.engine, `${geometry.name}-${programId}`);\n      if (!vao) {\n        console.error('Failed to create VAO object.');\n      }\n      geometry.vaos[programId] = vao;\n    }\n\n    // 兼容小程序下不支持vao\n    if (vao && vao.vao) {\n      vao.bind();\n      if (vao.ready) {\n        return vao;\n      }\n    }\n    Object.keys(this.attribInfoMap).forEach(name => {\n      const attrInfo = this.attribInfoMap[name];\n      const attribute = geometry.attributes[name];\n\n      if (attribute) {\n        const buffer = geometry.buffers[attribute.dataSource];\n\n        if (!buffer) {\n          throw new Error(`Failed to find a buffer named '${attribute.dataSource || name}'. Please ensure the buffer is correctly initialized and bound.`);\n        }\n        buffer.bind();\n        gl.enableVertexAttribArray(attrInfo.loc);\n        gl.vertexAttribPointer(attrInfo.loc, attribute.size, attribute.type, attribute.normalize as boolean, attribute.stride || 0, attribute.offset || 0);\n      }\n    });\n    geometry.indicesBuffer?.bind();\n    if (vao) {\n      vao.ready = true;\n    }\n\n    return vao;\n  }\n\n  createAttribMap () {\n    const { gl } = this.engine;\n    const program = this.program;\n    const attribMap: Record<string, ProgramAttributeInfo> = {};\n    const num = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);\n\n    for (let i = 0; i < num; i++) {\n      const info = gl.getActiveAttrib(program, i);\n\n      if (info) {\n        const { name, type, size } = info;\n        const loc = gl.getAttribLocation(program, name);\n\n        attribMap[name] = {\n          type, name, size, loc,\n        };\n      }\n    }\n\n    return attribMap;\n  }\n\n  dispose () {\n    if (this.engine) {\n      this.engine.gl.deleteProgram(this.program);\n    }\n  }\n}\n","import type { ShaderCompileResult, ShaderWithSource, Texture, Engine, math } from '@galacean/effects-core';\nimport { spec, ShaderVariant } from '@galacean/effects-core';\nimport type { GLProgram } from './gl-program';\nimport type { GLEngine } from './gl-engine';\n\ntype Color = math.Color;\ntype Vector2 = math.Vector2;\ntype Vector3 = math.Vector3;\ntype Vector4 = math.Vector4;\ntype Matrix3 = math.Matrix3;\ntype Matrix4 = math.Matrix4;\ntype Quaternion = math.Quaternion;\n\nexport class GLShaderVariant extends ShaderVariant {\n  program: GLProgram;\n  compileResult: ShaderCompileResult;\n  id: string;\n  initialized = false;\n  uniformLocations: Record<string, WebGLUniformLocation | null> = {};\n\n  private samplerChannels: Record<string, number> = {};\n\n  constructor (engine: Engine, source: ShaderWithSource) {\n    super(engine, source);\n  }\n\n  // shader 的 GPU 资源初始化方法，在绘制前调用\n  initialize () {\n    if (this.initialized) {\n      return;\n    }\n    // 核心初始化都在 compileShader\n    // 否则会出现编译了却没有初始化的情况\n    (this.engine as GLEngine).shaderLibrary.compileShader(this);\n  }\n\n  setFloat (name: string, value: number) {\n    (this.engine as GLEngine).setFloat(this.uniformLocations[name], value);\n  }\n  setInt (name: string, value: number) {\n    (this.engine as GLEngine).setInt(this.uniformLocations[name], value);\n  }\n  setFloats (name: string, value: number[]) {\n    (this.engine as GLEngine).setFloats(this.uniformLocations[name], value);\n  }\n  setTexture (name: string, texture: Texture) {\n    (this.engine as GLEngine).setTexture(this.uniformLocations[name], this.samplerChannels[name], texture);\n  }\n  setVector2 (name: string, value: Vector2) {\n    (this.engine as GLEngine).setVector2(this.uniformLocations[name], value);\n  }\n  setVector3 (name: string, value: Vector3) {\n    (this.engine as GLEngine).setVector3(this.uniformLocations[name], value);\n  }\n  setVector4 (name: string, value: Vector4) {\n    (this.engine as GLEngine).setVector4(this.uniformLocations[name], value);\n  }\n  setColor (name: string, value: Color) {\n    (this.engine as GLEngine).setColor(this.uniformLocations[name], value);\n  }\n  setQuaternion (name: string, value: Quaternion) {\n    (this.engine as GLEngine).setQuaternion(this.uniformLocations[name], value);\n  }\n  setMatrix (name: string, value: Matrix4) {\n    (this.engine as GLEngine).setMatrix(this.uniformLocations[name], value);\n  }\n  setMatrix3 (name: string, value: Matrix3) {\n    (this.engine as GLEngine).setMatrix3(this.uniformLocations[name], value);\n  }\n  setVector4Array (name: string, array: number[]) {\n    (this.engine as GLEngine).setVector4Array(this.uniformLocations[name], array);\n  }\n  setMatrixArray (name: string, array: number[]) {\n    (this.engine as GLEngine).setMatrixArray(this.uniformLocations[name], array);\n  }\n\n  fillShaderInformation (uniformNames: string[], samplers: string[]) {\n    // 避免修改原数组。\n    const samplerList = samplers.slice();\n\n    uniformNames = uniformNames.concat(samplerList);\n    const avaliableUniforms = (this.engine as GLEngine).getUniforms(this.program.program, uniformNames);\n\n    for (let i = 0; i < uniformNames.length; i++) {\n      this.uniformLocations[uniformNames[i]] = avaliableUniforms[i];\n    }\n\n    let index: number;\n\n    for (index = 0; index < samplerList.length; index++) {\n      const sampler = this.uniformLocations[(samplerList[index])];\n\n      if (sampler == null) {\n        samplerList.splice(index, 1);\n        index--;\n      }\n    }\n\n    for (index = 0; index < samplerList.length; index++) {\n      const samplerName = samplerList[index];\n\n      this.samplerChannels[samplerName] = index;\n    }\n  }\n\n  override toData (): void {\n    const shaderData = this.defination as spec.ShaderData;\n\n    shaderData.dataType = spec.DataType.Shader;\n    shaderData.id = this.guid;\n    shaderData.vertex = this.source.vertex;\n    shaderData.fragment = this.source.fragment;\n  }\n\n  override dispose () {\n    if (this.compileResult && this.compileResult.shared) {\n      return;\n    }\n    this.program?.dispose();\n\n    super.dispose();\n  }\n}\n","import type {\n  Disposable, RestoreHandler, ShaderCompileResult, ShaderLibrary, ShaderMacros, ShaderWithSource,\n  SharedShaderWithSource,\n} from '@galacean/effects-core';\nimport { ShaderCompileResultStatus, ShaderType, ShaderFactory } from '@galacean/effects-core';\nimport { GLProgram } from './gl-program';\nimport { GLShaderVariant } from './gl-shader';\nimport { assignInspectorName } from './gl-renderer-internal';\nimport type { GLEngine } from './gl-engine';\n\ninterface GLShaderCompileResult extends ShaderCompileResult {\n  program?: WebGLProgram,\n}\n\nlet shaderSeed = 0;\n\nexport class GLShaderLibrary implements ShaderLibrary, Disposable, RestoreHandler {\n  readonly shaderResults: Record<string, ShaderCompileResult> = {};\n\n  private readonly glAsyncCompileExt: KHR_parallel_shader_compile | null;\n  private programMap: Record<string, GLProgram> = {};\n  private glVertShaderMap = new Map<number, WebGLShader>();\n  private glFragShaderMap = new Map<number, WebGLShader>();\n  private shaderAllDone = false;\n  private cachedShaders: Record<string, GLShaderVariant> = {};\n\n  constructor (\n    public engine: GLEngine\n  ) {\n    this.glAsyncCompileExt = engine.gpuCapability.glAsyncCompileExt;\n  }\n\n  compileAllShaders (asyncCallback?: (results: ShaderCompileResult[]) => void) {\n    if (!this.shaderAllDone) {\n      const pendings: string[] = [];\n\n      for (const key of Object.keys(this.cachedShaders)) {\n        if (!this.cachedShaders[key].initialized) {\n          pendings.push(key);\n        }\n      }\n\n      if (asyncCallback) {\n        if (pendings.length) {\n          Promise.all<Promise<ShaderCompileResult>[]>(\n            pendings.map(key => new Promise(resolve => this.compileShader(this.cachedShaders[key], resolve)))\n          )\n            .then(asyncCallback)\n            .catch(() => 0);\n        } else {\n          asyncCallback([]);\n        }\n      } else {\n        pendings.map(key => this.compileShader(this.cachedShaders[key]));\n      }\n      this.shaderAllDone = true;\n    } else if (asyncCallback) {\n      asyncCallback([]);\n    }\n  }\n\n  // TODO 创建shader的ShaderWithSource和shader的source类型一样，待优化。\n  addShader (shaderSource: ShaderWithSource, macros?: ShaderMacros): string {\n    const mergedMacros: ShaderMacros = [];\n\n    if (shaderSource.macros) {\n      mergedMacros.push(...shaderSource.macros);\n    }\n    if (macros) {\n      // TODO 合并 shaderSource.macros 中已经存在的 macro\n      mergedMacros.push(...macros);\n    }\n    const shaderWithMacros = {\n      ...shaderSource,\n      vertex: ShaderFactory.genFinalShaderCode({\n        level: this.engine.gpuCapability.level,\n        shaderType: ShaderType.vertex,\n        shader: shaderSource.vertex,\n        macros: mergedMacros,\n      }),\n      fragment: ShaderFactory.genFinalShaderCode({\n        level: this.engine.gpuCapability.level,\n        shaderType: ShaderType.fragment,\n        shader: shaderSource.fragment,\n        macros: mergedMacros,\n      }),\n    };\n    const shaderCacheId = this.computeShaderCacheId(shaderWithMacros);\n\n    if (this.cachedShaders[shaderCacheId]) {\n      return shaderCacheId;\n    }\n    this.shaderAllDone = false;\n\n    let shared = false;\n\n    if (shaderWithMacros.shared || (shaderWithMacros as SharedShaderWithSource).cacheId) {\n      shared = true;\n    }\n    this.cachedShaders[shaderCacheId] = new GLShaderVariant(this.engine, {\n      ...shaderWithMacros,\n      vertex: shaderWithMacros.vertex,\n      fragment: shaderWithMacros.fragment,\n      name: shaderWithMacros.name || shaderCacheId,\n      shared,\n    });\n    this.cachedShaders[shaderCacheId].id = shaderCacheId;\n\n    return shaderCacheId;\n  }\n\n  createShader (shaderSource: ShaderWithSource, macros?: ShaderMacros) {\n    const shaderCacheId = this.addShader(shaderSource, macros);\n\n    return this.cachedShaders[shaderCacheId];\n  }\n\n  compileShader (shader: GLShaderVariant, asyncCallback?: (result: ShaderCompileResult) => void) {\n    const { shared: sourceShared, vertex, fragment, name } = shader.source;\n    const { cacheId } = shader.source;\n    let shared = false;\n\n    if (sourceShared || cacheId) {\n      shared = true;\n    }\n\n    const gl = this.engine.gl;\n    const result: GLShaderCompileResult = { shared, status: ShaderCompileResultStatus.compiling };\n    const linkProgram = this.createProgram(gl, vertex, fragment, result);\n    const ext = this.glAsyncCompileExt;\n    const startTime = performance.now();\n    const setupProgram = (glProgram: GLProgram) => {\n      result.status = ShaderCompileResultStatus.success;\n      result.compileTime = performance.now() - startTime;\n      shader.program = glProgram;\n      shader.initialized = true;\n\n      if (this.programMap[shader.id] !== undefined) {\n        console.warn(`Find duplicated shader id: ${shader.id}.`);\n      }\n      this.programMap[shader.id] = glProgram;\n      // console.log('compileShader ' + result.cacheId + ' ' + result.compileTime + ' ', shader.source);\n    };\n    const checkComplete = () => {\n      if (this.engine.disposed) {\n        console.warn('The player is destroyed during the loadScene process. Please check the timing of calling loadScene and dispose. A common situation is that when calling loadScene, await is not added. This will cause dispose to be called before loadScene is completed.');\n\n        return asyncCallback?.(result);\n      }\n      if (shader.initialized) {\n        return asyncCallback?.(result);\n      }\n      const shouldLink =\n        !asyncCallback ||\n        !ext ||\n        (ext && gl.getProgramParameter(result.program!, ext.COMPLETION_STATUS_KHR) == true);\n      const program = shouldLink && linkProgram();\n\n      if (program) {\n        if (result.status !== ShaderCompileResultStatus.fail) {\n          assignInspectorName(program, name);\n          const glProgram = new GLProgram(this.engine, program, shader.id);\n\n          // FIXME: 这个检测不能在这里调用，安卓上会有兼容性问题。要么开发版使用，要么移到Shader首次使用时\n          gl.validateProgram(program);\n          const valid = gl.getProgramParameter(program, gl.VALIDATE_STATUS);\n\n          if (!valid) {\n            const error = gl.getProgramInfoLog(program);\n            const err0 = 'the same texture';\n            const err1 = 'Two textures of different types use the same sampler';\n\n            if (error?.includes(err0) || error?.includes(err1)) {\n              // 忽略这类错误\n              setupProgram(glProgram);\n            } else {\n              result.status = ShaderCompileResultStatus.fail;\n              result.error = error;\n              console.error(\n                'compileProgramError: ' + error,\n                '\\nvertex:\\n',\n                vertex,\n                '\\nfragment:\\n',\n                fragment\n              );\n              gl.deleteProgram(program);\n            }\n          } else {\n            setupProgram(glProgram);\n          }\n        }\n        asyncCallback?.(result);\n      } else if (asyncCallback) {\n        requestAnimationFrame(checkComplete);\n      }\n    };\n\n    shader.compileResult = result;\n    checkComplete();\n  }\n\n  private computeShaderCacheId (shader: ShaderWithSource): string {\n    const { vertex = '', fragment = '', shared } = shader;\n    const { cacheId } = shader;\n    let shaderCacheId: string;\n\n    if (shared || cacheId) {\n      shaderCacheId = cacheId || `shared_${stringHash(vertex, fragment)}`;\n    } else {\n      shaderCacheId = 'instanced_' + shaderSeed++;\n    }\n\n    return shaderCacheId;\n  }\n\n  private createProgram (\n    gl: WebGLRenderingContext,\n    vs: string,\n    fs: string,\n    result: GLShaderCompileResult\n  ): () => WebGLProgram | null {\n    const program = gl.createProgram();\n    const vertexShader = this.createGLShader(gl, gl.VERTEX_SHADER, vs);\n    const fragShader = this.createGLShader(gl, gl.FRAGMENT_SHADER, fs);\n\n    if (program && vertexShader && fragShader) {\n      gl.attachShader(program, vertexShader);\n      gl.attachShader(program, fragShader);\n      gl.linkProgram(program);\n      result.program = program;\n      result.status = ShaderCompileResultStatus.compiling;\n\n      return function () {\n        result.program = undefined;\n        const linked = gl.getProgramParameter(program, gl.LINK_STATUS);\n\n        if (!linked) {\n          // 链接失败，获取并打印错误信息\n          const info = gl.getProgramInfoLog(program);\n\n          console.error(`Failed to link program: ${info}.`);\n          const vsCheckResult = checkShader(gl, vertexShader, 'vertex', vs);\n          const fsCheckResult = checkShader(gl, fragShader, 'fragment', fs);\n\n          result.status = ShaderCompileResultStatus.fail;\n          if (vsCheckResult) {\n            result.error = vsCheckResult.error;\n            result.status = vsCheckResult.status;\n          }\n          if (fsCheckResult) {\n            result.error = fsCheckResult.error;\n            result.status = fsCheckResult.status;\n          }\n\n          return program;\n        }\n\n        return program;\n      };\n    }\n    result.status = ShaderCompileResultStatus.fail;\n\n    return () => null;\n  }\n\n  private createGLShader (gl: WebGLRenderingContext, shaderType: GLenum, code: string): WebGLShader | null {\n    const map = shaderType === gl.VERTEX_SHADER ? this.glVertShaderMap : this.glFragShaderMap;\n    const strHash = stringHash(code ?? '');\n    const ret = map.get(strHash);\n\n    if (ret) {\n      return ret;\n    }\n    const shader = gl.createShader(shaderType);\n\n    if (shader) {\n      gl.shaderSource(shader, code);\n      gl.compileShader(shader);\n      map.set(strHash, shader);\n    }\n\n    return shader;\n  }\n\n  deleteShader (cacheId: string): void {\n    const program = this.programMap[cacheId];\n\n    if (program !== undefined) {\n      program.dispose();\n      delete this.programMap[cacheId];\n    }\n    const result = this.shaderResults[cacheId];\n\n    if (result !== undefined) {\n      delete this.shaderResults[cacheId];\n    }\n  }\n\n  restore (): void {\n    // TODO\n  }\n\n  dispose (): void {\n    Object.keys(this.programMap).forEach(key => {\n      const program = this.programMap[key];\n\n      program.dispose();\n    });\n    this.programMap = {};\n    if (this.engine) {\n      const gl = this.engine.gl;\n\n      this.glFragShaderMap.forEach(shader => {\n        gl.deleteShader(shader);\n      });\n      this.glVertShaderMap.forEach(shader => {\n        gl.deleteShader(shader);\n      });\n      this.glVertShaderMap = new Map<number, WebGLShader>();\n      this.glFragShaderMap = new Map<number, WebGLShader>();\n    }\n  }\n}\n\nfunction checkShader (gl: WebGLRenderingContext, shader: WebGLShader, type: string, code: string) {\n  if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n    const error = gl.getShaderInfoLog(shader);\n\n    console.error(\n      'compile ' + type + ' error: ' + error,\n      (code ?? '')\n        .split('\\n')\n        .map((line, index) => `${index + 1} ${line}`)\n        .join('\\n')\n    );\n\n    return { error, status: ShaderCompileResultStatus.fail };\n  }\n}\n\nexport function stringHash (...strings: string[]): number {\n  let h = 0;\n\n  for (let j = 0; j < arguments.length; j++) {\n    const s = strings[j];\n\n    for (let i = 0; i < s.length; i++) {\n      h = (Math.imul(31, h) + s.charCodeAt(i)) | 0;\n    }\n  }\n\n  return h;\n}","import type {\n  Disposable, Engine, Framebuffer, RenderFrame, RenderPass,\n  RenderPassClearAction, RendererComponent,\n  ShaderLibrary, Texture,\n} from '@galacean/effects-core';\nimport {\n  GPUCapability, Geometry, Material, math,\n  Renderer, TextureLoadAction, assertExist, glContext, logger, sortByOrder,\n} from '@galacean/effects-core';\nimport type { GLEngine } from './gl-engine';\nimport type { GLFramebuffer } from './gl-framebuffer';\nimport { assignInspectorName } from './gl-renderer-internal';\nimport type { GLTexture } from './gl-texture';\nimport { GLShaderLibrary } from './gl-shader-library';\nimport type { GLGeometry } from './gl-geometry';\nimport type { GLMaterial } from './gl-material';\nimport type { GLShaderVariant } from './gl-shader';\nimport type { GLRenderbuffer } from './gl-renderbuffer';\nimport { GLVertexArrayObject } from './gl-vertex-array-object';\nimport type { GLGPUBuffer } from './gl-gpu-buffer';\n\ntype Matrix4 = math.Matrix4;\ntype Vector4 = math.Vector4;\ntype Vector3 = math.Vector3;\n\n// Blit shader 定义\nconst BLIT_VERTEX_SHADER = `\nprecision highp float;\nattribute vec2 aPos;\nvarying vec2 vTex;\nvoid main(){\n    gl_Position = vec4(aPos, 0.0, 1.0);\n    vTex = (aPos + vec2(1.0)) / 2.0;\n}`;\n\nconst BLIT_FRAGMENT_SHADER = `\nprecision mediump float;\nvarying vec2 vTex;\nuniform sampler2D _MainTex;\nvoid main(){\n    gl_FragColor = texture2D(_MainTex, vTex);\n}`;\n\nlet seed = 1;\n\nexport class GLRenderer extends Renderer implements Disposable {\n  temporaryRTs: Record<string, Framebuffer> = {};\n  readonly name: string;\n\n  private sourceFbo: WebGLFramebuffer | null;\n  private targetFbo: WebGLFramebuffer | null;\n  private disposed = false;\n  private blitGeometry: Geometry | null = null;\n  private blitMaterial: Material | null = null;\n\n  get gl () {\n    return (this.engine as GLEngine).gl;\n  }\n\n  get height () {\n    return this.gl?.drawingBufferHeight;\n  }\n\n  get width () {\n    return this.gl?.drawingBufferWidth;\n  }\n\n  get canvas () {\n    return this.gl.canvas;\n  }\n\n  get isDisposed () {\n    return this.disposed;\n  }\n\n  get context () {\n    return (this.engine as GLEngine).context;\n  }\n\n  constructor (engine: Engine) {\n    super(engine);\n\n    this.name = `GLRenderer#${seed++}`;\n\n    const { gl } = this.context;\n\n    assertExist(gl);\n    this.renderingData = {\n      // @ts-expect-error\n      currentFrame: {},\n    };\n  }\n\n  override renderRenderFrame (renderFrame: RenderFrame) {\n    const frame = renderFrame;\n    const passes = frame._renderPasses;\n\n    if (this.isDisposed) {\n      console.error('Renderer is destroyed, target: GLRenderer.');\n\n      return;\n    }\n\n    frame.renderer.getShaderLibrary()?.compileAllShaders();\n    frame.setup();\n\n    this.setFramebuffer(null);\n\n    const currentCamera = frame.camera;\n\n    this.renderingData.currentFrame = frame;\n    this.renderingData.currentCamera = currentCamera;\n\n    this.setGlobalMatrix('effects_MatrixInvV', currentCamera.getInverseViewMatrix());\n    this.setGlobalMatrix('effects_MatrixV', currentCamera.getViewMatrix());\n    this.setGlobalMatrix('effects_MatrixVP', currentCamera.getViewProjectionMatrix());\n    this.setGlobalMatrix('_MatrixP', currentCamera.getProjectionMatrix());\n    this.setGlobalVector3('effects_WorldSpaceCameraPos', currentCamera.position);\n\n    // 根据 priority 排序 pass\n    sortByOrder(passes);\n\n    for (const pass of passes) {\n      this.renderRenderPass(pass);\n    }\n\n    for (const pass of passes) {\n      pass.onCameraCleanup(this);\n    }\n  }\n\n  renderRenderPass (pass: RenderPass): void {\n    this.renderingData.currentPass = pass;\n    // 配置当前 renderer 的 RT\n    pass.configure(this);\n    // 执行当前 pass\n    pass.execute(this);\n  }\n\n  override renderMeshes (meshes: RendererComponent[]) {\n    for (const mesh of meshes) {\n      mesh.render(this);\n    }\n  }\n\n  override setGlobalFloat (name: string, value: number) {\n    this.checkGlobalUniform(name);\n    this.renderingData.currentFrame.globalUniforms.floats[name] = value;\n  }\n\n  override setGlobalVector4 (name: string, value: Vector4) {\n    this.checkGlobalUniform(name);\n    this.renderingData.currentFrame.globalUniforms.vector4s[name] = value;\n  }\n\n  getGlobalVector4 (name: string): Vector4 {\n    return this.renderingData.currentFrame.globalUniforms.vector4s[name];\n  }\n\n  override setGlobalInt (name: string, value: number) {\n    this.checkGlobalUniform(name);\n    this.renderingData.currentFrame.globalUniforms.ints[name] = value;\n  }\n\n  override setGlobalMatrix (name: string, value: Matrix4) {\n    this.checkGlobalUniform(name);\n    this.renderingData.currentFrame.globalUniforms.matrices[name] = value;\n  }\n\n  override setGlobalVector3 (name: string, value: Vector3) {\n    this.checkGlobalUniform(name);\n    this.renderingData.currentFrame.globalUniforms.vector3s[name] = value;\n  }\n\n  override drawGeometry (geometry: Geometry, matrix: Matrix4, material: Material, subMeshIndex = 0): void {\n    if (!geometry || !material) {\n      return;\n    }\n\n    material.initialize();\n    geometry.initialize();\n    geometry.flush();\n    const renderingData = this.renderingData;\n\n    material.setMatrix('effects_ObjectToWorld', matrix);\n\n    try {\n      material.use(this, renderingData.currentFrame.globalUniforms);\n    } catch (e) {\n      console.error(e);\n\n      this.engine.renderErrors.add(e as Error);\n\n      return;\n    }\n\n    const gl = (this.engine as GLEngine).gl;\n\n    if (!gl) {\n      console.warn('GLGPURenderer has not bound a gl object, unable to render geometry.');\n\n      return;\n    }\n\n    const glGeometry = geometry as GLGeometry;\n    const glMaterial = material as GLMaterial;\n    const program = (glMaterial.shaderVariant as GLShaderVariant).program;\n\n    if (!program) {\n      return;\n    }\n\n    const vao = program.setupAttributes(glGeometry);\n    const indicesBuffer = glGeometry.indicesBuffer;\n    let offset = glGeometry.drawStart;\n    let count = glGeometry.drawCount;\n    const mode = glGeometry.mode;\n    const subMeshes = glGeometry.subMeshes;\n\n    if (subMeshes && subMeshes.length) {\n      const subMesh = subMeshes[subMeshIndex];\n\n      // FIXME: 临时处理3D线框状态下隐藏模型\n      if (count < 0) {\n        return;\n      }\n      offset = subMesh.offset;\n      if (indicesBuffer) {\n        count = subMesh.indexCount ?? 0;\n      } else {\n        count = subMesh.vertexCount;\n      }\n    }\n    if (indicesBuffer) {\n      gl.drawElements(mode, count, indicesBuffer.type, offset ?? 0);\n    } else {\n      gl.drawArrays(mode, offset, count);\n    }\n    vao?.unbind();\n  }\n\n  override setFramebuffer (framebuffer: Framebuffer | null) {\n    if (framebuffer) {\n      this.currentFramebuffer = framebuffer;\n      this.currentFramebuffer.bind();\n      this.setViewport(framebuffer.viewport[0], framebuffer.viewport[1], framebuffer.viewport[2], framebuffer.viewport[3]);\n    } else {\n      this.currentFramebuffer = null;\n      (this.engine as GLEngine).bindSystemFramebuffer();\n      this.setViewport(0, 0, this.getWidth(), this.getHeight());\n    }\n  }\n\n  override setViewport (x: number, y: number, width: number, height: number) {\n    (this.engine as GLEngine).viewport(x, y, width, height);\n  }\n\n  override clear (action: RenderPassClearAction): void {\n    const engine = this.engine as GLEngine;\n    let bit = 0;\n\n    if (action.colorAction === TextureLoadAction.clear) {\n      const clearColor = action.clearColor;\n\n      if (clearColor) {\n        engine.clearColor(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);\n      }\n      engine.colorMask(true, true, true, true);\n      bit = glContext.COLOR_BUFFER_BIT;\n    }\n    if (action.stencilAction === TextureLoadAction.clear) {\n      engine.stencilMask(0xff);\n      engine.clearStencil(action.clearStencil || 0);\n      bit = bit | glContext.STENCIL_BUFFER_BIT;\n    }\n    if (action.depthAction === TextureLoadAction.clear) {\n      const depth = action.clearDepth as number;\n\n      engine.depthMask(true);\n      engine.clearDepth(Number.isFinite(depth) ? depth : 1);\n      bit = bit | glContext.DEPTH_BUFFER_BIT;\n    }\n    if (bit) {\n      engine.clear(bit);\n    }\n  }\n\n  override getShaderLibrary (): ShaderLibrary | undefined {\n    return (this.engine as GLEngine).shaderLibrary;\n  }\n\n  override getWidth (): number {\n    return this.width;\n  }\n\n  override getHeight (): number {\n    return this.height;\n  }\n\n  override dispose (): void {\n    if (this.disposed) {\n      return;\n    }\n    this.deleteResource();\n    this.renderTargetPool.dispose();\n    this.blitGeometry?.dispose();\n    this.blitGeometry = null;\n    this.blitMaterial?.dispose();\n    this.blitMaterial = null;\n    this.disposed = true;\n  }\n\n  override lost (e: Event) {\n    e.preventDefault();\n    logger.error(`WebGL context lost, destroying glRenderer by default to prevent memory leaks. Event target: ${e.target}.`);\n    this.deleteResource();\n  }\n\n  override restore () {\n    // FIXME: 需要测试下lost和restore流程\n    const { gl } = this.context;\n\n    if (!gl) {\n      throw new Error('Can not restore automatically because losing gl context.');\n    }\n    const engine = this.engine as GLEngine;\n\n    engine.reset();\n    engine.shaderLibrary = new GLShaderLibrary(engine);\n    engine.gpuCapability = new GPUCapability(gl);\n  }\n\n  override resize (width: number, height: number): void {\n    if (this.width !== width || this.height !== height) {\n      const gl = this.gl;\n\n      if (gl && gl.drawingBufferWidth !== width || gl.drawingBufferHeight !== height) {\n        gl.canvas.width = width;\n        gl.canvas.height = height;\n        gl.viewport(0, 0, width, height);\n      }\n    }\n  }\n\n  /**\n   * 将源纹理复制到目标 Framebuffer，可使用自定义材质进行处理\n   * @param source - 源纹理\n   * @param destination - 目标 Framebuffer，如果为 null 则渲染到屏幕\n   * @param material - 可选的自定义材质，不传则使用默认复制材质\n   */\n  override blit (source: Texture, destination: Framebuffer | null, material?: Material): void {\n    // 懒加载创建 blit geometry\n    if (!this.blitGeometry) {\n      this.blitGeometry = Geometry.create(this.engine, {\n        mode: glContext.TRIANGLE_STRIP,\n        attributes: {\n          aPos: {\n            type: glContext.FLOAT,\n            size: 2,\n            data: new Float32Array([-1, 1, -1, -1, 1, 1, 1, -1]),\n          },\n        },\n        drawCount: 4,\n      });\n    }\n\n    // 懒加载创建默认 blit material\n    if (!this.blitMaterial) {\n      this.blitMaterial = Material.create(this.engine, {\n        shader: {\n          vertex: BLIT_VERTEX_SHADER,\n          fragment: BLIT_FRAGMENT_SHADER,\n        },\n      });\n      this.blitMaterial.blending = false;\n      this.blitMaterial.depthTest = false;\n      this.blitMaterial.culling = false;\n    }\n\n    const blitMat = material || this.blitMaterial;\n\n    // 设置源纹理\n    blitMat.setTexture('_MainTex', source);\n\n    // 保存当前 framebuffer\n    const prevFramebuffer = this.currentFramebuffer;\n\n    // 设置目标\n    if (destination) {\n      const [x, y, width, height] = destination.viewport;\n\n      this.setFramebuffer(destination);\n      this.setViewport(x, y, width, height);\n    } else {\n      // 渲染到屏幕\n      this.setFramebuffer(null);\n      this.setViewport(0, 0, this.getWidth(), this.getHeight());\n    }\n\n    this.drawGeometry(this.blitGeometry, math.Matrix4.IDENTITY, blitMat);\n\n    // 恢复之前的 framebuffer\n    this.setFramebuffer(prevFramebuffer);\n  }\n\n  private checkGlobalUniform (name: string) {\n    const globalUniforms = this.renderingData.currentFrame.globalUniforms;\n\n    if (!globalUniforms.uniforms.includes(name)) {\n      globalUniforms.uniforms.push(name);\n    }\n  }\n\n  copy2 (source: GLTexture, target: GLTexture) {\n    const gl = this.gl as WebGL2RenderingContext;\n\n    if (!gl) {\n      return;\n    }\n\n    if (!this.sourceFbo) {\n      this.sourceFbo = gl.createFramebuffer();\n    }\n    if (!this.targetFbo) {\n      this.targetFbo = gl.createFramebuffer();\n    }\n    const engine = this.engine as GLEngine;\n\n    engine.bindFramebuffer(gl.FRAMEBUFFER, this.sourceFbo);\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, source.textureBuffer, 0);\n    engine.bindFramebuffer(gl.FRAMEBUFFER, this.targetFbo);\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, target.textureBuffer, 0);\n    engine.bindFramebuffer(gl.READ_FRAMEBUFFER, this.sourceFbo);\n    engine.bindFramebuffer(gl.DRAW_FRAMEBUFFER, this.targetFbo);\n\n    const filter = source.getWidth() === source.getHeight() && target.getWidth() == target.getHeight() ? gl.NEAREST : gl.LINEAR;\n\n    gl.blitFramebuffer(0, 0, source.getWidth(), source.getHeight(), 0, 0, target.getWidth(), target.getHeight(), gl.COLOR_BUFFER_BIT, filter);\n    engine.bindFramebuffer(gl.FRAMEBUFFER, null);\n    engine.bindFramebuffer(gl.READ_FRAMEBUFFER, null);\n    engine.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);\n  }\n\n  createGLRenderbuffer (renderbuffer: GLRenderbuffer): WebGLRenderbuffer | null {\n    const rb = this.gl.createRenderbuffer();\n\n    return rb;\n  }\n\n  createGLFramebuffer (name?: string): WebGLFramebuffer | null {\n    const fbo = this.gl.createFramebuffer();\n\n    if (fbo) {\n      assignInspectorName(fbo, name, name);\n    } else {\n      throw new Error(`Failed to create WebGL framebuffer. gl isContextLost=${this.gl.isContextLost()}`);\n    }\n\n    return fbo;\n  }\n\n  /**创建包裹VAO对象。 */\n  createVAO (name?: string): GLVertexArrayObject | undefined {\n    const ret = new GLVertexArrayObject(this.engine as GLEngine, name);\n\n    return ret;\n  }\n\n  deleteGLTexture (texture: GLTexture) {\n    if (texture.textureBuffer && !this.disposed) {\n      this.gl.deleteTexture(texture.textureBuffer);\n      texture.textureBuffer = null;\n    }\n  }\n\n  deleteGPUBuffer (buffer: GLGPUBuffer | null) {\n    if (buffer && !this.disposed) {\n      this.gl.deleteBuffer(buffer.glBuffer);\n      // @ts-expect-error\n      delete buffer.glBuffer;\n    }\n  }\n\n  deleteGLFramebuffer (framebuffer: GLFramebuffer) {\n    if (framebuffer && !this.disposed) {\n      this.gl.deleteFramebuffer(framebuffer.fbo as WebGLFramebuffer);\n      delete framebuffer.fbo;\n    }\n  }\n\n  deleteGLRenderbuffer (renderbuffer: GLRenderbuffer) {\n    if (renderbuffer && !this.disposed) {\n      this.gl.deleteRenderbuffer(renderbuffer.buffer);\n      renderbuffer.buffer = null;\n    }\n  }\n\n  private deleteResource () {\n    const gl = this.gl;\n\n    if (gl) {\n      gl.deleteFramebuffer(this.sourceFbo);\n      gl.deleteFramebuffer(this.targetFbo);\n    }\n  }\n}\n","import type {\n  Disposable, RestoreHandler, Texture2DSourceOptionsCompressed, Texture2DSourceOptionsData,\n  Texture2DSourceOptionsImage, Texture2DSourceOptionsImageMipmaps, Texture2DSourceOptionsVideo,\n  TextureConfigOptions, TextureCubeSourceOptionsImage, TextureCubeSourceOptionsImageMipmaps,\n  TextureDataType, TextureSourceOptions, Texture2DSourceOptionsFramebuffer, spec, Engine,\n} from '@galacean/effects-core';\nimport {\n  getDefaultTextureFactory, glContext, nearestPowerOfTwo, Texture, TextureSourceType, isWebGL2,\n  throwDestroyedError, canvasPool, logger, isPowerOfTwo,\n} from '@galacean/effects-core';\nimport { assignInspectorName } from './gl-renderer-internal';\nimport type { GLEngine } from './gl-engine';\n\nconst FORMAT_HALF_FLOAT: Record<string, number> = {\n  [glContext.RGBA]: 34842, //RGBA16F\n  [glContext.RGB]: 34843, //RGB16F\n  [glContext.ALPHA]: 33325, //R16F\n  [glContext.RED]: 33325, //R16F\n  [glContext.LUMINANCE_ALPHA]: 33327, //RG16F\n  [glContext.LUMINANCE]: 33325,\n};\nconst FORMAT_FLOAT: Record<string, number> = {\n  [glContext.RGBA]: 34836, //RGBA32F\n  [glContext.RGB]: 34837, //RGB32F\n  [glContext.ALPHA]: 33326, //R32F\n  [glContext.RED]: 33326, //R32F\n  [glContext.LUMINANCE_ALPHA]: 33328, //RG32F,\n  [glContext.LUMINANCE]: 33326, //R32F\n};\n\nexport class GLTexture extends Texture implements Disposable, RestoreHandler {\n  textureBuffer: WebGLTexture | null;\n  target: GLenum;\n\n  private initialized = false;\n\n  constructor (engine: Engine, source?: TextureSourceOptions) {\n    super(engine);\n    if (source) {\n      this.fromData(source);\n    }\n  }\n\n  /**\n   * 绑定当前 Texture 对象\n   */\n  bind (force?: boolean) {\n    (this.engine as GLEngine).bindTexture(this.target, this.textureBuffer, force);\n  }\n\n  /**\n   * 初始化 Texture 的 GPU 资源\n   */\n  override initialize (): void {\n    if (this.initialized) {\n      return;\n    }\n    const glEngine = this.engine as GLEngine;\n\n    glEngine.addTexture(this);\n\n    const gl = (this.engine as GLEngine).gl;\n    const { target = gl.TEXTURE_2D, name } = this.source;\n\n    this.textureBuffer = gl.createTexture();\n    assignInspectorName(this.textureBuffer, name);\n    this.target = target;\n    this.update(this.source);\n    this.release();\n    this.initialized = true;\n  }\n\n  clone (): GLTexture {\n    const clonedTexture = new GLTexture(this.engine, this.source);\n\n    clonedTexture.sourceFrom = this.sourceFrom;\n    clonedTexture.sourceType = this.sourceType;\n    clonedTexture.width = this.width;\n    clonedTexture.height = this.height;\n\n    return clonedTexture;\n  }\n\n  release () {\n    const { sourceType } = this.source;\n\n    switch (sourceType) {\n      case TextureSourceType.image:\n        // @ts-expect-error\n        delete (this.source as Texture2DSourceOptionsImage).image;\n        // @ts-expect-error\n        delete (this.source as TextureCubeSourceOptionsImage).cube;\n\n        break;\n      case TextureSourceType.data:\n        // @ts-expect-error\n        delete (this.source as Texture2DSourceOptionsData).data;\n\n        break;\n      case TextureSourceType.compressed:\n        // @ts-expect-error\n        delete this.source.mipmaps;\n\n        break;\n      case TextureSourceType.mipmaps:\n        // @ts-expect-error\n        delete this.source.mipmaps;\n\n        break;\n    }\n  }\n\n  update (sourceOptions: TextureSourceOptions) {\n    if (!this.engine || !this.textureBuffer) {\n      this.width = 0;\n      this.height = 0;\n\n      return;\n    }\n\n    const target = this.target;\n    const source = this.source;\n    const gl = (this.engine as GLEngine).gl;\n    const { detail } = this.engine.gpuCapability;\n    const { sourceType } = source;\n    const { data } = source as Texture2DSourceOptionsData;\n    const { cube } = source as TextureCubeSourceOptionsImage;\n    const { image } = source as Texture2DSourceOptionsImage;\n    const { video } = source as Texture2DSourceOptionsVideo;\n    const { mipmaps } = source as Texture2DSourceOptionsImageMipmaps;\n    const { mipmaps: cubeMipmaps } = source as TextureCubeSourceOptionsImageMipmaps;\n    const { data: optionsData } = sourceOptions as Texture2DSourceOptionsFramebuffer;\n    const { cube: optionsCube } = sourceOptions as TextureCubeSourceOptionsImage;\n    const { generateMipmap = false } = sourceOptions as Texture2DSourceOptionsImage | Texture2DSourceOptionsData;\n    const { mipmaps: optionsMipmaps } = sourceOptions as Texture2DSourceOptionsCompressed;\n    let { format, type, internalFormat } = source as Required<TextureSourceOptions>;\n    let width = 0;\n    let height = 0;\n\n    // TODO 原GLState的textureUnitDict参数未处理。\n    this.bind(sourceType === TextureSourceType.video);\n\n    // 选择 type 和 format\n    if (type === glContext.HALF_FLOAT) {\n      type = detail.halfFloatTexture;\n      if (!type) {\n        logger.error('Half float texture is not support.');\n      }\n      if (isWebGL2(gl) && internalFormat === format) {\n        if (format === glContext.LUMINANCE) {\n          format = glContext.RED;\n        }\n        internalFormat = FORMAT_HALF_FLOAT[format];\n      }\n      if (!detail.halfFloatLinear) {\n        source.minFilter = source.magFilter = gl.NEAREST;\n        logger.warn('Half float linear not support, change to NEAREST.');\n      }\n    } else if (type === gl.FLOAT) {\n      type = detail.floatTexture;\n      if (!type) {\n        logger.error('Float texture is not support.');\n      }\n      if (isWebGL2(gl) && internalFormat === format) {\n        if (format === glContext.LUMINANCE) {\n          format = glContext.RED;\n        }\n        internalFormat = FORMAT_FLOAT[format];\n      }\n      if (!detail.floatLinear) {\n        source.minFilter = gl.NEAREST;\n        source.magFilter = gl.NEAREST;\n        logger.warn('Float linear not support, change to NEAREST.');\n      }\n    }\n\n    // 处理是否RGB透明度相乘和Y轴反转, 默认值都为false。\n    if (source.premultiplyAlpha === undefined) {\n      source.premultiplyAlpha = false;\n    }\n    // gl的状态可能在外面被改变了，这里必须重新设置\n    gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, source.premultiplyAlpha);\n    if (source.flipY === undefined) {\n      source.flipY = false;\n    }\n    // gl的状态可能在外面被改变了，这里必须重新设置\n    gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, source.flipY);\n\n    const createMipmap = (textureWidth: number, textureHeight: number) => {\n      if ((isPowerOfTwo(textureWidth) && isPowerOfTwo(textureHeight)) || isWebGL2(gl)) {\n        gl.generateMipmap(target);\n      } else {\n        console.error('Mipmap generation failed. Texture width and height must be power of two in WebGL1.');\n      }\n    };\n\n    // 根据不同的 TextureSourceType 传输对应贴图数据到 GPU\n    if (sourceType === TextureSourceType.framebuffer) {\n      if (optionsData) {\n        width = optionsData.width ?? 0;\n        height = optionsData.height ?? 0;\n        if (width && height && (this.width !== width || this.height !== height)) {\n          gl.texImage2D(target, 0, internalFormat, width, height, 0, format, type, null);\n        }\n      } else {\n        // FIXME: warning有点多先注释掉，没有大小的update需要排查一下\n        // console.warn('No image size for setup framebuffer texture');\n      }\n    } else if (sourceType === TextureSourceType.data) {\n      if (target === gl.TEXTURE_CUBE_MAP) {\n        optionsCube.forEach((data, key) => {\n          const [x, y] = this.texImage2DData(gl, gl.TEXTURE_CUBE_MAP_POSITIVE_X + key, 0, internalFormat, format, type, data as TextureDataType);\n\n          width = Math.max(x, width);\n          height = Math.max(y, height);\n        });\n      } else {\n        [width, height] = this.texImage2DData(gl, target, 0, internalFormat, format, type, data);\n\n        if (generateMipmap) {\n          createMipmap(width, height);\n        }\n      }\n    } else if (\n      sourceType === TextureSourceType.image ||\n      sourceType === TextureSourceType.video\n    ) {\n      if (target === gl.TEXTURE_CUBE_MAP) {\n        cube.forEach((image, key) => {\n          const [x, y] = this.texImage2D(gl, gl.TEXTURE_CUBE_MAP_POSITIVE_X + key, 0, internalFormat, format, type, image as HTMLImageElement);\n\n          width = Math.max(x, width);\n          height = Math.max(y, height);\n        });\n      } else if (target === gl.TEXTURE_2D) {\n        const imageData = image ?? video;\n\n        [width, height] = this.texImage2D(gl, target, 0, internalFormat, format, type, imageData);\n      }\n\n      if (generateMipmap) {\n        createMipmap(width, height);\n      }\n    } else if (sourceType === TextureSourceType.mipmaps) {\n      let ret;\n\n      if (target === gl.TEXTURE_2D) {\n        mipmaps.forEach((mipmap, level) => {\n          if ('data' in mipmap) {\n            ret = this.texImage2DData(gl, target, level, internalFormat, format, type, mipmap);\n          } else {\n            ret = this.texImage2D(gl, target, level, internalFormat, format, type, mipmap);\n          }\n          if (level === 0) {\n            [width, height] = ret;\n          }\n        });\n      } else if (target === gl.TEXTURE_CUBE_MAP) {\n        cubeMipmaps.forEach((mipmap, level) => {\n          mipmap.forEach((face, key) => {\n            if ('data' in face) {\n              ret = this.texImage2DData(gl, gl.TEXTURE_CUBE_MAP_POSITIVE_X + key, level, internalFormat, format, type, face);\n            } else {\n              ret = this.texImage2D(gl, gl.TEXTURE_CUBE_MAP_POSITIVE_X + key, level, internalFormat, format, type, face);\n            }\n            if (level === 0) {\n              [width, height] = ret;\n            }\n          });\n        });\n      }\n    } else if (sourceType === TextureSourceType.compressed) {\n      if (optionsMipmaps && optionsMipmaps.length !== 0) {\n        width = optionsMipmaps[0].width;\n        height = optionsMipmaps[0].height;\n        optionsMipmaps.forEach((mipmap, idx) => {\n          gl.compressedTexImage2D(\n            target,\n            idx,\n            internalFormat,\n            mipmap.width,\n            mipmap.height,\n            0,\n            mipmap.data);\n        });\n      }\n    }\n    this.width = width;\n    this.height = height;\n    this.setTextureFilters(gl, target, source);\n  }\n\n  setTextureFilters (\n    gl: WebGLRenderingContext | WebGL2RenderingContext,\n    target: GLenum,\n    options: TextureConfigOptions,\n  ) {\n    const { anisotropic = 4, wrapS = gl.CLAMP_TO_EDGE, wrapT = gl.CLAMP_TO_EDGE } = options;\n    const gpuCapability = this.engine.gpuCapability;\n\n    if (this.target === gl.TEXTURE_2D) {\n      gpuCapability.setTextureAnisotropic(gl, this.target, anisotropic);\n    }\n    const isPot = isWebGL2(gl) || (isPowerOfTwo(this.width) && isPowerOfTwo(this.height));\n    const magFilter = options.magFilter ? options.magFilter : gl.NEAREST;\n    let minFilter = options.minFilter ? options.minFilter : gl.NEAREST;\n\n    if (!isPot) {\n      if (\n        minFilter === gl.LINEAR_MIPMAP_LINEAR ||\n        minFilter === gl.LINEAR_MIPMAP_NEAREST ||\n        minFilter === gl.NEAREST_MIPMAP_LINEAR ||\n        minFilter === gl.NEAREST_MIPMAP_NEAREST\n      ) {\n        minFilter = gl.LINEAR;\n      }\n    }\n\n    gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, minFilter);\n    gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, magFilter);\n    gl.texParameteri(target, gl.TEXTURE_WRAP_S, isPot ? wrapS : gl.CLAMP_TO_EDGE);\n    gl.texParameteri(target, gl.TEXTURE_WRAP_T, isPot ? wrapT : gl.CLAMP_TO_EDGE);\n  }\n\n  override fromData (data: any): void {\n    super.fromData(data);\n    const source = data as TextureSourceOptions;\n    const options = this.assembleOptions(source);\n    const { sourceType, sourceFrom, name = '' } = options;\n\n    this.source = options;\n    this.sourceType = sourceType;\n    this.sourceFrom = sourceFrom;\n    this.name = name;\n  }\n\n  private texImage2D (\n    gl: WebGLRenderingContext | WebGL2RenderingContext,\n    target: GLenum,\n    level: number,\n    internalformat: GLenum,\n    format: GLenum,\n    type: GLenum,\n    image: spec.HTMLImageLike,\n  ): spec.vec2 {\n    const { sourceType, minFilter, magFilter, wrapS, wrapT } = this.source;\n    const maxSize = this.engine.gpuCapability.detail.maxTextureSize ?? 2048;\n    let img = image;\n\n    if (sourceType !== TextureSourceType.video) {\n      let shouldResize = minFilter !== gl.NEAREST || magFilter !== gl.NEAREST || wrapS !== gl.CLAMP_TO_EDGE || wrapT !== gl.CLAMP_TO_EDGE;\n\n      shouldResize = shouldResize || image.width > maxSize || image.height > maxSize;\n      if (shouldResize) {\n        // fix android webgl1 img lost error\n        setTimeout(() => {\n          img = this.resizeImage(image);\n        });\n      }\n    }\n    gl.texImage2D(target, level, internalformat, format, type, img);\n    const size: spec.vec2 = [img.width, img.height];\n\n    if (sourceType === TextureSourceType.video) {\n      const { videoWidth, videoHeight } = image as HTMLVideoElement;\n\n      return [videoWidth, videoHeight];\n    }\n\n    return size;\n  }\n\n  private texImage2DData (\n    gl: WebGLRenderingContext | WebGL2RenderingContext,\n    target: GLenum,\n    level: number,\n    internalformat: GLenum,\n    format: GLenum,\n    type: GLenum,\n    data: TextureDataType,\n  ): spec.vec2 {\n    const { data: bufferView, width, height } = data;\n    // Uint8ClampedArray is incompatible in android\n    const neoBuffer =\n      format === gl.UNSIGNED_BYTE\n        ? new Uint8Array(\n          bufferView.buffer,\n          bufferView.byteOffset,\n          bufferView.byteLength / bufferView.BYTES_PER_ELEMENT,\n        )\n        : bufferView;\n\n    gl.texImage2D(target, level, internalformat, width, height, 0, format, type, neoBuffer);\n\n    return [width, height];\n  }\n\n  private resizeImage (image: spec.HTMLImageLike, targetWidth?: number, targetHeight?: number): HTMLCanvasElement | HTMLImageElement {\n    const { detail } = this.engine.gpuCapability;\n    const maxSize = detail.maxTextureSize ?? 2048;\n\n    const gl = (this.engine as GLEngine).gl;\n\n    if (isWebGL2(gl) && (image.width < maxSize && image.height < maxSize)) {\n      return image as HTMLImageElement;\n    }\n\n    const canvas = resizeImageByCanvas(image, maxSize, targetWidth, targetHeight);\n\n    if (canvas) { return canvas; }\n\n    return image as HTMLImageElement;\n  }\n\n  override async reloadData (): Promise<void> {\n    if (this.offloaded) {\n      await getDefaultTextureFactory().reload(this);\n    }\n  }\n\n  override offloadData () {\n    if (!(this.initialized && getDefaultTextureFactory().canOffloadTexture(this.source.sourceFrom))) {\n      return;\n    }\n    const target = this.target;\n    const gl = (this.engine as GLEngine).gl;\n\n    if (gl && this.textureBuffer) {\n      const data = new Uint8Array([255]);\n\n      this.bind();\n      if (target === gl.TEXTURE_2D) {\n        gl.texImage2D(target, 0, gl.LUMINANCE, 1, 1, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, data);\n      } else if (target === gl.TEXTURE_CUBE_MAP) {\n        const faces = [\n          gl.TEXTURE_CUBE_MAP_NEGATIVE_X,\n          gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,\n          gl.TEXTURE_CUBE_MAP_NEGATIVE_Z,\n          gl.TEXTURE_CUBE_MAP_POSITIVE_X,\n          gl.TEXTURE_CUBE_MAP_POSITIVE_Y,\n          gl.TEXTURE_CUBE_MAP_POSITIVE_Z,\n        ];\n\n        for (let i = 0; i < faces.length; i++) {\n          gl.texImage2D(faces[i], 0, gl.LUMINANCE, 1, 1, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, data);\n        }\n      }\n      // rewrite mipmap\n      gl.generateMipmap(target);\n      this.width = 1;\n      this.height = 1;\n    }\n    this.offloaded = true;\n  }\n\n  override async uploadCurrentVideoFrame () {\n    if (\n      this.source.sourceType === TextureSourceType.video &&\n      this.source.video &&\n      this.initialized\n    ) {\n\n      this.update({ video: this.source.video });\n\n      return true;\n    }\n\n    return false;\n  }\n\n  updateSource (opts: TextureSourceOptions): void {\n    // @ts-expect-error\n    this.source = this.assembleOptions({ ...this.source, ...opts });\n    this.sourceType = this.source.sourceType;\n    this.sourceFrom = this.source.sourceFrom;\n    this.update(this.source);\n  }\n\n  restore () {\n    // TODO\n  }\n\n  override dispose (): void {\n    /**\n     * 原先Player是允许多次调用dispose，并且不会报错\n     * dispose之后assignRenderer会报错\n     */\n    if (this.engine && this.textureBuffer) {\n      (this.engine as GLEngine).gl.deleteTexture(this.textureBuffer);\n    }\n    this.width = 0;\n    this.height = 0;\n    this.textureBuffer = null;\n    this.destroyed = true;\n    this.update = () => {\n      logger.error('This texture has been destroyed.');\n    };\n    this.initialize = throwDestroyedError as unknown as () => void;\n\n    if (this.engine !== undefined) {\n      this.engine.removeTexture(this);\n    }\n\n    super.dispose();\n  }\n}\n\nfunction resizeImageByCanvas (\n  image: spec.HTMLImageLike,\n  maxSize: number,\n  targetWidth?: number,\n  targetHeight?: number,\n): HTMLCanvasElement | undefined {\n  const { width, height } = image;\n  const nw = Math.min(maxSize, targetWidth || nearestPowerOfTwo(width));\n  const nh = Math.min(maxSize, targetHeight || nearestPowerOfTwo(height));\n\n  if (nh !== height || nw !== width) {\n    const canvas = canvasPool.getCanvas();\n    const ctx = canvas.getContext('2d');\n\n    canvas.width = nw;\n    canvas.height = nh;\n    ctx?.drawImage(image, 0, 0, width, height, 0, 0, nw, nh);\n    logger.warn(`Image resize from ${width}x${height} to ${nw}x${nh}.`);\n\n    return canvas;\n  }\n}\n","import { glContext } from '@galacean/effects-core';\nimport type { GLEngine } from './gl-engine';\n\nexport class GLMaterialState {\n  // Blend相关设置\n  blending: boolean;\n  blendFunctionParameters: [blendSrc: GLenum, blendDst: GLenum, blendSrcAlpha: GLenum, blendDstAlpha: GLenum];\n  blendEquationParameters: [blendEquationRGB: GLenum, blendEquationAlpha: GLenum];\n  blendColor: [r: number, g: number, b: number, a: number];\n\n  // depth相关设置\n  depthTest: boolean;\n  depthMask: boolean;\n  depthRange: [zNear: GLenum, zFar: GLenum];\n  depthFunc: GLenum;\n  polygonOffset: [factor: GLenum, units: GLenum];\n  polygonOffsetFill: boolean;\n  sampleAlphaToCoverage: boolean;\n  colorMask: [r: boolean, g: boolean, b: boolean, a: boolean];\n\n  // stencil相关\n  stencilTest: boolean;\n  stencilMask: [front: GLenum, back: GLenum];\n  stencilRef: [front: GLenum, back: GLenum];\n  stencilFunc: [front: GLenum, back: GLenum];\n  stencilOpFail: [front: GLenum, back: GLenum];\n  stencilOpZFail: [front: GLenum, back: GLenum];\n  stencilOpZPass: [front: GLenum, back: GLenum];\n\n  // culling相关\n  culling: boolean;\n  frontFace: GLenum;\n  cullFace: GLenum;\n\n  constructor () {\n    this.reset();\n  }\n\n  setBlendColor (color: [r: number, g: number, b: number, a: number]): void {\n    const [r, g, b, a] = color;\n\n    if (this.blendColor[0] === r && this.blendColor[1] === g && this.blendColor[2] === b && this.blendColor[3] === a) {\n      return;\n    }\n    this.blendColor[0] = r;\n    this.blendColor[1] = g;\n    this.blendColor[2] = b;\n    this.blendColor[3] = a;\n  }\n\n  setBlending (value: boolean): void {\n    if (this.blending !== value) {\n      this.blending = value;\n    }\n  }\n\n  setBlendFunctionParameters (value: [blendSrc: GLenum, blendDst: GLenum, blendSrcAlpha: GLenum, blendDstAlpha: GLenum]): void {\n    const [blendSrc, blendDst, blendSrcAlpha, blendDstAlpha] = value;\n\n    if (\n      this.blendFunctionParameters[0] === blendSrc &&\n      this.blendFunctionParameters[1] === blendDst &&\n      this.blendFunctionParameters[2] === blendSrcAlpha &&\n      this.blendFunctionParameters[3] === blendDstAlpha\n    ) {\n      return;\n    }\n\n    this.blendFunctionParameters[0] = blendSrc;\n    this.blendFunctionParameters[1] = blendDst;\n    this.blendFunctionParameters[2] = blendSrcAlpha;\n    this.blendFunctionParameters[3] = blendDstAlpha;\n\n  }\n\n  setBlendEquationParameters (value: [rgb: GLenum, alpha: GLenum]): void {\n    const [rgb, alpha] = value;\n\n    if (this.blendEquationParameters[0] === rgb && this.blendEquationParameters[1] === alpha) {\n      return;\n    }\n\n    this.blendEquationParameters[0] = rgb;\n    this.blendEquationParameters[1] = alpha;\n  }\n\n  setDepthTest (value: boolean) {\n    if (this.depthTest === value) {\n      return;\n    }\n\n    this.depthTest = value;\n  }\n\n  setDepthMask (value: boolean) {\n    if (this.depthMask === value) {\n      return;\n    }\n\n    this.depthMask = value;\n  }\n\n  setDepthRange (value: [zNear: GLenum, zFar: GLenum]) {\n    if (this.depthRange[0] === value[0] && this.depthRange[1] === value[1]) {\n      return;\n    }\n\n    this.depthRange[0] = value[0];\n    this.depthRange[1] = value[1];\n  }\n\n  setDepthFunc (value: GLenum) {\n    if (this.depthFunc === value) {\n      return;\n    }\n\n    this.depthFunc = value;\n  }\n\n  setPolygonOffsetFill (value: boolean) {\n    if (this.polygonOffsetFill === value) {\n      return;\n    }\n\n    this.polygonOffsetFill = value;\n  }\n\n  setPolygonOffset (value: [factor: GLenum, units: GLenum]) {\n    if (this.polygonOffset[0] === value[0] && this.polygonOffset[1] === value[1]) {\n      return;\n    }\n\n    this.polygonOffset[0] = value[0];\n    this.polygonOffset[1] = value[1];\n  }\n\n  setSampleAlphaToCoverage (value: boolean) {\n    if (this.sampleAlphaToCoverage === value) {\n      return;\n    }\n\n    this.sampleAlphaToCoverage = value;\n  }\n\n  setColorMask (colorMask: boolean): void {\n    this.colorMask[0] = colorMask;\n    this.colorMask[1] = colorMask;\n    this.colorMask[2] = colorMask;\n    this.colorMask[3] = colorMask;\n  }\n\n  setStencilTest (value: boolean) {\n    if (this.stencilTest === value) {\n      return;\n    }\n\n    this.stencilTest = value;\n  }\n\n  setStencilMask (value: [front: GLenum, back: GLenum]) {\n    if (this.stencilMask[0] === value[0] && this.stencilMask[1] === value[1]) {\n      return;\n    }\n\n    this.stencilMask[0] = value[0];\n    this.stencilMask[1] = value[1];\n  }\n\n  setStencilRef (value: [front: GLenum, back: GLenum]) {\n    if (this.stencilRef[0] === value[0] && this.stencilRef[1] === value[1]) {\n      return;\n    }\n\n    this.stencilRef[0] = value[0];\n    this.stencilRef[1] = value[1];\n  }\n\n  setStencilFunc (value: [front: GLenum, back: GLenum]) {\n    if (this.stencilFunc[0] === value[0] && this.stencilFunc[1] === value[1]) {\n      return;\n    }\n\n    this.stencilFunc[0] = value[0];\n    this.stencilFunc[1] = value[1];\n  }\n\n  setStencilOpFail (value: [front: GLenum, back: GLenum]) {\n    if (this.stencilOpFail[0] === value[0] && this.stencilOpFail[1] === value[1]) {\n      return;\n    }\n\n    this.stencilOpFail[0] = value[0];\n    this.stencilOpFail[1] = value[1];\n  }\n\n  setStencilOpZFail (value: [front: GLenum, back: GLenum]) {\n    if (this.stencilOpZFail[0] === value[0] && this.stencilOpZFail[1] === value[1]) {\n      return;\n    }\n\n    this.stencilOpZFail[0] = value[0];\n    this.stencilOpZFail[1] = value[1];\n  }\n\n  setStencilOpZPass (value: [front: GLenum, back: GLenum]) {\n    if (this.stencilOpZPass[0] === value[0] && this.stencilOpZPass[1] === value[1]) {\n      return;\n    }\n\n    this.stencilOpZPass[0] = value[0];\n    this.stencilOpZPass[1] = value[1];\n  }\n\n  setCulling (value: boolean) {\n    if (this.culling === value) {\n      return;\n    }\n    this.culling = value;\n  }\n\n  setFrontFace (value: GLenum) {\n    if (this.frontFace === value) {\n      return;\n    }\n    this.frontFace = value;\n  }\n\n  setCullFace (value: GLenum) {\n    if (this.cullFace === value) {\n      return;\n    }\n    this.cullFace = value;\n  }\n\n  reset (): void {\n    this.blending = false;\n    this.blendColor = [0, 0, 0, 0];\n    this.blendFunctionParameters = [glContext.ONE, glContext.ONE_MINUS_SRC_ALPHA, glContext.ONE, glContext.ONE_MINUS_SRC_ALPHA];\n    this.blendEquationParameters = [glContext.FUNC_ADD, glContext.FUNC_ADD];\n    this.depthTest = true;\n    this.depthMask = true;\n    this.depthRange = [0, 1];\n    this.depthFunc = glContext.LESS;\n    this.polygonOffset = [0, 0];\n    this.polygonOffsetFill = false;\n    this.sampleAlphaToCoverage = false;\n    this.colorMask = [true, true, true, true];\n    this.stencilTest = false;\n    this.stencilMask = [0xFF, 0xFF];\n    this.stencilRef = [0, 0];\n    this.stencilFunc = [glContext.ALWAYS, glContext.ALWAYS];\n    this.stencilOpFail = [glContext.KEEP, glContext.KEEP];\n    this.stencilOpZFail = [glContext.KEEP, glContext.KEEP];\n    this.stencilOpZPass = [glContext.KEEP, glContext.KEEP];\n    this.culling = false;\n    this.frontFace = glContext.CCW;\n    this.cullFace = glContext.FRONT;\n  }\n\n  apply (engine: GLEngine) {\n    engine.toggle(glContext.SAMPLE_ALPHA_TO_COVERAGE, this.sampleAlphaToCoverage);\n    engine.toggle(glContext.BLEND, this.blending);\n    engine.toggle(glContext.DEPTH_TEST, this.depthTest);\n    engine.toggle(glContext.STENCIL_TEST, this.stencilTest);\n    engine.toggle(glContext.CULL_FACE, this.culling);\n    engine.toggle(glContext.POLYGON_OFFSET_FILL, this.polygonOffsetFill);\n\n    if (this.stencilTest) {\n      //stencil\n      engine.stencilMaskSeparate(glContext.BACK, this.stencilMask[1]);\n      engine.stencilMaskSeparate(glContext.FRONT, this.stencilMask[0]);\n      engine.stencilFuncSeparate(glContext.BACK, this.stencilFunc[0], this.stencilRef[0], this.stencilMask[0]);\n      engine.stencilFuncSeparate(glContext.FRONT, this.stencilFunc[1], this.stencilRef[1], this.stencilMask[1]);\n      engine.stencilOpSeparate(glContext.BACK, this.stencilOpFail[0], this.stencilOpZFail[0], this.stencilOpZPass[0]);\n      engine.stencilOpSeparate(glContext.FRONT, this.stencilOpFail[1], this.stencilOpZFail[1], this.stencilOpZPass[1]);\n    }\n\n    if (this.blending) {\n      const {\n        blendColor,\n        blendEquationParameters,\n        blendFunctionParameters,\n      } = this;\n\n      engine.blendColor(blendColor[0], blendColor[1], blendColor[2], blendColor[3]);\n      engine.blendEquationSeparate(blendEquationParameters[0], blendEquationParameters[1]);\n      engine.blendFuncSeparate(blendFunctionParameters[0], blendFunctionParameters[1], blendFunctionParameters[2], blendFunctionParameters[3]);\n    }\n\n    //color depth\n    engine.colorMask(this.colorMask[0], this.colorMask[1], this.colorMask[2], this.colorMask[3]);\n\n    if (this.depthTest) {\n      engine.depthMask(this.depthMask);\n      engine.depthFunc(this.depthFunc);\n      engine.depthRange(this.depthRange[0], this.depthRange[1]);\n    }\n\n    if (this.culling) {\n      //face\n      engine.cullFace(this.cullFace);\n      engine.frontFace(this.frontFace);\n    }\n\n    if (this.polygonOffsetFill) {\n      engine.polygonOffset(this.polygonOffset[0], this.polygonOffset[1]);\n    }\n  }\n}\n","import type {\n  Engine, GlobalUniforms, MaterialProps,\n  Renderer, Texture, UndefinedAble,\n} from '@galacean/effects-core';\nimport {\n  spec, Material, Shader, assertExist, generateGUID, isFunction, logger,\n  math, throwDestroyedError, glContext,\n} from '@galacean/effects-core';\nimport type { GLEngine } from './gl-engine';\nimport { GLMaterialState } from './gl-material-state';\nimport type { GLShaderVariant } from './gl-shader';\nimport type { GLTexture } from './gl-texture';\n\ntype Color = math.Color;\ntype Vector2 = math.Vector2;\ntype Vector3 = math.Vector3;\ntype Vector4 = math.Vector4;\ntype Matrix3 = math.Matrix3;\ntype Matrix4 = math.Matrix4;\ntype Quaternion = math.Quaternion;\n\nconst { Vector4, Matrix4 } = math;\n\nexport class GLMaterial extends Material {\n  // material存放的uniform数据。\n  private floats: Record<string, number> = {};\n  private ints: Record<string, number> = {};\n  private vector2s: Record<string, Vector2> = {};\n  private vector3s: Record<string, Vector3> = {};\n  private vector4s: Record<string, Vector4> = {};\n  private colors: Record<string, Color> = {};\n  private quaternions: Record<string, Quaternion> = {};\n  private matrices: Record<string, Matrix4> = {};\n  private matrice3s: Record<string, Matrix3> = {};\n  private textures: Record<string, Texture> = {};\n  private floatArrays: Record<string, number[]> = {};\n  private vector4Arrays: Record<string, number[]> = {};\n  private matrixArrays: Record<string, number[]> = {};\n\n  private samplers: string[] = [];  // material存放的sampler名称。\n  private uniforms: string[] = [];  // material存放的uniform名称（不包括sampler）。\n\n  private uniformDirty = true;\n  private macrosDirty = true;\n  private glMaterialState = new GLMaterialState();\n\n  constructor (\n    engine: Engine,\n    props?: MaterialProps,\n  ) {\n    super(engine, props);\n    if (props) {\n      this.shader = new Shader(engine);\n      this.shader.shaderData = {\n        ...props.shader,\n        id: generateGUID(),\n        dataType: spec.DataType.Shader,\n      };\n    }\n  }\n\n  override get blending () {\n    return this.glMaterialState.blending;\n  }\n  override set blending (blending: UndefinedAble<boolean>) {\n    blending !== undefined && this.glMaterialState.setBlending(blending);\n  }\n\n  override get blendColor () {\n    return this.glMaterialState.blendColor;\n  }\n  override set blendColor (color: UndefinedAble<[r: number, g: number, b: number, a: number]>) {\n    color && this.glMaterialState.setBlendColor(color);\n  }\n\n  override get blendFunction () {\n    return this.glMaterialState.blendFunctionParameters;\n  }\n  override set blendFunction (func: UndefinedAble<[blendSrc: number, blendDst: number, blendSrcAlpha: number, blendDstAlpha: number]>) {\n    func && this.glMaterialState.setBlendFunctionParameters(func);\n  }\n\n  override get blendEquation () {\n    return this.glMaterialState.blendEquationParameters;\n  }\n  override set blendEquation (equation: UndefinedAble<[rgb: number, alpha: number]>) {\n    equation && this.glMaterialState.setBlendEquationParameters(equation);\n  }\n\n  override get depthTest () {\n    return this.glMaterialState.depthTest;\n  }\n  override set depthTest (value: UndefinedAble<boolean>) {\n    value !== undefined && this.glMaterialState.setDepthTest(value);\n  }\n\n  override get depthMask () {\n    return this.glMaterialState.depthMask;\n  }\n  override set depthMask (value: UndefinedAble<boolean>) {\n    value !== undefined && this.glMaterialState.setDepthMask(value);\n  }\n\n  override get depthRange () {\n    return this.glMaterialState.depthRange;\n  }\n  override set depthRange (value: UndefinedAble<[number, number]>) {\n    value && this.glMaterialState.setDepthRange(value);\n  }\n\n  override get depthFunc () {\n    return this.glMaterialState.depthFunc;\n  }\n  override set depthFunc (value: UndefinedAble<number>) {\n    value !== undefined && this.glMaterialState.setDepthFunc(value);\n  }\n\n  override get polygonOffsetFill () {\n    return this.glMaterialState.polygonOffsetFill;\n  }\n  override set polygonOffsetFill (value: UndefinedAble<boolean>) {\n    value !== undefined && this.glMaterialState.setPolygonOffsetFill(value);\n  }\n\n  override get polygonOffset () {\n    return this.glMaterialState.polygonOffset;\n  }\n  override set polygonOffset (value: UndefinedAble<[number, number]>) {\n    value && this.glMaterialState.setPolygonOffset(value);\n  }\n\n  override get sampleAlphaToCoverage () {\n    return this.glMaterialState.sampleAlphaToCoverage;\n  }\n  override set sampleAlphaToCoverage (value: UndefinedAble<boolean>) {\n    value !== undefined && this.glMaterialState.setSampleAlphaToCoverage(value);\n  }\n\n  override get colorMask () {\n    return this.glMaterialState.colorMask[0];\n  }\n  override set colorMask (value: boolean) {\n    this.glMaterialState.setColorMask(value);\n  }\n\n  override get stencilTest () {\n    return this.glMaterialState.stencilTest;\n  }\n  override set stencilTest (value: UndefinedAble<boolean>) {\n    value !== undefined && this.glMaterialState.setStencilTest(value);\n  }\n\n  override get stencilMask () {\n    return this.glMaterialState.stencilMask;\n  }\n  override set stencilMask (value: UndefinedAble<[number, number]>) {\n    value && this.glMaterialState.setStencilMask(value);\n  }\n\n  override get stencilRef () {\n    return this.glMaterialState.stencilRef;\n  }\n  override set stencilRef (value: UndefinedAble<[number, number]>) {\n    value && this.glMaterialState.setStencilRef(value);\n  }\n\n  override get stencilFunc () {\n    return this.glMaterialState.stencilFunc;\n  }\n  override set stencilFunc (value: UndefinedAble<[number, number]>) {\n    value && this.glMaterialState.setStencilFunc(value);\n  }\n\n  override get stencilOpFail () {\n    return this.glMaterialState.stencilOpFail;\n  }\n  override set stencilOpFail (value: UndefinedAble<[number, number]>) {\n    value && this.glMaterialState.setStencilOpFail(value);\n  }\n\n  override get stencilOpZFail () {\n    return this.glMaterialState.stencilOpZFail;\n  }\n  override set stencilOpZFail (value: UndefinedAble<[number, number]>) {\n    value && this.glMaterialState.setStencilOpZFail(value);\n  }\n\n  override get stencilOpZPass () {\n    return this.glMaterialState.stencilOpZPass;\n  }\n  override set stencilOpZPass (value: UndefinedAble<[number, number]>) {\n    value && this.glMaterialState.setStencilOpZPass(value);\n  }\n\n  override get culling () {\n    return this.glMaterialState.culling;\n  }\n  override set culling (value: UndefinedAble<boolean>) {\n    value !== undefined && this.glMaterialState.setCulling(value);\n  }\n\n  override get frontFace () {\n    return this.glMaterialState.frontFace;\n  }\n  override set frontFace (value: UndefinedAble<number>) {\n    value !== undefined && this.glMaterialState.setFrontFace(value);\n  }\n\n  override get cullFace () {\n    return this.glMaterialState.cullFace;\n  }\n  override set cullFace (value: UndefinedAble<number>) {\n    value !== undefined && this.glMaterialState.setCullFace(value);\n  }\n\n  override enableMacro (keyword: string, value?: boolean | number): void {\n    if (!this.isMacroEnabled(keyword) || this.enabledMacros[keyword] !== value) {\n      this.enabledMacros[keyword] = value ?? true;\n      this.macrosDirty = true;\n    }\n  }\n\n  override disableMacro (keyword: string): void {\n    if (this.isMacroEnabled(keyword)) {\n      delete this.enabledMacros[keyword];\n      this.macrosDirty = true;\n    }\n  }\n\n  override isMacroEnabled (keyword: string): boolean {\n    return this.enabledMacros[keyword] !== undefined;\n  }\n\n  get isDestroyed (): boolean {\n    return this.destroyed;\n  }\n\n  /**shader和texture的GPU资源初始化。 */\n  override initialize (): void {\n    const engine = this.engine;\n\n    this.createShaderVariant();\n    (this.shaderVariant as GLShaderVariant).initialize();\n    if (this.initialized) {\n      return;\n    }\n    engine.addMaterial(this);\n    Object.keys(this.textures).forEach(key => {\n      const texture = this.textures[key];\n\n      if (!isFunction(texture.initialize)) {\n        logger.error(`Failed to initialize texture: ${JSON.stringify(texture)}. Ensure the texture conforms to the expected format.`);\n\n        return;\n      }\n      texture.initialize();\n    });\n    this.initialized = true;\n  }\n\n  override createShaderVariant () {\n    if (this.shaderDirty || this.macrosDirty) {\n      this.shaderVariant = this.shader.createVariant(this.enabledMacros);\n      this.macrosDirty = false;\n      this.shaderDirty = false;\n      this.uniformDirty = true;\n    }\n  }\n\n  setupStates (engine: GLEngine) {\n    this.glMaterialState.apply(engine);\n  }\n\n  override use (renderer: Renderer, globalUniforms?: GlobalUniforms) {\n    const engine = renderer.engine as GLEngine;\n    const shaderVariant = this.shaderVariant as GLShaderVariant;\n\n    if (!shaderVariant.program) {\n      this.engine?.renderErrors.add(new Error('Shader program is not initialized.'));\n\n      return;\n    }\n    shaderVariant.program.bind();\n    this.setupStates(engine);\n    let name: string;\n\n    if (globalUniforms) {\n      // 加入全局 uniform 名称\n      for (name of globalUniforms.uniforms) {\n        this.checkUniform(name);\n      }\n      for (name of globalUniforms.samplers) {\n        if (!this.samplers.includes(name)) {\n          this.samplers.push(name);\n          this.uniformDirty = true;\n        }\n      }\n    }\n\n    // 更新 cached uniform location\n    if (this.uniformDirty) {\n      shaderVariant.fillShaderInformation(this.uniforms, this.samplers);\n      this.uniformDirty = false;\n    }\n\n    if (globalUniforms) {\n      // 设置全局 uniform\n      for (name in globalUniforms.floats) {\n        shaderVariant.setFloat(name, globalUniforms.floats[name]);\n      }\n      for (name in globalUniforms.ints) {\n        shaderVariant.setInt(name, globalUniforms.ints[name]);\n      }\n      for (name in globalUniforms.vector4s) {\n        shaderVariant.setVector4(name, globalUniforms.vector4s[name]);\n      }\n      for (name in globalUniforms.vector3s) {\n        shaderVariant.setVector3(name, globalUniforms.vector3s[name]);\n      }\n      for (name in globalUniforms.matrices) {\n        shaderVariant.setMatrix(name, globalUniforms.matrices[name]);\n      }\n    }\n\n    // 检查贴图数据是否初始化。\n    for (name in this.textures) {\n      if (!(this.textures[name] as GLTexture).textureBuffer) {\n        this.textures[name].initialize();\n      }\n    }\n    for (name in this.floats) {\n      shaderVariant.setFloat(name, this.floats[name]);\n    }\n    for (name in this.ints) {\n      shaderVariant.setInt(name, this.ints[name]);\n    }\n    for (name in this.floatArrays) {\n      shaderVariant.setFloats(name, this.floatArrays[name]);\n    }\n    for (name in this.textures) {\n      shaderVariant.setTexture(name, this.textures[name]);\n    }\n    for (name in this.vector2s) {\n      shaderVariant.setVector2(name, this.vector2s[name]);\n    }\n    for (name in this.vector3s) {\n      shaderVariant.setVector3(name, this.vector3s[name]);\n    }\n    for (name in this.vector4s) {\n      shaderVariant.setVector4(name, this.vector4s[name]);\n    }\n    for (name in this.colors) {\n      shaderVariant.setColor(name, this.colors[name]);\n    }\n    for (name in this.quaternions) {\n      shaderVariant.setQuaternion(name, this.quaternions[name]);\n    }\n    for (name in this.matrices) {\n      shaderVariant.setMatrix(name, this.matrices[name]);\n    }\n    for (name in this.matrice3s) {\n      shaderVariant.setMatrix3(name, this.matrice3s[name]);\n    }\n    for (name in this.vector4Arrays) {\n      shaderVariant.setVector4Array(name, this.vector4Arrays[name]);\n    }\n    for (name in this.matrixArrays) {\n      shaderVariant.setMatrixArray(name, this.matrixArrays[name]);\n    }\n  }\n\n  getFloat (name: string): number | null {\n    return this.floats[name];\n  }\n  setFloat (name: string, value: number) {\n    this.checkUniform(name);\n    this.floats[name] = value;\n  }\n\n  getInt (name: string): number | null {\n    return this.ints[name];\n  }\n  setInt (name: string, value: number) {\n    this.checkUniform(name);\n    this.ints[name] = value;\n  }\n\n  getFloats (name: string): number[] | null {\n    return this.floatArrays[name];\n  }\n  setFloats (name: string, value: number[]) {\n    this.checkUniform(name);\n    this.floatArrays[name] = value;\n  }\n\n  getVector2 (name: string): Vector2 | null {\n    return this.vector2s[name];\n  }\n  setVector2 (name: string, value: Vector2): void {\n    this.checkUniform(name);\n    this.vector2s[name] = value;\n  }\n\n  getVector3 (name: string): Vector3 | null {\n    return this.vector3s[name];\n  }\n  setVector3 (name: string, value: Vector3): void {\n    this.checkUniform(name);\n    this.vector3s[name] = value;\n  }\n\n  getVector4 (name: string): Vector4 | null {\n    return this.vector4s[name];\n  }\n  setVector4 (name: string, value: Vector4): void {\n    this.checkUniform(name);\n    this.vector4s[name] = value;\n  }\n\n  getColor (name: string): Color | null {\n    return this.colors[name];\n  }\n\n  setColor (name: string, value: Color): void {\n    this.checkUniform(name);\n    this.colors[name] = value;\n  }\n\n  getQuaternion (name: string): Quaternion | null {\n    return this.quaternions[name];\n  }\n  setQuaternion (name: string, value: Quaternion): void {\n    this.checkUniform(name);\n    this.quaternions[name] = value;\n  }\n\n  getMatrix (name: string): Matrix4 | null {\n    return this.matrices[name];\n  }\n  setMatrix (name: string, value: Matrix4): void {\n    this.checkUniform(name);\n    this.matrices[name] = value;\n  }\n  setMatrix3 (name: string, value: Matrix3): void {\n    this.checkUniform(name);\n    this.matrice3s[name] = value;\n  }\n\n  getVector4Array (name: string): number[] {\n    return this.vector4Arrays[name];\n  }\n  setVector4Array (name: string, array: Vector4[]): void {\n    this.checkUniform(name);\n    this.vector4Arrays[name] = [];\n    for (const v of array) {\n      this.vector4Arrays[name].push(v.x, v.y, v.z, v.w);\n    }\n  }\n\n  getMatrixArray (name: string): number[] | null {\n    return this.matrixArrays[name];\n  }\n  setMatrixArray (name: string, array: Matrix4[]): void {\n    this.checkUniform(name);\n    this.matrixArrays[name] = [];\n    for (const m of array) {\n      for (let i = 0; i < 16; i++) {\n        this.matrixArrays[name].push(m.elements[i]);\n      }\n    }\n  }\n  setMatrixNumberArray (name: string, array: number[]): void {\n    this.checkUniform(name);\n    this.matrixArrays[name] = array;\n  }\n\n  getTexture (name: string): Texture | null {\n    return this.textures[name];\n  }\n  setTexture (name: string, texture: Texture) {\n    if (!this.samplers.includes(name)) {\n      this.samplers.push(name);\n      this.uniformDirty = true;\n    }\n    this.textures[name] = texture;\n  }\n\n  hasUniform (name: string): boolean {\n    return this.uniforms.includes(name) || this.samplers.includes(name);\n  }\n\n  clone (props?: MaterialProps): Material {\n    const newProps = props ? props : this.props;\n    const engine = this.engine;\n\n    assertExist(engine);\n    const clonedMaterial = new GLMaterial(engine, newProps);\n\n    // TODO: 更换 Object.assign，低端设备兼容问题\n    clonedMaterial.glMaterialState = Object.assign(new GLMaterialState(), clonedMaterial.glMaterialState);\n    clonedMaterial.floats = this.floats;\n    clonedMaterial.ints = this.ints;\n    clonedMaterial.vector2s = this.vector2s;\n    clonedMaterial.vector3s = this.vector3s;\n    clonedMaterial.vector4s = this.vector4s;\n    clonedMaterial.colors = this.colors;\n    clonedMaterial.quaternions = this.quaternions;\n    clonedMaterial.matrices = this.matrices;\n    clonedMaterial.textures = this.textures;\n    clonedMaterial.floatArrays = this.floatArrays;\n    clonedMaterial.vector4Arrays = this.vector4Arrays;\n    clonedMaterial.matrixArrays = this.matrixArrays;\n    clonedMaterial.samplers = this.samplers;\n    clonedMaterial.uniforms = this.uniforms;\n    clonedMaterial.uniformDirty = true;\n\n    return clonedMaterial;\n  }\n\n  override fromData (data: spec.MaterialData): void {\n    super.fromData(data);\n\n    this.uniforms = [];\n    this.samplers = [];\n    this.textures = {};\n    this.floats = {};\n    this.ints = {};\n    this.floatArrays = {};\n    this.vector4s = {};\n\n    const propertiesData = {\n      ...data,\n    };\n\n    if (data.stringTags['RenderType'] !== undefined) {\n      this.blending = data.stringTags['RenderType'] === spec.RenderType.Transparent;\n    }\n    if (data.floats['ZTest'] !== undefined) {\n      this.depthTest = data.floats['ZTest'] !== 0;\n    }\n    if (data.floats['ZWrite'] !== undefined) {\n      this.depthMask = data.floats['ZWrite'] !== 0;\n    }\n\n    const renderFace = data.stringTags['RenderFace'];\n\n    if (renderFace === spec.RenderFace.Front) {\n      this.culling = true;\n      this.cullFace = glContext.BACK;\n    } else if (renderFace === spec.RenderFace.Back) {\n      this.culling = true;\n      this.cullFace = glContext.FRONT;\n    } else {\n      this.culling = false;\n    }\n\n    let name: string;\n\n    for (name in propertiesData.floats) {\n      this.setFloat(name, propertiesData.floats[name]);\n    }\n    for (name in propertiesData.ints) {\n      this.setInt(name, propertiesData.ints[name]);\n    }\n    for (name in propertiesData.vector4s) {\n      const vector4Value = propertiesData.vector4s[name];\n\n      this.setVector4(name, new math.Vector4(vector4Value.x, vector4Value.y, vector4Value.z, vector4Value.w));\n    }\n    for (name in propertiesData.colors) {\n      const colorValue = propertiesData.colors[name];\n\n      this.setColor(name, new math.Color(colorValue.r, colorValue.g, colorValue.b, colorValue.a));\n    }\n    for (name in propertiesData.textures) {\n      const textureProperties = propertiesData.textures[name];\n\n      const texture = this.engine.findObject<Texture>(textureProperties.texture);\n\n      // TODO 纹理通过 id 加入场景数据\n      this.setTexture(name, texture);\n      const offset = textureProperties.offset;\n      const scale = textureProperties.scale;\n\n      if (offset && scale) {\n        this.setVector4(name + '_ST', new Vector4(scale.x, scale.y, offset.x, offset.y));\n      }\n    }\n\n    if (data.shader) {\n      const shader = this.engine.findObject<Shader>(data.shader);\n\n      if (shader) {\n        this.shader = shader;\n        this.shaderSource = shader.shaderData;\n      }\n    }\n    this.stringTags = data.stringTags ?? {};\n    this.initialized = false;\n  }\n\n  /**\n   * @since 2.0.0\n   * @param sceneData\n   * @returns\n   */\n  override toData (): spec.MaterialData {\n    // @ts-expect-error\n    const materialData: spec.MaterialData = this.defination;\n\n    if (this.shader) {\n      // @ts-expect-error\n      materialData.shader = this.shader;\n    }\n    materialData.floats = {};\n    materialData.ints = {};\n    materialData.vector4s = {};\n    materialData.colors = {};\n    materialData.textures = {};\n    materialData.dataType = spec.DataType.Material;\n    materialData.stringTags = this.stringTags;\n\n    for (const name in this.floats) {\n      materialData.floats[name] = this.floats[name];\n    }\n    for (const name in this.ints) {\n      materialData.ints[name] = this.ints[name];\n    }\n    for (const name in this.vector4s) {\n      materialData.vector4s[name] = this.vector4s[name];\n    }\n    for (const name in this.colors) {\n      materialData.colors[name] = this.colors[name];\n    }\n    for (const name in this.textures) {\n      if (!materialData.textures[name]) {\n        materialData.textures[name] = {\n          texture: this.textures[name],\n        };\n      }\n      const textureProperties = materialData.textures[name];\n      const scaleOffset = this.getVector4(name + '_ST');\n\n      if (scaleOffset) {\n        textureProperties.scale = { x: scaleOffset.x, y: scaleOffset.y };\n        textureProperties.offset = { x: scaleOffset.z, y: scaleOffset.w };\n        delete materialData.vector4s[name + '_ST'];\n      }\n    }\n\n    return materialData;\n  }\n\n  override cloneUniforms (sourceMaterial: Material): void {\n    const material = sourceMaterial as GLMaterial;\n    let name: string;\n\n    for (name in material.floats) {\n      this.setFloat(name, material.floats[name]);\n    }\n    for (name in material.ints) {\n      this.setInt(name, material.ints[name]);\n    }\n    for (name in material.floatArrays) {\n      this.setFloats(name, material.floatArrays[name]);\n    }\n    for (name in material.textures) {\n      this.setTexture(name, material.textures[name]);\n    }\n    for (name in material.vector2s) {\n      this.setVector2(name, material.vector2s[name]);\n    }\n    for (name in material.vector3s) {\n      this.setVector3(name, material.vector3s[name]);\n    }\n    for (name in material.vector4s) {\n      this.setVector4(name, material.vector4s[name]);\n    }\n    for (name in material.colors) {\n      this.setColor(name, material.colors[name]);\n    }\n    for (name in material.quaternions) {\n      this.setQuaternion(name, material.quaternions[name]);\n    }\n    for (name in material.matrices) {\n      this.setMatrix(name, material.matrices[name]);\n    }\n    for (name in material.vector4Arrays) {\n      const vec4Array: Vector4[] = [];\n\n      for (let i = 0; i < material.vector4Arrays[name].length; i += 4) {\n        vec4Array.push(new Vector4(\n          material.vector4Arrays[name][i],\n          material.vector4Arrays[name][i + 1],\n          material.vector4Arrays[name][i + 2],\n          material.vector4Arrays[name][i + 3],\n        ));\n      }\n      this.setVector4Array(name, vec4Array);\n    }\n    for (name in material.matrixArrays) {\n      const mat4Array: Matrix4[] = [];\n\n      for (let i = 0; i < material.matrixArrays[name].length; i += 16) {\n        const matrix = Matrix4.fromIdentity();\n\n        for (let j = 0; j < 16; j++) {\n          matrix.elements[j] = (material.matrixArrays[name][i + j]);\n        }\n        mat4Array.push(matrix);\n      }\n      this.setMatrixArray(name, mat4Array);\n    }\n  }\n\n  private checkUniform (uniformName: string): void {\n    if (!this.uniforms.includes(uniformName)) {\n      this.uniforms.push(uniformName);\n      this.uniformDirty = true;\n    }\n  }\n\n  override dispose () {\n    if (this.destroyed) {\n      return;\n    }\n    this.shaderVariant?.dispose();\n    this.textures = {};\n\n    // @ts-expect-error\n    this.shaderSource = null;\n    this.floats = {};\n    this.ints = {};\n    this.vector2s = {};\n    this.vector3s = {};\n    this.vector4s = {};\n    this.quaternions = {};\n    this.matrices = {};\n    this.matrice3s = {};\n    this.textures = {};\n    this.floatArrays = {};\n    this.vector4Arrays = {};\n    this.matrixArrays = {};\n    this.samplers = [];\n    this.uniforms = [];\n    this.initialize = throwDestroyedError as unknown as () => GLMaterial;\n    this.destroyed = true;\n\n    if (this.engine !== undefined) {\n      this.engine.removeMaterial(this);\n    }\n\n    super.dispose();\n  }\n}\n","import type { RenderbufferProps } from '@galacean/effects-core';\nimport { throwDestroyedError, Renderbuffer, logger } from '@galacean/effects-core';\nimport type { GLRenderer } from './gl-renderer';\nimport type { GLEngine } from './gl-engine';\n\nexport class GLRenderbuffer extends Renderbuffer {\n  buffer: WebGLRenderbuffer | null;\n\n  private initialized = false;\n  private renderer?: GLRenderer | null;\n\n  constructor (\n    props: RenderbufferProps,\n    renderer?: GLRenderer,\n  ) {\n    super(props);\n\n    if (renderer !== undefined) {\n      this.initialize(renderer);\n    }\n  }\n\n  initialize (renderer: GLRenderer) {\n    if (this.initialized) {\n      return;\n    }\n\n    this.initialized = true;\n    this.renderer = renderer;\n    this.buffer = renderer.createGLRenderbuffer(this) as WebGLRenderbuffer;\n  }\n\n  setSize (width: number, height: number) {\n    if (!this.initialized) {\n      logger.error('Can\\'t set size for uninitialized render buffer.');\n\n      return;\n    }\n\n    if (!this.renderer) {\n      return;\n    }\n\n    if (width !== this.size[0] || height !== this.size[1]) {\n      const { gl, engine: state } = this.renderer;\n\n      (state as GLEngine).bindRenderbuffer(gl.RENDERBUFFER, this.buffer);\n      if (width && height) {\n        gl.renderbufferStorage(gl.RENDERBUFFER, this.format, this.size[0] = width, this.size[1] = height);\n      } else {\n        logger.error(`Invalid render buffer size: ${width}x${height}.`);\n      }\n    }\n  }\n\n  dispose () {\n    if (this.renderer) {\n      this.renderer.deleteGLRenderbuffer(this);\n      this.renderer = null;\n      this.buffer = null;\n    }\n    this.destroyed = true;\n    this.initialize = throwDestroyedError;\n  }\n}\n","import type {\n  Disposable, FramebufferProps, Renderbuffer, Renderer, RenderPassStoreAction, Texture,\n  Texture2DSourceOptionsFramebuffer,\n} from '@galacean/effects-core';\nimport {\n  isWebGL2, addItem, Framebuffer, glContext, RenderPassAttachmentStorageType,\n  RenderPassDestroyAttachmentType, TextureSourceType, TextureStoreAction,\n} from '@galacean/effects-core';\nimport { GLRenderbuffer } from './gl-renderbuffer';\nimport type { GLRenderer } from './gl-renderer';\nimport { GLTexture } from './gl-texture';\nimport type { GLEngine } from './gl-engine';\n\nlet seed = 1;\n\nexport class GLFramebuffer extends Framebuffer implements Disposable {\n  storeInvalidAttachments?: GLenum[]; // Pass渲染结束是否保留attachment的渲染内容，不保留可以提升部分性能。\n  depthStencilRenderbuffer?: GLRenderbuffer;\n  depthTexture?: GLTexture;\n  stencilTexture?: GLTexture;\n  colorTextures: GLTexture[];\n  fbo?: WebGLFramebuffer;\n  engine: GLEngine;\n\n  readonly renderer: GLRenderer;\n\n  private readonly attachmentTextures: WebGLTexture[] = [];\n\n  constructor (\n    props: FramebufferProps,\n    renderer: Renderer,\n  ) {\n    super();\n    const {\n      depthStencilAttachment, viewport, storeAction,\n      name = `GLFramebuffer${seed++}`,\n    } = props;\n\n    this.renderer = renderer as GLRenderer;\n    this.engine = renderer.engine as GLEngine;\n    this.depthStencilStorageType = depthStencilAttachment?.storageType ?? RenderPassAttachmentStorageType.none;\n    this.viewport = viewport;\n    this.name = name;\n    this.storeAction = storeAction;\n    this.updateProps(props);\n  }\n\n  override get stencilStorage (): Renderbuffer | undefined {\n    const storageType = this.depthStencilStorageType;\n\n    if (storageType !== RenderPassAttachmentStorageType.depth_16_opaque) {\n      return this.depthStencilRenderbuffer;\n    }\n  }\n\n  override get depthStorage (): Renderbuffer | undefined {\n    if (this.depthStencilStorageType !== RenderPassAttachmentStorageType.stencil_8_opaque) {\n      return this.depthStencilRenderbuffer;\n    }\n  }\n\n  override getDepthTexture (): Texture | undefined {\n    return this.depthTexture;\n  }\n\n  override getStencilTexture (): Texture | undefined {\n    return this.stencilTexture;\n  }\n\n  override getColorTextures (): Texture[] {\n    return this.colorTextures;\n  }\n\n  private updateAttachmentTextures () {\n    const width = this.viewport[2];\n    const height = this.viewport[3];\n\n    this.attachmentTextures.length = 0;\n    this.colorTextures.forEach(tex => {\n      const data = { width, height, data: new Uint8Array(0) };\n\n      tex.initialize();\n      tex.update({ data });\n      addItem(this.attachmentTextures, tex.textureBuffer);\n    });\n\n    if (this.stencilTexture) {\n      addItem(this.attachmentTextures, this.stencilTexture.textureBuffer);\n    }\n\n    if (this.depthTexture) {\n      this.depthTexture.update({ data: { width, height, data: new Uint16Array(0) } });\n      addItem(this.attachmentTextures, this.depthTexture.textureBuffer);\n    }\n  }\n\n  private updateProps (props: FramebufferProps) {\n    const renderer = this.renderer;\n    const gpuCapability = this.engine.gpuCapability;\n    const depthStencilAttachment = props.depthStencilAttachment ?? { storageType: RenderPassAttachmentStorageType.none };\n    const willUseFbo = props.attachments.length > 0;\n    let separateDepthStencil = true;\n\n    this.externalStorage = false;\n\n    if (props.attachments.length > 1 && !gpuCapability.detail.drawBuffers) {\n      throw new Error('Multiple color attachments not support.');\n    }\n\n    const optDepthStencilTex: GLTexture | undefined = props.depthStencilAttachment?.texture as GLTexture;\n    const readableDepthStencilTextures = gpuCapability.detail.readableDepthStencilTextures;\n    const { storageType, storage } = depthStencilAttachment;\n\n    this.colorTextures = props.attachments.slice() as GLTexture[];\n\n    if (!willUseFbo && storageType !== RenderPassAttachmentStorageType.none) {\n      throw new Error('Use depth stencil attachment without color attachments.');\n    }\n    if (willUseFbo) {\n      this.fbo = renderer.createGLFramebuffer(this.name) as WebGLFramebuffer;\n    }\n\n    switch (storageType) {\n      case RenderPassAttachmentStorageType.depth_stencil_opaque:\n        if (storage) {\n          if (storage instanceof GLRenderbuffer) {\n            this.depthStencilRenderbuffer = storage;\n            this.externalStorage = true;\n          } else {\n            throw new Error('Invalid depth stencil attachment storage.');\n          }\n        } else {\n          this.depthStencilRenderbuffer = new GLRenderbuffer({\n            format: glContext.DEPTH_STENCIL,\n            attachment: glContext.DEPTH_STENCIL_ATTACHMENT,\n            storageType,\n          }, renderer);\n        }\n        separateDepthStencil = false;\n\n        break;\n      case RenderPassAttachmentStorageType.depth_16_opaque:\n        if (storage) {\n          if (storage instanceof GLRenderbuffer) {\n            this.depthStencilRenderbuffer = storage;\n            this.externalStorage = true;\n          } else {\n            throw new Error('Invalid depth attachment storage.');\n          }\n        } else {\n          this.depthStencilRenderbuffer = new GLRenderbuffer({\n            attachment: glContext.DEPTH_ATTACHMENT,\n            format: glContext.DEPTH_COMPONENT16,\n            storageType,\n          }, renderer);\n        }\n\n        break;\n      case RenderPassAttachmentStorageType.stencil_8_opaque:\n        if (storage) {\n          if (storage instanceof GLRenderbuffer) {\n            this.depthStencilRenderbuffer = storage;\n            this.externalStorage = true;\n          } else {\n            throw new Error('Invalid stencil attachment storage.');\n          }\n        } else {\n          this.depthStencilRenderbuffer = new GLRenderbuffer({\n            attachment: glContext.STENCIL_ATTACHMENT,\n            format: glContext.STENCIL_INDEX8,\n            storageType,\n          }, renderer);\n        }\n\n        break;\n      case RenderPassAttachmentStorageType.depth_16_texture:\n        if (!readableDepthStencilTextures) {\n          throw new Error('Depth texture is not support in framebuffer.');\n        }\n        this.depthTexture = optDepthStencilTex ?? new GLTexture(this.engine, {\n          sourceType: TextureSourceType.framebuffer,\n          format: glContext.DEPTH_COMPONENT,\n          internalFormat: gpuCapability.internalFormatDepth16,\n          type: glContext.UNSIGNED_SHORT,\n          name: `${this.name}##depthTex`,\n        });\n        this.depthTexture.initialize();\n\n        break;\n      case RenderPassAttachmentStorageType.depth_24_stencil_8_texture:\n        if (!readableDepthStencilTextures) {\n          throw new Error('Depth stencil texture is not support in framebuffer.');\n        }\n        this.depthTexture = this.stencilTexture = optDepthStencilTex ?? new GLTexture(this.engine, {\n          sourceType: TextureSourceType.framebuffer,\n          format: glContext.DEPTH_STENCIL,\n          internalFormat: gpuCapability.internalFormatDepth24_stencil8,\n          type: gpuCapability.UNSIGNED_INT_24_8,\n          name: `${this.name}##dpthStclTex`,\n        });\n        this.depthTexture.initialize();\n        separateDepthStencil = true;\n\n        break;\n    }\n\n    this.storeInvalidAttachments = this.getStoreAttachments(this.storeAction, separateDepthStencil);\n    this.updateAttachmentTextures();\n  }\n\n  private getStoreAttachments (\n    storeAction: RenderPassStoreAction,\n    separateDepthStencil: boolean,\n  ): GLenum[] | undefined {\n    const gl = this.renderer.gl as WebGL2RenderingContext;\n    const colorLen = this.colorTextures.length;\n\n    if (storeAction && isWebGL2(gl) && colorLen > 0) {\n      const attachments: GLenum[] = [];\n\n      if (storeAction.depthAction === TextureStoreAction.clear && this.depthStorage) {\n        addItem(attachments, separateDepthStencil ? gl.DEPTH_ATTACHMENT : gl.DEPTH_STENCIL_ATTACHMENT);\n      }\n      if (storeAction.stencilAction === TextureStoreAction.clear && this.stencilStorage) {\n        addItem(attachments, separateDepthStencil ? gl.STENCIL_ATTACHMENT : gl.DEPTH_STENCIL_ATTACHMENT);\n      }\n      if (storeAction.colorAction === TextureStoreAction.clear) {\n        for (let i = 0; i < colorLen; i++) {\n          addItem(attachments, (gl as unknown as Record<string, GLenum>)[`COLOR_ATTACHMENT${i}`]);\n        }\n      }\n\n      return attachments;\n    }\n  }\n\n  override unbind () {\n    const attachments = this.storeInvalidAttachments;\n\n    if (attachments?.length) {\n      const gl = this.renderer.gl;\n\n      if (isWebGL2(gl)) {\n        gl.invalidateFramebuffer(gl.FRAMEBUFFER, attachments);\n      }\n    }\n    (this.renderer.engine as GLEngine).bindSystemFramebuffer();\n  }\n\n  override bind () {\n    if (!this.fbo) {\n      return;\n    }\n\n    const gl = this.renderer.gl;\n    const state = this.renderer.engine as GLEngine;\n    const [x, y, width, height] = this.viewport;\n\n    state.bindFramebuffer(gl.FRAMEBUFFER, this.fbo);\n\n    // TODO 不在bind中设置viewport\n    state.viewport(x, y, width, height);\n    const whiteTexture = this.renderer.engine.whiteTexture as GLTexture;\n    const whiteWebGLTexture = whiteTexture.textureBuffer;\n\n    // in case frame texture loop\n    Object.keys(state.textureUnitDict).forEach(unit => {\n      const texture = state.textureUnitDict[unit];\n\n      if (\n        texture &&\n        texture !== whiteWebGLTexture &&\n        this.attachmentTextures.includes(texture)\n      ) {\n        state.activeTexture(+unit);\n        whiteTexture.bind();\n      }\n    });\n\n    // FIXME: 没有pipeline对象的临时方案\n    for (let i = 0; i < 4; i++) {\n      state.activeTexture(gl.TEXTURE0 + i);\n      whiteTexture.bind();\n    }\n\n    if (this.ready) {\n      return;\n    }\n\n    const { depthStencilRenderbuffer, depthTexture, stencilTexture } = this;\n\n    state.activeTexture(gl.TEXTURE0);\n    if (depthStencilRenderbuffer) {\n      depthStencilRenderbuffer.setSize(width, height);\n      gl.framebufferRenderbuffer(gl.FRAMEBUFFER, depthStencilRenderbuffer.attachment, gl.RENDERBUFFER, depthStencilRenderbuffer.buffer);\n    } else if (depthTexture) {\n      // 解决RenderPass在Clone深度贴图时width和height丢失的问题\n      (depthTexture.source as Texture2DSourceOptionsFramebuffer).data = { width, height };\n      depthTexture.update({ data: { width, height, data: new Uint16Array(0) } });\n      const attachment = depthTexture && stencilTexture ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;\n\n      gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, depthTexture.textureBuffer, 0);\n    }\n    this.resetColorTextures(this.colorTextures);\n    const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n\n    if (status !== gl.FRAMEBUFFER_COMPLETE) {\n      throw new Error(`Framebuffer failed. gl status=${status}, gl error=${gl.getError()}, gl isContextLost=${gl.isContextLost()}. width=${width}, height=${height}.`);\n    }\n\n    this.ready = true;\n  }\n\n  override resetColorTextures (colorTextures?: Texture[]) {\n    const colors = colorTextures as GLTexture[];\n    const gl = this.renderer.gl;\n    const gpuCapability = this.engine.gpuCapability;\n    const viewport = this.viewport;\n    const buffers: boolean[] = [];\n\n    if (colors) {\n      for (const texture of colors) {\n        texture.initialize();\n      }\n      this.colorTextures = colors.slice();\n    }\n    (this.renderer.engine as GLEngine).activeTexture(gl.TEXTURE0);\n\n    this.colorTextures.forEach((tex, index) => {\n      const width = viewport[2];\n      const height = viewport[3];\n      const data = { width, height, data: new Uint8Array(0) };\n\n      tex.update({ data });\n      gpuCapability.framebufferTexture2D(gl, gl.FRAMEBUFFER, index, gl.TEXTURE_2D, tex.textureBuffer);\n      buffers.push(true);\n    });\n    gpuCapability.drawBuffers(gl, buffers);\n    this.updateAttachmentTextures();\n  }\n\n  override resize (x: number, y: number, width: number, height: number) {\n    const [preX, preY, preWidth, preHeight] = this.viewport;\n\n    if (preX !== x || preY !== y || preWidth !== width || preHeight !== height) {\n      this.viewport = [x, y, width, height];\n      this.ready = false;\n      this.bind();\n    }\n  }\n\n  override dispose (options?: { depthStencilAttachment?: RenderPassDestroyAttachmentType }) {\n    if (this.renderer) {\n      this.renderer.deleteGLFramebuffer(this);\n      delete this.fbo;\n      const clearAttachment = options?.depthStencilAttachment ? options.depthStencilAttachment : RenderPassDestroyAttachmentType.force;\n\n      if (\n        clearAttachment === RenderPassDestroyAttachmentType.force || (\n          clearAttachment === RenderPassDestroyAttachmentType.keepExternal &&\n          !this.externalStorage\n        )\n      ) {\n        this.depthStencilRenderbuffer?.dispose();\n        this.depthTexture?.dispose();\n      }\n\n      for (const texture of this.colorTextures) {\n        texture.dispose();\n      }\n\n      this.stencilTexture?.dispose();\n\n      // @ts-expect-error safe to assign\n      this.renderer = this.stencilRenderbuffer = this.depthStencilRenderbuffer = null;\n    }\n  }\n}\n","import type { GLType, LostHandler, RestoreHandler } from '@galacean/effects-core';\nimport { assertExist, createGLContext } from '@galacean/effects-core';\n\nexport class GLContextManager {\n  gl: WebGLRenderingContext | WebGL2RenderingContext | null;\n\n  private readonly contextLostListener: (e: Event) => void;\n  private readonly contextRestoredListener: (e: Event) => void;\n  private readonly restoreHandlers: RestoreHandler[] = [];\n  private readonly lostHandlers: LostHandler[] = [];\n\n  constructor (\n    public canvas: HTMLCanvasElement | OffscreenCanvas | null,\n    public readonly glType: GLType = 'webgl',\n    options: WebGLContextAttributes = {},\n  ) {\n    assertExist(canvas);\n    this.gl = createGLContext(canvas, glType, options);\n    this.contextLostListener = (e: Event) => {\n      for (const lostHandler of this.lostHandlers) {\n        lostHandler.lost(e);\n      }\n      this.canvas?.removeEventListener('webglcontextlost', this.contextLostListener);\n    };\n    this.contextRestoredListener = (e: Event) => {\n      for (const restorable of this.restoreHandlers) {\n        restorable.restore();\n      }\n      this.canvas?.addEventListener('webglcontextlost', this.contextLostListener);\n    };\n    canvas.addEventListener('webglcontextlost', this.contextLostListener);\n    canvas.addEventListener('webglcontextrestored', this.contextRestoredListener);\n  }\n\n  dispose () {\n    if (this.canvas) {\n      this.canvas.removeEventListener('webglcontextlost', this.contextLostListener);\n      this.canvas.removeEventListener('webglcontextrestored', this.contextRestoredListener);\n    }\n\n    if (this.gl) {\n      this.gl.getExtension('WEBGL_lose_context')?.loseContext();\n    }\n\n    this.gl = null;\n    this.canvas = null;\n  }\n\n  addLostHandler (lostHandler: LostHandler) {\n    this.lostHandlers.push(lostHandler);\n  }\n\n  removeLostHandler (lostHandler: LostHandler) {\n    const index = this.lostHandlers.indexOf(lostHandler);\n\n    if (index > -1) {\n      this.lostHandlers.splice(index, 1);\n    }\n  }\n\n  addRestoreHandler (restoreHandler: RestoreHandler) {\n    this.restoreHandlers.push(restoreHandler);\n  }\n\n  removeRestoreHandler (restorable: RestoreHandler) {\n    const index = this.restoreHandlers.indexOf(restorable);\n\n    if (index > -1) {\n      this.restoreHandlers.splice(index, 1);\n    }\n  }\n}\n","import type { Composition, EngineOptions, Nullable, Texture, Texture2DSourceOptionsVideo, math } from '@galacean/effects-core';\nimport { Engine, GPUCapability, SceneLoader, assertExist, glContext, isIOS } from '@galacean/effects-core';\nimport { GLRenderer } from './gl-renderer';\nimport { GLShaderLibrary } from './gl-shader-library';\nimport type { GLTexture } from './gl-texture';\nimport { GLContextManager } from './gl-context-manager';\n\ntype Color = math.Color;\ntype Vector2 = math.Vector2;\ntype Vector3 = math.Vector3;\ntype Vector4 = math.Vector4;\ntype Matrix3 = math.Matrix3;\ntype Matrix4 = math.Matrix4;\ntype Quaternion = math.Quaternion;\n\nexport class GLEngine extends Engine {\n  textureUnitDict: Record<string, WebGLTexture | null>;\n  shaderLibrary: GLShaderLibrary;\n  gl: WebGLRenderingContext | WebGL2RenderingContext;\n  context: GLContextManager;\n\n  private readonly maxTextureCount: number;\n  private glCapabilityCache: Record<string, any>;\n  private currentFramebuffer: Record<number, WebGLFramebuffer | null>;\n  private currentTextureBinding: WebGLTexture | null;\n  private currentRenderbuffer: Record<number, WebGLRenderbuffer | null>;\n  private activeTextureIndex: number;\n  private pixelStorei: Record<string, GLenum>;\n  private restoreCompositionsCache: Composition[] = [];\n\n  constructor (canvas: HTMLCanvasElement, options?: EngineOptions) {\n    super(canvas, options);\n    options = {\n      preserveDrawingBuffer: undefined,\n      alpha: true,\n      stencil: true,\n      antialias: true,\n      depth: true,\n      premultipliedAlpha: true,\n      glType: 'webgl2',\n      ...options,\n    };\n\n    this.context = new GLContextManager(canvas, options.glType, options);\n    this.context.addLostHandler({\n      lost: e => {\n        this.ticker?.pause();\n        this.restoreCompositionsCache = this.compositions.slice();\n        this.compositions.forEach(comp => comp.lost(e));\n        this.renderer.lost(e);\n        this.emit('contextlost', { engine: this, e });\n      },\n    });\n\n    this.context.addRestoreHandler({\n      restore: async () => {\n        this.renderer.restore();\n        await Promise.all(this.restoreCompositionsCache.map(async composition => {\n          const { time: currentTime, url, speed, reusable, renderOrder, transform, videoState } = composition;\n          const newComposition = await SceneLoader.load(url, this);\n\n          newComposition.speed = speed;\n          newComposition.reusable = reusable;\n          newComposition.renderOrder = renderOrder;\n          newComposition.transform.setPosition(transform.position.x, transform.position.y, transform.position.z);\n          newComposition.transform.setRotation(transform.rotation.x, transform.rotation.y, transform.rotation.z);\n          newComposition.transform.setScale(transform.scale.x, transform.scale.y, transform.scale.z);\n          newComposition.onItemMessage = composition.onItemMessage;\n\n          for (let i = 0; i < videoState.length; i++) {\n            if (videoState[i]) {\n              const video = (newComposition.textures[i].source as Texture2DSourceOptionsVideo).video;\n\n              video.currentTime = videoState[i] ?? 0;\n              await video.play();\n            }\n          }\n          newComposition.isEnded = false;\n          newComposition.gotoAndPlay(currentTime);\n\n          return newComposition;\n        }));\n\n        this.restoreCompositionsCache = [];\n        this.ticker?.resume();\n\n        if (isIOS() && this.canvas) {\n          this.canvas.style.display = 'none';\n          window.setTimeout(() => {\n            this.canvas.style.display = '';\n          }, 0);\n        }\n\n        this.emit('contextrestored', this);\n      },\n    });\n\n    const gl = this.context.gl;\n\n    assertExist(gl);\n    this.gl = gl;\n    this.reset();\n    this.gpuCapability = new GPUCapability(gl);\n    this.shaderLibrary = new GLShaderLibrary(this);\n    this.renderer = new GLRenderer(this);\n    this.maxTextureCount = this.gl.TEXTURE0 + this.gl.getParameter(this.gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS) - 1;\n\n    // resize need gl renderer initialized\n    this.resize();\n  }\n\n  override dispose () {\n    if (this.disposed) {\n      return;\n    }\n    super.dispose();\n\n    this.renderer.dispose();\n    this.shaderLibrary?.dispose();\n    this.context.dispose();\n    this.reset();\n  }\n\n  reset () {\n    this.glCapabilityCache = {};\n    this.activeTextureIndex = glContext.TEXTURE0;\n    this.textureUnitDict = {};\n    this.currentFramebuffer = {};\n    this.pixelStorei = {};\n    this.currentRenderbuffer = {};\n  }\n\n  toggle (capability: GLenum, enable?: boolean) {\n    if (enable) {\n      this.enable(capability);\n    } else {\n      this.disable(capability);\n    }\n  }\n\n  /**\n   * 对于该上下文开启某种特性\n   * @param capability\n   * example:\n   * gl.enable(gl.DITHER);\n   */\n  enable (capability: GLenum) {\n    const value = this.glCapabilityCache[capability];\n\n    if (value !== true) {\n      this.glCapabilityCache[capability] = true;\n      this.gl.enable(capability);\n    }\n  }\n\n  /**\n   * 基于某种上下文关闭特性\n   * @param capability\n   * example:\n   * gl.disable(gl.DITHER);\n   */\n  disable (capability: GLenum) {\n    const value = this.glCapabilityCache[capability];\n\n    if (value !== false) {\n      this.glCapabilityCache[capability] = false;\n      this.gl.disable(capability);\n    }\n  }\n\n  /**\n   * 绑定framebuffer webgl2新增: gl.DRAW_FRAMEBUFFER 和 gl.READ_FRAMEBUFFER\n   * @param target\n   * @param framebuffer\n   * example:\n   * const framebuffer = gl.createFramebuffer();\n   * gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n   */\n  bindFramebuffer (target: GLenum, framebuffer: WebGLFramebuffer | null) {\n    if (this.currentFramebuffer[target] !== framebuffer) {\n      this.currentFramebuffer[target] = framebuffer;\n      this.gl.bindFramebuffer(target, framebuffer);\n    }\n  }\n\n  bindRenderbuffer (target: GLenum, renderbuffer: WebGLRenderbuffer | null) {\n    if (this.currentRenderbuffer[target] !== renderbuffer) {\n      this.currentRenderbuffer[target] = renderbuffer;\n      this.gl.bindRenderbuffer(target, renderbuffer);\n    }\n  }\n\n  /**\n   * 绑定系统 framebuffer\n   */\n  bindSystemFramebuffer () {\n    this.bindFramebuffer(this.gl.FRAMEBUFFER, null);\n  }\n\n  /**\n   * 将定义好的 WebGLProgram 对象添加到当前的渲染状态中。\n   * @param program\n   * example:\n   * gl.useProgram(program);\n   * gl.useProgram(null);\n   */\n  useProgram (program: WebGLProgram | null) {\n    this.set1('useProgram', program);\n  }\n\n  /**\n   * 使用预设值来清空缓冲\n   * @param mask\n   * example:\n   * gl.clear(gl.DEPTH_BUFFER_BIT);\n   * gl.clear(gl.DEPTH_BUFFER_BIT | gl.COLOR_BUFFER_BIT);\n   */\n  clear (mask: number) {\n    this.gl.clear(mask);\n  }\n\n  /*** depth start ***/\n\n  /**\n   * 设置深度缓冲区的深度清除值\n   * @param depth\n   * example:\n   * gl.clearDepth(0.5);\n   */\n  clearDepth (depth: GLclampf) {\n    this.set1('clearDepth', depth);\n  }\n\n  /**\n   * 指定将输入像素深度与当前深度缓冲区值进行比较的函数。\n   * @param func\n   * example:\n   * gl.enable(gl.DEPTH_TEST);\n   * gl.depthFunc(gl.NEVER);\n   */\n  depthFunc (func: GLenum) {\n    this.set1('depthFunc', func);\n  }\n\n  /**\n   * 设置是否启用写入深度缓冲。\n   * @param flag\n   * example:\n   * gl.depthMask(false);\n   */\n  depthMask (flag: boolean) {\n    this.set1('depthMask', flag);\n  }\n\n  polygonOffset (factor: number, unit: number) {\n    this.set2('polygonOffset', factor, unit);\n  }\n\n  /**\n   * 将 z 值从规范化设备坐标映射到窗口坐标\n   * @param zNear\n   * @param zFar\n   * example:\n   * gl.depthRange(0.2, 0.6);\n   */\n  depthRange (zNear: number, zFar: number) {\n    this.set2('depthRange', zNear, zFar);\n  }\n\n  /*** depth end ***/\n\n  /*** stencil start ***/\n\n  /**\n   * 模版测试设置函数和引用值。\n   * @param func\n   * @param ref\n   * @param mask\n   * example:\n   * gl.enable(gl.STENCIL_TEST);\n   * gl.stencilFunc(gl.LESS, 0, 0b1110011);\n   */\n  clearStencil (s: GLint) {\n    this.set1('clearStencil', s);\n  }\n\n  /**\n   * 控制启用和禁用模板平面中单个位的正面和背面写入\n   * @param mask\n   * example:\n   * gl.stencilMask(0xff);\n   */\n  stencilMask (mask: number) {\n    this.stencilMaskSeparate(this.gl.FRONT, mask);\n    this.stencilMaskSeparate(this.gl.BACK, mask);\n  }\n\n  /**\n   * 模版测试设置函数和引用值。\n   * @param func\n   * @param ref\n   * @param mask\n   * example:\n   * gl.enable(gl.STENCIL_TEST);\n   * gl.stencilFunc(gl.LESS, 0, 0b1110011);\n   */\n  stencilFunc (func: GLenum, ref: GLint, mask: GLuint) {\n    this.stencilFuncSeparate(this.gl.FRONT, func, ref, mask);\n    this.stencilFuncSeparate(this.gl.BACK, func, ref, mask);\n  }\n\n  /**\n   * 单面模版测试\n   * @param face\n   * @param func\n   * @param ref\n   * @param mask\n   * example:\n   * gl.enable(gl.STENCIL_TEST);\n   * gl.stencilFuncSeparate(gl.FRONT, gl.LESS, 0.2, 1110011);\n   */\n  stencilFuncSeparate (face: GLenum, func: GLenum, ref: GLint, mask: GLuint) {\n    this.set4('stencilFuncSeparate', face, func, ref, mask);\n  }\n\n  /**\n   * 单面的mask写入\n   * @param face\n   * @param mask\n   * example:\n   * gl.stencilMaskSeparate(gl.FRONT, 110101);\n   */\n  stencilMaskSeparate (face: GLenum, mask: GLuint) {\n    this.set2('stencilMaskSeparate', face, mask);\n  }\n\n  /**\n   * 设置正面和背面模板测试操作\n   * @param fail\n   * @param zfail\n   * @param zpass\n   * example:\n   * gl.enable(gl.STENCIL_TEST);\n   * gl.stencilOp(gl.INCR, gl.DECR, gl.INVERT);\n   */\n  stencilOp (fail: GLenum, zfail: GLenum, zpass: GLenum) {\n    this.stencilOpSeparate(this.gl.FRONT, fail, zfail, zpass);\n    this.stencilOpSeparate(this.gl.BACK, fail, zfail, zpass);\n  }\n\n  /**\n   * 设置正面和/或背面模板测试操作\n   * @param face\n   * @param fail\n   * @param zfail\n   * @param zpass\n   * example:\n   * gl.enable(gl.STENCIL_TEST);\n   * gl.stencilOpSeparate(gl.FRONT, gl.INCR, gl.DECR, gl.INVERT);\n   */\n  stencilOpSeparate (face: GLenum, fail: GLenum, zfail: GLenum, zpass: GLenum) {\n    this.set4('stencilOpSeparate', face, fail, zfail, zpass);\n  }\n\n  /*** stencil end ***/\n\n  /*** face start ***/\n  /**\n   * 剔除方式\n   * @param mode\n   * example:\n   * gl.enable(gl.CULL_FACE);\n   * gl.cullFace(gl.FRONT_AND_BACK);\n   */\n  cullFace (mode: GLenum) {\n    this.set1('cullFace', mode);\n  }\n\n  /**\n   * 设置卷绕方向\n   * @param mode\n   * example:\n   * gl.frontFace(gl.CW);\n   */\n  frontFace (mode: GLenum) {\n    this.set1('frontFace', mode);\n  }\n\n  /*** face end ***/\n\n  /*** color start ***/\n  /**\n   * 设置颜色写入\n   * @param red\n   * @param green\n   * @param blue\n   * @param alpha\n   * example:\n   * gl.colorMask(true, true, true, false);\n   */\n  clearColor (red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf) {\n    this.set4('clearColor', red, green, blue, alpha);\n  }\n\n  /**\n   * 设置颜色写入\n   * @param red\n   * @param green\n   * @param blue\n   * @param alpha\n   * example:\n   * gl.colorMask(true, true, true, false);\n   */\n  colorMask (red: boolean, green: boolean, blue: boolean, alpha: boolean) {\n    this.set4('colorMask', red, green, blue, alpha);\n  }\n\n  /**\n   * 设置源和目标混合因子\n   * @param red\n   * @param green\n   * @param blue\n   * @param alpha\n   * example:\n   * gl.blendColor(0, 0.5, 1, 1);\n   */\n  blendColor (red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf) {\n    this.set4('blendColor', red, green, blue, alpha);\n  }\n\n  /**\n   * 用于混合像素算法\n   * @param sfactor\n   * @param dfactor\n   * example:\n   * gl.enable(gl.BLEND);\n   * gl.blendFunc(gl.SRC_COLOR, gl.DST_COLOR);\n   */\n  blendFunc (sfactor: GLenum, dfactor: GLenum) {\n    this.blendFuncSeparate(sfactor, dfactor, sfactor, dfactor);\n  }\n\n  /**\n   * 分别设置应用在 RGB 和 Alpha 上的 factor\n   * @param srcRGB\n   * @param dstRGB\n   * @param srcAlpha\n   * @param dstAlpha\n   * example:\n   * gl.enable(gl.BLEND);\n   * gl.blendFuncSeparate(gl.SRC_COLOR, gl.DST_COLOR, gl.ONE, gl.ZERO);\n   */\n  blendFuncSeparate (srcRGB: GLenum, dstRGB: GLenum, srcAlpha: GLenum, dstAlpha: GLenum) {\n    this.set4('blendFuncSeparate', srcRGB, dstRGB, srcAlpha, dstAlpha);\n  }\n\n  /**\n   * 设置混合模式\n   * @param mode\n   * example:\n   * gl.blendEquation(gl.FUNC_ADD);\n   * gl.blendEquation(gl.FUNC_SUBTRACT);\n   * gl.blendEquation(gl.FUNC_REVERSE_SUBTRACT);\n   */\n  blendEquation (mode: GLenum) {\n    this.set1('blendEquation', mode);\n  }\n\n  /**\n   * 可以分别对 RGB 和 Alpha 做不同的操作处理\n   * @param modeRGB\n   * @param modeAlpha\n   * example:\n   * gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_SUBTRACT);\n   */\n  blendEquationSeparate (modeRGB: GLenum, modeAlpha: GLenum) {\n    this.set2('blendEquationSeparate', modeRGB, modeAlpha);\n  }\n\n  /*** color end ***/\n\n  /**\n   * 图像预处理\n   * @param pname\n   * @param param\n   * example:\n   * var tex = gl.createTexture();\n   * gl.bindTexture(gl.TEXTURE_2D, tex);\n   * gl.pixelStorei(gl.PACK_ALIGNMENT, 4);\n   */\n  setPixelStorei (pname: GLenum, param: GLenum) {\n    const currentParam = this.pixelStorei[pname];\n\n    if (currentParam !== param) {\n      this.pixelStorei[pname] = param;\n      this.gl.pixelStorei(pname, param);\n    }\n  }\n\n  /**\n   * 用来设置视口，即指定从标准设备到窗口坐标的x、y仿射变换。\n   * @param x\n   * @param y\n   * @param width\n   * @param height\n   * example:\n   * gl.viewport(0, 0, width, height);\n   */\n  viewport (x: number, y: number, width: number, height: number) {\n    this.set4('viewport', x, y, width, height);\n  }\n\n  /**\n   * 激活指定的纹理单元\n   * @param texture\n   * example:\n   * gl.activeTexture(gl.TEXTURE1);\n   */\n  activeTexture (texture: GLenum) {\n    texture = Math.min(texture, this.maxTextureCount);\n    if (this.activeTextureIndex !== texture) {\n      this.activeTextureIndex = texture;\n      this.gl.activeTexture(texture);\n    }\n  }\n\n  /**\n   * 绑定WebGLTexture\n   * @param target\n   * @param texture\n   * @param force\n   * example:\n   * const texture = gl.createTexture();\n   * gl.bindTexture(gl.TEXTURE_2D, texture)\n   */\n  // TODO: texture.bind 替换时对于这段逻辑的处理\n  bindTexture (target: GLenum, texture: WebGLTexture | null, force?: boolean) {\n    if (this.currentTextureBinding !== texture || force) {\n      this.gl.bindTexture(target, texture);\n      this.currentTextureBinding = texture;\n    }\n    this.textureUnitDict[this.activeTextureIndex] = texture;\n  }\n\n  private set1 (name: string, param: any) {\n    const value = this.glCapabilityCache[name];\n\n    if (value !== param) {\n      this.glCapabilityCache[name] = param;\n      // @ts-expect-error save to assign\n      this.gl[name](param);\n    }\n  }\n\n  private set2 (name: string, param0: number, param1: number) {\n    let value = this.glCapabilityCache[name];\n\n    if (!value) {\n      value = this.glCapabilityCache[name] = { x: NaN, y: NaN };\n    }\n\n    if (value.x !== param0 || value.y !== param1) {\n      // @ts-expect-error save to assign\n      this.gl[name](value.x = param0, value.y = param1);\n    }\n  }\n\n  private set3 (name: string, param0: any, param1: any, param2: any) {\n    let value = this.glCapabilityCache[name];\n\n    if (!value) {\n      value = this.glCapabilityCache[name] = { x: NaN, y: NaN, z: NaN };\n    }\n\n    if (value.x !== param0 || value.y !== param1 || value.z !== param2) {\n      // @ts-expect-error safe to assign\n      this.gl[name](value.x = param0, value.y = param1, value.z = param2);\n    }\n  }\n\n  private set4 (name: string, param0: any, param1: any, param2: any, param3: any) {\n    let value = this.glCapabilityCache[name];\n\n    if (!value) {\n      value = this.glCapabilityCache[name] = {\n        x: NaN, y: NaN, z: NaN, w: NaN,\n      };\n    }\n\n    if (value.x !== param0 || value.y !== param1 || value.z !== param2 || value.w !== param3) {\n      // @ts-expect-error safe to assign\n      this.gl[name](value.x = param0, value.y = param1, value.z = param2, value.w = param3);\n    }\n  }\n\n  // TODO 命名\n  get (name: string): any {\n    return this.glCapabilityCache[name];\n  }\n\n  setFloat (uniform: Nullable<WebGLUniformLocation>, value: number) {\n    if (!uniform) { return; }\n    this.gl.uniform1f(uniform, value);\n  }\n\n  setInt (uniform: Nullable<WebGLUniformLocation>, value: number) {\n    if (!uniform) { return; }\n    this.gl.uniform1i(uniform, value);\n  }\n\n  setFloats (uniform: Nullable<WebGLUniformLocation>, value: number[]) {\n    if (!uniform) { return; }\n    this.gl.uniform1fv(uniform, value);\n  }\n\n  setVector2 (uniform: Nullable<WebGLUniformLocation>, value: Vector2) {\n    this.setFloat2(uniform, value.x, value.y);\n  }\n\n  setVector3 (uniform: Nullable<WebGLUniformLocation>, value: Vector3) {\n    this.setFloat3(uniform, value.x, value.y, value.z);\n  }\n\n  setVector4 (uniform: Nullable<WebGLUniformLocation>, value: Vector4) {\n    this.setFloat4(uniform, value.x, value.y, value.z, value.w);\n  }\n\n  setColor (uniform: Nullable<WebGLUniformLocation>, value: Color) {\n    this.setFloat4(uniform, value.r, value.g, value.b, value.a);\n  }\n\n  setQuaternion (uniform: Nullable<WebGLUniformLocation>, value: Quaternion) {\n    this.setFloat4(uniform, value.x, value.y, value.z, value.w);\n  }\n\n  setVector4Array (uniform: Nullable<WebGLUniformLocation>, array: number[]) {\n    if (!uniform || array.length % 4 !== 0) { return; }\n    this.gl.uniform4fv(uniform, array);\n  }\n\n  setMatrix (uniform: Nullable<WebGLUniformLocation>, value: Matrix4) {\n    if (!uniform) { return; }\n    this.gl.uniformMatrix4fv(uniform, false, value.elements);\n  }\n\n  setMatrix3 (uniform: Nullable<WebGLUniformLocation>, value: Matrix3) {\n    if (!uniform) { return; }\n    this.gl.uniformMatrix3fv(uniform, false, value.elements);\n  }\n\n  setMatrixArray (uniform: Nullable<WebGLUniformLocation>, array: number[]) {\n    if (!uniform || array.length % 16 !== 0) { return; }\n    this.gl.uniformMatrix4fv(uniform, false, array);\n  }\n\n  setTexture (uniform: Nullable<WebGLUniformLocation>, channel: number, texture: Texture) {\n    if (!uniform) { return; }\n    this.gl.activeTexture(this.gl.TEXTURE0 + channel);\n    const target = (texture as GLTexture).target;\n\n    this.gl.bindTexture(target, (texture as GLTexture).textureBuffer);\n    this.gl.uniform1i(uniform, channel);\n  }\n\n  /**\n   * 查询所有uniform的location。\n   * @param program 查询的shader program\n   * @param uniformsNames 查询的uniform名称列表\n   * @returns\n   */\n  getUniforms (program: WebGLProgram, uniformsNames: string[]): Nullable<WebGLUniformLocation>[] {\n    const results: Nullable<WebGLUniformLocation>[] = [];\n\n    for (let index = 0; index < uniformsNames.length; index++) {\n      results.push(this.gl.getUniformLocation(program, uniformsNames[index]));\n    }\n\n    return results;\n  }\n\n  private setFloat4 (uniform: Nullable<WebGLUniformLocation>, x: number, y: number, z: number, w: number) {\n    if (!uniform) {\n      return;\n    }\n    this.gl.uniform4f(uniform, x, y, z, w);\n  }\n\n  private setFloat3 (uniform: Nullable<WebGLUniformLocation>, x: number, y: number, z: number) {\n    if (!uniform) {\n      return;\n    }\n    this.gl.uniform3f(uniform, x, y, z);\n  }\n\n  private setFloat2 (uniform: Nullable<WebGLUniformLocation>, x: number, y: number) {\n    if (!uniform) {\n      return;\n    }\n    this.gl.uniform2f(uniform, x, y);\n  }\n}\n","export const HELP_LINK = {\n  'Container size overflowed': 'https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#MvjnY',\n  'DPI overflowed': 'https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#ulfNT',\n  'Invalid container size': 'https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#lLlSW',\n  'Container is not an HTMLElement': 'https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#WZaWg',\n  'Never use destroyed player again': 'https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#YSWQr',\n  'Current running player count': 'https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#IzodZ',\n  'Create player with different WebGL version': 'https://www.galacean.com/effects/user/gasrv4ka5sacrwpg#X0ulg',\n};\n","import { logger } from '@galacean/effects-core';\nimport type { Player } from './player';\nimport { HELP_LINK } from './constants';\n\nconst playerMap = new Map<HTMLCanvasElement, Player>();\n\n/**\n * 判断指定的 canvas 是否有播放器正在使用\n * @param canvas - 指定的 canvas\n * @returns\n */\nexport function isCanvasUsedByPlayer (canvas: HTMLCanvasElement) {\n  return playerMap.has(canvas);\n}\n\n/**\n * 获取 canvas 对应的播放器\n * @param canvas - 指定的 canvas\n * @returns\n */\nexport function getPlayerByCanvas (canvas: HTMLCanvasElement) {\n  return playerMap.get(canvas);\n}\n\n/**\n * 获取使用中的播放器\n * @returns\n */\nexport function getActivePlayers () {\n  return Array.from(playerMap.values());\n}\n\n/**\n * 同时允许的播放器数量超过 1 时打印错误\n */\nfunction assertNoConcurrentPlayers () {\n  const runningPlayers = [];\n\n  for (const player of playerMap.values()) {\n    if (!player.paused) {\n      runningPlayers.push(player);\n    }\n  }\n\n  if (runningPlayers.length > 1) {\n    logger.error(`Current running player count: ${runningPlayers.length}, see ${HELP_LINK['Current running player count']}.`, runningPlayers);\n  }\n}\n\nexport {\n  playerMap,\n  assertNoConcurrentPlayers,\n};\n","import type {\n  Disposable, GLType, LostHandler, RestoreHandler, SceneLoadOptions, Scene, MessageItem,\n  Region, AssetManager, Composition, Renderer, Ticker,\n  PointerEventData } from '@galacean/effects-core';\nimport {\n  Engine, logger, EventEmitter, TextureLoadAction, canvasPool, getPixelRatio, initErrors,\n  isArray, spec, assertExist, SceneLoader,\n} from '@galacean/effects-core';\nimport { HELP_LINK } from './constants';\nimport { handleThrowError, isDowngradeIOS, throwError, throwErrorPromise } from './utils';\nimport type { PlayerConfig, PlayerErrorCause, PlayerEvent } from './types';\nimport { assertNoConcurrentPlayers, playerMap } from './player-map';\n\nlet enableDebugType = false;\nlet seed = 1;\n\n/**\n * Galacean Effects 播放器\n */\nexport class Player extends EventEmitter<PlayerEvent<Player>> implements Disposable, LostHandler, RestoreHandler {\n  readonly env: string;\n  /**\n   * 播放器的 canvas 对象\n   */\n  readonly canvas: HTMLCanvasElement;\n  /**\n   * 播放器的唯一标识\n   */\n  readonly name: string;\n  /**\n   * 播放器的容器元素\n   */\n  readonly container: HTMLElement | null;\n  /**\n   * 播放器使用的引擎\n   */\n  readonly engine: Engine;\n\n  private readonly onError?: (e: Error, ...args: any) => void;\n  private autoPlaying: boolean;\n  private resumePending = false;\n  private disposed = false;\n\n  /**\n   * 是否跳过指针移动时的拾取检测, 开启后可以减少移动时的性能消耗，但会导致 pointermove 事件无法触发\n   */\n  get skipPointerMovePicking () {\n    return this.engine.eventSystem.skipPointerMovePicking;\n  }\n\n  set skipPointerMovePicking (value: boolean) {\n    this.engine.eventSystem.skipPointerMovePicking = value;\n  }\n\n  /**\n   * 计时器\n   * 手动渲染 `manualRender=true` 时不创建计时器\n   */\n  get ticker (): Ticker | null {\n    return this.engine.ticker;\n  }\n  /**\n   * 播放器的渲染器对象\n   */\n  get renderer (): Renderer {\n    return this.engine.renderer;\n  }\n\n  get gpuCapability () {\n    return this.engine.gpuCapability;\n  }\n  /**\n   * 当前播放的合成对象数组，请不要修改内容\n   */\n  private get compositions () {\n    return this.engine.compositions;\n  }\n\n  private get assetManagers () {\n    return this.engine.assetManagers;\n  }\n\n  private get assetService () {\n    return this.engine.assetService;\n  }\n\n  private get event () {\n    return this.engine.eventSystem;\n  }\n\n  private get displayAspect () {\n    return this.engine.displayAspect;\n  }\n\n  private set displayAspect (value: number) {\n    this.engine.displayAspect = value;\n  }\n\n  private get displayScale () {\n    return this.engine.displayScale;\n  }\n\n  private set displayScale (value: number) {\n    this.engine.displayScale = value;\n  }\n\n  private get offscreenMode () {\n    return this.engine.offscreenMode;\n  }\n\n  private set offscreenMode (value: boolean) {\n    this.engine.offscreenMode = value;\n  }\n  /**\n   * 播放器的像素比\n   */\n  private get pixelRatio () {\n    return this.engine.pixelRatio;\n  }\n\n  private set pixelRatio (value: number) {\n    this.engine.pixelRatio = value;\n  }\n\n  /**\n   * 播放器的构造函数\n   * @param config\n   */\n  constructor (config: PlayerConfig) {\n    super();\n\n    const {\n      container, canvas, fps, name, pixelRatio, manualRender,\n      renderFramework: glType, notifyTouch, onError,\n      interactive = false,\n      renderOptions = {},\n      env = '',\n    } = config;\n    const { willCaptureImage: preserveDrawingBuffer, premultipliedAlpha } = renderOptions;\n\n    this.onError = onError;\n\n    // 原 debug-disable 直接返回\n    if (enableDebugType || glType === 'debug-disable') {\n      return;\n    }\n\n    // 注意: iOS 13/iOS 16.5 在 WebGL2 下有渲染或卡顿问题，故默认使用 WebGL1\n    let framework: GLType = isDowngradeIOS() ? 'webgl' : 'webgl2';\n\n    // 用户可以通过传入 renderFramework，手动强制使用 WebGL 1/2 来渲染\n    if (glType) {\n      framework = glType === 'webgl' ? 'webgl' : 'webgl2';\n    }\n\n    this.env = env;\n    this.name = name || `${seed++}`;\n    let useExternalCanvas = false;\n\n    try {\n      if (initErrors.length) {\n        throw new Error(\n          `Errors before player create: ${initErrors.map((message, index) => `\\n ${index + 1}: ${message}`)}.`,\n          { cause: 'webgliniterror' },\n        );\n      }\n\n      if (canvas) {\n        this.canvas = canvas;\n        useExternalCanvas = true;\n      } else {\n        assertContainer(container);\n        this.canvas = document.createElement('canvas');\n        container.appendChild(this.canvas);\n      }\n      this.container = this.canvas.parentElement;\n\n      this.engine = Engine.create(this.canvas, {\n        name,\n        glType: framework,\n        fps,\n        env,\n        preserveDrawingBuffer,\n        premultipliedAlpha,\n        manualRender,\n        notifyTouch: notifyTouch,\n        interactive,\n        pixelRatio: Number.isFinite(pixelRatio) ? pixelRatio as number : getPixelRatio(),\n      });\n      this.engine.offscreenMode = true;\n\n      // Bind engine events\n      this.engine.on('rendererror', (e: Event | Error) => {\n        this.handleEmitEvent('rendererror', e);\n      });\n\n      this.engine.on('contextlost', eventData => {\n        this.lost(eventData.e);\n      });\n\n      this.engine.on('contextrestored', async () => {\n        await this.restore();\n      });\n\n      this.engine.on('click', (eventData: Region) => {\n        const behavior = eventData.behavior || spec.InteractBehavior.NOTIFY;\n\n        this.emit('click', {\n          ...eventData,\n          player: this,\n          compositionId: eventData.composition.id,\n          compositionName: eventData.composition.name,\n        });\n\n        if (behavior === spec.InteractBehavior.RESUME_PLAYER) {\n          void this.resume();\n        }\n      });\n\n      this.engine.on('pointerdown', (eventData: PointerEventData) => {\n        this.emit('pointerdown', eventData);\n      });\n\n      this.engine.on('pointerup', (eventData: PointerEventData) => {\n        this.emit('pointerup', eventData);\n      });\n\n      this.engine.on('pointermove', (eventData: PointerEventData) => {\n        this.emit('pointermove', eventData);\n      });\n\n      this.engine.runRenderLoop((dt: number) => {\n        if (this.autoPlaying) {\n          this.emit('update', {\n            player: this,\n            playing: true,\n          });\n        }\n      });\n\n      // 如果存在 WebGL 和 WebGL2 的 Player，需要给出警告\n      playerMap.forEach(player => {\n        if (player.gpuCapability.type !== this.gpuCapability.type) {\n          logger.warn(`Create player with different WebGL version: old=${player.gpuCapability.type}, new=${this.gpuCapability.type}.\\nsee ${HELP_LINK['Create player with different WebGL version']}.`);\n        }\n      });\n      playerMap.set(this.canvas, this);\n\n      assertNoConcurrentPlayers();\n    } catch (e: any) {\n      if (this.canvas && !useExternalCanvas) {\n        this.canvas.remove();\n      }\n      this.engine?.dispose();\n      this.disposed = true;\n      this.handleThrowError(e);\n    }\n  }\n\n  /**\n   * 设置当前 Player 的播放速度\n   * @param speed - 播放速度\n   */\n  setSpeed (speed: number) {\n    if (!isNaN(speed)) {\n      this.engine.speed = speed;\n    }\n  }\n  /**\n   * 获取当前 Player 的播放速度\n   * @returns\n   */\n  getSpeed (): number {\n    return this.engine.speed;\n  }\n\n  /**\n   * 根据名称查找对应的合成（可能找不到，如果有同名的合成，默认返回第一个）\n   * @example\n   * ``` ts\n   * const composition = player.getCompositionByName('新建合成1');\n   * ```\n   * @param name - 目标合成名称\n   */\n  getCompositionByName (name: string) {\n    return this.compositions.find(comp => comp.name === name);\n  }\n\n  /**\n   * 获取当前播放的所有合成（请不要修改返回的数组内容）\n   */\n  getCompositions () {\n    return this.compositions.sort((a, b) => a.getIndex() - b.getIndex());\n  }\n\n  /**\n   * Gets the array of asset managers.\n   * @returns\n   */\n  getAssetManager (): ReadonlyArray<AssetManager> {\n    return this.assetManagers;\n  }\n\n  /**\n   * 获取当前播放的合成数量\n   */\n  get compositionCount () {\n    return this.compositions.length;\n  }\n\n  /**\n   * 是否有合成在播放\n   */\n  get hasPlayable () {\n    return this.compositions.length > 0;\n  }\n\n  /**\n   * 播放器是否已暂停\n   */\n  get paused () {\n    return this.ticker?.getPaused();\n  }\n\n  /**\n   * 获取播放器是否可交互\n   */\n  get interactive () {\n    return this.event.enabled;\n  }\n\n  /**\n   * 设置播放器是否可交互\n   */\n  set interactive (enable) {\n    this.event.enabled = enable;\n  }\n\n  /**\n   * 加载动画资源\n   * @example\n   * ``` ts\n   * // 1. 加载单个合成链接并设置可选参数\n   * const composition = await player.loadScene('xxx.json', { ... });\n   * const composition = await player.loadScene({ url: 'xxx.json' }, { ... });\n   *\n   * // 2. 加载单个合成的 JSON 对象并设置可选参数\n   * const composition = await player.loadScene(JSONValue, { ... });\n   *\n   * // 3. 加载多个合成链接或 JSON 对象\n   * const [_, _, _] = await player.loadScene(['x1.json', 'x2.json', JSONValue]);\n   *\n   * // 4. 加载多个合成链接并各自设置可选参数\n   * const [_, _] = await player.loadScene([{\n   *   url: 'x1.json',\n   *   options: { autoplay: false, ... },\n   * }, {\n   *   url: 'x2.json',\n   *   options: { speed: 2, ... },\n   * }, { ... }]);\n   *\n   * // 5. 加载多个合成链接并统一设置可选参数（共用）\n   * const [_, _, _] = await player.loadScene(['x1.json', 'x2.json', ...], { ... });\n   * const [_, _] = await player.loadScene(\n   *   [{ url: 'x1.json' }, { url: 'x2.json' }, { ... }],\n   *   {\n   *     variables: {\n   *       'name': 'value',\n   *     },\n   *     speed: 2,\n   *     ...\n   *    },\n   * );\n   *\n   * // 6. 疯狂混合\n   * await player.loadScene([\n   *   {\n   *     url: 'x1.json',\n   *     options: {\n   *       variables: {\n   *         'name1': 'value1',\n   *       },\n   *       speed: 2,\n   *     },\n   *   },\n   *   'x2.json',\n   *   JSONValue,\n   * ], {\n   *   variables: {\n   *     'name2': 'value2',\n   *   },\n   *   speed: 0.1,\n   * });\n   * ```\n   * @param scene - 一个或一组 URL 或者通过 URL 请求的 JSONObject 或者 Scene 对象\n   * @param options - 加载可选参数\n   * @returns\n   */\n  async loadScene (scene: Scene.LoadType, options?: SceneLoadOptions): Promise<Composition>;\n  async loadScene (scene: Scene.LoadType[], options?: SceneLoadOptions): Promise<Composition[]>;\n  @handleThrowError<Player>\n  async loadScene (\n    scene: Scene.LoadType | Scene.LoadType[],\n    options?: SceneLoadOptions,\n  ): Promise<Composition | Composition[]> {\n    assertExist(this.renderer, 'Renderer is not exist, maybe the Player has been disabled or in gl \\'debug-disable\\' mode.');\n    const autoplay = options?.autoplay ?? true;\n\n    if (autoplay) {\n      this.autoPlaying = true;\n    }\n\n    const sceneUrls: Scene.LoadType[] = [];\n    const autoplayFlags: boolean[] = [];\n\n    if (isArray(scene)) {\n      sceneUrls.push(...scene);\n    } else {\n      sceneUrls.push(scene);\n    }\n\n    for (const assetManager of this.assetManagers) {\n      assetManager.dispose();\n    }\n\n    this.engine.assetManagers = [];\n    const baseOrder = this.engine.compositions.length;\n    const compositions = await Promise.all(sceneUrls.map(async (url, index) => {\n      const renderOrder = baseOrder + index;\n      const { source, options: compositionOptions } = this.assetService.assembleSceneLoadOptions(url, { autoplay, ...options });\n      const compositionAutoplay = compositionOptions?.autoplay ?? true;\n      const composition = await SceneLoader.load(source, this.engine, compositionOptions);\n\n      composition.setIndex(renderOrder);\n      composition.onItemMessage = (message: MessageItem) => { this.emit('message', message); };\n      autoplayFlags[index] = compositionAutoplay;\n\n      return composition;\n    }));\n\n    for (let i = 0; i < compositions.length; i++) {\n      if (autoplayFlags[i]) {\n        compositions[i].play();\n      } else {\n        compositions[i].pause();\n      }\n    }\n\n    if (compositions.some(c => !c.getPaused())) {\n      this.emit('play', { time: 0 });\n    }\n\n    return isArray(scene) ? compositions : compositions[0];\n  }\n\n  /**\n   * 播放通过 player 加载好的全部合成\n   */\n  play () {\n    if (this.offscreenMode) {\n      this.resize();\n      this.offscreenMode = false;\n    }\n    this.autoPlaying = true;\n    this.compositions.map(composition => {\n      composition.play();\n    });\n    this.ticker?.start();\n    this.emit('play', { time: 0 });\n  }\n\n  /**\n   * 跳转全部合成到指定时间后播放\n   * @param time - 指定时间, 单位秒\n   */\n  gotoAndPlay (time: number) {\n    if (this.offscreenMode) {\n      this.resize();\n      this.offscreenMode = false;\n    }\n    this.autoPlaying = true;\n    this.compositions.map(composition => {\n      composition.gotoAndPlay(time);\n    });\n    if (this.ticker) {\n      this.ticker.start();\n    } else {\n      this.tick(0);\n    }\n    this.emit('play', { time });\n  }\n\n  /**\n   * 跳转全部合成到指定时间并停留\n   * @param time - 指定时间, 单位秒\n   */\n  gotoAndStop (time: number) {\n    if (this.offscreenMode) {\n      this.resize();\n      this.offscreenMode = false;\n    }\n    this.autoPlaying = false;\n    this.compositions.map(composition => {\n      composition.gotoAndStop(time);\n    });\n    if (!this.ticker || this.ticker?.getPaused()) {\n      this.tick(0);\n    }\n    this.emit('pause');\n  }\n\n  /**\n   * 顺序播放一组还未开始播放的合成\n   * @param compositions - 要播放的合成数组\n   */\n  playSequence (compositions: Composition[]): void {\n    for (let i = 0; i < compositions.length - 1; i++) {\n      compositions[i].on('end', () => {\n        compositions[i + 1].play();\n      });\n    }\n    compositions[0].play();\n    this.ticker?.start();\n  }\n\n  /**\n   * 暂停播放器\n   * @param options\n   * @param options.offloadTexture - 是否卸载贴图纹理，减少内存\n   * @returns\n   */\n  pause (options?: { offloadTexture?: boolean }) {\n    if (this.paused) {\n      return;\n    }\n\n    this.ticker?.pause();\n    this.emit('pause');\n    this.emit('update', {\n      player: this,\n      playing: false,\n    });\n    this.compositions.map(composition => {\n      composition.pause();\n    });\n\n    if (options && options.offloadTexture) {\n      this.offloadTexture();\n    }\n  }\n\n  /**\n   * 恢复播放器\n   * > 如果暂停时卸载了纹理贴图，此函数将自动请求网络重新加载纹理\n   * @returns\n   */\n  async resume () {\n    if (this.resumePending) {\n      return;\n    }\n    if (this.paused) {\n      this.resumePending = true;\n      await Promise.all(this.compositions.map(c => c.reloadTexture()));\n      this.resumePending = false;\n      this.emit('resume');\n    }\n    this.compositions.map(composition => {\n      composition.resume();\n    });\n    this.ticker?.resume();\n  }\n\n  /**\n   * player 在定时器每帧的回调\n   * @param dt - 时间差，毫秒\n   */\n  tick (dt: number) {\n    this.engine.render(dt);\n  }\n\n  /**\n   * 调整画布的宽高比\n   * @param aspect\n   * @param scale\n   */\n  resizeToAspect (aspect: number, scale = 1) {\n    if (aspect !== this.displayAspect) {\n      this.displayAspect = aspect;\n    }\n    if (scale !== this.displayScale) {\n      this.displayScale = scale;\n    }\n    this.resize();\n  }\n\n  /**\n   * 将播放器重新和父容器大小对齐\n   */\n  resize () {\n    this.engine.resize();\n  }\n\n  /**\n   * 清空 canvas 的画面\n   */\n  clearCanvas () {\n    this.renderer.clear({\n      stencilAction: TextureLoadAction.clear,\n      clearStencil: 0,\n      depthAction: TextureLoadAction.clear,\n      clearDepth: 1,\n      colorAction: TextureLoadAction.clear,\n      clearColor: [0, 0, 0, 0],\n    });\n  }\n\n  /**\n   * 播放器在 `webglcontextlost` 时执行的操作\n   * @param e - Event\n   */\n  lost = (e: Event) => {\n    this.handleEmitEvent('webglcontextlost', e);\n  };\n\n  /**\n   * 播放器在 `webglcontextrestored` 时执行的操作\n   * @returns\n   */\n  restore = async () => {\n    this.emit('webglcontextrestored');\n  };\n\n  /**\n   * 销毁当前播放的所有 Composition\n   */\n  destroyCurrentCompositions () {\n    this.compositions.forEach(comp => comp.dispose());\n  }\n\n  /**\n   * 销毁播放器\n   */\n  dispose (): void {\n    logger.info(`Call player destroyed: ${this.name}.`);\n\n    if (this.disposed) {\n      return;\n    }\n\n    playerMap.delete(this.canvas);\n    this.pause();\n    this.engine.dispose();\n\n    if (this.canvas instanceof HTMLCanvasElement) {\n      // TODO: 数据模版下掉可以由文本模块单独管理\n      canvasPool.dispose();\n      // canvas will become a cry emoji in Android if still in dom\n      if (this.canvas.parentNode) {\n        this.canvas.parentNode.removeChild(this.canvas);\n      }\n      this.canvas.remove();\n    }\n\n    // 在报错函数中传入 player.name\n    const errorMsg = getDestroyedErrorMessage(this.name);\n    const throwErrorFunc = () => throwError(errorMsg);\n    const throwErrorPromiseFunc = () => throwErrorPromise(errorMsg);\n\n    this.tick = throwErrorFunc;\n    this.resize = throwErrorFunc;\n    this.loadScene = throwErrorPromiseFunc;\n    this.play = throwErrorPromiseFunc;\n    this.gotoAndPlay = throwErrorPromiseFunc;\n    this.gotoAndStop = throwErrorPromiseFunc;\n    this.playSequence = throwErrorFunc;\n    this.destroyCurrentCompositions = throwErrorFunc;\n    this.resume = throwErrorPromiseFunc;\n    this.disposed = true;\n  }\n\n  private offloadTexture () {\n    this.compositions.forEach(comp => comp.offloadTexture());\n  }\n\n  private handleThrowError (e: Error) {\n    if (this.onError) {\n      this.onError(e);\n    } else {\n      throw e;\n    }\n  }\n\n  private handleEmitEvent (\n    name: Exclude<PlayerErrorCause, 'webgliniterror' | 'unknown'>,\n    e: Event | Error,\n  ) {\n    if (this.onError) {\n      if (e instanceof Event) {\n        this.onError(new Error(e.type, { cause: name }), e);\n      } else if (e instanceof Error) {\n        this.onError(new Error(e.message, { cause: name }), e);\n      } else {\n        this.onError(new Error('Unknown error.', { cause: name }), e);\n      }\n    } else {\n      console.warn(`[${name}] event is deprecated, please use 'onError' instead.`);\n      this.emit(name, e as any);\n    }\n  }\n}\n\n/**\n * 禁止/允许创建新的播放器，已创建的不受影响\n * @param disable - 是否禁止\n */\nexport function disableAllPlayer (disable: boolean) {\n  enableDebugType = !!disable;\n}\n\n/**\n * 创建播放器传入的容器不是 `HTMLElement` 时抛出错误\n * @param container\n */\nfunction assertContainer (container?: HTMLElement | null): asserts container is HTMLElement {\n  if (container === undefined || container === null) {\n    throw new Error(`Container is not an HTMLElement, see ${HELP_LINK['Container is not an HTMLElement']}.`);\n  }\n}\n\nfunction getDestroyedErrorMessage (name: string) {\n  return `Never use destroyed player: ${name} again, see ${HELP_LINK['Never use destroyed player again']}.`;\n}\n","import { _ as _assert_this_initialized } from \"./_assert_this_initialized.js\";\nimport { _ as _type_of } from \"./_type_of.js\";\n\nfunction _possible_constructor_return(self, call) {\n    if (call && (_type_of(call) === \"object\" || typeof call === \"function\")) return call;\n\n    return _assert_this_initialized(self);\n}\nexport { _possible_constructor_return as _ };\n","/**\n * 判断是否是 iOS 13.0 或者 iOS 16.5，此版本对 WebGL 支持有问题，需要降级\n * @returns\n */\nexport function isDowngradeIOS (): boolean {\n  const iOSVersionRegex = /iPhone OS (\\d+)_(\\d+)/;\n  const match = iOSVersionRegex.exec(navigator.userAgent);\n\n  if (match) {\n    return match[1] === '13' || (match[1] === '16' && match[2] === '5');\n  }\n\n  return false;\n}\n\nexport function throwError (destroyedErrorMessage: string) {\n  throw new Error(destroyedErrorMessage);\n}\n\nexport function throwErrorPromise (destroyedErrorMessage: string) {\n  return Promise.reject(destroyedErrorMessage);\n}\n\nexport function handleThrowError<T> (target: T, propertyKey: string, descriptor: PropertyDescriptor) {\n  // 保存原始方法\n  const originalMethod = descriptor.value;\n\n  // 替换原始方法\n  descriptor.value = async function (...args: any[]) {\n    try {\n      // 调用原始方法\n      const result = await originalMethod.apply(this, args);\n\n      return result;\n    } catch (e: any) {\n      // @ts-expect-error\n      target.handleThrowError.call(this, e);\n    }\n  };\n\n  // 返回修改后的描述符\n  return descriptor;\n}\n","import type {\n  GeometryMeshProps, GeometryProps, FramebufferProps, MaterialProps, RenderbufferProps,\n  TextureDataType, TextureSourceOptions, EngineOptions,\n} from '@galacean/effects-core';\nimport {\n  Framebuffer, Geometry, glContext, imageDataFromColor, Material, Mesh, Renderbuffer,\n  Renderer, Texture, TextureSourceType, Engine, logger,\n} from '@galacean/effects-core';\nimport {\n  GLFramebuffer, GLGeometry, GLMaterial, GLRenderbuffer, GLRenderer, GLTexture, GLEngine,\n} from '@galacean/effects-webgl';\n\nexport { GLGeometry, GLEngine, GLRenderer } from '@galacean/effects-webgl';\nexport * from '@galacean/effects-core';\nexport * from './types';\nexport * from './player';\nexport { isCanvasUsedByPlayer, getPlayerByCanvas, getActivePlayers } from './player-map';\n\nTexture.create = (engine: Engine, props?: TextureSourceOptions) => {\n  return new GLTexture(engine, props);\n};\n\nTexture.createWithData = (\n  engine: Engine,\n  data: TextureDataType = imageDataFromColor('#fff'),\n  options = {},\n) => {\n  const {\n    type = glContext.UNSIGNED_BYTE,\n    format = glContext.RGBA,\n    internalFormat,\n    wrapS = glContext.MIRRORED_REPEAT,\n    wrapT = glContext.MIRRORED_REPEAT,\n    minFilter = glContext.NEAREST,\n    magFilter = glContext.NEAREST,\n    flipY = false,\n    generateMipmap = false,\n  } = options as TextureSourceOptions;\n  const tex = new GLTexture(\n    engine,\n    {\n      data,\n      type,\n      sourceType: TextureSourceType.data,\n      format,\n      internalFormat: internalFormat || format,\n      wrapS,\n      wrapT,\n      minFilter,\n      magFilter,\n      flipY,\n      generateMipmap,\n    } as unknown as TextureSourceOptions);\n\n  return tex;\n};\n\nMaterial.create = (engine: Engine, props?: MaterialProps) => {\n  return new GLMaterial(engine, props);\n};\n\nGeometry.create = (engine: Engine, props?: GeometryProps) => {\n  return new GLGeometry(engine, props);\n};\n\nMesh.create = (engine: Engine, props?: GeometryMeshProps) => {\n  return new Mesh(engine, props);\n};\n\nRenderbuffer.create = (props: RenderbufferProps) => {\n  return new GLRenderbuffer(props);\n};\n\nFramebuffer.create = (props: FramebufferProps, renderer: Renderer) => {\n  return new GLFramebuffer(props, renderer);\n};\n\nRenderer.create = (engine: Engine) => {\n  return new GLRenderer(engine);\n};\n\nEngine.create = (canvas: HTMLCanvasElement, options?: EngineOptions) => {\n  return new GLEngine(canvas, options);\n};\n\n/**\n * Player 版本号\n */\nexport const version = __VERSION__;\n\nlogger.info(`Player version: ${version}.`);\n"],"names":["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","_instanceof","left","right","Symbol","hasInstance","_type_of","obj","constructor","__decorate","decorators","target","desc","d","c","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","__generator","thisArg","body","f","y","t","_","label","sent","trys","ops","g","create","Iterator","prototype","next","verb","iterator","n","v","op","TypeError","call","pop","push","e","step","getRandomValues","SuppressedError","rnds8","Uint8Array","rng","crypto","bind","Error","byteToHex","toString","slice","native","randomUUID","v4","options","buf","offset","rnds","random","arr","unsafeStringify","addItem","includes","removeItem","index","indexOf","splice","addItemWithOrder","item","property","descending","currentItem","enlargeBuffer","typeArray","maxSize","increase","buffer","byteLength","BYTES_PER_ELEMENT","size","Math","ceil","Number","isNaN","min","nbuffer","ArrayBuffer","nArr","set","PI2","PI","DEG2RAD","RAD2DEG","NumberEpsilon","isEqual","a","b","abs","Infinity","lerp","x","clamp","max","fixedMin","fixedMax","lower","upper","Vector2","setZero","setFromNumber","num","setFromArray","array","copyFrom","src","clone","setElement","console","getElement","add","Array","addVectors","subtract","subtractVectors","multiply","multiplyVectors","divide","scale","sum","floor","round","negate","sqrt","lengthSquared","normalize","setLength","other","alpha","lerpVectors","v1","v2","dot","cross","distance","dx","dy","distanceSquared","equals","isZero","eps","toArray","fill","fromNumber","fromArray","ONE","ZERO","Vector3","z","addScaledVector","s","crossVectors","ax","ay","bx","by","bz","az","reflect","normal","dz","_this","toVector2","applyEuler","euler","out","rotateVector3","applyQuaternion","q","applyMatrix","m","transformPoint","applyNormalMatrix","transformNormal","applyProjectionMatrix","projectPoint","X","Y","Z","Vector4","w","toVector3","transformVector4","Color","setFromVector4","setFromHSV","hue","saturation","chroma","h","setFromHexString","hex","substring","parseInt","luminance","toLinear","gammaToLinear","toGamma","linearToGamma","toVector4","toHSV","dm","toHexString","includeAlpha","R","ToHex","G","B","A","fromHexString","fromHSV","pow","str","toUpperCase","colorToArr","normalized","ret","isString","replace","exec","test","getColorFromGradientStops","stops","color","j","s0","s1","time","interpolateColor","map","colorStopsFromGradient","gradient","forEach","val","parsePercent","keys","stop","colorRGB","sort","unshift","lastStop","origin","ms","match","getPixelRatio","window","devicePixelRatio","BLACK","BLUE","CLEAR","CYAN","GRAY","GREEN","MAGENTA","RED","WHITE","YELLOW","canUseBOM","isIOS","navigator","platform","isIOSByUA","ver","userAgent","toLowerCase","isAndroid","isOpenHarmony","isSimulatorCellPhone","isMiniProgram","isAlipayMiniApp","isWechatMiniApp","my","renderTarget","__wxjs_environment","imageDataFromColor","image","width","height","data","imageDataFromGradient","sortByOrder","order","insertionSort","fastSort","addByOrder","priority","start","end","base","ref","ref1","assertExist","msg","asserts","condition","isValidFontFamily","fontFamily","isSafeFontFamily","OrderType","localLogger","Deferred","promise","prefix","format","message","logger","_len","_key","debug","warn","register","isFunction","noop","DestroyOptions","isArray","isObject","isPlainObject","proto","getPrototypeOf","Ctor","hasOwnProperty","Function","isCanvas","canvas","tagName","isPowerOfTwo","randomInRange","throwDestroyedError","generateGUID","uuidv4","base64ToFile","base64","filename","contentType","base64WithoutPrefix","split","byteCharacters","atob","byteArrays","byteNumbers","charCodeAt","byteArray","blob","Blob","type","File","applyMixins","derivedCtrl","baseCtrls","baseCtrl","getOwnPropertyNames","name","propertyDescriptor","pluginLoaderMap","plugins","registerPlugin","pluginClass","pluginInstance","unregisterPlugin","pluginIndex","findIndex","plugin","PluginSystem","getPlugins","initializeComposition","composition","scene","loader","onCompositionCreated","destroyComposition","comp","onCompositionDestroy","onAssetsLoadStart","all","onAssetsLoadFinish","engine","pluginInfoMap","downgrade","ffd","ktx2","model","video","audio","spine","getPluginUsageInfo","JSONSceneVersion","RenderLevel","BlendingMode","SideMode","ObscuredMode","ParticleEmitterShapeType","PluginType","InteractType","InteractBehavior","ItemType","RenderMode","ParticleOrigin","RenderType","RenderFace","Plugin","_proto","_set_prototype_of","o","p","setPrototypeOf","__proto__","_inherits","subClass","superClass","writable","configurable","CameraClipMode","ValueType","BezierKeyframeType","EndBehavior","ParticleInteractionBehavior","ShapeArcMode","LightType","ModelBoundingType","CameraType","MaterialType","MaterialBlending","RenderMode3D","TextOverflow","TextSizeMode","TextBaseline","TextAlignment","TextVerticalAlign","TextWeight","FontStyle","END_BEHAVIOR_PAUSE","END_BEHAVIOR_PAUSE_AND_DESTROY","CAMERA_CLIP_MODE_NORMAL","FillType","TexturePaintScaleMode","ShapePrimitiveType","LineCap","LineJoin","NodeDataType","BackgroundType","MultimediaType","HevcVideoCodec","DataType","GeometryType","VertexFormatType","IndexFormatType","VertexBufferSemantic","BuiltinObjectGUID","WhiteTexture","TransparentTexture","PBRShader","UnlitShader","LATEST_VERSION","LATEST","_array_like_to_array","len","arr2","_create_for_of_iterator_helper_loose","allowArrayLike","it","minLen","from","_unsupported_iterable_to_array","decoratorInitialStore","Map","mergedStore","effectsClassStore","getClass","className","effectsClass","context","serialize","sourceName","propertyKey","classStore","classKey","get","getDirectStore","generateSerializableMember","getMergedStore","store","currentTarget","currentKey","initialStore","parent","EffectsObject","guid","defination","addInstance","getInstanceId","setInstanceId","removeInstance","toData","fromData","id","dispose","is","GraphDataSet","resources","getResource","nodeDataClassStore","nodeDataClass","getNodeDataClass","InvalidIndex","GraphNode","initializationCount","lastUpdateID","getNodeData","asset","isValid","isInitialized","initialize","initializeInternal","shutdown","shutdownInternal","isNodeActive","updateID","isUpdated","markNodeActive","GraphNodeData","load","createNode","nodeType","node","nodes","PoseNode","duration","previousTime","currentTime","getCurrentTime","getPreviousTime","getDuration","getDebugInfo","ValueNode","setValue","FloatValueNode","BoolValueNode","AnimationGraphAsset","nodeDatas","graphDataSet","controlParameterIDs","parameterLookupMap","rootNodeIndex","graphAssetData","numControlParameters","createNodeData","_step","_iterator","animationClipData","animationClip","findObject","classConstructor","BranchState","GraphContext","deltaTime","branchState","update","InstantiationContext","getNode","instantiate","_extends","assign","source","AnimationClipNodeData","playRate","loopAnimation","dataSlotIndex","AnimationClipNode","animation","dataSet","fullData","spec","animatable","evaluate","result","nodeData","getPose","pose","_this_animation","_this_animation_duration","Animatable","skeleton","TransformCurveType","transformCurveInfos","floatCurveInfos","colorCurveInfos","positionCurves","curve","addTransformCurveInfo","_step1","scaleCurves","_iterator1","_step2","rotationCurves","_iterator2","_step3","eulerCurves","_iterator3","_step4","floatCurves","_iterator4","addFloatCurveInfo","_step5","colorCurves","_iterator5","addColorCurveInfo","outPose","life","curveInfo","curveValue","keyFrames","getValue","outTransform","parentSpaceTransforms","boneIndex","position","rotation","floatValue","floatPropertyValues","animatedObjectIndex","colorValue","colorPropertyValues","pathToBoneIndex","path","pathToObjectIndex","Quaternion","setFromEuler","toQuaternion","setFromAxisAngle","axis","angle","halfAngle","sin","tempVec0","cos","setFromRotationMatrix","te","elements","m11","m12","m13","m21","m22","m23","m31","m32","m33","trace","setFromUnitVectors","to","EPSILON","quat","angleTo","acos","rotateTowards","slerp","identity","invert","conjugate","l","multiplyQuaternions","premultiply","qax","qay","qaz","qaw","qbx","qby","qbz","qbw","cosHalfTheta","sqrSinHalfTheta","sinHalfTheta","halfTheta","atan2","ratioA","ratioB","slerpQuaternions","qa","qb","qy","qw","vx","vy","ix","vz","qz","iy","qx","iz","iw","res","quaternion","vec","toEuler","setFromQuaternion","toMatrix4","mat","compose","fromEuler","fromAxisAngle","fromVector4","fromRotationMatrix","fromUnitVectors","tempQuaternion","BlendFunction","NormalBlend","blendVector3","weight","blendQuaternion","blendEuler","lerpEuler","blendFloat","blendColor","lerpAngle","normalizeAngle","shortestAngleDiff","diff","fromAngle","toAngle","AdditiveBlend","targetQuaternion","Blender","localBlend","sourcePose","targetPose","blendWeight","resultPose","localBlendInternal","normalBlendFunction","additiveBlend","additiveBlendFunction","blendFunction","sourceTransform","targetTransform","resultTransform","sourcePosition","targetPosition","resultPosition","sourceRotation","targetRotation","resultRotation","sourceScale","targetScale","resultScale","sourceEuler","targetEuler","resultEuler","sourceFloat","targetFloat","sourceColor","targetColor","resultColor","NodeTransform","transform","Pose","defaultFloatPropertyValues","defaultFloat","defaultColorPropertyValues","defaultColor","setPosition","setRotation","setEuler","setScale","setFloat","PoseResult","ApplyAdditiveNodeData","ApplyAdditiveNode","baseNode","baseNodeIndex","additiveNode","additiveNodeIndex","inputParameterValueNode","inputParameterValueNodeIndex","_this_baseNode","_this_additiveNode","_this_inputParameterValueNode","baseNodeResult","additiveNodeResult","applyAdditive","BlendNodeData","BlendNode","source0","sourceNodeIndex0","source1","sourceNodeIndex1","_this_source0","_this_source1","source0Result","source1Result","AndNodeData","conditionNodeIndices","AndNode","conditionNodeIndex","conditionNodes","OrNodeData","OrNode","NotNodeData","inputValueNodeIndex","NotNode","inputValueNode","_this_inputValueNode","ConstFloatNodeData","ConstFloatNode","ConstBoolNodeData","ConstBoolNode","ControlParameterFloatNodeData","ControlParameterFloatNode","ControlParameterBoolNodeData","ControlParameterBoolNode","ControlParameterTriggerNodeData","ControlParameterTriggerNode","LayerBlendNodeData","layerDatas","LayerBlendNode","baseLayerNode","layerData","layers","inputNode","inputNodeIndex","weightValueNode","weightValueNodeIndex","_this_baseLayerNode","layerNodeResult","layer","updateLayers","layerWeight","EqualNodeData","comparandValueNodeIndex","EqualNode","comparandValueNode","FloatComparisonNodeData","Comparison","FloatComparisonNode","comparison","GreaterNodeData","LessNodeData","StateMachineNodeData","StateMachineNode","stateDatas","stateData","state","stateNode","stateNodeIndex","transitions","states","transitionDatas","transitionData","transition","transitionNode","transitionNodeIndex","conditionNode","targetStateIndex","defaultStateIndex","machineName","activeTransition","activeStateIndex","getCurrentStateName","stateName","isComplete","activeState","Active","evaluateTransitions","sourceNodeResult","currentlyActiveStateInfo","transitionIdx","numTransitions","isTransitioning","canEnterTransition","hasExitTime","getElapsedTimeInState","exitTime","startTransitionFromTransition","startTransitionFromState","shutdownTransitionConditions","initializeTransitionConditions","selectDefaultState","TransitionState","StateNodeData","childNodeIndex","StateNode","childNode","transitionState","elapsedTimeInState","isFirstStateUpdate","isTransitioningIn","isTransitioningOut","startTransitionIn","startTransitionOut","setTransitioningState","newState","SourceType","TransitionNodeData","targetStateNodeIndex","TransitionNode","targetNode","transitionLength","transitionProgress","sourceNode","sourceType","blendedDuration","isSourceATransition","getSourceTransitionNode","endSourceTransition","calculateBlendWeight","previousBranchState","Inactive","targetNodeResult","finalResult","registerPoseTasksAndUpdateRootMotion","deltaPercentage","getProgressPercentage","getSourceType","isSourceAState","sourceState","outResult","initializeTargetStateAndUpdateTransition","sourceTransition","getSourceStateNode","notifyNewTransitionStarting","targetStateNode","sourceTransitionTargetState","None","_this_sourceNode","TransitioningOut","sourceResult","targetResult","poseBlendWeight","AnimatedPropertyType","Skeleton","rootBone","recordedProperties","useEuler","floatAnimatedObjects","colorAnimatedObjects","animatedTransforms","addReferenceTransform","floats","floatRecords","addRecordedProperty","colors","colorRecords","itemPath","targetBone","findTarget","propertyPath","totalPath","animatedComponentOrItem","getComponent","propertyPathSegments","lastPropertyName","directTarget","animatedObject","propertyName","boneName","itemNames","itemName","find","GraphInstance","graphAsset","recordProperties","positionCurve","rotationCurve","scaleCurve","eulerCurve","floatCurve","_step6","_iterator6","colorCurve","instantiationContext","rootNode","evaluateGraph","resetGraphState","getNumControlParameters","controlParameterNode","nodeIdx","isControlParameter","getStateMachineNode","getControlParameterIndex","parameterID","getControlParameterID","parameterNodeIndex","setBool","setControlParameterValue","setTrigger","resetTrigger","getPoseNodeDebugInfo","getRuntimeNodeDebugValue","getNodeDebugInstance","_defineProperties","props","descriptor","enumerable","_create_class","Constructor","protoProps","staticProps","Component","isAwakeCalled","isStartCalled","isEnableCalled","_enabled","onAwake","onEnable","onDisable","onStart","onUpdate","dt","onLateUpdate","onDestroy","onApplyAnimationProperties","enable","sceneTicking","addComponent","disable","removeComponent","setVFXItem","isDuringPlay","isActive","enabled","components","isActiveAndEnabled","Behaviour","Animator","Component1","graphInstance","setQuaternion","RendererComponent","materials","_priority","render","renderer","_this_item_composition","renderFrame","addMeshToDefaultRenderPass","removeMeshFromDefaultRenderPass","material","EulerOrder","Matrix4","m41","m42","m43","m14","m24","m34","m44","setFromRowMajorData","setFromColumnVectors","c1","c2","c3","c4","setFromMatrix3","me","setFromScale","setFromTranslation","setFromRotationX","theta","setFromRotationY","setFromRotationZ","setFromRotationAxis","tx","ty","setFromShear","setFromBasis","xAxis","yAxis","zAxis","isIdentity","getColumnVector","lookAt","eye","up","vX","vY","tempVec1","vZ","tempVec2","addScaledMatrix","re","multiplyMatrices","ae","be","a11","a12","a13","a14","a21","a22","a23","a24","a31","a32","a33","a34","a41","a42","a43","a44","b11","b12","b13","b14","b21","b22","b23","b24","b31","b32","b33","b34","b41","b42","b43","b44","multiplyScalar","determinant","transpose","t11","t12","t13","t14","det","detInv","extractBasis","translation","anchor","x2","y2","z2","xx","xy","xz","yy","yz","zz","wx","wy","wz","sx","sy","sz","decompose","tempMat0","invSX","invSY","invSZ","getTranslation","getScale","hypot","getTransform","orthographic","top","bottom","near","far","tz","perspective","fov","aspect","reverse","tan","nf","matrix","concat","fromIdentity","fromLookAt","fromPerspective","fromColumnVectors","fromMatrix3","fromScale","fromTranslation","fromRotationX","fromRotationY","fromRotationZ","fromRotationAxis","fromQuaternion","fromShear","fromBasis","fromRowMajorData","IDENTITY","Euler","DEFAULT_ORDER","setFromRotationMatrix4","XYZ","asin","YXZ","ZXY","ZYX","YZX","XZY","setFromVector3","addEulers","reorder","newOrder","tempQuat0","s2","s3","cosX","sinX","cosY","sinY","cosZ","sinZ","cosXcosZ","cosXsinZ","sinXcosZ","sinXsinZ","cosYcosZ","cosYsinZ","sinYcosZ","sinYsinZ","cosXcosY","cosXsinY","sinXcosY","sinXsinY","fromRotationMatrix4","fromVector3","_assert_this_initialized","ReferenceError","Matrix3","setFromMatrix4","rotate","translate","fromMatrix4","Ray","direction","ray","recast","at","intersectBox","box","tmin","tmax","tymin","tymax","tzmin","tzmax","_this_origin","oz","_this_direction","bymin","bzmin","bymax","bzmax","invdirx","invdiry","invdirz","bxmin","ox","bxmax","oy","intersectPlane","plane","denominator","intersectSphere","sphere","center","vector","tca","d2","radius2","radius","thc","t0","t1","intersectTriangle","triangle","backfaceCulling","sign","p0","p1","p2","edge1","edge2","tempVec3","DdN","DdQxE2","DdE1xQ","QdN","floatView","int32View","Box3","minX","minY","minZ","maxX","maxY","maxZ","setFromPoints","points","makeEmpty","il","expandByPoint","setFromCenterAndSize","halfSize","setFromObject","object","expandByObject","isEmpty","getCenter","getSize","point","expandByVector","expandByScalar","scalar","expandByBox","updateWorldMatrix","geometry","boundingBox","computeBoundingBox","box3","applyMatrix4","matrixWorld","union","children","containsPoint","containsBox","getParameter","intersectsBox","intersectsSphere","clampPoint","distanceToPoint","intersect","getOBBPoints","getBoundingSphere","Sphere","optionalCenter","maxRadiusSq","radiusSum","deltaLengthSq","getBoundingBox","mt","scaleXSq","scaleYSq","scaleZSq","maxScale","missingRadiusHalf","toFarthestPoint","lambda","exp","degrees","radians","tempQuat","tempVector3","tempVector3Second","seed","Transform","taggedProperties","worldMatrix","localMatrix","valid","dirtyFlags","localData","parentMatrix","worldTRSCache","setTransform","parentTransform","setValid","dispatchValueChange","setSize","rotateByQuat","scaleBy","setAnchor","reverseEuler","mul","addChild","child","removeChild","getRotation","getQuaternion","updateLocalMatrix","getMatrix","getParentMatrix","getWorldMatrix","getWorldScale","cache","getWorldPosition","updateTRSCache","setWorldPosition","getWorldRotation","assignWorldTRS","cloneFromMatrix","m4","getValid","transformData","eulerHint","transformProps","parentMatrixDirty","newQuat","tmpScale","Camera","pixelWidth","pixelHeight","viewportMatrix","viewMatrix","projectionMatrix","viewProjectionMatrix","inverseViewMatrix","dirty","_options_aspect","_options_clipMode","clipMode","portrait","_options_position","_options_rotation","_options_pixelWidth","_options_pixelHeight","updateMatrix","setViewportMatrix","getViewportMatrix","getViewMatrix","getInverseViewMatrix","getProjectionMatrix","getInverseProjectionMatrix","_this_inverseProjectionMatrix","inverseProjectionMatrix","getViewProjectionMatrix","getInverseViewProjectionMatrix","inverseViewProjectionMatrix","getModelViewProjection","getInverseVPRatio","pos","inverseMat","nz","yMax","yMin","xMax","xMin","setQuat","getQuat","getOptions","copy","camera","_this_transform_getParentMatrix","_this_options","worldToScreenPoint","vpMatrix","screenToWorldPoint","invVPMatrix","ndcX","ndcY","ndcZ","worldPosition","SPRITE_VERTEX_STRIDE","SEMANTIC_PRE_COLOR_ATTACHMENT_0","SEMANTIC_PRE_COLOR_ATTACHMENT_SIZE_0","SEMANTIC_MAIN_PRE_COLOR_ATTACHMENT_0","SEMANTIC_MAIN_PRE_COLOR_ATTACHMENT_SIZE_0","PLAYER_OPTIONS_ENV_EDITOR","HELP_LINK","toHalf","Float32Array","Int32Array","bits","Float16ArrayWrapper","isInteger","Uint16Array","number","startIndex","translatePoint","_obj","tempEuler","tempMat4","calculateTranslation","acc","posData","velData","lifetime","speedIntegrate","speedOverLifetime","getIntegrateValue","gravityModifier","getIntegrateByTime","linearVelocityOverLifetime","linearVelOverLifetime","orbVelOverLifetime","orbitalVelOverLifetime","asRotation","orbVel","pro","rot","asMovement","velocityXCurve","velocityYCurve","velocityZCurve","ensureVec3","vecFill","vecMulCombine","particleOriginTranslateMap","PARTICLE_ORIGIN_CENTER","PARTICLE_ORIGIN_CENTER_BOTTOM","PARTICLE_ORIGIN_CENTER_TOP","PARTICLE_ORIGIN_LEFT_TOP","PARTICLE_ORIGIN_LEFT_CENTER","PARTICLE_ORIGIN_LEFT_BOTTOM","PARTICLE_ORIGIN_RIGHT_CENTER","PARTICLE_ORIGIN_RIGHT_BOTTOM","PARTICLE_ORIGIN_RIGHT_TOP","nearestPowerOfTwo","log","LN2","setRayFromCamera","dir","trianglesFromRect","halfWidth","halfHeight","p3","decimalEqual","epsilon","numberToFix","fixed","keyframeInfo","pointIndexCache","xIndex","yIndex","getPointInCurve","keyframe","_this_getPointIndexInCurve","getPointIndexInCurve","markType","LINE","EASE_OUT","EASE_IN","EASE","HOLD","isLeftSideEase","keyframeType","isKeyframeTypeLeftSideEase","isRightSideEase","isKeyframeTypeRightSideEase","AUTO","isHoldInKeyframe","leftSubType","LINE_OUT","isHoldOutKeyframe","BezierLengthData","totalLength","BezierMap","BezierDataMap","kSampleStepSize","a1","a2","C","calcBezier","getSlope","BezierPath","p4","catching","lastPoint","lastAddedLength","buildBezierData","interval","samples","addedLength","ptDistance","k","CURVE_SEGMENTS","perc","partialLength","lengthData","getPointInPercent","percent","bezierData","segmentLength","flag","segmentPerc","BezierQuat","temp","QuaternionInner","slerpFlat","BezierEasing","control1YOrControl1X","control2YOrControl1Y","control2X","control2Y","precomputed","control1","control2","weighted","isConstant","mSampleValues","precompute","getTForX","bezierInterpolate","pStart","pControl1","pControl2","pEnd","omt","omt2","t2","calcSampleValues","aX","intervalStart","currentSample","kSplineTableSize","guessForT","initialSlope","aGuessT","mX1","mX2","currentSlope","newtonRaphsonIterate","aA","aB","currentX","currentT","binarySubdivide","buildEasingCurve","leftKeyframe","rightKeyframe","getControlPoints","y1","timeInterval","valueInterval","x1","NaN","bezEasing","lineToBezier","leftValue","leftHoldLine","rightHoldLine","leftEase","rightEase","rightPoint","rightValue","leftPoint","isHold","dst","src0","src1","x0","y0","z0","w0","z1","w1","sqrSin","tDir","NOT_IMPLEMENT","ValueGetter","onCreate","timeScale","getMaxTime","toUniform","meta","func","scaleXCoord","getAllData","halfFloat","cursor","curves","StaticValue","ts","RandomSetValue","items","RandomValue","randomSeed","RandomVectorValue","LinearValue","xCoord","lineSegIntegrateByTime","GradientValue","getStops","last","LineSegments","first","isLineSeg","k2","integrate","byTime","lineSegIntegrate","k1","uniformCount","lineSegCount","PathSegments","values","k0","dis","curveValueEvaluate","calculateVec","vec0","vec1","BezierCurvePath","keyframes","controlPoints","curveSegments","ps1","ps2","cp1","cp2","ps","pathCurve","easingCurve","timeStart","timeEnd","keyTimeData","keyTimeStart","keyTimeEnd","bezierPath","getPercValue","curveKey","normalizeTime","BezierCurveQuat","t02","keyframe0","keyframe1","m0","m1","t3","getKeyFrameMetaByRawValue","CURVE","keyLen","curveCount","BEZIER_CURVE","createKeyFrameMeta","_is_native_reflect_construct","Boolean","valueOf","construct","_construct","Parent","Class","instance","Vector4Curve","xCurve","createValueGetter","yCurve","zCurve","wCurve","Vector3Curve","Vector2Curve","TangentMode","WeightedMode","BezierCurve","oldBezierKeyFramesToNew","curveMap","curveInfos","buildBezierEasing","keysNumber","tangentMode","getCurveIntegrateValue","total","count","isWeighted","weightedMode","rightDeltaX","outWeight","outSlope","leftDeltaX","inWeight","inSlope","oldKeyframes","keyDatas","lastControl","keyData","leftControl","rightControl","calculateSlope","RANDOM","CONSTANT","CONSTANT_VEC2","CONSTANT_VEC3","CONSTANT_VEC4","RGBA_COLOR","COLORS","GRADIENT_COLOR","LINEAR_PATH","pros","BEZIER_CURVE_PATH","BEZIER_CURVE_QUAT","COLOR_CURVE","ColorCurve","VECTOR4_CURVE","VECTOR2_CURVE","rCurve","gCurve","bCurve","aCurve","EFFECTS_COPY_MESH_NAME","COPY_MESH_SHADER_ID","COPY_VERTEX_SHADER","COPY_FRAGMENT_SHADER","TextureLoadAction","TextureSourceType","FilterMode","RenderTextureFormat","Framebuffer","resize","resetColorTextures","textures","unbind","getDepthTexture","getStencilTexture","getColorTextures","stencilStorage","depthStorage","createGLContext","glType","getContext","gpuTimer","gl","ext","getExtension","query","createQuery","getTime","available","getQueryParameter","QUERY_RESULT_AVAILABLE","disjoint","GPU_DISJOINT_EXT","timeElapsed","QUERY_RESULT","deleteQuery","setTimeout","catch","begin","beginQuery","TIME_ELAPSED_EXT","endQuery","initErrors","glContext","WEBGL_CONSTANTS_NOT_IN_GLOBAL","initGLContext","WebGL2RenderingContext","WebGLRenderingContext","isWebGL2","vertexFormatType2GLType","formatType","Float32","Int16","Int8","UInt16","UInt8","glType2VertexFormatType","webglType","Downloader","callbacks","downloadJSON","url","onSuccess","onError","download","downloadBinary","downloadBlob","downloadText","responseType","xhr","XMLHttpRequest","handleError","finish","status","response","addEventListener","trustXHRStatusZero","open","send","webPFailed","avifFailed","loadWebPOptional","png","webp","loadImage","_state","loadAVIFOptional","avif","revokeURL","HTMLImageElement","complete","URL","createObjectURL","JSON","stringify","img","Image","crossOrigin","onload","revokeObjectURL","onerror","loadBinary","responseText","loadBlob","loadVideo","document","createElement","srcObject","muted","autoplay","setAttribute","settled","handleSuccess","cleanup","removeEventListener","play","loadMedia","loadFn","deserializeMipmapTexture","textureOptions","bins","assets","files","mipmaps","jobs","loadedMipmaps","bin","mipmap","pointer","loadMipmapImage","keepImageSource","sourceFrom","Texture","destroyed","getWidth","getHeight","uploadCurrentVideoFrame","offloadData","reloadData","assembleOptions","_options_target","TEXTURE_2D","internalFormat","RGBA","minFilter","NEAREST","magFilter","wrapS","CLAMP_TO_EDGE","wrapT","UNSIGNED_BYTE","fromImage","texture","flipY","fromVideo","isDestroyed","generateHalfFloatTexture","channel","RGB","LUMINANCE_ALPHA","LUMINANCE","createWithData","HALF_FLOAT","sourceOptions","MIRRORED_REPEAT","generateWhiteTexture","generateTransparentTexture","textureLoaderRegistry","TextureLoaderRegistry","loaders","instances","factory","has","unregister","delete","getLoader","getRegisteredTypes","clear","TextureFactory","reloadPending","reload","sourceOpts","loadSource","updateSource","canOffloadTexture","compressed","TEXTURE_CUBE_MAP","maps","urls","every","config","cube","textureData","newTarget","newMipmaps","loadCubeMap","loadFromBuffer","LINEAR","loadMipmapImages","pointers","cubemap","getDefaultTextureFactory","setDefaultTextureFactory","RenderPassPriorityPrepare","RenderPassPriorityNormal","RenderPassPriorityPostprocess","RenderPassAttachmentStorageType","TextureStoreAction","RenderTargetHandle","externalTexture","_texture_format","_texture_type","framebuffer","storageType","tex","RenderPassDestroyAttachmentType","RenderPass","meshes","disposed","addMesh","mesh","removeMesh","configure","execute","onCameraCleanup","getViewport","_this_framebuffer","viewport","destroyMeshOption","keep","isDisposed","DrawObjectPass","useRenderTarget","setup","getTemporaryRT","Linear","RGBAHalf","setFramebuffer","colorAction","depthAction","stencilAction","renderMeshes","releaseTemporaryRT","ShaderCompileResultStatus","GLSLVersion","ShaderVariant","Shader","createVariant","macros","shaderMacros","shaderVariant","getShaderLibrary","createShader","shaderData","shader","valIfUndefined","def","getPreMultiAlpha","blending","ALPHA","ADD","SUBTRACTION","STRONG_LIGHT","WEAK_LIGHT","SUPERPOSITION","BRIGHTNESS","MULTIPLY","setBlendMode","blendMode","ONE_MINUS_SRC_ALPHA","blendEquation","FUNC_REVERSE_SUBTRACT","DST_COLOR","DST_ALPHA","setSideMode","side","DOUBLE","culling","frontFace","CW","cullFace","BACK","FRONT","setMaskMode","maskMode","stencilTest","MaskMode","MASK","stencilFunc","ALWAYS","stencilOpZPass","REPLACE","OBSCURED","EQUAL","REVERSE_OBSCURED","NOTEQUAL","NONE","ShaderType","MaterialDataBlock","_props_name","setUniformValues","uniformValue","setUniformValue","invalidAllFlags","updateUniformSubData","isUniformStruct","isUniformStructArray","MaterialRenderType","Material","stringTags","enabledMacros","initialized","shaderDirty","renderType","shaderSource","createShaderVariant","use","globalUniforms","_shader","mainTexture","getTexture","setTexture","getColor","setColor","equation","depthTest","depthMask","stencilRef","depthRange","depthFunc","polygonOffsetFill","polygonOffset","sampleAlphaToCoverage","stencilMask","stencilOpFail","stencilOpZFail","MaskProcessor","alphaMaskEnabled","maskable","stencilClearAction","getRefValue","setMaskOptions","_data_isMask","isMask","_data_inverted","inverted","reference","_data_alphaMaskEnabled","drawStencilMask","BYTES_TYPE_MAP","FLOAT","INT","SHORT","Int16Array","BYTE","Int8Array","Geometry","subMeshes","flush","generateEmptyTypedArray","Mesh","visible","_props_priority","_props_worldMatrix","setVisible","getVisible","drawGeometry","firstGeometry","setMaterial","destroy","restore","geometries","shaderLib","ShaderFactory","registerInclude","includeName","includeSource","unRegisterInclude","unRegisterAllIncludes","genFinalShaderCode","level","shaderType","removeVersion","macroString","genMacroString","versionString","genShaderVersion","parseIncludes","isVersion300","removeWebGLVersion","convertTo300","fragment","isFragment","has300Output","replaceMRTShader","regex","shaderName","addRuntimeMacro","macroList","webGLVersion","param","isFinite","join","fragmentShader","mrtIndexSet","Set","declaration","BloomPass","iterationCount","tempRTs","thresholdMaterial","vertex","screenMeshVert","thresholdFrag","glslVersion","GLSL1","downSampleHMaterial","gaussianDownHFrag","downSampleVMaterial","gaussianDownVFrag","upSampleMaterial","gaussianUpFrag","getFramebuffer","sceneTextureHandle","baseWidth","baseHeight","threshold","renderingData","currentFrame","globalVolume","bloom","thresholdRT","blit","currentTexture","downWidth","downHeight","tempH","setVector2","getTextureSize","tempV","upWidth","upHeight","tempUp","downSampleTexture","ToneMappingPass","mode","TRIANGLE_STRIP","attributes","aPos","drawCount","colorGradingFrag","screenMesh","intensity","active","vignette","smoothness","roundness","colorAdjustments","brightness","contrast","tonemapping","setInt","setVector3","RenderFrame","postProcessingEnabled","enableHDR","editorTransform","_options_editorTransform","_options_postProcessingEnabled","GlobalUniforms","gpuCapability","detail","halfFloatTexture","drawObjectPass","renderPasses","setRenderPasses","bloomPass","addRenderPass","postProcessPass","pass","passes","_renderPasses","renderPass","removeRenderPass","ints","vector3s","vector4s","matrices","samplers","uniforms","Renderbuffer","multiSample","attachment","RenderTargetPool","temporaryRTs","maxUnusedFrames","force","framesOffset","entry","isOccupied","lastFrameReleased","RT","depthBuffer","filter","RGBA32","textureFilter","textureType","hash","descriptionHash","depthType","none","Nearest","depth_stencil_opaque","depth_24_stencil_8_texture","colorAttachment","storeAction","attachments","depthStencilAttachment","release","rt","isWebGL2Available","GPUCapability","setupCapability","isCompressedFormatSupported","cap","compressTextureCapabilityList","level2","textureAnisotropicExt","depthTextureExtension","halfFloatLinear","floatLinear","vaoExt","glAsyncCompileExt","UNSIGNED_INT_24_8","drawBufferExtension","UNSIGNED_INT_24_8_WEBGL","checkLinearTextureFilter","internalFormatDepth16","DEPTH_COMPONENT16","DEPTH_COMPONENT","internalFormatDepth24_stencil8","DEPTH24_STENCIL8","DEPTH_STENCIL","floatTexture","HALF_FLOAT_OES","hasCompressedTextureSupport","maxSample","MAX_SAMPLES","maxVertexUniforms","MAX_VERTEX_UNIFORM_VECTORS","maxVertexTextures","MAX_VERTEX_TEXTURE_IMAGE_UNITS","maxFragmentUniforms","MAX_FRAGMENT_UNIFORM_VECTORS","maxFragmentTextures","MAX_TEXTURE_IMAGE_UNITS","floatColorAttachment","halfFloatColorAttachment","maxTextureSize","MAX_TEXTURE_SIZE","maxShaderTexCount","MAX_COMBINED_TEXTURE_IMAGE_UNITS","maxTextureAnisotropy","MAX_TEXTURE_MAX_ANISOTROPY_EXT","shaderTextureLod","instanceDraw","ktx2Support","drawBuffers","asyncShaderCompile","intIndexElementBuffer","standardDerivatives","readableDepthStencilTextures","writableFragDepth","textureMaxAnisotropyExt","TEXTURE_MAX_ANISOTROPY_EXT","framebufferTexture2D","textarget","bufferStates","buffers","drawBuffersWEBGL","setTextureAnisotropic","texParameterf","createTexture","getError","bindTexture","texImage2D","R16F","texParameteri","TEXTURE_MIN_FILTER","TEXTURE_MAG_FILTER","deleteTexture","CompressTextureCapabilityType","Renderer","currentFramebuffer","renderTargetPool","setGlobalFloat","setGlobalInt","setGlobalVector4","setGlobalVector3","setGlobalMatrix","setViewport","canvasWidth","canvasHeight","action","lost","renderRenderFrame","subMeshIndex","destination","EventEmitter","listeners","off","eventName","listener","on","once","emit","_this_listeners_eventName","_this1","getListeners","SceneTicking","UpdateTickData","lateUpdate","LateUpdateTickData","TickData","ticks","tick","tickComponents","component","addTick","method","callee","Composition","speed","isEnded","loaderData","refContent","startTime","paused","isEndCalled","_textures","videos","reusable","_props_speed","_props_baseRenderOrder","baseRenderOrder","event","onItemMessage","addComposition","videoAsset","HTMLVideoElement","jsonScene","renderSettings","getEngine","renderLevel","consumed","sourceContent","compositions","compositionId","rootItem","VFXItem","endBehavior","componentPath","rootComposition","CompositionComponent","renderOrder","statistic","loadStart","loadTime","totalTime","compileTime","firstFrameTime","interactive","createRenderFrame","buildItemTree","setChildrenRenderOrder","restart","reset","forwardTime","setIndex","getIndex","setSpeed","getSpeed","setTime","resume","pause","getPaused","gotoAndPlay","gotoAndStop","setParent","ss","prepareRender","awake","beginPlay","previousCompositionTime","updateCompositionTime","deltaTimeInMs","updateCamera","shouldDispose","PlayState","Paused","localTime","freeze","forward","getItemByName","getHitTestRay","_this_renderFrame_editorTransform","_this_renderer","hitTest","regions","addInteractiveItem","MESSAGE","phrase","removeInteractiveItem","destroyItem","videoState","removeAttribute","removeComposition","env","clearStencil","clearDepth","clearColor","setEditorTransform","translateByPixel","setPositionByPixel","offloadTexture","textureOffloaded","reloadTexture","compVFXItem","itemMap","contentItems","parentId","getDescendants","listIndex","isEnabled","eventProcessor","_this_eventProcessor","newComponent","com","getComponents","directDescendantsOnly","predicate","results","getDescendantsInternal","vfxItem","setOpacity","opacity","setActive","onActiveChanged","getWorldTransform","tf","_this_composition_camera_getInverseVPRatio","ry","_this_composition_getEngine_canvas_getBoundingClientRect","getBoundingClientRect","rx","getHitTestParams","getCurrentPosition","queue","duplicate","previousObjectIDMap","gatherPreviousObjectID","resetGUID","newItem","_data_duration","_data_visible","content","ParticleSystem","isComposition","instantiatePreComposition","_this_parent","_this_parent1","dataType","VFXItemData","EffectComponent","resetChildrenParent","_composition","refId","findEffectsObjectData","componentPaths","prevInstanceId","resetGUIDRecursive","itemGUID","componentGUID","isSprite","sprite","isParticle","particle","isNull","null","isTree","tree","isCamera","isAncestor","ancestorCandidate","descendantCandidate","current","compositionReusable","_this_composition","_this_composition_reusable","isVisible","Item","Playing","sceneBindings","timelineAsset","TimelineAsset","timelineInstance","TimelineInstance","getReusable","isHitTestSuccess","hitTestRecursive","hitPositions","region","behavior","hitTestItem","skip","hitParams","success","intersectPoint","HitTestType","triangles","boxMin","boxMax","custom","tempPosition","collect","hitTestSuccess","maxCount","startOrder","subCompositionComponent","MeshComponent","meshCollider","MeshCollider","setGeometry","area","getBoundingBoxData","maskManager","previousColorMask","colorMask","maskOptions","mask","_this_material_getVector4","_Time","getVector4","setVector4","ConstraintTarget","PositionConstraint","positionAtRest","positionOffset","constrainX","constrainY","constrainZ","targets","totalWeight","constraintTarget","targetPos","finalX","finalY","finalZ","addTarget","removeTarget","ct","clearTargets","setPositionOffset","setWeight","targetData","PostProcessVolume","MaskableGraphic","_color","ui","interaction","_this_interaction","renderMode","MESH","whiteTexture","occlusion","transparentOcclusion","defaultGeometry","aUV","releasable","indices","TRIANGLES","itemFrag","itemVert","shared","configureMaterial","input","BILLBOARD","VERTICAL_BILLBOARD","HORIZONTAL_BILLBOARD","draw","properties","preMultiAlpha","texParams","enableMacro","disableMacro","maskableGraphicData","ShapeComponent","shapeDirty","materialDirty","graphicsPath","GraphicsPath","fills","strokeAttributes","alignment","Butt","Miter","miterLimit","strokeWidth","strokeCap","strokeJoin","strokes","fillMaterials","strokeMaterials","rendererOptions","gradientStrokeFill","Solid","gradientLayerFill","shapeAttributes","Custom","easingIns","easingOuts","shapes","indexCount","vertexCount","buildPath","buildGeometryFromPath","shapePath","updateMaterials","shapePrimitives","vertices","shapePrimitive","shape","indexOffset","vertOffset","build","triangulate","fillIndexCount","lineStyle","close","closePath","buildLine","strokeIndexCount","positionArray","getAttributeData","uvArray","indexArray","getIndexData","MAX_VALUE","MIN_VALUE","pointsOffset","positionArrayOffset","sizeX","sizeY","uvOffset","setAttributeData","setIndexData","setDrawCount","fillSubMesh","strokeSubMesh","shapeAttribute","customShapeAtribute","indexes","startPoint","moveTo","pointIndex","lastPointIndex","easingOut","easingIn","bezierCurveTo","Ellipse","ellipseData","ellipse","xRadius","yRadius","Rectangle","rectangleData","rect","Star","starData","polyStar","pointCount","outerRadius","innerRadius","outerRoundness","innerRoundness","StarType","Polygon","polygonData","updatePaintMaterial","paint","GradientLinear","GradientAngular","GradientRadial","updateGradientMaterial","gradientStops","endPoint","scaleMode","topRight","bottomLeft","scalingFactor","textureTransform","setMatrix3","gradientColors","stopColor","setVector4Array","setFloats","createMaterialFromRendererOptions","materialProps","createPaint","stroke","customShapeData","customShapeAttribute","ellipseAttribute","rectangleAttribute","starAttribute","polygonAttribute","paintData","Fake3DComponent","loop","amountOfMotion","animationLength","startPositionX","startPositionY","startPositionZ","endPositionX","endPositionY","endPositionZ","amplitudeX","amplitudeY","amplitudeZ","phaseX","phaseY","phaseZ","effectComponent","updateFake3D","_PosX","_PosY","_PosZ","Fake3DAnimationMode","CameraController","_get_prototype_of","_wrap_native_super","_cache","Wrapper","CameraVFXItemLoader","PointerEventData","delta","pointerCurrentRaycast","RaycastResult","EVENT_TYPE_CLICK","EVENT_TYPE_TOUCH_START","EVENT_TYPE_TOUCH_MOVE","EVENT_TYPE_TOUCH_END","PointerEventType","EventSystem","allowPropagation","skipPointerMovePicking","handlers","nativeHandlers","bindListeners","currentTouch","lastTouch","getTouch","touchstart","touchmove","touchend","touchcancel","getTouchEventValue","performance","now","_this_target","touches","changedTouches","touch","cood","getCoord","clientX","clientY","dispatchEvent","cancelable","preventDefault","stopPropagation","String","onClick","onPointerDown","onPointerUp","onPointerMove","callback","hitResults","hitResult","hitComposition","clickInfo","compositionName","handlePointerEvent","hitRegion","eventData","raycast","hitItem","ele","InteractLoader","InteractMesh","previewColor","createMaterial","createGeometry","createMesh","updateMesh","uSize","getVector2","uPos","tempPos","tempScale","indexData","aPoint","stride","LINES","maxVertex","InteractComponent","dragRatio","dragRange","dxRange","dyRange","invalidBorderRange","invalidByBorderRange","duringPlay","_interactive","lastTime","clickable","getDragRangeX","setDragRangeX","getDragRangeY","setDragRangeY","_this_interactData_options","interactData","showPreview","CLICK","previewContent","endDragTarget","DRAG","enableInEditor","beginDragTarget","_this_previewContent","_this_item_composition1","dragEvent","bouncingArg","shouldIgnoreBouncing","handleDragMove","evt","cameraParam","canInteract","depth","sp","_this_dragRange","nx","ny","eventSystem","handlerMap","checkInvalidBorderRange","ref4","assemblyTriangles","indexStart","indexEnd","index0","index1","index2","applyWorldMatrix","boundingBoxData","point0","point1","point2","point3","geometryToTriangles","subMesh","elementSize","SpriteLoader","Playable","onPlayablePlayFlag","onPlayablePauseFlag","playState","setDuration","getPlayState","prepareFrame","processFrame","onPlayableDestroy","PlayableOutput","output","setUserData","userData","getUserData","PlayableAsset","tempColor","ColorPlayable","renderColor","boundObject","activeComponent","getActiveComponent","activeMaterial","_this_activeComponent","_this_activeMaterial","startColor","colorChanged","_this_activeMaterial_getColor","_this_activeMaterial1","colorInc","opacityOverLifetime","colorOverLifetime","clipData","AnimationClip","sampleAnimation","keyFramesDuration","positionCurveData","rotationCurveData","eulerCurvesData","scaleCurvesData","floatCurveData","colorCurveData","findTag","Cone","generate","opt","getArcAngle","arc","arcMode","UNIDIRECTIONAL_CYCLE","BIDIRECTIONAL_CYCLE","UNIFORM_BURST","burstIndex","burstCount","Circle","_d","_h","RectangleEdge","r0","Edge","Donut","dradius","donutRadius","getHorizontalAngle","rz","rh","Hemisphere","TextureShape","anchors","block","pointX","pointY","ShapeNone","CONE","SPHERE","HEMISPHERE","CIRCLE","DONUT","RECTANGLE","EDGE","RECTANGLE_EDGE","TEXTURE","createShape","shapeOptions","Ctrl","ctrl","alignSpeedDirection","upDirection","_shapeOptions_upDirection","linkedList","dim","clockwise","signedArea","insertNode","removeNode","filterPoints","again","steiner","prev","isEar","ear","pointInTriangle","isEarHashed","invSize","minTX","minTY","maxTX","maxTY","zOrder","prevZ","nextZ","compareX","eliminateHole","hole","outerNode","hx","hy","mx","tanMin","locallyInside","sectorContainsSector","findHoleBridge","splitPolygon","getLeftmost","leftmost","cx","cy","px","py","isValidDiagonal","intersects","intersectsPolygon","inside","middleInside","q1","q2","o1","o2","o3","o4","onSegment","Node","b2","an","bp","indexBase","earcut","holeIndices","ib","hasHoles","outerLen","list","eliminateHoles","hackEarcutLinked","tail","numMerges","pSize","qSize","inSize","sortLinked","indexCurve","hackCureLocalIntersections","hackSplitEarcut","POINT_INDEX","getGeometryTriangles","segments","pointData","_options_indexBase","uvTransform","sw","sh","segment","getBezier2DValue","setPoint","rotateVec2","getGeometryByShape","datas","gs","SHAPE_POINTS","SHAPE_SPLITS","getGeometriesByShapeData","aPointData","idx","vec2","angleInRad","cpx0","cpy0","cpx1","cpy1","ddt","Burst","cycles","probability","getGeneratorOptions","timePassed","internalCycles","cycleIndex","LinkNode","Link","findNodeByContent","pre","shiftNode","pushNode","thisObj","forEachReverse","getNodeByIndex","RUNTIME_ENV","RENDER_PREFER_LOOKUP_TEXTURE","TEMPLATE_USE_OFFSCREEN_CANVAS","POST_PROCESS_SETTINGS","getConfig","setConfig","tmp0","tmp1","TrailMesh","pointStart","colorOverTrail","maxTrailCount","widthOverTrail","textureMap","_props_textureMap","minimumVertexDistance","pointCountPerTrail","keyFrameMeta","enableVertexTexture","uniformValues","useAttributeTrailStart","shaderCacheId","uColorOverLifetime","uColorOverTrail","uTrailStart","uOpacityOverLifetimeValue","uWidthOverTrail","uVCurveValues","mtl","trailVert","particleFrag","GLSL3","cacheId","maxVertexCount","maxTriangleCount","bpe","v12","geometryOptions","aColor","aSeed","dataSource","aInfo","aTime","aDir","bufferUsage","DYNAMIC_DRAW","aTrailStart","aTrailStartIndex","preMulAlpha","uMaskTex","checkVertexDistance","trailCursors","addPoint","trailIndex","segmentPerTrail","previousIndex","bpreviousIndex","previousPoint","getTrailPosition","pointStartIndex","calculateDirection","dirStartIndex","dirData","setAttributeSubData","colorData","positionData","bPreviousPoint","previousDir","previousDirStartIndex","indicesStart","indicesData","setIndexSubData","params","trailStart","startData","getFloats","trail","clearAllTrails","minusTime","clearTrail","indicesPerTrail","getPointStartPos","setPointStartPos","escapeTime","getFloat","tempDir","tempDa","tempDb","prePoint","nextPoint","ParticleBehaviourPlayable","particleSystem","ParticleBehaviourPlayableAsset","createPlayable","particleUniformTypeMap","uSprite","uParams","uAcceleration","uGravityModifierValue","uRXByLifeTimeValue","uRYByLifeTimeValue","uRZByLifeTimeValue","uLinearXByLifetimeValue","uLinearYByLifetimeValue","uLinearZByLifetimeValue","uSpeedLifetimeValue","uOrbXByLifetimeValue","uOrbYByLifetimeValue","uOrbZByLifetimeValue","uSizeByLifetimeValue","uSizeYByLifetimeValue","uColorParams","uFSprite","uPreviewColor","uFCurveValues","uFinalTarget","uForceCurve","uOrbCenter","uTexOffset","uPeriodValue","uMovementValue","uStrengthValue","uWaveParams","ParticleMesh","particleCount","cachedRotationVector3","cachedRotationMatrix","cachedLinearMove","tempMatrix3","VERT_MAX_KEY_FRAME_COUNT","useOrbitalVel","sizeOverLifetime","rotationOverLifetime","textureFlip","useSprite","gravity","forceTarget","meshSlots","diffuse","vertexKeyFrameMeta","fragmentKeyFrameMeta","vertex_lookup_texture","animate","col","row","blend","defL","defO","separateAxes","uFCurveValueTexture","vertexCurveTexture","getSlot","uVCurveValueTexture","shaderCache","mtlOptions","particleVert","j12","aVel","aDirX","aDirY","aRot","aOffset","aTranslation","aLinearMove","aRotation0","aRotation1","aRotation2","generateGeometryProps","textureOffsets","getPointColor","clearPoints","resetGeometryData","maxParticleBufferCount","names","getAttributeNames","aPosArray","applyTranslation","applyRotation","applyLinearMove","removePoint","increaseBuffer","inc","aSprite","offsets","delay","wholeUV","vel","sizeOffsets","j3","j4","j8","uv","uvy","ji","dirX","dirY","attrSize","getAttributeStride","baseData","geoData","aTranslationArray","aVelArray","aOffsetArray","expandArray","velocityX","velocityY","velocityZ","velOffset","accX","accY","accZ","aTranslationOffset","aTranslationX","aTranslationY","aTranslationZ","aRotationArray","aRotArray","aSeedArray","aRotationMatrix","aRotOffset","d2r","rotationXD2r","rotationYD2r","rotationZD2r","sinRX","sinRY","sinRZ","cosRX","cosRY","cosRZ","aRotationOffset","matrixArray","aLinearMoveArray","linearMove","aLinearMoveOffset","newSize","newArr","gl2UniformSlots","slot","getParticleMeshShader","positionOverLifetime","textureSheetAnimation","linearPro","orbitalPro","gravityOverLifetime","forceCurve","modifyMaxKeyframeShader","maxFrag","shaderIds","marco","ParticleSystemRenderer","particleMeshProps","trailMeshProps","particleMesh","trailMesh","_this_particleMesh_mesh_material_getVector4","_this_trailMesh","updateTime","minusTimeForLoop","getTextures","particleMeshTextures","trailMeshTextures","setParticlePoint","removeParticlePoint","getParticlePointColor","hasTrail","addTrailPoint","setTrailStartPosition","getTrailStartPosition","interactParams","multiple","removeParticle","isFrozen","frozen","ended","initEmitterTransform","transformPath","emitterTransform","basicTransform","selfPos","particleFollowParent","updateEmitterTransform","_this_basicTransform","addParticle","link","particleLink","linkContent","clearPointTrail","startEmit","started","loopStartTime","lastEmitTime","emission","rateOverTime","generatedCount","bursts","clickedPoint","upDirectionWorld","emitterLifetime","trailUpdated","updateTrail","trails","updatePointTrail","maxEmissionCount","timeDelta","meshTime","shouldSkipGenerate","emissionStopped","createPoint","burst","opts","disabled","burstOffsets","burstOffset","removeBurst","initPoint","previousColorMasks","getParticleBoxes","counter","getPointPosition","dieWithParticles","inheritParticleColor","sizeAffectsWidth","sizeAffectsLifetime","parentAffectsPosition","getPointPositionByIndex","_point_gravity","dl","startSpeed","matrix4","pointPosition","startTurbulence","turbulence","tmpDirX","tmpDirY","tsa","tempSprite","animationDelay","animationDuration","tempRot","start3DRotation","startRotationX","startRotationY","startRotationZ","startRotation","tempSize","start3DSize","startSizeX","startSizeY","startSize","sizeAspect","startDelay","startLifetime","randomArrItem","uvs","addBurst","willAdd","generator","stopParticleEmission","resumeParticleEmission","_props_positionOverLifetime","_textureSheetAnimation","turbulenceX","turbulenceY","turbulenceZ","getBurstOffsets","rotOverLt","linearX","linearY","linearZ","orbitalX","orbitalY","orbitalZ","orbCenter","sizeOverLifetimeGetter","looping","shaderCachePrefix","flip","splits","maxPointPerTrail","maxParticles","isArr","keepArr","TrackMixerPlayable","Playable1","clipPlayables","clipWeights","clipPlayable","setClipWeight","playableOrIndex","getClipWeight","inputIndex","getClipPlayable","ActivationMixerPlayable","boundItem","hasInput","ActivationPlayable","PropertyClipPlayable","PropertyMixerPlayable","preparePath","propertyValue","resetPropertyValue","propertyClipPlayable","addWeightedValue","ColorPropertyMixerPlayable","FloatPropertyMixerPlayable","ParticleMixerPlayable","SpriteColorMixerPlayable","SubCompositionClipPlayable","SubCompositionMixerPlayable","compositionComponent","TransformMixerPlayable","Vector4PropertyMixerPlayable","Vector3PropertyMixerPlayable","Vector2PropertyMixerPlayable","TransformPlayable","originalTransform","linearVelEnable","orbitalVelEnable","sizeSeparateAxes","sizeXOverLifetime","sizeYOverLifetime","sizeZOverLifetime","rotLt","velocity","incZ","TransformPlayableAsset","transformPlayable","transformAnimationData","TimelineClip","toLocalTime","TrackAsset","trackType","clipSeed","clips","updateAnimatedObject","createTrackMixer","createOutput","createPlayableGraph","runtimeClips","createMixerPlayableGraph","clip","compileClips","timelineClips","mixer","timelineClip","createClipPlayable","RuntimeClip","getChildTracks","createClip","newClip","addClip","getClips","findClip","TrackType","parentMixer","playable","getParticleSystem","trackInstance","evaluateAt","clipTime","ActivationTrack","PropertyTrack","propertyNames","FloatPropertyTrack","SpriteColorTrack","SubCompositionTrack","TransformTrack","MaterialTrack","ParticleTrack","Vector4PropertyTrack","Vector3PropertyTrack","Vector2PropertyTrack","ColorPropertyTrack","ObjectBindingTrack","sceneBindingMap","childTrack","particleTrack","createTrack","activationClip","particleClip","SpriteComponent","componentTimeTrack","SpriteComponentTimeTrack","ComponentTimePlayableAsset","EffectComponentTimeTrack","ActivationPlayableAsset","ColorPropertyPlayableAsset","curveData","FloatPropertyPlayableAsset","SubCompositionPlayableAsset","Vector4PropertyPlayableAsset","Vector3ropertyPlayableAsset","Vector3PropertyPlayableAsset","Vector2PropertyPlayableAsset","TrackInstance","trackAsset","tracks","cacheFlattenedTracks","newTrack","invalidate","addSubTracksRecursive","track","allTracks","subTrack","flattenedTracks","masterTrack","masterTrackInstances","sceneBinding","compileTracks","tickTrack","outputTrack","trackInstanceMap","trackMixPlayable","trackOutput","childTrackInstance","updateTrackAnimatedObject","singleSplits","SpriteColorPlayableAsset","spriteColorPlayable","ComponentTimeTrack","ComponentTimePlayable","textureAnimation","renderErrors","texOffset","texRectX","texRectY","texRectW","texRectH","frameIndex","updateGeometry","isRotate90","positionX","positionY","updateGeometryFromMultiSplit","originData","dw","dh","tox","toy","tsx","tsy","ParticleLoader","Point","copyTo","tempPoint","closePointEps","curveEps","square","innerWeight","outerWeight","verts","exx","eyy","eix","eiy","eox","eoy","ex","ey","cx2p0x","cy2p0y","angle0","angle1","startAngle","angleDiff","absAngleDiff","segCount","angleInc","flipAlignment","closed","_verticesStride","_verticesOffset","_indicesOffset","style","orientation","getOrientationOfPoints","firstPoint","closedShape","closedPath","midPointX","midPointY","widthSquared","miterLimitSquared","perpX","perpY","perp1x","perp1y","dist","Round","Square","dx0","dy0","dx1","dy1","pDist","imx","imy","omx","omy","insideWeight","Bevel","eps2","i1","ShapePrimitive","u","aa","ba","ca","da","ea","D","E","F","H","I","J","fa","K","L","M","N","ga","ha","O","P","ia","Q","ja","ka","S","la","ma","na","oa","pa","T","U","ra","sa","V","ta","ua","W","va","wa","xa","ya","za","Aa","Ba","Ca","Da","Ha","Ja","Fa","Ka","Ga","Ia","Ea","libtess","GluTesselator","windingRule","GLU_TESS_WINDING_ODD","GLU_TESS_WINDING_NONZERO","GLU_TESS_WINDING_POSITIVE","GLU_TESS_WINDING_NEGATIVE","GLU_TESS_WINDING_ABS_GEQ_TWO","primitiveType","GL_LINE_LOOP","GL_TRIANGLES","GL_TRIANGLE_STRIP","GL_TRIANGLE_FAN","errorType","GLU_TESS_MISSING_BEGIN_POLYGON","GLU_TESS_MISSING_END_POLYGON","GLU_TESS_MISSING_BEGIN_CONTOUR","GLU_TESS_MISSING_END_CONTOUR","GLU_TESS_COORD_TOO_LARGE","GLU_TESS_NEED_COMBINE_CALLBACK","gluEnum","GLU_TESS_MESH","GLU_TESS_TOLERANCE","GLU_TESS_WINDING_RULE","GLU_TESS_BOUNDARY_ONLY","GLU_INVALID_ENUM","GLU_INVALID_VALUE","GLU_TESS_BEGIN","GLU_TESS_VERTEX","GLU_TESS_END","GLU_TESS_ERROR","GLU_TESS_EDGE_FLAG","GLU_TESS_COMBINE","GLU_TESS_BEGIN_DATA","GLU_TESS_VERTEX_DATA","GLU_TESS_END_DATA","GLU_TESS_ERROR_DATA","GLU_TESS_EDGE_FLAG_DATA","GLU_TESS_COMBINE_DATA","gluDeleteTess","gluTessProperty","gluGetTessProperty","gluTessNormal","gluTessCallback","gluTessVertex","gluTessBeginPolygon","gluTessBeginContour","gluTessEndContour","gluTessEndPolygon","module","tessy","polyVertArray","exports","errno","coords","contours","triangleVerts","contour","flat","polygon","contains","xi","yi","xj","yj","getX","getY","verticesOffset","indicesOffset","getLineEndPointsTriangle","startX","startY","endX","endY","lastX","lastY","RECURSION_LIMIT","FLT_EPSILON","buildAdaptiveBezier","sX","sY","cp1x","cp1y","cp2x","cp2y","eX","eY","distanceTolerance","recursive","x3","y3","x4","y4","x12","y12","x23","y23","x34","y34","x123","y123","x234","y234","x1234","y1234","d3","normx","normy","strokeContains","halfStrokeWidth","innerA","innerB","outerA","outerB","normalizedX","normalizedY","j1","j2","centerX","centerY","centerIndex","PolyStar","starType","in","buildStarPath","buildPolygonPath","lastIndex","rad","perimSegment","numPts","longFlag","longRad","shortRad","longRound","shortRound","longPerimSegment","shortPerimSegment","currentAng","getBounds","rectangle","ShapePath","currentPoly","instructions","instruction","endPoly","ensurePoly","startPoly","radiusX","radiusY","drawShape","_shapePath","canvasPool","CanvasPool","remove","getCanvas","shift","_createOffscreenCanvas","defCanvas","willReadFrequently","saveCanvas","TextLayout","textHeight","_options_textHeight","_options_textWidth","textWidth","textOverflow","_options_textOverflow","_options_textVerticalAlign","textVerticalAlign","textAlign","letterSpace","autoWidth","_options_autoWidth","fontSize","lineHeight","overflow","getOffsetY","lineCount","totalLineHeight","fontScale","offsetY","baseOffset","commonCalculation","offsetResult","middle","getOffsetX","maxWidth","offsetX","TextStyle","isUnderline","underlineHeight","isOutlined","outlineWidth","hasShadow","fontDesc","fontOffset","outline","shadow","textColor","_options_textColor","_options_fontSize","fontWeight","fontStyle","_options_fontFamily","textWeight","outlineColor","shadowBlur","shadowColor","shadowOffsetX","shadowOffsetY","TextComponentBase","isDirty","maxLineWidth","ALPHA_FIX_VALUE","setText","text","setTextAlign","textLayout","setTextVerticalAlign","setTextBaseline","setTextColor","textStyle","setFontFamily","setFontWeight","setFontStyle","setOutlineColor","setOutlineEnabled","setFontScale","setOverflow","getFontDesc","_this_textStyle","setupOutline","strokeStyle","lineWidth","setupShadow","disposeTextTexture","renderToTexture","drawCallback","save","clearRect","fillStyle","imageData","getImageData","disposeOld","initTextBase","DEFAULT_FONTS","TextComponent","effectScaleX","effectScaleY","baseTextWidth","baseScaleX","getDefaultProps","updateWithOptions","substr","updateTexture","_this_getTextureExpandScale","getTextureExpandScale","resetState","renderText","getLineCount","_this_textLayout","charCountInLine","font","textMetrics","measureText","display","setLineHeight","safe","layout","finalHeight","char","_this_getEffectPadding","getEffectPadding","padL","padR","padT","padB","hasEffect","texWidth","texHeight","shiftX","shiftY","charsInfo","charsArray","charOffsetX","chars","hasOutline","charInfo","drawX","drawY","strokeText","fillText","pad","setAutoWidth","normalizedValue","setTextWidth","setTextHeight","setFontSize","setOutlineWidth","setShadowBlur","setShadowColor","setShadowOffsetX","setShadowOffsetY","TextLoader","Asset","BinaryAsset","SerializationHelper","effectsObject","serializedData","serializedProperties","checkTypedArray","serializeArrayProperty","serializeObjectProperty","deserialize","propertyType","deserializeProperty","Uint8ClampedArray","Uint32Array","Float64Array","checkDataPath","checkGLTFNode","nodeIndex","isJoint","checkImageSource","overrideDataPath","referenceObject","objectProperty","arrayProperty","AssetLoader","loadGUID","dataPath","effectsObjectData","findData","uuid","jsonSceneData","Database","arrAdd","ensureFixedNumber","valueType","valueData","getBezierCurveFromHermiteInGE","ensureFixedNumberWithRandom","ensureRGBAValue","ensureColorExpression","ensureGradient","ensureNumberExpression","normalizeColor","toFixed","getGradientColor","ensureFixedVec3","BEZIER_PATH","easing","bezierEasing","keyframeIndex","objectValueToNumber","deleteEmptyValue","r2d","convertAnchor","particleOrigin","currentMaskComponent","getBezierCurveFromHermite","xStart","yStart","xEnd","geHermiteCurves","ymax","ymin","geBezierCurves","bezierControlPoints","version21Migration","json","version","componentMap","version31Migration","shapeComponent","customShapeComponent","easingInFlag","easingOutFlag","version32Migration","processContent","version33Migration","spriteComponent","shapeData","compositionIdToGUIDMap","compositionOptions","version34Migration","idToComponentMap","componentData","spriteComponentData","geometryData","createGeometryDataByShape","shapeComponentData","solidPaintData","version35Migration","RichTextComponent","richTextComponent","useLegacyRichText","lineGap","ensureTextVerticalAlign","convertTextColorTo01","textBaseline","geometryDataName","targetGeometry","_targetGeometry_index","_targetGeometry_aPoint","atlasOffset","positionByteLength","vertexByteLength","indexByteLength","vertexData","channels","indexFormat","semantic","Position","dimension","Uv","infoBuffer","vertexArray","uint8View","binaryData","itemProps","richtext","processMask","renderContent","version30Migration","itemOldIdToGuidMap","oldId","guidToItemMap","nodeId","compositionData","trackDatas","playableAssetDatas","timelineAssetData","itemDataPath","subTrackDatas","newActivationPlayableAsset","newActivationTrackData","newTransformPlayableAssetData","newTrackData","newSpriteColorPlayableAssetData","newSubCompositionPlayableAssetData","bindingTrackData","trackIds","trackData","miscs","playableAsset","convertTimelineAsset","shaders","animations","images","_loop","oldTextureId","realAnchor","pn","_json_plugins","pluginName","spines","convertSpineData","skybox","light","interact","SkyboxComponent","LightComponent","CameraComponent","TreeComponent","SpineComponent","convertParam","resource","atlas","skeletonType","getStandardNullContent","velocityOverLifetime","angularVelocity","v0","standardVersion","reverseParticle","getStandardJSON","_exec","playerVersion","web","_ref_web","jsonVersionMatch","runtimeVersionMatch","major","minor","currentMajor","currentMinor","checkRuntimeVersion","singleVersion","version22Migration","currentVersion","requires","getStandardImage","imageTags","getStandardComposition","imgUsage","_imgs","binUsage","getStandardJSONFromV0","vs","mainVersion","minorVersion","version24Migration","template","astc","android","pvrtc","iOS","getStandardItem","st","previewSize","stdAnchor","originContent","shapeType","sol","trials","orderOffset","getStandardParticleContent","texAni","getStandardSpriteContent","cal","option","NOTIFY","getStandardInteractContent","translateX","translateY","translateZ","rol","rotateX","rotateY","rotateZ","getStandardCameraContent","originTransform","inverseRotation","changeOrder","yx","rotationZYXFromQuat","renderLevelPassSet","BPlus","APlus","passRenderLevel","getBackgroundImage","variables","templateBackground","background","combineImageTemplate","Scene","isJSONObject","isURL","isWithOptions","AssetManager","downloader","timers","updateOptions","pluginData","timeout","_options_timeout","loadScene","rawJSON","assetUrl","timeInfoMessages","gpuInstance","isKTX2Supported","timeInfos","loadTimer","cancelLoading","waitPromise","hookTimeInfo","loadResourcePromise","removeTimer","fonts","_ref","loadedBins","loadedImages","loadedTextures","location","href","baseUrl","loadJSON","parse","processJSON","storage","onPluginSceneLoadStart","processBins","processImages","processFontURL","processTextures","clearTimeout","race","getAssets","customPluginName","loadBins","loadFontFamily","canUseKTX2","useCompressedTexture","disableWebP","disableAVIF","imageURL","webpURL","avifURL","ktx2URL","isVideo","resultImage","HTMLCanvasElement","_tmp","assignImagesToAssets","imageId","createTextureOptionsBySource","fontFace","fontURL","fontCache","FontFace","Encoding","AssetService","builtinObjects","transparentTexture","assembleSceneLoadOptions","updateTextVariables","textVariable","initializeTexture","prepareAssets","assetId","engineAsset","addPackageDatas","objectInstance","destroyBuiltinObjects","int32","float32","float64","isLittleEndian","ByteBuffer","bytes_","position_","text_decoder_","TextDecoder","bytes","capacity","readInt8","readUint8","readInt16","readUint16","readInt32","readUint32","readInt64","BigInt","asIntN","readUint64","asUintN","readFloat32","readFloat64","writeInt8","writeUint8","writeInt16","writeUint16","writeInt32","writeUint32","writeInt64","writeUint64","writeFloat32","writeFloat64","getBufferIdentifier","fromCharCode","__offset","bb_pos","vtable_offset","vtable","__union","bb","__string","opt_encoding","utf8bytes","subarray","UTF8_BYTES","decode","__union_with_string","__indirect","__vector","__vector_len","__has_identifier","ident","createScalarList","listAccessor","listLength","createObjList","unpack","allocate","byte_size","Builder","opt_initial_size","initial_size","minalign","vtable_in_use","isNested","object_start","vtables","vector_num_elems","force_defaults","string_maps","text_encoder","TextEncoder","space","forceDefaults","dataBuffer","asUint8Array","prep","additional_bytes","align_size","old_buf_size","growByteBuffer","addInt8","addInt16","addInt32","addInt64","addFloat32","addFloat64","addFieldInt8","voffset","defaultValue","addFieldInt16","addFieldInt32","addFieldInt64","addFieldFloat32","addFieldFloat64","addFieldOffset","addOffset","addFieldStruct","nested","notNested","startObject","numfields","endObject","vtableloc","trimmed_size","existing_vtable","vt1","outer_loop","vt2","root_table","opt_file_identifier","opt_size_prefix","size_prefix","file_identifier","SIZEOF_INT","FILE_IDENTIFIER_LENGTH","finishSizePrefixed","requiredField","table","field","table_start","vtable_start","startVector","elem_size","num_elems","endVector","createSharedString","createString","utf8","encode","createByteVector","createObjectOffset","pack","createObjectOffsetList","createStructOffsetList","startFunc","new_buf_size","nbb","FBEffectsObjectData","__init","optionalEncoding","dataLength","dataArray","byteOffset","FBEffectsObjectDataT","unpackTo","_o","getRootAsFBEffectsObjectData","getSizePrefixedRootAsFBEffectsObjectData","startFBEffectsObjectData","builder","addDataType","dataTypeOffset","addData","dataOffset","createDataVector","startDataVector","numElems","endFBEffectsObjectData","createFBEffectsObjectData","FBEffectsPackageData","exportObjects","exportObjectsLength","FBEffectsPackageDataT","getRootAsFBEffectsPackageData","getSizePrefixedRootAsFBEffectsPackageData","startFBEffectsPackageData","addExportObjects","exportObjectsOffset","createExportObjectsVector","startExportObjectsVector","endFBEffectsPackageData","finishFBEffectsPackageDataBuffer","finishSizePrefixedFBEffectsPackageDataBuffer","createFBEffectsPackageData","FBSubMesh","FBSubMeshT","getRootAsFBSubMesh","getSizePrefixedRootAsFBSubMesh","startFBSubMesh","addIndexCount","addVertexCount","endFBSubMesh","createFBSubMesh","FBVertexChannel","FBVertexChannelT","getRootAsFBVertexChannel","getSizePrefixedRootAsFBVertexChannel","startFBVertexChannel","addSemantic","semanticOffset","addFormat","addDimension","addNormalize","endFBVertexChannel","createFBVertexChannel","FBVertexData","channelsLength","FBVertexDataT","getRootAsFBVertexData","getSizePrefixedRootAsFBVertexData","startFBVertexData","addChannels","channelsOffset","createChannelsVector","startChannelsVector","endFBVertexData","createFBVertexData","FBGeometryData","subMeshesLength","binaryDataLength","binaryDataArray","boneNames","boneNamesLength","rootBoneName","inverseBindMatrices","inverseBindMatricesLength","inverseBindMatricesArray","FBGeometryDataT","getRootAsFBGeometryData","getSizePrefixedRootAsFBGeometryData","startFBGeometryData","addId","idOffset","addName","nameOffset","addVertexData","vertexDataOffset","addIndexFormat","addIndexOffset","addSubMeshes","subMeshesOffset","createSubMeshesVector","startSubMeshesVector","addMode","addBuffer","bufferOffset","addBinaryData","binaryDataOffset","createBinaryDataVector","startBinaryDataVector","addBoneNames","boneNamesOffset","createBoneNamesVector","startBoneNamesVector","addRootBoneName","rootBoneNameOffset","addInverseBindMatrices","inverseBindMatricesOffset","createInverseBindMatricesVector","startInverseBindMatricesVector","endFBGeometryData","EffectsPackage","exportObjectDatas","serializeToBinary","fbb","flatbuffers","effectsPackage","fbEffectsObjectData","geometryDataToBinary","deserializeFromBinary","fbEffectsPackage","binaryToGeometryData","fbGeometryData","_geometryData_boneNames","_geometryData_rootBoneName","_geometryData_inverseBindMatrices","_geometryData_binaryData","fbVertexdata","fbChannel","fbSubMeshes","fbSubMesh","fbVertexData","vertexChannel","DEFAULT_FPS","Ticker","fps","setFPS","tickers","getFPS","targetFPS","intervalId","raf","requestAnimationFrame","runLoop","cancelAnimationFrame","resetTickers","ticker","Engine","displayScale","offscreenMode","assetManagers","_disposed","pixelRatio","manualRender","runRenderLoop","notifyTouch","assetLoader","assetService","clearResources","addEffectsObjectData","_scene_textureOptions","_jsonScene_items","_jsonScene_materials","_jsonScene_shaders","_jsonScene_geometries","_jsonScene_components","_jsonScene_animations","_jsonScene_bins","_jsonScene_miscs","vfxItemData","materialData","animationData","_step7","_iterator7","miscData","binaryBuffer","_step8","_iterator8","_step9","_iterator9","renderFunction","_this_ticker","_this_ticker1","comps","skipRender","containerWidth","containerHeight","parentElement","getTargetSize","documentWidth","documentElement","clientWidth","_this_compositions","parentEle","targetWidth","targetHeight","displayAspect","computedStyle","getComputedStyle","finalWidth","clientHeight","ratio","addTexture","removeTexture","addMaterial","removeMaterial","addGeometry","geo","removeGeometry","_this_eventSystem","_this_assetService","assetManager","disposeSymbol","PassTextureCache","textureCache","textureRef","requestColorAttachmentTexture","request","refCount","SceneLoader","compositionIndex","loadedScene","compileStart","createComposition","compileAllShaders","assignInspectorName","__SPECTOR_Metadata","__SPECTOR_Object_TAG","displayText","GLGPUBuffer","elementCount","ARRAY_BUFFER","_props_target","_props_type","_props_usage","usage","STATIC_DRAW","bytesPerElement","getBytesPerElementByGLType","glBuffer","createGLBuffer","bufferData","createBuffer","bindBuffer","bufferSubData","elementOffset","deleteBuffer","readSubData","dstBuffer","getBufferSubData","UNSIGNED_INT","UNSIGNED_SHORT","INDEX_TYPE_MAP","GLGeometry","vaos","skin","indicesReleasable","attributesName","processProps","bufferProps","indicesBuffer","createIndicesBuffer","getAttributeBuffer","bufferOption","getAttributeBufferOption","discard","attribute","newData","dirtyFlag","_this_indices","attr","setDrawStart","drawStart","getDrawStart","getDrawCount","getSkinProps","indexProps","ELEMENT_ARRAY_BUFFER","bufferName","subData","POSITIVE_INFINITY","attributesReleasable","_props_drawStart","_props_bufferUsage","_attr_type","base64String","binaryString","decodeBase64ToArrays","hasSemantic","geometryProps","vertexBufferSemanticMap","attribName","attribBuffer","createVertexTypedArray","indexBuffer","createIndexTypedArray","positionChannel","uvChannel","normalChannel","positionBuffer","uvBuffer","normalBuffer","aNormal","_this_indicesBuffer","_this_vaos_name","baseBuffer","arrayBuffer","UInt32","POSITION","TEXCOORD0","TEXCOORD_0","TEXCOORD1","NORMAL","TANGENT","COLOR","JOINTS","JOINTS_0","WEIGHTS","WEIGHTS_0","POSITION_BS0","POSITION_BS1","POSITION_BS2","POSITION_BS3","POSITION_BS4","POSITION_BS5","POSITION_BS6","POSITION_BS7","NORMAL_BS0","NORMAL_BS1","NORMAL_BS2","NORMAL_BS3","TANGENT_BS0","TANGENT_BS1","TANGENT_BS2","TANGENT_BS3","GLVertexArrayObject","ready","vao","createVertexArray","bindVertexArray","createVertexArrayOES","_this_vaoExt","bindVertexArrayOES","deleteVertexArray","deleteVertexArrayOES","GLProgram","program","useProgram","attribInfoMap","createAttribMap","setupAttributes","programId","attrInfo","enableVertexAttribArray","loc","vertexAttribPointer","attribMap","getProgramParameter","ACTIVE_ATTRIBUTES","getActiveAttrib","getAttribLocation","deleteProgram","GLShaderVariant","uniformLocations","samplerChannels","shaderLibrary","compileShader","setMatrix","setMatrixArray","fillShaderInformation","uniformNames","samplerList","avaliableUniforms","getUniforms","samplerName","_this_program","compileResult","shaderSeed","GLShaderLibrary","shaderResults","programMap","glVertShaderMap","glFragShaderMap","shaderAllDone","cachedShaders","asyncCallback","pendings","addShader","mergedMacros","shaderWithMacros","computeShaderCacheId","sourceShared","compiling","linkProgram","createProgram","setupProgram","glProgram","checkComplete","COMPLETION_STATUS_KHR","fail","validateProgram","VALIDATE_STATUS","getProgramInfoLog","_shader_vertex","_shader_fragment","stringHash","fs","vertexShader","createGLShader","VERTEX_SHADER","fragShader","FRAGMENT_SHADER","attachShader","LINK_STATUS","vsCheckResult","checkShader","fsCheckResult","code","strHash","deleteShader","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","line","strings","imul","_obj1","GLRenderer","blitGeometry","blitMaterial","frame","currentCamera","renderRenderPass","currentPass","checkGlobalUniform","getGlobalVector4","glGeometry","drawElements","drawArrays","bindSystemFramebuffer","bit","COLOR_BUFFER_BIT","STENCIL_BUFFER_BIT","DEPTH_BUFFER_BIT","_this_blitGeometry","_this_blitMaterial","deleteResource","drawingBufferWidth","drawingBufferHeight","blitMat","prevFramebuffer","math","copy2","sourceFbo","createFramebuffer","targetFbo","bindFramebuffer","FRAMEBUFFER","COLOR_ATTACHMENT0","textureBuffer","READ_FRAMEBUFFER","DRAW_FRAMEBUFFER","blitFramebuffer","createGLRenderbuffer","renderbuffer","createRenderbuffer","createGLFramebuffer","fbo","isContextLost","createVAO","deleteGLTexture","deleteGPUBuffer","deleteGLFramebuffer","deleteFramebuffer","deleteGLRenderbuffer","deleteRenderbuffer","_this_gl","GLMaterialState","setBlendColor","setBlending","setBlendFunctionParameters","blendSrc","blendDst","blendSrcAlpha","blendDstAlpha","blendFunctionParameters","setBlendEquationParameters","rgb","blendEquationParameters","setDepthTest","setDepthMask","setDepthRange","setDepthFunc","setPolygonOffsetFill","setPolygonOffset","setSampleAlphaToCoverage","setColorMask","setStencilTest","setStencilMask","setStencilRef","setStencilFunc","setStencilOpFail","setStencilOpZFail","setStencilOpZPass","setCulling","setFrontFace","setCullFace","FUNC_ADD","LESS","KEEP","CCW","toggle","SAMPLE_ALPHA_TO_COVERAGE","BLEND","DEPTH_TEST","STENCIL_TEST","CULL_FACE","POLYGON_OFFSET_FILL","stencilMaskSeparate","stencilFuncSeparate","stencilOpSeparate","blendEquationSeparate","blendFuncSeparate","GLMaterial","vector2s","quaternions","matrice3s","floatArrays","vector4Arrays","matrixArrays","uniformDirty","macrosDirty","glMaterialState","keyword","isMacroEnabled","setupStates","checkUniform","_this_engine","getInt","getVector3","getVector4Array","getMatrixArray","setMatrixNumberArray","hasUniform","newProps","clonedMaterial","propertiesData","Transparent","renderFace","Front","Back","vector4Value","textureProperties","scaleOffset","cloneUniforms","sourceMaterial","vec4Array","mat4Array","uniformName","_this_shaderVariant","GLRenderbuffer","bindRenderbuffer","RENDERBUFFER","renderbufferStorage","FORMAT_HALF_FLOAT","FORMAT_FLOAT","GLTexture","_this_source","_this_source_target","clonedTexture","cubeMipmaps","optionsData","optionsCube","generateMipmap","_sourceOptions_generateMipmap","optionsMipmaps","premultiplyAlpha","pixelStorei","UNPACK_PREMULTIPLY_ALPHA_WEBGL","UNPACK_FLIP_Y_WEBGL","createMipmap","textureWidth","textureHeight","_this_texImage2DData","texImage2DData","TEXTURE_CUBE_MAP_POSITIVE_X","_this_texImage2D","face","compressedTexImage2D","setTextureFilters","_options_anisotropic","anisotropic","_options_wrapS","_options_wrapT","isPot","LINEAR_MIPMAP_LINEAR","LINEAR_MIPMAP_NEAREST","NEAREST_MIPMAP_LINEAR","NEAREST_MIPMAP_NEAREST","TEXTURE_WRAP_S","TEXTURE_WRAP_T","_options_name","internalformat","_this_engine_gpuCapability_detail_maxTextureSize","shouldResize","resizeImage","videoWidth","videoHeight","bufferView","neoBuffer","nw","nh","ctx","drawImage","resizeImageByCanvas","offloaded","faces","TEXTURE_CUBE_MAP_NEGATIVE_X","TEXTURE_CUBE_MAP_NEGATIVE_Y","TEXTURE_CUBE_MAP_NEGATIVE_Z","TEXTURE_CUBE_MAP_POSITIVE_Y","TEXTURE_CUBE_MAP_POSITIVE_Z","GLFramebuffer","attachmentTextures","depthStencilStorageType","updateProps","depthTexture","stencilTexture","colorTextures","updateAttachmentTextures","willUseFbo","separateDepthStencil","externalStorage","optDepthStencilTex","depthStencilRenderbuffer","DEPTH_STENCIL_ATTACHMENT","depth_16_opaque","DEPTH_ATTACHMENT","stencil_8_opaque","STENCIL_ATTACHMENT","STENCIL_INDEX8","depth_16_texture","storeInvalidAttachments","getStoreAttachments","colorLen","invalidateFramebuffer","_this_viewport","whiteWebGLTexture","textureUnitDict","unit","activeTexture","TEXTURE0","framebufferRenderbuffer","checkFramebufferStatus","FRAMEBUFFER_COMPLETE","preX","preY","preWidth","preHeight","_this_stencilTexture","_this_depthStencilRenderbuffer","_this_depthTexture","clearAttachment","keepExternal","stencilRenderbuffer","GLContextManager","restoreHandlers","lostHandlers","contextLostListener","_this_canvas","lostHandler","contextRestoredListener","restorable","_this_gl_getExtension","loseContext","addLostHandler","removeLostHandler","addRestoreHandler","restoreHandler","removeRestoreHandler","GLEngine","restoreCompositionsCache","preserveDrawingBuffer","stencil","antialias","premultipliedAlpha","newComposition","maxTextureCount","_this_shaderLibrary","glCapabilityCache","activeTextureIndex","currentRenderbuffer","capability","set1","factor","set2","zNear","zFar","set4","stencilOp","zfail","zpass","red","green","blue","blendFunc","sfactor","dfactor","srcRGB","dstRGB","srcAlpha","dstAlpha","modeRGB","modeAlpha","setPixelStorei","pname","currentTextureBinding","param0","param1","set3","param2","param3","uniform","uniform1f","uniform1i","uniform1fv","setFloat2","setFloat3","setFloat4","uniform4fv","uniformMatrix4fv","uniformMatrix3fv","uniformsNames","getUniformLocation","uniform4f","uniform3f","uniform2f","playerMap","isCanvasUsedByPlayer","getPlayerByCanvas","getActivePlayers","enableDebugType","Player","resumePending","handleEmitEvent","container","renderFramework","_config_interactive","_config_renderOptions","renderOptions","_config_env","willCaptureImage","_possible_constructor_return","framework","useExternalCanvas","cause","assertContainer","appendChild","_this2","player","RESUME_PLAYER","autoPlaying","playing","runningPlayers","assertNoConcurrentPlayers","handleThrowError","getCompositionByName","getCompositions","getAssetManager","sceneUrls","autoplayFlags","baseOrder","_this_assetService_assembleSceneLoadOptions","compositionAutoplay","some","playSequence","resizeToAspect","clearCanvas","destroyCurrentCompositions","parentNode","errorMsg","throwErrorFunc","destroyedErrorMessage","throwError","throwErrorPromiseFunc","Event","compositionCount","hasPlayable","disableAllPlayer","originalMethod","_arguments","_options_flipY","_options_generateMipmap"],"mappings":"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"}