451 lines
16 KiB
C++
451 lines
16 KiB
C++
// This code implementation is the intellectual property of
|
|
// the 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 1.3.8.1 1999/12/07 20:54:02 gunter Exp $
|
|
// GEANT4 tag $Name: geant4-01-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 -> GetCurrentViewer () -> ClearView (); // Clears buffer only.
|
|
// fpVMan -> Draw ();
|
|
// fpVMan -> Show ();
|
|
G4VViewer* pView = fpVMan -> GetCurrentViewer ();
|
|
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 -> GetCurrentViewer () -> 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 -> GetCurrentViewer () -> ClearView (); // Clears buffer only.
|
|
// fpVMan -> Draw ();
|
|
// fpVMan -> Show ();
|
|
G4VViewer* pView = fpVMan -> GetCurrentViewer ();
|
|
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 -> GetCurrentViewer () -> ClearView ();
|
|
// fpVMan -> Draw ();
|
|
// fpVMan -> Show ();
|
|
// }
|
|
G4VViewer* pView = fpVMan -> GetCurrentViewer ();
|
|
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 -> GetCurrentViewer () -> 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 -> GetCurrentViewer () -> ClearView (); // Clears buffer only.
|
|
// fpVMan -> Draw ();
|
|
// fpVMan -> Show ();
|
|
// }
|
|
G4VViewer* pView = fpVMan -> GetCurrentViewer ();
|
|
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 -> GetCurrentViewer () -> ClearView (); // Clears buffer only.
|
|
// fpVMan -> Draw ();
|
|
// fpVMan -> Show ();
|
|
G4VViewer* pView = fpVMan -> GetCurrentViewer ();
|
|
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);
|
|
}
|