32 #ifdef G4VIS_BUILD_OI_DRIVER 
   37 #include <Inventor/SoPath.h> 
   38 #include <Inventor/SoNodeKitPath.h> 
   39 #include <Inventor/nodes/SoCoordinate3.h> 
   40 #include <Inventor/nodes/SoCoordinate4.h> 
   41 #include <Inventor/nodes/SoSeparator.h> 
   42 #include <Inventor/nodes/SoDrawStyle.h> 
   43 #include <Inventor/nodes/SoLightModel.h> 
   44 #include <Inventor/nodes/SoMaterial.h> 
   45 #include <Inventor/nodes/SoLineSet.h> 
   46 #include <Inventor/nodes/SoCube.h> 
   47 #include <Inventor/nodes/SoFont.h> 
   48 #include <Inventor/nodes/SoText2.h> 
   49 #include <Inventor/nodes/SoFaceSet.h> 
   50 #include <Inventor/nodes/SoNormal.h> 
   51 #include <Inventor/nodes/SoNormalBinding.h> 
   52 #include <Inventor/nodes/SoComplexity.h> 
   53 #include <Inventor/nodes/SoTranslation.h> 
   54 #include <Inventor/nodes/SoTransform.h> 
   55 #include <Inventor/nodes/SoResetTransform.h> 
   56 #include <Inventor/nodes/SoMatrixTransform.h> 
   58 #define USE_SOPOLYHEDRON 
   60 #ifndef USE_SOPOLYHEDRON 
  100 G4int G4OpenInventorSceneHandler::fSceneIdCount = 0;
 
  102 G4OpenInventorSceneHandler::G4OpenInventorSceneHandler (
G4OpenInventor& system,
 
  108 ,fCurrentSeparator(0)
 
  109 ,fModelingSolid(false)
 
  110 ,fReducedWireFrame(true)
 
  112 ,fPreviewAndFull(true)
 
  117   fRoot = 
new SoSeparator;
 
  119   fRoot->setName(
"Root");
 
  121   fDetectorRoot = 
new SoSeparator;
 
  122   fDetectorRoot->setName(
"StaticRoot");
 
  123   fRoot->addChild(fDetectorRoot);
 
  125   fTransientRoot = 
new SoSeparator;
 
  126   fTransientRoot->setName(
"TransientRoot");
 
  127   fRoot->addChild(fTransientRoot);
 
  129   fCurrentSeparator = fTransientRoot;
 
  132 G4OpenInventorSceneHandler::~G4OpenInventorSceneHandler ()
 
  135   fStyleCache->unref();
 
  138 void G4OpenInventorSceneHandler::ClearStore ()
 
  140   fDetectorRoot->removeAllChildren();
 
  141   fSeparatorMap.clear();
 
  143   fTransientRoot->removeAllChildren();
 
  146 void G4OpenInventorSceneHandler::ClearTransientStore ()
 
  148   fTransientRoot->removeAllChildren();
 
  154 void G4OpenInventorSceneHandler::PreAddSolid
 
  161   GeneratePrerequisites();
 
  167 void G4OpenInventorSceneHandler::BeginPrimitives
 
  174   if (!fProcessingSolid) {
 
  175     GeneratePrerequisites();
 
  182 void G4OpenInventorSceneHandler::AddPrimitive (
const G4Polyline& line)
 
  185     static G4bool warned = 
false;
 
  189     (
"G4OpenInventorSceneHandler::AddPrimitive (const G4Polyline&)",
 
  191      "2D polylines not implemented.  Ignored.");
 
  203   G4int nPoints = line.size();
 
  204   SbVec3f* pCoords = 
new SbVec3f[nPoints];
 
  206   for (
G4int iPoint = 0; iPoint < nPoints ; iPoint++) {
 
  207     pCoords[iPoint].setValue((
float)line[iPoint].x(),
 
  208                              (
float)line[iPoint].y(),
 
  209                              (
float)line[iPoint].z());
 
  215   SoCoordinate3 *polyCoords = 
new SoCoordinate3;
 
  216   polyCoords->point.setValues(0,nPoints,pCoords);
 
  217   fCurrentSeparator->addChild(polyCoords);
 
  222   SoDrawStyle* drawStyle = fStyleCache->getLineStyle();
 
  223   fCurrentSeparator->addChild(drawStyle);
 
  228   if (fpViewer->GetViewParameters().IsPicking()) LoadAtts(line, pLine);
 
  231   pLine->numVertices.setValues(0,1,(
const long *)&nPoints);
 
  233   pLine->numVertices.setValues(0,1,&nPoints);
 
  236   fCurrentSeparator->addChild(pLine);
 
  241 void G4OpenInventorSceneHandler::AddPrimitive (
const G4Polymarker& polymarker)
 
  244     static G4bool warned = 
false;
 
  248     (
"G4OpenInventorSceneHandler::AddPrimitive (const G4Polymarker&)",
 
  250      "2D polymarkers not implemented.  Ignored.");
 
  262   G4int pointn = polymarker.size();
 
  263   if(pointn<=0) 
return;
 
  265   SbVec3f* points = 
new SbVec3f[pointn];
 
  266   for (
G4int iPoint = 0; iPoint < pointn ; iPoint++) {
 
  267     points[iPoint].setValue((
float)polymarker[iPoint].x(),
 
  268                             (
float)polymarker[iPoint].y(),
 
  269                             (
float)polymarker[iPoint].z());
 
  272   SoCoordinate3* coordinate3 = 
new SoCoordinate3;
 
  273   coordinate3->point.setValues(0,pointn,points);
 
  274   fCurrentSeparator->addChild(coordinate3);
 
  276   MarkerSizeType sizeType;
 
  277   G4double screenSize = GetMarkerSize (polymarker, sizeType);
 
  290   markerSet->numPoints = pointn;
 
  293   if (fpViewer->GetViewParameters().IsPicking())
 
  294     LoadAtts(polymarker, markerSet);
 
  301     if (screenSize <= 5.) {
 
  302       markerSet->markerIndex = SoMarkerSet::CIRCLE_FILLED_5_5;
 
  303     } 
else if (screenSize <= 7.) {
 
  304       markerSet->markerIndex = SoMarkerSet::CIRCLE_FILLED_7_7;
 
  306       markerSet->markerIndex = SoMarkerSet::CIRCLE_FILLED_9_9;
 
  310     if (screenSize <= 5.) {
 
  312     markerSet->markerIndex = SoMarkerSet::CIRCLE_FILLED_5_5;
 
  314     markerSet->markerIndex = SoMarkerSet::CIRCLE_LINE_5_5;
 
  316     } 
else if (screenSize <= 7.) {
 
  318     markerSet->markerIndex = SoMarkerSet::CIRCLE_FILLED_7_7;
 
  320     markerSet->markerIndex = SoMarkerSet::CIRCLE_LINE_7_7;
 
  324     markerSet->markerIndex = SoMarkerSet::CIRCLE_FILLED_9_9;
 
  326     markerSet->markerIndex = SoMarkerSet::CIRCLE_LINE_9_9;
 
  331     if (screenSize <= 5.) {
 
  333     markerSet->markerIndex = SoMarkerSet::SQUARE_FILLED_5_5;
 
  335     markerSet->markerIndex = SoMarkerSet::SQUARE_LINE_5_5;
 
  337     } 
else if (screenSize <= 7.) {
 
  339     markerSet->markerIndex = SoMarkerSet::SQUARE_FILLED_7_7;
 
  341     markerSet->markerIndex = SoMarkerSet::SQUARE_LINE_7_7;
 
  345     markerSet->markerIndex = SoMarkerSet::SQUARE_FILLED_9_9;
 
  347     markerSet->markerIndex = SoMarkerSet::SQUARE_LINE_9_9;
 
  351   fCurrentSeparator->addChild(markerSet);
 
  358 void G4OpenInventorSceneHandler::AddPrimitive (
const G4Text& text)
 
  361     static G4bool warned = 
false;
 
  365     (
"G4OpenInventorSceneHandler::AddPrimitive (const G4Text&)",
 
  367      "2D text not implemented.  Ignored.");
 
  379   const G4Colour& c = GetTextColour (text);
 
  380   SoMaterial* material = 
 
  381     fStyleCache->getMaterial((
float)c.GetRed(),
 
  384                              (float)(1-c.GetAlpha()));
 
  385   fCurrentSeparator->addChild(material);
 
  387   MarkerSizeType sizeType;
 
  388   G4double size = GetMarkerSize (text, sizeType);
 
  403   SoFont *g4Font = 
new SoFont();
 
  405   fCurrentSeparator->addChild(g4Font);
 
  410   SoText2 *g4String = 
new SoText2();
 
  411   g4String->string.setValue(text.
GetText());
 
  412   g4String->spacing = 2.0;
 
  416     g4String->justification = SoText2::LEFT; 
break;
 
  418     g4String->justification = SoText2::CENTER; 
break;
 
  420     g4String->justification = SoText2::RIGHT; 
break;
 
  422   fCurrentSeparator->addChild(g4String);
 
  428 void G4OpenInventorSceneHandler::AddPrimitive (
const G4Circle& circle) {
 
  429   AddCircleSquare(G4OICircle, circle);
 
  435 void G4OpenInventorSceneHandler::AddPrimitive (
const G4Square& square) {
 
  436   AddCircleSquare(G4OISquare, square);
 
  439 void G4OpenInventorSceneHandler::AddCircleSquare
 
  440 (G4OIMarker markerType, 
const G4VMarker& marker)
 
  443     static G4bool warned = 
false;
 
  447     (
"G4OpenInventorSceneHandler::AddCircleSquare",
 
  449      "2D circles and squares not implemented.  Ignored.");
 
  461   MarkerSizeType sizeType;
 
  462   G4double screenSize = GetMarkerSize (marker, sizeType);
 
  477   SbVec3f* points = 
new SbVec3f[1];
 
  478   points[0].setValue((
float)centre.
x(),
 
  481   SoCoordinate3* coordinate3 = 
new SoCoordinate3;
 
  482   coordinate3->point.setValues(0,1,points);
 
  483   fCurrentSeparator->addChild(coordinate3);
 
  486   markerSet->numPoints = 1;
 
  489   if (fpViewer->GetViewParameters().IsPicking()) LoadAtts(marker, markerSet);
 
  492   switch (markerType) {
 
  494     if (screenSize <= 5.) {
 
  496     markerSet->markerIndex = SoMarkerSet::CIRCLE_FILLED_5_5;
 
  498     markerSet->markerIndex = SoMarkerSet::CIRCLE_LINE_5_5;
 
  500     } 
else if (screenSize <= 7.) {
 
  502     markerSet->markerIndex = SoMarkerSet::CIRCLE_FILLED_7_7;
 
  504     markerSet->markerIndex = SoMarkerSet::CIRCLE_LINE_7_7;
 
  508     markerSet->markerIndex = SoMarkerSet::CIRCLE_FILLED_9_9;
 
  510     markerSet->markerIndex = SoMarkerSet::CIRCLE_LINE_9_9;
 
  515     if (screenSize <= 5.) {
 
  517     markerSet->markerIndex = SoMarkerSet::SQUARE_FILLED_5_5;
 
  519     markerSet->markerIndex = SoMarkerSet::SQUARE_LINE_5_5;
 
  521     } 
else if (screenSize <= 7.) {
 
  523     markerSet->markerIndex = SoMarkerSet::SQUARE_FILLED_7_7;
 
  525     markerSet->markerIndex = SoMarkerSet::SQUARE_LINE_7_7;
 
  529     markerSet->markerIndex = SoMarkerSet::SQUARE_FILLED_9_9;
 
  531     markerSet->markerIndex = SoMarkerSet::SQUARE_LINE_9_9;
 
  536   fCurrentSeparator->addChild(markerSet);
 
  544 void G4OpenInventorSceneHandler::AddPrimitive (
const G4Polyhedron& polyhedron)
 
  549     static G4bool warned = 
false;
 
  553     (
"G4OpenInventorSceneHandler::AddPrimitive (const G4Polyhedron&)",
 
  555      "2D polyhedra not implemented.  Ignored.");
 
  570   if (fpViewer->GetViewParameters().IsPicking())
 
  571     LoadAtts(polyhedron, soPolyhedron);
 
  573   SbString name = 
"Non-geometry";
 
  580   soPolyhedron->setName(sbName);
 
  581   soPolyhedron->
solid.setValue(fModelingSolid);
 
  583   fCurrentSeparator->addChild(soPolyhedron);  
 
  586 void G4OpenInventorSceneHandler::GeneratePrerequisites()
 
  617     typedef std::vector<PVNodeID> 
PVPath;
 
  635     PVPath::const_reverse_iterator ri;
 
  637     ri = ++drawnPVPath.rbegin();
 
  638     if (ri != drawnPVPath.rend()) {
 
  640       MotherVolume = ri->GetPhysicalVolume()->GetLogicalVolume();
 
  650       SoSeparator* previewSeparator   =  
 
  651     (SoSeparator*) detectorTreeKit->getPart(
"previewSeparator",
TRUE);
 
  654       SoSeparator* fullSeparator =  
 
  655     (SoSeparator*) detectorTreeKit->getPart(
"fullSeparator",   
TRUE);
 
  665     fpViewer->GetApplicableVisAttributes (fpVisAttribs);
 
  669       const double red = g4Col.
GetRed ();
 
  670       const double green = g4Col.
GetGreen ();
 
  671       const double blue = g4Col.
GetBlue ();
 
  672       double transparency = 1 - g4Col.
GetAlpha();
 
  676     GetDrawingStyle(pApplicableVisAttribs);
 
  677       switch (drawing_style) {
 
  679     fModelingSolid = 
false;
 
  684     fModelingSolid = 
true;
 
  688       SoMaterial* material = 
 
  689     fStyleCache->getMaterial((
float)red,
 
  692                  (
float)transparency);
 
  693       detectorTreeKit->setPart(
"appearance.material",material);
 
  695       SoLightModel* lightModel = 
 
  696     fModelingSolid ? fStyleCache->getLightModelPhong() : 
 
  697     fStyleCache->getLightModelBaseColor();
 
  698       detectorTreeKit->setPart(
"appearance.lightModel",lightModel);
 
  702       fSeparatorMap[pCurrentLV] = fullSeparator;
 
  707     if (fSeparatorMap.find(MotherVolume) != fSeparatorMap.end()) {
 
  710       fSeparatorMap[MotherVolume]->addChild(detectorTreeKit);
 
  717         "ERROR: G4OpenInventorSceneHandler::GeneratePrerequisites: Mother " 
  718          << ri->GetPhysicalVolume()->GetName()
 
  719          << 
':' << ri->GetCopyNo()
 
  720          << 
" not previously encountered." 
  721         "\nShouldn't happen!  Please report to visualization coordinator." 
  726       fDetectorRoot->addChild(detectorTreeKit);
 
  730     fDetectorRoot->addChild(detectorTreeKit);
 
  733       fCurrentSeparator = previewSeparator;
 
  739     if (fSeparatorMap.find(MotherVolume) != fSeparatorMap.end()) {
 
  740       fCurrentSeparator = fSeparatorMap[MotherVolume];
 
  746       G4cout << 
"ERROR: G4OpenInventorSceneHandler::PreAddSolid: Mother " 
  747          << ri->GetPhysicalVolume()->GetName()
 
  748          << 
':' << ri->GetCopyNo()
 
  749          << 
" not previously encountered." 
  750         "\nShouldn't happen!  Please report to visualization coordinator." 
  753       fCurrentSeparator = fDetectorRoot;
 
  756     fCurrentSeparator = fDetectorRoot;
 
  763     if (fReadyForTransients) {
 
  764       fCurrentSeparator = fTransientRoot;
 
  766       fCurrentSeparator = fDetectorRoot;
 
  771 void G4OpenInventorSceneHandler::AddProperties(
const G4VisAttributes* visAtts)
 
  775     fpViewer->GetApplicableVisAttributes (visAtts);
 
  779   const double red = g4Col.
GetRed ();
 
  780   const double green = g4Col.
GetGreen ();
 
  781   const double blue = g4Col.
GetBlue ();
 
  782   double transparency = 1 - g4Col.
GetAlpha();
 
  786     GetDrawingStyle(pApplicableVisAttribs);
 
  787   switch (drawing_style) {
 
  789     fModelingSolid = 
false;
 
  794     fModelingSolid = 
true;
 
  799   G4bool isAuxEdgeVisible = GetAuxEdgeVisible (pApplicableVisAttribs);
 
  800   fReducedWireFrame = !isAuxEdgeVisible;
 
  802   SoMaterial* material = 
 
  803     fStyleCache->getMaterial((
float)red,
 
  806                  (
float)transparency);
 
  807   fCurrentSeparator->addChild(material);
 
  809   SoLightModel* lightModel = 
 
  810     fModelingSolid ? fStyleCache->getLightModelPhong() : 
 
  811     fStyleCache->getLightModelBaseColor();
 
  812   fCurrentSeparator->addChild(lightModel);
 
  815 void G4OpenInventorSceneHandler::AddTransform(
const G4Point3D& translation)
 
  819   fCurrentSeparator->addChild(fStyleCache->getResetTransform());
 
  821   SoMatrixTransform* matrixTransform = 
new SoMatrixTransform;
 
  822   G4OpenInventorTransform3D oiTran
 
  824   SbMatrix* sbMatrix = oiTran.GetSbMatrix();
 
  826   const G4Vector3D scale = fpViewer->GetViewParameters().GetScaleFactor();
 
  829     (SbVec3f((
float)scale.
x(),(float)scale.
y(),(float)scale.
z()));
 
  830   sbMatrix->multRight(sbScale);
 
  832   matrixTransform->matrix.setValue(*sbMatrix);
 
  834   fCurrentSeparator->addChild(matrixTransform);
 
G4double GetAlpha() const 
 
MarkerType GetMarkerType() const 
 
virtual void BeginPrimitives(const G4Transform3D &objectTransformation)
 
virtual G4bool IsReplicated() const =0
 
const G4Colour & GetColour() const 
 
G4Point3D GetPosition() const 
 
const G4VisAttributes * GetVisAttributes() const 
 
const std::vector< G4PhysicalVolumeNodeID > & GetDrawnPVPath() const 
 
SoSFBool reducedWireFrame
 
G4GLOB_DLL std::ostream G4cout
 
G4double GetGreen() const 
 
#define SoDetectorTreeKit
 
G4PhysicalVolumeModel::G4PhysicalVolumeNodeID PVNodeID
 
std::vector< PVNodeID > PVPath
 
G4int GetNoDaughters() const 
 
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
 
virtual void PreAddSolid(const G4Transform3D &objectTransformation, const G4VisAttributes &)
 
virtual void setPreview(SbBool Flag)
 
FillStyle GetFillStyle() const 
 
const G4String & GetName() const 
 
G4LogicalVolume * GetCurrentLV() const 
 
G4VPhysicalVolume * GetCurrentPV() const 
 
G4int GetNoFacets() const