Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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