// // Copyright 2016 Pixar // // Licensed under the Apache License, Version 2.0 (the "Apache License") // with the following modification; you may not use this file except in // compliance with the Apache License and the following modification to it: // Section 6. Trademarks. is deleted and replaced with: // // 6. Trademarks. This License does not grant permission to use the trade // names, trademarks, service marks, or product names of the Licensor // and its affiliates, except as required to comply with Section 4(c) of // the License and to reproduce the content of the NOTICE file. // // You may obtain a copy of the Apache License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the Apache License with the above modification is // distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the Apache License for the specific // language governing permissions and limitations under the Apache License. // #ifndef USDGEOM_GENERATED_MODELAPI_H #define USDGEOM_GENERATED_MODELAPI_H /// \file usdGeom/modelAPI.h #include "pxr/pxr.h" #include "pxr/usd/usdGeom/api.h" #include "pxr/usd/usd/apiSchemaBase.h" #include "pxr/usd/usd/prim.h" #include "pxr/usd/usd/stage.h" #include "pxr/usd/usdGeom/tokens.h" #include "pxr/usd/usdGeom/bboxCache.h" #include "pxr/usd/usdGeom/constraintTarget.h" #include "pxr/usd/usdGeom/imageable.h" #include "pxr/base/vt/value.h" #include "pxr/base/gf/vec3d.h" #include "pxr/base/gf/vec3f.h" #include "pxr/base/gf/matrix4d.h" #include "pxr/base/tf/token.h" #include "pxr/base/tf/type.h" PXR_NAMESPACE_OPEN_SCOPE class SdfAssetPath; // -------------------------------------------------------------------------- // // GEOMMODELAPI // // -------------------------------------------------------------------------- // /// \class UsdGeomModelAPI /// /// UsdGeomModelAPI extends the generic UsdModelAPI schema with /// geometry specific concepts such as cached extents for the entire model, /// constraint targets, and geometry-inspired extensions to the payload /// lofting process. /// /// As described in GetExtentsHint() below, it is useful to cache extents /// at the model level. UsdGeomModelAPI provides schema for computing and /// storing these cached extents, which can be consumed by UsdGeomBBoxCache to /// provide fast access to precomputed extents that will be used as the model's /// bounds ( see UsdGeomBBoxCache::UsdGeomBBoxCache() ). /// /// \section UsdGeomModelAPI_drawMode Draw Modes /// /// Draw modes provide optional alternate imaging behavior for USD subtrees with /// kind model. \em model:drawMode (which is inheritable) and /// \em model:applyDrawMode (which is not) are resolved into a decision to stop /// traversing the scene graph at a certain point, and replace a USD subtree /// with proxy geometry. /// /// The value of \em model:drawMode determines the type of proxy geometry: /// - \em origin - Draw the model-space basis vectors of the replaced prim. /// - \em bounds - Draw the model-space bounding box of the replaced prim. /// - \em cards - Draw textured quads as a placeholder for the replaced prim. /// - \em default - An explicit opinion to draw the USD subtree as normal. /// /// \em model:drawMode is inheritable so that a whole scene, a large group, or /// all prototypes of a model hierarchy PointInstancer can be assigned a draw /// mode with a single attribute edit. \em model:applyDrawMode is meant to be /// written when an asset is authored, and provides flexibility for different /// asset types. For example, a character assembly (composed of character, /// clothes, etc) might have \em model:applyDrawMode set at the top of the /// subtree so the whole group can be drawn as a single card object. An effects /// subtree might have \em model:applyDrawMode set at a lower level so each /// particle group draws individually. /// /// Models of kind component are treated as if \em model:applyDrawMode /// were true. This means a prim is drawn with proxy geometry when: the /// prim has kind component, and/or \em model:applyDrawMode is set; and /// the prim or an ancestor has a non-default value for \em model:drawMode. /// A value for \em model:drawMode on a child prim takes precedence over a /// value on a parent prim. /// /// \section UsdGeomModelAPI_cardGeometry Cards Geometry /// /// The specific geometry used in cards mode is controlled by the /// \em model:cardGeometry attribute: /// - \em cross - Generate a quad normal to each basis direction and negative. /// Locate each quad so that it bisects the model extents. /// - \em box - Generate a quad normal to each basis direction and negative. /// Locate each quad on a face of the model extents, facing out. /// - \em fromTexture - Generate a quad for each supplied texture from /// attributes stored in that texture's metadata. /// /// For \em cross and \em box mode, the extents are calculated for purposes /// \em default, \em proxy, and \em render, at their earliest authored time. /// If the model has no textures, all six card faces are rendered using /// \em model:drawModeColor. If one or more textures are present, only axes /// with one or more textures assigned are drawn. For each axis, if both /// textures (positive and negative) are specified, they'll be used on the /// corresponding card faces; if only one texture is specified, it will be /// mapped to the opposite card face after being flipped on the texture's /// s-axis. Any card faces with invalid asset paths will be drawn with /// \em model:drawModeColor. /// /// Both \em model:cardGeometry and \em model:drawModeColor should be /// authored on the prim where the draw mode takes effect, since these /// attributes are not inherited. /// /// For \em fromTexture mode, only card faces with valid textures assigned /// are drawn. The geometry is generated by pulling the \em worldtoscreen /// attribute out of texture metadata. This is expected to be a 4x4 matrix /// mapping the model-space position of the card quad to the clip-space quad /// with corners (-1,-1,0) and (1,1,0). The card vertices are generated by /// transforming the clip-space corners by the inverse of \em worldtoscreen. /// Textures are mapped so that (s) and (t) map to (+x) and (+y) in clip space. /// If the metadata cannot be read in the right format, or the matrix can't /// be inverted, the card face is not drawn. /// /// All card faces are drawn and textured as single-sided. /// /// \todo CreatePayload() /// /// For any described attribute \em Fallback \em Value or \em Allowed \em Values below /// that are text/tokens, the actual token is published and defined in \ref UsdGeomTokens. /// So to set an attribute to the value "rightHanded", use UsdGeomTokens->rightHanded /// as the value. /// class UsdGeomModelAPI : public UsdAPISchemaBase { public: /// Compile time constant representing what kind of schema this class is. /// /// \sa UsdSchemaType static const UsdSchemaType schemaType = UsdSchemaType::SingleApplyAPI; /// Construct a UsdGeomModelAPI on UsdPrim \p prim . /// Equivalent to UsdGeomModelAPI::Get(prim.GetStage(), prim.GetPath()) /// for a \em valid \p prim, but will not immediately throw an error for /// an invalid \p prim explicit UsdGeomModelAPI(const UsdPrim& prim=UsdPrim()) : UsdAPISchemaBase(prim) { } /// Construct a UsdGeomModelAPI on the prim held by \p schemaObj . /// Should be preferred over UsdGeomModelAPI(schemaObj.GetPrim()), /// as it preserves SchemaBase state. explicit UsdGeomModelAPI(const UsdSchemaBase& schemaObj) : UsdAPISchemaBase(schemaObj) { } /// Destructor. USDGEOM_API virtual ~UsdGeomModelAPI(); /// Return a vector of names of all pre-declared attributes for this schema /// class and all its ancestor classes. Does not include attributes that /// may be authored by custom/extended methods of the schemas involved. USDGEOM_API static const TfTokenVector & GetSchemaAttributeNames(bool includeInherited=true); /// Return a UsdGeomModelAPI holding the prim adhering to this /// schema at \p path on \p stage. If no prim exists at \p path on /// \p stage, or if the prim at that path does not adhere to this schema, /// return an invalid schema object. This is shorthand for the following: /// /// \code /// UsdGeomModelAPI(stage->GetPrimAtPath(path)); /// \endcode /// USDGEOM_API static UsdGeomModelAPI Get(const UsdStagePtr &stage, const SdfPath &path); /// Applies this single-apply API schema to the given \p prim. /// This information is stored by adding "GeomModelAPI" to the /// token-valued, listOp metadata \em apiSchemas on the prim. /// /// \return A valid UsdGeomModelAPI object is returned upon success. /// An invalid (or empty) UsdGeomModelAPI object is returned upon /// failure. See \ref UsdPrim::ApplyAPI() for conditions /// resulting in failure. /// /// \sa UsdPrim::GetAppliedSchemas() /// \sa UsdPrim::HasAPI() /// \sa UsdPrim::ApplyAPI() /// \sa UsdPrim::RemoveAPI() /// USDGEOM_API static UsdGeomModelAPI Apply(const UsdPrim &prim); protected: /// Returns the type of schema this class belongs to. /// /// \sa UsdSchemaType USDGEOM_API UsdSchemaType _GetSchemaType() const override; private: // needs to invoke _GetStaticTfType. friend class UsdSchemaRegistry; USDGEOM_API static const TfType &_GetStaticTfType(); static bool _IsTypedSchema(); // override SchemaBase virtuals. USDGEOM_API const TfType &_GetTfType() const override; public: // --------------------------------------------------------------------- // // MODELDRAWMODE // --------------------------------------------------------------------- // /// Alternate imaging mode; applied to this prim or child prims /// where \em model:applyDrawMode is true, or where the prim /// has kind \em component. See \ref UsdGeomModelAPI_drawMode /// for mode descriptions. /// /// | || /// | -- | -- | /// | Declaration | `uniform token model:drawMode` | /// | C++ Type | TfToken | /// | \ref Usd_Datatypes "Usd Type" | SdfValueTypeNames->Token | /// | \ref SdfVariability "Variability" | SdfVariabilityUniform | /// | \ref UsdGeomTokens "Allowed Values" | origin, bounds, cards, default | USDGEOM_API UsdAttribute GetModelDrawModeAttr() const; /// See GetModelDrawModeAttr(), and also /// \ref Usd_Create_Or_Get_Property for when to use Get vs Create. /// If specified, author \p defaultValue as the attribute's default, /// sparsely (when it makes sense to do so) if \p writeSparsely is \c true - /// the default for \p writeSparsely is \c false. USDGEOM_API UsdAttribute CreateModelDrawModeAttr(VtValue const &defaultValue = VtValue(), bool writeSparsely=false) const; public: // --------------------------------------------------------------------- // // MODELAPPLYDRAWMODE // --------------------------------------------------------------------- // /// If true, and this prim or parent prims have \em model:drawMode /// set, apply an alternate imaging mode to this prim. See /// \ref UsdGeomModelAPI_drawMode. /// /// | || /// | -- | -- | /// | Declaration | `uniform bool model:applyDrawMode` | /// | C++ Type | bool | /// | \ref Usd_Datatypes "Usd Type" | SdfValueTypeNames->Bool | /// | \ref SdfVariability "Variability" | SdfVariabilityUniform | USDGEOM_API UsdAttribute GetModelApplyDrawModeAttr() const; /// See GetModelApplyDrawModeAttr(), and also /// \ref Usd_Create_Or_Get_Property for when to use Get vs Create. /// If specified, author \p defaultValue as the attribute's default, /// sparsely (when it makes sense to do so) if \p writeSparsely is \c true - /// the default for \p writeSparsely is \c false. USDGEOM_API UsdAttribute CreateModelApplyDrawModeAttr(VtValue const &defaultValue = VtValue(), bool writeSparsely=false) const; public: // --------------------------------------------------------------------- // // MODELDRAWMODECOLOR // --------------------------------------------------------------------- // /// The base color of imaging prims inserted for alternate /// imaging modes. For \em origin and \em bounds modes, this /// controls line color; for \em cards mode, this controls the /// fallback quad color. If unspecified, it should be interpreted /// as (0.18, 0.18, 0.18). /// /// | || /// | -- | -- | /// | Declaration | `uniform float3 model:drawModeColor` | /// | C++ Type | GfVec3f | /// | \ref Usd_Datatypes "Usd Type" | SdfValueTypeNames->Float3 | /// | \ref SdfVariability "Variability" | SdfVariabilityUniform | USDGEOM_API UsdAttribute GetModelDrawModeColorAttr() const; /// See GetModelDrawModeColorAttr(), and also /// \ref Usd_Create_Or_Get_Property for when to use Get vs Create. /// If specified, author \p defaultValue as the attribute's default, /// sparsely (when it makes sense to do so) if \p writeSparsely is \c true - /// the default for \p writeSparsely is \c false. USDGEOM_API UsdAttribute CreateModelDrawModeColorAttr(VtValue const &defaultValue = VtValue(), bool writeSparsely=false) const; public: // --------------------------------------------------------------------- // // MODELCARDGEOMETRY // --------------------------------------------------------------------- // /// The geometry to generate for imaging prims inserted for \em /// cards imaging mode. See \ref UsdGeomModelAPI_cardGeometry for /// geometry descriptions. If unspecified, it should be interpreted /// as \em cross. /// /// | || /// | -- | -- | /// | Declaration | `uniform token model:cardGeometry` | /// | C++ Type | TfToken | /// | \ref Usd_Datatypes "Usd Type" | SdfValueTypeNames->Token | /// | \ref SdfVariability "Variability" | SdfVariabilityUniform | /// | \ref UsdGeomTokens "Allowed Values" | cross, box, fromTexture | USDGEOM_API UsdAttribute GetModelCardGeometryAttr() const; /// See GetModelCardGeometryAttr(), and also /// \ref Usd_Create_Or_Get_Property for when to use Get vs Create. /// If specified, author \p defaultValue as the attribute's default, /// sparsely (when it makes sense to do so) if \p writeSparsely is \c true - /// the default for \p writeSparsely is \c false. USDGEOM_API UsdAttribute CreateModelCardGeometryAttr(VtValue const &defaultValue = VtValue(), bool writeSparsely=false) const; public: // --------------------------------------------------------------------- // // MODELCARDTEXTUREXPOS // --------------------------------------------------------------------- // /// In \em cards imaging mode, the texture applied to the X+ quad. /// The texture axes (s,t) are mapped to model-space axes (-y, -z). /// /// | || /// | -- | -- | /// | Declaration | `asset model:cardTextureXPos` | /// | C++ Type | SdfAssetPath | /// | \ref Usd_Datatypes "Usd Type" | SdfValueTypeNames->Asset | USDGEOM_API UsdAttribute GetModelCardTextureXPosAttr() const; /// See GetModelCardTextureXPosAttr(), and also /// \ref Usd_Create_Or_Get_Property for when to use Get vs Create. /// If specified, author \p defaultValue as the attribute's default, /// sparsely (when it makes sense to do so) if \p writeSparsely is \c true - /// the default for \p writeSparsely is \c false. USDGEOM_API UsdAttribute CreateModelCardTextureXPosAttr(VtValue const &defaultValue = VtValue(), bool writeSparsely=false) const; public: // --------------------------------------------------------------------- // // MODELCARDTEXTUREYPOS // --------------------------------------------------------------------- // /// In \em cards imaging mode, the texture applied to the Y+ quad. /// The texture axes (s,t) are mapped to model-space axes (x, -z). /// /// | || /// | -- | -- | /// | Declaration | `asset model:cardTextureYPos` | /// | C++ Type | SdfAssetPath | /// | \ref Usd_Datatypes "Usd Type" | SdfValueTypeNames->Asset | USDGEOM_API UsdAttribute GetModelCardTextureYPosAttr() const; /// See GetModelCardTextureYPosAttr(), and also /// \ref Usd_Create_Or_Get_Property for when to use Get vs Create. /// If specified, author \p defaultValue as the attribute's default, /// sparsely (when it makes sense to do so) if \p writeSparsely is \c true - /// the default for \p writeSparsely is \c false. USDGEOM_API UsdAttribute CreateModelCardTextureYPosAttr(VtValue const &defaultValue = VtValue(), bool writeSparsely=false) const; public: // --------------------------------------------------------------------- // // MODELCARDTEXTUREZPOS // --------------------------------------------------------------------- // /// In \em cards imaging mode, the texture applied to the Z+ quad. /// The texture axes (s,t) are mapped to model-space axes (x, -y). /// /// | || /// | -- | -- | /// | Declaration | `asset model:cardTextureZPos` | /// | C++ Type | SdfAssetPath | /// | \ref Usd_Datatypes "Usd Type" | SdfValueTypeNames->Asset | USDGEOM_API UsdAttribute GetModelCardTextureZPosAttr() const; /// See GetModelCardTextureZPosAttr(), and also /// \ref Usd_Create_Or_Get_Property for when to use Get vs Create. /// If specified, author \p defaultValue as the attribute's default, /// sparsely (when it makes sense to do so) if \p writeSparsely is \c true - /// the default for \p writeSparsely is \c false. USDGEOM_API UsdAttribute CreateModelCardTextureZPosAttr(VtValue const &defaultValue = VtValue(), bool writeSparsely=false) const; public: // --------------------------------------------------------------------- // // MODELCARDTEXTUREXNEG // --------------------------------------------------------------------- // /// In \em cards imaging mode, the texture applied to the X- quad. /// The texture axes (s,t) are mapped to model-space axes (y, -z). /// /// | || /// | -- | -- | /// | Declaration | `asset model:cardTextureXNeg` | /// | C++ Type | SdfAssetPath | /// | \ref Usd_Datatypes "Usd Type" | SdfValueTypeNames->Asset | USDGEOM_API UsdAttribute GetModelCardTextureXNegAttr() const; /// See GetModelCardTextureXNegAttr(), and also /// \ref Usd_Create_Or_Get_Property for when to use Get vs Create. /// If specified, author \p defaultValue as the attribute's default, /// sparsely (when it makes sense to do so) if \p writeSparsely is \c true - /// the default for \p writeSparsely is \c false. USDGEOM_API UsdAttribute CreateModelCardTextureXNegAttr(VtValue const &defaultValue = VtValue(), bool writeSparsely=false) const; public: // --------------------------------------------------------------------- // // MODELCARDTEXTUREYNEG // --------------------------------------------------------------------- // /// In \em cards imaging mode, the texture applied to the Y- quad. /// The texture axes (s,t) are mapped to model-space axes (-x, -z). /// /// | || /// | -- | -- | /// | Declaration | `asset model:cardTextureYNeg` | /// | C++ Type | SdfAssetPath | /// | \ref Usd_Datatypes "Usd Type" | SdfValueTypeNames->Asset | USDGEOM_API UsdAttribute GetModelCardTextureYNegAttr() const; /// See GetModelCardTextureYNegAttr(), and also /// \ref Usd_Create_Or_Get_Property for when to use Get vs Create. /// If specified, author \p defaultValue as the attribute's default, /// sparsely (when it makes sense to do so) if \p writeSparsely is \c true - /// the default for \p writeSparsely is \c false. USDGEOM_API UsdAttribute CreateModelCardTextureYNegAttr(VtValue const &defaultValue = VtValue(), bool writeSparsely=false) const; public: // --------------------------------------------------------------------- // // MODELCARDTEXTUREZNEG // --------------------------------------------------------------------- // /// In \em cards imaging mode, the texture applied to the Z- quad. /// The texture axes (s,t) are mapped to model-space axes (-x, -y). /// /// | || /// | -- | -- | /// | Declaration | `asset model:cardTextureZNeg` | /// | C++ Type | SdfAssetPath | /// | \ref Usd_Datatypes "Usd Type" | SdfValueTypeNames->Asset | USDGEOM_API UsdAttribute GetModelCardTextureZNegAttr() const; /// See GetModelCardTextureZNegAttr(), and also /// \ref Usd_Create_Or_Get_Property for when to use Get vs Create. /// If specified, author \p defaultValue as the attribute's default, /// sparsely (when it makes sense to do so) if \p writeSparsely is \c true - /// the default for \p writeSparsely is \c false. USDGEOM_API UsdAttribute CreateModelCardTextureZNegAttr(VtValue const &defaultValue = VtValue(), bool writeSparsely=false) const; public: // ===================================================================== // // Feel free to add custom code below this line, it will be preserved by // the code generator. // // Just remember to: // - Close the class declaration with }; // - Close the namespace with PXR_NAMESPACE_CLOSE_SCOPE // - Close the include guard with #endif // ===================================================================== // // --(BEGIN CUSTOM CODE)-- /// \anchor UsdGeomModelAPIExtentsHint /// \name Model Extents Hint API /// /// Methods for querying, authoring and computing the model's /// "extentsHint". /// @{ /// Retrieve the authored value (if any) of this model's "extentsHint" /// /// Persistent caching of bounds in USD is a potentially perilous endeavor, /// given that: /// \li It is very easy to add overrides in new super-layers that /// invalidate the cached bounds, and no practical way to automatically /// detect when this happens /// \li It is possible for references to be allowed to "float", so that /// asset updates can flow directly into cached scenes. Such changes in /// referenced scene description can also invalidate cached bounds in /// referencing layers. /// /// For these reasons, as a general rule, we only persistently cache /// leaf gprim extents in object space. However, even with cached gprim /// extents, computing bounds can be expensive. Since model-level bounds /// are so useful to many graphics applications, we make an exception, /// with some caveats. The "extentsHint" should be considered entirely /// optional (whereas gprim extent is not); if authored, it should /// contains the extents for various values of gprim purposes. /// The extents for different values of purpose are stored in a linear Vec3f /// array as pairs of GfVec3f values in the order specified by /// UsdGeomImageable::GetOrderedPurposeTokens(). This list is trimmed to /// only include non-empty extents. i.e., if a model has only default and /// render geoms, then it will only have 4 GfVec3f values in its /// extentsHint array. We do not skip over zero extents, so if a model /// has only default and proxy geom, we will author six GfVec3f's, the /// middle two representing an zero extent for render geometry. /// /// A UsdGeomBBoxCache can be configured to first consult the cached /// extents when evaluating model roots, rather than descending into the /// models for the full computation. This is not the default behavior, /// and gives us a convenient way to validate that the cached /// extentsHint is still valid. /// /// \return \c true if a value was fetched; \c false if no value was /// authored, or on error. It is an error to make this query of a prim /// that is not a model root. /// /// \sa UsdGeomImageable::GetPurposeAttr(), /// UsdGeomImageable::GetOrderedPurposeTokens() /// USDGEOM_API bool GetExtentsHint(VtVec3fArray *extents, const UsdTimeCode &time = UsdTimeCode::Default()) const; /// Authors the extentsHint array for this model at the given time. /// /// \sa GetExtentsHint() /// USDGEOM_API bool SetExtentsHint(VtVec3fArray const &extents, const UsdTimeCode &time = UsdTimeCode::Default()) const; /// Returns the custom 'extentsHint' attribute if it exits. USDGEOM_API UsdAttribute GetExtentsHintAttr() const; /// For the given model, compute the value for the extents hint with the /// given \p bboxCache. \p bboxCache should be setup with the /// appropriate time. After calling this function, the \p bboxCache may /// have it's included purposes changed. /// /// \note \p bboxCache should not be in use by any other thread while /// this method is using it in a thread. USDGEOM_API VtVec3fArray ComputeExtentsHint(UsdGeomBBoxCache& bboxCache) const; /// @} /// \anchor UsdGeomModelAPIConstraintTargets /// \name Model Constraint Targets API /// /// Methods for adding and listing constraint targets. /// /// @{ /// Get the constraint target with the given name, \p constraintName. /// /// If the requested constraint target does not exist, then an invalid /// UsdConstraintTarget object is returned. /// USDGEOM_API UsdGeomConstraintTarget GetConstraintTarget( const std::string &constraintName) const; /// Creates a new constraint target with the given name, \p constraintName. /// /// If the constraint target already exists, then the existing target is /// returned. If it does not exist, a new one is created and returned. /// USDGEOM_API UsdGeomConstraintTarget CreateConstraintTarget( const std::string &constraintName) const; /// Returns all the constraint targets belonging to the model. /// /// Only valid constraint targets in the "constraintTargets" namespace /// are returned by this method. /// USDGEOM_API std::vector GetConstraintTargets() const; /// @} /// Calculate the effective model:drawMode of this prim, as defined by /// its closest ancestral authored opinion, if any. /// /// If no opinion for model:drawMode is authored on this prim or any of its /// ancestors, its computed model:drawMode is UsdGeomTokens->default_ . /// Otherwise, its computed model:drawMode is that of its closest ancestor /// with an authored model:drawMode. /// /// If this function is being called in a traversal context to compute /// the draw mode of an entire hierarchy of prims, it would be beneficial /// to cache and pass in the computed parent draw-mode via the /// \p parentDrawMode parameter. This avoids repeated upward traversal to /// look for ancestor opinions. /// /// When \p parentDrawMode is empty (or unspecified), this function does /// an upward traversal to find the closest ancestor with an authored /// model:drawMode. /// /// \sa GetModelDrawModeAttr() USDGEOM_API TfToken ComputeModelDrawMode(const TfToken &parentDrawMode=TfToken()) const; }; PXR_NAMESPACE_CLOSE_SCOPE #endif