void usdWriteJob::endJob() { mJobCtx.processInstances(); UsdPrimSiblingRange usdRootPrims = mJobCtx.mStage->GetPseudoRoot().GetChildren(); // Write Variants (to first root prim path) UsdPrim usdRootPrim; TfToken defaultPrim; if (!usdRootPrims.empty()) { usdRootPrim = *usdRootPrims.begin(); defaultPrim = usdRootPrim.GetName(); } if (usdRootPrim && mRenderLayerObjs.length() > 1 && !mJobCtx.mArgs.usdModelRootOverridePath.IsEmpty()) { // Get RenderLayers // mArgs.usdModelRootOverridePath: // Require mArgs.usdModelRootOverridePath to be set so that // the variants are put under a UsdPrim that references a BaseModel // prim that has all of the geometry, transforms, and other details. // This needs to be done since "local" values have stronger precedence // than "variant" values, but "referencing" will cause the variant values // to take precedence. defaultPrim = writeVariants(usdRootPrim); } // Restoring the currentRenderLayer MFnRenderLayer currentLayer(MFnRenderLayer::currentLayer()); if (currentLayer.name() != mCurrentRenderLayerName) { MGlobal::executeCommand(MString("editRenderLayerGlobals -currentRenderLayer ")+ mCurrentRenderLayerName, false, false); } postCallback(); // Unfortunately, MGlobal::isZAxisUp() is merely session state that does // not get recorded in Maya files, so we cannot rely on it being set // properly. Since "Y" is the more common upAxis, we'll just use // isZAxisUp as an override to whatever our pipeline is configured for. TfToken upAxis = UsdGeomGetFallbackUpAxis(); if (MGlobal::isZAxisUp()){ upAxis = UsdGeomTokens->z; } UsdGeomSetStageUpAxis(mJobCtx.mStage, upAxis); if (usdRootPrim){ // We have already decided above that 'usdRootPrim' is the important // prim for the export... usdVariantRootPrimPath mJobCtx.mStage->GetRootLayer()->SetDefaultPrim(defaultPrim); } if (mJobCtx.mStage->GetRootLayer()->PermissionToSave()) { mJobCtx.mStage->GetRootLayer()->Save(); } mJobCtx.mStage->Close(); mJobCtx.mMayaPrimWriterList.clear(); // clear this so that no stage references are left around MGlobal::displayInfo("usdWriteJob::endJob Saving Stage"); }
/* static */ bool PxrUsdMayaTranslatorUtil::CreateNode( const UsdPrim& usdPrim, const MString& nodeTypeName, MObject& parentNode, PxrUsdMayaPrimReaderContext* context, MStatus* status, MObject* mayaNodeObj) { if (not CreateNode(MString(usdPrim.GetName().GetText()), nodeTypeName, parentNode, status, mayaNodeObj)) { return false; } if (context) { context->RegisterNewMayaNode(usdPrim.GetPath().GetString(), *mayaNodeObj); } return true; }
TfToken usdWriteJob::writeVariants(const UsdPrim &usdRootPrim) { // Init parameters for filtering and setting the active variant std::string defaultModelingVariant; // Get the usdVariantRootPrimPath (optionally filter by renderLayer prefix) MayaPrimWriterPtr firstPrimWriterPtr = *mMayaPrimWriterList.begin(); std::string firstPrimWriterPathStr( firstPrimWriterPtr->getDagPath().fullPathName().asChar() ); std::replace( firstPrimWriterPathStr.begin(), firstPrimWriterPathStr.end(), '|', '/'); std::replace( firstPrimWriterPathStr.begin(), firstPrimWriterPathStr.end(), ':', '_'); // replace namespace ":" with "_" SdfPath usdVariantRootPrimPath(firstPrimWriterPathStr); usdVariantRootPrimPath = usdVariantRootPrimPath.GetPrefixes()[0]; // Create a new usdVariantRootPrim and reference the Base Model UsdRootPrim // This is done for reasons as described above under mArgs.usdModelRootOverridePath UsdPrim usdVariantRootPrim = mStage->DefinePrim(usdVariantRootPrimPath); TfToken defaultPrim = usdVariantRootPrim.GetName(); usdVariantRootPrim.GetReferences().AppendInternalReference(usdRootPrim.GetPath()); usdVariantRootPrim.SetActive(true); usdRootPrim.SetActive(false); // Loop over all the renderLayers for (unsigned int ir=0; ir < mRenderLayerObjs.length(); ++ir) { SdfPathTable<bool> tableOfActivePaths; MFnRenderLayer renderLayerFn( mRenderLayerObjs[ir] ); MString renderLayerName = renderLayerFn.name(); std::string variantName(renderLayerName.asChar()); // Determine default variant. Currently unsupported //MPlug renderLayerDisplayOrderPlug = renderLayerFn.findPlug("displayOrder", true); //int renderLayerDisplayOrder = renderLayerDisplayOrderPlug.asShort(); // The Maya default RenderLayer is also the default modeling variant if (mRenderLayerObjs[ir] == MFnRenderLayer::defaultRenderLayer()) { defaultModelingVariant=variantName; } // Make the renderlayer being looped the current one MGlobal::executeCommand(MString("editRenderLayerGlobals -currentRenderLayer ")+ renderLayerName, false, false); // == ModelingVariants == // Identify prims to activate // Put prims and parent prims in a SdfPathTable // Then use that membership to determine if a prim should be Active. // It has to be done this way since SetActive(false) disables access to all child prims. MObjectArray renderLayerMemberObjs; renderLayerFn.listMembers(renderLayerMemberObjs); std::vector< SdfPath > activePaths; for (unsigned int im=0; im < renderLayerMemberObjs.length(); ++im) { MFnDagNode dagFn(renderLayerMemberObjs[im]); MDagPath dagPath; dagFn.getPath(dagPath); dagPath.extendToShape(); SdfPath usdPrimPath; if (!TfMapLookup(mDagPathToUsdPathMap, dagPath, &usdPrimPath)) { continue; } usdPrimPath = usdPrimPath.ReplacePrefix(usdPrimPath.GetPrefixes()[0], usdVariantRootPrimPath); // Convert base to variant usdPrimPath tableOfActivePaths[usdPrimPath] = true; activePaths.push_back(usdPrimPath); //UsdPrim usdPrim = mStage->GetPrimAtPath(usdPrimPath); //usdPrim.SetActive(true); } if (!tableOfActivePaths.empty()) { { // == BEG: Scope for Variant EditContext // Create the variantSet and variant UsdVariantSet modelingVariantSet = usdVariantRootPrim.GetVariantSets().AppendVariantSet("modelingVariant"); modelingVariantSet.AppendVariant(variantName); modelingVariantSet.SetVariantSelection(variantName); // Set the Edit Context UsdEditTarget editTarget = modelingVariantSet.GetVariantEditTarget(); UsdEditContext editContext(mStage, editTarget); // == Activate/Deactivate UsdPrims UsdPrimRange it = UsdPrimRange::AllPrims(mStage->GetPseudoRoot()); std::vector<UsdPrim> primsToDeactivate; for ( ; it; ++it) { UsdPrim usdPrim = *it; // For all xformable usdPrims... if (usdPrim && usdPrim.IsA<UsdGeomXformable>()) { bool isActive=false; for (size_t j=0;j<activePaths.size();j++) { //primPathD.HasPrefix(primPathA); SdfPath activePath=activePaths[j]; if (usdPrim.GetPath().HasPrefix(activePath) || activePath.HasPrefix(usdPrim.GetPath())) { isActive=true; break; } } if (isActive==false) { primsToDeactivate.push_back(usdPrim); it.PruneChildren(); } } } // Now deactivate the prims (done outside of the UsdPrimRange // so not to modify the iterator while in the loop) for ( UsdPrim const& prim : primsToDeactivate ) { prim.SetActive(false); } } // == END: Scope for Variant EditContext } } // END: RenderLayer iterations // Set the default modeling variant UsdVariantSet modelingVariantSet = usdVariantRootPrim.GetVariantSet("modelingVariant"); if (modelingVariantSet.IsValid()) { modelingVariantSet.SetVariantSelection(defaultModelingVariant); } return defaultPrim; }