MLX42 ist eine leistungsstarke, benutzerfreundliche, plattformübergreifende Grafikbibliothek mit minimalem Fenstereffekt zum Erstellen grafischer Anwendungen, ohne direkt mit dem nativen Fensterrahmen des jeweiligen Betriebssystems arbeiten zu müssen.
Es bietet einfache Werkzeuge zum Zeichnen von Texturen auf dem Fenster und zum Ändern dieser zur Laufzeit, wenn sie im Fenster angezeigt werden.
Wichtig
Manchmal scheint es so, als ob schon lange keine Updates stattgefunden hätten. Dies wird erwartet, das Projekt/die Bibliothek gilt als abgeschlossen und erfordert nur minimale Aktualisierungen. Fehlerbehebungen sind weiterhin garantiert und das Projekt wird weiterhin aktiv gepflegt.
MLX42 verfügt über eine Fülle von Funktionen, die die Verwendung zu einer Freude statt einer lästigen Pflicht machen.
Führen Sie es auf dem Windows XP Ihrer Oma, auf dem Debian Ihres Onkels oder auf dem MacOS eines Hipsters aus! Unabhängig von der Plattform läuft MLX42 auf seinem nativen Fenstersystem, wenn es darauf aufbauen kann.
Dadurch können Sie an Ihrem Projekt arbeiten, egal auf welcher Maschine es sich befindet.
MLX42 legt Wert auf eine gute Dokumentation, jede Funktion, Nutzung und sogar einige interne Abläufe werden dokumentiert! Kein Raten und Suchen mehr, wie etwas funktioniert oder funktionieren soll.
Es basiert auf OpenGL und nutzt Batch-Rendering, um den Rendering-Prozess im Vergleich zu anderen Bibliotheken zu beschleunigen.
Dieses Projekt wird von Codam sowie Studenten des 42-Netzwerks aktiv gepflegt. Dies gibt Studierenden die unmittelbare Möglichkeit, mehr über die Bibliothek selbst zu erfahren und mögliche Fehler zu beheben, anstatt sie einfach hinzunehmen.
MLX42 führt Kompatibilität mit Emscripten ein und ermöglicht die Ausführung von MLX42 in Webbrowsern über WebAssembly. Diese Änderung wurde dank @PepeLevi ermöglicht, wir danken ihm für seinen Fork und seine Beiträge.
Insgesamt sieht der Aufbau dieses Projekts für ALLE Systeme wie folgt aus. Solange CMake daraus einen Sinn machen kann.
Falls auf Ihrem System kein glfw installiert ist, erkennt cmake dies und lädt es für Sie herunter. Anschließend können Sie sudo make install
im Verzeichnis _deps
von glfw ausführen. Wenn Sie einen 42-Computer (MacOS, Linux) verwenden, bitten Sie Ihren bevorzugten Systemadministrator, ihn zu installieren. Das Gleiche gilt für CMake oder alle anderen Abhängigkeiten, die Sie möglicherweise für Ihr System benötigen.
Wenn Sie jedoch beides nicht tun können, kann CMake trotzdem GLFW abrufen und erstellen. Sie können es dann statisch aus dem Ordner _deps
verknüpfen.
Notiz
Für Codam ist GLFW bereits auf den Macs installiert.
Notiz
Während der Verknüpfungsphase kann das Flag zum Verknüpfen von GLFW je nach System entweder -lglfw3 oder -lglfw sein.
Kompilieren Sie Ihr Programm mit der Bibliothek:
Profitieren!
Um die Bibliothek vollständig zu erstellen und auf Ihrem System zu installieren, führen Sie den folgenden Befehl aus:
cmake -B build && cmake --build build --parallel --config (Debug | Release | RelWithDebInfo | MinSizeRel) --target install
Standardmäßig platziert Windows die installierte Bibliothek unter: C:Program Files (x86)mlx42
und für MacOS/Linux wird sie unter /usr/local/lib
bzw. /usr/local/include
abgelegt.
MLX42 enthält einige Komponententests, um die Integrität der Bibliothek sicherzustellen. Um sie zu erstellen, führen Sie den folgenden Befehl aus:
cmake -DBUILD_TESTS=ON -B build && cmake --build build --parallel
Dann führen Sie sie einfach aus mit:
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
Die Ausgabebibliotheksdatei heißt libmlx42.a
und befindet sich im von Ihnen angegebenen build
Ordner.
Sie können Build-Optionen an cmake übergeben, z. B. cmake -DDEBUG=1 -DGLFW_FETCH=0...
. Damit können Sie es beispielsweise im DEBUG-Modus erstellen oder beliebige Verhaltensweisen während der Erstellung ändern.
Ein Beispiel-Makefile finden Sie in der Dokumentation hier.
Wenn Ihr System weder GLFW noch CMake hat, wird dringend empfohlen, brew zu verwenden, um die fehlenden Abhängigkeiten zu installieren.
Für 42 Campusse können Sie verwenden: 42Homebrew
Ansonsten mit Homebrew:
brew install glfw
brew install cmake
Wenn Sie Apple Silicon (M1-Chip oder höher) verwenden, beachten Sie, dass der Homebrew-Installationspfad anders ist. Möglicherweise möchten Sie Ihre Shell-Konfigurationsdatei aktualisieren. Für Zsh-Benutzer (Standard-Shell auf neueren macOS-Versionen):
nano ~ /.zshrc
export LIBRARY_PATH=/opt/homebrew/lib
Starten Sie Ihre Shell-Sitzung neu oder starten Sie Ihr Terminal neu, damit die Änderungen wirksam werden.
Für MacOS müssen Sie die folgenden Flags verwenden, um Ihr Programm mit der Bibliothek zu kompilieren, um das Programm mit den richtigen Frameworks zu verknüpfen:
-framework Cocoa -framework OpenGL -framework IOKit
Wenn Sie glfw
einfach aus dem Quellcode installiert/erstellt haben oder es bereits installiert haben, sollte die Kompilierung normalerweise wie folgt aussehen:
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/ "
Wenn Sie Ihr Programm unter MacOS ausführen, kann es zu Beschwerden kommen, da Sie bei Macs einfach anders denken müssen. Falls Sicherheitswarnungen auftreten oder MacOS Ihnen mitteilt, dass der Autor/Entwickler nicht überprüft werden kann, gehen Sie zu Settings > Security & Privacy
.
Unten wird ein Popup angezeigt, das Sie darüber informiert, dass eine Anwendung ausgeführt werden wollte. Klicken Sie auf die Option, um sie ausführen zu lassen.
Für Debian wie (Ubuntu, Mint, Pop OS...):
sudo apt update
sudo apt install build-essential libx11-dev libglfw3-dev libglfw3 xorg-dev
Für Arch-Linux (Manjaro, Endeavour, Garuda):
sudo pacman -S glfw-x11
ODER (wenn Sie den Sway/WLroots-Compositor oder einen anderen Wayland-Compositor verwenden)
sudo pacman -S glfw-wayland
Laden Sie MLX42 herunter und erstellen Sie es
Kompilieren Sie Ihr Programm mit der Bibliothek:
gcc main.c ... libmlx42.a -Iinclude -ldl -lglfw -pthread -lm
Wichtig
Bevor Sie mit all diesen Schritten beginnen, lesen Sie dies
.zshrc
oder .bashrc
fest: export DISPLAY= $( ip route list default | awk ' {print $3} ' ) :0
export LIBGL_ALWAYS_INDIRECT=0
(Wenn der DISPLAY-Exportbefehl fehlschlägt, finden Sie in diesem StackOverflow-Beitrag Alternativen.)
Laden Sie eine XServer-Anwendung mit erweiterter Konfiguration herunter und installieren Sie sie (XMing ist nicht qualifiziert). VcXsrv funktioniert: https://sourceforge.net/projects/vcxsrv/
Öffnen Sie die Windows Defender-Firewall und führen Sie die folgenden Schritte aus:
Native opengl
Disable access control
Wichtig
Beachten Sie, dass hierfür Visual Studio (2022) erforderlich ist. Die Entwicklung unter Windows kann etwas frustrierend sein.
Wir empfehlen Ihnen dringend, einfach WSL2 zu verwenden, um dies so schmerzlos wie möglich zu gestalten. Wenn Sie jedoch darauf bestehen, nativ für Windows zu erstellen, benötigen Sie in Bezug auf Abhängigkeiten lediglich Folgendes:
Sobald Sie alle Abhängigkeiten korrekt installiert haben, generiert CMake
die Visual Studio-Projektdateien. Erstellen Sie es einfach und sobald Sie eine .lib
-Datei haben, verschieben Sie diese in Ihr eigentliches Projekt und installieren Sie sie wie jede andere Bibliothek.
Für alle Fälle gibt es hier ein Video, das Ihnen zeigt, wie das geht. Praktischerweise wird in diesem Video auch erläutert, wie Sie glfw
verknüpfen können.
Natürlich liegt es an Ihnen, sicherzustellen, dass der von Ihnen geschriebene Code portierbar ist. Dinge, die unter Unix
existieren, existieren nicht unbedingt auch unter 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 );
}