#pragma once // MalzemeNesnesi — atanan malzemenin ürün ağacındaki GERÇEK feature düğümü. // // NEDEN NESNE (sanal satır değil): kullanıcı malzemeyi Pad/Pocket gibi bağımsız // bir öğe olarak görmek istiyor (07-20: "ayrıyeten feature gibi görünecek"). // ECS varlığı olduğu için ürün ağacına `urunAgaciTopla` tarafından KENDİLİĞİNDEN // girer; ad değiştirme, ikon override, sil, sırala, özellik paneli — hepsi // diğer nesnelerle aynı yoldan çalışır (tek yerde özel-durum yok). // // SAHİPLİK: nesne yalnız bir GÖSTERİMDİR; gerçek atama `MalzemeAtama` defterinde // durur (render + kayıt onu okur). `malzemeDugumleriSenkron` iki tarafı eşitler — // atama eklendi/silindi/undo edildi fark etmez, ağaç tek çağrıyla doğruya gelir. #include #include "fiko/cekirdek/dunya.hpp" #include "fiko/cekirdek/nesne.hpp" #include "fiko/malzeme/malzeme.hpp" namespace fiko { class Cekirdek; class Sahne; class MalzemeNesnesi : public DokumanNesnesi { public: MalzemeNesnesi(Varlik kimlik, Varlik govde, u32 malzemeKimlik, const malzeme::MalzemeKutuphanesi* kut) : DokumanNesnesi(kimlik), govde_(govde), malzemeKimlik_(malzemeKimlik), kut_(kut) {} const char* turAdi() const override { return "Malzeme"; } std::string ad() const override; void adAyarla(const std::string& a) override { adOzel_ = a; } OzellikSeti ozellikler(Dunya&) override; std::string agacSimgeAnahtar() const override { return "malzeme"; } Varlik govde() const { return govde_; } u32 malzemeKimlik() const { return malzemeKimlik_; } void malzemeAyarla(u32 m) { malzemeKimlik_ = m; } const malzeme::MalzemeTanim* tanim() const { return kut_ ? kut_->bul(malzemeKimlik_) : nullptr; } private: Varlik govde_ = VARLIK_YOK; u32 malzemeKimlik_ = 0; const malzeme::MalzemeKutuphanesi* kut_ = nullptr; std::string adOzel_; // kullanıcı yeniden adlandırdıysa (boş = malzeme adı) }; class MalzemeGorunum : public GorunumSaglayici { public: MalzemeGorunum(Varlik kimlik, Dunya* d) : GorunumSaglayici(kimlik), dunya_(d) {} const char* agacSimgesi() const override { return "🎨"; } Arketip agacArketip() const override { return Arketip::Feature; } bool agacRengiVar() const override { return true; } Vec3f agacRengi() const override; std::string agacMiniBilgi(Dunya&) const override; bool gorunur() const override { return true; } private: const MalzemeNesnesi* nesne() const; Dunya* dunya_ = nullptr; }; // Atama defterini ürün ağacındaki malzeme düğümleriyle EŞİTLER (idempotent): // eksik olanı ekler, malzemesi değişeni günceller, atanmayanı siler. // Atama değiştiren HER yol (pencere, ağaç menüsü, undo, dosya yükleme) bunu çağırır. void malzemeDugumleriSenkron(Cekirdek& cekirdek, Sahne& sahne, const malzeme::MalzemeKutuphanesi& kut, const malzeme::MalzemeAtama& atama); // Bir malzeme düğümü Varlik'i mi (ağaç silme/menü yolları bunu sorar). bool malzemeDugumuMu(Cekirdek& cekirdek, Varlik v); } // namespace fiko