@zephyr3d/scene 0.8.2 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/animation/animationset.js +473 -60
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/cloth/gpu_cloth_system.js +2516 -0
- package/dist/animation/cloth/gpu_cloth_system.js.map +1 -0
- package/dist/animation/fixed_geometry_cache_track.js +138 -0
- package/dist/animation/fixed_geometry_cache_track.js.map +1 -0
- package/dist/animation/geometry_cache_utils.js +120 -0
- package/dist/animation/geometry_cache_utils.js.map +1 -0
- package/dist/animation/ik_modifier.js +9 -1
- package/dist/animation/ik_modifier.js.map +1 -1
- package/dist/animation/joint_dynamics/collision.js +469 -0
- package/dist/animation/joint_dynamics/collision.js.map +1 -0
- package/dist/animation/joint_dynamics/constraints.js +329 -0
- package/dist/animation/joint_dynamics/constraints.js.map +1 -0
- package/dist/animation/joint_dynamics/controller.js +699 -0
- package/dist/animation/joint_dynamics/controller.js.map +1 -0
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +393 -0
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -0
- package/dist/animation/joint_dynamics/solver.js +794 -0
- package/dist/animation/joint_dynamics/solver.js.map +1 -0
- package/dist/animation/joint_dynamics/types.js +19 -0
- package/dist/animation/joint_dynamics/types.js.map +1 -0
- package/dist/animation/joint_dynamics/vrm_spring_bone.js +46 -0
- package/dist/animation/joint_dynamics/vrm_spring_bone.js.map +1 -0
- package/dist/animation/joint_dynamics_modifier.js +51 -0
- package/dist/animation/joint_dynamics_modifier.js.map +1 -0
- package/dist/animation/pca_geometry_cache_track.js +222 -0
- package/dist/animation/pca_geometry_cache_track.js.map +1 -0
- package/dist/animation/skeleton.js +2011 -139
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skeleton_modifier.js +3 -5
- package/dist/animation/skeleton_modifier.js.map +1 -1
- package/dist/animation/spring/multi_chain_spring_system.js +2 -0
- package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
- package/dist/animation/spring/spring_chain.js +3 -2
- package/dist/animation/spring/spring_chain.js.map +1 -1
- package/dist/animation/spring/spring_collider.js +35 -5
- package/dist/animation/spring/spring_collider.js.map +1 -1
- package/dist/animation/spring/spring_particle.js +1 -0
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/animation/spring/spring_system.js +325 -28
- package/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/animation/spring2/collision.js +469 -0
- package/dist/animation/spring2/collision.js.map +1 -0
- package/dist/animation/spring2/constraints.js +329 -0
- package/dist/animation/spring2/constraints.js.map +1 -0
- package/dist/animation/spring2/controller.js +434 -0
- package/dist/animation/spring2/controller.js.map +1 -0
- package/dist/animation/spring2/math.js +16 -0
- package/dist/animation/spring2/math.js.map +1 -0
- package/dist/animation/spring2/solver.js +624 -0
- package/dist/animation/spring2/solver.js.map +1 -0
- package/dist/animation/spring2/spring_system.js +118 -0
- package/dist/animation/spring2/spring_system.js.map +1 -0
- package/dist/animation/spring2/types.js +19 -0
- package/dist/animation/spring2/types.js.map +1 -0
- package/dist/animation/spring_modifier.js +17 -1
- package/dist/animation/spring_modifier.js.map +1 -1
- package/dist/app/engine.js +42 -15
- package/dist/app/engine.js.map +1 -1
- package/dist/app/runtimescript.js +132 -1
- package/dist/app/runtimescript.js.map +1 -1
- package/dist/app/screen.js +3 -3
- package/dist/app/screen.js.map +1 -1
- package/dist/app/scriptingsystem.js +69 -37
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +14 -3
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +2 -1
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/zabc/zabc_loader.js +570 -0
- package/dist/asset/loaders/zabc/zabc_loader.js.map +1 -0
- package/dist/asset/model.js +192 -0
- package/dist/asset/model.js.map +1 -1
- package/dist/camera/base.js +26 -7
- package/dist/camera/base.js.map +1 -1
- package/dist/camera/camera.js +146 -24
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/fps.js +2 -2
- package/dist/camera/fps.js.map +1 -1
- package/dist/camera/orbit.js +2 -2
- package/dist/camera/orbit.js.map +1 -1
- package/dist/index.d.ts +11728 -8535
- package/dist/index.js +29 -8
- package/dist/index.js.map +1 -1
- package/dist/material/lambert.js +1 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +9 -3
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +54 -7
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +17 -7
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +7 -2
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +108 -16
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +209 -14
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +24 -12
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +11 -8
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +72 -5
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/pbrblueprint.js +148 -1
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/pbrmr.js +115 -2
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/shader/helper.js +10 -4
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/water.js +2 -2
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/coloradjust.js +145 -0
- package/dist/posteffect/coloradjust.js.map +1 -0
- package/dist/posteffect/taa.js +68 -32
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/render/cluster_light.js +17 -12
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/deferredlightpass.js +510 -0
- package/dist/render/deferredlightpass.js.map +1 -0
- package/dist/render/deferredshadowlightpass.js +428 -0
- package/dist/render/deferredshadowlightpass.js.map +1 -0
- package/dist/render/drawable.js.map +1 -1
- package/dist/render/drawable_mixin.js +21 -12
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/envlight.js +20 -22
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/gbufferpass.js +50 -0
- package/dist/render/gbufferpass.js.map +1 -0
- package/dist/render/lightpass.js +1 -2
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/primitive.js +1 -1
- package/dist/render/primitive.js.map +1 -1
- package/dist/render/render_queue.js +3 -2
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +5 -358
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/executor.js +15 -12
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +144 -88
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/history_resource_manager.js +178 -0
- package/dist/render/rendergraph/history_resource_manager.js.map +1 -0
- package/dist/render/rendergraph/rendergraph.js +12 -1
- package/dist/render/rendergraph/rendergraph.js.map +1 -1
- package/dist/render/rendergraph/types.js +2 -2
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/sky.js +26 -9
- package/dist/render/sky.js.map +1 -1
- package/dist/scene/basesprite.js +4 -3
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +4 -4
- package/dist/scene/environment.js +7 -4
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/light.js +184 -18
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +30 -0
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/particlesys.js +3 -2
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/raycast_visitor.js +29 -3
- package/dist/scene/raycast_visitor.js.map +1 -1
- package/dist/scene/scene.js +86 -19
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +87 -31
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/script_attachment.js +59 -0
- package/dist/scene/script_attachment.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +3 -2
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +4 -3
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/water.js +3 -2
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/shadow.js +2 -2
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shadow/shadowmapper.js +74 -4
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shapes/box.js +163 -0
- package/dist/shapes/box.js.map +1 -1
- package/dist/shapes/capsule.js +216 -0
- package/dist/shapes/capsule.js.map +1 -0
- package/dist/shapes/cylinder.js +91 -0
- package/dist/shapes/cylinder.js.map +1 -1
- package/dist/shapes/plane.js +32 -0
- package/dist/shapes/plane.js.map +1 -1
- package/dist/shapes/tetrahedron.js +211 -0
- package/dist/shapes/tetrahedron.js.map +1 -1
- package/dist/shapes/torus.js +173 -0
- package/dist/shapes/torus.js.map +1 -1
- package/dist/utility/blueprint/common/math.js +111 -1
- package/dist/utility/blueprint/common/math.js.map +1 -1
- package/dist/utility/blueprint/material/inputs.js +235 -1
- package/dist/utility/blueprint/material/inputs.js.map +1 -1
- package/dist/utility/blueprint/material/ir.js +154 -10
- package/dist/utility/blueprint/material/ir.js.map +1 -1
- package/dist/utility/blueprint/material/texture.js +273 -19
- package/dist/utility/blueprint/material/texture.js.map +1 -1
- package/dist/utility/serialization/json.js +12 -2
- package/dist/utility/serialization/json.js.map +1 -1
- package/dist/utility/serialization/manager.js +30 -11
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +250 -7
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +4 -2
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +154 -2
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/cloth_script.js +834 -0
- package/dist/utility/serialization/scene/cloth_script.js.map +1 -0
- package/dist/utility/serialization/scene/common.js +7 -0
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +120 -4
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +453 -1
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +4 -2
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +298 -10
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +4 -2
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +100 -3
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +130 -3
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/script.js +66 -0
- package/dist/utility/serialization/scene/script.js.map +1 -0
- package/dist/utility/serialization/scene/spring_script.js +596 -0
- package/dist/utility/serialization/scene/spring_script.js.map +1 -0
- package/dist/utility/serialization/scene/sprite.js +5 -3
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +4 -2
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +4 -2
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/values.js +5 -1
- package/dist/values.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"envlight.js","sources":["../../src/render/envlight.ts"],"sourcesContent":["import type { Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Disposable, DRef, Vector3 } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport type {\r\n BindGroup,\r\n FrameBuffer,\r\n GPUDataBuffer,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n ProgramBuilder,\r\n TextureCube\r\n} from '@zephyr3d/device';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\n\r\n/**\r\n * Environment light type\r\n * @public\r\n */\r\nexport type EnvLightType = 'ibl' | 'hemisphere' | 'constant' | 'none';\r\n\r\n/**\r\n * Base class for any kind of environment light\r\n * @public\r\n */\r\nexport abstract class EnvironmentLighting extends Disposable {\r\n /**\r\n * The environment light type\r\n */\r\n abstract getType(): EnvLightType;\r\n /**\r\n * Initialize shader bindings\r\n * @param pb - The program builder\r\n */\r\n abstract initShaderBindings(pb: ProgramBuilder): void;\r\n /**\r\n * Updates the uniform values\r\n * @param bg - The bind group to be updated\r\n */\r\n abstract updateBindGroup(bg: BindGroup): void;\r\n /**\r\n * Get radiance for a fragment\r\n *\r\n * @param scope - The shader scope\r\n * @param refl - Reflection vector\r\n * @param roughness - Surface roughness\r\n *\r\n * @returns The radiance for the fragment\r\n */\r\n abstract getRadiance(\r\n scope: PBInsideFunctionScope,\r\n refl: PBShaderExp,\r\n roughness: PBShaderExp\r\n ): Nullable<PBShaderExp>;\r\n /**\r\n * Get irradiance for a fragment\r\n *\r\n * @param scope - The shader scope\r\n * @param normal - surface normal\r\n *\r\n * @returns The radiance for the fragment\r\n */\r\n abstract getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp): PBShaderExp;\r\n /**\r\n * Returns whether this environment lighting supports reflective light\r\n */\r\n abstract hasRadiance(): boolean;\r\n /**\r\n * Returns whether this environment lighting supports diffuse light\r\n */\r\n abstract hasIrradiance(): boolean;\r\n}\r\n\r\n/**\r\n * IBL with SH based environment lighting\r\n * @public\r\n */\r\nexport class EnvShIBL extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_RADIANCE_MAP = 'zIBLRadianceMap';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD = 'zIBLRadianceMapMaxLOD';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_IRRADIANCE_SH = 'zIBLIrradianceSH';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_IRRADIANCE_WINDOW = 'zIBLIrradianceWindow';\r\n /** @internal */\r\n private readonly _radianceMap: DRef<TextureCube>;\r\n /** @internal */\r\n private readonly _irradianceSH: DRef<GPUDataBuffer>;\r\n /** @internal */\r\n private readonly _irradianceSHFB: DRef<FrameBuffer>;\r\n /** @internal */\r\n private _irraidanceWindow: Vector3;\r\n /**\r\n * Creates an instance of EnvIBL\r\n * @param radianceMap - The radiance map\r\n * @param irradianceSH - The irradiance SH\r\n */\r\n constructor(radianceMap?: TextureCube, irradianceSH?: GPUDataBuffer, irradianceSHFB?: FrameBuffer) {\r\n super();\r\n this._radianceMap = new DRef(radianceMap || null);\r\n this._irradianceSH = new DRef(irradianceSH || null);\r\n this._irradianceSHFB = new DRef(irradianceSHFB || null);\r\n this._irraidanceWindow = new Vector3();\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'ibl' as const;\r\n }\r\n /** The radiance map */\r\n get radianceMap() {\r\n return this._radianceMap.get();\r\n }\r\n set radianceMap(tex) {\r\n this._radianceMap.set(tex);\r\n }\r\n /** The irradiance sh coeffecients */\r\n get irradianceSH() {\r\n return this._irradianceSH.get();\r\n }\r\n set irradianceSH(value) {\r\n this._irradianceSH.set(value);\r\n }\r\n /** The irradiance sh coeffecients */\r\n get irradianceSHFB() {\r\n return this._irradianceSHFB.get();\r\n }\r\n set irradianceSHFB(value) {\r\n this._irradianceSHFB.set(value);\r\n }\r\n /** The irradiance sh window */\r\n get irradianceWindow() {\r\n return this._irraidanceWindow;\r\n }\r\n set irradianceWindow(val) {\r\n this._irraidanceWindow = val;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder) {\r\n if (pb.shaderKind === 'fragment') {\r\n if (this.radianceMap) {\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP] = pb.texCube().uniform(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD] = pb.float().uniform(0);\r\n }\r\n if (getDevice().type === 'webgl' || !getDevice().getDeviceCaps().framebufferCaps.supportFloatBlending) {\r\n if (this.irradianceSHFB) {\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH] = pb.tex2D().uniform(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW] = pb.vec3().uniform(0);\r\n }\r\n } else {\r\n if (this.irradianceSH) {\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH] = pb.vec4[9]().uniformBuffer(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW] = pb.vec3().uniform(0);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup) {\r\n if (this.radianceMap) {\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD, this.radianceMap.mipLevelCount - 1);\r\n bg.setTexture(EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP, this.radianceMap);\r\n }\r\n if (getDevice().type === 'webgl' || !getDevice().getDeviceCaps().framebufferCaps.supportFloatBlending) {\r\n if (this.irradianceSHFB) {\r\n bg.setTexture(\r\n EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH,\r\n this.irradianceSHFB.getColorAttachments()[0],\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW, this.irradianceWindow);\r\n }\r\n } else {\r\n if (this.irradianceSH) {\r\n bg.setBuffer(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH, this.irradianceSH);\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW, this.irradianceWindow);\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n return getDevice().getDeviceCaps().shaderCaps.supportShaderTextureLod\r\n ? (pb.textureSampleLevel(\r\n scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP],\r\n refl,\r\n pb.mul(roughness, scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD])\r\n ).rgb as PBShaderExp)\r\n : (pb.textureSample(scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP], refl).rgb as PBShaderExp);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp) {\r\n const pb = scope.$builder;\r\n pb.func('Z_sh_Y0', [pb.vec3('v')], function () {\r\n this.$return(0.2820947917);\r\n });\r\n pb.func('Z_sh_Y1', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.y, -0.4886025119));\r\n });\r\n pb.func('Z_sh_Y2', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.z, 0.4886025119));\r\n });\r\n pb.func('Z_sh_Y3', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, -0.4886025119));\r\n });\r\n pb.func('Z_sh_Y4', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, this.v.y, 1.0925484306));\r\n });\r\n pb.func('Z_sh_Y5', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.y, this.v.z, -1.0925484306));\r\n });\r\n pb.func('Z_sh_Y6', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(pb.sub(pb.mul(this.v.z, this.v.z, 3), 1), 0.3153915652));\r\n });\r\n pb.func('Z_sh_Y7', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, this.v.z, -1.0925484306));\r\n });\r\n pb.func('Z_sh_Y8', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(pb.sub(pb.mul(this.v.x, this.v.x), pb.mul(this.v.y, this.v.y)), 0.5462742153));\r\n });\r\n pb.func('Z_sh_eval', [pb.vec3('v')], function () {\r\n this.$l.window = this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW];\r\n if (getDevice().type === 'webgl' || !getDevice().getDeviceCaps().framebufferCaps.supportFloatBlending) {\r\n this.$l.c = pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y0(this.v),\r\n this.window.x\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y1(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y2(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y3(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y4(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y5(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y6(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y7(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y8(this.v),\r\n this.window.z\r\n )\r\n );\r\n } else {\r\n this.$l.c = pb.mul(\r\n this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][0].xyz,\r\n this.Z_sh_Y0(this.v),\r\n this.window.x\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][1].xyz, this.Z_sh_Y1(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][2].xyz, this.Z_sh_Y2(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][3].xyz, this.Z_sh_Y3(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][4].xyz, this.Z_sh_Y4(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][5].xyz, this.Z_sh_Y5(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][6].xyz, this.Z_sh_Y6(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][7].xyz, this.Z_sh_Y7(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][8].xyz, this.Z_sh_Y8(this.v), this.window.z)\r\n );\r\n }\r\n this.$return(this.c);\r\n });\r\n return pb.getGlobalScope().Z_sh_eval(normal) as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return !!this._radianceMap;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return !!this._irradianceSH;\r\n }\r\n /**\r\n * Disposes the object and releases all GPU resources\r\n * @override\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._radianceMap.dispose();\r\n this._irradianceSH.dispose();\r\n this._irradianceSHFB.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * Constant ambient light\r\n * @public\r\n */\r\nexport class EnvConstantAmbient extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_CONSTANT_AMBIENT = 'zConstantAmbient';\r\n /** @internal */\r\n private readonly _ambientColor: Vector4;\r\n /**\r\n * Creates an instance of EnvConstantAmbient\r\n * @param ambientColor - The ambient color\r\n */\r\n constructor(ambientColor?: Vector4) {\r\n super();\r\n this._ambientColor = ambientColor ? new Vector4(ambientColor) : new Vector4(0, 0, 0, 1);\r\n }\r\n /** The ambient color */\r\n get ambientColor(): Immutable<Vector4> {\r\n return this._ambientColor;\r\n }\r\n set ambientColor(ambientColor: Immutable<Vector4>) {\r\n if (ambientColor) {\r\n this._ambientColor.set(ambientColor);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'constant' as const;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder) {\r\n if (pb.shaderKind === 'fragment') {\r\n pb.getGlobalScope()[EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT] = pb.vec4().uniform(0);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup) {\r\n bg.setValue(EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT, this._ambientColor);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(_scope: PBInsideFunctionScope, _refl: PBShaderExp, _roughness: PBShaderExp) {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, _normal: PBShaderExp) {\r\n return scope[EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT].rgb as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Hemispheric ambient light\r\n * @public\r\n */\r\nexport class EnvHemisphericAmbient extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_AMBIENT_UP = 'zHemisphericAmbientUp';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_AMBIENT_DOWN = 'zHemisphericAmbientDown';\r\n /** @internal */\r\n private readonly _ambientUp: Vector4;\r\n /** @internal */\r\n private readonly _ambientDown: Vector4;\r\n /**\r\n * Creates an instance of EnvConstantAmbient\r\n * @param ambientUp - The upside ambient color\r\n * @param ambientDown - The downside ambient color\r\n */\r\n constructor(ambientUp: Vector4, ambientDown: Vector4) {\r\n super();\r\n this._ambientUp = new Vector4(ambientUp);\r\n this._ambientDown = new Vector4(ambientDown);\r\n }\r\n /** The upside ambient color */\r\n get ambientUp(): Immutable<Vector4> {\r\n return this._ambientUp;\r\n }\r\n set ambientUp(color: Immutable<Vector4>) {\r\n if (color) {\r\n this._ambientUp.set(color);\r\n }\r\n }\r\n /** The downside ambient color */\r\n get ambientDown(): Immutable<Vector4> {\r\n return this._ambientDown;\r\n }\r\n set ambientDown(color: Immutable<Vector4>) {\r\n if (color) {\r\n this._ambientDown.set(color);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'hemisphere' as const;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder) {\r\n if (pb.shaderKind === 'fragment') {\r\n pb.getGlobalScope()[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP] = pb.vec4().uniform(0);\r\n pb.getGlobalScope()[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN] = pb.vec4().uniform(0);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup) {\r\n bg.setValue(EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP, this._ambientUp);\r\n bg.setValue(EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN, this._ambientDown);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, _roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const factor = pb.add(pb.mul(refl.y, 0.5), 0.5);\r\n return pb.mix(\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN],\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP],\r\n factor\r\n ).rgb as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const factor = pb.add(pb.mul(normal.y, 0.5), 0.5);\r\n return pb.mix(\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN],\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP],\r\n factor\r\n ).rgb as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return true;\r\n }\r\n}\r\n"],"names":["EnvironmentLighting","Disposable","EnvShIBL","UNIFORM_NAME_IBL_RADIANCE_MAP","UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD","UNIFORM_NAME_IBL_IRRADIANCE_SH","UNIFORM_NAME_IBL_IRRADIANCE_WINDOW","radianceMap","irradianceSH","irradianceSHFB","_radianceMap","DRef","_irradianceSH","_irradianceSHFB","_irraidanceWindow","Vector3","getType","get","tex","set","value","irradianceWindow","val","initShaderBindings","pb","shaderKind","getGlobalScope","texCube","uniform","float","getDevice","type","getDeviceCaps","framebufferCaps","supportFloatBlending","tex2D","vec3","vec4","uniformBuffer","updateBindGroup","bg","setValue","mipLevelCount","setTexture","getColorAttachments","fetchSampler","setBuffer","getRadiance","scope","refl","roughness","$builder","shaderCaps","supportShaderTextureLod","textureSampleLevel","mul","rgb","textureSample","getIrradiance","normal","func","$return","v","y","z","x","sub","$l","window","c","vec2","Z_sh_Y0","add","Z_sh_Y1","Z_sh_Y2","Z_sh_Y3","Z_sh_Y4","Z_sh_Y5","Z_sh_Y6","Z_sh_Y7","Z_sh_Y8","xyz","Z_sh_eval","hasRadiance","hasIrradiance","onDispose","dispose","EnvConstantAmbient","UNIFORM_NAME_CONSTANT_AMBIENT","ambientColor","_ambientColor","Vector4","_scope","_refl","_roughness","_normal","EnvHemisphericAmbient","UNIFORM_NAME_AMBIENT_UP","UNIFORM_NAME_AMBIENT_DOWN","ambientUp","ambientDown","_ambientUp","_ambientDown","color","factor","mix"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"envlight.js","sources":["../../src/render/envlight.ts"],"sourcesContent":["import type { Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Disposable, DRef, Vector3 } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport type {\r\n BindGroup,\r\n FrameBuffer,\r\n GPUDataBuffer,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n ProgramBuilder,\r\n TextureCube\r\n} from '@zephyr3d/device';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\n\r\n/**\r\n * Environment light type\r\n * @public\r\n */\r\nexport type EnvLightType = 'ibl' | 'hemisphere' | 'constant' | 'none';\r\n\r\n/**\r\n * Base class for any kind of environment light\r\n * @public\r\n */\r\nexport abstract class EnvironmentLighting extends Disposable {\r\n /**\r\n * The environment light type\r\n */\r\n abstract getType(): EnvLightType;\r\n /**\r\n * Initialize shader bindings\r\n * @param pb - The program builder\r\n */\r\n abstract initShaderBindings(pb: ProgramBuilder): void;\r\n /**\r\n * Updates the uniform values\r\n * @param bg - The bind group to be updated\r\n */\r\n abstract updateBindGroup(bg: BindGroup): void;\r\n /**\r\n * Get radiance for a fragment\r\n *\r\n * @param scope - The shader scope\r\n * @param refl - Reflection vector\r\n * @param roughness - Surface roughness\r\n *\r\n * @returns The radiance for the fragment\r\n */\r\n abstract getRadiance(\r\n scope: PBInsideFunctionScope,\r\n refl: PBShaderExp,\r\n roughness: PBShaderExp\r\n ): Nullable<PBShaderExp>;\r\n /**\r\n * Get irradiance for a fragment\r\n *\r\n * @param scope - The shader scope\r\n * @param normal - surface normal\r\n *\r\n * @returns The radiance for the fragment\r\n */\r\n abstract getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp): PBShaderExp;\r\n /**\r\n * Returns whether this environment lighting supports reflective light\r\n */\r\n abstract hasRadiance(): boolean;\r\n /**\r\n * Returns whether this environment lighting supports diffuse light\r\n */\r\n abstract hasIrradiance(): boolean;\r\n}\r\n\r\n/**\r\n * IBL with SH based environment lighting\r\n * @public\r\n */\r\nexport class EnvShIBL extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_RADIANCE_MAP = 'zIBLRadianceMap';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD = 'zIBLRadianceMapMaxLOD';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_IRRADIANCE_SH = 'zIBLIrradianceSH';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_IBL_IRRADIANCE_WINDOW = 'zIBLIrradianceWindow';\r\n /** @internal */\r\n private readonly _radianceMap: DRef<TextureCube>;\r\n /** @internal */\r\n private readonly _irradianceSH: DRef<GPUDataBuffer>;\r\n /** @internal */\r\n private readonly _irradianceSHFB: DRef<FrameBuffer>;\r\n /** @internal */\r\n private _irraidanceWindow: Vector3;\r\n /**\r\n * Creates an instance of EnvIBL\r\n * @param radianceMap - The radiance map\r\n * @param irradianceSH - The irradiance SH\r\n */\r\n constructor(radianceMap?: TextureCube, irradianceSH?: GPUDataBuffer, irradianceSHFB?: FrameBuffer) {\r\n super();\r\n this._radianceMap = new DRef(radianceMap || null);\r\n this._irradianceSH = new DRef(irradianceSH || null);\r\n this._irradianceSHFB = new DRef(irradianceSHFB || null);\r\n this._irraidanceWindow = new Vector3();\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'ibl' as const;\r\n }\r\n /** The radiance map */\r\n get radianceMap() {\r\n return this._radianceMap.get();\r\n }\r\n set radianceMap(tex) {\r\n this._radianceMap.set(tex);\r\n }\r\n /** The irradiance sh coeffecients */\r\n get irradianceSH() {\r\n return this._irradianceSH.get();\r\n }\r\n set irradianceSH(value) {\r\n this._irradianceSH.set(value);\r\n }\r\n /** The irradiance sh coeffecients */\r\n get irradianceSHFB() {\r\n return this._irradianceSHFB.get();\r\n }\r\n set irradianceSHFB(value) {\r\n this._irradianceSHFB.set(value);\r\n }\r\n /** The irradiance sh window */\r\n get irradianceWindow() {\r\n return this._irraidanceWindow;\r\n }\r\n set irradianceWindow(val) {\r\n this._irraidanceWindow = val;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder) {\r\n if (pb.shaderKind === 'fragment') {\r\n if (this.radianceMap) {\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP] = pb.texCube().uniform(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD] = pb.float().uniform(0);\r\n }\r\n if (this.irradianceSHFB) {\r\n const tex = pb.tex2D();\r\n const formatInfo = getDevice()\r\n .getDeviceCaps()\r\n .textureCaps.getTextureFormatInfo(this.irradianceSHFB.getColorAttachments()[0].format);\r\n if (formatInfo && !formatInfo.filterable) {\r\n tex.sampleType('unfilterable-float');\r\n }\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH] = tex.uniform(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW] = pb.vec3().uniform(0);\r\n } else if (this.irradianceSH) {\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH] = pb.vec4[9]().uniformBuffer(0);\r\n pb.getGlobalScope()[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW] = pb.vec3().uniform(0);\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup) {\r\n if (this.radianceMap) {\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD, this.radianceMap.mipLevelCount - 1);\r\n bg.setTexture(EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP, this.radianceMap);\r\n }\r\n if (this.irradianceSHFB) {\r\n bg.setTexture(\r\n EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH,\r\n this.irradianceSHFB.getColorAttachments()[0],\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW, this.irradianceWindow);\r\n } else if (this.irradianceSH) {\r\n bg.setBuffer(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH, this.irradianceSH);\r\n bg.setValue(EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW, this.irradianceWindow);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n return getDevice().getDeviceCaps().shaderCaps.supportShaderTextureLod\r\n ? (pb.textureSampleLevel(\r\n scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP],\r\n refl,\r\n pb.mul(roughness, scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD])\r\n ).rgb as PBShaderExp)\r\n : (pb.textureSample(scope[EnvShIBL.UNIFORM_NAME_IBL_RADIANCE_MAP], refl).rgb as PBShaderExp);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func('Z_sh_Y0', [pb.vec3('v')], function () {\r\n this.$return(0.2820947917);\r\n });\r\n pb.func('Z_sh_Y1', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.y, -0.4886025119));\r\n });\r\n pb.func('Z_sh_Y2', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.z, 0.4886025119));\r\n });\r\n pb.func('Z_sh_Y3', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, -0.4886025119));\r\n });\r\n pb.func('Z_sh_Y4', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, this.v.y, 1.0925484306));\r\n });\r\n pb.func('Z_sh_Y5', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.y, this.v.z, -1.0925484306));\r\n });\r\n pb.func('Z_sh_Y6', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(pb.sub(pb.mul(this.v.z, this.v.z, 3), 1), 0.3153915652));\r\n });\r\n pb.func('Z_sh_Y7', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, this.v.z, -1.0925484306));\r\n });\r\n pb.func('Z_sh_Y8', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(pb.sub(pb.mul(this.v.x, this.v.x), pb.mul(this.v.y, this.v.y)), 0.5462742153));\r\n });\r\n pb.func('Z_sh_eval', [pb.vec3('v')], function () {\r\n this.$l.window = this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_WINDOW];\r\n if (that.irradianceSHFB) {\r\n this.$l.c = pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y0(this.v),\r\n this.window.x\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y1(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 0.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y2(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y3(this.v),\r\n this.window.y\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y4(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 1.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y5(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(0.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y6(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(1.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y7(this.v),\r\n this.window.z\r\n )\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(\r\n pb.textureSampleLevel(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH], pb.vec2(2.5 / 3, 2.5 / 3), 0)\r\n .rgb,\r\n this.Z_sh_Y8(this.v),\r\n this.window.z\r\n )\r\n );\r\n } else {\r\n this.$l.c = pb.mul(\r\n this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][0].xyz,\r\n this.Z_sh_Y0(this.v),\r\n this.window.x\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][1].xyz, this.Z_sh_Y1(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][2].xyz, this.Z_sh_Y2(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][3].xyz, this.Z_sh_Y3(this.v), this.window.y)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][4].xyz, this.Z_sh_Y4(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][5].xyz, this.Z_sh_Y5(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][6].xyz, this.Z_sh_Y6(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][7].xyz, this.Z_sh_Y7(this.v), this.window.z)\r\n );\r\n this.c = pb.add(\r\n this.c,\r\n pb.mul(this[EnvShIBL.UNIFORM_NAME_IBL_IRRADIANCE_SH][8].xyz, this.Z_sh_Y8(this.v), this.window.z)\r\n );\r\n }\r\n this.$return(this.c);\r\n });\r\n return pb.getGlobalScope().Z_sh_eval(normal) as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return !!this._radianceMap.get();\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return !!this._irradianceSH.get() || !!this._irradianceSHFB.get();\r\n }\r\n /**\r\n * Disposes the object and releases all GPU resources\r\n * @override\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._radianceMap.dispose();\r\n this._irradianceSH.dispose();\r\n this._irradianceSHFB.dispose();\r\n }\r\n}\r\n\r\n/**\r\n * Constant ambient light\r\n * @public\r\n */\r\nexport class EnvConstantAmbient extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_CONSTANT_AMBIENT = 'zConstantAmbient';\r\n /** @internal */\r\n private readonly _ambientColor: Vector4;\r\n /**\r\n * Creates an instance of EnvConstantAmbient\r\n * @param ambientColor - The ambient color\r\n */\r\n constructor(ambientColor?: Vector4) {\r\n super();\r\n this._ambientColor = ambientColor ? new Vector4(ambientColor) : new Vector4(0, 0, 0, 1);\r\n }\r\n /** The ambient color */\r\n get ambientColor(): Immutable<Vector4> {\r\n return this._ambientColor;\r\n }\r\n set ambientColor(ambientColor: Immutable<Vector4>) {\r\n if (ambientColor) {\r\n this._ambientColor.set(ambientColor);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'constant' as const;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder) {\r\n if (pb.shaderKind === 'fragment') {\r\n pb.getGlobalScope()[EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT] = pb.vec4().uniform(0);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup) {\r\n bg.setValue(EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT, this._ambientColor);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(_scope: PBInsideFunctionScope, _refl: PBShaderExp, _roughness: PBShaderExp) {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, _normal: PBShaderExp) {\r\n return scope[EnvConstantAmbient.UNIFORM_NAME_CONSTANT_AMBIENT].rgb as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Hemispheric ambient light\r\n * @public\r\n */\r\nexport class EnvHemisphericAmbient extends EnvironmentLighting {\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_AMBIENT_UP = 'zHemisphericAmbientUp';\r\n /** @internal */\r\n public static readonly UNIFORM_NAME_AMBIENT_DOWN = 'zHemisphericAmbientDown';\r\n /** @internal */\r\n private readonly _ambientUp: Vector4;\r\n /** @internal */\r\n private readonly _ambientDown: Vector4;\r\n /**\r\n * Creates an instance of EnvConstantAmbient\r\n * @param ambientUp - The upside ambient color\r\n * @param ambientDown - The downside ambient color\r\n */\r\n constructor(ambientUp: Vector4, ambientDown: Vector4) {\r\n super();\r\n this._ambientUp = new Vector4(ambientUp);\r\n this._ambientDown = new Vector4(ambientDown);\r\n }\r\n /** The upside ambient color */\r\n get ambientUp(): Immutable<Vector4> {\r\n return this._ambientUp;\r\n }\r\n set ambientUp(color: Immutable<Vector4>) {\r\n if (color) {\r\n this._ambientUp.set(color);\r\n }\r\n }\r\n /** The downside ambient color */\r\n get ambientDown(): Immutable<Vector4> {\r\n return this._ambientDown;\r\n }\r\n set ambientDown(color: Immutable<Vector4>) {\r\n if (color) {\r\n this._ambientDown.set(color);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getType}\r\n * @override\r\n */\r\n getType() {\r\n return 'hemisphere' as const;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.initShaderBindings}\r\n * @override\r\n */\r\n initShaderBindings(pb: ProgramBuilder) {\r\n if (pb.shaderKind === 'fragment') {\r\n pb.getGlobalScope()[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP] = pb.vec4().uniform(0);\r\n pb.getGlobalScope()[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN] = pb.vec4().uniform(0);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.updateBindGroup}\r\n * @override\r\n */\r\n updateBindGroup(bg: BindGroup) {\r\n bg.setValue(EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP, this._ambientUp);\r\n bg.setValue(EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN, this._ambientDown);\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getRadiance}\r\n * @override\r\n */\r\n getRadiance(scope: PBInsideFunctionScope, refl: PBShaderExp, _roughness: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const factor = pb.add(pb.mul(refl.y, 0.5), 0.5);\r\n return pb.mix(\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN],\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP],\r\n factor\r\n ).rgb as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.getIrradiance}\r\n * @override\r\n */\r\n getIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const factor = pb.add(pb.mul(normal.y, 0.5), 0.5);\r\n return pb.mix(\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_DOWN],\r\n scope[EnvHemisphericAmbient.UNIFORM_NAME_AMBIENT_UP],\r\n factor\r\n ).rgb as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasRadiance}\r\n * @override\r\n */\r\n hasRadiance() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc EnvironmentLighting.hasIrradiance}\r\n * @override\r\n */\r\n hasIrradiance() {\r\n return true;\r\n }\r\n}\r\n"],"names":["EnvironmentLighting","Disposable","EnvShIBL","UNIFORM_NAME_IBL_RADIANCE_MAP","UNIFORM_NAME_IBL_RADIANCE_MAP_MAX_LOD","UNIFORM_NAME_IBL_IRRADIANCE_SH","UNIFORM_NAME_IBL_IRRADIANCE_WINDOW","radianceMap","irradianceSH","irradianceSHFB","_radianceMap","DRef","_irradianceSH","_irradianceSHFB","_irraidanceWindow","Vector3","getType","get","tex","set","value","irradianceWindow","val","initShaderBindings","pb","shaderKind","getGlobalScope","texCube","uniform","float","tex2D","formatInfo","getDevice","getDeviceCaps","textureCaps","getTextureFormatInfo","getColorAttachments","format","filterable","sampleType","vec3","vec4","uniformBuffer","updateBindGroup","bg","setValue","mipLevelCount","setTexture","fetchSampler","setBuffer","getRadiance","scope","refl","roughness","$builder","shaderCaps","supportShaderTextureLod","textureSampleLevel","mul","rgb","textureSample","getIrradiance","normal","that","func","$return","v","y","z","x","sub","$l","window","c","vec2","Z_sh_Y0","add","Z_sh_Y1","Z_sh_Y2","Z_sh_Y3","Z_sh_Y4","Z_sh_Y5","Z_sh_Y6","Z_sh_Y7","Z_sh_Y8","xyz","Z_sh_eval","hasRadiance","hasIrradiance","onDispose","dispose","EnvConstantAmbient","UNIFORM_NAME_CONSTANT_AMBIENT","ambientColor","_ambientColor","Vector4","_scope","_refl","_roughness","_normal","EnvHemisphericAmbient","UNIFORM_NAME_AMBIENT_UP","UNIFORM_NAME_AMBIENT_DOWN","ambientUp","ambientDown","_ambientUp","_ambientDown","color","factor","mix"],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { LightPass } from './lightpass.js';
|
|
2
|
+
import { RENDER_PASS_TYPE_GBUFFER, QUEUE_OPAQUE, MaterialVaryingFlags } from '../values.js';
|
|
3
|
+
import { Vector4 } from '@zephyr3d/base';
|
|
4
|
+
import { ShaderHelper } from '../material/shader/helper.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* GBuffer pass scaffold.
|
|
8
|
+
*
|
|
9
|
+
* Stage-1 keeps current material lighting behavior and only renders opaque lists,
|
|
10
|
+
* while preserving SSR roughness/normal MRT outputs for deferred/hybrid paths.
|
|
11
|
+
* @internal
|
|
12
|
+
*/ class GBufferPass extends LightPass {
|
|
13
|
+
constructor(){
|
|
14
|
+
super();
|
|
15
|
+
this._type = RENDER_PASS_TYPE_GBUFFER;
|
|
16
|
+
this._clearColor = Vector4.zero();
|
|
17
|
+
}
|
|
18
|
+
/** @internal */ _getGlobalBindGroupHash(ctx) {
|
|
19
|
+
return `${ctx.materialFlags}:${ctx.motionVectors ? 1 : 0}`;
|
|
20
|
+
}
|
|
21
|
+
/** @internal */ renderItems(ctx, camera, renderQueue) {
|
|
22
|
+
ctx.renderPassHash = null;
|
|
23
|
+
ctx.env = ctx.scene.env;
|
|
24
|
+
ctx.drawEnvLight = false;
|
|
25
|
+
ctx.flip = this.isAutoFlip(ctx);
|
|
26
|
+
ctx.queue = QUEUE_OPAQUE;
|
|
27
|
+
ctx.oit = null;
|
|
28
|
+
const items = renderQueue.itemList;
|
|
29
|
+
if (!items?.opaque) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
ctx.currentShadowLight = null;
|
|
33
|
+
ctx.lightBlending = false;
|
|
34
|
+
ctx.materialFlags &= ~MaterialVaryingFlags.APPLY_FOG;
|
|
35
|
+
ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, camera);
|
|
36
|
+
const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);
|
|
37
|
+
ctx.device.setBindGroup(0, bindGroup);
|
|
38
|
+
ShaderHelper.setCameraUniforms(bindGroup, ctx, camera, !!ctx.device.getFramebuffer());
|
|
39
|
+
const reverseWinding = camera.worldMatrixDet < 0;
|
|
40
|
+
for (const lit of items.opaque.lit){
|
|
41
|
+
this.drawItemList(lit, ctx, reverseWinding);
|
|
42
|
+
}
|
|
43
|
+
for (const unlit of items.opaque.unlit){
|
|
44
|
+
this.drawItemList(unlit, ctx, reverseWinding);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export { GBufferPass };
|
|
50
|
+
//# sourceMappingURL=gbufferpass.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gbufferpass.js","sources":["../../src/render/gbufferpass.ts"],"sourcesContent":["import { LightPass } from './lightpass';\r\nimport { MaterialVaryingFlags, QUEUE_OPAQUE, RENDER_PASS_TYPE_GBUFFER } from '../values';\r\nimport type { DrawContext } from './drawable';\r\nimport type { Camera } from '../camera';\r\nimport type { RenderQueue } from './render_queue';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\n\r\n/**\r\n * GBuffer pass scaffold.\r\n *\r\n * Stage-1 keeps current material lighting behavior and only renders opaque lists,\r\n * while preserving SSR roughness/normal MRT outputs for deferred/hybrid paths.\r\n * @internal\r\n */\r\nexport class GBufferPass extends LightPass {\r\n constructor() {\r\n super();\r\n this._type = RENDER_PASS_TYPE_GBUFFER;\r\n this._clearColor = Vector4.zero();\r\n }\r\n /** @internal */\r\n protected _getGlobalBindGroupHash(ctx: DrawContext) {\r\n return `${ctx.materialFlags}:${ctx.motionVectors ? 1 : 0}`;\r\n }\r\n /** @internal */\r\n protected renderItems(ctx: DrawContext, camera: Camera, renderQueue: RenderQueue) {\r\n ctx.renderPassHash = null;\r\n ctx.env = ctx.scene.env;\r\n ctx.drawEnvLight = false;\r\n ctx.flip = this.isAutoFlip(ctx);\r\n ctx.queue = QUEUE_OPAQUE;\r\n ctx.oit = null;\r\n const items = renderQueue.itemList;\r\n if (!items?.opaque) {\r\n return;\r\n }\r\n ctx.currentShadowLight = null;\r\n ctx.lightBlending = false;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.APPLY_FOG;\r\n ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, camera);\r\n const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);\r\n ctx.device.setBindGroup(0, bindGroup);\r\n ShaderHelper.setCameraUniforms(bindGroup, ctx, camera, !!ctx.device.getFramebuffer());\r\n const reverseWinding = camera.worldMatrixDet < 0;\r\n for (const lit of items.opaque.lit) {\r\n this.drawItemList(lit, ctx, reverseWinding);\r\n }\r\n for (const unlit of items.opaque.unlit) {\r\n this.drawItemList(unlit, ctx, reverseWinding);\r\n }\r\n }\r\n}\r\n"],"names":["GBufferPass","LightPass","_type","RENDER_PASS_TYPE_GBUFFER","_clearColor","Vector4","zero","_getGlobalBindGroupHash","ctx","materialFlags","motionVectors","camera","renderQueue","renderPassHash","env","scene","drawEnvLight","flip","isAutoFlip","queue","QUEUE_OPAQUE","oit","items","itemList","opaque","currentShadowLight","lightBlending","MaterialVaryingFlags","APPLY_FOG","getGlobalBindGroupHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","device","setBindGroup","ShaderHelper","setCameraUniforms","getFramebuffer","reverseWinding","worldMatrixDet","lit","drawItemList","unlit"],"mappings":";;;;;AAQA;;;;;;IAOO,MAAMA,WAAoBC,SAAAA,SAAAA,CAAAA;IAC/B,WAAc,EAAA;QACZ,KAAK,EAAA;QACL,IAAI,CAACC,KAAK,GAAGC,wBAAAA;AACb,QAAA,IAAI,CAACC,WAAW,GAAGC,OAAAA,CAAQC,IAAI,EAAA;AACjC;AACA,qBACUC,uBAAwBC,CAAAA,GAAgB,EAAE;QAClD,OAAO,CAAA,EAAGA,GAAIC,CAAAA,aAAa,CAAC,CAAC,EAAED,GAAIE,CAAAA,aAAa,GAAG,CAAA,GAAI,CAAG,CAAA,CAAA;AAC5D;qBAEA,WAAsBF,CAAAA,GAAgB,EAAEG,MAAc,EAAEC,WAAwB,EAAE;AAChFJ,QAAAA,GAAAA,CAAIK,cAAc,GAAG,IAAA;AACrBL,QAAAA,GAAAA,CAAIM,GAAG,GAAGN,GAAIO,CAAAA,KAAK,CAACD,GAAG;AACvBN,QAAAA,GAAAA,CAAIQ,YAAY,GAAG,KAAA;AACnBR,QAAAA,GAAAA,CAAIS,IAAI,GAAG,IAAI,CAACC,UAAU,CAACV,GAAAA,CAAAA;AAC3BA,QAAAA,GAAAA,CAAIW,KAAK,GAAGC,YAAAA;AACZZ,QAAAA,GAAAA,CAAIa,GAAG,GAAG,IAAA;QACV,MAAMC,KAAAA,GAAQV,YAAYW,QAAQ;QAClC,IAAI,CAACD,OAAOE,MAAQ,EAAA;AAClB,YAAA;AACF;AACAhB,QAAAA,GAAAA,CAAIiB,kBAAkB,GAAG,IAAA;AACzBjB,QAAAA,GAAAA,CAAIkB,aAAa,GAAG,KAAA;AACpBlB,QAAAA,GAAAA,CAAIC,aAAa,IAAI,CAACkB,oBAAAA,CAAqBC,SAAS;AACpDpB,QAAAA,GAAAA,CAAIK,cAAc,GAAG,IAAI,CAACgB,sBAAsB,CAACrB,GAAKG,EAAAA,MAAAA,CAAAA;AACtD,QAAA,MAAMmB,SAAYtB,GAAAA,GAAAA,CAAIuB,wBAAwB,CAACC,kBAAkB,CAACxB,GAAAA,CAAAA;AAClEA,QAAAA,GAAAA,CAAIyB,MAAM,CAACC,YAAY,CAAC,CAAGJ,EAAAA,SAAAA,CAAAA;QAC3BK,YAAaC,CAAAA,iBAAiB,CAACN,SAAAA,EAAWtB,GAAKG,EAAAA,MAAAA,EAAQ,CAAC,CAACH,GAAAA,CAAIyB,MAAM,CAACI,cAAc,EAAA,CAAA;QAClF,MAAMC,cAAAA,GAAiB3B,MAAO4B,CAAAA,cAAc,GAAG,CAAA;AAC/C,QAAA,KAAK,MAAMC,GAAOlB,IAAAA,KAAAA,CAAME,MAAM,CAACgB,GAAG,CAAE;AAClC,YAAA,IAAI,CAACC,YAAY,CAACD,GAAAA,EAAKhC,GAAK8B,EAAAA,cAAAA,CAAAA;AAC9B;AACA,QAAA,KAAK,MAAMI,KAASpB,IAAAA,KAAAA,CAAME,MAAM,CAACkB,KAAK,CAAE;AACtC,YAAA,IAAI,CAACD,YAAY,CAACC,KAAAA,EAAOlC,GAAK8B,EAAAA,cAAAA,CAAAA;AAChC;AACF;AACF;;;;"}
|
package/dist/render/lightpass.js
CHANGED
|
@@ -25,7 +25,7 @@ import { PostEffectLayer } from '../posteffect/posteffect.js';
|
|
|
25
25
|
this._transmission = val;
|
|
26
26
|
}
|
|
27
27
|
/** @internal */ _getGlobalBindGroupHash(ctx, camera) {
|
|
28
|
-
return `${this._shadowMapHash}:${camera.oit?.calculateHash() ?? ''}:${ctx.env.getHash(ctx)}:${ctx.materialFlags}:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${ctx.HiZTexture?.uid ?? 0}`;
|
|
28
|
+
return `${this._shadowMapHash}:${ctx.lightBlending ? 1 : 0}:${camera.oit?.calculateHash() ?? ''}:${ctx.env.getHash(ctx)}:${ctx.materialFlags}:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${ctx.HiZTexture?.uid ?? 0}`;
|
|
29
29
|
}
|
|
30
30
|
/** @internal */ renderLightPass(ctx, camera, itemList, lights, flags) {
|
|
31
31
|
const baseLightPass = !ctx.lightBlending;
|
|
@@ -140,7 +140,6 @@ import { PostEffectLayer } from '../posteffect/posteffect.js';
|
|
|
140
140
|
ctx.device.pushDeviceStates();
|
|
141
141
|
ctx.device.setFramebuffer(tmpFramebuffer);
|
|
142
142
|
}
|
|
143
|
-
ctx.env.sky.skyWorldMatrix = ctx.scene.rootNode.worldMatrix;
|
|
144
143
|
ctx.env.sky.renderSky(ctx);
|
|
145
144
|
if (ctx.env.sky.fogPresents) {
|
|
146
145
|
ctx.env.sky.renderFog(camera);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lightpass.js","sources":["../../src/render/lightpass.ts"],"sourcesContent":["import { RenderPass } from './renderpass';\r\nimport { MaterialVaryingFlags, QUEUE_OPAQUE, QUEUE_TRANSPARENT, RENDER_PASS_TYPE_LIGHT } from '../values';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport type { RenderItemListBundle, RenderQueue } from './render_queue';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { DrawContext } from './drawable';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { PostEffectLayer } from '../posteffect/posteffect';\r\nimport type { Camera } from '../camera';\r\n\r\n/**\r\n * Forward render pass\r\n * @internal\r\n */\r\nexport class LightPass extends RenderPass {\r\n /** @internal */\r\n protected _shadowMapHash: Nullable<string>;\r\n /** @internal */\r\n protected _transmission: boolean;\r\n /**\r\n * Creates an instance of ForwardRenderPass\r\n */\r\n constructor() {\r\n super(RENDER_PASS_TYPE_LIGHT);\r\n this._shadowMapHash = null;\r\n this._transmission = false;\r\n this._clearColor = Vector4.zero();\r\n }\r\n /** @internal */\r\n get transmission() {\r\n return this._transmission;\r\n }\r\n set transmission(val) {\r\n this._transmission = val;\r\n }\r\n /** @internal */\r\n protected _getGlobalBindGroupHash(ctx: DrawContext, camera: Camera) {\r\n return `${this._shadowMapHash}:${camera.oit?.calculateHash() ?? ''}:${ctx.env!.getHash(ctx)}:${\r\n ctx.materialFlags\r\n }:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${ctx.HiZTexture?.uid ?? 0}`;\r\n }\r\n /** @internal */\r\n protected renderLightPass(\r\n ctx: DrawContext,\r\n camera: Camera,\r\n itemList: RenderItemListBundle,\r\n lights: PunctualLight[],\r\n flags: any\r\n ) {\r\n const baseLightPass = !ctx.lightBlending;\r\n ctx.drawEnvLight =\r\n baseLightPass &&\r\n ctx.env!.light.type !== 'none' &&\r\n (ctx.env!.light.envLight.hasRadiance() || ctx.env!.light.envLight.hasIrradiance());\r\n ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, camera);\r\n const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);\r\n if (!flags.cameraSet[ctx.renderPassHash]) {\r\n ShaderHelper.setCameraUniforms(bindGroup, ctx, camera, !!ctx.device.getFramebuffer());\r\n flags.cameraSet[ctx.renderPassHash] = 1;\r\n }\r\n if (ctx.currentShadowLight) {\r\n ShaderHelper.setLightUniformsShadow(bindGroup, ctx, lights[0]);\r\n } else {\r\n if (!flags.lightSet[ctx.renderPassHash]) {\r\n ShaderHelper.setLightUniforms(\r\n bindGroup,\r\n ctx,\r\n ctx.clusteredLight!.clusterParam,\r\n ctx.clusteredLight!.countParam,\r\n ctx.clusteredLight!.lightBuffer!,\r\n ctx.clusteredLight!.lightIndexTexture!\r\n );\r\n flags.lightSet[ctx.renderPassHash] = 1;\r\n }\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.APPLY_FOG && !flags.fogSet[ctx.renderPassHash]) {\r\n ShaderHelper.setFogUniforms(\r\n bindGroup,\r\n ctx.env!.sky.skyType === 'scatter' ? 1 : 0,\r\n ctx.env!.sky.mappedFogType,\r\n baseLightPass ? 0 : 1,\r\n ctx.env!.sky.atmosphereParams,\r\n ctx.env!.sky.heightFogParams,\r\n ctx.env!.sky.getAerialPerspectiveLUT(ctx),\r\n ctx.env!.sky.getSkyDistantLightLUT(ctx)\r\n );\r\n flags.fogSet[ctx.renderPassHash] = 1;\r\n }\r\n ctx.device.setBindGroup(0, bindGroup);\r\n const reverseWinding = camera.worldMatrixDet < 0;\r\n for (const lit of itemList.lit) {\r\n this.drawItemList(lit, ctx, reverseWinding);\r\n }\r\n if (!ctx.lightBlending) {\r\n for (const unlit of itemList.unlit) {\r\n this.drawItemList(unlit, ctx, reverseWinding);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n protected renderItems(ctx: DrawContext, camera: Camera, renderQueue: RenderQueue) {\r\n ctx.renderPassHash = null;\r\n ctx.env = ctx.scene.env;\r\n ctx.drawEnvLight = false;\r\n ctx.flip = this.isAutoFlip(ctx);\r\n const ssr = !!(ctx.materialFlags & MaterialVaryingFlags.SSR_STORE_ROUGHNESS);\r\n const tmpFramebuffer = ssr\r\n ? ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n ctx.device.getDrawingBufferWidth(),\r\n ctx.device.getDrawingBufferHeight(),\r\n ctx.device.getFramebuffer()!.getColorAttachments()[0],\r\n ctx.device.getFramebuffer()!.getDepthAttachment()\r\n )\r\n : null;\r\n const oit =\r\n renderQueue.drawTransparent && camera.oit && camera.oit.supportDevice(ctx.device.type)\r\n ? camera.oit\r\n : null;\r\n if (!oit && renderQueue.drawTransparent) {\r\n renderQueue.sortTransparentItems(camera.getWorldPosition());\r\n }\r\n const flags: any = {\r\n lightSet: {},\r\n cameraSet: {},\r\n fogSet: {}\r\n };\r\n const items = renderQueue.itemList;\r\n const lists = this._transmission\r\n ? [items?.transmission, items?.transmission_trans, items?.transparent]\r\n : [items?.opaque, items?.transparent];\r\n const transparentPass = lists.length - 1;\r\n for (let i = 0; i < lists.length; i++) {\r\n if (lists[i]) {\r\n ctx.queue = i === 0 ? QUEUE_OPAQUE : QUEUE_TRANSPARENT;\r\n ctx.oit = i === 0 || !items ? null : oit;\r\n if ((ctx.queue === QUEUE_TRANSPARENT || this._transmission) && ctx.scene.env.sky.fogPresents) {\r\n ctx.materialFlags |= MaterialVaryingFlags.APPLY_FOG;\r\n }\r\n const numOitPasses = ctx.oit ? ctx.oit.begin(ctx) : 1;\r\n for (let p = 0; p < numOitPasses; p++) {\r\n if (ctx.oit) {\r\n if (!ctx.oit.beginPass(ctx, p)) {\r\n continue;\r\n }\r\n }\r\n let lightIndex = 0;\r\n if (ctx.shadowMapInfo) {\r\n for (const k of ctx.shadowMapInfo.keys()) {\r\n ctx.currentShadowLight = k;\r\n ctx.lightBlending = lightIndex > 0;\r\n this._shadowMapHash = ctx.shadowMapInfo.get(k)!.shaderHash;\r\n this.renderLightPass(ctx, camera, lists[i]!, [k], flags);\r\n lightIndex++;\r\n }\r\n }\r\n if (lightIndex === 0 || renderQueue.unshadowedLights.length > 0) {\r\n ctx.currentShadowLight = null;\r\n ctx.lightBlending = lightIndex > 0;\r\n this._shadowMapHash = '';\r\n if (ctx.lightBlending && tmpFramebuffer) {\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSR_STORE_ROUGHNESS;\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(tmpFramebuffer);\r\n }\r\n this.renderLightPass(ctx, camera, lists[i]!, renderQueue.unshadowedLights, flags);\r\n if (ctx.lightBlending && tmpFramebuffer) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SSR_STORE_ROUGHNESS;\r\n ctx.device.popDeviceStates();\r\n }\r\n }\r\n if (ctx.oit) {\r\n ctx.oit.endPass(ctx, p);\r\n }\r\n }\r\n if (ctx.oit) {\r\n ctx.oit.end(ctx);\r\n }\r\n ctx.materialFlags &= ~MaterialVaryingFlags.APPLY_FOG;\r\n }\r\n if (i === 0 && !ctx.sceneColorTexture) {\r\n if (tmpFramebuffer) {\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(tmpFramebuffer);\r\n }\r\n ctx.env.sky.skyWorldMatrix = ctx.scene.rootNode.worldMatrix;\r\n ctx.env.sky.renderSky(ctx);\r\n if (ctx.env.sky.fogPresents) {\r\n ctx.env.sky.renderFog(camera);\r\n }\r\n if (tmpFramebuffer) {\r\n ctx.device.popDeviceStates();\r\n }\r\n }\r\n if (!renderQueue.needSceneColor() || ctx.sceneColorTexture) {\r\n if (i === 0 || i === transparentPass) {\r\n ctx.compositor?.drawPostEffects(\r\n ctx,\r\n i === 0 ? PostEffectLayer.opaque : PostEffectLayer.transparent,\r\n ctx.linearDepthTexture!\r\n );\r\n }\r\n }\r\n }\r\n if (tmpFramebuffer) {\r\n ctx.device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n }\r\n}\r\n"],"names":["LightPass","RenderPass","RENDER_PASS_TYPE_LIGHT","_shadowMapHash","_transmission","_clearColor","Vector4","zero","transmission","val","_getGlobalBindGroupHash","ctx","camera","oit","calculateHash","env","getHash","materialFlags","linearDepthTexture","uid","sceneColorTexture","HiZTexture","renderLightPass","itemList","lights","flags","baseLightPass","lightBlending","drawEnvLight","light","type","envLight","hasRadiance","hasIrradiance","renderPassHash","getGlobalBindGroupHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","cameraSet","ShaderHelper","setCameraUniforms","device","getFramebuffer","currentShadowLight","setLightUniformsShadow","lightSet","setLightUniforms","clusteredLight","clusterParam","countParam","lightBuffer","lightIndexTexture","MaterialVaryingFlags","APPLY_FOG","fogSet","setFogUniforms","sky","skyType","mappedFogType","atmosphereParams","heightFogParams","getAerialPerspectiveLUT","getSkyDistantLightLUT","setBindGroup","reverseWinding","worldMatrixDet","lit","drawItemList","unlit","renderQueue","scene","flip","isAutoFlip","ssr","SSR_STORE_ROUGHNESS","tmpFramebuffer","pool","fetchTemporalFramebuffer","getDrawingBufferWidth","getDrawingBufferHeight","getColorAttachments","getDepthAttachment","drawTransparent","supportDevice","sortTransparentItems","getWorldPosition","items","lists","transmission_trans","transparent","opaque","transparentPass","length","i","queue","QUEUE_OPAQUE","QUEUE_TRANSPARENT","fogPresents","numOitPasses","begin","p","beginPass","lightIndex","shadowMapInfo","k","keys","get","shaderHash","unshadowedLights","pushDeviceStates","setFramebuffer","popDeviceStates","endPass","end","skyWorldMatrix","rootNode","worldMatrix","renderSky","renderFog","needSceneColor","compositor","drawPostEffects","PostEffectLayer","releaseFrameBuffer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lightpass.js","sources":["../../src/render/lightpass.ts"],"sourcesContent":["import { RenderPass } from './renderpass';\r\nimport { MaterialVaryingFlags, QUEUE_OPAQUE, QUEUE_TRANSPARENT, RENDER_PASS_TYPE_LIGHT } from '../values';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport type { RenderItemListBundle, RenderQueue } from './render_queue';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { DrawContext } from './drawable';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { PostEffectLayer } from '../posteffect/posteffect';\r\nimport type { Camera } from '../camera';\r\n\r\n/**\r\n * Forward render pass\r\n * @internal\r\n */\r\nexport class LightPass extends RenderPass {\r\n /** @internal */\r\n protected _shadowMapHash: Nullable<string>;\r\n /** @internal */\r\n protected _transmission: boolean;\r\n /**\r\n * Creates an instance of ForwardRenderPass\r\n */\r\n constructor() {\r\n super(RENDER_PASS_TYPE_LIGHT);\r\n this._shadowMapHash = null;\r\n this._transmission = false;\r\n this._clearColor = Vector4.zero();\r\n }\r\n /** @internal */\r\n get transmission() {\r\n return this._transmission;\r\n }\r\n set transmission(val) {\r\n this._transmission = val;\r\n }\r\n /** @internal */\r\n protected _getGlobalBindGroupHash(ctx: DrawContext, camera: Camera) {\r\n return `${this._shadowMapHash}:${ctx.lightBlending ? 1 : 0}:${camera.oit?.calculateHash() ?? ''}:${ctx.env!.getHash(\r\n ctx\r\n )}:${ctx.materialFlags}:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${\r\n ctx.HiZTexture?.uid ?? 0\r\n }`;\r\n }\r\n /** @internal */\r\n protected renderLightPass(\r\n ctx: DrawContext,\r\n camera: Camera,\r\n itemList: RenderItemListBundle,\r\n lights: PunctualLight[],\r\n flags: any\r\n ) {\r\n const baseLightPass = !ctx.lightBlending;\r\n ctx.drawEnvLight =\r\n baseLightPass &&\r\n ctx.env!.light.type !== 'none' &&\r\n (ctx.env!.light.envLight.hasRadiance() || ctx.env!.light.envLight.hasIrradiance());\r\n ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, camera);\r\n const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);\r\n if (!flags.cameraSet[ctx.renderPassHash]) {\r\n ShaderHelper.setCameraUniforms(bindGroup, ctx, camera, !!ctx.device.getFramebuffer());\r\n flags.cameraSet[ctx.renderPassHash] = 1;\r\n }\r\n if (ctx.currentShadowLight) {\r\n ShaderHelper.setLightUniformsShadow(bindGroup, ctx, lights[0]);\r\n } else {\r\n if (!flags.lightSet[ctx.renderPassHash]) {\r\n ShaderHelper.setLightUniforms(\r\n bindGroup,\r\n ctx,\r\n ctx.clusteredLight!.clusterParam,\r\n ctx.clusteredLight!.countParam,\r\n ctx.clusteredLight!.lightBuffer!,\r\n ctx.clusteredLight!.lightIndexTexture!\r\n );\r\n flags.lightSet[ctx.renderPassHash] = 1;\r\n }\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.APPLY_FOG && !flags.fogSet[ctx.renderPassHash]) {\r\n ShaderHelper.setFogUniforms(\r\n bindGroup,\r\n ctx.env!.sky.skyType === 'scatter' ? 1 : 0,\r\n ctx.env!.sky.mappedFogType,\r\n baseLightPass ? 0 : 1,\r\n ctx.env!.sky.atmosphereParams,\r\n ctx.env!.sky.heightFogParams,\r\n ctx.env!.sky.getAerialPerspectiveLUT(ctx),\r\n ctx.env!.sky.getSkyDistantLightLUT(ctx)\r\n );\r\n flags.fogSet[ctx.renderPassHash] = 1;\r\n }\r\n ctx.device.setBindGroup(0, bindGroup);\r\n const reverseWinding = camera.worldMatrixDet < 0;\r\n for (const lit of itemList.lit) {\r\n this.drawItemList(lit, ctx, reverseWinding);\r\n }\r\n if (!ctx.lightBlending) {\r\n for (const unlit of itemList.unlit) {\r\n this.drawItemList(unlit, ctx, reverseWinding);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n protected renderItems(ctx: DrawContext, camera: Camera, renderQueue: RenderQueue) {\r\n ctx.renderPassHash = null;\r\n ctx.env = ctx.scene.env;\r\n ctx.drawEnvLight = false;\r\n ctx.flip = this.isAutoFlip(ctx);\r\n const ssr = !!(ctx.materialFlags & MaterialVaryingFlags.SSR_STORE_ROUGHNESS);\r\n const tmpFramebuffer = ssr\r\n ? ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n ctx.device.getDrawingBufferWidth(),\r\n ctx.device.getDrawingBufferHeight(),\r\n ctx.device.getFramebuffer()!.getColorAttachments()[0],\r\n ctx.device.getFramebuffer()!.getDepthAttachment()\r\n )\r\n : null;\r\n const oit =\r\n renderQueue.drawTransparent && camera.oit && camera.oit.supportDevice(ctx.device.type)\r\n ? camera.oit\r\n : null;\r\n if (!oit && renderQueue.drawTransparent) {\r\n renderQueue.sortTransparentItems(camera.getWorldPosition());\r\n }\r\n const flags: any = {\r\n lightSet: {},\r\n cameraSet: {},\r\n fogSet: {}\r\n };\r\n const items = renderQueue.itemList;\r\n const lists = this._transmission\r\n ? [items?.transmission, items?.transmission_trans, items?.transparent]\r\n : [items?.opaque, items?.transparent];\r\n const transparentPass = lists.length - 1;\r\n for (let i = 0; i < lists.length; i++) {\r\n if (lists[i]) {\r\n ctx.queue = i === 0 ? QUEUE_OPAQUE : QUEUE_TRANSPARENT;\r\n ctx.oit = i === 0 || !items ? null : oit;\r\n if ((ctx.queue === QUEUE_TRANSPARENT || this._transmission) && ctx.scene.env.sky.fogPresents) {\r\n ctx.materialFlags |= MaterialVaryingFlags.APPLY_FOG;\r\n }\r\n const numOitPasses = ctx.oit ? ctx.oit.begin(ctx) : 1;\r\n for (let p = 0; p < numOitPasses; p++) {\r\n if (ctx.oit) {\r\n if (!ctx.oit.beginPass(ctx, p)) {\r\n continue;\r\n }\r\n }\r\n let lightIndex = 0;\r\n if (ctx.shadowMapInfo) {\r\n for (const k of ctx.shadowMapInfo.keys()) {\r\n ctx.currentShadowLight = k;\r\n ctx.lightBlending = lightIndex > 0;\r\n this._shadowMapHash = ctx.shadowMapInfo.get(k)!.shaderHash;\r\n this.renderLightPass(ctx, camera, lists[i]!, [k], flags);\r\n lightIndex++;\r\n }\r\n }\r\n if (lightIndex === 0 || renderQueue.unshadowedLights.length > 0) {\r\n ctx.currentShadowLight = null;\r\n ctx.lightBlending = lightIndex > 0;\r\n this._shadowMapHash = '';\r\n if (ctx.lightBlending && tmpFramebuffer) {\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSR_STORE_ROUGHNESS;\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(tmpFramebuffer);\r\n }\r\n this.renderLightPass(ctx, camera, lists[i]!, renderQueue.unshadowedLights, flags);\r\n if (ctx.lightBlending && tmpFramebuffer) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SSR_STORE_ROUGHNESS;\r\n ctx.device.popDeviceStates();\r\n }\r\n }\r\n if (ctx.oit) {\r\n ctx.oit.endPass(ctx, p);\r\n }\r\n }\r\n if (ctx.oit) {\r\n ctx.oit.end(ctx);\r\n }\r\n ctx.materialFlags &= ~MaterialVaryingFlags.APPLY_FOG;\r\n }\r\n if (i === 0 && !ctx.sceneColorTexture) {\r\n if (tmpFramebuffer) {\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(tmpFramebuffer);\r\n }\r\n ctx.env.sky.renderSky(ctx);\r\n if (ctx.env.sky.fogPresents) {\r\n ctx.env.sky.renderFog(camera);\r\n }\r\n if (tmpFramebuffer) {\r\n ctx.device.popDeviceStates();\r\n }\r\n }\r\n if (!renderQueue.needSceneColor() || ctx.sceneColorTexture) {\r\n if (i === 0 || i === transparentPass) {\r\n ctx.compositor?.drawPostEffects(\r\n ctx,\r\n i === 0 ? PostEffectLayer.opaque : PostEffectLayer.transparent,\r\n ctx.linearDepthTexture!\r\n );\r\n }\r\n }\r\n }\r\n if (tmpFramebuffer) {\r\n ctx.device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n }\r\n}\r\n"],"names":["LightPass","RenderPass","RENDER_PASS_TYPE_LIGHT","_shadowMapHash","_transmission","_clearColor","Vector4","zero","transmission","val","_getGlobalBindGroupHash","ctx","camera","lightBlending","oit","calculateHash","env","getHash","materialFlags","linearDepthTexture","uid","sceneColorTexture","HiZTexture","renderLightPass","itemList","lights","flags","baseLightPass","drawEnvLight","light","type","envLight","hasRadiance","hasIrradiance","renderPassHash","getGlobalBindGroupHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","cameraSet","ShaderHelper","setCameraUniforms","device","getFramebuffer","currentShadowLight","setLightUniformsShadow","lightSet","setLightUniforms","clusteredLight","clusterParam","countParam","lightBuffer","lightIndexTexture","MaterialVaryingFlags","APPLY_FOG","fogSet","setFogUniforms","sky","skyType","mappedFogType","atmosphereParams","heightFogParams","getAerialPerspectiveLUT","getSkyDistantLightLUT","setBindGroup","reverseWinding","worldMatrixDet","lit","drawItemList","unlit","renderQueue","scene","flip","isAutoFlip","ssr","SSR_STORE_ROUGHNESS","tmpFramebuffer","pool","fetchTemporalFramebuffer","getDrawingBufferWidth","getDrawingBufferHeight","getColorAttachments","getDepthAttachment","drawTransparent","supportDevice","sortTransparentItems","getWorldPosition","items","lists","transmission_trans","transparent","opaque","transparentPass","length","i","queue","QUEUE_OPAQUE","QUEUE_TRANSPARENT","fogPresents","numOitPasses","begin","p","beginPass","lightIndex","shadowMapInfo","k","keys","get","shaderHash","unshadowedLights","pushDeviceStates","setFramebuffer","popDeviceStates","endPass","end","renderSky","renderFog","needSceneColor","compositor","drawPostEffects","PostEffectLayer","releaseFrameBuffer"],"mappings":"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"}
|
package/dist/render/primitive.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"primitive.js","sources":["../../src/render/primitive.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport {\r\n Disposable,\r\n makeObservable,\r\n releaseObject,\r\n retainObject,\r\n type Clonable,\r\n type Ray,\r\n type TypedArray\r\n} from '@zephyr3d/base';\r\nimport {\r\n type VertexStepMode,\r\n type VertexLayout,\r\n type VertexLayoutOptions,\r\n type PrimitiveType,\r\n type StructuredBuffer,\r\n type IndexBuffer,\r\n type VertexSemantic,\r\n type VertexAttribFormat,\r\n PBPrimitiveType,\r\n matchVertexBuffer\r\n} from '@zephyr3d/device';\r\nimport type { BoundingVolume } from '../utility/bounding_volume';\r\nimport { RenderBundleWrapper } from './renderbundle_wrapper';\r\nimport { getDevice } from '../app/api';\r\n\r\n/**\r\n * Holds vertex/index data and draw parameters for a mesh geometry.\r\n *\r\n * Responsibilities:\r\n * - Owns one or more vertex buffers and an optional index buffer.\r\n * - Defines primitive topology, draw range (start/count), and vertex layout.\r\n * - Provides utilities to create/set/remove buffers and query vertex/face counts.\r\n * - Tracks changes via a change tag and notifies render-bundle caching.\r\n * - Optionally stores a bounding volume and supports ray intersection tests.\r\n *\r\n * Ownership and lifecycle:\r\n * - When adding buffers (`setVertexBuffer`, `setIndexBuffer`), the primitive retains them.\r\n * - When removing/overwriting buffers, the primitive releases the previous buffers.\r\n * - Disposing the primitive also disposes the internal `VertexLayout` and releases retained buffers.\r\n *\r\n * @public\r\n */\r\nexport class Primitive\r\n extends makeObservable(Disposable)<{\r\n bv_changed: [];\r\n }>()\r\n implements Clonable<Primitive>\r\n{\r\n /** @internal Current vertex layout object (created lazily from options). */\r\n protected _vertexLayout: Nullable<VertexLayout>;\r\n /** @internal Mutable options used to build the vertex layout. */\r\n protected _vertexLayoutOptions: VertexLayoutOptions;\r\n /** @internal Primitive topology (e.g., 'triangle-list', 'line-strip'). */\r\n protected _primitiveType: PrimitiveType;\r\n /** @internal First index/vertex to draw. */\r\n protected _indexStart: number;\r\n /** @internal Number of indices/vertices to draw (computed lazily if null). */\r\n protected _indexCount: Nullable<number>;\r\n /** @internal Cached default index count (derived when needed). */\r\n protected _defaultIndexCount: number;\r\n /** @internal Marks layout dirty when buffers/topology change. */\r\n protected _vertexLayoutDirty: boolean;\r\n /** @internal Monotonic runtime id. */\r\n private static _nextId = 0;\r\n /** @internal Unique runtime id for the instance. */\r\n protected _id: number;\r\n /** @internal Optional bounding volume for culling/raycast. */\r\n protected _bbox: Nullable<BoundingVolume>;\r\n /** @internal Change tag increments when draw-affecting state changes. */\r\n private _changeTag: number;\r\n /**\r\n * Create an empty primitive.\r\n *\r\n * Defaults:\r\n * - Primitive type: 'triangle-list'\r\n * - `indexStart = 0`, `indexCount = null` (auto-computed)\r\n * - No vertex/index buffers attached\r\n * - No bounding volume\r\n */\r\n constructor() {\r\n super();\r\n this._vertexLayout = null;\r\n this._vertexLayoutOptions = { vertexBuffers: [] };\r\n this._primitiveType = 'triangle-list';\r\n this._indexStart = 0;\r\n this._indexCount = null;\r\n this._defaultIndexCount = 0;\r\n this._vertexLayoutDirty = false;\r\n this._id = ++Primitive._nextId;\r\n this._changeTag = 0;\r\n this._bbox = null;\r\n }\r\n /**\r\n * Unique runtime identifier of this primitive.\r\n *\r\n * @returns The numeric instance id.\r\n * @internal\r\n */\r\n get id() {\r\n return this._id;\r\n }\r\n /**\r\n * Change tag that increments whenever draw-affecting state changes.\r\n * Useful for invalidating cached render bundles.\r\n *\r\n * @returns The current change tag value.\r\n */\r\n get changeTag() {\r\n return this._changeTag;\r\n }\r\n /**\r\n * Create a shallow clone: copies topology, draw range, and buffers.\r\n *\r\n * Note: Buffers are re-retained on the new primitive.\r\n *\r\n * @returns A cloned Primitive instance.\r\n */\r\n clone() {\r\n const other = new Primitive();\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n /**\r\n * Copy from another primitive.\r\n *\r\n * Copies:\r\n * - All vertex buffers and the index buffer\r\n * - Primitive type, index start, index count\r\n *\r\n * @param other - The source primitive to copy from.\r\n * @returns void\r\n */\r\n copyFrom(other: this) {\r\n for (const info of other._vertexLayoutOptions.vertexBuffers) {\r\n this.setVertexBuffer(info.buffer, info.stepMode);\r\n }\r\n this.setIndexBuffer(other._vertexLayoutOptions.indexBuffer ?? null);\r\n this.primitiveType = other.primitiveType;\r\n this.indexStart = other.indexStart;\r\n this.indexCount = other.indexCount;\r\n }\r\n /**\r\n * Primitive topology.\r\n */\r\n get primitiveType() {\r\n return this._primitiveType;\r\n }\r\n set primitiveType(type) {\r\n if (type !== this._primitiveType) {\r\n this._primitiveType = type;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Starting index/vertex for drawing.\r\n */\r\n get indexStart() {\r\n return this._indexStart;\r\n }\r\n set indexStart(val) {\r\n if (val !== this._indexStart) {\r\n this._indexStart = val;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Number of indices/vertices to draw.\r\n */\r\n get indexCount() {\r\n this._indexCount = this._indexCount ?? this.calcDefaultIndexCount();\r\n return this._indexCount;\r\n }\r\n set indexCount(val) {\r\n if (val !== this._indexCount) {\r\n this._indexCount = val;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Query total vertex count from the position buffer, if present.\r\n *\r\n * @returns Total vertex count; 0 if no position buffer is set.\r\n */\r\n getNumVertices() {\r\n const posInfo = this.getVertexBufferInfo('position');\r\n return posInfo?.buffer ? (posInfo.buffer.byteLength / posInfo.stride) >> 0 : 0;\r\n }\r\n /**\r\n * Query total face/segment count based on topology and buffer size.\r\n *\r\n * - For indexed geometry: derived from index buffer.\r\n * - For non-indexed: derived from position vertex count.\r\n *\r\n * @returns Total primitive count for the current topology.\r\n */\r\n getNumFaces() {\r\n const ib = this.getIndexBuffer();\r\n const count = ib\r\n ? ib.byteLength >> (ib.indexType.primitiveType === PBPrimitiveType.U16 ? 1 : 2)\r\n : this.getNumVertices();\r\n switch (this.primitiveType) {\r\n case 'line-list':\r\n return count >> 1;\r\n case 'point-list':\r\n return count;\r\n case 'line-strip':\r\n return count - 1;\r\n case 'triangle-fan':\r\n return count - 2;\r\n case 'triangle-strip':\r\n return count - 2;\r\n case 'triangle-list':\r\n return (count / 3) >> 0;\r\n default:\r\n return 0;\r\n }\r\n }\r\n /**\r\n * Remove all vertex buffers that match a given semantic.\r\n *\r\n * This releases retained buffers, marks the layout dirty, and invalidates bundles.\r\n *\r\n * @param semantic - The vertex semantic to remove (e.g., 'position', 'normal').\r\n * @returns void\r\n */\r\n removeVertexBuffer(semantic: VertexSemantic) {\r\n for (let i = this._vertexLayoutOptions.vertexBuffers.length - 1; i >= 0; i--) {\r\n const info = this._vertexLayoutOptions.vertexBuffers[i];\r\n if (matchVertexBuffer(info.buffer, semantic)) {\r\n releaseObject(info.buffer);\r\n this._vertexLayoutOptions.vertexBuffers.splice(i, 1);\r\n this._vertexLayoutDirty = true;\r\n }\r\n }\r\n if (this._vertexLayoutDirty) {\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Get the vertex buffer that matches a given semantic.\r\n *\r\n * @param semantic - The vertex semantic to look up.\r\n * @returns The matching vertex buffer, or `null` if not found.\r\n */\r\n getVertexBuffer(semantic: VertexSemantic) {\r\n for (const info of this._vertexLayoutOptions.vertexBuffers) {\r\n if (info.buffer && matchVertexBuffer(info.buffer, semantic)) {\r\n return info.buffer;\r\n }\r\n }\r\n return null;\r\n }\r\n /**\r\n * Get vertex buffer information for a given semantic.\r\n *\r\n * @param semantic - The vertex semantic to look up.\r\n * @returns The `VertexBufferInfo`, or `null` if not found.\r\n */\r\n getVertexBufferInfo(semantic: VertexSemantic) {\r\n this.checkVertexLayout();\r\n return this._vertexLayout?.getVertexBufferInfo(semantic) ?? null;\r\n }\r\n /**\r\n * Create a vertex buffer from data and add it to the primitive.\r\n *\r\n * - For interleaved layouts, pass an array of `VertexAttribFormat`.\r\n * - For a single attribute, pass a single `VertexAttribFormat`.\r\n *\r\n * @param format - Vertex attribute format(s).\r\n * @param data - Typed array with vertex data.\r\n * @param stepMode - Optional step mode (e.g., 'vertex', 'instance').\r\n * @returns The created `StructuredBuffer`.\r\n */\r\n createAndSetVertexBuffer(\r\n format: VertexAttribFormat[] | VertexAttribFormat,\r\n data: TypedArray,\r\n stepMode?: VertexStepMode\r\n ) {\r\n const device = getDevice();\r\n const buffer = Array.isArray(format)\r\n ? device.createInterleavedVertexBuffer(format, data)!\r\n : device.createVertexBuffer(format, data)!;\r\n return this.setVertexBuffer(buffer, stepMode);\r\n }\r\n /**\r\n * Add an existing vertex buffer to the primitive.\r\n *\r\n * Ownership note: The primitive retains the buffer; it will be released or disposed when replaced or on dispose.\r\n *\r\n * @param buffer - The vertex buffer to add.\r\n * @param stepMode - Optional step mode for the buffer.\r\n * @returns The same buffer.\r\n */\r\n setVertexBuffer(buffer: StructuredBuffer, stepMode?: VertexStepMode) {\r\n retainObject(buffer);\r\n this._vertexLayoutOptions.vertexBuffers.push({\r\n buffer,\r\n stepMode\r\n });\r\n this._vertexLayoutDirty = true;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n return buffer;\r\n }\r\n /**\r\n * Create an index buffer from data and set it on the primitive.\r\n *\r\n * @param data - Index data as Uint16Array or Uint32Array.\r\n * @param dynamic - Whether the index buffer is dynamic (unmanaged).\r\n * @returns The created `IndexBuffer`.\r\n */\r\n createAndSetIndexBuffer(data: Uint16Array<ArrayBuffer> | Uint32Array<ArrayBuffer>, dynamic?: boolean) {\r\n const device = getDevice();\r\n const buffer = device.createIndexBuffer(data, {\r\n dynamic: !!dynamic,\r\n managed: !dynamic\r\n });\r\n this.setIndexBuffer(buffer);\r\n return buffer;\r\n }\r\n /**\r\n * Set or replace the index buffer.\r\n *\r\n * Ownership note: The primitive retains the buffer; previous buffer is released.\r\n * Marks the vertex layout dirty and invalidates bundles.\r\n *\r\n * @param buffer - The index buffer to set (non-null).\r\n * @returns void\r\n */\r\n setIndexBuffer(buffer: Nullable<IndexBuffer>) {\r\n if (this._vertexLayoutOptions.indexBuffer !== buffer) {\r\n retainObject(buffer);\r\n releaseObject(this._vertexLayoutOptions.indexBuffer ?? null);\r\n this._vertexLayoutOptions.indexBuffer = buffer;\r\n this._vertexLayoutDirty = true;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Get the current index buffer.\r\n *\r\n * @returns The index buffer, or `undefined`/`null` if none set.\r\n */\r\n getIndexBuffer() {\r\n return this._vertexLayoutOptions.indexBuffer ?? null;\r\n }\r\n /**\r\n * Issue a non-instanced draw for the current topology and range.\r\n *\r\n * Preconditions: A valid vertex layout and `indexCount > 0`.\r\n */\r\n draw() {\r\n this.checkVertexLayout();\r\n if (this.indexCount > 0) {\r\n this._vertexLayout?.draw(this._primitiveType, this._indexStart, this.indexCount);\r\n }\r\n }\r\n /**\r\n * Issue an instanced draw for the current topology and range.\r\n *\r\n * Preconditions: A valid vertex layout and `indexCount > 0`.\r\n *\r\n * @param numInstances - Number of instances to draw.\r\n */\r\n drawInstanced(numInstances: number) {\r\n this.checkVertexLayout();\r\n if (this.indexCount > 0) {\r\n this._vertexLayout?.drawInstanced(this._primitiveType, this._indexStart, this.indexCount, numInstances);\r\n }\r\n }\r\n /**\r\n * Dispose this primitive and release associated GPU resources.\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._vertexLayout?.dispose();\r\n this._vertexLayout = null;\r\n if (this._vertexLayoutOptions) {\r\n releaseObject(this._vertexLayoutOptions.indexBuffer ?? null);\r\n for (const info of this._vertexLayoutOptions.vertexBuffers) {\r\n releaseObject(info.buffer);\r\n }\r\n }\r\n }\r\n /*\r\n createAABBTree(): AABBTree {\r\n const indices = this.getIndexBuffer() ? this.getIndexBuffer().getData() : null;\r\n const vertices = (this.getVertexBuffer(VERTEX_ATTRIB_POSITION)?.getData() as Float32Array) || null;\r\n const aabbtree = new AABBTree();\r\n aabbtree.buildFromPrimitives(vertices, indices, this._primitiveType);\r\n return aabbtree;\r\n }\r\n */\r\n /**\r\n * Get the bounding volume associated with this primitive.\r\n *\r\n * @returns The current bounding volume, or `null` if not set.\r\n */\r\n getBoundingVolume() {\r\n return this._bbox;\r\n }\r\n /**\r\n * Set or replace the bounding volume of this primitive.\r\n *\r\n * Triggers registered bounding-volume change callbacks.\r\n *\r\n * @param bv - The bounding volume to set.\r\n * @returns void\r\n */\r\n setBoundingVolume(bv: BoundingVolume) {\r\n if (bv !== this._bbox) {\r\n this._bbox = bv;\r\n this.dispatchEvent('bv_changed');\r\n }\r\n }\r\n /**\r\n * Test intersection against the current axis-aligned bounding box (AABB).\r\n *\r\n * @param ray - Ray to test against the primitive's AABB (derived from its bounding volume).\r\n * @returns The distance from ray origin to the intersection, or `null` if no hit or no AABB.\r\n */\r\n raycast(ray: Ray) {\r\n const aabb = this.getBoundingVolume()?.toAABB();\r\n return aabb ? ray.bboxIntersectionTestEx(aabb) : null;\r\n }\r\n /** @internal */\r\n private checkVertexLayout() {\r\n if (this._vertexLayoutDirty) {\r\n this._vertexLayout?.dispose();\r\n const device = getDevice();\r\n this._vertexLayout = device.createVertexLayout(this._vertexLayoutOptions);\r\n this._vertexLayoutDirty = false;\r\n }\r\n }\r\n /** @internal */\r\n private calcDefaultIndexCount() {\r\n const indexBuffer = this.getIndexBuffer();\r\n if (indexBuffer) {\r\n return Math.max(0, indexBuffer.length - this._indexStart);\r\n }\r\n const info = this.getVertexBufferInfo('position');\r\n if (info) {\r\n return Math.max(\r\n 0,\r\n Math.floor((info.buffer.byteLength - info.drawOffset) / info.stride) - this._indexStart\r\n );\r\n }\r\n return 0;\r\n }\r\n}\r\n"],"names":["Primitive","makeObservable","Disposable","_nextId","_vertexLayout","_vertexLayoutOptions","vertexBuffers","_primitiveType","_indexStart","_indexCount","_defaultIndexCount","_vertexLayoutDirty","_id","_changeTag","_bbox","id","changeTag","clone","other","copyFrom","info","setVertexBuffer","buffer","stepMode","setIndexBuffer","indexBuffer","primitiveType","indexStart","indexCount","type","RenderBundleWrapper","primitiveChanged","val","calcDefaultIndexCount","getNumVertices","posInfo","getVertexBufferInfo","byteLength","stride","getNumFaces","ib","getIndexBuffer","count","indexType","PBPrimitiveType","U16","removeVertexBuffer","semantic","i","length","matchVertexBuffer","releaseObject","splice","getVertexBuffer","checkVertexLayout","createAndSetVertexBuffer","format","data","device","getDevice","Array","isArray","createInterleavedVertexBuffer","createVertexBuffer","retainObject","push","createAndSetIndexBuffer","dynamic","createIndexBuffer","managed","draw","drawInstanced","numInstances","onDispose","dispose","getBoundingVolume","setBoundingVolume","bv","dispatchEvent","raycast","ray","aabb","toAABB","bboxIntersectionTestEx","createVertexLayout","Math","max","floor","drawOffset"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"primitive.js","sources":["../../src/render/primitive.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport {\r\n Disposable,\r\n makeObservable,\r\n releaseObject,\r\n retainObject,\r\n type Clonable,\r\n type Ray,\r\n type TypedArray\r\n} from '@zephyr3d/base';\r\nimport {\r\n type VertexStepMode,\r\n type VertexLayout,\r\n type VertexLayoutOptions,\r\n type PrimitiveType,\r\n type StructuredBuffer,\r\n type IndexBuffer,\r\n type VertexSemantic,\r\n type VertexAttribFormat,\r\n PBPrimitiveType,\r\n matchVertexBuffer\r\n} from '@zephyr3d/device';\r\nimport type { BoundingVolume } from '../utility/bounding_volume';\r\nimport { RenderBundleWrapper } from './renderbundle_wrapper';\r\nimport { getDevice } from '../app/api';\r\n\r\n/**\r\n * Holds vertex/index data and draw parameters for a mesh geometry.\r\n *\r\n * Responsibilities:\r\n * - Owns one or more vertex buffers and an optional index buffer.\r\n * - Defines primitive topology, draw range (start/count), and vertex layout.\r\n * - Provides utilities to create/set/remove buffers and query vertex/face counts.\r\n * - Tracks changes via a change tag and notifies render-bundle caching.\r\n * - Optionally stores a bounding volume and supports ray intersection tests.\r\n *\r\n * Ownership and lifecycle:\r\n * - When adding buffers (`setVertexBuffer`, `setIndexBuffer`), the primitive retains them.\r\n * - When removing/overwriting buffers, the primitive releases the previous buffers.\r\n * - Disposing the primitive also disposes the internal `VertexLayout` and releases retained buffers.\r\n *\r\n * @public\r\n */\r\nexport class Primitive\r\n extends makeObservable(Disposable)<{\r\n bv_changed: [];\r\n }>()\r\n implements Clonable<Primitive>\r\n{\r\n /** @internal Current vertex layout object (created lazily from options). */\r\n protected _vertexLayout: Nullable<VertexLayout>;\r\n /** @internal Mutable options used to build the vertex layout. */\r\n protected _vertexLayoutOptions: VertexLayoutOptions;\r\n /** @internal Primitive topology (e.g., 'triangle-list', 'line-strip'). */\r\n protected _primitiveType: PrimitiveType;\r\n /** @internal First index/vertex to draw. */\r\n protected _indexStart: number;\r\n /** @internal Number of indices/vertices to draw (computed lazily if null). */\r\n protected _indexCount: Nullable<number>;\r\n /** @internal Cached default index count (derived when needed). */\r\n protected _defaultIndexCount: number;\r\n /** @internal Marks layout dirty when buffers/topology change. */\r\n protected _vertexLayoutDirty: boolean;\r\n /** @internal Monotonic runtime id. */\r\n private static _nextId = 0;\r\n /** @internal Unique runtime id for the instance. */\r\n protected _id: number;\r\n /** @internal Optional bounding volume for culling/raycast. */\r\n protected _bbox: Nullable<BoundingVolume>;\r\n /** @internal Change tag increments when draw-affecting state changes. */\r\n private _changeTag: number;\r\n /**\r\n * Create an empty primitive.\r\n *\r\n * Defaults:\r\n * - Primitive type: 'triangle-list'\r\n * - `indexStart = 0`, `indexCount = null` (auto-computed)\r\n * - No vertex/index buffers attached\r\n * - No bounding volume\r\n */\r\n constructor() {\r\n super();\r\n this._vertexLayout = null;\r\n this._vertexLayoutOptions = { vertexBuffers: [] };\r\n this._primitiveType = 'triangle-list';\r\n this._indexStart = 0;\r\n this._indexCount = null;\r\n this._defaultIndexCount = 0;\r\n this._vertexLayoutDirty = false;\r\n this._id = ++Primitive._nextId;\r\n this._changeTag = 0;\r\n this._bbox = null;\r\n }\r\n /**\r\n * Unique runtime identifier of this primitive.\r\n *\r\n * @returns The numeric instance id.\r\n * @public\r\n */\r\n get id() {\r\n return this._id;\r\n }\r\n /**\r\n * Change tag that increments whenever draw-affecting state changes.\r\n * Useful for invalidating cached render bundles.\r\n *\r\n * @returns The current change tag value.\r\n */\r\n get changeTag() {\r\n return this._changeTag;\r\n }\r\n /**\r\n * Create a shallow clone: copies topology, draw range, and buffers.\r\n *\r\n * Note: Buffers are re-retained on the new primitive.\r\n *\r\n * @returns A cloned Primitive instance.\r\n */\r\n clone() {\r\n const other = new Primitive();\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n /**\r\n * Copy from another primitive.\r\n *\r\n * Copies:\r\n * - All vertex buffers and the index buffer\r\n * - Primitive type, index start, index count\r\n *\r\n * @param other - The source primitive to copy from.\r\n * @returns void\r\n */\r\n copyFrom(other: this) {\r\n for (const info of other._vertexLayoutOptions.vertexBuffers) {\r\n this.setVertexBuffer(info.buffer, info.stepMode);\r\n }\r\n this.setIndexBuffer(other._vertexLayoutOptions.indexBuffer ?? null);\r\n this.primitiveType = other.primitiveType;\r\n this.indexStart = other.indexStart;\r\n this.indexCount = other.indexCount;\r\n }\r\n /**\r\n * Primitive topology.\r\n */\r\n get primitiveType() {\r\n return this._primitiveType;\r\n }\r\n set primitiveType(type) {\r\n if (type !== this._primitiveType) {\r\n this._primitiveType = type;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Starting index/vertex for drawing.\r\n */\r\n get indexStart() {\r\n return this._indexStart;\r\n }\r\n set indexStart(val) {\r\n if (val !== this._indexStart) {\r\n this._indexStart = val;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Number of indices/vertices to draw.\r\n */\r\n get indexCount() {\r\n this._indexCount = this._indexCount ?? this.calcDefaultIndexCount();\r\n return this._indexCount;\r\n }\r\n set indexCount(val) {\r\n if (val !== this._indexCount) {\r\n this._indexCount = val;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Query total vertex count from the position buffer, if present.\r\n *\r\n * @returns Total vertex count; 0 if no position buffer is set.\r\n */\r\n getNumVertices() {\r\n const posInfo = this.getVertexBufferInfo('position');\r\n return posInfo?.buffer ? (posInfo.buffer.byteLength / posInfo.stride) >> 0 : 0;\r\n }\r\n /**\r\n * Query total face/segment count based on topology and buffer size.\r\n *\r\n * - For indexed geometry: derived from index buffer.\r\n * - For non-indexed: derived from position vertex count.\r\n *\r\n * @returns Total primitive count for the current topology.\r\n */\r\n getNumFaces() {\r\n const ib = this.getIndexBuffer();\r\n const count = ib\r\n ? ib.byteLength >> (ib.indexType.primitiveType === PBPrimitiveType.U16 ? 1 : 2)\r\n : this.getNumVertices();\r\n switch (this.primitiveType) {\r\n case 'line-list':\r\n return count >> 1;\r\n case 'point-list':\r\n return count;\r\n case 'line-strip':\r\n return count - 1;\r\n case 'triangle-fan':\r\n return count - 2;\r\n case 'triangle-strip':\r\n return count - 2;\r\n case 'triangle-list':\r\n return (count / 3) >> 0;\r\n default:\r\n return 0;\r\n }\r\n }\r\n /**\r\n * Remove all vertex buffers that match a given semantic.\r\n *\r\n * This releases retained buffers, marks the layout dirty, and invalidates bundles.\r\n *\r\n * @param semantic - The vertex semantic to remove (e.g., 'position', 'normal').\r\n * @returns void\r\n */\r\n removeVertexBuffer(semantic: VertexSemantic) {\r\n for (let i = this._vertexLayoutOptions.vertexBuffers.length - 1; i >= 0; i--) {\r\n const info = this._vertexLayoutOptions.vertexBuffers[i];\r\n if (matchVertexBuffer(info.buffer, semantic)) {\r\n releaseObject(info.buffer);\r\n this._vertexLayoutOptions.vertexBuffers.splice(i, 1);\r\n this._vertexLayoutDirty = true;\r\n }\r\n }\r\n if (this._vertexLayoutDirty) {\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Get the vertex buffer that matches a given semantic.\r\n *\r\n * @param semantic - The vertex semantic to look up.\r\n * @returns The matching vertex buffer, or `null` if not found.\r\n */\r\n getVertexBuffer(semantic: VertexSemantic) {\r\n for (const info of this._vertexLayoutOptions.vertexBuffers) {\r\n if (info.buffer && matchVertexBuffer(info.buffer, semantic)) {\r\n return info.buffer;\r\n }\r\n }\r\n return null;\r\n }\r\n /**\r\n * Get vertex buffer information for a given semantic.\r\n *\r\n * @param semantic - The vertex semantic to look up.\r\n * @returns The `VertexBufferInfo`, or `null` if not found.\r\n */\r\n getVertexBufferInfo(semantic: VertexSemantic) {\r\n this.checkVertexLayout();\r\n return this._vertexLayout?.getVertexBufferInfo(semantic) ?? null;\r\n }\r\n /**\r\n * Create a vertex buffer from data and add it to the primitive.\r\n *\r\n * - For interleaved layouts, pass an array of `VertexAttribFormat`.\r\n * - For a single attribute, pass a single `VertexAttribFormat`.\r\n *\r\n * @param format - Vertex attribute format(s).\r\n * @param data - Typed array with vertex data.\r\n * @param stepMode - Optional step mode (e.g., 'vertex', 'instance').\r\n * @returns The created `StructuredBuffer`.\r\n */\r\n createAndSetVertexBuffer(\r\n format: VertexAttribFormat[] | VertexAttribFormat,\r\n data: TypedArray,\r\n stepMode?: VertexStepMode\r\n ) {\r\n const device = getDevice();\r\n const buffer = Array.isArray(format)\r\n ? device.createInterleavedVertexBuffer(format, data)!\r\n : device.createVertexBuffer(format, data)!;\r\n return this.setVertexBuffer(buffer, stepMode);\r\n }\r\n /**\r\n * Add an existing vertex buffer to the primitive.\r\n *\r\n * Ownership note: The primitive retains the buffer; it will be released or disposed when replaced or on dispose.\r\n *\r\n * @param buffer - The vertex buffer to add.\r\n * @param stepMode - Optional step mode for the buffer.\r\n * @returns The same buffer.\r\n */\r\n setVertexBuffer(buffer: StructuredBuffer, stepMode?: VertexStepMode) {\r\n retainObject(buffer);\r\n this._vertexLayoutOptions.vertexBuffers.push({\r\n buffer,\r\n stepMode\r\n });\r\n this._vertexLayoutDirty = true;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n return buffer;\r\n }\r\n /**\r\n * Create an index buffer from data and set it on the primitive.\r\n *\r\n * @param data - Index data as Uint16Array or Uint32Array.\r\n * @param dynamic - Whether the index buffer is dynamic (unmanaged).\r\n * @returns The created `IndexBuffer`.\r\n */\r\n createAndSetIndexBuffer(data: Uint16Array<ArrayBuffer> | Uint32Array<ArrayBuffer>, dynamic?: boolean) {\r\n const device = getDevice();\r\n const buffer = device.createIndexBuffer(data, {\r\n dynamic: !!dynamic,\r\n managed: !dynamic\r\n });\r\n this.setIndexBuffer(buffer);\r\n return buffer;\r\n }\r\n /**\r\n * Set or replace the index buffer.\r\n *\r\n * Ownership note: The primitive retains the buffer; previous buffer is released.\r\n * Marks the vertex layout dirty and invalidates bundles.\r\n *\r\n * @param buffer - The index buffer to set (non-null).\r\n * @returns void\r\n */\r\n setIndexBuffer(buffer: Nullable<IndexBuffer>) {\r\n if (this._vertexLayoutOptions.indexBuffer !== buffer) {\r\n retainObject(buffer);\r\n releaseObject(this._vertexLayoutOptions.indexBuffer ?? null);\r\n this._vertexLayoutOptions.indexBuffer = buffer;\r\n this._vertexLayoutDirty = true;\r\n this._changeTag++;\r\n RenderBundleWrapper.primitiveChanged(this);\r\n }\r\n }\r\n /**\r\n * Get the current index buffer.\r\n *\r\n * @returns The index buffer, or `undefined`/`null` if none set.\r\n */\r\n getIndexBuffer() {\r\n return this._vertexLayoutOptions.indexBuffer ?? null;\r\n }\r\n /**\r\n * Issue a non-instanced draw for the current topology and range.\r\n *\r\n * Preconditions: A valid vertex layout and `indexCount > 0`.\r\n */\r\n draw() {\r\n this.checkVertexLayout();\r\n if (this.indexCount > 0) {\r\n this._vertexLayout?.draw(this._primitiveType, this._indexStart, this.indexCount);\r\n }\r\n }\r\n /**\r\n * Issue an instanced draw for the current topology and range.\r\n *\r\n * Preconditions: A valid vertex layout and `indexCount > 0`.\r\n *\r\n * @param numInstances - Number of instances to draw.\r\n */\r\n drawInstanced(numInstances: number) {\r\n this.checkVertexLayout();\r\n if (this.indexCount > 0) {\r\n this._vertexLayout?.drawInstanced(this._primitiveType, this._indexStart, this.indexCount, numInstances);\r\n }\r\n }\r\n /**\r\n * Dispose this primitive and release associated GPU resources.\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._vertexLayout?.dispose();\r\n this._vertexLayout = null;\r\n if (this._vertexLayoutOptions) {\r\n releaseObject(this._vertexLayoutOptions.indexBuffer ?? null);\r\n for (const info of this._vertexLayoutOptions.vertexBuffers) {\r\n releaseObject(info.buffer);\r\n }\r\n }\r\n }\r\n /*\r\n createAABBTree(): AABBTree {\r\n const indices = this.getIndexBuffer() ? this.getIndexBuffer().getData() : null;\r\n const vertices = (this.getVertexBuffer(VERTEX_ATTRIB_POSITION)?.getData() as Float32Array) || null;\r\n const aabbtree = new AABBTree();\r\n aabbtree.buildFromPrimitives(vertices, indices, this._primitiveType);\r\n return aabbtree;\r\n }\r\n */\r\n /**\r\n * Get the bounding volume associated with this primitive.\r\n *\r\n * @returns The current bounding volume, or `null` if not set.\r\n */\r\n getBoundingVolume() {\r\n return this._bbox;\r\n }\r\n /**\r\n * Set or replace the bounding volume of this primitive.\r\n *\r\n * Triggers registered bounding-volume change callbacks.\r\n *\r\n * @param bv - The bounding volume to set.\r\n * @returns void\r\n */\r\n setBoundingVolume(bv: BoundingVolume) {\r\n if (bv !== this._bbox) {\r\n this._bbox = bv;\r\n this.dispatchEvent('bv_changed');\r\n }\r\n }\r\n /**\r\n * Test intersection against the current axis-aligned bounding box (AABB).\r\n *\r\n * @param ray - Ray to test against the primitive's AABB (derived from its bounding volume).\r\n * @returns The distance from ray origin to the intersection, or `null` if no hit or no AABB.\r\n */\r\n raycast(ray: Ray) {\r\n const aabb = this.getBoundingVolume()?.toAABB();\r\n return aabb ? ray.bboxIntersectionTestEx(aabb) : null;\r\n }\r\n /** @internal */\r\n private checkVertexLayout() {\r\n if (this._vertexLayoutDirty) {\r\n this._vertexLayout?.dispose();\r\n const device = getDevice();\r\n this._vertexLayout = device.createVertexLayout(this._vertexLayoutOptions);\r\n this._vertexLayoutDirty = false;\r\n }\r\n }\r\n /** @internal */\r\n private calcDefaultIndexCount() {\r\n const indexBuffer = this.getIndexBuffer();\r\n if (indexBuffer) {\r\n return Math.max(0, indexBuffer.length - this._indexStart);\r\n }\r\n const info = this.getVertexBufferInfo('position');\r\n if (info) {\r\n return Math.max(\r\n 0,\r\n Math.floor((info.buffer.byteLength - info.drawOffset) / info.stride) - this._indexStart\r\n );\r\n }\r\n return 0;\r\n }\r\n}\r\n"],"names":["Primitive","makeObservable","Disposable","_nextId","_vertexLayout","_vertexLayoutOptions","vertexBuffers","_primitiveType","_indexStart","_indexCount","_defaultIndexCount","_vertexLayoutDirty","_id","_changeTag","_bbox","id","changeTag","clone","other","copyFrom","info","setVertexBuffer","buffer","stepMode","setIndexBuffer","indexBuffer","primitiveType","indexStart","indexCount","type","RenderBundleWrapper","primitiveChanged","val","calcDefaultIndexCount","getNumVertices","posInfo","getVertexBufferInfo","byteLength","stride","getNumFaces","ib","getIndexBuffer","count","indexType","PBPrimitiveType","U16","removeVertexBuffer","semantic","i","length","matchVertexBuffer","releaseObject","splice","getVertexBuffer","checkVertexLayout","createAndSetVertexBuffer","format","data","device","getDevice","Array","isArray","createInterleavedVertexBuffer","createVertexBuffer","retainObject","push","createAndSetIndexBuffer","dynamic","createIndexBuffer","managed","draw","drawInstanced","numInstances","onDispose","dispose","getBoundingVolume","setBoundingVolume","bv","dispatchEvent","raycast","ray","aabb","toAABB","bboxIntersectionTestEx","createVertexLayout","Math","max","floor","drawOffset"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Disposable, objectKeys
|
|
1
|
+
import { Vector3, Disposable, objectKeys } from '@zephyr3d/base';
|
|
2
2
|
import { QUEUE_TRANSPARENT } from '../values.js';
|
|
3
3
|
import { ProgramBuilder } from '@zephyr3d/device';
|
|
4
4
|
import { ShaderHelper } from '../material/shader/helper.js';
|
|
@@ -67,6 +67,7 @@ const maxBufferSizeInFloats = 65536 / 4;
|
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
69
|
const defaultInstanceBindGroupAlloator = new InstanceBindGroupAllocator();
|
|
70
|
+
const tmpDrawablePos = new Vector3();
|
|
70
71
|
/**
|
|
71
72
|
* A queue that contains the items to be rendered
|
|
72
73
|
* @public
|
|
@@ -430,7 +431,7 @@ const defaultInstanceBindGroupAlloator = new InstanceBindGroupAllocator();
|
|
|
430
431
|
this.reset();
|
|
431
432
|
}
|
|
432
433
|
drawableDistanceToCamera(drawable, cameraPos) {
|
|
433
|
-
const drawablePos = drawable.getNode().
|
|
434
|
+
const drawablePos = drawable.getNode().getWorldPosition(tmpDrawablePos);
|
|
434
435
|
return Vector3.distanceSq(drawablePos, cameraPos);
|
|
435
436
|
}
|
|
436
437
|
newRenderItemListInfo() {
|