@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.
- package/dist/animation/animationmask.js +224 -0
- package/dist/animation/animationmask.js.map +1 -0
- package/dist/animation/animationset.js +268 -67
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/animationtrack.js.map +1 -1
- package/dist/animation/eulerrotationtrack.js +3 -0
- package/dist/animation/eulerrotationtrack.js.map +1 -1
- package/dist/animation/fixed_geometry_cache_track.js +7 -0
- package/dist/animation/fixed_geometry_cache_track.js.map +1 -1
- package/dist/animation/ik_modifier.js.map +1 -1
- package/dist/animation/joint_dynamics/collision.js +6 -4
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +390 -43
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +62 -3
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +4 -3
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/animation/joint_dynamics_modifier.js +2 -0
- package/dist/animation/joint_dynamics_modifier.js.map +1 -1
- package/dist/animation/morphtarget.js +3 -72
- package/dist/animation/morphtarget.js.map +1 -1
- package/dist/animation/morphtrack.js +3 -0
- package/dist/animation/morphtrack.js.map +1 -1
- package/dist/animation/pca_geometry_cache_track.js +3 -0
- package/dist/animation/pca_geometry_cache_track.js.map +1 -1
- package/dist/animation/proptrack.js +3 -0
- package/dist/animation/proptrack.js.map +1 -1
- package/dist/animation/rotationtrack.js +3 -0
- package/dist/animation/rotationtrack.js.map +1 -1
- package/dist/animation/scaletrack.js +3 -0
- package/dist/animation/scaletrack.js.map +1 -1
- package/dist/animation/skeleton.js +254 -79
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skeleton_modifier.js.map +1 -1
- package/dist/animation/spring/spring_particle.js +4 -4
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/animation/spring_modifier.js.map +1 -1
- package/dist/animation/translationtrack.js +3 -0
- package/dist/animation/translationtrack.js.map +1 -1
- package/dist/app/engine.js +129 -17
- package/dist/app/engine.js.map +1 -1
- package/dist/app/scriptregistry.js +251 -80
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +133 -102
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/gltf/gltf_loader.js +18 -14
- package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
- package/dist/asset/loaders/loader.js +1 -6
- package/dist/asset/loaders/loader.js.map +1 -1
- package/dist/asset/loaders/zabc/zabc_loader.js.map +1 -1
- package/dist/asset/model.js +1052 -183
- package/dist/asset/model.js.map +1 -1
- package/dist/avatar/wardrobe.js +474 -0
- package/dist/avatar/wardrobe.js.map +1 -0
- package/dist/index.d.ts +1810 -233
- package/dist/index.js +13 -3
- package/dist/index.js.map +1 -1
- package/dist/material/material.js +1 -1
- package/dist/material/material.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +6 -3
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +72 -15
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/msdf_text.js +180 -0
- package/dist/material/msdf_text.js.map +1 -0
- package/dist/material/msdf_text_sprite.js +64 -0
- package/dist/material/msdf_text_sprite.js.map +1 -0
- package/dist/material/pbrblueprint.js +21 -6
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/shader/helper.js +277 -277
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/sprite_sdf.js +106 -0
- package/dist/material/sprite_sdf.js.map +1 -0
- package/dist/posteffect/ssr.js +1 -0
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/render/abuffer_oit.js +1 -0
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/cull_visitor.js +28 -0
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/drawable.js.map +1 -1
- package/dist/render/drawable_mixin.js +1 -0
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/envlight.js +54 -1
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +1 -0
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +1 -0
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/globalbindgroup_allocator.js +1 -0
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/render_queue.js +1 -0
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/sky.js +9 -0
- package/dist/render/sky.js.map +1 -1
- package/dist/scene/basesprite.js +1 -5
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +18 -8
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +16 -2
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/mesh.js +164 -102
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/meshdrawable.js +96 -0
- package/dist/scene/meshdrawable.js.map +1 -0
- package/dist/scene/msdftext.js +341 -0
- package/dist/scene/msdftext.js.map +1 -0
- package/dist/scene/msdftextsprite.js +349 -0
- package/dist/scene/msdftextsprite.js.map +1 -0
- package/dist/scene/particlesys.js +1 -0
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/scene.js +2 -0
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +437 -230
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/sdftextsprite.js +322 -0
- package/dist/scene/sdftextsprite.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +1 -0
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grassmaterial.js +1 -0
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +1 -0
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/textsprite.js +120 -0
- package/dist/scene/textsprite.js.map +1 -0
- package/dist/scene/water.js +1 -0
- package/dist/scene/water.js.map +1 -1
- package/dist/shadow/shader.js +1 -0
- package/dist/shadow/shader.js.map +1 -1
- package/dist/text/font/font_asset.js +884 -0
- package/dist/text/font/font_asset.js.map +1 -0
- package/dist/text/font/sfnt_reader.js +43 -0
- package/dist/text/font/sfnt_reader.js.map +1 -0
- package/dist/text/msdf/generator.js +417 -0
- package/dist/text/msdf/generator.js.map +1 -0
- package/dist/text/msdf/shape.js +146 -0
- package/dist/text/msdf/shape.js.map +1 -0
- package/dist/text/runtime/msdf_glyph_atlas.js +146 -0
- package/dist/text/runtime/msdf_glyph_atlas.js.map +1 -0
- package/dist/text/runtime/msdf_text_atlas_manager.js +50 -0
- package/dist/text/runtime/msdf_text_atlas_manager.js.map +1 -0
- package/dist/text/runtime/text_layout.js +96 -0
- package/dist/text/runtime/text_layout.js.map +1 -0
- package/dist/utility/blueprint/material/inputs.js +188 -1
- package/dist/utility/blueprint/material/inputs.js.map +1 -1
- package/dist/utility/blueprint/material/ir.js +16 -1
- package/dist/utility/blueprint/material/ir.js.map +1 -1
- package/dist/utility/blueprint/material/pbr.js +32 -0
- package/dist/utility/blueprint/material/pbr.js.map +1 -1
- package/dist/utility/bounding_volume.js.map +1 -1
- package/dist/utility/pmrem.js +34 -8
- package/dist/utility/pmrem.js.map +1 -1
- package/dist/utility/serialization/manager.js +340 -283
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +702 -7
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +2 -0
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +2 -0
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +2 -0
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +1 -0
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +66 -4
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +189 -8
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +2 -0
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +1 -0
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +2 -0
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +2 -0
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +516 -0
- package/dist/utility/serialization/scene/text.js.map +1 -0
- package/dist/utility/serialization/scene/water.js +2 -0
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/textures/sheenlut.js +138 -0
- package/dist/utility/textures/sheenlut.js.map +1 -0
- package/dist/values.js +48 -48
- package/dist/values.js.map +1 -1
- 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;;;;"}
|
package/dist/utility/pmrem.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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":"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"}
|