#include <maya/MPxCommand.h>
#include <maya/MStatus.h>
#include <maya/MArgList.h>
#include <maya/MFnPlugin.h>
#include <maya/MObject.h>
#include <maya/MGlobal.h>
#include <maya/MString.h>
#include <maya/MPoint.h>
#include <float.h>
#include "iffreader.h"
#include <iostream>
#include <fstream>
#define IFFCHECKERR(stat, call) \
if (!stat) { \
MString string = reader.errorString(); \
string += " in method "; \
string += #call; \
displayError (string); \
return MS::kFailure; \
}
{
public:
iffPpm();
~iffPpm() override;
static void* creator();
private:
bool useDepth;
};
iffPpm::iffPpm()
{
}
iffPpm::~iffPpm() {}
void* iffPpm::creator()
{
return new iffPpm;
}
bool iffPpm::isUndoable() const
{
return true;
}
{
return MS::kSuccess;
}
{
char buffer [256];
sprintf (buffer, "%d", n);
}
{
displayError ("Syntax: iffPpm ifffile ppmfile [-depth]");
return MS::kFailure;
}
{
if (lastArg !=
MString (
"-depth")) {
displayError ("Syntax: iffPpm ifffile ppmfile [-depth]");
return MS::kFailure;
}
useDepth = true;
}
else
useDepth = false;
return redoIt();
}
{
clearResult();
IFFimageReader reader;
stat = reader.open (fileName);
IFFCHECKERR (stat, open);
int imageWidth,imageHeight,bytesPerChannel;
stat = reader.getSize (imageWidth,imageHeight);
IFFCHECKERR (stat, getSize);
bytesPerChannel = reader.getBytesPerChannel ();
stat = reader.readImage ();
IFFCHECKERR (stat, readImage);
std::ofstream out (ppmFile.asChar ());
if (!out.good ())
{
displayError ("Could not create output file");
return MS::kFailure;
}
out << "P3" << std::endl << imageWidth << " " << imageHeight << std::endl;
if (useDepth) {
if (!reader.hasDepthMap ()) {
displayError ("Image has no depth map");
return MS::kFailure;
}
float minDepth=FLT_MAX, maxDepth=(-FLT_MAX);
const float *depthMap = reader.getDepthMap ();
for(int index=0; index<imageWidth*imageHeight; index++)
{
float depth=depthMap[index];
if (depth!=0.)
{
float realDepth= -1.0f/depth;
if (realDepth<minDepth)
minDepth=realDepth;
if (realDepth>maxDepth)
maxDepth=realDepth;
}
}
out << "255" << std::endl;
float scaleFactor = (float) (255.0 / ((double)maxDepth - (double)minDepth));
float offset = minDepth * scaleFactor;
const float *entry = depthMap;
for(int y=0; y < imageHeight; y++)
for(int x=0; x < imageWidth; x++, entry++)
{
if (*entry == 0.)
out << "0 0 0" << std::endl;
else {
float realDepth = -scaleFactor / *entry - offset;
out << (int)realDepth << " " << (int)realDepth << " " <<
(int) realDepth << std::endl;
}
}
} else {
if (!reader.isRGB () && !reader.isGrayscale ()) {
displayError ("Image has no RGB data");
return MS::kFailure;
}
if (bytesPerChannel==1)
out << "255" << std::endl;
else
out << "65535" << std::endl;
const unsigned char *bitmap = reader.getPixelMap ();
const unsigned char *pixel = bitmap;
int bytesPerPixel = (bytesPerChannel == 1) ? 4 : 8;
for(int y=0; y < imageHeight; y++)
for(int x=0; x < imageWidth; x++, pixel += bytesPerPixel)
{
if (bytesPerChannel==1)
{
#if defined(_WIN32) || defined(__linux__)
out << (int)pixel[2] << " " <<
(int)pixel[1] << " " <<
(int)pixel[0] << std::endl;
#else
out << (int)pixel[3] << " " <<
(int)pixel[2] << " " <<
(int)pixel[1] << std::endl;
#endif
}
else
{
#if defined(_WIN32) || defined(__linux__)
out << ((int)pixel[4]<<8)+(int)pixel[5] << " "
<< ((int)pixel[2]<<8)+(int)pixel[3] << " "
<< ((int)pixel[0]<<8)+(int)pixel[1] << std::endl;
#else
out << ((int)pixel[6]<<8)+(int)pixel[7] << " "
<< ((int)pixel[4]<<8)+(int)pixel[5] << " "
<< ((int)pixel[2]<<8)+(int)pixel[3] << std::endl;
#endif
}
}
}
IFFCHECKERR (stat, getPixel);
stat = reader.close ();
IFFCHECKERR (stat, close);
return MS::kSuccess;
}
{
MFnPlugin plugin( obj, PLUGIN_COMPANY,
"3.0",
"Any");
status = plugin.registerCommand( "iffPpm", iffPpm::creator );
if (!status)
status.
perror(
"registerCommand");
return status;
}
{
status = plugin.deregisterCommand( "iffPpm" );
if (!status)
status.
perror(
"deregisterCommand");
return status;
}