|
@@ -295,6 +295,7 @@ CODE
|
|
|
// TODO: Setup viewport covering draw_data->DisplayPos to draw_data->DisplayPos + draw_data->DisplaySize
|
|
|
// TODO: Setup orthographic projection matrix cover draw_data->DisplayPos to draw_data->DisplayPos + draw_data->DisplaySize
|
|
|
// TODO: Setup shader: vertex { float2 pos, float2 uv, u32 color }, fragment shader sample color from 1 texture, multiply by vertex color.
|
|
|
+ ImVec2 clip_off = draw_data->DisplayPos;
|
|
|
for (int n = 0; n < draw_data->CmdListsCount; n++)
|
|
|
{
|
|
|
const ImDrawList* cmd_list = draw_data->CmdLists[n];
|
|
@@ -309,9 +310,11 @@ CODE
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- // The texture for the draw call is specified by pcmd->GetTexID().
|
|
|
- // The vast majority of draw calls will use the Dear ImGui texture atlas, which value you have set yourself during initialization.
|
|
|
- MyEngineBindTexture((MyTexture*)pcmd->GetTexID());
|
|
|
+ // Project scissor/clipping rectangles into framebuffer space
|
|
|
+ ImVec2 clip_min(pcmd->ClipRect.x - clip_off.x, pcmd->ClipRect.y - clip_off.y);
|
|
|
+ ImVec2 clip_max(pcmd->ClipRect.z - clip_off.x, pcmd->ClipRect.w - clip_off.y);
|
|
|
+ if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y)
|
|
|
+ continue;
|
|
|
|
|
|
// We are using scissoring to clip some objects. All low-level graphics API should support it.
|
|
|
// - If your engine doesn't support scissoring yet, you may ignore this at first. You will get some small glitches
|
|
@@ -322,14 +325,16 @@ CODE
|
|
|
// - In the interest of supporting multi-viewport applications (see 'docking' branch on github),
|
|
|
// always subtract draw_data->DisplayPos from clipping bounds to convert them to your viewport space.
|
|
|
// - Note that pcmd->ClipRect contains Min+Max bounds. Some graphics API may use Min+Max, other may use Min+Size (size being Max-Min)
|
|
|
- ImVec2 pos = draw_data->DisplayPos;
|
|
|
- MyEngineScissor((int)(pcmd->ClipRect.x - pos.x), (int)(pcmd->ClipRect.y - pos.y), (int)(pcmd->ClipRect.z - pos.x), (int)(pcmd->ClipRect.w - pos.y));
|
|
|
+ MyEngineSetScissor(clip_min.x, clip_min.y, clip_max.x, clip_max.y);
|
|
|
+
|
|
|
+ // The texture for the draw call is specified by pcmd->GetTexID().
|
|
|
+ // The vast majority of draw calls will use the Dear ImGui texture atlas, which value you have set yourself during initialization.
|
|
|
+ MyEngineBindTexture((MyTexture*)pcmd->GetTexID());
|
|
|
|
|
|
// Render 'pcmd->ElemCount/3' indexed triangles.
|
|
|
// By default the indices ImDrawIdx are 16-bit, you can change them to 32-bit in imconfig.h if your engine doesn't support 16-bit indices.
|
|
|
- MyEngineDrawIndexedTriangles(pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer, vtx_buffer);
|
|
|
+ MyEngineDrawIndexedTriangles(pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer + pcmd->IdxOffset, vtx_buffer, pcmd->VtxOffset);
|
|
|
}
|
|
|
- idx_buffer += pcmd->ElemCount;
|
|
|
}
|
|
|
}
|
|
|
}
|