#include "fiko/malzeme/malzeme.hpp" #include #include "fiko_test.hpp" using namespace fiko; using namespace fiko::malzeme; FIKO_TEST(malzeme_kutuphane_hazirlar) { MalzemeKutuphanesi k; FIKO_KONTROL(k.sayi() >= 20); bool celikVar = false, camVar = false; for (const MalzemeTanim& m : k.hepsi()) { FIKO_KONTROL(m.kimlik != 0); // 0 = "malzeme yok" sentinel'i, asla üretilmez FIKO_KONTROL(m.hazir); if (m.ad == "Çelik") { celikVar = true; FIKO_KONTROL(std::abs(m.yogunluk - 7850.0) < 1e-9); } if (m.ad == "Cam") { camVar = true; FIKO_KONTROL(m.gecirgenlik > 0.5f && m.saydamMi()); } } FIKO_KONTROL(celikVar && camVar); } FIKO_TEST(malzeme_ekle_kopyala_sil) { MalzemeKutuphanesi k; const std::size_t hazirSayi = k.sayi(); MalzemeTanim m; m.ad = "Özel Alaşım"; m.yogunluk = 4500.0; const u32 kid = k.ekle(m); FIKO_KONTROL(kid != 0 && k.sayi() == hazirSayi + 1); FIKO_KONTROL(k.bul(kid) && k.bul(kid)->ad == "Özel Alaşım" && !k.bul(kid)->hazir); const u32 hazirKimlik = k.hepsi()[0].kimlik; FIKO_KONTROL(!k.sil(hazirKimlik)); // hazır malzeme silinemez const u32 kopya = k.kopyala(hazirKimlik); FIKO_KONTROL(kopya != 0 && kopya != hazirKimlik && !k.bul(kopya)->hazir); FIKO_KONTROL(k.sil(kopya) && !k.sil(kopya) && k.bul(kopya) == nullptr); FIKO_KONTROL(k.sil(kid)); } FIKO_TEST(malzeme_ekle_ayni_kimlik_gunceller) { MalzemeKutuphanesi k; const std::size_t n = k.sayi(); MalzemeTanim m; m.ad = "A"; const u32 kid = k.ekle(m); m.kimlik = kid; m.ad = "B"; FIKO_KONTROL(k.ekle(m) == kid && k.sayi() == n + 1 && k.bul(kid)->ad == "B"); } FIKO_TEST(malzeme_surum_artar) { MalzemeKutuphanesi k; const u32 s0 = k.surum(); MalzemeTanim m; m.ad = "S"; const u32 kid = k.ekle(m); FIKO_KONTROL(k.surum() > s0); const u32 s1 = k.surum(); k.sil(kid); FIKO_KONTROL(k.surum() > s1); } FIKO_TEST(malzeme_ara) { MalzemeKutuphanesi k; FIKO_KONTROL(k.ara("çel").size() >= 1); // kısmi FIKO_KONTROL(k.ara("ALÜM").size() >= 1); // büyük/küçük harf duyarsız FIKO_KONTROL(k.ara("celik").size() >= 1); // ASCII klavye ("celik" → "Çelik") FIKO_KONTROL(k.ara("mese").size() >= 1); // "Meşe" FIKO_KONTROL(k.ara("yokböylemalzeme").empty()); const auto metaller = k.ara("", true, MalzemeSinif::Metal); const auto plastikler = k.ara("", true, MalzemeSinif::Plastik); FIKO_KONTROL(metaller.size() >= 8 && plastikler.size() >= 3); FIKO_KONTROL(metaller.size() + plastikler.size() < k.sayi() + 1); } FIKO_TEST(malzeme_ara_aciklamada) { MalzemeKutuphanesi k; MalzemeTanim m; m.ad = "X1"; m.aciklama = "kalıp çeliği ıslah"; const u32 kid = k.ekle(m); FIKO_KONTROL(k.ara("islah").size() == 1 && k.ara("islah")[0] == kid); } FIKO_TEST(malzeme_gpu_tablo) { MalzemeKutuphanesi k; const auto t = k.gpuTablo(); FIKO_KONTROL(t.size() == k.sayi() + 1); // 0. kayıt nötr: malzeme yok → shader mevcut vertex-renk yoluna düşer FIKO_KONTROL(t[0].tabanRenk[3] == 0.0f && t[0].pbr[0] == 0.0f); const u32 kid = k.hepsi()[0].kimlik; const u32 gi = k.gpuIndeks(kid); FIKO_KONTROL(gi == 1 && k.gpuIndeks(999999) == 0); FIKO_KONTROL(t[gi].tabanRenk[3] == 1.0f); } FIKO_TEST(malzeme_gpu_alan_esleme) { MalzemeTanim m; m.tabanRenk = {0.1f, 0.2f, 0.3f}; m.opaklik = 0.4f; m.metaliklik = 0.5f; m.puruzluluk = 0.6f; m.yansima = 0.7f; m.ortmeSiddet = 0.8f; m.kaplamaBerrak = 0.9f; m.kaplamaPuruz = 0.2f; m.anizotropi = -0.5f; m.gecirgenlik = 0.3f; m.kalinlik = 7.0f; m.kirilmaIndisi = 1.7f; m.kabartmaDerinlik = 0.9f; m.parlakTuyRenk = {0.11f, 0.12f, 0.13f}; m.parlakTuyPuruz = 0.44f; m.sacilmaRenk = {0.21f, 0.22f, 0.23f}; m.sacilmaSiddet = 0.55f; m.emisyonRenk = {1.0f, 2.0f, 3.0f}; m.emisyonSiddet = 4.0f; m.triplanarKeskinlik = 6.0f; m.dunyaUzayinda = true; m.kaplama = KaplamaTip::Silindirik; const MalzemeGpu g = gpuKaydiYap(m); FIKO_KONTROL(g.tabanRenk[0] == 0.1f && g.tabanRenk[3] == 0.4f); FIKO_KONTROL(g.pbr[0] == 0.5f && g.pbr[1] == 0.6f && g.pbr[2] == 0.7f && g.pbr[3] == 0.8f); FIKO_KONTROL(g.kaplamaKat[0] == 0.9f && g.kaplamaKat[1] == 0.2f && g.kaplamaKat[2] == -0.5f); FIKO_KONTROL(g.gecirgen[0] == 0.3f && g.gecirgen[1] == 7.0f && g.gecirgen[2] == 1.7f && g.gecirgen[3] == 0.9f); FIKO_KONTROL(g.tuy[3] == 0.44f && g.sacilma[3] == 0.55f && g.emisyon[3] == 4.0f); FIKO_KONTROL(g.izdusum[0] == 2.0f && g.izdusum[2] == 6.0f && g.izdusum[3] == 1.0f); } FIKO_TEST(malzeme_gpu_doku_olcek_tersi) { MalzemeTanim m; m.dokuOlcek = {50.0f, 25.0f, 0.0f}; // z=0 → sıfıra bölme tuzağı const MalzemeGpu g = gpuKaydiYap(m); FIKO_KONTROL(std::abs(g.dokuOlcek[0] - 0.02f) < 1e-6f); FIKO_KONTROL(std::abs(g.dokuOlcek[1] - 0.04f) < 1e-6f); FIKO_KONTROL(g.dokuOlcek[2] == 0.0f); m.dokuDonus = 180.0f; FIKO_KONTROL(std::abs(gpuKaydiYap(m).izdusum[1] - 3.14159265f) < 1e-5f); } FIKO_TEST(malzeme_gpu_kanal_ters_isaret) { MalzemeTanim m; const u32 pz = static_cast(DokuKanal::Puruzluluk); m.dokular[pz].yol = "r.png"; m.dokular[pz].siddet = 0.75f; m.dokular[pz].gpuSlot = 3; FIKO_KONTROL(gpuKaydiYap(m).kanalSiddet[pz] == 0.75f); m.dokular[pz].ters = true; // glossiness → roughness const MalzemeGpu g = gpuKaydiYap(m); FIKO_KONTROL(g.kanalSiddet[pz] == -0.75f && g.dokuSlot[pz] == 3u); } FIKO_TEST(malzeme_gecerli_kil) { MalzemeTanim m; m.puruzluluk = 0.0f; // GGX tekilliği → tabana çekilmeli m.metaliklik = 5.0f; m.opaklik = -1.0f; m.anizotropi = -9.0f; m.kirilmaIndisi = 0.2f; m.emisyonSiddet = -3.0f; m.tabanRenk = {2.0f, -1.0f, 0.5f}; m.triplanarKeskinlik = 999.0f; m.gecerliKil(); FIKO_KONTROL(m.puruzluluk >= 0.015f && m.metaliklik == 1.0f && m.opaklik == 0.0f); FIKO_KONTROL(m.anizotropi == -1.0f && m.kirilmaIndisi == 1.0f && m.emisyonSiddet == 0.0f); FIKO_KONTROL(m.tabanRenk.x == 1.0f && m.tabanRenk.y == 0.0f && m.tabanRenk.z == 0.5f); FIKO_KONTROL(m.triplanarKeskinlik == 32.0f); } FIKO_TEST(malzeme_kanal_lineer) { FIKO_KONTROL(!kanalLineerMi(DokuKanal::Taban) && !kanalLineerMi(DokuKanal::Emisyon)); FIKO_KONTROL(kanalLineerMi(DokuKanal::Puruzluluk) && kanalLineerMi(DokuKanal::Normal)); FIKO_KONTROL(DOKU_KANAL_SAYI == 8); } FIKO_TEST(malzeme_dokulu_mu) { MalzemeTanim m; FIKO_KONTROL(!m.dokuluMu() && !m.saydamMi()); m.dokular[static_cast(DokuKanal::Normal)].yol = "D:/doku/celik_n.png"; FIKO_KONTROL(m.dokuluMu() && m.dokular[static_cast(DokuKanal::Normal)].acik()); } FIKO_TEST(malzeme_kutle) { MalzemeTanim m; m.yogunluk = 7850.0; FIKO_KONTROL(std::abs(m.kutleKg(1e6) - 7.85) < 1e-9); // 1 dm³ çelik = 7.85 kg } FIKO_TEST(malzeme_atama_coz) { MalzemeAtama a; FIKO_KONTROL(a.bosMu() && a.coz(5, 0) == 0); a.govdeyeAta(5, 100); FIKO_KONTROL(a.coz(5, 0) == 100 && a.coz(5, 7) == 100); // yüz ataması yoksa gövde a.yuzeAta(5, 7, 200); FIKO_KONTROL(a.coz(5, 7) == 200 && a.coz(5, 8) == 100); // yüz gövdeyi ezer FIKO_KONTROL(a.govdeSayi() == 1 && a.yuzSayi() == 1); a.yuzeAta(5, 7, 0); FIKO_KONTROL(a.coz(5, 7) == 100 && a.yuzSayi() == 0); a.govdeyeAta(5, 0); FIKO_KONTROL(a.bosMu()); FIKO_KONTROL(a.coz(0, 0) == 0); a.govdeyeAta(0, 100); // gövde 0 geçersiz FIKO_KONTROL(a.bosMu()); } FIKO_TEST(malzeme_atama_temizlik) { MalzemeAtama a; a.govdeyeAta(1, 10); a.yuzeAta(1, 2, 20); a.yuzeAta(1, 3, 10); a.govdeyeAta(2, 10); a.yuzeAta(2, 4, 30); FIKO_KONTROL(a.govdeninYuzleri(1).size() == 2 && a.govdeninYuzleri(1)[0].first == 2); a.yuzleriTemizle(1); FIKO_KONTROL(a.coz(1, 2) == 10 && a.govdeninYuzleri(1).empty()); // gövde ataması kalır a.govdeyiTemizle(1); FIKO_KONTROL(a.coz(1, 2) == 0 && a.coz(2, 4) == 30 && a.govdeSayi() == 1 && a.yuzSayi() == 1); a.malzemeyiKaldir(10); FIKO_KONTROL(a.govdeSayi() == 0 && a.coz(2, 4) == 30); a.malzemeyiKaldir(30); FIKO_KONTROL(a.bosMu()); } FIKO_TEST(malzeme_atama_surum) { MalzemeAtama a; const u32 s0 = a.surum(); a.govdeyeAta(1, 5); FIKO_KONTROL(a.surum() > s0); const u32 s1 = a.surum(); a.yuzeAta(1, 2, 6); FIKO_KONTROL(a.surum() > s1); } FIKO_TEST(malzeme_atama_anahtar_carpismaz) { // (govde<<32)|yuz — govde 1/yuz 2 ile govde 2/yuz 1 karışmamalı FIKO_KONTROL(MalzemeAtama::yuzAnahtar(1, 2) != MalzemeAtama::yuzAnahtar(2, 1)); MalzemeAtama a; a.yuzeAta(1, 2, 11); a.yuzeAta(2, 1, 22); FIKO_KONTROL(a.coz(1, 2) == 11 && a.coz(2, 1) == 22); }