power_play/src/kernel/kernel_ui.rst
2025-07-31 20:26:47 -05:00

77 lines
1.7 KiB
ReStructuredText

#include "kernel.h"
ConstantBuffer<K_UiSig> sig : register(b0);
////////////////////////////////
//~ Shader types
//- Vertex shader in/out
Struct(VsInput)
{
Semantic(u32, SV_InstanceID);
Semantic(u32, SV_VertexID);
};
Struct(VSOutput)
{
nointerpolation Semantic(u32, tex_nurid);
Semantic(Vec2, uv);
Semantic(Vec4, tint_srgb);
Semantic(Vec4, SV_Position);
};
//- Pixel shader in/out
Struct(PsInput)
{
VSOutput vs;
};
Struct(PSOutput)
{
Semantic(Vec4, SV_Target0);
};
////////////////////////////////
//~ Vertex shader
K_ENTRY VSOutput vs(VsInput input)
{
static const Vec2 unit_quad_verts[4] = {
Vec2(-0.5f, -0.5f),
Vec2(0.5f, -0.5f),
Vec2(0.5f, 0.5f),
Vec2(-0.5f, 0.5f)
};
StructuredBuffer<K_UiInstance> instances = GpuResourceFromUrid(sig.instances_urid);
K_UiInstance instance = instances[input.SV_InstanceID];
Vec2 vert = unit_quad_verts[input.SV_VertexID];
Vec2 world_pos = mul(instance.xf, Vec3(vert, 1)).xy;
VSOutput output;
output.SV_Position = mul(sig.projection, Vec4(world_pos, 0, 1));
output.tex_nurid = instance.tex_nurid;
output.uv = instance.uv0 + ((vert + 0.5) * (instance.uv1 - instance.uv0));
output.tint_srgb = Vec4NormFromU32(instance.tint_srgb);
return output;
}
////////////////////////////////
//~ Pixel shader
K_ENTRY PSOutput ps(PsInput input)
{
PSOutput output;
Vec4 color = input.vs.tint_srgb;
/* Texture */
if (input.vs.tex_nurid < 0xFFFFFFFF)
{
Texture2D<Vec4> tex = GpuResourceFromNurid(input.vs.tex_nurid);
color *= tex.Sample(s_point_clamp, input.vs.uv);
}
output.SV_Target0 = color;
return output;
}