// // 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_SUBSET_H #define USDGEOM_GENERATED_SUBSET_H /// \file usdGeom/subset.h #include "pxr/pxr.h" #include "pxr/usd/usdGeom/api.h" #include "pxr/usd/usd/typed.h" #include "pxr/usd/usd/prim.h" #include "pxr/usd/usd/stage.h" #include "pxr/usd/usdGeom/tokens.h" #include "pxr/base/tf/token.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; // -------------------------------------------------------------------------- // // GEOMSUBSET // // -------------------------------------------------------------------------- // /// \class UsdGeomSubset /// /// Encodes a subset of a piece of geometry (i.e. a UsdGeomImageable) /// as a set of indices. Currently only supports encoding of face-subsets, but /// could be extended in the future to support subsets representing edges, /// segments, points etc. /// /// To apply to a geometric prim, a GeomSubset prim must be defined as a /// child of it in namespace. This restriction makes it easy and efficient /// to discover subsets of a prim. We might want to relax this restriction if /// it's common to have multiple families of subsets on a gprim and if /// it's useful to be able to organize subsets belonging to a family /// under a common scope. See 'familyName' attribute for more info on defining /// a family of subsets. /// /// Note that a GeomSubset isn't an imageable (i.e. doesn't derive from /// UsdGeomImageable). So, you can't author visibility for it or /// override its purpose. /// /// Materials are bound to GeomSubsets just as they are for regular /// geometry using API available in UsdShade (UsdShadeMaterial::Bind). /// /// /// 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 UsdGeomSubset : public UsdTyped { public: /// Compile time constant representing what kind of schema this class is. /// /// \sa UsdSchemaType static const UsdSchemaType schemaType = UsdSchemaType::ConcreteTyped; /// Construct a UsdGeomSubset on UsdPrim \p prim . /// Equivalent to UsdGeomSubset::Get(prim.GetStage(), prim.GetPath()) /// for a \em valid \p prim, but will not immediately throw an error for /// an invalid \p prim explicit UsdGeomSubset(const UsdPrim& prim=UsdPrim()) : UsdTyped(prim) { } /// Construct a UsdGeomSubset on the prim held by \p schemaObj . /// Should be preferred over UsdGeomSubset(schemaObj.GetPrim()), /// as it preserves SchemaBase state. explicit UsdGeomSubset(const UsdSchemaBase& schemaObj) : UsdTyped(schemaObj) { } /// Destructor. USDGEOM_API virtual ~UsdGeomSubset(); /// 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 UsdGeomSubset 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 /// UsdGeomSubset(stage->GetPrimAtPath(path)); /// \endcode /// USDGEOM_API static UsdGeomSubset Get(const UsdStagePtr &stage, const SdfPath &path); /// Attempt to ensure a \a UsdPrim adhering to this schema at \p path /// is defined (according to UsdPrim::IsDefined()) on this stage. /// /// If a prim adhering to this schema at \p path is already defined on this /// stage, return that prim. Otherwise author an \a SdfPrimSpec with /// \a specifier == \a SdfSpecifierDef and this schema's prim type name for /// the prim at \p path at the current EditTarget. Author \a SdfPrimSpec s /// with \p specifier == \a SdfSpecifierDef and empty typeName at the /// current EditTarget for any nonexistent, or existing but not \a Defined /// ancestors. /// /// The given \a path must be an absolute prim path that does not contain /// any variant selections. /// /// If it is impossible to author any of the necessary PrimSpecs, (for /// example, in case \a path cannot map to the current UsdEditTarget's /// namespace) issue an error and return an invalid \a UsdPrim. /// /// Note that this method may return a defined prim whose typeName does not /// specify this schema class, in case a stronger typeName opinion overrides /// the opinion at the current EditTarget. /// USDGEOM_API static UsdGeomSubset Define(const UsdStagePtr &stage, const SdfPath &path); 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: // --------------------------------------------------------------------- // // ELEMENTTYPE // --------------------------------------------------------------------- // /// The type of element that the indices target. Currently only /// allows "face" and defaults to it. /// /// | || /// | -- | -- | /// | Declaration | `uniform token elementType = "face"` | /// | C++ Type | TfToken | /// | \ref Usd_Datatypes "Usd Type" | SdfValueTypeNames->Token | /// | \ref SdfVariability "Variability" | SdfVariabilityUniform | /// | \ref UsdGeomTokens "Allowed Values" | face | USDGEOM_API UsdAttribute GetElementTypeAttr() const; /// See GetElementTypeAttr(), 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 CreateElementTypeAttr(VtValue const &defaultValue = VtValue(), bool writeSparsely=false) const; public: // --------------------------------------------------------------------- // // INDICES // --------------------------------------------------------------------- // /// The set of indices included in this subset. The indices need not /// be sorted, but the same index should not appear more than once. /// /// | || /// | -- | -- | /// | Declaration | `int[] indices = []` | /// | C++ Type | VtArray | /// | \ref Usd_Datatypes "Usd Type" | SdfValueTypeNames->IntArray | USDGEOM_API UsdAttribute GetIndicesAttr() const; /// See GetIndicesAttr(), 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 CreateIndicesAttr(VtValue const &defaultValue = VtValue(), bool writeSparsely=false) const; public: // --------------------------------------------------------------------- // // FAMILYNAME // --------------------------------------------------------------------- // /// The name of the family of subsets that this subset belongs to. /// This is optional and is primarily useful when there are multiple /// families of subsets under a geometric prim. In some cases, this could /// also be used for achieving proper roundtripping of subset data between /// DCC apps. /// When multiple subsets belonging to a prim have the same familyName, they /// are said to belong to the family. A familyType value can be /// encoded on the owner of a family of subsets as a token using the static /// method UsdGeomSubset::SetFamilyType(). "familyType" can have one of the /// following values: /// /// \note The validity of subset data is not enforced by the authoring /// APIs, however they can be checked using UsdGeomSubset::ValidateFamily(). /// /// /// | || /// | -- | -- | /// | Declaration | `uniform token familyName = ""` | /// | C++ Type | TfToken | /// | \ref Usd_Datatypes "Usd Type" | SdfValueTypeNames->Token | /// | \ref SdfVariability "Variability" | SdfVariabilityUniform | USDGEOM_API UsdAttribute GetFamilyNameAttr() const; /// See GetFamilyNameAttr(), 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 CreateFamilyNameAttr(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)-- /// Creates a new GeomSubset below the given \p geom with the given /// name, \p subsetName, element type, \p elementType and \p indices. /// /// If a subset named \p subsetName already exists below \p geom, then /// this updates its attributes with the values of the provided arguments /// (indices value at time 'default' will be updated) and returns it. /// /// The family type is set / updated on \p geom only if a non-empty value /// is passed in for \p familyType and \p familyName. USDGEOM_API static UsdGeomSubset CreateGeomSubset( const UsdGeomImageable &geom, const TfToken &subsetName, const TfToken &elementType, const VtIntArray &indices, const TfToken &familyName=TfToken(), const TfToken &familyType=TfToken()); /// Creates a new GeomSubset below the given imageable, \p geom with the /// given name, \p subsetName, element type, \p elementType and \p indices. /// /// If a subset named \p subsetName already exists below \p geom, then /// this creates a new subset by appending a suitable index as suffix to /// \p subsetName (eg, subsetName_1) to avoid name collisions. /// /// The family type is set / updated on \p geom only if a non-empty value /// is passed in for \p familyType and \p familyName. USDGEOM_API static UsdGeomSubset CreateUniqueGeomSubset( const UsdGeomImageable &geom, const TfToken &subsetName, const TfToken &elementType, const VtIntArray &indices, const TfToken &familyName=TfToken(), const TfToken &familyType=TfToken()); /// Returns all the GeomSubsets defined on the given imageable, \p geom. USDGEOM_API static std::vector GetAllGeomSubsets( const UsdGeomImageable &geom); /// Returns all the GeomSubsets of the given \p elementType belonging to /// the specified family, \p familyName on the given imageable, \p geom. /// If \p elementType is empty, then subsets containing all element types /// are returned. /// If \p familyName is left empty, then all subsets of the specified /// \p elementType will be returned. USDGEOM_API static std::vector GetGeomSubsets( const UsdGeomImageable &geom, const TfToken &elementType=TfToken(), const TfToken &familyName=TfToken()); /// Returns the names of all the families of GeomSubsets defined on the given /// imageable, \p geom. USDGEOM_API static TfToken::Set GetAllGeomSubsetFamilyNames( const UsdGeomImageable &geom); /// This method is used to encode the type of family that the GeomSubsets /// on the given geometric prim \p geom, with the given family name, /// \p familyName belong to. /// /// See \ref UsdGeomSubset::GetFamilyNameAttr for the possible values for /// \p familyType. /// /// When a family of GeomSubsets is tagged as a UsdGeomTokens->partition or /// UsdGeomTokens->nonOverlapping, the validity of the data (i.e. /// mutual exclusivity and/or wholeness) is not enforced by the authoring /// APIs. Use ValidateFamily() to validate the data in a family of /// GeomSubsets. /// /// \return Returns false upon failure to create or set the appropriate /// attribute on \p geom. USDGEOM_API static bool SetFamilyType( const UsdGeomImageable &geom, const TfToken &familyName, const TfToken &familyType); /// Returns the type of family that the GeomSubsets on the given geometric /// prim \p geom, with the given family name, \p familyName belong to. /// /// This only returns the token that's encoded on \p geom and does not perform /// any actual validation on the family of GeomSubsets. Please use /// ValidateFamily() for such validation. /// /// When familyType is not set on \p geom, the fallback value /// UsdTokens->unrestricted is returned. USDGEOM_API static TfToken GetFamilyType( const UsdGeomImageable &geom, const TfToken &familyName); /// Utility for getting the list of indices that are not assigned to any of /// the GeomSubsets in \p subsets at the timeCode, \p time, given the /// element count (total number of indices in the array being subdivided), /// \p elementCount. USDGEOM_API static VtIntArray GetUnassignedIndices( const std::vector &subsets, const size_t elementCount, const UsdTimeCode &time=UsdTimeCode::EarliestTime()); /// Validates the data in the given set of GeomSubsets, \p subsets, given /// the total number of elements in the array being subdivided, /// \p elementCount and the \p familyType that the subsets belong to. /// /// For proper validation of indices in \p subsets, all of the GeomSubsets /// must have the same 'elementType'. /// /// If one or more subsets contain invalid data, then false is returned and /// \p reason is populated with a string explaining the reason why it is /// invalid. /// /// The python version of this method returns a tuple containing /// a (bool, string), where the bool has the validity of the subsets and /// the string contains the reason (if they're invalid). /// USDGEOM_API static bool ValidateSubsets( const std::vector &subsets, const size_t elementCount, const TfToken &familyType, std::string * const reason); /// Validates whether the family of subsets identified by the given /// \p familyName and \p elementType on the given imageable, \p geom contain /// valid data. If the family is designated as a partition or as /// non-overlapping using SetFamilyType(), then the validity of the data /// is checked. If the familyType is "unrestricted", then this performs only /// bounds checking of the values in the "indices" arrays. /// /// If \p reason is not NULL, then it is populated with a string explaining /// why the family is invalid, if it is invalid. /// /// The python version of this method returns a tuple containing /// a (bool, string), where the bool has the validity of the family and /// the string contains the reason (if it's invalid). /// USDGEOM_API static bool ValidateFamily( const UsdGeomImageable &geom, const TfToken &elementType, const TfToken &familyName, std::string * const reason); }; PXR_NAMESPACE_CLOSE_SCOPE #endif