MLX42 は、特定のオペレーティング システムのネイティブ ウィンドウ フレームワークを直接操作することなく、グラフィカル アプリケーションを作成するための、パフォーマンスが高く、使いやすい、クロスプラットフォームの最小限のウィンドウ グラフィック ライブラリです。
これは、ウィンドウ上にテクスチャを描画したり、ウィンドウに表示されるときに実行時にテクスチャを変更したりするための原始的なツールを提供します。
重要
場合によっては、長期間更新が行われていないように見える場合があります。これは予期されたことであり、プロジェクト/ライブラリは完了したものとみなされ、最小限の更新が必要になります。バグ修正は引き続き保証されており、プロジェクトは現在も積極的にメンテナンスされています。
MLX42 には、それを使用することを面倒ではなく実際に楽しくする機能が豊富に備わっています。
おばあちゃんの WindowsXP、叔父の Debian、流行に敏感な人の MacOS で実行してください。どのようなプラットフォームであっても、MLX42 をその上に構築できれば、ネイティブ ウィンドウ システム上で実行できます。
これにより、どのマシン上にあるプロジェクトでも作業できるようになります。
MLX42 は優れたドキュメントを重視しており、すべての機能、使用法、さらには一部の内部動作さえもドキュメント化されています。何かがどのように機能するか、または機能するはずであるかを推測したり検索したりする必要はもうありません。
これは OpenGL 上に構築されており、バッチ レンダリングを使用して他のライブラリと比較してレンダリング プロセスを高速化します。
このプロジェクトは、Codam と 42 Network の学生によって積極的に維持されています。これにより、学生はライブラリ自体について詳しく学び、潜在的なバグを単に受け入れるのではなく修正する直接の機会が得られます。
MLX42 では Emscripten との互換性が導入され、WebAssembly を通じて Web ブラウザで MLX42 を実行できるようになります。この変更は @PepeLevi のおかげで可能になりました。彼のフォークと貢献は彼の功績です。
このプロジェクトの構築は、すべてのシステム全体で次のようになります。 CMake が理解できる限り。
システムに glfw がインストールされていない場合、cmake がこれを検出してダウンロードします。その後、glfw の_deps
ディレクトリでsudo make install
実行できます。 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 モードでビルドしたり、ビルド時にあらゆる種類の動作を変更したりできます。
ここのドキュメントに Makefile の例があります。
システムに 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、Endeavor、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 Defender ファイアウォールを開き、次の手順に従います。
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 );
}