Latest commit

History

893 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

 /$$$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$$ /$$$$$$ /$$$$$$$$ /$$$$$$$$
|_____ $$ |_ $$_/ /$$__ $$ /$$__ $$| $$__ $$ /$$__ $$| $$_____/|__ $$__/
/$$/ | $$ | $$ \__/| $$ \__/| $$ \ $$| $$ \ $$| $$ | $$ /$$/ | $$ | $$ /$$$$| $$ | $$$$$$$/| $$$$$$$$| $$$$$ | $$ /$$/ | $$ | $$|_ $$| $$ | $$__ $$| $$__ $$| $$__/ | $$ /$$/ | $$ | $$ \ $$| $$ $$| $$ \ $$| $$ | $$| $$ | $$ /$$$$$$$$ /$$$$$$| $$$$$$/| $$$$$$/| $$ | $$| $$ | $$| $$ | $$ |________/|______/ \______/ \______/ |__/ |__/|__/ |__/|__/ |__/ 
ZigCraft distant voxel landscape with LOD terrain and forests

⚡ ZigCraft ⚡

ZigLicenseBuild Status

A high-performance Minecraft-style voxel engine built with Zig, SDL3, and a modern Vulkan graphics pipeline.


🚀 Overview

ZigCraft is a technical exploration of high-performance voxel rendering techniques, developed primarily as an AI-assisted solo project. It features a custom-built graphics abstraction layer, advanced terrain generation, and a multithreaded job system to handle massive world streaming with zero hitching.

✨ Key Features

🎨 Rendering Architecture

  • Vulkan RHI: Modern, explicit graphics API with persistent UBO mapping for high performance.
  • PBR Rendering: Physically Based Rendering with Cook-Torrance BRDF for realistic materials.
  • Cascaded Shadow Maps (CSM): 3 cascades with configurable PCF sampling (4-16 samples).
  • Atmospheric Scattering: Physically-based day/night cycle with dynamic fog and sky rendering.
  • Advanced Graphics Menu: Real-time control over shadow quality, PBR, resolution scaling, and MSAA.
  • Floating Origin & Reverse-Z: Industry-standard techniques to eliminate precision jitter and Z-fighting at scale.
  • Greedy Meshing: Optimized chunk generation reducing draw call overhead and triangle counts.

🌍 World Generation

  • Biomes & Climate: Multi-noise system based on temperature and humidity (11+ biomes).
  • Infinite Terrain: Seed-based, deterministic generation with domain warping and 3D caves.
  • Level of Detail (LOD): Hierarchical LOD system enabling 100+ chunk render distances using simplified terrain meshes and specialized rendering.
  • Greedy Meshing: Optimized vertex data generation for maximum throughput.

🛠️ Engine Core

  • Multithreaded Pipeline: Dedicated worker pools for generation (4 threads) and meshing (3 threads).
  • Job Prioritization: Proximity-based task scheduling ensures immediate loading of local chunks.
  • Comprehensive Testing: Unit tests covering math, worldgen, and core engine modules.
  • Refined App Lifecycle: Modular architecture with extracted systems for rendering, input, and world management.

📊 Performance

Optimized for high chunk render distances with greedy meshing, job-based multithreading, and a Vulkan RHI backend. Build with -Doptimize=ReleaseFast for best results.

⌨️ Controls

KeyAction
WASDMovement
Space / ShiftJump / Crouch (Fly Up / Down)
Left CtrlSprint
MouseLook
Left Click / Right ClickMine Block / Place Block
TabToggle Mouse Capture / Menu
IOpen Inventory
1-9Select Hotbar Slot
F / TToggle Wireframe / Textures
VToggle VSync
U / KToggle Shadow Debug / Cycle Cascades
MToggle World Map
NFreeze / Unfreeze Time
F2Toggle FPS Counter
F3Toggle Creative Mode
F5Toggle Block Info
EscMenu / Pause

Note: Time of day can be set via the inventory screen (buttons for DAWN, NOON, DUSK, NIGHT).

🏗️ Build & Run

This project uses devenv (Nix-based) for a reproducible development environment.

🛠️ Development Setup

After cloning or creating a new worktree, run the setup script to enable git hooks:

./scripts/setup-hooks.sh

This configures a pre-push hook that runs:

  • zig fmt --check src/ - formatting check
  • zig build test - full test suite

To bypass in emergencies: git push --no-verify

🎮 Running the Game

  • Run: devenv shell zig build run
  • Release build: devenv shell zig build run -Doptimize=ReleaseFast

Debug Build Flags

  • Smoke test: devenv shell zig build run -Dsmoke-test
  • Headless / no present: devenv shell zig build run -Dskip-present
  • Headless benchmark: devenv shell zig build benchmark -Dbenchmark-preset=low -Dbenchmark-duration=60 -Dbenchmark-output=benchmark-low.json
  • Auto-open a world: devenv shell zig build run -Dauto-world=normal
  • Open on monitor: devenv shell zig build run -Dmonitor-index=1
  • Open on Hyprland monitor: devenv shell zig build run -Dmonitor-name=DP-2
  • Force XWayland monitor placement: devenv shell zig build run -Dmonitor-index=1 -Dwindow-video-driver=x11
  • Background window launch: devenv shell zig build run -Dmonitor-name=DP-2 -Dwindow-video-driver=x11 -Dwindow-no-focus
  • Startup diagnostic: devenv shell zig build run -Dauto-world=normal -Dstartup-diagnostic-seconds=5 -Dskip-present
  • Worldgen climate snapshot JSON: devenv shell zig build worldgen-climate-snapshot -- --seed 42 --origin-x -256 --origin-z -256 --width 128 --depth 128 --step 4 --output zig-out/climate-42.json
  • Worldgen climate heatmap: devenv shell zig build worldgen-climate-snapshot -- --format ppm --field temperature --output zig-out/temperature-42.ppm
  • Chunk-only debug mode: devenv shell zig build run -Dchunk-debug-mode -Dauto-world=normal
  • Shadow/cave lighting capture: ./scripts/capture_shadow_test.sh screenshots/shadow-test.png

-Dchunk-debug-mode strips the overworld down to basic chunks for isolation work:

  • LOD off by default
  • water generation/rendering off by default
  • caves off by default
  • decorations/features off by default

Re-enable individual systems with -Dchunk-debug-enable= using a comma-separated list:

  • lod
  • water
  • watergen
  • waterrender
  • caves
  • decorations

Examples:

# LOD only
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod -Dauto-world=normal
# LOD plus cave generation
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod,caves -Dauto-world=normal
# Headless startup comparison after 5 seconds
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod,water,caves -Dauto-world=normal -Dstartup-diagnostic-seconds=5 -Dskip-present

The shadow/cave lighting capture launches a deterministic low-block test scene, applies a small shadow-focused graphics preset, waits 5 seconds after the target is ready, captures a PNG, and exits. It defaults to a dug-cave variant that matches a player-dug dirt/grass cave mouth. Use ZIGCRAFT_SHADOW_TEST_VARIANT=bend ./scripts/capture_shadow_test.sh screenshots/shadow-bend.png to check the older bend/deep-black regression. Override the wait with ZIGCRAFT_SCREENSHOT_DELAY_SECONDS=8 ./scripts/capture_shadow_test.sh screenshots/shadow-test.png. Screenshot paths are restricted to image extensions from image/png, image/jpeg, image/gif, and image/webp; the built-in encoder currently writes PNG.

🧪 Running Tests

  • All Tests: devenv shell zig build test
  • Single Test: devenv shell zig build test -- --test-filter "Test Name"
  • Single Test Alternative: devenv shell zig build test -Dtest-filter="Test Name"

📂 Project Structure

  • modules/engine-*: Core engine packages (RHI, graphics, math, UI, input, jobs, ECS, audio).
  • modules/world-core: Blocks, chunks, coordinates, lighting, and shared world types.
  • modules/world-worldgen: Procedural terrain, noise, biomes, caves, decorations, and generator registry.
  • modules/world-meshing: Chunk storage, mesh generation, GPU block buffers, and meshing helpers.
  • modules/world-lod: Distant terrain LOD data, scheduling, rendering, and management.
  • modules/world-runtime: World facade, streaming, mutation, rendering, and GPU meshing runtime.
  • modules/world-persistence: Level data, chunk serialization, region files, and save manager.
  • src/game/: Application/gameplay state, screens, player, inventory, and session logic.
  • assets/: GLSL shaders and textures.
  • scripts/: Helper scripts for asset processing.
  • libs/: Local dependencies (zig-math, zig-noise, stb).

🛠️ Texture Pipeline

Temporary Asset Notice

Some textures in assets/textures/default/ are temporary development placeholders imported from external Minecraft-compatible resource packs, including Classic Faithful 64x Jappa, while the engine art pipeline is being built out. They are included only to make local development and visual iteration easier, and should be replaced with original or clearly licensed project assets before any public release or redistribution.

ZigCraft does not claim ownership of third-party placeholder textures. Keep attribution and licensing requirements with any external resource pack assets you use.

The engine supports HD texture packs with full PBR maps. To standardize high-resolution source imagery (4k JPEGs, EXRs) into engine-ready 512px PNGs, use the provided helper script:

# Standardize an entire pack
./scripts/process_textures.sh assets/textures/pbr-test 512

The script automatically handles resizing and naming conventions for _diff, _nor_gl, _rough, and _disp maps.

🤝 Contributing

This is primarily a solo, AI-assisted project. Contributions are welcome but the scope and direction are tightly focused. See CONTRIBUTING.md for the full development workflow.

Quick Start for Contributors

# Clone and setup
git clone https://github.com/OpenStaticFish/ZigCraft.git
cd ZigCraft
./scripts/setup-hooks.sh
# Enter dev environment and run tests
devenv shell zig build test

Branch Workflow

main (production)
└─ dev (staging)
├─ feature/* # New features
├─ bug/* # Non-critical fixes
├─ hotfix/* # Critical fixes
└─ ci/* # CI/workflow changes

All PRs target the dev branch. Use our PR templates (feature.md, bug.md, hotfix.md, ci.md) for best practices.

🔧 Troubleshooting

devenv Build Failures

# Clean build artifacts
rm -rf zig-out/ .zig-cache/
# Refresh devenv inputs (updates the pinned nixpkgs)
devenv update

Vulkan Driver Issues

  • Linux: Ensure vulkan-loader and GPU drivers are installed
  • NVIDIA: Proprietary drivers recommended for best performance
  • Verify: Run vulkaninfo to check Vulkan support

Shader Validation Errors

Shaders are validated during zig build test. If glslang fails:

# Install glslang via devenv
devenv shell # glslang is included in the dev shell

Performance Issues

  • Try zig build run -Doptimize=ReleaseFast for optimized builds
  • Reduce render distance in-game: Press Esc → Graphics → Render Distance
  • Disable VSync if FPS is capped at 60

🌟 Community

DiscussionsGitHub Discussions
IssuesGitHub Issues
SecuritySecurity Policy
LicenseMIT License

⚖️ License

MIT License - see LICENSE for details.

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

893 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

 /$$$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$$ /$$$$$$ /$$$$$$$$ /$$$$$$$$
|_____ $$ |_ $$_/ /$$__ $$ /$$__ $$| $$__ $$ /$$__ $$| $$_____/|__ $$__/
/$$/ | $$ | $$ \__/| $$ \__/| $$ \ $$| $$ \ $$| $$ | $$ /$$/ | $$ | $$ /$$$$| $$ | $$$$$$$/| $$$$$$$$| $$$$$ | $$ /$$/ | $$ | $$|_ $$| $$ | $$__ $$| $$__ $$| $$__/ | $$ /$$/ | $$ | $$ \ $$| $$ $$| $$ \ $$| $$ | $$| $$ | $$ /$$$$$$$$ /$$$$$$| $$$$$$/| $$$$$$/| $$ | $$| $$ | $$| $$ | $$ |________/|______/ \______/ \______/ |__/ |__/|__/ |__/|__/ |__/ 
ZigCraft distant voxel landscape with LOD terrain and forests

⚡ ZigCraft ⚡

ZigLicenseBuild Status

A high-performance Minecraft-style voxel engine built with Zig, SDL3, and a modern Vulkan graphics pipeline.


🚀 Overview

ZigCraft is a technical exploration of high-performance voxel rendering techniques, developed primarily as an AI-assisted solo project. It features a custom-built graphics abstraction layer, advanced terrain generation, and a multithreaded job system to handle massive world streaming with zero hitching.

✨ Key Features

🎨 Rendering Architecture

  • Vulkan RHI: Modern, explicit graphics API with persistent UBO mapping for high performance.
  • PBR Rendering: Physically Based Rendering with Cook-Torrance BRDF for realistic materials.
  • Cascaded Shadow Maps (CSM): 3 cascades with configurable PCF sampling (4-16 samples).
  • Atmospheric Scattering: Physically-based day/night cycle with dynamic fog and sky rendering.
  • Advanced Graphics Menu: Real-time control over shadow quality, PBR, resolution scaling, and MSAA.
  • Floating Origin & Reverse-Z: Industry-standard techniques to eliminate precision jitter and Z-fighting at scale.
  • Greedy Meshing: Optimized chunk generation reducing draw call overhead and triangle counts.

🌍 World Generation

  • Biomes & Climate: Multi-noise system based on temperature and humidity (11+ biomes).
  • Infinite Terrain: Seed-based, deterministic generation with domain warping and 3D caves.
  • Level of Detail (LOD): Hierarchical LOD system enabling 100+ chunk render distances using simplified terrain meshes and specialized rendering.
  • Greedy Meshing: Optimized vertex data generation for maximum throughput.

🛠️ Engine Core

  • Multithreaded Pipeline: Dedicated worker pools for generation (4 threads) and meshing (3 threads).
  • Job Prioritization: Proximity-based task scheduling ensures immediate loading of local chunks.
  • Comprehensive Testing: Unit tests covering math, worldgen, and core engine modules.
  • Refined App Lifecycle: Modular architecture with extracted systems for rendering, input, and world management.

📊 Performance

Optimized for high chunk render distances with greedy meshing, job-based multithreading, and a Vulkan RHI backend. Build with -Doptimize=ReleaseFast for best results.

⌨️ Controls

KeyAction
WASDMovement
Space / ShiftJump / Crouch (Fly Up / Down)
Left CtrlSprint
MouseLook
Left Click / Right ClickMine Block / Place Block
TabToggle Mouse Capture / Menu
IOpen Inventory
1-9Select Hotbar Slot
F / TToggle Wireframe / Textures
VToggle VSync
U / KToggle Shadow Debug / Cycle Cascades
MToggle World Map
NFreeze / Unfreeze Time
F2Toggle FPS Counter
F3Toggle Creative Mode
F5Toggle Block Info
EscMenu / Pause

Note: Time of day can be set via the inventory screen (buttons for DAWN, NOON, DUSK, NIGHT).

🏗️ Build & Run

This project uses devenv (Nix-based) for a reproducible development environment.

🛠️ Development Setup

After cloning or creating a new worktree, run the setup script to enable git hooks:

./scripts/setup-hooks.sh

This configures a pre-push hook that runs:

  • zig fmt --check src/ - formatting check
  • zig build test - full test suite

To bypass in emergencies: git push --no-verify

🎮 Running the Game

  • Run: devenv shell zig build run
  • Release build: devenv shell zig build run -Doptimize=ReleaseFast

Debug Build Flags

  • Smoke test: devenv shell zig build run -Dsmoke-test
  • Headless / no present: devenv shell zig build run -Dskip-present
  • Headless benchmark: devenv shell zig build benchmark -Dbenchmark-preset=low -Dbenchmark-duration=60 -Dbenchmark-output=benchmark-low.json
  • Auto-open a world: devenv shell zig build run -Dauto-world=normal
  • Open on monitor: devenv shell zig build run -Dmonitor-index=1
  • Open on Hyprland monitor: devenv shell zig build run -Dmonitor-name=DP-2
  • Force XWayland monitor placement: devenv shell zig build run -Dmonitor-index=1 -Dwindow-video-driver=x11
  • Background window launch: devenv shell zig build run -Dmonitor-name=DP-2 -Dwindow-video-driver=x11 -Dwindow-no-focus
  • Startup diagnostic: devenv shell zig build run -Dauto-world=normal -Dstartup-diagnostic-seconds=5 -Dskip-present
  • Worldgen climate snapshot JSON: devenv shell zig build worldgen-climate-snapshot -- --seed 42 --origin-x -256 --origin-z -256 --width 128 --depth 128 --step 4 --output zig-out/climate-42.json
  • Worldgen climate heatmap: devenv shell zig build worldgen-climate-snapshot -- --format ppm --field temperature --output zig-out/temperature-42.ppm
  • Chunk-only debug mode: devenv shell zig build run -Dchunk-debug-mode -Dauto-world=normal
  • Shadow/cave lighting capture: ./scripts/capture_shadow_test.sh screenshots/shadow-test.png

-Dchunk-debug-mode strips the overworld down to basic chunks for isolation work:

  • LOD off by default
  • water generation/rendering off by default
  • caves off by default
  • decorations/features off by default

Re-enable individual systems with -Dchunk-debug-enable= using a comma-separated list:

  • lod
  • water
  • watergen
  • waterrender
  • caves
  • decorations

Examples:

# LOD only
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod -Dauto-world=normal
# LOD plus cave generation
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod,caves -Dauto-world=normal
# Headless startup comparison after 5 seconds
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod,water,caves -Dauto-world=normal -Dstartup-diagnostic-seconds=5 -Dskip-present

The shadow/cave lighting capture launches a deterministic low-block test scene, applies a small shadow-focused graphics preset, waits 5 seconds after the target is ready, captures a PNG, and exits. It defaults to a dug-cave variant that matches a player-dug dirt/grass cave mouth. Use ZIGCRAFT_SHADOW_TEST_VARIANT=bend ./scripts/capture_shadow_test.sh screenshots/shadow-bend.png to check the older bend/deep-black regression. Override the wait with ZIGCRAFT_SCREENSHOT_DELAY_SECONDS=8 ./scripts/capture_shadow_test.sh screenshots/shadow-test.png. Screenshot paths are restricted to image extensions from image/png, image/jpeg, image/gif, and image/webp; the built-in encoder currently writes PNG.

🧪 Running Tests

  • All Tests: devenv shell zig build test
  • Single Test: devenv shell zig build test -- --test-filter "Test Name"
  • Single Test Alternative: devenv shell zig build test -Dtest-filter="Test Name"

📂 Project Structure

  • modules/engine-*: Core engine packages (RHI, graphics, math, UI, input, jobs, ECS, audio).
  • modules/world-core: Blocks, chunks, coordinates, lighting, and shared world types.
  • modules/world-worldgen: Procedural terrain, noise, biomes, caves, decorations, and generator registry.
  • modules/world-meshing: Chunk storage, mesh generation, GPU block buffers, and meshing helpers.
  • modules/world-lod: Distant terrain LOD data, scheduling, rendering, and management.
  • modules/world-runtime: World facade, streaming, mutation, rendering, and GPU meshing runtime.
  • modules/world-persistence: Level data, chunk serialization, region files, and save manager.
  • src/game/: Application/gameplay state, screens, player, inventory, and session logic.
  • assets/: GLSL shaders and textures.
  • scripts/: Helper scripts for asset processing.
  • libs/: Local dependencies (zig-math, zig-noise, stb).

🛠️ Texture Pipeline

Temporary Asset Notice

Some textures in assets/textures/default/ are temporary development placeholders imported from external Minecraft-compatible resource packs, including Classic Faithful 64x Jappa, while the engine art pipeline is being built out. They are included only to make local development and visual iteration easier, and should be replaced with original or clearly licensed project assets before any public release or redistribution.

ZigCraft does not claim ownership of third-party placeholder textures. Keep attribution and licensing requirements with any external resource pack assets you use.

The engine supports HD texture packs with full PBR maps. To standardize high-resolution source imagery (4k JPEGs, EXRs) into engine-ready 512px PNGs, use the provided helper script:

# Standardize an entire pack
./scripts/process_textures.sh assets/textures/pbr-test 512

The script automatically handles resizing and naming conventions for _diff, _nor_gl, _rough, and _disp maps.

🤝 Contributing

This is primarily a solo, AI-assisted project. Contributions are welcome but the scope and direction are tightly focused. See CONTRIBUTING.md for the full development workflow.

Quick Start for Contributors

# Clone and setup
git clone https://github.com/OpenStaticFish/ZigCraft.git
cd ZigCraft
./scripts/setup-hooks.sh
# Enter dev environment and run tests
devenv shell zig build test

Branch Workflow

main (production)
└─ dev (staging)
├─ feature/* # New features
├─ bug/* # Non-critical fixes
├─ hotfix/* # Critical fixes
└─ ci/* # CI/workflow changes

All PRs target the dev branch. Use our PR templates (feature.md, bug.md, hotfix.md, ci.md) for best practices.

🔧 Troubleshooting

devenv Build Failures

# Clean build artifacts
rm -rf zig-out/ .zig-cache/
# Refresh devenv inputs (updates the pinned nixpkgs)
devenv update

Vulkan Driver Issues

  • Linux: Ensure vulkan-loader and GPU drivers are installed
  • NVIDIA: Proprietary drivers recommended for best performance
  • Verify: Run vulkaninfo to check Vulkan support

Shader Validation Errors

Shaders are validated during zig build test. If glslang fails:

# Install glslang via devenv
devenv shell # glslang is included in the dev shell

Performance Issues

  • Try zig build run -Doptimize=ReleaseFast for optimized builds
  • Reduce render distance in-game: Press Esc → Graphics → Render Distance
  • Disable VSync if FPS is capped at 60

🌟 Community

DiscussionsGitHub Discussions
IssuesGitHub Issues
SecuritySecurity Policy
LicenseMIT License

⚖️ License

MIT License - see LICENSE for details.

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

893 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

 /$$$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$$ /$$$$$$ /$$$$$$$$ /$$$$$$$$
|_____ $$ |_ $$_/ /$$__ $$ /$$__ $$| $$__ $$ /$$__ $$| $$_____/|__ $$__/
/$$/ | $$ | $$ \__/| $$ \__/| $$ \ $$| $$ \ $$| $$ | $$ /$$/ | $$ | $$ /$$$$| $$ | $$$$$$$/| $$$$$$$$| $$$$$ | $$ /$$/ | $$ | $$|_ $$| $$ | $$__ $$| $$__ $$| $$__/ | $$ /$$/ | $$ | $$ \ $$| $$ $$| $$ \ $$| $$ | $$| $$ | $$ /$$$$$$$$ /$$$$$$| $$$$$$/| $$$$$$/| $$ | $$| $$ | $$| $$ | $$ |________/|______/ \______/ \______/ |__/ |__/|__/ |__/|__/ |__/ 
ZigCraft distant voxel landscape with LOD terrain and forests

⚡ ZigCraft ⚡

ZigLicenseBuild Status

A high-performance Minecraft-style voxel engine built with Zig, SDL3, and a modern Vulkan graphics pipeline.


🚀 Overview

ZigCraft is a technical exploration of high-performance voxel rendering techniques, developed primarily as an AI-assisted solo project. It features a custom-built graphics abstraction layer, advanced terrain generation, and a multithreaded job system to handle massive world streaming with zero hitching.

✨ Key Features

🎨 Rendering Architecture

  • Vulkan RHI: Modern, explicit graphics API with persistent UBO mapping for high performance.
  • PBR Rendering: Physically Based Rendering with Cook-Torrance BRDF for realistic materials.
  • Cascaded Shadow Maps (CSM): 3 cascades with configurable PCF sampling (4-16 samples).
  • Atmospheric Scattering: Physically-based day/night cycle with dynamic fog and sky rendering.
  • Advanced Graphics Menu: Real-time control over shadow quality, PBR, resolution scaling, and MSAA.
  • Floating Origin & Reverse-Z: Industry-standard techniques to eliminate precision jitter and Z-fighting at scale.
  • Greedy Meshing: Optimized chunk generation reducing draw call overhead and triangle counts.

🌍 World Generation

  • Biomes & Climate: Multi-noise system based on temperature and humidity (11+ biomes).
  • Infinite Terrain: Seed-based, deterministic generation with domain warping and 3D caves.
  • Level of Detail (LOD): Hierarchical LOD system enabling 100+ chunk render distances using simplified terrain meshes and specialized rendering.
  • Greedy Meshing: Optimized vertex data generation for maximum throughput.

🛠️ Engine Core

  • Multithreaded Pipeline: Dedicated worker pools for generation (4 threads) and meshing (3 threads).
  • Job Prioritization: Proximity-based task scheduling ensures immediate loading of local chunks.
  • Comprehensive Testing: Unit tests covering math, worldgen, and core engine modules.
  • Refined App Lifecycle: Modular architecture with extracted systems for rendering, input, and world management.

📊 Performance

Optimized for high chunk render distances with greedy meshing, job-based multithreading, and a Vulkan RHI backend. Build with -Doptimize=ReleaseFast for best results.

⌨️ Controls

KeyAction
WASDMovement
Space / ShiftJump / Crouch (Fly Up / Down)
Left CtrlSprint
MouseLook
Left Click / Right ClickMine Block / Place Block
TabToggle Mouse Capture / Menu
IOpen Inventory
1-9Select Hotbar Slot
F / TToggle Wireframe / Textures
VToggle VSync
U / KToggle Shadow Debug / Cycle Cascades
MToggle World Map
NFreeze / Unfreeze Time
F2Toggle FPS Counter
F3Toggle Creative Mode
F5Toggle Block Info
EscMenu / Pause

Note: Time of day can be set via the inventory screen (buttons for DAWN, NOON, DUSK, NIGHT).

🏗️ Build & Run

This project uses devenv (Nix-based) for a reproducible development environment.

🛠️ Development Setup

After cloning or creating a new worktree, run the setup script to enable git hooks:

./scripts/setup-hooks.sh

This configures a pre-push hook that runs:

  • zig fmt --check src/ - formatting check
  • zig build test - full test suite

To bypass in emergencies: git push --no-verify

🎮 Running the Game

  • Run: devenv shell zig build run
  • Release build: devenv shell zig build run -Doptimize=ReleaseFast

Debug Build Flags

  • Smoke test: devenv shell zig build run -Dsmoke-test
  • Headless / no present: devenv shell zig build run -Dskip-present
  • Headless benchmark: devenv shell zig build benchmark -Dbenchmark-preset=low -Dbenchmark-duration=60 -Dbenchmark-output=benchmark-low.json
  • Auto-open a world: devenv shell zig build run -Dauto-world=normal
  • Open on monitor: devenv shell zig build run -Dmonitor-index=1
  • Open on Hyprland monitor: devenv shell zig build run -Dmonitor-name=DP-2
  • Force XWayland monitor placement: devenv shell zig build run -Dmonitor-index=1 -Dwindow-video-driver=x11
  • Background window launch: devenv shell zig build run -Dmonitor-name=DP-2 -Dwindow-video-driver=x11 -Dwindow-no-focus
  • Startup diagnostic: devenv shell zig build run -Dauto-world=normal -Dstartup-diagnostic-seconds=5 -Dskip-present
  • Worldgen climate snapshot JSON: devenv shell zig build worldgen-climate-snapshot -- --seed 42 --origin-x -256 --origin-z -256 --width 128 --depth 128 --step 4 --output zig-out/climate-42.json
  • Worldgen climate heatmap: devenv shell zig build worldgen-climate-snapshot -- --format ppm --field temperature --output zig-out/temperature-42.ppm
  • Chunk-only debug mode: devenv shell zig build run -Dchunk-debug-mode -Dauto-world=normal
  • Shadow/cave lighting capture: ./scripts/capture_shadow_test.sh screenshots/shadow-test.png

-Dchunk-debug-mode strips the overworld down to basic chunks for isolation work:

  • LOD off by default
  • water generation/rendering off by default
  • caves off by default
  • decorations/features off by default

Re-enable individual systems with -Dchunk-debug-enable= using a comma-separated list:

  • lod
  • water
  • watergen
  • waterrender
  • caves
  • decorations

Examples:

# LOD only
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod -Dauto-world=normal
# LOD plus cave generation
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod,caves -Dauto-world=normal
# Headless startup comparison after 5 seconds
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod,water,caves -Dauto-world=normal -Dstartup-diagnostic-seconds=5 -Dskip-present

The shadow/cave lighting capture launches a deterministic low-block test scene, applies a small shadow-focused graphics preset, waits 5 seconds after the target is ready, captures a PNG, and exits. It defaults to a dug-cave variant that matches a player-dug dirt/grass cave mouth. Use ZIGCRAFT_SHADOW_TEST_VARIANT=bend ./scripts/capture_shadow_test.sh screenshots/shadow-bend.png to check the older bend/deep-black regression. Override the wait with ZIGCRAFT_SCREENSHOT_DELAY_SECONDS=8 ./scripts/capture_shadow_test.sh screenshots/shadow-test.png. Screenshot paths are restricted to image extensions from image/png, image/jpeg, image/gif, and image/webp; the built-in encoder currently writes PNG.

🧪 Running Tests

  • All Tests: devenv shell zig build test
  • Single Test: devenv shell zig build test -- --test-filter "Test Name"
  • Single Test Alternative: devenv shell zig build test -Dtest-filter="Test Name"

📂 Project Structure

  • modules/engine-*: Core engine packages (RHI, graphics, math, UI, input, jobs, ECS, audio).
  • modules/world-core: Blocks, chunks, coordinates, lighting, and shared world types.
  • modules/world-worldgen: Procedural terrain, noise, biomes, caves, decorations, and generator registry.
  • modules/world-meshing: Chunk storage, mesh generation, GPU block buffers, and meshing helpers.
  • modules/world-lod: Distant terrain LOD data, scheduling, rendering, and management.
  • modules/world-runtime: World facade, streaming, mutation, rendering, and GPU meshing runtime.
  • modules/world-persistence: Level data, chunk serialization, region files, and save manager.
  • src/game/: Application/gameplay state, screens, player, inventory, and session logic.
  • assets/: GLSL shaders and textures.
  • scripts/: Helper scripts for asset processing.
  • libs/: Local dependencies (zig-math, zig-noise, stb).

🛠️ Texture Pipeline

Temporary Asset Notice

Some textures in assets/textures/default/ are temporary development placeholders imported from external Minecraft-compatible resource packs, including Classic Faithful 64x Jappa, while the engine art pipeline is being built out. They are included only to make local development and visual iteration easier, and should be replaced with original or clearly licensed project assets before any public release or redistribution.

ZigCraft does not claim ownership of third-party placeholder textures. Keep attribution and licensing requirements with any external resource pack assets you use.

The engine supports HD texture packs with full PBR maps. To standardize high-resolution source imagery (4k JPEGs, EXRs) into engine-ready 512px PNGs, use the provided helper script:

# Standardize an entire pack
./scripts/process_textures.sh assets/textures/pbr-test 512

The script automatically handles resizing and naming conventions for _diff, _nor_gl, _rough, and _disp maps.

🤝 Contributing

This is primarily a solo, AI-assisted project. Contributions are welcome but the scope and direction are tightly focused. See CONTRIBUTING.md for the full development workflow.

Quick Start for Contributors

# Clone and setup
git clone https://github.com/OpenStaticFish/ZigCraft.git
cd ZigCraft
./scripts/setup-hooks.sh
# Enter dev environment and run tests
devenv shell zig build test

Branch Workflow

main (production)
└─ dev (staging)
├─ feature/* # New features
├─ bug/* # Non-critical fixes
├─ hotfix/* # Critical fixes
└─ ci/* # CI/workflow changes

All PRs target the dev branch. Use our PR templates (feature.md, bug.md, hotfix.md, ci.md) for best practices.

🔧 Troubleshooting

devenv Build Failures

# Clean build artifacts
rm -rf zig-out/ .zig-cache/
# Refresh devenv inputs (updates the pinned nixpkgs)
devenv update

Vulkan Driver Issues

  • Linux: Ensure vulkan-loader and GPU drivers are installed
  • NVIDIA: Proprietary drivers recommended for best performance
  • Verify: Run vulkaninfo to check Vulkan support

Shader Validation Errors

Shaders are validated during zig build test. If glslang fails:

# Install glslang via devenv
devenv shell # glslang is included in the dev shell

Performance Issues

  • Try zig build run -Doptimize=ReleaseFast for optimized builds
  • Reduce render distance in-game: Press Esc → Graphics → Render Distance
  • Disable VSync if FPS is capped at 60

🌟 Community

DiscussionsGitHub Discussions
IssuesGitHub Issues
SecuritySecurity Policy
LicenseMIT License

⚖️ License

MIT License - see LICENSE for details.

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

893 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

 /$$$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$$ /$$$$$$ /$$$$$$$$ /$$$$$$$$
|_____ $$ |_ $$_/ /$$__ $$ /$$__ $$| $$__ $$ /$$__ $$| $$_____/|__ $$__/
/$$/ | $$ | $$ \__/| $$ \__/| $$ \ $$| $$ \ $$| $$ | $$ /$$/ | $$ | $$ /$$$$| $$ | $$$$$$$/| $$$$$$$$| $$$$$ | $$ /$$/ | $$ | $$|_ $$| $$ | $$__ $$| $$__ $$| $$__/ | $$ /$$/ | $$ | $$ \ $$| $$ $$| $$ \ $$| $$ | $$| $$ | $$ /$$$$$$$$ /$$$$$$| $$$$$$/| $$$$$$/| $$ | $$| $$ | $$| $$ | $$ |________/|______/ \______/ \______/ |__/ |__/|__/ |__/|__/ |__/ 
ZigCraft distant voxel landscape with LOD terrain and forests

⚡ ZigCraft ⚡

ZigLicenseBuild Status

A high-performance Minecraft-style voxel engine built with Zig, SDL3, and a modern Vulkan graphics pipeline.


🚀 Overview

ZigCraft is a technical exploration of high-performance voxel rendering techniques, developed primarily as an AI-assisted solo project. It features a custom-built graphics abstraction layer, advanced terrain generation, and a multithreaded job system to handle massive world streaming with zero hitching.

✨ Key Features

🎨 Rendering Architecture

  • Vulkan RHI: Modern, explicit graphics API with persistent UBO mapping for high performance.
  • PBR Rendering: Physically Based Rendering with Cook-Torrance BRDF for realistic materials.
  • Cascaded Shadow Maps (CSM): 3 cascades with configurable PCF sampling (4-16 samples).
  • Atmospheric Scattering: Physically-based day/night cycle with dynamic fog and sky rendering.
  • Advanced Graphics Menu: Real-time control over shadow quality, PBR, resolution scaling, and MSAA.
  • Floating Origin & Reverse-Z: Industry-standard techniques to eliminate precision jitter and Z-fighting at scale.
  • Greedy Meshing: Optimized chunk generation reducing draw call overhead and triangle counts.

🌍 World Generation

  • Biomes & Climate: Multi-noise system based on temperature and humidity (11+ biomes).
  • Infinite Terrain: Seed-based, deterministic generation with domain warping and 3D caves.
  • Level of Detail (LOD): Hierarchical LOD system enabling 100+ chunk render distances using simplified terrain meshes and specialized rendering.
  • Greedy Meshing: Optimized vertex data generation for maximum throughput.

🛠️ Engine Core

  • Multithreaded Pipeline: Dedicated worker pools for generation (4 threads) and meshing (3 threads).
  • Job Prioritization: Proximity-based task scheduling ensures immediate loading of local chunks.
  • Comprehensive Testing: Unit tests covering math, worldgen, and core engine modules.
  • Refined App Lifecycle: Modular architecture with extracted systems for rendering, input, and world management.

📊 Performance

Optimized for high chunk render distances with greedy meshing, job-based multithreading, and a Vulkan RHI backend. Build with -Doptimize=ReleaseFast for best results.

⌨️ Controls

KeyAction
WASDMovement
Space / ShiftJump / Crouch (Fly Up / Down)
Left CtrlSprint
MouseLook
Left Click / Right ClickMine Block / Place Block
TabToggle Mouse Capture / Menu
IOpen Inventory
1-9Select Hotbar Slot
F / TToggle Wireframe / Textures
VToggle VSync
U / KToggle Shadow Debug / Cycle Cascades
MToggle World Map
NFreeze / Unfreeze Time
F2Toggle FPS Counter
F3Toggle Creative Mode
F5Toggle Block Info
EscMenu / Pause

Note: Time of day can be set via the inventory screen (buttons for DAWN, NOON, DUSK, NIGHT).

🏗️ Build & Run

This project uses devenv (Nix-based) for a reproducible development environment.

🛠️ Development Setup

After cloning or creating a new worktree, run the setup script to enable git hooks:

./scripts/setup-hooks.sh

This configures a pre-push hook that runs:

  • zig fmt --check src/ - formatting check
  • zig build test - full test suite

To bypass in emergencies: git push --no-verify

🎮 Running the Game

  • Run: devenv shell zig build run
  • Release build: devenv shell zig build run -Doptimize=ReleaseFast

Debug Build Flags

  • Smoke test: devenv shell zig build run -Dsmoke-test
  • Headless / no present: devenv shell zig build run -Dskip-present
  • Headless benchmark: devenv shell zig build benchmark -Dbenchmark-preset=low -Dbenchmark-duration=60 -Dbenchmark-output=benchmark-low.json
  • Auto-open a world: devenv shell zig build run -Dauto-world=normal
  • Open on monitor: devenv shell zig build run -Dmonitor-index=1
  • Open on Hyprland monitor: devenv shell zig build run -Dmonitor-name=DP-2
  • Force XWayland monitor placement: devenv shell zig build run -Dmonitor-index=1 -Dwindow-video-driver=x11
  • Background window launch: devenv shell zig build run -Dmonitor-name=DP-2 -Dwindow-video-driver=x11 -Dwindow-no-focus
  • Startup diagnostic: devenv shell zig build run -Dauto-world=normal -Dstartup-diagnostic-seconds=5 -Dskip-present
  • Worldgen climate snapshot JSON: devenv shell zig build worldgen-climate-snapshot -- --seed 42 --origin-x -256 --origin-z -256 --width 128 --depth 128 --step 4 --output zig-out/climate-42.json
  • Worldgen climate heatmap: devenv shell zig build worldgen-climate-snapshot -- --format ppm --field temperature --output zig-out/temperature-42.ppm
  • Chunk-only debug mode: devenv shell zig build run -Dchunk-debug-mode -Dauto-world=normal
  • Shadow/cave lighting capture: ./scripts/capture_shadow_test.sh screenshots/shadow-test.png

-Dchunk-debug-mode strips the overworld down to basic chunks for isolation work:

  • LOD off by default
  • water generation/rendering off by default
  • caves off by default
  • decorations/features off by default

Re-enable individual systems with -Dchunk-debug-enable= using a comma-separated list:

  • lod
  • water
  • watergen
  • waterrender
  • caves
  • decorations

Examples:

# LOD only
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod -Dauto-world=normal
# LOD plus cave generation
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod,caves -Dauto-world=normal
# Headless startup comparison after 5 seconds
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod,water,caves -Dauto-world=normal -Dstartup-diagnostic-seconds=5 -Dskip-present

The shadow/cave lighting capture launches a deterministic low-block test scene, applies a small shadow-focused graphics preset, waits 5 seconds after the target is ready, captures a PNG, and exits. It defaults to a dug-cave variant that matches a player-dug dirt/grass cave mouth. Use ZIGCRAFT_SHADOW_TEST_VARIANT=bend ./scripts/capture_shadow_test.sh screenshots/shadow-bend.png to check the older bend/deep-black regression. Override the wait with ZIGCRAFT_SCREENSHOT_DELAY_SECONDS=8 ./scripts/capture_shadow_test.sh screenshots/shadow-test.png. Screenshot paths are restricted to image extensions from image/png, image/jpeg, image/gif, and image/webp; the built-in encoder currently writes PNG.

🧪 Running Tests

  • All Tests: devenv shell zig build test
  • Single Test: devenv shell zig build test -- --test-filter "Test Name"
  • Single Test Alternative: devenv shell zig build test -Dtest-filter="Test Name"

📂 Project Structure

  • modules/engine-*: Core engine packages (RHI, graphics, math, UI, input, jobs, ECS, audio).
  • modules/world-core: Blocks, chunks, coordinates, lighting, and shared world types.
  • modules/world-worldgen: Procedural terrain, noise, biomes, caves, decorations, and generator registry.
  • modules/world-meshing: Chunk storage, mesh generation, GPU block buffers, and meshing helpers.
  • modules/world-lod: Distant terrain LOD data, scheduling, rendering, and management.
  • modules/world-runtime: World facade, streaming, mutation, rendering, and GPU meshing runtime.
  • modules/world-persistence: Level data, chunk serialization, region files, and save manager.
  • src/game/: Application/gameplay state, screens, player, inventory, and session logic.
  • assets/: GLSL shaders and textures.
  • scripts/: Helper scripts for asset processing.
  • libs/: Local dependencies (zig-math, zig-noise, stb).

🛠️ Texture Pipeline

Temporary Asset Notice

Some textures in assets/textures/default/ are temporary development placeholders imported from external Minecraft-compatible resource packs, including Classic Faithful 64x Jappa, while the engine art pipeline is being built out. They are included only to make local development and visual iteration easier, and should be replaced with original or clearly licensed project assets before any public release or redistribution.

ZigCraft does not claim ownership of third-party placeholder textures. Keep attribution and licensing requirements with any external resource pack assets you use.

The engine supports HD texture packs with full PBR maps. To standardize high-resolution source imagery (4k JPEGs, EXRs) into engine-ready 512px PNGs, use the provided helper script:

# Standardize an entire pack
./scripts/process_textures.sh assets/textures/pbr-test 512

The script automatically handles resizing and naming conventions for _diff, _nor_gl, _rough, and _disp maps.

🤝 Contributing

This is primarily a solo, AI-assisted project. Contributions are welcome but the scope and direction are tightly focused. See CONTRIBUTING.md for the full development workflow.

Quick Start for Contributors

# Clone and setup
git clone https://github.com/OpenStaticFish/ZigCraft.git
cd ZigCraft
./scripts/setup-hooks.sh
# Enter dev environment and run tests
devenv shell zig build test

Branch Workflow

main (production)
└─ dev (staging)
├─ feature/* # New features
├─ bug/* # Non-critical fixes
├─ hotfix/* # Critical fixes
└─ ci/* # CI/workflow changes

All PRs target the dev branch. Use our PR templates (feature.md, bug.md, hotfix.md, ci.md) for best practices.

🔧 Troubleshooting

devenv Build Failures

# Clean build artifacts
rm -rf zig-out/ .zig-cache/
# Refresh devenv inputs (updates the pinned nixpkgs)
devenv update

Vulkan Driver Issues

  • Linux: Ensure vulkan-loader and GPU drivers are installed
  • NVIDIA: Proprietary drivers recommended for best performance
  • Verify: Run vulkaninfo to check Vulkan support

Shader Validation Errors

Shaders are validated during zig build test. If glslang fails:

# Install glslang via devenv
devenv shell # glslang is included in the dev shell

Performance Issues

  • Try zig build run -Doptimize=ReleaseFast for optimized builds
  • Reduce render distance in-game: Press Esc → Graphics → Render Distance
  • Disable VSync if FPS is capped at 60

🌟 Community

DiscussionsGitHub Discussions
IssuesGitHub Issues
SecuritySecurity Policy
LicenseMIT License

⚖️ License

MIT License - see LICENSE for details.

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

893 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

 /$$$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$$ /$$$$$$ /$$$$$$$$ /$$$$$$$$
|_____ $$ |_ $$_/ /$$__ $$ /$$__ $$| $$__ $$ /$$__ $$| $$_____/|__ $$__/
/$$/ | $$ | $$ \__/| $$ \__/| $$ \ $$| $$ \ $$| $$ | $$ /$$/ | $$ | $$ /$$$$| $$ | $$$$$$$/| $$$$$$$$| $$$$$ | $$ /$$/ | $$ | $$|_ $$| $$ | $$__ $$| $$__ $$| $$__/ | $$ /$$/ | $$ | $$ \ $$| $$ $$| $$ \ $$| $$ | $$| $$ | $$ /$$$$$$$$ /$$$$$$| $$$$$$/| $$$$$$/| $$ | $$| $$ | $$| $$ | $$ |________/|______/ \______/ \______/ |__/ |__/|__/ |__/|__/ |__/ 
ZigCraft distant voxel landscape with LOD terrain and forests

⚡ ZigCraft ⚡

ZigLicenseBuild Status

A high-performance Minecraft-style voxel engine built with Zig, SDL3, and a modern Vulkan graphics pipeline.


🚀 Overview

ZigCraft is a technical exploration of high-performance voxel rendering techniques, developed primarily as an AI-assisted solo project. It features a custom-built graphics abstraction layer, advanced terrain generation, and a multithreaded job system to handle massive world streaming with zero hitching.

✨ Key Features

🎨 Rendering Architecture

  • Vulkan RHI: Modern, explicit graphics API with persistent UBO mapping for high performance.
  • PBR Rendering: Physically Based Rendering with Cook-Torrance BRDF for realistic materials.
  • Cascaded Shadow Maps (CSM): 3 cascades with configurable PCF sampling (4-16 samples).
  • Atmospheric Scattering: Physically-based day/night cycle with dynamic fog and sky rendering.
  • Advanced Graphics Menu: Real-time control over shadow quality, PBR, resolution scaling, and MSAA.
  • Floating Origin & Reverse-Z: Industry-standard techniques to eliminate precision jitter and Z-fighting at scale.
  • Greedy Meshing: Optimized chunk generation reducing draw call overhead and triangle counts.

🌍 World Generation

  • Biomes & Climate: Multi-noise system based on temperature and humidity (11+ biomes).
  • Infinite Terrain: Seed-based, deterministic generation with domain warping and 3D caves.
  • Level of Detail (LOD): Hierarchical LOD system enabling 100+ chunk render distances using simplified terrain meshes and specialized rendering.
  • Greedy Meshing: Optimized vertex data generation for maximum throughput.

🛠️ Engine Core

  • Multithreaded Pipeline: Dedicated worker pools for generation (4 threads) and meshing (3 threads).
  • Job Prioritization: Proximity-based task scheduling ensures immediate loading of local chunks.
  • Comprehensive Testing: Unit tests covering math, worldgen, and core engine modules.
  • Refined App Lifecycle: Modular architecture with extracted systems for rendering, input, and world management.

📊 Performance

Optimized for high chunk render distances with greedy meshing, job-based multithreading, and a Vulkan RHI backend. Build with -Doptimize=ReleaseFast for best results.

⌨️ Controls

KeyAction
WASDMovement
Space / ShiftJump / Crouch (Fly Up / Down)
Left CtrlSprint
MouseLook
Left Click / Right ClickMine Block / Place Block
TabToggle Mouse Capture / Menu
IOpen Inventory
1-9Select Hotbar Slot
F / TToggle Wireframe / Textures
VToggle VSync
U / KToggle Shadow Debug / Cycle Cascades
MToggle World Map
NFreeze / Unfreeze Time
F2Toggle FPS Counter
F3Toggle Creative Mode
F5Toggle Block Info
EscMenu / Pause

Note: Time of day can be set via the inventory screen (buttons for DAWN, NOON, DUSK, NIGHT).

🏗️ Build & Run

This project uses devenv (Nix-based) for a reproducible development environment.

🛠️ Development Setup

After cloning or creating a new worktree, run the setup script to enable git hooks:

./scripts/setup-hooks.sh

This configures a pre-push hook that runs:

  • zig fmt --check src/ - formatting check
  • zig build test - full test suite

To bypass in emergencies: git push --no-verify

🎮 Running the Game

  • Run: devenv shell zig build run
  • Release build: devenv shell zig build run -Doptimize=ReleaseFast

Debug Build Flags

  • Smoke test: devenv shell zig build run -Dsmoke-test
  • Headless / no present: devenv shell zig build run -Dskip-present
  • Headless benchmark: devenv shell zig build benchmark -Dbenchmark-preset=low -Dbenchmark-duration=60 -Dbenchmark-output=benchmark-low.json
  • Auto-open a world: devenv shell zig build run -Dauto-world=normal
  • Open on monitor: devenv shell zig build run -Dmonitor-index=1
  • Open on Hyprland monitor: devenv shell zig build run -Dmonitor-name=DP-2
  • Force XWayland monitor placement: devenv shell zig build run -Dmonitor-index=1 -Dwindow-video-driver=x11
  • Background window launch: devenv shell zig build run -Dmonitor-name=DP-2 -Dwindow-video-driver=x11 -Dwindow-no-focus
  • Startup diagnostic: devenv shell zig build run -Dauto-world=normal -Dstartup-diagnostic-seconds=5 -Dskip-present
  • Worldgen climate snapshot JSON: devenv shell zig build worldgen-climate-snapshot -- --seed 42 --origin-x -256 --origin-z -256 --width 128 --depth 128 --step 4 --output zig-out/climate-42.json
  • Worldgen climate heatmap: devenv shell zig build worldgen-climate-snapshot -- --format ppm --field temperature --output zig-out/temperature-42.ppm
  • Chunk-only debug mode: devenv shell zig build run -Dchunk-debug-mode -Dauto-world=normal
  • Shadow/cave lighting capture: ./scripts/capture_shadow_test.sh screenshots/shadow-test.png

-Dchunk-debug-mode strips the overworld down to basic chunks for isolation work:

  • LOD off by default
  • water generation/rendering off by default
  • caves off by default
  • decorations/features off by default

Re-enable individual systems with -Dchunk-debug-enable= using a comma-separated list:

  • lod
  • water
  • watergen
  • waterrender
  • caves
  • decorations

Examples:

# LOD only
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod -Dauto-world=normal
# LOD plus cave generation
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod,caves -Dauto-world=normal
# Headless startup comparison after 5 seconds
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod,water,caves -Dauto-world=normal -Dstartup-diagnostic-seconds=5 -Dskip-present

The shadow/cave lighting capture launches a deterministic low-block test scene, applies a small shadow-focused graphics preset, waits 5 seconds after the target is ready, captures a PNG, and exits. It defaults to a dug-cave variant that matches a player-dug dirt/grass cave mouth. Use ZIGCRAFT_SHADOW_TEST_VARIANT=bend ./scripts/capture_shadow_test.sh screenshots/shadow-bend.png to check the older bend/deep-black regression. Override the wait with ZIGCRAFT_SCREENSHOT_DELAY_SECONDS=8 ./scripts/capture_shadow_test.sh screenshots/shadow-test.png. Screenshot paths are restricted to image extensions from image/png, image/jpeg, image/gif, and image/webp; the built-in encoder currently writes PNG.

🧪 Running Tests

  • All Tests: devenv shell zig build test
  • Single Test: devenv shell zig build test -- --test-filter "Test Name"
  • Single Test Alternative: devenv shell zig build test -Dtest-filter="Test Name"

📂 Project Structure

  • modules/engine-*: Core engine packages (RHI, graphics, math, UI, input, jobs, ECS, audio).
  • modules/world-core: Blocks, chunks, coordinates, lighting, and shared world types.
  • modules/world-worldgen: Procedural terrain, noise, biomes, caves, decorations, and generator registry.
  • modules/world-meshing: Chunk storage, mesh generation, GPU block buffers, and meshing helpers.
  • modules/world-lod: Distant terrain LOD data, scheduling, rendering, and management.
  • modules/world-runtime: World facade, streaming, mutation, rendering, and GPU meshing runtime.
  • modules/world-persistence: Level data, chunk serialization, region files, and save manager.
  • src/game/: Application/gameplay state, screens, player, inventory, and session logic.
  • assets/: GLSL shaders and textures.
  • scripts/: Helper scripts for asset processing.
  • libs/: Local dependencies (zig-math, zig-noise, stb).

🛠️ Texture Pipeline

Temporary Asset Notice

Some textures in assets/textures/default/ are temporary development placeholders imported from external Minecraft-compatible resource packs, including Classic Faithful 64x Jappa, while the engine art pipeline is being built out. They are included only to make local development and visual iteration easier, and should be replaced with original or clearly licensed project assets before any public release or redistribution.

ZigCraft does not claim ownership of third-party placeholder textures. Keep attribution and licensing requirements with any external resource pack assets you use.

The engine supports HD texture packs with full PBR maps. To standardize high-resolution source imagery (4k JPEGs, EXRs) into engine-ready 512px PNGs, use the provided helper script:

# Standardize an entire pack
./scripts/process_textures.sh assets/textures/pbr-test 512

The script automatically handles resizing and naming conventions for _diff, _nor_gl, _rough, and _disp maps.

🤝 Contributing

This is primarily a solo, AI-assisted project. Contributions are welcome but the scope and direction are tightly focused. See CONTRIBUTING.md for the full development workflow.

Quick Start for Contributors

# Clone and setup
git clone https://github.com/OpenStaticFish/ZigCraft.git
cd ZigCraft
./scripts/setup-hooks.sh
# Enter dev environment and run tests
devenv shell zig build test

Branch Workflow

main (production)
└─ dev (staging)
├─ feature/* # New features
├─ bug/* # Non-critical fixes
├─ hotfix/* # Critical fixes
└─ ci/* # CI/workflow changes

All PRs target the dev branch. Use our PR templates (feature.md, bug.md, hotfix.md, ci.md) for best practices.

🔧 Troubleshooting

devenv Build Failures

# Clean build artifacts
rm -rf zig-out/ .zig-cache/
# Refresh devenv inputs (updates the pinned nixpkgs)
devenv update

Vulkan Driver Issues

  • Linux: Ensure vulkan-loader and GPU drivers are installed
  • NVIDIA: Proprietary drivers recommended for best performance
  • Verify: Run vulkaninfo to check Vulkan support

Shader Validation Errors

Shaders are validated during zig build test. If glslang fails:

# Install glslang via devenv
devenv shell # glslang is included in the dev shell

Performance Issues

  • Try zig build run -Doptimize=ReleaseFast for optimized builds
  • Reduce render distance in-game: Press Esc → Graphics → Render Distance
  • Disable VSync if FPS is capped at 60

🌟 Community

DiscussionsGitHub Discussions
IssuesGitHub Issues
SecuritySecurity Policy
LicenseMIT License

⚖️ License

MIT License - see LICENSE for details.

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

893 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

 /$$$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$$ /$$$$$$ /$$$$$$$$ /$$$$$$$$
|_____ $$ |_ $$_/ /$$__ $$ /$$__ $$| $$__ $$ /$$__ $$| $$_____/|__ $$__/
/$$/ | $$ | $$ \__/| $$ \__/| $$ \ $$| $$ \ $$| $$ | $$ /$$/ | $$ | $$ /$$$$| $$ | $$$$$$$/| $$$$$$$$| $$$$$ | $$ /$$/ | $$ | $$|_ $$| $$ | $$__ $$| $$__ $$| $$__/ | $$ /$$/ | $$ | $$ \ $$| $$ $$| $$ \ $$| $$ | $$| $$ | $$ /$$$$$$$$ /$$$$$$| $$$$$$/| $$$$$$/| $$ | $$| $$ | $$| $$ | $$ |________/|______/ \______/ \______/ |__/ |__/|__/ |__/|__/ |__/ 
ZigCraft distant voxel landscape with LOD terrain and forests

⚡ ZigCraft ⚡

ZigLicenseBuild Status

A high-performance Minecraft-style voxel engine built with Zig, SDL3, and a modern Vulkan graphics pipeline.


🚀 Overview

ZigCraft is a technical exploration of high-performance voxel rendering techniques, developed primarily as an AI-assisted solo project. It features a custom-built graphics abstraction layer, advanced terrain generation, and a multithreaded job system to handle massive world streaming with zero hitching.

✨ Key Features

🎨 Rendering Architecture

  • Vulkan RHI: Modern, explicit graphics API with persistent UBO mapping for high performance.
  • PBR Rendering: Physically Based Rendering with Cook-Torrance BRDF for realistic materials.
  • Cascaded Shadow Maps (CSM): 3 cascades with configurable PCF sampling (4-16 samples).
  • Atmospheric Scattering: Physically-based day/night cycle with dynamic fog and sky rendering.
  • Advanced Graphics Menu: Real-time control over shadow quality, PBR, resolution scaling, and MSAA.
  • Floating Origin & Reverse-Z: Industry-standard techniques to eliminate precision jitter and Z-fighting at scale.
  • Greedy Meshing: Optimized chunk generation reducing draw call overhead and triangle counts.

🌍 World Generation

  • Biomes & Climate: Multi-noise system based on temperature and humidity (11+ biomes).
  • Infinite Terrain: Seed-based, deterministic generation with domain warping and 3D caves.
  • Level of Detail (LOD): Hierarchical LOD system enabling 100+ chunk render distances using simplified terrain meshes and specialized rendering.
  • Greedy Meshing: Optimized vertex data generation for maximum throughput.

🛠️ Engine Core

  • Multithreaded Pipeline: Dedicated worker pools for generation (4 threads) and meshing (3 threads).
  • Job Prioritization: Proximity-based task scheduling ensures immediate loading of local chunks.
  • Comprehensive Testing: Unit tests covering math, worldgen, and core engine modules.
  • Refined App Lifecycle: Modular architecture with extracted systems for rendering, input, and world management.

📊 Performance

Optimized for high chunk render distances with greedy meshing, job-based multithreading, and a Vulkan RHI backend. Build with -Doptimize=ReleaseFast for best results.

⌨️ Controls

KeyAction
WASDMovement
Space / ShiftJump / Crouch (Fly Up / Down)
Left CtrlSprint
MouseLook
Left Click / Right ClickMine Block / Place Block
TabToggle Mouse Capture / Menu
IOpen Inventory
1-9Select Hotbar Slot
F / TToggle Wireframe / Textures
VToggle VSync
U / KToggle Shadow Debug / Cycle Cascades
MToggle World Map
NFreeze / Unfreeze Time
F2Toggle FPS Counter
F3Toggle Creative Mode
F5Toggle Block Info
EscMenu / Pause

Note: Time of day can be set via the inventory screen (buttons for DAWN, NOON, DUSK, NIGHT).

🏗️ Build & Run

This project uses devenv (Nix-based) for a reproducible development environment.

🛠️ Development Setup

After cloning or creating a new worktree, run the setup script to enable git hooks:

./scripts/setup-hooks.sh

This configures a pre-push hook that runs:

  • zig fmt --check src/ - formatting check
  • zig build test - full test suite

To bypass in emergencies: git push --no-verify

🎮 Running the Game

  • Run: devenv shell zig build run
  • Release build: devenv shell zig build run -Doptimize=ReleaseFast

Debug Build Flags

  • Smoke test: devenv shell zig build run -Dsmoke-test
  • Headless / no present: devenv shell zig build run -Dskip-present
  • Headless benchmark: devenv shell zig build benchmark -Dbenchmark-preset=low -Dbenchmark-duration=60 -Dbenchmark-output=benchmark-low.json
  • Auto-open a world: devenv shell zig build run -Dauto-world=normal
  • Open on monitor: devenv shell zig build run -Dmonitor-index=1
  • Open on Hyprland monitor: devenv shell zig build run -Dmonitor-name=DP-2
  • Force XWayland monitor placement: devenv shell zig build run -Dmonitor-index=1 -Dwindow-video-driver=x11
  • Background window launch: devenv shell zig build run -Dmonitor-name=DP-2 -Dwindow-video-driver=x11 -Dwindow-no-focus
  • Startup diagnostic: devenv shell zig build run -Dauto-world=normal -Dstartup-diagnostic-seconds=5 -Dskip-present
  • Worldgen climate snapshot JSON: devenv shell zig build worldgen-climate-snapshot -- --seed 42 --origin-x -256 --origin-z -256 --width 128 --depth 128 --step 4 --output zig-out/climate-42.json
  • Worldgen climate heatmap: devenv shell zig build worldgen-climate-snapshot -- --format ppm --field temperature --output zig-out/temperature-42.ppm
  • Chunk-only debug mode: devenv shell zig build run -Dchunk-debug-mode -Dauto-world=normal
  • Shadow/cave lighting capture: ./scripts/capture_shadow_test.sh screenshots/shadow-test.png

-Dchunk-debug-mode strips the overworld down to basic chunks for isolation work:

  • LOD off by default
  • water generation/rendering off by default
  • caves off by default
  • decorations/features off by default

Re-enable individual systems with -Dchunk-debug-enable= using a comma-separated list:

  • lod
  • water
  • watergen
  • waterrender
  • caves
  • decorations

Examples:

# LOD only
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod -Dauto-world=normal
# LOD plus cave generation
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod,caves -Dauto-world=normal
# Headless startup comparison after 5 seconds
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod,water,caves -Dauto-world=normal -Dstartup-diagnostic-seconds=5 -Dskip-present

The shadow/cave lighting capture launches a deterministic low-block test scene, applies a small shadow-focused graphics preset, waits 5 seconds after the target is ready, captures a PNG, and exits. It defaults to a dug-cave variant that matches a player-dug dirt/grass cave mouth. Use ZIGCRAFT_SHADOW_TEST_VARIANT=bend ./scripts/capture_shadow_test.sh screenshots/shadow-bend.png to check the older bend/deep-black regression. Override the wait with ZIGCRAFT_SCREENSHOT_DELAY_SECONDS=8 ./scripts/capture_shadow_test.sh screenshots/shadow-test.png. Screenshot paths are restricted to image extensions from image/png, image/jpeg, image/gif, and image/webp; the built-in encoder currently writes PNG.

🧪 Running Tests

  • All Tests: devenv shell zig build test
  • Single Test: devenv shell zig build test -- --test-filter "Test Name"
  • Single Test Alternative: devenv shell zig build test -Dtest-filter="Test Name"

📂 Project Structure

  • modules/engine-*: Core engine packages (RHI, graphics, math, UI, input, jobs, ECS, audio).
  • modules/world-core: Blocks, chunks, coordinates, lighting, and shared world types.
  • modules/world-worldgen: Procedural terrain, noise, biomes, caves, decorations, and generator registry.
  • modules/world-meshing: Chunk storage, mesh generation, GPU block buffers, and meshing helpers.
  • modules/world-lod: Distant terrain LOD data, scheduling, rendering, and management.
  • modules/world-runtime: World facade, streaming, mutation, rendering, and GPU meshing runtime.
  • modules/world-persistence: Level data, chunk serialization, region files, and save manager.
  • src/game/: Application/gameplay state, screens, player, inventory, and session logic.
  • assets/: GLSL shaders and textures.
  • scripts/: Helper scripts for asset processing.
  • libs/: Local dependencies (zig-math, zig-noise, stb).

🛠️ Texture Pipeline

Temporary Asset Notice

Some textures in assets/textures/default/ are temporary development placeholders imported from external Minecraft-compatible resource packs, including Classic Faithful 64x Jappa, while the engine art pipeline is being built out. They are included only to make local development and visual iteration easier, and should be replaced with original or clearly licensed project assets before any public release or redistribution.

ZigCraft does not claim ownership of third-party placeholder textures. Keep attribution and licensing requirements with any external resource pack assets you use.

The engine supports HD texture packs with full PBR maps. To standardize high-resolution source imagery (4k JPEGs, EXRs) into engine-ready 512px PNGs, use the provided helper script:

# Standardize an entire pack
./scripts/process_textures.sh assets/textures/pbr-test 512

The script automatically handles resizing and naming conventions for _diff, _nor_gl, _rough, and _disp maps.

🤝 Contributing

This is primarily a solo, AI-assisted project. Contributions are welcome but the scope and direction are tightly focused. See CONTRIBUTING.md for the full development workflow.

Quick Start for Contributors

# Clone and setup
git clone https://github.com/OpenStaticFish/ZigCraft.git
cd ZigCraft
./scripts/setup-hooks.sh
# Enter dev environment and run tests
devenv shell zig build test

Branch Workflow

main (production)
└─ dev (staging)
├─ feature/* # New features
├─ bug/* # Non-critical fixes
├─ hotfix/* # Critical fixes
└─ ci/* # CI/workflow changes

All PRs target the dev branch. Use our PR templates (feature.md, bug.md, hotfix.md, ci.md) for best practices.

🔧 Troubleshooting

devenv Build Failures

# Clean build artifacts
rm -rf zig-out/ .zig-cache/
# Refresh devenv inputs (updates the pinned nixpkgs)
devenv update

Vulkan Driver Issues

  • Linux: Ensure vulkan-loader and GPU drivers are installed
  • NVIDIA: Proprietary drivers recommended for best performance
  • Verify: Run vulkaninfo to check Vulkan support

Shader Validation Errors

Shaders are validated during zig build test. If glslang fails:

# Install glslang via devenv
devenv shell # glslang is included in the dev shell

Performance Issues

  • Try zig build run -Doptimize=ReleaseFast for optimized builds
  • Reduce render distance in-game: Press Esc → Graphics → Render Distance
  • Disable VSync if FPS is capped at 60

🌟 Community

DiscussionsGitHub Discussions
IssuesGitHub Issues
SecuritySecurity Policy
LicenseMIT License

⚖️ License

MIT License - see LICENSE for details.

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

893 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

 /$$$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$$ /$$$$$$ /$$$$$$$$ /$$$$$$$$
|_____ $$ |_ $$_/ /$$__ $$ /$$__ $$| $$__ $$ /$$__ $$| $$_____/|__ $$__/
/$$/ | $$ | $$ \__/| $$ \__/| $$ \ $$| $$ \ $$| $$ | $$ /$$/ | $$ | $$ /$$$$| $$ | $$$$$$$/| $$$$$$$$| $$$$$ | $$ /$$/ | $$ | $$|_ $$| $$ | $$__ $$| $$__ $$| $$__/ | $$ /$$/ | $$ | $$ \ $$| $$ $$| $$ \ $$| $$ | $$| $$ | $$ /$$$$$$$$ /$$$$$$| $$$$$$/| $$$$$$/| $$ | $$| $$ | $$| $$ | $$ |________/|______/ \______/ \______/ |__/ |__/|__/ |__/|__/ |__/ 
ZigCraft distant voxel landscape with LOD terrain and forests

⚡ ZigCraft ⚡

ZigLicenseBuild Status

A high-performance Minecraft-style voxel engine built with Zig, SDL3, and a modern Vulkan graphics pipeline.


🚀 Overview

ZigCraft is a technical exploration of high-performance voxel rendering techniques, developed primarily as an AI-assisted solo project. It features a custom-built graphics abstraction layer, advanced terrain generation, and a multithreaded job system to handle massive world streaming with zero hitching.

✨ Key Features

🎨 Rendering Architecture

  • Vulkan RHI: Modern, explicit graphics API with persistent UBO mapping for high performance.
  • PBR Rendering: Physically Based Rendering with Cook-Torrance BRDF for realistic materials.
  • Cascaded Shadow Maps (CSM): 3 cascades with configurable PCF sampling (4-16 samples).
  • Atmospheric Scattering: Physically-based day/night cycle with dynamic fog and sky rendering.
  • Advanced Graphics Menu: Real-time control over shadow quality, PBR, resolution scaling, and MSAA.
  • Floating Origin & Reverse-Z: Industry-standard techniques to eliminate precision jitter and Z-fighting at scale.
  • Greedy Meshing: Optimized chunk generation reducing draw call overhead and triangle counts.

🌍 World Generation

  • Biomes & Climate: Multi-noise system based on temperature and humidity (11+ biomes).
  • Infinite Terrain: Seed-based, deterministic generation with domain warping and 3D caves.
  • Level of Detail (LOD): Hierarchical LOD system enabling 100+ chunk render distances using simplified terrain meshes and specialized rendering.
  • Greedy Meshing: Optimized vertex data generation for maximum throughput.

🛠️ Engine Core

  • Multithreaded Pipeline: Dedicated worker pools for generation (4 threads) and meshing (3 threads).
  • Job Prioritization: Proximity-based task scheduling ensures immediate loading of local chunks.
  • Comprehensive Testing: Unit tests covering math, worldgen, and core engine modules.
  • Refined App Lifecycle: Modular architecture with extracted systems for rendering, input, and world management.

📊 Performance

Optimized for high chunk render distances with greedy meshing, job-based multithreading, and a Vulkan RHI backend. Build with -Doptimize=ReleaseFast for best results.

⌨️ Controls

KeyAction
WASDMovement
Space / ShiftJump / Crouch (Fly Up / Down)
Left CtrlSprint
MouseLook
Left Click / Right ClickMine Block / Place Block
TabToggle Mouse Capture / Menu
IOpen Inventory
1-9Select Hotbar Slot
F / TToggle Wireframe / Textures
VToggle VSync
U / KToggle Shadow Debug / Cycle Cascades
MToggle World Map
NFreeze / Unfreeze Time
F2Toggle FPS Counter
F3Toggle Creative Mode
F5Toggle Block Info
EscMenu / Pause

Note: Time of day can be set via the inventory screen (buttons for DAWN, NOON, DUSK, NIGHT).

🏗️ Build & Run

This project uses devenv (Nix-based) for a reproducible development environment.

🛠️ Development Setup

After cloning or creating a new worktree, run the setup script to enable git hooks:

./scripts/setup-hooks.sh

This configures a pre-push hook that runs:

  • zig fmt --check src/ - formatting check
  • zig build test - full test suite

To bypass in emergencies: git push --no-verify

🎮 Running the Game

  • Run: devenv shell zig build run
  • Release build: devenv shell zig build run -Doptimize=ReleaseFast

Debug Build Flags

  • Smoke test: devenv shell zig build run -Dsmoke-test
  • Headless / no present: devenv shell zig build run -Dskip-present
  • Headless benchmark: devenv shell zig build benchmark -Dbenchmark-preset=low -Dbenchmark-duration=60 -Dbenchmark-output=benchmark-low.json
  • Auto-open a world: devenv shell zig build run -Dauto-world=normal
  • Open on monitor: devenv shell zig build run -Dmonitor-index=1
  • Open on Hyprland monitor: devenv shell zig build run -Dmonitor-name=DP-2
  • Force XWayland monitor placement: devenv shell zig build run -Dmonitor-index=1 -Dwindow-video-driver=x11
  • Background window launch: devenv shell zig build run -Dmonitor-name=DP-2 -Dwindow-video-driver=x11 -Dwindow-no-focus
  • Startup diagnostic: devenv shell zig build run -Dauto-world=normal -Dstartup-diagnostic-seconds=5 -Dskip-present
  • Worldgen climate snapshot JSON: devenv shell zig build worldgen-climate-snapshot -- --seed 42 --origin-x -256 --origin-z -256 --width 128 --depth 128 --step 4 --output zig-out/climate-42.json
  • Worldgen climate heatmap: devenv shell zig build worldgen-climate-snapshot -- --format ppm --field temperature --output zig-out/temperature-42.ppm
  • Chunk-only debug mode: devenv shell zig build run -Dchunk-debug-mode -Dauto-world=normal
  • Shadow/cave lighting capture: ./scripts/capture_shadow_test.sh screenshots/shadow-test.png

-Dchunk-debug-mode strips the overworld down to basic chunks for isolation work:

  • LOD off by default
  • water generation/rendering off by default
  • caves off by default
  • decorations/features off by default

Re-enable individual systems with -Dchunk-debug-enable= using a comma-separated list:

  • lod
  • water
  • watergen
  • waterrender
  • caves
  • decorations

Examples:

# LOD only
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod -Dauto-world=normal
# LOD plus cave generation
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod,caves -Dauto-world=normal
# Headless startup comparison after 5 seconds
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod,water,caves -Dauto-world=normal -Dstartup-diagnostic-seconds=5 -Dskip-present

The shadow/cave lighting capture launches a deterministic low-block test scene, applies a small shadow-focused graphics preset, waits 5 seconds after the target is ready, captures a PNG, and exits. It defaults to a dug-cave variant that matches a player-dug dirt/grass cave mouth. Use ZIGCRAFT_SHADOW_TEST_VARIANT=bend ./scripts/capture_shadow_test.sh screenshots/shadow-bend.png to check the older bend/deep-black regression. Override the wait with ZIGCRAFT_SCREENSHOT_DELAY_SECONDS=8 ./scripts/capture_shadow_test.sh screenshots/shadow-test.png. Screenshot paths are restricted to image extensions from image/png, image/jpeg, image/gif, and image/webp; the built-in encoder currently writes PNG.

🧪 Running Tests

  • All Tests: devenv shell zig build test
  • Single Test: devenv shell zig build test -- --test-filter "Test Name"
  • Single Test Alternative: devenv shell zig build test -Dtest-filter="Test Name"

📂 Project Structure

  • modules/engine-*: Core engine packages (RHI, graphics, math, UI, input, jobs, ECS, audio).
  • modules/world-core: Blocks, chunks, coordinates, lighting, and shared world types.
  • modules/world-worldgen: Procedural terrain, noise, biomes, caves, decorations, and generator registry.
  • modules/world-meshing: Chunk storage, mesh generation, GPU block buffers, and meshing helpers.
  • modules/world-lod: Distant terrain LOD data, scheduling, rendering, and management.
  • modules/world-runtime: World facade, streaming, mutation, rendering, and GPU meshing runtime.
  • modules/world-persistence: Level data, chunk serialization, region files, and save manager.
  • src/game/: Application/gameplay state, screens, player, inventory, and session logic.
  • assets/: GLSL shaders and textures.
  • scripts/: Helper scripts for asset processing.
  • libs/: Local dependencies (zig-math, zig-noise, stb).

🛠️ Texture Pipeline

Temporary Asset Notice

Some textures in assets/textures/default/ are temporary development placeholders imported from external Minecraft-compatible resource packs, including Classic Faithful 64x Jappa, while the engine art pipeline is being built out. They are included only to make local development and visual iteration easier, and should be replaced with original or clearly licensed project assets before any public release or redistribution.

ZigCraft does not claim ownership of third-party placeholder textures. Keep attribution and licensing requirements with any external resource pack assets you use.

The engine supports HD texture packs with full PBR maps. To standardize high-resolution source imagery (4k JPEGs, EXRs) into engine-ready 512px PNGs, use the provided helper script:

# Standardize an entire pack
./scripts/process_textures.sh assets/textures/pbr-test 512

The script automatically handles resizing and naming conventions for _diff, _nor_gl, _rough, and _disp maps.

🤝 Contributing

This is primarily a solo, AI-assisted project. Contributions are welcome but the scope and direction are tightly focused. See CONTRIBUTING.md for the full development workflow.

Quick Start for Contributors

# Clone and setup
git clone https://github.com/OpenStaticFish/ZigCraft.git
cd ZigCraft
./scripts/setup-hooks.sh
# Enter dev environment and run tests
devenv shell zig build test

Branch Workflow

main (production)
└─ dev (staging)
├─ feature/* # New features
├─ bug/* # Non-critical fixes
├─ hotfix/* # Critical fixes
└─ ci/* # CI/workflow changes

All PRs target the dev branch. Use our PR templates (feature.md, bug.md, hotfix.md, ci.md) for best practices.

🔧 Troubleshooting

devenv Build Failures

# Clean build artifacts
rm -rf zig-out/ .zig-cache/
# Refresh devenv inputs (updates the pinned nixpkgs)
devenv update

Vulkan Driver Issues

  • Linux: Ensure vulkan-loader and GPU drivers are installed
  • NVIDIA: Proprietary drivers recommended for best performance
  • Verify: Run vulkaninfo to check Vulkan support

Shader Validation Errors

Shaders are validated during zig build test. If glslang fails:

# Install glslang via devenv
devenv shell # glslang is included in the dev shell

Performance Issues

  • Try zig build run -Doptimize=ReleaseFast for optimized builds
  • Reduce render distance in-game: Press Esc → Graphics → Render Distance
  • Disable VSync if FPS is capped at 60

🌟 Community

DiscussionsGitHub Discussions
IssuesGitHub Issues
SecuritySecurity Policy
LicenseMIT License

⚖️ License

MIT License - see LICENSE for details.

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

893 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

 /$$$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$$ /$$$$$$ /$$$$$$$$ /$$$$$$$$
|_____ $$ |_ $$_/ /$$__ $$ /$$__ $$| $$__ $$ /$$__ $$| $$_____/|__ $$__/
/$$/ | $$ | $$ \__/| $$ \__/| $$ \ $$| $$ \ $$| $$ | $$ /$$/ | $$ | $$ /$$$$| $$ | $$$$$$$/| $$$$$$$$| $$$$$ | $$ /$$/ | $$ | $$|_ $$| $$ | $$__ $$| $$__ $$| $$__/ | $$ /$$/ | $$ | $$ \ $$| $$ $$| $$ \ $$| $$ | $$| $$ | $$ /$$$$$$$$ /$$$$$$| $$$$$$/| $$$$$$/| $$ | $$| $$ | $$| $$ | $$ |________/|______/ \______/ \______/ |__/ |__/|__/ |__/|__/ |__/ 
ZigCraft distant voxel landscape with LOD terrain and forests

⚡ ZigCraft ⚡

ZigLicenseBuild Status

A high-performance Minecraft-style voxel engine built with Zig, SDL3, and a modern Vulkan graphics pipeline.


🚀 Overview

ZigCraft is a technical exploration of high-performance voxel rendering techniques, developed primarily as an AI-assisted solo project. It features a custom-built graphics abstraction layer, advanced terrain generation, and a multithreaded job system to handle massive world streaming with zero hitching.

✨ Key Features

🎨 Rendering Architecture

  • Vulkan RHI: Modern, explicit graphics API with persistent UBO mapping for high performance.
  • PBR Rendering: Physically Based Rendering with Cook-Torrance BRDF for realistic materials.
  • Cascaded Shadow Maps (CSM): 3 cascades with configurable PCF sampling (4-16 samples).
  • Atmospheric Scattering: Physically-based day/night cycle with dynamic fog and sky rendering.
  • Advanced Graphics Menu: Real-time control over shadow quality, PBR, resolution scaling, and MSAA.
  • Floating Origin & Reverse-Z: Industry-standard techniques to eliminate precision jitter and Z-fighting at scale.
  • Greedy Meshing: Optimized chunk generation reducing draw call overhead and triangle counts.

🌍 World Generation

  • Biomes & Climate: Multi-noise system based on temperature and humidity (11+ biomes).
  • Infinite Terrain: Seed-based, deterministic generation with domain warping and 3D caves.
  • Level of Detail (LOD): Hierarchical LOD system enabling 100+ chunk render distances using simplified terrain meshes and specialized rendering.
  • Greedy Meshing: Optimized vertex data generation for maximum throughput.

🛠️ Engine Core

  • Multithreaded Pipeline: Dedicated worker pools for generation (4 threads) and meshing (3 threads).
  • Job Prioritization: Proximity-based task scheduling ensures immediate loading of local chunks.
  • Comprehensive Testing: Unit tests covering math, worldgen, and core engine modules.
  • Refined App Lifecycle: Modular architecture with extracted systems for rendering, input, and world management.

📊 Performance

Optimized for high chunk render distances with greedy meshing, job-based multithreading, and a Vulkan RHI backend. Build with -Doptimize=ReleaseFast for best results.

⌨️ Controls

KeyAction
WASDMovement
Space / ShiftJump / Crouch (Fly Up / Down)
Left CtrlSprint
MouseLook
Left Click / Right ClickMine Block / Place Block
TabToggle Mouse Capture / Menu
IOpen Inventory
1-9Select Hotbar Slot
F / TToggle Wireframe / Textures
VToggle VSync
U / KToggle Shadow Debug / Cycle Cascades
MToggle World Map
NFreeze / Unfreeze Time
F2Toggle FPS Counter
F3Toggle Creative Mode
F5Toggle Block Info
EscMenu / Pause

Note: Time of day can be set via the inventory screen (buttons for DAWN, NOON, DUSK, NIGHT).

🏗️ Build & Run

This project uses devenv (Nix-based) for a reproducible development environment.

🛠️ Development Setup

After cloning or creating a new worktree, run the setup script to enable git hooks:

./scripts/setup-hooks.sh

This configures a pre-push hook that runs:

  • zig fmt --check src/ - formatting check
  • zig build test - full test suite

To bypass in emergencies: git push --no-verify

🎮 Running the Game

  • Run: devenv shell zig build run
  • Release build: devenv shell zig build run -Doptimize=ReleaseFast

Debug Build Flags

  • Smoke test: devenv shell zig build run -Dsmoke-test
  • Headless / no present: devenv shell zig build run -Dskip-present
  • Headless benchmark: devenv shell zig build benchmark -Dbenchmark-preset=low -Dbenchmark-duration=60 -Dbenchmark-output=benchmark-low.json
  • Auto-open a world: devenv shell zig build run -Dauto-world=normal
  • Open on monitor: devenv shell zig build run -Dmonitor-index=1
  • Open on Hyprland monitor: devenv shell zig build run -Dmonitor-name=DP-2
  • Force XWayland monitor placement: devenv shell zig build run -Dmonitor-index=1 -Dwindow-video-driver=x11
  • Background window launch: devenv shell zig build run -Dmonitor-name=DP-2 -Dwindow-video-driver=x11 -Dwindow-no-focus
  • Startup diagnostic: devenv shell zig build run -Dauto-world=normal -Dstartup-diagnostic-seconds=5 -Dskip-present
  • Worldgen climate snapshot JSON: devenv shell zig build worldgen-climate-snapshot -- --seed 42 --origin-x -256 --origin-z -256 --width 128 --depth 128 --step 4 --output zig-out/climate-42.json
  • Worldgen climate heatmap: devenv shell zig build worldgen-climate-snapshot -- --format ppm --field temperature --output zig-out/temperature-42.ppm
  • Chunk-only debug mode: devenv shell zig build run -Dchunk-debug-mode -Dauto-world=normal
  • Shadow/cave lighting capture: ./scripts/capture_shadow_test.sh screenshots/shadow-test.png

-Dchunk-debug-mode strips the overworld down to basic chunks for isolation work:

  • LOD off by default
  • water generation/rendering off by default
  • caves off by default
  • decorations/features off by default

Re-enable individual systems with -Dchunk-debug-enable= using a comma-separated list:

  • lod
  • water
  • watergen
  • waterrender
  • caves
  • decorations

Examples:

# LOD only
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod -Dauto-world=normal
# LOD plus cave generation
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod,caves -Dauto-world=normal
# Headless startup comparison after 5 seconds
devenv shell zig build run -Dchunk-debug-mode -Dchunk-debug-enable=lod,water,caves -Dauto-world=normal -Dstartup-diagnostic-seconds=5 -Dskip-present

The shadow/cave lighting capture launches a deterministic low-block test scene, applies a small shadow-focused graphics preset, waits 5 seconds after the target is ready, captures a PNG, and exits. It defaults to a dug-cave variant that matches a player-dug dirt/grass cave mouth. Use ZIGCRAFT_SHADOW_TEST_VARIANT=bend ./scripts/capture_shadow_test.sh screenshots/shadow-bend.png to check the older bend/deep-black regression. Override the wait with ZIGCRAFT_SCREENSHOT_DELAY_SECONDS=8 ./scripts/capture_shadow_test.sh screenshots/shadow-test.png. Screenshot paths are restricted to image extensions from image/png, image/jpeg, image/gif, and image/webp; the built-in encoder currently writes PNG.

🧪 Running Tests

  • All Tests: devenv shell zig build test
  • Single Test: devenv shell zig build test -- --test-filter "Test Name"
  • Single Test Alternative: devenv shell zig build test -Dtest-filter="Test Name"

📂 Project Structure

  • modules/engine-*: Core engine packages (RHI, graphics, math, UI, input, jobs, ECS, audio).
  • modules/world-core: Blocks, chunks, coordinates, lighting, and shared world types.
  • modules/world-worldgen: Procedural terrain, noise, biomes, caves, decorations, and generator registry.
  • modules/world-meshing: Chunk storage, mesh generation, GPU block buffers, and meshing helpers.
  • modules/world-lod: Distant terrain LOD data, scheduling, rendering, and management.
  • modules/world-runtime: World facade, streaming, mutation, rendering, and GPU meshing runtime.
  • modules/world-persistence: Level data, chunk serialization, region files, and save manager.
  • src/game/: Application/gameplay state, screens, player, inventory, and session logic.
  • assets/: GLSL shaders and textures.
  • scripts/: Helper scripts for asset processing.
  • libs/: Local dependencies (zig-math, zig-noise, stb).

🛠️ Texture Pipeline

Temporary Asset Notice

Some textures in assets/textures/default/ are temporary development placeholders imported from external Minecraft-compatible resource packs, including Classic Faithful 64x Jappa, while the engine art pipeline is being built out. They are included only to make local development and visual iteration easier, and should be replaced with original or clearly licensed project assets before any public release or redistribution.

ZigCraft does not claim ownership of third-party placeholder textures. Keep attribution and licensing requirements with any external resource pack assets you use.

The engine supports HD texture packs with full PBR maps. To standardize high-resolution source imagery (4k JPEGs, EXRs) into engine-ready 512px PNGs, use the provided helper script:

# Standardize an entire pack
./scripts/process_textures.sh assets/textures/pbr-test 512

The script automatically handles resizing and naming conventions for _diff, _nor_gl, _rough, and _disp maps.

🤝 Contributing

This is primarily a solo, AI-assisted project. Contributions are welcome but the scope and direction are tightly focused. See CONTRIBUTING.md for the full development workflow.

Quick Start for Contributors

# Clone and setup
git clone https://github.com/OpenStaticFish/ZigCraft.git
cd ZigCraft
./scripts/setup-hooks.sh
# Enter dev environment and run tests
devenv shell zig build test

Branch Workflow

main (production)
└─ dev (staging)
├─ feature/* # New features
├─ bug/* # Non-critical fixes
├─ hotfix/* # Critical fixes
└─ ci/* # CI/workflow changes

All PRs target the dev branch. Use our PR templates (feature.md, bug.md, hotfix.md, ci.md) for best practices.

🔧 Troubleshooting

devenv Build Failures

# Clean build artifacts
rm -rf zig-out/ .zig-cache/
# Refresh devenv inputs (updates the pinned nixpkgs)
devenv update

Vulkan Driver Issues

  • Linux: Ensure vulkan-loader and GPU drivers are installed
  • NVIDIA: Proprietary drivers recommended for best performance
  • Verify: Run vulkaninfo to check Vulkan support

Shader Validation Errors

Shaders are validated during zig build test. If glslang fails:

# Install glslang via devenv
devenv shell # glslang is included in the dev shell

Performance Issues

  • Try zig build run -Doptimize=ReleaseFast for optimized builds
  • Reduce render distance in-game: Press Esc → Graphics → Render Distance
  • Disable VSync if FPS is capped at 60

🌟 Community

DiscussionsGitHub Discussions
IssuesGitHub Issues
SecuritySecurity Policy
LicenseMIT License

⚖️ License

MIT License - see LICENSE for details.

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages