#pragma once #include #include #include #include #include #include "fiko/core/mat/vec.hpp" #include "fiko/core/temel.hpp" #include "fiko/dokum/hava_analiz.hpp" #include "fiko/dokum/porozite.hpp" #include "fiko/dokum/sonuc_katmanlari.hpp" #include "fiko/dokum/voxel_gorsel.hpp" namespace fiko { class Cekirdek; class Sahne; class SahneRefSecim; class VulkanBaglam; namespace dokum { class DokumSimulasyonu; } // ============================================================================ // DokumSistemi — Döküm Simülasyonu WB yöneticisi (AnalizSistemi kalıbı). // DokumSimulasyonu (DokumanNesnesi → ağaç + parametrik + makro/plugin/olay) // nesnelerinin CRUD'u + sahne-gövde köprüsü + arka-plan (GorevSistemi) çözüm // orkestrasyonu. Motor (fiko::dokum) saf/test-edilebilir kalsın diye yönetici // uygulama katmanında (sahne'ye burada bağlanır). Çözüm worker'da hesaplaGovde // çağırır (saf CPU), bitince main-thread'de finalize + DokumBitti yayınlar. // ============================================================================ // Dolum görünüm kipi: voxel küpler / pürüzsüz MC sıvı yüzeyi / Malzeme İzi // (MAGMA Material Trace: parça x-ray saydam + sıvı yüzeyi, global kilitli renk) / // Partikül bulutu (SPH partikülünün KENDİSİ — jet/sıçrama/çalkantı hücreye // ezilmeden görünür; yalnız SPH kipinde + partikül kaydı açıkken dolu). // YENİ DEĞERLER SONA (enum sözleşmesi). enum class DolumGorunum : u8 { Voxel, Sivi, MalzemeIzi, Partikul }; // Pürüzsüz yüzey renk kaynağı: cephe sıcaklığı [°C], varış zamanı [s] veya // AKIŞ HIZI [m/s] (Hiz: gerçek sıvı izlenimi — jet çalkantısı, mandala akış, // durgun yüzey hız≈0; doluluk alanı tek değerli olduğu için hız bilgisi // başka hiçbir yolla görünmez). enum class DolumRenk : u8 { Sicaklik, VarisZamani, Hiz }; class DokumSistemi { public: DokumSistemi(Cekirdek& cekirdek, Sahne& sahne); // ---- Panel durumu (main doğrudan okur/yazar) ---- bool acik = false; // Sahneden-seçim köprüsü (🎯 kurulum konum/yön seçimi). main.cpp bir kez // bağlar (entegrasyon kontratı); nullptr ise 🎯 düğmeleri pasif kalır. SahneRefSecim* refSecim = nullptr; // Kamera odak köprüsü (porozite bölgesine uçuş). main.cpp bir kez bağlar // (KONTRAT: ds.kameraOdak = [&](Vec3d m, f64 r){ kamera.sigdir(...); }; // m = dünya merkez, r = yarıçap). Bağlı değilse yalnız işaret düğümü kurulur. std::function kameraOdak; // GPU katılaşma köprüsü (Vulkan compute). main.cpp bir kez bağlar // (KONTRAT: ds.vulkan = &vulkan;). Bağlıysa + gpuTercih + cihaz hazırsa // cozumBaslat ANA İPLİKTE GPU katilasmaGpuCoz çalıştırır (büyük gridde 5×+); // aksi halde CPU worker'a (saf CPU sözleşmesi) düşer. Vulkan gönderim // iş-parçacığı-güvenli olmadığından GPU yolu worker'da DEĞİL, ana iplikte koşar. VulkanBaglam* vulkan = nullptr; bool gpuTercih = true; // kullanıcı GPU'yu kapatabilir (panel bayrağı) // ---- CRUD ---- // Yeni döküm simülasyonu (hedefGovde = seçili/ilk görünür gövde; 0 = ilk çözer). u32 ekle(u32 hedefGovde); bool sil(u32 kimlik); dokum::DokumSimulasyonu* bul(u32 kimlik); std::vector& hepsi() { return simler_; } // ---- Çözüm (arka-plan) ---- // Simülasyonu GorevSistemi worker'ında çöz: hedef gövde brep'i (shared_ptr → // worker güvenli tutar) → sonuca ayrı KatilasmaSonuc/VoxelKafes hesaplanır, // bitince main-thread'de sim nesnesine kopyalanıp DokumBitti yayınlanır. // Zaten koşan bir çözüm varsa no-op. false = hedef gövde/mesh yok. bool cozumBaslat(u32 kimlik); bool cozuluyorMu(u32 kimlik) const; // ---- Kalıp doldurma (arka-plan) ---- // Dolumu worker'da çöz: gövde brep → kafes kur+sınıfla → dolumCoz (varış zamanı // + kusur). Bitince main-thread'de sim'e kopyalanıp DolumBitti yayınlanır. // Zaten koşan çözüm varsa no-op. false = hedef gövde/mesh yok. bool dolumBaslat(u32 kimlik); // Dolum görselini kur/yenile (zamanKesim<0 = tümü; >=0 = animasyon kesimi). // Sivi/MalzemeIzi → Marching Cubes izo-yüzeyi; renk kaynağı seçilebilir ve // GLOBAL KİLİTLİ aralıkla normalize edilir (sıcaklık: [tSolidus−50, // dokumSicaklik]; varış: [0, toplamSure]). Sivi/MalzemeIzi ayrıca MAGMA // görünümünü kurar: parça x-ray saydam + SIVI OPAK (xrayAyarla). Sonuç // yoksa no-op. void dolumGorsellestir(u32 kimlik, f64 zamanKesim = -1.0, DolumGorunum gorunum = DolumGorunum::Sivi, DolumRenk renk = DolumRenk::Sicaklik); void dolumKaldir(u32 kimlik); // Parça x-ray KAYNAK bazlı istenir: dolum sıvısı / katılaşma cephesi / // porozite baloncuğu aynı anda açık olabilir — herhangi bir kaynak isterken // hedef gövde çok saydam, TÜM kaynaklar kapanınca eski değerine döner. enum XrayKaynak : u8 { XrayDolum = 1, XrayCephe = 2, XrayPorozite = 4, XrayVoxel = 8, XrayHepsi = 0xFF }; void xrayAyarla(u32 kimlik, bool ac, u8 kaynak = XrayDolum); // Katılaşma cephesi (pürüzsüz izo-yüzey): zamanKesim anında katılaşmış/sıvı // arayüzü (alan = katılaşma süresi, izo = t). yalnizSivi=true → MAGMA // Fraction Liquid kipi: katılaşan hücreler GİZLİ, yalnız sıvı bölge küpleri // (izole adacıklar = hot-spot adayları görünür; renk = katılaşma anı, global // kilitli [0, toplamSure]). Sonuç yoksa no-op. void cepheGorsellestir(u32 kimlik, f64 zamanKesim, bool yalnizSivi = false); void cepheKaldir(u32 kimlik); // Hot-spot'u 3B sahnede küçük tel-kafes küp düğümüyle işaretle (varsa günceller). void hotSpotIsaretle(u32 kimlik); // 3B renk-rampalı hacim ısı-haritasını kur/yenile (gorselAyar.alan=Kapali → // düğümü kaldırır). Yalnız alan/rampa/min-max/yalnız-sınır DEĞİŞİNCE çağrılır // (kare-başı değil) → tampon bir kez yüklenir. Sonuç yoksa no-op. void voxelGorsellestir(u32 kimlik); // Görselleştirme düğümünü kaldır (viz kapat). void voxelKaldir(u32 kimlik); // ---- Türetilmiş sonuç katmanları (sonuc_katmanlari; önbellekli) ---- // Çözüm başına BİR kez hesaplanır (yeni katılaşma/dolum → düşer). Dropdown // bu jenerik listeden dolar. nullptr = hiç sonuç yok / kafes geçersiz. const dokum::SonucKatmanlari* katmanlarAl(u32 kimlik); // Seçili katmanı renk-rampalı küp ısı-haritası olarak kur (alanMeshKur yolu; // lejant KatmanBilgi.min/maks). Katman bulunamazsa düğümü kaldırır. // esik: değer-eşiği taraması (MAGMA "soyma" animasyonu) — yalnız değer > esik // hücreler çizilir; varsayılan -0.5 = tüm geçerli hücreler (geçersiz = -1). void katmanGorsellestir(u32 kimlik, const char* katmanAd, f32 esik = -0.5f); // ---- Hava hapsi analizi (dolum sonrası post-process; önbellekli) ---- // Dolum hazırsa analizi döndürür (ilk çağrıda hesaplanır, yeni dolum gelince // düşer). nullptr = dolum yok / analiz hazır değil. const dokum::HavaAnalizSonuc* havaAl(u32 kimlik); // Vent önerilerini sahnede küçük saydam küre düğümleri olarak göster/kaldır. void ventGoster(u32 kimlik); void ventKaldir(u32 kimlik); bool ventVarMi(u32 kimlik) const { return ventDugum_.count(kimlik) != 0; } // ---- Porozite (katılaşma + opsiyonel hava post-process; önbellekli) ---- // Katılaşma hazırsa porozite alanlarını döndürür (ilk çağrıda hesaplanır; // yeni çözüm/dolum veya eşik değişimi → düşer). nullptr = hazır değil. const dokum::PoroziteSonuc* poroziteAl(u32 kimlik, f32 esik = 0.5f); // Baloncuk görünümü: porozite > eşik blob izo-yüzeyi + parça x-ray. void poroziteBaloncukGoster(u32 kimlik, bool ac, f32 esik = 0.5f); bool poroziteBaloncukVarMi(u32 kimlik) const { return porDugum_.count(kimlik) != 0; } // Bölgeyi 3B'de işaretle + (bağlıysa) kamerayı bölgeye odakla. void poroziteBolgeIsaretle(u32 kimlik, int bolge); void poroziteKaldir(u32 kimlik); // baloncuk + işaret + önbellek temizliği // ---- Besleme / Methoding (Chvorinov besleyici öneri) ---- // Parça modülü + hot-spot'tan silindirik besleyici boyutlandır → yarı-saydam // tel-kafes hayalet silindir düğümü çiz (kabul edilene dek geçici). Sonuç yoksa // no-op. Panel bilgi kutusu için öneriyi de döndürür (parca modülü sim'de saklanır). void besleyiciOner(u32 kimlik); // Hayalet önizleme düğümünü kaldır. void besleyiciHayaletKaldir(u32 kimlik); // Öneriyi kabul et: hayaleti kalıcı ağaç nesnesine (besleyici) dönüştür. void besleyiciKabul(u32 kimlik); // ---- Döküm kurulumu sahne önizlemesi (giriş koni / chill küre / besleyici // silindir / yolluk tüp — GERÇEK saydam sahne düğümleri: seçilebilir, // ağaçta görünür, Delete ile silinebilir; VarlikSilindi → kayıt düşer). ---- void kurulumDugumYenile(u32 kimlik); // tüm öğe düğümlerini yeniden kur // Dolmayan bölgeyi sahnede işaretle + kamerayı uçur (misrun teşhisi). void dolmayanBolgeIsaretle(u32 kimlik, const dokum::DolmayanBolge& b); void kurulumDugumleriKaldir(u32 kimlik); // hepsini sahneden sil private: Cekirdek& cekirdek_; Sahne& sahne_; std::vector simler_; u32 grup_ = 0; // "Döküm Simülasyonları" ağaç grubu (lazy) u32 koşanKimlik_ = 0; // aktif çözüm sim kimliği (0 = boş) u64 koşanGorev_ = 0; // Pürüzsüz dolum yüzeyi alan önbelleği (dolumAlanKur bir kez; scrubber hızlı). std::unordered_map> dolumAlan_; // Hava analizi önbelleği (dolum-başı bir kez; yeni dolum → düşer). std::unordered_map hava_; // Vent önerisi küre düğümleri (sim → sahne düğüm listesi). std::unordered_map> ventDugum_; // Parça x-ray: hedef gövdenin eski saydamlığı + aktif kaynak bit maskesi. std::unordered_map eskiSaydam_; std::unordered_map xrayIstek_; // Porozite önbelleği (eşiğe bağlı) + baloncuk/işaret düğümleri. struct PorOnbellek { dokum::PoroziteSonuc sonuc; f32 esik = 0.5f; }; std::unordered_map por_; std::unordered_map porDugum_, porIsaret_; // Türetilmiş sonuç katmanları önbelleği (çözüm başına bir hesap). std::unordered_map katman_; u32 grupAl(); // Kurulan küp mesh'i sahneye yerleştir (voxel/katman ortak son adım). void voxelSonucYerlestir_(dokum::DokumSimulasyonu* s, dokum::VoxelGorselSonuc vg); // Tel-kafes küp işaret düğümü kur/güncelle (hot-spot + porozite bölge ortak). void isaretKupKur(u32& dugum, const char* ad, Vec3f merkez, f32 r, Vec3f renk); // Sahneden silinen düğüm (Delete/radyal) → eşleşen kurulum kaydını düşür. void kurulumKaydiDus(u32 dugumKimlik); // Dolum çözümü sonrası ortak son adım: önbellek düşür + görselleştir + olay // (worker finalize ile ana-iplik GPU fast-path'in TEK ortak yolu). void dolumSonrasi_(u32 kimlik); }; // ---- Panel (pinlenebilir pencere) ---- void dokumPencereAc(u32 kimlik); void dokumPencereleriCiz(Cekirdek& cekirdek, Sahne& sahne, DokumSistemi& ds); } // namespace fiko