|
|
|
@ -16,7 +16,7 @@ static GLuint g_FontTexture = 0;
|
|
|
|
|
// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure)
|
|
|
|
|
// If text or lines are blurry when integrating ImGui in your engine:
|
|
|
|
|
// - in your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f)
|
|
|
|
|
static void ImGui_ImplSdl_RenderDrawLists(ImDrawList** const cmd_lists, int cmd_lists_count)
|
|
|
|
|
static void ImGui_ImplSdl_RenderDrawLists(ImDrawData* draw_data)
|
|
|
|
|
{
|
|
|
|
|
// We are using the OpenGL fixed pipeline to make the example code simpler to read!
|
|
|
|
|
// A probable faster way to render would be to collate all vertices from all cmd_lists into a single vertex buffer.
|
|
|
|
@ -46,29 +46,29 @@ static void ImGui_ImplSdl_RenderDrawLists(ImDrawList** const cmd_lists, int cmd_
|
|
|
|
|
|
|
|
|
|
// Render command lists
|
|
|
|
|
#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))
|
|
|
|
|
for (int n = 0; n < cmd_lists_count; n++)
|
|
|
|
|
for (int n = 0; n < draw_data->CmdListsCount; n++)
|
|
|
|
|
{
|
|
|
|
|
const ImDrawList* cmd_list = cmd_lists[n];
|
|
|
|
|
const unsigned char* vtx_buffer = (const unsigned char*)&cmd_list->vtx_buffer.front();
|
|
|
|
|
const ImDrawList* cmd_list = draw_data->CmdLists[n];
|
|
|
|
|
const unsigned char* vtx_buffer = (const unsigned char*)&cmd_list->VtxBuffer.front();
|
|
|
|
|
const ImDrawIdx* idx_buffer = &cmd_list->IdxBuffer.front();
|
|
|
|
|
glVertexPointer(2, GL_FLOAT, sizeof(ImDrawVert), (void*)(vtx_buffer + OFFSETOF(ImDrawVert, pos)));
|
|
|
|
|
glTexCoordPointer(2, GL_FLOAT, sizeof(ImDrawVert), (void*)(vtx_buffer + OFFSETOF(ImDrawVert, uv)));
|
|
|
|
|
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(ImDrawVert), (void*)(vtx_buffer + OFFSETOF(ImDrawVert, col)));
|
|
|
|
|
|
|
|
|
|
int vtx_offset = 0;
|
|
|
|
|
for (int cmd_i = 0; cmd_i < cmd_list->commands.size(); cmd_i++)
|
|
|
|
|
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.size(); cmd_i++)
|
|
|
|
|
{
|
|
|
|
|
const ImDrawCmd* pcmd = &cmd_list->commands[cmd_i];
|
|
|
|
|
if (pcmd->user_callback)
|
|
|
|
|
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
|
|
|
|
|
if (pcmd->UserCallback)
|
|
|
|
|
{
|
|
|
|
|
pcmd->user_callback(cmd_list, pcmd);
|
|
|
|
|
pcmd->UserCallback(cmd_list, pcmd);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->texture_id);
|
|
|
|
|
glScissor((int)pcmd->clip_rect.x, (int)(height - pcmd->clip_rect.w), (int)(pcmd->clip_rect.z - pcmd->clip_rect.x), (int)(pcmd->clip_rect.w - pcmd->clip_rect.y));
|
|
|
|
|
glDrawArrays(GL_TRIANGLES, vtx_offset, (GLsizei)pcmd->vtx_count);
|
|
|
|
|
glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->TextureId);
|
|
|
|
|
glScissor((int)pcmd->ClipRect.x, (int)(height - pcmd->ClipRect.w), (int)(pcmd->ClipRect.z - pcmd->ClipRect.x), (int)(pcmd->ClipRect.w - pcmd->ClipRect.y));
|
|
|
|
|
glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, GL_UNSIGNED_SHORT, idx_buffer);
|
|
|
|
|
}
|
|
|
|
|
vtx_offset += pcmd->vtx_count;
|
|
|
|
|
idx_buffer += pcmd->ElemCount;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#undef OFFSETOF
|
|
|
|
|