diff --git a/imgui.cpp b/imgui.cpp index 632e278a..cc9528a7 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -56,10 +56,11 @@ 3/ ImGui::Render() to render all the accumulated command-lists. it will call your RenderDrawListFn handler that you set in the IO structure. - all rendering information are stored into command-lists until ImGui::Render() is called. - effectively it means you can create widgets at any time in your code, regardless of "update" vs "render" considerations. + - refer to the examples applications in the examples/ folder for instruction on how to setup your code. - a typical application skeleton may be: // Application init - // TODO: Fill all 'Settings' fields of the io structure + // TODO: Fill all settings fields of the io structure ImGuiIO& io = ImGui::GetIO(); io.DisplaySize.x = 1920.0f; io.DisplaySize.y = 1280.0f; @@ -87,14 +88,33 @@ // swap video buffer, etc. } + TROUBLESHOOTING & FREQUENTLY ASKED QUESTIONS + - 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) - try adjusting ImGui::GetIO().PixelCenterOffset to 0.5f or 0.375f - - some widgets carry state and requires an unique ID to do so. - - unique ID are typically derived from a string label, an indice or a pointer. - - use PushID/PopID to easily create scopes and avoid ID conflicts. A Window is also an implicit scope. - - when creating trees, ID are particularly important because you want to preserve the opened/closed state of tree nodes. + - if you can only see text but no solid shapes or lines: + - make sure io.FontTexUvForWhite is set to the texture coordinates of a pure white pixel in your texture. + (this is done for you if you are using the default font) + (ImGui is using this texture coordinate to draw solid objects so text and solid draw calls can be merged into one.) + + - if you want to use a different font than the default: + - create bitmap font data using BMFont, make sure that BMFont is exporting the .fnt file in Binary mode. + io.Font = new ImBitmapFont(); + io.Font->LoadFromFile("path_to_your_fnt_file.fnt"); + - load your texture yourself. texture *MUST* have white pixel at UV coordinate io.FontTexUvForWhite. This is used to draw all solid shapes. + - the extra_fonts/ folder provides examples of using external fonts. + + - if you are confused about the meaning or use of ID in ImGui: + - some widgets requires state to be carried over multiple frames (most typically ImGui often wants remember what is the "active" widget). + to do so they need an unique ID. unique ID are typically derived from a string label, an indice or a pointer. + when you call Button("OK") the button shows "OK" and also use "OK" as an ID. + - ID are uniquely scoped within Windows so no conflict can happen if you have two buttons called "OK" in two different Windows. + within a same Window, use PushID() / PopID() to easily create scopes and avoid ID conflicts. + so if you have a loop creating "multiple" items, you can use PushID() / PopID() with the index of each item, or their pointer, etc. + some functions like TreeNode() implicitly creates a scope for you by calling PushID() + - when dealing with trees, ID are important because you want to preserve the opened/closed state of tree nodes. depending on your use cases you may want to use strings, indices or pointers as ID. experiment and see what makes more sense! e.g. When displaying a single object, using a static string as ID will preserve your node open/closed state when the targetted object change e.g. When displaying a list of objects, using indices or pointers as ID will preserve the node open/closed state per object @@ -102,14 +122,12 @@ e.g. "Label" display "Label" and uses "Label" as ID e.g. "Label##Foobar" display "Label" and uses "Label##Foobar" as ID e.g. "##Foobar" display an empty label and uses "##Foobar" as ID - - - if you want to use a different font than the default - - create bitmap font data using BMFont. allocate ImGui::GetIO().Font and use ->LoadFromFile()/LoadFromMemory(). - - load your texture yourself. texture *MUST* have white pixel at UV coordinate ImGui::GetIO().FontTexUvForWhite. This is used to draw all solid shapes. + - read articles about the imgui principles (see web links) to understand the requirement and use of ID. - tip: the construct 'if (IMGUI_ONCE_UPON_A_FRAME)' will evaluate to true only once a frame, you can use it to add custom UI in the middle of a deep nested inner loop in your code. - tip: you can call Render() multiple times (e.g for VR renders), up to you to communicate the extra state to your RenderDrawListFn function. - - tip: you can create widgets without a Begin/End block, they will go in an implicit window called "Debug" + - tip: you can create widgets without a Begin()/End() block, they will go in an implicit window called "Debug" + - tip: read the ShowTestWindow() code for more example of how to use ImGui! ISSUES AND TODO-LIST