Skip to content

zoeesilcock/handmade-zig

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

753 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Handmade Zig

Learning Zig by following along with the Handmade Hero series of videos by Casey Muratori. This implementation follows Casey's approach as closely as Zig allows with some minor departures when I want to explore some specific Zig feature (like using @Vector to get SIMD vector math for example).

Running

Since the executable looks for the library in the same directory as the executable the regular zig build run approach doesn't work. The easiest solution is to build it first and then launch the built executable (so that it can find the library) with the correct working directory (so that it can find the assets).

PowerShell:

zig build ; Start-Process -NoNewWindow -FilePath ./zig-out/bin/handmade-zig.exe -WorkingDirectory ./data

ZSH + Wine on Linux:

zig build -fwine -Dtarget=x86_64-windows && (cd data && ../zig-out/bin/handmade-zig.exe)

Assets

Graphical and audio assets are not included as they are not created by me. The following assets from the pre-order data need to be present to run the game:

  • handmade_hero_legacy_art.zip/v2_hhas to be in the /data directory.
  • handmade_hero_legacy_art.zip/v2_art to be in the /art directory.

Packing the assets

The asset builder can be used to generate HHA files based on the early data located at handmade_hero_legacy_art/early_data, they are expected to be in the /data directory.

zig build build-assets -Dpackage=AssetBuilder

PNG test

zig build run-test-png -Dpackage=TestPNG -- test/gimp_test.png C:/tmp/gimp_test_rgb.bmp C:/tmp/gimp_test_alpha.bmp

HHA edit

The HHA edit tool can be used to create new empty HHA files.

zig build hha-edit -Dpackage=HHAEdit -- -create local.hha
zig build hha-edit -Dpackage=HHAEdit -- -info test.hha
zig build hha-edit -Dpackage=HHAEdit -- -rewrite source.hha dest.hha
zig build hha-edit -Dpackage=HHAEdit -- -dump source.hha dest.hha

Renderer test

This is a way to test the renderer standalone from the rest of the project. It expects some .bmp images and the renderer .dll file in the data/renderer_test directory:

  • test_cube_wall.bmp (block_orphanage_01.png scaled down to 512x512px).
  • test_cube_grass.bmp (block_forest_01.png scaled down to 512x512px).
  • test_sprite_head.bmp (the last srpite in character_krampus.png, cropped and scaled down to 512x512px).
  • test_sprite_tree.bmp (the bottom left sprite in obstacles_forest.png, cropped and scaled down to 512px height).
  • test_cover_grass.bmp (the top left sprite in cover_forest.png, cropped to 512x512px).
  • win32-handmade-opengl.dll (copy from zig-out/bin after running zig build -Dpackage=RendererLibrary).
zig build hha-edit -Dpackage=RendererTest run-renderer-test

Handmade ray

zig build run-raytracer -Dpackage=Raytracer

Hot reloading

The game is split up into an executable for the runtime and a DLL that contains the actual game. This allows hot reloading for most of the game code. When the DLL is rebuilt, the game will automatically reload it.

To make this even more automatic you can run a separate terminal which automatically rebuilds the DLL when you save a file:

zig build --watch -Dpackage=Library

Debugging

The included debugger config under .vscode/launch.json is compatible with the nvim-dap plugin in Neovim and the C/C++ extension in VS Code. Using regular Visual Studio with C/C++ tooling appears to give the most reliable results. Another alternative that works almost as well as Visual Studio is RAD Debugger.

When running outside of an IDE, OutputDebugString messages can be viewed using DebugView.

Analyzing generated assembly

The build is setup to emit the generated assembly code which can be used to analyze the code for bottlenecks using llvm-mca which is bundled with LLVM version 18+.

asm volatile("# LLVM-MCA-BEGIN ProcessPixel");
// Code to analyze.
// ...
asm volatile("# LLVM-MCA-END ProcessPixel");

Analyze the emitted assembly code:

llvm-mca .\zig-out\bin\handmade-dll.asm -bottleneck-analysis -o .\zig-out\bin\handmade-dll-mca.txt

Reference

Intel

AMD

OpenGL

General graphics

PNG

About

Learning Zig by following along with the Handmade Hero series of videos by Casey Muratori.

Topics

Resources

Stars

Watchers

Forks

Contributors

Languages