mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-02-18 04:53:06 +01:00
ImGui docking fixes.
This commit is contained in:
1
3rdparty/ocornut-imgui/imgui.cpp
vendored
1
3rdparty/ocornut-imgui/imgui.cpp
vendored
@@ -4352,6 +4352,7 @@ static float* GetStyleVarFloatAddr(ImGuiStyleVar idx)
|
||||
case ImGuiStyleVar_FrameRounding: return &g.Style.FrameRounding;
|
||||
case ImGuiStyleVar_IndentSpacing: return &g.Style.IndentSpacing;
|
||||
case ImGuiStyleVar_GrabMinSize: return &g.Style.GrabMinSize;
|
||||
case ImGuiStyleVar_ViewId: return &g.Style.ViewId;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
7
3rdparty/ocornut-imgui/imgui.h
vendored
7
3rdparty/ocornut-imgui/imgui.h
vendored
@@ -591,7 +591,8 @@ enum ImGuiStyleVar_
|
||||
ImGuiStyleVar_ItemSpacing, // ImVec2
|
||||
ImGuiStyleVar_ItemInnerSpacing, // ImVec2
|
||||
ImGuiStyleVar_IndentSpacing, // float
|
||||
ImGuiStyleVar_GrabMinSize // float
|
||||
ImGuiStyleVar_GrabMinSize, // float
|
||||
ImGuiStyleVar_ViewId // uint8_t
|
||||
};
|
||||
|
||||
enum ImGuiAlign_
|
||||
@@ -656,6 +657,7 @@ struct ImGuiStyle
|
||||
float ScrollbarSize; // Width of the vertical scrollbar, Height of the horizontal scrollbar
|
||||
float ScrollbarRounding; // Radius of grab corners for scrollbar
|
||||
float GrabMinSize; // Minimum width/height of a grab box for slider/scrollbar
|
||||
float ViewId;
|
||||
float GrabRounding; // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs.
|
||||
ImVec2 DisplayWindowPadding; // Window positions are clamped to be visible within the display area by at least this amount. Only covers regular windows.
|
||||
ImVec2 DisplaySafeAreaPadding; // If you cannot see the edge of your screen (e.g. on a TV) increase the safe area padding. Covers popups/tooltips as well regular windows.
|
||||
@@ -1037,8 +1039,9 @@ struct ImDrawCmd
|
||||
ImTextureID TextureId; // User-provided texture ID. Set by user in ImfontAtlas::SetTexID() for fonts or passed to Image*() functions. Ignore if never using images or multiple fonts atlas.
|
||||
ImDrawCallback UserCallback; // If != NULL, call the function instead of rendering the vertices. clip_rect and texture_id will be set normally.
|
||||
void* UserCallbackData; // The draw callback code can access this.
|
||||
unsigned char ViewId;
|
||||
|
||||
ImDrawCmd() { ElemCount = 0; ClipRect.x = ClipRect.y = -8192.0f; ClipRect.z = ClipRect.w = +8192.0f; TextureId = NULL; UserCallback = NULL; UserCallbackData = NULL; }
|
||||
ImDrawCmd() { ElemCount = 0; ClipRect.x = ClipRect.y = -8192.0f; ClipRect.z = ClipRect.w = +8192.0f; TextureId = NULL; UserCallback = NULL; UserCallbackData = NULL; ViewId = 0; }
|
||||
};
|
||||
|
||||
// Vertex index (override with, e.g. '#define ImDrawIdx unsigned int' in ImConfig)
|
||||
|
||||
2
3rdparty/ocornut-imgui/imgui_draw.cpp
vendored
2
3rdparty/ocornut-imgui/imgui_draw.cpp
vendored
@@ -139,6 +139,7 @@ void ImDrawList::AddDrawCmd()
|
||||
ImDrawCmd draw_cmd;
|
||||
draw_cmd.ClipRect = _ClipRectStack.Size ? _ClipRectStack.back() : GNullClipRect;
|
||||
draw_cmd.TextureId = _TextureIdStack.Size ? _TextureIdStack.back() : NULL;
|
||||
draw_cmd.ViewId = (unsigned char)(GImGui->Style.ViewId);
|
||||
|
||||
IM_ASSERT(draw_cmd.ClipRect.x <= draw_cmd.ClipRect.z && draw_cmd.ClipRect.y <= draw_cmd.ClipRect.w);
|
||||
CmdBuffer.push_back(draw_cmd);
|
||||
@@ -250,6 +251,7 @@ void ImDrawList::ChannelsSplit(int channels_count)
|
||||
ImDrawCmd draw_cmd;
|
||||
draw_cmd.ClipRect = _ClipRectStack.back();
|
||||
draw_cmd.TextureId = _TextureIdStack.back();
|
||||
draw_cmd.ViewId = (unsigned char)(GImGui->Style.ViewId);
|
||||
_Channels[i].CmdBuffer.push_back(draw_cmd);
|
||||
}
|
||||
}
|
||||
|
||||
12
3rdparty/ocornut-imgui/imgui_wm.cpp
vendored
12
3rdparty/ocornut-imgui/imgui_wm.cpp
vendored
@@ -16,7 +16,7 @@
|
||||
#include <algorithm>
|
||||
|
||||
#define IMGUI_NEW(type) new (ImGui::MemAlloc(sizeof(type) ) ) type
|
||||
#define IMGUI_DELETE(type, obj) reinterpret_cast<type*>(obj)->~type(), ImGui::MemFree(obj)
|
||||
#define IMGUI_DELETE(type, obj) static_cast<type*>(obj)->~type(), ImGui::MemFree(obj)
|
||||
#define IMGUI_DELETE_NULL(type, obj) for (;;) { if (NULL != obj) { IMGUI_DELETE(type, obj); obj = NULL; } break; }
|
||||
|
||||
namespace ImGuiWM
|
||||
@@ -768,7 +768,6 @@ namespace ImGuiWM
|
||||
//ImGui::PushStyleColor(ImGuiCol_ChildWindowBg, ImColor(59, 59, 59, 255));
|
||||
ImGui::BeginChild((*itActiveWindow)->GetId(), ImVec2(0, 0), false, ImGuiWindowFlags_HorizontalScrollbar);
|
||||
|
||||
|
||||
ImVec2 oWinPos = ImGui::GetWindowPos();
|
||||
ImVec2 oWinSize = ImGui::GetWindowSize();
|
||||
|
||||
@@ -935,7 +934,7 @@ namespace ImGuiWM
|
||||
{
|
||||
ImGui::GetIO().Fonts = NULL;
|
||||
}
|
||||
ImGui::Shutdown();
|
||||
|
||||
RestoreState();
|
||||
ImGui::MemFree(m_pState);
|
||||
}
|
||||
@@ -977,7 +976,9 @@ namespace ImGuiWM
|
||||
|
||||
void PlatformWindow::Paint()
|
||||
{
|
||||
PaintBegin();
|
||||
WindowManager::GetInstance()->Paint(this);
|
||||
PaintEnd();
|
||||
}
|
||||
|
||||
bool PlatformWindow::IsMain()
|
||||
@@ -1343,7 +1344,7 @@ namespace ImGuiWM
|
||||
|
||||
m_lOrphanWindows.remove(pAction->m_pWindow);
|
||||
|
||||
IMGUI_DELETE(PlatformWindowAction, pAction);
|
||||
IMGUI_DELETE(DockAction, pAction);
|
||||
m_lDockActions.erase(m_lDockActions.begin());
|
||||
}
|
||||
}
|
||||
@@ -1385,13 +1386,10 @@ namespace ImGuiWM
|
||||
}
|
||||
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(5.0f, 5.0f));
|
||||
|
||||
char name[64];
|
||||
ImFormatString(name, sizeof(name), "Window %p", pWindow);
|
||||
ImGui::Begin(name, NULL, iFlags);
|
||||
pWindow->PaintBegin();
|
||||
pWindow->PaintContainer();
|
||||
pWindow->PaintEnd();
|
||||
ImGui::End();
|
||||
ImGui::PopStyleVar(1);
|
||||
|
||||
|
||||
@@ -14,7 +14,11 @@
|
||||
#include <stb/stb_image.c>
|
||||
|
||||
#ifndef USE_ENTRY
|
||||
# define USE_ENTRY defined(SCI_NAMESPACE)
|
||||
# if defined(SCI_NAMESPACE)
|
||||
# define USE_ENTRY 1
|
||||
# else
|
||||
# define USE_ENTRY 0
|
||||
# endif // defined(SCI_NAMESPACE)
|
||||
#endif // USE_ENTRY
|
||||
|
||||
#if USE_ENTRY
|
||||
@@ -29,8 +33,6 @@
|
||||
#include "vs_ocornut_imgui.bin.h"
|
||||
#include "fs_ocornut_imgui.bin.h"
|
||||
|
||||
void viewCallback(const ImDrawList* _parentList, const ImDrawCmd* _cmd);
|
||||
|
||||
class PlatformWindow : public ImGuiWM::PlatformWindow
|
||||
{
|
||||
typedef ImGuiWM::PlatformWindow Super;
|
||||
@@ -47,7 +49,7 @@ public:
|
||||
&& !_isDragWindow)
|
||||
{
|
||||
m_window = entry::createWindow(0, 0, 640, 380);
|
||||
extern void pwToWindow(entry::WindowHandle _handle, PlatformWindow* _pw);
|
||||
extern void pwToWindow(entry::WindowHandle _handle, class PlatformWindow* _pw);
|
||||
pwToWindow(m_window, this);
|
||||
}
|
||||
else
|
||||
@@ -59,6 +61,12 @@ public:
|
||||
|
||||
virtual ~PlatformWindow()
|
||||
{
|
||||
#if USE_ENTRY
|
||||
if (0 != m_window.idx)
|
||||
{
|
||||
entry::destroyWindow(m_window);
|
||||
}
|
||||
#endif // USE_ENTRY
|
||||
}
|
||||
|
||||
virtual bool Init(ImGuiWM::PlatformWindow* /*_parent*/) BX_OVERRIDE
|
||||
@@ -100,7 +108,6 @@ public:
|
||||
|
||||
virtual void SetPosition(const ImVec2& _pos) BX_OVERRIDE
|
||||
{
|
||||
|
||||
#if USE_ENTRY
|
||||
if (0 != m_window.idx
|
||||
&& m_pos.x != _pos.x
|
||||
@@ -126,38 +133,9 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
virtual void PaintBegin()
|
||||
{
|
||||
#if USE_ENTRY
|
||||
if (!m_bIsDragWindow)
|
||||
{
|
||||
ImDrawList* drawList = ImGui::GetWindowDrawList();
|
||||
union { entry::WindowHandle handle; void* ptr; } cast = { m_window };
|
||||
drawList->AddCallback(viewCallback, cast.ptr);
|
||||
drawList->PushClipRect(ImVec4(0.0f, 0.0f, m_size.x, m_size.y) );
|
||||
}
|
||||
#endif // USE_ENTRY
|
||||
}
|
||||
|
||||
virtual void Paint() BX_OVERRIDE
|
||||
{
|
||||
if (!m_bIsDragWindow)
|
||||
{
|
||||
Super::Paint();
|
||||
}
|
||||
}
|
||||
|
||||
virtual void PaintEnd()
|
||||
{
|
||||
#if USE_ENTRY
|
||||
if (!m_bIsDragWindow)
|
||||
{
|
||||
ImDrawList* drawList = ImGui::GetWindowDrawList();
|
||||
drawList->PopClipRect();
|
||||
drawList->AddCallback(viewCallback, NULL);
|
||||
}
|
||||
#endif // USE_ENTRY
|
||||
}
|
||||
virtual void PaintBegin() BX_OVERRIDE;
|
||||
virtual void Paint() BX_OVERRIDE;
|
||||
virtual void PaintEnd() BX_OVERRIDE;
|
||||
|
||||
virtual void Destroy() BX_OVERRIDE
|
||||
{
|
||||
@@ -257,7 +235,7 @@ struct OcornutImguiContext
|
||||
const uint8_t viewId = window.m_viewId;
|
||||
bgfx::setViewClear(viewId
|
||||
, BGFX_CLEAR_COLOR|BGFX_CLEAR_DEPTH
|
||||
, 0x303030ff + rand()
|
||||
, 0x303030ff
|
||||
, 1.0f
|
||||
, 0
|
||||
);
|
||||
@@ -353,7 +331,7 @@ struct OcornutImguiContext
|
||||
bgfx::setTexture(0, s_tex, th);
|
||||
bgfx::setVertexBuffer(&tvb, 0, numVertices);
|
||||
bgfx::setIndexBuffer(&tib, offset, cmd->ElemCount);
|
||||
bgfx::submit(m_viewId, m_program);
|
||||
bgfx::submit(cmd->ViewId, m_program);
|
||||
}
|
||||
|
||||
offset += cmd->ElemCount;
|
||||
@@ -443,9 +421,11 @@ struct OcornutImguiContext
|
||||
uint8_t* data;
|
||||
int32_t width;
|
||||
int32_t height;
|
||||
void* font = ImGui::MemAlloc(_size);
|
||||
memcpy(font, _data, _size);
|
||||
io.Fonts->AddFontFromMemoryTTF(font, _size, _fontSize);
|
||||
{
|
||||
void* font = ImGui::MemAlloc(_size);
|
||||
memcpy(font, _data, _size);
|
||||
io.Fonts->AddFontFromMemoryTTF(font, _size, _fontSize);
|
||||
}
|
||||
|
||||
io.Fonts->GetTexDataAsRGBA32(&data, &width, &height);
|
||||
|
||||
@@ -498,18 +478,16 @@ struct OcornutImguiContext
|
||||
};
|
||||
|
||||
Window* w0 = new Window("test");
|
||||
WindowX* w1 = new WindowX("abcd");
|
||||
WindowX* w1 = new WindowX("Scintilla");
|
||||
Window* w2 = new Window("xyzw");
|
||||
Window* w3 = new Window("0123");
|
||||
|
||||
m_wm->Dock(w0);
|
||||
m_wm->DockWith(w1, w0, ImGuiWM::E_DOCK_ORIENTATION_RIGHT);
|
||||
m_wm->DockWith(w2, w1, ImGuiWM::E_DOCK_ORIENTATION_BOTTOM);
|
||||
m_wm->DockWith(w3, w0, ImGuiWM::E_DOCK_ORIENTATION_BOTTOM);
|
||||
m_wm->Dock(w0);
|
||||
m_wm->DockWith(w1, w0, ImGuiWM::E_DOCK_ORIENTATION_RIGHT);
|
||||
m_wm->DockWith(w2, w1, ImGuiWM::E_DOCK_ORIENTATION_BOTTOM);
|
||||
m_wm->DockWith(w3, w0, ImGuiWM::E_DOCK_ORIENTATION_BOTTOM);
|
||||
}
|
||||
#endif // 0
|
||||
|
||||
ImGui::NewFrame();
|
||||
}
|
||||
|
||||
void destroy()
|
||||
@@ -527,8 +505,7 @@ struct OcornutImguiContext
|
||||
|
||||
void beginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, int _width, int _height, char _inputChar, uint8_t _viewId)
|
||||
{
|
||||
m_viewId = _viewId;
|
||||
m_defaultViewId = _viewId;
|
||||
m_viewId = _viewId;
|
||||
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
if (_inputChar < 0x7f)
|
||||
@@ -563,6 +540,7 @@ struct OcornutImguiContext
|
||||
#endif // defined(SCI_NAMESPACE)
|
||||
|
||||
ImGui::NewFrame();
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_ViewId, (float)_viewId);
|
||||
|
||||
#if 0
|
||||
ImGui::ShowTestWindow(); //Debug only.
|
||||
@@ -578,6 +556,7 @@ struct OcornutImguiContext
|
||||
void endFrame()
|
||||
{
|
||||
m_wm->Run();
|
||||
ImGui::PopStyleVar(1);
|
||||
ImGui::Render();
|
||||
}
|
||||
|
||||
@@ -590,7 +569,6 @@ struct OcornutImguiContext
|
||||
int64_t m_last;
|
||||
int32_t m_lastScroll;
|
||||
uint8_t m_viewId;
|
||||
uint8_t m_defaultViewId;
|
||||
|
||||
#if USE_ENTRY
|
||||
struct Window
|
||||
@@ -612,22 +590,53 @@ struct OcornutImguiContext
|
||||
|
||||
static OcornutImguiContext s_ctx;
|
||||
|
||||
#if USE_ENTRY
|
||||
|
||||
void viewCallback(const ImDrawList* /*_parentList*/, const ImDrawCmd* _cmd)
|
||||
void PlatformWindow::PaintBegin()
|
||||
{
|
||||
union { void* ptr; entry::WindowHandle handle; } cast = { _cmd->UserCallbackData };
|
||||
#if USE_ENTRY
|
||||
if (!m_bIsDragWindow)
|
||||
{
|
||||
OcornutImguiContext::Window& win = s_ctx.m_window[m_window.idx];
|
||||
entry::WindowState& state = win.m_state;
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
io.MousePos = ImVec2((float)state.m_mouse.m_mx, (float)state.m_mouse.m_my);
|
||||
io.MouseDown[0] = !!state.m_mouse.m_buttons[entry::MouseButton::Left];
|
||||
io.MouseDown[1] = !!state.m_mouse.m_buttons[entry::MouseButton::Right];
|
||||
io.MouseDown[2] = !!state.m_mouse.m_buttons[entry::MouseButton::Middle];
|
||||
io.MouseWheel = float(state.m_mouse.m_mz);
|
||||
|
||||
if (0 != cast.handle.idx)
|
||||
{
|
||||
s_ctx.m_viewId = s_ctx.m_window[cast.handle.idx].m_viewId;
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_ViewId, (float)win.m_viewId);
|
||||
}
|
||||
else
|
||||
#endif // USE_ENTRY
|
||||
}
|
||||
|
||||
void PlatformWindow::Paint()
|
||||
{
|
||||
if (!m_bIsDragWindow)
|
||||
{
|
||||
s_ctx.m_viewId = s_ctx.m_defaultViewId;
|
||||
Super::Paint();
|
||||
}
|
||||
}
|
||||
|
||||
void PlatformWindow::PaintEnd()
|
||||
{
|
||||
#if USE_ENTRY
|
||||
if (!m_bIsDragWindow)
|
||||
{
|
||||
ImGui::PopStyleVar(1);
|
||||
|
||||
entry::WindowState& state = s_ctx.m_window[0].m_state;
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
io.MousePos = ImVec2((float)state.m_mouse.m_mx, (float)state.m_mouse.m_my);
|
||||
io.MouseDown[0] = !!state.m_mouse.m_buttons[entry::MouseButton::Left];
|
||||
io.MouseDown[1] = !!state.m_mouse.m_buttons[entry::MouseButton::Right];
|
||||
io.MouseDown[2] = !!state.m_mouse.m_buttons[entry::MouseButton::Middle];
|
||||
io.MouseWheel = float(state.m_mouse.m_mz);
|
||||
}
|
||||
#endif // USE_ENTRY
|
||||
}
|
||||
|
||||
#if USE_ENTRY
|
||||
|
||||
void pwToWindow(entry::WindowHandle _handle, PlatformWindow* _pw)
|
||||
{
|
||||
s_ctx.m_window[_handle.idx].m_pw = _pw;
|
||||
@@ -656,7 +665,7 @@ void imguiUpdateWindow(const entry::WindowState& _state)
|
||||
}
|
||||
else
|
||||
{
|
||||
window.m_viewId = s_ctx.m_defaultViewId;
|
||||
window.m_viewId = s_ctx.m_viewId;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -674,9 +683,9 @@ void OcornutImguiContext::memFree(void* _ptr)
|
||||
BX_FREE(s_ctx.m_allocator, _ptr);
|
||||
}
|
||||
|
||||
void OcornutImguiContext::renderDrawLists(ImDrawData* draw_data)
|
||||
void OcornutImguiContext::renderDrawLists(ImDrawData* _drawData)
|
||||
{
|
||||
s_ctx.render(draw_data);
|
||||
s_ctx.render(_drawData);
|
||||
}
|
||||
|
||||
void IMGUI_create(const void* _data, uint32_t _size, float _fontSize, bx::AllocatorI* _allocator)
|
||||
|
||||
@@ -1101,7 +1101,7 @@ namespace Scintilla
|
||||
|
||||
} // namespace Scintilla
|
||||
|
||||
ScintillaEditor* ImGuiScintilla(const char* _name, bool* _opened, const ImVec2& _size)
|
||||
ScintillaEditor* ImGuiScintilla(const char* _name, bool* /*_opened*/, const ImVec2& /*_size*/)
|
||||
{
|
||||
ScintillaEditor* sci = NULL;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user