MLX42 es una biblioteca de gráficos de ventanas mínimas, multiplataforma, eficaz y fácil de usar para crear aplicaciones gráficas sin tener que trabajar directamente con el marco de ventanas nativo del sistema operativo determinado.
Proporciona herramientas primitivas para dibujar texturas en la ventana, así como modificarlas en tiempo de ejecución a medida que se muestran en la ventana.
Importante
A veces puede parecer que no se han realizado actualizaciones durante mucho tiempo. Esto es lo esperado, el proyecto/lib se considera completado y requiere actualizaciones mínimas. La corrección de errores aún está garantizada y el proyecto aún se mantiene activamente.
MLX42 viene con una gran cantidad de características que hacen que usarlo sea realmente un placer en lugar de una tarea ardua.
¡Ejecútalo en el Windows XP de tu abuela, en el Debian de tu tío o en el MacOS de un hipster! No importa cuál sea la plataforma, si MLX42 puede basarse en ella, se ejecutará en su sistema de ventanas nativo.
Esto le permite trabajar en su proyecto sin importar en qué máquina se encuentre.
MLX42 se preocupa por una buena documentación, cada función, uso e incluso algunos funcionamientos internos están documentados. No más adivinanzas y búsquedas sobre cómo funciona o se supone que debe funcionar algo.
Está construido sobre OpenGL y utiliza renderizado por lotes para acelerar el proceso de renderizado en comparación con otras bibliotecas.
Codam y los estudiantes de la Red 42 mantienen activamente este proyecto. Esto brinda a los estudiantes la oportunidad directa de aprender más sobre la biblioteca en sí, así como de corregir posibles errores en lugar de simplemente aceptarlos.
MLX42 introduce compatibilidad con Emscripten, lo que permite que MLX42 se ejecute en navegadores web a través de WebAssembly. Esta modificación fue posible gracias a @PepeLevi, créditos para él por su bifurcación y contribuciones.
En general, la construcción de este proyecto es la siguiente para TODOS los sistemas. Siempre que CMake pueda darle sentido.
En caso de que su sistema no tenga glfw instalado, cmake lo detectará y lo descargará por usted. Luego puede ejecutar sudo make install
en el directorio _deps
de glfw. Si está utilizando una computadora 42 (MacOS, Linux), pídale a su administrador de sistemas favorito que la instale. Lo mismo ocurre con CMake o cualquier otra dependencia que pueda necesitar para su sistema.
Sin embargo, si no puede hacer ninguna de las dos cosas, CMake aún podrá recuperar GLFW y compilarlo. Luego puede vincularlo estáticamente desde la carpeta _deps
.
Nota
Para Codam, GLFW ya está instalado en las Mac.
Nota
Durante la etapa de vinculación, el indicador para vincular GLFW puede ser: -lglfw3 o -lglfw dependiendo de su sistema.
Compile su programa con la biblioteca:
¡Ganancia!
Para compilar completamente la biblioteca e instalarla en su sistema, ejecute el siguiente comando:
cmake -B build && cmake --build build --parallel --config (Debug | Release | RelWithDebInfo | MinSizeRel) --target install
De forma predeterminada, Windows colocará la biblioteca instalada en: C:Program Files (x86)mlx42
y para MacOS/Linux se colocará en /usr/local/lib
y /usr/local/include
respectivamente.
MLX42 viene con algunas pruebas unitarias para garantizar la integridad de la biblioteca; para compilarlas, ejecute el siguiente comando:
cmake -DBUILD_TESTS=ON -B build && cmake --build build --parallel
Luego simplemente ejecútelos con:
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
El archivo de biblioteca de salida se llama libmlx42.a
y se encuentra en la carpeta build
que especificó.
Puede pasar opciones de compilación a cmake, por ejemplo: cmake -DDEBUG=1 -DGLFW_FETCH=0...
. Estos, por ejemplo, le permitirán compilarlo en modo DEBUG o alterar cualquier tipo de comportamiento en el momento de la compilación.
Puede encontrar un archivo MAKE de ejemplo en la documentación aquí.
Si su sistema no tiene GLFW ni CMake, se recomienda encarecidamente que utilice Brew para instalar las dependencias que faltan.
Para 42 Campus puedes usar: 42Homebrew
De lo contrario con cerveza casera:
brew install glfw
brew install cmake
Si está utilizando Apple Silicon (chip M1 o posterior), tenga en cuenta que la ruta de instalación de Homebrew es diferente. Es posible que desee actualizar su archivo de configuración de Shell. Para usuarios de Zsh (shell predeterminado en versiones más recientes de macOS):
nano ~ /.zshrc
export LIBRARY_PATH=/opt/homebrew/lib
Reinicie su sesión de shell o reinicie su terminal para que los cambios surtan efecto.
Para MacOS, necesita usar los siguientes indicadores para compilar su programa con la biblioteca para vincular el programa con los marcos correctos:
-framework Cocoa -framework OpenGL -framework IOKit
Normalmente, si simplemente instaló/construyó glfw
desde la fuente o ya lo tiene instalado, la compilación debería ser:
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/ "
Al ejecutar su programa en MacOS, puede quejarse, porque con Mac simplemente debe pensar de manera diferente. En caso de que aparezca alguna advertencia de seguridad o que MacOS le indique que no puede verificar al autor/desarrollador, vaya a Settings > Security & Privacy
.
Aparecerá una ventana emergente en la parte inferior que le indicará que se intentó ejecutar una aplicación; haga clic en la opción para dejarla ejecutar.
Para Debian como (Ubuntu, Mint, Pop OS...):
sudo apt update
sudo apt install build-essential libx11-dev libglfw3-dev libglfw3 xorg-dev
Para Arch-linux (Manjaro, Endeavour, Garuda):
sudo pacman -S glfw-x11
O (si usa el compositor sway/wlroots u otro compositor wayland)
sudo pacman -S glfw-wayland
Descargar y compilar MLX42
Compile su programa con la biblioteca:
gcc main.c ... libmlx42.a -Iinclude -ldl -lglfw -pthread -lm
Importante
Antes de comenzar con todos estos pasos, lee esto
.zshrc
o .bashrc
: export DISPLAY= $( ip route list default | awk ' {print $3} ' ) :0
export LIBGL_ALWAYS_INDIRECT=0
(Si el comando de exportación DISPLAY falla, consulte esta publicación de StackOverflow para conocer alternativas)
Descargue e instale una aplicación XServer con configuración extendida (XMing no califica) VcXsrv funciona: https://sourceforge.net/projects/vcxsrv/
Abra el Firewall de Windows Defender y siga estos pasos:
Native opengl
Disable access control
Importante
Tenga en cuenta que para esto se requiere Visual Studio (2022). Desarrollar en Windows puede resultar algo frustrante.
Le recomendamos encarecidamente que simplemente utilice WSL2 para que esto sea lo menos doloroso posible. Sin embargo, si insistes en compilar para Windows de forma nativa, todo lo que necesitas en términos de dependencias es:
Una vez que tenga todas las dependencias correctamente instaladas, CMake
generará los archivos del proyecto de Visual Studio. Simplemente compílelo y una vez que tenga un archivo .lib
muévalo a su proyecto real e instálelo como lo haría con cualquier otra biblioteca.
Por si acaso, aquí tienes un vídeo que muestra cómo se puede hacer esto. Convenientemente, este video también cubre cómo vincular glfw
.
Por supuesto, depende de usted asegurarse de que el código que escriba sea portátil. Las cosas que existen en Unix
no necesariamente existen en 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 );
}