本文整理汇总了C++中SdfPath类的典型用法代码示例。如果您正苦于以下问题:C++ SdfPath类的具体用法?C++ SdfPath怎么用?C++ SdfPath使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了SdfPath类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1:
void
HdChangeTracker::TaskRemoved(SdfPath const& id)
{
TF_DEBUG(HD_TASK_REMOVED).Msg("Task Removed: %s\n", id.GetText());
_taskState.erase(id);
}
示例2: TF_FOR_ALL
SdfPathVector
SdfPath::GetConciseRelativePaths(const SdfPathVector& paths) {
SdfPathVector primPaths;
SdfPathVector anchors;
SdfPathVector labels;
// initialize the vectors
TF_FOR_ALL(iter, paths) {
if(!iter->IsAbsolutePath()) {
TF_WARN("argument to GetConciseRelativePaths contains a relative path.");
return paths;
}
// first, get the prim paths
SdfPath primPath = iter->GetPrimPath();
SdfPath anchor = primPath.GetParentPath();
primPaths.push_back(primPath);
anchors.push_back(anchor);
// we have to special case root anchors, since MakeRelativePath can't handle them
if(anchor == SdfPath::AbsoluteRootPath())
labels.push_back(primPath);
else
labels.push_back(primPath.MakeRelativePath(anchor));
}
// each ambiguous path must be raised to its parent
bool ambiguous;
do {
ambiguous = false;
// the next iteration of labels
SdfPathVector newAnchors;
SdfPathVector newLabels;
// find ambiguous labels
for(size_t i=0;i<labels.size();++i) {
int ok = true;
// search for some other path that makes this one ambiguous
for(size_t j=0;j<labels.size();++j) {
if(i != j && labels[i] == labels[j] && primPaths[i] != primPaths[j]) {
ok = false;
break;
}
}
if(!ok) {
// walk the anchor up one node
SdfPath newAnchor = anchors[i].GetParentPath();
newAnchors.push_back(newAnchor);
newLabels.push_back( newAnchor == SdfPath::AbsoluteRootPath() ? primPaths[i]
: primPaths[i].MakeRelativePath( newAnchor ) );
ambiguous = true;
} else {
newAnchors.push_back(anchors[i]);
newLabels.push_back(labels[i]);
}
}
anchors = newAnchors;
labels = newLabels;
} while(ambiguous);
// generate the final set from the anchors
SdfPathVector result;
for(size_t i=0; i<anchors.size();++i) {
if(anchors[i] == SdfPath::AbsoluteRootPath()) {
result.push_back( paths[i] );
} else {
result.push_back( paths[i].MakeRelativePath( anchors[i] ));
}
}
return result;
}
示例3: getPath
std::string Item::getPath() const
{
SdfPath path = m_prim.GetPath();
return path.GetString();
}
示例4: TF_CODING_ERROR
SdfAttributeSpecHandle
SdfAttributeSpec::_New(
const SdfRelationshipSpecHandle& owner,
const SdfPath& path,
const std::string& name,
const SdfValueTypeName& typeName,
SdfVariability variability,
bool custom)
{
if (!owner) {
TF_CODING_ERROR("NULL owner");
return TfNullPtr;
}
if (!typeName) {
TF_CODING_ERROR("Cannot create attribute spec <%s> with invalid type",
owner->GetPath().AppendTarget(path).
AppendProperty(TfToken(name)).GetText());
return TfNullPtr;
}
SdfChangeBlock block;
// Determine the path of the relationship target
SdfPath absPath = path.MakeAbsolutePath(owner->GetPath().GetPrimPath());
SdfPath targetPath = owner->GetPath().AppendTarget(absPath);
// Check to make sure that the name is valid
if (!Sdf_ChildrenUtils<Sdf_AttributeChildPolicy>::IsValidName(name)) {
TF_CODING_ERROR(
"Cannot create attribute on %s with invalid name: %s",
targetPath.GetText(), name.c_str());
return TfNullPtr;
}
// Create the relationship target if it doesn't already exist. Note
// that this does not automatically get added to the relationship's
// target path list.
SdfSpecHandle targetSpec = owner->_FindOrCreateTargetSpec(path);
// AttributeSpecs are considered initially to have only required fields
// only if they are not custom.
bool hasOnlyRequiredFields = (!custom);
// Create the relational attribute spec
SdfPath attrPath = targetPath.AppendRelationalAttribute(TfToken(name));
if (!Sdf_ChildrenUtils<Sdf_AttributeChildPolicy>::CreateSpec(
owner->GetLayer(), attrPath, SdfSpecTypeAttribute,
hasOnlyRequiredFields)) {
return TfNullPtr;
}
SdfAttributeSpecHandle spec =
owner->GetLayer()->GetAttributeAtPath(attrPath);
// Avoid expensive dormancy checks in the case of binary-backed data.
SdfAttributeSpec *specPtr = get_pointer(spec);
if (TF_VERIFY(specPtr)) {
specPtr->SetField(SdfFieldKeys->Custom, custom);
specPtr->SetField(SdfFieldKeys->TypeName, typeName.GetAsToken());
specPtr->SetField(SdfFieldKeys->Variability, variability);
}
return spec;
}
示例5: UsdImagingGL_GetTextureResourceID
HdTextureResource::ID
UsdImagingGL_GetTextureResourceID(UsdPrim const& usdPrim,
SdfPath const& usdPath,
UsdTimeCode time,
size_t salt)
{
if (!TF_VERIFY(usdPrim)) {
return HdTextureResource::ID(-1);
}
if (!TF_VERIFY(usdPath != SdfPath())) {
return HdTextureResource::ID(-1);
}
// If the texture name attribute doesn't exist, it might be badly specified
// in scene data.
UsdAttribute attr = _GetTextureResourceAttr(usdPrim, usdPath);
SdfAssetPath asset;
if (!attr || !attr.Get(&asset, time)) {
TF_WARN("Unable to find texture attribute <%s> in scene data",
usdPath.GetText());
return HdTextureResource::ID(-1);
}
HdTextureType textureType = HdTextureType::Uv;
TfToken filePath = TfToken(asset.GetResolvedPath());
if (!filePath.IsEmpty()) {
// If the resolved path contains a correct path, then we are
// dealing with a ptex or uv textures.
if (GlfIsSupportedPtexTexture(filePath)) {
textureType = HdTextureType::Ptex;
} else {
textureType = HdTextureType::Uv;
}
} else {
// If the path couldn't be resolved, then it might be a Udim as they
// contain special characters in the path to identify them <Udim>.
// Another option is that the path is just wrong and it can not be
// resolved.
filePath = TfToken(asset.GetAssetPath());
if (GlfIsSupportedUdimTexture(filePath)) {
const GlfContextCaps& caps = GlfContextCaps::GetInstance();
if (!UsdImaging_UdimTilesExist(filePath, caps.maxArrayTextureLayers,
_FindLayerHandle(attr, time))) {
TF_WARN("Unable to find Texture '%s' with path '%s'. Fallback "
"textures are not supported for udim",
filePath.GetText(), usdPath.GetText());
return HdTextureResource::ID(-1);
}
if (!caps.arrayTexturesEnabled) {
TF_WARN("OpenGL context does not support array textures, "
"skipping UDIM Texture %s with path %s.",
filePath.GetText(), usdPath.GetText());
return HdTextureResource::ID(-1);
}
textureType = HdTextureType::Udim;
} else if (GlfIsSupportedPtexTexture(filePath)) {
TF_WARN("Unable to find Texture '%s' with path '%s'. Fallback "
"textures are not supported for ptex",
filePath.GetText(), usdPath.GetText());
return HdTextureResource::ID(-1);
} else {
TF_WARN("Unable to find Texture '%s' with path '%s'. A black "
"texture will be substituted in its place.",
filePath.GetText(), usdPath.GetText());
return HdTextureResource::ID(-1);
}
}
GlfImage::ImageOriginLocation origin =
UsdImagingGL_ComputeTextureOrigin(usdPrim);
// Hash on the texture filename.
size_t hash = asset.GetHash();
// Hash in wrapping and filtering metadata.
HdWrap wrapS = _GetWrapS(usdPrim, textureType);
HdWrap wrapT = _GetWrapT(usdPrim, textureType);
HdMinFilter minFilter = _GetMinFilter(usdPrim);
HdMagFilter magFilter = _GetMagFilter(usdPrim);
float memoryLimit = _GetMemoryLimit(usdPrim);
boost::hash_combine(hash, origin);
boost::hash_combine(hash, wrapS);
boost::hash_combine(hash, wrapT);
boost::hash_combine(hash, minFilter);
boost::hash_combine(hash, magFilter);
boost::hash_combine(hash, memoryLimit);
// Salt the result to prevent collisions in non-shared imaging.
// Note that the salt is ignored for fallback texture hashes above.
boost::hash_combine(hash, salt);
return HdTextureResource::ID(hash);
}
示例6: UsdImagingGL_GetTextureResource
HdTextureResourceSharedPtr
UsdImagingGL_GetTextureResource(UsdPrim const& usdPrim,
SdfPath const& usdPath,
UsdTimeCode time)
{
if (!TF_VERIFY(usdPrim))
return HdTextureResourceSharedPtr();
if (!TF_VERIFY(usdPath != SdfPath()))
return HdTextureResourceSharedPtr();
UsdAttribute attr = _GetTextureResourceAttr(usdPrim, usdPath);
SdfAssetPath asset;
if (!TF_VERIFY(attr) || !TF_VERIFY(attr.Get(&asset, time))) {
return HdTextureResourceSharedPtr();
}
HdTextureType textureType = HdTextureType::Uv;
TfToken filePath = TfToken(asset.GetResolvedPath());
// If the path can't be resolved, it's either an UDIM texture
// or the texture doesn't exists and we can to exit early.
if (filePath.IsEmpty()) {
filePath = TfToken(asset.GetAssetPath());
if (GlfIsSupportedUdimTexture(filePath)) {
textureType = HdTextureType::Udim;
} else {
TF_DEBUG(USDIMAGING_TEXTURES).Msg(
"File does not exist, returning nullptr");
TF_WARN("Unable to find Texture '%s' with path '%s'.",
filePath.GetText(), usdPath.GetText());
return {};
}
} else {
if (GlfIsSupportedPtexTexture(filePath)) {
textureType = HdTextureType::Ptex;
}
}
GlfImage::ImageOriginLocation origin =
UsdImagingGL_ComputeTextureOrigin(usdPrim);
HdWrap wrapS = _GetWrapS(usdPrim, textureType);
HdWrap wrapT = _GetWrapT(usdPrim, textureType);
HdMinFilter minFilter = _GetMinFilter(usdPrim);
HdMagFilter magFilter = _GetMagFilter(usdPrim);
float memoryLimit = _GetMemoryLimit(usdPrim);
TF_DEBUG(USDIMAGING_TEXTURES).Msg(
"Loading texture: id(%s), type(%s)\n",
usdPath.GetText(),
textureType == HdTextureType::Uv ? "Uv" :
textureType == HdTextureType::Ptex ? "Ptex" : "Udim");
HdTextureResourceSharedPtr texResource;
TfStopwatch timer;
timer.Start();
// Udim's can't be loaded through like other textures, because
// we can't select the right factory based on the file type.
// We also need to pass the layer context to the factory,
// so each file gets resolved properly.
GlfTextureHandleRefPtr texture;
if (textureType == HdTextureType::Udim) {
UdimTextureFactory factory(_FindLayerHandle(attr, time));
texture = GlfTextureRegistry::GetInstance().GetTextureHandle(
filePath, origin, &factory);
} else {
texture = GlfTextureRegistry::GetInstance().GetTextureHandle(
filePath, origin);
}
texResource = HdTextureResourceSharedPtr(
new HdStSimpleTextureResource(texture, textureType, wrapS, wrapT,
minFilter, magFilter, memoryLimit));
timer.Stop();
TF_DEBUG(USDIMAGING_TEXTURES).Msg(" Load time: %.3f s\n",
timer.GetSeconds());
return texResource;
}
示例7: _GetKey
static _Key _GetKey(const SdfPath& path)
{
return path.IsTargetPath() ? _Key(path.GetTargetPath())
: _Key(path.GetNameToken());
}
示例8: ns
bool
SdfBatchNamespaceEdit::Process(
SdfNamespaceEditVector* processedEdits,
const HasObjectAtPath& hasObjectAtPath,
const CanEdit& canEdit,
SdfNamespaceEditDetailVector* details,
bool fixBackpointers) const
{
// Clear the resulting edits -- we'll build up the result as we go.
if (processedEdits) {
processedEdits->clear();
}
// Track edits as we check them.
SdfNamespaceEdit_Namespace ns(fixBackpointers);
// Try each edit in sequence.
for (const auto& edit : GetEdits()) {
// Make sure paths are compatible.
bool mismatch = false;
if (edit.currentPath.IsPrimPath()) {
mismatch = !edit.newPath.IsPrimPath();
}
else if (edit.currentPath.IsPropertyPath()) {
mismatch = !edit.newPath.IsPropertyPath();
}
else {
// Unsupported path type.
if (details) {
details->push_back(
SdfNamespaceEditDetail(SdfNamespaceEditDetail::Error,
edit,
"Unsupported object type"));
}
return false;
}
if (mismatch && !edit.newPath.IsEmpty()) {
if (details) {
details->push_back(
SdfNamespaceEditDetail(SdfNamespaceEditDetail::Error,
edit,
"Path type mismatch"));
}
return false;
}
// Get the original path for the object now at edit.currentPath.
const SdfPath& from = ns.FindOrCreateOriginalPath(edit.currentPath);
// Can't edit from removed namespace except if we're removing.
// We allow the exception so it works to, say, remove a prim then
// its properties rather than removing its properties then the prim.
if (from.IsEmpty()) {
if (edit.newPath.IsEmpty()) {
// This edit has already happened so it's allowed. Do not
// record it in processedEdits.
continue;
}
if (details) {
details->push_back(
SdfNamespaceEditDetail(SdfNamespaceEditDetail::Error,
edit,
"Object was removed"));
}
return false;
}
// Make sure there's an object at from.
if (hasObjectAtPath && !hasObjectAtPath(from)) {
if (details) {
details->push_back(
SdfNamespaceEditDetail(SdfNamespaceEditDetail::Error,
edit,
"Object does not exist"));
}
return false;
}
// Extra checks if not removing.
SdfPath to;
if (!edit.newPath.IsEmpty()) {
// Ignore no-op. Note that this doesn't catch the case where
// then index isn't Same but has that effect.
if (edit.currentPath == edit.newPath &&
edit.index == SdfNamespaceEdit::Same) {
continue;
}
// Get the original path for the object now at edit.newPath's
// parent.
SdfPath newParent = edit.newPath.GetParentPath();
const SdfPath& toParent = ns.FindOrCreateOriginalPath(newParent);
// Can't move under removed namespace.
if (toParent.IsEmpty()) {
if (details) {
details->push_back(
SdfNamespaceEditDetail(SdfNamespaceEditDetail::Error,
edit,
"New parent was removed"));
//.........这里部分代码省略.........
示例9: TF_WARN
SdfPath
SdfPath::MakeAbsolutePath(const SdfPath & anchor) const {
if (anchor == SdfPath()) {
TF_WARN("MakeAbsolutePath(): anchor is the empty path.");
return SdfPath();
}
// Check that anchor is an absolute path
if (!anchor.IsAbsolutePath()) {
TF_WARN("MakeAbsolutePath() requires an absolute path as an argument.");
return SdfPath();
}
// Check that anchor is a component path
if (!anchor.IsAbsoluteRootOrPrimPath() &&
!anchor.IsPrimVariantSelectionPath()) {
TF_WARN("MakeAbsolutePath() requires a prim path as an argument.");
return SdfPath();
}
// If we're invalid, just return a copy of ourselves.
if (IsEmpty())
return *this;
SdfPath result = *this;
// If we're not already absolute, do our own path using anchor as the
// relative base.
if (!IsAbsolutePath()) {
// This list winds up in reverse order to what one might at
// first expect.
vector<Sdf_PathNodeConstRefPtr> relNodes;
Sdf_PathNodeConstRefPtr relRoot = Sdf_PathNode::GetRelativeRootNode();
Sdf_PathNodeConstRefPtr curNode = _pathNode;
// Walk up looking for oldPrefix node.
while (curNode) {
if (curNode == relRoot) {
break;
}
relNodes.push_back(curNode);
curNode = curNode->GetParentNode();
}
if (!curNode) {
// Didn't find relative root
// should never get here since all relative paths should have a
// relative root node
// CODE_COVERAGE_OFF
TF_CODING_ERROR("Didn't find relative root");
return SdfPath();
// CODE_COVERAGE_ON
}
result = anchor;
// Got the list, now add nodes similar to relNodes to anchor
// relNodes needs to be iterated in reverse since the closest ancestor
// node was pushed on last.
vector<Sdf_PathNodeConstRefPtr>::reverse_iterator it = relNodes.rbegin();
while (it != relNodes.rend()) {
result = _AppendNode(result, *it);
++it;
}
}
// Now make target path absolute (recursively) if we need to.
// We need to use result's prim path as the anchor for the target path.
SdfPath const &targetPath = result.GetTargetPath();
if (!targetPath.IsEmpty()) {
SdfPath primPath = result.GetPrimPath();
SdfPath newTargetPath = targetPath.MakeAbsolutePath(primPath);
result = result.ReplaceTargetPath(newTargetPath);
}
return result;
}
示例10: GetParentPath
SdfPath
SdfPath::_ReplacePrefix(const SdfPath &oldPrefix, const SdfPath &newPrefix,
bool fixTargetPaths) const
{
if (*this == oldPrefix) {
// Base case: we've reached oldPrefix.
return newPrefix;
}
if (GetPathElementCount() == 0) {
// Empty paths have nothing to replace.
return *this;
}
// If we've recursed above the oldPrefix, we can bail as long as there
// are no target paths we need to fix.
if (GetPathElementCount() <= oldPrefix.GetPathElementCount() &&
(!fixTargetPaths || !_pathNode->ContainsTargetPath())) {
// We'll never see oldPrefix beyond here, so return.
return *this;
}
// Recursively translate the parent.
SdfPath parent =
GetParentPath()._ReplacePrefix(oldPrefix, newPrefix, fixTargetPaths);
// Translation of the parent may fail; it will have emitted an error.
// Return here so we don't deref an invalid _pathNode below.
if (parent.IsEmpty())
return SdfPath();
// Append the tail component. Use _AppendNode() except in these cases:
// - For prims and properties, we construct child nodes directly
// so as to not expand out ".." components and to avoid the cost
// of unnecessarily re-validating identifiers.
// - For embedded target paths, translate the target path.
switch (_pathNode->GetNodeType()) {
case Sdf_PathNode::PrimNode:
return SdfPath(Sdf_PathNode::FindOrCreatePrim(parent._pathNode,
_pathNode->GetName()));
case Sdf_PathNode::PrimPropertyNode:
return SdfPath(Sdf_PathNode::FindOrCreatePrimProperty(
parent._pathNode, _pathNode->GetName()));
case Sdf_PathNode::TargetNode:
if (fixTargetPaths) {
return parent.AppendTarget( _pathNode->GetTargetPath()
._ReplacePrefix(oldPrefix, newPrefix, fixTargetPaths));
} else {
return _AppendNode(parent, _pathNode);
}
case Sdf_PathNode::MapperNode:
if (fixTargetPaths) {
return parent.AppendMapper( _pathNode->GetTargetPath()
._ReplacePrefix(oldPrefix, newPrefix, fixTargetPaths));
} else {
return _AppendNode(parent, _pathNode);
}
default:
return _AppendNode(parent, _pathNode);
}
}
示例11: hash_value
// Overload hash_value for SdfPath.
size_t hash_value(SdfPath const &path) {
return path.GetHash();
}
示例12: DBG
void
GusdRefiner::addPrimitive( const GT_PrimitiveHandle& gtPrimIn )
{
if(!gtPrimIn) {
std::cout << "Attempting to add invalid prim" << std::endl;
return;
}
GT_PrimitiveHandle gtPrim = gtPrimIn; // copy to a non-const handle
int primType = gtPrim->getPrimitiveType();
DBG( cerr << "GusdRefiner::addPrimitive, " << gtPrim->className() << endl );
string primName;
// Types can register a function to provide a prim name.
// Volumes do this to return a name stored in the f3d file. This is
// important for consistant cluster naming.
string n;
if( GusdPrimWrapper::getPrimName( gtPrim, n )) {
primName = n;
}
bool refinePackedPrims = m_refinePackedPrims;
bool primHasNameAttr = false;
if( primName.empty() ) {
GT_AttributeListHandle primAttrs;
if( primType == GT_GEO_PACKED ) {
primAttrs = UTverify_cast<const GT_GEOPrimPacked*>(gtPrim.get())->getInstanceAttributes();
}
if( !primAttrs ) {
primAttrs = gtPrim->getUniformAttributes();
}
if( !primAttrs ) {
primAttrs = gtPrim->getDetailAttributes();
}
GT_DataArrayHandle dah;
if( primAttrs ) {
dah = primAttrs->get( m_pathAttrName.c_str() );
}
if( dah && dah->isValid() ) {
const char *s = dah->getS(0);
if( s != NULL ) {
primName = s;
primHasNameAttr = true;
}
}
if( primAttrs ) {
GT_DataArrayHandle overXformsAttr = primAttrs->get( GUSD_OVERTRANSFORMS_ATTR );
if( overXformsAttr ) {
if( overXformsAttr->getI32(0) != 0 ) {
refinePackedPrims = false;
}
}
}
}
// The following is only necessary for point instancers. Prototypes
// can't be point instancers.
if (!m_buildPrototypes) {
// Check per prim if we are building a point instancer. This may cause
// problems for point instancers with discontiguous packed prims.
bool localBuildPointInstancer = false;
// If we have imported USD geometry get the type to see if it is a
// point instancer we need to overlay.
if(auto packedUSD = dynamic_cast<const GusdGT_PackedUSD*>( gtPrim.get() )) {
if(packedUSD->getFileName()) {
// Get the usd src prim path used for point instancers
const SdfPath& instancerPrimPath =
packedUSD->getSrcPrimPath();
GusdStageCacheReader cache;
if(UsdPrim prim = cache.GetPrimWithVariants(
packedUSD->getFileName(), instancerPrimPath).first) {
// Get the type name of the usd file to overlay
m_pointInstancerType = prim.GetTypeName();
// Make sure to set buildPointInstancer to true if we are overlaying a
// point instancer
if (m_pointInstancerType == _tokens->PointInstancer ||
m_pointInstancerType == _tokens->PxPointInstancer) {
localBuildPointInstancer = true;
}
}
}
}
// If we find either an instancepath or usdinstancepath attribute, build a
// point instancer.
GT_Owner owner;
if(gtPrim->findAttribute("instancepath", owner, 0) ||
gtPrim->findAttribute("usdinstancepath", owner, 0) ) {
localBuildPointInstancer = true;
}
if (m_buildPointInstancer || localBuildPointInstancer) {
// If we are building point instancer, stash prims that can be
//.........这里部分代码省略.........
示例13: _VerifyOrMakeSkelRoot
/// Finds the existing SkelRoot which is shared by all \p paths.
/// If no SkelRoot is found, and \p config is "auto", then attempts to
/// find a common ancestor of \p paths which can be converted to SkelRoot.
/// \p outMadeSkelRoot must be non-null; it will be set to indicate whether
/// any auto-typename change actually occurred (true) or whether there was
/// already a SkelRoot, so no renaming was necessary (false).
/// If an existing, common SkelRoot cannot be found for all paths, and if
/// it's not possible to create one, returns an empty SdfPath.
static SdfPath
_VerifyOrMakeSkelRoot(const UsdStagePtr& stage,
const SdfPath& path,
const TfToken& config)
{
if (config != UsdMayaJobExportArgsTokens->auto_ &&
config != UsdMayaJobExportArgsTokens->explicit_) {
return SdfPath();
}
// Only try to auto-rename to SkelRoot if we're not already a
// descendant of one. Otherwise, verify that the user tagged it in a sane
// way.
if (UsdSkelRoot root = UsdSkelRoot::Find(stage->GetPrimAtPath(path))) {
// Verify that the SkelRoot isn't nested in another SkelRoot.
// This is necessary because UsdSkel doesn't handle nested skel roots
// very well currently; this restriction may be loosened in the future.
if (UsdSkelRoot root2 = UsdSkelRoot::Find(root.GetPrim().GetParent())) {
TF_RUNTIME_ERROR("The SkelRoot <%s> is nested inside another "
"SkelRoot <%s>. This might cause unexpected behavior.",
root.GetPath().GetText(), root2.GetPath().GetText());
return SdfPath();
}
else {
return root.GetPath();
}
} else if(config == UsdMayaJobExportArgsTokens->auto_) {
// If auto-generating the SkelRoot, find the rootmost
// UsdGeomXform and turn it into a SkelRoot.
// XXX: It might be good to also consider model hierarchy here, and not
// go past our ancestor component when trying to generate the SkelRoot.
// (Example: in a scene with /World, /World/Char_1, /World/Char_2, we
// might want SkelRoots to stop at Char_1 and Char_2.) Unfortunately,
// the current structure precludes us from accessing model hierarchy
// here.
if (UsdPrim root = _FindRootmostXformOrSkelRoot(stage, path)) {
UsdSkelRoot::Define(stage, root.GetPath());
return root.GetPath();
}
else {
if (path.IsRootPrimPath()) {
// This is the most common problem when we can't obtain a
// SkelRoot.
// Show a nice error with useful information about root prims.
TF_RUNTIME_ERROR("The prim <%s> is a root prim, so it has no "
"ancestors that can be converted to a SkelRoot. (USD "
"requires that skinned meshes and skeletons be "
"encapsulated under a SkelRoot.) Try grouping this "
"prim under a parent group.",
path.GetText());
}
else {
// Show generic error as a last resort if we don't know exactly
// what went wrong.
TF_RUNTIME_ERROR("Could not find an ancestor of the prim <%s> "
"that can be converted to a SkelRoot. (USD requires "
"that skinned meshes and skeletons be encapsulated "
"under a SkelRoot.)",
path.GetText());
}
return SdfPath();
}
}
return SdfPath();
}
示例14: GetPath
void
Sdf_ConnectionListEditor<ChildPolicy>::_OnEditShared(
SdfListOpType op,
SdfSpecType specType,
const std::vector<SdfPath>& oldItems,
const std::vector<SdfPath>& newItems) const
{
// XXX The following code tries to manage lifetime of the target
// specs associated with this list, but it slightly buggy: if
// multiple lists mention the same target -- ex. if a target is
// added, appended, and prepended -- then this proxy for a single
// list has no way to know if the target also exists in those
// other lists, and so it cannot mangae lifetime on its own.
if (op == SdfListOpTypeOrdered || op == SdfListOpTypeDeleted) {
// These ops do not affect target spec lifetime, so there's
// nothing to do.
return;
}
const SdfPath propertyPath = GetPath();
SdfLayerHandle layer = GetLayer();
const std::set<value_type> oldItemSet(oldItems.begin(), oldItems.end());
const std::set<value_type> newItemSet(newItems.begin(), newItems.end());
// Need to remove all children in oldItems that are not in newItems.
std::vector<SdfPath> childrenToRemove;
std::set_difference(oldItemSet.begin(), oldItemSet.end(),
newItemSet.begin(), newItemSet.end(),
std::back_inserter(childrenToRemove));
TF_FOR_ALL(child, childrenToRemove) {
if (!Sdf_ChildrenUtils<ChildPolicy>::RemoveChild(
layer, propertyPath, *child)) {
// Some data backends procedurally generate the children specs based
// on the listops as an optimization, so if we failed to remove a
// child here, it could be that. If no spec is present, then we
// consider things to be okay and do not issue an error.
const SdfPath specPath =
ChildPolicy::GetChildPath(propertyPath, *child);
if (layer->GetObjectAtPath(specPath)) {
TF_CODING_ERROR("Failed to remove spec at <%s>",
specPath.GetText());
}
}
}
// Need to add all children in newItems that are not in oldItems.
std::vector<SdfPath> childrenToAdd;
std::set_difference(newItemSet.begin(), newItemSet.end(),
oldItemSet.begin(), oldItemSet.end(),
std::back_inserter(childrenToAdd));
TF_FOR_ALL(child, childrenToAdd) {
const SdfPath specPath = ChildPolicy::GetChildPath(propertyPath, *child);
if (layer->GetObjectAtPath(specPath)) {
continue;
}
if (!Sdf_ChildrenUtils<ChildPolicy>::CreateSpec(layer, specPath,
specType)) {
TF_CODING_ERROR("Failed to create spec at <%s>", specPath.GetText());
}
}
}
示例15: seDepNode
PxrUsdMayaShadingModeExportContext::AssignmentVector
PxrUsdMayaShadingModeExportContext::GetAssignments() const
{
AssignmentVector ret;
MStatus status;
MFnDependencyNode seDepNode(_shadingEngine, &status);
if (!status) {
return ret;
}
MPlug dsmPlug = seDepNode.findPlug("dagSetMembers", true, &status);
if (!status) {
return ret;
}
SdfPathSet seenBoundPrimPaths;
for (unsigned int i = 0; i < dsmPlug.numConnectedElements(); i++) {
MPlug dsmElemPlug(dsmPlug.connectionByPhysicalIndex(i));
MStatus status = MS::kFailure;
MFnDagNode dagNode(PxrUsdMayaUtil::GetConnected(dsmElemPlug).node(), &status);
if (!status) {
continue;
}
MDagPath dagPath;
if (!dagNode.getPath(dagPath))
continue;
SdfPath usdPath = PxrUsdMayaUtil::MDagPathToUsdPath(dagPath,
_mergeTransformAndShape);
// If _overrideRootPath is not empty, replace the root namespace with it
if (!_overrideRootPath.IsEmpty() ) {
usdPath = usdPath.ReplacePrefix(usdPath.GetPrefixes()[0], _overrideRootPath);
}
// If this path has already been processed, skip it.
if (!seenBoundPrimPaths.insert(usdPath).second)
continue;
// If the bound prim's path is not below a bindable root, skip it.
if (SdfPathFindLongestPrefix(_bindableRoots.begin(),
_bindableRoots.end(), usdPath) == _bindableRoots.end()) {
continue;
}
MObjectArray sgObjs, compObjs;
// Assuming that instancing is not involved.
status = dagNode.getConnectedSetsAndMembers(0, sgObjs, compObjs, true);
if (!status)
continue;
for (size_t j = 0; j < sgObjs.length(); j++) {
// If the shading group isn't the one we're interested in, skip it.
if (sgObjs[j] != _shadingEngine)
continue;
VtIntArray faceIndices;
if (!compObjs[j].isNull()) {
MItMeshPolygon faceIt(dagPath, compObjs[j]);
faceIndices.reserve(faceIt.count());
for ( faceIt.reset() ; !faceIt.isDone() ; faceIt.next() ) {
faceIndices.push_back(faceIt.index());
}
}
ret.push_back(std::make_pair(usdPath, faceIndices));
}
}
return ret;
}