refactor: formalize scene viewport object-id picking

This commit is contained in:
2026-04-02 15:23:25 +08:00
parent 617b11f801
commit a5d2058818
3 changed files with 119 additions and 31 deletions

View File

@@ -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;