#pragma once // Malzeme atama/düzenleme undo işlemleri (PaftaDuzenIslem kalıbı: ÖNCE/SONRA tam // kopya, idempotent uygula → ilk çağrı zaten uygulanmış durumu yeniden yazar). // // NEDEN TAM KOPYA: atama defteri iki küçük hash tablosu (gövde + yüz); delta // tutmak karmaşıklık katar, kazanç yok. [[fikatia-gizmo-undo-boslugu]] dersi: // undo'ya İTİLMEYEN değişiklik kullanıcı için "kayıp" demektir. // // Motor/sahne'ye KONMADI: sahne → malzeme bağımlılığı doğmasın (io'daki POD ayna // ilkesiyle aynı gerekçe). #include "fiko/cekirdek/islem.hpp" #include "fiko/malzeme/malzeme.hpp" namespace fiko { class MalzemeAtamaIslem : public Islem { public: MalzemeAtamaIslem(malzeme::MalzemeAtama& hedef, malzeme::MalzemeAtama once, malzeme::MalzemeAtama sonra, const char* ad) : hedef_(hedef), once_(std::move(once)), sonra_(std::move(sonra)), ad_(ad) {} const char* ad() const override { return ad_; } void uygula(Dunya&, OlayGunlugu&) override { hedef_ = sonra_; } void geriAl(Dunya&, OlayGunlugu&) override { hedef_ = once_; } private: malzeme::MalzemeAtama& hedef_; malzeme::MalzemeAtama once_, sonra_; const char* ad_; }; // Tek malzeme TANIMI düzenlemesi (kütüphane kaydı). Malzeme silinmişse no-op. class MalzemeDuzenIslem : public Islem { public: MalzemeDuzenIslem(malzeme::MalzemeKutuphanesi& kut, malzeme::MalzemeTanim once, malzeme::MalzemeTanim sonra) : kut_(kut), once_(std::move(once)), sonra_(std::move(sonra)) {} const char* ad() const override { return "Malzeme Düzenle"; } void uygula(Dunya&, OlayGunlugu&) override { yaz(sonra_); } void geriAl(Dunya&, OlayGunlugu&) override { yaz(once_); } private: void yaz(const malzeme::MalzemeTanim& kaynak) { if (malzeme::MalzemeTanim* v = kut_.bul(kaynak.kimlik)) { // GPU doku slotları çalışma-zamanı durumu: kopyalanan tanım eski slotları // taşımasın diye MEVCUT slotlar korunur (dokulariBagla yeniden bağlar). u32 slot[malzeme::DOKU_KANAL_SAYI]; for (u32 i = 0; i < malzeme::DOKU_KANAL_SAYI; ++i) slot[i] = v->dokular[i].gpuSlot; *v = kaynak; for (u32 i = 0; i < malzeme::DOKU_KANAL_SAYI; ++i) v->dokular[i].gpuSlot = slot[i]; kut_.degisti(); } } malzeme::MalzemeKutuphanesi& kut_; malzeme::MalzemeTanim once_, sonra_; }; } // namespace fiko