UI Windows slowly working

This commit is contained in:
2024-12-30 00:10:50 +01:00
parent 4ac24fa03c
commit 6ed67e8fcb
6 changed files with 424 additions and 123 deletions

View File

@@ -44,6 +44,7 @@ Backend_Shader :: struct {
Rasterizer_State :: struct {
fill: bool;
cull_face: Cull_Face;
scissor_test: bool;
state: *ID3D11RasterizerState;
}
@@ -64,6 +65,7 @@ D3D11_Backend :: struct {
fill: bool = true;
cull_face: Cull_Face = .BACK;
scissor_test: bool = false;
}
create_backend :: (w: *Window) -> *D3D11_Backend {
@@ -253,10 +255,10 @@ init_device :: (hwnd: HWND, using renderer: *D3D11_Backend) -> bool {
array_reserve(*renderer.rasterizer_states, 8);
create_rasterizer_state(renderer, true, .BACK);
create_rasterizer_state(renderer, false, .BACK);
create_rasterizer_state(renderer, true, .FRONT);
create_rasterizer_state(renderer, false, .FRONT);
create_rasterizer_state(renderer, true, .BACK, false);
create_rasterizer_state(renderer, false, .BACK, false);
create_rasterizer_state(renderer, true, .FRONT, false);
create_rasterizer_state(renderer, false, .FRONT, false);
return true;
}
@@ -1266,13 +1268,13 @@ render :: (backend: *D3D11_Backend, command_buffer: *Render_Command_Buffer) {
if it.set_draw_mode.draw_mode == {
case .FILL;
{
state := get_or_create_rasterizer_state(d3d_renderer, true, d3d_renderer.cull_face);
state := get_or_create_rasterizer_state(d3d_renderer, true, d3d_renderer.cull_face, d3d_renderer.scissor_test);
d3d_renderer.fill = true;
ID3D11DeviceContext_RSSetState(d3d_context, state.state);
}
case .WIREFRAME;
{
state := get_or_create_rasterizer_state(d3d_renderer, false, d3d_renderer.cull_face);
state := get_or_create_rasterizer_state(d3d_renderer, false, d3d_renderer.cull_face, d3d_renderer.scissor_test);
d3d_renderer.fill = false;
ID3D11DeviceContext_RSSetState(d3d_context, state.state);
}
@@ -1282,19 +1284,19 @@ render :: (backend: *D3D11_Backend, command_buffer: *Render_Command_Buffer) {
if it.set_cull_face.cull_face == {
case .FRONT;
{
state := get_or_create_rasterizer_state(d3d_renderer, d3d_renderer.fill, .FRONT);
state := get_or_create_rasterizer_state(d3d_renderer, d3d_renderer.fill, .FRONT, d3d_renderer.scissor_test);
d3d_renderer.cull_face = .FRONT;
ID3D11DeviceContext_RSSetState(d3d_context, state.state);
}
case .BACK;
{
state := get_or_create_rasterizer_state(d3d_renderer, d3d_renderer.fill, .BACK);
state := get_or_create_rasterizer_state(d3d_renderer, d3d_renderer.fill, .BACK, d3d_renderer.scissor_test);
d3d_renderer.cull_face = .BACK;
ID3D11DeviceContext_RSSetState(d3d_context, state.state);
}
case .NONE;
{
state := get_or_create_rasterizer_state(d3d_renderer, d3d_renderer.fill, .NONE);
state := get_or_create_rasterizer_state(d3d_renderer, d3d_renderer.fill, .NONE, d3d_renderer.scissor_test);
d3d_renderer.cull_face = .NONE;
ID3D11DeviceContext_RSSetState(d3d_context, state.state);
}
@@ -1370,6 +1372,20 @@ render :: (backend: *D3D11_Backend, command_buffer: *Render_Command_Buffer) {
vp.TopLeftX = xx it.set_viewport.x;
vp.TopLeftY = xx it.set_viewport.y;
ID3D11DeviceContext_RSSetViewports(d3d_context, 1, *vp);
case .SET_SCISSOR;
rect : D3D11_RECT;
rect.left = xx it.set_scissor.x;
rect.right = xx (it.set_scissor.x + it.set_scissor.width);
rect.top = xx it.set_scissor.y;
rect.bottom = xx (it.set_scissor.y + it.set_scissor.height);
ID3D11DeviceContext_RSSetScissorRects(d3d_context, 1, *rect);
state := get_or_create_rasterizer_state(d3d_renderer, true, d3d_renderer.cull_face, true);
d3d_renderer.scissor_test = true;
ID3D11DeviceContext_RSSetState(d3d_context, state.state);
case .CLEAR_SCISSOR;
state := get_or_create_rasterizer_state(d3d_renderer, true, d3d_renderer.cull_face, false);
d3d_renderer.scissor_test = false;
ID3D11DeviceContext_RSSetState(d3d_context, state.state);
case .DRAW;
if it.draw.topology == {
case .TRIANGLE_LIST;
@@ -1426,6 +1442,7 @@ render :: (backend: *D3D11_Backend, command_buffer: *Render_Command_Buffer) {
}
}
d3d_renderer.scissor_test = false;
now := seconds_since_init();
engine.renderer.last_render_time_cpu = cast(float)(now - time) * 1000.0;
@@ -1446,17 +1463,17 @@ render :: (backend: *D3D11_Backend, command_buffer: *Render_Command_Buffer) {
}
#scope_file
get_or_create_rasterizer_state :: (backend: *D3D11_Backend, fill: bool, cull_face: Cull_Face) -> *Rasterizer_State {
get_or_create_rasterizer_state :: (backend: *D3D11_Backend, fill: bool, cull_face: Cull_Face, scissor_test: bool) -> *Rasterizer_State {
for * backend.rasterizer_states {
if it.fill == fill && it.cull_face == cull_face {
if it.fill == fill && it.cull_face == cull_face && it.scissor_test == scissor_test {
return it;
}
}
return create_rasterizer_state(backend, fill, cull_face);
return create_rasterizer_state(backend, fill, cull_face, scissor_test);
}
create_rasterizer_state :: (backend: *D3D11_Backend, fill: bool, cull_face: Cull_Face) -> *Rasterizer_State {
create_rasterizer_state :: (backend: *D3D11_Backend, fill: bool, cull_face: Cull_Face, scissor_test: bool) -> *Rasterizer_State {
raster_desc : D3D11_RASTERIZER_DESC;
raster_desc.AntialiasedLineEnable = .FALSE;
@@ -1481,7 +1498,7 @@ create_rasterizer_state :: (backend: *D3D11_Backend, fill: bool, cull_face: Cull
raster_desc.FrontCounterClockwise = .FALSE;
raster_desc.MultisampleEnable = .FALSE;
raster_desc.ScissorEnable = .FALSE;
raster_desc.ScissorEnable = ifx scissor_test then .TRUE else .FALSE;
raster_desc.SlopeScaledDepthBias = 0.0;
state : *ID3D11RasterizerState;