MLX42 — это производительная, простая в использовании, кроссплатформенная библиотека с минимальной оконной графикой, предназначенная для создания графических приложений без необходимости работать напрямую с собственной оконной структурой данной операционной системы.
Он предоставляет примитивные инструменты для рисования текстур в окне, а также их изменения во время выполнения по мере их отображения в окне.
Важный
Иногда может показаться, что обновлений не было уже давно. Это ожидаемо, проект/библиотека считается завершенным и требует минимальных обновлений. Исправления ошибок по-прежнему гарантированы, и проект по-прежнему активно поддерживается.
MLX42 обладает множеством функций, которые превращают его использование в удовольствие, а не в рутинную работу.
Запустите его на WindowsXP вашей бабушки, Debian вашего дяди или MacOS хипстера! Независимо от платформы, если MLX42 сможет ее построить, он будет работать в своей собственной оконной системе.
Это позволяет вам работать над проектом независимо от того, на каком компьютере он находится.
MLX42 заботится о хорошей документации: каждая функция, использование и даже некоторые внутренние работы документированы! Больше не нужно гадать и искать, как что-то работает или должно работать.
Он построен на OpenGL и использует пакетный рендеринг для ускорения процесса рендеринга по сравнению с другими библиотеками.
Этот проект активно поддерживается компанией Codam, а также студентами сети 42. Это дает студентам прямую возможность узнать больше о самой библиотеке, а также исправить любые потенциальные ошибки, а не просто принять их.
MLX42 обеспечивает совместимость с Emscripten, позволяя MLX42 работать в веб-браузерах через WebAssembly. Эта модификация стала возможной благодаря @PepeLevi, спасибо ему за его вилку и вклад.
В целом построение этого проекта для ВСЕХ систем выглядит следующим образом. Пока CMake может это понять.
Если в вашей системе не установлен glfw, cmake обнаружит это и загрузит его для вас. Затем вы можете запустить sudo make install
в каталоге _deps
glfw. Если вы используете компьютер 42 (MacOS, Linux), попросите своего любимого системного администратора установить его. То же самое касается CMake или любых других зависимостей, которые могут вам понадобиться для вашей системы.
Однако, если вы не можете сделать ни того, ни другого, CMake все равно сможет получить GLFW и собрать его. Затем вы можете статически связать его из папки _deps
.
Примечание
Для Codam GLFW уже установлен на Mac.
Примечание
На этапе связывания флагом для связывания GLFW может быть: -lglfw3 или -lglfw в зависимости от вашей системы.
Скомпилируйте вашу программу с библиотекой:
Выгода!
Чтобы полностью собрать библиотеку и установить ее в свою систему, выполните следующую команду:
cmake -B build && cmake --build build --parallel --config (Debug | Release | RelWithDebInfo | MinSizeRel) --target install
По умолчанию Windows помещает установленную библиотеку в: C:Program Files (x86)mlx42
, а для MacOS/Linux она будет помещена в /usr/local/lib
и /usr/local/include
соответственно.
MLX42 поставляется с некоторыми модульными тестами для обеспечения целостности библиотеки. Для их сборки выполните следующую команду:
cmake -DBUILD_TESTS=ON -B build && cmake --build build --parallel
Затем просто запустите их с помощью:
ctest --output-on-failure --test-dir build
git clone https://github.com/codam-coding-college/MLX42.git
cd MLX42
cmake -B build # build here refers to the outputfolder.
cmake --build build -j4 # or do make -C build -j4
Выходной файл библиотеки называется libmlx42.a
и находится в указанной вами папке build
.
Вы можете передать параметры сборки в cmake, например: cmake -DDEBUG=1 -DGLFW_FETCH=0...
. Например, это позволит вам собрать его в режиме DEBUG или изменить любое поведение во время сборки.
Пример make-файла вы можете найти в документации здесь.
Если в вашей системе нет ни GLFW, ни CMake, настоятельно рекомендуется использовать Brew для установки недостающих зависимостей.
Для 42 кампусов вы можете использовать: 42Homebrew
В противном случае с доморощенным:
brew install glfw
brew install cmake
Если вы используете Apple Silicon (чип M1 или новее), обратите внимание, что путь установки Homebrew отличается. Возможно, вы захотите обновить файл конфигурации оболочки. Для пользователей Zsh (оболочка по умолчанию в новых версиях macOS):
nano ~ /.zshrc
export LIBRARY_PATH=/opt/homebrew/lib
Перезапустите сеанс оболочки или перезагрузите терминал, чтобы изменения вступили в силу.
Для MacOS вам необходимо использовать следующие флаги для компиляции вашей программы с библиотекой, чтобы связать программу с правильными платформами:
-framework Cocoa -framework OpenGL -framework IOKit
Обычно, если вы просто установили/собрали glfw
из исходного кода или уже установили его, компиляция должна быть такой:
gcc main.c ... libmlx42.a -Iinclude -lglfw
# Homebrew
gcc main.c ... libmlx42.a -Iinclude -lglfw -L " /opt/homebrew/Cellar/glfw/3.3.8/lib/ "
# 42Homebrew
gcc main.c ... libmlx42.a -Iinclude -lglfw -L " /Users/ $( USER ) /.brew/opt/glfw/lib/ "
При запуске вашей программы в MacOS она может жаловаться, потому что на Mac вам просто нужно думать по-другому. В случае появления каких-либо предупреждений безопасности или сообщения MacOS о невозможности проверки автора/разработчика перейдите в Settings > Security & Privacy
.
Внизу появится всплывающее окно с сообщением о том, что приложение попыталось запуститься. Нажмите на эту опцию, чтобы разрешить его запуск.
Для Debian, например (Ubuntu, Mint, Pop OS...):
sudo apt update
sudo apt install build-essential libx11-dev libglfw3-dev libglfw3 xorg-dev
Для Arch-Linux (Manjaro, Endeavour, Garuda):
sudo pacman -S glfw-x11
ИЛИ (если вы используете композитор Sway/wlroots или другой композитор Wayland)
sudo pacman -S glfw-wayland
Загрузите и соберите MLX42.
Скомпилируйте вашу программу с библиотекой:
gcc main.c ... libmlx42.a -Iinclude -ldl -lglfw -pthread -lm
Важный
Прежде чем приступить к выполнению всех этих шагов, прочитайте это
.zshrc
или .bashrc
: export DISPLAY= $( ip route list default | awk ' {print $3} ' ) :0
export LIBGL_ALWAYS_INDIRECT=0
(Если команда экспорта DISPLAY не работает, альтернативы см. в этом сообщении StackOverflow)
Загрузите и установите приложение XServer с расширенной конфигурацией (XMing не подходит). VcXsrv работает: https://sourceforge.net/projects/vcxsrv/
Откройте брандмауэр Защитника Windows и выполните следующие действия:
Native opengl
Disable access control
Важный
Имейте в виду, что для этого требуется Visual Studio (2022). Разработка под Windows может быть несколько разочаровывающей.
Мы настоятельно рекомендуем вам просто использовать WSL2, чтобы сделать это как можно безболезненнее. Однако, если вы настаиваете на сборке для Windows, все, что вам нужно с точки зрения зависимостей, это:
Как только вы правильно установите все зависимости, CMake
сгенерирует файлы проекта Visual Studio. Просто создайте его, и как только у вас появится файл .lib
переместите его в свой реальный проект и установите, как и любую другую библиотеку.
На всякий случай вот видео, показывающее, как это можно сделать. В этом видео также показано, как можно связать glfw
.
Конечно, вам решать, чтобы код, который вы пишете, был переносимым. Вещи, существующие в Unix
не обязательно существуют в Win32
.
// -----------------------------------------------------------------------------
// Codam Coding College, Amsterdam @ 2022-2023 by W2Wizard.
// See README in the root project for more information.
// -----------------------------------------------------------------------------
#include
#include
#include
#include
#define WIDTH 512
#define HEIGHT 512
static mlx_image_t * image ;
// -----------------------------------------------------------------------------
int32_t ft_pixel ( int32_t r , int32_t g , int32_t b , int32_t a )
{
return ( r << 24 | g << 16 | b << 8 | a );
}
void ft_randomize ( void * param )
{
( void ) param ;
for ( uint32_t i = 0 ; i < image -> width ; ++ i )
{
for ( uint32_t y = 0 ; y < image -> height ; ++ y )
{
uint32_t color = ft_pixel (
rand () % 0xFF , // R
rand () % 0xFF , // G
rand () % 0xFF , // B
rand () % 0xFF // A
);
mlx_put_pixel ( image , i , y , color );
}
}
}
void ft_hook ( void * param )
{
mlx_t * mlx = param ;
if ( mlx_is_key_down ( mlx , MLX_KEY_ESCAPE ))
mlx_close_window ( mlx );
if ( mlx_is_key_down ( mlx , MLX_KEY_UP ))
image -> instances [ 0 ]. y -= 5 ;
if ( mlx_is_key_down ( mlx , MLX_KEY_DOWN ))
image -> instances [ 0 ]. y += 5 ;
if ( mlx_is_key_down ( mlx , MLX_KEY_LEFT ))
image -> instances [ 0 ]. x -= 5 ;
if ( mlx_is_key_down ( mlx , MLX_KEY_RIGHT ))
image -> instances [ 0 ]. x += 5 ;
}
// -----------------------------------------------------------------------------
int32_t main ( void )
{
mlx_t * mlx ;
// Gotta error check this stuff
if (!( mlx = mlx_init ( WIDTH , HEIGHT , "MLX42" , true)))
{
puts ( mlx_strerror ( mlx_errno ));
return ( EXIT_FAILURE );
}
if (!( image = mlx_new_image ( mlx , 128 , 128 )))
{
mlx_close_window ( mlx );
puts ( mlx_strerror ( mlx_errno ));
return ( EXIT_FAILURE );
}
if ( mlx_image_to_window ( mlx , image , 0 , 0 ) == -1 )
{
mlx_close_window ( mlx );
puts ( mlx_strerror ( mlx_errno ));
return ( EXIT_FAILURE );
}
mlx_loop_hook ( mlx , ft_randomize , mlx );
mlx_loop_hook ( mlx , ft_hook , mlx );
mlx_loop ( mlx );
mlx_terminate ( mlx );
return ( EXIT_SUCCESS );
}