MLX42 是一個高效能、易於使用、跨平台、最小視窗圖形庫,用於創建圖形應用程序,而無需直接使用給定作業系統的本機視窗框架。
它提供了原始工具來將紋理繪製到視窗上,並在運行時在它們顯示在視窗上時對其進行修改。
重要的
有時,看起來似乎已經很久沒有更新了。這是預期的,項目/lib 被認為已完成並且需要最少的更新。仍然保證錯誤修復,並且該項目仍在積極維護中。
MLX42 具有大量功能,使使用它實際上成為一種樂趣,而不是一件苦差事。
在你祖母的 WindowsXP、你叔叔的 Debian 或時髦人士的 MacOS 上運行它!無論什麼平台,如果 MLX42 可以在其上構建,它將在其本機視窗系統上運行。
這使您無論在哪台機器上都可以處理您的專案。
MLX42 注重良好的文檔,每個功能、用法甚至一些內部工作都有文檔記錄!不再需要猜測和搜尋某些東西如何運作或應該如何運作。
它基於 OpenGL 構建,並使用批次渲染來加速渲染過程(與其他庫相比)。
該計畫由 Codam 以及 42 Network 的學生積極維護。這使學生有直接的機會更多地了解庫本身並修復任何潛在的錯誤,而不是僅僅接受它們。
MLX42 引入了與 Emscripten 的兼容性,讓 MLX42 透過 WebAssembly 在 Web 瀏覽器中運作。這項修改之所以成為可能,要歸功於@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...
。例如,這些可以讓您在偵錯模式下建置它或在建置時改變任何類型的行為。
您可以在此處的文件中找到範例 makefile。
如果您的系統既沒有 GLFW 也沒有 CMake,強烈建議您使用 brew 來安裝那些缺少的依賴項。
對於 42 個校區,您可以使用:42Homebrew
否則使用自製程序:
brew install glfw
brew install cmake
如果您使用 Apple Silicon(M1 晶片或更高版本),請注意 Homebrew 安裝路徑是不同的。您可能想要更新 shell 設定檔。對於 Zsh 使用者(較新 macOS 版本上的預設 shell):
nano ~ /.zshrc
export LIBRARY_PATH=/opt/homebrew/lib
重新啟動 shell 會話或重新啟動終端以使變更生效。
對於 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 );
}