Import Geant4 8.2.0 source tree
This commit is contained in:
@@ -24,8 +24,8 @@
|
||||
// ********************************************************************
|
||||
//
|
||||
//
|
||||
// $Id: G4VSceneHandler.cc,v 1.66 2006/06/29 21:29:24 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-08-01 $
|
||||
// $Id: G4VSceneHandler.cc,v 1.77 2006/11/21 14:23:53 allison Exp $
|
||||
// GEANT4 tag $Name: geant4-08-02 $
|
||||
//
|
||||
//
|
||||
// John Allison 19th July 1996
|
||||
@@ -74,6 +74,8 @@
|
||||
#include "Randomize.hh"
|
||||
#include "G4StateManager.hh"
|
||||
#include "G4RunManager.hh"
|
||||
#include "G4Run.hh"
|
||||
#include "G4Transform3D.hh"
|
||||
|
||||
G4VSceneHandler::G4VSceneHandler (G4VGraphicsSystem& system, G4int id, const G4String& name):
|
||||
fSystem (system),
|
||||
@@ -93,9 +95,7 @@ G4VSceneHandler::G4VSceneHandler (G4VGraphicsSystem& system, G4int id, const G4S
|
||||
fpObjectTransformation (0),
|
||||
fNestingDepth (0),
|
||||
fpVisAttribs (0),
|
||||
fCurrentDepth (0),
|
||||
fpCurrentPV (0),
|
||||
fpCurrentLV (0)
|
||||
fRequestedEvent (0)
|
||||
{
|
||||
G4VisManager* pVMan = G4VisManager::GetInstance ();
|
||||
fpScene = pVMan -> GetCurrentScene ();
|
||||
@@ -266,13 +266,6 @@ void G4VSceneHandler::AddViewerToList (G4VViewer* pViewer) {
|
||||
fViewerList.push_back (pViewer);
|
||||
}
|
||||
|
||||
void G4VSceneHandler::EstablishSpecials (G4PhysicalVolumeModel& pvModel) {
|
||||
pvModel.DefinePointersToWorkingSpace (&fCurrentDepth,
|
||||
&fpCurrentPV,
|
||||
&fpCurrentLV,
|
||||
&fpCurrentMaterial);
|
||||
}
|
||||
|
||||
void G4VSceneHandler::AddPrimitive (const G4Scale& scale) {
|
||||
|
||||
const G4double margin(0.01);
|
||||
@@ -401,9 +394,9 @@ void G4VSceneHandler::AddPrimitive (const G4Polymarker& polymarker) {
|
||||
case G4Polymarker::squares:
|
||||
{
|
||||
for (size_t iPoint = 0; iPoint < polymarker.size (); iPoint++) {
|
||||
G4Square Square (polymarker);
|
||||
Square.SetPosition (polymarker[iPoint]);
|
||||
AddPrimitive (Square);
|
||||
G4Square square (polymarker);
|
||||
square.SetPosition (polymarker[iPoint]);
|
||||
AddPrimitive (square);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -427,12 +420,14 @@ void G4VSceneHandler::RequestPrimitives (const G4VSolid& solid) {
|
||||
BeginPrimitives (*fpObjectTransformation);
|
||||
G4NURBS* pNURBS = 0;
|
||||
G4Polyhedron* pPolyhedron = 0;
|
||||
const G4VisAttributes* pVisAttribs =
|
||||
fpViewer -> GetApplicableVisAttributes (fpVisAttribs);
|
||||
switch (fpViewer -> GetViewParameters () . GetRepStyle ()) {
|
||||
case G4ViewParameters::nurbs:
|
||||
pNURBS = solid.CreateNURBS ();
|
||||
if (pNURBS) {
|
||||
pNURBS -> SetVisAttributes
|
||||
(fpViewer -> GetApplicableVisAttributes (fpVisAttribs));
|
||||
(fpViewer -> GetApplicableVisAttributes (pVisAttribs));
|
||||
AddPrimitive (*pNURBS);
|
||||
delete pNURBS;
|
||||
break;
|
||||
@@ -451,13 +446,11 @@ void G4VSceneHandler::RequestPrimitives (const G4VSolid& solid) {
|
||||
// Dropping through to polyhedron...
|
||||
case G4ViewParameters::polyhedron:
|
||||
default:
|
||||
G4Polyhedron::SetNumberOfRotationSteps
|
||||
(fpViewer -> GetViewParameters () . GetNoOfSides ());
|
||||
G4Polyhedron::SetNumberOfRotationSteps (GetNoOfSides (pVisAttribs));
|
||||
pPolyhedron = solid.GetPolyhedron ();
|
||||
G4Polyhedron::ResetNumberOfRotationSteps ();
|
||||
if (pPolyhedron) {
|
||||
pPolyhedron -> SetVisAttributes
|
||||
(fpViewer -> GetApplicableVisAttributes (fpVisAttribs));
|
||||
pPolyhedron -> SetVisAttributes (pVisAttribs);
|
||||
AddPrimitive (*pPolyhedron);
|
||||
}
|
||||
else {
|
||||
@@ -480,6 +473,12 @@ void G4VSceneHandler::ProcessScene (G4VViewer&) {
|
||||
|
||||
if (!fpScene) return;
|
||||
|
||||
G4VisManager* visManager = G4VisManager::GetInstance();
|
||||
|
||||
if (!visManager->GetConcreteInstance()) return;
|
||||
|
||||
G4VisManager::Verbosity verbosity = visManager->GetVerbosity();
|
||||
|
||||
fReadyForTransients = false;
|
||||
|
||||
// Clear stored scene, if any, i.e., display lists, scene graphs.
|
||||
@@ -492,9 +491,6 @@ void G4VSceneHandler::ProcessScene (G4VViewer&) {
|
||||
G4bool tmpMarkForClearingTransientStore = fMarkForClearingTransientStore;
|
||||
fMarkForClearingTransientStore = false;
|
||||
|
||||
G4VisManager* visManager = G4VisManager::GetInstance();
|
||||
G4VisManager::Verbosity verbosity = visManager->GetVerbosity();
|
||||
|
||||
// Traverse geometry tree and send drawing primitives to window(s).
|
||||
|
||||
const std::vector<G4VModel*>& runDurationModelList =
|
||||
@@ -539,102 +535,89 @@ void G4VSceneHandler::ProcessScene (G4VViewer&) {
|
||||
delete pMP;
|
||||
EndModeling ();
|
||||
|
||||
} else {
|
||||
G4VisManager::Verbosity verbosity =
|
||||
G4VisManager::GetInstance()->GetVerbosity();
|
||||
if (verbosity >= G4VisManager::warnings) {
|
||||
G4cout <<
|
||||
"WARNING: G4VSceneHandler::ProcessScene: No run-duration models in"
|
||||
"\n scene. \"World\" will be added if you attempt to draw a view"
|
||||
<< G4endl;
|
||||
}
|
||||
}
|
||||
|
||||
fpViewer->FinishView(); // Flush streams and/or swap buffers.
|
||||
|
||||
fReadyForTransients = true;
|
||||
|
||||
// Now (re-)do transients (trajectories, hits, user drawing, etc.)...
|
||||
if (fpScene->GetRecomputeTransients()) { // ...if requested...
|
||||
// Refresh event from end-of-event model list. Allow only in Idle state...
|
||||
G4StateManager* stateManager = G4StateManager::GetStateManager();
|
||||
G4ApplicationState state = stateManager->GetCurrentState();
|
||||
if (state == G4State_Idle) {
|
||||
|
||||
visManager->SetEventRefreshing(true);
|
||||
|
||||
if (fRequestedEvent) {
|
||||
DrawEvent(fRequestedEvent);
|
||||
|
||||
// Allowed only in idle state...
|
||||
G4StateManager* stateManager = G4StateManager::GetStateManager();
|
||||
G4ApplicationState currentState = stateManager->GetCurrentState();
|
||||
if(currentState != G4State_Idle) {
|
||||
if (verbosity >= G4VisManager::warnings) {
|
||||
G4cout <<
|
||||
"Cannot re-compute transients during existing run."
|
||||
"\n Trajectories, etc., will be lost."
|
||||
<< G4endl;
|
||||
}
|
||||
} else {
|
||||
|
||||
// Uses run manager via UImanager->ApplyCommand("/run/beamOn") so
|
||||
// only makes sense if a run manager exists. More than that - the
|
||||
// random number status strings are created by G4RunManager, so they
|
||||
// are null if a G4RunManager does not exist...
|
||||
G4RunManager* runManager = G4RunManager::GetRunManager();
|
||||
if (runManager) {
|
||||
if (visManager->GetEventCount()) { // Must have had some prior event(s)...
|
||||
if (fpScene->GetRefreshAtEndOfEvent()) {
|
||||
// Check if transients have been drawn. Note: Use the flag in
|
||||
// the vis manager, which is set *after* a pass triggered by
|
||||
// ClearTransientStoreIfMarked. Avoids early processing.
|
||||
if (visManager->GetTransientsDrawnThisEvent()) {
|
||||
// Change "warnings" to "confirmations" if this settles!!!!!!!!!!
|
||||
if (verbosity >= G4VisManager::warnings) {
|
||||
G4cout <<
|
||||
"Recomputing transients generated by previous event..."
|
||||
"\n \"/vis/scene/transientsAction none\" to suppress."
|
||||
<< G4endl;
|
||||
G4RunManager* runManager = G4RunManager::GetRunManager();
|
||||
const G4Run* run = runManager->GetCurrentRun();
|
||||
const std::vector<const G4Event*>* events =
|
||||
run? run->GetEventVector(): 0;
|
||||
size_t nKeptEvents = 0;
|
||||
if (events) nKeptEvents = events->size();
|
||||
if (runManager) {
|
||||
if (fpScene->GetRefreshAtEndOfEvent()) {
|
||||
|
||||
if (verbosity >= G4VisManager::confirmations) {
|
||||
G4cout << "Refreshing event..." << G4endl;
|
||||
}
|
||||
std::istringstream
|
||||
iss(visManager->GetBeginOfLastEventRandomStatus());
|
||||
CLHEP::HepRandom::restoreFullState(iss);
|
||||
visManager->SetReprocessing(true);
|
||||
visManager->SetReprocessingLastEvent(true);
|
||||
G4int runID = visManager->GetLastRunID();
|
||||
runManager->SetRunIDCounter(runID);
|
||||
runManager->BeamOn(1);
|
||||
}
|
||||
} else {
|
||||
if (!fpScene->GetRefreshAtEndOfRun()) {
|
||||
if (verbosity >= G4VisManager::warnings) {
|
||||
G4cout <<
|
||||
"WARNING: Cannot refresh trajectories, etc., accumulated over more"
|
||||
"\n than one runs. Refreshing just the last run..."
|
||||
<< G4endl;
|
||||
const G4Event* event = 0;
|
||||
if (events && events->size()) event = events->back();
|
||||
if (event) DrawEvent(event);
|
||||
|
||||
} else { // Accumulating events.
|
||||
|
||||
if (verbosity >= G4VisManager::confirmations) {
|
||||
G4cout << "Refreshing events in run..." << G4endl;
|
||||
}
|
||||
}
|
||||
// Check if transients have been drawn. Note: Use the flag in
|
||||
// the vis manager, which is set *after* a pass triggered by
|
||||
// ClearTransientStoreIfMarked. Avoids early processing.
|
||||
if (visManager->GetTransientsDrawnThisRun()) {
|
||||
// Change "warnings" to "confirmations" if this settles!!!!!!!!!!
|
||||
if (verbosity >= G4VisManager::warnings) {
|
||||
G4cout <<
|
||||
"Recomputing transients generated by previous run..."
|
||||
"\n \"/vis/scene/transientsAction none\" to suppress."
|
||||
<< G4endl;
|
||||
for (size_t i = 0; i < nKeptEvents; ++i) {
|
||||
const G4Event* event = (*events)[i];
|
||||
if (event) DrawEvent(event);
|
||||
}
|
||||
|
||||
if (!fpScene->GetRefreshAtEndOfRun()) {
|
||||
if (verbosity >= G4VisManager::warnings) {
|
||||
G4cout <<
|
||||
"WARNING: Cannot refresh events accumulated over more"
|
||||
"\n than one runs. Refreshed just the last run..."
|
||||
<< G4endl;
|
||||
}
|
||||
}
|
||||
std::istringstream iss(visManager->GetBeginOfLastRunRandomStatus());
|
||||
CLHEP::HepRandom::restoreFullState(iss);
|
||||
G4int nEvents = visManager->GetEventCount();
|
||||
visManager->SetReprocessing(true);
|
||||
G4int runID = visManager->GetLastRunID();
|
||||
runManager->SetRunIDCounter(runID);
|
||||
runManager->BeamOn(nEvents);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
visManager->SetEventRefreshing(false);
|
||||
}
|
||||
|
||||
fMarkForClearingTransientStore = tmpMarkForClearingTransientStore;
|
||||
}
|
||||
|
||||
G4ModelingParameters* G4VSceneHandler::CreateModelingParameters () {
|
||||
void G4VSceneHandler::DrawEvent(const G4Event* event)
|
||||
{
|
||||
const std::vector<G4VModel*>& EOEModelList =
|
||||
fpScene -> GetEndOfEventModelList ();
|
||||
size_t nModels = EOEModelList.size();
|
||||
if (nModels) {
|
||||
G4ModelingParameters* pMP = CreateModelingParameters();
|
||||
pMP->SetEvent(event);
|
||||
for (size_t i = 0; i < nModels; i++) {
|
||||
G4VModel* pModel = EOEModelList [i];
|
||||
pModel -> SetModelingParameters(pMP);
|
||||
SetModel (pModel);
|
||||
pModel -> DescribeYourselfTo (*this);
|
||||
pModel -> SetModelingParameters(0);
|
||||
}
|
||||
delete pMP;
|
||||
SetModel (0);
|
||||
}
|
||||
}
|
||||
|
||||
G4ModelingParameters* G4VSceneHandler::CreateModelingParameters ()
|
||||
{
|
||||
// Create modeling parameters from View Parameters...
|
||||
const G4ViewParameters& vp = fpViewer -> GetViewParameters ();
|
||||
|
||||
@@ -657,21 +640,6 @@ G4ModelingParameters* G4VSceneHandler::CreateModelingParameters () {
|
||||
break;
|
||||
}
|
||||
|
||||
// Convert rep styles...
|
||||
G4ModelingParameters::RepStyle modelRepStyle =
|
||||
G4ModelingParameters::wireframe;
|
||||
if (vp.GetDrawingStyle () != G4ViewParameters::wireframe) {
|
||||
switch (vp.GetRepStyle ()) {
|
||||
default:
|
||||
case G4ViewParameters::polyhedron:
|
||||
modelRepStyle = G4ModelingParameters::polyhedron;
|
||||
break;
|
||||
case G4ViewParameters::nurbs:
|
||||
modelRepStyle = G4ModelingParameters::nurbs;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Decide if covered daughters are really to be culled...
|
||||
G4bool reallyCullCovered =
|
||||
vp.IsCullingCovered() // Culling daughters depends also on...
|
||||
@@ -682,25 +650,67 @@ G4ModelingParameters* G4VSceneHandler::CreateModelingParameters () {
|
||||
G4ModelingParameters* pModelingParams = new G4ModelingParameters
|
||||
(vp.GetDefaultVisAttributes (),
|
||||
modelDrawingStyle,
|
||||
modelRepStyle,
|
||||
vp.IsCulling (),
|
||||
vp.IsCullingInvisible (),
|
||||
vp.IsDensityCulling (),
|
||||
vp.GetVisibleDensity (),
|
||||
reallyCullCovered,
|
||||
vp.GetNoOfSides (),
|
||||
vp.IsViewGeom (),
|
||||
vp.IsViewHits (),
|
||||
vp.IsViewDigis ()
|
||||
vp.GetNoOfSides ()
|
||||
);
|
||||
|
||||
pModelingParams->SetWarning
|
||||
(G4VisManager::GetInstance()->GetVerbosity() >= G4VisManager::warnings);
|
||||
|
||||
pModelingParams->SetExplodeFactor(vp.GetExplodeFactor());
|
||||
pModelingParams->SetExplodeCentre(vp.GetExplodeCentre());
|
||||
|
||||
pModelingParams->SetSectionPolyhedron(CreateSectionPolyhedron());
|
||||
pModelingParams->SetCutawayPolyhedron(CreateCutawayPolyhedron());
|
||||
// The polyhedron objects are deleted in the modeling parameters destructor.
|
||||
|
||||
return pModelingParams;
|
||||
}
|
||||
|
||||
const G4Polyhedron* G4VSceneHandler::CreateSectionPolyhedron()
|
||||
{
|
||||
/* Disable for now. Boolean processor not up to it.
|
||||
const G4ViewParameters& vp = fpViewer->GetViewParameters();
|
||||
if (vp.IsSection () ) {
|
||||
G4double radius = fpScene->GetExtent().GetExtentRadius();
|
||||
G4double safe = radius + fpScene->GetExtent().GetExtentCentre().mag();
|
||||
G4Box sectionBox("clipper",
|
||||
safe, safe, 1.e-5 * radius); // Thin in z-plane.
|
||||
G4Polyhedron* sectioner = sectionBox.CreatePolyhedron();
|
||||
const G4Plane3D& s = vp.GetSectionPlane ();
|
||||
G4double a = s.a();
|
||||
G4double b = s.b();
|
||||
G4double c = s.c();
|
||||
G4double d = s.d();
|
||||
G4Transform3D transform = G4TranslateZ3D(-d);
|
||||
const G4Normal3D normal(a,b,c);
|
||||
if (normal != G4Normal3D(0,0,1)) {
|
||||
const G4double angle = std::acos(normal.dot(G4Normal3D(0,0,1)));
|
||||
const G4Vector3D axis = G4Normal3D(0,0,1).cross(normal);
|
||||
transform = G4Rotate3D(angle, axis) * transform;
|
||||
}
|
||||
sectioner->Transform(transform);
|
||||
return sectioner;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
const G4Polyhedron* G4VSceneHandler::CreateCutawayPolyhedron()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
const G4Colour& G4VSceneHandler::GetColour (const G4Visible& visible) {
|
||||
// Colour is determined by the applicable vis attributes.
|
||||
const G4Colour& colour = fpViewer ->
|
||||
GetApplicableVisAttributes (visible.GetVisAttributes ()) -> GetColour ();
|
||||
GetApplicableVisAttributes (visible.GetVisAttributes ()) -> GetColour ();
|
||||
return colour;
|
||||
}
|
||||
|
||||
@@ -713,6 +723,16 @@ const G4Colour& G4VSceneHandler::GetTextColour (const G4Text& text) {
|
||||
return colour;
|
||||
}
|
||||
|
||||
G4double G4VSceneHandler::GetLineWidth(const G4Visible& visible)
|
||||
{
|
||||
G4double lineWidth = fpViewer->
|
||||
GetApplicableVisAttributes(visible.GetVisAttributes())->GetLineWidth();
|
||||
if (lineWidth < 1.) lineWidth = 1.;
|
||||
lineWidth *= fpViewer -> GetViewParameters().GetGlobalLineWidthScale();
|
||||
if (lineWidth < 1.) lineWidth = 1.;
|
||||
return lineWidth;
|
||||
}
|
||||
|
||||
G4ViewParameters::DrawingStyle G4VSceneHandler::GetDrawingStyle
|
||||
(const G4VisAttributes* pVisAttribs) {
|
||||
// Drawing style is normally determined by the view parameters, but
|
||||
@@ -759,8 +779,10 @@ G4bool G4VSceneHandler::GetAuxEdgeVisible (const G4VisAttributes* pVisAttribs) {
|
||||
return isAuxEdgeVisible;
|
||||
}
|
||||
|
||||
G4double G4VSceneHandler::GetMarkerSize (const G4VMarker& marker,
|
||||
G4VSceneHandler::MarkerSizeType& markerSizeType) {
|
||||
G4double G4VSceneHandler::GetMarkerSize
|
||||
(const G4VMarker& marker,
|
||||
G4VSceneHandler::MarkerSizeType& markerSizeType)
|
||||
{
|
||||
G4bool userSpecified = marker.GetWorldSize() || marker.GetScreenSize();
|
||||
const G4VMarker& defaultMarker =
|
||||
fpViewer -> GetViewParameters().GetDefaultMarker();
|
||||
@@ -776,11 +798,31 @@ G4double G4VSceneHandler::GetMarkerSize (const G4VMarker& marker,
|
||||
// Draw in screen coordinates.
|
||||
markerSizeType = screen;
|
||||
}
|
||||
if (size <= 0.) size = 1.;
|
||||
if (size <= 1.) size = 1.;
|
||||
size *= fpViewer -> GetViewParameters().GetGlobalMarkerScale();
|
||||
if (size <= 1.) size = 1.;
|
||||
return size;
|
||||
}
|
||||
|
||||
G4int G4VSceneHandler::GetNoOfSides(const G4VisAttributes* pVisAttribs)
|
||||
{
|
||||
// No. of sides (lines segments per circle) is normally determined
|
||||
// by the view parameters, but it can be overriddden by the
|
||||
// ForceLineSegmentsPerCircle in the vis attributes.
|
||||
G4int lineSegmentsPerCircle = fpViewer->GetViewParameters().GetNoOfSides();
|
||||
if (pVisAttribs->GetForcedLineSegmentsPerCircle() > 0)
|
||||
lineSegmentsPerCircle = pVisAttribs->GetForcedLineSegmentsPerCircle();
|
||||
const G4int nSegmentsMin = 12;
|
||||
if (lineSegmentsPerCircle < nSegmentsMin) {
|
||||
lineSegmentsPerCircle = nSegmentsMin;
|
||||
G4cout <<
|
||||
"G4VSceneHandler::GetNoOfSides: attempt to set the"
|
||||
"\nnumber of line segements per circle < " << nSegmentsMin
|
||||
<< "; forced to " << lineSegmentsPerCircle << G4endl;
|
||||
}
|
||||
return lineSegmentsPerCircle;
|
||||
}
|
||||
|
||||
std::ostream& operator << (std::ostream& os, const G4VSceneHandler& s) {
|
||||
|
||||
os << "Scene handler " << s.fName << " has "
|
||||
|
||||
Reference in New Issue
Block a user