feat: add click to select
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user