LINUX.ORG.RU

Сообщения Gyros

 

Imgui и чистый C

Форум — Development

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

 , , , ,

Gyros
()

Программирование анимации персонажа. Есть проблема

Форум — Development

Всех приветствую! Хочу двигать персонаж вправо на 10.0f ровно за свое заданное время: 2 сек, 0.5 сек и т.п.

Имеются следующие функции и глобальные переменные (очищенный от несущественного псевдокод):

float personage_X=-5.0f, personage_Y=-5.0f;
float distance_X=10.0, distance_Y=0.0;
float dX, dY;
double DELTA_T = 0.01667; //среднее значение delta_T даваемое программой 
                            //(по сути это 1000/60=16.6(6) мс/кадр)
double last_T_move;
double duration_T;
int duration_tick;
bool bmoveLeft  = false;
bool bmoveRight = false;



moveRight
{
   bmoveRight = true; // начинаю движение
   duration_T = 0.9;   // длительность в сек
   duration_tick = (int) (duration_T/DELTA_T); // кол-во тиков(кадров) для перемещения
   dX = distance_X/duration_tick;                   // шаг перемещения
   last_T_move = get_time();
}

update
{
  printf("update()\n");
  if (bmoveRight)
  {
      personage_X += dX;
      printf("now_T - last_T_move = %5.7f\n", now_T - last_T_move);
      if (now_T - last_T_move >= duration_T )
      {
         bmoveRight = false; // остановить движение
      }
    }
}

idle
{
  const double now_T = get_time();
  const double delta_T = now_T - last_T;
  last_T = now_T;
  printf("delta_T = %5.5f\n", delta_T);

  update(now_T);

  redisplay();
}

display
{
  printf("display()\n");
  render_personage();

  swap_buffers();
}

Вывод консоли работающей программы:

( читать дальше... )

1) Теперь я начинаю движение, например за 2.2 сек вправо на 10:

personage coords: [-5.000, -5.000]
duration_tick = 131 // 131 кадр необходимо для достижения конечной точки перемещения 
dX = 0.07634        // шаг
now_T - last_T_move = 0.0156779
now_T - last_T_move = 0.0324781
now_T - last_T_move = 0.0491800
now_T - last_T_move = 0.0658500
now_T - last_T_move = 0.0825200
...
now_T - last_T_move = 2.1999640
now_T - last_T_move = 2.2166250
personage coords: [5.153, -5.000]  //  в идеале должно быть [5.000, -5.000]
                                   //  еще только маленькая погрешность

2) Движение за 0.9 сек вправо на 10:

personage coords: [-5.000, -5.000]
duration_tick = 53 // 53 кадра необходимо для достижения конечной точки перемещения 
dX = 0.18868       // шаг
now_T - last_T_move = 0.0135901
now_T - last_T_move = 0.0302720
now_T - last_T_move = 0.0469420
now_T - last_T_move = 0.0636110
...
now_T - last_T_move = 0.9139049
personage coords: [5.377, -5.000]  //  в идеале должно быть [5.000, -5.000]
                                   //  уже существенная погрешность

3) Движение за 0.2 сек вправо на 10:

personage coords: [-5.000, -5.000]
duration_tick = 11
dX = 0.90909
now_T - last_T_move = 0.0133729
now_T - last_T_move = 0.0302980
now_T - last_T_move = 0.0469708
now_T - last_T_move = 0.0636489
now_T - last_T_move = 0.0803308
...
now_T - last_T_move = 0.1970379
now_T - last_T_move = 0.2136910
personage coords: [6.818, -5.000]  // в идеале должно быть [5.000, -5.000]
                                   //  бешенейшая погрешность (!)
                                   // Alarm! Что делать?

Из трех экспериментов видно, что чем быстрее я хочу переместиться, то тем дальше перелетаю требуемую конечную точку.

Хотелось бы услышать компетентное мнение по устранению данной проблемы и/или возможного изменения подхода к анимации в принципе. Спасибо за помощь!

 , , , ,

Gyros
()

Не хватает библиотеки при сборке cocos2d-x, а она есть!

Форум — Development
~/cocos2d-x-3.17.2/cmake-build$ make
[  1%] Built target ext_unzip
[  3%] Built target ext_recast
[  3%] Built target ext_tinyxml2
[  3%] Built target ext_xxhash
[  3%] Built target ext_xxtea
[  3%] Built target ext_clipper
[  4%] Built target ext_edtaa3func
[  4%] Built target ext_convertUTF
[  4%] Built target ext_poly2tri
[  5%] Built target ext_md5
[  5%] Built target external
[ 70%] Built target cocos2d
[ 71%] Built target ext_tolua
[ 72%] Built target ext_luasocket
[ 79%] Built target luacocos2d
[ 84%] Built target jscocos2d
[ 84%] Linking CXX executable ../../../bin/cpp-empty-test/cpp-empty-test
/usr/bin/ld: ../../../../external/linux-specific/fmod/prebuilt/64-bit/libfmod.so: .dynsym local symbol at index 2 (>= sh_info of 2)
/usr/bin/ld: ../../../../external/linux-specific/fmod/prebuilt/64-bit/libfmod.so: .dynsym local symbol at index 3 (>= sh_info of 2)
/usr/bin/ld: ../../../../external/linux-specific/fmod/prebuilt/64-bit/libfmod.so: .dynsym local symbol at index 4 (>= sh_info of 2)
/usr/bin/ld: cannot find -lXxf86vm
collect2: error: ld returned 1 exit status
make[2]: *** [engine/tests/cpp-empty-test/CMakeFiles/cpp-empty-test.dir/build.make:153: bin/cpp-empty-test/cpp-empty-test] Error 1
make[1]: *** [CMakeFiles/Makefile2:1292: engine/tests/cpp-empty-test/CMakeFiles/cpp-empty-test.dir/all] Error 2
make: *** [Makefile:84: all] Error 2
~/cocos2d-x-3.17.2/cmake-build$ 

Я так понимаю, что библиотеки собрались, а вот примеры не хотят. Кто знает в чем причина? Заранее благодарен за любые содержательные ответы.

PS. Файлы libXxf86vm.so.1 и libXxf86vm.so.1.0.0 в /usr/lib/x86_64-linux-gnu/ присутствуют.

PS2. sudo apt-get update && sudo apt-get install libxxf86vm-dev пробовал.

 , ,

Gyros
()

vbo, vao и шейдеры

Форум — Development

Всем привет! Требуется отправить 6 вершин в GPU. А далее выводить сначала как два анимированных треугольника: (1,2,3)(3,4,1). Потом, тоже как два треугольника, но (4,1,2)(2,3,4). Как сделать так, чтобы не обновлять геометрию в основной программе, т.е. не очищать vao и создавать новый буфер (по сути из тех же самых вершин), и снова его отправлять в GPU. Может индексация тут поможет (можно ли обновлять только буфер индексов?) или в геометрическом шейдере что-то надо делать.

PS: opengl-4

 , , ,

Gyros
()

FreeType2 и mingw32: как получить библиотеку, с которой можно собрать проект для Windows

Форум — Development

Всем добрый вечер! Собственно вопрос в заголовке. Конкрентно интересует для версии FreeType 2.11.1.

Готовую библиотеку что-то навскидку найти не удалось.

Пробовал собирать на месте. Обычную для Linux и g++ без проблем. А для mingw32

В файле INSTALL.GNU говориться заменить config.mk на w32-mingw32.mk из freetype-2.11.1/builds/windows/ Но это ничего не дает:

make CC="x86_64-w64-mingw32-c++"
Вывод:
make: type: Command not found
make: *** No rule to make target '.\src\tools\apinames.c', needed by '.\objs\apinames.exe'.  Stop.

PS Т.е. я правильно понимаю что для того чтобы получить библиотеку (которую можно будет кинуть в /usr/x86_64-w64-mingw32/lib/ и далее использовать для др. проектов для Windows) необходимо собрать исходники FreeType компилятором mingw32?

 

Gyros
()

Cmake, mingw32 и сборка под Ubuntu для получения exe-файла

Форум — Development

Добрый день всем! Есть простенькое графическое приложение, которое без проблем собирается вызовом:

x86_64-w64-mingw32-c++  sailboat.c  -o sailboat.exe  -lglfw3dll -lglfw3 -static-libgcc -static-libstdc++  -lopengl32  -Wl,--subsystem,windows
На выходе получаем exe-шник, который запускается под Windows (или Wine).

Однако, если использовать CMake:

cmake_minimum_required(VERSION 3.0)	# Проверка версии CMake.
					

set (PROJECT sailboat) 		        # Название проекта
project(${PROJECT})

set(OpenGL_GL_PREFERENCE LEGACY)
find_package(OpenGL REQUIRED)
find_package(glfw3  REQUIRED)
include_directories(${OPENGL_INCLUDE_DIR})


find_library(PTHREAD_LIB pthread)

                                   # Установка переменной со списком исходников для исполняемого файла
#set (SOURCES  gl_core_4_3.c)
#set (HEADERS  gl_core_4_3.h)
set (LIBS ${LIBS} ${OPENGL_LIBRARY} ${GLFW_LIBRARIES} )


set (MINGW=ON)
set (CMAKE_SYSTEM_NAME=Windows)
#set_target_properties (${PROJECT} PROPERTIES CMAKE_WIN32_EXECUTABLE True)

set( CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "" )
set( CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "" )

set (BUILD_SHARED_LIBS=OFF)
set (BUILD_CLAR=OFF)
set (THREADSAFE=ON)

set (CMAKE_C_COMPILER   /usr/bin/x86_64-w64-mingw32-c++)
set (CMAKE_CXX_COMPILER /usr/bin/x86_64-w64-mingw32-c++)

set(CMAKE_C_FLAGS   "${CMAKE_C_FLAGS}   -static")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")

set(CMAKE_LIBRARY_PATH /usr/x86_64-w64-mingw32/lib)

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--subsystem,windows")


add_executable (${PROJECT} WIN32 ${HEADERS} ${SOURCES} sailboat.c)    # Создает исполняемый файл с именем PROJECT

set_target_properties (${PROJECT} PROPERTIES LINK_FLAGS_DEBUG   "/SUBSYSTEM:windows")
set_target_properties (${PROJECT} PROPERTIES LINK_FLAGS_RELEASE "/SUBSYSTEM:windows")       

#set(CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc -static-libstdc++ -lglfw3dll")

target_include_directories(${PROJECT} PUBLIC
                           $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
                           $<INSTALL_INTERFACE:include>)


				  # Линковка программы с библиотеками
#target_link_libraries( PUBLIC glfw  ${PTHREAD_LIB} )
target_link_libraries(${PROJECT} PUBLIC ${OPENGL_gl_LIBRARY} glfw)
то происходит такая вещь:

[ 50%] Linking C executable sailboat
/usr/bin/x86_64-w64-mingw32-ld: cannot find -lGL
/usr/bin/x86_64-w64-mingw32-ld: cannot find -lrt
/usr/bin/x86_64-w64-mingw32-ld: cannot find -ldl
/usr/bin/x86_64-w64-mingw32-ld: cannot find -lX11
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/sailboat.dir/build.make:89: sailboat] Error 1
make[1]: *** [CMakeFiles/Makefile2:76: CMakeFiles/sailboat.dir/all] Error 2
make: *** [Makefile:84: all] Error 2

Вообще-то линкер не должен требовать этих библиотек для сборки для Windows. В чем причина?

PS Извините, я новичок в CMake, поэтому CMakeLists.txt такой сумбурный.

 

Gyros
()

RSS подписка на новые темы