refactor: extract viewport object id picker
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
#include "IViewportHostService.h"
|
||||
#include "SceneViewportPicker.h"
|
||||
#include "SceneViewportCameraController.h"
|
||||
#include "ViewportObjectIdPicker.h"
|
||||
#include "ViewportHostSurfaceUtils.h"
|
||||
#include "UI/ImGuiBackendBridge.h"
|
||||
|
||||
@@ -15,7 +16,6 @@
|
||||
#include <XCEngine/RHI/RHIEnums.h>
|
||||
#include <XCEngine/RHI/RHIResourceView.h>
|
||||
#include <XCEngine/RHI/RHITexture.h>
|
||||
#include <XCEngine/Rendering/ObjectIdEncoding.h>
|
||||
#include <XCEngine/Rendering/Passes/BuiltinInfiniteGridPass.h>
|
||||
#include <XCEngine/Rendering/Passes/BuiltinSceneViewPostPassPlan.h>
|
||||
#include <XCEngine/Rendering/Passes/BuiltinObjectIdOutlinePass.h>
|
||||
@@ -876,46 +876,34 @@ private:
|
||||
const ImVec2& viewportSize,
|
||||
const ImVec2& viewportMousePosition,
|
||||
uint64_t& outEntityId) {
|
||||
outEntityId = 0;
|
||||
|
||||
if (m_device == nullptr ||
|
||||
m_sceneViewLastRenderContext.commandQueue == nullptr ||
|
||||
entry.objectIdTexture == nullptr ||
|
||||
!entry.hasValidObjectIdFrame ||
|
||||
viewportSize.x <= 1.0f ||
|
||||
viewportSize.y <= 1.0f ||
|
||||
viewportMousePosition.x < 0.0f ||
|
||||
viewportMousePosition.y < 0.0f ||
|
||||
viewportMousePosition.x > viewportSize.x ||
|
||||
viewportMousePosition.y > viewportSize.y) {
|
||||
if (m_device == nullptr) {
|
||||
outEntityId = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
auto* commandQueue =
|
||||
m_sceneViewLastRenderContext.commandQueue;
|
||||
if (commandQueue == nullptr) {
|
||||
return false;
|
||||
}
|
||||
ViewportObjectIdPickContext pickContext = {};
|
||||
pickContext.commandQueue = m_sceneViewLastRenderContext.commandQueue;
|
||||
pickContext.texture = entry.objectIdTexture;
|
||||
pickContext.textureState = entry.objectIdState;
|
||||
pickContext.textureWidth = entry.width;
|
||||
pickContext.textureHeight = entry.height;
|
||||
pickContext.hasValidFrame = entry.hasValidObjectIdFrame;
|
||||
pickContext.viewportSize = viewportSize;
|
||||
pickContext.viewportMousePosition = viewportMousePosition;
|
||||
|
||||
const uint32_t pixelX = ClampViewportPixelCoordinate(viewportMousePosition.x, entry.width);
|
||||
const uint32_t pixelY = ClampViewportPixelCoordinate(viewportMousePosition.y, entry.height);
|
||||
std::array<uint8_t, 4> rgba = {};
|
||||
if (!m_device->ReadTexturePixelRGBA8(
|
||||
commandQueue,
|
||||
entry.objectIdTexture,
|
||||
entry.objectIdState,
|
||||
pixelX,
|
||||
pixelY,
|
||||
rgba)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
outEntityId = static_cast<uint64_t>(Rendering::DecodeObjectIdFromColor(
|
||||
rgba[0],
|
||||
rgba[1],
|
||||
rgba[2],
|
||||
rgba[3]));
|
||||
return true;
|
||||
return TryPickViewportObjectIdEntity(
|
||||
pickContext,
|
||||
[this](const ViewportObjectIdReadbackRequest& request, std::array<uint8_t, 4>& outRgba) {
|
||||
return m_device != nullptr &&
|
||||
m_device->ReadTexturePixelRGBA8(
|
||||
request.commandQueue,
|
||||
request.texture,
|
||||
request.textureState,
|
||||
request.pixelX,
|
||||
request.pixelY,
|
||||
outRgba);
|
||||
},
|
||||
outEntityId);
|
||||
}
|
||||
|
||||
void DestroyViewportResources(ViewportEntry& entry) {
|
||||
|
||||
Reference in New Issue
Block a user