2
0
Эх сурвалжийг харах

WIP Backends: SDLRenderer3: transform vertices manually (not optimal)

ocornut 1 жил өмнө
parent
commit
77d703aaa5

+ 22 - 2
backends/imgui_impl_sdlrenderer3.cpp

@@ -55,7 +55,8 @@ struct ImGui_ImplSDLRenderer3_Data
 {
     SDL_Renderer*           Renderer;       // Main viewport's renderer
     SDL_Texture*            FontTexture;
-    ImVector<SDL_FColor>    ColorBuffer;
+    ImVector<SDL_FColor>    ColorBuffer;    // Transformed color buffer
+    ImVector<ImVec2>        PosBuffer;      // Transformed pos buffer (for multi-viewports only)
 
     ImGui_ImplSDLRenderer3_Data()   { memset((void*)this, 0, sizeof(*this)); }
 };
@@ -225,13 +226,32 @@ void ImGui_ImplSDLRenderer3_RenderDrawData(ImDrawData* draw_data, SDL_Renderer*
                 SDL_SetRenderClipRect(renderer, &r);
 
                 const float* xy = (const float*)(const void*)((const char*)(vtx_buffer + pcmd->VtxOffset) + offsetof(ImDrawVert, pos));
+                int xy_stride = (int)sizeof(ImDrawVert);
                 const float* uv = (const float*)(const void*)((const char*)(vtx_buffer + pcmd->VtxOffset) + offsetof(ImDrawVert, uv));
                 const SDL_Color* color = (const SDL_Color*)(const void*)((const char*)(vtx_buffer + pcmd->VtxOffset) + offsetof(ImDrawVert, col)); // SDL 2.0.19+
 
+                // FIXME-OPT: Transform position manually
+                // FIXME-OPT: Note that SDL_RenderGeometryRaw() does another transform for colors..
+                if (draw_data->DisplayPos.x != 0.0f || draw_data->DisplayPos.y != 0.0f)
+                {
+                    const float off_x = draw_data->DisplayPos.x;
+                    const float off_y = draw_data->DisplayPos.y;
+                    bd->PosBuffer.resize(pcmd->ElemCount);
+                    const ImDrawVert* p_in = vtx_buffer + pcmd->VtxOffset;
+                    ImVec2* p_out = bd->PosBuffer.Data;
+                    for (int remaining = pcmd->ElemCount; remaining > 0; remaining--, p_out++, p_in++)
+                    {
+                        p_out->x = p_in->pos.x - off_x;
+                        p_out->y = p_in->pos.y - off_y;
+                    }
+                    xy = (const float*)bd->PosBuffer.Data;
+                    xy_stride = (int)sizeof(ImVec2);
+                }
+
                 // Bind texture, Draw
 				SDL_Texture* tex = (SDL_Texture*)pcmd->GetTexID();
                 SDL_RenderGeometryRaw8BitColor(renderer, bd->ColorBuffer, tex,
-                    xy, (int)sizeof(ImDrawVert),
+                    xy, xy_stride,
                     color, (int)sizeof(ImDrawVert),
                     uv, (int)sizeof(ImDrawVert),
                     draw_list->VtxBuffer.Size - pcmd->VtxOffset,