@zephyr3d/scene 0.9.3 → 0.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/dist/animation/animationmask.js +224 -0
  2. package/dist/animation/animationmask.js.map +1 -0
  3. package/dist/animation/animationset.js +268 -67
  4. package/dist/animation/animationset.js.map +1 -1
  5. package/dist/animation/animationtrack.js.map +1 -1
  6. package/dist/animation/eulerrotationtrack.js +3 -0
  7. package/dist/animation/eulerrotationtrack.js.map +1 -1
  8. package/dist/animation/fixed_geometry_cache_track.js +7 -0
  9. package/dist/animation/fixed_geometry_cache_track.js.map +1 -1
  10. package/dist/animation/ik_modifier.js.map +1 -1
  11. package/dist/animation/joint_dynamics/collision.js +6 -4
  12. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  13. package/dist/animation/joint_dynamics/controller.js +390 -43
  14. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  15. package/dist/animation/joint_dynamics/joint_dynamics_system.js +62 -3
  16. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  17. package/dist/animation/joint_dynamics/solver.js +4 -3
  18. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  19. package/dist/animation/joint_dynamics/types.js.map +1 -1
  20. package/dist/animation/joint_dynamics_modifier.js +2 -0
  21. package/dist/animation/joint_dynamics_modifier.js.map +1 -1
  22. package/dist/animation/morphtarget.js +3 -72
  23. package/dist/animation/morphtarget.js.map +1 -1
  24. package/dist/animation/morphtrack.js +3 -0
  25. package/dist/animation/morphtrack.js.map +1 -1
  26. package/dist/animation/pca_geometry_cache_track.js +3 -0
  27. package/dist/animation/pca_geometry_cache_track.js.map +1 -1
  28. package/dist/animation/proptrack.js +3 -0
  29. package/dist/animation/proptrack.js.map +1 -1
  30. package/dist/animation/rotationtrack.js +3 -0
  31. package/dist/animation/rotationtrack.js.map +1 -1
  32. package/dist/animation/scaletrack.js +3 -0
  33. package/dist/animation/scaletrack.js.map +1 -1
  34. package/dist/animation/skeleton.js +254 -79
  35. package/dist/animation/skeleton.js.map +1 -1
  36. package/dist/animation/skeleton_modifier.js.map +1 -1
  37. package/dist/animation/spring/spring_particle.js +4 -4
  38. package/dist/animation/spring/spring_particle.js.map +1 -1
  39. package/dist/animation/spring_modifier.js.map +1 -1
  40. package/dist/animation/translationtrack.js +3 -0
  41. package/dist/animation/translationtrack.js.map +1 -1
  42. package/dist/app/engine.js +129 -17
  43. package/dist/app/engine.js.map +1 -1
  44. package/dist/app/scriptregistry.js +251 -80
  45. package/dist/app/scriptregistry.js.map +1 -1
  46. package/dist/asset/assetmanager.js +133 -102
  47. package/dist/asset/assetmanager.js.map +1 -1
  48. package/dist/asset/loaders/gltf/gltf_loader.js +18 -14
  49. package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
  50. package/dist/asset/loaders/loader.js +1 -6
  51. package/dist/asset/loaders/loader.js.map +1 -1
  52. package/dist/asset/loaders/zabc/zabc_loader.js.map +1 -1
  53. package/dist/asset/model.js +1052 -183
  54. package/dist/asset/model.js.map +1 -1
  55. package/dist/avatar/wardrobe.js +474 -0
  56. package/dist/avatar/wardrobe.js.map +1 -0
  57. package/dist/index.d.ts +1810 -233
  58. package/dist/index.js +13 -3
  59. package/dist/index.js.map +1 -1
  60. package/dist/material/material.js +1 -1
  61. package/dist/material/material.js.map +1 -1
  62. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +6 -3
  63. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  64. package/dist/material/mixins/pbr/common.js +72 -15
  65. package/dist/material/mixins/pbr/common.js.map +1 -1
  66. package/dist/material/msdf_text.js +180 -0
  67. package/dist/material/msdf_text.js.map +1 -0
  68. package/dist/material/msdf_text_sprite.js +64 -0
  69. package/dist/material/msdf_text_sprite.js.map +1 -0
  70. package/dist/material/pbrblueprint.js +21 -6
  71. package/dist/material/pbrblueprint.js.map +1 -1
  72. package/dist/material/shader/helper.js +277 -277
  73. package/dist/material/shader/helper.js.map +1 -1
  74. package/dist/material/sprite_sdf.js +106 -0
  75. package/dist/material/sprite_sdf.js.map +1 -0
  76. package/dist/posteffect/ssr.js +1 -0
  77. package/dist/posteffect/ssr.js.map +1 -1
  78. package/dist/render/abuffer_oit.js +1 -0
  79. package/dist/render/abuffer_oit.js.map +1 -1
  80. package/dist/render/cluster_light.js.map +1 -1
  81. package/dist/render/cull_visitor.js +28 -0
  82. package/dist/render/cull_visitor.js.map +1 -1
  83. package/dist/render/drawable.js.map +1 -1
  84. package/dist/render/drawable_mixin.js +1 -0
  85. package/dist/render/drawable_mixin.js.map +1 -1
  86. package/dist/render/envlight.js +54 -1
  87. package/dist/render/envlight.js.map +1 -1
  88. package/dist/render/fbm_wavegenerator.js +1 -0
  89. package/dist/render/fbm_wavegenerator.js.map +1 -1
  90. package/dist/render/gerstner_wavegenerator.js +1 -0
  91. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  92. package/dist/render/globalbindgroup_allocator.js +1 -0
  93. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  94. package/dist/render/render_queue.js +1 -0
  95. package/dist/render/render_queue.js.map +1 -1
  96. package/dist/render/sky.js +9 -0
  97. package/dist/render/sky.js.map +1 -1
  98. package/dist/scene/basesprite.js +1 -5
  99. package/dist/scene/basesprite.js.map +1 -1
  100. package/dist/scene/batchgroup.js +18 -8
  101. package/dist/scene/batchgroup.js.map +1 -1
  102. package/dist/scene/environment.js +16 -2
  103. package/dist/scene/environment.js.map +1 -1
  104. package/dist/scene/mesh.js +164 -102
  105. package/dist/scene/mesh.js.map +1 -1
  106. package/dist/scene/meshdrawable.js +96 -0
  107. package/dist/scene/meshdrawable.js.map +1 -0
  108. package/dist/scene/msdftext.js +341 -0
  109. package/dist/scene/msdftext.js.map +1 -0
  110. package/dist/scene/msdftextsprite.js +349 -0
  111. package/dist/scene/msdftextsprite.js.map +1 -0
  112. package/dist/scene/particlesys.js +1 -0
  113. package/dist/scene/particlesys.js.map +1 -1
  114. package/dist/scene/scene.js +2 -0
  115. package/dist/scene/scene.js.map +1 -1
  116. package/dist/scene/scene_node.js +437 -230
  117. package/dist/scene/scene_node.js.map +1 -1
  118. package/dist/scene/sdftextsprite.js +322 -0
  119. package/dist/scene/sdftextsprite.js.map +1 -0
  120. package/dist/scene/terrain-cm/grass.js +1 -0
  121. package/dist/scene/terrain-cm/grass.js.map +1 -1
  122. package/dist/scene/terrain-cm/grassmaterial.js +1 -0
  123. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  124. package/dist/scene/terrain-cm/terrain-cm.js +1 -0
  125. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  126. package/dist/scene/textsprite.js +120 -0
  127. package/dist/scene/textsprite.js.map +1 -0
  128. package/dist/scene/water.js +1 -0
  129. package/dist/scene/water.js.map +1 -1
  130. package/dist/shadow/shader.js +1 -0
  131. package/dist/shadow/shader.js.map +1 -1
  132. package/dist/text/font/font_asset.js +884 -0
  133. package/dist/text/font/font_asset.js.map +1 -0
  134. package/dist/text/font/sfnt_reader.js +43 -0
  135. package/dist/text/font/sfnt_reader.js.map +1 -0
  136. package/dist/text/msdf/generator.js +417 -0
  137. package/dist/text/msdf/generator.js.map +1 -0
  138. package/dist/text/msdf/shape.js +146 -0
  139. package/dist/text/msdf/shape.js.map +1 -0
  140. package/dist/text/runtime/msdf_glyph_atlas.js +146 -0
  141. package/dist/text/runtime/msdf_glyph_atlas.js.map +1 -0
  142. package/dist/text/runtime/msdf_text_atlas_manager.js +50 -0
  143. package/dist/text/runtime/msdf_text_atlas_manager.js.map +1 -0
  144. package/dist/text/runtime/text_layout.js +96 -0
  145. package/dist/text/runtime/text_layout.js.map +1 -0
  146. package/dist/utility/blueprint/material/inputs.js +188 -1
  147. package/dist/utility/blueprint/material/inputs.js.map +1 -1
  148. package/dist/utility/blueprint/material/ir.js +16 -1
  149. package/dist/utility/blueprint/material/ir.js.map +1 -1
  150. package/dist/utility/blueprint/material/pbr.js +32 -0
  151. package/dist/utility/blueprint/material/pbr.js.map +1 -1
  152. package/dist/utility/bounding_volume.js.map +1 -1
  153. package/dist/utility/pmrem.js +34 -8
  154. package/dist/utility/pmrem.js.map +1 -1
  155. package/dist/utility/serialization/manager.js +340 -283
  156. package/dist/utility/serialization/manager.js.map +1 -1
  157. package/dist/utility/serialization/scene/animation.js +702 -7
  158. package/dist/utility/serialization/scene/animation.js.map +1 -1
  159. package/dist/utility/serialization/scene/batch.js +2 -0
  160. package/dist/utility/serialization/scene/batch.js.map +1 -1
  161. package/dist/utility/serialization/scene/camera.js +2 -0
  162. package/dist/utility/serialization/scene/camera.js.map +1 -1
  163. package/dist/utility/serialization/scene/light.js +2 -0
  164. package/dist/utility/serialization/scene/light.js.map +1 -1
  165. package/dist/utility/serialization/scene/material.js +1 -0
  166. package/dist/utility/serialization/scene/material.js.map +1 -1
  167. package/dist/utility/serialization/scene/mesh.js +66 -4
  168. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  169. package/dist/utility/serialization/scene/node.js +189 -8
  170. package/dist/utility/serialization/scene/node.js.map +1 -1
  171. package/dist/utility/serialization/scene/particle.js +2 -0
  172. package/dist/utility/serialization/scene/particle.js.map +1 -1
  173. package/dist/utility/serialization/scene/primitive.js +1 -0
  174. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  175. package/dist/utility/serialization/scene/sprite.js +2 -0
  176. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  177. package/dist/utility/serialization/scene/terrain.js +2 -0
  178. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  179. package/dist/utility/serialization/scene/text.js +516 -0
  180. package/dist/utility/serialization/scene/text.js.map +1 -0
  181. package/dist/utility/serialization/scene/water.js +2 -0
  182. package/dist/utility/serialization/scene/water.js.map +1 -1
  183. package/dist/utility/serialization/types.js.map +1 -1
  184. package/dist/utility/textures/sheenlut.js +138 -0
  185. package/dist/utility/textures/sheenlut.js.map +1 -0
  186. package/dist/values.js +48 -48
  187. package/dist/values.js.map +1 -1
  188. package/package.json +3 -3
@@ -307,6 +307,38 @@ import { BaseGraphNode } from '../node.js';
307
307
  'vec2'
308
308
  ],
309
309
  originType: 'vec2'
310
+ },
311
+ {
312
+ id: 6,
313
+ name: 'Output1',
314
+ type: [
315
+ 'vec4'
316
+ ],
317
+ originType: 'vec4'
318
+ },
319
+ {
320
+ id: 7,
321
+ name: 'Output2',
322
+ type: [
323
+ 'vec4'
324
+ ],
325
+ originType: 'vec4'
326
+ },
327
+ {
328
+ id: 8,
329
+ name: 'Output3',
330
+ type: [
331
+ 'vec4'
332
+ ],
333
+ originType: 'vec4'
334
+ },
335
+ {
336
+ id: 9,
337
+ name: 'Output4',
338
+ type: [
339
+ 'vec4'
340
+ ],
341
+ originType: 'vec4'
310
342
  }
311
343
  ];
312
344
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pbr.js","sources":["../../../../src/utility/blueprint/material/pbr.ts"],"sourcesContent":["import type { SerializableClass } from '../../serialization';\r\nimport { BaseGraphNode } from '../node';\r\n\r\n/**\r\n * PBR (Physically Based Rendering) material output node\r\n *\r\n * @remarks\r\n * This is the final output node for PBR materials in the material blueprint graph.\r\n * It defines the complete surface properties using the metallic-roughness workflow,\r\n * which is the industry-standard approach for physically-based materials.\r\n *\r\n * The node accepts all essential PBR material properties:\r\n * - **BaseColor**: The diffuse/albedo color of the surface (what color the surface is)\r\n * - **Metallic**: Whether the surface is metallic (0 = dielectric/non-metal, 1 = metal)\r\n * - **Roughness**: How rough/smooth the surface is (0 = mirror smooth, 1 = completely rough)\r\n * - **Specular**: Controls specular reflectance for dielectrics (non-metals)\r\n * - **Emissive**: Light emitted by the surface (for glowing effects)\r\n * - **Normal**: Surface normal in tangent/world space (for bump/normal mapping)\r\n * - **Tangent**: Surface tangent vector (for anisotropic effects)\r\n * - **Opacity**: Surface transparency (0 = fully transparent, 1 = fully opaque)\r\n *\r\n * All inputs are optional and have sensible defaults. Only the inputs you connect\r\n * will override the default values.\r\n *\r\n * Material workflow:\r\n * 1. Connect texture samples and math nodes to the various inputs\r\n * 2. The shader compiler will generate appropriate PBR lighting code\r\n * 3. The material will respond correctly to scene lighting\r\n *\r\n * @example\r\n * ```typescript\r\n * const output = new PBRBlockNode();\r\n *\r\n * // Basic textured material\r\n * const albedoTex = new TextureSampleNode();\r\n * output.connectInput(1, albedoTex, 1); // BaseColor from texture\r\n *\r\n * // Metal/rough workflow\r\n * const metallicTex = new TextureSampleNode();\r\n * const roughnessTex = new TextureSampleNode();\r\n * output.connectInput(2, metallicTex, 2); // Metallic from R channel\r\n * output.connectInput(3, roughnessTex, 2); // Roughness from R channel\r\n *\r\n * // Normal mapping\r\n * const normalMap = new TextureSampleNode();\r\n * output.connectInput(6, normalMap, 1); // Normal from RGB\r\n *\r\n * // Emissive glow\r\n * const emissiveColor = new ConstantVec3Node();\r\n * emissiveColor.x = 1.0; // Red glow\r\n * output.connectInput(5, emissiveColor, 1);\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * // Advanced material with procedural roughness variation\r\n * const output = new PBRBlockNode();\r\n *\r\n * const baseColor = new ConstantVec3Node();\r\n * baseColor.x = 0.8; baseColor.y = 0.2; baseColor.z = 0.1; // Orange\r\n * output.connectInput(1, baseColor, 1);\r\n *\r\n * // Procedural roughness pattern\r\n * const uv = new VertexUVNode();\r\n * const noise = new NoiseNode();\r\n * noise.connectInput(1, uv, 1);\r\n *\r\n * const roughness = new MixNode();\r\n * roughness.connectInput(1, constant0_3, 1); // Min roughness 0.3\r\n * roughness.connectInput(2, constant0_8, 1); // Max roughness 0.8\r\n * roughness.connectInput(3, noise, 1); // Blend factor\r\n * output.connectInput(3, roughness, 1);\r\n *\r\n * // Non-metallic\r\n * const metallic = new ConstantScalarNode();\r\n * metallic.x = 0.0;\r\n * output.connectInput(2, metallic, 1);\r\n * ```\r\n *\r\n * @public\r\n */\r\nexport class PBRBlockNode extends BaseGraphNode {\r\n /**\r\n * Creates a new PBR material output node\r\n *\r\n * @remarks\r\n * Initializes with 8 input slots for all PBR material properties.\r\n * Each input has:\r\n * - Flexible type acceptance (float can expand to vec3/vec4, etc.)\r\n * - Default values for when no connection is made\r\n * - Origin type that defines the expected canonical type\r\n *\r\n * Default values provide a reasonable starting material:\r\n * - White base color (1, 1, 1, 1)\r\n * - Fully metallic (1.0)\r\n * - Fully rough (1.0)\r\n * - White specular (1, 1, 1)\r\n * - No emission (0, 0, 0)\r\n * - Default surface normal (from vertex data)\r\n * - Default tangent (from vertex data)\r\n * - Fully opaque (1.0)\r\n */\r\n constructor() {\r\n super();\r\n this._inputs = [\r\n {\r\n id: 1,\r\n name: 'BaseColor',\r\n type: ['float', 'vec2', 'vec3', 'vec4'],\r\n defaultValue: [1, 1, 1, 1],\r\n originType: 'vec4'\r\n },\r\n {\r\n id: 2,\r\n name: 'Metallic',\r\n type: ['float'],\r\n defaultValue: [1],\r\n originType: 'float'\r\n },\r\n {\r\n id: 3,\r\n name: 'Roughness',\r\n type: ['float'],\r\n defaultValue: [1],\r\n originType: 'float'\r\n },\r\n {\r\n id: 4,\r\n name: 'Specular',\r\n type: ['float', 'vec2', 'vec3', 'vec4'],\r\n defaultValue: [1, 1, 1],\r\n originType: 'vec3'\r\n },\r\n {\r\n id: 5,\r\n name: 'Emissive',\r\n type: ['float', 'vec2', 'vec3', 'vec4'],\r\n defaultValue: [0, 0, 0],\r\n originType: 'vec3'\r\n },\r\n {\r\n id: 6,\r\n name: 'Normal',\r\n type: ['vec3', 'vec4'],\r\n originType: 'vec3'\r\n },\r\n {\r\n id: 7,\r\n name: 'Tangent',\r\n type: ['vec3'],\r\n originType: 'vec3'\r\n },\r\n {\r\n id: 8,\r\n name: 'Opacity',\r\n type: ['float'],\r\n defaultValue: [1],\r\n originType: 'float'\r\n }\r\n ];\r\n }\r\n /**\r\n * Gets the serialization descriptor for this node type\r\n *\r\n * @returns Serialization class descriptor\r\n *\r\n * @remarks\r\n * No additional properties need to be serialized beyond the base node data\r\n * and input connections.\r\n */\r\n static getSerializationCls(): SerializableClass {\r\n return {\r\n ctor: PBRBlockNode,\r\n name: 'PBRBlockNode',\r\n getProps() {\r\n return [];\r\n }\r\n };\r\n }\r\n /**\r\n * Generates a string representation of this node\r\n *\r\n * @returns 'Output'\r\n *\r\n * @remarks\r\n * This node is typically labeled \"Output\" in the material editor UI\r\n * as it represents the final material output.\r\n */\r\n toString(): string {\r\n return 'Output';\r\n }\r\n /**\r\n * Validates the node state\r\n *\r\n * @returns Empty string (always valid)\r\n *\r\n * @remarks\r\n * The PBR output node is always valid because:\r\n * - All inputs are optional (have default values)\r\n * - Type conversions are handled automatically (float → vec3, etc.)\r\n * - It's the terminal node with no type inference requirements\r\n */\r\n protected validate(): string {\r\n return '';\r\n }\r\n /**\r\n * Gets the output type\r\n *\r\n * @returns Empty string (no outputs)\r\n *\r\n * @remarks\r\n * As a terminal output node, PBRBlockNode has no outputs.\r\n * It consumes the material graph data and provides it to the renderer.\r\n */\r\n protected getType(): string {\r\n return '';\r\n }\r\n}\r\n\r\n/**\r\n * Vertex output node\r\n *\r\n * @public\r\n */\r\nexport class VertexBlockNode extends BaseGraphNode {\r\n constructor() {\r\n super();\r\n this._inputs = [\r\n {\r\n id: 1,\r\n name: 'Position',\r\n type: ['vec3'],\r\n originType: 'vec3'\r\n },\r\n {\r\n id: 2,\r\n name: 'Normal',\r\n type: ['vec3'],\r\n originType: 'vec3'\r\n },\r\n {\r\n id: 3,\r\n name: 'Tangent',\r\n type: ['vec4'],\r\n originType: 'vec4'\r\n },\r\n {\r\n id: 4,\r\n name: 'Color',\r\n type: ['vec4'],\r\n defaultValue: [1, 1, 1, 1],\r\n originType: 'vec4'\r\n },\r\n {\r\n id: 5,\r\n name: 'UV',\r\n type: ['vec2'],\r\n originType: 'vec2'\r\n }\r\n ];\r\n }\r\n /**\r\n * Gets the serialization descriptor for this node type\r\n *\r\n * @returns Serialization class descriptor\r\n *\r\n * @remarks\r\n * No additional properties need to be serialized beyond the base node data\r\n * and input connections.\r\n */\r\n static getSerializationCls(): SerializableClass {\r\n return {\r\n ctor: VertexBlockNode,\r\n name: 'VertexBlockNode',\r\n getProps() {\r\n return [];\r\n }\r\n };\r\n }\r\n /**\r\n * Generates a string representation of this node\r\n *\r\n * @returns 'Output'\r\n *\r\n * @remarks\r\n * This node is typically labeled \"Output\" in the material editor UI\r\n * as it represents the final material output.\r\n */\r\n toString(): string {\r\n return 'VertexOutput';\r\n }\r\n /**\r\n * Validates the node state\r\n *\r\n * @returns Empty string (always valid)\r\n *\r\n * @remarks\r\n * The PBR output node is always valid because:\r\n * - All inputs are optional (have default values)\r\n * - Type conversions are handled automatically (float → vec3, etc.)\r\n * - It's the terminal node with no type inference requirements\r\n */\r\n protected validate(): string {\r\n return '';\r\n }\r\n /**\r\n * Gets the output type\r\n *\r\n * @returns Empty string (no outputs)\r\n *\r\n * @remarks\r\n * As a terminal output node, PBRBlockNode has no outputs.\r\n * It consumes the material graph data and provides it to the renderer.\r\n */\r\n protected getType(): string {\r\n return '';\r\n }\r\n}\r\n\r\n/**\r\n * Sprite material output node\r\n *\r\n * @public\r\n */\r\nexport class SpriteBlockNode extends BaseGraphNode {\r\n /**\r\n * Creates a new Sprite material output node\r\n */\r\n constructor() {\r\n super();\r\n this._inputs = [\r\n {\r\n id: 1,\r\n name: 'Color',\r\n type: ['float', 'vec2', 'vec3', 'vec4'],\r\n defaultValue: [1, 1, 1, 1],\r\n originType: 'vec4'\r\n }\r\n ];\r\n }\r\n /**\r\n * Gets the serialization descriptor for this node type\r\n *\r\n * @returns Serialization class descriptor\r\n *\r\n * @remarks\r\n * No additional properties need to be serialized beyond the base node data\r\n * and input connections.\r\n */\r\n static getSerializationCls(): SerializableClass {\r\n return {\r\n ctor: SpriteBlockNode,\r\n name: 'SpriteBlockNode',\r\n getProps() {\r\n return [];\r\n }\r\n };\r\n }\r\n /**\r\n * Generates a string representation of this node\r\n *\r\n * @returns 'Output'\r\n *\r\n * @remarks\r\n * This node is typically labeled \"Output\" in the material editor UI\r\n * as it represents the final material output.\r\n */\r\n toString(): string {\r\n return 'Output';\r\n }\r\n /**\r\n * Validates the node state\r\n *\r\n * @returns Empty string (always valid)\r\n *\r\n * @remarks\r\n * The PBR output node is always valid because:\r\n * - All inputs are optional (have default values)\r\n * - Type conversions are handled automatically (float → vec3, etc.)\r\n * - It's the terminal node with no type inference requirements\r\n */\r\n protected validate(): string {\r\n return '';\r\n }\r\n /**\r\n * Gets the output type\r\n *\r\n * @returns Empty string (no outputs)\r\n *\r\n * @remarks\r\n * As a terminal output node, PBRBlockNode has no outputs.\r\n * It consumes the material graph data and provides it to the renderer.\r\n */\r\n protected getType(): string {\r\n return '';\r\n }\r\n}\r\n"],"names":["PBRBlockNode","BaseGraphNode","_inputs","id","name","type","defaultValue","originType","getSerializationCls","ctor","getProps","toString","VertexBlockNode","SpriteBlockNode"],"mappings":"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"}
1
+ {"version":3,"file":"pbr.js","sources":["../../../../src/utility/blueprint/material/pbr.ts"],"sourcesContent":["import type { SerializableClass } from '../../serialization';\r\nimport { BaseGraphNode } from '../node';\r\n\r\n/**\r\n * PBR (Physically Based Rendering) material output node\r\n *\r\n * @remarks\r\n * This is the final output node for PBR materials in the material blueprint graph.\r\n * It defines the complete surface properties using the metallic-roughness workflow,\r\n * which is the industry-standard approach for physically-based materials.\r\n *\r\n * The node accepts all essential PBR material properties:\r\n * - **BaseColor**: The diffuse/albedo color of the surface (what color the surface is)\r\n * - **Metallic**: Whether the surface is metallic (0 = dielectric/non-metal, 1 = metal)\r\n * - **Roughness**: How rough/smooth the surface is (0 = mirror smooth, 1 = completely rough)\r\n * - **Specular**: Controls specular reflectance for dielectrics (non-metals)\r\n * - **Emissive**: Light emitted by the surface (for glowing effects)\r\n * - **Normal**: Surface normal in tangent/world space (for bump/normal mapping)\r\n * - **Tangent**: Surface tangent vector (for anisotropic effects)\r\n * - **Opacity**: Surface transparency (0 = fully transparent, 1 = fully opaque)\r\n *\r\n * All inputs are optional and have sensible defaults. Only the inputs you connect\r\n * will override the default values.\r\n *\r\n * Material workflow:\r\n * 1. Connect texture samples and math nodes to the various inputs\r\n * 2. The shader compiler will generate appropriate PBR lighting code\r\n * 3. The material will respond correctly to scene lighting\r\n *\r\n * @example\r\n * ```typescript\r\n * const output = new PBRBlockNode();\r\n *\r\n * // Basic textured material\r\n * const albedoTex = new TextureSampleNode();\r\n * output.connectInput(1, albedoTex, 1); // BaseColor from texture\r\n *\r\n * // Metal/rough workflow\r\n * const metallicTex = new TextureSampleNode();\r\n * const roughnessTex = new TextureSampleNode();\r\n * output.connectInput(2, metallicTex, 2); // Metallic from R channel\r\n * output.connectInput(3, roughnessTex, 2); // Roughness from R channel\r\n *\r\n * // Normal mapping\r\n * const normalMap = new TextureSampleNode();\r\n * output.connectInput(6, normalMap, 1); // Normal from RGB\r\n *\r\n * // Emissive glow\r\n * const emissiveColor = new ConstantVec3Node();\r\n * emissiveColor.x = 1.0; // Red glow\r\n * output.connectInput(5, emissiveColor, 1);\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * // Advanced material with procedural roughness variation\r\n * const output = new PBRBlockNode();\r\n *\r\n * const baseColor = new ConstantVec3Node();\r\n * baseColor.x = 0.8; baseColor.y = 0.2; baseColor.z = 0.1; // Orange\r\n * output.connectInput(1, baseColor, 1);\r\n *\r\n * // Procedural roughness pattern\r\n * const uv = new VertexUVNode();\r\n * const noise = new NoiseNode();\r\n * noise.connectInput(1, uv, 1);\r\n *\r\n * const roughness = new MixNode();\r\n * roughness.connectInput(1, constant0_3, 1); // Min roughness 0.3\r\n * roughness.connectInput(2, constant0_8, 1); // Max roughness 0.8\r\n * roughness.connectInput(3, noise, 1); // Blend factor\r\n * output.connectInput(3, roughness, 1);\r\n *\r\n * // Non-metallic\r\n * const metallic = new ConstantScalarNode();\r\n * metallic.x = 0.0;\r\n * output.connectInput(2, metallic, 1);\r\n * ```\r\n *\r\n * @public\r\n */\r\nexport class PBRBlockNode extends BaseGraphNode {\r\n /**\r\n * Creates a new PBR material output node\r\n *\r\n * @remarks\r\n * Initializes with 8 input slots for all PBR material properties.\r\n * Each input has:\r\n * - Flexible type acceptance (float can expand to vec3/vec4, etc.)\r\n * - Default values for when no connection is made\r\n * - Origin type that defines the expected canonical type\r\n *\r\n * Default values provide a reasonable starting material:\r\n * - White base color (1, 1, 1, 1)\r\n * - Fully metallic (1.0)\r\n * - Fully rough (1.0)\r\n * - White specular (1, 1, 1)\r\n * - No emission (0, 0, 0)\r\n * - Default surface normal (from vertex data)\r\n * - Default tangent (from vertex data)\r\n * - Fully opaque (1.0)\r\n */\r\n constructor() {\r\n super();\r\n this._inputs = [\r\n {\r\n id: 1,\r\n name: 'BaseColor',\r\n type: ['float', 'vec2', 'vec3', 'vec4'],\r\n defaultValue: [1, 1, 1, 1],\r\n originType: 'vec4'\r\n },\r\n {\r\n id: 2,\r\n name: 'Metallic',\r\n type: ['float'],\r\n defaultValue: [1],\r\n originType: 'float'\r\n },\r\n {\r\n id: 3,\r\n name: 'Roughness',\r\n type: ['float'],\r\n defaultValue: [1],\r\n originType: 'float'\r\n },\r\n {\r\n id: 4,\r\n name: 'Specular',\r\n type: ['float', 'vec2', 'vec3', 'vec4'],\r\n defaultValue: [1, 1, 1],\r\n originType: 'vec3'\r\n },\r\n {\r\n id: 5,\r\n name: 'Emissive',\r\n type: ['float', 'vec2', 'vec3', 'vec4'],\r\n defaultValue: [0, 0, 0],\r\n originType: 'vec3'\r\n },\r\n {\r\n id: 6,\r\n name: 'Normal',\r\n type: ['vec3', 'vec4'],\r\n originType: 'vec3'\r\n },\r\n {\r\n id: 7,\r\n name: 'Tangent',\r\n type: ['vec3'],\r\n originType: 'vec3'\r\n },\r\n {\r\n id: 8,\r\n name: 'Opacity',\r\n type: ['float'],\r\n defaultValue: [1],\r\n originType: 'float'\r\n }\r\n ];\r\n }\r\n /**\r\n * Gets the serialization descriptor for this node type\r\n *\r\n * @returns Serialization class descriptor\r\n *\r\n * @remarks\r\n * No additional properties need to be serialized beyond the base node data\r\n * and input connections.\r\n */\r\n static getSerializationCls(): SerializableClass {\r\n return {\r\n ctor: PBRBlockNode,\r\n name: 'PBRBlockNode',\r\n getProps() {\r\n return [];\r\n }\r\n };\r\n }\r\n /**\r\n * Generates a string representation of this node\r\n *\r\n * @returns 'Output'\r\n *\r\n * @remarks\r\n * This node is typically labeled \"Output\" in the material editor UI\r\n * as it represents the final material output.\r\n */\r\n toString(): string {\r\n return 'Output';\r\n }\r\n /**\r\n * Validates the node state\r\n *\r\n * @returns Empty string (always valid)\r\n *\r\n * @remarks\r\n * The PBR output node is always valid because:\r\n * - All inputs are optional (have default values)\r\n * - Type conversions are handled automatically (float → vec3, etc.)\r\n * - It's the terminal node with no type inference requirements\r\n */\r\n protected validate(): string {\r\n return '';\r\n }\r\n /**\r\n * Gets the output type\r\n *\r\n * @returns Empty string (no outputs)\r\n *\r\n * @remarks\r\n * As a terminal output node, PBRBlockNode has no outputs.\r\n * It consumes the material graph data and provides it to the renderer.\r\n */\r\n protected getType(): string {\r\n return '';\r\n }\r\n}\r\n\r\n/**\r\n * Vertex output node\r\n *\r\n * @public\r\n */\r\nexport class VertexBlockNode extends BaseGraphNode {\r\n constructor() {\r\n super();\r\n this._inputs = [\r\n {\r\n id: 1,\r\n name: 'Position',\r\n type: ['vec3'],\r\n originType: 'vec3'\r\n },\r\n {\r\n id: 2,\r\n name: 'Normal',\r\n type: ['vec3'],\r\n originType: 'vec3'\r\n },\r\n {\r\n id: 3,\r\n name: 'Tangent',\r\n type: ['vec4'],\r\n originType: 'vec4'\r\n },\r\n {\r\n id: 4,\r\n name: 'Color',\r\n type: ['vec4'],\r\n defaultValue: [1, 1, 1, 1],\r\n originType: 'vec4'\r\n },\r\n {\r\n id: 5,\r\n name: 'UV',\r\n type: ['vec2'],\r\n originType: 'vec2'\r\n },\r\n {\r\n id: 6,\r\n name: 'Output1',\r\n type: ['vec4'],\r\n originType: 'vec4'\r\n },\r\n {\r\n id: 7,\r\n name: 'Output2',\r\n type: ['vec4'],\r\n originType: 'vec4'\r\n },\r\n {\r\n id: 8,\r\n name: 'Output3',\r\n type: ['vec4'],\r\n originType: 'vec4'\r\n },\r\n {\r\n id: 9,\r\n name: 'Output4',\r\n type: ['vec4'],\r\n originType: 'vec4'\r\n }\r\n ];\r\n }\r\n /**\r\n * Gets the serialization descriptor for this node type\r\n *\r\n * @returns Serialization class descriptor\r\n *\r\n * @remarks\r\n * No additional properties need to be serialized beyond the base node data\r\n * and input connections.\r\n */\r\n static getSerializationCls(): SerializableClass {\r\n return {\r\n ctor: VertexBlockNode,\r\n name: 'VertexBlockNode',\r\n getProps() {\r\n return [];\r\n }\r\n };\r\n }\r\n /**\r\n * Generates a string representation of this node\r\n *\r\n * @returns 'Output'\r\n *\r\n * @remarks\r\n * This node is typically labeled \"Output\" in the material editor UI\r\n * as it represents the final material output.\r\n */\r\n toString(): string {\r\n return 'VertexOutput';\r\n }\r\n /**\r\n * Validates the node state\r\n *\r\n * @returns Empty string (always valid)\r\n *\r\n * @remarks\r\n * The PBR output node is always valid because:\r\n * - All inputs are optional (have default values)\r\n * - Type conversions are handled automatically (float → vec3, etc.)\r\n * - It's the terminal node with no type inference requirements\r\n */\r\n protected validate(): string {\r\n return '';\r\n }\r\n /**\r\n * Gets the output type\r\n *\r\n * @returns Empty string (no outputs)\r\n *\r\n * @remarks\r\n * As a terminal output node, PBRBlockNode has no outputs.\r\n * It consumes the material graph data and provides it to the renderer.\r\n */\r\n protected getType(): string {\r\n return '';\r\n }\r\n}\r\n\r\n/**\r\n * Sprite material output node\r\n *\r\n * @public\r\n */\r\nexport class SpriteBlockNode extends BaseGraphNode {\r\n /**\r\n * Creates a new Sprite material output node\r\n */\r\n constructor() {\r\n super();\r\n this._inputs = [\r\n {\r\n id: 1,\r\n name: 'Color',\r\n type: ['float', 'vec2', 'vec3', 'vec4'],\r\n defaultValue: [1, 1, 1, 1],\r\n originType: 'vec4'\r\n }\r\n ];\r\n }\r\n /**\r\n * Gets the serialization descriptor for this node type\r\n *\r\n * @returns Serialization class descriptor\r\n *\r\n * @remarks\r\n * No additional properties need to be serialized beyond the base node data\r\n * and input connections.\r\n */\r\n static getSerializationCls(): SerializableClass {\r\n return {\r\n ctor: SpriteBlockNode,\r\n name: 'SpriteBlockNode',\r\n getProps() {\r\n return [];\r\n }\r\n };\r\n }\r\n /**\r\n * Generates a string representation of this node\r\n *\r\n * @returns 'Output'\r\n *\r\n * @remarks\r\n * This node is typically labeled \"Output\" in the material editor UI\r\n * as it represents the final material output.\r\n */\r\n toString(): string {\r\n return 'Output';\r\n }\r\n /**\r\n * Validates the node state\r\n *\r\n * @returns Empty string (always valid)\r\n *\r\n * @remarks\r\n * The PBR output node is always valid because:\r\n * - All inputs are optional (have default values)\r\n * - Type conversions are handled automatically (float → vec3, etc.)\r\n * - It's the terminal node with no type inference requirements\r\n */\r\n protected validate(): string {\r\n return '';\r\n }\r\n /**\r\n * Gets the output type\r\n *\r\n * @returns Empty string (no outputs)\r\n *\r\n * @remarks\r\n * As a terminal output node, PBRBlockNode has no outputs.\r\n * It consumes the material graph data and provides it to the renderer.\r\n */\r\n protected getType(): string {\r\n return '';\r\n }\r\n}\r\n"],"names":["PBRBlockNode","BaseGraphNode","_inputs","id","name","type","defaultValue","originType","getSerializationCls","ctor","getProps","toString","VertexBlockNode","SpriteBlockNode"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bounding_volume.js","sources":["../../src/utility/bounding_volume.ts"],"sourcesContent":["import type { Vector3, Matrix4x4, Plane } from '@zephyr3d/base';\r\nimport { Frustum, AABB, ClipState } from '@zephyr3d/base';\r\n\r\n/**\r\n * Base interface for any kind of bounding volumes\r\n * @public\r\n */\r\nexport interface BoundingVolume {\r\n /**\r\n * Creates a new bounding volume by copying from this bounding volume\r\n */\r\n clone(): BoundingVolume;\r\n /**\r\n * Creates a new bounding volume by tranforming this bounding volume by a matrix\r\n * @param matrix - The transform matrix\r\n * @returns The created bounding volume\r\n */\r\n transform(matrix: Matrix4x4): BoundingVolume;\r\n /**\r\n * Check if this bounding volume is behind a plane\r\n * @param plane - The plane to check\r\n * @returns true if the bounding volume behinds the plane, false otherwise\r\n */\r\n behindPlane(plane: Plane): boolean;\r\n /**\r\n * Check if this bounding volume is outside a frustum\r\n * @param frustum - The frustum to check\r\n * @returns true if the bounding volume outsides the frustum, false otherwise\r\n */\r\n outsideFrustum(frustum: Frustum | Matrix4x4): boolean;\r\n /**\r\n * Gets the minimum AABB that contains the bounding volume\r\n * @returns The mimimum AABB that contains the bounding volume\r\n */\r\n toAABB(): AABB;\r\n}\r\n\r\n/**\r\n * The bounding box class\r\n * @public\r\n */\r\nexport class BoundingBox extends AABB implements BoundingVolume {\r\n /**\r\n * Creates an empty bounding box\r\n */\r\n constructor();\r\n /**\r\n * Creates a bounding box from an AABB\r\n * @param box - The AABB\r\n */\r\n constructor(box: AABB);\r\n /**\r\n * Creates a bounding box from the min point and the max point\r\n * @param minPoint - Min point of the box\r\n * @param maxPoint - Max point of the box\r\n */\r\n constructor(minPoint: Vector3, maxPoint: Vector3);\r\n constructor(arg0?: Vector3 | AABB, arg1?: Vector3) {\r\n super(arg0 as any, arg1!);\r\n }\r\n /** {@inheritDoc BoundingVolume.behindPlane} */\r\n behindPlane(plane: Plane): boolean {\r\n return this.toAABB().behindPlane(plane);\r\n }\r\n /** {@inheritDoc BoundingVolume.clone} */\r\n clone() {\r\n return new BoundingBox(this);\r\n }\r\n /** {@inheritDoc BoundingVolume.transform} */\r\n transform(matrix: Matrix4x4) {\r\n return new BoundingBox(AABB.transform(this, matrix));\r\n }\r\n /** {@inheritDoc BoundingVolume.outsideFrustum} */\r\n outsideFrustum(frustum: Frustum | Matrix4x4) {\r\n return (\r\n (frustum instanceof Frustum ? this.getClipStateWithFrustum(frustum) : this.getClipState(frustum)) ===\r\n ClipState.NOT_CLIPPED\r\n );\r\n }\r\n /** {@inheritDoc BoundingVolume.toAABB} */\r\n toAABB() {\r\n return this;\r\n }\r\n}\r\n"],"names":["BoundingBox","AABB","arg0","arg1","behindPlane","plane","toAABB","clone","transform","matrix","outsideFrustum","frustum","Frustum","getClipStateWithFrustum","getClipState","ClipState","NOT_CLIPPED"],"mappings":";;AAqCA;;;IAIO,MAAMA,WAAoBC,SAAAA,IAAAA,CAAAA;IAgB/B,WAAYC,CAAAA,IAAqB,EAAEC,IAAc,CAAE;AACjD,QAAA,KAAK,CAACD,IAAaC,EAAAA,IAAAA,CAAAA;AACrB;oDAEAC,WAAYC,CAAAA,KAAY,EAAW;AACjC,QAAA,OAAO,IAAI,CAACC,MAAM,EAAA,CAAGF,WAAW,CAACC,KAAAA,CAAAA;AACnC;AACA,8CACAE,KAAQ,GAAA;QACN,OAAO,IAAIP,YAAY,IAAI,CAAA;AAC7B;kDAEAQ,SAAUC,CAAAA,MAAiB,EAAE;AAC3B,QAAA,OAAO,IAAIT,WAAYC,CAAAA,IAAAA,CAAKO,SAAS,CAAC,IAAI,EAAEC,MAAAA,CAAAA,CAAAA;AAC9C;uDAEAC,cAAeC,CAAAA,OAA4B,EAAE;AAC3C,QAAA,OACE,CAACA,OAAAA,YAAmBC,OAAU,GAAA,IAAI,CAACC,uBAAuB,CAACF,OAAW,CAAA,GAAA,IAAI,CAACG,YAAY,CAACH,OAAO,CAAA,MAC/FI,UAAUC,WAAW;AAEzB;AACA,+CACAV,MAAS,GAAA;AACP,QAAA,OAAO,IAAI;AACb;AACF;;;;"}
1
+ {"version":3,"file":"bounding_volume.js","sources":["../../src/utility/bounding_volume.ts"],"sourcesContent":["import type { Vector3, Matrix4x4, Plane } from '@zephyr3d/base';\r\nimport { Frustum, AABB, ClipState } from '@zephyr3d/base';\r\n\r\n/**\r\n * Base interface for any kind of bounding volumes\r\n * @public\r\n */\r\nexport interface BoundingVolume {\r\n /**\r\n * Creates a new bounding volume by copying from this bounding volume\r\n */\r\n clone(): BoundingVolume;\r\n /**\r\n * Creates a new bounding volume by tranforming this bounding volume by a matrix\r\n * @param matrix - The transform matrix\r\n * @returns The created bounding volume\r\n */\r\n transform(matrix: Matrix4x4): BoundingVolume;\r\n /**\r\n * Check if this bounding volume is behind a plane\r\n * @param plane - The plane to check\r\n * @returns true if the bounding volume behinds the plane, false otherwise\r\n */\r\n behindPlane(plane: Plane): boolean;\r\n /**\r\n * Check if this bounding volume is outside a frustum\r\n * @param frustum - The frustum to check\r\n * @returns true if the bounding volume outsides the frustum, false otherwise\r\n */\r\n outsideFrustum(frustum: Frustum | Matrix4x4): boolean;\r\n /**\r\n * Gets the minimum AABB that contains the bounding volume\r\n * @returns The mimimum AABB that contains the bounding volume\r\n */\r\n toAABB(): AABB;\r\n}\r\n\r\n/**\r\n * The bounding box class\r\n * @public\r\n */\r\nexport class BoundingBox extends AABB implements BoundingVolume {\r\n /**\r\n * Creates an empty bounding box\r\n */\r\n constructor();\r\n /**\r\n * Creates a bounding box from an AABB\r\n * @param box - The AABB\r\n */\r\n constructor(box: AABB);\r\n /**\r\n * Creates a bounding box from the min point and the max point\r\n * @param minPoint - Min point of the box\r\n * @param maxPoint - Max point of the box\r\n */\r\n constructor(minPoint: Vector3, maxPoint: Vector3);\r\n constructor(arg0?: Vector3 | AABB, arg1?: Vector3) {\r\n super(arg0 as any, arg1!);\r\n }\r\n /** {@inheritDoc BoundingVolume.behindPlane} */\r\n behindPlane(plane: Plane): boolean {\r\n return this.toAABB().behindPlane(plane);\r\n }\r\n /** {@inheritDoc BoundingVolume.clone} */\r\n clone() {\r\n return new BoundingBox(this) as this;\r\n }\r\n /** {@inheritDoc BoundingVolume.transform} */\r\n transform(matrix: Matrix4x4) {\r\n return new BoundingBox(AABB.transform(this, matrix));\r\n }\r\n /** {@inheritDoc BoundingVolume.outsideFrustum} */\r\n outsideFrustum(frustum: Frustum | Matrix4x4) {\r\n return (\r\n (frustum instanceof Frustum ? this.getClipStateWithFrustum(frustum) : this.getClipState(frustum)) ===\r\n ClipState.NOT_CLIPPED\r\n );\r\n }\r\n /** {@inheritDoc BoundingVolume.toAABB} */\r\n toAABB() {\r\n return this;\r\n }\r\n}\r\n"],"names":["BoundingBox","AABB","arg0","arg1","behindPlane","plane","toAABB","clone","transform","matrix","outsideFrustum","frustum","Frustum","getClipStateWithFrustum","getClipState","ClipState","NOT_CLIPPED"],"mappings":";;AAqCA;;;IAIO,MAAMA,WAAoBC,SAAAA,IAAAA,CAAAA;IAgB/B,WAAYC,CAAAA,IAAqB,EAAEC,IAAc,CAAE;AACjD,QAAA,KAAK,CAACD,IAAaC,EAAAA,IAAAA,CAAAA;AACrB;oDAEAC,WAAYC,CAAAA,KAAY,EAAW;AACjC,QAAA,OAAO,IAAI,CAACC,MAAM,EAAA,CAAGF,WAAW,CAACC,KAAAA,CAAAA;AACnC;AACA,8CACAE,KAAQ,GAAA;QACN,OAAO,IAAIP,YAAY,IAAI,CAAA;AAC7B;kDAEAQ,SAAUC,CAAAA,MAAiB,EAAE;AAC3B,QAAA,OAAO,IAAIT,WAAYC,CAAAA,IAAAA,CAAKO,SAAS,CAAC,IAAI,EAAEC,MAAAA,CAAAA,CAAAA;AAC9C;uDAEAC,cAAeC,CAAAA,OAA4B,EAAE;AAC3C,QAAA,OACE,CAACA,OAAAA,YAAmBC,OAAU,GAAA,IAAI,CAACC,uBAAuB,CAACF,OAAW,CAAA,GAAA,IAAI,CAACG,YAAY,CAACH,OAAO,CAAA,MAC/FI,UAAUC,WAAW;AAEzB;AACA,+CACAV,MAAS,GAAA;AACP,QAAA,OAAO,IAAI;AACb;AACF;;;;"}
@@ -101,7 +101,7 @@ function createPMREMProgram(type, numSamples) {
101
101
  });
102
102
  },
103
103
  fragment (pb) {
104
- if (type === 'ggx') {
104
+ if (type === 'ggx' || type === 'charlie') {
105
105
  this.alphaG = pb.float().uniform(0);
106
106
  }
107
107
  this.vFilteringInfo = pb.vec3().uniform(0);
@@ -206,7 +206,7 @@ function createPMREMProgram(type, numSamples) {
206
206
  this.$return(this.result);
207
207
  });
208
208
  }
209
- if (type === 'ggx') {
209
+ if (type === 'ggx' || type === 'charlie') {
210
210
  pb.func('hemisphereImportanceSampleDggx', [
211
211
  pb.vec2('u'),
212
212
  pb.float('a')
@@ -217,6 +217,15 @@ function createPMREMProgram(type, numSamples) {
217
217
  this.$l.sinTheta = pb.sqrt(pb.sub(1, this.cosTheta2));
218
218
  this.$return(pb.vec3(pb.mul(pb.cos(this.phi), this.sinTheta), pb.mul(pb.sin(this.phi), this.sinTheta), this.cosTheta));
219
219
  });
220
+ pb.func('hemisphereImportanceSampleCharlie', [
221
+ pb.vec2('u'),
222
+ pb.float('a')
223
+ ], function() {
224
+ this.$l.phi = pb.mul(this.u.x, 2 * Math.PI);
225
+ this.$l.sinTheta = pb.pow(this.u.y, pb.div(this.a, pb.add(pb.mul(2, this.a), 1)));
226
+ this.$l.cosTheta = pb.sqrt(pb.sub(1, pb.mul(this.sinTheta, this.sinTheta)));
227
+ this.$return(pb.vec3(pb.mul(pb.cos(this.phi), this.sinTheta), pb.mul(pb.sin(this.phi), this.sinTheta), this.cosTheta));
228
+ });
220
229
  pb.func('normalDistributionFunction_TrowbridgeReitzGGX', [
221
230
  pb.float('NoH'),
222
231
  pb.float('alphaG')
@@ -225,6 +234,15 @@ function createPMREMProgram(type, numSamples) {
225
234
  this.$l.d = pb.add(pb.mul(this.NoH, this.NoH, pb.sub(this.a2, 1)), 1);
226
235
  this.$return(pb.div(this.a2, pb.mul(this.d, this.d, Math.PI)));
227
236
  });
237
+ pb.func('normalDistributionFunction_Charlie', [
238
+ pb.float('NoH'),
239
+ pb.float('roughness')
240
+ ], function() {
241
+ this.$l.invR = pb.div(1, pb.max(this.roughness, 0.000001));
242
+ this.$l.cos2h = pb.mul(this.NoH, this.NoH);
243
+ this.$l.sin2h = pb.max(pb.sub(1, this.cos2h), 0.0078125);
244
+ this.$return(pb.div(pb.mul(pb.add(this.invR, 2), pb.pow(this.sin2h, pb.mul(this.invR, 0.5))), 2 * Math.PI));
245
+ });
228
246
  pb.func('radiance', [
229
247
  pb.float('alphaG'),
230
248
  pb.vec3('direction'),
@@ -251,14 +269,22 @@ function createPMREMProgram(type, numSamples) {
251
269
  this.$l.weight = pb.float(0);
252
270
  this.$for(pb.int('i'), 0, numSamples, function() {
253
271
  this.$l.Xi = this.hammersley2d(this.i, numSamples);
254
- this.$l.H = this.hemisphereImportanceSampleDggx(this.Xi, this.alphaG);
272
+ if (type === 'ggx') {
273
+ this.$l.H = this.hemisphereImportanceSampleDggx(this.Xi, this.alphaG);
274
+ } else {
275
+ this.$l.H = this.hemisphereImportanceSampleCharlie(this.Xi, this.alphaG);
276
+ }
255
277
  this.$l.NoV = pb.float(1);
256
278
  this.$l.NoH = this.H.z;
257
279
  this.$l.NoH2 = pb.mul(this.H.z, this.H.z);
258
280
  this.$l.NoL = pb.sub(pb.mul(this.NoH2, 2), 1);
259
281
  this.$l.L = pb.normalize(pb.vec3(pb.mul(this.NoH, this.H.x, 2), pb.mul(this.NoH, this.H.y, 2), this.NoL));
260
282
  this.$if(pb.greaterThan(this.NoL, 0), function() {
261
- this.$l.pdf_inversed = pb.div(4, this.normalDistributionFunction_TrowbridgeReitzGGX(this.NoH, this.alphaG));
283
+ if (type === 'ggx') {
284
+ this.$l.pdf_inversed = pb.div(4, this.normalDistributionFunction_TrowbridgeReitzGGX(this.NoH, this.alphaG));
285
+ } else {
286
+ this.$l.pdf_inversed = pb.div(4, this.normalDistributionFunction_Charlie(this.NoH, this.alphaG));
287
+ }
262
288
  this.$l.omegaS = pb.mul(this.pdf_inversed, this.NUM_SAMPLES_FLOAT_INVERSED);
263
289
  this.$l.l = pb.add(pb.sub(this.log4(this.omegaS), this.log4(this.omegaP)), this.log4(this.K));
264
290
  this.$l.mipLevel = pb.clamp(this.l, 0, this.maxLevel);
@@ -273,7 +299,7 @@ function createPMREMProgram(type, numSamples) {
273
299
  });
274
300
  }
275
301
  pb.main(function() {
276
- if (type === 'ggx') {
302
+ if (type === 'ggx' || type === 'charlie') {
277
303
  this.$l.color = this.radiance(this.alphaG, this.$inputs.direction, this.vFilteringInfo);
278
304
  }
279
305
  if (type === 'lambertian') {
@@ -293,7 +319,7 @@ function doPrefilterCubemap(type, roughness, miplevel, srcTexture, sampler, dstF
293
319
  bindgroup.setValue('vFilteringInfo', filteringInfo);
294
320
  bindgroup.setValue('hdrScale', 1);
295
321
  bindgroup.setTexture('inputTexture', srcTexture);
296
- if (type === 'ggx') {
322
+ if (type === 'ggx' || type === 'charlie') {
297
323
  bindgroup.setValue('alphaG', roughness);
298
324
  }
299
325
  device.setProgram(program);
@@ -339,10 +365,10 @@ function doPrefilterCubemap(type, roughness, miplevel, srcTexture, sampler, dstF
339
365
  const attachMiplevel = fb.getColorAttachmentMipLevel(0);
340
366
  const generateMipmap = fb.getColorAttachmentGenerateMipmaps(0);
341
367
  const destTex = fb.getColorAttachments()[0];
342
- const mips = type === 'ggx' ? destTex.mipLevelCount : 1;
368
+ const mips = type === 'ggx' || type === 'charlie' ? destTex.mipLevelCount : 1;
343
369
  for(let i = 0; i < mips; i++){
344
370
  const alpha = i === 0 ? 0 : Math.pow(2, i) / width;
345
- doPrefilterCubemap(type, alpha, i, srcTex, fetchSampler(type === 'ggx' ? 'clamp_nearest_nomip' : 'clamp_linear'), fb, filteringInfo, numSamples ?? 64);
371
+ doPrefilterCubemap(type, alpha, i, srcTex, fetchSampler(type === 'ggx' || type === 'charlie' ? 'clamp_nearest_nomip' : 'clamp_linear'), fb, filteringInfo, numSamples ?? 64);
346
372
  }
347
373
  device.popDeviceStates();
348
374
  device.setRenderStates(rs);
@@ -1 +1 @@
1
- {"version":3,"file":"pmrem.js","sources":["../../src/utility/pmrem.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { Vector3 } from '@zephyr3d/base';\r\nimport type {\r\n BindGroup,\r\n FrameBuffer,\r\n GPUProgram,\r\n RenderStateSet,\r\n TextureCube,\r\n TextureSampler,\r\n VertexLayout\r\n} from '@zephyr3d/device';\r\nimport { getDevice } from '../app/api';\r\nimport { fetchSampler } from './misc';\r\n\r\n// reference: https://placeholderart.wordpress.com/2015/07/28/implementation-notes-runtime-environment-map-filtering-for-image-based-lighting/\r\n\r\ntype DistributionType = 'lambertian' | 'ggx';\r\n\r\nlet vertexLayout: Nullable<VertexLayout> = null;\r\nlet renderStates: Nullable<RenderStateSet> = null;\r\nconst programs: Record<\r\n string,\r\n {\r\n program: GPUProgram;\r\n bindgroup: BindGroup;\r\n }\r\n> = {};\r\n\r\nconst faceDirections = [\r\n [new Vector3(0, 0, -1), new Vector3(0, -1, 0), new Vector3(1, 0, 0)],\r\n [new Vector3(0, 0, 1), new Vector3(0, -1, 0), new Vector3(-1, 0, 0)],\r\n [new Vector3(1, 0, 0), new Vector3(0, 0, 1), new Vector3(0, 1, 0)],\r\n [new Vector3(1, 0, 0), new Vector3(0, 0, -1), new Vector3(0, -1, 0)],\r\n [new Vector3(1, 0, 0), new Vector3(0, -1, 0), new Vector3(0, 0, 1)],\r\n [new Vector3(-1, 0, 0), new Vector3(0, -1, 0), new Vector3(0, 0, -1)]\r\n];\r\n\r\nfunction init() {\r\n const device = getDevice();\r\n const vertices = new Float32Array([1, 1, -1, 1, -1, -1, 1, -1]);\r\n const indices = new Uint16Array([0, 1, 2, 0, 2, 3]);\r\n vertexLayout = device.createVertexLayout({\r\n vertexBuffers: [\r\n {\r\n buffer: device.createVertexBuffer('position_f32x2', vertices)!\r\n }\r\n ],\r\n indexBuffer: device.createIndexBuffer(indices)\r\n });\r\n renderStates = device.createRenderStateSet();\r\n renderStates.useRasterizerState().setCullMode('none');\r\n renderStates.useDepthState().enableTest(false).enableWrite(false);\r\n}\r\n\r\nfunction getProgramInfo(type: DistributionType, numSamples: number) {\r\n const device = getDevice();\r\n const hash = `${type}:${numSamples}`;\r\n let ret = programs[hash];\r\n if (!ret) {\r\n const program = createPMREMProgram(type, numSamples);\r\n const bindgroup = device.createBindGroup(program.bindGroupLayouts[0]);\r\n programs[hash] = ret = { program, bindgroup };\r\n }\r\n return ret;\r\n}\r\n\r\nfunction createPMREMProgram(type: DistributionType, numSamples: number) {\r\n const device = getDevice();\r\n const pb = device;\r\n return pb.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.up = pb.vec3().uniform(0);\r\n this.right = pb.vec3().uniform(0);\r\n this.front = pb.vec3().uniform(0);\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.direction = pb.mul(\r\n pb.mat3(this.up, this.right, this.front),\r\n pb.vec3(this.$inputs.pos, 1)\r\n );\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n if (type === 'ggx') {\r\n this.alphaG = pb.float().uniform(0);\r\n }\r\n this.vFilteringInfo = pb.vec3().uniform(0);\r\n this.hdrScale = pb.float().uniform(0);\r\n this.inputTexture = pb.texCube().uniform(0);\r\n this.NUM_SAMPLES_FLOAT = pb.float(numSamples);\r\n this.NUM_SAMPLES_FLOAT_INVERSED = pb.float(1 / numSamples);\r\n this.K = pb.float(4);\r\n this.$outputs.outcolor = pb.vec4();\r\n if (device.type === 'webgl') {\r\n pb.func('radicalInverse_VdC', [pb.int('bits')], function () {\r\n this.$l.rand = pb.float(0);\r\n this.$l.denom = pb.float(1);\r\n this.$l.invBase = pb.float(0.5);\r\n this.$l.n = this.bits;\r\n this.$for(pb.int('i'), 0, 32, function () {\r\n this.denom = pb.mul(this.denom, 2);\r\n this.rand = pb.add(this.rand, pb.div(pb.mod(pb.float(this.n), 2), this.denom));\r\n this.n = pb.div(this.n, 2);\r\n this.$if(pb.equal(this.n, 0), function () {\r\n this.$break();\r\n });\r\n });\r\n this.$return(this.rand);\r\n });\r\n pb.func('hammersley2d', [pb.int('i'), pb.int('N')], function () {\r\n this.$return(pb.vec2(pb.div(pb.float(this.i), pb.float(this.N)), this.radicalInverse_VdC(this.i)));\r\n });\r\n } else {\r\n pb.func('radicalInverse_VdC', [pb.uint('bits')], function () {\r\n this.$l.n = this.bits;\r\n this.n = pb.compOr(pb.sal(this.n, 16), pb.sar(this.n, 16));\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x55555555), 1),\r\n pb.sar(pb.compAnd(this.n, 0xaaaaaaaa), 1)\r\n );\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x33333333), 2),\r\n pb.sar(pb.compAnd(this.n, 0xcccccccc), 2)\r\n );\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x0f0f0f0f), 4),\r\n pb.sar(pb.compAnd(this.n, 0xf0f0f0f0), 4)\r\n );\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x00ff00ff), 8),\r\n pb.sar(pb.compAnd(this.n, 0xff00ff00), 8)\r\n );\r\n this.$return(pb.mul(pb.float(this.n), 2.3283064365386963e-10));\r\n });\r\n pb.func('hammersley2d', [pb.int('i'), pb.int('N')], function () {\r\n this.$return(\r\n pb.vec2(pb.div(pb.float(this.i), pb.float(this.N)), this.radicalInverse_VdC(pb.uint(this.i)))\r\n );\r\n });\r\n }\r\n pb.func('log4', [pb.float('x')], function () {\r\n this.$return(pb.mul(pb.log2(this.x), 0.5));\r\n });\r\n if (type === 'lambertian') {\r\n pb.func('hemisphereCosSample', [pb.vec2('u')], function () {\r\n this.$l.phi = pb.mul(this.u.x, 2 * Math.PI);\r\n this.$l.cosTheta2 = pb.sub(1, this.u.y);\r\n this.$l.cosTheta = pb.sqrt(this.cosTheta2);\r\n this.$l.sinTheta = pb.sqrt(pb.sub(1, this.cosTheta2));\r\n this.$return(\r\n pb.vec3(\r\n pb.mul(this.sinTheta, pb.cos(this.phi)),\r\n pb.mul(this.sinTheta, pb.sin(this.phi)),\r\n this.cosTheta\r\n )\r\n );\r\n });\r\n pb.func('irradiance', [pb.vec3('direction'), pb.vec3('vFilteringInfo')], function () {\r\n this.$l.n = pb.normalize(this.direction);\r\n this.$l.result = pb.vec3(0);\r\n this.$l.tangent = pb.vec3();\r\n this.$if(pb.lessThan(pb.abs(this.n.z), 0.999), function () {\r\n this.tangent = pb.vec3(0, 0, 1);\r\n }).$else(function () {\r\n this.tangent = pb.vec3(1, 0, 0);\r\n });\r\n this.tangent = pb.normalize(pb.cross(this.tangent, this.n));\r\n this.$l.bitangent = pb.cross(this.n, this.tangent);\r\n this.$l.tbn = pb.mat3(this.tangent, this.bitangent, this.n);\r\n this.$l.maxLevel = this.vFilteringInfo.y;\r\n this.$l.dim0 = this.vFilteringInfo.x;\r\n this.$l.colorScale = this.vFilteringInfo.z;\r\n this.$l.omegaP = pb.div(4 * Math.PI, pb.mul(this.dim0, this.dim0, 6));\r\n this.$for(pb.int('i'), 0, numSamples, function () {\r\n this.$l.Xi = this.hammersley2d(this.i, numSamples);\r\n this.$l.Ls = pb.normalize(this.hemisphereCosSample(this.Xi));\r\n this.$l.Ns = pb.vec3(0, 0, 1);\r\n this.$l.NoL = pb.dot(this.Ns, this.Ls);\r\n this.$if(pb.greaterThan(this.NoL, 0), function () {\r\n this.$l.pdf_inversed = pb.div(Math.PI, this.NoL);\r\n this.$l.omegaS = pb.mul(this.pdf_inversed, this.NUM_SAMPLES_FLOAT_INVERSED);\r\n this.$l.l = pb.add(pb.sub(this.log4(this.omegaS), this.log4(this.omegaP)), this.log4(this.K));\r\n this.$l.mipLevel = pb.clamp(this.l, 0, this.maxLevel);\r\n this.$l.c = pb.textureSampleLevel(\r\n this.inputTexture,\r\n pb.mul(this.tbn, this.Ls),\r\n this.mipLevel\r\n ).rgb;\r\n this.result = pb.add(this.result, this.c);\r\n });\r\n });\r\n this.result = pb.mul(this.result, this.NUM_SAMPLES_FLOAT_INVERSED, this.colorScale);\r\n this.$return(this.result);\r\n });\r\n }\r\n if (type === 'ggx') {\r\n pb.func('hemisphereImportanceSampleDggx', [pb.vec2('u'), pb.float('a')], function () {\r\n this.$l.phi = pb.mul(this.u.x, 2 * Math.PI);\r\n this.$l.cosTheta2 = pb.div(\r\n pb.sub(1, this.u.y),\r\n pb.add(pb.mul(pb.add(this.a, 1), pb.sub(this.a, 1), this.u.y), 1)\r\n );\r\n this.$l.cosTheta = pb.sqrt(this.cosTheta2);\r\n this.$l.sinTheta = pb.sqrt(pb.sub(1, this.cosTheta2));\r\n this.$return(\r\n pb.vec3(\r\n pb.mul(pb.cos(this.phi), this.sinTheta),\r\n pb.mul(pb.sin(this.phi), this.sinTheta),\r\n this.cosTheta\r\n )\r\n );\r\n });\r\n pb.func(\r\n 'normalDistributionFunction_TrowbridgeReitzGGX',\r\n [pb.float('NoH'), pb.float('alphaG')],\r\n function () {\r\n this.$l.a2 = pb.mul(this.alphaG, this.alphaG);\r\n this.$l.d = pb.add(pb.mul(this.NoH, this.NoH, pb.sub(this.a2, 1)), 1);\r\n this.$return(pb.div(this.a2, pb.mul(this.d, this.d, Math.PI)));\r\n }\r\n );\r\n pb.func(\r\n 'radiance',\r\n [pb.float('alphaG'), pb.vec3('direction'), pb.vec3('vFilteringInfo')],\r\n function () {\r\n this.$l.n = pb.normalize(this.direction);\r\n this.$if(pb.equal(this.alphaG, 0), function () {\r\n this.$l.c = pb.textureSampleLevel(this.inputTexture, this.n, 0).rgb;\r\n this.$return(this.c);\r\n }).$else(function () {\r\n this.$l.result = pb.vec3(0);\r\n this.$l.tangent = pb.vec3();\r\n this.$if(pb.lessThan(pb.abs(this.n.z), 0.999), function () {\r\n this.tangent = pb.vec3(0, 0, 1);\r\n }).$else(function () {\r\n this.tangent = pb.vec3(1, 0, 0);\r\n });\r\n this.tangent = pb.normalize(pb.cross(this.tangent, this.n));\r\n this.$l.bitangent = pb.cross(this.n, this.tangent);\r\n this.$l.tbn = pb.mat3(this.tangent, this.bitangent, this.n);\r\n this.$l.maxLevel = this.vFilteringInfo.y;\r\n this.$l.dim0 = this.vFilteringInfo.x;\r\n this.$l.omegaP = pb.div(4 * Math.PI, pb.mul(this.dim0, this.dim0, 6));\r\n this.$l.weight = pb.float(0);\r\n this.$for(pb.int('i'), 0, numSamples, function () {\r\n this.$l.Xi = this.hammersley2d(this.i, numSamples);\r\n this.$l.H = this.hemisphereImportanceSampleDggx(this.Xi, this.alphaG);\r\n this.$l.NoV = pb.float(1);\r\n this.$l.NoH = this.H.z;\r\n this.$l.NoH2 = pb.mul(this.H.z, this.H.z);\r\n this.$l.NoL = pb.sub(pb.mul(this.NoH2, 2), 1);\r\n this.$l.L = pb.normalize(\r\n pb.vec3(pb.mul(this.NoH, this.H.x, 2), pb.mul(this.NoH, this.H.y, 2), this.NoL)\r\n );\r\n this.$if(pb.greaterThan(this.NoL, 0), function () {\r\n this.$l.pdf_inversed = pb.div(\r\n 4,\r\n this.normalDistributionFunction_TrowbridgeReitzGGX(this.NoH, this.alphaG)\r\n );\r\n this.$l.omegaS = pb.mul(this.pdf_inversed, this.NUM_SAMPLES_FLOAT_INVERSED);\r\n this.$l.l = pb.add(\r\n pb.sub(this.log4(this.omegaS), this.log4(this.omegaP)),\r\n this.log4(this.K)\r\n );\r\n this.$l.mipLevel = pb.clamp(this.l, 0, this.maxLevel);\r\n this.weight = pb.add(this.weight, this.NoL);\r\n this.$l.c = pb.textureSampleLevel(\r\n this.inputTexture,\r\n pb.mul(this.tbn, this.L),\r\n this.mipLevel\r\n ).rgb;\r\n this.result = pb.add(this.result, pb.mul(this.c, this.NoL));\r\n });\r\n });\r\n this.result = pb.div(this.result, this.weight);\r\n this.$return(this.result);\r\n });\r\n }\r\n );\r\n }\r\n pb.main(function () {\r\n if (type === 'ggx') {\r\n this.$l.color = this.radiance(this.alphaG, this.$inputs.direction, this.vFilteringInfo);\r\n }\r\n if (type === 'lambertian') {\r\n this.$l.color = this.irradiance(this.$inputs.direction, this.vFilteringInfo);\r\n }\r\n this.$outputs.outcolor = pb.vec4(pb.mul(this.color, this.hdrScale), 1);\r\n });\r\n }\r\n })!;\r\n}\r\nfunction doPrefilterCubemap(\r\n type: DistributionType,\r\n roughness: number,\r\n miplevel: number,\r\n srcTexture: TextureCube,\r\n sampler: TextureSampler,\r\n dstFramebuffer: FrameBuffer,\r\n filteringInfo: Vector3,\r\n numSamples: number\r\n) {\r\n const device = getDevice();\r\n const framebuffer = dstFramebuffer;\r\n framebuffer.setColorAttachmentMipLevel(0, miplevel);\r\n framebuffer.setColorAttachmentGenerateMipmaps(0, false);\r\n const { program, bindgroup } = getProgramInfo(type, numSamples);\r\n bindgroup.setValue('vFilteringInfo', filteringInfo);\r\n bindgroup.setValue('hdrScale', 1);\r\n bindgroup.setTexture('inputTexture', srcTexture);\r\n if (type === 'ggx') {\r\n bindgroup.setValue('alphaG', roughness);\r\n }\r\n device.setProgram(program);\r\n device.setBindGroup(0, bindgroup);\r\n device.setFramebuffer(framebuffer);\r\n for (let i = 0; i < 6; i++) {\r\n framebuffer.setColorAttachmentCubeFace(0, i);\r\n device.setVertexLayout(vertexLayout);\r\n device.setRenderStates(renderStates);\r\n bindgroup.setValue('up', faceDirections[i][0]);\r\n bindgroup.setValue('right', faceDirections[i][1]);\r\n bindgroup.setValue('front', faceDirections[i][2]);\r\n device.draw('triangle-list', 0, 6);\r\n }\r\n}\r\n\r\n/**\r\n * Prefilters an environment cubemap\r\n *\r\n * @param tex - The environment cubemap\r\n * @param type - The prefilter type\r\n * @param destTex - The output cubemap\r\n *\r\n * @public\r\n */\r\nexport function prefilterCubemap(\r\n tex: TextureCube,\r\n type: DistributionType,\r\n destTexture: TextureCube | FrameBuffer,\r\n numSamples?: number,\r\n radianceSource?: boolean\r\n) {\r\n if (!tex || !tex.isTextureCube()) {\r\n console.error('prefilterCubemap(): source texture must be cube texture');\r\n return;\r\n }\r\n const device = getDevice();\r\n if (!vertexLayout) {\r\n init();\r\n }\r\n device.pushDeviceStates();\r\n radianceSource = radianceSource ?? true;\r\n const rs = device.getRenderStates();\r\n const srcTex = tex;\r\n const width = tex.width;\r\n const mipmapsCount = tex.mipLevelCount;\r\n const filteringInfo = new Vector3(width, mipmapsCount, radianceSource ? 1 : Math.PI);\r\n const fb = destTexture.isFramebuffer() ? destTexture : device.createFrameBuffer([destTexture], null);\r\n const attachMiplevel = fb.getColorAttachmentMipLevel(0);\r\n const generateMipmap = fb.getColorAttachmentGenerateMipmaps(0);\r\n const destTex = fb.getColorAttachments()[0];\r\n const mips = type === 'ggx' ? destTex.mipLevelCount : 1;\r\n for (let i = 0; i < mips; i++) {\r\n const alpha = i === 0 ? 0 : Math.pow(2, i) / width;\r\n doPrefilterCubemap(\r\n type,\r\n alpha,\r\n i,\r\n srcTex,\r\n fetchSampler(type === 'ggx' ? 'clamp_nearest_nomip' : 'clamp_linear')!,\r\n fb,\r\n filteringInfo,\r\n numSamples ?? 64\r\n );\r\n }\r\n device.popDeviceStates();\r\n device.setRenderStates(rs);\r\n fb.setColorAttachmentMipLevel(0, attachMiplevel);\r\n fb.setColorAttachmentGenerateMipmaps(0, generateMipmap);\r\n if (!destTexture.isFramebuffer()) {\r\n fb.dispose();\r\n }\r\n}\r\n"],"names":["vertexLayout","renderStates","programs","faceDirections","Vector3","init","device","getDevice","vertices","Float32Array","indices","Uint16Array","createVertexLayout","vertexBuffers","buffer","createVertexBuffer","indexBuffer","createIndexBuffer","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","getProgramInfo","type","numSamples","hash","ret","program","createPMREMProgram","bindgroup","createBindGroup","bindGroupLayouts","pb","buildRenderProgram","vertex","$inputs","pos","vec2","attrib","up","vec3","uniform","right","front","main","$builtins","position","vec4","$outputs","direction","mul","mat3","y","neg","fragment","alphaG","float","vFilteringInfo","hdrScale","inputTexture","texCube","NUM_SAMPLES_FLOAT","NUM_SAMPLES_FLOAT_INVERSED","K","outcolor","func","int","$l","rand","denom","invBase","n","bits","$for","add","div","mod","$if","equal","$break","$return","i","N","radicalInverse_VdC","uint","compOr","sal","sar","compAnd","log2","x","phi","u","Math","PI","cosTheta2","sub","cosTheta","sqrt","sinTheta","cos","sin","normalize","result","tangent","lessThan","abs","z","$else","cross","bitangent","tbn","maxLevel","dim0","colorScale","omegaP","Xi","hammersley2d","Ls","hemisphereCosSample","Ns","NoL","dot","greaterThan","pdf_inversed","omegaS","l","log4","mipLevel","clamp","c","textureSampleLevel","rgb","a","a2","d","NoH","weight","H","hemisphereImportanceSampleDggx","NoV","NoH2","L","normalDistributionFunction_TrowbridgeReitzGGX","color","radiance","irradiance","doPrefilterCubemap","roughness","miplevel","srcTexture","sampler","dstFramebuffer","filteringInfo","framebuffer","setColorAttachmentMipLevel","setColorAttachmentGenerateMipmaps","setValue","setTexture","setProgram","setBindGroup","setFramebuffer","setColorAttachmentCubeFace","setVertexLayout","setRenderStates","draw","prefilterCubemap","tex","destTexture","radianceSource","isTextureCube","console","error","pushDeviceStates","rs","getRenderStates","srcTex","width","mipmapsCount","mipLevelCount","fb","isFramebuffer","createFrameBuffer","attachMiplevel","getColorAttachmentMipLevel","generateMipmap","getColorAttachmentGenerateMipmaps","destTex","getColorAttachments","mips","alpha","pow","fetchSampler","popDeviceStates","dispose"],"mappings":"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"}
1
+ {"version":3,"file":"pmrem.js","sources":["../../src/utility/pmrem.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { Vector3 } from '@zephyr3d/base';\r\nimport type {\r\n BindGroup,\r\n FrameBuffer,\r\n GPUProgram,\r\n RenderStateSet,\r\n TextureCube,\r\n TextureSampler,\r\n VertexLayout\r\n} from '@zephyr3d/device';\r\nimport { getDevice } from '../app/api';\r\nimport { fetchSampler } from './misc';\r\n\r\n// reference: https://placeholderart.wordpress.com/2015/07/28/implementation-notes-runtime-environment-map-filtering-for-image-based-lighting/\r\n\r\ntype DistributionType = 'lambertian' | 'ggx' | 'charlie';\r\n\r\nlet vertexLayout: Nullable<VertexLayout> = null;\r\nlet renderStates: Nullable<RenderStateSet> = null;\r\nconst programs: Record<\r\n string,\r\n {\r\n program: GPUProgram;\r\n bindgroup: BindGroup;\r\n }\r\n> = {};\r\n\r\nconst faceDirections = [\r\n [new Vector3(0, 0, -1), new Vector3(0, -1, 0), new Vector3(1, 0, 0)],\r\n [new Vector3(0, 0, 1), new Vector3(0, -1, 0), new Vector3(-1, 0, 0)],\r\n [new Vector3(1, 0, 0), new Vector3(0, 0, 1), new Vector3(0, 1, 0)],\r\n [new Vector3(1, 0, 0), new Vector3(0, 0, -1), new Vector3(0, -1, 0)],\r\n [new Vector3(1, 0, 0), new Vector3(0, -1, 0), new Vector3(0, 0, 1)],\r\n [new Vector3(-1, 0, 0), new Vector3(0, -1, 0), new Vector3(0, 0, -1)]\r\n];\r\n\r\nfunction init() {\r\n const device = getDevice();\r\n const vertices = new Float32Array([1, 1, -1, 1, -1, -1, 1, -1]);\r\n const indices = new Uint16Array([0, 1, 2, 0, 2, 3]);\r\n vertexLayout = device.createVertexLayout({\r\n vertexBuffers: [\r\n {\r\n buffer: device.createVertexBuffer('position_f32x2', vertices)!\r\n }\r\n ],\r\n indexBuffer: device.createIndexBuffer(indices)\r\n });\r\n renderStates = device.createRenderStateSet();\r\n renderStates.useRasterizerState().setCullMode('none');\r\n renderStates.useDepthState().enableTest(false).enableWrite(false);\r\n}\r\n\r\nfunction getProgramInfo(type: DistributionType, numSamples: number) {\r\n const device = getDevice();\r\n const hash = `${type}:${numSamples}`;\r\n let ret = programs[hash];\r\n if (!ret) {\r\n const program = createPMREMProgram(type, numSamples);\r\n const bindgroup = device.createBindGroup(program.bindGroupLayouts[0]);\r\n programs[hash] = ret = { program, bindgroup };\r\n }\r\n return ret;\r\n}\r\n\r\nfunction createPMREMProgram(type: DistributionType, numSamples: number) {\r\n const device = getDevice();\r\n const pb = device;\r\n return pb.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.up = pb.vec3().uniform(0);\r\n this.right = pb.vec3().uniform(0);\r\n this.front = pb.vec3().uniform(0);\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.direction = pb.mul(\r\n pb.mat3(this.up, this.right, this.front),\r\n pb.vec3(this.$inputs.pos, 1)\r\n );\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n if (type === 'ggx' || type === 'charlie') {\r\n this.alphaG = pb.float().uniform(0);\r\n }\r\n this.vFilteringInfo = pb.vec3().uniform(0);\r\n this.hdrScale = pb.float().uniform(0);\r\n this.inputTexture = pb.texCube().uniform(0);\r\n this.NUM_SAMPLES_FLOAT = pb.float(numSamples);\r\n this.NUM_SAMPLES_FLOAT_INVERSED = pb.float(1 / numSamples);\r\n this.K = pb.float(4);\r\n this.$outputs.outcolor = pb.vec4();\r\n if (device.type === 'webgl') {\r\n pb.func('radicalInverse_VdC', [pb.int('bits')], function () {\r\n this.$l.rand = pb.float(0);\r\n this.$l.denom = pb.float(1);\r\n this.$l.invBase = pb.float(0.5);\r\n this.$l.n = this.bits;\r\n this.$for(pb.int('i'), 0, 32, function () {\r\n this.denom = pb.mul(this.denom, 2);\r\n this.rand = pb.add(this.rand, pb.div(pb.mod(pb.float(this.n), 2), this.denom));\r\n this.n = pb.div(this.n, 2);\r\n this.$if(pb.equal(this.n, 0), function () {\r\n this.$break();\r\n });\r\n });\r\n this.$return(this.rand);\r\n });\r\n pb.func('hammersley2d', [pb.int('i'), pb.int('N')], function () {\r\n this.$return(pb.vec2(pb.div(pb.float(this.i), pb.float(this.N)), this.radicalInverse_VdC(this.i)));\r\n });\r\n } else {\r\n pb.func('radicalInverse_VdC', [pb.uint('bits')], function () {\r\n this.$l.n = this.bits;\r\n this.n = pb.compOr(pb.sal(this.n, 16), pb.sar(this.n, 16));\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x55555555), 1),\r\n pb.sar(pb.compAnd(this.n, 0xaaaaaaaa), 1)\r\n );\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x33333333), 2),\r\n pb.sar(pb.compAnd(this.n, 0xcccccccc), 2)\r\n );\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x0f0f0f0f), 4),\r\n pb.sar(pb.compAnd(this.n, 0xf0f0f0f0), 4)\r\n );\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x00ff00ff), 8),\r\n pb.sar(pb.compAnd(this.n, 0xff00ff00), 8)\r\n );\r\n this.$return(pb.mul(pb.float(this.n), 2.3283064365386963e-10));\r\n });\r\n pb.func('hammersley2d', [pb.int('i'), pb.int('N')], function () {\r\n this.$return(\r\n pb.vec2(pb.div(pb.float(this.i), pb.float(this.N)), this.radicalInverse_VdC(pb.uint(this.i)))\r\n );\r\n });\r\n }\r\n pb.func('log4', [pb.float('x')], function () {\r\n this.$return(pb.mul(pb.log2(this.x), 0.5));\r\n });\r\n if (type === 'lambertian') {\r\n pb.func('hemisphereCosSample', [pb.vec2('u')], function () {\r\n this.$l.phi = pb.mul(this.u.x, 2 * Math.PI);\r\n this.$l.cosTheta2 = pb.sub(1, this.u.y);\r\n this.$l.cosTheta = pb.sqrt(this.cosTheta2);\r\n this.$l.sinTheta = pb.sqrt(pb.sub(1, this.cosTheta2));\r\n this.$return(\r\n pb.vec3(\r\n pb.mul(this.sinTheta, pb.cos(this.phi)),\r\n pb.mul(this.sinTheta, pb.sin(this.phi)),\r\n this.cosTheta\r\n )\r\n );\r\n });\r\n pb.func('irradiance', [pb.vec3('direction'), pb.vec3('vFilteringInfo')], function () {\r\n this.$l.n = pb.normalize(this.direction);\r\n this.$l.result = pb.vec3(0);\r\n this.$l.tangent = pb.vec3();\r\n this.$if(pb.lessThan(pb.abs(this.n.z), 0.999), function () {\r\n this.tangent = pb.vec3(0, 0, 1);\r\n }).$else(function () {\r\n this.tangent = pb.vec3(1, 0, 0);\r\n });\r\n this.tangent = pb.normalize(pb.cross(this.tangent, this.n));\r\n this.$l.bitangent = pb.cross(this.n, this.tangent);\r\n this.$l.tbn = pb.mat3(this.tangent, this.bitangent, this.n);\r\n this.$l.maxLevel = this.vFilteringInfo.y;\r\n this.$l.dim0 = this.vFilteringInfo.x;\r\n this.$l.colorScale = this.vFilteringInfo.z;\r\n this.$l.omegaP = pb.div(4 * Math.PI, pb.mul(this.dim0, this.dim0, 6));\r\n this.$for(pb.int('i'), 0, numSamples, function () {\r\n this.$l.Xi = this.hammersley2d(this.i, numSamples);\r\n this.$l.Ls = pb.normalize(this.hemisphereCosSample(this.Xi));\r\n this.$l.Ns = pb.vec3(0, 0, 1);\r\n this.$l.NoL = pb.dot(this.Ns, this.Ls);\r\n this.$if(pb.greaterThan(this.NoL, 0), function () {\r\n this.$l.pdf_inversed = pb.div(Math.PI, this.NoL);\r\n this.$l.omegaS = pb.mul(this.pdf_inversed, this.NUM_SAMPLES_FLOAT_INVERSED);\r\n this.$l.l = pb.add(pb.sub(this.log4(this.omegaS), this.log4(this.omegaP)), this.log4(this.K));\r\n this.$l.mipLevel = pb.clamp(this.l, 0, this.maxLevel);\r\n this.$l.c = pb.textureSampleLevel(\r\n this.inputTexture,\r\n pb.mul(this.tbn, this.Ls),\r\n this.mipLevel\r\n ).rgb;\r\n this.result = pb.add(this.result, this.c);\r\n });\r\n });\r\n this.result = pb.mul(this.result, this.NUM_SAMPLES_FLOAT_INVERSED, this.colorScale);\r\n this.$return(this.result);\r\n });\r\n }\r\n if (type === 'ggx' || type === 'charlie') {\r\n pb.func('hemisphereImportanceSampleDggx', [pb.vec2('u'), pb.float('a')], function () {\r\n this.$l.phi = pb.mul(this.u.x, 2 * Math.PI);\r\n this.$l.cosTheta2 = pb.div(\r\n pb.sub(1, this.u.y),\r\n pb.add(pb.mul(pb.add(this.a, 1), pb.sub(this.a, 1), this.u.y), 1)\r\n );\r\n this.$l.cosTheta = pb.sqrt(this.cosTheta2);\r\n this.$l.sinTheta = pb.sqrt(pb.sub(1, this.cosTheta2));\r\n this.$return(\r\n pb.vec3(\r\n pb.mul(pb.cos(this.phi), this.sinTheta),\r\n pb.mul(pb.sin(this.phi), this.sinTheta),\r\n this.cosTheta\r\n )\r\n );\r\n });\r\n pb.func('hemisphereImportanceSampleCharlie', [pb.vec2('u'), pb.float('a')], function () {\r\n this.$l.phi = pb.mul(this.u.x, 2 * Math.PI);\r\n this.$l.sinTheta = pb.pow(this.u.y, pb.div(this.a, pb.add(pb.mul(2, this.a), 1)));\r\n this.$l.cosTheta = pb.sqrt(pb.sub(1, pb.mul(this.sinTheta, this.sinTheta)));\r\n this.$return(\r\n pb.vec3(\r\n pb.mul(pb.cos(this.phi), this.sinTheta),\r\n pb.mul(pb.sin(this.phi), this.sinTheta),\r\n this.cosTheta\r\n )\r\n );\r\n });\r\n pb.func(\r\n 'normalDistributionFunction_TrowbridgeReitzGGX',\r\n [pb.float('NoH'), pb.float('alphaG')],\r\n function () {\r\n this.$l.a2 = pb.mul(this.alphaG, this.alphaG);\r\n this.$l.d = pb.add(pb.mul(this.NoH, this.NoH, pb.sub(this.a2, 1)), 1);\r\n this.$return(pb.div(this.a2, pb.mul(this.d, this.d, Math.PI)));\r\n }\r\n );\r\n pb.func('normalDistributionFunction_Charlie', [pb.float('NoH'), pb.float('roughness')], function () {\r\n this.$l.invR = pb.div(1, pb.max(this.roughness, 0.000001));\r\n this.$l.cos2h = pb.mul(this.NoH, this.NoH);\r\n this.$l.sin2h = pb.max(pb.sub(1, this.cos2h), 0.0078125);\r\n this.$return(\r\n pb.div(pb.mul(pb.add(this.invR, 2), pb.pow(this.sin2h, pb.mul(this.invR, 0.5))), 2 * Math.PI)\r\n );\r\n });\r\n pb.func(\r\n 'radiance',\r\n [pb.float('alphaG'), pb.vec3('direction'), pb.vec3('vFilteringInfo')],\r\n function () {\r\n this.$l.n = pb.normalize(this.direction);\r\n this.$if(pb.equal(this.alphaG, 0), function () {\r\n this.$l.c = pb.textureSampleLevel(this.inputTexture, this.n, 0).rgb;\r\n this.$return(this.c);\r\n }).$else(function () {\r\n this.$l.result = pb.vec3(0);\r\n this.$l.tangent = pb.vec3();\r\n this.$if(pb.lessThan(pb.abs(this.n.z), 0.999), function () {\r\n this.tangent = pb.vec3(0, 0, 1);\r\n }).$else(function () {\r\n this.tangent = pb.vec3(1, 0, 0);\r\n });\r\n this.tangent = pb.normalize(pb.cross(this.tangent, this.n));\r\n this.$l.bitangent = pb.cross(this.n, this.tangent);\r\n this.$l.tbn = pb.mat3(this.tangent, this.bitangent, this.n);\r\n this.$l.maxLevel = this.vFilteringInfo.y;\r\n this.$l.dim0 = this.vFilteringInfo.x;\r\n this.$l.omegaP = pb.div(4 * Math.PI, pb.mul(this.dim0, this.dim0, 6));\r\n this.$l.weight = pb.float(0);\r\n this.$for(pb.int('i'), 0, numSamples, function () {\r\n this.$l.Xi = this.hammersley2d(this.i, numSamples);\r\n if (type === 'ggx') {\r\n this.$l.H = this.hemisphereImportanceSampleDggx(this.Xi, this.alphaG);\r\n } else {\r\n this.$l.H = this.hemisphereImportanceSampleCharlie(this.Xi, this.alphaG);\r\n }\r\n this.$l.NoV = pb.float(1);\r\n this.$l.NoH = this.H.z;\r\n this.$l.NoH2 = pb.mul(this.H.z, this.H.z);\r\n this.$l.NoL = pb.sub(pb.mul(this.NoH2, 2), 1);\r\n this.$l.L = pb.normalize(\r\n pb.vec3(pb.mul(this.NoH, this.H.x, 2), pb.mul(this.NoH, this.H.y, 2), this.NoL)\r\n );\r\n this.$if(pb.greaterThan(this.NoL, 0), function () {\r\n if (type === 'ggx') {\r\n this.$l.pdf_inversed = pb.div(\r\n 4,\r\n this.normalDistributionFunction_TrowbridgeReitzGGX(this.NoH, this.alphaG)\r\n );\r\n } else {\r\n this.$l.pdf_inversed = pb.div(\r\n 4,\r\n this.normalDistributionFunction_Charlie(this.NoH, this.alphaG)\r\n );\r\n }\r\n this.$l.omegaS = pb.mul(this.pdf_inversed, this.NUM_SAMPLES_FLOAT_INVERSED);\r\n this.$l.l = pb.add(\r\n pb.sub(this.log4(this.omegaS), this.log4(this.omegaP)),\r\n this.log4(this.K)\r\n );\r\n this.$l.mipLevel = pb.clamp(this.l, 0, this.maxLevel);\r\n this.weight = pb.add(this.weight, this.NoL);\r\n this.$l.c = pb.textureSampleLevel(\r\n this.inputTexture,\r\n pb.mul(this.tbn, this.L),\r\n this.mipLevel\r\n ).rgb;\r\n this.result = pb.add(this.result, pb.mul(this.c, this.NoL));\r\n });\r\n });\r\n this.result = pb.div(this.result, this.weight);\r\n this.$return(this.result);\r\n });\r\n }\r\n );\r\n }\r\n pb.main(function () {\r\n if (type === 'ggx' || type === 'charlie') {\r\n this.$l.color = this.radiance(this.alphaG, this.$inputs.direction, this.vFilteringInfo);\r\n }\r\n if (type === 'lambertian') {\r\n this.$l.color = this.irradiance(this.$inputs.direction, this.vFilteringInfo);\r\n }\r\n this.$outputs.outcolor = pb.vec4(pb.mul(this.color, this.hdrScale), 1);\r\n });\r\n }\r\n })!;\r\n}\r\nfunction doPrefilterCubemap(\r\n type: DistributionType,\r\n roughness: number,\r\n miplevel: number,\r\n srcTexture: TextureCube,\r\n sampler: TextureSampler,\r\n dstFramebuffer: FrameBuffer,\r\n filteringInfo: Vector3,\r\n numSamples: number\r\n) {\r\n const device = getDevice();\r\n const framebuffer = dstFramebuffer;\r\n framebuffer.setColorAttachmentMipLevel(0, miplevel);\r\n framebuffer.setColorAttachmentGenerateMipmaps(0, false);\r\n const { program, bindgroup } = getProgramInfo(type, numSamples);\r\n bindgroup.setValue('vFilteringInfo', filteringInfo);\r\n bindgroup.setValue('hdrScale', 1);\r\n bindgroup.setTexture('inputTexture', srcTexture);\r\n if (type === 'ggx' || type === 'charlie') {\r\n bindgroup.setValue('alphaG', roughness);\r\n }\r\n device.setProgram(program);\r\n device.setBindGroup(0, bindgroup);\r\n device.setFramebuffer(framebuffer);\r\n for (let i = 0; i < 6; i++) {\r\n framebuffer.setColorAttachmentCubeFace(0, i);\r\n device.setVertexLayout(vertexLayout);\r\n device.setRenderStates(renderStates);\r\n bindgroup.setValue('up', faceDirections[i][0]);\r\n bindgroup.setValue('right', faceDirections[i][1]);\r\n bindgroup.setValue('front', faceDirections[i][2]);\r\n device.draw('triangle-list', 0, 6);\r\n }\r\n}\r\n\r\n/**\r\n * Prefilters an environment cubemap\r\n *\r\n * @param tex - The environment cubemap\r\n * @param type - The prefilter type\r\n * @param destTex - The output cubemap\r\n *\r\n * @public\r\n */\r\nexport function prefilterCubemap(\r\n tex: TextureCube,\r\n type: DistributionType,\r\n destTexture: TextureCube | FrameBuffer,\r\n numSamples?: number,\r\n radianceSource?: boolean\r\n) {\r\n if (!tex || !tex.isTextureCube()) {\r\n console.error('prefilterCubemap(): source texture must be cube texture');\r\n return;\r\n }\r\n const device = getDevice();\r\n if (!vertexLayout) {\r\n init();\r\n }\r\n device.pushDeviceStates();\r\n radianceSource = radianceSource ?? true;\r\n const rs = device.getRenderStates();\r\n const srcTex = tex;\r\n const width = tex.width;\r\n const mipmapsCount = tex.mipLevelCount;\r\n const filteringInfo = new Vector3(width, mipmapsCount, radianceSource ? 1 : Math.PI);\r\n const fb = destTexture.isFramebuffer() ? destTexture : device.createFrameBuffer([destTexture], null);\r\n const attachMiplevel = fb.getColorAttachmentMipLevel(0);\r\n const generateMipmap = fb.getColorAttachmentGenerateMipmaps(0);\r\n const destTex = fb.getColorAttachments()[0];\r\n const mips = type === 'ggx' || type === 'charlie' ? destTex.mipLevelCount : 1;\r\n for (let i = 0; i < mips; i++) {\r\n const alpha = i === 0 ? 0 : Math.pow(2, i) / width;\r\n doPrefilterCubemap(\r\n type,\r\n alpha,\r\n i,\r\n srcTex,\r\n fetchSampler(type === 'ggx' || type === 'charlie' ? 'clamp_nearest_nomip' : 'clamp_linear')!,\r\n fb,\r\n filteringInfo,\r\n numSamples ?? 64\r\n );\r\n }\r\n device.popDeviceStates();\r\n device.setRenderStates(rs);\r\n fb.setColorAttachmentMipLevel(0, attachMiplevel);\r\n fb.setColorAttachmentGenerateMipmaps(0, generateMipmap);\r\n if (!destTexture.isFramebuffer()) {\r\n fb.dispose();\r\n }\r\n}\r\n"],"names":["vertexLayout","renderStates","programs","faceDirections","Vector3","init","device","getDevice","vertices","Float32Array","indices","Uint16Array","createVertexLayout","vertexBuffers","buffer","createVertexBuffer","indexBuffer","createIndexBuffer","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","getProgramInfo","type","numSamples","hash","ret","program","createPMREMProgram","bindgroup","createBindGroup","bindGroupLayouts","pb","buildRenderProgram","vertex","$inputs","pos","vec2","attrib","up","vec3","uniform","right","front","main","$builtins","position","vec4","$outputs","direction","mul","mat3","y","neg","fragment","alphaG","float","vFilteringInfo","hdrScale","inputTexture","texCube","NUM_SAMPLES_FLOAT","NUM_SAMPLES_FLOAT_INVERSED","K","outcolor","func","int","$l","rand","denom","invBase","n","bits","$for","add","div","mod","$if","equal","$break","$return","i","N","radicalInverse_VdC","uint","compOr","sal","sar","compAnd","log2","x","phi","u","Math","PI","cosTheta2","sub","cosTheta","sqrt","sinTheta","cos","sin","normalize","result","tangent","lessThan","abs","z","$else","cross","bitangent","tbn","maxLevel","dim0","colorScale","omegaP","Xi","hammersley2d","Ls","hemisphereCosSample","Ns","NoL","dot","greaterThan","pdf_inversed","omegaS","l","log4","mipLevel","clamp","c","textureSampleLevel","rgb","a","pow","a2","d","NoH","invR","max","roughness","cos2h","sin2h","weight","H","hemisphereImportanceSampleDggx","hemisphereImportanceSampleCharlie","NoV","NoH2","L","normalDistributionFunction_TrowbridgeReitzGGX","normalDistributionFunction_Charlie","color","radiance","irradiance","doPrefilterCubemap","miplevel","srcTexture","sampler","dstFramebuffer","filteringInfo","framebuffer","setColorAttachmentMipLevel","setColorAttachmentGenerateMipmaps","setValue","setTexture","setProgram","setBindGroup","setFramebuffer","setColorAttachmentCubeFace","setVertexLayout","setRenderStates","draw","prefilterCubemap","tex","destTexture","radianceSource","isTextureCube","console","error","pushDeviceStates","rs","getRenderStates","srcTex","width","mipmapsCount","mipLevelCount","fb","isFramebuffer","createFrameBuffer","attachMiplevel","getColorAttachmentMipLevel","generateMipmap","getColorAttachmentGenerateMipmaps","destTex","getColorAttachments","mips","alpha","fetchSampler","popDeviceStates","dispose"],"mappings":";;;;AAkBA,IAAIA,YAAuC,GAAA,IAAA;AAC3C,IAAIC,YAAyC,GAAA,IAAA;AAC7C,MAAMC,WAMF,EAAC;AAEL,MAAMC,cAAiB,GAAA;AACrB,IAAA;QAAC,IAAIC,OAAAA,CAAQ,CAAG,EAAA,CAAA,EAAG,EAAC,CAAA;QAAI,IAAIA,OAAAA,CAAQ,CAAG,EAAA,EAAI,EAAA,CAAA,CAAA;QAAI,IAAIA,OAAAA,CAAQ,GAAG,CAAG,EAAA,CAAA;AAAG,KAAA;AACpE,IAAA;QAAC,IAAIA,OAAAA,CAAQ,GAAG,CAAG,EAAA,CAAA,CAAA;QAAI,IAAIA,OAAAA,CAAQ,CAAG,EAAA,EAAI,EAAA,CAAA,CAAA;QAAI,IAAIA,OAAAA,CAAQ,EAAC,EAAG,CAAG,EAAA,CAAA;AAAG,KAAA;AACpE,IAAA;QAAC,IAAIA,OAAAA,CAAQ,GAAG,CAAG,EAAA,CAAA,CAAA;QAAI,IAAIA,OAAAA,CAAQ,GAAG,CAAG,EAAA,CAAA,CAAA;QAAI,IAAIA,OAAAA,CAAQ,GAAG,CAAG,EAAA,CAAA;AAAG,KAAA;AAClE,IAAA;QAAC,IAAIA,OAAAA,CAAQ,GAAG,CAAG,EAAA,CAAA,CAAA;QAAI,IAAIA,OAAAA,CAAQ,CAAG,EAAA,CAAA,EAAG,EAAC,CAAA;QAAI,IAAIA,OAAAA,CAAQ,CAAG,EAAA,EAAI,EAAA,CAAA;AAAG,KAAA;AACpE,IAAA;QAAC,IAAIA,OAAAA,CAAQ,GAAG,CAAG,EAAA,CAAA,CAAA;QAAI,IAAIA,OAAAA,CAAQ,CAAG,EAAA,EAAI,EAAA,CAAA,CAAA;QAAI,IAAIA,OAAAA,CAAQ,GAAG,CAAG,EAAA,CAAA;AAAG,KAAA;AACnE,IAAA;QAAC,IAAIA,OAAAA,CAAQ,EAAC,EAAG,CAAG,EAAA,CAAA,CAAA;QAAI,IAAIA,OAAAA,CAAQ,CAAG,EAAA,EAAI,EAAA,CAAA,CAAA;QAAI,IAAIA,OAAAA,CAAQ,CAAG,EAAA,CAAA,EAAG,EAAC;AAAG;AACtE,CAAA;AAED,SAASC,IAAAA,GAAAA;AACP,IAAA,MAAMC,MAASC,GAAAA,SAAAA,EAAAA;IACf,MAAMC,QAAAA,GAAW,IAAIC,YAAa,CAAA;AAAC,QAAA,CAAA;AAAG,QAAA,CAAA;QAAG,EAAC;AAAG,QAAA,CAAA;QAAG,EAAC;QAAG,EAAC;AAAG,QAAA,CAAA;QAAG;AAAG,KAAA,CAAA;IAC9D,MAAMC,OAAAA,GAAU,IAAIC,WAAY,CAAA;AAAC,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA;AAAE,KAAA,CAAA;IAClDX,YAAeM,GAAAA,MAAAA,CAAOM,kBAAkB,CAAC;QACvCC,aAAe,EAAA;AACb,YAAA;gBACEC,MAAQR,EAAAA,MAAAA,CAAOS,kBAAkB,CAAC,gBAAkBP,EAAAA,QAAAA;AACtD;AACD,SAAA;QACDQ,WAAaV,EAAAA,MAAAA,CAAOW,iBAAiB,CAACP,OAAAA;AACxC,KAAA,CAAA;AACAT,IAAAA,YAAAA,GAAeK,OAAOY,oBAAoB,EAAA;IAC1CjB,YAAakB,CAAAA,kBAAkB,EAAGC,CAAAA,WAAW,CAAC,MAAA,CAAA;AAC9CnB,IAAAA,YAAAA,CAAaoB,aAAa,EAAGC,CAAAA,UAAU,CAAC,KAAA,CAAA,CAAOC,WAAW,CAAC,KAAA,CAAA;AAC7D;AAEA,SAASC,cAAAA,CAAeC,IAAsB,EAAEC,UAAkB,EAAA;AAChE,IAAA,MAAMpB,MAASC,GAAAA,SAAAA,EAAAA;AACf,IAAA,MAAMoB,IAAO,GAAA,CAAA,EAAGF,IAAK,CAAA,CAAC,EAAEC,UAAY,CAAA,CAAA;IACpC,IAAIE,GAAAA,GAAM1B,QAAQ,CAACyB,IAAK,CAAA;AACxB,IAAA,IAAI,CAACC,GAAK,EAAA;QACR,MAAMC,OAAAA,GAAUC,mBAAmBL,IAAMC,EAAAA,UAAAA,CAAAA;AACzC,QAAA,MAAMK,YAAYzB,MAAO0B,CAAAA,eAAe,CAACH,OAAQI,CAAAA,gBAAgB,CAAC,CAAE,CAAA,CAAA;QACpE/B,QAAQ,CAACyB,IAAK,CAAA,GAAGC,GAAM,GAAA;AAAEC,YAAAA,OAAAA;AAASE,YAAAA;AAAU,SAAA;AAC9C;IACA,OAAOH,GAAAA;AACT;AAEA,SAASE,kBAAAA,CAAmBL,IAAsB,EAAEC,UAAkB,EAAA;AACpE,IAAA,MAAMpB,MAASC,GAAAA,SAAAA,EAAAA;AACf,IAAA,MAAM2B,EAAK5B,GAAAA,MAAAA;IACX,OAAO4B,EAAAA,CAAGC,kBAAkB,CAAC;AAC3BC,QAAAA,MAAAA,CAAAA,CAAOF,EAAE,EAAA;YACP,IAAI,CAACG,OAAO,CAACC,GAAG,GAAGJ,EAAGK,CAAAA,IAAI,EAAGC,CAAAA,MAAM,CAAC,UAAA,CAAA;AACpC,YAAA,IAAI,CAACC,EAAE,GAAGP,GAAGQ,IAAI,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AAC5B,YAAA,IAAI,CAACC,KAAK,GAAGV,GAAGQ,IAAI,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AAC/B,YAAA,IAAI,CAACE,KAAK,GAAGX,GAAGQ,IAAI,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AAC/BT,YAAAA,EAAAA,CAAGY,IAAI,CAAC,WAAA;AACN,gBAAA,IAAI,CAACC,SAAS,CAACC,QAAQ,GAAGd,EAAGe,CAAAA,IAAI,CAAC,IAAI,CAACZ,OAAO,CAACC,GAAG,EAAE,CAAG,EAAA,CAAA,CAAA;AACvD,gBAAA,IAAI,CAACY,QAAQ,CAACC,SAAS,GAAGjB,EAAAA,CAAGkB,GAAG,CAC9BlB,EAAGmB,CAAAA,IAAI,CAAC,IAAI,CAACZ,EAAE,EAAE,IAAI,CAACG,KAAK,EAAE,IAAI,CAACC,KAAK,CACvCX,EAAAA,EAAAA,CAAGQ,IAAI,CAAC,IAAI,CAACL,OAAO,CAACC,GAAG,EAAE,CAAA,CAAA,CAAA;gBAE5B,IAAIhC,MAAAA,CAAOmB,IAAI,KAAK,QAAU,EAAA;AAC5B,oBAAA,IAAI,CAACsB,SAAS,CAACC,QAAQ,CAACM,CAAC,GAAGpB,EAAAA,CAAGqB,GAAG,CAAC,IAAI,CAACR,SAAS,CAACC,QAAQ,CAACM,CAAC,CAAA;AAC9D;AACF,aAAA,CAAA;AACF,SAAA;AACAE,QAAAA,QAAAA,CAAAA,CAAStB,EAAE,EAAA;YACT,IAAIT,IAAAA,KAAS,KAASA,IAAAA,IAAAA,KAAS,SAAW,EAAA;AACxC,gBAAA,IAAI,CAACgC,MAAM,GAAGvB,GAAGwB,KAAK,EAAA,CAAGf,OAAO,CAAC,CAAA,CAAA;AACnC;AACA,YAAA,IAAI,CAACgB,cAAc,GAAGzB,GAAGQ,IAAI,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AACxC,YAAA,IAAI,CAACiB,QAAQ,GAAG1B,GAAGwB,KAAK,EAAA,CAAGf,OAAO,CAAC,CAAA,CAAA;AACnC,YAAA,IAAI,CAACkB,YAAY,GAAG3B,GAAG4B,OAAO,EAAA,CAAGnB,OAAO,CAAC,CAAA,CAAA;AACzC,YAAA,IAAI,CAACoB,iBAAiB,GAAG7B,EAAAA,CAAGwB,KAAK,CAAChC,UAAAA,CAAAA;AAClC,YAAA,IAAI,CAACsC,0BAA0B,GAAG9B,EAAGwB,CAAAA,KAAK,CAAC,CAAIhC,GAAAA,UAAAA,CAAAA;AAC/C,YAAA,IAAI,CAACuC,CAAC,GAAG/B,EAAAA,CAAGwB,KAAK,CAAC,CAAA,CAAA;AAClB,YAAA,IAAI,CAACR,QAAQ,CAACgB,QAAQ,GAAGhC,GAAGe,IAAI,EAAA;YAChC,IAAI3C,MAAAA,CAAOmB,IAAI,KAAK,OAAS,EAAA;gBAC3BS,EAAGiC,CAAAA,IAAI,CAAC,oBAAsB,EAAA;AAACjC,oBAAAA,EAAAA,CAAGkC,GAAG,CAAC,MAAA;iBAAQ,EAAE,WAAA;AAC9C,oBAAA,IAAI,CAACC,EAAE,CAACC,IAAI,GAAGpC,EAAAA,CAAGwB,KAAK,CAAC,CAAA,CAAA;AACxB,oBAAA,IAAI,CAACW,EAAE,CAACE,KAAK,GAAGrC,EAAAA,CAAGwB,KAAK,CAAC,CAAA,CAAA;AACzB,oBAAA,IAAI,CAACW,EAAE,CAACG,OAAO,GAAGtC,EAAAA,CAAGwB,KAAK,CAAC,GAAA,CAAA;AAC3B,oBAAA,IAAI,CAACW,EAAE,CAACI,CAAC,GAAG,IAAI,CAACC,IAAI;oBACrB,IAAI,CAACC,IAAI,CAACzC,EAAAA,CAAGkC,GAAG,CAAC,GAAA,CAAA,EAAM,GAAG,EAAI,EAAA,WAAA;wBAC5B,IAAI,CAACG,KAAK,GAAGrC,EAAAA,CAAGkB,GAAG,CAAC,IAAI,CAACmB,KAAK,EAAE,CAAA,CAAA;wBAChC,IAAI,CAACD,IAAI,GAAGpC,EAAG0C,CAAAA,GAAG,CAAC,IAAI,CAACN,IAAI,EAAEpC,EAAAA,CAAG2C,GAAG,CAAC3C,GAAG4C,GAAG,CAAC5C,EAAGwB,CAAAA,KAAK,CAAC,IAAI,CAACe,CAAC,CAAG,EAAA,CAAA,CAAA,EAAI,IAAI,CAACF,KAAK,CAAA,CAAA;wBAC5E,IAAI,CAACE,CAAC,GAAGvC,EAAAA,CAAG2C,GAAG,CAAC,IAAI,CAACJ,CAAC,EAAE,CAAA,CAAA;wBACxB,IAAI,CAACM,GAAG,CAAC7C,EAAG8C,CAAAA,KAAK,CAAC,IAAI,CAACP,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;AAC5B,4BAAA,IAAI,CAACQ,MAAM,EAAA;AACb,yBAAA,CAAA;AACF,qBAAA,CAAA;AACA,oBAAA,IAAI,CAACC,OAAO,CAAC,IAAI,CAACZ,IAAI,CAAA;AACxB,iBAAA,CAAA;gBACApC,EAAGiC,CAAAA,IAAI,CAAC,cAAgB,EAAA;AAACjC,oBAAAA,EAAAA,CAAGkC,GAAG,CAAC,GAAA,CAAA;AAAMlC,oBAAAA,EAAAA,CAAGkC,GAAG,CAAC,GAAA;iBAAK,EAAE,WAAA;AAClD,oBAAA,IAAI,CAACc,OAAO,CAAChD,EAAAA,CAAGK,IAAI,CAACL,EAAG2C,CAAAA,GAAG,CAAC3C,EAAAA,CAAGwB,KAAK,CAAC,IAAI,CAACyB,CAAC,CAAA,EAAGjD,EAAGwB,CAAAA,KAAK,CAAC,IAAI,CAAC0B,CAAC,CAAI,CAAA,EAAA,IAAI,CAACC,kBAAkB,CAAC,IAAI,CAACF,CAAC,CAAA,CAAA,CAAA;AACjG,iBAAA,CAAA;aACK,MAAA;gBACLjD,EAAGiC,CAAAA,IAAI,CAAC,oBAAsB,EAAA;AAACjC,oBAAAA,EAAAA,CAAGoD,IAAI,CAAC,MAAA;iBAAQ,EAAE,WAAA;AAC/C,oBAAA,IAAI,CAACjB,EAAE,CAACI,CAAC,GAAG,IAAI,CAACC,IAAI;oBACrB,IAAI,CAACD,CAAC,GAAGvC,EAAAA,CAAGqD,MAAM,CAACrD,EAAAA,CAAGsD,GAAG,CAAC,IAAI,CAACf,CAAC,EAAE,KAAKvC,EAAGuD,CAAAA,GAAG,CAAC,IAAI,CAAChB,CAAC,EAAE,EAAA,CAAA,CAAA;AACtD,oBAAA,IAAI,CAACA,CAAC,GAAGvC,EAAAA,CAAGqD,MAAM,CAChBrD,EAAGsD,CAAAA,GAAG,CAACtD,EAAAA,CAAGwD,OAAO,CAAC,IAAI,CAACjB,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,EACvCvC,EAAGuD,CAAAA,GAAG,CAACvD,EAAAA,CAAGwD,OAAO,CAAC,IAAI,CAACjB,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,CAAA;AAEzC,oBAAA,IAAI,CAACA,CAAC,GAAGvC,EAAAA,CAAGqD,MAAM,CAChBrD,EAAGsD,CAAAA,GAAG,CAACtD,EAAAA,CAAGwD,OAAO,CAAC,IAAI,CAACjB,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,EACvCvC,EAAGuD,CAAAA,GAAG,CAACvD,EAAAA,CAAGwD,OAAO,CAAC,IAAI,CAACjB,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,CAAA;AAEzC,oBAAA,IAAI,CAACA,CAAC,GAAGvC,EAAAA,CAAGqD,MAAM,CAChBrD,EAAGsD,CAAAA,GAAG,CAACtD,EAAAA,CAAGwD,OAAO,CAAC,IAAI,CAACjB,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,EACvCvC,EAAGuD,CAAAA,GAAG,CAACvD,EAAAA,CAAGwD,OAAO,CAAC,IAAI,CAACjB,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,CAAA;AAEzC,oBAAA,IAAI,CAACA,CAAC,GAAGvC,EAAAA,CAAGqD,MAAM,CAChBrD,EAAGsD,CAAAA,GAAG,CAACtD,EAAAA,CAAGwD,OAAO,CAAC,IAAI,CAACjB,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,EACvCvC,EAAGuD,CAAAA,GAAG,CAACvD,EAAAA,CAAGwD,OAAO,CAAC,IAAI,CAACjB,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,CAAA;AAEzC,oBAAA,IAAI,CAACS,OAAO,CAAChD,EAAAA,CAAGkB,GAAG,CAAClB,EAAGwB,CAAAA,KAAK,CAAC,IAAI,CAACe,CAAC,CAAG,EAAA,sBAAA,CAAA,CAAA;AACxC,iBAAA,CAAA;gBACAvC,EAAGiC,CAAAA,IAAI,CAAC,cAAgB,EAAA;AAACjC,oBAAAA,EAAAA,CAAGkC,GAAG,CAAC,GAAA,CAAA;AAAMlC,oBAAAA,EAAAA,CAAGkC,GAAG,CAAC,GAAA;iBAAK,EAAE,WAAA;AAClD,oBAAA,IAAI,CAACc,OAAO,CACVhD,EAAAA,CAAGK,IAAI,CAACL,EAAAA,CAAG2C,GAAG,CAAC3C,EAAGwB,CAAAA,KAAK,CAAC,IAAI,CAACyB,CAAC,CAAA,EAAGjD,EAAGwB,CAAAA,KAAK,CAAC,IAAI,CAAC0B,CAAC,IAAI,IAAI,CAACC,kBAAkB,CAACnD,EAAGoD,CAAAA,IAAI,CAAC,IAAI,CAACH,CAAC,CAAA,CAAA,CAAA,CAAA;AAE9F,iBAAA,CAAA;AACF;YACAjD,EAAGiC,CAAAA,IAAI,CAAC,MAAQ,EAAA;AAACjC,gBAAAA,EAAAA,CAAGwB,KAAK,CAAC,GAAA;aAAK,EAAE,WAAA;AAC/B,gBAAA,IAAI,CAACwB,OAAO,CAAChD,EAAAA,CAAGkB,GAAG,CAAClB,EAAGyD,CAAAA,IAAI,CAAC,IAAI,CAACC,CAAC,CAAG,EAAA,GAAA,CAAA,CAAA;AACvC,aAAA,CAAA;AACA,YAAA,IAAInE,SAAS,YAAc,EAAA;gBACzBS,EAAGiC,CAAAA,IAAI,CAAC,qBAAuB,EAAA;AAACjC,oBAAAA,EAAAA,CAAGK,IAAI,CAAC,GAAA;iBAAK,EAAE,WAAA;AAC7C,oBAAA,IAAI,CAAC8B,EAAE,CAACwB,GAAG,GAAG3D,GAAGkB,GAAG,CAAC,IAAI,CAAC0C,CAAC,CAACF,CAAC,EAAE,CAAA,GAAIG,KAAKC,EAAE,CAAA;AAC1C,oBAAA,IAAI,CAAC3B,EAAE,CAAC4B,SAAS,GAAG/D,EAAAA,CAAGgE,GAAG,CAAC,CAAG,EAAA,IAAI,CAACJ,CAAC,CAACxC,CAAC,CAAA;oBACtC,IAAI,CAACe,EAAE,CAAC8B,QAAQ,GAAGjE,GAAGkE,IAAI,CAAC,IAAI,CAACH,SAAS,CAAA;AACzC,oBAAA,IAAI,CAAC5B,EAAE,CAACgC,QAAQ,GAAGnE,EAAGkE,CAAAA,IAAI,CAAClE,EAAAA,CAAGgE,GAAG,CAAC,CAAG,EAAA,IAAI,CAACD,SAAS,CAAA,CAAA;AACnD,oBAAA,IAAI,CAACf,OAAO,CACVhD,EAAGQ,CAAAA,IAAI,CACLR,EAAGkB,CAAAA,GAAG,CAAC,IAAI,CAACiD,QAAQ,EAAEnE,EAAGoE,CAAAA,GAAG,CAAC,IAAI,CAACT,GAAG,CAAA,CAAA,EACrC3D,GAAGkB,GAAG,CAAC,IAAI,CAACiD,QAAQ,EAAEnE,EAAAA,CAAGqE,GAAG,CAAC,IAAI,CAACV,GAAG,CACrC,CAAA,EAAA,IAAI,CAACM,QAAQ,CAAA,CAAA;AAGnB,iBAAA,CAAA;gBACAjE,EAAGiC,CAAAA,IAAI,CAAC,YAAc,EAAA;AAACjC,oBAAAA,EAAAA,CAAGQ,IAAI,CAAC,WAAA,CAAA;AAAcR,oBAAAA,EAAAA,CAAGQ,IAAI,CAAC,gBAAA;iBAAkB,EAAE,WAAA;oBACvE,IAAI,CAAC2B,EAAE,CAACI,CAAC,GAAGvC,GAAGsE,SAAS,CAAC,IAAI,CAACrD,SAAS,CAAA;AACvC,oBAAA,IAAI,CAACkB,EAAE,CAACoC,MAAM,GAAGvE,EAAAA,CAAGQ,IAAI,CAAC,CAAA,CAAA;AACzB,oBAAA,IAAI,CAAC2B,EAAE,CAACqC,OAAO,GAAGxE,GAAGQ,IAAI,EAAA;AACzB,oBAAA,IAAI,CAACqC,GAAG,CAAC7C,EAAAA,CAAGyE,QAAQ,CAACzE,EAAAA,CAAG0E,GAAG,CAAC,IAAI,CAACnC,CAAC,CAACoC,CAAC,GAAG,KAAQ,CAAA,EAAA,WAAA;AAC7C,wBAAA,IAAI,CAACH,OAAO,GAAGxE,GAAGQ,IAAI,CAAC,GAAG,CAAG,EAAA,CAAA,CAAA;AAC/B,qBAAA,CAAA,CAAGoE,KAAK,CAAC,WAAA;AACP,wBAAA,IAAI,CAACJ,OAAO,GAAGxE,GAAGQ,IAAI,CAAC,GAAG,CAAG,EAAA,CAAA,CAAA;AAC/B,qBAAA,CAAA;AACA,oBAAA,IAAI,CAACgE,OAAO,GAAGxE,EAAAA,CAAGsE,SAAS,CAACtE,EAAAA,CAAG6E,KAAK,CAAC,IAAI,CAACL,OAAO,EAAE,IAAI,CAACjC,CAAC,CAAA,CAAA;AACzD,oBAAA,IAAI,CAACJ,EAAE,CAAC2C,SAAS,GAAG9E,EAAG6E,CAAAA,KAAK,CAAC,IAAI,CAACtC,CAAC,EAAE,IAAI,CAACiC,OAAO,CAAA;AACjD,oBAAA,IAAI,CAACrC,EAAE,CAAC4C,GAAG,GAAG/E,EAAAA,CAAGmB,IAAI,CAAC,IAAI,CAACqD,OAAO,EAAE,IAAI,CAACM,SAAS,EAAE,IAAI,CAACvC,CAAC,CAAA;oBAC1D,IAAI,CAACJ,EAAE,CAAC6C,QAAQ,GAAG,IAAI,CAACvD,cAAc,CAACL,CAAC;oBACxC,IAAI,CAACe,EAAE,CAAC8C,IAAI,GAAG,IAAI,CAACxD,cAAc,CAACiC,CAAC;oBACpC,IAAI,CAACvB,EAAE,CAAC+C,UAAU,GAAG,IAAI,CAACzD,cAAc,CAACkD,CAAC;oBAC1C,IAAI,CAACxC,EAAE,CAACgD,MAAM,GAAGnF,EAAG2C,CAAAA,GAAG,CAAC,CAAA,GAAIkB,IAAKC,CAAAA,EAAE,EAAE9D,EAAGkB,CAAAA,GAAG,CAAC,IAAI,CAAC+D,IAAI,EAAE,IAAI,CAACA,IAAI,EAAE,CAAA,CAAA,CAAA;oBAClE,IAAI,CAACxC,IAAI,CAACzC,EAAAA,CAAGkC,GAAG,CAAC,GAAA,CAAA,EAAM,GAAG1C,UAAY,EAAA,WAAA;AACpC,wBAAA,IAAI,CAAC2C,EAAE,CAACiD,EAAE,GAAG,IAAI,CAACC,YAAY,CAAC,IAAI,CAACpC,CAAC,EAAEzD,UAAAA,CAAAA;AACvC,wBAAA,IAAI,CAAC2C,EAAE,CAACmD,EAAE,GAAGtF,EAAGsE,CAAAA,SAAS,CAAC,IAAI,CAACiB,mBAAmB,CAAC,IAAI,CAACH,EAAE,CAAA,CAAA;wBAC1D,IAAI,CAACjD,EAAE,CAACqD,EAAE,GAAGxF,EAAGQ,CAAAA,IAAI,CAAC,CAAA,EAAG,CAAG,EAAA,CAAA,CAAA;AAC3B,wBAAA,IAAI,CAAC2B,EAAE,CAACsD,GAAG,GAAGzF,EAAG0F,CAAAA,GAAG,CAAC,IAAI,CAACF,EAAE,EAAE,IAAI,CAACF,EAAE,CAAA;wBACrC,IAAI,CAACzC,GAAG,CAAC7C,EAAG2F,CAAAA,WAAW,CAAC,IAAI,CAACF,GAAG,EAAE,CAAI,CAAA,EAAA,WAAA;AACpC,4BAAA,IAAI,CAACtD,EAAE,CAACyD,YAAY,GAAG5F,EAAAA,CAAG2C,GAAG,CAACkB,IAAKC,CAAAA,EAAE,EAAE,IAAI,CAAC2B,GAAG,CAAA;AAC/C,4BAAA,IAAI,CAACtD,EAAE,CAAC0D,MAAM,GAAG7F,EAAGkB,CAAAA,GAAG,CAAC,IAAI,CAAC0E,YAAY,EAAE,IAAI,CAAC9D,0BAA0B,CAAA;AAC1E,4BAAA,IAAI,CAACK,EAAE,CAAC2D,CAAC,GAAG9F,EAAG0C,CAAAA,GAAG,CAAC1C,EAAAA,CAAGgE,GAAG,CAAC,IAAI,CAAC+B,IAAI,CAAC,IAAI,CAACF,MAAM,CAAG,EAAA,IAAI,CAACE,IAAI,CAAC,IAAI,CAACZ,MAAM,CAAA,CAAA,EAAI,IAAI,CAACY,IAAI,CAAC,IAAI,CAAChE,CAAC,CAAA,CAAA;AAC3F,4BAAA,IAAI,CAACI,EAAE,CAAC6D,QAAQ,GAAGhG,EAAGiG,CAAAA,KAAK,CAAC,IAAI,CAACH,CAAC,EAAE,CAAG,EAAA,IAAI,CAACd,QAAQ,CAAA;4BACpD,IAAI,CAAC7C,EAAE,CAAC+D,CAAC,GAAGlG,EAAGmG,CAAAA,kBAAkB,CAC/B,IAAI,CAACxE,YAAY,EACjB3B,EAAAA,CAAGkB,GAAG,CAAC,IAAI,CAAC6D,GAAG,EAAE,IAAI,CAACO,EAAE,CAAA,EACxB,IAAI,CAACU,QAAQ,CAAA,CACbI,GAAG;AACL,4BAAA,IAAI,CAAC7B,MAAM,GAAGvE,EAAAA,CAAG0C,GAAG,CAAC,IAAI,CAAC6B,MAAM,EAAE,IAAI,CAAC2B,CAAC,CAAA;AAC1C,yBAAA,CAAA;AACF,qBAAA,CAAA;AACA,oBAAA,IAAI,CAAC3B,MAAM,GAAGvE,EAAGkB,CAAAA,GAAG,CAAC,IAAI,CAACqD,MAAM,EAAE,IAAI,CAACzC,0BAA0B,EAAE,IAAI,CAACoD,UAAU,CAAA;AAClF,oBAAA,IAAI,CAAClC,OAAO,CAAC,IAAI,CAACuB,MAAM,CAAA;AAC1B,iBAAA,CAAA;AACF;YACA,IAAIhF,IAAAA,KAAS,KAASA,IAAAA,IAAAA,KAAS,SAAW,EAAA;gBACxCS,EAAGiC,CAAAA,IAAI,CAAC,gCAAkC,EAAA;AAACjC,oBAAAA,EAAAA,CAAGK,IAAI,CAAC,GAAA,CAAA;AAAML,oBAAAA,EAAAA,CAAGwB,KAAK,CAAC,GAAA;iBAAK,EAAE,WAAA;AACvE,oBAAA,IAAI,CAACW,EAAE,CAACwB,GAAG,GAAG3D,GAAGkB,GAAG,CAAC,IAAI,CAAC0C,CAAC,CAACF,CAAC,EAAE,CAAA,GAAIG,KAAKC,EAAE,CAAA;oBAC1C,IAAI,CAAC3B,EAAE,CAAC4B,SAAS,GAAG/D,EAAG2C,CAAAA,GAAG,CACxB3C,EAAGgE,CAAAA,GAAG,CAAC,CAAG,EAAA,IAAI,CAACJ,CAAC,CAACxC,CAAC,CAClBpB,EAAAA,EAAAA,CAAG0C,GAAG,CAAC1C,EAAAA,CAAGkB,GAAG,CAAClB,EAAAA,CAAG0C,GAAG,CAAC,IAAI,CAAC2D,CAAC,EAAE,IAAIrG,EAAGgE,CAAAA,GAAG,CAAC,IAAI,CAACqC,CAAC,EAAE,CAAA,CAAA,EAAI,IAAI,CAACzC,CAAC,CAACxC,CAAC,CAAG,EAAA,CAAA,CAAA,CAAA;oBAEjE,IAAI,CAACe,EAAE,CAAC8B,QAAQ,GAAGjE,GAAGkE,IAAI,CAAC,IAAI,CAACH,SAAS,CAAA;AACzC,oBAAA,IAAI,CAAC5B,EAAE,CAACgC,QAAQ,GAAGnE,EAAGkE,CAAAA,IAAI,CAAClE,EAAAA,CAAGgE,GAAG,CAAC,CAAG,EAAA,IAAI,CAACD,SAAS,CAAA,CAAA;AACnD,oBAAA,IAAI,CAACf,OAAO,CACVhD,EAAGQ,CAAAA,IAAI,CACLR,EAAGkB,CAAAA,GAAG,CAAClB,EAAAA,CAAGoE,GAAG,CAAC,IAAI,CAACT,GAAG,GAAG,IAAI,CAACQ,QAAQ,CAAA,EACtCnE,GAAGkB,GAAG,CAAClB,EAAGqE,CAAAA,GAAG,CAAC,IAAI,CAACV,GAAG,CAAA,EAAG,IAAI,CAACQ,QAAQ,CACtC,EAAA,IAAI,CAACF,QAAQ,CAAA,CAAA;AAGnB,iBAAA,CAAA;gBACAjE,EAAGiC,CAAAA,IAAI,CAAC,mCAAqC,EAAA;AAACjC,oBAAAA,EAAAA,CAAGK,IAAI,CAAC,GAAA,CAAA;AAAML,oBAAAA,EAAAA,CAAGwB,KAAK,CAAC,GAAA;iBAAK,EAAE,WAAA;AAC1E,oBAAA,IAAI,CAACW,EAAE,CAACwB,GAAG,GAAG3D,GAAGkB,GAAG,CAAC,IAAI,CAAC0C,CAAC,CAACF,CAAC,EAAE,CAAA,GAAIG,KAAKC,EAAE,CAAA;AAC1C,oBAAA,IAAI,CAAC3B,EAAE,CAACgC,QAAQ,GAAGnE,EAAAA,CAAGsG,GAAG,CAAC,IAAI,CAAC1C,CAAC,CAACxC,CAAC,EAAEpB,EAAAA,CAAG2C,GAAG,CAAC,IAAI,CAAC0D,CAAC,EAAErG,GAAG0C,GAAG,CAAC1C,EAAGkB,CAAAA,GAAG,CAAC,CAAA,EAAG,IAAI,CAACmF,CAAC,CAAG,EAAA,CAAA,CAAA,CAAA,CAAA;oBAC7E,IAAI,CAAClE,EAAE,CAAC8B,QAAQ,GAAGjE,EAAGkE,CAAAA,IAAI,CAAClE,EAAGgE,CAAAA,GAAG,CAAC,CAAGhE,EAAAA,EAAAA,CAAGkB,GAAG,CAAC,IAAI,CAACiD,QAAQ,EAAE,IAAI,CAACA,QAAQ,CAAA,CAAA,CAAA;AACxE,oBAAA,IAAI,CAACnB,OAAO,CACVhD,EAAGQ,CAAAA,IAAI,CACLR,EAAGkB,CAAAA,GAAG,CAAClB,EAAAA,CAAGoE,GAAG,CAAC,IAAI,CAACT,GAAG,GAAG,IAAI,CAACQ,QAAQ,CAAA,EACtCnE,GAAGkB,GAAG,CAAClB,EAAGqE,CAAAA,GAAG,CAAC,IAAI,CAACV,GAAG,CAAA,EAAG,IAAI,CAACQ,QAAQ,CACtC,EAAA,IAAI,CAACF,QAAQ,CAAA,CAAA;AAGnB,iBAAA,CAAA;gBACAjE,EAAGiC,CAAAA,IAAI,CACL,+CACA,EAAA;AAACjC,oBAAAA,EAAAA,CAAGwB,KAAK,CAAC,KAAA,CAAA;AAAQxB,oBAAAA,EAAAA,CAAGwB,KAAK,CAAC,QAAA;iBAAU,EACrC,WAAA;AACE,oBAAA,IAAI,CAACW,EAAE,CAACoE,EAAE,GAAGvG,EAAGkB,CAAAA,GAAG,CAAC,IAAI,CAACK,MAAM,EAAE,IAAI,CAACA,MAAM,CAAA;oBAC5C,IAAI,CAACY,EAAE,CAACqE,CAAC,GAAGxG,EAAG0C,CAAAA,GAAG,CAAC1C,EAAAA,CAAGkB,GAAG,CAAC,IAAI,CAACuF,GAAG,EAAE,IAAI,CAACA,GAAG,EAAEzG,EAAAA,CAAGgE,GAAG,CAAC,IAAI,CAACuC,EAAE,EAAE,CAAK,CAAA,CAAA,EAAA,CAAA,CAAA;oBACnE,IAAI,CAACvD,OAAO,CAAChD,EAAAA,CAAG2C,GAAG,CAAC,IAAI,CAAC4D,EAAE,EAAEvG,EAAAA,CAAGkB,GAAG,CAAC,IAAI,CAACsF,CAAC,EAAE,IAAI,CAACA,CAAC,EAAE3C,IAAAA,CAAKC,EAAE,CAAA,CAAA,CAAA;AAC7D,iBAAA,CAAA;gBAEF9D,EAAGiC,CAAAA,IAAI,CAAC,oCAAsC,EAAA;AAACjC,oBAAAA,EAAAA,CAAGwB,KAAK,CAAC,KAAA,CAAA;AAAQxB,oBAAAA,EAAAA,CAAGwB,KAAK,CAAC,WAAA;iBAAa,EAAE,WAAA;AACtF,oBAAA,IAAI,CAACW,EAAE,CAACuE,IAAI,GAAG1G,EAAG2C,CAAAA,GAAG,CAAC,CAAA,EAAG3C,GAAG2G,GAAG,CAAC,IAAI,CAACC,SAAS,EAAE,QAAA,CAAA,CAAA;AAChD,oBAAA,IAAI,CAACzE,EAAE,CAAC0E,KAAK,GAAG7G,EAAGkB,CAAAA,GAAG,CAAC,IAAI,CAACuF,GAAG,EAAE,IAAI,CAACA,GAAG,CAAA;AACzC,oBAAA,IAAI,CAACtE,EAAE,CAAC2E,KAAK,GAAG9G,EAAG2G,CAAAA,GAAG,CAAC3G,EAAAA,CAAGgE,GAAG,CAAC,CAAA,EAAG,IAAI,CAAC6C,KAAK,CAAG,EAAA,SAAA,CAAA;AAC9C,oBAAA,IAAI,CAAC7D,OAAO,CACVhD,EAAAA,CAAG2C,GAAG,CAAC3C,EAAAA,CAAGkB,GAAG,CAAClB,GAAG0C,GAAG,CAAC,IAAI,CAACgE,IAAI,EAAE,CAAA,CAAA,EAAI1G,EAAGsG,CAAAA,GAAG,CAAC,IAAI,CAACQ,KAAK,EAAE9G,EAAGkB,CAAAA,GAAG,CAAC,IAAI,CAACwF,IAAI,EAAE,GAAQ,CAAA,CAAA,CAAA,EAAA,CAAA,GAAI7C,KAAKC,EAAE,CAAA,CAAA;AAEhG,iBAAA,CAAA;gBACA9D,EAAGiC,CAAAA,IAAI,CACL,UACA,EAAA;AAACjC,oBAAAA,EAAAA,CAAGwB,KAAK,CAAC,QAAA,CAAA;AAAWxB,oBAAAA,EAAAA,CAAGQ,IAAI,CAAC,WAAA,CAAA;AAAcR,oBAAAA,EAAAA,CAAGQ,IAAI,CAAC,gBAAA;iBAAkB,EACrE,WAAA;oBACE,IAAI,CAAC2B,EAAE,CAACI,CAAC,GAAGvC,GAAGsE,SAAS,CAAC,IAAI,CAACrD,SAAS,CAAA;oBACvC,IAAI,CAAC4B,GAAG,CAAC7C,EAAG8C,CAAAA,KAAK,CAAC,IAAI,CAACvB,MAAM,EAAE,CAAI,CAAA,EAAA,WAAA;AACjC,wBAAA,IAAI,CAACY,EAAE,CAAC+D,CAAC,GAAGlG,GAAGmG,kBAAkB,CAAC,IAAI,CAACxE,YAAY,EAAE,IAAI,CAACY,CAAC,EAAE,GAAG6D,GAAG;AACnE,wBAAA,IAAI,CAACpD,OAAO,CAAC,IAAI,CAACkD,CAAC,CAAA;AACrB,qBAAA,CAAA,CAAGtB,KAAK,CAAC,WAAA;AACP,wBAAA,IAAI,CAACzC,EAAE,CAACoC,MAAM,GAAGvE,EAAAA,CAAGQ,IAAI,CAAC,CAAA,CAAA;AACzB,wBAAA,IAAI,CAAC2B,EAAE,CAACqC,OAAO,GAAGxE,GAAGQ,IAAI,EAAA;AACzB,wBAAA,IAAI,CAACqC,GAAG,CAAC7C,EAAAA,CAAGyE,QAAQ,CAACzE,EAAAA,CAAG0E,GAAG,CAAC,IAAI,CAACnC,CAAC,CAACoC,CAAC,GAAG,KAAQ,CAAA,EAAA,WAAA;AAC7C,4BAAA,IAAI,CAACH,OAAO,GAAGxE,GAAGQ,IAAI,CAAC,GAAG,CAAG,EAAA,CAAA,CAAA;AAC/B,yBAAA,CAAA,CAAGoE,KAAK,CAAC,WAAA;AACP,4BAAA,IAAI,CAACJ,OAAO,GAAGxE,GAAGQ,IAAI,CAAC,GAAG,CAAG,EAAA,CAAA,CAAA;AAC/B,yBAAA,CAAA;AACA,wBAAA,IAAI,CAACgE,OAAO,GAAGxE,EAAAA,CAAGsE,SAAS,CAACtE,EAAAA,CAAG6E,KAAK,CAAC,IAAI,CAACL,OAAO,EAAE,IAAI,CAACjC,CAAC,CAAA,CAAA;AACzD,wBAAA,IAAI,CAACJ,EAAE,CAAC2C,SAAS,GAAG9E,EAAG6E,CAAAA,KAAK,CAAC,IAAI,CAACtC,CAAC,EAAE,IAAI,CAACiC,OAAO,CAAA;AACjD,wBAAA,IAAI,CAACrC,EAAE,CAAC4C,GAAG,GAAG/E,EAAAA,CAAGmB,IAAI,CAAC,IAAI,CAACqD,OAAO,EAAE,IAAI,CAACM,SAAS,EAAE,IAAI,CAACvC,CAAC,CAAA;wBAC1D,IAAI,CAACJ,EAAE,CAAC6C,QAAQ,GAAG,IAAI,CAACvD,cAAc,CAACL,CAAC;wBACxC,IAAI,CAACe,EAAE,CAAC8C,IAAI,GAAG,IAAI,CAACxD,cAAc,CAACiC,CAAC;wBACpC,IAAI,CAACvB,EAAE,CAACgD,MAAM,GAAGnF,EAAG2C,CAAAA,GAAG,CAAC,CAAA,GAAIkB,IAAKC,CAAAA,EAAE,EAAE9D,EAAGkB,CAAAA,GAAG,CAAC,IAAI,CAAC+D,IAAI,EAAE,IAAI,CAACA,IAAI,EAAE,CAAA,CAAA,CAAA;AAClE,wBAAA,IAAI,CAAC9C,EAAE,CAAC4E,MAAM,GAAG/G,EAAAA,CAAGwB,KAAK,CAAC,CAAA,CAAA;wBAC1B,IAAI,CAACiB,IAAI,CAACzC,EAAAA,CAAGkC,GAAG,CAAC,GAAA,CAAA,EAAM,GAAG1C,UAAY,EAAA,WAAA;AACpC,4BAAA,IAAI,CAAC2C,EAAE,CAACiD,EAAE,GAAG,IAAI,CAACC,YAAY,CAAC,IAAI,CAACpC,CAAC,EAAEzD,UAAAA,CAAAA;AACvC,4BAAA,IAAID,SAAS,KAAO,EAAA;AAClB,gCAAA,IAAI,CAAC4C,EAAE,CAAC6E,CAAC,GAAG,IAAI,CAACC,8BAA8B,CAAC,IAAI,CAAC7B,EAAE,EAAE,IAAI,CAAC7D,MAAM,CAAA;6BAC/D,MAAA;AACL,gCAAA,IAAI,CAACY,EAAE,CAAC6E,CAAC,GAAG,IAAI,CAACE,iCAAiC,CAAC,IAAI,CAAC9B,EAAE,EAAE,IAAI,CAAC7D,MAAM,CAAA;AACzE;AACA,4BAAA,IAAI,CAACY,EAAE,CAACgF,GAAG,GAAGnH,EAAAA,CAAGwB,KAAK,CAAC,CAAA,CAAA;4BACvB,IAAI,CAACW,EAAE,CAACsE,GAAG,GAAG,IAAI,CAACO,CAAC,CAACrC,CAAC;AACtB,4BAAA,IAAI,CAACxC,EAAE,CAACiF,IAAI,GAAGpH,EAAAA,CAAGkB,GAAG,CAAC,IAAI,CAAC8F,CAAC,CAACrC,CAAC,EAAE,IAAI,CAACqC,CAAC,CAACrC,CAAC,CAAA;AACxC,4BAAA,IAAI,CAACxC,EAAE,CAACsD,GAAG,GAAGzF,EAAGgE,CAAAA,GAAG,CAAChE,EAAAA,CAAGkB,GAAG,CAAC,IAAI,CAACkG,IAAI,EAAE,CAAI,CAAA,EAAA,CAAA,CAAA;AAC3C,4BAAA,IAAI,CAACjF,EAAE,CAACkF,CAAC,GAAGrH,EAAAA,CAAGsE,SAAS,CACtBtE,EAAAA,CAAGQ,IAAI,CAACR,GAAGkB,GAAG,CAAC,IAAI,CAACuF,GAAG,EAAE,IAAI,CAACO,CAAC,CAACtD,CAAC,EAAE,CAAA,CAAA,EAAI1D,GAAGkB,GAAG,CAAC,IAAI,CAACuF,GAAG,EAAE,IAAI,CAACO,CAAC,CAAC5F,CAAC,EAAE,CAAI,CAAA,EAAA,IAAI,CAACqE,GAAG,CAAA,CAAA;4BAEhF,IAAI,CAAC5C,GAAG,CAAC7C,EAAG2F,CAAAA,WAAW,CAAC,IAAI,CAACF,GAAG,EAAE,CAAI,CAAA,EAAA,WAAA;AACpC,gCAAA,IAAIlG,SAAS,KAAO,EAAA;AAClB,oCAAA,IAAI,CAAC4C,EAAE,CAACyD,YAAY,GAAG5F,EAAAA,CAAG2C,GAAG,CAC3B,CAAA,EACA,IAAI,CAAC2E,6CAA6C,CAAC,IAAI,CAACb,GAAG,EAAE,IAAI,CAAClF,MAAM,CAAA,CAAA;iCAErE,MAAA;AACL,oCAAA,IAAI,CAACY,EAAE,CAACyD,YAAY,GAAG5F,EAAAA,CAAG2C,GAAG,CAC3B,CAAA,EACA,IAAI,CAAC4E,kCAAkC,CAAC,IAAI,CAACd,GAAG,EAAE,IAAI,CAAClF,MAAM,CAAA,CAAA;AAEjE;AACA,gCAAA,IAAI,CAACY,EAAE,CAAC0D,MAAM,GAAG7F,EAAGkB,CAAAA,GAAG,CAAC,IAAI,CAAC0E,YAAY,EAAE,IAAI,CAAC9D,0BAA0B,CAAA;AAC1E,gCAAA,IAAI,CAACK,EAAE,CAAC2D,CAAC,GAAG9F,EAAG0C,CAAAA,GAAG,CAChB1C,EAAAA,CAAGgE,GAAG,CAAC,IAAI,CAAC+B,IAAI,CAAC,IAAI,CAACF,MAAM,CAAG,EAAA,IAAI,CAACE,IAAI,CAAC,IAAI,CAACZ,MAAM,CAAA,CAAA,EACpD,IAAI,CAACY,IAAI,CAAC,IAAI,CAAChE,CAAC,CAAA,CAAA;AAElB,gCAAA,IAAI,CAACI,EAAE,CAAC6D,QAAQ,GAAGhG,EAAGiG,CAAAA,KAAK,CAAC,IAAI,CAACH,CAAC,EAAE,CAAG,EAAA,IAAI,CAACd,QAAQ,CAAA;AACpD,gCAAA,IAAI,CAAC+B,MAAM,GAAG/G,EAAAA,CAAG0C,GAAG,CAAC,IAAI,CAACqE,MAAM,EAAE,IAAI,CAACtB,GAAG,CAAA;gCAC1C,IAAI,CAACtD,EAAE,CAAC+D,CAAC,GAAGlG,EAAGmG,CAAAA,kBAAkB,CAC/B,IAAI,CAACxE,YAAY,EACjB3B,EAAAA,CAAGkB,GAAG,CAAC,IAAI,CAAC6D,GAAG,EAAE,IAAI,CAACsC,CAAC,CAAA,EACvB,IAAI,CAACrB,QAAQ,CAAA,CACbI,GAAG;AACL,gCAAA,IAAI,CAAC7B,MAAM,GAAGvE,GAAG0C,GAAG,CAAC,IAAI,CAAC6B,MAAM,EAAEvE,EAAGkB,CAAAA,GAAG,CAAC,IAAI,CAACgF,CAAC,EAAE,IAAI,CAACT,GAAG,CAAA,CAAA;AAC3D,6BAAA,CAAA;AACF,yBAAA,CAAA;AACA,wBAAA,IAAI,CAAClB,MAAM,GAAGvE,EAAAA,CAAG2C,GAAG,CAAC,IAAI,CAAC4B,MAAM,EAAE,IAAI,CAACwC,MAAM,CAAA;AAC7C,wBAAA,IAAI,CAAC/D,OAAO,CAAC,IAAI,CAACuB,MAAM,CAAA;AAC1B,qBAAA,CAAA;AACF,iBAAA,CAAA;AAEJ;AACAvE,YAAAA,EAAAA,CAAGY,IAAI,CAAC,WAAA;gBACN,IAAIrB,IAAAA,KAAS,KAASA,IAAAA,IAAAA,KAAS,SAAW,EAAA;oBACxC,IAAI,CAAC4C,EAAE,CAACqF,KAAK,GAAG,IAAI,CAACC,QAAQ,CAAC,IAAI,CAAClG,MAAM,EAAE,IAAI,CAACpB,OAAO,CAACc,SAAS,EAAE,IAAI,CAACQ,cAAc,CAAA;AACxF;AACA,gBAAA,IAAIlC,SAAS,YAAc,EAAA;AACzB,oBAAA,IAAI,CAAC4C,EAAE,CAACqF,KAAK,GAAG,IAAI,CAACE,UAAU,CAAC,IAAI,CAACvH,OAAO,CAACc,SAAS,EAAE,IAAI,CAACQ,cAAc,CAAA;AAC7E;AACA,gBAAA,IAAI,CAACT,QAAQ,CAACgB,QAAQ,GAAGhC,EAAAA,CAAGe,IAAI,CAACf,EAAAA,CAAGkB,GAAG,CAAC,IAAI,CAACsG,KAAK,EAAE,IAAI,CAAC9F,QAAQ,CAAG,EAAA,CAAA,CAAA;AACtE,aAAA,CAAA;AACF;AACF,KAAA,CAAA;AACF;AACA,SAASiG,kBACPpI,CAAAA,IAAsB,EACtBqH,SAAiB,EACjBgB,QAAgB,EAChBC,UAAuB,EACvBC,OAAuB,EACvBC,cAA2B,EAC3BC,aAAsB,EACtBxI,UAAkB,EAAA;AAElB,IAAA,MAAMpB,MAASC,GAAAA,SAAAA,EAAAA;AACf,IAAA,MAAM4J,WAAcF,GAAAA,cAAAA;IACpBE,WAAYC,CAAAA,0BAA0B,CAAC,CAAGN,EAAAA,QAAAA,CAAAA;IAC1CK,WAAYE,CAAAA,iCAAiC,CAAC,CAAG,EAAA,KAAA,CAAA;AACjD,IAAA,MAAM,EAAExI,OAAO,EAAEE,SAAS,EAAE,GAAGP,eAAeC,IAAMC,EAAAA,UAAAA,CAAAA;IACpDK,SAAUuI,CAAAA,QAAQ,CAAC,gBAAkBJ,EAAAA,aAAAA,CAAAA;IACrCnI,SAAUuI,CAAAA,QAAQ,CAAC,UAAY,EAAA,CAAA,CAAA;IAC/BvI,SAAUwI,CAAAA,UAAU,CAAC,cAAgBR,EAAAA,UAAAA,CAAAA;IACrC,IAAItI,IAAAA,KAAS,KAASA,IAAAA,IAAAA,KAAS,SAAW,EAAA;QACxCM,SAAUuI,CAAAA,QAAQ,CAAC,QAAUxB,EAAAA,SAAAA,CAAAA;AAC/B;AACAxI,IAAAA,MAAAA,CAAOkK,UAAU,CAAC3I,OAAAA,CAAAA;IAClBvB,MAAOmK,CAAAA,YAAY,CAAC,CAAG1I,EAAAA,SAAAA,CAAAA;AACvBzB,IAAAA,MAAAA,CAAOoK,cAAc,CAACP,WAAAA,CAAAA;AACtB,IAAA,IAAK,IAAIhF,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAI,GAAGA,CAAK,EAAA,CAAA;QAC1BgF,WAAYQ,CAAAA,0BAA0B,CAAC,CAAGxF,EAAAA,CAAAA,CAAAA;AAC1C7E,QAAAA,MAAAA,CAAOsK,eAAe,CAAC5K,YAAAA,CAAAA;AACvBM,QAAAA,MAAAA,CAAOuK,eAAe,CAAC5K,YAAAA,CAAAA;AACvB8B,QAAAA,SAAAA,CAAUuI,QAAQ,CAAC,IAAA,EAAMnK,cAAc,CAACgF,CAAAA,CAAE,CAAC,CAAE,CAAA,CAAA;AAC7CpD,QAAAA,SAAAA,CAAUuI,QAAQ,CAAC,OAAA,EAASnK,cAAc,CAACgF,CAAAA,CAAE,CAAC,CAAE,CAAA,CAAA;AAChDpD,QAAAA,SAAAA,CAAUuI,QAAQ,CAAC,OAAA,EAASnK,cAAc,CAACgF,CAAAA,CAAE,CAAC,CAAE,CAAA,CAAA;QAChD7E,MAAOwK,CAAAA,IAAI,CAAC,eAAA,EAAiB,CAAG,EAAA,CAAA,CAAA;AAClC;AACF;AAEA;;;;;;;;IASO,SAASC,gBAAAA,CACdC,GAAgB,EAChBvJ,IAAsB,EACtBwJ,WAAsC,EACtCvJ,UAAmB,EACnBwJ,cAAwB,EAAA;AAExB,IAAA,IAAI,CAACF,GAAAA,IAAO,CAACA,GAAAA,CAAIG,aAAa,EAAI,EAAA;AAChCC,QAAAA,OAAAA,CAAQC,KAAK,CAAC,yDAAA,CAAA;AACd,QAAA;AACF;AACA,IAAA,MAAM/K,MAASC,GAAAA,SAAAA,EAAAA;AACf,IAAA,IAAI,CAACP,YAAc,EAAA;AACjBK,QAAAA,IAAAA,EAAAA;AACF;AACAC,IAAAA,MAAAA,CAAOgL,gBAAgB,EAAA;AACvBJ,IAAAA,cAAAA,GAAiBA,cAAkB,IAAA,IAAA;IACnC,MAAMK,EAAAA,GAAKjL,OAAOkL,eAAe,EAAA;AACjC,IAAA,MAAMC,MAAST,GAAAA,GAAAA;IACf,MAAMU,KAAAA,GAAQV,IAAIU,KAAK;IACvB,MAAMC,YAAAA,GAAeX,IAAIY,aAAa;IACtC,MAAM1B,aAAAA,GAAgB,IAAI9J,OAAQsL,CAAAA,KAAAA,EAAOC,cAAcT,cAAiB,GAAA,CAAA,GAAInF,KAAKC,EAAE,CAAA;AACnF,IAAA,MAAM6F,KAAKZ,WAAYa,CAAAA,aAAa,KAAKb,WAAc3K,GAAAA,MAAAA,CAAOyL,iBAAiB,CAAC;AAACd,QAAAA;KAAY,EAAE,IAAA,CAAA;IAC/F,MAAMe,cAAAA,GAAiBH,EAAGI,CAAAA,0BAA0B,CAAC,CAAA,CAAA;IACrD,MAAMC,cAAAA,GAAiBL,EAAGM,CAAAA,iCAAiC,CAAC,CAAA,CAAA;AAC5D,IAAA,MAAMC,OAAUP,GAAAA,EAAAA,CAAGQ,mBAAmB,EAAE,CAAC,CAAE,CAAA;AAC3C,IAAA,MAAMC,OAAO7K,IAAS,KAAA,KAAA,IAASA,SAAS,SAAY2K,GAAAA,OAAAA,CAAQR,aAAa,GAAG,CAAA;AAC5E,IAAA,IAAK,IAAIzG,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAImH,MAAMnH,CAAK,EAAA,CAAA;QAC7B,MAAMoH,KAAAA,GAAQpH,MAAM,CAAI,GAAA,CAAA,GAAIY,KAAKyC,GAAG,CAAC,GAAGrD,CAAKuG,CAAAA,GAAAA,KAAAA;AAC7C7B,QAAAA,kBAAAA,CACEpI,IACA8K,EAAAA,KAAAA,EACApH,CACAsG,EAAAA,MAAAA,EACAe,YAAa/K,CAAAA,IAAAA,KAAS,KAASA,IAAAA,IAAAA,KAAS,SAAY,GAAA,qBAAA,GAAwB,cAC5EoK,CAAAA,EAAAA,EAAAA,EACA3B,eACAxI,UAAc,IAAA,EAAA,CAAA;AAElB;AACApB,IAAAA,MAAAA,CAAOmM,eAAe,EAAA;AACtBnM,IAAAA,MAAAA,CAAOuK,eAAe,CAACU,EAAAA,CAAAA;IACvBM,EAAGzB,CAAAA,0BAA0B,CAAC,CAAG4B,EAAAA,cAAAA,CAAAA;IACjCH,EAAGxB,CAAAA,iCAAiC,CAAC,CAAG6B,EAAAA,cAAAA,CAAAA;IACxC,IAAI,CAACjB,WAAYa,CAAAA,aAAa,EAAI,EAAA;AAChCD,QAAAA,EAAAA,CAAGa,OAAO,EAAA;AACZ;AACF;;;;"}