MLX42 est une bibliothèque graphique de fenêtrage minimal performante, facile à utiliser, multiplateforme, permettant de créer des applications graphiques sans avoir à travailler directement avec le cadre de fenêtrage natif du système d'exploitation donné.
Il fournit des outils primitifs pour dessiner des textures sur la fenêtre ainsi que pour les modifier au moment de l'exécution au fur et à mesure qu'elles sont affichées sur la fenêtre.
Important
Parfois, il peut sembler qu’aucune mise à jour n’a eu lieu depuis longtemps. Ceci est attendu, le projet/lib est considéré comme terminé et nécessite des mises à jour minimales. Les corrections de bogues sont toujours garanties et le projet est toujours activement maintenu.
Le MLX42 est livré avec une multitude de fonctionnalités qui font de son utilisation un plaisir plutôt qu'une corvée.
Exécutez-le sur le WindowsXP de votre grand-mère, sur la Debian de votre oncle ou sur le MacOS d'un hipster ! Quelle que soit la plateforme, si MLX42 peut s'appuyer dessus, il fonctionnera sur son système de fenêtrage natif.
Cela vous permet de travailler sur votre projet quelle que soit la machine sur laquelle il se trouve.
MLX42 se soucie d'une bonne documentation, chaque fonction, utilisation et même certains fonctionnements internes sont documentés ! Plus besoin de deviner et de chercher comment quelque chose fonctionne ou est censé fonctionner.
Il est construit sur OpenGL et utilise le rendu par lots pour accélérer le processus de rendu par rapport aux autres bibliothèques.
Ce projet est activement entretenu par le Codam ainsi que par les étudiants du Réseau 42. Cela donne aux étudiants l'opportunité directe d'en apprendre davantage sur la bibliothèque elle-même et de corriger les bogues potentiels au lieu de simplement les accepter.
MLX42 introduit la compatibilité avec Emscripten, permettant à MLX42 de s'exécuter dans les navigateurs Web via WebAssembly. Cette modification a été rendue possible grâce à @PepeLevi, merci à lui pour son fork et ses contributions.
Dans l'ensemble, la construction de ce projet est la suivante pour TOUS les systèmes. Tant que CMake peut y donner un sens.
Si glfw n'est pas installé sur votre système, cmake le détectera et le téléchargera pour vous. Vous pouvez ensuite exécuter sudo make install
dans le répertoire _deps
de glfw. Si vous utilisez un ordinateur 42 (MacOS, Linux), demandez à votre administrateur système préféré de l'installer. Il en va de même pour CMake ou toute autre dépendance dont vous pourriez avoir besoin pour votre système.
Cependant, si vous ne pouvez faire ni l'un ni l'autre, CMake pourra toujours récupérer GLFW et le construire. Vous pouvez ensuite le lier statiquement à partir du dossier _deps
.
Note
Pour Codam, GLFW est déjà installé sur les Mac.
Note
Pendant la phase de liaison, l'indicateur permettant de lier GLFW peut être : -lglfw3 ou -lglfw selon votre système.
Compilez votre programme avec la bibliothèque :
Profit!
Pour créer entièrement la bibliothèque et l'installer sur votre système, exécutez la commande suivante :
cmake -B build && cmake --build build --parallel --config (Debug | Release | RelWithDebInfo | MinSizeRel) --target install
Par défaut, Windows placera la bibliothèque installée dans : C:Program Files (x86)mlx42
et pour MacOS / Linux, elle sera placée respectivement dans /usr/local/lib
et /usr/local/include
.
MLX42 est livré avec quelques tests unitaires pour garantir l'intégrité de la bibliothèque, pour les construire, exécutez la commande suivante :
cmake -DBUILD_TESTS=ON -B build && cmake --build build --parallel
Ensuite, exécutez-les simplement avec :
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
Le fichier de bibliothèque de sortie s'appelle libmlx42.a
et se trouve dans le dossier build
que vous avez spécifié.
Vous pouvez transmettre des options de construction à cmake, par exemple : cmake -DDEBUG=1 -DGLFW_FETCH=0...
. Ceux-ci vous permettront par exemple de le construire en mode DEBUG ou de modifier tout type de comportement au moment de la construction.
Vous pouvez trouver un exemple de makefile dans la documentation ici.
Si votre système n'a ni GLFW ni CMake, il est fortement recommandé d'utiliser Brew pour installer ces dépendances manquantes.
Pour 42 Campus, vous pouvez utiliser : 42Homebrew
Sinon avec homebrew :
brew install glfw
brew install cmake
Si vous utilisez Apple Silicon (puce M1 ou version ultérieure), notez que le chemin d'installation de Homebrew est différent. Vous souhaiterez peut-être mettre à jour votre fichier de configuration shell. Pour les utilisateurs de Zsh (shell par défaut sur les versions plus récentes de macOS) :
nano ~ /.zshrc
export LIBRARY_PATH=/opt/homebrew/lib
Redémarrez votre session shell ou redémarrez votre terminal pour que les modifications prennent effet.
Pour MacOS, vous devez utiliser les options suivantes pour compiler votre programme avec la bibliothèque afin de lier le programme aux frameworks appropriés :
-framework Cocoa -framework OpenGL -framework IOKit
Normalement, si vous avez simplement installé/construit glfw
à partir des sources ou si vous l'avez déjà installé, la compilation devrait être :
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/ "
Lorsque vous exécutez votre programme sous MacOS, il peut se plaindre, car avec les Mac, vous devez simplement penser différemment. En cas d'avertissements de sécurité ou si MacOS vous indique qu'il ne peut pas vérifier l'auteur/développeur, accédez à Settings > Security & Privacy
.
Il y aura une fenêtre contextuelle en bas vous indiquant qu'une application a essayé de s'exécuter, cliquez sur l'option pour la laisser s'exécuter.
Pour Debian comme (Ubuntu, Mint, Pop OS...) :
sudo apt update
sudo apt install build-essential libx11-dev libglfw3-dev libglfw3 xorg-dev
Pour Arch-linux (Manjaro, Endeavour, Garuda) :
sudo pacman -S glfw-x11
OU (si vous utilisez le compositeur sway/wlroots ou un autre compositeur wayland)
sudo pacman -S glfw-wayland
Téléchargez et construisez MLX42
Compilez votre programme avec la bibliothèque :
gcc main.c ... libmlx42.a -Iinclude -ldl -lglfw -pthread -lm
Important
Avant de commencer toutes ces étapes, lisez ceci
.zshrc
ou .bashrc
: export DISPLAY= $( ip route list default | awk ' {print $3} ' ) :0
export LIBGL_ALWAYS_INDIRECT=0
(Si la commande d'exportation DISPLAY échoue, consultez cet article StackOverflow pour des alternatives)
Téléchargez et installez une application XServer avec une configuration étendue (XMing n'est pas éligible) VcXsrv fonctionne : https://sourceforge.net/projects/vcxsrv/
Ouvrez le pare-feu Windows Defender et suivez ces étapes :
Native opengl
Disable access control
Important
Sachez que Visual Studio (2022) est requis pour cela. Développer sous Windows peut être quelque peu frustrant.
Nous vous recommandons fortement d'utiliser simplement WSL2 pour rendre cela aussi indolore que possible. Cependant, si vous insistez pour créer Windows de manière native, tout ce dont vous avez besoin en termes de dépendances est :
Une fois que toutes les dépendances sont correctement installées, CMake
générera les fichiers du projet Visual Studio. Construisez-le simplement et une fois que vous avez un fichier .lib
, déplacez-le vers votre projet actuel et installez-le comme vous le feriez avec n'importe quelle autre bibliothèque.
Juste au cas où, voici une vidéo vous montrant comment cela peut être réalisé. Idéalement, cette vidéo explique également comment lier glfw
.
Bien entendu, c'est à vous de vous assurer que le code que vous écrivez est portable. Les éléments qui existent sous Unix
n'existent pas nécessairement sur 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 );
}