#ifndef _WRITERIB #define _WRITERIB // Shave and a Haircut // (c) 2019 Epic Games // US Patent 6720962 #include "shaveIO.h" #ifndef NO_PRMAN # ifdef _WIN32 // ri.h contains a lot of float/double mismatches. Let's stop VC++ from warning us about them. # pragma warning(push) # pragma warning(disable : 4244 ) # endif # include # ifdef _WIN32 # pragma warning(pop) # endif #endif #include #include #include #include "shaveGlobals.h" #include "shaveSDK.h" #if MAYA_API_VERSION < 20180000 class MArgDatabase; #endif class RfMFuncs; class shaveWriteRib : public MPxCommand { public: shaveWriteRib(); virtual ~shaveWriteRib(); MStatus doIt(const MArgList& args); static void* createCmd(); static MSyntax createSyntax(); static const MString commandName; protected: #ifndef NO_PRMAN typedef struct NodeInfo { typedef struct { RtBound fBBox; MString fFilename; } VoxelInfo; std::vector fVoxels; } NodeInfo; void addCurve( int firstVertIdxIdx, int lastVertIdxIdx, const int* vertIndices, const VERT* verts, const VERT* vertColours, const VERT* rootColour, const VERT* tipColour, float hairU, float hairV, float rootRadius, float tipRadius, const VERT* hairNormal, bool tipFade, int index ); void beginFile( RfMFuncs &rfm, MString filename, MString verbatim ) const; void cleanup( const MObjectArray& hairNodes, const shaveGlobals::Globals& g ) const; void clearCurves(); void endFile(RfMFuncs &rfm) const; void freeBuffers(bool isInstanced); MString getBaseFilename() const; void getFrameTimes( const MArgDatabase& argdb, const shaveGlobals::Globals& g, double curFrame ); MStatus getHairShapes( const MArgDatabase& argdb, MObjectArray& hairShapes ) const; void getMayaShutterTimes(); int getNumParams(bool isInstanced) const; void getRendermanShutterTimes(); MString getVoxelFilename( const MString& baseFilename, const MString& nodeName, int voxel ) const; void initBuffers( RfMFuncs &rfm, MFnDependencyNode &nodeFn, int numHairs, int numVerts, int numVertIndices, float baseOpacity, bool isInstanced ); void outputCurves( RfMFuncs &rfm, int numCurves, bool isShutterOpen ); void outputInstanceGeom( RfMFuncs &rfm, MFnDependencyNode& nodeFn, bool isShutterOpen, MObject instanceMesh, int numHairs, int numVerts, int numFaceVerts, const int* faceList, const int* faceStarts, const int* faceEnds, const VERT* verts, const VERT* vertColors, const VERT* vertNormals, const VERT* growthSurfNormal, int index ); void outputGlobalDecls(RfMFuncs &rfm) const; void outputMotionBegin(RfMFuncs &rfm) const; void outputObjSpecificDecls( RfMFuncs &rfm, bool isInstanced ) const; void showHelp() const; MStatus writeMultipleRibs( RfMFuncs& rfm, MObjectArray shaveNodes, const shaveGlobals::Globals& g ); MStatus writeRib( RfMFuncs& rfm, const MObjectArray& shaveNodes, const shaveGlobals::Globals& g ); MStatus writeSingleRib( RfMFuncs& rfm, MObjectArray shaveNodes, const shaveGlobals::Globals& g ); #endif // // Command flags. // bool fDoBinary; bool fDoFullPaths; bool fDoGzip; bool fDoMotionBlur; bool fDoNormals; bool fDoOpacities; bool fRestoreFrame; bool fDoRootPositions; bool fDoRootTipColors; bool fDoSurfaceNormals; bool fDoUVs; bool fDoVertexColors; bool fDoVoxels; bool fDoWCoords; #ifndef NO_PRMAN // // Buffers. // RtFloat fAmbDiff; RtFloat fBaseOpacity; RtFloat fGloss; RtNormal* fNormal; RtColor* fOpacity; RtPointer* fParams; RtColor* fRootColor; RtPoint* fRootPosition; RtFloat* fSCoord; RtFloat fSelfShadow; RtFloat fSpecular; RtInt fSquirrel; RtColor fSpecularColor; RtColor fSpecularColor2; RtNormal* fSurfaceNormal; RtFloat* fTCoord; RtColor* fTipColor; RtToken* fTokens; RtPoint* fVert; RtColor* fVertexColor; RtInt* fVertIndices; RtInt* fVertsPerHair; RtFloat* fWCoord; RtFloat* fWidth; RtInt* fIndex; // // Other // int fCurveIdx; MString fFilename; double fFrameCenter; bool fFrameRelativeTime; double fShutterOpen; double fShutterClose; float openoffset,closeoffset; double fTimeFactor; shaveGlobals::RibTimeUnits fTimeUnits; bool fUseCubicCurves; MString fUVSet; int fVertIdx; int fWidthIdx; #endif }; #endif