// Shave and a Haircut // (c) 2019 Epic Games // US Patent 6720962 #include "shaveExportGame.h" #include "shaveHairShape.h" #include #include #include #include #include #include #include #include "shaveSDKFUNCS.h" #include "shaveUtil.h" #include "shaveTextureStore.h" //Syntax: shaveExportGame -node <...> const MString shaveExportGame::cmd("shaveGameExport"); //const char* shaveExportGame::filename_long("file"); //const char* shaveExportGame::filename_short("f"); const char* shaveExportGame::nodename_long("node"); const char* shaveExportGame::nodename_short("n"); //void SHAVEwrite_nodeDISK(char *filename); MStatus shaveExportGame::doIt(const MArgList &args) { MStatus stat = MStatus::kSuccess; MArgDatabase parser(syntax(),args,&stat); if(stat != MS::kSuccess) { MGlobal::displayError("shaveGameExport: can not parse arguments."); return stat; } MString filename; //stat = parser.getFlagArgument( filename_short, 0, filename ); stat = parser.getCommandArgument(0,filename); if(stat != MStatus::kSuccess) { MGlobal::displayError("shaveGameExport: can not parse the 'file' flag."); return stat; } shaveHairShape* sn = NULL; if(parser.isFlagSet(nodename_short)) { MString nodename; stat = parser.getFlagArgument( nodename_short, 0, nodename ); if(stat != MStatus::kSuccess) { MGlobal::displayError("shaveGameExport: can not parse the 'node' flag."); return stat; } MObject node; if(!findNodeByName(nodename,node)) { MGlobal::displayError(MString("shaveGameExport: can not find ") + nodename + " node"); return MStatus::kFailure; } MFnDependencyNode dFn(node); if(dFn.typeId() != shaveHairShape::id) { MGlobal::displayError(MString("shaveGameExport: the node ") + nodename + " is not a shaveHairShape"); return MStatus::kFailure; } sn = (shaveHairShape*)dFn.userNode(); } else //pull shavenode from selection { MDagPath node = shaveUtil::getCurrentHairShape(); if(!node.isValid()) { MGlobal::displayError("shaveGameExport: can't find current shaveHairShape"); return MStatus::kFailure; } MFnDagNode dFn(node); if(dFn.typeId() != shaveHairShape::id) { MGlobal::displayError(MString("shaveGameExport: the node ") +dFn.name() + " is not a shaveHairShape"); return MStatus::kFailure; } //MGlobal::displayInfo(MString("Exporting for node ")+dFn.name()); sn = (shaveHairShape*)dFn.userNode(); } if(!sn) { MGlobal::displayError("shaveGameExport: can not find shaveHairShape - select or spesify node name"); return MStatus::kFailure; } ///// do whatever you want /////// //MGlobal::displayInfo(MString("game export file ")+filename + " node " + (unsigned int)&sn->hairnode); //// update texture cache ///// MObjectArray shaveHairShapes; shaveUtil::getShaveNodes(shaveHairShapes); if(shaveHairShapes.length() > 0) { #ifdef PER_NODE_TEXLOOKUP initTexInfoLookup2(shaveHairShapes, "", false/*mFrameGlobals.verbose*/); #else initTexInfoLookup(shaveHairShapes, "", false/*mFrameGlobals.verbose*/); #endif } //use &sn->hairnode to pass shavenode to your params sn->makeCurrent(); SHAVEwrite_nodeDISK((char*)filename.asChar()); ////////////////////////////////// return MStatus::kSuccess; } MSyntax shaveExportGame::newSyntax() { MSyntax syn; //syn.addFlag(filename_short, filename_long, MSyntax::kString); syn.addArg(MSyntax::kString); syn.addFlag(nodename_short, nodename_long, MSyntax::kString); return syn; } bool shaveExportGame::findNodeByName(const MString& name, MObject& thenode) const { if(name == "") return false; MItDependencyNodes iter; for (; !iter.isDone(); iter.next()) { MObject node = iter.item(); MFnDependencyNode dFn(node); if(dFn.name() == name) { thenode = node; return true; } } return false; }