cimgui
Este é um wrapper c-api fino gerado programaticamente para o excelente gui de modo imediato C++ Caro ImGui. Todas as funções imgui.h são agrupadas programaticamente. Os arquivos gerados são: cimgui.cpp
, cimgui.h
para compilação C. Também para ajudar na criação de ligações, definitions.lua
com informações de definição de função e structs_and_enums.lua
. Esta biblioteca pretende ser uma camada intermediária para poder usar Dear ImGui de outras linguagens que podem interagir com C (como D - veja D-binding)
História:
Inicialmente o cimgui foi desenvolvido por Stephan Dilly como um código escrito à mão, mas recentemente se transformou em uma versão gerada automaticamente pelo sonoro1234 para acompanhar o imgui mais facilmente (permitindo ao usuário selecionar o branch desejado e fazer o commit)
Notas:
- atualmente este wrapper é baseado na versão [1.91.4 de Dear ImGui com API interna]
- apenas funções, estruturas e enumerações de imgui.h (opcionalmente imgui_internal.h) são agrupadas.
- se você estiver interessado em backends imgui, você deve procurar o projeto LuaJIT-ImGui.
- Toda a nomenclatura é algorítmica, exceto aqueles nomes que foram codificados na tabela cimgui_overloads (https://github.com/cimgui/cimgui/blob/master/generator/generator.lua#L60). Na versão oficial esta tabela está vazia.
- Os nomes das funções sobrecarregadas atuais podem ser encontrados em (https://github.com/cimgui/cimgui/blob/master/generator/output/overloads.txt)
compilação
usando gerador
- isso só é necessário (antes da compilação) se você quiser uma versão imgui diferente da fornecida, caso contrário a geração já está feita.
- você precisará de LuaJIT (https://github.com/LuaJIT/LuaJIT.git melhor branch 2.1) ou pré-compilado para linux/macOS/windows em https://luapower.com/luajit/download
- você precisa usar também um compilador C++ para fazer o pré-processamento: gcc (nas compilações do Windows MinGW-W64, por exemplo), clang ou cl (MSVC). (este repositório foi feito com gcc)
- atualize a pasta
imgui
para a versão desejada. - edite
generator/generator.bat
no Windows, ou generator/generator.sh
no Linux, para escolher entre gcc, clang ou cl e para escolher os backends desejados e se imgui_internal será gerado ou não, comentários serão gerados ou não e se construtores serão gerados também com versões executando apenas inicialização de estruturas fornecidas por você (_Construct é adicionado aos nomes dos construtores) - os padrões do gerador são gcc como compilador, imgui_internal incluído e sdl, glfw, vulkan, opengl2 e opengl3 como backends.
- edite config_generator.lua para adicionar inclusões necessárias aos back-ends escolhidos (o Vulkan precisa disso).
- Execute gerador.bat ou gerador.sh com gcc, clang ou cl e LuaJIT em seu PATH.
- como resultado alguns arquivos são gerados:
cimgui.cpp
, cimgui.h
e cimgui_impl.h
para compilação e alguns arquivos lua/json com informações sobre a ligação: definitions.json
com informações de função, structs_and_enums.json
com informações de struct e enum, impl_definitions.json
com funções das informações de back-end. - Você pode passar sinalizadores do compilador para Generator.sh ou Generator.bat editando-os no final da chamada para especificar melhor o comportamento do compilador. (por exemplo, -DIMGUI_USER_CONFIG)
- Você pode passar qualquer argumento extra para Generator.sh (.bat) na linha de comando.
- Se você estiver usando opções diferentes do repositório cimgui e quiser mantê-las após uma atualização do cimgui, você pode mantê-las em uma cópia do gerador.sh (.bat) fora da pasta cimgui onde
cd cimgui/generator
é usado antes da chamada luajit . Veja #232 (comentário)
gerar vinculação
- A interface C é exposta por cimgui.h quando você define CIMGUI_DEFINE_ENUMS_AND_STRUCTS
- com seu idioma preferido você pode usar os arquivos lua ou json gerados como em:
- https://github.com/sonoro1234/LuaJIT-ImGui/blob/master/lua/build.bat (com geração de código lua em https://github.com/sonoro1234/LuaJIT-ImGui/blob/master/lua/class_gen .lua)
- https://github.com/mellinoe/ImGui.NET/tree/autogen/src/CodeGenerator
descrição das definições
- É uma coleção em que key é o nome do cimgui que resultaria sem sobrecargas e o valor é um array de sobrecargas (pode ser apenas uma sobrecarga)
- Cada sobrecarga é uma coleção. Algumas chaves e valores relevantes são:
- stname : o nome da estrutura à qual a função pertence (será "" se for de nível superior no namespace ImGui)
- ov_cimguiname : o nome cimgui sobrecarregado (se ausente, será retirado de cimguiname)
- cimguiname : o nome sem sobrecarga (deve ser usado se não houver ov_cimguiname)
- ret: o tipo de retorno
- retref: é definido se o tipo de retorno original for uma referência. (será um ponteiro no cimgui)
- argsT: um array de coleções (cada uma com tipo: tipo de argumento e nome: o nome do argumento, quando o argumento é um ponteiro de função também ret: tipo de retorno e assinatura: a assinatura da função)
- args: uma string de argsT concatenada e separada por vírgulas
- call_args: uma string com os nomes dos argumentos separados por vírgulas para chamar a função imgui
- defaults: uma coleção em que key é o nome do argumento e value é o valor padrão.
- manual: será verdadeiro se esta função for escrita à mão (não gerada)
- ignorado: será verdadeiro se esta função não for gerada (e não escrita à mão)
- isvararg: é definido se algum argumento for um vararg
- construtor: é definido se a função for um construtor para uma classe.
- destruidor: é definido se a função for um destruidor para uma classe, mas não apenas um destruidor padrão.
- realdestructor: é definido se a função for um destruidor de uma classe
- templated : é definido se a função pertence a uma classe templated (ImVector)
- templatedgen: é definido se a função pertence a uma estrutura gerada a partir do modelo (ImVector_ImWchar)
- nonUDT: se presente, a função original estava retornando um tipo definido pelo usuário, de modo que a assinatura foi alterada para aceitar um ponteiro para o UDT como primeiro argumento.
- location : nome do arquivo de cabeçalho e número da linha de onde vem esta função. (imgui:000, interno:123, imgui_impl_xxx:123)
- is_static_function : é definido quando é uma função estática struct.
descrição de structs_and_enums
- É uma coleção com três itens:
- em enums de chaves, obtemos a coleção de enums em que cada chave é o tagname enum e o valor é uma matriz de valores ordenados representados como uma coleção com chaves
- name: o nome deste valor enum
- valor: a string C
- calc_value: o valor numérico correspondente ao valor
- em estruturas-chave, obtemos a coleção de estruturas na qual a chave é o nome da estrutura e o valor é uma matriz dos membros da estrutura. Cada um dado como uma coleção com chaves
- type: o tipo do membro da estrutura
- template_type : se type tiver um argumento de template (como ImVector) aqui será
- name: o nome do membro da estrutura
- size: o número de elementos do array (quando é um array)
- bitfield : a largura do campo de bits (caso seja um campo de bits)
- em locais-chave, obtemos a coleção de locais em que cada chave é o tagname enum ou o nome da estrutura e o valor é o nome do arquivo de cabeçalho e o número da linha de onde ele vem.
uso
- use qualquer método que esteja no namespace ImGui c++ no imgui.h original, acrescentando
ig
- métodos têm a mesma lista de parâmetros e valores de retorno (quando possível)
- funções que pertencem a uma estrutura possuem um primeiro argumento extra com um ponteiro para a estrutura.
- onde uma função retorna UDT (tipo definido pelo usuário) por valor, alguns compiladores reclamam, então a função é gerada aceitando um ponteiro para o tipo UDT como o primeiro argumento (ou segundo se pertencer a uma estrutura).
uso com back-ends
- veja a pasta backend_test para construir um módulo cmake com SDL e opengl3, glfw e opengl3, SDL e Vulkan
- leia Como os back-ends cimgui podem ser usados
exemplo de ligações baseadas em cimgui
- LuaJIT-ImGui
- ImGui.NET
- nimgl/imgui
- kotlin-imgui
- CImGui.jl
- odin-imgui
- AbandonadoImgui
- BindBC-CimGui
- imgui-rs
- imgui-pas
- cristal-imgui
Exemplos C baseados em cimgui
- sdl2_opengl3
- sdl2-cimgui-demo
- cimgui_c_sdl2_example
- exemplo cimgui-c com GLFW
- raylib-cimgui