From c968e73f21464ed8ce5c7656b231b0b2cd5441b7 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Wed, 26 May 2021 11:11:21 -0400 Subject: [PATCH] Actor highlighting on selection --- Runtime/ImGuiConsole.cpp | 30 +++++++++++++++++++++++++++--- Runtime/World/CActor.cpp | 12 +++++++++++- Runtime/World/CActor.hpp | 4 ++++ 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/Runtime/ImGuiConsole.cpp b/Runtime/ImGuiConsole.cpp index a09588d91..ecf12f87c 100644 --- a/Runtime/ImGuiConsole.cpp +++ b/Runtime/ImGuiConsole.cpp @@ -120,6 +120,22 @@ static void ShowMenuGame() { } } +static void ImGuiStringViewText(std::string_view text) { + ImGui::TextUnformatted(text.begin(), text.end()); +} + +static void LerpActorColor(CActor* act) { + act->m_debugAddColorTime += 1.f / 60.f; + float lerp = act->m_debugAddColorTime; + if (lerp > 2.f) { + lerp = 0.f; + act->m_debugAddColorTime = 0.f; + } else if (lerp > 1.f) { + lerp = 2.f - lerp; + } + act->m_debugAddColor = zeus::CColor::lerp(zeus::skClear, zeus::skBlue, lerp); +} + static void ShowInspectWindow(bool* isOpen) { if (ImGui::Begin("Inspect", isOpen)) { if (ImGui::BeginTable("Entities", 4, @@ -167,13 +183,21 @@ static void ShowInspectWindow(bool* isOpen) { ImGui::PushID(uid.Value()); ImGui::TableNextRow(); if (ImGui::TableNextColumn()) { - ImGui::Text("%x", uid.Value()); + auto text = fmt::format(FMT_STRING("{:x}"), uid.Value()); + if (TCastToPtr act = item) { + ImGui::Selectable(text.c_str(), &act->m_debugSelected, ImGuiSelectableFlags_SpanAllColumns); + if (act->m_debugSelected) { + LerpActorColor(act); + } + } else { + ImGui::TextUnformatted(text.c_str()); + } } if (ImGui::TableNextColumn()) { - ImGui::Text("%s", item->ImGuiType().data()); + ImGuiStringViewText(item->ImGuiType()); } if (ImGui::TableNextColumn()) { - ImGui::Text("%s", item->GetName().data()); + ImGuiStringViewText(item->GetName()); } if (ImGui::TableNextColumn()) { if (ImGui::SmallButton("View")) { diff --git a/Runtime/World/CActor.cpp b/Runtime/World/CActor.cpp index 88cbf7061..d0d578059 100644 --- a/Runtime/World/CActor.cpp +++ b/Runtime/World/CActor.cpp @@ -221,6 +221,9 @@ void CActor::RenderInternal(const CStateManager& mgr) const { zeus::CColor mulColor(mulMag * xb4_drawFlags.x4_color.a(), xb4_drawFlags.x4_color.a()); zeus::CColor addColor(addMag, xb4_drawFlags.x4_color.a() / 4.f); + if (m_debugSelected) { + addColor += m_debugAddColor; + } x64_modelData->RenderThermal(x34_transform, mulColor, addColor, xb4_drawFlags); return; } else if (mgr.GetThermalColdScale2() > 0.00001f && !xb4_drawFlags.x0_blendMode) { @@ -231,11 +234,18 @@ void CActor::RenderInternal(const CStateManager& mgr) const { 1.f), 1.f); CModelFlags flags(2, xb4_drawFlags.x1_matSetIdx, xb4_drawFlags.x2_flags, color); + if (m_debugSelected) { + flags.addColor += m_debugAddColor; + } x64_modelData->Render(mgr, x34_transform, x90_actorLights.get(), flags); return; } } - x64_modelData->Render(which, x34_transform, x90_actorLights.get(), xb4_drawFlags); + CModelFlags flags = xb4_drawFlags; + if (m_debugSelected) { + flags.addColor += m_debugAddColor; + } + x64_modelData->Render(which, x34_transform, x90_actorLights.get(), flags); } bool CActor::IsModelOpaque(const CStateManager& mgr) const { diff --git a/Runtime/World/CActor.hpp b/Runtime/World/CActor.hpp index 58fc8873e..4ec0d4f84 100644 --- a/Runtime/World/CActor.hpp +++ b/Runtime/World/CActor.hpp @@ -83,6 +83,10 @@ protected: bool IsModelOpaque(const CStateManager& mgr) const; public: + bool m_debugSelected = false; + zeus::CColor m_debugAddColor = zeus::skClear; + float m_debugAddColorTime = 0.f; + enum class EFluidState { EnteredFluid, InFluid, LeftFluid }; enum class EScanState {