Przejdź do głównej zawartości

Architektura

NV2 Engine to warstwowa aplikacja w Rust: powłoka sterowana zdarzeniami winit, renderer wgpu, proceduralna symulacja świata i stos GUI — plus pomocnicze narzędzia pipeline'u treści w .NET i Pythonie. Ta strona dokumentuje każdą warstwę szczegółowo, moduł po module, na podstawie rzeczywistego kodu.

Mapa źródła (Core/Src, 15 800+ linii)

ModułLinieOdpowiedzialność
main.rs674Powłoka aplikacji, pętla zdarzeń winit, 3 tryby runtime, zapis/wczytanie, menu
renderer/mod.rs2 223Stan renderera, wszystkie pipeline'y, culling, dzień/noc, UI
interaction.rs1 566Raycast DDA, wydobycie, stawianie, bramkowanie narzędziami, zrzuty, warstwa GUI
world/block.rs1 294Rejestr bloków (97 typów), poziomy narzędzi, twardość, ośrodki ruchu
world/biomes.rs9999 definicji biomów, model klimatu, generacja terenu
world/mod.rs961Kontener świata, streaming chunków, zapis/wczytanie, propagacja drzew
crafting.rs899Rejestr przepisów, dopasowanie kształtowe/bezkształtowe, stany NVCrafter
world/vegetation.rs868Drzewa, trawa, rozmieszczanie roślinności AI
renderer/camera.rs645Kamera pierwszoosobowa, ruch, kolizje, latanie, woda
renderer/text.rs631Rasteryzacja fontdue, pomiar tekstu, warstwy
inventory.rs597Inventory 36-slotowe, hotbar, stosy, trwałość
renderer/mesh.rs551Meshowanie chunków stałych i wody
renderer/texture_atlas.rs530Dynamiczny atlas, pakiety tekstur, wyszukiwanie UV
assets.rs519Modele bloków, przepisy JSON, wykrywanie tekstur
world/ai_generator.rs410Sieć neuronowa, przejście wprzód/wstecz, wątek treningu
commands.rs375/locate, /tp z testami
world/liquid.rs286Symulacja wody (solver grawitacja-pierwsza, kodowanie przepływu)
renderer/texture_registry.rs177Normalizacja nazw tekstur, funkcje kafelków
renderer/vertices.rs160Definicje Vertex i PackedVertex (36 B)
settings.rs144AppSettings, profil Low-End-PC, trwałość settings.json
world/generator.rs139Asynchroniczna kolejka generacji chunków
world/chunk.rs131Magazyn chunków 16×512×16, water_meta
world/raycast.rs91Wokselowy raycasting DDA
input.rs84Stan klawiatury/myszy
world/worldgen.rs80Abstrakcja WorldGenWriter
renderer/instance.rs78Pomocnicze funkcje renderowania instancji
world/decorations.rs52Stawianie bloków dekoracyjnych
world/decoration_ai.rs44Dekoracje sterowane AI
renderer/menu.rs148Renderowanie menu głównego/pauzy
renderer/texture.rs28Ładowanie tekstur
world/palette.rs24Pomocnicze funkcje palety bloków
world/online_trainer.rs14Stub opcjonalnego treningu wspomaganego chmurą

Przegląd warstw

┌──────────────────────────────────────────────────────────────┐
│ Powłoka aplikacji (main.rs) │
│ winit::application::ApplicationHandler │
│ Tryby: MainMenu · Playing · PauseMenu │
│ routing wejścia · zapis/wczytanie · komunikaty statusu · komendy │
└──────────────┬───────────────────────┬───────────────────────┘
│ │
┌──────────────▼───────────────┐ ┌────▼───────────────────────┐
│ Renderer (renderer/) │ │ Świat (world/) │
│ wgpu surface/device/queue │ │ (cx,cz) -> mapa Chunk │
│ 5 kategorii pipeline'ów │ │ BiomeGenerator │
│ frustum culling │ │ ChunkGenerator (async) │
│ bufory GPU per chunk │ │ symulacja wody │
│ atlas tekstur + pakiety │ │ system AI + trening │
│ UI menu/tekst/inventory │ │ stany NVCrafter │
└──────────────┬───────────────┘ └────┬───────────────────────┘
│ │
└───────────┬───────────┘

InteractionController (interaction.rs)
most transakcji gameplay <-> GUI

1. Powłoka aplikacji (main.rs)

Punkt wejścia używa winit::application::ApplicationHandler i zarządza trzema jawnymi trybami runtime:

enum AppMode { MainMenu, Playing, PauseMenu }

Struktura App posiada:

  • stan renderera
  • instancję World
  • stan akumulacji wejścia
  • obsługę ścieżek zapisu/wczytania (exe_dir/saves/world.json)
  • komunikaty statusu/napisy
  • stan wejścia komend
  • stan wyboru menu głównego i menu pauzy

Przepływy runtime zaimplementowane w powłoce:

  • Przepływ nowej gry → start_new_game() ustawia AppMode::Playing
  • Zapis → save_game() wywołuje world.save_to_file() i pokazuje status
  • Wczytanie → load_game() wywołuje World::load_from_file_with_settings(), w razie błędu wraca do MainMenu
  • Przejścia pauza/wznowienie z przełączaniem przechwytywania kursora
  • Wiersz komend otwierany /, routowany przez commands::execute(...)
  • Przełącznik Low-End-PC z feedbackiem na ekranie i zapisanymi ustawieniami

2. Architektura renderowania (renderer/mod.rs)

renderer::State posiada powierzchnię/urządzenie/kolejkę/konfigurację WGPU, uniformy kamery, uniformy materiałów/biomów, teksturę głębi, atlas tekstur i grupy bind — oraz pięć kategorii pipeline'ów:

PipelineGeometria
Świat stałyNieprzezroczyste meshe chunków
WodaPrzezroczyste meshe wody (osobna ścieżka)
Płaskie panele UIProceduralne quady paneli
Ikony sprite UIIkony przedmiotów z atlasu
TekstWarstwy glifów rasteryzowane fontdue

Kluczowe szczegóły po stronie renderera:

  • Meshe chunków i meshe wody cache'owane osobno wg współrzędnych chunku
  • Tworzenie meshów ograniczane: tylko kilka chunków na klatkę
  • Uploady GPU debounced (nie wgrywane przy każdej zmianie pojedynczego chunku)
  • Rekombinacja meshów wody oddzielona od pełnych przebudów meshów wody
  • Naprawa szwów przebudowuje granice sąsiednich chunków przy nowych chunkach
  • Konserwatywna submisja w pobliżu gracza

Systemy widoczne w rozgrywce sterowane przez renderer:

  • Progresja fazy dnia/nocy przez elapsed_time
  • Timing animacji wody
  • Uniformy mgły i koloru otoczenia sterowane klimatem/biomem
  • Krzyżyk, nakładki napisów, nakładki wiersza komend
  • Renderowanie menu głównego, menu pauzy, inventory i panelu craftera

3. Świat i streaming chunków (world/mod.rs)

World przechowuje:

  • Załadowane chunki w mapie (cx, cz) -> Chunk
  • Współdzielony BiomeGenerator
  • ChunkGenerator do generacji w tle + odbiornik ukończonych chunków
  • Śledzenie oczekujących chunków i oczekujących zapisów między chunkami
  • Śledzenie populacji drzew dla już przetworzonych chunków
  • Wpisy NVCrafterState per blok
  • Buforowane encje WorldItemDrop

Funkcje świata:

  • Synchroniczna materializacja chunków w pobliżu gracza
  • Generacja odległych chunków w tle
  • Wyładowywanie odległych chunków z buforowym promieniem
  • Buforowanie zapisów między chunkami
  • Leniwa generacja chunków, gdy mutacje transgraniczne wymagają chunku docelowego
  • Odczyt/zapis bloków wg współrzędnych świata + pomocnicze identyfikatory bloków
  • Pomocnicze funkcje stawiania/niszczenia bloków
  • Buforowanie i opróżnianie zrzutów przedmiotów w runtime
  • Wsparcie zapisu/wczytania (seed, spłaszczone bloki chunków, metadane wody, stany crafterów)
  • Bezpieczne rozwiązywanie pozycji teleportacji
  • Wyszukiwanie spawna oparte o realną zajętość bloków i prześwit w runtime

Generacja asynchroniczna (world/generator.rs)

  • Ograniczona kolejka współrzędnych chunków
  • Zbiór in-flight do deduplikacji wysyłki
  • Grupowe opróżnianie z głównego wątku co klatkę
  • Równoległa generacja przez rayon::spawn(...) + into_par_iter()
  • Wyniki dostarczane przez mpsc

4. Proceduralny teren i biomy (world/biomes.rs)

Dziewięć biomów, każdy z temperaturą, wilgotnością, gęstością drzew/trawy, typami drzew, blokiem powierzchni i odcieniem roślinności:

BiomTempWilgot.DrzewaTrawaPowierzchnia
Ocean0.480.880.000.00Piasek
Wybrzeże0.620.540.020.10Piasek
Równiny0.580.460.050.72Trawa
Las0.540.620.460.46Trawa
Ciemny Las0.500.740.740.18Leśne Dno
Bagno
Tajga
Pustynia
Góry

Generacja łączy wiele kanałów OpenSimplex z dedykowanymi seed'ami: kształt kontynentu, temperatura, wilgotność, erozja, szczyty/rzeźba, wysokość/szczegóły, warp/zmienność powierzchni, jaskinie, rudy, woda. Generator udostępnia dane klimatu z powrotem rendererowi (kolor otoczenia, kolor/gęstość mgły, gradacja sceny, odcień roślinności, ciepło, wilgoć, bujność).

5. Roślinność i propagacja drzew (world/vegetation.rs)

  • Teren może emitować odroczone zapisy świata
  • Gdy chunk istnieje, uruchamiany jest jawny przebieg drzew w przestrzeni świata
  • populate_world_trees_for_chunk(...) stosuje roślinność post-insert tylko raz na jawnie wstawiony chunk
  • Wsparcie zapisów koron między chunkami; chunki docelowe przepełnienia pozostają tylko-terenowe, dopóki nie zostaną jawnie załadowane
  • Planowanie pni przed stawianiem koron, kształty koron zależne od biomu, sprawdzenia podłoża (teren/trawa/kwiat/krzew), deterministyczna zmienność seeded, jawna walidacja w przestrzeni świata

6. Kamera, ruch i kolizje (renderer/camera.rs)

Autorytatywna ścieżka ruchu: przechwytywanie wejścia w main.rsrenderer::State::update(...)Camera::tick_movement(...).

  • Rotacja kamery pierwszoosobowej, chodzenie, sprint, skok
  • Przełącznik latania (F) i grawitacja z ograniczeniem prędkości spadania
  • Grawitacja i zatapianie specyficzne dla wody
  • Kolizja AABB z blokami stałymi
  • Przechwytywanie intencji wejścia oddzielone od integracji ruchu
  • Modyfikatory ruchu w runtime od nakładających się ośrodków bloków (BlockType::movement_medium(...), śledzenie in_foliage_medium i footstep_volume dla przyszłych hooków audio)

7. GUI i warstwa interakcji (interaction.rs)

InteractionController działa jako warstwa transakcji GUI między inventory gracza a światem:

  • Otwieranie/zamykanie GUI inventory
  • Otwieranie GUI NVCrafter, gdy celowany blok to wspiera
  • Wykrywanie najechania na slot
  • Drag-and-drop między typami slotów
  • Obsługa kliknięcia w slot wyjścia
  • Zwracanie wejść craftingu przy zamknięciu GUI
  • Przenoszenie wejść NVCrafter z powrotem do inventory lub zrzucanie ich do świata

UiSlotId jawnie rozróżnia: sloty inventory gracza, wejścia craftingu gracza, wyjście craftingu gracza, wejścia NVCrafter, wyjście NVCrafter.

8. Narzędzia pipeline'u treści

NarzędzieTechCel
Bridge/Tools/Slicer/Program.cs.NET 8Krajanie atlasu — skanuje PNG atlasów, wyodrębnia tekstury bloków
generate_textures.pyPython/PillowObracanie, odbicia, grayscale, inwersja, przyciemnianie, rozjaśnianie tekstur
.vscode/tasks.jsonUruchamianie pliku wykonywalnego silnika z workspace
VulkanLayers/VkLayer_NV20.json + .dllPakowanie własnej warstwy Vulkan

9. Co celowo jeszcze nie jest zaimplementowane

  • Dedykowany system audio rozgrywki (sygnały ośrodków ruchu już śledzone)
  • Sieciowanie / multiplayer
  • Edytor treści w silniku
  • Formalna architektura rozgrywki w stylu ECS