void EntityNode::LoadArt() { MStatus stat; bool callbackRemoved = false; if( s_EditNodeAddedCBId != -1 ) { MDGMessage::removeCallback( s_EditNodeAddedCBId ); s_EditNodeAddedCBId = -1; callbackRemoved = true; } UnloadArt(); MString artFilePath; GetArtFilePath( artFilePath ); std::cout << "Importing from: " << artFilePath.asTChar() << "..." << std::endl; // add the callback to catch all the imported objects MObjectArray objectArrays[NodeArrays::Count]; s_ImportNodeAddedCBId = MDGMessage::addNodeAddedCallback( ImportNodeAddedCallback, kDefaultNodeType, &objectArrays ); // import stuff MFileIO::import( artFilePath, NULL, false ); // remove the callback MDGMessage::removeCallback( s_ImportNodeAddedCBId ); // add all imported stuff under this guy's transform MFnDagNode nodeFn( thisMObject() ); for( u32 i=0; i<objectArrays[NodeArrays::KeepNodes].length(); ++i ) { if( objectArrays[NodeArrays::KeepNodes][i].isNull() ) { continue; } MObjectHandle handle( objectArrays[NodeArrays::KeepNodes][i] ); if ( !handle.isValid() ) { continue; } // We should be getting only MFnDagNode in here, but just in case MFnDagNode dagFn( objectArrays[NodeArrays::KeepNodes][i], &stat ); if ( stat == MStatus::kSuccess ) { stat = dagFn.setDoNotWrite( true ); } else { MFnDependencyNode depNodeFn( objectArrays[NodeArrays::KeepNodes][i], &stat ); stat = depNodeFn.setDoNotWrite( true ); } #ifdef _DEBUG MString name = dagFn.name(); MString type = dagFn.typeName(); std::string nodeTypeStr( objectArrays[NodeArrays::KeepNodes][i].apiTypeStr() ); if ( name.length() ) { std::cout << " - Importing Child: " << name.asTChar() << " " << type.asTChar() << "(" << nodeTypeStr << ")" << std::endl; } #endif AddImportNode( objectArrays[NodeArrays::KeepNodes][i] ); nodeFn.addChild( objectArrays[NodeArrays::KeepNodes][i] ); } for( u32 i=0; i<objectArrays[NodeArrays::DeleteNodes].length(); ++i ) { MGlobal::deleteNode( objectArrays[NodeArrays::DeleteNodes][i] ); } MFnDagNode otherFn; for( u32 i=0 ; i<nodeFn.childCount(); ++i ) { MObject child = nodeFn.child( i ); if( !child.hasFn( MFn::kDagNode ) ) { continue; } otherFn.setObject( child ); if( otherFn.typeId() == EntityNode::s_TypeID ) { MDagModifier mod; u32 numChild = otherFn.childCount(); for( u32 j = 0; j < numChild; ++j ) { stat = mod.reparentNode( otherFn.child( j ), thisMObject() ); } mod.doIt(); MGlobal::deleteNode( child ); break; } } std::cout << "Done" << std::endl; }
//----------------------------------------------------------------------------- // Creates a vstAttachment Locator //----------------------------------------------------------------------------- MStatus CVstAttachmentCmd::DoCreate() { MDagModifier *mDagModifier( new MDagModifier ); if ( !mDagModifier ) { merr << "Can't create new MDagModifier" << std::endl; return MS::kFailure; } MString optName( "vstAttachment" ); if ( m_mArgDatabase->isFlagSet( kOptName ) ) { m_mArgDatabase->getFlagArgument( kOptName, 0, optName ); } // Create the helper bone locator's transform MObject xObj = mDagModifier->createNode( "transform" ); mDagModifier->doIt(); if ( xObj.isNull() ) { merr << "Can't create new transform node" << std::endl; return MS::kFailure; } // name the shape & the transform the same thing mDagModifier->renameNode( xObj, optName ); mDagModifier->doIt(); MObject vstAttachmentObj = mDagModifier->createNode( "vstAttachment", xObj ); if ( vstAttachmentObj.isNull() ) { merr << "Can't create new vstAttachment node" << std::endl; mDagModifier->undoIt(); return MS::kFailure; } // name the shape & the transform the same thing mDagModifier->renameNode( vstAttachmentObj, MFnDependencyNode( xObj ).name() ); mDagModifier->doIt(); m_undoable = true; m_mDagModifier = mDagModifier; if ( m_mArgDatabase->isFlagSet( kOptParent ) ) { MSelectionList mSelectionList; m_mArgDatabase->getObjects( mSelectionList ); for ( MItSelectionList sIt( mSelectionList, MFn::kDagNode ); !sIt.isDone(); sIt.next() ) { MDagPath mDagPath; if ( sIt.getDagPath( mDagPath ) ) { m_mDagModifier->reparentNode( xObj, mDagPath.node() ); m_mDagModifier->doIt(); break; } } } // Save the current selection just in case we want to undo stuff MGlobal::getActiveSelectionList( m_mSelectionList ); MDagPath xDagPath; MDagPath::getAPathTo( xObj, xDagPath ); MGlobal::select( xDagPath, MObject::kNullObj, MGlobal::kReplaceList ); setResult( xDagPath.partialPathName() ); return MS::kSuccess; }
MObject create(Alembic::AbcGeom::ICamera & iNode, MObject & iParent) { Alembic::AbcGeom::ICameraSchema schema = iNode.getSchema(); MString name(iNode.getName().c_str()); MFnCamera fnCamera; MObject obj = fnCamera.create(iParent); fnCamera.setName(name); // we need to read this to determine the film fit Alembic::AbcGeom::CameraSample samp; iNode.getSchema().get(samp); std::size_t numOps = samp.getNumOps(); if (numOps > 0) { std::string hint = samp[0].getHint(); if (hint == "filmFitFill") { fnCamera.setFilmFit(MFnCamera::kFillFilmFit); } else if (hint == "filmFitHorz") { fnCamera.setFilmFit(MFnCamera::kHorizontalFilmFit); } else if (hint == "filmFitVert") { fnCamera.setFilmFit(MFnCamera::kVerticalFilmFit); } else if (hint == "filmFitOver") { fnCamera.setFilmFit(MFnCamera::kOverscanFilmFit); } } if (schema.isConstant()) { // no center of interest fnCamera.setFocalLength(samp.getFocalLength()); fnCamera.setLensSqueezeRatio(samp.getLensSqueezeRatio()); // camera scale might be in the 3x3 // weirdo attrs that are in inches fnCamera.setHorizontalFilmAperture(samp.getHorizontalAperture()/2.54); fnCamera.setVerticalFilmAperture(samp.getVerticalAperture()/2.54); fnCamera.setHorizontalFilmOffset(samp.getHorizontalFilmOffset()/2.54); fnCamera.setVerticalFilmOffset(samp.getVerticalFilmOffset()/2.54); // film fit offset might be in the 3x3 if (samp.getOverScanLeft() == samp.getOverScanRight() && samp.getOverScanTop() == samp.getOverScanBottom() && samp.getOverScanLeft() == samp.getOverScanTop()) { fnCamera.setOverscan(samp.getOverScanLeft() + 1.0); } else { MString warn = iNode.getName().c_str(); warn += " has unsupported overscan values."; MGlobal::displayWarning(warn); } fnCamera.setNearClippingPlane(samp.getNearClippingPlane()); fnCamera.setFarClippingPlane(samp.getFarClippingPlane()); // prescale, film translate H, V, roll pivot H,V, film roll value // post scale might be in the 3x3 fnCamera.setFStop(samp.getFStop()); fnCamera.setFocusDistance(samp.getFocusDistance()); MTime sec(1.0, MTime::kSeconds); fnCamera.setShutterAngle(Alembic::AbcGeom::DegreesToRadians( 360.0 * (samp.getShutterClose()-samp.getShutterOpen()) * sec.as(MTime::uiUnit()) )); for (std::size_t i = 0; i < numOps; ++i) { Alembic::AbcGeom::FilmBackXformOp & op = samp[i]; if (op.getHint() == "filmFitOffs") { double val = op.getChannelValue(0) * samp.getHorizontalAperture() / 5.08; if (val != 0.0) { fnCamera.setFilmFitOffset(val); } else { fnCamera.setFilmFitOffset(op.getChannelValue(1) * samp.getHorizontalAperture() / 5.08); } } else if (op.getHint() == "preScale") { fnCamera.setPreScale(1.0/op.getChannelValue(0)); } else if (op.getHint() == "filmTranslate") { fnCamera.setFilmTranslateH(op.getChannelValue(0)); fnCamera.setFilmTranslateV(op.getChannelValue(1)); } else if (op.getHint() == "postScale") { fnCamera.setPostScale(1.0/op.getChannelValue(0)); } else if (op.getHint() == "cameraScale") { fnCamera.setCameraScale(op.getChannelValue(0)); } } } // extra transform node is unfortuneatly automatically created above the // camera, let's do some reparenting and delete that extra transform MDagPath path; fnCamera.getPath(path); MObject camObj = path.node(); MDagModifier dagMod; dagMod.reparentNode(camObj, iParent); dagMod.doIt(); dagMod.deleteNode(obj); dagMod.doIt(); return camObj; }