Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4FukuiRendererViewer.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// $Id$
28//
29//
30// Satoshi TANAKA, Fri Jun 28 12:09:11 JST 1996
31// FukuiRenderer view - opens window, hard copy, etc.
32
33
34//=================//
35#ifdef G4VIS_BUILD_DAWN_DRIVER
36//=================//
37
38#define __G_ANSI_C__
39#define G4FukuiRenderer_STRUCTURE_PRIORITY 1.
40
41// #define DEBUG_FR_VIEW
42
43#include "G4ios.hh"
44#include <stdio.h>
45#include <string.h>
46#include <assert.h>
47
48#include "G4VisManager.hh"
49#include "G4Scene.hh"
50#include "G4Vector3D.hh"
51#include "G4VisExtent.hh"
52#include "G4LogicalVolume.hh"
53#include "G4VSolid.hh"
55
56#include "G4FRConst.hh"
57#include "G4FukuiRenderer.hh"
60
61
62//----- Constructor
63G4FukuiRendererViewer::G4FukuiRendererViewer (G4FukuiRendererSceneHandler& sceneHandler,
64 const G4String& name):
65 G4VViewer (sceneHandler,
66 sceneHandler.IncrementViewCount (),
67 name),
68 fSceneHandler (sceneHandler)
69{}
70
71//----- Destructor
72G4FukuiRendererViewer::~G4FukuiRendererViewer ()
73{}
74
75//-----
76void G4FukuiRendererViewer::SetView ()
77{
78#if defined DEBUG_FR_VIEW
80 G4cout << "***** G4FukuiRendererViewer::SetView(): No effects" << G4endl;
81#endif
82// Do nothing, since DAWN is running as a different process.
83// SendViewParameters () will do this job instead.
84}
85
86//-----
87void
88G4FukuiRendererViewer::ClearView( void )
89{
90#if defined DEBUG_FR_VIEW
92 G4cout << "***** G4FukuiRendererViewer::ClearView (): No effects " << G4endl;
93#endif
94
95}
96
97
98//-----
99void G4FukuiRendererViewer::DrawView ()
100{
101#if defined DEBUG_FR_VIEW
103 G4cout << "***** G4FukuiRendererViewer::DrawView () " << G4endl;
104#endif
105
106 //----- Begin modeling 3D
107 fSceneHandler.FRBeginModeling();
108
109 //----- Always visit G4 kernel
110 NeedKernelVisit ();
111
112 //----- Draw
113 ProcessView () ;
114
115}
116
117
118//-----
119void G4FukuiRendererViewer::ShowView( void )
120{
121#if defined DEBUG_FR_VIEW
123 G4cout << "***** G4FukuiRendererViewer::ShowView () " << G4endl;
124#endif
125
126 if( fSceneHandler.FRIsInModeling() )
127 {
128 //----- End of modeling
129 // !EndModeling, !DrawAll, !CloseDevice,
130 // close g4.prim
131 fSceneHandler.FREndModeling();
132
133 //----- Wait user clicks drawing Area
134 this->Wait();
135 }
136
137}
138
139
140//-----
141void G4FukuiRendererViewer::Wait()
142{
143#if defined DEBUG_FR_VIEW
145 G4cout << "***** G4FukuiRendererViewer::Wait () : Begin" << G4endl;
146#endif
147 fSceneHandler.SendStr ( FR_WAIT );
148 fSceneHandler.GetPrimDest().WaitSendBack( FR_WAIT );
149#if defined DEBUG_FR_VIEW
151 G4cout << "***** G4FukuiRendererViewer::Wait () : end" << G4endl;
152#endif
153
154}
155
156
157//-----
158void
159G4FukuiRendererViewer::SendDevice( FRDEV dev )
160{
161#if defined DEBUG_FR_VIEW
163 G4cout << "***** G4FukuiRendererViewer::SendDevice() " << G4endl;
164#endif
165
166 // enum {PS=1, XWIN=2, PS2=3, XWIN2=4, OPEN_GL=5, DEVICE_END=6};
167
168 if( dev >= FRDEV_PS || dev < FRDEV_DEVICE_END ) {
169 fSceneHandler.SendStrInt ( FR_DEVICE, dev );
170 }
171}
172
173
174//-----
175void G4FukuiRendererViewer::SendDrawingStyle()
176{
177#if defined DEBUG_FR_VIEW
179 G4cout << "***** G4FukuiRendererViewer::SendDrawingStyle() " << G4endl;
180#endif
181
182 G4int style = fVP.GetDrawingStyle();
183
184 switch( style )
185 {
187 fSceneHandler.SendStr( FR_WIREFRAME );
188 break;
190 fSceneHandler.SendStr( FR_LINES );
191 break;
194 fSceneHandler.SendStr( FR_SURFACE );
195 break;
196 default:
197 fSceneHandler.SendStr( FR_WIREFRAME );
198 break;
199 }
200
201}
202
203
204//-----
205void G4FukuiRendererViewer::SendViewParameters ()
206{
207 // Calculates view representation based on extent of object being
208 // viewed and (initial) direction of camera. (Note: it can change
209 // later due to user interaction via visualization system's GUI.)
210
211#if defined DEBUG_FR_VIEW
213 G4cout << "***** G4FukuiRendererViewer::SendViewParameters()" << G4endl;
214#endif
215
216 //----- Magic number to decide camera distance automatically
217 const G4double HOW_FAR = 1000.0 ; // to define "infinity"
218 const G4double MIN_HALF_ANGLE = 0.01 ;
219 const G4double MAX_HALF_ANGLE = 0.499 * pi ;
220
221 //----- (2A) CALC camera distance
222 //..... Note: Camera cannot enter inside object
223 G4double camera_distance ;
224 G4double radius = fSceneHandler.GetScene()->GetExtent().GetExtentRadius();
225
226 G4double half_view_angle = std::fabs ( fVP.GetFieldHalfAngle () ) ;
227 if( half_view_angle > MAX_HALF_ANGLE ) {
228 half_view_angle = MAX_HALF_ANGLE ;
229 }
230
231 if( half_view_angle < MIN_HALF_ANGLE ) {
232 //----- infinity (or ortho projection)
233 camera_distance = radius * HOW_FAR ;
234 } else {
235 //----- Calc camera distance from half view angle
236 camera_distance = radius / std::sin ( half_view_angle );
237 camera_distance -= fVP.GetDolly();
238 }
239
240 if ( camera_distance < radius ) {
242 G4cout << "WARNING from FukuiRenderer (DAWN) driver:" << G4endl;
243 G4cout << " Camera cannot enter inside objects" << G4endl;
244 }
245 camera_distance = radius ;
246 }
247
248 //----- (3A) CALC camera direction
249 const G4Vector3D& camera_direction \
250 = fVP.GetViewpointDirection().unit();
251 const G4double v_angle = (180.0 / pi) * camera_direction.theta() ;
252 const G4double h_angle = (180.0 / pi) * camera_direction.phi () ;
253
254 //----- (2B), (3B) SEND camera position
255 fSceneHandler.SendStrDouble3( FR_CAMERA_POSITION,
256 camera_distance,
257 v_angle,
258 h_angle );
259
260 //----- (4A) CALC target point
261 const G4Point3D& target_point
262 = fSceneHandler.GetScene()->GetStandardTargetPoint()
263 + fVP.GetCurrentTargetPoint();
264
265 //----- (4B) SEND target point
266 fSceneHandler.SendStrDouble3( FR_TARGET_POINT,
267 target_point.x(),
268 target_point.y(),
269 target_point.z() );
270
271 //----- (5A) CALC zoom factor
272 const G4double zoom_factor = fVP.GetZoomFactor();
273
274 //----- (5B) SEND zoom factor or focal length
275 if( half_view_angle < MIN_HALF_ANGLE ) {
276
277 const G4Point3D& std_target_point \
278 = fSceneHandler.GetScene()->GetStandardTargetPoint();
279
280 fSceneHandler.SendStrDouble4( FR_ZOOM_FACTOR,
281 zoom_factor ,
282 std_target_point.x(),
283 std_target_point.y(),
284 std_target_point.z());
285 // Note that target point, camera position,
286 // and bounding box have already been sent above.
287 // The std_target_point is necessary to
288 // Calc focal distance from the zoom factor.
289 } else {
290 const G4double FR_HALF_SCREEN_SIZE = 0.5 ;
291 G4double focal_distance \
292 = FR_HALF_SCREEN_SIZE / std::tan( half_view_angle );
293 focal_distance *= zoom_factor ;
294 fSceneHandler.SendStrDouble ( FR_FOCAL_DISTANCE, focal_distance );
295 }
296
297 //----- INVOKE GUI: not executed in the default setting
298 if( fSceneHandler.GetSystem().IsGUIMode() ) {
299 //----- send GUI command
300 fSceneHandler.SendStr( FR_GUI );
301
302 //----- wait the same command is sent back:
303 //..... This avoids to send many data before
304 //..... GUI session is over.
305 fSceneHandler.GetPrimDest().WaitSendBack( FR_GUI );
306 }
307
308}
309
310#endif // G4VIS_BUILD_DAWN_DRIVER
311
312
const char FR_WIREFRAME[]
Definition: G4FRConst.hh:59
const char FR_TARGET_POINT[]
Definition: G4FRConst.hh:88
const char FR_GUI[]
Definition: G4FRConst.hh:43
const char FR_LINES[]
Definition: G4FRConst.hh:61
const char FR_SURFACE[]
Definition: G4FRConst.hh:60
const char FR_CAMERA_POSITION[]
Definition: G4FRConst.hh:85
const char FR_ZOOM_FACTOR[]
Definition: G4FRConst.hh:89
const char FR_DEVICE[]
Definition: G4FRConst.hh:44
const char FR_WAIT[]
Definition: G4FRConst.hh:55
const char FR_FOCAL_DISTANCE[]
Definition: G4FRConst.hh:91
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
static Verbosity GetVerbosity()
BasicVector3D< T > unit() const
const G4double pi