// fiko.malzeme.* Lua bağlama katmanı — malzeme kütüphanesi + gövde/yüz ataması. // Mimari kural: her sistem doğuştan makro + plugin + olay erişilebilir. // Kütüphane/atama BELGE verisidir → uygulama `malzemeAyarla` ile bağlar; bağlı // değilse tüm fonksiyonlar nil döner (fiko.cam.* kalıbı). #include "fiko/betik/makro_motor.hpp" #include "fiko/malzeme/malzeme.hpp" extern "C" { #include "lauxlib.h" #include "lua.h" } namespace fiko::betik { namespace { using namespace fiko::malzeme; // Lua tablosundan opsiyonel sayı: yoksa mevcut değer korunur. void sayiAl(lua_State* L, const char* ad, f32& hedef) { lua_getfield(L, -1, ad); if (lua_isnumber(L, -1)) hedef = (f32)lua_tonumber(L, -1); lua_pop(L, 1); } void sayiAl64(lua_State* L, const char* ad, f64& hedef) { lua_getfield(L, -1, ad); if (lua_isnumber(L, -1)) hedef = (f64)lua_tonumber(L, -1); lua_pop(L, 1); } // {r,g,b} ya da {0.1,0.2,0.3} biçiminde renk. void renkAl(lua_State* L, const char* ad, Vec3f& hedef) { lua_getfield(L, -1, ad); if (lua_istable(L, -1)) { f32 v[3] = {hedef.x, hedef.y, hedef.z}; for (int i = 0; i < 3; ++i) { lua_rawgeti(L, -1, i + 1); if (lua_isnumber(L, -1)) v[i] = (f32)lua_tonumber(L, -1); lua_pop(L, 1); } hedef = {v[0], v[1], v[2]}; } lua_pop(L, 1); } void boolAl(lua_State* L, const char* ad, bool& hedef) { lua_getfield(L, -1, ad); if (lua_isboolean(L, -1)) hedef = lua_toboolean(L, -1) != 0; lua_pop(L, 1); } void tanimTablosu(lua_State* L, const MalzemeTanim& m) { lua_createtable(L, 0, 18); const auto alan = [L](const char* ad, f64 v) { lua_pushnumber(L, v); lua_setfield(L, -2, ad); }; lua_pushinteger(L, m.kimlik); lua_setfield(L, -2, "kimlik"); lua_pushstring(L, m.ad.c_str()); lua_setfield(L, -2, "ad"); lua_pushstring(L, sinifAdi(m.sinif)); lua_setfield(L, -2, "sinif"); lua_pushboolean(L, m.hazir ? 1 : 0); lua_setfield(L, -2, "hazir"); lua_createtable(L, 3, 0); lua_pushnumber(L, m.tabanRenk.x); lua_rawseti(L, -2, 1); lua_pushnumber(L, m.tabanRenk.y); lua_rawseti(L, -2, 2); lua_pushnumber(L, m.tabanRenk.z); lua_rawseti(L, -2, 3); lua_setfield(L, -2, "taban"); alan("opaklik", m.opaklik); alan("metaliklik", m.metaliklik); alan("puruzluluk", m.puruzluluk); alan("yansima", m.yansima); alan("anizotropi", m.anizotropi); alan("kaplamaBerrak", m.kaplamaBerrak); alan("gecirgenlik", m.gecirgenlik); alan("kirilmaIndisi", m.kirilmaIndisi); alan("emisyonSiddet", m.emisyonSiddet); alan("yogunluk", m.yogunluk); alan("dokuOlcek", m.dokuOlcek.x); } } // namespace int MakroMotor::l_malzemeListe(lua_State* L) { MakroMotor* m = kendisi(L); if (!m->malzemeKut_) { lua_pushnil(L); return 1; } const auto& hepsi = m->malzemeKut_->hepsi(); lua_createtable(L, (int)hepsi.size(), 0); int i = 1; for (const MalzemeTanim& t : hepsi) { tanimTablosu(L, t); lua_rawseti(L, -2, i++); } return 1; } int MakroMotor::l_malzemeBul(lua_State* L) { MakroMotor* m = kendisi(L); if (!m->malzemeKut_) { lua_pushnil(L); return 1; } // Sayı = kimlik, dize = ad (Türkçe duyarsız ilk eşleşme). const MalzemeTanim* t = nullptr; if (lua_isnumber(L, 1)) { t = m->malzemeKut_->bul((u32)luaL_checkinteger(L, 1)); } else { const auto bulunan = m->malzemeKut_->ara(luaL_checkstring(L, 1)); if (!bulunan.empty()) t = m->malzemeKut_->bul(bulunan[0]); } if (!t) { lua_pushnil(L); return 1; } tanimTablosu(L, *t); return 1; } int MakroMotor::l_malzemeOlustur(lua_State* L) { MakroMotor* m = kendisi(L); if (!m->malzemeKut_) { lua_pushnil(L); return 1; } MalzemeTanim t; t.ad = luaL_optstring(L, 1, "Makro Malzemesi"); t.metaliklik = 0.0f; t.sinif = MalzemeSinif::Plastik; lua_pushinteger(L, m->malzemeKut_->ekle(std::move(t))); return 1; } int MakroMotor::l_malzemeAyarla(lua_State* L) { MakroMotor* m = kendisi(L); if (!m->malzemeKut_) { lua_pushnil(L); return 1; } MalzemeTanim* t = m->malzemeKut_->bul((u32)luaL_checkinteger(L, 1)); luaL_checktype(L, 2, LUA_TTABLE); if (!t || t->hazir) { lua_pushboolean(L, 0); return 1; } // hazır salt-okunur lua_pushvalue(L, 2); renkAl(L, "taban", t->tabanRenk); renkAl(L, "emisyon", t->emisyonRenk); renkAl(L, "emilim", t->emilimRenk); renkAl(L, "sacilma", t->sacilmaRenk); renkAl(L, "tuy", t->parlakTuyRenk); sayiAl(L, "opaklik", t->opaklik); sayiAl(L, "metaliklik", t->metaliklik); sayiAl(L, "puruzluluk", t->puruzluluk); sayiAl(L, "yansima", t->yansima); sayiAl(L, "ortme", t->ortmeSiddet); sayiAl(L, "anizotropi", t->anizotropi); sayiAl(L, "anizotropiAci", t->anizotropiAci); sayiAl(L, "kaplamaBerrak", t->kaplamaBerrak); sayiAl(L, "kaplamaPuruz", t->kaplamaPuruz); sayiAl(L, "gecirgenlik", t->gecirgenlik); sayiAl(L, "kalinlik", t->kalinlik); sayiAl(L, "kirilmaIndisi", t->kirilmaIndisi); sayiAl(L, "sacilmaSiddet", t->sacilmaSiddet); sayiAl(L, "emisyonSiddet", t->emisyonSiddet); sayiAl(L, "dokuDonus", t->dokuDonus); sayiAl(L, "kabartmaDerinlik", t->kabartmaDerinlik); sayiAl64(L, "yogunluk", t->yogunluk); boolAl(L, "dunyaUzayinda", t->dunyaUzayinda); f32 olcek = t->dokuOlcek.x; sayiAl(L, "dokuOlcek", olcek); if (olcek != t->dokuOlcek.x) t->dokuOlcek = {olcek, olcek, olcek}; lua_getfield(L, -1, "kaplama"); // 0..3 (triplanar/düzlemsel/silindirik/küresel) if (lua_isnumber(L, -1)) { const int k = (int)lua_tointeger(L, -1); if (k >= 0 && k <= 3) t->kaplama = (KaplamaTip)k; } lua_pop(L, 2); t->gecerliKil(); m->malzemeKut_->degisti(); lua_pushboolean(L, 1); return 1; } int MakroMotor::l_malzemeDoku(lua_State* L) { MakroMotor* m = kendisi(L); if (!m->malzemeKut_) { lua_pushnil(L); return 1; } MalzemeTanim* t = m->malzemeKut_->bul((u32)luaL_checkinteger(L, 1)); const int kanal = (int)luaL_checkinteger(L, 2); if (!t || t->hazir || kanal < 0 || kanal >= (int)DOKU_KANAL_SAYI) { lua_pushboolean(L, 0); return 1; } DokuKatman& d = t->dokular[kanal]; d.yol = luaL_optstring(L, 3, ""); // boş = kanalı kapat d.siddet = (f32)luaL_optnumber(L, 4, d.siddet); if (lua_isboolean(L, 5)) d.ters = lua_toboolean(L, 5) != 0; m->malzemeKut_->degisti(); lua_pushboolean(L, 1); return 1; } int MakroMotor::l_malzemeSil(lua_State* L) { MakroMotor* m = kendisi(L); if (!m->malzemeKut_ || !m->malzemeAta_) { lua_pushnil(L); return 1; } const u32 kimlik = (u32)luaL_checkinteger(L, 1); m->malzemeAta_->malzemeyiKaldir(kimlik); lua_pushboolean(L, m->malzemeKut_->sil(kimlik) ? 1 : 0); return 1; } int MakroMotor::l_malzemeAta(lua_State* L) { MakroMotor* m = kendisi(L); if (!m->malzemeAta_) { lua_pushnil(L); return 1; } const u32 govde = (u32)luaL_checkinteger(L, 1); const u32 yuz = (u32)luaL_optinteger(L, 2, 0); // 0 = tüm gövde const u32 malzeme = (u32)luaL_optinteger(L, 3, 0); // 0 = atamayı kaldır if (yuz) m->malzemeAta_->yuzeAta(govde, yuz, malzeme); else m->malzemeAta_->govdeyeAta(govde, malzeme); lua_pushboolean(L, 1); return 1; } int MakroMotor::l_malzemeCoz(lua_State* L) { MakroMotor* m = kendisi(L); if (!m->malzemeAta_) { lua_pushnil(L); return 1; } lua_pushinteger(L, m->malzemeAta_->coz((u32)luaL_checkinteger(L, 1), (u32)luaL_optinteger(L, 2, 0))); return 1; } } // namespace fiko::betik