#include "shared.h"
#include "renderer_types.h"
[[vk::push_constant]]
ShadowPushConstants pc;
[shader("vertex")]
VtxOut vsMain(u32 vertexID: SV_VertexID, u32 drawID: SV_DrawIndex, u32 instanceID: SV_InstanceID) {
VtxOut o;
FrameUBO frame = *pc.frame;
u32 item_idx = pc.visible_items[drawID].id;
RenderItemGPU item = frame.render_items[item_idx];
SubmeshGPU submesh = frame.submeshes[item.submesh_index];
TransformGPU xform = frame.transforms[item.instance_id];
Vertex v = pc.vertex[vertexID + submesh.base_vertex];
vec4 worldPos = vec4(v.pos, 1.0) * xform.world;
// CSM matrices are built in render-relative space. frame.position_ws.xyz is
// currently the render origin. (light.h)
vec3 shadowPos = worldPos.xyz - frame.position_ws.xyz;
mat4 light_vp = frame.shadows.cascade[pc.cascade_idx].view_proj;
o.clip_pos = vec4(shadowPos, 1.0) * light_vp;
return o;
}
[shader("fragment")]
f32 fsMain(VtxOut input) : SV_Depth {
return input.clip_pos.z;
}