feat: add click to select

This commit is contained in:
2026-10-23 20:53:56 +02:00
parent f055bdcbf1
commit f7e7c56392
20 changed files with 385 additions and 20 deletions
+45
View File
@@ -8,6 +8,7 @@
#include <destrum/FS/AssetFS.h>
#include <destrum/Graphics/Resources/FontCache.h>
#include <destrum/ObjectModel/GameObject.h>
#include <destrum/ObjectModel/Transform.h>
#include <destrum/Scene/Scene.h>
#include <destrum/Scene/SceneManager.h>
#include <destrum/Serialization/SceneSerializer.h>
@@ -234,6 +235,7 @@ if (!isRunning) break;
{
ZoneScopedN("Debug ImGui");
drawWindowsMenu();
applySelectionPick();
drawViewportWindow();
if (m_DebugWindows.inspector)
@@ -380,6 +382,7 @@ if (!isRunning) break;
{
ZoneScopedN("customDraw");
renderer.setSelectionPassEnabled(canPickInViewport());
customDraw();
}
@@ -549,10 +552,52 @@ void App::drawViewportWindow()
ImGui::SetCursorScreenPos(origin);
drawViewportOverlay();
requestSelectionPick();
ImGui::End();
}
void App::requestSelectionPick()
{
if (!canPickInViewport() || !viewportHovered || viewportMouseClaimed ||
!ImGui::IsMouseClicked(ImGuiMouseButton_Left))
{
return;
}
const ImVec2 mouse = ImGui::GetMousePos();
const glm::vec2 uv = (glm::vec2{mouse.x, mouse.y} - viewportRect.min) / viewportRect.size;
if (uv.x < 0.0f || uv.y < 0.0f || uv.x >= 1.0f || uv.y >= 1.0f)
{
return;
}
const VkExtent3D extent = renderer.getDrawImage().extent;
renderer.requestSelectionPick(glm::ivec2{uv * glm::vec2{static_cast<float>(extent.width), static_cast<float>(extent.height)}});
pickSelectsParent = ImGui::GetIO().KeyAlt;
}
void App::applySelectionPick()
{
const auto picked = renderer.takeSelectionPick();
auto& sceneManager = SceneManager::GetInstance();
if (!picked || sceneManager.GetActiveScenes().empty())
{
return;
}
Scene& scene = sceneManager.GetCurrentScene();
GameObject* object = scene.FindGameObject(*picked);
if (object != nullptr && pickSelectsParent)
{
if (const Transform* parent = object->GetTransform().GetParent(); parent != nullptr && parent->GetOwner() != nullptr)
{
object = parent->GetOwner();
}
}
scene.SetSelectedObject(object != nullptr ? object->GetId() : InvalidObjectId);
}
void App::applyViewportResize()
{
if (viewportDesiredSize.x <= 0 || viewportDesiredSize.y <= 0)