LINUX.ORG.RU

Imgui и чистый C

 , , , ,


0

2

Приветствую всех! Никто не знает как собрать программу, если библиотека Imgui использует C++, а main.c и др. используемые библиотеки написаны на чистом C (C11). Вызовы Imgui происходят только в одном main.c Как быть? Может есть какой-нибудь способ собрать. Или отказываться от Imgui? А есть ли альтернатива пользовательского интерфейса для OpenGL на C?


Ответ на: комментарий от static_lab

Спасибо за ответ! Теоретически вроде понятно, но.. А вы не могли бы привести простой пример?, типа main.c такой, gui.c тоже какой-то начинки и makefile еще какого-то вида. И получается нужно два раза собирать: сначала g++, потом gcc. И код C++ прилинковывать как статическую библиотеку?

Gyros
() автор топика
Ответ на: комментарий от dataman

Да, спасибо! Как раз это сейчас смотрю. Пытаюсь скомпилировать простой пример: glfw3+cimgui. Не понятно где сам imgui держать надо, ведь cimgui на него ссылается. Пока не получается. Ошибки, ошибки..

Gyros
() автор топика

Вредный совет: а ещё можно вместо main.c сделать main.cpp, потроха особо не меняя (C можно с некоторыми оговорками рассматривать как подмножество C++). Тут, правда, возможно, придётся над какими-то из других модулей extern "C" навернуть.

Надо смотреть, что проще. Если в программе 2-3 исходных файла, может, их все переделать на плюсы стиля «си с классами», только без классов. :) Если следовать совету @static_lab, оно всё равно плюсовый рантайм потащит и будет что так, что этак (и с cimgui, похоже, то же самое, если это обёртка над оригинальным ImGui).

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 3)
Ответ на: комментарий от dataman

У меня уже есть в папке Imgui. Я руками привык делать. Там почему-то cimgui.h, но cimgui.cpp, а не cimgui.c Естественно я переименовал. У меня ошибки типа: cimgui.c:2091:12: error: unknown type name ‘ImFontAtlas’

Gyros
() автор топика
Ответ на: комментарий от hobbit

Да, внутри cimgui.cpp:

//This file is automatically generated by generator.lua from https://github.com/cimgui/cimgui
//based on imgui.h file version "1.75" from Dear ImGui https://github.com/ocornut/imgui

#include "imgui/imgui.h"
#include "imgui/imgui_internal.h"
#include "cimgui.h"

т.е. это обертка.

Сейчас попробую с main.cpp Ваш трюк.

Gyros
() автор топика
Ответ на: комментарий от Gyros

Перетменовал main.c в main.cpp и изменил gcc на g++. Остальное не трогал.

dict.c: In function ‘Dictionary* dict_new()’:
dict.c:47:26: error: invalid conversion from ‘void*’ to ‘Dictionary*’ [-fpermissive]
   47 |  Dictionary *out = malloc(sizeof(Dictionary));
      |                    ~~~~~~^~~~~~~~~~~~~~~~~~~~
      |                          |
      |                          void*

Gyros
() автор топика
Последнее исправление: Gyros (всего исправлений: 1)
Ответ на: комментарий от Gyros

У меня ошибки

Потому что нужно делать так, как написано в README, а не создавать себе грабли.
cimgui может идти в ногу с ImGUI, а может и отставать. К тому же в cimgui используется ветка docking.

dataman ★★★★★
()
Последнее исправление: dataman (всего исправлений: 1)
Ответ на: комментарий от Gyros

Dictionary *out = malloc(sizeof(Dictionary));

надо это так писать

Dictionary *out = new Dictionary;

и везде поправить malloc на new, если там аллоцируется по типу, а не просто размер какой-нить.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от Gyros

Так я ж говорю, что у меня чистый C. А new, delete - это из С++.

или пиши сразу на плюсах, или зови только сишный код из своего си. какой смысл в си, если там зовется с++? плюсы удобней, короче, безопасней, мощней.

писать на си нужно только если есть строгое требование максимальной переносимости ну или какие-то особо весомые аргументы, типа слишком малых ресурсов.

alysnix ★★★
()
Ответ на: комментарий от Gyros

если нужно собрать по быстрому - просто напиши там преобразование типа при присваивании

было

Dictionary *out = malloc(sizeof(Dictionary));

стало

Dictionary *out = (Dictionary*) malloc(sizeof(Dictionary));

с++ более строгий язык, присваивать просто так не дает.

alysnix ★★★
()
Ответ на: комментарий от MOPKOBKA

Спасибо MOPKOBKA! Вот как раз пытаюсь пример для glfw_opengl4 скомпилировать. Скомпилировал, запустил

~/Nuklear-master/demo/glfw_opengl4$ gcc -std=c11  main.c -o main4 -L/usr/local/lib  -lm -lglfw3 -lpthread  -ldl  -lGL -lGLU -lGLEW -lX11
:~/Nuklear-master/demo/glfw_opengl4$ ./main4
[GL]: failed to compile shader: 0(3) : error C0203: extension GL_ARB_bindless_texture not supported in profile gp5vp
0(4) : error C0203: extension GL_ARB_gpu_shader_int64 not supported in profile gp5vp
[GL]: failed to compile shader: 0(3) : error C0203: extension GL_ARB_bindless_texture not supported in profile gp5fp
0(4) : error C0203: extension GL_ARB_gpu_shader_int64 not supported in profile gp5fp
0(10) : error C7548: 'cast' requires "#extension GL_NV_bindless_texture : enable" before use
main4: nuklear_glfw_gl4.h:179: nk_glfw3_device_create: Assertion `status == GL_TRUE' failed.
Aborted (core dumped)

Gyros
() автор топика
Последнее исправление: Gyros (всего исправлений: 1)
Ответ на: комментарий от MOPKOBKA

Странно, хотя моя видеокарта поддерживает OpenGL самой последней версии 4.6 и драйвера от NVidia стоят. Тогда для glfw_opengl3 скомпилировал. Все получилось! изображение

(А в markdown нельзя картинки добавлять?)

А в Nuklear есть другие темы посветлей?

А есть ли большой пример, где все визуальные элементы управления собраны?, а где он в репозитории?

Gyros
() автор топика
Последнее исправление: Gyros (всего исправлений: 4)
Ответ на: комментарий от Gyros

Можно задать флаги, что бы включить примеры:

https://github.com/Immediate-Mode-UI/Nuklear/blob/master/demo/glfw_opengl3/ma...

-DINCLUDE_STYLE

-DINCLUDE_OVERVIEW

Для тем, так же смотри: https://github.com/Immediate-Mode-UI/Nuklear/blob/master/example/skinning.c

Код для skinning.c написан вперемешку с glfw, что мне не нравится. Советую абстрагироваться от драйвера, например как сделано в NuklearCross: https://github.com/DeXP/nuklear_cross

Сам NuklearCross НЕ рекомендую, лучше сделать свою обвязку к Nuklear.

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от alysnix

У автора нет задачи переделать прогу под C++-стиль, так что не надо его грузить ненужными советами. Замена malloc на new от балды просто ради замены может повредить вообще.

firkax ★★★★★
()
Ответ на: комментарий от splinter

Это просто присказка, любой стандартный Си это Pure C/Чистый Си хоть с89 хоть с11, всё иное включая использование С++ компилятора это уже от лукавого и грязь.

P.S. Хотя наличие плюсовых комментариев в версиях выше c89 можно тоже считать C++ грязью :) С этой точки зрения ты прав.

P.P.S Но это можно обойти сказав «Я пишу на Pure C99». ::) С этой точки зрения уже сказавший это прав.

А потом первый и второй дерутся доказывая друг другу какой C является настоящим Ъ Pure C

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 3)
Ответ на: комментарий от LINUX-ORG-RU

извини комрад, я ничего не понял, прав тот кто c89 или деревативы? Что есть Pure, я просто не использую библиотек и я типа PureMan или я пишу по стандарту c89 и не использую библиотек?

splinter ★★★★★
()
Последнее исправление: splinter (всего исправлений: 2)
Ответ на: комментарий от MOPKOBKA

Еще, огромное спасибо, MOPKOBKA!

Да, собрал со всеми виджетами. И даже собралось с помощью mingw32 (теперь можно exe-шник сделанный в Linux без проблем запускать под Windows). Причем для сборки я даже не использовал Makefile-ы, просто все в командной строке набрал.

Скины не понравились, т.к. это надо их уметь говить. А как его сделаешь? Не руками же. Там наверное целая технология. Должен быть какой-нибудь инструмент.

Еще жаль, что Nuklear не сохраняет относительные координаты и размеры, свернутость окна для своих виджетов, которые находятся внутри основного окна. Imgui делает это, сохраняя в файл imgui.ini, который всегда находится рядом с исполняемым файлом. Запускаешь и у тебя вся прежняя расстановка виджетов с прошлого раза, удобно.

Gyros
() автор топика
Ответ на: комментарий от splinter

я ничего не понял

Да и забей :) Аскорбинка, чистый витамин С.

Что есть Pure

Это буквально слово -> Чисто

Чистый аристократ, чистый авантюрист, чистая магия и т.д. «Высшее» проявление чего либо обособленного.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от Gyros

И даже собралось с помощью mingw32

Под Android и HTML5 тоже можно заставить работать, примеры есть в интернете.

Скины не понравились, т.к. это надо их уметь говить. А как его сделаешь? Не руками же. Там наверное целая технология. Должен быть какой-нибудь инструмент.

Инструментов нету, это делается через код, в imgui так же. Инструмент можно сделать, если нужен сложный дизайн, но готового я не видел.

Все делается как в примере, просто задается значения переменных, можно для этого придумать конфиг, или брать цвета из системы. Все это гибко настраивается, https://cloud.githubusercontent.com/assets/8057201/15991632/76494854-30b8-11e...

Еще жаль, что Nuklear не сохраняет относительные координаты и размеры, свернутость окна для своих виджетов, которые находятся внутри основного окна.

Он написан так, что бы его можно было использовать без ОС и файловой системы, поэтому такие вещи в него не включены. Но доступ к состоянию виджетов можно получить, поэтому написать такую штуку не составит труда, из коробки такого функционала я не заметил.

Внутренними окнами я не пользуюсь, я создаю окна ОС, и в нем рисую на весь экран Nuklear окно без заголовка и рамки. Таким образом я получаю 1 окно nuklear = 1 системное окно. Дизайн внутренних окон выглядит устаревше, хотя раньше часто использовался, и были инструменты для этого https://www.codeproject.com/KB/miscctrl/MDIApp/StepFinal.gif

Недавно как раз вышла новая версия программы на C+Nuklear+Lua: https://github.com/zecruel/CadZinho

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 2)
Ответ на: комментарий от MOPKOBKA

Пытаюсь в тестовом примере нарисовать свой цветной прямоугольник, но из-за какого-то влияния Nuklear прямоугольник выводится черным. Геометрия и цвет задается как Vertex Array. Если комментирую код Nuklear, то выводится на экран как задумано, в цвете.

Основной цикл:

while (!glfwWindowShouldClose(window))
    {
        glfwPollEvents();

        nk_glfw3_new_frame(&glfw);
        /* GUI */
        if (nk_begin(ctx, "Demo", nk_rect(50, 50, 230, 250),
            NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|NK_WINDOW_SCALABLE|
            NK_WINDOW_MINIMIZABLE|NK_WINDOW_TITLE))
        {
            // тут кнопки и проч. элементы управления
        }
        nk_end(ctx);
        
        int display_w, display_h;
        glfwGetFramebufferSize(window, &display_w, &display_h);
        glViewport(0, 0, display_w, display_h);
        glClearColor(bg.r, bg.g, bg.b, bg.a);
        glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ;
   
        // Вывожу свою геометрию
        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
        display();
        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
        CHECK_GL_ERROR();
      
        nk_glfw3_render(&glfw, NK_ANTI_ALIASING_ON, MAX_VERTEX_BUFFER, MAX_ELEMENT_BUFFER);

        glfwSwapBuffers(window);
    }

Функция display:

void display()
{
  glBindVertexArray(vao);
  glDrawArrays(GL_TRIANGLE_STRIP, 0, 8);
  glBindVertexArray(0);

  glFlush();
}

Результат:

В чем причина, пока не знаю..

Gyros
() автор топика
Ответ на: комментарий от Gyros

Сам Nuklear не знает про OpenGL, что то в коде nuklear_glfw_gl3.h ставит такие настройки, я в OpenGL не разбираюсь, попробуй начать комментировать внутри nuklear_glfw_gl3.h пока не заработает. Возможно какой то из glDisable, glEnable.

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 2)
Ответ на: комментарий от MOPKOBKA

Все получилось! Надо было добавить перед выводом своей геометрии

 glUseProgram( my_program_handle);

Он свой nk_program_handle ставит в текущее использование, что естественно (он тоже шейдеры использует). Но с другой стороны странно, что геометрию он подхватил из вершинного буфера, а цвет - нет. Какое-то undefined behavior.

Я бы не сказал, что Nuklear не знает про OpenGL.

Посмотрел внимательнее в функции nk_glfw3_render:

NK_API void
nk_glfw3_render(struct nk_glfw* glfw, enum nk_anti_aliasing AA, int max_vertex_buffer, int max_element_buffer)
{
 /* setup global state */
  glEnable(GL_BLEND);
  glBlendEquation(GL_FUNC_ADD);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  glDisable(GL_CULL_FACE);
  glDisable(GL_DEPTH_TEST);
  glEnable(GL_SCISSOR_TEST);
  glActiveTexture(GL_TEXTURE0);
  
 /* setup program */
  glUseProgram(dev->prog);

 ...

 /* default OpenGL state */
 glUseProgram(0);
 glBindBuffer(GL_ARRAY_BUFFER, 0);
 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
 glBindVertexArray(0);
 glDisable(GL_BLEND);
 glDisable(GL_SCISSOR_TEST);
}

в конце он делает glUseProgram(0). Значит самый первый раз у меня выводилось в цвете, а потом - нет. Я видел, что вначале что-то цветное мелькнуло.

Кстати, еще заметил в demo/glfw_opengl3 там есть окно NodeEdit с крестиком в правом верхнем угле (т.е. окно можно закрыть). Так вот, если кликаешь на крестик, то окно закрывается. Но спустя некоторое время опять появляется (не сразу, попробуйте переключаться на др. подокна и/или поперемещать другие подокна - и оно появится). Считать это багом?

Gyros
() автор топика
Последнее исправление: Gyros (всего исправлений: 1)
Ответ на: комментарий от Gyros

Я бы не сказал, что Nuklear не знает про OpenGL.

Я про файл nuklear.h, ему даже стандартная библиотека не нужна, с помощью Nuklear можно рисовать напрямую в видеопамять попиксельно, OpenGL ему не нужен. А demo/glfw_opengl3 использует OpenGL, я просто хотел указать на то, что в nuklear.h точно нету кода который мешает процессу отрисовки.

Считать это багом?

Состояние закрытости NK_WINDOW_CLOSABLE работает в пределах одного окна, если тебе нужно что то типа полноценного Window Manager, то управлять закрытием окон придется самому, завести массив открытости окон, и рисовать их только если в массиве для окна true. Для обычных приложений, я бы посоветовал схему 1 окно nk = 1 окно системное, с исключением для плавающих панелей как в CadZinho.

Несколько окон, это больше для встраиваемых решений, где системного WM нету.

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 4)