Added GetDrawData() alternative to setting a Render function.
This commit is contained in:
parent
93f9ad9ddf
commit
dafad3903e
31
imgui.cpp
31
imgui.cpp
@ -96,6 +96,7 @@
|
||||
io.DisplaySize.y = 1280.0f;
|
||||
io.DeltaTime = 1.0f/60.0f;
|
||||
io.IniFilename = "imgui.ini";
|
||||
io.RenderDrawListsFn = my_render_function; // Setup a render function, or set to NULL and call GetDrawData() after Render() to access the render data.
|
||||
// TODO: Fill others settings of the io structure
|
||||
|
||||
// Load texture
|
||||
@ -1769,6 +1770,12 @@ ImGuiStyle& ImGui::GetStyle()
|
||||
return GImGui->Style;
|
||||
}
|
||||
|
||||
// Same value as passed to your RenderDrawListsFn() function. valid after Render() and until the next call to NewFrame()
|
||||
ImDrawData* ImGui::GetDrawData()
|
||||
{
|
||||
return GImGui->RenderDrawData.Valid ? &GImGui->RenderDrawData : NULL;
|
||||
}
|
||||
|
||||
float ImGui::GetTime()
|
||||
{
|
||||
return GImGui->Time;
|
||||
@ -1786,7 +1793,6 @@ void ImGui::NewFrame()
|
||||
// Check user data
|
||||
IM_ASSERT(g.IO.DeltaTime >= 0.0f);
|
||||
IM_ASSERT(g.IO.DisplaySize.x >= 0.0f && g.IO.DisplaySize.y >= 0.0f);
|
||||
IM_ASSERT(g.IO.RenderDrawListsFn != NULL); // Must be implemented
|
||||
IM_ASSERT(g.IO.Fonts->Fonts.Size > 0); // Font Atlas not created. Did you call io.Fonts->GetTexDataAsRGBA32 / GetTexDataAsAlpha8 ?
|
||||
IM_ASSERT(g.IO.Fonts->Fonts[0]->IsLoaded()); // Font Atlas not created. Did you call io.Fonts->GetTexDataAsRGBA32 / GetTexDataAsAlpha8 ?
|
||||
IM_ASSERT(g.Style.CurveTessellationTol > 0.0f); // Invalid
|
||||
@ -1812,6 +1818,11 @@ void ImGui::NewFrame()
|
||||
g.OverlayDrawList.PushClipRectFullScreen();
|
||||
g.OverlayDrawList.AddDrawCmd();
|
||||
|
||||
// Mark rendering data as invalid to prevent user who may have a handle on it to use it
|
||||
g.RenderDrawData.Valid = false;
|
||||
g.RenderDrawData.CmdLists = NULL;
|
||||
g.RenderDrawData.CmdListsCount = g.RenderDrawData.TotalVtxCount = g.RenderDrawData.TotalIdxCount = 0;
|
||||
|
||||
// Update inputs state
|
||||
if (g.IO.MousePos.x < 0 && g.IO.MousePos.y < 0)
|
||||
g.IO.MousePos = ImVec2(-9999.0f, -9999.0f);
|
||||
@ -2366,15 +2377,17 @@ void ImGui::Render()
|
||||
if (!g.OverlayDrawList.VtxBuffer.empty())
|
||||
AddDrawListToRenderList(g.RenderDrawLists[0], &g.OverlayDrawList);
|
||||
|
||||
// Render
|
||||
if (!g.RenderDrawLists[0].empty())
|
||||
// Setup draw data
|
||||
g.RenderDrawData.Valid = true;
|
||||
g.RenderDrawData.CmdLists = &g.RenderDrawLists[0][0];
|
||||
g.RenderDrawData.CmdListsCount = g.RenderDrawLists[0].Size;
|
||||
g.RenderDrawData.TotalVtxCount = g.IO.MetricsRenderVertices;
|
||||
g.RenderDrawData.TotalIdxCount = g.IO.MetricsRenderIndices;
|
||||
|
||||
// Render. If user hasn't set a callback then they may retrieve the draw data via GetDrawData()
|
||||
if (g.RenderDrawData.CmdListsCount > 0 && g.IO.RenderDrawListsFn != NULL)
|
||||
{
|
||||
ImDrawData data;
|
||||
data.CmdLists = &g.RenderDrawLists[0][0];
|
||||
data.CmdListsCount = g.RenderDrawLists[0].Size;
|
||||
data.TotalVtxCount = g.IO.MetricsRenderVertices;
|
||||
data.TotalIdxCount = g.IO.MetricsRenderIndices;
|
||||
g.IO.RenderDrawListsFn(&data);
|
||||
g.IO.RenderDrawListsFn(&g.RenderDrawData);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
12
imgui.h
12
imgui.h
@ -105,6 +105,7 @@ namespace ImGui
|
||||
// Main
|
||||
IMGUI_API ImGuiIO& GetIO();
|
||||
IMGUI_API ImGuiStyle& GetStyle();
|
||||
IMGUI_API ImDrawData* GetDrawData(); // same value as passed to your RenderDrawListsFn() function. valid after Render() and until the next call to NewFrame()
|
||||
IMGUI_API void NewFrame();
|
||||
IMGUI_API void Render();
|
||||
IMGUI_API void Shutdown();
|
||||
@ -694,8 +695,9 @@ struct ImGuiIO
|
||||
// User Functions
|
||||
//------------------------------------------------------------------
|
||||
|
||||
// REQUIRED: rendering function.
|
||||
// See example code if you are unsure of how to implement this.
|
||||
// Rendering function, will be called in Render().
|
||||
// Alternatively you can keep this to NULL and call GetDrawData() after Render() to get the same pointer.
|
||||
// See example applications if you are unsure of how to implement this.
|
||||
void (*RenderDrawListsFn)(ImDrawData* data);
|
||||
|
||||
// Optional: access OS clipboard
|
||||
@ -1149,14 +1151,16 @@ struct ImDrawList
|
||||
// All draw data to render an ImGui frame
|
||||
struct ImDrawData
|
||||
{
|
||||
bool Valid; // Only valid after Render() is called and before the next NewFrame() is called.
|
||||
ImDrawList** CmdLists;
|
||||
int CmdListsCount;
|
||||
int TotalVtxCount; // For convenience, sum of all cmd_lists vtx_buffer.Size
|
||||
int TotalIdxCount; // For convenience, sum of all cmd_lists idx_buffer.Size
|
||||
|
||||
// Functions
|
||||
void DeIndexAllBuffers(); // For backward compatibility: convert all buffers from indexed to de-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering!
|
||||
void ScaleClipRects(const ImVec2& sc); // Helper to scale the ClipRect field of each ImDrawCmd. Use if your final output buffer is at a different scale than ImGui expects, or if there is a difference between your window resolution and framebuffer resolution.
|
||||
IMGUI_API ImDrawData() { Valid = false; CmdLists = NULL; CmdListsCount = TotalVtxCount = TotalIdxCount = 0; }
|
||||
IMGUI_API void DeIndexAllBuffers(); // For backward compatibility: convert all buffers from indexed to de-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering!
|
||||
IMGUI_API void ScaleClipRects(const ImVec2& sc); // Helper to scale the ClipRect field of each ImDrawCmd. Use if your final output buffer is at a different scale than ImGui expects, or if there is a difference between your window resolution and framebuffer resolution.
|
||||
};
|
||||
|
||||
struct ImFontConfig
|
||||
|
@ -371,6 +371,7 @@ struct ImGuiState
|
||||
ImGuiSetCond SetNextTreeNodeOpenedCond;
|
||||
|
||||
// Render
|
||||
ImDrawData RenderDrawData; // Main ImDrawData instance to pass render information to the user
|
||||
ImVector<ImDrawList*> RenderDrawLists[3];
|
||||
float ModalWindowDarkeningRatio;
|
||||
ImDrawList OverlayDrawList; // Optional software render of mouse cursors, if io.MouseDrawCursor is set + a few debug overlays
|
||||
|
Loading…
Reference in New Issue
Block a user