use concinnity_core::gfx::render_types::{
FogFroxelParams, FogParams, RtGeomEntry, RtParams, ShadowUniforms,
};
use concinnity_render::uniforms::{
GlassMeshParams, GlassParams, ProbeSet, ProbeUniforms, TransparentView, WaterParams,
WaterWaveGpu,
};
use crate::shader_layout::mirror::{Case, everywhere, mirror, on};
use crate::shader_layout::programs::Target;
const VULKAN_AND_DIRECTX: &[Target] = &[Target::Vulkan, Target::DirectX];
pub(in crate::shader_layout) fn glass() -> Vec<Case> {
vec![
everywhere(mirror!(TransparentView => "TransparentView" {
vp,
inv_vp,
camera_pos,
viewport,
time,
prefilter_mip_count,
})),
everywhere(mirror!(GlassParams => "GlassParams" {
centre,
normal,
tint,
opacity,
refraction_strength,
fresnel_power,
planar,
})),
everywhere(mirror!(ProbeUniforms => "ProbeUniforms" { box_min, box_max, probe_pos, })),
everywhere(mirror!(ProbeSet => "ProbeSet" {
count,
[_pad] => ["_pad0", "_pad1", "_pad2"],
probes,
})),
]
}
pub(in crate::shader_layout) fn glass_mesh() -> Vec<Case> {
vec![
everywhere(mirror!(TransparentView => "TransparentView" {
vp,
inv_vp,
camera_pos,
viewport,
time,
prefilter_mip_count,
})),
everywhere(mirror!(GlassMeshParams => "GlassMeshParams" {
model,
tint,
opacity,
refraction_strength,
fresnel_power,
prefilter_mip_count,
})),
]
}
pub(in crate::shader_layout) fn water() -> Vec<Case> {
vec![
everywhere(mirror!(TransparentView => "TransparentView" {
vp,
inv_vp,
camera_pos,
viewport,
time,
prefilter_mip_count,
})),
everywhere(mirror!(WaterWaveGpu => "WaterWave" { dir_amp_wave, speed_steep_pad, })),
everywhere(mirror!(WaterParams => "WaterParams" {
centre,
deep_colour,
shallow_colour,
depth_falloff,
foam_width,
foam_intensity,
fresnel_power,
roughness,
refraction_strength,
wave_count,
_pad,
waves,
planar,
})),
]
}
pub(in crate::shader_layout) fn rt_reflections() -> Vec<Case> {
vec![
on(
VULKAN_AND_DIRECTX,
mirror!(RtParams => "RtParams" {
intensity,
max_distance,
tan_half_fov_y,
aspect,
prefilter_mip_count,
_pad0,
_pad1,
_pad2,
cam_pos,
sun_dir,
sun_color,
inv_view,
}),
),
on(
VULKAN_AND_DIRECTX,
mirror!(RtGeomEntry => "RtGeomEntry" {
index_offset,
base_vertex,
albedo_index,
normal_index,
[tint] => ["tint_r", "tint_g", "tint_b"],
roughness,
metallic,
[emissive] => ["emissive_r", "emissive_g", "emissive_b"],
model,
emissive_map_index,
[_pad] => ["_pad0", "_pad1", "_pad2"],
}),
),
]
}
pub(in crate::shader_layout) fn fog() -> Vec<Case> {
vec![
everywhere(mirror!(FogParams => "FogParams" {
inv_vp,
color,
[cam_pos, _pad0] => ["cam_pos"],
[sun_dir, _pad1] => ["sun_dir"],
[sun_color, _pad2] => ["sun_color"],
density,
height_falloff,
height_reference,
max_distance,
phase_g,
ambient,
viewport,
inv_max_distance,
[_pad3] => ["_pad3a", "_pad3b", "_pad3c"],
})),
everywhere(mirror!(FogFroxelParams => "FogFroxelParams" {
view,
[froxel_dims, _pad_align] => ["froxel_dims"],
z_near,
z_far,
[_pad] => ["_pad0", "_pad1"],
})),
everywhere(mirror!(ShadowUniforms => "ShadowUniforms" {
light_vps,
cascade_splits,
active_cascades,
[_pad] => ["_pad0", "_pad1", "_pad2"],
})),
]
}