чимгуи
Это тонкая оболочка c-api, программно созданная для превосходного графического интерфейса немедленного режима C++. Дорогой ImGui. Все функции imgui.h обернуты программно. Сгенерированные файлы: cimgui.cpp
, cimgui.h
для компиляции C. Также для помощи в создании привязок: definitions.lua
с информацией об определении функции и structs_and_enums.lua
. Эта библиотека предназначена в качестве промежуточного уровня для возможности использования Dear ImGui из других языков, которые могут взаимодействовать с C (например, D - см. D-привязку).
История:
Первоначально cimgui был разработан Стефаном Дилли как рукописный код, но позже sonoro1234 превратил его в автоматически сгенерированную версию, чтобы было легче идти в ногу с imgui (позволяя пользователю выбрать нужную ветку и совершить коммит).
Примечания:
- в настоящее время эта оболочка основана на версии [1.91.4 Dear ImGui с внутренним API]
- переносятся только функции, структуры и перечисления из imgui.h (необязательно imgui_internal.h).
- Если вас интересуют серверные части imgui, вам следует посмотреть проект LuaJIT-ImGui.
- Все именования являются алгоритмическими, за исключением тех имен, которые были закодированы в таблице cimgui_overloads (https://github.com/cimgui/cimgui/blob/master/generator/generator.lua#L60). В официальной версии эта таблица пуста.
- Текущие имена перегруженных функций можно найти в (https://github.com/cimgui/cimgui/blob/master/generator/output/overloads.txt).
компиляция
с помощью генератора
- это необходимо (перед компиляцией), только если вы хотите, чтобы версия imgui отличалась от предоставленной, в противном случае генерация уже завершена.
- вам понадобится LuaJIT (https://github.com/LuaJIT/LuaJIT.git, лучше ветка 2.1) или предварительно скомпилированный для linux/macOS/windows в https://luapower.com/luajit/download
- вам также необходимо использовать компилятор C++ для предварительной обработки: gcc (например, в сборках Windows MinGW-W64), clang или cl (MSVC). (это репо было сделано с помощью gcc)
- обновите папку
imgui
до нужной вам версии. - отредактируйте
generator/generator.bat
в Windows илиgenerator generator/generator.sh
в Linux, чтобы выбрать между gcc, clang или cl и выбрать желаемые серверные части, а также указать, генерируется ли imgui_internal или нет, генерируются ли комментарии или нет, и генерируются ли конструкторы также с версиями, выполняющими только инициализацию предоставленных вами структур (к именам конструкторов добавляется _Construct) - Генератор по умолчанию: gcc в качестве компилятора, imgui_internal включен и sdl, glfw, vulkan, opengl2 и opengl3 в качестве бэкэндов.
- отредактируйте config_generator.lua для добавления включений, необходимых для выбранных вами бэкэндов (это нужно Vulkan).
- Запустите генератор.bat или генератор.sh с помощью gcc, clang или cl и LuaJIT в вашем PATH.
- в результате генерируются несколько файлов:
cimgui.cpp
, cimgui.h
и cimgui_impl.h
для компиляции и несколько файлов lua/json с информацией о привязке: definitions.json
с информацией о функции, structs_and_enums.json
с информацией о структуре и перечислении, impl_definitions.json
с функциями из информации о бэкэнде. - Вы можете передать флаги компилятора в файлgenerator.sh илиgenerator.bat, отредактировав их в конце вызова, чтобы дополнительно указать поведение компилятора. (например, -DIMGUI_USER_CONFIG)
- Вы можете передать в генератор.sh (.bat) любой дополнительный аргумент в командной строке.
- Если вы используете другие параметры, чем репозиторий cimgui, и если вы хотите сохранить их после обновления cimgui, вы можете сохранить их в копии генератора.sh (.bat) за пределами папки cimgui, где используется
cd cimgui/generator
перед вызовом luajit. . См. № 232 (комментарий).
создать привязку
- Интерфейс C предоставляется cimgui.h, когда вы определяете CIMGUI_DEFINE_ENUMS_AND_STRUCTS
- на предпочитаемом вами языке вы можете использовать файлы lua или json, сгенерированные следующим образом:
- https://github.com/sonoro1234/LuaJIT-ImGui/blob/master/lua/build.bat (с генерацией кода Lua в https://github.com/sonoro1234/LuaJIT-ImGui/blob/master/lua/class_gen .луа)
- https://github.com/mellinoe/ImGui.NET/tree/autogen/src/CodeGenerator
описание определений
- Это коллекция, в которой ключом является имя cimgui, которое будет получено без перегрузок, а значением является массив перегрузок (может быть только одна перегрузка).
- Каждая перегрузка представляет собой коллекцию. Некоторые соответствующие ключи и значения:
- stname: имя структуры, которой принадлежит функция (будет «», если это верхний уровень в пространстве имен ImGui)
- ov_cimguiname: перегруженное имя cimgui (если оно отсутствует, оно будет взято из cimguiname)
- cimguiname: имя без перегрузки (его следует использовать, если нет ov_cimguiname)
- ret: тип возвращаемого значения
- retref: устанавливается, если исходный тип возвращаемого значения является ссылкой. (будет указатель в cimgui)
- argsT: массив коллекций (каждая из которых имеет тип: тип аргумента и имя: имя аргумента, если аргумент является указателем на функцию, также ret: тип возвращаемого значения и сигнатура: сигнатура функции)
- args: строка argsT, объединенная и разделенная запятыми.
- call_args: строка с именами аргументов, разделенных запятыми, для вызова функции imgui.
- defaults: коллекция, в которой ключом является имя аргумента, а значением является значение по умолчанию.
- руководство: будет верно, если эта функция написана вручную (не сгенерирована)
- пропущено: будет верно, если эта функция не сгенерирована (и не написана вручную)
- isvararg: устанавливается, если какой-либо аргумент является переменным аргументом.
- Конструктор: устанавливается, если функция является конструктором класса.
- деструктор: устанавливается, если функция является деструктором класса, а не просто деструктором по умолчанию.
- Realdestructor: устанавливается, если функция является деструктором класса.
- templated: устанавливается, если функция принадлежит шаблонному классу (ImVector).
- templatedgen: устанавливается, если функция принадлежит структуре, сгенерированной на основе шаблона (ImVector_ImWchar).
- nonUDT : если присутствует, исходная функция возвращала определенный пользователем тип, поэтому подпись была изменена, чтобы принять указатель на UDT в качестве первого аргумента.
- location: имя заголовочного файла и номер строки, из которой берется эта функция. (imgui:000, внутренний:123, imgui_impl_xxx:123)
- is_static_function: устанавливается, когда это статическая функция структуры.
описание structs_and_enums
- Это коллекция из трех элементов:
- под ключевыми перечислениями мы получаем коллекцию перечислений, в которой каждый ключ представляет собой имя тега перечисления, а значение представляет собой массив упорядоченных значений, представленных в виде коллекции с ключами.
- name: имя этого значения перечисления
- значение: строка C
- Calc_value: числовое значение, соответствующее значению
- в разделе ключевых структур мы получаем коллекцию структур, в которой ключом является имя структуры, а значением — массив членов структуры. Каждый из них представлен в виде коллекции с ключами.
- type: тип члена структуры
- template_type: если тип имеет аргумент шаблона (например, ImVector), здесь будет
- name: имя члена структуры
- размер: количество элементов массива (если это массив)
- битовое поле: ширина битового поля (если это битовое поле)
- в разделе «Местоположения ключей» мы получаем коллекцию местоположений, в которой каждый ключ — это имя тега перечисления или имя структуры, а значение — это имя файла заголовка и номер строки, из которой он получен.
использование
- используйте любой метод в пространстве имен ImGui C++ в исходном imgui.h, добавив
ig
- методы имеют одинаковый список параметров и возвращаемые значения (где это возможно)
- Функции, принадлежащие структуре, имеют дополнительный первый аргумент с указателем на структуру.
- где функция возвращает UDT (определяемый пользователем тип) по значению, некоторые компиляторы жалуются, поэтому функция генерируется, принимая указатель на тип UDT в качестве первого аргумента (или второго, если принадлежит структуре).
использование с бэкэндами
- посмотрите в папке backend_test сборку модуля cmake с SDL и opengl3, glfw и opengl3, SDL и Vulkan.
- прочитайте Как можно использовать бэкэнды cimgui
пример привязок на основе cimgui
- LuaJIT-ImGui
- ImGui.NET
- нимгл/имгуи
- Котлин-imgui
- CImGui.jl
- Один-imgui
- ПокинутоеImgui
- BindBC-CimGui
- imgui-rs
- imgui-pas
- кристалл-imgui
Примеры C на основе cimgui
- sdl2_opengl3
- sdl2-cimgui-демо
- cimgui_c_sdl2_example
- пример cimgui-c с GLFW
- Raylib-Cimgui