本文整理汇总了C++中SdfPathVector类的典型用法代码示例。如果您正苦于以下问题:C++ SdfPathVector类的具体用法?C++ SdfPathVector怎么用?C++ SdfPathVector使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了SdfPathVector类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: GetPath
bool
UsdRelationship::SetTargets(const SdfPathVector& targets) const
{
SdfPathVector mappedPaths;
mappedPaths.reserve(targets.size());
for (const SdfPath &target: targets) {
std::string errMsg;
mappedPaths.push_back(_GetTargetForAuthoring(target, &errMsg));
if (mappedPaths.back().IsEmpty()) {
TF_CODING_ERROR("Cannot set target <%s> on relationship <%s>: %s",
target.GetText(), GetPath().GetText(),
errMsg.c_str());
return false;
}
}
// NOTE! Do not insert any code that modifies scene description between the
// changeblock and the call to _CreateSpec! Explanation: _CreateSpec calls
// code that inspects the composition graph and then does some authoring.
// We want that authoring to be inside the change block, but if any scene
// description changes are made after the block is created but before we
// call _CreateSpec, the composition structure may be invalidated.
SdfChangeBlock block;
SdfRelationshipSpecHandle relSpec = _CreateSpec();
if (!relSpec)
return false;
relSpec->GetTargetPathList().ClearEditsAndMakeExplicit();
for (const SdfPath &path: mappedPaths) {
relSpec->GetTargetPathList().Add(path);
}
return true;
}
示例2: TF_CODING_ERROR
bool
UsdGeomCollectionAPI::AppendTarget(
const SdfPath &target,
const VtIntArray &faceIndices /* =VtIntArray() */,
const UsdTimeCode &time /* =UsdTimeCode::Default() */) const
{
if (target.IsEmpty()) {
TF_CODING_ERROR("Cannot add empty target to collection '%s' on "
"prim <%s>.", _name.GetText(), GetPath().GetText());
return false;
}
bool hasFaceCountsAtTime = true;
if (time != UsdTimeCode::Default()) {
UsdAttribute targetFaceCountsAttr = GetTargetFaceCountsAttr();
double lower=0., upper=0.;
bool hasTimeSamples=false;
if (targetFaceCountsAttr.GetBracketingTimeSamples(time.GetValue(),
&lower, &upper, &hasTimeSamples))
{
hasFaceCountsAtTime = (lower==upper && lower==time.GetValue());
}
}
VtIntArray targetFaceCounts, targetFaceIndices;
if (hasFaceCountsAtTime) {
GetTargetFaceCounts(&targetFaceCounts, time);
GetTargetFaceIndices(&targetFaceIndices, time);
}
SdfPathVector targets;
GetTargets(&targets);
// If there are no existing face restrictions and no face-restriction is
// specified on the current target, simly add the target and return.
if (targetFaceCounts.empty() && targetFaceIndices.empty() &&
faceIndices.empty())
{
// We can simply add the target here to the relationship here since
// there are no companion non-list-edited integer arrays.
return CreateTargetsRel().AppendTarget(target);
}
if (targetFaceCounts.empty() && !targetFaceIndices.empty()) {
TF_CODING_ERROR("targetFaceCounts is empty, but targetFaceIndices "
"is not, for the collection '%s' belonging to prim <%s>.",
_name.GetText(), GetPath().GetText());
return false;
}
if (targetFaceCounts.empty() && !faceIndices.empty()) {
for (size_t i = 0 ; i < targets.size(); i++)
targetFaceCounts.push_back(0);
}
targetFaceCounts.push_back(faceIndices.size());
targetFaceIndices.reserve(targetFaceIndices.size() + faceIndices.size());
TF_FOR_ALL(it, faceIndices) {
targetFaceIndices.push_back(*it);
}
示例3: GetPrim
UsdVolVolume::FieldMap
UsdVolVolume::GetFieldPaths() const
{
std::map<TfToken, SdfPath> fieldMap;
const UsdPrim &prim = GetPrim();
if (prim) {
std::vector<UsdProperty> fieldProps =
prim.GetPropertiesInNamespace(_tokens->fieldPrefix);
for (const UsdProperty &fieldProp : fieldProps) {
UsdRelationship fieldRel = fieldProp.As<UsdRelationship>();
SdfPathVector targets;
// All relationships starting with "field:" should point to
// UsdVolFieldBase primitives.
if (fieldRel && fieldRel.GetForwardedTargets(&targets)) {
if (targets.size() == 1 &&
targets.front().IsPrimPath()) {
fieldMap.emplace(fieldRel.GetBaseName(), targets.front());
}
}
}
}
return fieldMap;
}
示例4: _GetTargetsRel
bool
UsdGeomCollectionAPI::IsEmpty() const
{
UsdRelationship targetsRel = _GetTargetsRel();
if (targetsRel) {
SdfPathVector targets;
targetsRel.GetTargets(&targets);
return targets.empty();
}
return true;
}
示例5: GetPath
bool
UsdRelationship::SetTargets(const SdfPathVector& targets) const
{
SdfPathVector mappedPaths;
mappedPaths.reserve(targets.size());
BOOST_FOREACH(const SdfPath &target, targets) {
std::string errMsg;
mappedPaths.push_back(_GetTargetForAuthoring(target, &errMsg));
if (mappedPaths.back().IsEmpty()) {
TF_CODING_ERROR("Cannot set target <%s> on relationship <%s>: %s",
target.GetText(), GetPath().GetText(),
errMsg.c_str());
return false;
}
}
示例6:
SdfPathVector
Sdf_MarkerUtils<Spec>::GetMarkerPaths(const Spec& owner)
{
SdfPathVector paths;
const SdfLayerHandle layer = owner.GetLayer();
const SdfPathVector children = owner.template GetFieldAs<SdfPathVector>(
_MarkerPolicy::GetChildFieldKey());
TF_FOR_ALL(path, children) {
const SdfPath targetSpecPath = owner.GetPath().AppendTarget(*path);
if (layer->HasField(targetSpecPath, SdfFieldKeys->Marker)) {
paths.push_back(*path);
}
}
return paths;
}
示例7: TF_CODING_ERROR
bool
UsdGeomPrimvar::SetIdTarget(
const SdfPath& path) const
{
if (_idTargetRelName.IsEmpty()) {
TF_CODING_ERROR("Can only set ID Target for string or string[] typed"
" primvars (primvar type is '%s')",
_attr.GetTypeName().GetAsToken().GetText());
return false;
}
if (UsdRelationship rel = _GetIdTargetRel(true)) {
SdfPathVector targets;
targets.push_back(path.IsEmpty() ? _attr.GetPrimPath() :
path);
return rel.SetTargets(targets);
}
return false;
}
示例8:
bool
UsdGeomPrimvar::Get(
std::string* value,
UsdTimeCode time) const
{
// check if there is a relationship and if so use the target path string to
// get the string value.
if (!_idTargetRelName.IsEmpty()) {
if (UsdRelationship rel = _GetIdTargetRel(false)) {
SdfPathVector targets;
if (rel.GetForwardedTargets(&targets) &&
targets.size() == 1) {
*value = targets[0].GetString();
return true;
}
return false;
}
}
return _attr.Get(value, time);
}
示例9: _VisitImpl
void _VisitImpl(SdfPathVector const &paths) {
if (!paths.empty()) {
for (SdfPath const &p: paths) {
_workQueue.push(p);
}
_consumerTask.Wake();
}
if (_recurse) {
WorkParallelForEach(
paths.begin(), paths.end(),
[this](SdfPath const &path) {
if (!path.HasPrefix(_prim.GetPath())) {
if (UsdPrim owningPrim = _prim.GetStage()->
GetPrimAtPath(path.GetPrimPath())) {
_VisitSubtree(owningPrim);
}
}
});
}
}
示例10: _InitEngine
static
UsdImagingEngine* _InitEngine(const SdfPath& rootPath,
const SdfPathVector& excludedPaths,
const SdfPathVector& invisedPaths,
const SdfPath& sharedId =
SdfPath::AbsoluteRootPath(),
const UsdImagingEngineSharedPtr& sharedEngine =
UsdImagingEngineSharedPtr())
{
if (UsdImagingGL::IsEnabledHydra()) {
return new UsdImagingHdEngine(rootPath, excludedPaths, invisedPaths,
sharedId,
boost::dynamic_pointer_cast<UsdImagingHdEngine>(sharedEngine));
} else {
// In the refEngine, both excluded paths and invised paths are treated
// the same way.
SdfPathVector pathsToExclude = excludedPaths;
pathsToExclude.insert(pathsToExclude.end(),
invisedPaths.begin(), invisedPaths.end());
return new UsdImagingRefEngine(pathsToExclude);
}
}
示例11: UsdPrim
PXR_NAMESPACE_OPEN_SCOPE
// TODO: We should centralize this logic in a UsdImaging ShaderAdapter.
/*static*/
UsdPrim
UsdImaging_MaterialStrategy::GetTargetedShader(UsdPrim const& materialPrim,
UsdRelationship const& materialRel)
{
SdfPathVector targets;
if (!materialRel.GetForwardedTargets(&targets))
return UsdPrim();
if (targets.size() != 1) {
// XXX: This should really be a validation error once USD gets that
// feature.
TF_WARN("We expect only one target on relationship %s of prim <%s>, "
"but got %zu.",
materialRel.GetName().GetText(),
materialPrim.GetPath().GetText(),
targets.size());
return UsdPrim();
}
if (!targets[0].IsPrimPath()) {
// XXX: This should really be a validation error once USD gets that
// feature.
TF_WARN("We expect the target of the relationship %s of prim <%s> "
"to be a prim, instead it is <%s>.",
materialRel.GetName().GetText(),
materialPrim.GetPath().GetText(),
targets[0].GetText());
return UsdPrim();
}
return materialPrim.GetStage()->GetPrimAtPath(targets[0]);
}
示例12: TF_CODING_ERROR
void
SdfAttributeSpec::ChangeMapperPath(
const SdfPath& oldPath, const SdfPath& newPath)
{
if (not PermissionToEdit()) {
TF_CODING_ERROR("Change mapper path: Permission denied.");
return;
}
const SdfPath& attrPath = GetPath();
// Absolutize.
SdfPath oldAbsPath = oldPath.MakeAbsolutePath(attrPath.GetPrimPath());
SdfPath newAbsPath = newPath.MakeAbsolutePath(attrPath.GetPrimPath());
// Validate.
if (oldAbsPath == newAbsPath) {
// Nothing to do.
return;
}
if (not newAbsPath.IsPropertyPath()) {
TF_CODING_ERROR("cannot change connection path for attribute %s's "
"mapper at connection path <%s> to <%s> because it's "
"not a property path",
attrPath.GetString().c_str(),
oldAbsPath.GetString().c_str(),
newAbsPath.GetString().c_str());
return;
}
SdfPathVector mapperPaths =
GetFieldAs<SdfPathVector>(SdfChildrenKeys->MapperChildren);
// Check that a mapper actually exists at the old path.
SdfPathVector::iterator mapperIt =
std::find(mapperPaths.begin(), mapperPaths.end(), oldAbsPath);
if (mapperIt == mapperPaths.end()) {
TF_CODING_ERROR("Change mapper path: No mapper exists for "
"connection path <%s>.", oldAbsPath.GetText());
return;
}
// Check that no mapper already exists at the new path.
const bool mapperExistsAtNewPath =
(std::find(mapperPaths.begin(), mapperPaths.end(), newAbsPath) !=
mapperPaths.end());
if (mapperExistsAtNewPath) {
TF_CODING_ERROR("Change mapper path: Mapper already exists for "
"connection path <%s>.", newAbsPath.GetText());
return;
}
// Things look OK -- let's go ahead and move the mapper over to the
// new path.
SdfChangeBlock block;
const SdfPath oldMapperSpecPath = attrPath.AppendMapper(oldAbsPath);
const SdfPath newMapperSpecPath = attrPath.AppendMapper(newAbsPath);
_MoveSpec(oldMapperSpecPath, newMapperSpecPath);
*mapperIt = newAbsPath;
SetField(SdfChildrenKeys->MapperChildren, VtValue(mapperPaths));
}
示例13: PxrUsdKatanaReadPointInstancer
void
PxrUsdKatanaReadPointInstancer(
const UsdGeomPointInstancer& instancer,
const PxrUsdKatanaUsdInPrivateData& data,
PxrUsdKatanaAttrMap& instancerAttrMap,
PxrUsdKatanaAttrMap& sourcesAttrMap,
PxrUsdKatanaAttrMap& instancesAttrMap,
PxrUsdKatanaAttrMap& inputAttrMap)
{
const double currentTime = data.GetCurrentTime();
PxrUsdKatanaReadXformable(instancer, data, instancerAttrMap);
// Get primvars for setting later. Unfortunatley, the only way to get them
// out of the attr map is to build it, which will cause its contents to be
// cleared. We'll need to restore its contents before continuing.
//
FnKat::GroupAttribute instancerAttrs = instancerAttrMap.build();
FnKat::GroupAttribute primvarAttrs =
instancerAttrs.getChildByName("geometry.arbitrary");
for (int64_t i = 0; i < instancerAttrs.getNumberOfChildren(); ++i)
{
instancerAttrMap.set(instancerAttrs.getChildName(i),
instancerAttrs.getChildByIndex(i));
}
instancerAttrMap.set("type", FnKat::StringAttribute("usd point instancer"));
const std::string fileName = data.GetUsdInArgs()->GetFileName();
instancerAttrMap.set("info.usd.fileName", FnKat::StringAttribute(fileName));
FnKat::GroupAttribute inputAttrs = inputAttrMap.build();
const std::string katOutputPath = FnKat::StringAttribute(
inputAttrs.getChildByName("outputLocationPath")).getValue("", false);
if (katOutputPath.empty())
{
_LogAndSetError(instancerAttrMap, "No output location path specified");
return;
}
//
// Validate instancer data.
//
const std::string instancerPath = instancer.GetPath().GetString();
UsdStageWeakPtr stage = instancer.GetPrim().GetStage();
// Prototypes (required)
//
SdfPathVector protoPaths;
instancer.GetPrototypesRel().GetTargets(&protoPaths);
if (protoPaths.empty())
{
_LogAndSetError(instancerAttrMap, "Instancer has no prototypes");
return;
}
_PathToPrimMap primCache;
for (auto protoPath : protoPaths) {
const UsdPrim &protoPrim = stage->GetPrimAtPath(protoPath);
primCache[protoPath] = protoPrim;
}
// Indices (required)
//
VtIntArray protoIndices;
if (!instancer.GetProtoIndicesAttr().Get(&protoIndices, currentTime))
{
_LogAndSetError(instancerAttrMap, "Instancer has no prototype indices");
return;
}
const size_t numInstances = protoIndices.size();
if (numInstances == 0)
{
_LogAndSetError(instancerAttrMap, "Instancer has no prototype indices");
return;
}
for (auto protoIndex : protoIndices)
{
if (protoIndex < 0 || static_cast<size_t>(protoIndex) >= protoPaths.size())
{
_LogAndSetError(instancerAttrMap, TfStringPrintf(
"Out of range prototype index %d", protoIndex));
return;
}
}
// Mask (optional)
//
std::vector<bool> pruneMaskValues =
instancer.ComputeMaskAtTime(currentTime);
if (!pruneMaskValues.empty() and pruneMaskValues.size() != numInstances)
{
_LogAndSetError(instancerAttrMap,
"Mismatch in length of indices and mask");
return;
}
//.........这里部分代码省略.........
示例14: HD_TRACE_FUNCTION
bool
HdDirtyList::ApplyEdit(HdRprimCollection const& col)
{
HD_TRACE_FUNCTION();
// Don't attempt to transition dirty lists where the collection
// fundamentally changed, we can't reused filtered paths in those cases.
//
// when repr changes, don't reuse the dirty list, since the required
// DirtyBits may change.
if (col.GetName() != _collection.GetName()
|| col.GetReprName() != _collection.GetReprName()
|| col.IsForcedRepr() != _collection.IsForcedRepr()
|| col.GetRenderTags() != _collection.GetRenderTags()) {
return false;
}
// Also don't attempt to fix-up dirty lists when the collection is radically
// different in terms of root paths; here a heuristic of 100 root paths is
// used as a threshold for when we will stop attempting to fix the list.
if (std::abs(int(col.GetRootPaths().size()) -
int(_collection.GetRootPaths().size())) > 100) {
return false;
}
// If the either the old or new collection has Exclude paths do
// the full rebuild.
if (!col.GetExcludePaths().empty() ||
!_collection.GetExcludePaths().empty()) {
return false;
}
// If the varying state has changed - Rebuild the base list
// before adding the new items
HdChangeTracker &changeTracker = _renderIndex.GetChangeTracker();
unsigned int currentVaryingStateVersion =
changeTracker.GetVaryingStateVersion();
if (_varyingStateVersion != currentVaryingStateVersion) {
TF_DEBUG(HD_DIRTY_LIST).Msg("DirtyList(%p): varying state changed "
"(%s, %d -> %d)\n",
(void*)this,
_collection.GetName().GetText(),
_varyingStateVersion,
currentVaryingStateVersion);
// populate only varying prims in the collection
_UpdateIDs(&_dirtyIds, HdChangeTracker::Varying);
_varyingStateVersion = currentVaryingStateVersion;
}
SdfPathVector added, removed;
typedef SdfPathVector::const_iterator ITR;
ITR newI = col.GetRootPaths().cbegin();
ITR newEnd = col.GetRootPaths().cend();
ITR oldI = _collection.GetRootPaths().cbegin();
ITR oldEnd = _collection.GetRootPaths().cend();
HdRenderIndex& index = _renderIndex;
TfToken const & repr = col.GetReprName();
TF_DEBUG(HD_DIRTY_LIST).Msg("DirtyList(%p): ApplyEdit\n", (void*)this);
if (TfDebug::IsEnabled(HD_DIRTY_LIST)) {
std::cout << " Old Collection: " << std::endl;
for (auto const& i : _collection.GetRootPaths()) {
std::cout << " " << i << std::endl;
}
std::cout << " Old _dirtyIds: " << std::endl;
for (auto const& i : _dirtyIds) {
std::cout << " " << i << std::endl;
}
}
const SdfPathVector &paths = _renderIndex.GetRprimIds();
while (newI != newEnd || oldI != oldEnd) {
if (newI != newEnd && oldI != oldEnd && *newI == *oldI) {
++newI;
++oldI;
continue;
}
// If any paths in the two sets are prefixed by one another, the logic
// below doesn't work, since the subtree has to be fixed up (it's not
// just a simple prefix scan). In these cases, we'll just rebuild the
// entire list.
if (newI != newEnd && oldI != oldEnd && newI->HasPrefix(*oldI)) {
return false;
}
if (newI != newEnd && oldI != oldEnd && oldI->HasPrefix(*newI)) {
return false;
}
if (newI != newEnd && (oldI == oldEnd || *newI < *oldI)) {
HdPrimGather gather;
SdfPathVector newPaths;
gather.Subtree(paths, *newI, &newPaths);
size_t numNewPaths = newPaths.size();
for (size_t newPathNum = 0;
//.........这里部分代码省略.........
示例15: 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;
}