#pragma once // Doğrudan Modelleme gizmo görsel dili (futuristik). Merkezi glow halka/çizgi + // framerate-bağımsız hover animasyonu. push_pull, kenar_fillet ve gelecek gizmolar // paylaşır (CLAUDE.md: merkezi utility). Saf ImDrawList — shader yok, 60 FPS. // Efektler AyarSistemi'nden kapatılabilir olmalı (çağıran kontrol eder). #include #include "dogrudan_ayar.hpp" #include "fiko/sahne/sahne.hpp" #include "imgui.h" namespace fiko::gizmo { // Glow alfasını ayardaki şiddetle ölçekle (0..255 kırp). inline ImU32 glowAlfa(float taban) { float a = taban * dogrudanAyar().glowGuc; a = a < 0.0f ? 0.0f : (a > 255.0f ? 255.0f : a); return (ImU32)a; } // accent rengiyle 3-katman glow halka (dıştan içe alfa azalır). "Neyin tıklanabilir/ // aktif olduğunu ışıkla anlat" — sci-fi HUD çekirdeği. Shader gerekmez. inline void glowDaire(ImDrawList* dl, ImVec2 m, float r, ImU32 renk) { for (int i = 3; i >= 1; --i) { const float o = i * 2.0f; dl->AddCircle(m, r + o, (renk & 0x00FFFFFFu) | (glowAlfa(22.0f * i) << 24), 0, 1.6f); } } // Çizgi boyunca glow: kalın soluk alt katman + parlak üst → "neon" his. inline void glowCizgi(ImDrawList* dl, ImVec2 a, ImVec2 b, ImU32 renk, float kal) { dl->AddLine(a, b, (renk & 0x00FFFFFFu) | (glowAlfa(60.0f) << 24), kal + 4.0f); dl->AddLine(a, b, (renk & 0x00FFFFFFu) | (glowAlfa(120.0f) << 24), kal + 2.0f); dl->AddLine(a, b, renk, kal); } // Üstel yaklaşım (framerate-bağımsız). Hover değeri 0↔1 hedefe yumuşak gider (hiz~12). inline float animYaklas(float simdi, float hedef, float hiz, float dt) { return simdi + (hedef - simdi) * (1.0f - std::exp(-hiz * dt)); } // Canlı değer etiketi: cam-morfik pill (yarı-saydam koyu zemin + accent kenarlık + iç // vurgu). Gizmo sürüklerken ölçü/yarıçap gösterir — futuristik "HUD" hissi, mono okunur. // kok = imleç/gizmo noktası; etiket sağ-üstüne yerleşir. inline void degerEtiketi(ImDrawList* dl, ImVec2 kok, const char* metin, ImU32 accent) { const ImVec2 ts = ImGui::CalcTextSize(metin); const ImVec2 a{kok.x + 12.0f, kok.y - ts.y - 6.0f}; const ImVec2 b{kok.x + 20.0f + ts.x, kok.y + 6.0f}; dl->AddRectFilled(a, b, IM_COL32(14, 18, 26, 232), 5.0f); // cam zemin dl->AddRect(a, b, (accent & 0x00FFFFFFu) | (70u << 24), 6.0f, 0, 3.0f); // dış glow dl->AddRect(a, b, (accent & 0x00FFFFFFu) | (200u << 24), 5.0f, 0, 1.4f); // accent kenar dl->AddText({a.x + 6.0f, a.y + 5.0f}, IM_COL32(236, 245, 255, 255), metin); } // ---- Kesit-farkında dünya segmenti (2B gizmo konturları) -------------------- // 2B gizmo çizgileri ImDrawList'e projeksiyonla basılır → ne derinlik testi ne de // shader clip'i görürler. Kesit aktifken seçili yüzün konturu KIRPILAN yarıda da // çizilirdi ("yüzey yarım ama edge'i bütün"). Segmenti aktif kesit yarı-uzaylarına // parametrik kırpar (Liang–Barsky yarı-uzay kalıbı): görünen [t0,t1] parçası kalır. // Kesit yoksa segment aynen geçer (eski davranış birebir). // Döner: false = segment tümüyle kırpıldı (çizme). inline bool kesitSegment(const Sahne& sahne, Vec3f& a, Vec3f& b) { const auto& duz = sahne.kirpDuzlemleri(); if (duz.empty()) return true; const Vec3f a0 = a, yon = b - a; float t0 = 0.0f, t1 = 1.0f; for (const auto& k : duz) { // Görünürlük: dot(p,n)+d >= 0. f(t) = f0 + t·fd → tutulan aralığı daralt. const float f0 = a0.x * k.normal.x + a0.y * k.normal.y + a0.z * k.normal.z + k.d; const float fd = yon.x * k.normal.x + yon.y * k.normal.y + yon.z * k.normal.z; if (std::fabs(fd) < 1e-9f) { // düzleme paralel → tümü aynı yarıda if (f0 < -Sahne::kKirpTol) return false; continue; } const float t = -f0 / fd; if (fd > 0.0f) t0 = t0 > t ? t0 : t; // t t1) return false; // görünen parça yok } b = a0 + yon * t1; a = a0 + yon * t0; return true; } } // namespace fiko::gizmo