|
@@ -42,6 +42,62 @@ struct CUSTOMVERTEX
|
|
|
};
|
|
|
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)
|
|
|
|
|
|
+static void ImGui_ImplDX9_SetupRenderState(ImDrawData* draw_data)
|
|
|
+{
|
|
|
+ // Setup viewport
|
|
|
+ D3DVIEWPORT9 vp;
|
|
|
+ vp.X = vp.Y = 0;
|
|
|
+ vp.Width = (DWORD)draw_data->DisplaySize.x;
|
|
|
+ vp.Height = (DWORD)draw_data->DisplaySize.y;
|
|
|
+ vp.MinZ = 0.0f;
|
|
|
+ vp.MaxZ = 1.0f;
|
|
|
+ g_pd3dDevice->SetViewport(&vp);
|
|
|
+
|
|
|
+ // Setup render state: fixed-pipeline, alpha-blending, no face culling, no depth testing, shade mode (for gradient)
|
|
|
+ g_pd3dDevice->SetPixelShader(NULL);
|
|
|
+ g_pd3dDevice->SetVertexShader(NULL);
|
|
|
+ g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
|
|
|
+ g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, false);
|
|
|
+ g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, false);
|
|
|
+ g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
|
|
|
+ g_pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE, false);
|
|
|
+ g_pd3dDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
|
|
|
+ g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
|
|
|
+ g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
|
|
|
+ g_pd3dDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, true);
|
|
|
+ g_pd3dDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
|
|
|
+ g_pd3dDevice->SetRenderState(D3DRS_FOGENABLE, false);
|
|
|
+ g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
|
|
|
+ g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
|
|
+ g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
|
|
|
+ g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
|
|
|
+ g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
|
|
|
+ g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
|
|
|
+ g_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
|
|
|
+ g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
|
|
|
+
|
|
|
+ // Setup orthographic projection matrix
|
|
|
+ // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right).
|
|
|
+ // Being agnostic of whether <d3dx9.h> or <DirectXMath.h> can be used, we aren't relying on D3DXMatrixIdentity()/D3DXMatrixOrthoOffCenterLH() or DirectX::XMMatrixIdentity()/DirectX::XMMatrixOrthographicOffCenterLH()
|
|
|
+ {
|
|
|
+ float L = draw_data->DisplayPos.x + 0.5f;
|
|
|
+ float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x + 0.5f;
|
|
|
+ float T = draw_data->DisplayPos.y + 0.5f;
|
|
|
+ float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y + 0.5f;
|
|
|
+ D3DMATRIX mat_identity = { { { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f } } };
|
|
|
+ D3DMATRIX mat_projection =
|
|
|
+ { { {
|
|
|
+ 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,
|
|
|
+ (L+R)/(L-R), (T+B)/(B-T), 0.5f, 1.0f
|
|
|
+ } } };
|
|
|
+ g_pd3dDevice->SetTransform(D3DTS_WORLD, &mat_identity);
|
|
|
+ g_pd3dDevice->SetTransform(D3DTS_VIEW, &mat_identity);
|
|
|
+ g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &mat_projection);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// Render function.
|
|
|
// (this used to be set in io.RenderDrawListsFn and called by ImGui::Render(), but you can now call this directly from your main loop)
|
|
|
void ImGui_ImplDX9_RenderDrawData(ImDrawData* draw_data)
|
|
@@ -111,58 +167,8 @@ void ImGui_ImplDX9_RenderDrawData(ImDrawData* draw_data)
|
|
|
g_pd3dDevice->SetIndices(g_pIB);
|
|
|
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
|
|
|
|
|
|
- // Setup viewport
|
|
|
- D3DVIEWPORT9 vp;
|
|
|
- vp.X = vp.Y = 0;
|
|
|
- vp.Width = (DWORD)draw_data->DisplaySize.x;
|
|
|
- vp.Height = (DWORD)draw_data->DisplaySize.y;
|
|
|
- vp.MinZ = 0.0f;
|
|
|
- vp.MaxZ = 1.0f;
|
|
|
- g_pd3dDevice->SetViewport(&vp);
|
|
|
-
|
|
|
- // Setup render state: fixed-pipeline, alpha-blending, no face culling, no depth testing, shade mode (for gradient)
|
|
|
- g_pd3dDevice->SetPixelShader(NULL);
|
|
|
- g_pd3dDevice->SetVertexShader(NULL);
|
|
|
- g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
|
|
|
- g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, false);
|
|
|
- g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, false);
|
|
|
- g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
|
|
|
- g_pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE, false);
|
|
|
- g_pd3dDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
|
|
|
- g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
|
|
|
- g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
|
|
|
- g_pd3dDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, true);
|
|
|
- g_pd3dDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
|
|
|
- g_pd3dDevice->SetRenderState(D3DRS_FOGENABLE, false);
|
|
|
- g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
|
|
|
- g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
|
|
- g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
|
|
|
- g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
|
|
|
- g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
|
|
|
- g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
|
|
|
- g_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
|
|
|
- g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
|
|
|
-
|
|
|
- // Setup orthographic projection matrix
|
|
|
- // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right).
|
|
|
- // Being agnostic of whether <d3dx9.h> or <DirectXMath.h> can be used, we aren't relying on D3DXMatrixIdentity()/D3DXMatrixOrthoOffCenterLH() or DirectX::XMMatrixIdentity()/DirectX::XMMatrixOrthographicOffCenterLH()
|
|
|
- {
|
|
|
- float L = draw_data->DisplayPos.x + 0.5f;
|
|
|
- float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x + 0.5f;
|
|
|
- float T = draw_data->DisplayPos.y + 0.5f;
|
|
|
- float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y + 0.5f;
|
|
|
- D3DMATRIX mat_identity = { { { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f } } };
|
|
|
- D3DMATRIX mat_projection =
|
|
|
- { { {
|
|
|
- 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,
|
|
|
- (L+R)/(L-R), (T+B)/(B-T), 0.5f, 1.0f
|
|
|
- } } };
|
|
|
- g_pd3dDevice->SetTransform(D3DTS_WORLD, &mat_identity);
|
|
|
- g_pd3dDevice->SetTransform(D3DTS_VIEW, &mat_identity);
|
|
|
- g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &mat_projection);
|
|
|
- }
|
|
|
+ // Setup desired DX state
|
|
|
+ ImGui_ImplDX9_SetupRenderState(draw_data);
|
|
|
|
|
|
// Render command lists
|
|
|
int vtx_offset = 0;
|
|
@@ -174,9 +180,14 @@ void ImGui_ImplDX9_RenderDrawData(ImDrawData* draw_data)
|
|
|
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
|
|
|
{
|
|
|
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
|
|
|
- if (pcmd->UserCallback)
|
|
|
+ if (pcmd->UserCallback != NULL)
|
|
|
{
|
|
|
- pcmd->UserCallback(cmd_list, pcmd);
|
|
|
+ // 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.)
|
|
|
+ if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
|
|
|
+ ImGui_ImplDX9_SetupRenderState(draw_data);
|
|
|
+ else
|
|
|
+ pcmd->UserCallback(cmd_list, pcmd);
|
|
|
}
|
|
|
else
|
|
|
{
|