#pragma once // IsinAlani — analiz hattının set=1 descriptor'ı: DÜNYA-uzayı BVH + üçgen SSBO'su. // Et kalınlığı ısı haritasını üçgenlemeden KURTARIR: shader her FRAGMENT için // yüzey normali boyunca içeri ışın atıp karşı duvara mesafeyi ölçer (per-vertex // alan interpolasyonu, delikli yüzde köşelerden yayılan yıldız/üçgen deseni // üretiyordu — ölçüldü, kullanıcı ekran görüntüsü 2026-07-19). // // Neden DÜNYA uzayı: fragment'te elde hazır olan `dunyaKonum`/`dunyaNormal` // bunlar; üçgenler yüklenirken model matrisiyle çarpılır. Yan fayda: ölçek // düzeltmesi bedava (dünya mm doğrudan çıkar). // // Set HER analiz çiziminde bağlı olmalıdır (shader statik olarak referans veriyor) // → veri yokken 1 elemanlı KUKLA tamponlar bağlıdır ve shader ışın yolunu // `itme.rampa.z <= 0` ile hiç çalıştırmaz. #include #include #include #include "fiko/core/mat/mat4.hpp" #include "fiko/core/mat/vec.hpp" #include "fiko/core/temel.hpp" #include "fiko/analiz/analiz_nesne.hpp" // AnalizAralik (kalınlık sınıfları) #include "fiko/render/compute_baglam.hpp" // SsboTampon namespace fiko { class VulkanBaglam; struct IsinBvh; class IsinAlani { public: explicit IsinAlani(VulkanBaglam& vb); ~IsinAlani(); IsinAlani(const IsinAlani&) = delete; IsinAlani& operator=(const IsinAlani&) = delete; VkDescriptorSetLayout setYerlesim() const { return dsYerlesim_; } VkDescriptorSet set() const { return ds_; } bool gecerli() const { return ds_ != VK_NULL_HANDLE; } // Yüklü veri var mı (yoksa çağıran rampa.z=0 vermeli → shader ışın atmaz). bool veriVar() const { return ucgenSayi_ > 0; } u32 ucgenSayi() const { return ucgenSayi_; } // Yüklü içerik imzası (çağıran gereksiz yeniden yüklemeyi bununla eler). u64 imza() const { return imza_; } // Yüklü verinin ait olduğu sahne düğümü (0 = veri yok). TEK gövde desteklenir: // aynı anda birden çok kalınlık analizi varsa ilki per-fragment, ötekiler // per-vertex alana düşer (tek set = tek SSBO çifti). u32 dugum() const { return dugum_; } // BVH + mesh'i DÜNYA uzayında SSBO'lara yükler ve descriptor'ı günceller. // imza: çağıranın anahtarı (düğüm kimliği + mesh sürümü + dönüşüm karması); // aynıysa iş yapılmaz. false → yükleme başarısız (çağıran ışını kapatmalı). bool yukle(u64 imza, u32 dugumKimlik, const IsinBvh& bvh, const std::vector& konum, const std::vector& indeks, const Mat4f& model, const std::vector& bantlar); // Shader'a bildirilecek sınıf sayısı (0 = sürekli rampa). u32 bantSayi() const { return bantSayi_; } // Veriyi bırak (kukla tamponlara dön) — kalınlık analizi kapanınca. void bosalt(); private: void kuklaBagla(); void descriptorYaz(VkBuffer dal, VkBuffer ucgen, VkBuffer bant); VulkanBaglam& vb_; VkDescriptorSetLayout dsYerlesim_ = VK_NULL_HANDLE; VkDescriptorPool dsHavuz_ = VK_NULL_HANDLE; VkDescriptorSet ds_ = VK_NULL_HANDLE; SsboTampon kukla_; // 1 elemanlı dolgu (veri yokken bağlı kalır) SsboTampon dalSsbo_; // düğümler (32B/düğüm) SsboTampon ucgenSsbo_; // BVH yaprak sırasına DÜZLEŞTİRİLMİŞ üçgenler (48B/üçgen) SsboTampon bantSsbo_; // kalınlık sınıfları (32B/sınıf: sınır+renk) u32 ucgenSayi_ = 0; u64 imza_ = 0; u32 dugum_ = 0; u32 bantSayi_ = 0; }; } // namespace fiko