24#ifndef PXR_IMAGING_HDX_PICK_TASK_H
25#define PXR_IMAGING_HDX_PICK_TASK_H
28#include "pxr/imaging/hdx/api.h"
30#include "pxr/imaging/hdSt/textureUtils.h"
31#include "pxr/imaging/hd/dataSource.h"
32#include "pxr/imaging/hd/enums.h"
34#include "pxr/imaging/hd/renderPass.h"
35#include "pxr/imaging/hd/renderPassState.h"
36#include "pxr/imaging/hd/rprimCollection.h"
37#include "pxr/imaging/hd/task.h"
46#include "pxr/usd/sdf/path.h"
51PXR_NAMESPACE_OPEN_SCOPE
53#define HDX_PICK_TOKENS \
58 (pickPrimsAndInstances) \
62 (pickPointsAndInstances) \
65 (resolveNearestToCamera) \
66 (resolveNearestToCenter) \
72class HdStRenderBuffer;
74using HdStShaderCodeSharedPtr = std::shared_ptr<class HdStShaderCode>;
84 : cullStyle(HdCullStyleNothing)
85 , enableSceneMaterials(
true)
88 HdCullStyle cullStyle;
89 bool enableSceneMaterials;
116 inline bool IsValid()
const {
121 size_t GetHash()
const;
124using HdxPickHitVector = std::vector<HdxPickHit>;
195 const TfToken &nameInPrimOrigin =
196 HdPrimOriginSchemaTokens->scenePath)
const;
236 using DepthMaskCallback = std::function<void(
void)>;
239 : resolution(128, 128)
240 , pickTarget(HdxPickTokens->pickPrimsAndInstances)
241 , resolveMode(HdxPickTokens->resolveNearestToCamera)
242 , doUnpickablesOcclude(
false)
244 , projectionMatrix(1)
246 , depthMaskCallback(
nullptr)
254 bool doUnpickablesOcclude;
257 std::vector<GfVec4d> clipPlanes;
258 DepthMaskCallback depthMaskCallback;
260 HdxPickHitVector *outHits;
288 HdDirtyBits* dirtyBits)
override;
304 return (int32_t(idColor[0] & 0xff) << 0) |
305 (int32_t(idColor[1] & 0xff) << 8) |
306 (int32_t(idColor[2] & 0xff) << 16) |
307 (int32_t(idColor[3] & 0xff) << 24);
320 void _InitIfNeeded();
321 void _CreateAovBindings();
322 void _CleanupAovBindings();
323 void _ResizeOrCreateBufferForAOV(
326 void _ConditionStencilWithGLCallback(
327 HdxPickTaskContextParams::DepthMaskCallback maskCallback,
330 bool _UseOcclusionPass()
const;
331 bool _UseWidgetPass()
const;
334 HdStTextureUtils::AlignedBuffer<T>
335 _ReadAovBuffer(
TfToken const & aovName)
const;
341 HdRenderPassSharedPtr _pickableRenderPass;
342 HdRenderPassSharedPtr _occluderRenderPass;
343 HdRenderPassSharedPtr _widgetRenderPass;
347 HdRenderPassStateSharedPtr _pickableRenderPassState;
348 HdRenderPassStateSharedPtr _occluderRenderPassState;
349 HdRenderPassStateSharedPtr _widgetRenderPassState;
353 std::vector<std::unique_ptr<HdStRenderBuffer>> _pickableAovBuffers;
354 HdRenderPassAovBindingVector _pickableAovBindings;
356 size_t _pickableDepthIndex;
358 std::unique_ptr<HdStRenderBuffer> _widgetDepthStencilBuffer;
359 HdRenderPassAovBindingVector _widgetAovBindings;
389 int const* instanceIds,
390 int const* elementIds,
438 bool _ResolveHit(
int index,
int x,
int y,
float z,
HdxPickHit* hit)
const;
440 size_t _GetHash(
int index)
const;
441 bool _IsValidHit(
int index)
const;
445 int _GetPrimId(
int index)
const {
446 return _primIds ? _primIds[index] : -1;
448 int _GetInstanceId(
int index)
const {
449 return _instanceIds ? _instanceIds[index] : -1;
451 int _GetElementId(
int index)
const {
452 return _elementIds ? _elementIds[index] : -1;
454 int _GetEdgeId(
int index)
const {
455 return _edgeIds ? _edgeIds[index] : -1;
457 int _GetPointId(
int index)
const {
458 return _pointIds ? _pointIds[index] : -1;
464 GfVec3f _GetNormal(
int index)
const;
467 int const* _instanceIds;
468 int const* _elementIds;
470 int const* _pointIds;
472 float const* _depths;
513PXR_NAMESPACE_CLOSE_SCOPE
Provide architecture-specific memory-alignment information.
Stores a 4x4 matrix of double elements.
Basic type for a vector of 2 float components.
Basic type for a vector of 2 int components.
Basic type for a vector of 3 float components.
Basic type for a vector of 4 int components.
A render buffer is a handle to a data resource that can be rendered into, such as a 2d image for a dr...
The Hydra render index is a flattened representation of the client scene graph, which may be composed...
A named, semantic collection of objects.
Adapter class providing data exchange with the client scene graph.
A set of rendering parameters used among render passes.
A utility class for resolving ID buffers into hits.
HDX_API void ResolveUnique(HdxPickHitVector *allHits) const
Return the set of unique hit points, keeping only the nearest depth value.
HDX_API void ResolveNearestToCenter(HdxPickHitVector *allHits) const
Return the nearest single hit point from the center of the viewport.
HDX_API bool IsValid() const
Return whether the result was given well-formed parameters.
HDX_API void ResolveAll(HdxPickHitVector *allHits) const
Return all hit points.
HDX_API void ResolveNearestToCamera(HdxPickHitVector *allHits) const
Return the nearest single hit point.
A task for running picking queries against the current scene.
static int DecodeIDRenderColor(unsigned char const idColor[4])
Utility: Given a UNorm8Vec4 pixel, unpack it into an int32 ID.
HDX_API void Sync(HdSceneDelegate *delegate, HdTaskContext *ctx, HdDirtyBits *dirtyBits) override
Sync the render pass resources.
HDX_API void Prepare(HdTaskContext *ctx, HdRenderIndex *renderIndex) override
Prepare the pick task.
HDX_API void Execute(HdTaskContext *ctx) override
Execute the pick task.
Hydra Graphics Interface.
A path value used to locate objects in layers or scenegraphs.
bool IsEmpty() const noexcept
Returns true if this is the empty path (SdfPath::EmptyPath()).
Token for efficient comparison, assignment, and hashing of known strings.
Standard pointer typedefs.
GF_API std::ostream & operator<<(std::ostream &, const GfBBox3d &)
Output a GfBBox3d using the format [(range) matrix zeroArea].
#define TF_DECLARE_PUBLIC_TOKENS(...)
Macro to define public tokens.
A renderpass AOV represents a binding of some output of the rendering process to an output buffer.
Information about an instancer instancing a picked object (or an instancer instancing such an instanc...
HdContainerDataSourceHandle instancerPrimOrigin
The prim origin data source of the instancer.
HdContainerDataSourceHandle instancePrimOrigin
The prim origin data source of the picked (implicit) instance.
int instanceId
Index of the picked instance.
SdfPath instanceSceneIndexPath
For implicit instancing (native instancing in USD), the path of the picked instance in the scene inde...
SdfPath instancerSceneIndexPath
The path of the instancer in the scene index.
float normalizedDepth
normalizedDepth is in the range [0,1].
SdfPath delegateId
delegateID of HdSceneDelegate that provided the picked prim.
SdfPath objectId
Path computed from scenePath's in primOrigin data source of picked prim and instancers if provided by...
SdfPath instancerId
Only supported for scene delegates, see HdxPrimOriginInfo for scene indices.
Pick task context params.
A helper to extract information about the picked prim that allows modern applications to identify a p...
HdContainerDataSourceHandle primOrigin
The prim origin data source for the picked prim if provided by the scene index.
std::vector< HdxInstancerContext > instancerContexts
Information about the instancers instancing the picked object.
static HDX_API HdxPrimOriginInfo FromPickHit(HdRenderIndex *renderIndex, const HdxPickHit &hit)
Query terminal scene index of render index for information about picked prim.
HDX_API SdfPath GetFullPath(const TfToken &nameInPrimOrigin=HdPrimOriginSchemaTokens->scenePath) const
Combines instance scene paths and prim scene path to obtain the full scene path.
std::vector< TfToken > TfTokenVector
Convenience types.