#include "fiko/sahne/pmi_sistemi.hpp" #include "fiko/cekirdek/olay.hpp" namespace fiko { OlcumBaglanti PmiSistemi::hedefCevir(const pmi::PmiHedef& h) { OlcumBaglanti l; l.var = h.govde != 0; l.govde = h.govde; l.alt = h.alt; l.kip = (SecimKip)h.kip; l.kid = h.kid; return l; } bool PmiSistemi::capaCoz(pmi::PmiOge& o) const { if (!cozucu_ || o.hedefler.empty()) { o.gecerli = false; return false; } OlcumRef r; if (!cozucu_(hedefCevir(o.hedefler[0]), r) || !r.var) { o.gecerli = false; return false; } o.capa = r.merkez; // Yerleşim düzlemi hedeften türetilir: düzlemsel yüz → yüzey düzlemi; silindir → // eksene dik değil, EKSEN doğrultusu sağ vektör olur (etiket silindir boyunca yatar). if (r.duzlem || r.silindir) { o.duzlemNormal = r.normal; // normal'e dik herhangi bir sağ vektör (kararlı: en küçük bileşen ekseniyle çapraz). const Vec3f n = r.normal; const Vec3f eksen = (std::abs(n.x) <= std::abs(n.y) && std::abs(n.x) <= std::abs(n.z)) ? Vec3f{1, 0, 0} : (std::abs(n.y) <= std::abs(n.z) ? Vec3f{0, 1, 0} : Vec3f{0, 0, 1}); const Vec3f sag{n.y * eksen.z - n.z * eksen.y, n.z * eksen.x - n.x * eksen.z, n.x * eksen.y - n.y * eksen.x}; const f32 uz = std::sqrt(sag.x * sag.x + sag.y * sag.y + sag.z * sag.z); if (uz > 1e-9f) o.duzlemSag = {sag.x / uz, sag.y / uz, sag.z / uz}; } o.gecerli = true; return true; } void PmiSistemi::guncelle(u32 govde) { for (u32 k : defter_.govdeninOgeleri(govde)) if (pmi::PmiOge* o = defter_.bul(k)) capaCoz(*o); } void PmiSistemi::gecersizle(u32 govde) { for (u32 k : defter_.govdeninOgeleri(govde)) if (pmi::PmiOge* o = defter_.bul(k)) o->gecerli = false; } void PmiSistemi::bagla(OlayGunlugu& olaylar) { olaylar.abone({OlayTuru::DonusumDegisti, OlayTuru::BrepDegisti}, [this](const OlayKaydi& k) { guncelle(k.varlik); }); olaylar.abone({OlayTuru::VarlikSilindi}, [this](const OlayKaydi& k) { gecersizle(k.varlik); }); // VarlikEklendi (diril/undo): kopuk öğeler yeniden çözülür → rozet kendiliğinden düşer. olaylar.abone({OlayTuru::VarlikEklendi}, [this](const OlayKaydi& k) { guncelle(k.varlik); }); } } // namespace fiko