/* static */ UsdHydraLookAPI UsdHydraLookAPI::Get(const UsdStagePtr &stage, const SdfPath &path) { if (!stage) { TF_CODING_ERROR("Invalid stage"); return UsdHydraLookAPI(); } return UsdHydraLookAPI(stage->GetPrimAtPath(path)); }
/*static*/ SdfPath UsdImaging_MaterialStrategy::GetBinding(UsdShadeMaterial const& material) { TF_DEBUG(USDIMAGING_SHADERS).Msg("\t Look: %s\n", material.GetPath().GetText()); // ---------------------------------------------------------------------- // // Hydra-only shader style - displayLook:bxdf // ---------------------------------------------------------------------- // if (UsdRelationship matRel = UsdHydraLookAPI(material).GetBxdfRel()) { TF_DEBUG(USDIMAGING_SHADERS).Msg("\t LookRel: %s\n", matRel.GetPath().GetText()); UsdShadeShader shader( UsdImaging_MaterialStrategy::GetTargetedShader( material.GetPrim(), matRel)); if (shader) { TF_DEBUG(USDIMAGING_SHADERS).Msg("\t UsdShade binding found: %s\n", shader.GetPath().GetText()); return shader.GetPath(); } } // ---------------------------------------------------------------------- // // Deprecated shader style - hydraLook:Surface // ---------------------------------------------------------------------- // TfToken hdSurf("hydraLook:surface"); TfToken surfType("HydraPbsSurface"); if (UsdRelationship matRel = material.GetPrim().GetRelationship(hdSurf)) { TF_DEBUG(USDIMAGING_SHADERS).Msg("\t LookRel: %s\n", matRel.GetPath().GetText()); if (UsdPrim shader = UsdImaging_MaterialStrategy::GetTargetedShader( material.GetPrim(), matRel)) { if (TF_VERIFY(shader.GetTypeName() == surfType)) { TF_DEBUG(USDIMAGING_SHADERS).Msg( "\t Deprecated binding found: %s\n", shader.GetPath().GetText()); return shader.GetPath(); } } } return SdfPath::EmptyPath(); }
/* static */ UsdHydraLookAPI UsdHydraLookAPI::Apply(const UsdStagePtr &stage, const SdfPath &path) { // Ensure we have a valid stage, path and prim if (!stage) { TF_CODING_ERROR("Invalid stage"); return UsdHydraLookAPI(); } if (path == SdfPath::AbsoluteRootPath()) { TF_CODING_ERROR("Cannot apply an api schema on the pseudoroot"); return UsdHydraLookAPI(); } auto prim = stage->GetPrimAtPath(path); if (!prim) { TF_CODING_ERROR("Prim at <%s> does not exist.", path.GetText()); return UsdHydraLookAPI(); } TfToken apiName("HydraLookAPI"); // Get the current listop at the edit target UsdEditTarget editTarget = stage->GetEditTarget(); SdfPrimSpecHandle primSpec = editTarget.GetPrimSpecForScenePath(path); SdfTokenListOp listOp = primSpec->GetInfo(UsdTokens->apiSchemas) .UncheckedGet<SdfTokenListOp>(); // Append our name to the prepend list, if it doesnt exist locally TfTokenVector prepends = listOp.GetPrependedItems(); if (std::find(prepends.begin(), prepends.end(), apiName) != prepends.end()) { return UsdHydraLookAPI(); } SdfTokenListOp prependListOp; prepends.push_back(apiName); prependListOp.SetPrependedItems(prepends); auto result = listOp.ApplyOperations(prependListOp); if (!result) { TF_CODING_ERROR("Failed to prepend api name to current listop."); return UsdHydraLookAPI(); } // Set the listop at the current edit target and return the API prim primSpec->SetInfo(UsdTokens->apiSchemas, VtValue(*result)); return UsdHydraLookAPI(prim); }