Done #579, update ImGui to 1.87

This commit is contained in:
halx99 2022-02-08 12:43:16 +08:00
parent d07c36f60f
commit fcbc95bd47
17 changed files with 22299 additions and 30965 deletions

View File

@ -3,6 +3,13 @@
#include "imgui_impl_adxe.h" #include "imgui_impl_adxe.h"
#include "imgui_internal.h" #include "imgui_internal.h"
// TODO: mac metal
#if (defined(CC_USE_GL) || defined(CC_USE_GLES))
# define CC_IMGUI_ENABLE_MULTI_VIEWPORT 1
#else
# define CC_IMGUI_ENABLE_MULTI_VIEWPORT 0
#endif
NS_CC_EXT_BEGIN NS_CC_EXT_BEGIN
static uint32_t fourccValue(std::string_view str) static uint32_t fourccValue(std::string_view str)
@ -156,7 +163,44 @@ void ImGuiEXT::destroyInstance()
void ImGuiEXT::init() void ImGuiEXT::init()
{ {
ImGui_ImplAdxe_Init(true); // Setup Dear ImGui context
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
(void)io;
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
// io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; // Enable Docking
#if CC_IMGUI_ENABLE_MULTI_VIEWPORT
io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable; // Enable Multi-Viewport / Platform Windows
#endif
// io.ConfigViewportsNoAutoMerge = true;
// io.ConfigViewportsNoTaskBarIcon = true;
// io.ConfigViewportsNoDefaultParent = true;
// io.ConfigDockingAlwaysTabBar = true;
// io.ConfigDockingTransparentPayload = true;
// io.ConfigFlags |= ImGuiConfigFlags_DpiEnableScaleFonts; // FIXME-DPI: Experimental. THIS CURRENTLY DOESN'T
// WORK AS EXPECTED. DON'T USE IN USER APP! io.ConfigFlags |= ImGuiConfigFlags_DpiEnableScaleViewports; //
// FIXME-DPI: Experimental.
// Setup Dear ImGui style
ImGui::StyleColorsDark();
// ImGui::StyleColorsClassic();
// When viewports are enabled we tweak WindowRounding/WindowBg so platform windows can look identical to regular
// ones.
ImGuiStyle& style = ImGui::GetStyle();
if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
{
style.WindowRounding = 0.0f;
style.Colors[ImGuiCol_WindowBg].w = 1.0f;
}
auto window = static_cast<GLViewImpl*>(Director::getInstance()->getOpenGLView())->getWindow();
ImGui_ImplGlfw_InitForAdxe(window, true);
ImGui_ImplAdxe_Init();
ImGui_ImplAdxe_SetCustomFontLoader(&ImGuiEXT::loadCustomFonts, this); ImGui_ImplAdxe_SetCustomFontLoader(&ImGuiEXT::loadCustomFonts, this);
ImGui::StyleColorsClassic(); ImGui::StyleColorsClassic();
@ -174,8 +218,11 @@ void ImGuiEXT::cleanup()
ImGui_ImplAdxe_SetCustomFontLoader(nullptr, nullptr); ImGui_ImplAdxe_SetCustomFontLoader(nullptr, nullptr);
ImGui_ImplAdxe_Shutdown(); ImGui_ImplAdxe_Shutdown();
ImGui_ImplGlfw_Shutdown();
CC_SAFE_RELEASE_NULL(_fontsTexture); CC_SAFE_RELEASE_NULL(_fontsTexture);
ImGui::DestroyContext();
} }
void ImGuiEXT::setOnInit(const std::function<void(ImGuiEXT*)>& callBack) void ImGuiEXT::setOnInit(const std::function<void(ImGuiEXT*)>& callBack)
@ -293,6 +340,8 @@ void ImGuiEXT::beginFrame()
{ {
// create frame // create frame
ImGui_ImplAdxe_NewFrame(); ImGui_ImplAdxe_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
// move to endFrame? // move to endFrame?
_fontsTexture = (Texture2D*)ImGui_ImplAdxe_GetFontsTexture(); _fontsTexture = (Texture2D*)ImGui_ImplAdxe_GetFontsTexture();

View File

@ -1,6 +1,6 @@
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2014-2021 Omar Cornut Copyright (c) 2014-2022 Omar Cornut
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@ -1,67 +1,53 @@
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// COMPILE-TIME OPTIONS FOR DEAR IMGUI // COMPILE-TIME OPTIONS FOR DEAR IMGUI
// Runtime options (clipboard callbacks, enabling various features, etc.) can generally be set via the ImGuiIO // Runtime options (clipboard callbacks, enabling various features, etc.) can generally be set via the ImGuiIO structure.
// structure. You can use ImGui::SetAllocatorFunctions() before calling ImGui::CreateContext() to rewire memory // You can use ImGui::SetAllocatorFunctions() before calling ImGui::CreateContext() to rewire memory allocation functions.
// allocation functions.
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// A) You may edit imconfig.h (and not overwrite it when updating Dear ImGui, or maintain a patch/rebased branch with // A) You may edit imconfig.h (and not overwrite it when updating Dear ImGui, or maintain a patch/rebased branch with your modifications to it)
// your modifications to it) B) or '#define IMGUI_USER_CONFIG "my_imgui_config.h"' in your project and then add // B) or '#define IMGUI_USER_CONFIG "my_imgui_config.h"' in your project and then add directives in your own file without touching this template.
// directives in your own file without touching this template.
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// You need to make sure that configuration settings are defined consistently _everywhere_ Dear ImGui is used, which // You need to make sure that configuration settings are defined consistently _everywhere_ Dear ImGui is used, which include the imgui*.cpp
// include the imgui*.cpp files but also _any_ of your code that uses Dear ImGui. This is because some compile-time // files but also _any_ of your code that uses Dear ImGui. This is because some compile-time options have an affect on data structures.
// options have an affect on data structures. Defining those options in imconfig.h will ensure every compilation unit // Defining those options in imconfig.h will ensure every compilation unit gets to see the same data structure layouts.
// gets to see the same data structure layouts. Call IMGUI_CHECKVERSION() from your .cpp files to verify that the data // Call IMGUI_CHECKVERSION() from your .cpp files to verify that the data structures your files are using are matching the ones imgui.cpp is using.
// structures your files are using are matching the ones imgui.cpp is using.
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#pragma once #pragma once
//---- Define assertion handler. Defaults to calling assert(). //---- Define assertion handler. Defaults to calling assert().
// If your macro uses multiple statements, make sure is enclosed in a 'do { .. } while (0)' block so it can be used as a // If your macro uses multiple statements, make sure is enclosed in a 'do { .. } while (0)' block so it can be used as a single statement.
// single statement.
//#define IM_ASSERT(_EXPR) MyAssert(_EXPR) //#define IM_ASSERT(_EXPR) MyAssert(_EXPR)
//#define IM_ASSERT(_EXPR) ((void)(_EXPR)) // Disable asserts //#define IM_ASSERT(_EXPR) ((void)(_EXPR)) // Disable asserts
//---- Define attributes of all API symbols declarations, e.g. for DLL under Windows //---- Define attributes of all API symbols declarations, e.g. for DLL under Windows
// Using Dear ImGui via a shared library is not recommended, because of function call overhead and because we don't // Using Dear ImGui via a shared library is not recommended, because of function call overhead and because we don't guarantee backward nor forward ABI compatibility.
// guarantee backward nor forward ABI compatibility. DLL users: heaps and globals are not shared across DLL boundaries! // DLL users: heaps and globals are not shared across DLL boundaries! You will need to call SetCurrentContext() + SetAllocatorFunctions()
// You will need to call SetCurrentContext() + SetAllocatorFunctions() for each static/DLL boundary you are calling // for each static/DLL boundary you are calling from. Read "Context and Memory Allocators" section of imgui.cpp for more details.
// from. Read "Context and Memory Allocators" section of imgui.cpp for more details.
//#define IMGUI_API __declspec( dllexport ) //#define IMGUI_API __declspec( dllexport )
//#define IMGUI_API __declspec( dllimport ) //#define IMGUI_API __declspec( dllimport )
//---- Don't define obsolete functions/enums/behaviors. Consider enabling from time to time after updating to avoid //---- Don't define obsolete functions/enums/behaviors. Consider enabling from time to time after updating to avoid using soon-to-be obsolete function/names.
// using soon-to-be obsolete function/names. #define IMGUI_DISABLE_OBSOLETE_FUNCTIONS //#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS
//#define IMGUI_DISABLE_OBSOLETE_KEYIO // 1.87: disable legacy io.KeyMap[]+io.KeysDown[] in favor io.AddKeyEvent(). This will be folded into IMGUI_DISABLE_OBSOLETE_FUNCTIONS in a few versions.
//---- Disable all of Dear ImGui or don't implement standard windows. //---- Disable all of Dear ImGui or don't implement standard windows.
// It is very strongly recommended to NOT disable the demo windows during development. Please read comments in // It is very strongly recommended to NOT disable the demo windows during development. Please read comments in imgui_demo.cpp.
// imgui_demo.cpp. //#define IMGUI_DISABLE // Disable everything: all headers and source files will be empty.
//#define IMGUI_DISABLE // Disable everything: all headers and source files will be //#define IMGUI_DISABLE_DEMO_WINDOWS // Disable demo windows: ShowDemoWindow()/ShowStyleEditor() will be empty. Not recommended.
// empty. #define IMGUI_DISABLE_DEMO_WINDOWS // Disable demo windows: //#define IMGUI_DISABLE_METRICS_WINDOW // Disable metrics/debugger and other debug tools: ShowMetricsWindow() and ShowStackToolWindow() will be empty.
// ShowDemoWindow()/ShowStyleEditor() will be empty. Not recommended. #define IMGUI_DISABLE_METRICS_WINDOW // Disable
// metrics/debugger window: ShowMetricsWindow() will be empty.
//---- Don't implement some functions to reduce linkage requirements. //---- Don't implement some functions to reduce linkage requirements.
//#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS // [Win32] Don't implement default clipboard handler. Won't //#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS // [Win32] Don't implement default clipboard handler. Won't use and link with OpenClipboard/GetClipboardData/CloseClipboard etc. (user32.lib/.a, kernel32.lib/.a)
// use and link with OpenClipboard/GetClipboardData/CloseClipboard etc. (user32.lib/.a, kernel32.lib/.a) #define //#define IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] [Default with Visual Studio] Implement default IME handler (require imm32.lib/.a, auto-link for Visual Studio, -limm32 on command-line for MinGW)
// IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] [Default with Visual Studio] Implement default IME //#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] [Default with non-Visual Studio compilers] Don't implement default IME handler (won't require imm32.lib/.a)
// handler (require imm32.lib/.a, auto-link for Visual Studio, -limm32 on command-line for MinGW) #define //#define IMGUI_DISABLE_WIN32_FUNCTIONS // [Win32] Won't use and link with any Win32 function (clipboard, ime).
// IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] [Default with non-Visual Studio compilers] Don't //#define IMGUI_ENABLE_OSX_DEFAULT_CLIPBOARD_FUNCTIONS // [OSX] Implement default OSX clipboard handler (need to link with '-framework ApplicationServices', this is why this is not the default).
// implement default IME handler (won't require imm32.lib/.a) #define IMGUI_DISABLE_WIN32_FUNCTIONS // [Win32] Won't use //#define IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS // Don't implement ImFormatString/ImFormatStringV so you can implement them yourself (e.g. if you don't want to link with vsnprintf)
// and link with any Win32 function (clipboard, ime). #define IMGUI_ENABLE_OSX_DEFAULT_CLIPBOARD_FUNCTIONS // [OSX] //#define IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS // Don't implement ImFabs/ImSqrt/ImPow/ImFmod/ImCos/ImSin/ImAcos/ImAtan2 so you can implement them yourself.
// Implement default OSX clipboard handler (need to link with '-framework ApplicationServices', this is why this is not //#define IMGUI_DISABLE_FILE_FUNCTIONS // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite and ImFileHandle at all (replace them with dummies)
// the default). #define IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS // Don't implement //#define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite and ImFileHandle so you can implement them yourself if you don't want to link with fopen/fclose/fread/fwrite. This will also disable the LogToTTY() function.
// ImFormatString/ImFormatStringV so you can implement them yourself (e.g. if you don't want to link with vsnprintf) //#define IMGUI_DISABLE_DEFAULT_ALLOCATORS // Don't implement default allocators calling malloc()/free() to avoid linking with them. You will need to call ImGui::SetAllocatorFunctions().
//#define IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS // Don't implement //#define IMGUI_DISABLE_SSE // Disable use of SSE intrinsics even if available
// ImFabs/ImSqrt/ImPow/ImFmod/ImCos/ImSin/ImAcos/ImAtan2 so you can implement them yourself. #define
// IMGUI_DISABLE_FILE_FUNCTIONS // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite
// and ImFileHandle at all (replace them with dummies) #define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS //
// Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite and ImFileHandle so you can implement them yourself if
// you don't want to link with fopen/fclose/fread/fwrite. This will also disable the LogToTTY() function. #define
// IMGUI_DISABLE_DEFAULT_ALLOCATORS // Don't implement default allocators calling malloc()/free() to
// avoid linking with them. You will need to call ImGui::SetAllocatorFunctions(). #define IMGUI_DISABLE_SSE // Disable
// use of SSE intrinsics even if available
//---- Include imgui_user.h at the end of imgui.h as a convenience //---- Include imgui_user.h at the end of imgui.h as a convenience
//#define IMGUI_INCLUDE_IMGUI_USER_H //#define IMGUI_INCLUDE_IMGUI_USER_H
@ -69,8 +55,8 @@
//---- Pack colors to BGRA8 instead of RGBA8 (to avoid converting from one to another) //---- Pack colors to BGRA8 instead of RGBA8 (to avoid converting from one to another)
//#define IMGUI_USE_BGRA_PACKED_COLOR //#define IMGUI_USE_BGRA_PACKED_COLOR
//---- Use 32-bit for ImWchar (default is 16-bit) to support unicode planes 1-16. (e.g. point beyond 0xFFFF like //---- Use 32-bit for ImWchar (default is 16-bit) to support unicode planes 1-16. (e.g. point beyond 0xFFFF like emoticons, dingbats, symbols, shapes, ancient languages, etc...)
// emoticons, dingbats, symbols, shapes, ancient languages, etc...) #define IMGUI_USE_WCHAR32 //#define IMGUI_USE_WCHAR32
//---- Avoid multiple STB libraries implementations, or redefine path/filenames to prioritize another version //---- Avoid multiple STB libraries implementations, or redefine path/filenames to prioritize another version
// By default the embedded implementations are declared static and not available outside of Dear ImGui sources files. // By default the embedded implementations are declared static and not available outside of Dear ImGui sources files.
@ -79,22 +65,17 @@
//#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION //#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION
//#define IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION //#define IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION
//---- Use stb_printf's faster implementation of vsnprintf instead of the one from libc (unless //---- Use stb_printf's faster implementation of vsnprintf instead of the one from libc (unless IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS is defined)
// IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS is defined) // Requires 'stb_sprintf.h' to be available in the include path. Compatibility checks of arguments and formats done by clang and GCC will be disabled in order to support the extra formats provided by STB sprintf.
// Requires 'stb_sprintf.h' to be available in the include path. Compatibility checks of arguments and formats done by // #define IMGUI_USE_STB_SPRINTF
// clang and GCC will be disabled in order to support the extra formats provided by STB sprintf. #define
// IMGUI_USE_STB_SPRINTF
//---- Use FreeType to build and rasterize the font atlas (instead of stb_truetype which is embedded by default in Dear //---- Use FreeType to build and rasterize the font atlas (instead of stb_truetype which is embedded by default in Dear ImGui)
// ImGui) // Requires FreeType headers to be available in the include path. Requires program to be compiled with 'misc/freetype/imgui_freetype.cpp' (in this repository) + the FreeType library (not provided).
// Requires FreeType headers to be available in the include path. Requires program to be compiled with // On Windows you may use vcpkg with 'vcpkg install freetype --triplet=x64-windows' + 'vcpkg integrate install'.
// 'misc/freetype/imgui_freetype.cpp' (in this repository) + the FreeType library (not provided). On Windows you may use
// vcpkg with 'vcpkg install freetype --triplet=x64-windows' + 'vcpkg integrate install'.
//#define IMGUI_ENABLE_FREETYPE //#define IMGUI_ENABLE_FREETYPE
//---- Use stb_truetype to build and rasterize the font atlas (default) //---- Use stb_truetype to build and rasterize the font atlas (default)
// The only purpose of this define is if you want force compilation of the stb_truetype backend ALONG with the FreeType // The only purpose of this define is if you want force compilation of the stb_truetype backend ALONG with the FreeType backend.
// backend.
//#define IMGUI_ENABLE_STB_TRUETYPE //#define IMGUI_ENABLE_STB_TRUETYPE
//---- Define constructor and implicit cast operators to convert back<>forth between your math types and ImVec2/ImVec4. //---- Define constructor and implicit cast operators to convert back<>forth between your math types and ImVec2/ImVec4.
@ -116,9 +97,9 @@
//#define ImDrawIdx unsigned int //#define ImDrawIdx unsigned int
//---- Override ImDrawCallback signature (will need to modify renderer backends accordingly) //---- Override ImDrawCallback signature (will need to modify renderer backends accordingly)
// struct ImDrawList; //struct ImDrawList;
// struct ImDrawCmd; //struct ImDrawCmd;
// typedef void (*MyImDrawCallback)(const ImDrawList* draw_list, const ImDrawCmd* cmd, void* my_renderer_user_data); //typedef void (*MyImDrawCallback)(const ImDrawList* draw_list, const ImDrawCmd* cmd, void* my_renderer_user_data);
//#define ImDrawCallback MyImDrawCallback //#define ImDrawCallback MyImDrawCallback
//---- Debug Tools: Macro to break in Debugger //---- Debug Tools: Macro to break in Debugger

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -63,31 +63,31 @@
// //
#ifndef STB_INCLUDE_STB_RECT_PACK_H #ifndef STB_INCLUDE_STB_RECT_PACK_H
# define STB_INCLUDE_STB_RECT_PACK_H #define STB_INCLUDE_STB_RECT_PACK_H
# define STB_RECT_PACK_VERSION 1 #define STB_RECT_PACK_VERSION 1
# ifdef STBRP_STATIC #ifdef STBRP_STATIC
# define STBRP_DEF static #define STBRP_DEF static
# else #else
# define STBRP_DEF extern #define STBRP_DEF extern
# endif #endif
# ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
# endif #endif
typedef struct stbrp_context stbrp_context; typedef struct stbrp_context stbrp_context;
typedef struct stbrp_node stbrp_node; typedef struct stbrp_node stbrp_node;
typedef struct stbrp_rect stbrp_rect; typedef struct stbrp_rect stbrp_rect;
# ifdef STBRP_LARGE_RECTS #ifdef STBRP_LARGE_RECTS
typedef int stbrp_coord; typedef int stbrp_coord;
# else #else
typedef unsigned short stbrp_coord; typedef unsigned short stbrp_coord;
# endif #endif
STBRP_DEF int stbrp_pack_rects(stbrp_context* context, stbrp_rect* rects, int num_rects); STBRP_DEF int stbrp_pack_rects (stbrp_context *context, stbrp_rect *rects, int num_rects);
// Assign packed locations to rectangles. The rectangles are of type // Assign packed locations to rectangles. The rectangles are of type
// 'stbrp_rect' defined below, stored in the array 'rects', and there // 'stbrp_rect' defined below, stored in the array 'rects', and there
// are 'num_rects' many of them. // are 'num_rects' many of them.
@ -114,19 +114,20 @@ STBRP_DEF int stbrp_pack_rects(stbrp_context* context, stbrp_rect* rects, int nu
struct stbrp_rect struct stbrp_rect
{ {
// reserved for your use: // reserved for your use:
int id; int id;
// input: // input:
stbrp_coord w, h; stbrp_coord w, h;
// output: // output:
stbrp_coord x, y; stbrp_coord x, y;
int was_packed; // non-zero if valid packing int was_packed; // non-zero if valid packing
}; // 16 bytes, nominally }; // 16 bytes, nominally
STBRP_DEF void stbrp_init_target(stbrp_context* context, int width, int height, stbrp_node* nodes, int num_nodes);
STBRP_DEF void stbrp_init_target (stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes);
// Initialize a rectangle packer to: // Initialize a rectangle packer to:
// pack a rectangle that is 'width' by 'height' in dimensions // pack a rectangle that is 'width' by 'height' in dimensions
// using temporary storage provided by the array 'nodes', which is 'num_nodes' long // using temporary storage provided by the array 'nodes', which is 'num_nodes' long
@ -147,23 +148,25 @@ STBRP_DEF void stbrp_init_target(stbrp_context* context, int width, int height,
// If you do #2, then the non-quantized algorithm will be used, but the algorithm // If you do #2, then the non-quantized algorithm will be used, but the algorithm
// may run out of temporary storage and be unable to pack some rectangles. // may run out of temporary storage and be unable to pack some rectangles.
STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context* context, int allow_out_of_mem); STBRP_DEF void stbrp_setup_allow_out_of_mem (stbrp_context *context, int allow_out_of_mem);
// Optionally call this function after init but before doing any packing to // Optionally call this function after init but before doing any packing to
// change the handling of the out-of-temp-memory scenario, described above. // change the handling of the out-of-temp-memory scenario, described above.
// If you call init again, this will be reset to the default (false). // If you call init again, this will be reset to the default (false).
STBRP_DEF void stbrp_setup_heuristic(stbrp_context* context, int heuristic);
STBRP_DEF void stbrp_setup_heuristic (stbrp_context *context, int heuristic);
// Optionally select which packing heuristic the library should use. Different // Optionally select which packing heuristic the library should use. Different
// heuristics will produce better/worse results for different data sets. // heuristics will produce better/worse results for different data sets.
// If you call init again, this will be reset to the default. // If you call init again, this will be reset to the default.
enum enum
{ {
STBRP_HEURISTIC_Skyline_default = 0, STBRP_HEURISTIC_Skyline_default=0,
STBRP_HEURISTIC_Skyline_BL_sortHeight = STBRP_HEURISTIC_Skyline_default, STBRP_HEURISTIC_Skyline_BL_sortHeight = STBRP_HEURISTIC_Skyline_default,
STBRP_HEURISTIC_Skyline_BF_sortHeight STBRP_HEURISTIC_Skyline_BF_sortHeight
}; };
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// //
// the details of the following structures don't matter to you, but they must // the details of the following structures don't matter to you, but they must
@ -171,26 +174,26 @@ enum
struct stbrp_node struct stbrp_node
{ {
stbrp_coord x, y; stbrp_coord x,y;
stbrp_node* next; stbrp_node *next;
}; };
struct stbrp_context struct stbrp_context
{ {
int width; int width;
int height; int height;
int align; int align;
int init_mode; int init_mode;
int heuristic; int heuristic;
int num_nodes; int num_nodes;
stbrp_node* active_head; stbrp_node *active_head;
stbrp_node* free_head; stbrp_node *free_head;
stbrp_node extra[2]; // we allocate two extra nodes so optimal user-node-count is 'width' not 'width+2' stbrp_node extra[2]; // we allocate two extra nodes so optimal user-node-count is 'width' not 'width+2'
}; };
# ifdef __cplusplus #ifdef __cplusplus
} }
# endif #endif
#endif #endif
@ -200,434 +203,396 @@ struct stbrp_context
// //
#ifdef STB_RECT_PACK_IMPLEMENTATION #ifdef STB_RECT_PACK_IMPLEMENTATION
# ifndef STBRP_SORT #ifndef STBRP_SORT
# include <stdlib.h> #include <stdlib.h>
# define STBRP_SORT qsort #define STBRP_SORT qsort
# endif #endif
# ifndef STBRP_ASSERT #ifndef STBRP_ASSERT
# include <assert.h> #include <assert.h>
# define STBRP_ASSERT assert #define STBRP_ASSERT assert
# endif #endif
// [DEAR IMGUI] Added STBRP__CDECL // [DEAR IMGUI] Added STBRP__CDECL
# ifdef _MSC_VER #ifdef _MSC_VER
# define STBRP__NOTUSED(v) (void)(v) #define STBRP__NOTUSED(v) (void)(v)
# define STBRP__CDECL __cdecl #define STBRP__CDECL __cdecl
# else #else
# define STBRP__NOTUSED(v) (void)sizeof(v) #define STBRP__NOTUSED(v) (void)sizeof(v)
# define STBRP__CDECL #define STBRP__CDECL
# endif #endif
enum enum
{ {
STBRP__INIT_skyline = 1 STBRP__INIT_skyline = 1
}; };
STBRP_DEF void stbrp_setup_heuristic(stbrp_context* context, int heuristic) STBRP_DEF void stbrp_setup_heuristic(stbrp_context *context, int heuristic)
{ {
switch (context->init_mode) switch (context->init_mode) {
{ case STBRP__INIT_skyline:
case STBRP__INIT_skyline: STBRP_ASSERT(heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight || heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight);
STBRP_ASSERT(heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight || context->heuristic = heuristic;
heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight); break;
context->heuristic = heuristic; default:
break; STBRP_ASSERT(0);
default: }
STBRP_ASSERT(0);
}
} }
STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context* context, int allow_out_of_mem) STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context *context, int allow_out_of_mem)
{ {
if (allow_out_of_mem) if (allow_out_of_mem)
// if it's ok to run out of memory, then don't bother aligning them; // if it's ok to run out of memory, then don't bother aligning them;
// this gives better packing, but may fail due to OOM (even though // this gives better packing, but may fail due to OOM (even though
// the rectangles easily fit). @TODO a smarter approach would be to only // the rectangles easily fit). @TODO a smarter approach would be to only
// quantize once we've hit OOM, then we could get rid of this parameter. // quantize once we've hit OOM, then we could get rid of this parameter.
context->align = 1; context->align = 1;
else else {
{ // if it's not ok to run out of memory, then quantize the widths
// if it's not ok to run out of memory, then quantize the widths // so that num_nodes is always enough nodes.
// so that num_nodes is always enough nodes. //
// // I.e. num_nodes * align >= width
// I.e. num_nodes * align >= width // align >= width / num_nodes
// align >= width / num_nodes // align = ceil(width/num_nodes)
// align = ceil(width/num_nodes)
context->align = (context->width + context->num_nodes - 1) / context->num_nodes; context->align = (context->width + context->num_nodes-1) / context->num_nodes;
} }
} }
STBRP_DEF void stbrp_init_target(stbrp_context* context, int width, int height, stbrp_node* nodes, int num_nodes) STBRP_DEF void stbrp_init_target(stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes)
{ {
int i; int i;
# ifndef STBRP_LARGE_RECTS #ifndef STBRP_LARGE_RECTS
STBRP_ASSERT(width <= 0xffff && height <= 0xffff); STBRP_ASSERT(width <= 0xffff && height <= 0xffff);
# endif #endif
for (i = 0; i < num_nodes - 1; ++i) for (i=0; i < num_nodes-1; ++i)
nodes[i].next = &nodes[i + 1]; nodes[i].next = &nodes[i+1];
nodes[i].next = NULL; nodes[i].next = NULL;
context->init_mode = STBRP__INIT_skyline; context->init_mode = STBRP__INIT_skyline;
context->heuristic = STBRP_HEURISTIC_Skyline_default; context->heuristic = STBRP_HEURISTIC_Skyline_default;
context->free_head = &nodes[0]; context->free_head = &nodes[0];
context->active_head = &context->extra[0]; context->active_head = &context->extra[0];
context->width = width; context->width = width;
context->height = height; context->height = height;
context->num_nodes = num_nodes; context->num_nodes = num_nodes;
stbrp_setup_allow_out_of_mem(context, 0); stbrp_setup_allow_out_of_mem(context, 0);
// node 0 is the full width, node 1 is the sentinel (lets us not store width explicitly) // node 0 is the full width, node 1 is the sentinel (lets us not store width explicitly)
context->extra[0].x = 0; context->extra[0].x = 0;
context->extra[0].y = 0; context->extra[0].y = 0;
context->extra[0].next = &context->extra[1]; context->extra[0].next = &context->extra[1];
context->extra[1].x = (stbrp_coord)width; context->extra[1].x = (stbrp_coord) width;
# ifdef STBRP_LARGE_RECTS #ifdef STBRP_LARGE_RECTS
context->extra[1].y = (1 << 30); context->extra[1].y = (1<<30);
# else #else
context->extra[1].y = 65535; context->extra[1].y = 65535;
# endif #endif
context->extra[1].next = NULL; context->extra[1].next = NULL;
} }
// find minimum y position if it starts at x1 // find minimum y position if it starts at x1
static int stbrp__skyline_find_min_y(stbrp_context* c, stbrp_node* first, int x0, int width, int* pwaste) static int stbrp__skyline_find_min_y(stbrp_context *c, stbrp_node *first, int x0, int width, int *pwaste)
{ {
stbrp_node* node = first; stbrp_node *node = first;
int x1 = x0 + width; int x1 = x0 + width;
int min_y, visited_width, waste_area; int min_y, visited_width, waste_area;
STBRP__NOTUSED(c); STBRP__NOTUSED(c);
STBRP_ASSERT(first->x <= x0); STBRP_ASSERT(first->x <= x0);
# if 0 #if 0
// skip in case we're past the node // skip in case we're past the node
while (node->next->x <= x0) while (node->next->x <= x0)
++node; ++node;
# else #else
STBRP_ASSERT(node->next->x > x0); // we ended up handling this in the caller for efficiency STBRP_ASSERT(node->next->x > x0); // we ended up handling this in the caller for efficiency
# endif #endif
STBRP_ASSERT(node->x <= x0); STBRP_ASSERT(node->x <= x0);
min_y = 0; min_y = 0;
waste_area = 0; waste_area = 0;
visited_width = 0; visited_width = 0;
while (node->x < x1) while (node->x < x1) {
{ if (node->y > min_y) {
if (node->y > min_y) // raise min_y higher.
{ // we've accounted for all waste up to min_y,
// raise min_y higher. // but we'll now add more waste for everything we've visted
// we've accounted for all waste up to min_y, waste_area += visited_width * (node->y - min_y);
// but we'll now add more waste for everything we've visted min_y = node->y;
waste_area += visited_width * (node->y - min_y); // the first time through, visited_width might be reduced
min_y = node->y; if (node->x < x0)
// the first time through, visited_width might be reduced visited_width += node->next->x - x0;
if (node->x < x0) else
visited_width += node->next->x - x0; visited_width += node->next->x - node->x;
else } else {
visited_width += node->next->x - node->x; // add waste area
} int under_width = node->next->x - node->x;
else if (under_width + visited_width > width)
{ under_width = width - visited_width;
// add waste area waste_area += under_width * (min_y - node->y);
int under_width = node->next->x - node->x; visited_width += under_width;
if (under_width + visited_width > width) }
under_width = width - visited_width; node = node->next;
waste_area += under_width * (min_y - node->y); }
visited_width += under_width;
}
node = node->next;
}
*pwaste = waste_area; *pwaste = waste_area;
return min_y; return min_y;
} }
typedef struct typedef struct
{ {
int x, y; int x,y;
stbrp_node** prev_link; stbrp_node **prev_link;
} stbrp__findresult; } stbrp__findresult;
static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context* c, int width, int height) static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context *c, int width, int height)
{ {
int best_waste = (1 << 30), best_x, best_y = (1 << 30); int best_waste = (1<<30), best_x, best_y = (1 << 30);
stbrp__findresult fr; stbrp__findresult fr;
stbrp_node **prev, *node, *tail, **best = NULL; stbrp_node **prev, *node, *tail, **best = NULL;
// align to multiple of c->align // align to multiple of c->align
width = (width + c->align - 1); width = (width + c->align - 1);
width -= width % c->align; width -= width % c->align;
STBRP_ASSERT(width % c->align == 0); STBRP_ASSERT(width % c->align == 0);
// if it can't possibly fit, bail immediately // if it can't possibly fit, bail immediately
if (width > c->width || height > c->height) if (width > c->width || height > c->height) {
{ fr.prev_link = NULL;
fr.prev_link = NULL; fr.x = fr.y = 0;
fr.x = fr.y = 0; return fr;
return fr; }
}
node = c->active_head; node = c->active_head;
prev = &c->active_head; prev = &c->active_head;
while (node->x + width <= c->width) while (node->x + width <= c->width) {
{ int y,waste;
int y, waste; y = stbrp__skyline_find_min_y(c, node, node->x, width, &waste);
y = stbrp__skyline_find_min_y(c, node, node->x, width, &waste); if (c->heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight) { // actually just want to test BL
if (c->heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight) // bottom left
{ // actually just want to test BL if (y < best_y) {
// bottom left best_y = y;
if (y < best_y) best = prev;
{ }
best_y = y; } else {
best = prev; // best-fit
if (y + height <= c->height) {
// can only use it if it first vertically
if (y < best_y || (y == best_y && waste < best_waste)) {
best_y = y;
best_waste = waste;
best = prev;
} }
} }
else }
{ prev = &node->next;
// best-fit node = node->next;
if (y + height <= c->height) }
{
// can only use it if it first vertically best_x = (best == NULL) ? 0 : (*best)->x;
if (y < best_y || (y == best_y && waste < best_waste))
{ // if doing best-fit (BF), we also have to try aligning right edge to each node position
best_y = y; //
best_waste = waste; // e.g, if fitting
best = prev; //
} // ____________________
// |____________________|
//
// into
//
// | |
// | ____________|
// |____________|
//
// then right-aligned reduces waste, but bottom-left BL is always chooses left-aligned
//
// This makes BF take about 2x the time
if (c->heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight) {
tail = c->active_head;
node = c->active_head;
prev = &c->active_head;
// find first node that's admissible
while (tail->x < width)
tail = tail->next;
while (tail) {
int xpos = tail->x - width;
int y,waste;
STBRP_ASSERT(xpos >= 0);
// find the left position that matches this
while (node->next->x <= xpos) {
prev = &node->next;
node = node->next;
}
STBRP_ASSERT(node->next->x > xpos && node->x <= xpos);
y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste);
if (y + height <= c->height) {
if (y <= best_y) {
if (y < best_y || waste < best_waste || (waste==best_waste && xpos < best_x)) {
best_x = xpos;
STBRP_ASSERT(y <= best_y);
best_y = y;
best_waste = waste;
best = prev;
}
} }
} }
prev = &node->next; tail = tail->next;
node = node->next; }
} }
best_x = (best == NULL) ? 0 : (*best)->x; fr.prev_link = best;
fr.x = best_x;
// if doing best-fit (BF), we also have to try aligning right edge to each node position fr.y = best_y;
// return fr;
// e.g, if fitting
//
// ____________________
// |____________________|
//
// into
//
// | |
// | ____________|
// |____________|
//
// then right-aligned reduces waste, but bottom-left BL is always chooses left-aligned
//
// This makes BF take about 2x the time
if (c->heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight)
{
tail = c->active_head;
node = c->active_head;
prev = &c->active_head;
// find first node that's admissible
while (tail->x < width)
tail = tail->next;
while (tail)
{
int xpos = tail->x - width;
int y, waste;
STBRP_ASSERT(xpos >= 0);
// find the left position that matches this
while (node->next->x <= xpos)
{
prev = &node->next;
node = node->next;
}
STBRP_ASSERT(node->next->x > xpos && node->x <= xpos);
y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste);
if (y + height <= c->height)
{
if (y <= best_y)
{
if (y < best_y || waste < best_waste || (waste == best_waste && xpos < best_x))
{
best_x = xpos;
STBRP_ASSERT(y <= best_y);
best_y = y;
best_waste = waste;
best = prev;
}
}
}
tail = tail->next;
}
}
fr.prev_link = best;
fr.x = best_x;
fr.y = best_y;
return fr;
} }
static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context* context, int width, int height) static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context *context, int width, int height)
{ {
// find best position according to heuristic // find best position according to heuristic
stbrp__findresult res = stbrp__skyline_find_best_pos(context, width, height); stbrp__findresult res = stbrp__skyline_find_best_pos(context, width, height);
stbrp_node *node, *cur; stbrp_node *node, *cur;
// bail if: // bail if:
// 1. it failed // 1. it failed
// 2. the best node doesn't fit (we don't always check this) // 2. the best node doesn't fit (we don't always check this)
// 3. we're out of memory // 3. we're out of memory
if (res.prev_link == NULL || res.y + height > context->height || context->free_head == NULL) if (res.prev_link == NULL || res.y + height > context->height || context->free_head == NULL) {
{ res.prev_link = NULL;
res.prev_link = NULL; return res;
return res; }
}
// on success, create new node // on success, create new node
node = context->free_head; node = context->free_head;
node->x = (stbrp_coord)res.x; node->x = (stbrp_coord) res.x;
node->y = (stbrp_coord)(res.y + height); node->y = (stbrp_coord) (res.y + height);
context->free_head = node->next; context->free_head = node->next;
// insert the new node into the right starting point, and // insert the new node into the right starting point, and
// let 'cur' point to the remaining nodes needing to be // let 'cur' point to the remaining nodes needing to be
// stiched back in // stiched back in
cur = *res.prev_link; cur = *res.prev_link;
if (cur->x < res.x) if (cur->x < res.x) {
{ // preserve the existing one, so start testing with the next one
// preserve the existing one, so start testing with the next one stbrp_node *next = cur->next;
stbrp_node* next = cur->next; cur->next = node;
cur->next = node; cur = next;
cur = next; } else {
} *res.prev_link = node;
else }
{
*res.prev_link = node;
}
// from here, traverse cur and free the nodes, until we get to one // from here, traverse cur and free the nodes, until we get to one
// that shouldn't be freed // that shouldn't be freed
while (cur->next && cur->next->x <= res.x + width) while (cur->next && cur->next->x <= res.x + width) {
{ stbrp_node *next = cur->next;
stbrp_node* next = cur->next; // move the current node to the free list
// move the current node to the free list cur->next = context->free_head;
cur->next = context->free_head; context->free_head = cur;
context->free_head = cur; cur = next;
cur = next; }
}
// stitch the list back in // stitch the list back in
node->next = cur; node->next = cur;
if (cur->x < res.x + width) if (cur->x < res.x + width)
cur->x = (stbrp_coord)(res.x + width); cur->x = (stbrp_coord) (res.x + width);
# ifdef _DEBUG #ifdef _DEBUG
cur = context->active_head; cur = context->active_head;
while (cur->x < context->width) while (cur->x < context->width) {
{ STBRP_ASSERT(cur->x < cur->next->x);
STBRP_ASSERT(cur->x < cur->next->x); cur = cur->next;
cur = cur->next; }
} STBRP_ASSERT(cur->next == NULL);
STBRP_ASSERT(cur->next == NULL);
{ {
int count = 0; int count=0;
cur = context->active_head; cur = context->active_head;
while (cur) while (cur) {
{ cur = cur->next;
cur = cur->next; ++count;
++count; }
} cur = context->free_head;
cur = context->free_head; while (cur) {
while (cur) cur = cur->next;
{ ++count;
cur = cur->next; }
++count; STBRP_ASSERT(count == context->num_nodes+2);
} }
STBRP_ASSERT(count == context->num_nodes + 2); #endif
}
# endif
return res; return res;
} }
// [DEAR IMGUI] Added STBRP__CDECL // [DEAR IMGUI] Added STBRP__CDECL
static int STBRP__CDECL rect_height_compare(const void* a, const void* b) static int STBRP__CDECL rect_height_compare(const void *a, const void *b)
{ {
const stbrp_rect* p = (const stbrp_rect*)a; const stbrp_rect *p = (const stbrp_rect *) a;
const stbrp_rect* q = (const stbrp_rect*)b; const stbrp_rect *q = (const stbrp_rect *) b;
if (p->h > q->h) if (p->h > q->h)
return -1; return -1;
if (p->h < q->h) if (p->h < q->h)
return 1; return 1;
return (p->w > q->w) ? -1 : (p->w < q->w); return (p->w > q->w) ? -1 : (p->w < q->w);
} }
// [DEAR IMGUI] Added STBRP__CDECL // [DEAR IMGUI] Added STBRP__CDECL
static int STBRP__CDECL rect_original_order(const void* a, const void* b) static int STBRP__CDECL rect_original_order(const void *a, const void *b)
{ {
const stbrp_rect* p = (const stbrp_rect*)a; const stbrp_rect *p = (const stbrp_rect *) a;
const stbrp_rect* q = (const stbrp_rect*)b; const stbrp_rect *q = (const stbrp_rect *) b;
return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed); return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed);
} }
# ifdef STBRP_LARGE_RECTS #ifdef STBRP_LARGE_RECTS
# define STBRP__MAXVAL 0xffffffff #define STBRP__MAXVAL 0xffffffff
# else #else
# define STBRP__MAXVAL 0xffff #define STBRP__MAXVAL 0xffff
# endif #endif
STBRP_DEF int stbrp_pack_rects(stbrp_context* context, stbrp_rect* rects, int num_rects) STBRP_DEF int stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int num_rects)
{ {
int i, all_rects_packed = 1; int i, all_rects_packed = 1;
// we use the 'was_packed' field internally to allow sorting/unsorting // we use the 'was_packed' field internally to allow sorting/unsorting
for (i = 0; i < num_rects; ++i) for (i=0; i < num_rects; ++i) {
{ rects[i].was_packed = i;
rects[i].was_packed = i; }
}
// sort according to heuristic // sort according to heuristic
STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_height_compare); STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_height_compare);
for (i = 0; i < num_rects; ++i) for (i=0; i < num_rects; ++i) {
{ if (rects[i].w == 0 || rects[i].h == 0) {
if (rects[i].w == 0 || rects[i].h == 0) rects[i].x = rects[i].y = 0; // empty rect needs no space
{ } else {
rects[i].x = rects[i].y = 0; // empty rect needs no space stbrp__findresult fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h);
} if (fr.prev_link) {
else rects[i].x = (stbrp_coord) fr.x;
{ rects[i].y = (stbrp_coord) fr.y;
stbrp__findresult fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h); } else {
if (fr.prev_link) rects[i].x = rects[i].y = STBRP__MAXVAL;
{ }
rects[i].x = (stbrp_coord)fr.x; }
rects[i].y = (stbrp_coord)fr.y; }
}
else
{
rects[i].x = rects[i].y = STBRP__MAXVAL;
}
}
}
// unsort // unsort
STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_original_order); STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_original_order);
// set was_packed flags and all_rects_packed status // set was_packed flags and all_rects_packed status
for (i = 0; i < num_rects; ++i) for (i=0; i < num_rects; ++i) {
{ rects[i].was_packed = !(rects[i].x == STBRP__MAXVAL && rects[i].y == STBRP__MAXVAL);
rects[i].was_packed = !(rects[i].x == STBRP__MAXVAL && rects[i].y == STBRP__MAXVAL); if (!rects[i].was_packed)
if (!rects[i].was_packed) all_rects_packed = 0;
all_rects_packed = 0; }
}
// return the all_rects_packed status // return the all_rects_packed status
return all_rects_packed; return all_rects_packed;
} }
#endif #endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,6 @@
// dear imgui: wrappers for C++ standard library (STL) types (std::string, etc.) // dear imgui: wrappers for C++ standard library (STL) types (std::string, etc.)
// This is also an example of how you may wrap your own similar types. // This is also an example of how you may wrap your own similar types.
// Compatibility:
// - std::string support is only guaranteed to work from C++11.
// If you try to use it pre-C++11, please share your findings (w/ info about compiler/architecture)
// Changelog: // Changelog:
// - v0.10: Initial version. Added InputText() / InputTextMultiline() calls with std::string // - v0.10: Initial version. Added InputText() / InputTextMultiline() calls with std::string
@ -13,9 +9,9 @@
struct InputTextCallback_UserData struct InputTextCallback_UserData
{ {
std::string* Str; std::string* Str;
ImGuiInputTextCallback ChainCallback; ImGuiInputTextCallback ChainCallback;
void* ChainCallbackUserData; void* ChainCallbackUserData;
}; };
static int InputTextCallback(ImGuiInputTextCallbackData* data) static int InputTextCallback(ImGuiInputTextCallbackData* data)
@ -24,8 +20,7 @@ static int InputTextCallback(ImGuiInputTextCallbackData* data)
if (data->EventFlag == ImGuiInputTextFlags_CallbackResize) if (data->EventFlag == ImGuiInputTextFlags_CallbackResize)
{ {
// Resize string callback // Resize string callback
// If for some reason we refuse the new length (BufTextLen) and/or capacity (BufSize) we need to set them back // If for some reason we refuse the new length (BufTextLen) and/or capacity (BufSize) we need to set them back to what we want.
// to what we want.
std::string* str = user_data->Str; std::string* str = user_data->Str;
IM_ASSERT(data->Buf == str->c_str()); IM_ASSERT(data->Buf == str->c_str());
str->resize(data->BufTextLen); str->resize(data->BufTextLen);
@ -40,54 +35,38 @@ static int InputTextCallback(ImGuiInputTextCallbackData* data)
return 0; return 0;
} }
bool ImGui::InputText(const char* label, bool ImGui::InputText(const char* label, std::string* str, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data)
std::string* str,
ImGuiInputTextFlags flags,
ImGuiInputTextCallback callback,
void* user_data)
{ {
IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0);
flags |= ImGuiInputTextFlags_CallbackResize; flags |= ImGuiInputTextFlags_CallbackResize;
InputTextCallback_UserData cb_user_data; InputTextCallback_UserData cb_user_data;
cb_user_data.Str = str; cb_user_data.Str = str;
cb_user_data.ChainCallback = callback; cb_user_data.ChainCallback = callback;
cb_user_data.ChainCallbackUserData = user_data; cb_user_data.ChainCallbackUserData = user_data;
return InputText(label, (char*)str->c_str(), str->capacity() + 1, flags, InputTextCallback, &cb_user_data); return InputText(label, (char*)str->c_str(), str->capacity() + 1, flags, InputTextCallback, &cb_user_data);
} }
bool ImGui::InputTextMultiline(const char* label, bool ImGui::InputTextMultiline(const char* label, std::string* str, const ImVec2& size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data)
std::string* str,
const ImVec2& size,
ImGuiInputTextFlags flags,
ImGuiInputTextCallback callback,
void* user_data)
{ {
IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0);
flags |= ImGuiInputTextFlags_CallbackResize; flags |= ImGuiInputTextFlags_CallbackResize;
InputTextCallback_UserData cb_user_data; InputTextCallback_UserData cb_user_data;
cb_user_data.Str = str; cb_user_data.Str = str;
cb_user_data.ChainCallback = callback; cb_user_data.ChainCallback = callback;
cb_user_data.ChainCallbackUserData = user_data; cb_user_data.ChainCallbackUserData = user_data;
return InputTextMultiline(label, (char*)str->c_str(), str->capacity() + 1, size, flags, InputTextCallback, return InputTextMultiline(label, (char*)str->c_str(), str->capacity() + 1, size, flags, InputTextCallback, &cb_user_data);
&cb_user_data);
} }
bool ImGui::InputTextWithHint(const char* label, bool ImGui::InputTextWithHint(const char* label, const char* hint, std::string* str, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data)
const char* hint,
std::string* str,
ImGuiInputTextFlags flags,
ImGuiInputTextCallback callback,
void* user_data)
{ {
IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0);
flags |= ImGuiInputTextFlags_CallbackResize; flags |= ImGuiInputTextFlags_CallbackResize;
InputTextCallback_UserData cb_user_data; InputTextCallback_UserData cb_user_data;
cb_user_data.Str = str; cb_user_data.Str = str;
cb_user_data.ChainCallback = callback; cb_user_data.ChainCallback = callback;
cb_user_data.ChainCallbackUserData = user_data; cb_user_data.ChainCallbackUserData = user_data;
return InputTextWithHint(label, hint, (char*)str->c_str(), str->capacity() + 1, flags, InputTextCallback, return InputTextWithHint(label, hint, (char*)str->c_str(), str->capacity() + 1, flags, InputTextCallback, &cb_user_data);
&cb_user_data);
} }

View File

@ -1,10 +1,6 @@
// dear imgui: wrappers for C++ standard library (STL) types (std::string, etc.) // dear imgui: wrappers for C++ standard library (STL) types (std::string, etc.)
// This is also an example of how you may wrap your own similar types. // This is also an example of how you may wrap your own similar types.
// Compatibility:
// - std::string support is only guaranteed to work from C++11.
// If you try to use it pre-C++11, please share your findings (w/ info about compiler/architecture)
// Changelog: // Changelog:
// - v0.10: Initial version. Added InputText() / InputTextMultiline() calls with std::string // - v0.10: Initial version. Added InputText() / InputTextMultiline() calls with std::string
@ -14,23 +10,9 @@
namespace ImGui namespace ImGui
{ {
// ImGui::InputText() with std::string // ImGui::InputText() with std::string
// Because text input needs dynamic resizing, we need to setup a callback to grow the capacity // Because text input needs dynamic resizing, we need to setup a callback to grow the capacity
IMGUI_API bool InputText(const char* label, IMGUI_API bool InputText(const char* label, std::string* str, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);
std::string* str, IMGUI_API bool InputTextMultiline(const char* label, std::string* str, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);
ImGuiInputTextFlags flags = 0, IMGUI_API bool InputTextWithHint(const char* label, const char* hint, std::string* str, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);
ImGuiInputTextCallback callback = NULL, }
void* user_data = NULL);
IMGUI_API bool InputTextMultiline(const char* label,
std::string* str,
const ImVec2& size = ImVec2(0, 0),
ImGuiInputTextFlags flags = 0,
ImGuiInputTextCallback callback = NULL,
void* user_data = NULL);
IMGUI_API bool InputTextWithHint(const char* label,
const char* hint,
std::string* str,
ImGuiInputTextFlags flags = 0,
ImGuiInputTextCallback callback = NULL,
void* user_data = NULL);
} // namespace ImGui

File diff suppressed because it is too large Load Diff

View File

@ -1,23 +1,22 @@
#pragma once #pragma once
#include "imgui/imgui.h" #include "imgui.h"
struct GLFWwindow;
typedef void (*ImGuiImplCocos2dxLoadFontFun)(void* userdata); typedef void (*ImGuiImplCocos2dxLoadFontFun)(void* userdata);
IMGUI_IMPL_API bool ImGui_ImplAdxe_Init(bool install_callbacks); /// ImGui glfw APIs
IMGUI_IMPL_API bool ImGui_ImplGlfw_InitForAdxe(GLFWwindow* window, bool install_callbacks);
IMGUI_IMPL_API void ImGui_ImplGlfw_Shutdown();
IMGUI_IMPL_API void ImGui_ImplGlfw_NewFrame();
/// ImGui adxe render APIs
IMGUI_IMPL_API void ImGui_ImplAdxe_Init();
IMGUI_IMPL_API void ImGui_ImplAdxe_Shutdown(); IMGUI_IMPL_API void ImGui_ImplAdxe_Shutdown();
IMGUI_IMPL_API void ImGui_ImplAdxe_NewFrame(); IMGUI_IMPL_API void ImGui_ImplAdxe_NewFrame();
IMGUI_IMPL_API void ImGui_ImplAdxe_RenderDrawData(ImDrawData* draw_data); IMGUI_IMPL_API void ImGui_ImplAdxe_RenderDrawData(ImDrawData* draw_data);
IMGUI_IMPL_API void ImGui_ImplAdxe_RenderPlatform(); IMGUI_IMPL_API void ImGui_ImplAdxe_RenderPlatform();
// Called by Init/NewFrame/Shutdown
// TODO: maybe hide for internal use only
IMGUI_IMPL_API bool ImGui_ImplAdxe_CreateDeviceObjects();
IMGUI_IMPL_API void ImGui_ImplAdxe_DestroyDeviceObjects();
// TODO: check whether needs public this API
IMGUI_IMPL_API bool ImGui_ImplAdxe_CreateFontsTexture();
IMGUI_IMPL_API void ImGui_ImplAdxe_DestroyFontsTexture();
// Get FontTexture object cocos2d::Texture2D* // Get FontTexture object cocos2d::Texture2D*
IMGUI_IMPL_API void ImGui_ImplAdxe_SetCustomFontLoader(ImGuiImplCocos2dxLoadFontFun fun, void* userdata); IMGUI_IMPL_API void ImGui_ImplAdxe_SetCustomFontLoader(ImGuiImplCocos2dxLoadFontFun fun, void* userdata);
IMGUI_IMPL_API void* ImGui_ImplAdxe_GetFontsTexture(); IMGUI_IMPL_API void* ImGui_ImplAdxe_GetFontsTexture();