HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
skeletonAdapter.h
Go to the documentation of this file.
1 //
2 // Copyright 2018 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_USD_IMAGING_USD_SKEL_IMAGING_SKELETON_ADAPTER_H
8 #define PXR_USD_IMAGING_USD_SKEL_IMAGING_SKELETON_ADAPTER_H
9 
10 #include "pxr/pxr.h"
13 
15 
18 #include "pxr/usd/usdSkel/cache.h"
21 
22 #include <unordered_map>
23 
25 
26 /// \class UsdSkelImagingSkeletonAdapter
27 ///
28 /// Prim adapter for UsdSkel's Skeleton.
29 ///
31 {
32 public:
34 
36  : BaseAdapter()
37  {}
38 
41 
43  SdfPath
44  Populate(const UsdPrim& prim,
47  instancerContext=nullptr) override;
48 
50  bool IsSupported(const UsdImagingIndexProxy* index) const override;
51 
52  // ---------------------------------------------------------------------- //
53  /// \name Parallel Setup and Resolve
54  // ---------------------------------------------------------------------- //
55 
56  /// Thread Safe.
58  void TrackVariability(const UsdPrim& prim,
59  const SdfPath& cachePath,
60  HdDirtyBits* timeVaryingBits,
62  instancerContext = nullptr) const override;
63 
64  /// Thread Safe.
66  void UpdateForTime(const UsdPrim& prim,
67  const SdfPath& cachePath,
69  HdDirtyBits requestedBits,
71  instancerContext=nullptr) const override;
72 
73  // ---------------------------------------------------------------------- //
74  /// \name Change Processing API (public)
75  // ---------------------------------------------------------------------- //
76 
79  const SdfPath& cachePath,
80  const TfToken& propertyName) override;
81 
83  void ProcessPrimResync(SdfPath const& primPath,
84  UsdImagingIndexProxy* index) override;
85 
87  void ProcessPrimRemoval(SdfPath const& primPath,
88  UsdImagingIndexProxy* index) override;
89 
91  void MarkDirty(const UsdPrim& prim,
92  const SdfPath& cachePath,
93  HdDirtyBits dirty,
94  UsdImagingIndexProxy* index) override;
95 
97  void MarkRefineLevelDirty(UsdPrim const& prim,
98  SdfPath const& cachePath,
99  UsdImagingIndexProxy* index) override;
100 
102  void MarkReprDirty(UsdPrim const& prim,
103  SdfPath const& cachePath,
104  UsdImagingIndexProxy* index) override;
105 
107  void MarkCullStyleDirty(UsdPrim const& prim,
108  SdfPath const& cachePath,
109  UsdImagingIndexProxy* index) override;
110 
112  void MarkRenderTagDirty(UsdPrim const& prim,
113  SdfPath const& cachePath,
114  UsdImagingIndexProxy* index) override;
115 
117  void MarkTransformDirty(const UsdPrim& prim,
118  const SdfPath& cachePath,
119  UsdImagingIndexProxy* index) override;
120 
122  void MarkVisibilityDirty(const UsdPrim& prim,
123  const SdfPath& cachePath,
124  UsdImagingIndexProxy* index) override;
125 
127  void MarkMaterialDirty(const UsdPrim& prim,
128  const SdfPath& cachePath,
129  UsdImagingIndexProxy* index) override;
130 
131  // ---------------------------------------------------------------------- //
132  /// \name Computation API
133  // ---------------------------------------------------------------------- //
135  void InvokeComputation(SdfPath const& cachePath,
136  HdExtComputationContext* context) override;
137 
138  // ---------------------------------------------------------------------- //
139  /// \name Non-virtual public API
140  // ---------------------------------------------------------------------- //
141 
143  void RegisterSkelBinding(UsdSkelBinding const& binding);
144 
145  // ---------------------------------------------------------------------- //
146  /// \name Virtual public API
147  // ---------------------------------------------------------------------- //
148 
150  PxOsdSubdivTags GetSubdivTags(UsdPrim const& usdPrim,
151  SdfPath const& cachePath,
152  UsdTimeCode time) const override;
153 
155  VtValue GetTopology(UsdPrim const& prim,
156  SdfPath const& cachePath,
157  UsdTimeCode time) const override;
158 
160  GfRange3d GetExtent(UsdPrim const& prim,
161  SdfPath const& cachePath,
162  UsdTimeCode time) const override;
163 
165  TfToken GetPurpose(UsdPrim const& prim,
166  SdfPath const& cachePath,
167  TfToken const& instanceInheritablePurpose)
168  const override;
169 
171  bool GetDoubleSided(UsdPrim const& prim,
172  SdfPath const& cachePath,
173  UsdTimeCode time) const override;
174 
175 
177  SdfPath GetMaterialId(UsdPrim const& prim,
178  SdfPath const& cachePath,
179  UsdTimeCode time) const override;
180 
181 
184  SdfPath const& cachePath) const override;
185 
188  GetExtComputationInputs(UsdPrim const& prim,
189  SdfPath const& cachePath,
190  const UsdImagingInstancerContext *instancerContext)
191  const override;
192 
195  GetExtComputationOutputs(UsdPrim const& prim,
196  SdfPath const& cachePath,
197  const UsdImagingInstancerContext* instancerContext)
198  const override;
199 
203  UsdPrim const& prim,
204  SdfPath const& cachePath,
205  HdInterpolation interpolation,
206  const UsdImagingInstancerContext* instancerContext) const override;
207 
209  VtValue
211  UsdPrim const& prim,
212  SdfPath const& cachePath,
213  TfToken const& name,
215  const UsdImagingInstancerContext* instancerContext) const override;
216 
218  size_t
220  UsdPrim const& prim,
221  SdfPath const& cachePath,
222  TfToken const& name,
224  const UsdImagingInstancerContext* instancerContext,
225  size_t maxSampleCount,
226  float *sampleTimes,
227  VtValue *sampleValues) override;
228 
230  std::string
232  UsdPrim const& prim,
233  SdfPath const& cachePath,
234  const UsdImagingInstancerContext* instancerContext) const override;
235 
236 
238  VtValue Get(UsdPrim const& prim,
239  SdfPath const& cachePath,
240  TfToken const& key,
242  VtIntArray *outIndices) const override;
243 
244  // ---------------------------------------------------------------------- //
245  /// \name Scene Index Support
246  // ---------------------------------------------------------------------- //
248  TfTokenVector GetImagingSubprims(UsdPrim const &prim) override;
249 
252  UsdPrim const &prim,
253  TfToken const &subprim) override;
254 
256  HdContainerDataSourceHandle GetImagingSubprimData(
257  UsdPrim const& prim,
258  TfToken const& subprim,
259  const UsdImagingDataSourceStageGlobals &stageGlobals) override;
260 
263  UsdPrim const& prim,
264  TfToken const& subprim,
265  TfTokenVector const& properties,
266  UsdImagingPropertyInvalidationType invalidationType) override;
267 
268 protected:
269  // ---------------------------------------------------------------------- //
270  /// \name Change Processing API (protected)
271  // ---------------------------------------------------------------------- //
272  void _RemovePrim(const SdfPath& cachePath,
273  UsdImagingIndexProxy* index) override;
274 
275 private:
276  // ---------------------------------------------------------------------- //
277  /// Handlers for the Bone Mesh
278  // ---------------------------------------------------------------------- //
279  bool _IsCallbackForSkeleton(const UsdPrim& prim) const;
280 
281  /// Returns a value holding color for \p prim,
282  /// taking into account explicitly authored color on the prim.
283  GfVec3f _GetSkeletonDisplayColor(const UsdPrim& prim,
284  UsdTimeCode time) const;
285 
286  /// Returns a value holding opacity for \p prim,
287  /// taking into account explicitly authored opacity on the prim.
288  float _GetSkeletonDisplayOpacity(const UsdPrim& prim,
289  UsdTimeCode time) const;
290 
291  void _TrackBoneMeshVariability(
292  const UsdPrim& prim,
293  const SdfPath& cachePath,
294  HdDirtyBits* timeVaryingBits,
296  instancerContext = nullptr) const;
297 
298  void _UpdateBoneMeshForTime(
299  const UsdPrim& prim,
300  const SdfPath& cachePath,
302  HdDirtyBits requestedBits,
303  const UsdImagingInstancerContext* instancerContext=nullptr) const;
304 
305  // ---------------------------------------------------------------------- //
306  /// Common utitily methods for skinning computations & skinned prims
307  // ---------------------------------------------------------------------- //
308  bool _IsAffectedByTimeVaryingSkelAnim(const SdfPath& skinnedPrimPath)
309  const;
310 
311  void _RemoveSkinnedPrimAndComputations(const SdfPath& cachePath,
313 
314  // ---------------------------------------------------------------------- //
315  /// Handlers for the skinning computations
316  // ---------------------------------------------------------------------- //
317  bool _IsSkinningComputationPath(const SdfPath& cachePath) const;
318 
319  bool
320  _IsSkinningInputAggregatorComputationPath(const SdfPath& cachePath)const;
321 
322  void _TrackSkinningComputationVariability(
323  const UsdPrim& skinnedPrim,
324  const SdfPath& computationPath,
325  HdDirtyBits* timeVaryingBits,
327  instancerContext = nullptr) const;
328 
329  VtVec3fArray _GetSkinnedPrimPoints(const UsdPrim& skinnedPrim,
330  const SdfPath& skinnedPrimCachePath,
331  UsdTimeCode time) const;
332 
333  SdfPath _GetSkinningComputationPath(const SdfPath& skinnedPrimPath) const;
334 
335  SdfPath _GetSkinningInputAggregatorComputationPath(
336  const SdfPath& skinnedPrimPath) const;
337 
338  // Static helper methods
339  static
340  std::string _LoadSkinningComputeKernel(const TfToken& kernelKey);
341 
342  static
343  const std::string& _GetLBSSkinningComputeKernel();
344 
345  static
346  const std::string& _GetDQSSkinningComputeKernel();
347 
348  // ---------------------------------------------------------------------- //
349  /// Handlers for the skinned prim
350  // ---------------------------------------------------------------------- //
351  bool _IsSkinnedPrimPath(const SdfPath& cachePath) const;
352 
353  void _TrackSkinnedPrimVariability(
354  const UsdPrim& prim,
355  const SdfPath& cachePath,
356  HdDirtyBits* timeVaryingBits,
358  instancerContext = nullptr) const;
359 
360  void _UpdateSkinnedPrimForTime(
361  const UsdPrim& prim,
362  const SdfPath& cachePath,
364  HdDirtyBits requestedBits,
365  const UsdImagingInstancerContext* instancerContext=nullptr) const;
366 
367  // ---------------------------------------------------------------------- //
368  /// GetExtComputationInput() helpers
369  // ---------------------------------------------------------------------- //
370 
371  VtValue
372  _GetExtComputationInputForSkinningComputation(
373  UsdPrim const& prim,
374  SdfPath const& cachePath,
375  TfToken const& name,
377  const UsdImagingInstancerContext* instancerContext) const;
378 
379  VtValue
380  _GetExtComputationInputForInputAggregator(
381  UsdPrim const& prim,
382  SdfPath const& cachePath,
383  TfToken const& name,
385  const UsdImagingInstancerContext* instancerContext) const;
386 
387  size_t
388  _SampleExtComputationInputForSkinningComputation(
389  UsdPrim const& prim,
390  SdfPath const& cachePath,
391  TfToken const& name,
393  const UsdImagingInstancerContext* instancerContext,
394  size_t maxSampleCount,
395  float *sampleTimes,
396  VtValue *sampleValues);
397 
398  size_t
399  _SampleExtComputationInputForInputAggregator(
400  UsdPrim const& prim,
401  SdfPath const& cachePath,
402  TfToken const& name,
404  const UsdImagingInstancerContext* instancerContext,
405  size_t maxSampleCount,
406  float *sampleTimes,
407  VtValue *sampleValues);
408 
409  /// Returns the sample time offset that should be reported for computation
410  /// inputs which are not time-varying.
411  double _GetDefaultSampleTime(UsdTimeCode time);
412 
413 
414  // ---------------------------------------------------------------------- //
415  /// Populated skeleton state
416  // ---------------------------------------------------------------------- //
417  /// Data for a skel instance.
418  struct _SkelData {
419 
420  UsdSkelSkeletonQuery skelQuery;
421  SdfPathSet skelRootPaths;
422 
423  /// Compute bone mesh topology, and intiailize
424  /// other rest-state data for imaging bones.
425  HdMeshTopology ComputeTopologyAndRestState();
426 
427  /// Compute animated bone mesh points.
428  VtVec3fArray ComputePoints(UsdTimeCode time) const;
429 
430  /// Returns the purpose opinion authored on the skeleton prim or its
431  /// ancestors. If none exists, returns an empty token.
432  TfToken ComputePurpose() const;
433 
434  private:
435  // Cache of a mesh for a skeleton (at rest)
436  // TODO: Dedupe this infromation across UsdSkelSkeleton instances.
437  VtVec3fArray _boneMeshPoints;
438  VtIntArray _boneMeshJointIndices;
439  size_t _numJoints;
440  };
441 
442  _SkelData* _GetSkelData(const SdfPath& cachePath) const;
443 
444  UsdSkelCache _skelCache;
445  using _SkelDataMap =
446  std::unordered_map<SdfPath, std::shared_ptr<_SkelData>, SdfPath::Hash>;
447  _SkelDataMap _skelDataCache;
448 
449  // Data for each skinned prim.
450  struct _SkinnedPrimData {
451  _SkinnedPrimData() = default;
452 
453  /// Construct skinned prim, referencing the skeleton at \p skelPath.
454  /// XXX: We cannot extract the skel path from the skelQuery because
455  /// the skelQuery might refer to a prim within an instance master.
456  _SkinnedPrimData(const SdfPath& skelPath,
457  const UsdSkelSkeletonQuery& skelQuery,
458  const UsdSkelSkinningQuery& skinningQuery,
459  const SdfPath& skelRootPath);
460 
461  std::shared_ptr<UsdSkelBlendShapeQuery> blendShapeQuery;
462  UsdSkelSkinningQuery skinningQuery;
463  UsdSkelAnimQuery animQuery;
464  SdfPath skelPath, skelRootPath;
465  bool hasJointInfluences = false;
466  };
467 
468  const _SkinnedPrimData* _GetSkinnedPrimData(const SdfPath& cachePath) const;
469 
470  using _SkinnedPrimDataMap =
471  std::unordered_map<SdfPath, _SkinnedPrimData, SdfPath::Hash>;
472  _SkinnedPrimDataMap _skinnedPrimDataCache;
473 
474  // ---------------------------------------------------------------------- //
475  /// Skeleton -> Skinned Prim(s) state
476  /// (Populated via UsdSkelImagingSkelRootAdapter::Populate)
477  // ---------------------------------------------------------------------- //
478 
479  using _SkelBindingMap =
480  std::unordered_map<SdfPath, UsdSkelBinding, SdfPath::Hash>;
481  _SkelBindingMap _skelBindingMap;
482 };
483 
484 
486 
487 #endif // USDSKELIMAGING_SKELETONADAPTER
488 
USDSKELIMAGING_API HdDataSourceLocatorSet InvalidateImagingSubprim(UsdPrim const &prim, TfToken const &subprim, TfTokenVector const &properties, UsdImagingPropertyInvalidationType invalidationType) override
GT_API const UT_StringHolder time
uint32_t HdDirtyBits
Definition: types.h:143
USDSKELIMAGING_API void MarkDirty(const UsdPrim &prim, const SdfPath &cachePath, HdDirtyBits dirty, UsdImagingIndexProxy *index) override
USDSKELIMAGING_API void TrackVariability(const UsdPrim &prim, const SdfPath &cachePath, HdDirtyBits *timeVaryingBits, const UsdImagingInstancerContext *instancerContext=nullptr) const override
Thread Safe.
USDSKELIMAGING_API bool IsSupported(const UsdImagingIndexProxy *index) const override
Returns true if the adapter can be populated into the target index.
std::vector< HdExtComputationInputDescriptor > HdExtComputationInputDescriptorVector
virtual USDSKELIMAGING_API ~UsdSkelImagingSkeletonAdapter()
Definition: vec3f.h:45
USDSKELIMAGING_API HdExtComputationPrimvarDescriptorVector GetExtComputationPrimvars(UsdPrim const &prim, SdfPath const &cachePath, HdInterpolation interpolation, const UsdImagingInstancerContext *instancerContext) const override
USDSKELIMAGING_API VtValue GetExtComputationInput(UsdPrim const &prim, SdfPath const &cachePath, TfToken const &name, UsdTimeCode time, const UsdImagingInstancerContext *instancerContext) const override
std::vector< HdExtComputationOutputDescriptor > HdExtComputationOutputDescriptorVector
USDSKELIMAGING_API void ProcessPrimRemoval(SdfPath const &primPath, UsdImagingIndexProxy *index) override
USDSKELIMAGING_API void MarkMaterialDirty(const UsdPrim &prim, const SdfPath &cachePath, UsdImagingIndexProxy *index) override
USDSKELIMAGING_API TfToken GetImagingSubprimType(UsdPrim const &prim, TfToken const &subprim) override
USDSKELIMAGING_API SdfPath Populate(const UsdPrim &prim, UsdImagingIndexProxy *index, const UsdImagingInstancerContext *instancerContext=nullptr) override
USDSKELIMAGING_API void MarkRefineLevelDirty(UsdPrim const &prim, SdfPath const &cachePath, UsdImagingIndexProxy *index) override
Definition: token.h:70
USDSKELIMAGING_API VtValue GetTopology(UsdPrim const &prim, SdfPath const &cachePath, UsdTimeCode time) const override
USDSKELIMAGING_API GfRange3d GetExtent(UsdPrim const &prim, SdfPath const &cachePath, UsdTimeCode time) const override
USDSKELIMAGING_API void InvokeComputation(SdfPath const &cachePath, HdExtComputationContext *context) override
USDSKELIMAGING_API std::string GetExtComputationKernel(UsdPrim const &prim, SdfPath const &cachePath, const UsdImagingInstancerContext *instancerContext) const override
void _RemovePrim(const SdfPath &cachePath, UsdImagingIndexProxy *index) override
Definition: prim.h:116
USDSKELIMAGING_API HdContainerDataSourceHandle GetImagingSubprimData(UsdPrim const &prim, TfToken const &subprim, const UsdImagingDataSourceStageGlobals &stageGlobals) override
std::vector< TfToken > TfTokenVector
Convenience types.
Definition: token.h:440
GLuint const GLchar * name
Definition: glcorearb.h:786
USDSKELIMAGING_API void MarkRenderTagDirty(UsdPrim const &prim, SdfPath const &cachePath, UsdImagingIndexProxy *index) override
Definition: path.h:273
USDSKELIMAGING_API SdfPath GetMaterialId(UsdPrim const &prim, SdfPath const &cachePath, UsdTimeCode time) const override
The root transform provided by the delegate.
std::set< class SdfPath > SdfPathSet
A set of SdfPaths.
Definition: path.h:192
USDSKELIMAGING_API void MarkVisibilityDirty(const UsdPrim &prim, const SdfPath &cachePath, UsdImagingIndexProxy *index) override
USDSKELIMAGING_API HdDirtyBits ProcessPropertyChange(const UsdPrim &prim, const SdfPath &cachePath, const TfToken &propertyName) override
USDSKELIMAGING_API void MarkTransformDirty(const UsdPrim &prim, const SdfPath &cachePath, UsdImagingIndexProxy *index) override
USDSKELIMAGING_API TfTokenVector GetImagingSubprims(UsdPrim const &prim) override
#define USDSKELIMAGING_API
Definition: api.h:23
PXR_NAMESPACE_CLOSE_SCOPE PXR_NAMESPACE_OPEN_SCOPE
Definition: path.h:1425
USDSKELIMAGING_API VtValue Get(UsdPrim const &prim, SdfPath const &cachePath, TfToken const &key, UsdTimeCode time, VtIntArray *outIndices) const override
USDSKELIMAGING_API void ProcessPrimResync(SdfPath const &primPath, UsdImagingIndexProxy *index) override
GLuint index
Definition: glcorearb.h:786
HdInterpolation
Definition: enums.h:177
USDSKELIMAGING_API HdExtComputationInputDescriptorVector GetExtComputationInputs(UsdPrim const &prim, SdfPath const &cachePath, const UsdImagingInstancerContext *instancerContext) const override
#define PXR_NAMESPACE_CLOSE_SCOPE
Definition: pxr.h:74
USDSKELIMAGING_API PxOsdSubdivTags GetSubdivTags(UsdPrim const &usdPrim, SdfPath const &cachePath, UsdTimeCode time) const override
Get the subdiv tags for this prim.
USDSKELIMAGING_API void MarkReprDirty(UsdPrim const &prim, SdfPath const &cachePath, UsdImagingIndexProxy *index) override
USDSKELIMAGING_API bool GetDoubleSided(UsdPrim const &prim, SdfPath const &cachePath, UsdTimeCode time) const override
Reads double-sided from the given prim. If not authored, returns false.
USDSKELIMAGING_API void RegisterSkelBinding(UsdSkelBinding const &binding)
USDSKELIMAGING_API size_t SampleExtComputationInput(UsdPrim const &prim, SdfPath const &cachePath, TfToken const &name, UsdTimeCode time, const UsdImagingInstancerContext *instancerContext, size_t maxSampleCount, float *sampleTimes, VtValue *sampleValues) override
USDSKELIMAGING_API void UpdateForTime(const UsdPrim &prim, const SdfPath &cachePath, UsdTimeCode time, HdDirtyBits requestedBits, const UsdImagingInstancerContext *instancerContext=nullptr) const override
Thread Safe.
USDSKELIMAGING_API TfToken GetPurpose(UsdPrim const &prim, SdfPath const &cachePath, TfToken const &instanceInheritablePurpose) const override
USDSKELIMAGING_API HdExtComputationOutputDescriptorVector GetExtComputationOutputs(UsdPrim const &prim, SdfPath const &cachePath, const UsdImagingInstancerContext *instancerContext) const override
USDSKELIMAGING_API const TfTokenVector & GetExtComputationSceneInputNames(SdfPath const &cachePath) const override
Definition: value.h:146
UsdImagingPropertyInvalidationType
Definition: types.h:17
USDSKELIMAGING_API void MarkCullStyleDirty(UsdPrim const &prim, SdfPath const &cachePath, UsdImagingIndexProxy *index) override
std::vector< HdExtComputationPrimvarDescriptor > HdExtComputationPrimvarDescriptorVector