skinningQuery.h
Go to the documentation of this file.
1 //
2 // Copyright 2016 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_USD_SKEL_SKINNING_QUERY_H
8 #define PXR_USD_USD_SKEL_SKINNING_QUERY_H
9 
11 
12 #include "pxr/pxr.h"
13 #include "pxr/usd/usdSkel/api.h"
14 
15 #include "pxr/usd/usd/attribute.h"
16 #include "pxr/usd/usd/prim.h"
17 #include "pxr/usd/usd/relationship.h"
18 
19 #include "pxr/usd/usdGeom/primvar.h"
20 
22 
23 #include <optional>
24 
25 PXR_NAMESPACE_OPEN_SCOPE
26 
27 
28 class UsdGeomBoundable;
29 
30 
35 {
36 public:
37  USDSKEL_API
39 
44  USDSKEL_API
45  UsdSkelSkinningQuery(const UsdPrim& prim,
46  const VtTokenArray& skelJointOrder,
47  const VtTokenArray& blendShapeOrder,
48  const UsdAttribute& jointIndices,
49  const UsdAttribute& jointWeights,
50  const UsdAttribute& skinningMethod,
51  const UsdAttribute& geomBindTransform,
52  const UsdAttribute& joints,
53  const UsdAttribute& blendShapes,
54  const UsdRelationship& blendShapeTargets);
55 
57  bool IsValid() const { return bool(_prim); }
58 
60  explicit operator bool() const { return IsValid(); }
61 
62  const UsdPrim& GetPrim() const { return _prim; }
63 
65  USDSKEL_API
66  bool HasBlendShapes() const;
67 
69  USDSKEL_API
70  bool HasJointInfluences() const;
71 
78  return _numInfluencesPerComponent;
79  }
80 
81  const TfToken& GetInterpolation() const { return _interpolation; }
82 
85  USDSKEL_API
86  bool IsRigidlyDeformed() const;
87 
88  const UsdAttribute& GetSkinningMethodAttr() const {
89  return _skinningMethodAttr;
90  }
91 
92  const UsdAttribute& GetGeomBindTransformAttr() const {
93  return _geomBindTransformAttr;
94  }
95 
96  const UsdGeomPrimvar& GetJointIndicesPrimvar() const {
97  return _jointIndicesPrimvar;
98  }
99 
100  const UsdGeomPrimvar& GetJointWeightsPrimvar() const {
101  return _jointWeightsPrimvar;
102  }
103 
104  const UsdAttribute& GetBlendShapesAttr() const {
105  return _blendShapes;
106  }
107 
108  const UsdRelationship& GetBlendShapeTargetsRel() const {
109  return _blendShapeTargets;
110  }
111 
118  const UsdSkelAnimMapperRefPtr& GetJointMapper() const {
119  return _jointMapper;
120  }
121 
123  const UsdSkelAnimMapperRefPtr& GetMapper() const { return _jointMapper; }
124 
125 
132  const UsdSkelAnimMapperRefPtr& GetBlendShapeMapper() const {
133  return _blendShapeMapper;
134  }
135 
137  USDSKEL_API
138  bool GetJointOrder(VtTokenArray* jointOrder) const;
139 
141  USDSKEL_API
142  bool GetBlendShapeOrder(VtTokenArray* blendShapes) const;
143 
149  USDSKEL_API
150  bool GetTimeSamples(std::vector<double>* times) const;
151 
157  USDSKEL_API
158  bool GetTimeSamplesInInterval(const GfInterval& interval,
159  std::vector<double>* times) const;
160 
165  USDSKEL_API
166  bool ComputeJointInfluences(VtIntArray* indices,
167  VtFloatArray* weights,
168  UsdTimeCode time=UsdTimeCode::Default()) const;
169 
175  USDSKEL_API
177  size_t numPoints,
178  VtIntArray* indices,
179  VtFloatArray* weights,
180  UsdTimeCode time=UsdTimeCode::Default()) const;
181 
190  template <typename Matrix4>
191  USDSKEL_API
192  bool ComputeSkinnedPoints(const VtArray<Matrix4>& xforms,
193  VtVec3fArray* points,
194  UsdTimeCode time=UsdTimeCode::Default()) const;
195 
204  template <typename Matrix4>
205  USDSKEL_API
206  bool ComputeSkinnedNormals(const VtArray<Matrix4>& xforms,
207  VtVec3fArray* points,
208  UsdTimeCode time=UsdTimeCode::Default()) const;
209 
220  template <typename Matrix4>
221  USDSKEL_API
222  bool ComputeSkinnedTransform(const VtArray<Matrix4>& xforms,
223  Matrix4* xform,
224  UsdTimeCode time=UsdTimeCode::Default()) const;
225 
232  template <typename Matrix4>
233  USDSKEL_API
234  float ComputeExtentsPadding(const VtArray<Matrix4>& skelRestXforms,
235  const UsdGeomBoundable& boundable) const;
236 
237  USDSKEL_API
238  TfToken GetSkinningMethod() const;
239 
240  USDSKEL_API
241  GfMatrix4d
242  GetGeomBindTransform(UsdTimeCode time=UsdTimeCode::Default()) const;
243 
244  USDSKEL_API
245  std::string GetDescription() const;
246 
247 private:
248 
249  void _InitializeJointInfluenceBindings(
250  const UsdAttribute& jointIndices,
251  const UsdAttribute& jointWeights);
252 
253  void _InitializeBlendShapeBindings(
254  const UsdAttribute& blendShapes,
255  const UsdRelationship& blendShapeTargets);
256 
257  UsdPrim _prim;
258  int _numInfluencesPerComponent = 1;
259  int _flags = 0;
260  TfToken _interpolation;
261 
262  UsdGeomPrimvar _jointIndicesPrimvar;
263  UsdGeomPrimvar _jointWeightsPrimvar;
264  UsdAttribute _skinningMethodAttr;
265  UsdAttribute _geomBindTransformAttr;
266  UsdAttribute _blendShapes;
267  UsdRelationship _blendShapeTargets;
268  UsdSkelAnimMapperRefPtr _jointMapper;
269  UsdSkelAnimMapperRefPtr _blendShapeMapper;
270  std::optional<VtTokenArray> _jointOrder;
271  std::optional<VtTokenArray> _blendShapeOrder;
272 };
273 
274 PXR_NAMESPACE_CLOSE_SCOPE
275 
276 #endif // PXR_USD_USD_SKEL_SKINNING_QUERY_H
USDSKEL_API bool GetTimeSamplesInInterval(const GfInterval &interval, std::vector< double > *times) const
Populate times with the union of time samples within interval, for all properties that affect skinnin...
USDSKEL_API float ComputeExtentsPadding(const VtArray< Matrix4 > &skelRestXforms, const UsdGeomBoundable &boundable) const
Helper for computing an approximate padding for use in extents computations.
Object used for querying resolved bindings for skinning.
Definition: skinningQuery.h:34
const UsdSkelAnimMapperRefPtr & GetJointMapper() const
Return a mapper for remapping from the joint order of the skeleton to the local joint order of this p...
USDSKEL_API bool GetBlendShapeOrder(VtTokenArray *blendShapes) const
Get the blend shapes for this skinning site, if any.
USDSKEL_API bool ComputeJointInfluences(VtIntArray *indices, VtFloatArray *weights, UsdTimeCode time=UsdTimeCode::Default()) const
Convenience method for computing joint influences.
USDSKEL_API bool HasBlendShapes() const
Returns true if there are blend shapes associated with this prim.
Scenegraph object for authoring and retrieving numeric, string, and array valued data,...
Definition: attribute.h:183
Token for efficient comparison, assignment, and hashing of known strings.
Definition: token.h:80
Stores a 4x4 matrix of double elements.
Definition: matrix4d.h:70
Represent a time value, which may be either numeric, holding a double value, or a sentinel value UsdT...
Definition: timeCode.h:73
const UsdSkelAnimMapperRefPtr & GetBlendShapeMapper() const
Return the mapper for remapping blend shapes from the order of the bound SkelAnimation to the local b...
USDSKEL_API bool ComputeSkinnedPoints(const VtArray< Matrix4 > &xforms, VtVec3fArray *points, UsdTimeCode time=UsdTimeCode::Default()) const
Compute skinned points using specified skinning method attr (fallback to linear blend skinning if not...
Boundable introduces the ability for a prim to persistently cache a rectilinear, local-space,...
Definition: boundable.h:65
bool IsValid() const
Returns true if this query is valid.
Definition: skinningQuery.h:57
UsdPrim is the sole persistent scenegraph object on a UsdStage, and is the embodiment of a "Prim" as ...
Definition: prim.h:116
A basic mathematical interval class.
Definition: interval.h:32
Represents an arbitrary dimensional rectangular container class.
Definition: array.h:213
int GetNumInfluencesPerComponent() const
Returns the number of influences encoded for each component.
Definition: skinningQuery.h:77
A UsdRelationship creates dependencies between scenegraph objects by allowing a prim to target other ...
Definition: relationship.h:111
USDSKEL_API bool ComputeVaryingJointInfluences(size_t numPoints, VtIntArray *indices, VtFloatArray *weights, UsdTimeCode time=UsdTimeCode::Default()) const
Convenience method for computing joint influence, where constant influences are expanded to hold valu...
static constexpr UsdTimeCode Default()
Produce a UsdTimeCode representing the sentinel value for 'default'.
Definition: timeCode.h:114
const UsdSkelAnimMapperRefPtr & GetMapper() const
USDSKEL_API bool IsRigidlyDeformed() const
Returns true if the held prim has the same joint influences across all points, or false otherwise.
USDSKEL_API bool GetTimeSamples(std::vector< double > *times) const
Populate times with the union of time samples for all properties that affect skinning,...
Schema wrapper for UsdAttribute for authoring and introspecting attributes that are primvars.
Definition: primvar.h:247
USDSKEL_API bool GetJointOrder(VtTokenArray *jointOrder) const
Get the custom joint order for this skinning site, if any.
USDSKEL_API bool ComputeSkinnedTransform(const VtArray< Matrix4 > &xforms, Matrix4 *xform, UsdTimeCode time=UsdTimeCode::Default()) const
Compute a skinning transform using specified skinning method attr (fallback to linear blend skinning ...
USDSKEL_API bool ComputeSkinnedNormals(const VtArray< Matrix4 > &xforms, VtVec3fArray *points, UsdTimeCode time=UsdTimeCode::Default()) const
Compute skinned normals using specified skinning method attr (fallback to linear blend skinning if no...
USDSKEL_API bool HasJointInfluences() const
Returns true if joint influence data is associated with this prim.