Skip to content

Commit

Permalink
Merge branch 'sultimt/selection-improvements' into 'main'
Browse files Browse the repository at this point in the history
[REMIX-2333] Object selection improvements

See merge request lightspeedrtx/dxvk-remix-nv!615
  • Loading branch information
sultim-t-nv committed Jan 18, 2024
2 parents f2a7da8 + 6200bcc commit d24a90c
Show file tree
Hide file tree
Showing 24 changed files with 1,173 additions and 392 deletions.
49 changes: 49 additions & 0 deletions public/include/remix/remix.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include <cstdint>
#include <cstring>
#include <filesystem>
#include <functional>
#include <optional>

#ifndef REMIXAPI_ASSERT
Expand Down Expand Up @@ -111,6 +112,13 @@ namespace remix {
const remixapi_ErrorCode m_status;
};

template< typename T >
struct Span
{
const T* values{ nullptr };
uint32_t count{ 0 };
};

template< typename T >
void assign_if(remixapi_Bool& hasvalue, T& value, const std::optional< T >& src) {
if (src) {
Expand All @@ -125,7 +133,11 @@ namespace remix {
template< typename T >
using Result = detail::Result< T >;

template< typename T >
using Span = detail::Span< T >;

using StructType = remixapi_StructType;
using Rect2D = remixapi_Rect2D;
using Float2D = remixapi_Float2D;
using Float3D = remixapi_Float3D;
using Float4D = remixapi_Float4D;
Expand Down Expand Up @@ -169,6 +181,12 @@ namespace remix {
remixapi_dxvk_CopyRenderingOutputType type);
Result< void > dxvk_SetDefaultOutput(remixapi_dxvk_CopyRenderingOutputType type,
const remixapi_Float4D& color);
// Object picking utils
template< typename CallbackLambda > // void( remix::Span<uint32_t> objectPickingValues )
Result< void > pick_RequestObjectPicking(const Rect2D& region, CallbackLambda &&callback);
Result< void > pick_HighlightObjects(const uint32_t* objectPickingValues_values,
uint32_t objectPickingValues_count,
uint8_t colorR, uint8_t colorG, uint8_t colorB);
};

namespace lib {
Expand Down Expand Up @@ -198,6 +216,8 @@ namespace remix {
REMIXAPI_VERSION_PATCH);
}

static_assert(sizeof remixapi_Interface == 152,
"Change version, update C++ wrapper when adding new functions");
remixapi_Interface interfaceInC = {};
remixapi_ErrorCode status = pfn_InitializeLibrary(&info, &interfaceInC);

Expand Down Expand Up @@ -738,4 +758,33 @@ namespace remix {
remixapi_dxvk_CopyRenderingOutputType type, const remixapi_Float4D& color) {
return m_CInterface.dxvk_SetDefaultOutput(type, color);
}

template< typename CallbackLambda >
inline Result< void > Interface::pick_RequestObjectPicking(const Rect2D& region, CallbackLambda&& callback) {
using Func = std::function< void(Span<uint32_t>) >;

static auto bootstrapForC = [](const uint32_t* objectPickingValues_values,
uint32_t objectPickingValues_count,
void* callbackUserData) {
// unwrap 'callbackUserData', it is a user's lambda
if (auto* userLambda = static_cast<Func*>(callbackUserData)) {
auto arg = Span<uint32_t>{ objectPickingValues_values, objectPickingValues_count };
// call user's lambda
(*userLambda)(arg);
delete userLambda;
}
};

// pass user's lambda as as 'callbackUserData'
auto* userLambda = new Func { callback };
return m_CInterface.pick_RequestObjectPicking(&region, bootstrapForC, userLambda);
}

inline Result< void > Interface::pick_HighlightObjects(const uint32_t* objectPickingValues_values,
uint32_t objectPickingValues_count,
uint8_t colorR, uint8_t colorG, uint8_t colorB) {
return m_CInterface.pick_HighlightObjects(objectPickingValues_values,
objectPickingValues_count,
colorR, colorG, colorB);
}
}
74 changes: 52 additions & 22 deletions public/include/remix/remix_c.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,13 @@ extern "C" {

typedef uint32_t remixapi_Bool;

typedef struct remixapi_Rect2D {
int32_t left;
int32_t top;
int32_t right;
int32_t bottom;
} remixapi_Rect2D;

typedef struct remixapi_Float2D {
float x;
float y;
Expand Down Expand Up @@ -338,7 +345,7 @@ extern "C" {
typedef struct remixapi_InstanceInfoObjectPickingEXT {
remixapi_StructType sType;
void* pNext;
// A value to write into REMIXAPI_DXVK_COPY_RENDERING_OUTPUT_TYPE_OBJECT_PICKING
// A value to write for 'RequestObjectPicking'
uint32_t objectPickingValue;
} remixapi_InstanceInfoObjectPickingEXT;

Expand Down Expand Up @@ -440,7 +447,7 @@ extern "C" {

typedef struct remixapi_LightInfoDomeEXT {
remixapi_StructType sType;
void* pNext;
void* pNext;
remixapi_Transform transform;
remixapi_Path colorTexture;
} remixapi_LightInfoDomeEXT;
Expand All @@ -461,12 +468,32 @@ extern "C" {


typedef remixapi_ErrorCode(REMIXAPI_PTR* PFN_remixapi_DrawLightInstance)(
remixapi_LightHandle lightHandle);
remixapi_LightHandle lightHandle);


typedef remixapi_ErrorCode(REMIXAPI_PTR* PFN_remixapi_SetConfigVariable)(
const char* key,
const char* value);
const char* key,
const char* value);

typedef void (REMIXAPI_PTR* PFN_remixapi_pick_RequestObjectPickingUserCallback)(
const uint32_t* objectPickingValues_values,
uint32_t objectPickingValues_count,
void* callbackUserData);

// Invokes 'callback' on a successful readback of 'remixapi_InstanceInfoObjectPickingEXT::objectPickingValue'
// of objects that are drawn in the 'pixelRegion'. 'pixelRegion' specified relative to the output size,
// not render size. 'callback' can be invoked from any thread.
typedef remixapi_ErrorCode(REMIXAPI_PTR* PFN_remixapi_pick_RequestObjectPicking)(
const remixapi_Rect2D* pixelRegion,
PFN_remixapi_pick_RequestObjectPickingUserCallback callback,
void* callbackUserData);

typedef remixapi_ErrorCode(REMIXAPI_PTR* PFN_remixapi_pick_HighlightObjects)(
const uint32_t* objectPickingValues_values,
uint32_t objectPickingValues_count,
uint8_t colorR,
uint8_t colorG,
uint8_t colorB);



Expand Down Expand Up @@ -509,24 +536,27 @@ extern "C" {
} remixapi_InitializeLibraryInfo;

typedef struct remixapi_Interface {
PFN_remixapi_Shutdown Shutdown;
PFN_remixapi_CreateMaterial CreateMaterial;
PFN_remixapi_DestroyMaterial DestroyMaterial;
PFN_remixapi_CreateMesh CreateMesh;
PFN_remixapi_DestroyMesh DestroyMesh;
PFN_remixapi_SetupCamera SetupCamera;
PFN_remixapi_DrawInstance DrawInstance;
PFN_remixapi_CreateLight CreateLight;
PFN_remixapi_DestroyLight DestroyLight;
PFN_remixapi_DrawLightInstance DrawLightInstance;
PFN_remixapi_SetConfigVariable SetConfigVariable;
PFN_remixapi_Shutdown Shutdown;
PFN_remixapi_CreateMaterial CreateMaterial;
PFN_remixapi_DestroyMaterial DestroyMaterial;
PFN_remixapi_CreateMesh CreateMesh;
PFN_remixapi_DestroyMesh DestroyMesh;
PFN_remixapi_SetupCamera SetupCamera;
PFN_remixapi_DrawInstance DrawInstance;
PFN_remixapi_CreateLight CreateLight;
PFN_remixapi_DestroyLight DestroyLight;
PFN_remixapi_DrawLightInstance DrawLightInstance;
PFN_remixapi_SetConfigVariable SetConfigVariable;
// DXVK interoperability
PFN_remixapi_dxvk_CreateD3D9 dxvk_CreateD3D9;
PFN_remixapi_dxvk_RegisterD3D9Device dxvk_RegisterD3D9Device;
PFN_remixapi_dxvk_GetExternalSwapchain dxvk_GetExternalSwapchain;
PFN_remixapi_dxvk_GetVkImage dxvk_GetVkImage;
PFN_remixapi_dxvk_CopyRenderingOutput dxvk_CopyRenderingOutput;
PFN_remixapi_dxvk_SetDefaultOutput dxvk_SetDefaultOutput;
PFN_remixapi_dxvk_CreateD3D9 dxvk_CreateD3D9;
PFN_remixapi_dxvk_RegisterD3D9Device dxvk_RegisterD3D9Device;
PFN_remixapi_dxvk_GetExternalSwapchain dxvk_GetExternalSwapchain;
PFN_remixapi_dxvk_GetVkImage dxvk_GetVkImage;
PFN_remixapi_dxvk_CopyRenderingOutput dxvk_CopyRenderingOutput;
PFN_remixapi_dxvk_SetDefaultOutput dxvk_SetDefaultOutput;
// Object picking utils
PFN_remixapi_pick_RequestObjectPicking pick_RequestObjectPicking;
PFN_remixapi_pick_HighlightObjects pick_HighlightObjects;
} remixapi_Interface;

REMIXAPI remixapi_ErrorCode REMIXAPI_CALL remixapi_InitializeLibrary(
Expand Down
Loading

0 comments on commit d24a90c

Please sign in to comment.