cimgui
Este es un contenedor c-api delgado generado mediante programación para la excelente interfaz gráfica de usuario en modo inmediato de C++ Dear ImGui. Todas las funciones de imgui.h están empaquetadas mediante programación. Los archivos generados son: cimgui.cpp
, cimgui.h
para compilación de C. También para ayudar en la creación de enlaces, definitions.lua
con información de definición de funciones y structs_and_enums.lua
. Esta biblioteca está pensada como una capa intermedia para poder utilizar Dear ImGui desde otros lenguajes que pueden interactuar con C (como D - ver enlace D)
Historia:
Inicialmente, cimgui fue desarrollado por Stephan Dilly como código escrito a mano, pero últimamente sonoro1234 lo convirtió en una versión generada automáticamente para mantenerse al día con imgui más fácilmente (permitiendo al usuario seleccionar la rama deseada y confirmar).
Notas:
- Actualmente, este contenedor se basa en la versión [1.91.4 de Dear ImGui con API interna]
- solo se empaquetan funciones, estructuras y enumeraciones de imgui.h (opcionalmente imgui_internal.h).
- Si está interesado en los backends de imgui, debería buscar el proyecto LuaJIT-ImGui.
- Todos los nombres son algorítmicos, excepto aquellos nombres que se codificaron en la tabla cimgui_overloads (https://github.com/cimgui/cimgui/blob/master/generator/generator.lua#L60). En la versión oficial esta tabla está vacía.
- Los nombres de las funciones sobrecargadas actuales se pueden encontrar en (https://github.com/cimgui/cimgui/blob/master/generator/output/overloads.txt)
compilación
usando generador
- esto sólo es necesario (antes de la compilación) si desea una versión de imgui diferente a la proporcionada; de lo contrario, la generación ya está completa.
- necesitará LuaJIT (https://github.com/LuaJIT/LuaJIT.git mejor rama 2.1) o precompilado para linux/macOS/windows en https://luapower.com/luajit/download
- También debe utilizar un compilador de C++ para realizar el preprocesamiento: gcc (en Windows MinGW-W64-builds, por ejemplo), clang o cl (MSVC). (este repositorio se hizo con gcc)
- actualice la carpeta
imgui
a la versión que desee. - edite
generator/generator.bat
en Windows, o generator/generator.sh
en Linux, para elegir entre gcc, clang o cl y elegir los backends deseados y si se genera imgui_internal o no, se generan comentarios o no y si se generan constructores también con versiones que realizan solo la inicialización de estructuras proporcionadas por usted mismo (_Construct se agrega a los nombres de los constructores) - Los valores predeterminados del generador son gcc como compilador, imgui_internal incluido y sdl, glfw, vulkan, opengl2 y opengl3 como backends.
- edite config_generator.lua para agregar las inclusiones necesarias para los backends elegidos (vulkan lo necesita).
- Ejecute generador.bat o generador.sh con gcc, clang o cl y LuaJIT en su RUTA.
- como resultado se generan algunos archivos:
cimgui.cpp
, cimgui.h
y cimgui_impl.h
para compilar y algunos archivos lua/json con información sobre el enlace: definitions.json
con información de función, structs_and_enums.json
con información de estructura y enumeración, impl_definitions.json
con funciones de la información del backend. - Puede pasar indicadores del compilador a generador.sh o generador.bat editándolos al final de la llamada para especificar aún más el comportamiento del compilador. (por ejemplo, -DIMGUI_USER_CONFIG)
- Puede pasar cualquier argumento adicional a generador.sh (.bat) en la línea de comandos.
- Si está utilizando opciones diferentes a las del repositorio de cimgui y desea conservarlas después de una actualización de cimgui, puede guardarlas en una copia de generador.sh (.bat) fuera de la carpeta de cimgui donde se usa
cd cimgui/generator
antes de la llamada a luajit. . Ver #232 (comentario)
generar enlace
- La interfaz C está expuesta por cimgui.h cuando define CIMGUI_DEFINE_ENUMS_AND_STRUCTS
- con tu idioma preferido puedes usar los archivos lua o json generados como en:
- https://github.com/sonoro1234/LuaJIT-ImGui/blob/master/lua/build.bat (con generación de código lua en https://github.com/sonoro1234/LuaJIT-ImGui/blob/master/lua/class_gen .lua)
- https://github.com/mellinoe/ImGui.NET/tree/autogen/src/CodeGenerator
definiciones descripción
- Es una colección en la que key es el nombre cimgui que resultaría sin sobrecargas y el valor es un array de sobrecargas (puede ser solo una sobrecarga)
- Cada sobrecarga es una colección. Algunas claves y valores relevantes son:
- stname: el nombre de la estructura a la que pertenece la función (será "" si es el nivel superior en el espacio de nombres ImGui)
- ov_cimguiname: el nombre de cimgui sobrecargado (si está ausente, se tomará de cimguiname)
- cimguiname: el nombre sin sobrecargar (esto debe usarse si no hay ov_cimguiname)
- ret: el tipo de retorno
- retref: se establece si el tipo de retorno original es una referencia. (será un puntero en cimgui)
- argsT: una matriz de colecciones (cada una con tipo: tipo de argumento y nombre: el nombre del argumento, cuando el argumento es un puntero de función también ret: tipo de retorno y firma: la firma de la función)
- args: una cadena de argsT concatenada y separada por comas
- call_args: una cadena con los nombres de los argumentos separados por comas para llamar a la función imgui
- valores predeterminados: una colección en la que la clave es el nombre del argumento y el valor es el valor predeterminado.
- manual: será verdadero si esta función está escrita a mano (no generada)
- omitido: será verdadero si esta función no se genera (y no se escribe a mano)
- isvararg: se establece si algún argumento es un vararg
- constructor: se establece si la función es un constructor de una clase.
- destructor: se establece si la función es un destructor de una clase pero no solo un destructor predeterminado.
- realdestructor: se establece si la función es un destructor de una clase
- con plantilla: se establece si la función pertenece a una clase con plantilla (ImVector)
- templatedgen: se establece si la función pertenece a una estructura generada a partir de una plantilla (ImVector_ImWchar)
- nonUDT: si estaba presente, la función original devolvía un tipo definido por el usuario, por lo que la firma se cambió para aceptar un puntero al UDT como primer argumento.
- ubicación: nombre del archivo de encabezado y número de línea de donde proviene esta función. (imgui:000, interno:123, imgui_impl_xxx:123)
- is_static_function: se establece cuando es una función estática de estructura.
descripción de structs_and_enums
- Es una colección con tres artículos:
- bajo enumeraciones clave obtenemos la colección de enumeraciones en la que cada clave es el nombre de la etiqueta de enumeración y el valor es una matriz de valores ordenados representados como una colección con claves
- nombre: el nombre de este valor de enumeración
- valor: la cadena C
- calc_value: el valor numérico correspondiente al valor
- bajo estructuras clave obtenemos la colección de estructuras en la que la clave es el nombre de la estructura y el valor es una matriz de los miembros de la estructura. Cada uno entregado como una colección con llaves.
- tipo: el tipo de miembro de la estructura
- template_type: si el tipo tiene un argumento de plantilla (como ImVector), aquí estará
- nombre: el nombre del miembro de la estructura
- tamaño: el número de elementos de la matriz (cuando es una matriz)
- campo de bits: el ancho del campo de bits (en caso de que sea un campo de bits)
- en ubicaciones de claves obtenemos la colección de ubicaciones en la que cada clave es el nombre de la etiqueta de enumeración o el nombre de la estructura y el valor es el nombre del archivo de encabezado y el número de línea del que proviene.
uso
- use cualquier método que esté en el espacio de nombres ImGui c++ en el imgui.h original anteponiendo
ig
- Los métodos tienen la misma lista de parámetros y valores de retorno (cuando sea posible).
- Las funciones que pertenecen a una estructura tienen un primer argumento adicional con un puntero a la estructura.
- cuando una función devuelve UDT (tipo definido por el usuario) por valor, algunos compiladores se quejan, por lo que la función se genera aceptando un puntero al tipo UDT como primer argumento (o segundo si pertenece a una estructura).
uso con backends
- Mire la carpeta backend_test para ver un módulo cmake creado con SDL y opengl3, glfw y opengl3, SDL y Vulkan.
- leer ¿Cómo se pueden utilizar los backends de cimgui?
enlaces de ejemplo basados en cimgui
- LuaJIT-ImGui
- ImGui.NET
- nimgl/imgui
- kotlin-imgui
- CImGui.jl
- odin-imgui
- AbandonadoImgui
- BindBC-CimGui
- imgui-rs
- imgui-pas
- cristal-imgui
Ejemplos de C basados en cimgui
- sdl2_opengl3
- sdl2-cimgui-demo
- cimgui_c_sdl2_ejemplo
- ejemplo-cimgui-c con GLFW
- raylib-cimgui