|
@@ -15,6 +15,7 @@
|
|
|
|
|
|
// CHANGELOG
|
|
|
// (minor and older changes stripped away, please see git history for details)
|
|
|
+// 2025-01-06: DirectX10: Expose selected render state in ImGui_ImplDX10_RenderState, which you can access in 'void* platform_io.Renderer_RenderState' during draw callbacks.
|
|
|
// 2024-10-07: DirectX10: Changed default texture sampler to Clamp instead of Repeat/Wrap.
|
|
|
// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11.
|
|
|
// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX).
|
|
@@ -95,7 +96,28 @@ static void ImGui_ImplDX10_SetupRenderState(ImDrawData* draw_data, ID3D10Device*
|
|
|
vp.TopLeftX = vp.TopLeftY = 0;
|
|
|
device->RSSetViewports(1, &vp);
|
|
|
|
|
|
- // Bind shader and vertex buffers
|
|
|
+ // Setup orthographic projection matrix into our constant buffer
|
|
|
+ // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps.
|
|
|
+ void* mapped_resource;
|
|
|
+ if (bd->pVertexConstantBuffer->Map(D3D10_MAP_WRITE_DISCARD, 0, &mapped_resource) == S_OK)
|
|
|
+ {
|
|
|
+ VERTEX_CONSTANT_BUFFER_DX10* constant_buffer = (VERTEX_CONSTANT_BUFFER_DX10*)mapped_resource;
|
|
|
+ float L = draw_data->DisplayPos.x;
|
|
|
+ float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x;
|
|
|
+ float T = draw_data->DisplayPos.y;
|
|
|
+ float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y;
|
|
|
+ float mvp[4][4] =
|
|
|
+ {
|
|
|
+ { 2.0f/(R-L), 0.0f, 0.0f, 0.0f },
|
|
|
+ { 0.0f, 2.0f/(T-B), 0.0f, 0.0f },
|
|
|
+ { 0.0f, 0.0f, 0.5f, 0.0f },
|
|
|
+ { (R+L)/(L-R), (T+B)/(B-T), 0.5f, 1.0f },
|
|
|
+ };
|
|
|
+ memcpy(&constant_buffer->mvp, mvp, sizeof(mvp));
|
|
|
+ bd->pVertexConstantBuffer->Unmap();
|
|
|
+ }
|
|
|
+
|
|
|
+ // Setup shader and vertex buffers
|
|
|
unsigned int stride = sizeof(ImDrawVert);
|
|
|
unsigned int offset = 0;
|
|
|
device->IASetInputLayout(bd->pInputLayout);
|
|
@@ -171,28 +193,6 @@ void ImGui_ImplDX10_RenderDrawData(ImDrawData* draw_data)
|
|
|
bd->pVB->Unmap();
|
|
|
bd->pIB->Unmap();
|
|
|
|
|
|
- // Setup orthographic projection matrix into our constant buffer
|
|
|
- // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps.
|
|
|
- {
|
|
|
- void* mapped_resource;
|
|
|
- if (bd->pVertexConstantBuffer->Map(D3D10_MAP_WRITE_DISCARD, 0, &mapped_resource) != S_OK)
|
|
|
- return;
|
|
|
- VERTEX_CONSTANT_BUFFER_DX10* constant_buffer = (VERTEX_CONSTANT_BUFFER_DX10*)mapped_resource;
|
|
|
- float L = draw_data->DisplayPos.x;
|
|
|
- float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x;
|
|
|
- float T = draw_data->DisplayPos.y;
|
|
|
- float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y;
|
|
|
- float mvp[4][4] =
|
|
|
- {
|
|
|
- { 2.0f/(R-L), 0.0f, 0.0f, 0.0f },
|
|
|
- { 0.0f, 2.0f/(T-B), 0.0f, 0.0f },
|
|
|
- { 0.0f, 0.0f, 0.5f, 0.0f },
|
|
|
- { (R+L)/(L-R), (T+B)/(B-T), 0.5f, 1.0f },
|
|
|
- };
|
|
|
- memcpy(&constant_buffer->mvp, mvp, sizeof(mvp));
|
|
|
- bd->pVertexConstantBuffer->Unmap();
|
|
|
- }
|
|
|
-
|
|
|
// Backup DX state that will be modified to restore it afterwards (unfortunately this is very ugly looking and verbose. Close your eyes!)
|
|
|
struct BACKUP_DX10_STATE
|
|
|
{
|
|
@@ -236,6 +236,13 @@ void ImGui_ImplDX10_RenderDrawData(ImDrawData* draw_data)
|
|
|
|
|
|
// Setup desired DX state
|
|
|
ImGui_ImplDX10_SetupRenderState(draw_data, device);
|
|
|
+ // Setup render state structure (for callbacks and custom texture bindings)
|
|
|
+ ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
|
|
+ ImGui_ImplDX10_RenderState render_state;
|
|
|
+ render_state.Device = bd->pd3dDevice;
|
|
|
+ render_state.SamplerDefault = bd->pFontSampler;
|
|
|
+ render_state.VertexConstantBuffer = bd->pVertexConstantBuffer;
|
|
|
+ platform_io.Renderer_RenderState = &render_state;
|
|
|
|
|
|
// Render command lists
|
|
|
// (Because we merged all buffers into a single one, we maintain our own offset into them)
|
|
@@ -248,7 +255,7 @@ void ImGui_ImplDX10_RenderDrawData(ImDrawData* draw_data)
|
|
|
for (int cmd_i = 0; cmd_i < draw_list->CmdBuffer.Size; cmd_i++)
|
|
|
{
|
|
|
const ImDrawCmd* pcmd = &draw_list->CmdBuffer[cmd_i];
|
|
|
- if (pcmd->UserCallback)
|
|
|
+ if (pcmd->UserCallback != nullptr)
|
|
|
{
|
|
|
// User callback, registered via ImDrawList::AddCallback()
|
|
|
// (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
|
|
@@ -278,6 +285,7 @@ void ImGui_ImplDX10_RenderDrawData(ImDrawData* draw_data)
|
|
|
global_idx_offset += draw_list->IdxBuffer.Size;
|
|
|
global_vtx_offset += draw_list->VtxBuffer.Size;
|
|
|
}
|
|
|
+ platform_io.Renderer_RenderState = nullptr;
|
|
|
|
|
|
// Restore modified DX state
|
|
|
device->RSSetScissorRects(old.ScissorRectsCount, old.ScissorRects);
|