@zephyr3d/scene 0.9.6 → 0.9.8
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 +52 -55
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +92 -32
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/convex_collider.js +320 -0
- package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +57 -19
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +71 -27
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics_modifier.js +4 -3
- package/dist/animation/joint_dynamics_modifier.js.map +1 -1
- package/dist/animation/skeleton.js +7 -10
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/app/engine.js +3 -9
- package/dist/app/engine.js.map +1 -1
- package/dist/app/scriptregistry.js +47 -16
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +3 -1
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/model.js +346 -7
- package/dist/asset/model.js.map +1 -1
- package/dist/avatar/wardrobe.js +7 -3
- package/dist/avatar/wardrobe.js.map +1 -1
- package/dist/camera/camera.js +240 -34
- package/dist/camera/camera.js.map +1 -1
- package/dist/index.d.ts +1350 -622
- package/dist/index.js +6 -11
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js +1 -1
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/lambert.js +1 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +23 -1
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +178 -23
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/albedocolor.js +4 -4
- package/dist/material/mixins/albedocolor.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +2 -1
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +2 -1
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +63 -16
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +100 -27
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +16 -6
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +1 -1
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +276 -65
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mixins/texture.js +3 -3
- package/dist/material/mixins/texture.js.map +1 -1
- package/dist/material/mixins/vertexcolor.js +2 -2
- package/dist/material/mixins/vertexcolor.js.map +1 -1
- package/dist/material/mtoon.js +574 -0
- package/dist/material/mtoon.js.map +1 -0
- package/dist/material/pbrblueprint.js +494 -331
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/pbrmr.js +118 -100
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js +1 -1
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/shader/helper.js +45 -15
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/subsurfaceprofile.js +812 -0
- package/dist/material/subsurfaceprofile.js.map +1 -0
- package/dist/material/unlit.js +1 -1
- package/dist/material/unlit.js.map +1 -1
- package/dist/posteffect/compositor.js +46 -11
- package/dist/posteffect/compositor.js.map +1 -1
- package/dist/posteffect/ssr.js +413 -87
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +1053 -0
- package/dist/posteffect/sss.js.map +1 -0
- package/dist/posteffect/taa.js +61 -60
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/render/abuffer_oit.js +63 -12
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/cluster_light.js +6 -5
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/drawable.js +1 -5
- package/dist/render/drawable.js.map +1 -1
- package/dist/render/drawable_mixin.js +2 -1
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +2 -1
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +2 -1
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/globalbindgroup_allocator.js +2 -1
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/lightpass.js +105 -18
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/render_queue.js +51 -8
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +73 -59
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/device_pool_allocator.js +8 -0
- package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +481 -95
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/history_resource_manager.js +55 -0
- package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +3 -1
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/renderpass.js +10 -4
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/sky.js +31 -1
- package/dist/render/sky.js.map +1 -1
- package/dist/render/weightedblended_oit.js +23 -5
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +4 -2
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +3 -1
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +11 -1
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/light.js +21 -3
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +29 -14
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/meshdrawable.js +6 -0
- package/dist/scene/meshdrawable.js.map +1 -1
- package/dist/scene/msdftext.js +5 -2
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +5 -3
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +3 -1
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/scene.js +6 -5
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/terrain-cm/grass.js +4 -2
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grassmaterial.js +2 -1
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +4 -2
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/water.js +4 -2
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/shadow.js +26 -393
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shadow/esm.js +112 -12
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcf_opt.js +2 -2
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js +19 -10
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/shader.js +58 -7
- package/dist/shadow/shader.js.map +1 -1
- package/dist/shadow/shadow_impl.js +6 -0
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadow_region.js +229 -0
- package/dist/shadow/shadow_region.js.map +1 -0
- package/dist/shadow/shadowmapper.js +67 -59
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/vsm.js +45 -19
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/utility/blueprint/common/constants.js +8 -8
- package/dist/utility/blueprint/common/constants.js.map +1 -1
- package/dist/utility/blueprint/material/pbr.js +31 -4
- package/dist/utility/blueprint/material/pbr.js.map +1 -1
- package/dist/utility/blueprint/material/texture.js +1 -17
- package/dist/utility/blueprint/material/texture.js.map +1 -1
- package/dist/utility/serialization/manager.js +66 -98
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +5 -2
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +4 -1
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +249 -54
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/common.js +37 -1
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +42 -3
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +1112 -646
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +7 -4
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +31 -12
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +4 -1
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +3 -1
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +18 -0
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +6 -3
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +5 -2
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +3 -1
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +4 -1
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/textures/ltcdata.js +6 -0
- package/dist/utility/textures/ltcdata.js.map +1 -0
- package/dist/utility/textures/ltclut.js +61 -0
- package/dist/utility/textures/ltclut.js.map +1 -0
- package/dist/values.js +9 -1
- package/dist/values.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subsurfaceprofile.js","sources":["../../src/material/subsurfaceprofile.ts"],"sourcesContent":["import { Vector3, type Immutable } from '@zephyr3d/base';\r\n\r\n/**\r\n * Built-in subsurface scattering profile preset names.\r\n *\r\n * @remarks\r\n * The short aliases (`skin`, `wax`, and `jade`) resolve to their default\r\n * canonical profiles.\r\n *\r\n * @public\r\n */\r\nexport type SubsurfaceProfilePreset =\r\n | 'skin'\r\n | 'skin_thin'\r\n | 'skin_default'\r\n | 'skin_heavy_makeup'\r\n | 'wax'\r\n | 'wax_backlit'\r\n | 'wax_soft'\r\n | 'jade'\r\n | 'jade_backlit'\r\n | 'jade_soft';\r\n\r\ntype CanonicalSubsurfaceProfilePreset =\r\n | 'skin_thin'\r\n | 'skin_default'\r\n | 'skin_heavy_makeup'\r\n | 'wax_backlit'\r\n | 'wax_soft'\r\n | 'jade_backlit'\r\n | 'jade_soft';\r\n\r\ntype SubsurfaceProfilePresetTemplate = {\r\n meanFreePathColor: [number, number, number];\r\n meanFreePathDistance: number;\r\n falloffColor: [number, number, number];\r\n strength: number;\r\n scale: number;\r\n worldUnitScale: number;\r\n boundaryColorBleed: number;\r\n transmissionTintColor: [number, number, number];\r\n extinctionScale: number;\r\n normalScale: number;\r\n scatteringDistribution: number;\r\n};\r\n\r\nconst SUBSURFACE_PROFILE_PRESET_ALIAS: Record<SubsurfaceProfilePreset, CanonicalSubsurfaceProfilePreset> = {\r\n skin: 'skin_default',\r\n skin_thin: 'skin_thin',\r\n skin_default: 'skin_default',\r\n skin_heavy_makeup: 'skin_heavy_makeup',\r\n wax: 'wax_backlit',\r\n wax_backlit: 'wax_backlit',\r\n wax_soft: 'wax_soft',\r\n jade: 'jade_soft',\r\n jade_backlit: 'jade_backlit',\r\n jade_soft: 'jade_soft'\r\n};\r\n\r\nconst SUBSURFACE_PROFILE_PRESET_INDEX: Record<CanonicalSubsurfaceProfilePreset, number> = {\r\n skin_thin: 0,\r\n skin_default: 1,\r\n skin_heavy_makeup: 2,\r\n wax_backlit: 3,\r\n wax_soft: 4,\r\n jade_backlit: 5,\r\n jade_soft: 6\r\n};\r\n\r\nconst SUBSURFACE_PROFILE_PRESET_TEMPLATE: Record<\r\n CanonicalSubsurfaceProfilePreset,\r\n SubsurfaceProfilePresetTemplate\r\n> = {\r\n skin_thin: {\r\n meanFreePathColor: [1.0, 0.37, 0.11],\r\n meanFreePathDistance: 0.7,\r\n falloffColor: [1.0, 0.32, 0.2],\r\n strength: 0.68,\r\n scale: 0.82,\r\n worldUnitScale: 0.88,\r\n boundaryColorBleed: 0.13,\r\n transmissionTintColor: [1, 0.37, 0.28],\r\n extinctionScale: 1.24,\r\n normalScale: 1.18,\r\n scatteringDistribution: 0.56\r\n },\r\n skin_default: {\r\n meanFreePathColor: [1.0, 0.45, 0.17],\r\n meanFreePathDistance: 0.92,\r\n falloffColor: [1.0, 0.39, 0.25],\r\n strength: 0.82,\r\n scale: 0.96,\r\n worldUnitScale: 1,\r\n boundaryColorBleed: 0.22,\r\n transmissionTintColor: [1, 0.46, 0.34],\r\n extinctionScale: 1.06,\r\n normalScale: 1,\r\n scatteringDistribution: 0.6\r\n },\r\n skin_heavy_makeup: {\r\n meanFreePathColor: [1.0, 0.33, 0.11],\r\n meanFreePathDistance: 0.68,\r\n falloffColor: [1.0, 0.26, 0.16],\r\n strength: 0.56,\r\n scale: 0.76,\r\n worldUnitScale: 0.84,\r\n boundaryColorBleed: 0.08,\r\n transmissionTintColor: [0.94, 0.31, 0.22],\r\n extinctionScale: 1.4,\r\n normalScale: 1.26,\r\n scatteringDistribution: 0.5\r\n },\r\n wax_backlit: {\r\n meanFreePathColor: [1.0, 0.68, 0.36],\r\n meanFreePathDistance: 1.54,\r\n falloffColor: [1.0, 0.8, 0.66],\r\n strength: 1.12,\r\n scale: 1.42,\r\n worldUnitScale: 1.26,\r\n boundaryColorBleed: 0.42,\r\n transmissionTintColor: [1, 0.82, 0.7],\r\n extinctionScale: 0.78,\r\n normalScale: 0.92,\r\n scatteringDistribution: 0.82\r\n },\r\n wax_soft: {\r\n meanFreePathColor: [1.0, 0.72, 0.38],\r\n meanFreePathDistance: 1.2,\r\n falloffColor: [1.0, 0.86, 0.74],\r\n strength: 1.02,\r\n scale: 1.28,\r\n worldUnitScale: 1.12,\r\n boundaryColorBleed: 0.36,\r\n transmissionTintColor: [1, 0.86, 0.74],\r\n extinctionScale: 0.86,\r\n normalScale: 0.98,\r\n scatteringDistribution: 0.74\r\n },\r\n jade_backlit: {\r\n meanFreePathColor: [0.74, 1.0, 0.88],\r\n meanFreePathDistance: 0.92,\r\n falloffColor: [0.66, 0.94, 0.88],\r\n strength: 0.92,\r\n scale: 1.14,\r\n worldUnitScale: 1.06,\r\n boundaryColorBleed: 0.26,\r\n transmissionTintColor: [0.68, 0.92, 0.86],\r\n extinctionScale: 0.92,\r\n normalScale: 1.02,\r\n scatteringDistribution: 0.7\r\n },\r\n jade_soft: {\r\n meanFreePathColor: [0.68, 1.0, 0.84],\r\n meanFreePathDistance: 0.8,\r\n falloffColor: [0.72, 0.94, 0.86],\r\n strength: 0.82,\r\n scale: 1.02,\r\n worldUnitScale: 0.98,\r\n boundaryColorBleed: 0.22,\r\n transmissionTintColor: [0.74, 0.96, 0.9],\r\n extinctionScale: 1,\r\n normalScale: 1.04,\r\n scatteringDistribution: 0.66\r\n }\r\n};\r\n\r\nconst SUBSURFACE_PROFILE_PRESET_TINT_BIAS: Record<\r\n CanonicalSubsurfaceProfilePreset,\r\n [number, number, number]\r\n> = {\r\n skin_thin: [1, 0.56, 0.46],\r\n skin_default: [1, 0.62, 0.5],\r\n skin_heavy_makeup: [1, 0.5, 0.42],\r\n wax_backlit: [1, 0.8, 0.7],\r\n wax_soft: [1, 0.86, 0.78],\r\n jade_backlit: [0.72, 0.92, 0.96],\r\n jade_soft: [0.68, 0.96, 0.88]\r\n};\r\n\r\nconst SUBSURFACE_PROFILE_PRESET_RESPONSE: Record<\r\n CanonicalSubsurfaceProfilePreset,\r\n [number, number, number, number]\r\n> = {\r\n skin_thin: [0.08, 0.12, 0.06, 0.12],\r\n skin_default: [0.1, 0.14, 0.08, 0.16],\r\n skin_heavy_makeup: [0.02, 0.05, -0.02, 0.01],\r\n wax_backlit: [0.12, 0.2, 0.26, 0.24],\r\n wax_soft: [0.2, 0.3, 0.34, 0.1],\r\n jade_backlit: [0.08, 0.18, 0.2, 0.24],\r\n jade_soft: [0.16, 0.24, 0.22, 0.12]\r\n};\r\n\r\n/**\r\n * Serializable subsurface scattering profile.\r\n *\r\n * @remarks\r\n * The profile stores the channel-dependent scattering radius and falloff used\r\n * by the screen-space SSS post effect. Materials can share a profile instance\r\n * to emulate Unreal-style skin profile assets.\r\n *\r\n * @public\r\n */\r\nexport class SubsurfaceProfile {\r\n private static readonly _maxProfiles = 255;\r\n private static readonly _profiles: Array<SubsurfaceProfile | null> = new Array(\r\n SubsurfaceProfile._maxProfiles + 1\r\n ).fill(null);\r\n private static _version = 0;\r\n private static _defaultSkinProfile: SubsurfaceProfile | null = null;\r\n private readonly _scatterRadius: Vector3;\r\n private readonly _falloffColor: Vector3;\r\n private readonly _meanFreePathColor: Vector3;\r\n private readonly _transmissionTintColor: Vector3;\r\n private _preset: CanonicalSubsurfaceProfilePreset;\r\n private _meanFreePathDistance: number;\r\n private _strength: number;\r\n private _scale: number;\r\n private _worldUnitScale: number;\r\n private _boundaryColorBleed: number;\r\n private _extinctionScale: number;\r\n private _normalScale: number;\r\n private _scatteringDistribution: number;\r\n private readonly _slot: number;\r\n private readonly _changeListeners: Set<() => void>;\r\n\r\n /**\r\n * Creates a subsurface scattering profile initialized with the default skin preset.\r\n *\r\n * @public\r\n */\r\n constructor() {\r\n this._scatterRadius = new Vector3(0, 0, 0);\r\n this._falloffColor = new Vector3(0, 0, 0);\r\n this._meanFreePathColor = new Vector3(0, 0, 0);\r\n this._transmissionTintColor = new Vector3(0, 0, 0);\r\n this._preset = 'skin_default';\r\n this._meanFreePathDistance = 0;\r\n this._strength = 0;\r\n this._scale = 0;\r\n this._worldUnitScale = 1;\r\n this._boundaryColorBleed = 0;\r\n this._extinctionScale = 1;\r\n this._normalScale = 1;\r\n this._scatteringDistribution = 0.65;\r\n this._changeListeners = new Set();\r\n this._slot = SubsurfaceProfile.allocateSlot(this);\r\n this.applyPresetTemplate(this._preset, false);\r\n }\r\n\r\n /**\r\n * Gets the global profile data version.\r\n *\r\n * @remarks\r\n * The value is incremented whenever a profile slot is allocated or profile\r\n * data changes, allowing render systems to refresh cached profile textures.\r\n *\r\n * @public\r\n */\r\n static get version() {\r\n return this._version;\r\n }\r\n\r\n /**\r\n * Gets the profile assigned to a packed profile slot.\r\n *\r\n * @param slot - The 1-based profile slot index.\r\n * @returns The profile assigned to the slot, or `null` if the slot is invalid or unused.\r\n *\r\n * @public\r\n */\r\n static getProfileBySlot(slot: number) {\r\n return slot > 0 && slot < this._profiles.length ? this._profiles[slot] : null;\r\n }\r\n\r\n /**\r\n * Gets the shared default skin subsurface profile.\r\n *\r\n * @returns The lazily-created default skin profile.\r\n *\r\n * @public\r\n */\r\n static getDefaultSkinProfile() {\r\n if (!this._defaultSkinProfile) {\r\n this._defaultSkinProfile = new SubsurfaceProfile();\r\n }\r\n return this._defaultSkinProfile;\r\n }\r\n\r\n /**\r\n * Gets the preset tint bias used by the screen-space transmission model.\r\n *\r\n * @param index - The packed canonical preset index.\r\n * @returns The RGB tint bias for the preset, or white when the index is unknown.\r\n *\r\n * @public\r\n */\r\n static getPresetTintBiasByIndex(index: number) {\r\n return SUBSURFACE_PROFILE_PRESET_TINT_BIAS[this.getPresetNameByIndex(index)] ?? [1, 1, 1];\r\n }\r\n\r\n /**\r\n * Gets the preset transmission response used by the screen-space SSS pass.\r\n *\r\n * @param index - The packed canonical preset index.\r\n * @returns The four-component transmission response for the preset.\r\n *\r\n * @public\r\n */\r\n static getPresetResponseByIndex(index: number) {\r\n return SUBSURFACE_PROFILE_PRESET_RESPONSE[this.getPresetNameByIndex(index)] ?? [0, 0, 0, 0];\r\n }\r\n\r\n /**\r\n * Computes the effective tint bias from the preset and current profile settings.\r\n *\r\n * @returns The derived RGB tint bias used for transmission tinting.\r\n *\r\n * @public\r\n */\r\n getDerivedTintBias(): [number, number, number] {\r\n const base = SUBSURFACE_PROFILE_PRESET_TINT_BIAS[this._preset] ?? [1, 1, 1];\r\n const factors = this.getDerivedProfileFactors();\r\n const derived: [number, number, number] = [\r\n this.clamp01(0.78 + factors.warmBias * 0.26 - factors.coolBias * 0.16 + factors.boundaryNorm * 0.04),\r\n this.clamp01(\r\n 0.3 +\r\n factors.meanFreePathColor[1] * 0.24 +\r\n factors.transmissionTintColor[1] * 0.28 +\r\n factors.distanceNorm * 0.08 +\r\n factors.scaleNorm * 0.05 +\r\n factors.boundaryNorm * 0.08 +\r\n factors.coolBias * 0.06\r\n ),\r\n this.clamp01(\r\n 0.14 +\r\n factors.meanFreePathColor[2] * 0.22 +\r\n factors.transmissionTintColor[2] * 0.32 +\r\n factors.distanceNorm * 0.06 +\r\n factors.boundaryNorm * 0.06 +\r\n factors.coolBias * 0.12 -\r\n factors.warmBias * 0.06\r\n )\r\n ];\r\n const blend = this.clampRange(\r\n 0.26 + factors.radiusNorm * 0.16 + factors.scaleNorm * 0.1 + factors.strengthNorm * 0.08,\r\n 0.25,\r\n 0.88\r\n );\r\n return [\r\n this.mixNumber(base[0], derived[0], blend),\r\n this.mixNumber(base[1], derived[1], blend),\r\n this.mixNumber(base[2], derived[2], blend)\r\n ];\r\n }\r\n\r\n /**\r\n * Computes the effective transmission response from the preset and current profile settings.\r\n *\r\n * @returns The derived transmission response packed as four scalar channels.\r\n *\r\n * @public\r\n */\r\n getDerivedTransmissionResponse(): [number, number, number, number] {\r\n const base = SUBSURFACE_PROFILE_PRESET_RESPONSE[this._preset] ?? [0, 0, 0, 0];\r\n const factors = this.getDerivedProfileFactors();\r\n const blend = this.clampRange(\r\n 0.32 +\r\n factors.distanceNorm * 0.18 +\r\n factors.scaleNorm * 0.12 +\r\n factors.strengthNorm * 0.1 +\r\n factors.boundaryNorm * 0.06,\r\n 0.28,\r\n 0.9\r\n );\r\n const derived: [number, number, number, number] = [\r\n this.clampRange(\r\n -0.06 +\r\n factors.radiusNorm * 0.08 +\r\n factors.distanceNorm * 0.08 +\r\n factors.strengthNorm * 0.05 +\r\n factors.distributionNorm * 0.04 +\r\n factors.boundaryNorm * 0.05 +\r\n factors.extinctionSoftness * 0.03,\r\n -0.25,\r\n 0.45\r\n ),\r\n this.clampRange(\r\n 0.02 +\r\n factors.radiusNorm * 0.1 +\r\n factors.scaleNorm * 0.08 +\r\n factors.worldScaleNorm * 0.04 +\r\n factors.distributionNorm * 0.08 +\r\n factors.extinctionSoftness * 0.06,\r\n -0.25,\r\n 0.45\r\n ),\r\n this.clampRange(\r\n -0.08 +\r\n factors.strengthNorm * 0.12 +\r\n factors.scaleNorm * 0.08 +\r\n factors.extinctionSoftness * 0.12 +\r\n factors.boundaryNorm * 0.06 +\r\n factors.warmBias * 0.05 -\r\n factors.coolBias * 0.04,\r\n -0.25,\r\n 0.45\r\n ),\r\n this.clampRange(\r\n -0.02 +\r\n factors.radiusNorm * 0.12 +\r\n factors.scaleNorm * 0.08 +\r\n factors.strengthNorm * 0.06 +\r\n factors.boundaryNorm * 0.06 +\r\n factors.extinctionSoftness * 0.16 +\r\n factors.warmBias * 0.07 +\r\n factors.transmissionTintColor[0] * 0.04,\r\n -0.25,\r\n 0.5\r\n )\r\n ];\r\n return [\r\n this.clampRange(this.mixNumber(base[0], derived[0], blend), -0.25, 0.45),\r\n this.clampRange(this.mixNumber(base[1], derived[1], blend), -0.25, 0.45),\r\n this.clampRange(this.mixNumber(base[2], derived[2], blend), -0.25, 0.45),\r\n this.clampRange(this.mixNumber(base[3], derived[3], blend), -0.25, 0.5)\r\n ];\r\n }\r\n\r\n /**\r\n * Gets the 1-based profile slot used when encoding this profile into SSS buffers.\r\n *\r\n * @public\r\n */\r\n get slot() {\r\n return this._slot;\r\n }\r\n\r\n /**\r\n * Gets or sets the RGB scatter radius.\r\n *\r\n * @remarks\r\n * Assigning a radius also updates the mean-free-path authoring controls.\r\n *\r\n * @public\r\n */\r\n get scatterRadius(): Immutable<Vector3> {\r\n return this._scatterRadius;\r\n }\r\n\r\n set scatterRadius(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._scatterRadius)) {\r\n this._scatterRadius.set(val);\r\n this.syncMeanFreePathFromScatterRadius();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the channel falloff color used by the diffusion kernel.\r\n *\r\n * @public\r\n */\r\n get falloffColor(): Immutable<Vector3> {\r\n return this._falloffColor;\r\n }\r\n\r\n set falloffColor(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._falloffColor)) {\r\n this._falloffColor.set(val);\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Mean free path color used to derive channel-dependent scatter radius.\r\n *\r\n * @remarks\r\n * This is a more UE-like authoring control that keeps the existing radius-\r\n * based implementation, while letting tools expose a color + distance pair.\r\n *\r\n * @public\r\n */\r\n get meanFreePathColor(): Immutable<Vector3> {\r\n return this._meanFreePathColor;\r\n }\r\n\r\n set meanFreePathColor(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._meanFreePathColor)) {\r\n this._meanFreePathColor.set(val);\r\n this.syncScatterRadiusFromMeanFreePath();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the mean free path distance used to derive the absolute scatter radius.\r\n *\r\n * @public\r\n */\r\n get meanFreePathDistance() {\r\n return this._meanFreePathDistance;\r\n }\r\n\r\n set meanFreePathDistance(val: number) {\r\n const next = Math.max(0, val ?? 0);\r\n if (next !== this._meanFreePathDistance) {\r\n this._meanFreePathDistance = next;\r\n this.syncScatterRadiusFromMeanFreePath();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the active subsurface profile preset.\r\n *\r\n * @remarks\r\n * Assigning a preset applies its template values to the profile. Alias preset\r\n * names are resolved to their canonical preset.\r\n *\r\n * @public\r\n */\r\n get preset() {\r\n return this._preset;\r\n }\r\n\r\n set preset(val: SubsurfaceProfilePreset) {\r\n const next = SubsurfaceProfile.resolvePreset(val);\r\n if (next !== this._preset) {\r\n this._preset = next;\r\n this.applyPresetTemplate(next);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the packed canonical preset index.\r\n *\r\n * @public\r\n */\r\n get presetIndex() {\r\n return SUBSURFACE_PROFILE_PRESET_INDEX[this._preset] ?? 0;\r\n }\r\n\r\n /**\r\n * Gets or sets the SSS strength multiplier.\r\n *\r\n * @public\r\n */\r\n get strength() {\r\n return this._strength;\r\n }\r\n\r\n set strength(val: number) {\r\n if (val !== this._strength) {\r\n this._strength = val;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the screen-space scatter width scale.\r\n *\r\n * @public\r\n */\r\n get scale() {\r\n return this._scale;\r\n }\r\n\r\n set scale(val: number) {\r\n if (val !== this._scale) {\r\n this._scale = val;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the world-unit scale used when converting profile radii.\r\n *\r\n * @public\r\n */\r\n get worldUnitScale() {\r\n return this._worldUnitScale;\r\n }\r\n\r\n set worldUnitScale(val: number) {\r\n const next = Math.max(0.05, val ?? 0.05);\r\n if (next !== this._worldUnitScale) {\r\n this._worldUnitScale = next;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the amount of color bleeding preserved near SSS boundaries.\r\n *\r\n * @remarks\r\n * Values are clamped to the `[0, 1]` range.\r\n *\r\n * @public\r\n */\r\n get boundaryColorBleed() {\r\n return this._boundaryColorBleed;\r\n }\r\n\r\n set boundaryColorBleed(val: number) {\r\n const next = this.clamp01(val ?? 0);\r\n if (next !== this._boundaryColorBleed) {\r\n this._boundaryColorBleed = next;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the RGB tint applied to transmitted subsurface light.\r\n *\r\n * @public\r\n */\r\n get transmissionTintColor(): Immutable<Vector3> {\r\n return this._transmissionTintColor;\r\n }\r\n\r\n set transmissionTintColor(val: Immutable<Vector3>) {\r\n if (!val.equalsTo(this._transmissionTintColor)) {\r\n this._transmissionTintColor.set(val);\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the extinction multiplier used by transmission attenuation.\r\n *\r\n * @remarks\r\n * Values are clamped to zero or greater.\r\n *\r\n * @public\r\n */\r\n get extinctionScale() {\r\n return this._extinctionScale;\r\n }\r\n\r\n set extinctionScale(val: number) {\r\n const next = Math.max(0, val ?? 0);\r\n if (next !== this._extinctionScale) {\r\n this._extinctionScale = next;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the normal sensitivity scale used by SSS filtering.\r\n *\r\n * @remarks\r\n * Values are clamped to zero or greater.\r\n *\r\n * @public\r\n */\r\n get normalScale() {\r\n return this._normalScale;\r\n }\r\n\r\n set normalScale(val: number) {\r\n const next = Math.max(0, val ?? 0);\r\n if (next !== this._normalScale) {\r\n this._normalScale = next;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Gets or sets the scattering distribution blend.\r\n *\r\n * @remarks\r\n * Values are clamped to the `[0, 1]` range.\r\n *\r\n * @public\r\n */\r\n get scatteringDistribution() {\r\n return this._scatteringDistribution;\r\n }\r\n\r\n set scatteringDistribution(val: number) {\r\n const next = this.clamp01(val ?? 0);\r\n if (next !== this._scatteringDistribution) {\r\n this._scatteringDistribution = next;\r\n this.markDirty();\r\n }\r\n }\r\n\r\n /**\r\n * Adds a listener that is invoked whenever this profile changes.\r\n *\r\n * @param listener - The callback to invoke after profile data changes.\r\n *\r\n * @public\r\n */\r\n addChangeListener(listener: () => void) {\r\n this._changeListeners.add(listener);\r\n }\r\n\r\n /**\r\n * Removes a previously registered profile change listener.\r\n *\r\n * @param listener - The callback to remove.\r\n *\r\n * @public\r\n */\r\n removeChangeListener(listener: () => void) {\r\n this._changeListeners.delete(listener);\r\n }\r\n\r\n private static allocateSlot(profile: SubsurfaceProfile) {\r\n for (let i = 1; i < this._profiles.length; i++) {\r\n if (!this._profiles[i]) {\r\n this._profiles[i] = profile;\r\n this._version++;\r\n return i;\r\n }\r\n }\r\n throw new Error('SubsurfaceProfile limit exceeded');\r\n }\r\n\r\n private markDirty() {\r\n SubsurfaceProfile._version++;\r\n this._changeListeners.forEach((listener) => listener());\r\n }\r\n\r\n private static resolvePreset(preset: SubsurfaceProfilePreset | null | undefined) {\r\n return SUBSURFACE_PROFILE_PRESET_ALIAS[preset ?? 'skin_default'] ?? 'skin_default';\r\n }\r\n\r\n private static getPresetNameByIndex(index: number): CanonicalSubsurfaceProfilePreset {\r\n for (const [name, presetIndex] of Object.entries(SUBSURFACE_PROFILE_PRESET_INDEX) as Array<\r\n [CanonicalSubsurfaceProfilePreset, number]\r\n >) {\r\n if (presetIndex === index) {\r\n return name;\r\n }\r\n }\r\n return 'skin_default';\r\n }\r\n\r\n private applyPresetTemplate(preset: CanonicalSubsurfaceProfilePreset, markDirty = true) {\r\n const template =\r\n SUBSURFACE_PROFILE_PRESET_TEMPLATE[preset] ?? SUBSURFACE_PROFILE_PRESET_TEMPLATE.skin_default;\r\n this._meanFreePathColor.setXYZ(\r\n template.meanFreePathColor[0],\r\n template.meanFreePathColor[1],\r\n template.meanFreePathColor[2]\r\n );\r\n this._meanFreePathDistance = template.meanFreePathDistance;\r\n this._strength = template.strength;\r\n this._scale = template.scale;\r\n this._worldUnitScale = template.worldUnitScale;\r\n this._boundaryColorBleed = template.boundaryColorBleed;\r\n this._transmissionTintColor.setXYZ(\r\n template.transmissionTintColor[0],\r\n template.transmissionTintColor[1],\r\n template.transmissionTintColor[2]\r\n );\r\n this._extinctionScale = template.extinctionScale;\r\n this._normalScale = template.normalScale;\r\n this._scatteringDistribution = template.scatteringDistribution;\r\n this.syncScatterRadiusFromMeanFreePath(false);\r\n if (markDirty) {\r\n this.markDirty();\r\n }\r\n }\r\n\r\n private syncMeanFreePathFromScatterRadius(markDirty = true) {\r\n const maxRadius = Math.max(this._scatterRadius.x, this._scatterRadius.y, this._scatterRadius.z);\r\n if (maxRadius > 1e-5) {\r\n this._meanFreePathDistance = maxRadius;\r\n this._meanFreePathColor.setXYZ(\r\n this._scatterRadius.x / maxRadius,\r\n this._scatterRadius.y / maxRadius,\r\n this._scatterRadius.z / maxRadius\r\n );\r\n } else {\r\n this._meanFreePathDistance = 0;\r\n this._meanFreePathColor.setXYZ(0, 0, 0);\r\n }\r\n this.syncFalloffFromMeanFreePath(false);\r\n if (markDirty) {\r\n this.markDirty();\r\n }\r\n }\r\n\r\n private syncScatterRadiusFromMeanFreePath(markDirty = true) {\r\n const distance = Math.max(0, this._meanFreePathDistance);\r\n this._scatterRadius.setXYZ(\r\n Math.max(0, this._meanFreePathColor.x) * distance,\r\n Math.max(0, this._meanFreePathColor.y) * distance,\r\n Math.max(0, this._meanFreePathColor.z) * distance\r\n );\r\n this.syncFalloffFromMeanFreePath(false);\r\n if (markDirty) {\r\n this.markDirty();\r\n }\r\n }\r\n\r\n private syncFalloffFromMeanFreePath(markDirty = true) {\r\n const base =\r\n SUBSURFACE_PROFILE_PRESET_TEMPLATE[this._preset]?.falloffColor ??\r\n SUBSURFACE_PROFILE_PRESET_TEMPLATE.skin_default.falloffColor;\r\n const factors = this.getDerivedProfileFactors();\r\n const derivedG = this.clamp01(\r\n 0.12 +\r\n factors.meanFreePathColor[1] * 0.4 +\r\n factors.transmissionTintColor[1] * 0.12 +\r\n factors.distanceNorm * 0.05 +\r\n factors.scaleNorm * 0.05 +\r\n factors.distributionNorm * 0.05 -\r\n (1 - factors.extinctionSoftness) * 0.04\r\n );\r\n const derivedB = this.clamp01(\r\n 0.04 +\r\n factors.meanFreePathColor[2] * 0.32 +\r\n factors.transmissionTintColor[2] * 0.18 +\r\n factors.distanceNorm * 0.04 +\r\n factors.boundaryNorm * 0.05 +\r\n factors.coolBias * 0.08 -\r\n factors.warmBias * 0.04\r\n );\r\n const blend = this.clampRange(\r\n 0.24 + factors.distanceNorm * 0.16 + factors.scaleNorm * 0.12 + factors.strengthNorm * 0.08,\r\n 0.22,\r\n 0.82\r\n );\r\n this._falloffColor.setXYZ(\r\n 1,\r\n this.mixNumber(base[1], derivedG, blend),\r\n this.mixNumber(base[2], derivedB, blend)\r\n );\r\n if (markDirty) {\r\n this.markDirty();\r\n }\r\n }\r\n\r\n private getNormalizedTransmissionTintColor(): [number, number, number] {\r\n const maxChannel = Math.max(\r\n this._transmissionTintColor.x,\r\n this._transmissionTintColor.y,\r\n this._transmissionTintColor.z,\r\n 1e-5\r\n );\r\n return [\r\n Math.max(0, this._transmissionTintColor.x) / maxChannel,\r\n Math.max(0, this._transmissionTintColor.y) / maxChannel,\r\n Math.max(0, this._transmissionTintColor.z) / maxChannel\r\n ];\r\n }\r\n\r\n private getDerivedProfileFactors() {\r\n const meanFreePathColor = this.getNormalizedMeanFreePathColor();\r\n const transmissionTintColor = this.getNormalizedTransmissionTintColor();\r\n const maxRadius = Math.max(this._scatterRadius.x, this._scatterRadius.y, this._scatterRadius.z);\r\n const radiusNorm = this.clampRange(maxRadius / 1.35, 0, 1.5);\r\n const distanceNorm = this.clampRange(this._meanFreePathDistance / 1.25, 0, 1.5);\r\n const scaleNorm = this.clampRange(this._scale / 1.35, 0, 1.5);\r\n const strengthNorm = this.clampRange(this._strength / 1.2, 0, 1.5);\r\n const worldScaleNorm = this.clampRange(this._worldUnitScale / 1.25, 0, 1.5);\r\n const boundaryNorm = this.clamp01(this._boundaryColorBleed);\r\n const distributionNorm = this.clamp01(this._scatteringDistribution);\r\n const extinctionWeight = this.clampRange(1 / Math.max(this._extinctionScale, 0.35), 0.25, 1.35);\r\n const extinctionSoftness = this.clamp01((extinctionWeight - 0.25) / 1.1);\r\n const warmBias = this.clamp01(\r\n 0.5 +\r\n (meanFreePathColor[0] - Math.max(meanFreePathColor[1], meanFreePathColor[2]) * 0.72) * 0.95 +\r\n (transmissionTintColor[0] - Math.max(transmissionTintColor[1], transmissionTintColor[2]) * 0.78) * 0.7\r\n );\r\n const coolBias = this.clamp01(\r\n 0.32 +\r\n (transmissionTintColor[2] - transmissionTintColor[0] * 0.55) * 0.55 +\r\n (meanFreePathColor[2] - meanFreePathColor[0] * 0.65) * 0.45\r\n );\r\n return {\r\n meanFreePathColor,\r\n transmissionTintColor,\r\n radiusNorm,\r\n distanceNorm,\r\n scaleNorm,\r\n strengthNorm,\r\n worldScaleNorm,\r\n boundaryNorm,\r\n distributionNorm,\r\n extinctionSoftness,\r\n warmBias,\r\n coolBias\r\n };\r\n }\r\n\r\n private getNormalizedMeanFreePathColor(): [number, number, number] {\r\n const maxChannel = Math.max(\r\n this._meanFreePathColor.x,\r\n this._meanFreePathColor.y,\r\n this._meanFreePathColor.z,\r\n 1e-5\r\n );\r\n return [\r\n Math.max(0, this._meanFreePathColor.x) / maxChannel,\r\n Math.max(0, this._meanFreePathColor.y) / maxChannel,\r\n Math.max(0, this._meanFreePathColor.z) / maxChannel\r\n ];\r\n }\r\n\r\n private mixNumber(a: number, b: number, t: number) {\r\n return a * (1 - t) + b * t;\r\n }\r\n\r\n private clampRange(value: number, minValue: number, maxValue: number) {\r\n return Math.max(minValue, Math.min(maxValue, value));\r\n }\r\n\r\n private clamp01(value: number) {\r\n return Math.max(0, Math.min(1, value));\r\n }\r\n}\r\n"],"names":["SUBSURFACE_PROFILE_PRESET_ALIAS","skin","skin_thin","skin_default","skin_heavy_makeup","wax","wax_backlit","wax_soft","jade","jade_backlit","jade_soft","SUBSURFACE_PROFILE_PRESET_INDEX","SUBSURFACE_PROFILE_PRESET_TEMPLATE","meanFreePathColor","meanFreePathDistance","falloffColor","strength","scale","worldUnitScale","boundaryColorBleed","transmissionTintColor","extinctionScale","normalScale","scatteringDistribution","SUBSURFACE_PROFILE_PRESET_TINT_BIAS","SUBSURFACE_PROFILE_PRESET_RESPONSE","SubsurfaceProfile","_maxProfiles","_profiles","Array","fill","_version","_defaultSkinProfile","_scatterRadius","_falloffColor","_meanFreePathColor","_transmissionTintColor","_preset","_meanFreePathDistance","_strength","_scale","_worldUnitScale","_boundaryColorBleed","_extinctionScale","_normalScale","_scatteringDistribution","_slot","_changeListeners","Vector3","Set","allocateSlot","applyPresetTemplate","version","getProfileBySlot","slot","length","getDefaultSkinProfile","getPresetTintBiasByIndex","index","getPresetNameByIndex","getPresetResponseByIndex","getDerivedTintBias","base","factors","getDerivedProfileFactors","derived","clamp01","warmBias","coolBias","boundaryNorm","distanceNorm","scaleNorm","blend","clampRange","radiusNorm","strengthNorm","mixNumber","getDerivedTransmissionResponse","distributionNorm","extinctionSoftness","worldScaleNorm","scatterRadius","val","equalsTo","set","syncMeanFreePathFromScatterRadius","markDirty","syncScatterRadiusFromMeanFreePath","next","Math","max","preset","resolvePreset","presetIndex","addChangeListener","listener","add","removeChangeListener","delete","profile","i","Error","forEach","name","Object","entries","template","setXYZ","maxRadius","x","y","z","syncFalloffFromMeanFreePath","distance","derivedG","derivedB","getNormalizedTransmissionTintColor","maxChannel","getNormalizedMeanFreePathColor","extinctionWeight","a","b","t","value","minValue","maxValue","min"],"mappings":"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"}
|
package/dist/material/unlit.js
CHANGED
|
@@ -25,7 +25,7 @@ import { ShaderHelper } from './shader/helper.js';
|
|
|
25
25
|
}
|
|
26
26
|
fragmentShader(scope) {
|
|
27
27
|
super.fragmentShader(scope);
|
|
28
|
-
if (this.
|
|
28
|
+
if (this.needFragmentColorInput()) {
|
|
29
29
|
let color = this.calculateAlbedoColor(scope);
|
|
30
30
|
if (this.vertexColor) {
|
|
31
31
|
color = scope.$builder.mul(color, this.getVertexColor(scope));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unlit.js","sources":["../../src/material/unlit.ts"],"sourcesContent":["import { MeshMaterial, applyMaterialMixins } from './meshmaterial';\r\nimport { mixinAlbedoColor } from './mixins/albedocolor';\r\nimport { mixinVertexColor } from './mixins/vertexcolor';\r\nimport type { PBFunctionScope } from '@zephyr3d/device';\r\nimport { ShaderHelper } from './shader/helper';\r\nimport type { Clonable } from '@zephyr3d/base';\r\n\r\n/**\r\n * Unlit material\r\n * @public\r\n */\r\nexport class UnlitMaterial\r\n extends applyMaterialMixins(MeshMaterial, mixinVertexColor, mixinAlbedoColor)\r\n implements Clonable<UnlitMaterial>\r\n{\r\n static readonly FEATURE_VERTEX_COLOR = 'um_vertexcolor';\r\n constructor() {\r\n super();\r\n }\r\n clone() {\r\n const other = new UnlitMaterial();\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n vertexShader(scope: PBFunctionScope) {\r\n super.vertexShader(scope);\r\n const pb = scope.$builder;\r\n scope.$l.oPos = ShaderHelper.resolveVertexPosition(scope);\r\n scope.$outputs.worldPos = pb.mul(ShaderHelper.getWorldMatrix(scope), pb.vec4(scope.oPos, 1)).xyz;\r\n ShaderHelper.setClipSpacePosition(\r\n scope,\r\n pb.mul(ShaderHelper.getViewProjectionMatrix(scope), pb.vec4(scope.$outputs.worldPos, 1))\r\n );\r\n }\r\n fragmentShader(scope: PBFunctionScope) {\r\n super.fragmentShader(scope);\r\n if (this.
|
|
1
|
+
{"version":3,"file":"unlit.js","sources":["../../src/material/unlit.ts"],"sourcesContent":["import { MeshMaterial, applyMaterialMixins } from './meshmaterial';\r\nimport { mixinAlbedoColor } from './mixins/albedocolor';\r\nimport { mixinVertexColor } from './mixins/vertexcolor';\r\nimport type { PBFunctionScope } from '@zephyr3d/device';\r\nimport { ShaderHelper } from './shader/helper';\r\nimport type { Clonable } from '@zephyr3d/base';\r\n\r\n/**\r\n * Unlit material\r\n * @public\r\n */\r\nexport class UnlitMaterial\r\n extends applyMaterialMixins(MeshMaterial, mixinVertexColor, mixinAlbedoColor)\r\n implements Clonable<UnlitMaterial>\r\n{\r\n static readonly FEATURE_VERTEX_COLOR = 'um_vertexcolor';\r\n constructor() {\r\n super();\r\n }\r\n clone() {\r\n const other = new UnlitMaterial();\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n vertexShader(scope: PBFunctionScope) {\r\n super.vertexShader(scope);\r\n const pb = scope.$builder;\r\n scope.$l.oPos = ShaderHelper.resolveVertexPosition(scope);\r\n scope.$outputs.worldPos = pb.mul(ShaderHelper.getWorldMatrix(scope), pb.vec4(scope.oPos, 1)).xyz;\r\n ShaderHelper.setClipSpacePosition(\r\n scope,\r\n pb.mul(ShaderHelper.getViewProjectionMatrix(scope), pb.vec4(scope.$outputs.worldPos, 1))\r\n );\r\n }\r\n fragmentShader(scope: PBFunctionScope) {\r\n super.fragmentShader(scope);\r\n if (this.needFragmentColorInput()) {\r\n let color = this.calculateAlbedoColor(scope);\r\n if (this.vertexColor) {\r\n color = scope.$builder.mul(color, this.getVertexColor(scope));\r\n }\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, color);\r\n } else {\r\n this.outputFragmentColor(scope, scope.$inputs.worldPos, null);\r\n }\r\n }\r\n}\r\n"],"names":["UnlitMaterial","applyMaterialMixins","MeshMaterial","mixinVertexColor","mixinAlbedoColor","FEATURE_VERTEX_COLOR","clone","other","copyFrom","vertexShader","scope","pb","$builder","$l","oPos","ShaderHelper","resolveVertexPosition","$outputs","worldPos","mul","getWorldMatrix","vec4","xyz","setClipSpacePosition","getViewProjectionMatrix","fragmentShader","needFragmentColorInput","color","calculateAlbedoColor","vertexColor","getVertexColor","outputFragmentColor","$inputs"],"mappings":";;;;;AAOA;;;AAGC,IACM,MAAMA,aACHC,SAAAA,mBAAAA,CAAoBC,cAAcC,gBAAkBC,EAAAA,gBAAAA,CAAAA,CAAAA;AAG5D,IAAA,OAAgBC,uBAAuB,gBAAiB;IACxD,WAAc,EAAA;QACZ,KAAK,EAAA;AACP;IACAC,KAAQ,GAAA;AACN,QAAA,MAAMC,QAAQ,IAAIP,aAAAA,EAAAA;QAClBO,KAAMC,CAAAA,QAAQ,CAAC,IAAI,CAAA;QACnB,OAAOD,KAAAA;AACT;AACAE,IAAAA,YAAAA,CAAaC,KAAsB,EAAE;AACnC,QAAA,KAAK,CAACD,YAAaC,CAAAA,KAAAA,CAAAA;QACnB,MAAMC,EAAAA,GAAKD,MAAME,QAAQ;AACzBF,QAAAA,KAAAA,CAAMG,EAAE,CAACC,IAAI,GAAGC,YAAAA,CAAaC,qBAAqB,CAACN,KAAAA,CAAAA;AACnDA,QAAAA,KAAAA,CAAMO,QAAQ,CAACC,QAAQ,GAAGP,EAAGQ,CAAAA,GAAG,CAACJ,YAAaK,CAAAA,cAAc,CAACV,KAAAA,CAAAA,EAAQC,GAAGU,IAAI,CAACX,MAAMI,IAAI,EAAE,IAAIQ,GAAG;AAChGP,QAAAA,YAAAA,CAAaQ,oBAAoB,CAC/Bb,KAAAA,EACAC,EAAGQ,CAAAA,GAAG,CAACJ,YAAaS,CAAAA,uBAAuB,CAACd,KAAAA,CAAAA,EAAQC,GAAGU,IAAI,CAACX,MAAMO,QAAQ,CAACC,QAAQ,EAAE,CAAA,CAAA,CAAA,CAAA;AAEzF;AACAO,IAAAA,cAAAA,CAAef,KAAsB,EAAE;AACrC,QAAA,KAAK,CAACe,cAAef,CAAAA,KAAAA,CAAAA;QACrB,IAAI,IAAI,CAACgB,sBAAsB,EAAI,EAAA;AACjC,YAAA,IAAIC,KAAQ,GAAA,IAAI,CAACC,oBAAoB,CAAClB,KAAAA,CAAAA;YACtC,IAAI,IAAI,CAACmB,WAAW,EAAE;gBACpBF,KAAQjB,GAAAA,KAAAA,CAAME,QAAQ,CAACO,GAAG,CAACQ,KAAO,EAAA,IAAI,CAACG,cAAc,CAACpB,KAAAA,CAAAA,CAAAA;AACxD;YACA,IAAI,CAACqB,mBAAmB,CAACrB,KAAAA,EAAOA,MAAMsB,OAAO,CAACd,QAAQ,EAAES,KAAAA,CAAAA;SACnD,MAAA;YACL,IAAI,CAACI,mBAAmB,CAACrB,KAAAA,EAAOA,MAAMsB,OAAO,CAACd,QAAQ,EAAE,IAAA,CAAA;AAC1D;AACF;AACF;;;;"}
|
|
@@ -83,19 +83,30 @@ import { DRef } from '@zephyr3d/base';
|
|
|
83
83
|
const device = ctx.device;
|
|
84
84
|
this._textureFormat = ctx.camera.HDR && device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';
|
|
85
85
|
this._finalFramebuffer = device.getFramebuffer();
|
|
86
|
-
const ssr = !!(ctx.materialFlags & MaterialVaryingFlags.SSR_STORE_ROUGHNESS);
|
|
87
86
|
if (this._postEffects.every((list)=>list.length === 0)) {
|
|
88
87
|
return;
|
|
89
88
|
}
|
|
90
89
|
const depth = this._finalFramebuffer?.getDepthAttachment();
|
|
91
90
|
const w = depth ? depth.width : device.getDrawingBufferWidth();
|
|
92
91
|
const h = depth ? depth.height : device.getDrawingBufferHeight();
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
ctx.SSRNormalTexture
|
|
98
|
-
|
|
92
|
+
const attachments = [
|
|
93
|
+
this._textureFormat
|
|
94
|
+
];
|
|
95
|
+
if (ctx.materialFlags & MaterialVaryingFlags.SSR_STORE_ROUGHNESS) {
|
|
96
|
+
attachments.push(ctx.SSRRoughnessTexture, ctx.SSRNormalTexture);
|
|
97
|
+
} else if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_NORMAL) {
|
|
98
|
+
attachments.push(ctx.SSRNormalTexture);
|
|
99
|
+
}
|
|
100
|
+
if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_PROFILE) {
|
|
101
|
+
attachments.push(ctx.SSSProfileTexture, ctx.SSSParamTexture);
|
|
102
|
+
}
|
|
103
|
+
if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_DIFFUSE) {
|
|
104
|
+
attachments.push(ctx.SSSDiffuseTexture);
|
|
105
|
+
}
|
|
106
|
+
if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_TRANSMISSION) {
|
|
107
|
+
attachments.push(ctx.SSSTransmissionTexture);
|
|
108
|
+
}
|
|
109
|
+
const tmpFramebuffer = device.pool.fetchTemporalFramebuffer(true, w, h, attachments.length === 1 ? attachments[0] : attachments, depth ?? ctx.depthFormat);
|
|
99
110
|
device.setFramebuffer(tmpFramebuffer);
|
|
100
111
|
}
|
|
101
112
|
/** @internal */ drawPostEffects(ctx, layer, sceneDepthTexture) {
|
|
@@ -116,14 +127,23 @@ import { DRef } from '@zephyr3d/base';
|
|
|
116
127
|
}
|
|
117
128
|
const isLast = this.isLastPostEffect(layer, i);
|
|
118
129
|
const finalEffect = isLast && (!postEffect.requireDepthAttachment(ctx) || !!this._finalFramebuffer);
|
|
130
|
+
let singleColorFramebuffer = null;
|
|
119
131
|
if (finalEffect) {
|
|
120
|
-
|
|
132
|
+
singleColorFramebuffer = this.createSingleColorFramebuffer(device, this._finalFramebuffer, postEffect.requireDepthAttachment(ctx));
|
|
133
|
+
device.setFramebuffer(singleColorFramebuffer ?? this._finalFramebuffer);
|
|
121
134
|
} else {
|
|
122
135
|
this._prevFrameBuffer = device.pool.fetchTemporalFramebuffer(false, inputFramebuffer.getWidth(), inputFramebuffer.getHeight(), this._textureFormat, inputFramebuffer.getDepthAttachment() ?? null);
|
|
123
136
|
device.setFramebuffer(this._prevFrameBuffer);
|
|
124
137
|
}
|
|
125
138
|
const inputColorTexture = tmpTexture ?? inputTexture;
|
|
126
|
-
|
|
139
|
+
try {
|
|
140
|
+
postEffect.apply(ctx, inputColorTexture, sceneDepthTexture, !device.getFramebuffer());
|
|
141
|
+
} finally{
|
|
142
|
+
if (singleColorFramebuffer) {
|
|
143
|
+
device.setFramebuffer(this._finalFramebuffer);
|
|
144
|
+
device.pool.releaseFrameBuffer(singleColorFramebuffer);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
127
147
|
if (this._prevInputTexture) {
|
|
128
148
|
device.pool.releaseTexture(this._prevInputTexture);
|
|
129
149
|
this._prevInputTexture = null;
|
|
@@ -140,10 +160,18 @@ import { DRef } from '@zephyr3d/base';
|
|
|
140
160
|
const device = ctx.device;
|
|
141
161
|
if (device.getFramebuffer() !== this._finalFramebuffer) {
|
|
142
162
|
const srcTex = device.getFramebuffer().getColorAttachments()[0];
|
|
143
|
-
|
|
163
|
+
const singleColorFramebuffer = this.createSingleColorFramebuffer(device, this._finalFramebuffer, false);
|
|
164
|
+
device.setFramebuffer(singleColorFramebuffer ?? this._finalFramebuffer);
|
|
144
165
|
device.setViewport(null);
|
|
145
166
|
device.setScissor(null);
|
|
146
|
-
|
|
167
|
+
try {
|
|
168
|
+
Compositor._blit(device, srcTex, !this._finalFramebuffer);
|
|
169
|
+
} finally{
|
|
170
|
+
if (singleColorFramebuffer) {
|
|
171
|
+
device.setFramebuffer(this._finalFramebuffer);
|
|
172
|
+
device.pool.releaseFrameBuffer(singleColorFramebuffer);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
147
175
|
}
|
|
148
176
|
if (this._prevInputTexture) {
|
|
149
177
|
device.pool.releaseTexture(this._prevInputTexture);
|
|
@@ -165,6 +193,13 @@ import { DRef } from '@zephyr3d/base';
|
|
|
165
193
|
}
|
|
166
194
|
return true;
|
|
167
195
|
}
|
|
196
|
+
/** @internal */ createSingleColorFramebuffer(device, framebuffer, withDepth) {
|
|
197
|
+
const colorAttachment = framebuffer?.getColorAttachments()[0] ?? null;
|
|
198
|
+
if (!framebuffer || framebuffer.getColorAttachments().length <= 1 || !colorAttachment) {
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
return device.pool.fetchTemporalFramebuffer(false, 0, 0, colorAttachment, withDepth ? framebuffer.getDepthAttachment() : null, false);
|
|
202
|
+
}
|
|
168
203
|
/** @internal */ static _blit(device, srcTex, srgbOutput) {
|
|
169
204
|
if (!this._blitProgram) {
|
|
170
205
|
this._blitProgram = device.buildRenderProgram({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compositor.js","sources":["../../src/posteffect/compositor.ts"],"sourcesContent":["import { linearToGamma } from '../shaders/misc';\r\nimport type { DrawContext } from '../render';\r\nimport type {\r\n AbstractDevice,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUProgram,\r\n RenderStateSet,\r\n Texture2D,\r\n TextureFormat,\r\n VertexLayout\r\n} from '@zephyr3d/device';\r\nimport type { AbstractPostEffect } from './posteffect';\r\nimport { PostEffectLayer } from './posteffect';\r\nimport { MaterialVaryingFlags } from '../values';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { DRef } from '@zephyr3d/base';\r\n\r\n/**\r\n * Posteffect rendering context\r\n * @public\r\n */\r\nexport interface CompositorContext {\r\n pingpongFramebuffers: FrameBuffer[];\r\n finalFramebuffer: FrameBuffer;\r\n writeIndex: number;\r\n}\r\n/**\r\n * Post processing compositor\r\n * @public\r\n */\r\nexport class Compositor {\r\n /** @internal */\r\n protected _postEffects: DRef<AbstractPostEffect>[][];\r\n /** @internal */\r\n private _finalFramebuffer: Nullable<FrameBuffer>;\r\n /** @internal */\r\n private _prevInputTexture: Nullable<Texture2D>;\r\n /** @internal */\r\n private _prevFrameBuffer: Nullable<FrameBuffer>;\r\n /** @internal */\r\n private _textureFormat: TextureFormat;\r\n /** @internal */\r\n private static _blitProgram: Nullable<GPUProgram> = null;\r\n /** @internal */\r\n private static _blitBindgroup: Nullable<BindGroup> = null;\r\n /** @internal */\r\n private static _blitRenderStates: Nullable<RenderStateSet> = null;\r\n /** @internal */\r\n private static _blitVertexLayout: Nullable<VertexLayout> = null;\r\n /**\r\n * Creates an instance of Compositor\r\n */\r\n constructor() {\r\n this._postEffects = [];\r\n this._postEffects[PostEffectLayer.opaque] = [];\r\n this._postEffects[PostEffectLayer.transparent] = [];\r\n this._postEffects[PostEffectLayer.end] = [];\r\n this._finalFramebuffer = null;\r\n this._prevInputTexture = null;\r\n this._prevFrameBuffer = null;\r\n this._textureFormat = 'rgba16f';\r\n }\r\n /** @internal */\r\n requireLinearDepth(ctx: DrawContext) {\r\n for (const list of this._postEffects) {\r\n for (const postEffect of list) {\r\n if (postEffect.get()!.requireLinearDepthTexture(ctx)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n /**\r\n * Adds a posteffect\r\n *\r\n * @param postEffect - The post effect to add\r\n * @param opaque - true if the post effect should be applied after the opaque pass and before the transparent pass, otherwise the post effect should be applied after the transparent pass\r\n */\r\n appendPostEffect(postEffect: AbstractPostEffect) {\r\n if (postEffect) {\r\n for (const list of this._postEffects) {\r\n if (list.findIndex((val) => val.get() === postEffect) >= 0) {\r\n console.error(`Posteffect cannot be added to same compositor multiple times`);\r\n return;\r\n }\r\n }\r\n this._postEffects[postEffect.layer].push(new DRef(postEffect));\r\n }\r\n }\r\n /**\r\n * Removes a posteffect that was previously added\r\n *\r\n * @param postEffect - The posteffect to be remove.\r\n */\r\n removePostEffect(postEffect: AbstractPostEffect) {\r\n for (const list of this._postEffects) {\r\n const index = list.findIndex((val) => val.get() === postEffect);\r\n if (index >= 0) {\r\n list[index].dispose();\r\n list.splice(index, 1);\r\n return;\r\n }\r\n }\r\n }\r\n /**\r\n * Removes all post effects\r\n */\r\n clear() {\r\n for (const list of this._postEffects) {\r\n for (const p of list) {\r\n p.dispose();\r\n }\r\n list.splice(0, list.length);\r\n }\r\n }\r\n /** @internal */\r\n begin(ctx: DrawContext) {\r\n const device = ctx.device;\r\n this._textureFormat =\r\n ctx.camera.HDR && device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer\r\n ? 'rgba16f'\r\n : 'rgba8unorm';\r\n this._finalFramebuffer = device.getFramebuffer();\r\n const ssr = !!(ctx.materialFlags & MaterialVaryingFlags.SSR_STORE_ROUGHNESS);\r\n if (this._postEffects.every((list) => list.length === 0)) {\r\n return;\r\n }\r\n const depth = this._finalFramebuffer?.getDepthAttachment() as Texture2D;\r\n const w = depth ? depth.width : device.getDrawingBufferWidth();\r\n const h = depth ? depth.height : device.getDrawingBufferHeight();\r\n //const fmt2: TextureFormat = ssr ? (device.type === 'webgl' ? format : 'rgba8unorm') : format;\r\n const tmpFramebuffer = device.pool.fetchTemporalFramebuffer(\r\n true,\r\n w,\r\n h,\r\n ssr ? [this._textureFormat, ctx.SSRRoughnessTexture, ctx.SSRNormalTexture] : this._textureFormat,\r\n depth ?? ctx.depthFormat\r\n );\r\n device.setFramebuffer(tmpFramebuffer);\r\n }\r\n /** @internal */\r\n drawPostEffects(ctx: DrawContext, layer: PostEffectLayer, sceneDepthTexture: Texture2D) {\r\n const postEffects = this._postEffects[layer];\r\n if (postEffects.length > 0) {\r\n const device = ctx.device;\r\n const inputFramebuffer = device.getFramebuffer()!;\r\n const inputTexture = inputFramebuffer!.getColorAttachments()[0] as Texture2D;\r\n let tmpTexture: Nullable<Texture2D> = null;\r\n for (let i = 0; i < postEffects.length; i++) {\r\n const postEffect = postEffects[i].get()!;\r\n if (!postEffect.enabled) {\r\n continue;\r\n }\r\n if (this._prevFrameBuffer) {\r\n device.pool.releaseFrameBuffer(this._prevFrameBuffer);\r\n this._prevFrameBuffer = null;\r\n }\r\n const isLast = this.isLastPostEffect(layer, i);\r\n const finalEffect = isLast && (!postEffect.requireDepthAttachment(ctx) || !!this._finalFramebuffer);\r\n if (finalEffect) {\r\n device.setFramebuffer(this._finalFramebuffer);\r\n } else {\r\n this._prevFrameBuffer = device.pool.fetchTemporalFramebuffer(\r\n false,\r\n inputFramebuffer.getWidth(),\r\n inputFramebuffer.getHeight(),\r\n this._textureFormat,\r\n inputFramebuffer.getDepthAttachment() ?? null\r\n );\r\n device.setFramebuffer(this._prevFrameBuffer);\r\n }\r\n const inputColorTexture = tmpTexture ?? inputTexture;\r\n postEffect.apply(ctx, inputColorTexture, sceneDepthTexture, !device.getFramebuffer());\r\n if (this._prevInputTexture) {\r\n device.pool.releaseTexture(this._prevInputTexture);\r\n this._prevInputTexture = null;\r\n }\r\n if (this._prevFrameBuffer) {\r\n tmpTexture = this._prevFrameBuffer.getColorAttachments()[0] as Texture2D;\r\n device.pool.retainTexture(tmpTexture);\r\n this._prevInputTexture = tmpTexture;\r\n }\r\n }\r\n }\r\n }\r\n /** @internal */\r\n end(ctx: DrawContext) {\r\n const device = ctx.device;\r\n if (device.getFramebuffer() !== this._finalFramebuffer) {\r\n const srcTex = device.getFramebuffer()!.getColorAttachments()[0] as Texture2D;\r\n device.setFramebuffer(this._finalFramebuffer);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n Compositor._blit(device, srcTex, !this._finalFramebuffer);\r\n }\r\n if (this._prevInputTexture) {\r\n device.pool.releaseTexture(this._prevInputTexture);\r\n this._prevInputTexture = null;\r\n }\r\n if (this._prevFrameBuffer) {\r\n device.pool.releaseFrameBuffer(this._prevFrameBuffer);\r\n this._prevFrameBuffer = null;\r\n }\r\n }\r\n /** @internal */\r\n private isLastPostEffect(layer: PostEffectLayer, index: number) {\r\n for (let i = layer; i < this._postEffects.length; i++) {\r\n const start = i === layer ? index + 1 : 0;\r\n for (let j = start; j < this._postEffects[i].length; j++) {\r\n if (this._postEffects[i][j].get()!.enabled) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n /** @internal */\r\n static _blit(device: AbstractDevice, srcTex: Texture2D, srgbOutput: boolean) {\r\n if (!this._blitProgram) {\r\n this._blitProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n this.flip = pb.int().uniform(0);\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.srcTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.srgbOutput = pb.int().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$outputs.outColor = pb.textureSample(this.srcTex, this.$inputs.uv);\r\n this.$if(pb.notEqual(this.srgbOutput, 0), function () {\r\n this.$outputs.outColor = pb.vec4(linearToGamma(this, this.$outputs.outColor.rgb), 1);\r\n });\r\n });\r\n }\r\n })!;\r\n this._blitProgram.name = '@Compositor_blit';\r\n this._blitBindgroup = device.createBindGroup(this._blitProgram.bindGroupLayouts[0]);\r\n this._blitVertexLayout = device.createVertexLayout({\r\n vertexBuffers: [\r\n {\r\n buffer: device.createVertexBuffer(\r\n 'position_f32x2',\r\n new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1])\r\n )!\r\n }\r\n ]\r\n });\r\n this._blitRenderStates = device.createRenderStateSet();\r\n this._blitRenderStates.useRasterizerState().setCullMode('none');\r\n this._blitRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n }\r\n this._blitBindgroup!.setTexture('srcTex', srcTex, fetchSampler('clamp_nearest_nomip'));\r\n this._blitBindgroup!.setValue('srgbOutput', srgbOutput ? 1 : 0);\r\n this._blitBindgroup!.setValue('flip', device.type === 'webgpu' && !!device.getFramebuffer() ? 1 : 0);\r\n device.setRenderStates(this._blitRenderStates);\r\n device.setProgram(this._blitProgram);\r\n device.setBindGroup(0, this._blitBindgroup!);\r\n device.setVertexLayout(this._blitVertexLayout);\r\n device.draw('triangle-strip', 0, 4);\r\n }\r\n}\r\n"],"names":["Compositor","_blitProgram","_blitBindgroup","_blitRenderStates","_blitVertexLayout","_postEffects","PostEffectLayer","opaque","transparent","end","_finalFramebuffer","_prevInputTexture","_prevFrameBuffer","_textureFormat","requireLinearDepth","ctx","list","postEffect","get","requireLinearDepthTexture","appendPostEffect","findIndex","val","console","error","layer","push","DRef","removePostEffect","index","dispose","splice","clear","p","length","begin","device","camera","HDR","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","getFramebuffer","ssr","materialFlags","MaterialVaryingFlags","SSR_STORE_ROUGHNESS","every","depth","getDepthAttachment","w","width","getDrawingBufferWidth","h","height","getDrawingBufferHeight","tmpFramebuffer","pool","fetchTemporalFramebuffer","SSRRoughnessTexture","SSRNormalTexture","depthFormat","setFramebuffer","drawPostEffects","sceneDepthTexture","postEffects","inputFramebuffer","inputTexture","getColorAttachments","tmpTexture","i","enabled","releaseFrameBuffer","isLast","isLastPostEffect","finalEffect","requireDepthAttachment","getWidth","getHeight","inputColorTexture","apply","releaseTexture","retainTexture","srcTex","setViewport","setScissor","_blit","start","j","srgbOutput","buildRenderProgram","vertex","pb","$inputs","pos","vec2","attrib","$outputs","uv","flip","int","uniform","main","$builtins","position","vec4","add","mul","xy","$if","notEqual","y","neg","fragment","tex2D","sampleType","outColor","textureSample","linearToGamma","rgb","name","createBindGroup","bindGroupLayouts","createVertexLayout","vertexBuffers","buffer","createVertexBuffer","Float32Array","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","setTexture","fetchSampler","setValue","type","setRenderStates","setProgram","setBindGroup","setVertexLayout","draw"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"compositor.js","sources":["../../src/posteffect/compositor.ts"],"sourcesContent":["import { linearToGamma } from '../shaders/misc';\r\nimport type { DrawContext } from '../render';\r\nimport type {\r\n AbstractDevice,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUProgram,\r\n RenderStateSet,\r\n Texture2D,\r\n TextureFormat,\r\n VertexLayout\r\n} from '@zephyr3d/device';\r\nimport type { AbstractPostEffect } from './posteffect';\r\nimport { PostEffectLayer } from './posteffect';\r\nimport { MaterialVaryingFlags } from '../values';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { DRef } from '@zephyr3d/base';\r\n\r\n/**\r\n * Posteffect rendering context\r\n * @public\r\n */\r\nexport interface CompositorContext {\r\n pingpongFramebuffers: FrameBuffer[];\r\n finalFramebuffer: FrameBuffer;\r\n writeIndex: number;\r\n}\r\n/**\r\n * Post processing compositor\r\n * @public\r\n */\r\nexport class Compositor {\r\n /** @internal */\r\n protected _postEffects: DRef<AbstractPostEffect>[][];\r\n /** @internal */\r\n private _finalFramebuffer: Nullable<FrameBuffer>;\r\n /** @internal */\r\n private _prevInputTexture: Nullable<Texture2D>;\r\n /** @internal */\r\n private _prevFrameBuffer: Nullable<FrameBuffer>;\r\n /** @internal */\r\n private _textureFormat: TextureFormat;\r\n /** @internal */\r\n private static _blitProgram: Nullable<GPUProgram> = null;\r\n /** @internal */\r\n private static _blitBindgroup: Nullable<BindGroup> = null;\r\n /** @internal */\r\n private static _blitRenderStates: Nullable<RenderStateSet> = null;\r\n /** @internal */\r\n private static _blitVertexLayout: Nullable<VertexLayout> = null;\r\n /**\r\n * Creates an instance of Compositor\r\n */\r\n constructor() {\r\n this._postEffects = [];\r\n this._postEffects[PostEffectLayer.opaque] = [];\r\n this._postEffects[PostEffectLayer.transparent] = [];\r\n this._postEffects[PostEffectLayer.end] = [];\r\n this._finalFramebuffer = null;\r\n this._prevInputTexture = null;\r\n this._prevFrameBuffer = null;\r\n this._textureFormat = 'rgba16f';\r\n }\r\n /** @internal */\r\n requireLinearDepth(ctx: DrawContext) {\r\n for (const list of this._postEffects) {\r\n for (const postEffect of list) {\r\n if (postEffect.get()!.requireLinearDepthTexture(ctx)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n /**\r\n * Adds a posteffect\r\n *\r\n * @param postEffect - The post effect to add\r\n * @param opaque - true if the post effect should be applied after the opaque pass and before the transparent pass, otherwise the post effect should be applied after the transparent pass\r\n */\r\n appendPostEffect(postEffect: AbstractPostEffect) {\r\n if (postEffect) {\r\n for (const list of this._postEffects) {\r\n if (list.findIndex((val) => val.get() === postEffect) >= 0) {\r\n console.error(`Posteffect cannot be added to same compositor multiple times`);\r\n return;\r\n }\r\n }\r\n this._postEffects[postEffect.layer].push(new DRef(postEffect));\r\n }\r\n }\r\n /**\r\n * Removes a posteffect that was previously added\r\n *\r\n * @param postEffect - The posteffect to be remove.\r\n */\r\n removePostEffect(postEffect: AbstractPostEffect) {\r\n for (const list of this._postEffects) {\r\n const index = list.findIndex((val) => val.get() === postEffect);\r\n if (index >= 0) {\r\n list[index].dispose();\r\n list.splice(index, 1);\r\n return;\r\n }\r\n }\r\n }\r\n /**\r\n * Removes all post effects\r\n */\r\n clear() {\r\n for (const list of this._postEffects) {\r\n for (const p of list) {\r\n p.dispose();\r\n }\r\n list.splice(0, list.length);\r\n }\r\n }\r\n /** @internal */\r\n begin(ctx: DrawContext) {\r\n const device = ctx.device;\r\n this._textureFormat =\r\n ctx.camera.HDR && device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer\r\n ? 'rgba16f'\r\n : 'rgba8unorm';\r\n this._finalFramebuffer = device.getFramebuffer();\r\n if (this._postEffects.every((list) => list.length === 0)) {\r\n return;\r\n }\r\n const depth = this._finalFramebuffer?.getDepthAttachment() as Texture2D;\r\n const w = depth ? depth.width : device.getDrawingBufferWidth();\r\n const h = depth ? depth.height : device.getDrawingBufferHeight();\r\n const attachments: any[] = [this._textureFormat];\r\n if (ctx.materialFlags & MaterialVaryingFlags.SSR_STORE_ROUGHNESS) {\r\n attachments.push(ctx.SSRRoughnessTexture!, ctx.SSRNormalTexture!);\r\n } else if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_NORMAL) {\r\n attachments.push(ctx.SSRNormalTexture!);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_PROFILE) {\r\n attachments.push(ctx.SSSProfileTexture!, ctx.SSSParamTexture!);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_DIFFUSE) {\r\n attachments.push(ctx.SSSDiffuseTexture!);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_TRANSMISSION) {\r\n attachments.push(ctx.SSSTransmissionTexture!);\r\n }\r\n const tmpFramebuffer = device.pool.fetchTemporalFramebuffer(\r\n true,\r\n w,\r\n h,\r\n attachments.length === 1 ? attachments[0] : attachments,\r\n depth ?? ctx.depthFormat\r\n );\r\n device.setFramebuffer(tmpFramebuffer);\r\n }\r\n /** @internal */\r\n drawPostEffects(ctx: DrawContext, layer: PostEffectLayer, sceneDepthTexture: Texture2D) {\r\n const postEffects = this._postEffects[layer];\r\n if (postEffects.length > 0) {\r\n const device = ctx.device;\r\n const inputFramebuffer = device.getFramebuffer()!;\r\n const inputTexture = inputFramebuffer!.getColorAttachments()[0] as Texture2D;\r\n let tmpTexture: Nullable<Texture2D> = null;\r\n for (let i = 0; i < postEffects.length; i++) {\r\n const postEffect = postEffects[i].get()!;\r\n if (!postEffect.enabled) {\r\n continue;\r\n }\r\n if (this._prevFrameBuffer) {\r\n device.pool.releaseFrameBuffer(this._prevFrameBuffer);\r\n this._prevFrameBuffer = null;\r\n }\r\n const isLast = this.isLastPostEffect(layer, i);\r\n const finalEffect = isLast && (!postEffect.requireDepthAttachment(ctx) || !!this._finalFramebuffer);\r\n let singleColorFramebuffer: Nullable<FrameBuffer> = null;\r\n if (finalEffect) {\r\n singleColorFramebuffer = this.createSingleColorFramebuffer(\r\n device,\r\n this._finalFramebuffer,\r\n postEffect.requireDepthAttachment(ctx)\r\n );\r\n device.setFramebuffer(singleColorFramebuffer ?? this._finalFramebuffer);\r\n } else {\r\n this._prevFrameBuffer = device.pool.fetchTemporalFramebuffer(\r\n false,\r\n inputFramebuffer.getWidth(),\r\n inputFramebuffer.getHeight(),\r\n this._textureFormat,\r\n inputFramebuffer.getDepthAttachment() ?? null\r\n );\r\n device.setFramebuffer(this._prevFrameBuffer);\r\n }\r\n const inputColorTexture = tmpTexture ?? inputTexture;\r\n try {\r\n postEffect.apply(ctx, inputColorTexture, sceneDepthTexture, !device.getFramebuffer());\r\n } finally {\r\n if (singleColorFramebuffer) {\r\n device.setFramebuffer(this._finalFramebuffer);\r\n device.pool.releaseFrameBuffer(singleColorFramebuffer);\r\n }\r\n }\r\n if (this._prevInputTexture) {\r\n device.pool.releaseTexture(this._prevInputTexture);\r\n this._prevInputTexture = null;\r\n }\r\n if (this._prevFrameBuffer) {\r\n tmpTexture = this._prevFrameBuffer.getColorAttachments()[0] as Texture2D;\r\n device.pool.retainTexture(tmpTexture);\r\n this._prevInputTexture = tmpTexture;\r\n }\r\n }\r\n }\r\n }\r\n /** @internal */\r\n end(ctx: DrawContext) {\r\n const device = ctx.device;\r\n if (device.getFramebuffer() !== this._finalFramebuffer) {\r\n const srcTex = device.getFramebuffer()!.getColorAttachments()[0] as Texture2D;\r\n const singleColorFramebuffer = this.createSingleColorFramebuffer(device, this._finalFramebuffer, false);\r\n device.setFramebuffer(singleColorFramebuffer ?? this._finalFramebuffer);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n try {\r\n Compositor._blit(device, srcTex, !this._finalFramebuffer);\r\n } finally {\r\n if (singleColorFramebuffer) {\r\n device.setFramebuffer(this._finalFramebuffer);\r\n device.pool.releaseFrameBuffer(singleColorFramebuffer);\r\n }\r\n }\r\n }\r\n if (this._prevInputTexture) {\r\n device.pool.releaseTexture(this._prevInputTexture);\r\n this._prevInputTexture = null;\r\n }\r\n if (this._prevFrameBuffer) {\r\n device.pool.releaseFrameBuffer(this._prevFrameBuffer);\r\n this._prevFrameBuffer = null;\r\n }\r\n }\r\n /** @internal */\r\n private isLastPostEffect(layer: PostEffectLayer, index: number) {\r\n for (let i = layer; i < this._postEffects.length; i++) {\r\n const start = i === layer ? index + 1 : 0;\r\n for (let j = start; j < this._postEffects[i].length; j++) {\r\n if (this._postEffects[i][j].get()!.enabled) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n /** @internal */\r\n private createSingleColorFramebuffer(\r\n device: AbstractDevice,\r\n framebuffer: Nullable<FrameBuffer>,\r\n withDepth: boolean\r\n ) {\r\n const colorAttachment = framebuffer?.getColorAttachments()[0] ?? null;\r\n if (!framebuffer || framebuffer.getColorAttachments().length <= 1 || !colorAttachment) {\r\n return null;\r\n }\r\n return device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n colorAttachment,\r\n withDepth ? framebuffer.getDepthAttachment() : null,\r\n false\r\n );\r\n }\r\n /** @internal */\r\n static _blit(device: AbstractDevice, srcTex: Texture2D, srgbOutput: boolean) {\r\n if (!this._blitProgram) {\r\n this._blitProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n this.flip = pb.int().uniform(0);\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.srcTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.srgbOutput = pb.int().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$outputs.outColor = pb.textureSample(this.srcTex, this.$inputs.uv);\r\n this.$if(pb.notEqual(this.srgbOutput, 0), function () {\r\n this.$outputs.outColor = pb.vec4(linearToGamma(this, this.$outputs.outColor.rgb), 1);\r\n });\r\n });\r\n }\r\n })!;\r\n this._blitProgram.name = '@Compositor_blit';\r\n this._blitBindgroup = device.createBindGroup(this._blitProgram.bindGroupLayouts[0]);\r\n this._blitVertexLayout = device.createVertexLayout({\r\n vertexBuffers: [\r\n {\r\n buffer: device.createVertexBuffer(\r\n 'position_f32x2',\r\n new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1])\r\n )!\r\n }\r\n ]\r\n });\r\n this._blitRenderStates = device.createRenderStateSet();\r\n this._blitRenderStates.useRasterizerState().setCullMode('none');\r\n this._blitRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n }\r\n this._blitBindgroup!.setTexture('srcTex', srcTex, fetchSampler('clamp_nearest_nomip'));\r\n this._blitBindgroup!.setValue('srgbOutput', srgbOutput ? 1 : 0);\r\n this._blitBindgroup!.setValue('flip', device.type === 'webgpu' && !!device.getFramebuffer() ? 1 : 0);\r\n device.setRenderStates(this._blitRenderStates);\r\n device.setProgram(this._blitProgram);\r\n device.setBindGroup(0, this._blitBindgroup!);\r\n device.setVertexLayout(this._blitVertexLayout);\r\n device.draw('triangle-strip', 0, 4);\r\n }\r\n}\r\n"],"names":["Compositor","_blitProgram","_blitBindgroup","_blitRenderStates","_blitVertexLayout","_postEffects","PostEffectLayer","opaque","transparent","end","_finalFramebuffer","_prevInputTexture","_prevFrameBuffer","_textureFormat","requireLinearDepth","ctx","list","postEffect","get","requireLinearDepthTexture","appendPostEffect","findIndex","val","console","error","layer","push","DRef","removePostEffect","index","dispose","splice","clear","p","length","begin","device","camera","HDR","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","getFramebuffer","every","depth","getDepthAttachment","w","width","getDrawingBufferWidth","h","height","getDrawingBufferHeight","attachments","materialFlags","MaterialVaryingFlags","SSR_STORE_ROUGHNESS","SSRRoughnessTexture","SSRNormalTexture","SSS_STORE_NORMAL","SSS_STORE_PROFILE","SSSProfileTexture","SSSParamTexture","SSS_STORE_DIFFUSE","SSSDiffuseTexture","SSS_STORE_TRANSMISSION","SSSTransmissionTexture","tmpFramebuffer","pool","fetchTemporalFramebuffer","depthFormat","setFramebuffer","drawPostEffects","sceneDepthTexture","postEffects","inputFramebuffer","inputTexture","getColorAttachments","tmpTexture","i","enabled","releaseFrameBuffer","isLast","isLastPostEffect","finalEffect","requireDepthAttachment","singleColorFramebuffer","createSingleColorFramebuffer","getWidth","getHeight","inputColorTexture","apply","releaseTexture","retainTexture","srcTex","setViewport","setScissor","_blit","start","j","framebuffer","withDepth","colorAttachment","srgbOutput","buildRenderProgram","vertex","pb","$inputs","pos","vec2","attrib","$outputs","uv","flip","int","uniform","main","$builtins","position","vec4","add","mul","xy","$if","notEqual","y","neg","fragment","tex2D","sampleType","outColor","textureSample","linearToGamma","rgb","name","createBindGroup","bindGroupLayouts","createVertexLayout","vertexBuffers","buffer","createVertexBuffer","Float32Array","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","setTexture","fetchSampler","setValue","type","setRenderStates","setProgram","setBindGroup","setVertexLayout","draw"],"mappings":"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"}
|