aboutsummaryrefslogtreecommitdiff
path: root/mayaPlug/shaveUtil.h
diff options
context:
space:
mode:
Diffstat (limited to 'mayaPlug/shaveUtil.h')
-rw-r--r--mayaPlug/shaveUtil.h236
1 files changed, 236 insertions, 0 deletions
diff --git a/mayaPlug/shaveUtil.h b/mayaPlug/shaveUtil.h
new file mode 100644
index 0000000..0942e85
--- /dev/null
+++ b/mayaPlug/shaveUtil.h
@@ -0,0 +1,236 @@
+#ifndef _shaveUtil_h
+#define _shaveUtil_h
+// Shave and a Haircut
+// (c) 2019 Epic Games
+// US Patent 6720962
+
+#include <math.h>
+#include <stdio.h>
+#include <vector>
+
+#include <maya/MDagPath.h>
+#include <maya/MDagPathArray.h>
+#include <maya/MFnMesh.h>
+#include <maya/MIntArray.h>
+#include <maya/MObjectArray.h>
+#include <maya/MPointArray.h>
+#include <maya/MString.h>
+#include <maya/MUint64Array.h>
+
+#include "shaveSDKTYPES.h"
+
+#if MAYA_API_VERSION < 20180000
+class MFloatPointArray;
+class MSelectionList;
+#endif
+
+class shaveHairShape;
+class shaveRenderer;
+
+
+class shaveUtil
+{
+public:
+ static void buildLightList();
+
+ static void classifyShaveNodes(
+ const MObjectArray& shaveNodes,
+ bool& haveHair,
+ bool& haveInstances
+ );
+
+ // Compare two Shave version strings of the form 1.2.3 or 1.2v3
+ // Returns -1 if v1 < v2, 0 if v1 == v2, +1 if v1 > v2.
+ static int compareShaveVersions(MString v1, MString v2);
+
+ // Returns true if it made changes to the selection list.
+ static bool convertComponentSelections(
+ bool* pHiliteListChanged = NULL
+ );
+
+ static MString expandStatFileName(MString fileName);
+ static MString expandTempFileName(MString fileName);
+
+ // Copy one full line of input to the output, returning to the caller
+ // as much as will fit in the supplied buffer.
+ //
+ // Returns false if there was no input left to read.
+ static bool fileCopyLine(
+ FILE* input,
+ FILE* output,
+ char* buffer,
+ unsigned int bufferSize
+ );
+
+ static void fileDelete(MString fileName);
+ static bool fileExists(MString fileName);
+ static bool fileRename(MString oldName, MString newName);
+ static MStatus forceCompute(MObject shaveNode);
+ static void forceComputeAll();
+ static MString formatFrame(float frame);
+
+ // Returns the value of a plug of type kAddr.
+ static void* getAddrPlugValue(const MPlug& addrPlug, MStatus* st = NULL);
+
+ static MDagPath getCurrentHairShape(bool* pIsHilited = NULL);
+
+ // Displacements are applied in worldSpace so the returned vert
+ // positions will be in worldSpace.
+ static void getDisplacedMeshVertices(
+ MObject mesh,
+ MObject shadingGroup,
+ MFloatPointArray& displacedVerts
+ );
+
+ static void getDisplayNodes(MObjectArray& nodes);
+
+ static const MDagPathArray&
+ getFields();
+
+ static int getLightIndex(const void* lightBlindData);
+
+ static int getLightIndex(
+ const MFloatVector& point,
+ const MFloatVector& dirToLight
+ );
+
+ static int getLightIndexFromID(int id);
+ static int getLoadDepth();
+ static shaveHairShape* getLoadedHairShape();
+
+ static MObject getMesh(
+ MDagPath& path,
+ int uTess = -1,
+ int vTess = -1,
+ int sDept = 1,
+ int sSamp = 1,
+ bool includeDisplacements = false
+ );
+
+ static MObject getNode(MString nodeName);
+ static void getNodesByTypeId(MTypeId nodeType, MObjectArray& nodes);
+ static void getPathsByTypeId(MTypeId nodeType, MDagPathArray& nodes);
+ static long getpid();
+
+ static void getShadingGroups(
+ const MDagPath& path, MObjectArray& shadingGroups
+ );
+
+ static void getShaveGlobalsNodes(MObjectArray& nodes);
+ static void getShaveNodes(MDagPathArray& nodes);
+ static void getShaveNodes(MObjectArray& nodes);
+
+ static void getSubdQuads(
+ MDagPath& subdPath,
+ MUint64Array& quadIDs,
+ MPointArray& verts,
+ MIntArray& vertIndices,
+ MDoubleArray* vertUs = NULL,
+ MDoubleArray* vertVs = NULL
+ );
+
+ static void getSubdQuads(
+ MObject subdData,
+ MUint64Array& quadIDs,
+ MPointArray& verts,
+ MIntArray& vertIndices,
+ MDoubleArray* vertUs = NULL,
+ MDoubleArray* vertVs = NULL
+ );
+
+ static unsigned getThreadSettings(
+ unsigned numItems, unsigned* pItemsPerThread = NULL
+ );
+
+ static MString getHostName();
+ static bool isIgnoringNextSelectionChange();
+ static bool isLoadingFile();
+ static bool isSurfaceDisplaced(const MDagPath& surface);
+ static MString makeStatFileName(MString nodeName, float frame);
+
+ static MString makeTempStatFileName(
+ MString nodeName, MString suffix, float frame
+ );
+
+ // If 'path' is empty then the default temp directory will be used.
+ // Not thread-safe!
+ static MString makeUniqueTempFileName(
+ MString directory, MString prefix, MString suffix
+ );
+
+ static int reorderInt(int val);
+
+ static MStatus sampleCurves(
+ const MObjectArray& curves,
+ unsigned int samplesPerCurve,
+ WFTYPE& sampleData
+ );
+
+ static void setFieldsDirty() { mFieldsDirty = true; }
+ static void setFrame(float newFrame);
+ static void setIgnoringNextSelectionChange(bool ignoreIt);
+ static void setLoadingFile(bool newState);
+ static void setWFTYPEVelocities(WFTYPE* wf1, WFTYPE* wf2);
+
+ static void splitFileName(
+ MString fileName,
+ MString& baseName,
+ MString& extension
+ );
+
+ static bool splitShaveVersion(
+ const MString version,
+ int versionParts[3]
+ );
+
+ static MString substituteAll(
+ const MString& str, char oldChar, char newChar
+ );
+
+ static MString substituteAll(
+ const MString& str,
+ const MString& oldSubstr,
+ const MString& newSubstr
+ );
+
+ static void timestamp(const MString& msg);
+
+protected:
+ static void appendConnectedShadingGroups(
+ const MPlug& plug, MObjectArray& shadingGroups
+ );
+
+ static MDagPath getFirstHairShape(MSelectionList& list);
+
+public:
+ typedef struct
+ {
+ MDagPath path;
+ int minId;
+ int maxId;
+ void* blindData;
+ } LightInfo;
+
+ static std::vector<LightInfo> globalLightList;
+
+private:
+ static MDagPathArray mFields;
+ static bool mFieldsDirty;
+ static bool mIgnoreNextSelectionChange;
+ static int mLoadDepth;
+};
+
+
+inline int shaveUtil::getLoadDepth()
+{ return mLoadDepth; }
+
+inline bool shaveUtil::isIgnoringNextSelectionChange()
+{ return mIgnoreNextSelectionChange; }
+
+inline bool shaveUtil::isLoadingFile()
+{ return (mLoadDepth > 0); }
+
+inline void shaveUtil::setIgnoringNextSelectionChange(bool ignoreIt)
+{ mIgnoreNextSelectionChange = ignoreIt; }
+
+#endif