#include "fiko/dokum/voxel_kafes.hpp" #include #include namespace fiko::dokum { // kur() ile TEK KAYNAK: payı burada da (1+2·pay) olarak uygula — ikisi ayrışırsa // önerilen çözünürlük sessizce yanlış olur. static f64 payliEnUzun(const Aabbd& parcaSinir, f64 pay) { if (!parcaSinir.gecerliMi()) return 0.0; const Vec3d bo = parcaSinir.boyut(); const f64 enUzun = std::max({bo.x, bo.y, bo.z}); if (!(enUzun > 0) || !std::isfinite(enUzun)) return 0.0; return enUzun * (1.0 + 2.0 * std::max(pay, 0.0)); } f64 VoxelKafes::hCozunurlukten(const Aabbd& parcaSinir, u32 enUzunHucre, f64 pay) { const f64 uzun = payliEnUzun(parcaSinir, pay); if (!(uzun > 0) || enUzunHucre == 0) return 0.0; return uzun / static_cast(enUzunHucre); } u32 VoxelKafes::cozunurlukHedefH(const Aabbd& parcaSinir, f64 hHedef, f64 pay) { const f64 uzun = payliEnUzun(parcaSinir, pay); if (!(uzun > 0) || !(hHedef > 0) || !std::isfinite(hHedef)) return 0; const f64 res = std::ceil(uzun / hHedef); if (!std::isfinite(res) || res < 1.0) return 1; // u32 taşmasına karşı tavan (çağıran zaten maliyeti ∝ res³ ile sınırlar). return res > 1e6 ? 1000000u : static_cast(res); } bool VoxelKafes::kur(const Aabbd& sinir, u32 enUzunHucre, f64 pay, f64 birimOlcek) { // GOTCHA (MEMORY): geçersiz bbox → NaN. Guard: asgari 0) || !(bo.y > 0) || !(bo.z > 0) || !std::isfinite(bo.x) || !std::isfinite(bo.y) || !std::isfinite(bo.z)) { nx_ = ny_ = nz_ = 0; return false; } // Kalıp payı: AABB'yi her yönde büyüt (yarı-sonsuz kalıp emici sınır bölgesi). const Vec3d p = bo * std::max(pay, 0.0); const Vec3d amin = sinir.asgari - p; const Vec3d amax = sinir.azami + p; bo = amax - amin; const f64 enUzun = std::max({bo.x, bo.y, bo.z}); hMesh_ = enUzun / static_cast(enUzunHucre); birimOlcek_ = (birimOlcek > 0 && std::isfinite(birimOlcek)) ? birimOlcek : 1.0; if (!(hMesh_ > 0) || !std::isfinite(hMesh_)) { nx_ = ny_ = nz_ = 0; return false; } nx_ = std::max(1, static_cast(std::ceil(bo.x / hMesh_))); ny_ = std::max(1, static_cast(std::ceil(bo.y / hMesh_))); nz_ = std::max(1, static_cast(std::ceil(bo.z / hMesh_))); kok_ = amin; sinir_ = Aabbd{}; sinir_.genislet(amin); sinir_.genislet(amax); sinirHam_ = sinir; // paysız parça sınırı (görsel kırpma referansı) const u32 n = hucreSayi(); T.assign(n, 0.0); H.assign(n, 0.0); fs.assign(n, 0.0); tip.assign(n, HucreTip::Dis); return true; } } // namespace fiko::dokum