|
@@ -130,13 +130,15 @@ CODE
|
|
|
|
|
|
- Read the FAQ below this section!
|
|
- Read the FAQ below this section!
|
|
- Your code creates the UI, if your code doesn't run the UI is gone! The UI can be highly dynamic, there are no construction
|
|
- Your code creates the UI, if your code doesn't run the UI is gone! The UI can be highly dynamic, there are no construction
|
|
- or destruction steps, less data retention on your side, less state duplication, less state synchronization, less bugs.
|
|
|
|
|
|
+ or destruction steps, less superfluous data retention on your side, less state duplication, less state synchronization, less bugs.
|
|
- Call and read ImGui::ShowDemoWindow() for demo code demonstrating most features.
|
|
- Call and read ImGui::ShowDemoWindow() for demo code demonstrating most features.
|
|
- - You can learn about immediate-mode gui principles at http://www.johno.se/book/imgui.html or watch http://mollyrocket.com/861
|
|
|
|
|
|
+ - You can learn about immediate-mode GUI principles at http://www.johno.se/book/imgui.html or watch http://mollyrocket.com/861
|
|
|
|
+ See README.md for more links describing the IMGUI paradigm. Dear ImGui is an implementation of the IMGUI paradigm.
|
|
|
|
|
|
HOW TO UPDATE TO A NEWER VERSION OF DEAR IMGUI
|
|
HOW TO UPDATE TO A NEWER VERSION OF DEAR IMGUI
|
|
|
|
|
|
- Overwrite all the sources files except for imconfig.h (if you have made modification to your copy of imconfig.h)
|
|
- Overwrite all the sources files except for imconfig.h (if you have made modification to your copy of imconfig.h)
|
|
|
|
+ - Or maintain your own branch where you have imconfig.h modified.
|
|
- Read the "API BREAKING CHANGES" section (below). This is where we list occasional API breaking changes.
|
|
- Read the "API BREAKING CHANGES" section (below). This is where we list occasional API breaking changes.
|
|
If a function/type has been renamed / or marked obsolete, try to fix the name in your code before it is permanently removed
|
|
If a function/type has been renamed / or marked obsolete, try to fix the name in your code before it is permanently removed
|
|
from the public API. If you have a problem with a missing function/symbols, search for its name in the code, there will
|
|
from the public API. If you have a problem with a missing function/symbols, search for its name in the code, there will
|
|
@@ -145,24 +147,24 @@ CODE
|
|
|
|
|
|
GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE
|
|
GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE
|
|
|
|
|
|
- - Run and study the examples and demo to get acquainted with the library.
|
|
|
|
|
|
+ - Run and study the examples and demo in imgui_demo.cpp to get acquainted with the library.
|
|
- Add the Dear ImGui source files to your projects or using your preferred build system.
|
|
- Add the Dear ImGui source files to your projects or using your preferred build system.
|
|
- It is recommended you build the .cpp files as part of your project and not as a library.
|
|
|
|
- - You can later customize the imconfig.h file to tweak some compilation time behavior, such as integrating imgui types with your own maths types.
|
|
|
|
- - You may be able to grab and copy a ready made imgui_impl_*** file from the examples/ folder.
|
|
|
|
|
|
+ It is recommended you build and statically link the .cpp files as part of your project and not as shared library (DLL).
|
|
|
|
+ - You can later customize the imconfig.h file to tweak some compile-time behavior, such as integrating imgui types with your own maths types.
|
|
- When using Dear ImGui, your programming IDE is your friend: follow the declaration of variables, functions and types to find comments about them.
|
|
- When using Dear ImGui, your programming IDE is your friend: follow the declaration of variables, functions and types to find comments about them.
|
|
- Dear ImGui never touches or knows about your GPU state. The only function that knows about GPU is the draw function that you provide.
|
|
- Dear ImGui never touches or knows about your GPU state. The only function that knows about GPU is the draw function that you provide.
|
|
Effectively it means you can create widgets at any time in your code, regardless of considerations of being in "update" vs "render"
|
|
Effectively it means you can create widgets at any time in your code, regardless of considerations of being in "update" vs "render"
|
|
phases of your own application. All rendering informatioe are stored into command-lists that you will retrieve after calling ImGui::Render().
|
|
phases of your own application. All rendering informatioe are stored into command-lists that you will retrieve after calling ImGui::Render().
|
|
- Refer to the bindings and demo applications in the examples/ folder for instruction on how to setup your code.
|
|
- Refer to the bindings and demo applications in the examples/ folder for instruction on how to setup your code.
|
|
|
|
+ - If you are running over a standard OS with a common graphics API, you should be able to use unmodified imgui_impl_*** files from the examples/ folder.
|
|
|
|
|
|
- THIS IS HOW A SIMPLE APPLICATION MAY LOOK LIKE
|
|
|
|
|
|
+ HOW A SIMPLE APPLICATION MAY LOOK LIKE
|
|
EXHIBIT 1: USING THE EXAMPLE BINDINGS (imgui_impl_XXX.cpp files from the examples/ folder)
|
|
EXHIBIT 1: USING THE EXAMPLE BINDINGS (imgui_impl_XXX.cpp files from the examples/ folder)
|
|
|
|
|
|
// Application init: create a dear imgui context, setup some options, load fonts
|
|
// Application init: create a dear imgui context, setup some options, load fonts
|
|
ImGui::CreateContext();
|
|
ImGui::CreateContext();
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
- // TODO: Set optional io.ConfigFlags values, e.g. 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard' to enable keyboard controls
|
|
|
|
|
|
+ // TODO: Set optional io.ConfigFlags values, e.g. 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard' to enable keyboard controls.
|
|
// TODO: Fill optional fields of the io structure later.
|
|
// TODO: Fill optional fields of the io structure later.
|
|
// TODO: Load TTF/OTF fonts if you don't want to use the default font.
|
|
// TODO: Load TTF/OTF fonts if you don't want to use the default font.
|
|
|
|
|
|
@@ -192,13 +194,13 @@ CODE
|
|
ImGui_ImplWin32_Shutdown();
|
|
ImGui_ImplWin32_Shutdown();
|
|
ImGui::DestroyContext();
|
|
ImGui::DestroyContext();
|
|
|
|
|
|
- THIS IS HOW A SIMPLE APPLICATION MAY LOOK LIKE
|
|
|
|
|
|
+ HOW A SIMPLE APPLICATION MAY LOOK LIKE
|
|
EXHIBIT 2: IMPLEMENTING CUSTOM BINDING / CUSTOM ENGINE
|
|
EXHIBIT 2: IMPLEMENTING CUSTOM BINDING / CUSTOM ENGINE
|
|
|
|
|
|
// Application init: create a dear imgui context, setup some options, load fonts
|
|
// Application init: create a dear imgui context, setup some options, load fonts
|
|
ImGui::CreateContext();
|
|
ImGui::CreateContext();
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
- // TODO: Set optional io.ConfigFlags values, e.g. 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard' to enable keyboard controls
|
|
|
|
|
|
+ // TODO: Set optional io.ConfigFlags values, e.g. 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard' to enable keyboard controls.
|
|
// TODO: Fill optional fields of the io structure later.
|
|
// TODO: Fill optional fields of the io structure later.
|
|
// TODO: Load TTF/OTF fonts if you don't want to use the default font.
|
|
// TODO: Load TTF/OTF fonts if you don't want to use the default font.
|
|
|
|
|
|
@@ -247,7 +249,7 @@ CODE
|
|
// Shutdown
|
|
// Shutdown
|
|
ImGui::DestroyContext();
|
|
ImGui::DestroyContext();
|
|
|
|
|
|
- THIS HOW A SIMPLE RENDERING FUNCTION MAY LOOK LIKE
|
|
|
|
|
|
+ HOW A SIMPLE RENDERING FUNCTION MAY LOOK LIKE
|
|
|
|
|
|
void void MyImGuiRenderFunction(ImDrawData* draw_data)
|
|
void void MyImGuiRenderFunction(ImDrawData* draw_data)
|
|
{
|
|
{
|
|
@@ -269,22 +271,22 @@ CODE
|
|
else
|
|
else
|
|
{
|
|
{
|
|
// The texture for the draw call is specified by pcmd->TextureId.
|
|
// The texture for the draw call is specified by pcmd->TextureId.
|
|
- // The vast majority of draw calls with use the imgui texture atlas, which value you have set yourself during initialization.
|
|
|
|
- MyEngineBindTexture(pcmd->TextureId);
|
|
|
|
|
|
+ // The vast majority of draw calls will use the imgui texture atlas, which value you have set yourself during initialization.
|
|
|
|
+ MyEngineBindTexture((MyTexture*)pcmd->TextureId);
|
|
|
|
|
|
// We are using scissoring to clip some objects. All low-level graphics API should supports it.
|
|
// We are using scissoring to clip some objects. All low-level graphics API should supports it.
|
|
// - If your engine doesn't support scissoring yet, you may ignore this at first. You will get some small glitches
|
|
// - If your engine doesn't support scissoring yet, you may ignore this at first. You will get some small glitches
|
|
- // (some elements visible outside their bounds) but you can fix that once everywhere else works!
|
|
|
|
|
|
+ // (some elements visible outside their bounds) but you can fix that once everything else works!
|
|
// - Clipping coordinates are provided in imgui coordinates space (from draw_data->DisplayPos to draw_data->DisplayPos + draw_data->DisplaySize)
|
|
// - Clipping coordinates are provided in imgui coordinates space (from draw_data->DisplayPos to draw_data->DisplayPos + draw_data->DisplaySize)
|
|
// In a single viewport application, draw_data->DisplayPos will always be (0,0) and draw_data->DisplaySize will always be == io.DisplaySize.
|
|
// In a single viewport application, draw_data->DisplayPos will always be (0,0) and draw_data->DisplaySize will always be == io.DisplaySize.
|
|
- // However, in the interest of supporting multi-viewport applications in the future, always subtract draw_data->DisplayPos from
|
|
|
|
- // clipping bounds to convert them to your viewport space.
|
|
|
|
|
|
+ // However, in the interest of supporting multi-viewport applications in the future (see 'viewport' 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)
|
|
// - 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;
|
|
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));
|
|
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));
|
|
|
|
|
|
// Render 'pcmd->ElemCount/3' indexed triangles.
|
|
// Render 'pcmd->ElemCount/3' indexed triangles.
|
|
- // By default the indices ImDrawIdx are 16-bits, you can change them to 32-bits if your engine doesn't support 16-bits indices.
|
|
|
|
|
|
+ // By default the indices ImDrawIdx are 16-bits, you can change them to 32-bits in imconfig.h if your engine doesn't support 16-bits 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, vtx_buffer);
|
|
}
|
|
}
|
|
idx_buffer += pcmd->ElemCount;
|
|
idx_buffer += pcmd->ElemCount;
|
|
@@ -292,15 +294,16 @@ CODE
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- - The examples/ folders contains many functional implementation of the pseudo-code above.
|
|
|
|
|
|
+ - The examples/ folders contains many actual implementation of the pseudo-codes above.
|
|
- When calling NewFrame(), the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags are updated.
|
|
- When calling NewFrame(), the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags are updated.
|
|
- They tell you if ImGui intends to use your inputs. When a flag is set you want to hide the corresponding inputs from the rest of your application.
|
|
|
|
- In both cases you need to pass on the inputs to imgui. Read the FAQ below for more information about those flags.
|
|
|
|
- - Please read the FAQ above. Amusingly, it is called a FAQ because people frequently have the same issues!
|
|
|
|
|
|
+ They tell you if Dear ImGui intends to use your inputs. When a flag is set you want to hide the corresponding inputs
|
|
|
|
+ from the rest of your application. In every cases you need to pass on the inputs to imgui. Refer to the FAQ for more information.
|
|
|
|
+ - Please read the FAQ below!. Amusingly, it is called a FAQ because people frequently run into the same issues!
|
|
|
|
|
|
USING GAMEPAD/KEYBOARD NAVIGATION CONTROLS
|
|
USING GAMEPAD/KEYBOARD NAVIGATION CONTROLS
|
|
|
|
|
|
- The gamepad/keyboard navigation is fairly functional and keeps being improved.
|
|
- The gamepad/keyboard navigation is fairly functional and keeps being improved.
|
|
|
|
+ - Gamepad support is particularly useful to use dear imgui on a console system (e.g. PS4, Switch, XB1) without a mouse!
|
|
- You can ask questions and report issues at https://github.com/ocornut/imgui/issues/787
|
|
- You can ask questions and report issues at https://github.com/ocornut/imgui/issues/787
|
|
- The initial focus was to support game controllers, but keyboard is becoming increasingly and decently usable.
|
|
- The initial focus was to support game controllers, but keyboard is becoming increasingly and decently usable.
|
|
- Gamepad:
|
|
- Gamepad:
|
|
@@ -536,7 +539,7 @@ CODE
|
|
- When 'io.WantCaptureKeyboard' is set, imgui wants to use your keyboard state, and you may want to discard/hide the inputs from the rest of your application.
|
|
- When 'io.WantCaptureKeyboard' is set, imgui wants to use your keyboard state, and you may want to discard/hide the inputs from the rest of your application.
|
|
- When 'io.WantTextInput' is set to may want to notify your OS to popup an on-screen keyboard, if available (e.g. on a mobile phone, or console OS).
|
|
- When 'io.WantTextInput' is set to may want to notify your OS to popup an on-screen keyboard, if available (e.g. on a mobile phone, or console OS).
|
|
Note: you should always pass your mouse/keyboard inputs to imgui, even when the io.WantCaptureXXX flag are set false.
|
|
Note: you should always pass your mouse/keyboard inputs to imgui, even when the io.WantCaptureXXX flag are set false.
|
|
- This is because imgui needs to detect that you clicked in the void to unfocus its windows.
|
|
|
|
|
|
+ This is because imgui needs to detect that you clicked in the void to unfocus its own windows.
|
|
Note: The 'io.WantCaptureMouse' is more accurate that any attempt to "check if the mouse is hovering a window" (don't do that!).
|
|
Note: The 'io.WantCaptureMouse' is more accurate that any attempt to "check if the mouse is hovering a window" (don't do that!).
|
|
It handle mouse dragging correctly (both dragging that started over your application or over an imgui window) and handle e.g. modal windows blocking inputs.
|
|
It handle mouse dragging correctly (both dragging that started over your application or over an imgui window) and handle e.g. modal windows blocking inputs.
|
|
Those flags are updated by ImGui::NewFrame(). Preferably read the flags after calling NewFrame() if you can afford it, but reading them before is also
|
|
Those flags are updated by ImGui::NewFrame(). Preferably read the flags after calling NewFrame() if you can afford it, but reading them before is also
|
|
@@ -548,7 +551,7 @@ CODE
|
|
Q: How can I display an image? What is ImTextureID, how does it works?
|
|
Q: How can I display an image? What is ImTextureID, how does it works?
|
|
A: Short explanation:
|
|
A: Short explanation:
|
|
- You may use functions such as ImGui::Image(), ImGui::ImageButton() or lower-level ImDrawList::AddImage() to emit draw calls that will use your own textures.
|
|
- You may use functions such as ImGui::Image(), ImGui::ImageButton() or lower-level ImDrawList::AddImage() to emit draw calls that will use your own textures.
|
|
- - Actual textures are identified in a way that is up to the user/engine.
|
|
|
|
|
|
+ - Actual textures are identified in a way that is up to the user/engine. Those identifiers are stored and passed as ImTextureID (void*) value.
|
|
- Loading image files from the disk and turning them into a texture is not within the scope of Dear ImGui (for a good reason).
|
|
- Loading image files from the disk and turning them into a texture is not within the scope of Dear ImGui (for a good reason).
|
|
Please read documentations or tutorials on your graphics API to understand how to display textures on the screen before moving onward.
|
|
Please read documentations or tutorials on your graphics API to understand how to display textures on the screen before moving onward.
|
|
|
|
|
|
@@ -607,6 +610,8 @@ CODE
|
|
GLuint my_opengl_texture;
|
|
GLuint my_opengl_texture;
|
|
glGenTextures(1, &my_opengl_texture);
|
|
glGenTextures(1, &my_opengl_texture);
|
|
glBindTexture(GL_TEXTURE_2D, my_opengl_texture);
|
|
glBindTexture(GL_TEXTURE_2D, my_opengl_texture);
|
|
|
|
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
|
|
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image_width, image_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data);
|
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image_width, image_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data);
|
|
|
|
|
|
@@ -673,7 +678,7 @@ CODE
|
|
|
|
|
|
- If you want to completely hide the label, but still need an ID:
|
|
- If you want to completely hide the label, but still need an ID:
|
|
|
|
|
|
- Checkbox("##On", &b); // Label = "", ID = hash of (..., "##On") // No visible label!
|
|
|
|
|
|
+ Checkbox("##On", &b); // Label = "", ID = hash of (..., "##On") // No visible label, just a checkbox!
|
|
|
|
|
|
- Occasionally/rarely you might want change a label while preserving a constant ID. This allows
|
|
- Occasionally/rarely you might want change a label while preserving a constant ID. This allows
|
|
you to animate labels. For example you may want to include varying information in a window title bar,
|
|
you to animate labels. For example you may want to include varying information in a window title bar,
|
|
@@ -683,7 +688,7 @@ CODE
|
|
Button("World###ID"; // Label = "World", ID = hash of (..., "ID") // Same as above, even though the label looks different
|
|
Button("World###ID"; // Label = "World", ID = hash of (..., "ID") // Same as above, even though the label looks different
|
|
|
|
|
|
sprintf(buf, "My game (%f FPS)###MyGame", fps);
|
|
sprintf(buf, "My game (%f FPS)###MyGame", fps);
|
|
- Begin(buf); // Variable label, ID = hash of "MyGame"
|
|
|
|
|
|
+ Begin(buf); // Variable title, ID = hash of "MyGame"
|
|
|
|
|
|
- Solving ID conflict in a more general manner:
|
|
- Solving ID conflict in a more general manner:
|
|
Use PushID() / PopID() to create scopes and manipulate the ID stack, as to avoid ID conflicts
|
|
Use PushID() / PopID() to create scopes and manipulate the ID stack, as to avoid ID conflicts
|
|
@@ -750,7 +755,8 @@ CODE
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels);
|
|
io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels);
|
|
io.Fonts->GetTexDataAsRGBA32() or GetTexDataAsAlpha8()
|
|
io.Fonts->GetTexDataAsRGBA32() or GetTexDataAsAlpha8()
|
|
- (default is ProggyClean.ttf, rendered at size 13, embedded in dear imgui's source code)
|
|
|
|
|
|
+ Default is ProggyClean.ttf, rendered at size 13, embedded in dear imgui's source code.
|
|
|
|
+ (Read the 'misc/fonts/README.txt' file for more details about font loading.)
|
|
|
|
|
|
New programmers: remember that in C/C++ and most programming languages if you want to use a
|
|
New programmers: remember that in C/C++ and most programming languages if you want to use a
|
|
backslash \ within a string literal, you need to write it double backslash "\\":
|
|
backslash \ within a string literal, you need to write it double backslash "\\":
|
|
@@ -760,12 +766,12 @@ CODE
|
|
|
|
|
|
Q: How can I easily use icons in my application?
|
|
Q: How can I easily use icons in my application?
|
|
A: The most convenient and practical way is to merge an icon font such as FontAwesome inside you
|
|
A: The most convenient and practical way is to merge an icon font such as FontAwesome inside you
|
|
- main font. Then you can refer to icons within your strings. Read 'How can I load multiple fonts?'
|
|
|
|
- and the file 'misc/fonts/README.txt' for instructions and useful header files.
|
|
|
|
|
|
+ main font. Then you can refer to icons within your strings.
|
|
|
|
+ (Read the 'misc/fonts/README.txt' file for more details about icons font loading.)
|
|
|
|
|
|
Q: How can I load multiple fonts?
|
|
Q: How can I load multiple fonts?
|
|
A: Use the font atlas to pack them into a single texture:
|
|
A: Use the font atlas to pack them into a single texture:
|
|
- (Read misc/fonts/README.txt and the code in ImFontAtlas for more details.)
|
|
|
|
|
|
+ (Read the 'misc/fonts/README.txt' file and the code in ImFontAtlas for more details.)
|
|
|
|
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
ImFont* font0 = io.Fonts->AddFontDefault();
|
|
ImFont* font0 = io.Fonts->AddFontDefault();
|
|
@@ -784,7 +790,7 @@ CODE
|
|
io.Fonts->LoadFromFileTTF("myfontfile.ttf", size_pixels, &config);
|
|
io.Fonts->LoadFromFileTTF("myfontfile.ttf", size_pixels, &config);
|
|
|
|
|
|
// Combine multiple fonts into one (e.g. for icon fonts)
|
|
// Combine multiple fonts into one (e.g. for icon fonts)
|
|
- ImWchar ranges[] = { 0xf000, 0xf3ff, 0 };
|
|
|
|
|
|
+ static ImWchar ranges[] = { 0xf000, 0xf3ff, 0 };
|
|
ImFontConfig config;
|
|
ImFontConfig config;
|
|
config.MergeMode = true;
|
|
config.MergeMode = true;
|
|
io.Fonts->AddFontDefault();
|
|
io.Fonts->AddFontDefault();
|
|
@@ -819,10 +825,12 @@ CODE
|
|
the default implementation of io.ImeSetInputScreenPosFn() to set your Microsoft IME position correctly.
|
|
the default implementation of io.ImeSetInputScreenPosFn() to set your Microsoft IME position correctly.
|
|
|
|
|
|
Q: How can I use the drawing facilities without an ImGui window? (using ImDrawList API)
|
|
Q: How can I use the drawing facilities without an ImGui window? (using ImDrawList API)
|
|
- A: - You can create a dummy window. Call SetNextWindowBgAlpha(0.0f), call Begin() with NoTitleBar|NoResize|NoMove|NoScrollbar|NoSavedSettings|NoInputs flags.
|
|
|
|
|
|
+ A: - You can create a dummy window. Call Begin() with the NoBackground | NoDecoration | NoSavedSettings | NoInputs flags.
|
|
|
|
+ (The ImGuiWindowFlags_NoDecoration flag itself is a shortcut for NoTitleBar | NoResize | NoScrollbar | NoCollapse)
|
|
Then you can retrieve the ImDrawList* via GetWindowDrawList() and draw to it in any way you like.
|
|
Then you can retrieve the ImDrawList* via GetWindowDrawList() and draw to it in any way you like.
|
|
- You can call ImGui::GetOverlayDrawList() and use this draw list to display contents over every other imgui windows (1 overlay per viewport).
|
|
- You can call ImGui::GetOverlayDrawList() and use this draw list to display contents over every other imgui windows (1 overlay per viewport).
|
|
- - You can create your own ImDrawList instance. You'll need to initialize them ImGui::GetDrawListSharedData(), or create your own ImDrawListSharedData.
|
|
|
|
|
|
+ - You can create your own ImDrawList instance. You'll need to initialize them ImGui::GetDrawListSharedData(), or create your own ImDrawListSharedData,
|
|
|
|
+ and then call your rendered code with your own ImDrawList or ImDrawData data.
|
|
|
|
|
|
Q: I integrated Dear ImGui in my engine and the text or lines are blurry..
|
|
Q: I integrated Dear ImGui in my engine and the text or lines are blurry..
|
|
A: In your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f).
|
|
A: In your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f).
|
|
@@ -834,7 +842,7 @@ CODE
|
|
|
|
|
|
Q: How can I help?
|
|
Q: How can I help?
|
|
A: - If you are experienced with Dear ImGui and C++, look at the github issues, or docs/TODO.txt and see how you want/can help!
|
|
A: - If you are experienced with Dear ImGui and C++, look at the github issues, or docs/TODO.txt and see how you want/can help!
|
|
- - Convince your company to fund development time! Individual users: you can also become a Patron (patreon.com/imgui) or donate on PayPal! See README.
|
|
|
|
|
|
+ - Convince your company to sponsor/fund development! Individual users: you can also become a Patron (patreon.com/imgui) or donate on PayPal! See README.
|
|
- Disclose your usage of dear imgui via a dev blog post, a tweet, a screenshot, a mention somewhere etc.
|
|
- Disclose your usage of dear imgui via a dev blog post, a tweet, a screenshot, a mention somewhere etc.
|
|
You may post screenshot or links in the gallery threads (github.com/ocornut/imgui/issues/1269). Visuals are ideal as they inspire other programmers.
|
|
You may post screenshot or links in the gallery threads (github.com/ocornut/imgui/issues/1269). Visuals are ideal as they inspire other programmers.
|
|
But even without visuals, disclosing your use of dear imgui help the library grow credibility, and help other teams and programmers with taking decisions.
|
|
But even without visuals, disclosing your use of dear imgui help the library grow credibility, and help other teams and programmers with taking decisions.
|
|
@@ -981,7 +989,7 @@ extern void ImGuiTestEngineHook_ItemAdd(const ImRect& bb, ImGuiID id
|
|
// [SECTION] CONTEXT AND MEMORY ALLOCATORS
|
|
// [SECTION] CONTEXT AND MEMORY ALLOCATORS
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
-// Current context pointer. Implicitly used by all ImGui functions. Always assumed to be != NULL.
|
|
|
|
|
|
+// Current context pointer. Implicitly used by all Dear ImGui functions. Always assumed to be != NULL.
|
|
// CreateContext() will automatically set this pointer if it is NULL. Change to a different context by calling ImGui::SetCurrentContext().
|
|
// CreateContext() will automatically set this pointer if it is NULL. Change to a different context by calling ImGui::SetCurrentContext().
|
|
// If you use DLL hotreloading you might need to call SetCurrentContext() after reloading code from this file.
|
|
// If you use DLL hotreloading you might need to call SetCurrentContext() after reloading code from this file.
|
|
// ImGui functions are not thread-safe because of this pointer. If you want thread-safety to allow N threads to access N different contexts, you can:
|
|
// ImGui functions are not thread-safe because of this pointer. If you want thread-safety to allow N threads to access N different contexts, you can:
|
|
@@ -2534,7 +2542,7 @@ void ImGui::SetHoveredID(ImGuiID id)
|
|
g.HoveredId = id;
|
|
g.HoveredId = id;
|
|
g.HoveredIdAllowOverlap = false;
|
|
g.HoveredIdAllowOverlap = false;
|
|
if (id != 0 && g.HoveredIdPreviousFrame != id)
|
|
if (id != 0 && g.HoveredIdPreviousFrame != id)
|
|
- g.HoveredIdTimer = 0.0f;
|
|
|
|
|
|
+ g.HoveredIdTimer = g.HoveredIdNotActiveTimer = 0.0f;
|
|
}
|
|
}
|
|
|
|
|
|
ImGuiID ImGui::GetHoveredID()
|
|
ImGuiID ImGui::GetHoveredID()
|
|
@@ -3324,8 +3332,12 @@ void ImGui::NewFrame()
|
|
// Clear reference to active widget if the widget isn't alive anymore
|
|
// Clear reference to active widget if the widget isn't alive anymore
|
|
if (!g.HoveredIdPreviousFrame)
|
|
if (!g.HoveredIdPreviousFrame)
|
|
g.HoveredIdTimer = 0.0f;
|
|
g.HoveredIdTimer = 0.0f;
|
|
|
|
+ if (!g.HoveredIdPreviousFrame || (g.HoveredId && g.ActiveId == g.HoveredId))
|
|
|
|
+ g.HoveredIdNotActiveTimer = 0.0f;
|
|
if (g.HoveredId)
|
|
if (g.HoveredId)
|
|
g.HoveredIdTimer += g.IO.DeltaTime;
|
|
g.HoveredIdTimer += g.IO.DeltaTime;
|
|
|
|
+ if (g.HoveredId && g.ActiveId != g.HoveredId)
|
|
|
|
+ g.HoveredIdNotActiveTimer += g.IO.DeltaTime;
|
|
g.HoveredIdPreviousFrame = g.HoveredId;
|
|
g.HoveredIdPreviousFrame = g.HoveredId;
|
|
g.HoveredId = 0;
|
|
g.HoveredId = 0;
|
|
g.HoveredIdAllowOverlap = false;
|
|
g.HoveredIdAllowOverlap = false;
|