#include "malzeme_io.hpp" namespace fiko { using namespace fiko::malzeme; namespace { io::FikoMalzeme tanimdanPod(const MalzemeTanim& m) { io::FikoMalzeme f; f.kimlik = m.kimlik; f.ad = m.ad; f.aciklama = m.aciklama; f.dokumAlasimAdi = m.dokumAlasimAdi; f.sinif = static_cast(m.sinif); f.hazir = m.hazir ? 1 : 0; f.tabanRenk = m.tabanRenk; f.opaklik = m.opaklik; f.metaliklik = m.metaliklik; f.puruzluluk = m.puruzluluk; f.yansima = m.yansima; f.ortmeSiddet = m.ortmeSiddet; f.anizotropi = m.anizotropi; f.anizotropiAci = m.anizotropiAci; f.kaplamaBerrak = m.kaplamaBerrak; f.kaplamaPuruz = m.kaplamaPuruz; f.kaplamaRenk = m.kaplamaRenk; f.gecirgenlik = m.gecirgenlik; f.kalinlik = m.kalinlik; f.kirilmaIndisi = m.kirilmaIndisi; f.emilimRenk = m.emilimRenk; f.parlakTuyRenk = m.parlakTuyRenk; f.parlakTuyPuruz = m.parlakTuyPuruz; f.sacilmaRenk = m.sacilmaRenk; f.sacilmaSiddet = m.sacilmaSiddet; f.emisyonRenk = m.emisyonRenk; f.emisyonSiddet = m.emisyonSiddet; for (u32 i = 0; i < DOKU_KANAL_SAYI; ++i) { f.dokular[i].yol = m.dokular[i].yol; f.dokular[i].siddet = m.dokular[i].siddet; f.dokular[i].ters = m.dokular[i].ters ? 1 : 0; } f.kaplama = static_cast(m.kaplama); f.sarma = static_cast(m.sarma); f.dunyaUzayinda = m.dunyaUzayinda ? 1 : 0; f.dokuOlcek = m.dokuOlcek; f.dokuOfset = m.dokuOfset; f.dokuDonus = m.dokuDonus; f.triplanarKeskinlik = m.triplanarKeskinlik; f.kabartmaDerinlik = m.kabartmaDerinlik; f.yogunluk = m.yogunluk; return f; } MalzemeTanim poddanTanim(const io::FikoMalzeme& f) { MalzemeTanim m; m.kimlik = 0; // kütüphane yeni kimlik verir (dosya kimliği çakışabilir) m.ad = f.ad; m.aciklama = f.aciklama; m.dokumAlasimAdi = f.dokumAlasimAdi; m.sinif = static_cast(f.sinif); m.hazir = false; // dosyadan gelen daima düzenlenebilir kopya m.tabanRenk = f.tabanRenk; m.opaklik = f.opaklik; m.metaliklik = f.metaliklik; m.puruzluluk = f.puruzluluk; m.yansima = f.yansima; m.ortmeSiddet = f.ortmeSiddet; m.anizotropi = f.anizotropi; m.anizotropiAci = f.anizotropiAci; m.kaplamaBerrak = f.kaplamaBerrak; m.kaplamaPuruz = f.kaplamaPuruz; m.kaplamaRenk = f.kaplamaRenk; m.gecirgenlik = f.gecirgenlik; m.kalinlik = f.kalinlik; m.kirilmaIndisi = f.kirilmaIndisi; m.emilimRenk = f.emilimRenk; m.parlakTuyRenk = f.parlakTuyRenk; m.parlakTuyPuruz = f.parlakTuyPuruz; m.sacilmaRenk = f.sacilmaRenk; m.sacilmaSiddet = f.sacilmaSiddet; m.emisyonRenk = f.emisyonRenk; m.emisyonSiddet = f.emisyonSiddet; for (u32 i = 0; i < DOKU_KANAL_SAYI; ++i) { m.dokular[i].yol = f.dokular[i].yol; m.dokular[i].siddet = f.dokular[i].siddet; m.dokular[i].ters = f.dokular[i].ters != 0; } m.kaplama = static_cast(f.kaplama); m.sarma = static_cast(f.sarma); m.dunyaUzayinda = f.dunyaUzayinda != 0; m.dokuOlcek = f.dokuOlcek; m.dokuOfset = f.dokuOfset; m.dokuDonus = f.dokuDonus; m.triplanarKeskinlik = f.triplanarKeskinlik; m.kabartmaDerinlik = f.kabartmaDerinlik; m.yogunluk = f.yogunluk; m.gecerliKil(); return m; } } // namespace void malzemeleriBelgeyeYaz(const MalzemeKutuphanesi& kut, const MalzemeAtama& atama, io::FikoBelge& belge) { belge.malzemeler.clear(); belge.malzemeAtamalari.clear(); // Atanmış malzemeler her hâlde yazılır (hazır olsalar bile ADLARI atamayı // çözmek için gerekir; hazır olanlar yüklemede ada göre eşlenip yeniden // ÜRETİLMEZ → kütüphane şişmez). for (const MalzemeTanim& m : kut.hepsi()) { if (m.hazir && atama.bosMu()) continue; belge.malzemeler.push_back(tanimdanPod(m)); } for (const auto& [govde, malzemeKimlik] : atama.govdeler()) belge.malzemeAtamalari.push_back({govde, 0u, malzemeKimlik}); for (const auto& [anahtar, malzemeKimlik] : atama.yuzler()) belge.malzemeAtamalari.push_back( {static_cast(anahtar >> 32), static_cast(anahtar & 0xFFFFFFFFu), malzemeKimlik}); } void malzemeleriBelgedenAl(const io::HazirYukleme& hazir, const std::unordered_map& dugumHarita, MalzemeKutuphanesi& kut, MalzemeAtama& atama) { if (hazir.malzemeler.empty() && hazir.malzemeAtamalari.empty()) return; // Malzeme kimlik remap: hazır olan ADA göre mevcut kütüphaneye eşlenir (aynı // "Çelik" ikinci kez üretilmez); kullanıcı malzemesi yeni kimlikle eklenir. std::unordered_map mHarita; for (const io::FikoMalzeme& f : hazir.malzemeler) { u32 yeni = 0; if (f.hazir) { for (const MalzemeTanim& v : kut.hepsi()) if (v.hazir && v.ad == f.ad) { yeni = v.kimlik; break; } } if (!yeni) yeni = kut.ekle(poddanTanim(f)); mHarita[f.kimlik] = yeni; } for (const io::FikoMalzemeAtama& a : hazir.malzemeAtamalari) { auto dIt = dugumHarita.find(a.govde); if (dIt == dugumHarita.end()) continue; // gövde yüklenmemiş → atama düşer auto mIt = mHarita.find(a.malzeme); if (mIt == mHarita.end()) continue; if (a.yuz) atama.yuzeAta(dIt->second, a.yuz, mIt->second); else atama.govdeyeAta(dIt->second, mIt->second); } } } // namespace fiko