HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
basisCurves.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 USDGEOM_GENERATED_BASISCURVES_H
8 #define USDGEOM_GENERATED_BASISCURVES_H
9 
10 /// \file usdGeom/basisCurves.h
11 
12 #include "pxr/pxr.h"
13 #include "pxr/usd/usdGeom/api.h"
14 #include "pxr/usd/usdGeom/curves.h"
15 #include "pxr/usd/usd/prim.h"
16 #include "pxr/usd/usd/stage.h"
17 #include "pxr/usd/usdGeom/tokens.h"
18 
19 #include "pxr/base/vt/value.h"
20 
21 #include "pxr/base/gf/vec3d.h"
22 #include "pxr/base/gf/vec3f.h"
23 #include "pxr/base/gf/matrix4d.h"
24 
25 #include "pxr/base/tf/token.h"
26 #include "pxr/base/tf/type.h"
27 
29 
30 class SdfAssetPath;
31 
32 // -------------------------------------------------------------------------- //
33 // BASISCURVES //
34 // -------------------------------------------------------------------------- //
35 
36 /// \class UsdGeomBasisCurves
37 ///
38 /// BasisCurves are a batched curve representation analogous to the
39 /// classic RIB definition via Basis and Curves statements. BasisCurves are
40 /// often used to render dense aggregate geometry like hair or grass.
41 ///
42 /// A 'matrix' and 'vstep' associated with the \em basis are used to
43 /// interpolate the vertices of a cubic BasisCurves. (The basis attribute
44 /// is unused for linear BasisCurves.)
45 ///
46 /// A single prim may have many curves whose count is determined implicitly by
47 /// the length of the \em curveVertexCounts vector. Each individual curve is
48 /// composed of one or more segments. Each segment is defined by four vertices
49 /// for cubic curves and two vertices for linear curves. See the next section
50 /// for more information on how to map curve vertex counts to segment counts.
51 ///
52 /// \section UsdGeomBasisCurves_Segment Segment Indexing
53 /// Interpolating a curve requires knowing how to decompose it into its
54 /// individual segments.
55 ///
56 /// The segments of a cubic curve are determined by the vertex count,
57 /// the \em wrap (periodicity), and the vstep of the basis. For linear
58 /// curves, the basis token is ignored and only the vertex count and
59 /// wrap are needed.
60 ///
61 /// cubic basis | vstep
62 /// ------------- | ------
63 /// bezier | 3
64 /// catmullRom | 1
65 /// bspline | 1
66 ///
67 /// The first segment of a cubic (nonperiodic) curve is always defined by its
68 /// first four points. The vstep is the increment used to determine what
69 /// vertex indices define the next segment. For a two segment (nonperiodic)
70 /// bspline basis curve (vstep = 1), the first segment will be defined by
71 /// interpolating vertices [0, 1, 2, 3] and the second segment will be defined
72 /// by [1, 2, 3, 4]. For a two segment bezier basis curve (vstep = 3), the
73 /// first segment will be defined by interpolating vertices [0, 1, 2, 3] and
74 /// the second segment will be defined by [3, 4, 5, 6]. If the vstep is not
75 /// one, then you must take special care to make sure that the number of cvs
76 /// properly divides by your vstep. (The indices described are relative to
77 /// the initial vertex index for a batched curve.)
78 ///
79 /// For periodic curves, at least one of the curve's initial vertices are
80 /// repeated to close the curve. For cubic curves, the number of vertices
81 /// repeated is '4 - vstep'. For linear curves, only one vertex is repeated
82 /// to close the loop.
83 ///
84 /// Pinned curves are a special case of nonperiodic curves that only affects
85 /// the behavior of cubic Bspline and Catmull-Rom curves. To evaluate or render
86 /// pinned curves, a client must effectively add 'phantom points' at the
87 /// beginning and end of every curve in a batch. These phantom points
88 /// are injected to ensure that the interpolated curve begins at P[0] and
89 /// ends at P[n-1].
90 ///
91 /// For a curve with initial point P[0] and last point P[n-1], the phantom
92 /// points are defined as.
93 /// P[-1] = 2 * P[0] - P[1]
94 /// P[n] = 2 * P[n-1] - P[n-2]
95 ///
96 /// Pinned cubic curves will (usually) have to be unpacked into the standard
97 /// nonperiodic representation before rendering. This unpacking can add some
98 /// additional overhead. However, using pinned curves reduces the amount of
99 /// data recorded in a scene and (more importantly) better records the
100 /// authors' intent for interchange.
101 ///
102 /// \note The additional phantom points mean that the minimum curve vertex
103 /// count for cubic bspline and catmullRom curves is 2.
104 ///
105 /// Linear curve segments are defined by two vertices.
106 /// A two segment linear curve's first segment would be defined by
107 /// interpolating vertices [0, 1]. The second segment would be defined by
108 /// vertices [1, 2]. (Again, for a batched curve, indices are relative to
109 /// the initial vertex index.)
110 ///
111 /// When validating curve topology, each renderable entry in the
112 /// curveVertexCounts vector must pass this check.
113 ///
114 /// type | wrap | validitity
115 /// ------- | --------------------------- | ----------------
116 /// linear | nonperiodic | curveVertexCounts[i] > 2
117 /// linear | periodic | curveVertexCounts[i] > 3
118 /// cubic | nonperiodic | (curveVertexCounts[i] - 4) % vstep == 0
119 /// cubic | periodic | (curveVertexCounts[i]) % vstep == 0
120 /// cubic | pinned (catmullRom/bspline) | (curveVertexCounts[i] - 2) >= 0
121 ///
122 /// \section UsdGeomBasisCurves_BasisMatrix Cubic Vertex Interpolation
123 ///
124 /// \image html USDCurveBasisMatrix.png width=750
125 ///
126 /// \section UsdGeomBasisCurves_Linear Linear Vertex Interpolation
127 ///
128 /// Linear interpolation is always used on curves of type linear.
129 /// 't' with domain [0, 1], the curve is defined by the equation
130 /// P0 * (1-t) + P1 * t. t at 0 describes the first point and t at 1 describes
131 /// the end point.
132 ///
133 /// \section UsdGeomBasisCurves_PrimvarInterpolation Primvar Interpolation
134 ///
135 /// For cubic curves, primvar data can be either interpolated cubically between
136 /// vertices or linearly across segments. The corresponding token
137 /// for cubic interpolation is 'vertex' and for linear interpolation is
138 /// 'varying'. Per vertex data should be the same size as the number
139 /// of vertices in your curve. Segment varying data is dependent on the
140 /// wrap (periodicity) and number of segments in your curve. For linear curves,
141 /// varying and vertex data would be interpolated the same way. By convention
142 /// varying is the preferred interpolation because of the association of
143 /// varying with linear interpolation.
144 ///
145 /// \image html USDCurvePrimvars.png
146 ///
147 /// To convert an entry in the curveVertexCounts vector into a segment count
148 /// for an individual curve, apply these rules. Sum up all the results in
149 /// order to compute how many total segments all curves have.
150 ///
151 /// The following tables describe the expected segment count for the 'i'th
152 /// curve in a curve batch as well as the entire batch. Python syntax
153 /// like '[:]' (to describe all members of an array) and 'len(...)'
154 /// (to describe the length of an array) are used.
155 ///
156 /// type | wrap | curve segment count | batch segment count
157 /// ------- | --------------------------- | -------------------------------------- | --------------------------
158 /// linear | nonperiodic | curveVertexCounts[i] - 1 | sum(curveVertexCounts[:]) - len(curveVertexCounts)
159 /// linear | periodic | curveVertexCounts[i] | sum(curveVertexCounts[:])
160 /// cubic | nonperiodic | (curveVertexCounts[i] - 4) / vstep + 1 | sum(curveVertexCounts[:] - 4) / vstep + len(curveVertexCounts)
161 /// cubic | periodic | curveVertexCounts[i] / vstep | sum(curveVertexCounts[:]) / vstep
162 /// cubic | pinned (catmullRom/bspline) | (curveVertexCounts[i] - 2) + 1 | sum(curveVertexCounts[:] - 2) + len(curveVertexCounts)
163 ///
164 /// The following table descrives the expected size of varying
165 /// (linearly interpolated) data, derived from the segment counts computed
166 /// above.
167 ///
168 /// wrap | curve varying count | batch varying count
169 /// ------------------- | ---------------------------- | ------------------------------------------------
170 /// nonperiodic/pinned | segmentCounts[i] + 1 | sum(segmentCounts[:]) + len(curveVertexCounts)
171 /// periodic | segmentCounts[i] | sum(segmentCounts[:])
172 ///
173 /// Both curve types additionally define 'constant' interpolation for the
174 /// entire prim and 'uniform' interpolation as per curve data.
175 ///
176 ///
177 /// \note Take care when providing support for linearly interpolated data for
178 /// cubic curves. Its shape doesn't provide a one to one mapping with either
179 /// the number of curves (like 'uniform') or the number of vertices (like
180 /// 'vertex') and so it is often overlooked. This is the only primitive in
181 /// UsdGeom (as of this writing) where this is true. For meshes, while they
182 /// use different interpolation methods, 'varying' and 'vertex' are both
183 /// specified per point. It's common to assume that curves follow a similar
184 /// pattern and build in structures and language for per primitive, per
185 /// element, and per point data only to come upon these arrays that don't
186 /// quite fit into either of those categories. It is
187 /// also common to conflate 'varying' with being per segment data and use the
188 /// segmentCount rules table instead of its neighboring varying data table
189 /// rules. We suspect that this is because for the common case of
190 /// nonperiodic cubic curves, both the provided segment count and varying data
191 /// size formula end with '+ 1'. While debugging, users may look at the double
192 /// '+ 1' as a mistake and try to remove it. We take this time to enumerate
193 /// these issues because we've fallen into them before and hope that we save
194 /// others time in their own implementations.
195 ///
196 /// As an example of deriving per curve segment and varying primvar data counts from
197 /// the wrap, type, basis, and curveVertexCount, the following table is provided.
198 ///
199 /// wrap | type | basis | curveVertexCount | curveSegmentCount | varyingDataCount
200 /// ------------- | ------- | ------- | ----------------- | ------------------ | -------------------------
201 /// nonperiodic | linear | N/A | [2 3 2 5] | [1 2 1 4] | [2 3 2 5]
202 /// nonperiodic | cubic | bezier | [4 7 10 4 7] | [1 2 3 1 2] | [2 3 4 2 3]
203 /// nonperiodic | cubic | bspline | [5 4 6 7] | [2 1 3 4] | [3 2 4 5]
204 /// periodic | cubic | bezier | [6 9 6] | [2 3 2] | [2 3 2]
205 /// periodic | linear | N/A | [3 7] | [3 7] | [3 7]
206 ///
207 /// \section UsdGeomBasisCurves_TubesAndRibbons Tubes and Ribbons
208 ///
209 /// The strictest definition of a curve as an infinitely thin wire is not
210 /// particularly useful for describing production scenes. The additional
211 /// \em widths and \em normals attributes can be used to describe cylindrical
212 /// tubes and or flat oriented ribbons.
213 ///
214 /// Curves with only widths defined are imaged as tubes with radius
215 /// 'width / 2'. Curves with both widths and normals are imaged as ribbons
216 /// oriented in the direction of the interpolated normal vectors.
217 ///
218 /// While not technically UsdGeomPrimvars, widths and normals
219 /// also have interpolation metadata. It's common for authored widths to have
220 /// constant, varying, or vertex interpolation
221 /// (see UsdGeomCurves::GetWidthsInterpolation()). It's common for
222 /// authored normals to have varying interpolation
223 /// (see UsdGeomPointBased::GetNormalsInterpolation()).
224 ///
225 /// \image html USDCurveHydra.png
226 ///
227 /// The file used to generate these curves can be found in
228 /// extras/usd/examples/usdGeomExamples/basisCurves.usda. It's provided
229 /// as a reference on how to properly image both tubes and ribbons. The first
230 /// row of curves are linear; the second are cubic bezier. (We aim in future
231 /// releases of HdSt to fix the discontinuity seen with broken tangents to
232 /// better match offline renderers like RenderMan.) The yellow and violet
233 /// cubic curves represent cubic vertex width interpolation for which there is
234 /// no equivalent for linear curves.
235 ///
236 /// \note How did this prim type get its name? This prim is a portmanteau of
237 /// two different statements in the original RenderMan specification:
238 /// 'Basis' and 'Curves'.
239 ///
240 ///
241 /// For any described attribute \em Fallback \em Value or \em Allowed \em Values below
242 /// that are text/tokens, the actual token is published and defined in \ref UsdGeomTokens.
243 /// So to set an attribute to the value "rightHanded", use UsdGeomTokens->rightHanded
244 /// as the value.
245 ///
247 {
248 public:
249  /// Compile time constant representing what kind of schema this class is.
250  ///
251  /// \sa UsdSchemaKind
253 
254  /// Construct a UsdGeomBasisCurves on UsdPrim \p prim .
255  /// Equivalent to UsdGeomBasisCurves::Get(prim.GetStage(), prim.GetPath())
256  /// for a \em valid \p prim, but will not immediately throw an error for
257  /// an invalid \p prim
258  explicit UsdGeomBasisCurves(const UsdPrim& prim=UsdPrim())
259  : UsdGeomCurves(prim)
260  {
261  }
262 
263  /// Construct a UsdGeomBasisCurves on the prim held by \p schemaObj .
264  /// Should be preferred over UsdGeomBasisCurves(schemaObj.GetPrim()),
265  /// as it preserves SchemaBase state.
266  explicit UsdGeomBasisCurves(const UsdSchemaBase& schemaObj)
267  : UsdGeomCurves(schemaObj)
268  {
269  }
270 
271  /// Destructor.
273  virtual ~UsdGeomBasisCurves();
274 
275  /// Return a vector of names of all pre-declared attributes for this schema
276  /// class and all its ancestor classes. Does not include attributes that
277  /// may be authored by custom/extended methods of the schemas involved.
279  static const TfTokenVector &
280  GetSchemaAttributeNames(bool includeInherited=true);
281 
282  /// Return a UsdGeomBasisCurves holding the prim adhering to this
283  /// schema at \p path on \p stage. If no prim exists at \p path on
284  /// \p stage, or if the prim at that path does not adhere to this schema,
285  /// return an invalid schema object. This is shorthand for the following:
286  ///
287  /// \code
288  /// UsdGeomBasisCurves(stage->GetPrimAtPath(path));
289  /// \endcode
290  ///
292  static UsdGeomBasisCurves
293  Get(const UsdStagePtr &stage, const SdfPath &path);
294 
295  /// Attempt to ensure a \a UsdPrim adhering to this schema at \p path
296  /// is defined (according to UsdPrim::IsDefined()) on this stage.
297  ///
298  /// If a prim adhering to this schema at \p path is already defined on this
299  /// stage, return that prim. Otherwise author an \a SdfPrimSpec with
300  /// \a specifier == \a SdfSpecifierDef and this schema's prim type name for
301  /// the prim at \p path at the current EditTarget. Author \a SdfPrimSpec s
302  /// with \p specifier == \a SdfSpecifierDef and empty typeName at the
303  /// current EditTarget for any nonexistent, or existing but not \a Defined
304  /// ancestors.
305  ///
306  /// The given \a path must be an absolute prim path that does not contain
307  /// any variant selections.
308  ///
309  /// If it is impossible to author any of the necessary PrimSpecs, (for
310  /// example, in case \a path cannot map to the current UsdEditTarget's
311  /// namespace) issue an error and return an invalid \a UsdPrim.
312  ///
313  /// Note that this method may return a defined prim whose typeName does not
314  /// specify this schema class, in case a stronger typeName opinion overrides
315  /// the opinion at the current EditTarget.
316  ///
318  static UsdGeomBasisCurves
319  Define(const UsdStagePtr &stage, const SdfPath &path);
320 
321 protected:
322  /// Returns the kind of schema this class belongs to.
323  ///
324  /// \sa UsdSchemaKind
326  UsdSchemaKind _GetSchemaKind() const override;
327 
328 private:
329  // needs to invoke _GetStaticTfType.
330  friend class UsdSchemaRegistry;
332  static const TfType &_GetStaticTfType();
333 
334  static bool _IsTypedSchema();
335 
336  // override SchemaBase virtuals.
338  const TfType &_GetTfType() const override;
339 
340 public:
341  // --------------------------------------------------------------------- //
342  // TYPE
343  // --------------------------------------------------------------------- //
344  /// Linear curves interpolate linearly between two vertices.
345  /// Cubic curves use a basis matrix with four vertices to interpolate a segment.
346  ///
347  /// | ||
348  /// | -- | -- |
349  /// | Declaration | `uniform token type = "cubic"` |
350  /// | C++ Type | TfToken |
351  /// | \ref Usd_Datatypes "Usd Type" | SdfValueTypeNames->Token |
352  /// | \ref SdfVariability "Variability" | SdfVariabilityUniform |
353  /// | \ref UsdGeomTokens "Allowed Values" | linear, cubic |
355  UsdAttribute GetTypeAttr() const;
356 
357  /// See GetTypeAttr(), and also
358  /// \ref Usd_Create_Or_Get_Property for when to use Get vs Create.
359  /// If specified, author \p defaultValue as the attribute's default,
360  /// sparsely (when it makes sense to do so) if \p writeSparsely is \c true -
361  /// the default for \p writeSparsely is \c false.
363  UsdAttribute CreateTypeAttr(VtValue const &defaultValue = VtValue(), bool writeSparsely=false) const;
364 
365 public:
366  // --------------------------------------------------------------------- //
367  // BASIS
368  // --------------------------------------------------------------------- //
369  /// The basis specifies the vstep and matrix used for cubic
370  /// interpolation. \note The 'hermite' and 'power' tokens have been
371  /// removed. We've provided UsdGeomHermiteCurves
372  /// as an alternative for the 'hermite' basis.
373  ///
374  /// | ||
375  /// | -- | -- |
376  /// | Declaration | `uniform token basis = "bezier"` |
377  /// | C++ Type | TfToken |
378  /// | \ref Usd_Datatypes "Usd Type" | SdfValueTypeNames->Token |
379  /// | \ref SdfVariability "Variability" | SdfVariabilityUniform |
380  /// | \ref UsdGeomTokens "Allowed Values" | bezier, bspline, catmullRom |
382  UsdAttribute GetBasisAttr() const;
383 
384  /// See GetBasisAttr(), and also
385  /// \ref Usd_Create_Or_Get_Property for when to use Get vs Create.
386  /// If specified, author \p defaultValue as the attribute's default,
387  /// sparsely (when it makes sense to do so) if \p writeSparsely is \c true -
388  /// the default for \p writeSparsely is \c false.
390  UsdAttribute CreateBasisAttr(VtValue const &defaultValue = VtValue(), bool writeSparsely=false) const;
391 
392 public:
393  // --------------------------------------------------------------------- //
394  // WRAP
395  // --------------------------------------------------------------------- //
396  /// If wrap is set to periodic, the curve when rendered will
397  /// repeat the initial vertices (dependent on the vstep) to close the
398  /// curve. If wrap is set to 'pinned', phantom points may be created
399  /// to ensure that the curve interpolation starts at P[0] and ends at P[n-1].
400  ///
401  ///
402  /// | ||
403  /// | -- | -- |
404  /// | Declaration | `uniform token wrap = "nonperiodic"` |
405  /// | C++ Type | TfToken |
406  /// | \ref Usd_Datatypes "Usd Type" | SdfValueTypeNames->Token |
407  /// | \ref SdfVariability "Variability" | SdfVariabilityUniform |
408  /// | \ref UsdGeomTokens "Allowed Values" | nonperiodic, periodic, pinned |
410  UsdAttribute GetWrapAttr() const;
411 
412  /// See GetWrapAttr(), and also
413  /// \ref Usd_Create_Or_Get_Property for when to use Get vs Create.
414  /// If specified, author \p defaultValue as the attribute's default,
415  /// sparsely (when it makes sense to do so) if \p writeSparsely is \c true -
416  /// the default for \p writeSparsely is \c false.
418  UsdAttribute CreateWrapAttr(VtValue const &defaultValue = VtValue(), bool writeSparsely=false) const;
419 
420 public:
421  // ===================================================================== //
422  // Feel free to add custom code below this line, it will be preserved by
423  // the code generator.
424  //
425  // Just remember to:
426  // - Close the class declaration with };
427  // - Close the namespace with PXR_NAMESPACE_CLOSE_SCOPE
428  // - Close the include guard with #endif
429  // ===================================================================== //
430  // --(BEGIN CUSTOM CODE)--
431 
432  /// \name Helper functions for working with UsdGeomCurves
433  /// \{
434 
435  typedef std::vector< std::pair<TfToken, size_t> > ComputeInterpolationInfo;
436 
437  /// Computes interpolation token for \p n.
438  ///
439  /// If this returns an empty token and \p info was non-NULL, it'll contain
440  /// the expected value for each token.
441  ///
442  /// The topology is determined using \p timeCode.
445  const UsdTimeCode& timeCode,
446  ComputeInterpolationInfo* info=NULL) const;
447 
448  /// Computes the expected size for data with "uniform" interpolation.
449  ///
450  /// If you're trying to determine what interpolation to use, it is more
451  /// efficient to use \c ComputeInterpolationForSize
453  size_t ComputeUniformDataSize(const UsdTimeCode& timeCode) const;
454 
455  /// Computes the expected size for data with "varying" interpolation.
456  ///
457  /// If you're trying to determine what interpolation to use, it is more
458  /// efficient to use \c ComputeInterpolationForSize
460  size_t ComputeVaryingDataSize(const UsdTimeCode& timeCode) const;
461 
462  /// Computes the expected size for data with "vertex" interpolation.
463  ///
464  /// If you're trying to determine what interpolation to use, it is more
465  /// efficient to use \c ComputeInterpolationForSize
467  size_t ComputeVertexDataSize(const UsdTimeCode& timeCode) const;
468 
469  /// Computes the segment counts of the curves based on their vertex counts
470  /// from the \c curveVertexCounts attribute.
472  VtIntArray ComputeSegmentCounts(const UsdTimeCode& timeCode) const;
473 
474  /// \}
475 };
476 
478 
479 #endif
std::vector< std::pair< TfToken, size_t > > ComputeInterpolationInfo
Definition: basisCurves.h:435
static USDGEOM_API UsdGeomBasisCurves Define(const UsdStagePtr &stage, const SdfPath &path)
UsdGeomBasisCurves(const UsdPrim &prim=UsdPrim())
Definition: basisCurves.h:258
USDGEOM_API size_t ComputeVertexDataSize(const UsdTimeCode &timeCode) const
GLsizei const GLchar *const * path
Definition: glcorearb.h:3341
static const UsdSchemaKind schemaKind
Definition: basisCurves.h:252
USDGEOM_API UsdAttribute GetBasisAttr() const
GLdouble n
Definition: glcorearb.h:2008
Definition: token.h:70
Represents a concrete typed schema.
UsdGeomBasisCurves(const UsdSchemaBase &schemaObj)
Definition: basisCurves.h:266
static USDGEOM_API const TfTokenVector & GetSchemaAttributeNames(bool includeInherited=true)
USDGEOM_API size_t ComputeUniformDataSize(const UsdTimeCode &timeCode) const
USDGEOM_API TfToken ComputeInterpolationForSize(size_t n, const UsdTimeCode &timeCode, ComputeInterpolationInfo *info=NULL) const
Definition: prim.h:116
std::vector< TfToken > TfTokenVector
Convenience types.
Definition: token.h:440
Definition: path.h:273
static USDGEOM_API UsdGeomBasisCurves Get(const UsdStagePtr &stage, const SdfPath &path)
UsdSchemaKind
Definition: common.h:112
PXR_NAMESPACE_CLOSE_SCOPE PXR_NAMESPACE_OPEN_SCOPE
Definition: path.h:1425
USDGEOM_API UsdSchemaKind _GetSchemaKind() const override
virtual USDGEOM_API ~UsdGeomBasisCurves()
Destructor.
#define PXR_NAMESPACE_CLOSE_SCOPE
Definition: pxr.h:74
USDGEOM_API size_t ComputeVaryingDataSize(const UsdTimeCode &timeCode) const
Definition: type.h:47
USDGEOM_API UsdAttribute GetWrapAttr() const
#define USDGEOM_API
Definition: api.h:23
USDGEOM_API UsdAttribute CreateTypeAttr(VtValue const &defaultValue=VtValue(), bool writeSparsely=false) const
USDGEOM_API UsdAttribute CreateWrapAttr(VtValue const &defaultValue=VtValue(), bool writeSparsely=false) const
USDGEOM_API UsdAttribute CreateBasisAttr(VtValue const &defaultValue=VtValue(), bool writeSparsely=false) const
Definition: value.h:146
USDGEOM_API UsdAttribute GetTypeAttr() const
USDGEOM_API VtIntArray ComputeSegmentCounts(const UsdTimeCode &timeCode) const