26 #ifdef G4VIS_BUILD_OI_DRIVER
36 #include <HEPVis/nodes/SoImageWriter.h>
38 #include <Inventor/errors/SoDebugError.h>
39 #include <Inventor/elements/SoViewportRegionElement.h>
40 #include <Inventor/actions/SoGLRenderAction.h>
42 #include <HEPVis/SbGL.h>
43 #include <HEPVis/SbPainterPS.h>
53 typedef unsigned char Uchar;
58 static int sWidth = 0;
59 static int sHeight = 0;
60 static float* sImage = 0;
61 static int getRGB(
unsigned int,
unsigned int,
double&,
double&,
double&);
63 SO_NODE_SOURCE(SoImageWriter)
65 void SoImageWriter::initClass (
70 SO_NODE_INIT_CLASS(SoImageWriter,SoNode,
"Node");
73 SoImageWriter::SoImageWriter(
80 SO_NODE_CONSTRUCTOR(SoImageWriter);
82 SO_NODE_ADD_FIELD(fileName,(
"out.ps"));
90 SoImageWriter::~SoImageWriter (
97 void SoImageWriter::enable(
105 void SoImageWriter::disable(
113 SbBool SoImageWriter::getStatus(
121 void SoImageWriter::GLRender(
122 SoGLRenderAction* aAction
129 if(!fEnabled)
return;
130 SbViewportRegion vpr = SoViewportRegionElement::get(aAction->getState());
131 const SbVec2s& win = vpr.getWindowSize();
135 SoDebugError::postInfo(
"SoImageWriter::GLRender",
"null area window !");
142 float* image =
new float[
s];
148 glReadPixels(x,y,w,h,GL_RGB,GL_FLOAT,image);
180 SbPainterPS painterPS;
181 painterPS.openFileForWriting(fileName.getValue().getString());
182 if(!painterPS.getStream()) {
183 SoDebugError::postInfo(
"SoImageWriter::GLRender",
184 "can't open file \"%s\".",fileName.getValue().getString());
186 painterPS.setWindowSize(w,h);
188 painterPS.setBitsPerPixel(4);
189 painterPS.beginTraversal();
190 painterPS.clearColorBuffer(1.,1.,1.);
195 painterPS.putImageInStream((
unsigned int)w,(
unsigned int)h,getRGB);
197 painterPS.endTraversal();
199 painterPS.closeStream();
339 float* pimag = sImage + 3 * (sWidth * (sHeight - 1 - aY) + aX);
340 aRed = *pimag;pimag++;
341 aGreen = *pimag;pimag++;
342 aBlue = *pimag;pimag++;