source: trunk/source/visualization/FukuiRenderer/src/G4DAWNFILEViewer.cc @ 1347

Last change on this file since 1347 was 1347, checked in by garnier, 13 years ago

geant4 tag 9.4

File size: 11.6 KB
Line 
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// $Id: G4DAWNFILEViewer.cc,v 1.21 2010/11/11 01:13:42 akimura Exp $
28// GEANT4 tag $Name: geant4-09-04-ref-00 $
29//
30// Satoshi TANAKA
31// DAWNFILE view - opens window, hard copy, etc.
32
33
34#define __G_ANSI_C__
35#define G4DAWNFILE_STRUCTURE_PRIORITY  1.
36
37// #define DEBUG_FR_VIEW
38
39#include "G4ios.hh"
40#include <stdio.h>
41#include <string.h>
42#include <assert.h>
43
44#include "G4VisManager.hh"
45#include "G4Scene.hh"
46#include "G4Vector3D.hh"
47#include "G4VisExtent.hh"
48#include "G4LogicalVolume.hh"
49#include "G4VSolid.hh"
50
51#include "G4FRConst.hh"
52#include "G4DAWNFILE.hh"
53#include "G4DAWNFILESceneHandler.hh"
54#include "G4DAWNFILEViewer.hh"
55
56
57
58        //----- constants
59const char  FR_ENV_MULTI_WINDOW [] = "G4DAWN_MULTI_WINDOW" ;
60const char  FR_ENV_MULTI_WINDOW2[] = "G4DAWNFILE_MULTI_WINDOW" ;
61
62        //----- G4DAWNFILEViewer, constructor
63G4DAWNFILEViewer::G4DAWNFILEViewer (G4DAWNFILESceneHandler& sceneHandler,
64                                const G4String& name): 
65  G4VViewer (sceneHandler,
66             sceneHandler.IncrementViewCount (),
67             name),
68  fSceneHandler (sceneHandler)
69{
70        // Set a g4.prim-file viewer
71        strcpy( fG4PrimViewer, "dawn" ); 
72        if( getenv( "G4DAWNFILE_VIEWER" ) != NULL ) {
73                strcpy( fG4PrimViewer, getenv( "G4DAWNFILE_VIEWER" ) ) ;                       
74        } 
75
76        // string for viewer invocation
77        if ( !strcmp( fG4PrimViewer, "NONE" ) ) {
78               
79                strcpy( fG4PrimViewerInvocation, "" );
80        } else {
81
82                strcpy( fG4PrimViewerInvocation, fG4PrimViewer );
83                strcat( fG4PrimViewerInvocation, " ");
84                strcat( fG4PrimViewerInvocation, fSceneHandler.GetG4PrimFileName() );
85        }
86
87        // Set a PostScript Viewer
88//      strcpy( fPSViewer, "ghostview" );
89        strcpy( fPSViewer, "gv" ); 
90        if( getenv( "G4DAWNFILE_PS_VIEWER" ) != NULL ) {
91                strcpy( fPSViewer, getenv( "G4DAWNFILE_PS_VIEWER" ) ) ;                 
92        } 
93
94}
95
96        //----- G4DAWNFILEViewer, destructor
97G4DAWNFILEViewer::~G4DAWNFILEViewer () 
98{}
99
100        //----- G4DAWNFILEViewer::SetView ()
101void G4DAWNFILEViewer::SetView () 
102{
103#if defined DEBUG_FR_VIEW
104  if (G4VisManager::GetVerbosity() >= G4VisManager::errors)
105    G4cout << "***** G4DAWNFILEViewer::SetView(): No effects" << G4endl;
106#endif
107// Do nothing, since DAWN is running as a different process.
108// SendViewParameters () will do this job instead.
109}
110
111
112        //----- G4DAWNFILEViewer::ClearView()
113void
114G4DAWNFILEViewer::ClearView( void )
115{
116#if defined DEBUG_FR_VIEW
117  if (G4VisManager::GetVerbosity() >= G4VisManager::errors)
118        G4cout << "***** G4DAWNFILEViewer::ClearView (): No effects " << G4endl;
119#endif
120        if (fSceneHandler.fPrimDest.IsOpen()) {
121          fSceneHandler.fPrimDest.Close();
122          // Re-open with same filename...
123          fSceneHandler.fPrimDest.Open(fSceneHandler.fG4PrimFileName);
124          fSceneHandler.SendStr( FR_G4_PRIM_HEADER );
125          fSceneHandler.FRflag_in_modeling = false;
126          fSceneHandler.FRBeginModeling();
127        }
128}
129
130
131        //----- G4DAWNFILEViewer::DrawView ()
132void G4DAWNFILEViewer::DrawView () 
133{
134#if defined DEBUG_FR_VIEW
135  if (G4VisManager::GetVerbosity() >= G4VisManager::errors)
136        G4cout << "***** G4DAWNFILEViewer::DrawView () " << G4endl;
137#endif
138                //-----
139        fSceneHandler.FRBeginModeling() ;
140
141                //----- Always visit G4 kernel
142        NeedKernelVisit ();
143                                   
144                //----- Draw
145        ProcessView () ;
146
147} // G4DAWNFILEViewer::DrawView ()
148
149
150
151        //----- G4DAWNFILEViewer::ShowView()
152void G4DAWNFILEViewer::ShowView( void )
153{
154#if defined DEBUG_FR_VIEW
155  if (G4VisManager::GetVerbosity() >= G4VisManager::errors)
156        G4cout << "***** G4DAWNFILEViewer::ShowView () " << G4endl;
157#endif
158
159        if( fSceneHandler.FRIsInModeling() ) 
160        {
161                        //----- End of modeling
162                        // !EndModeling, !DrawAll, !CloseDevice,
163                        // close g4.prim
164                fSceneHandler.FREndModeling();
165
166                        //----- Output DAWN GUI file
167                SendViewParameters(); 
168
169                        //----- string for viewer invocation
170                if ( !strcmp( fG4PrimViewer, "NONE" ) ) {
171               
172                        strcpy( fG4PrimViewerInvocation, "" );
173                } else {
174
175                        strcpy( fG4PrimViewerInvocation, fG4PrimViewer );
176                        strcat( fG4PrimViewerInvocation, " ");
177                        strcat( fG4PrimViewerInvocation, fSceneHandler.GetG4PrimFileName() );
178                }
179
180
181                //----- Invoke DAWN
182                G4cout << G4endl ;
183                if( false == G4FRofstream::DoesFileExist( fSceneHandler.GetG4PrimFileName() ) )   
184                {
185                        G4cout << "ERROR: Failed to generate file  ";
186                        G4cout << fSceneHandler.GetG4PrimFileName() << G4endl;
187
188                } else  if( strcmp( GetG4PrimViewerInvocation(), "" ) ) 
189                {
190                        G4cout << "File  " << fSceneHandler.GetG4PrimFileName() ;
191                        G4cout << "  is generated." << G4endl;
192                        G4cout << GetG4PrimViewerInvocation() << G4endl;
193                        system( GetG4PrimViewerInvocation() );
194
195                } else { // no view, i.e., only file generation
196                        G4cout << "File  " << fSceneHandler.GetG4PrimFileName() ; 
197                        G4cout << "  is generated." << G4endl;
198                        G4cout << "No viewer is invoked." << G4endl;
199                }
200
201        }
202
203} // G4DAWNFILEViewer::ShowView()
204
205
206        //----- G4DAWNFILEViewer::SendDrawingStyleToDAWNGUI( std::ostream& out )
207void  G4DAWNFILEViewer::SendDrawingStyleToDAWNGUI( std::ostream& out ) 
208{
209///////////////////////
210//#if defined DEBUG_FR_VIEW
211//  G4cout << "***** G4DAWNFILEViewer::SendDrawingStyleToDAWNGUI()" << G4endl;
212//#endif
213//////////////////////
214
215        G4int  style = fVP.GetDrawingStyle();
216
217        enum {  FR_WIREFRAME = 1, FR_WF_STORED = 2, FR_HID =3  , \
218                FR_HID2      = 4, FR_HID3      = 5, FR_DRAWING_MODE_END = 6 };
219
220        switch( style )
221        {
222          case G4ViewParameters::wireframe: 
223                out <<  FR_WIREFRAME << G4endl;
224                break;
225          case G4ViewParameters::hlr:
226                out <<  FR_HID2      << G4endl; // LINE
227                break;
228          case G4ViewParameters::hsr:
229          case G4ViewParameters::hlhsr:
230                out <<  FR_HID       << G4endl; // SURFACE
231                break;
232          default:
233                out <<  FR_WIREFRAME << G4endl;
234                break;
235        }
236
237} // G4DAWNFILEViewer::SendDrawingStyle() 
238
239
240
241//-----
242void G4DAWNFILEViewer::SendViewParameters () 
243{
244  // Calculates view representation based on extent of object being
245  // viewed and (initial) direction of camera.  (Note: it can change
246  // later due to user interaction via visualization system's GUI.)
247
248#if defined DEBUG_FR_VIEW
249  if (G4VisManager::GetVerbosity() >= G4VisManager::errors) {
250    G4cout << "***** G4DAWNFILEViewer::SendViewParameters()  "; 
251    G4cout << "(GUI parameters)" << G4endl;
252  }
253#endif
254
255                //----- Magic number to decide camera distance automatically
256        const    G4double        HOW_FAR            = 1000.0       ; // to define "infinity"
257        const    G4double        MIN_HALF_ANGLE     = 0.01         ;
258        const    G4double        MAX_HALF_ANGLE     = 0.499 * pi ;
259
260                //----- CALC camera distance
261                //..... Note: Camera cannot enter inside object
262        G4double  camera_distance ;
263        G4double  radius = fSceneHandler.GetScene()->GetExtent().GetExtentRadius();
264
265        G4double half_view_angle  = std::fabs ( fVP.GetFieldHalfAngle () ) ;
266        if( half_view_angle > MAX_HALF_ANGLE ) { 
267          half_view_angle = MAX_HALF_ANGLE ; 
268        } 
269
270        if( half_view_angle < MIN_HALF_ANGLE ) {
271                        //----- infinity (or ortho projection)
272                camera_distance = radius * HOW_FAR ; 
273        } else {
274                        //----- Calc camera distance from half view angle
275                camera_distance = radius / std::sin ( half_view_angle );
276                camera_distance -= fVP.GetDolly();
277        }
278
279        if ( camera_distance < radius ) { 
280          if (G4VisManager::GetVerbosity() >= G4VisManager::errors) {
281                G4cout << "WARNING from DAWNFILE driver:" << G4endl;
282                G4cout << "  Camera cannot enter inside objects"      << G4endl;
283          }
284                camera_distance = radius ; 
285        }
286
287                //----- CALC camera direction
288        const G4Vector3D& camera_direction \
289          = fVP.GetViewpointDirection().unit();
290        const G4double v_angle =  (180.0 / pi) * camera_direction.theta() ;
291        const G4double h_angle =  (180.0 / pi) * camera_direction.phi  () ;
292
293
294        //########### Generation of the file .DAWN.history for DAWN GUI
295                //-----
296        std::ofstream gui_out (".DAWN_1.history") ; 
297
298        // ######### P1
299
300                //----- camera position
301        gui_out << camera_distance << G4endl;
302        gui_out << v_angle  << G4endl ;
303        gui_out << h_angle  << G4endl ;
304        gui_out << "0"  << G4endl     ; // auto target
305
306                //----- target point
307        const G4Point3D&  target_point
308          = fSceneHandler.GetScene()->GetStandardTargetPoint()
309          + fVP.GetCurrentTargetPoint();
310        gui_out << target_point.x()          << G4endl ;
311        gui_out << target_point.y()          << G4endl ;
312        gui_out << target_point.z()          << G4endl ;
313
314                //----- Magnification
315        const G4double   zoom_factor  = fVP.GetZoomFactor();
316        if( half_view_angle < MIN_HALF_ANGLE ) {
317
318                gui_out << zoom_factor << G4endl;
319
320        } else {
321                const G4double FR_HALF_SCREEN_SIZE = 0.5 ;
322                G4double  focal_distance \
323                  = FR_HALF_SCREEN_SIZE / std::tan( half_view_angle ); 
324                focal_distance *= zoom_factor ;
325
326                gui_out << "fd" << focal_distance << G4endl;
327
328        }
329        SendDrawingStyleToDAWNGUI( gui_out ) ; // gui_out, viewing mode
330        gui_out << "0.001" << G4endl           ; // 3D Tolerance
331        gui_out << "0"     << G4endl           ; // not display parameters
332
333
334        // ######### P2
335        gui_out << 1 << G4endl;   // Source light
336        gui_out << 1 << G4endl;   
337        gui_out << 1 << G4endl;   
338        gui_out << 0.5 << G4endl; // Ambient light
339        gui_out << 0.5 << G4endl;
340        gui_out << 0.5 << G4endl;
341        gui_out << 19.0 << G4endl; // Light direction (Polar)
342        gui_out << 71.0 << G4endl; // Light direction (Azimuthal)
343
344        // ######### P3
345        gui_out << 0.1 << G4endl;    // Real edge width
346        gui_out << 0.1 << G4endl;    // outline   width
347        gui_out << 0.1 << G4endl;    // aux edge  width
348        gui_out << 3   << G4endl;      // aux edge  style
349        gui_out << 70.0<< G4endl;   // aux-edge threshold angle
350        gui_out << 0.1 << G4endl;       // line width
351        gui_out << 0   << G4endl;        // haloing
352        gui_out << 1   << G4endl;        // Dashed edged for back faces
353
354        //######### P4
355               //----- drawing device
356  //    enum {PS=1, XWIN=2, PS2=3, XWIN2=4, OPEN_GL=5, DEVICE_END=6};
357        if( ( ( getenv( FR_ENV_MULTI_WINDOW ) != NULL        ) && \
358              ( strcmp( getenv( FR_ENV_MULTI_WINDOW ),"0"  ) )       ) || \
359            ( ( getenv( FR_ENV_MULTI_WINDOW2 ) != NULL        ) && \
360              ( strcmp( getenv( FR_ENV_MULTI_WINDOW2 ),"0"  ) )      )     )
361        {
362                gui_out << 2 << G4endl; // OpenWindow
363        } else {
364                gui_out << 1 << G4endl; // Invoke PS viewer
365        }
366
367        gui_out << GetPSViewer() << G4endl; // PS viewer
368        gui_out << 1 << G4endl            ; // Do not add showpage
369        gui_out << 0 << G4endl            ; // Non-append mode
370
371        gui_out.close();
372        //########### end of generating file .DAWN.history
373
374
375} 
Note: See TracBrowser for help on using the repository browser.