aboutsummaryrefslogtreecommitdiff
path: root/mayaPlug/shaveRenderCmd.cpp
diff options
context:
space:
mode:
authorBen Marsh <[email protected]>2019-10-22 09:07:59 -0400
committerBen Marsh <[email protected]>2019-10-22 09:07:59 -0400
commitbd0027e737c6512397f841c22786274ed74b927f (patch)
treef7ffbdb8f3741bb7f24635616cc189cba5cb865c /mayaPlug/shaveRenderCmd.cpp
downloadarchived-shave-and-a-haircut-bd0027e737c6512397f841c22786274ed74b927f.tar.xz
archived-shave-and-a-haircut-bd0027e737c6512397f841c22786274ed74b927f.zip
Adding Shave-and-a-Haircut 9.6
Diffstat (limited to 'mayaPlug/shaveRenderCmd.cpp')
-rw-r--r--mayaPlug/shaveRenderCmd.cpp327
1 files changed, 327 insertions, 0 deletions
diff --git a/mayaPlug/shaveRenderCmd.cpp b/mayaPlug/shaveRenderCmd.cpp
new file mode 100644
index 0000000..5096d2b
--- /dev/null
+++ b/mayaPlug/shaveRenderCmd.cpp
@@ -0,0 +1,327 @@
+// Shave and a Haircut
+// (c) 2019 Epic Games
+// US Patent 6720962
+
+#include <maya/MArgDatabase.h>
+#include <maya/MArgList.h>
+#include <maya/MGlobal.h>
+#include <maya/MPxCommand.h>
+#include <maya/MSelectionList.h>
+#include <maya/MSyntax.h>
+#include <maya/MString.h>
+
+#include "shaveGlobals.h"
+#include "shaveHairShape.h"
+#include "shaveRender.h"
+#include "shaveRenderCmd.h"
+#include "shaveUtil.h"
+
+#if defined(OSMac_)
+#include "shaveMacCarbon.h"
+#endif
+
+
+const MString shaveRenderCmd::commandName("shaveRender");
+
+static const char* kCreateDRAFileLong = "-createDRAFile";
+static const char* kCreateDRAFileShort = "-cdf";
+static const char* kExportEndLong = "-exportEnd";
+static const char* kExportEndShort = "-ee";
+static const char* kExportStartLong = "-exportStart";
+static const char* kExportStartShort = "-es";
+static const char* kOcclusionsLong = "-occlusionsInDRA";
+static const char* kOcclusionsShort = "-occ";
+static const char* kRenderStartLong = "-renderStart";
+static const char* kRenderStartShort = "-rs";
+static const char* kRenderEndLong = "-renderEnd";
+static const char* kRenderEndShort = "-re";
+static const char* kFrameStartLong = "-frameStart";
+static const char* kFrameStartShort = "-fs";
+static const char* kFrameEndLong = "-frameEnd";
+static const char* kFrameEndShort = "-fe";
+static const char* kSwatchLong = "-swatch";
+static const char* kSwatchShort = "-sw";
+static const char* kTargetRendererLong = "-targetRenderer";
+static const char* kTargetRendererShort= "-tr";
+
+//static const char* kShutterOpenLong = "-shutterOpen";
+//static const char* kShutterOpenShort = "-so";
+//
+//static const char* kShutterCloseLong = "-shutterClose";
+//static const char* kShutterCloseShort = "-sc";
+//
+//static const char* kShutterExportLong = "-shutterExport";
+//static const char* kShutterExportShort = "-se";
+
+static const char* kVrayKeyframeLong = "-vrayKeyframe";
+static const char* kVrayKeyframeShort = "-vr";
+
+
+shaveRenderCmd::shaveRenderCmd() {}
+shaveRenderCmd::~shaveRenderCmd() {}
+
+
+void* shaveRenderCmd::createCmd()
+{
+ return new shaveRenderCmd();
+}
+
+
+MSyntax shaveRenderCmd::createSyntax()
+{
+ MSyntax syntax;
+
+ syntax.enableEdit(false);
+ syntax.enableQuery(true);
+
+ syntax.addFlag(kCreateDRAFileShort, kCreateDRAFileLong, MSyntax::kString);
+ syntax.addFlag(kExportEndShort, kExportEndLong);
+ syntax.addFlag(kExportStartShort, kExportStartLong, MSyntax::kString);
+ syntax.addFlag(kFrameEndShort, kFrameEndLong);
+ syntax.addFlag(kFrameStartShort, kFrameStartLong);
+ syntax.addFlag(kOcclusionsShort, kOcclusionsLong);
+ syntax.addFlag(kRenderEndShort, kRenderEndLong);
+ syntax.addFlag(kRenderStartShort, kRenderStartLong);
+ syntax.addFlag(kTargetRendererShort, kTargetRendererLong, MSyntax::kUnsigned);
+
+ syntax.addFlag(
+ kSwatchShort,
+ kSwatchLong,
+ MSyntax::kString,
+ MSyntax::kUnsigned,
+ MSyntax::kString
+ );
+
+ //syntax.addFlag(kShutterOpenShort, kShutterOpenLong);
+ //syntax.addFlag(kShutterCloseShort,kShutterCloseLong);
+ //syntax.addFlag(kShutterExportShort,kShutterExportLong, MSyntax::kString);
+
+ syntax.addFlag(kVrayKeyframeShort, kVrayKeyframeLong);
+
+ return syntax;
+}
+
+
+MStatus shaveRenderCmd::doIt(const MArgList& argList)
+{
+ MStatus status;
+ MArgDatabase args(syntax(), argList, &status);
+
+ if (!status) return status;
+
+ //
+ // Make sure that one, and only one, flag has been specified.
+ //
+ MStringArray flags;
+
+ if (args.isFlagSet(kCreateDRAFileShort)) flags.append(kCreateDRAFileLong);
+ if (args.isFlagSet(kRenderStartShort)) flags.append(kRenderStartLong);
+ if (args.isFlagSet(kRenderEndShort)) flags.append(kRenderEndLong);
+ if (args.isFlagSet(kExportStartShort)) flags.append(kExportStartLong);
+ if (args.isFlagSet(kExportEndShort)) flags.append(kExportEndLong);
+ if (args.isFlagSet(kFrameStartShort)) flags.append(kFrameStartLong);
+ if (args.isFlagSet(kFrameEndShort)) flags.append(kFrameEndLong);
+ if (args.isFlagSet(kSwatchShort)) flags.append(kSwatchLong);
+
+ //if (args.isFlagSet(kShutterOpenShort)) flags.append(kShutterOpenLong);
+ //if (args.isFlagSet(kShutterCloseShort)) flags.append(kShutterCloseLong);
+ //if (args.isFlagSet(kShutterExportShort)) flags.append(kShutterExportLong);
+
+ if (args.isFlagSet(kVrayKeyframeShort)) flags.append(kVrayKeyframeLong);
+
+ if (flags.length() == 0)
+ {
+ MGlobal::displayError(
+ commandName + ": no flags specified. Nothing to do."
+ );
+ return MS::kNotFound;
+ }
+ else if (flags.length() > 1)
+ {
+ MGlobal::displayError(
+ commandName + ": the '" + flags[0] + "' and '" + flags[1]
+ + "' flags cannot be used together on the same command."
+ );
+ return MS::kInvalidParameter;
+ }
+
+ SHAVE_RENDER_HOST renderHost = kShaveHostPRMAN;
+
+ if (args.isFlagSet(kTargetRendererShort))
+ {
+ int val;
+
+ args.getFlagArgument(kTargetRendererShort, 0, val);
+
+ switch ((SHAVE_RENDER_HOST)val)
+ {
+ case kShaveHostPRMAN:
+ case kShaveHostBuffer:
+ renderHost = (SHAVE_RENDER_HOST)val;
+ break;
+
+ default:
+ displayError(
+ commandName + ": invalid value for '" + kTargetRendererLong
+ + "' flag. Must be one of "
+ + kShaveHostPRMAN + " (PRMAN), "
+ + kShaveHostBuffer + " (buffer)."
+ );
+ return MS::kInvalidParameter;
+ break;
+ }
+ }
+
+ shaveGlobals::getGlobals();
+
+ //
+ // I used to enclose all the 'kRender*' flags in a test such that these
+ // commands would only be honoured during a render or export.
+ // However, some render cleanup code runs on an idle event
+ // and by the time it gets around to running, the flags telling us
+ // whether we're doing a render or export might no longer be set.
+ // So it's better to always honour these commands and rely on the
+ // callers to only call them when it's appropriate.
+ //
+ if (args.isFlagSet(kRenderStartShort))
+ shaveRender::renderStart(NULL);
+ else if (args.isFlagSet(kRenderEndShort))
+ shaveRender::renderEnd(NULL);
+ else if (args.isFlagSet(kExportStartShort))
+ {
+ MString exportFile;
+
+ args.getFlagArgument(kExportStartShort, 0, exportFile);
+ shaveRender::exportStart(exportFile);
+ }
+ else if (args.isFlagSet(kExportEndShort))
+ shaveRender::exportEnd();
+ else if (args.isFlagSet(kFrameStartShort))
+ shaveRender::frameStart(NULL);
+ else if (args.isFlagSet(kFrameEndShort))
+ shaveRender::frameEnd(NULL);
+ else if (args.isFlagSet(kSwatchShort))
+ {
+ MString shaveHairShapeName;
+
+ args.getFlagArgument(kSwatchShort, 0, shaveHairShapeName);
+
+ MSelectionList list;
+ list.add(shaveHairShapeName);
+
+ MObject shaveHairShape;
+ list.getDependNode(0, shaveHairShape);
+
+ if (shaveHairShape.isNull())
+ {
+ MGlobal::displayError(
+ MString("shaveRender: '") + shaveHairShapeName
+ + "' is not a shave hair node."
+ );
+
+ return MS::kInvalidParameter;
+ }
+
+ MFnDependencyNode nodeFn(shaveHairShape);
+
+ if (nodeFn.typeId() != shaveHairShape::id)
+ {
+ MGlobal::displayError(
+ MString("shaveRender: '") + shaveHairShapeName
+ + "' is not a shave hair node."
+ );
+
+ return MS::kInvalidParameter;
+ }
+
+ unsigned int resolution;
+
+ args.getFlagArgument(kSwatchShort, 1, resolution);
+
+ if (resolution == 0)
+ {
+ MGlobal::displayError(
+ "shaveRender: resolution of swatch must greater than zero."
+ );
+
+ return MS::kInvalidParameter;
+ }
+
+ MString fileName;
+
+ args.getFlagArgument(kSwatchShort, 2, fileName);
+
+#if defined(OSMac_) && !defined(OSMac_MachO_)
+ //
+ // The filename will be coming to us in standard POSIX form
+ // (e.g. "/path/to/file"), but since this is the CFM version of
+ // Maya on OSX then we need to convert that to an HSF filename.
+ //
+ fileName = shaveMacCarbon::makeMacFilename(fileName);
+#endif
+
+ status = shaveRender::renderSwatch(shaveHairShape, resolution, fileName);
+
+ if (!status)
+ {
+ MGlobal::displayError(
+ MString("shaveRender: error rendering swatch to '")
+ + fileName + "'."
+ );
+ }
+ }
+ else if (args.isFlagSet(kCreateDRAFileShort))
+ {
+
+ MString fileName;
+ args.getFlagArgument(kCreateDRAFileShort, 0, fileName);
+
+ bool includeOcclusions = args.isFlagSet(kOcclusionsShort);
+
+#if defined(OSMac_) && !defined(OSMac_MachO_)
+ //
+ // The filename will be coming to us in standard POSIX form
+ // (e.g. "/path/to/file"), but since this is the CFM version of
+ // Maya on OSX then we need to convert that to an HSF filename.
+ //
+ fileName = shaveMacCarbon::makeMacFilename(fileName);
+#endif
+
+ MGlobal::displayInfo(MString("exporting hair to '") + fileName + "'.");
+
+ status = shaveRender::renderToDRAFile(
+ renderHost,
+ fileName,
+ voxelResolutionGlob,
+ includeOcclusions
+ );
+
+ if (status == MS::kNotFound)
+ {
+ MGlobal::displayError(
+ commandName + ": no renderable shaveHairShapes in scene,"
+ + " no hair file generated."
+ );
+ }
+ }
+ //else if(args.isFlagSet(kShutterOpenShort))
+ //{
+ // shaveRender::shutterOpen();
+ //}
+ //else if(args.isFlagSet(kShutterCloseShort))
+ //{
+ // shaveRender::shutterClose();
+ //}
+ //else if(args.isFlagSet(kShutterExportShort))
+ //{
+ // MString fileName;
+ // args.getFlagArgument(kShutterExportShort, 0, fileName);
+ // shaveRender::shutterExport(fileName);
+ //}
+ else if(args.isFlagSet(kVrayKeyframeShort))
+ {
+ shaveRender::vrayKeyFrame();
+ }
+ return status;
+}
+