Import Geant4 0.0.0 source tree
This commit is contained in:
@@ -0,0 +1,450 @@
|
||||
// This code implementation is the intellectual property of
|
||||
// the RD44 GEANT4 collaboration.
|
||||
//
|
||||
// By copying, distributing or modifying the Program (or any work
|
||||
// based on the Program) you indicate your acceptance of this statement,
|
||||
// and all its terms.
|
||||
//
|
||||
// $Id: G4VisManMessCamera.cc,v 2.3 1998/07/13 17:12:30 urbi Exp $
|
||||
// GEANT4 tag $Name: geant4-00 $
|
||||
//
|
||||
//
|
||||
// GEANT4 Visualization Manager Messenger - John Allison 22nd July 1996.
|
||||
// Camera sub-menu.
|
||||
|
||||
#include "G4VisManMessenger.hh"
|
||||
|
||||
#include "G4VisManager.hh"
|
||||
#include "G4UImanager.hh"
|
||||
#include "G4UIcommand.hh"
|
||||
#include "G4UIparameter.hh"
|
||||
#include "G4ios.hh"
|
||||
|
||||
void G4VisManMessenger::AddCommandCamera () {
|
||||
|
||||
G4UIcommand* command;
|
||||
G4UIparameter* param;
|
||||
|
||||
/////////////////////////////////////// /vis~/camera/dolly ////
|
||||
//camera \hline
|
||||
//camera /vis~/camera/dolly & distance &
|
||||
//camera Moves the camera in by this distance.
|
||||
//camera Reset with {\tt /vis~/camera/reset}. \\%
|
||||
command = new G4UIcommand ("/vis~/camera/dolly", this);
|
||||
command -> SetGuidance
|
||||
(
|
||||
" Moves the camera in by this distance."
|
||||
" Reset with /vis~/camera/reset."
|
||||
);
|
||||
param = new G4UIparameter ("move in", 'd', true);
|
||||
param -> SetDefaultValue (0.);
|
||||
param -> SetGuidance ("world coordinates");
|
||||
command -> SetParameter (param);
|
||||
fCommandList.append (command);
|
||||
|
||||
//////////////////////////////////////// /vis~/camera/orbit ////
|
||||
//camera \hline
|
||||
//camera /vis~/camera/orbit & $N_\mathrm{frames}$, $\Delta\beta$ &
|
||||
//camera Orbits the scene about the up-vector, lights fixed to the scene.
|
||||
//camera Draws $N_\mathrm{frames}$ frames, the camera
|
||||
//camera rotated $\Delta\beta$ about the up-vector each frame. \\%
|
||||
command = new G4UIcommand ("/vis~/camera/orbit", this);
|
||||
command -> SetGuidance
|
||||
(
|
||||
"Orbits the scene about the up-vector, lights fixed to the scene."
|
||||
" Draws N frames, the camera "
|
||||
"rotated Delta-beta about the up-vector each frame."
|
||||
);
|
||||
param = new G4UIparameter ("No. of frames", 'i', true);
|
||||
param -> SetDefaultValue (1);
|
||||
command -> SetParameter (param);
|
||||
param = new G4UIparameter ("angle_increment", 'd', true);
|
||||
param -> SetGuidance ("degrees");
|
||||
param -> SetDefaultValue (1.);
|
||||
command -> SetParameter (param);
|
||||
fCommandList.append (command);
|
||||
|
||||
/////////////////////////////////////// /vis~/camera/pan ////
|
||||
//camera \hline
|
||||
//camera /vis~/camera/pan & right, up &
|
||||
//camera Moves the camera right and up by these amounts.
|
||||
//camera Reset with {\tt /vis~/camera/reset}. \\%
|
||||
command = new G4UIcommand ("/vis~/camera/pan", this);
|
||||
command -> SetGuidance
|
||||
(
|
||||
" Moves the camera by right and up by these amounts."
|
||||
" Reset with /vis~/camera/reset."
|
||||
);
|
||||
param = new G4UIparameter ("right shift", 'd', true);
|
||||
param -> SetDefaultValue (0.);
|
||||
param -> SetGuidance ("world coordinates");
|
||||
command -> SetParameter (param);
|
||||
param = new G4UIparameter ("up shift", 'd', true);
|
||||
param -> SetDefaultValue (0.);
|
||||
param -> SetGuidance ("world coordinates");
|
||||
command -> SetParameter (param);
|
||||
fCommandList.append (command);
|
||||
|
||||
///////////////////////////////////// /vis~/camera/projection_style ////
|
||||
//camera \hline
|
||||
//camera /vis~/camera/projection\_style & choice &
|
||||
//camera Projection style (orthogonal, perspective). \\%
|
||||
command = new G4UIcommand ("/vis~/camera/projection_style", this);
|
||||
command -> SetGuidance
|
||||
(
|
||||
"Projection style (orthogonal, perspective)."
|
||||
);
|
||||
param = new G4UIparameter ("Style selector", 'i', true);
|
||||
param -> SetDefaultValue (-1);
|
||||
command -> SetParameter (param);
|
||||
param = new G4UIparameter ("Perspective view half angle.", 'd', true);
|
||||
param -> SetDefaultValue (0.);
|
||||
command -> SetParameter (param);
|
||||
fCommandList.append (command);
|
||||
|
||||
//////////////////////////////////////// /vis~/camera/spin ////
|
||||
//camera \hline
|
||||
//camera /vis~/camera/spin & $N_\mathrm{frames}$, $\Delta\beta$ &
|
||||
//camera Spins the scene about the up-vector, lights fixed to the camera.
|
||||
//camera Draws $N_\mathrm{frames}$ frames, the scene
|
||||
//camera rotated $\Delta\beta$ about the up-vector each frame. \\%
|
||||
command = new G4UIcommand ("/vis~/camera/spin", this);
|
||||
command -> SetGuidance
|
||||
(
|
||||
"Spins the scene about the up-vector, lights fixed to the camera."
|
||||
" Draws N frames, the scene "
|
||||
"rotated Delta-beta about the up-vector each frame."
|
||||
);
|
||||
param = new G4UIparameter ("No. of frames", 'i', true);
|
||||
param -> SetDefaultValue (1);
|
||||
command -> SetParameter (param);
|
||||
param = new G4UIparameter ("angle_increment", 'd', true);
|
||||
param -> SetGuidance ("degrees");
|
||||
param -> SetDefaultValue (1.);
|
||||
command -> SetParameter (param);
|
||||
fCommandList.append (command);
|
||||
|
||||
//////////////////////////////////////// /vis~/camera/viewpoint ////
|
||||
//camera \hline
|
||||
//camera /vis~/camera/viewpoint & $\theta$ $\phi$ &
|
||||
//camera Set direction from target to camera as
|
||||
//camera $\theta$, $\phi$ (in degrees). Also changes lightpoint
|
||||
//camera direction if lights are set to move with camera.\\%
|
||||
command = new G4UIcommand ("/vis~/camera/viewpoint", this);
|
||||
command -> SetGuidance
|
||||
(
|
||||
"Set direction from target to camera as "
|
||||
"theta, phi (in degrees). Also changes lightpoint"
|
||||
"\n direction if lights are set to move with camera."
|
||||
);
|
||||
param = new G4UIparameter ("theta", 'd', true);
|
||||
param -> SetGuidance ("degrees");
|
||||
param -> SetDefaultValue (0.0);
|
||||
command -> SetParameter (param);
|
||||
param = new G4UIparameter ("phi", 'd', true);
|
||||
param -> SetGuidance ("degrees");
|
||||
param -> SetDefaultValue (0.0);
|
||||
command -> SetParameter (param);
|
||||
fCommandList.append (command);
|
||||
|
||||
/////////////////////////////////////// /vis~/camera/window_size_hint ////
|
||||
//camera \hline
|
||||
//camera /vis~/camera/window\_size\_hint & size&
|
||||
//camera Size in pixels (Square window `size $\Times$ size'). Affects
|
||||
//camera future create\_view commands (hint only). \\%
|
||||
command = new G4UIcommand ("/vis~/camera/window_size_hint", this);
|
||||
command -> SetGuidance
|
||||
(
|
||||
"Size in pixels (Square window `size x size'). Affects "
|
||||
"future create_view commands (hint only)."
|
||||
);
|
||||
param = new G4UIparameter ("Window size hint in pixels", 'i', true);
|
||||
param -> SetDefaultValue (600);
|
||||
command -> SetParameter (param);
|
||||
fCommandList.append (command);
|
||||
|
||||
/////////////////////////////////////// /vis~/camera/zoom ////
|
||||
//camera \hline
|
||||
//camera /vis~/camera/zoom & factor &
|
||||
//camera Magnifies by this factor.
|
||||
//camera Reset with {\tt /vis~/camera/reset}. \\%
|
||||
command = new G4UIcommand ("/vis~/camera/zoom", this);
|
||||
command -> SetGuidance
|
||||
(
|
||||
"Magnifies by this factor."
|
||||
" Reset with /vis~/camera/reset."
|
||||
);
|
||||
param = new G4UIparameter ("zoom factor", 'd', true);
|
||||
param -> SetDefaultValue (1.);
|
||||
param -> SetGuidance ("magnifies by this");
|
||||
command -> SetParameter (param);
|
||||
fCommandList.append (command);
|
||||
|
||||
}
|
||||
|
||||
void G4VisManMessenger::DoCommandCamera (const G4String& commandPath,
|
||||
G4String& newValues) {
|
||||
|
||||
/////////////////////////////// /vis~/camera/dolly ////
|
||||
if (commandPath == "/vis~/camera/dolly") {
|
||||
if (ViewValid ()) {
|
||||
G4double in;
|
||||
const char* aString = newValues;
|
||||
istrstream is((char*) aString) ; is >> in;
|
||||
G4cout << "Dolly " << in << " in." << endl;
|
||||
fpVMan -> SetCurrentViewParameters ().IncrementDolly (in);
|
||||
if (fpVMan -> GetVerboseLevel () > 0) {
|
||||
G4cout << "Dolly distance changed to "
|
||||
<< fpVMan -> GetCurrentViewParameters ().GetDolly () << endl;
|
||||
if (fpVMan -> GetVerboseLevel () > 1) {
|
||||
fpVMan -> PrintCurrentView ();
|
||||
}
|
||||
}
|
||||
// fpVMan -> GetCurrentView () -> ClearView (); // Clears buffer only.
|
||||
// fpVMan -> Draw ();
|
||||
// fpVMan -> Show ();
|
||||
G4VView* pView = fpVMan -> GetCurrentView ();
|
||||
if (pView) {
|
||||
// Copy current view parameters into current view.
|
||||
pView -> SetViewParameters (fpVMan -> GetCurrentViewParameters ());
|
||||
// Recalculate projection matrices, etc.
|
||||
pView -> SetView ();
|
||||
}
|
||||
G4cout << "Issue Draw or refresh to see effect." << endl;
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////// /vis~/camera/orbit ////
|
||||
if (commandPath == "/vis~/camera/orbit") {
|
||||
if (ViewValid ()) {
|
||||
G4int nFrames;
|
||||
G4double dbeta;
|
||||
const char* aString = newValues;
|
||||
istrstream is((char*) aString) ; is >> nFrames >> dbeta;
|
||||
dbeta = dbeta * deg;
|
||||
fpVMan -> SetCurrentViewParameters ().SetLightsMoveWithCamera (false);
|
||||
for (int i = 0; i < nFrames; i++) {
|
||||
RotateViewpointAboutUpVectorBy (dbeta);
|
||||
fpVMan -> GetCurrentView () -> ClearView (); // Clears buffer only.
|
||||
fpVMan -> Draw ();
|
||||
fpVMan -> Show ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/////////////////////////////// /vis~/camera/pan ////
|
||||
if (commandPath == "/vis~/camera/pan") {
|
||||
if (ViewValid ()) {
|
||||
G4double right, up;
|
||||
const char* aString = newValues;
|
||||
istrstream is((char*) aString);is >> right >> up;
|
||||
G4cout << "Pan " << right << " right, " << up << " up." << endl;
|
||||
fpVMan -> SetCurrentViewParameters ().Pan (right, up);
|
||||
if (fpVMan -> GetVerboseLevel () > 0) {
|
||||
G4cout << "Current target point changed to "
|
||||
<< fpVMan -> GetCurrentViewParameters ().GetCurrentTargetPoint ()
|
||||
<< endl;
|
||||
if (fpVMan -> GetVerboseLevel () > 1) {
|
||||
fpVMan -> PrintCurrentView ();
|
||||
}
|
||||
}
|
||||
// fpVMan -> GetCurrentView () -> ClearView (); // Clears buffer only.
|
||||
// fpVMan -> Draw ();
|
||||
// fpVMan -> Show ();
|
||||
G4VView* pView = fpVMan -> GetCurrentView ();
|
||||
if (pView) {
|
||||
// Copy current view parameters into current view.
|
||||
pView -> SetViewParameters (fpVMan -> GetCurrentViewParameters ());
|
||||
// Recalculate projection matrices, etc.
|
||||
pView -> SetView ();
|
||||
}
|
||||
G4cout << "Issue Draw or refresh to see effect." << endl;
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////// /vis~/camera/projection_style ////
|
||||
if (commandPath == "/vis~/camera/projection_style") {
|
||||
G4int iStyle;
|
||||
G4double fieldHalfAngleDegrees;
|
||||
const char* aString = newValues;
|
||||
istrstream is((char*) aString) ; is >> iStyle >> fieldHalfAngleDegrees;
|
||||
if (iStyle < 0 || iStyle > 1) {
|
||||
G4cout << "Available representation styles:";
|
||||
G4cout << "\n 0) orthogonal";
|
||||
G4cout << "\n 1) perspective (also specify field half angle in degrees)";
|
||||
G4cout << "\nChoose by specifying integer parameter and field half angle"
|
||||
" (if relevant).";
|
||||
G4cout << endl;
|
||||
}
|
||||
else {
|
||||
switch (iStyle) {
|
||||
default:
|
||||
case 0:
|
||||
fpVMan -> SetCurrentViewParameters ().SetFieldHalfAngle (0.);
|
||||
if (fpVMan -> GetVerboseLevel () > 0) {
|
||||
G4cout << "\nOrthogonal projection set." << endl;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (fieldHalfAngleDegrees == 0.0) {
|
||||
fieldHalfAngleDegrees = 30.;
|
||||
G4cout << "Field half angle defaulted to "
|
||||
<< fieldHalfAngleDegrees << " degrees." << endl;
|
||||
}
|
||||
if (fieldHalfAngleDegrees > 89.5 || fieldHalfAngleDegrees <= 0.0) {
|
||||
G4cout << "Field half angle should be 0 < angle <= 89.5 degrees.";
|
||||
G4cout << endl;
|
||||
}
|
||||
else {
|
||||
fpVMan -> SetCurrentViewParameters ().
|
||||
SetFieldHalfAngle (fieldHalfAngleDegrees * deg);
|
||||
if (fpVMan -> GetVerboseLevel () > 0) {
|
||||
G4cout << "\nPerspective projection set.";
|
||||
G4cout << "\nField half angle set to " << fieldHalfAngleDegrees
|
||||
<< " degrees" << " ("
|
||||
<< fpVMan -> GetCurrentViewParameters ().GetFieldHalfAngle ()
|
||||
<< " radians)." << endl;
|
||||
if (fpVMan -> GetVerboseLevel () > 1) {
|
||||
fpVMan -> PrintCurrentView ();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
// if (ViewValid ()) {
|
||||
// fpVMan -> GetCurrentView () -> ClearView ();
|
||||
// fpVMan -> Draw ();
|
||||
// fpVMan -> Show ();
|
||||
// }
|
||||
G4VView* pView = fpVMan -> GetCurrentView ();
|
||||
if (pView) {
|
||||
// Copy current view parameters into current view.
|
||||
pView -> SetViewParameters (fpVMan -> GetCurrentViewParameters ());
|
||||
// Recalculate projection matrices, etc.
|
||||
pView -> SetView ();
|
||||
}
|
||||
G4cout << "Issue Draw or refresh to see effect." << endl;
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////// /vis~/camera/spin ////
|
||||
if (commandPath == "/vis~/camera/spin") {
|
||||
if (ViewValid ()) {
|
||||
G4int nFrames;
|
||||
G4double dbeta;
|
||||
const char* aString = newValues;
|
||||
istrstream is((char*) aString) ; is >> nFrames >> dbeta;
|
||||
dbeta = dbeta * deg;
|
||||
fpVMan -> SetCurrentViewParameters ().SetLightsMoveWithCamera (true);
|
||||
for (int i = 0; i < nFrames; i++) {
|
||||
RotateViewpointAboutUpVectorBy (dbeta);
|
||||
fpVMan -> GetCurrentView () -> ClearView (); // Clears buffer only.
|
||||
fpVMan -> Draw ();
|
||||
fpVMan -> Show ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////// /vis~/camera/viewpoint ////
|
||||
if (commandPath == "/vis~/camera/viewpoint") {
|
||||
G4double theta, phi ;
|
||||
const char* aString = newValues;
|
||||
istrstream is((char*) aString) ; is >> theta >> phi;
|
||||
theta = theta * deg;
|
||||
phi = phi * deg;
|
||||
G4double x = sin (theta) * cos (phi);
|
||||
G4double y = sin (theta) * sin (phi);
|
||||
G4double z = cos (theta);
|
||||
G4Vector3D vp (x, y, z);
|
||||
fpVMan -> SetCurrentViewParameters().SetViewAndLights (vp);
|
||||
const G4ViewParameters& viewParams = fpVMan -> GetCurrentViewParameters ();
|
||||
if (fpVMan -> GetVerboseLevel () > 0) {
|
||||
G4cout << "Viewpoint direction set to " << vp << endl;
|
||||
if (viewParams.GetLightsMoveWithCamera ()) {
|
||||
G4cout << "Lightpoint direction set to "
|
||||
<< viewParams.GetLightpointDirection () << endl;
|
||||
}
|
||||
if (fpVMan -> GetVerboseLevel () > 1) {
|
||||
fpVMan -> PrintCurrentView ();
|
||||
}
|
||||
}
|
||||
// if (ViewValid ()) {
|
||||
// fpVMan -> GetCurrentView () -> ClearView (); // Clears buffer only.
|
||||
// fpVMan -> Draw ();
|
||||
// fpVMan -> Show ();
|
||||
// }
|
||||
G4VView* pView = fpVMan -> GetCurrentView ();
|
||||
if (pView) {
|
||||
// Copy current view parameters into current view.
|
||||
pView -> SetViewParameters (fpVMan -> GetCurrentViewParameters ());
|
||||
// Recalculate projection matrices, etc.
|
||||
pView -> SetView ();
|
||||
}
|
||||
G4cout << "Issue Draw or refresh to see effect." << endl;
|
||||
}
|
||||
|
||||
/////////////////////////////////////// /vis~/camera/window_size_hint ////
|
||||
if (commandPath == "/vis~/camera/window_size_hint") {
|
||||
G4int size;
|
||||
const char* aString = newValues;
|
||||
istrstream is((char*) aString) ; is >> size;
|
||||
fpVMan -> SetCurrentViewParameters ().SetWindowSizeHint (size, size);
|
||||
if (fpVMan -> GetVerboseLevel () > 0) {
|
||||
G4cout << "Window size hint set to " << size << " x " << size << endl;
|
||||
if (fpVMan -> GetVerboseLevel () > 1) {
|
||||
fpVMan -> PrintCurrentView ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////// /vis~/camera/zoom ////
|
||||
if (commandPath == "/vis~/camera/zoom") {
|
||||
if (ViewValid ()) {
|
||||
G4double zoomBy;
|
||||
const char* aString = newValues;
|
||||
istrstream is((char*) aString) ; is >> zoomBy;
|
||||
fpVMan -> SetCurrentViewParameters ().MultiplyZoomFactor (zoomBy);
|
||||
if (fpVMan -> GetVerboseLevel () > 0) {
|
||||
G4cout << "Zoom factor changed to "
|
||||
<< fpVMan -> GetCurrentViewParameters ().GetZoomFactor () << endl;
|
||||
if (fpVMan -> GetVerboseLevel () > 1) {
|
||||
fpVMan -> PrintCurrentView ();
|
||||
}
|
||||
}
|
||||
// fpVMan -> GetCurrentView () -> ClearView (); // Clears buffer only.
|
||||
// fpVMan -> Draw ();
|
||||
// fpVMan -> Show ();
|
||||
G4VView* pView = fpVMan -> GetCurrentView ();
|
||||
if (pView) {
|
||||
// Copy current view parameters into current view.
|
||||
pView -> SetViewParameters (fpVMan -> GetCurrentViewParameters ());
|
||||
// Recalculate projection matrices, etc.
|
||||
pView -> SetView ();
|
||||
}
|
||||
G4cout << "Issue Draw or refresh to see effect." << endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void G4VisManMessenger::RotateViewpointAboutUpVectorBy (G4double dbeta) {
|
||||
// Rotates by fixed azimuthal angle dbeta.
|
||||
const G4ViewParameters& viewParams = fpVMan -> GetCurrentViewParameters ();
|
||||
G4Vector3D vp = viewParams.GetViewpointDirection ().unit ();
|
||||
G4Vector3D up = viewParams.GetUpVector ().unit ();
|
||||
G4Vector3D& zprime = up;
|
||||
G4double cosalpha = up.dot (vp);
|
||||
G4double sinalpha = sqrt (1. - pow (cosalpha, 2));
|
||||
G4Vector3D viewPoint = viewParams.GetViewpointDirection ().unit ();
|
||||
G4Vector3D yprime = (zprime.cross (viewPoint)).unit ();
|
||||
G4Vector3D xprime = yprime.cross (zprime);
|
||||
// Projection of vp on plane perpendicular to up...
|
||||
G4Vector3D a1 = sinalpha * xprime;
|
||||
// Required new projection...
|
||||
G4Vector3D a2 =
|
||||
sinalpha * (cos (dbeta) * xprime + sin (dbeta) * yprime);
|
||||
// Required Increment vector...
|
||||
G4Vector3D delta = a2 - a1;
|
||||
// So new viewpoint is...
|
||||
viewPoint += delta;
|
||||
fpVMan -> SetCurrentViewParameters ().SetViewAndLights (viewPoint);
|
||||
}
|
||||
Reference in New Issue
Block a user