#pragma once // MalzemeGpuKaynak — model hattının set=1 descriptor'ı: malzeme tablosu + // yüz→malzeme eşlemesi + doku dizisi. // // NEDEN SSBO: push-constant 256 B DOLU (ModelItme) ve vertex formatı büyütülemez // (mega-parti maliyeti). Vertex ZATEN `globalYuzIndeks` (loc5, off44) taşıyordu // ama shader tüketmiyordu [[fikatia-peryuz-gpu-buffer]] Aşama 0d → malzeme // köprüsü tam olarak o alanı tüketir: fragment `yuzMalzeme[globalYuz]` ile // malzeme numarasını, oradan `malzemeler[n]` ile tüm parametreleri okur. // Sonuç: bir draw çağrısında YÜZ BAŞINA farklı malzeme (mega-parti bozulmaz). // // KARE-UÇUŞU HAZARDI: SSBO'lar HALKA kez çoğaltılır (kare indeksine göre yazılır) // → önceki kare okurken üzerine yazılmaz, kullanıcı slider'ı sürüklerken bile // vkDeviceWaitIdle gerekmez (stall yok). // // TEMBELLİK: `tazele()` her kare çağrılır ama içerik imzası (kütüphane sürümü + // atama sürümü + yüz aralığı düzeni) değişmedikçe TEK BAYT yazmaz — sıcak yol. // // YEREL UZAY: doku izdüşümü parçanın YEREL uzayında olmalı (parça taşınınca doku // onunla gitsin). Mega-partide vertex'ler DÜNYAYA pişirilir + model=birim → yerel // konum vertex'ten okunamaz. Çözüm: yüz tablosu girdisinin ÜST 16 biti gövde // slotudur, slot da gövdenin TERS model matrisine bakar → fragment `ters·dünya` // ile yerel konumu her iki yolda da DOĞRU hesaplar (ek vertex alanı YOK). #include #include #include #include "fiko/core/mat/mat4.hpp" #include "fiko/core/temel.hpp" #include "fiko/malzeme/malzeme.hpp" #include "fiko/render/compute_baglam.hpp" // SsboTampon #include "fiko/render/doku_dizisi.hpp" namespace fiko { class VulkanBaglam; class Sahne; // Doku çözünürlük tavanı (AyarSistemi "malzeme.doku_en_buyuk_kenar"). Dev doku // dosyaları VRAM'i sessizce yer → yükleme sırasında orantılı küçültülür. int malzemeDokuTavanAl(); void malzemeDokuTavanAta(int v); // Anizotropik filtre örnek sayısı ("malzeme.anizotropi"). 1 = kapalı. f32 malzemeAnizotropiAl(); void malzemeAnizotropiAta(f32 v); class MalzemeGpuKaynak { public: static constexpr u32 HALKA = 3; // uçuştaki kare sayısı üst sınırı explicit MalzemeGpuKaynak(VulkanBaglam& vb); ~MalzemeGpuKaynak(); MalzemeGpuKaynak(const MalzemeGpuKaynak&) = delete; MalzemeGpuKaynak& operator=(const MalzemeGpuKaynak&) = delete; VkDescriptorSetLayout setYerlesim() const { return dsYerlesim_; } // Bu kare bağlanacak set (tazele sonrası geçerli). VkDescriptorSet set() const { return ds_[aktif_]; } bool gecerli() const { return dsYerlesim_ != VK_NULL_HANDLE; } DokuDizisi& dokular() { return dokular_; } // Kütüphane + atama + sahne yüz aralıklarından GPU tablolarını günceller. // İçerik değişmediyse iş yapmaz. Kare başına BİR kez, render pass DIŞINDA. void tazele(malzeme::MalzemeKutuphanesi& kut, const malzeme::MalzemeAtama& atama, Sahne& sahne); // Kütüphanedeki doku yollarını GPU slotlarına bağlar (yeni/değişen dosyaları // yükler). Dosya I/O içerir → yalnız kütüphane SÜRÜMÜ değişince koşar (tazele // bunu kendisi yapar; belge yükleme/undo/makro yolları da böylece kapsanır). // true = en az bir slot değişti. bool dokulariBagla(malzeme::MalzemeKutuphanesi& kut); // Bu gövdeye SAYDAM malzeme atanmış mı (gövde ya da herhangi bir yüzü) — // render'ın saydam geçiş yönlendirmesi bunu sorar. `tazele` içinde bir kez // kurulur (sıralı vektör + ikili arama; kare-başı O(N·M) tarama YOK). bool saydamMi(u32 govde) const; // Teşhis u32 yuzTabloBoyut() const { return yuzTabloBoyut_; } u32 malzemeSayi() const { return malzemeSayi_; } private: void descriptorYaz(u32 halka); VulkanBaglam& vb_; DokuDizisi dokular_; VkDescriptorSetLayout dsYerlesim_ = VK_NULL_HANDLE; VkDescriptorPool dsHavuz_ = VK_NULL_HANDLE; VkDescriptorSet ds_[HALKA] = {}; SsboTampon malzemeSsbo_[HALKA]; SsboTampon yuzSsbo_[HALKA]; SsboTampon govdeSsbo_[HALKA]; // gövde ters model matrisleri (yerel izdüşüm) u64 imza_[HALKA] = {}; u32 descSurum_[HALKA] = {}; u32 gerekenDesc_ = 1; // tampon/doku değişince artar → halkalar tek tek tazelenir u32 aktif_ = 0; u32 yuzTabloBoyut_ = 0; u32 malzemeSayi_ = 0; u32 dokuSurum_ = 0; u32 dokuBagliSurum_ = 0; // doku yolları en son hangi kütüphane sürümünde bağlandı std::vector yuzTablo_; // yeniden kullanılan çalışma tamponu (tahsis yok) std::vector govdeTers_; // slot → ters model matrisi (yeniden kullanılır) std::vector saydamGovde_; // sıralı: saydam malzemeli gövde kimlikleri }; } // namespace fiko