Loading...
Searching...
No Matches
pickTask.h
1//
2// Copyright 2019 Pixar
3//
4// Licensed under the terms set forth in the LICENSE.txt file available at
5// https://openusd.org/license.
6//
7#ifndef PXR_IMAGING_HDX_PICK_TASK_H
8#define PXR_IMAGING_HDX_PICK_TASK_H
9
10#include "pxr/pxr.h"
11#include "pxr/imaging/hdx/api.h"
12
13#include "pxr/imaging/hdSt/textureUtils.h"
14#include "pxr/imaging/hd/dataSource.h"
15#include "pxr/imaging/hd/enums.h"
17#include "pxr/imaging/hd/renderPass.h"
18#include "pxr/imaging/hd/renderPassState.h"
19#include "pxr/imaging/hd/rprimCollection.h"
20#include "pxr/imaging/hd/task.h"
21
22#include "pxr/base/arch/align.h"
25#include "pxr/base/gf/vec2i.h"
26#include "pxr/base/gf/vec2f.h"
27#include "pxr/base/gf/vec4i.h"
28#include "pxr/base/gf/vec4d.h"
29#include "pxr/usd/sdf/path.h"
30
31#include <vector>
32#include <memory>
33
34PXR_NAMESPACE_OPEN_SCOPE
35
36#define HDX_PICK_RESOLVE_MODE_TOKENS \
37 (resolveNearestToCamera) \
38 (resolveNearestToCenter) \
39 (resolveUnique) \
40 (resolveAll) \
41 (resolveDeep)
42
44 HdxPickResolveModeTokens, HDX_API, HDX_PICK_RESOLVE_MODE_TOKENS);
45
46#define HDX_PICK_TOKENS \
47 /* Task context */ \
48 (pickParams) \
49 \
50 /* Pick target */ \
51 (pickPrimsAndInstances) \
52 (pickFaces) \
53 (pickEdges) \
54 (pickPoints) \
55 (pickPointsAndInstances) \
56 \
57 HDX_PICK_RESOLVE_MODE_TOKENS
58
60 HdxPickTokens, HDX_API, HDX_PICK_TOKENS);
61
62class HdStRenderBuffer;
64using HdStShaderCodeSharedPtr = std::shared_ptr<class HdStShaderCode>;
65
66class Hgi;
67
72{
74 : cullStyle(HdCullStyleNothing)
75 {}
76
77 HdCullStyle cullStyle;
78};
79
83{
99 int instanceIndex;
100 int elementIndex;
101 int edgeIndex;
102 int pointIndex;
103 GfVec3d worldSpaceHitPoint;
104 GfVec3f worldSpaceHitNormal;
108
109 inline bool IsValid() const {
110 return !objectId.IsEmpty();
111 }
112
113 HDX_API
114 size_t GetHash() const;
115};
116
117using HdxPickHitVector = std::vector<HdxPickHit>;
118
153
172{
174 HDX_API
175 static HdxPrimOriginInfo
176 FromPickHit(HdSceneIndexBaseRefPtr const &terminalSceneIndex,
177 const HdxPickHit &hit);
178
183 HDX_API
184 static HdxPrimOriginInfo
186 const HdxPickHit &hit);
187
191 HDX_API
192 static std::vector<HdxPrimOriginInfo>
193 FromPickHits(HdSceneIndexBaseRefPtr const &terminalSceneIndex,
194 const std::vector<HdxPickHit> &hits);
195
202 HDX_API
203 static std::vector<HdxPrimOriginInfo>
205 const std::vector<HdxPickHit> &hits);
206
213 HDX_API
215 const TfToken &nameInPrimOrigin =
216 HdPrimOriginSchemaTokens->scenePath) const;
217
224 HDX_API
225 HdInstancerContext ComputeInstancerContext(
226 const TfToken &nameInPrimOrigin =
227 HdPrimOriginSchemaTokens->scenePath) const;
228
231 std::vector<HdxInstancerContext> instancerContexts;
234 HdContainerDataSourceHandle primOrigin;
235};
236
270{
271 using DepthMaskCallback = std::function<void(void)>;
272
274 : resolution(128, 128)
275 , maxNumDeepEntries(32000)
276 , pickTarget(HdxPickTokens->pickPrimsAndInstances)
277 , resolveMode(HdxPickTokens->resolveNearestToCamera)
278 , doUnpickablesOcclude(false)
279 , viewMatrix(1)
280 , projectionMatrix(1)
281 , clipPlanes()
282 , depthMaskCallback(nullptr)
283 , collection()
284 , alphaThreshold(0.0001f)
285 , pointSize(3.0f)
286 , pointSelectedSize(5.0f)
287 , depthBiasEnable(false)
288 , depthBiasConstantFactor(0.0f)
289 , depthBiasSlopeFactor(0.0f)
290 , outHits(nullptr)
291 {}
292
293 GfVec2i resolution;
294 int maxNumDeepEntries;
295 TfToken pickTarget;
296 TfToken resolveMode;
297 bool doUnpickablesOcclude;
298 GfMatrix4d viewMatrix;
299 GfMatrix4d projectionMatrix;
300 std::vector<GfVec4d> clipPlanes;
301 DepthMaskCallback depthMaskCallback;
302 HdRprimCollection collection;
303 float alphaThreshold;
304 float pointSize;
305 float pointSelectedSize;
306 bool depthBiasEnable;
307 float depthBiasConstantFactor;
308 float depthBiasSlopeFactor;
309 HdxPickHitVector *outHits;
310};
311
324class HdxPickTask : public HdTask
325{
326public:
328
329 HDX_API
330 HdxPickTask(HdSceneDelegate* delegate, SdfPath const& id);
331
332 HDX_API
333 ~HdxPickTask() override;
334
336 HDX_API
337 void Sync(HdSceneDelegate* delegate,
338 HdTaskContext* ctx,
339 HdDirtyBits* dirtyBits) override;
340
342 HDX_API
343 void Prepare(HdTaskContext* ctx,
344 HdRenderIndex* renderIndex) override;
345
347 HDX_API
348 void Execute(HdTaskContext* ctx) override;
349
350 HDX_API
351 const TfTokenVector &GetRenderTags() const override;
352
354 static inline int DecodeIDRenderColor(unsigned char const idColor[4]) {
355 return (int32_t(idColor[0] & 0xff) << 0) |
356 (int32_t(idColor[1] & 0xff) << 8) |
357 (int32_t(idColor[2] & 0xff) << 16) |
358 (int32_t(idColor[3] & 0xff) << 24);
359 }
360
361private:
362 HdxPickTaskParams _params;
363 HdxPickTaskContextParams _contextParams;
364 TfTokenVector _renderTags;
365 bool _useOverlayPass;
366
367 // We need to cache a pointer to the render index so Execute() can
368 // map prim ID to paths.
369 HdRenderIndex *_index;
370
371 void _InitIfNeeded();
372 void _CreateAovBindings();
373 void _CleanupAovBindings();
374 void _ResizeOrCreateBufferForAOV(
375 const HdRenderPassAovBinding& aovBinding);
376
377 void _ConditionStencilWithGLCallback(
378 HdxPickTaskContextParams::DepthMaskCallback maskCallback,
379 HdRenderBuffer const * depthStencilBuffer);
380
381 bool _UseOcclusionPass() const;
382 bool _UseOverlayPass() const;
383 void _UpdateUseOverlayPass();
384
385 void _ClearPickBuffer();
386 void _ResolveDeep();
387
388 template<typename T>
389 HdStTextureUtils::AlignedBuffer<T>
390 _ReadAovBuffer(TfToken const & aovName) const;
391
392 HdRenderBuffer const * _FindAovBuffer(TfToken const & aovName) const;
393
394 // Create a shared render pass each for pickables, unpickables, and
395 // items in overlay (which may draw on top even when occluded).
396 HdRenderPassSharedPtr _pickableRenderPass;
397 HdRenderPassSharedPtr _occluderRenderPass;
398 HdRenderPassSharedPtr _overlayRenderPass;
399
400 // Having separate render pass states allows us to use different
401 // shader mixins if we choose to (we don't currently).
402 HdRenderPassStateSharedPtr _pickableRenderPassState;
403 HdRenderPassStateSharedPtr _occluderRenderPassState;
404 HdRenderPassStateSharedPtr _overlayRenderPassState;
405
406 Hgi* _hgi;
407
408 std::vector<std::unique_ptr<HdStRenderBuffer>> _pickableAovBuffers;
409 HdRenderPassAovBindingVector _pickableAovBindings;
410 HdRenderPassAovBinding _occluderAovBinding;
411 size_t _pickableDepthIndex;
412 TfToken _depthToken;
413 std::unique_ptr<HdStRenderBuffer> _overlayDepthStencilBuffer;
414 HdRenderPassAovBindingVector _overlayAovBindings;
415
416 // pick buffer used for deep selection
417 HdBufferArrayRangeSharedPtr _pickBuffer;
418
419 HdxPickTask() = delete;
420 HdxPickTask(const HdxPickTask &) = delete;
421 HdxPickTask &operator =(const HdxPickTask &) = delete;
422};
423
426public:
427
428 // Pick result takes a tuple of ID buffers:
429 // - (primId, instanceId, elementId, edgeId, pointId)
430 // along with some geometric buffers:
431 // - (depth, Neye)
432 // ... and resolves them into a series of hits, using one of the
433 // algorithms specified below.
434 //
435 // index is used to fill in the HdxPickHit structure;
436 // pickTarget is used to determine what a valid hit is;
437 // viewMatrix, projectionMatrix, depthRange are used for unprojection
438 // to calculate the worldSpaceHitPosition and worldSpaceHitNormal.
439 // bufferSize is the size of the ID buffers, and subRect is the sub-region
440 // of the id buffers to iterate over in the resolution algorithm.
441 //
442 // All buffers need to be the same size, if passed in. It's legal for
443 // only the depth and primId buffers to be provided; everything else is
444 // optional but provides a richer picking result.
445 HDX_API
446 HdxPickResult(int const* primIds,
447 int const* instanceIds,
448 int const* elementIds,
449 int const* edgeIds,
450 int const* pointIds,
451 int const* neyes,
452 float const* depths,
453 HdRenderIndex const *index,
454 TfToken const& pickTarget,
455 GfMatrix4d const& viewMatrix,
456 GfMatrix4d const& projectionMatrix,
457 GfVec2f const& depthRange,
458 GfVec2i const& bufferSize,
459 GfVec4i const& subRect);
460
461 HDX_API
463
464 HDX_API
466 HDX_API
467 HdxPickResult& operator=(HdxPickResult &&);
468
470 HDX_API
471 bool IsValid() const;
472
476 HDX_API
477 void ResolveNearestToCamera(HdxPickHitVector* allHits) const;
478
482 HDX_API
483 void ResolveNearestToCenter(HdxPickHitVector* allHits) const;
484
487 HDX_API
488 void ResolveAll(HdxPickHitVector* allHits) const;
489
492 HDX_API
493 void ResolveUnique(HdxPickHitVector* allHits) const;
494
495private:
496 bool _ResolveHit(int index, int x, int y, float z, HdxPickHit* hit) const;
497
498 size_t _GetHash(int index) const;
499 bool _IsValidHit(int index) const;
500
501 // Provide accessors for all of the ID buffers. Since all but _primIds
502 // are optional, if the buffer doesn't exist just return -1 (== no hit).
503 int _GetPrimId(int index) const {
504 return _primIds ? _primIds[index] : -1;
505 }
506 int _GetInstanceId(int index) const {
507 return _instanceIds ? _instanceIds[index] : -1;
508 }
509 int _GetElementId(int index) const {
510 return _elementIds ? _elementIds[index] : -1;
511 }
512 int _GetEdgeId(int index) const {
513 return _edgeIds ? _edgeIds[index] : -1;
514 }
515 int _GetPointId(int index) const {
516 return _pointIds ? _pointIds[index] : -1;
517 }
518
519 // Provide an accessor for the normal buffer. If the normal buffer is
520 // provided, this function will unpack the normal. The fallback is
521 // GfVec3f(0.0f).
522 GfVec3f _GetNormal(int index) const;
523
524 int const* _primIds;
525 int const* _instanceIds;
526 int const* _elementIds;
527 int const* _edgeIds;
528 int const* _pointIds;
529 int const* _neyes;
530 float const* _depths;
531 HdRenderIndex const *_index;
532 TfToken _pickTarget;
533 GfMatrix4d _ndcToWorld;
534 GfMatrix4d _eyeToWorld;
535 GfVec2f _depthRange;
536 GfVec2i _bufferSize;
537 GfVec4i _subRect;
538};
539
540// For sorting, order hits by ndc depth.
541HDX_API
542bool operator<(HdxPickHit const& lhs, HdxPickHit const& rhs);
543
544// VtValue requirements
545HDX_API
546std::ostream& operator<<(std::ostream& out, const HdxPickHit& h);
547HDX_API
548bool operator==(const HdxPickHit& lhs,
549 const HdxPickHit& rhs);
550HDX_API
551bool operator!=(const HdxPickHit& lhs,
552 const HdxPickHit& rhs);
553
554HDX_API
555std::ostream& operator<<(std::ostream& out, const HdxPickTaskParams& pv);
556HDX_API
557bool operator==(const HdxPickTaskParams& lhs,
558 const HdxPickTaskParams& rhs);
559HDX_API
560bool operator!=(const HdxPickTaskParams& lhs,
561 const HdxPickTaskParams& rhs);
562
563HDX_API
564std::ostream& operator<<(std::ostream& out, const HdxPickTaskContextParams& pv);
565HDX_API
566bool operator==(const HdxPickTaskContextParams& lhs,
567 const HdxPickTaskContextParams& rhs);
568HDX_API
569bool operator!=(const HdxPickTaskContextParams& lhs,
570 const HdxPickTaskContextParams& rhs);
571PXR_NAMESPACE_CLOSE_SCOPE
572
573#endif // PXR_IMAGING_HDX_PICK_TASK_H
Provide architecture-specific memory-alignment information.
Stores a 4x4 matrix of double elements.
Definition matrix4d.h:71
Basic type for a vector of 2 float components.
Definition vec2f.h:46
Basic type for a vector of 2 int components.
Definition vec2i.h:44
Basic type for a vector of 3 double components.
Definition vec3d.h:46
Basic type for a vector of 3 float components.
Definition vec3f.h:46
Basic type for a vector of 4 int components.
Definition vec4i.h:44
A render buffer is a handle to a data resource that can be rendered into, such as a 2d image for a dr...
The render index is part of the Hydra 1.0 API and is only used for emulation purposes so that HdScene...
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.
HdTask represents a unit of work to perform during a Hydra render.
Definition task.h:44
A utility class for resolving ID buffers into hits.
Definition pickTask.h:425
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.
Definition pickTask.h:325
static int DecodeIDRenderColor(unsigned char const idColor[4])
Utility: Given a UNorm8Vec4 pixel, unpack it into an int32 ID.
Definition pickTask.h:354
HDX_API const TfTokenVector & GetRenderTags() const override
Render Tag Gather.
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.
Definition hgi.h:95
A path value used to locate objects in layers or scenegraphs.
Definition path.h:281
bool IsEmpty() const noexcept
Returns true if this is the empty path (SdfPath::EmptyPath()).
Definition path.h:405
Token for efficient comparison, assignment, and hashing of known strings.
Definition token.h:71
Standard pointer typedefs.
#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.
Definition aov.h:100
Information about an instancer instancing a picked object (or an instancer instancing such an instanc...
Definition pickTask.h:122
HdContainerDataSourceHandle instancerPrimOrigin
The prim origin data source of the instancer.
Definition pickTask.h:126
HdContainerDataSourceHandle instancePrimOrigin
The prim origin data source of the picked (implicit) instance.
Definition pickTask.h:149
int instanceId
Index of the picked instance.
Definition pickTask.h:151
SdfPath instanceSceneIndexPath
For implicit instancing (native instancing in USD), the path of the picked instance in the scene inde...
Definition pickTask.h:130
SdfPath instancerSceneIndexPath
The path of the instancer in the scene index.
Definition pickTask.h:124
Picking hit structure.
Definition pickTask.h:83
float normalizedDepth
normalizedDepth is in the range [0,1].
Definition pickTask.h:107
SdfPath delegateId
delegateID of HdSceneDelegate that provided the picked prim.
Definition pickTask.h:88
SdfPath objectId
Path computed from scenePath's in primOrigin data source of picked prim and instancers if provided by...
Definition pickTask.h:92
SdfPath instancerId
Only supported for scene delegates, see HdxPrimOriginInfo for scene indices.
Definition pickTask.h:98
Pick task context params.
Definition pickTask.h:270
Pick task params.
Definition pickTask.h:72
A helper to extract information about the picked prim that allows modern applications to identify a p...
Definition pickTask.h:172
static HDX_API std::vector< HdxPrimOriginInfo > FromPickHits(HdRenderIndex *renderIndex, const std::vector< HdxPickHit > &hits)
Vectorized implementation of function to query terminal scene index of render index for information a...
static HDX_API std::vector< HdxPrimOriginInfo > FromPickHits(HdSceneIndexBaseRefPtr const &terminalSceneIndex, const std::vector< HdxPickHit > &hits)
Vectorized implementation of function to query terminal scene index for information about picked prim...
static HDX_API HdxPrimOriginInfo FromPickHit(HdSceneIndexBaseRefPtr const &terminalSceneIndex, const HdxPickHit &hit)
Query terminal scene index for information about picked prim.
HdContainerDataSourceHandle primOrigin
The prim origin data source for the picked prim if provided by the scene index.
Definition pickTask.h:234
std::vector< HdxInstancerContext > instancerContexts
Information about the instancers instancing the picked object.
Definition pickTask.h:231
static HDX_API HdxPrimOriginInfo FromPickHit(HdRenderIndex *renderIndex, const HdxPickHit &hit)
Query terminal scene index of render index for information about picked prim.
HDX_API HdInstancerContext ComputeInstancerContext(const TfToken &nameInPrimOrigin=HdPrimOriginSchemaTokens->scenePath) const
Computes an HdInstancerContext object (equivalent to the one computed by GetScenePrimPath) from the v...
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.
Definition token.h:440