cimgui
Dies ist ein dünner C-API-Wrapper, der programmgesteuert für die hervorragende C++-Direktmodus-GUI erstellt wurde. Dear ImGui. Alle imgui.h-Funktionen werden programmgesteuert verpackt. Die generierten Dateien sind: cimgui.cpp
, cimgui.h
für die C-Kompilierung. Auch zur Unterstützung bei der Bindungserstellung: definitions.lua
mit Funktionsdefinitionsinformationen und structs_and_enums.lua
. Diese Bibliothek ist als Zwischenschicht gedacht, um Dear ImGui aus anderen Sprachen verwenden zu können, die mit C kommunizieren können (wie D – siehe D-Bindung).
Geschichte:
Ursprünglich wurde cimgui von Stephan Dilly als handgeschriebener Code entwickelt, wurde aber kürzlich von sonoro1234 in eine automatisch generierte Version umgewandelt, um einfacher mit imgui Schritt zu halten (damit der Benutzer den gewünschten Zweig auswählen und festschreiben kann).
Hinweise:
- Derzeit basiert dieser Wrapper auf Version [1.91.4 von Dear ImGui mit interner API]
- Es werden nur Funktionen, Strukturen und Aufzählungen aus imgui.h (und optional imgui_internal.h) umschlossen.
- Wenn Sie an Imgui-Backends interessiert sind, sollten Sie sich das LuaJIT-ImGui-Projekt ansehen.
- Die gesamte Benennung erfolgt algorithmisch, mit Ausnahme der Namen, die in der Tabelle cimgui_overloads (https://github.com/cimgui/cimgui/blob/master/generator/generator.lua#L60) codiert wurden. In der offiziellen Version ist diese Tabelle leer.
- Aktuelle Namen überladener Funktionen finden Sie unter (https://github.com/cimgui/cimgui/blob/master/generator/output/overloads.txt).
Zusammenstellung
mit Generator
- Dies ist nur erforderlich (vor der Kompilierung), wenn Sie eine andere als die bereitgestellte Imgui-Version wünschen, andernfalls ist die Generierung bereits abgeschlossen.
- Sie benötigen LuaJIT (https://github.com/LuaJIT/LuaJIT.git besser 2.1 Zweig) oder vorkompiliert für Linux/MacOS/Windows unter https://luapower.com/luajit/download
- Sie müssen auch einen C++-Compiler für die Vorverarbeitung verwenden: gcc (z. B. in Windows MinGW-W64-Builds), clang oder cl (MSVC). (Dieses Repo wurde mit gcc erstellt)
- Aktualisieren Sie den Ordner
imgui
auf die gewünschte Version. - Bearbeiten Sie
generator/generator.bat
unter Windows oder generator/generator.sh
unter Linux, um zwischen gcc, clang oder cl zu wählen und die gewünschten Backends auszuwählen und ob imgui_internal generiert wird oder nicht, Kommentare generiert werden oder nicht und ob Konstruktoren generiert werden auch bei Versionen, die nur die Initialisierung von von Ihnen bereitgestellten Strukturen durchführen (_Construct wird zu den Konstruktornamen hinzugefügt) - Die Standardeinstellungen des Generators sind GCC als Compiler, imgui_internal enthalten und SDL, GLFW, Vulkan, OpenGL2 und OpenGL3 als Backends.
- Bearbeiten Sie config_generator.lua, um Includes hinzuzufügen, die von den von Ihnen ausgewählten Backends benötigt werden (Vulkan benötigt diese).
- Führen Sie generator.bat oder generator.sh mit gcc, clang oder cl und LuaJIT auf Ihrem PATH aus.
- Als Ergebnis werden einige Dateien generiert:
cimgui.cpp
, cimgui.h
und cimgui_impl.h
zum Kompilieren sowie einige Lua/JSON-Dateien mit Informationen zur Bindung: definitions.json
mit Funktionsinformationen, structs_and_enums.json
mit Struktur- und Enum-Informationen, impl_definitions.json
mit Funktionen aus den Backend-Infos. - Sie können Compiler-Flags an Generator.sh oder Generator.bat übergeben, indem Sie sie am Ende des Aufrufs bearbeiten, um das Compiler-Verhalten weiter festzulegen. (z. B. -DIMGUI_USER_CONFIG)
- Sie können in der Befehlszeile jedes zusätzliche Argument an generator.sh (.bat) übergeben.
- Wenn Sie andere Optionen als das Cimgui-Repo verwenden und diese nach einem Cimgui-Update behalten möchten, können Sie sie in einer Kopie von generator.sh (.bat) außerhalb des Cimgui-Ordners aufbewahren, wo
cd cimgui/generator
vor dem Luajit-Aufruf verwendet wird . Siehe #232 (Kommentar)
Bindung erzeugen
- Die C-Schnittstelle wird von cimgui.h verfügbar gemacht, wenn Sie CIMGUI_DEFINE_ENUMS_AND_STRUCTS definieren
- Mit Ihrer bevorzugten Sprache können Sie die generierten Lua- oder JSON-Dateien wie folgt verwenden:
- https://github.com/sonoro1234/LuaJIT-ImGui/blob/master/lua/build.bat (mit Lua-Codegenerierung in https://github.com/sonoro1234/LuaJIT-ImGui/blob/master/lua/class_gen .lua)
- https://github.com/mellinoe/ImGui.NET/tree/autogen/src/CodeGenerator
Definitionen Beschreibung
- Es handelt sich um eine Sammlung, in der der Schlüssel der Cimgui-Name ist, der ohne Überladungen resultieren würde, und der Wert ein Array von Überladungen ist (möglicherweise nur eine Überladung).
- Jede Überladung ist eine Sammlung. Einige relevante Schlüssel und Werte sind:
- stname: der Name der Struktur, zu der die Funktion gehört (wird „“ sein, wenn es sich um die oberste Ebene im ImGui-Namespace handelt)
- ov_cimguiname: der überladene Cimgui-Name (falls nicht vorhanden, würde er von Cimguiname übernommen)
- cimguiname: der Name ohne Überladung (dies sollte verwendet werden, wenn ov_cimguiname nicht vorhanden ist)
- ret: der Rückgabetyp
- retref: wird gesetzt, wenn der ursprüngliche Rückgabetyp eine Referenz ist. (wird ein Zeiger in Cimgui sein)
- argsT: ein Array von Sammlungen (jede mit Typ: Argumenttyp und Name: der Argumentname, wenn das Argument ein Funktionszeiger ist, auch ret: Rückgabetyp und Signatur: die Funktionssignatur)
- args: eine Zeichenfolge von argsT, verkettet und durch Kommas getrennt
- call_args: eine Zeichenfolge mit den durch Kommas getrennten Argumentnamen zum Aufrufen der imgui-Funktion
- Standardwerte: Eine Sammlung, in der der Schlüssel der Argumentname und der Wert der Standardwert ist.
- manuell: wird wahr sein, wenn diese Funktion handgeschrieben (nicht generiert) ist.
- übersprungen: wird wahr sein, wenn diese Funktion nicht generiert (und nicht handgeschrieben) wird
- isvararg: wird gesetzt, wenn ein Argument ein Vararg ist
- Konstruktor: wird gesetzt, wenn die Funktion ein Konstruktor für eine Klasse ist.
- Destruktor: wird gesetzt, wenn die Funktion ein Destruktor für eine Klasse ist, aber nicht nur ein Standarddestruktor.
- realdestructor: wird gesetzt, wenn die Funktion ein Destruktor für eine Klasse ist
- templated: wird gesetzt, wenn die Funktion zu einer Template-Klasse (ImVector) gehört.
- templatedgen: wird gesetzt, wenn die Funktion zu einer aus der Vorlage (ImVector_ImWchar) generierten Struktur gehört.
- nonUDT: Falls vorhanden, gab die ursprüngliche Funktion einen benutzerdefinierten Typ zurück, sodass die Signatur geändert wurde, um einen Zeiger auf den UDT als erstes Argument zu akzeptieren.
- Speicherort: Name der Header-Datei und Zeilennummer, aus der diese Funktion stammt. (imgui:000, internal:123, imgui_impl_xxx:123)
- is_static_function: wird gesetzt, wenn es sich um eine statische Strukturfunktion handelt.
Beschreibung von structs_and_enums
- Es handelt sich um eine Sammlung mit drei Artikeln:
- Unter „key enums“ erhalten wir die Enums-Sammlung, in der jeder Schlüssel der Enum-Tagname ist und der Wert ein Array der geordneten Werte ist, die als Sammlung mit Schlüsseln dargestellt werden
- name: der Name dieses Enum-Werts
- Wert: der C-String
- calc_value: der dem Wert entsprechende numerische Wert
- Unter Schlüsselstrukturen erhalten wir die Struktursammlung, in der der Schlüssel der Strukturname und der Wert ein Array der Strukturmitglieder ist. Jeweils als Sammlung mit Schlüsseln abgegeben
- Typ: der Typ des Strukturmitglieds
- template_type: Wenn der Typ ein Vorlagenargument hat (wie ImVector), wird es hier angezeigt
- name: der Name des Strukturmitglieds
- Größe: die Anzahl der Array-Elemente (wenn es sich um ein Array handelt)
- Bitfeld: die Bitfeldbreite (falls es ein Bitfeld ist)
- Unter „Key Locations“ erhalten wir die Locations-Sammlung, in der jeder Schlüssel der Enum-Tag-Name oder der Strukturname ist und der Wert der Name der Header-Datei und die Zeilennummer ist, aus der diese stammt.
Verwendung
- Verwenden Sie jede Methode im ImGui-C++-Namespace in der ursprünglichen imgui.h, indem Sie
ig
voranstellen - Methoden haben die gleiche Parameterliste und Rückgabewerte (wo möglich)
- Funktionen, die zu einer Struktur gehören, haben ein zusätzliches erstes Argument mit einem Zeiger auf die Struktur.
- Wo eine Funktion UDT (benutzerdefinierter Typ) als Wert zurückgibt, beschweren sich einige Compiler, sodass die Funktion so generiert wird, dass sie einen Zeiger auf den UDT-Typ als erstes Argument akzeptiert (oder als zweites, wenn es zu einer Struktur gehört).
Nutzung mit Backends
- Schauen Sie sich den Ordner backend_test an, um ein cmake-Modul zu finden, das mit SDL und opengl3, glfw und opengl3, SDL und Vulkan erstellt wurde
- Lesen Sie, wie Cimgui-Backends verwendet werden können
Beispielbindungen basierend auf Cimgui
- LuaJIT-ImGui
- ImGui.NET
- nimgl/imgui
- kotlin-imgui
- CImGui.jl
- odin-imgui
- DerelictImgui
- BindBC-CimGui
- imgui-rs
- imgui-pas
- Kristall-Imgui
C-Beispiele basierend auf Cimgui
- sdl2_opengl3
- sdl2-cimgui-demo
- cimgui_c_sdl2_example
- cimgui-c-Beispiel mit GLFW
- raylib-cimgui