Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
SoGL2PSAction.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26
27/*----------------------------HEPVis----------------------------------------*/
28/* */
29/* Node: SoGL2PSAction */
30/* Author: Guy Barrand */
31/* */
32/*--------------------------------------------------------------------------*/
33
34// this :
36
37// Inventor :
38#include <Inventor/elements/SoViewportRegionElement.h>
39#include <Inventor/errors/SoDebugError.h>
40
41#include <Inventor/system/gl.h>
42
43#include <stdio.h>
44
45SO_ACTION_SOURCE(SoGL2PSAction)
46//////////////////////////////////////////////////////////////////////////////
47void SoGL2PSAction::initClass(
48)
49//////////////////////////////////////////////////////////////////////////////
50//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
51{
52 static bool first = true;
53 if (first) {
54 first = false;
55 SO_ACTION_INIT_CLASS(SoGL2PSAction,SoGLRenderAction);
56 }
57}
58//////////////////////////////////////////////////////////////////////////////
60 const SbViewportRegion& aViewPortRegion
61)
62:SoGLRenderAction(aViewPortRegion)
63,fContext(0)
64,fFile(0)
65,fFileName("out.pdf")
66,fTitle("title")
67,fProducer("HEPVis::SoGL2PSAction")
68,fFormat(TOOLS_GL2PS_PDF)
69//////////////////////////////////////////////////////////////////////////////
70//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
71{
72 SO_ACTION_CONSTRUCTOR(SoGL2PSAction);
73}
74
75//////////////////////////////////////////////////////////////////////////////
77//////////////////////////////////////////////////////////////////////////////
78//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
79{
80 closeFile();
81}
82
83//////////////////////////////////////////////////////////////////////////////
84void SoGL2PSAction::setFileName(const std::string& aFileName)
85//////////////////////////////////////////////////////////////////////////////
86//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
87{
88 fFileName = aFileName;
89}
90
91//////////////////////////////////////////////////////////////////////////////
92void SoGL2PSAction::setTitleAndProducer(const std::string& aTitle,const std::string& aProducer)
93//////////////////////////////////////////////////////////////////////////////
94//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
95{
96 fTitle = aTitle;
97 fProducer = aProducer;
98}
99
106
107//////////////////////////////////////////////////////////////////////////////
109//////////////////////////////////////////////////////////////////////////////
110//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
111{
112 if(!openFile()) {
113 SoDebugError::post("SoGL2PSAction::enableFileWriting",
114 "openFile() failed for fil %s",
115 fFileName.c_str());
116 return false;
117 }
118#ifdef __COIN__
119#else //SGI
120 const SbViewportRegion& vpr = getViewportRegion();
121 SoViewportRegionElement::set(getState(),vpr);
122 SbVec2s origin = vpr.getViewportOriginPixels();
123 SbVec2s size = vpr.getViewportSizePixels();
124 if(!beginPage(origin[0],origin[1],size[0],size[1])) {
125 SoDebugError::post("SoGL2PSAction::enableFileWriting","beginPage() failed");
126 return false;
127 }
128#endif
129 return true;
130}
131//////////////////////////////////////////////////////////////////////////////
133)
134//////////////////////////////////////////////////////////////////////////////
135//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
136{
137#ifdef __COIN__
138#else //SGI
139 endPage();
140#endif
141 closeFile();
142}
143
144//////////////////////////////////////////////////////////////////////////////
146 SoNode* aNode
147)
148//////////////////////////////////////////////////////////////////////////////
149//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
150{
151 if(fContext && fFile) {
152#ifdef __COIN__
153 const SbViewportRegion& vpr = getViewportRegion();
154 SoViewportRegionElement::set(getState(),vpr);
155 SbVec2s origin = vpr.getViewportOriginPixels();
156 SbVec2s size = vpr.getViewportSizePixels();
157 if(!beginPage(origin[0],origin[1],size[0],size[1])) {
158 SoDebugError::post("SoGL2PSAction::beginTraversal","beginPage() failed");
159 return;
160 }
161 traverse(aNode);
162 if(!endPage()) {
163 SoDebugError::post("SoGL2PSAction::beginTraversal","endPage() failed");
164 return;
165 }
166#else //SGI
167 SoGLRenderAction::beginTraversal(aNode);
168#endif
169 } else {
170 SoGLRenderAction::beginTraversal(aNode);
171 }
172}
173
174#include <tools/gl2ps>
175
176//////////////////////////////////////////////////////////////////////////////
177bool SoGL2PSAction::openFile()
178//////////////////////////////////////////////////////////////////////////////
179//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
180{
181 if(fFile) {
182 ::fclose(fFile);
183 fFile = 0;
184 }
185 if(fContext) {
186 ::tools_gl2psDeleteContext(fContext);
187 fContext = 0;
188 }
189
190 fContext = ::tools_gl2psCreateContext();
191 if(!fContext) return false;
192
193 tools_gl2ps_gl_funcs_t _funcs = {
194 (tools_glIsEnabled_func)glIsEnabled,
195 (tools_glBegin_func)glBegin,
196 (tools_glEnd_func)glEnd,
197 (tools_glGetFloatv_func)glGetFloatv,
198 (tools_glVertex3f_func)glVertex3f,
199 (tools_glGetBooleanv_func)glGetBooleanv,
200 (tools_glGetIntegerv_func)glGetIntegerv,
201 (tools_glRenderMode_func)glRenderMode,
202 (tools_glFeedbackBuffer_func)glFeedbackBuffer,
203 (tools_glPassThrough_func)glPassThrough
204 };
205 ::tools_gl2ps_set_gl_funcs(fContext,&_funcs);
206
207 fFile = ::fopen(fFileName.c_str(),"wb");
208 if(!fFile) {
209 ::tools_gl2psDeleteContext(fContext);
210 fContext = 0;
211 return false;
212 }
213
214 return true;
215}
216
217//////////////////////////////////////////////////////////////////////////////
218void SoGL2PSAction::closeFile()
219//////////////////////////////////////////////////////////////////////////////
220//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
221{
222 if(fFile) {
223 ::fclose(fFile);
224 fFile = 0;
225 }
226 if(fContext) {
227 ::tools_gl2psDeleteContext(fContext);
228 fContext = 0;
229 }
230}
231
232//////////////////////////////////////////////////////////////////////////////
233bool SoGL2PSAction::beginPage(int a_x,int a_y,int a_w,int a_h)
234//////////////////////////////////////////////////////////////////////////////
235//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
236{
237 if(!fContext) return false;
238 if(!fFile) return false;
239
240 if( (a_w<=0) || (a_h<=0) ) return false;
241
242 int options =
246 int sort = TOOLS_GL2PS_BSP_SORT;
247
248 int vp[4];
249 vp[0] = a_x;
250 vp[1] = a_y;
251 vp[2] = a_w;
252 vp[3] = a_h;
253
254 int bufferSize = 0;
255
256 tools_GLint res = ::tools_gl2psBeginPage
257 (fContext,fTitle.c_str(),fProducer.c_str(),
258 vp,fFormat,sort,options,TOOLS_GL_RGBA,0, NULL,0,0,0,
259 bufferSize,fFile,fFileName.c_str());
260 if (res == TOOLS_GL2PS_ERROR) return false;
261
262 // enable blending for all
263 ::tools_gl2psEnable(fContext,TOOLS_GL2PS_BLEND);
264
265 return true;
266}
267
268//////////////////////////////////////////////////////////////////////////////
269bool SoGL2PSAction::endPage()
270//////////////////////////////////////////////////////////////////////////////
271//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
272{
273 int _status = 0;
274 if(fContext) {
275 _status = ::tools_gl2psEndPage(fContext);
276 }
277 if (_status == TOOLS_GL2PS_OVERFLOW) return false;
278 return true;
279}
280
281//////////////////////////////////////////////////////////////////////////////
283 int aWidth
284,int aHeight
285,float aXorig
286,float aYorig
287,float aXmove
288,float aYmove
289)
290/////////////////////////////////////////////////////////////////////////////
291//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
292{
293 if(!fContext) return false;
294 GLboolean valid;
295 ::glGetBooleanv(GL_CURRENT_RASTER_POSITION_VALID,&valid);
296 if(!valid) return false;
297 float pos[4];
298 ::glGetFloatv(GL_CURRENT_RASTER_POSITION,pos);
299 int xoff = -(int)(aXmove + aXorig);
300 int yoff = -(int)(aYmove + aYorig);
301 int x = (int)(pos[0] + xoff);
302 int y = (int)(pos[1] + yoff);
303 // Should clip against viewport area :
304 GLint vp[4];
305 ::glGetIntegerv(GL_VIEWPORT,vp);
306 GLsizei w = aWidth;
307 GLsizei h = aHeight;
308 if(x+w>(vp[0]+vp[2])) w = vp[0]+vp[2]-x;
309 if(y+h>(vp[1]+vp[3])) h = vp[1]+vp[3]-y;
310 int s = 3 * w * h;
311 if(s<=0) return false;
312 float* image = (float*)::malloc(s * sizeof(float));
313 if(!image) return false;
314 ::glReadPixels(x,y,w,h,GL_RGB,GL_FLOAT,image);
315 GLint status = ::tools_gl2psDrawPixels(fContext,w,h,xoff,yoff,GL_RGB,GL_FLOAT,image);
316 ::free(image);
317 return (status!=TOOLS_GL2PS_SUCCESS ? false : true);
318}
319
void setExportImageFormat_TEX()
bool enableFileWriting()
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
SoGL2PSAction(const SbViewportRegion &)
void setExportImageFormat_SVG()
void setExportImageFormat_EPS()
virtual ~SoGL2PSAction()
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
void setExportImageFormat_PS()
void setExportImageFormat_PGF()
bool addBitmap(int, int, float=0, float=0, float=0, float=0)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
virtual void beginTraversal(SoNode *)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
void disableFileWriting()
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
void setTitleAndProducer(const std::string &, const std::string &)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
void setFileName(const std::string &)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
void setExportImageFormat_PDF()
#define TOOLS_GL2PS_USE_CURRENT_VIEWPORT
Definition: gl2ps_def.h:69
#define TOOLS_GL2PS_ERROR
Definition: gl2ps_def.h:52
#define TOOLS_GL2PS_SUCCESS
Definition: gl2ps_def.h:49
tools_GLint(* tools_glRenderMode_func)(tools_GLenum)
Definition: gl2ps_def.h:195
#define TOOLS_GL2PS_BEST_ROOT
Definition: gl2ps_def.h:63
#define TOOLS_GL2PS_BSP_SORT
Definition: gl2ps_def.h:45
int tools_GLint
Definition: gl2ps_def.h:7
void(* tools_glVertex3f_func)(tools_GLfloat, tools_GLfloat, tools_GLfloat)
Definition: gl2ps_def.h:192
void(* tools_glGetFloatv_func)(tools_GLenum, tools_GLfloat *)
Definition: gl2ps_def.h:191
#define TOOLS_GL2PS_PGF
Definition: gl2ps_def.h:39
#define TOOLS_GL2PS_EPS
Definition: gl2ps_def.h:35
void(* tools_glBegin_func)(tools_GLenum)
Definition: gl2ps_def.h:189
void(* tools_glFeedbackBuffer_func)(tools_GLsizei, tools_GLenum, tools_GLfloat *)
Definition: gl2ps_def.h:196
void(* tools_glPassThrough_func)(tools_GLfloat)
Definition: gl2ps_def.h:197
#define TOOLS_GL_RGBA
Definition: gl2ps_def.h:145
#define TOOLS_GL2PS_BLEND
Definition: gl2ps_def.h:82
#define TOOLS_GL2PS_PS
Definition: gl2ps_def.h:34
#define TOOLS_GL2PS_PDF
Definition: gl2ps_def.h:37
void(* tools_glGetBooleanv_func)(tools_GLenum, tools_GLboolean *)
Definition: gl2ps_def.h:193
void(* tools_glEnd_func)()
Definition: gl2ps_def.h:190
#define TOOLS_GL2PS_OVERFLOW
Definition: gl2ps_def.h:54
void(* tools_glGetIntegerv_func)(tools_GLenum, tools_GLint *)
Definition: gl2ps_def.h:194
tools_GLboolean(* tools_glIsEnabled_func)(tools_GLenum)
Definition: gl2ps_def.h:188
#define TOOLS_GL2PS_DRAW_BACKGROUND
Definition: gl2ps_def.h:60
#define TOOLS_GL2PS_SVG
Definition: gl2ps_def.h:38
#define TOOLS_GL2PS_TEX
Definition: gl2ps_def.h:36