demos/teapot: Add a flat shading toggle.

This commit is contained in:
Henri Verbeet
2025-07-11 22:37:51 +02:00
parent 8d4222764c
commit 53dd048ad5
Notes: Henri Verbeet 2025-07-21 12:35:29 +02:00
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1625
3 changed files with 22 additions and 8 deletions

View File

@@ -177,6 +177,7 @@ static demo_key demo_key_from_nsevent(id event)
enum vkey enum vkey
{ {
kVK_ANSI_A = 0x00, kVK_ANSI_A = 0x00,
kVK_ANSI_F = 0x03,
kVK_ANSI_W = 0x0d, kVK_ANSI_W = 0x0d,
kVK_ANSI_Equal = 0x18, kVK_ANSI_Equal = 0x18,
kVK_ANSI_Minus = 0x1b, kVK_ANSI_Minus = 0x1b,
@@ -199,6 +200,7 @@ static demo_key demo_key_from_nsevent(id event)
lookup[] = lookup[] =
{ {
{kVK_ANSI_A, 'a'}, {kVK_ANSI_A, 'a'},
{kVK_ANSI_F, 'f'},
{kVK_ANSI_W, 'w'}, {kVK_ANSI_W, 'w'},
{kVK_ANSI_Equal, '='}, {kVK_ANSI_Equal, '='},
{kVK_ANSI_Minus, '-'}, {kVK_ANSI_Minus, '-'},

View File

@@ -39,7 +39,7 @@ struct teapot_cb_data
{ {
struct demo_matrix mvp_matrix; struct demo_matrix mvp_matrix;
float level; float level;
unsigned int wireframe; unsigned int wireframe, flat;
}; };
struct demo_text_run struct demo_text_run
@@ -91,7 +91,7 @@ struct teapot
unsigned int text_scale; unsigned int text_scale;
float theta, phi; float theta, phi;
bool display_help, wireframe; bool display_help, flat, wireframe;
struct timeval last_text; struct timeval last_text;
struct timeval frame_times[16]; struct timeval frame_times[16];
size_t frame_count; size_t frame_count;
@@ -546,9 +546,10 @@ static void teapot_update_text(struct teapot *teapot, double fps)
demo_text_draw(text, &amber, 0, -2 * h, "%.2f fps", fps); demo_text_draw(text, &amber, 0, -2 * h, "%.2f fps", fps);
if (teapot->display_help) if (teapot->display_help)
{ {
demo_text_draw(text, &amber, 0, 3 * h, "ESC: Exit"); demo_text_draw(text, &amber, 0, 4 * h, "ESC: Exit");
demo_text_draw(text, &amber, 0, 2 * h, " F1: Toggle help"); demo_text_draw(text, &amber, 0, 3 * h, " F1: Toggle help");
demo_text_draw(text, &amber, 0, 1 * h, "-/+: Tessellation level (%u)", teapot->tessellation_level); demo_text_draw(text, &amber, 0, 2 * h, "-/+: Tessellation level (%u)", teapot->tessellation_level);
demo_text_draw(text, &amber, 0, 1 * h, " F: Toggle flat shading (%s)", teapot->flat ? "on" : "off");
demo_text_draw(text, &amber, 0, 0 * h, " W: Toggle wireframe (%s)", teapot->wireframe ? "on" : "off"); demo_text_draw(text, &amber, 0, 0 * h, " W: Toggle wireframe (%s)", teapot->wireframe ? "on" : "off");
} }
@@ -751,8 +752,7 @@ static void teapot_load_assets(struct teapot *teapot)
root_signature_desc.NumParameters = 1; root_signature_desc.NumParameters = 1;
root_signature_desc.pParameters = root_parameters; root_signature_desc.pParameters = root_parameters;
root_signature_desc.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT root_signature_desc.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT
| D3D12_ROOT_SIGNATURE_FLAG_DENY_VERTEX_SHADER_ROOT_ACCESS | D3D12_ROOT_SIGNATURE_FLAG_DENY_VERTEX_SHADER_ROOT_ACCESS;
| D3D12_ROOT_SIGNATURE_FLAG_DENY_GEOMETRY_SHADER_ROOT_ACCESS;
hr = demo_create_root_signature(teapot->device, &root_signature_desc, &teapot->root_signature); hr = demo_create_root_signature(teapot->device, &root_signature_desc, &teapot->root_signature);
assert(SUCCEEDED(hr)); assert(SUCCEEDED(hr));
@@ -857,6 +857,7 @@ static void teapot_load_assets(struct teapot *teapot)
teapot_update_mvp(teapot); teapot_update_mvp(teapot);
teapot->cb_data->level = teapot->tessellation_level; teapot->cb_data->level = teapot->tessellation_level;
teapot->cb_data->wireframe = teapot->wireframe; teapot->cb_data->wireframe = teapot->wireframe;
teapot->cb_data->flat = teapot->flat;
demo_text_init(&teapot->text, teapot->device, teapot->width, teapot->height, teapot->text_scale); demo_text_init(&teapot->text, teapot->device, teapot->width, teapot->height, teapot->text_scale);
teapot_load_mesh(teapot); teapot_load_mesh(teapot);
@@ -881,6 +882,9 @@ static void teapot_key_press(struct demo_window *window, demo_key key, void *use
if (teapot->tessellation_level < D3D12_TESSELLATOR_MAX_TESSELLATION_FACTOR) if (teapot->tessellation_level < D3D12_TESSELLATOR_MAX_TESSELLATION_FACTOR)
teapot->cb_data->level = ++teapot->tessellation_level; teapot->cb_data->level = ++teapot->tessellation_level;
break; break;
case 'f':
teapot->cb_data->flat = teapot->flat = !teapot->flat;
break;
case 'w': case 'w':
teapot->cb_data->wireframe = teapot->wireframe = !teapot->wireframe; teapot->cb_data->wireframe = teapot->wireframe = !teapot->wireframe;
break; break;

View File

@@ -22,7 +22,7 @@ cbuffer teapot_cb : register(b0)
{ {
float4x4 mvp_matrix; float4x4 mvp_matrix;
float level; float level;
uint wireframe; uint wireframe, flat;
}; };
struct control_point struct control_point
@@ -166,6 +166,14 @@ void gs_main(triangle struct gs_in i[3], inout TriangleStream<struct ps_in> stre
v[2].normal = i[2].normal; v[2].normal = i[2].normal;
v[2].barycentric = float2(0.0, 0.0); v[2].barycentric = float2(0.0, 0.0);
if (flat)
{
n = normalize(cross(i[1].pos - i[0].pos, i[2].pos - i[0].pos));
v[0].normal = n;
v[1].normal = n;
v[2].normal = n;
}
stream.Append(v[0]); stream.Append(v[0]);
stream.Append(v[1]); stream.Append(v[1]);
stream.Append(v[2]); stream.Append(v[2]);