refactor: formalize scene viewport object-id picking
This commit is contained in:
@@ -4,7 +4,6 @@
|
||||
#include "Core/ISceneManager.h"
|
||||
#include "Core/ISelectionManager.h"
|
||||
#include "IViewportHostService.h"
|
||||
#include "SceneViewportPicker.h"
|
||||
#include "SceneViewportCameraController.h"
|
||||
#include "ViewportHostRenderFlowUtils.h"
|
||||
#include "ViewportHostRenderTargets.h"
|
||||
@@ -159,27 +158,20 @@ public:
|
||||
return 0;
|
||||
}
|
||||
|
||||
const Components::Scene* scene = context.GetSceneManager().GetScene();
|
||||
if (scene == nullptr) {
|
||||
if (context.GetSceneManager().GetScene() == nullptr) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
ViewportEntry& entry = GetEntry(EditorViewportKind::Scene);
|
||||
uint64_t objectIdEntity = 0;
|
||||
if (TryPickSceneViewEntityWithObjectId(
|
||||
const ViewportObjectIdPickResult objectIdPick =
|
||||
PickSceneViewEntityWithObjectId(
|
||||
entry,
|
||||
viewportSize,
|
||||
viewportMousePosition,
|
||||
objectIdEntity)) {
|
||||
return objectIdEntity;
|
||||
viewportMousePosition);
|
||||
if (objectIdPick.status == ViewportObjectIdPickStatus::ReadbackFailed) {
|
||||
SetViewportStatusIfEmpty(entry.statusText, "Scene object id readback failed");
|
||||
}
|
||||
|
||||
SceneViewportPickRequest request = {};
|
||||
request.scene = scene;
|
||||
request.overlay = GetSceneViewOverlayData();
|
||||
request.viewportSize = Math::Vector2(viewportSize.x, viewportSize.y);
|
||||
request.viewportPosition = Math::Vector2(viewportMousePosition.x, viewportMousePosition.y);
|
||||
return PickSceneViewportEntity(request).entityId;
|
||||
return objectIdPick.entityId;
|
||||
}
|
||||
|
||||
void AlignSceneViewToOrientationAxis(SceneViewportOrientationAxis axis) override {
|
||||
@@ -576,14 +568,12 @@ private:
|
||||
targets.hasValidObjectIdFrame = false;
|
||||
}
|
||||
|
||||
bool TryPickSceneViewEntityWithObjectId(
|
||||
ViewportObjectIdPickResult PickSceneViewEntityWithObjectId(
|
||||
ViewportEntry& entry,
|
||||
const ImVec2& viewportSize,
|
||||
const ImVec2& viewportMousePosition,
|
||||
uint64_t& outEntityId) {
|
||||
const ImVec2& viewportMousePosition) {
|
||||
if (m_device == nullptr) {
|
||||
outEntityId = 0;
|
||||
return false;
|
||||
return {};
|
||||
}
|
||||
|
||||
ViewportObjectIdPickContext pickContext = {};
|
||||
@@ -596,7 +586,7 @@ private:
|
||||
pickContext.viewportSize = viewportSize;
|
||||
pickContext.viewportMousePosition = viewportMousePosition;
|
||||
|
||||
return TryPickViewportObjectIdEntity(
|
||||
return PickViewportObjectIdEntity(
|
||||
pickContext,
|
||||
[this](const ViewportObjectIdReadbackRequest& request, std::array<uint8_t, 4>& outRgba) {
|
||||
return m_device != nullptr &&
|
||||
@@ -607,8 +597,7 @@ private:
|
||||
request.pixelX,
|
||||
request.pixelY,
|
||||
outRgba);
|
||||
},
|
||||
outEntityId);
|
||||
});
|
||||
}
|
||||
|
||||
UI::ImGuiBackendBridge* m_backend = nullptr;
|
||||
|
||||
Reference in New Issue
Block a user