Import Geant4 6.2.0 source tree

This commit is contained in:
Gabriele Cosmo
2016-06-09 10:56:29 +02:00
parent 1d812b78b1
commit e083ffb441
1415 changed files with 111223 additions and 21207 deletions
@@ -1,4 +1,4 @@
# $Id: GNUmakefile,v 1.5 2003/10/03 15:11:05 gcosmo Exp $
# $Id: GNUmakefile,v 1.6 2004/06/03 11:40:13 gcosmo Exp $
name := G4OpenInventor
@@ -6,6 +6,13 @@ ifndef G4INSTALL
G4INSTALL = ../../..
endif
GLOBLIBS = libG4vis_management.lib libG4modeling.lib
GLOBLIBS += libG4interfaces.lib libG4run.lib libG4event.lib
GLOBLIBS += libG4tracking.lib libG4processes.lib libG4digits_hits.lib
GLOBLIBS += libG4track.lib libG4particles.lib libG4geometry.lib
GLOBLIBS += libG4materials.lib libG4graphics_reps.lib
GLOBLIBS += libG4intercoms.lib libG4global.lib
include $(G4INSTALL)/config/architecture.gmk
include $(G4INSTALL)/config/G4VIS_BUILD.gmk
include $(G4INSTALL)/config/interactivity.gmk
+14 -1
View File
@@ -1,4 +1,4 @@
$Id: History,v 1.5 2003/10/29 10:02:24 gcosmo Exp $
$Id: History,v 1.7 2004/06/14 09:27:33 gcosmo Exp $
-------------------------------------------------------------------
=========================================================
@@ -20,6 +20,19 @@ committal in the CVS repository !
History file for visualization/OpenInventor
-------------------------------------------
08th April 2004 Guy Barrand (openinventor-V06-01-00)
- Bring in the repository the necessary HEPVis code. In fact few of HEPVis
is used in this G4 driver. Then HEPVis is no more needed.
Note that, to avoid clashes of G4/vis within experiments, the HEPVis
node are protected by some : #define Geant4_<node> <node>. Then, for
example, within the G4OpenInventor lib there are Geant4_SoBox, etc...
(and not SoBox,... that may clash with other HEPVis code in experiments).
- Have code to run on Windows.
- Split Viewer to have G4OpenInventorXtViewer and G4OpenInventorWinViewer.
- Split G4OpenInventor to have G4OpenInventorXt and G4OpenInventorWin.
Xt and Win (and not X and Win32 like in vis/OpenGL) to follow
the conventions found in the OpenInventor world.
29th October 2003 Cosmo Gabriele (openinventor-V05-02-00)
- Patch in G4OpenInventorSceneHandler in PreAddThis() to cope with changes
introduced in G4VPhysicalVolume in "geant4-05-02-ref-04", where pointer to
@@ -21,8 +21,8 @@
// ********************************************************************
//
//
// $Id: G4OpenInventor.hh,v 1.6 2001/07/11 10:08:59 gunter Exp $
// GEANT4 tag $Name: geant4-05-02-patch-01 $
// $Id: G4OpenInventor.hh,v 1.7 2004/04/08 09:39:37 gbarrand Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
// Guy Barrand 26 Mar 1998.
// OpenInventor graphics system factory.
@@ -40,11 +40,10 @@ class G4OpenInventor: public G4VGraphicsSystem {
public:
G4OpenInventor(const G4String,const G4String,G4VGraphicsSystem::Functionality);
virtual ~G4OpenInventor();
G4VViewer* CreateViewer(G4VSceneHandler&,const G4String& name = "");
void SetInteractorManager(G4VInteractorManager*);
G4VInteractorManager* GetInteractorManager();
G4VSceneHandler* CreateSceneHandler (const G4String& name);
void InitHEPVis();
void InitNodes();
private:
G4VInteractorManager* interactorManager;
};
@@ -21,8 +21,8 @@
// ********************************************************************
//
//
// $Id: G4OpenInventorSceneHandler.hh,v 1.15 2003/10/29 10:01:35 gcosmo Exp $
// GEANT4 tag $Name: geant4-06-00-patch-01 $
// $Id: G4OpenInventorSceneHandler.hh,v 1.16 2004/04/08 09:39:38 gbarrand Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
//
// J Kallenbach 27th Aug 1996
@@ -44,7 +44,8 @@ class SoSeparator;
// Base class for various OpenInventorScene classes.
class G4OpenInventorSceneHandler: public G4VSceneHandler {
friend class G4OpenInventorViewer;
friend class G4OpenInventorXtViewer;
friend class G4OpenInventorWinViewer;
public:
@@ -21,8 +21,8 @@
// ********************************************************************
//
//
// $Id: G4OpenInventorSceneHandler.icc,v 1.4 2001/07/11 10:08:59 gunter Exp $
// GEANT4 tag $Name: geant4-05-02-patch-01 $
// $Id: G4OpenInventorSceneHandler.icc,v 1.5 2004/04/08 09:39:38 gbarrand Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
//
// J Kallenbach 27th Aug 1996
@@ -21,16 +21,16 @@
// ********************************************************************
//
//
// $Id: G4OpenInventorTransform3D.hh,v 1.4 2001/07/11 10:09:00 gunter Exp $
// GEANT4 tag $Name: geant4-05-02-patch-01 $
// $Id: G4OpenInventorTransform3D.hh,v 1.5 2004/04/08 09:39:38 gbarrand Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
//
// jck 17 Dec 1996
// G4OpenGLInventorTransform3D provides SoSFMatrix transformation matrix
// from G4Transform3D.
#ifndef G4OpenInventorTRANSFORM3D_HH
#define G4OpenInventorTRANSFORM3D_HH
#ifndef G4OPENINVENTORTRANSFORM3D_HH
#define G4OPENINVENTORTRANSFORM3D_HH
#ifdef G4VIS_BUILD_OI_DRIVER
@@ -20,40 +20,26 @@
// * statement, and all its terms. *
// ********************************************************************
//
#ifndef G4SOWINDOW_h
#define G4SOWINDOW_h
//
// $Id: G4OpenInventorWin.hh,v 1.1 2004/04/08 09:37:30 gbarrand Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
// OpenInventor graphics system factory.
#include <Inventor/Xt/SoXt.h>
#include <HEPVis/SbBasic.h>
#if defined (G4VIS_BUILD_OIWIN32_DRIVER) || defined (G4VIS_USE_OIWIN32)
class SbDict;
#ifndef G4OPENINVENTORWIN_HH
#define G4OPENINVENTORWIN_HH
class G4SoWindow {
#include "G4OpenInventor.hh"
class G4OpenInventorWin: public G4OpenInventor {
public:
G4SoWindow(const char*,SbBool=FALSE);
virtual ~G4SoWindow();
Widget getWidget() const;
void show();
void hide();
void setTitle(const char*);
void setSize(const SbVec2s&);
SbVec2s getSize();
void setWMClose(SbBool);
SbBool getWMClose() const;
static void clearClass();
protected:
void registerWidget(Widget);
void unregisterWidget(Widget);
static G4SoWindow* getWindow(Widget);
private:
Widget fWidget;
SbBool fWMClose;
static SbDict* fWidgetDictionary;
#ifdef HEPVisXt
static void widgetDestroyedCB(Widget,XtPointer,XtPointer);
public:
static void closeWindow(Widget,XEvent*,char**,Cardinal*);
#endif
G4OpenInventorWin ();
virtual ~G4OpenInventorWin ();
G4VViewer* CreateViewer(G4VSceneHandler&,const G4String& name = "");
};
#endif
#endif
@@ -21,8 +21,8 @@
// ********************************************************************
//
//
// $Id: G4OpenInventorWin32.hh,v 1.5 2001/07/11 10:09:00 gunter Exp $
// GEANT4 tag $Name: geant4-05-02-patch-01 $
// $Id: G4OpenInventorWin32.hh,v 1.6 2004/04/08 09:39:38 gbarrand Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
// OpenInventor graphics system factory.
@@ -31,12 +31,14 @@
#ifndef G4OPENINVENTORWIN32_HH
#define G4OPENINVENTORWIN32_HH
#include "G4OpenInventor.hh"
// For backward compatibilty.
class G4OpenInventorWin32: public G4OpenInventor {
#include "G4OpenInventorWin.hh"
class G4OpenInventorWin32: public G4OpenInventorWin {
public:
G4OpenInventorWin32 ();
virtual ~G4OpenInventorWin32 ();
G4OpenInventorWin32 () {}
virtual ~G4OpenInventorWin32 () {}
};
#endif
@@ -0,0 +1,69 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. *
// * *
// * 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: G4OpenInventorWinViewer.hh,v 1.2 2004/04/08 10:49:10 gbarrand Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
//
// Jeff Kallenbach 01 Aug 1996
// OpenInventor viewer - opens window, hard copy, etc.
#ifndef G4OPENINVENTORWINVIEWER_HH
#define G4OPENINVENTORWINVIEWER_HH
#ifdef G4VIS_BUILD_OI_DRIVER
#include "G4VViewer.hh"
#include <windows.h>
class SoWinExaminerViewer;
class SoSelection;
class G4OpenInventorSceneHandler;
class G4VInteractorManager;
class G4OpenInventorWinViewer: public G4VViewer {
public:
G4OpenInventorWinViewer(G4OpenInventorSceneHandler& scene,
const G4String& name = "");
virtual ~G4OpenInventorWinViewer();
void DrawView();
void ShowView();
private:
void ClearView();
void FinishView();
void SetView();
void KernelVisitDecision();
G4bool CompareForKernelVisit(G4ViewParameters&);
G4OpenInventorSceneHandler& fG4OpenInventorSceneHandler;
G4ViewParameters fLastVP; // Memory for making kernel visit decisions.
HWND fShell;
SoWinExaminerViewer* fViewer;
SoSelection* fSelection;
G4VInteractorManager* fInteractorManager;
};
#endif
#endif
@@ -21,8 +21,8 @@
// ********************************************************************
//
//
// $Id: G4OpenInventorX.hh,v 1.5 2001/07/11 10:09:00 gunter Exp $
// GEANT4 tag $Name: geant4-05-02-patch-01 $
// $Id: G4OpenInventorX.hh,v 1.6 2004/04/08 09:39:38 gbarrand Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
//
// Andrew Walkden 27th March 1996
@@ -33,12 +33,14 @@
#ifndef G4OPENINVENTORX_HH
#define G4OPENINVENTORX_HH
#include "G4OpenInventor.hh"
// For backward compatibilty.
class G4OpenInventorX: public G4OpenInventor {
#include "G4OpenInventorXt.hh"
class G4OpenInventorX: public G4OpenInventorXt {
public:
G4OpenInventorX ();
virtual ~G4OpenInventorX ();
G4OpenInventorX () {}
virtual ~G4OpenInventorX () {}
};
#endif
@@ -0,0 +1,47 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. *
// * *
// * 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: G4OpenInventorXt.hh,v 1.1 2004/04/08 09:37:30 gbarrand Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
//
// Andrew Walkden 27th March 1996
// OpenInventor graphics system factory.
#if defined (G4VIS_BUILD_OIX_DRIVER) || defined (G4VIS_USE_OIX)
#ifndef G4OPENINVENTORXT_HH
#define G4OPENINVENTORXT_HH
#include "G4OpenInventor.hh"
class G4OpenInventorXt: public G4OpenInventor {
public:
G4OpenInventorXt ();
virtual ~G4OpenInventorXt ();
G4VViewer* CreateViewer(G4VSceneHandler&,const G4String& name = "");
};
#endif
#endif
@@ -21,51 +21,48 @@
// ********************************************************************
//
//
// $Id: G4OpenInventorViewer.hh,v 1.10 2001/11/14 14:56:11 barrand Exp $
// GEANT4 tag $Name: geant4-05-02-patch-01 $
// $Id: G4OpenInventorXtViewer.hh,v 1.1 2004/04/08 09:37:30 gbarrand Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
//
// Jeff Kallenbach 01 Aug 1996
// OpenInventor viewer - opens window, hard copy, etc.
#ifndef G4OPENINVENTORVIEWER_HH
#define G4OPENINVENTORVIEWER_HH
#ifndef G4OPENINVENTORXTVIEWER_HH
#define G4OPENINVENTORXTVIEWER_HH
#ifdef G4VIS_BUILD_OI_DRIVER
#include <Inventor/Xt/SoXt.h>
#include "G4VViewer.hh"
class SoXtComponent;
#include <X11/Intrinsic.h>
class SoXtExaminerViewer;
class SoSelection;
class G4SoWindow;
class G4OpenInventorSceneHandler;
class G4VInteractorManager;
//
// Base class for various OpenInventorView classes.
//
class G4OpenInventorViewer: public G4VViewer {
class G4OpenInventorXtViewer: public G4VViewer {
public:
G4OpenInventorViewer (G4OpenInventorSceneHandler& scene,
const G4String& name = "");
virtual ~G4OpenInventorViewer ();
void DrawView ();
void ShowView ();
G4OpenInventorXtViewer(G4OpenInventorSceneHandler& scene,
const G4String& name = "");
virtual ~G4OpenInventorXtViewer();
void DrawView();
void ShowView();
private:
void ClearView ();
void FinishView ();
void SetView ();
void KernelVisitDecision ();
void ClearView();
void FinishView();
void SetView();
void KernelVisitDecision();
G4bool CompareForKernelVisit(G4ViewParameters&);
G4OpenInventorSceneHandler& fG4OpenInventorSceneHandler;
G4ViewParameters fLastVP; // Memory for making kernel visit decisions.
Widget fShell;
G4SoWindow* fWindow;
SoXtComponent* fViewer; // The Inventor Viewer
SoXtExaminerViewer* fViewer;
SoSelection* fSelection;
G4VInteractorManager* fInteractorManager;
};
@@ -0,0 +1,53 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. *
// * *
// * 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: SbMath.h,v 1.2 2004/06/14 09:27:34 gcosmo Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
#ifndef HEPVis_SbMath_h
#define HEPVis_SbMath_h
#include <math.h>
#ifndef M_PI
#define M_PI 3.1415926535897931160E0
#define M_PI_2 1.5707963267948965580E0
#endif
#define SbMinimum(a,b) ((a)<(b)?a:b)
#define SbMaximum(a,b) ((a)>(b)?a:b)
#define FCOS(x) ((float)cos((double)(x)))
#define FSIN(x) ((float)sin((double)(x)))
#define FACOS(x) ((float)acos((double)(x)))
#define FASIN(x) ((float)asin((double)(x)))
#define FTAN(x) ((float)tan((double)(x)))
#define FATAN(x) ((float)atan((double)(x)))
#define FSQRT(x) ((float)sqrt((double)(x)))
#define FPOW(x,y) ((float)pow((double)(x),(double)(y)))
#define FLOG(x) ((float)log((double)(x)))
#define FLOG10(x) ((float)log10((double)(x)))
#define FFLOOR(x) ((float)floor((double)(x)))
#define FFABS(x) ((float)fabs((double)(x)))
#define FCEIL(x) ((float)ceil((double)(x)))
#endif
@@ -0,0 +1,115 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. *
// * *
// * 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: SoDetectorTreeKit.h,v 1.2 2004/06/14 09:27:35 gcosmo Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
/*-----------------------------Hepvis----------------------------------------*/
/* */
/* Node: SoDetectorTreeKit */
/* Description: Easy way of browsing through a tree of detectors */
/* Author: Joe Boudreau Nov 11 1996 */
/* */
/*---------------------------------------------------------------------------*/
#ifndef HEPVis_SoDetectorTreeKit_h
#define HEPVis_SoDetectorTreeKit_h
#include <Inventor/nodekits/SoBaseKit.h>
#include <Inventor/nodes/SoEventCallback.h>
class SoSFNode;
class SoHandleEventAction;
class SoSeparator;
#define SoDetectorTreeKit Geant4_SoDetectorTreeKit
class SoDetectorTreeKit:public SoBaseKit {
// The following is required:
SO_KIT_HEADER(SoDetectorTreeKit);
////////////////////////////////////////////
SoSFNode alternateRep;
////////////////////////////////////////////
SO_KIT_CATALOG_ENTRY_HEADER(callbackList);
SO_KIT_CATALOG_ENTRY_HEADER(topSeparator);
SO_KIT_CATALOG_ENTRY_HEADER(pickStyle);
SO_KIT_CATALOG_ENTRY_HEADER(appearance);
SO_KIT_CATALOG_ENTRY_HEADER(units);
SO_KIT_CATALOG_ENTRY_HEADER(transform);
SO_KIT_CATALOG_ENTRY_HEADER(texture2Transform);
SO_KIT_CATALOG_ENTRY_HEADER(childList);
SO_KIT_CATALOG_ENTRY_HEADER(previewSeparator);
SO_KIT_CATALOG_ENTRY_HEADER(fullSeparator);
public:
// Constructor, required
SoDetectorTreeKit();
// This is required
virtual SbBool affectsState() const;
// Class Initializer, required
static void initClass();
// Turn the preview on or off
virtual void setPreview(SbBool Flag);
// Return the preview state
virtual SbBool getPreview() const;
// Return the preview Separator
virtual SoSeparator *getPreviewSeparator() const;
// Return the full Separator
virtual SoSeparator *getFullSeparator() const;
// Generate AlternateRep, required. Generating an alternate representation
// must be done upon users request. It allows an Inventor program to read
// back the file without requiring *this* code to be dynamically linked.
// If the users expects that *this* code will be dynamically linked, he
// need not invoke this method.
virtual void generateAlternateRep();
// We better be able to clear it, too!
virtual void clearAlternateRep();
protected:
// Destructor.
virtual ~SoDetectorTreeKit();
private:
// This is needed as well
void createInitialTree();
// This is the callback function that will be
// added to the callback list
static void expand (void *userData, SoEventCallback *eventCB);
static void contract (void *userData, SoEventCallback *eventCB);
};
#endif
@@ -0,0 +1,155 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. *
// * *
// * 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: SoBox.h,v 1.2 2004/06/14 09:27:36 gcosmo Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
/*-----------------------------Hepvis----------------------------------------*/
/* */
/* Node: SoBox */
/* Description: Represents the G4Box Geant Geometry entity */
/* Author: Joe Boudreau Nov 11 1996 */
/* */
/*---------------------------------------------------------------------------*/
#ifndef HEPVis_SoBox_h
#define HEPVis_SoBox_h
#include <Inventor/fields/SoSFFloat.h>
#include <Inventor/fields/SoSFNode.h>
#include <Inventor/nodes/SoShape.h>
class SoSFNode;
//! SoBox - Inventor version of the G4Box Geant Geometry entity
/*!
* Node: SoBox
*
* Description: The Inventor version of the G4Box Geant Geometry entity
*
* Author: Joe Boudreau Nov 11 1996
*
* class G4Box
*
* A Box is a cuboid of given half lengths dx,dy,dz. The Box is
* centred on the origin with sides parallel to the x/y/z axes.
*
* Always use Inventor Fields. This allows Inventor to detect a change to
* the data field and take the appropriate action; e.g., redraw the scene.
*/
#define SoBox Geant4_SoBox
class SoBox:public SoShape {
// The following is required:
SO_NODE_HEADER(SoBox);
public:
//
//! Half-length along X
//
SoSFFloat fDx;
//
//! Half-length along Y
//
SoSFFloat fDy;
//
//! Half-length along Z
//
SoSFFloat fDz;
//
//! Alternate rep - for use by users without HEPVis shared objects
//
SoSFNode alternateRep;
//
//! Constructor, required
//
SoBox();
//
//! Class Initializer, required
//
static void initClass();
//
//! Generate AlternateRep, required. Generating an alternate representation
//! must be done upon users request. It allows an Inventor program to read
//! back the file without requiring *this* code to be dynamically linked.
//! If the users expects that *this* code will be dynamically linked, he
//! need not invoke this method.
//
virtual void generateAlternateRep();
//
//! We better be able to clear it, too!
//
virtual void clearAlternateRep();
protected:
//
//! compute bounding Box, required
//
virtual void computeBBox(SoAction *action, SbBox3f &box, SbVec3f &center );
//
//! Generate Primitives, required
//
virtual void generatePrimitives(SoAction *action);
//
//! GetChildList, required whenever the class has hidden children
//
virtual SoChildList *getChildren() const;
protected:
//
//! Destructor, required
//
virtual ~SoBox();
private:
//
//! Generate Children. Used to create the hidden children. Required whenever
//! the node has hidden children.
//
void generateChildren();
//
//! Used to modify hidden children when a data field is changed. Required
//! whenever the class has hidden children.
//
void updateChildren();
//
//! ChildList. Required whenever the class has hidden children.
//
SoChildList *children;
};
#endif
@@ -0,0 +1,191 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. *
// * *
// * 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: SoCons.h,v 1.2 2004/06/14 09:27:36 gcosmo Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
/*-----------------------------Hepvis----------------------------------------*/
/* */
/* Node: SoCons */
/* Description: Represents the G4Cons Geant Geometry entity */
/* Author: Joe Boudreau Nov 11 1996 */
/* */
/*---------------------------------------------------------------------------*/
#ifndef HEPVis_SoCons_h
#define HEPVis_SoCons_h
#include <Inventor/fields/SoSFFloat.h>
#include <Inventor/fields/SoSFNode.h>
#include <Inventor/fields/SoSFBool.h>
#include <Inventor/nodes/SoShape.h>
class SoSFNode;
//! SoCons - Inventor version of the G4Cons Geant Geometry entity
/*!
* Node: SoCons
*
* Description: The Inventor version of the G4Cons Geant Geometry entity
*
* Author: Joe Boudreau Nov 11 1996
*
* A G4Cons is, in the general case, a Phi segment of a cone, with half-length
* fDz, inner and outer radii specified at -fDz and +fDz. The Phi segment is
* described by a starting fSPhi angle, and the +fDPhi delta angle for the shape.
* If the delta angle is >=2*M_PI, the shape is treated as continuous in Phi
*
* Member Data:
*
* fRmin1 inside radius at -fDz
* fRmin2 inside radius at +fDz
* fRmax1 outside radius at -fDz
* fRmax2 outside radius at +fDz
* fDz half length in z
*
* fSPhi starting angle of the segment in radians
* fDPhi delta angle of the segment in radians
*/
#define SoCons Geant4_SoCons
class SoCons:public SoShape {
// The following is required:
SO_NODE_HEADER(SoCons);
public:
//
//! Inside radius at -fDz
//
SoSFFloat fRmin1;
//
//! Inside radius at +fDz
//
SoSFFloat fRmin2;
//
//! Outside radius at -fDz
//
SoSFFloat fRmax1;
//
//! Outside radius at +fDz
//
SoSFFloat fRmax2;
//
//! Half-length along Z
//
SoSFFloat fDz;
//
//! Starting angle, in radians
//
SoSFFloat fSPhi;
//
//! Delta-angle, in radians
//
SoSFFloat fDPhi;
//
//! An Inventor option - slightly better render, worse performance
//
SoSFBool smoothDraw;
//
//! Alternate rep required - for use by users without HEPVis shared objects
//
SoSFNode alternateRep;
//
//! Constructor, required
//
SoCons();
//
//! Class Initializer, required
//
static void initClass();
//
//! Generate AlternateRep, required. Generating an alternate representation
//! must be done upon users request. It allows an Inventor program to read
//! back the file without requiring *this* code to be dynamically linked.
//! If the users expects that *this* code will be dynamically linked, he
//! need not invoke this method.
//
virtual void generateAlternateRep();
//
//! We better be able to clear it, too!
//
virtual void clearAlternateRep();
protected:
//
//! compute bounding Box, required
//
virtual void computeBBox(SoAction *action, SbBox3f &box, SbVec3f &center );
//
//! Generate Primitives, required
//
virtual void generatePrimitives(SoAction *action);
//
//! GetChildList, required whenever the class has hidden children
//
virtual SoChildList *getChildren() const;
protected:
//
//! Destructor, required
//
virtual ~SoCons();
private:
//
//! Generate Children. Used to create the hidden children. Required whenever
//! the node has hidden children.
//
void generateChildren();
//
//! Used to modify hidden children when a data field is changed. Required
//! whenever the class has hidden children.
//
void updateChildren();
//
//! ChildList. Required whenever the class has hidden children.
//
SoChildList *children;
//
//! help with trigonometry. increments sines an cosines by an angle.
//
void inc(double & sinPhi, double & cosPhi, double sinDeltaPhi, double cosDeltaPhi) const {
double oldSin=sinPhi,oldCos=cosPhi;
sinPhi = oldSin*cosDeltaPhi+oldCos*sinDeltaPhi;
cosPhi = oldCos*cosDeltaPhi-oldSin*sinDeltaPhi;
}
};
#endif
@@ -0,0 +1,213 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. *
// * *
// * 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: SoTrap.h,v 1.2 2004/06/14 09:27:37 gcosmo Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
/*-----------------------------Hepvis----------------------------------------*/
/* */
/* Node: SoTrap */
/* Description: Represents the G4Trap Geant Geometry entity */
/* Author: Joe Boudreau Nov 11 1996 */
/* */
/*---------------------------------------------------------------------------*/
#ifndef HEPVis_SoTrap_h
#define HEPVis_SoTrap_h
#include <Inventor/fields/SoSFNode.h>
#include <Inventor/fields/SoSFBool.h>
#include <Inventor/nodes/SoShape.h>
//adding fields
#ifdef WIN32
#include <SoWinEnterScope.h>
#endif
// Defining Class
#ifdef WIN32
#include <SoWinLeaveScope.h>
#endif
class SoSFNode;
//! SoTrap - Inventor version of the G4Trap Geant Geometry entity
/*! Node: SoTrap
*
* Description: Inventor version of the G4Trap Geant Geometry entity
*
* Author: Joe Boudreau Nov 11 1996
*
* A G4Trap is a general trapezoid: The faces perpendicular to the z planes
* are tapezia, and their centres are not necessarily on a line parallel to
* the z axis.
*
* Note that of the 11 parameters desribed below, only 9 are really
* independent - a check for planarity is made in the calculation of the
* equation for each plane. If the planes are not parallel, a call to
* G4Exception is made.
*
* Always use Inventor Fields. This allows Inventor to detect a change to
* the data field and take the appropriate action; e.g., redraw the scene.
*
*/
#define SoTrap Geant4_SoTrap
class SoTrap:public SoShape {
// The following is required:
SO_NODE_HEADER(SoTrap);
public:
#if defined(WIN32) && defined(BUILDING_DLL)
// When building the node as a DLL under Win32 we must explicitly
// declare this entry point as visible outside the DLL. The macro
// BUILDING_DLL is defined in the node's source file.
_declspec(dllexport)
#endif
//
//! half-length along Z
//
SoSFFloat pDz;
//
//! Polar angle of the line joining the centres of the faces at -/+pDz
//
SoSFFloat pTheta;
//
//! Azimuthal angle of the line joing the centre of the face at -pDz
//! to the centre of the face at +pDz
//
SoSFFloat pPhi;
//
//! Half-length along y of the face at -pDz
//
SoSFFloat pDy1;
//
//! Half-length along x of the side at y=-pDy1 of the face at -pDz
//
SoSFFloat pDx1;
//
//! Half-length along x of the side at y=+pDy1 of the face at -pDz
//
SoSFFloat pDx2;
//
//! Half-length along y of the face at +pDz
//
SoSFFloat pDy2;
//
//! Half-length along x of the side at y=-pDy2 of the face at +pDz
//
SoSFFloat pDx3;
//
//! Half-length along x of the side at y=+pDy2 of the face at +pDz
//
SoSFFloat pDx4;
//
//! Angle with respect to the y axis from the centre of the side at
//! y=-pDy1 to the centre at y=+pDy1 of the face at -pDz
//
SoSFFloat pAlp1;
//
//! Angle with respect to the y axis from the centre of the side at
//! y=-pDy2 to the centre at y=+pDy2 of the face at +pDz
//
SoSFFloat pAlp2;
//
//! Alternate rep - required
//
SoSFNode alternateRep;
//
//! Constructor, required
//
SoTrap();
//
//! Class Initializer, required
//
static void initClass();
//
//! Generate AlternateRep, required. Generating an alternate representation
//! must be done upon users request. It allows an Inventor program to read
//! back the file without requiring *this* code to be dynamically linked.
//! If the users expects that *this* code will be dynamically linked, he
//! need not invoke this method.
//
virtual void generateAlternateRep();
//
//! We better be able to clear it, too!
//
virtual void clearAlternateRep();
protected:
//
//! compute bounding Box, required
//
virtual void computeBBox(SoAction *action, SbBox3f &box, SbVec3f &center );
//
//! Generate Primitives, required
//
virtual void generatePrimitives(SoAction *action);
//
//! GetChildList, required whenever the class has hidden children
//
virtual SoChildList *getChildren() const;
//
//! Destructor, required
//
virtual ~SoTrap();
private:
//
//! Generate Children. Used to create the hidden children. Required whenever
//! the node has hidden children.
//
void generateChildren();
//
//! Used to modify hidden children when a data field is changed. Required
//! whenever the class has hidden children.
//
void updateChildren();
//
//! ChildList. Required whenever the class has hidden children.
//
SoChildList *children;
};
#ifdef WIN32
#include <SoWinEnterScope.h>
#endif
#endif
@@ -0,0 +1,169 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. *
// * *
// * 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: SoTrd.h,v 1.2 2004/06/14 09:27:37 gcosmo Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
/*-----------------------------Hepvis----------------------------------------*/
/* */
/* Node: SoTrd */
/* Description: Represents the G4Trd Geant Geometry entity */
/* Author: Joe Boudreau Nov 11 1996 */
/* */
/*---------------------------------------------------------------------------*/
#ifndef HEPVis_SoTrd_h
#define HEPVis_SoTrd_h
#include <Inventor/fields/SoSFFloat.h>
#include <Inventor/fields/SoSFNode.h>
#include <Inventor/fields/SoSFBool.h>
#include <Inventor/nodes/SoShape.h>
class SoSFNode;
//! SoTrd - Inventor version of the G4Trd Geant Geometry entity
/*!
* Node: SoTrd
*
* Description: Inventor version of the G4Trd Geant Geometry entity
*
* Author: Joe Boudreau Nov 11 1996
*
* A Trd is a trapezoid with the x and y dimensions varying along z
*
* Always use Inventor Fields. This allows Inventor to detect a change to
* the data field and take the appropriate action; e.g., redraw the scene.
*
*/
#define SoTrd Geant4_SoTrd
class SoTrd:public SoShape {
//
//! This is required
//
SO_NODE_HEADER(SoTrd);
public:
//
//! half-length of x, at -fDz
//
SoSFFloat fDx1;
//
//! half-length of x, at +fDz
//
SoSFFloat fDx2;
//
//! half-length of y, at -fDz
//
SoSFFloat fDy1;
//
//! half-length of y, at +fDz
//
SoSFFloat fDy2;
//
//! half-length along Z
//
SoSFFloat fDz;
//
//! Alternate rep - required
//
SoSFNode alternateRep;
//
//! Constructor, required
//
SoTrd();
//
//! Class Initializer, required
//
static void initClass();
//
//! Generate AlternateRep, required. Generating an alternate representation
//! must be done upon users request. It allows an Inventor program to read
//! back the file without requiring *this* code to be dynamically linked.
//! If the users expects that *this* code will be dynamically linked, he
//! need not invoke this method.
//
virtual void generateAlternateRep();
//
//! We better be able to clear it, too!
//
virtual void clearAlternateRep();
protected:
//
//! compute bounding Box, required
//
virtual void computeBBox(SoAction *action, SbBox3f &box, SbVec3f &center );
//
//! Generate Primitives, required
//
virtual void generatePrimitives(SoAction *action);
//
//! GetChildList, required whenever the class has hidden children
//
virtual SoChildList *getChildren() const;
protected:
//
//! Destructor, required
//
virtual ~SoTrd();
private:
//
//! Generate Children. Used to create the hidden children. Required whenever
//! the node has hidden children.
//
void generateChildren();
//
//! Used to modify hidden children when a data field is changed. Required
//! whenever the class has hidden children.
//
void updateChildren();
//
//! ChildList. Required whenever the class has hidden children.
//
SoChildList *children;
};
#endif
@@ -0,0 +1,180 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. *
// * *
// * 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: SoTubs.h,v 1.2 2004/06/14 09:27:38 gcosmo Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
/*-----------------------------Hepvis----------------------------------------*/
/* */
/* Node: SoTubs */
/* Description: Represents the G4Tubs Geant Geometry entity */
/* Author: Joe Boudreau Nov 11 1996 */
/* */
/*---------------------------------------------------------------------------*/
#ifndef HEPVis_SoTubs_h
#define HEPVis_SoTubs_h
#include <Inventor/fields/SoSFFloat.h>
#include <Inventor/fields/SoSFNode.h>
#include <Inventor/fields/SoSFBool.h>
#include <Inventor/nodes/SoShape.h>
class SoSFNode;
//! SoTubs - Inventor version of the G4Tubs Geant Geometry entity
/*!
* Node: SoTubs
*
* Description: The Inventor version of the G4Tubs Geant Geometry entity
*
* Author: Joe Boudreau Nov 11 1996
*
* class G4Tubs
*
* A tube or tube segment with curved sides parallel to
* the z-axis. The tube has a specified half-length along
* the z axis, about which it is centred, and a given
* minimum and maximum radius. A minimum radius of 0
* signifies a filled tube /cylinder. The tube segment is
* specified by starting and delta
* angles for phi, with 0 being the +x axis, PI/2
* the +y axis. A delta angle of 2PI signifies a
* complete, unsegmented tube/cylinder
*
* Always use Inventor Fields. This allows Inventor to detect a change to
* the data field and take the appropriate action; e.g., redraw the scene.
*/
#define SoTubs Geant4_SoTubs
class SoTubs:public SoShape {
// The following is required:
SO_NODE_HEADER(SoTubs);
public:
//
//! Inside radius of the tube
//
SoSFFloat pRMin;
//
//! Outside radius of the tube
//
SoSFFloat pRMax;
//
//! Half-length in Z
//
SoSFFloat pDz;
//
//! Starting angle, in radians
//
SoSFFloat pSPhi;
//
//! Delta-angle, in radians
//
SoSFFloat pDPhi;
//
//! Alternate rep - required
//
SoSFNode alternateRep;
//
//! Constructor, required
//
SoTubs();
//
//! Class Initializer, required
//
static void initClass();
//
//! Generate AlternateRep, required. Generating an alternate representation
//! must be done upon users request. It allows an Inventor program to read
//! back the file without requiring *this* code to be dynamically linked.
//! If the users expects that *this* code will be dynamically linked, he
//! need not invoke this method.
//
virtual void generateAlternateRep();
//
//! We better be able to clear it, too!
//
virtual void clearAlternateRep();
protected:
//
//! compute bounding Box, required
//
virtual void computeBBox(SoAction *action, SbBox3f &box, SbVec3f &center );
//
//! Generate Primitives, required
//
virtual void generatePrimitives(SoAction *action);
//
//! GetChildList, required whenever the class has hidden children
//
virtual SoChildList *getChildren() const;
protected:
//
//! Destructor, required
//
virtual ~SoTubs();
private:
//
//! Generate Children. Used to create the hidden children. Required whenever
//! the node has hidden children.
//
void generateChildren();
//
//! Used to modify hidden children when a data field is changed. Required
//! whenever the class has hidden children.
//
void updateChildren();
//
//! ChildList. Required whenever the class has hidden children.
//
SoChildList *children;
//
//! help with trigonometry. increments sines an cosines by an angle.
//
void inc(double & sinPhi, double & cosPhi, double sinDeltaPhi, double cosDeltaPhi) const {
double oldSin=sinPhi,oldCos=cosPhi;
sinPhi = oldSin*cosDeltaPhi+oldCos*sinDeltaPhi;
cosPhi = oldCos*cosDeltaPhi-oldSin*sinDeltaPhi;
}
};
#endif
@@ -21,23 +21,22 @@
// ********************************************************************
//
//
// $Id: G4OpenInventor.cc,v 1.9 2003/10/29 10:02:06 gcosmo Exp $
// GEANT4 tag $Name: geant4-06-00-patch-01 $
// $Id: G4OpenInventor.cc,v 1.11 2004/06/14 09:27:38 gcosmo Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
#ifdef G4VIS_BUILD_OI_DRIVER
//#include <HEPVis/SoDB.h>
#include <HEPVis/nodes/SoG4Box.h>
#include <HEPVis/nodes/SoG4Tubs.h>
#include <HEPVis/nodes/SoG4Cons.h>
#include <HEPVis/nodes/SoG4Trd.h>
#include <HEPVis/nodes/SoG4Trap.h>
#include <HEPVis/nodekits/SoDetectorTreeKit.h>
// this :
#include "G4OpenInventor.hh"
#include "G4OpenInventorSceneHandler.hh"
#include "G4OpenInventorViewer.hh"
#include "HEPVis/nodes/SoBox.h"
#include "HEPVis/nodes/SoTubs.h"
#include "HEPVis/nodes/SoCons.h"
#include "HEPVis/nodes/SoTrd.h"
#include "HEPVis/nodes/SoTrap.h"
#include "HEPVis/nodekits/SoDetectorTreeKit.h"
#include "G4OpenInventorSceneHandler.hh"
G4OpenInventor::G4OpenInventor (
const G4String name
@@ -64,23 +63,13 @@ G4VSceneHandler* G4OpenInventor::CreateSceneHandler (const G4String& name) {
return p;
}
G4VViewer* G4OpenInventor::CreateViewer (G4VSceneHandler& scene, const G4String& name)
void G4OpenInventor::InitNodes()
{
G4OpenInventorSceneHandler* pScene = (G4OpenInventorSceneHandler*)&scene;
G4OpenInventorViewer* pView = new G4OpenInventorViewer (*pScene, name);
return pView;
}
void G4OpenInventor::InitHEPVis()
{
// The below is too much for most loaders :
// HEPVis_SoDB::init();
SoG4Box::initClass();
SoG4Tubs::initClass();
SoG4Cons::initClass();
SoG4Trd::initClass();
SoG4Trap::initClass();
SoBox::initClass();
SoTubs::initClass();
SoCons::initClass();
SoTrd::initClass();
SoTrap::initClass();
SoDetectorTreeKit::initClass();
}
@@ -21,14 +21,17 @@
// ********************************************************************
//
//
// $Id: G4OpenInventorSceneHandler.cc,v 1.15 2003/10/29 10:01:36 gcosmo Exp $
// GEANT4 tag $Name: geant4-06-00-patch-01 $
// $Id: G4OpenInventorSceneHandler.cc,v 1.17 2004/06/14 09:27:38 gcosmo Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
//
// Jeff Kallenbach 01 Aug 1996
// OpenInventor stored scene - creates OpenInventor display lists.
#ifdef G4VIS_BUILD_OI_DRIVER
// this :
#include "G4OpenInventorSceneHandler.hh"
#include <Inventor/SoPath.h>
#include <Inventor/SoNodeKitPath.h>
#include <Inventor/nodes/SoCoordinate3.h>
@@ -54,18 +57,16 @@
#include <Inventor/nodes/SoTransform.h>
#include <Inventor/nodes/SoResetTransform.h>
#include <HEPVis/nodes/SoG4Box.h>
#include <HEPVis/nodes/SoG4Tubs.h>
#include <HEPVis/nodes/SoG4Cons.h>
#include <HEPVis/nodes/SoG4Trd.h>
#include <HEPVis/nodes/SoG4Trap.h>
#include <HEPVis/nodekits/SoDetectorTreeKit.h>
#include "HEPVis/nodes/SoBox.h"
#include "HEPVis/nodes/SoTubs.h"
#include "HEPVis/nodes/SoCons.h"
#include "HEPVis/nodes/SoTrd.h"
#include "HEPVis/nodes/SoTrap.h"
#include "HEPVis/nodekits/SoDetectorTreeKit.h"
#include "G4Scene.hh"
#include "G4NURBS.hh"
#include "G4OpenInventor.hh"
#include "G4OpenInventorSceneHandler.hh"
#include "G4OpenInventorViewer.hh"
#include "G4OpenInventorTransform3D.hh"
#include "G4ThreeVector.hh"
#include "G4Point3D.hh"
@@ -88,7 +89,7 @@
#include "G4Material.hh"
#include "G4VisAttributes.hh"
typedef SoDetectorTreeKit SoG4DetectorTreeKit;
typedef SoDetectorTreeKit SoDetectorTreeKit;
G4Point3D translation;
G4OpenInventorSceneHandler::G4OpenInventorSceneHandler (G4OpenInventor& system,
@@ -548,7 +549,7 @@ void G4OpenInventorSceneHandler::AddThis (const G4Box & Box) {
}
void G4OpenInventorSceneHandler::AddThis (const G4Tubs & Tubs) {
if(currentSeparator==0) return;
SoG4Tubs *g4Tubs = new SoG4Tubs();
SoTubs *g4Tubs = new SoTubs();
g4Tubs->pRMin = Tubs.GetRMin();
g4Tubs->pRMax = Tubs.GetRMax();
g4Tubs->pDz = Tubs.GetDz();
@@ -558,7 +559,7 @@ void G4OpenInventorSceneHandler::AddThis (const G4Tubs & Tubs) {
}
void G4OpenInventorSceneHandler::AddThis (const G4Cons &cons) {
if(currentSeparator==0) return;
SoG4Cons *g4Cons = new SoG4Cons();
SoCons *g4Cons = new SoCons();
g4Cons->fRmin1 = cons.GetRmin1();
g4Cons->fRmin2 = cons.GetRmin2();
g4Cons->fRmax1 = cons.GetRmax1();
@@ -572,7 +573,7 @@ void G4OpenInventorSceneHandler::AddThis (const G4Cons &cons) {
void G4OpenInventorSceneHandler::AddThis (const G4Trap &trap) {
if(currentSeparator==0) return;
G4ThreeVector SymAxis=trap.GetSymAxis();
SoG4Trap *g4Trap = new SoG4Trap();
SoTrap *g4Trap = new SoTrap();
g4Trap->pDz = trap.GetZHalfLength();
g4Trap->pPhi = atan2(SymAxis(kYAxis),SymAxis(kXAxis));
g4Trap->pTheta = acos(SymAxis(kZAxis));
@@ -587,7 +588,7 @@ void G4OpenInventorSceneHandler::AddThis (const G4Trap &trap) {
void G4OpenInventorSceneHandler::AddThis (const G4Trd &trd) {
if(currentSeparator==0) return;
SoG4Trd *g4Trd = new SoG4Trd();
SoTrd *g4Trd = new SoTrd();
g4Trd->fDx1 = trd.GetXHalfLength1();
g4Trd->fDx2 = trd.GetXHalfLength2();
g4Trd->fDy1 = trd.GetYHalfLength1();
@@ -650,7 +651,7 @@ void G4OpenInventorSceneHandler::PreAddThis
//
// Make the detector tree kit:
//
SoG4DetectorTreeKit* g4DetectorTreeKit = new SoG4DetectorTreeKit();
SoDetectorTreeKit* g4DetectorTreeKit = new SoDetectorTreeKit();
SoSeparator* previewSeparator =
(SoSeparator*) g4DetectorTreeKit->getPart("previewSeparator",TRUE);
@@ -21,8 +21,8 @@
// ********************************************************************
//
//
// $Id: G4OpenInventorTransform3D.cc,v 1.4 2001/07/11 10:09:01 gunter Exp $
// GEANT4 tag $Name: geant4-05-02-patch-01 $
// $Id: G4OpenInventorTransform3D.cc,v 1.5 2004/04/08 09:41:11 gbarrand Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
//
// jck 17 Dec 1996
@@ -31,10 +31,11 @@
#ifdef G4VIS_BUILD_OI_DRIVER
#include <Inventor/fields/SoSFMatrix.h>
// this :
#include "G4OpenInventorTransform3D.hh"
#include <Inventor/fields/SoSFMatrix.h>
G4OpenInventorTransform3D::G4OpenInventorTransform3D (const G4Transform3D &t)
: G4Transform3D (t) {
m[0] = xx;
@@ -21,36 +21,42 @@
// ********************************************************************
//
//
// $Id: G4OpenInventorWin32.cc,v 1.5 2001/07/11 10:09:01 gunter Exp $
// GEANT4 tag $Name: geant4-05-02-patch-01 $
// $Id: G4OpenInventorWin.cc,v 1.4 2004/04/08 10:49:57 gbarrand Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
// OpenInventor graphics system factory.
#ifdef G4VIS_BUILD_OIWIN32_DRIVER
#include <Inventor/Xt/SoXt.h>
// this :
#include "G4OpenInventorWin.hh"
#include "G4OpenInventorWin32.hh"
#include <Inventor/Win/SoWin.h>
#include "G4OpenInventorSceneHandler.hh"
#include "G4OpenInventorViewer.hh"
#include "G4OpenInventorWinViewer.hh"
#include "G4Win32.hh"
G4OpenInventorWin32::G4OpenInventorWin32 ()
:G4OpenInventor("OpenInventorWin32","OIWIN32",G4VGraphicsSystem::threeD)
G4OpenInventorWin::G4OpenInventorWin ()
:G4OpenInventor("OpenInventorWin","OIWin32",G4VGraphicsSystem::threeD)
{
SetInteractorManager (G4Win32::getInstance());
GetInteractorManager () -> RemoveDispatcher((G4DispatchFunction)G4Win32::dispatchWin32Event);
GetInteractorManager () -> AddDispatcher ((G4DispatchFunction)SoXt::dispatchEvent);
GetInteractorManager () -> AddDispatcher((G4DispatchFunction)SoWin::dispatchEvent);
Widget toplevel = (Widget)GetInteractorManager()->GetMainInteractor();
HWND toplevel = (HWND)GetInteractorManager()->GetMainInteractor();
SoXt::init(toplevel);
SoWin::init(toplevel);
InitHEPVis();
InitNodes();
}
G4OpenInventorWin::~G4OpenInventorWin () {}
G4VViewer* G4OpenInventorWin::CreateViewer (G4VSceneHandler& scene, const G4String& name)
{
G4OpenInventorSceneHandler* pScene = (G4OpenInventorSceneHandler*)&scene;
return new G4OpenInventorWinViewer (*pScene, name);
}
G4OpenInventorWin32::~G4OpenInventorWin32 () {}
#endif
@@ -0,0 +1,271 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. *
// * *
// * 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: G4OpenInventorWinViewer.cc,v 1.2 2004/04/08 10:49:57 gbarrand Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
/*
* jck 05 Feb 1997 - Initial Implementation
* jck 21 Apr 1997
* Mods for SoXtHepViewer
* gb : on Win32 use an SoXtExaminerViewer.
* gb 05 April 2004 : creation.
*/
#ifdef G4VIS_BUILD_OIWIN32_DRIVER
// this :
#include "G4OpenInventorWinViewer.hh"
#include <Inventor/nodes/SoSelection.h>
#include <Inventor/Win/SoWin.h>
#include <Inventor/Win/viewers/SoWinExaminerViewer.h>
#include "G4OpenInventor.hh"
#include "G4OpenInventorSceneHandler.hh"
#include "G4VInteractorManager.hh"
#include <windowsx.h>
//
// Global variables
//
//static void SecondaryLoopPostAction ();
static LRESULT CALLBACK WindowProc (HWND,UINT,WPARAM,LPARAM);
static const char className[] = "G4OpenInventorShellWindow";
void G4OpenInventorWinViewer::FinishView () {
if(!fViewer) return;
fViewer->viewAll();
fViewer->saveHomePosition();
}
void G4OpenInventorWinViewer::KernelVisitDecision () {
// If there's a significant difference with the last view parameters
// of either the scene handler or this viewer, trigger a rebuild.
if (
//??fG4OpenInventorSceneHandler.fPODLList.size() == 0 ||
// We need a test for empty scene graph, such as
// staticRoot.size() or something?????????? See temporary fix
// in contructor. (John Allison Aug 2001)
CompareForKernelVisit(fG4OpenInventorSceneHandler.fLastVP) ||
CompareForKernelVisit(fLastVP)) {
NeedKernelVisit ();
}
fLastVP = fVP;
fG4OpenInventorSceneHandler.fLastVP = fVP;
}
G4bool G4OpenInventorWinViewer::CompareForKernelVisit
(G4ViewParameters&) {
if (
(fLastVP.GetDrawingStyle () != fVP.GetDrawingStyle ()) ||
(fLastVP.GetRepStyle () != fVP.GetRepStyle ()) ||
(fLastVP.IsCulling () != fVP.IsCulling ()) ||
(fLastVP.IsCullingInvisible () != fVP.IsCullingInvisible ()) ||
(fLastVP.IsDensityCulling () != fVP.IsDensityCulling ()) ||
(fLastVP.IsCullingCovered () != fVP.IsCullingCovered ()) ||
(fLastVP.IsSection () != fVP.IsSection ()) ||
// No need to visit kernel if section plane changes.
(fLastVP.IsCutaway () != fVP.IsCutaway ()) ||
(fLastVP.GetCutawayPlanes ().size () !=
fVP.GetCutawayPlanes ().size ()) ||
// No need to visit kernel if cutaway planes change.
(fLastVP.IsExplode () != fVP.IsExplode ()) ||
(fLastVP.GetNoOfSides () != fVP.GetNoOfSides ())
) {
return true;;
}
if (fLastVP.IsDensityCulling () &&
(fLastVP.GetVisibleDensity () != fVP.GetVisibleDensity ()))
return true;
if (fLastVP.IsExplode () &&
(fLastVP.GetExplodeFactor () != fVP.GetExplodeFactor ()))
return true;
return false;
}
G4OpenInventorWinViewer::G4OpenInventorWinViewer
(G4OpenInventorSceneHandler& sceneHandler,
const G4String& name)
:G4VViewer (sceneHandler, sceneHandler.IncrementViewCount(), name)
,fG4OpenInventorSceneHandler(sceneHandler)
,fShell(0)
,fViewer(0)
,fSelection(0)
,fInteractorManager(0)
{
fNeedKernelVisit = true; //?? Temporary, until KernelVisitDecision fixed.
fInteractorManager =
((G4OpenInventor*)fG4OpenInventorSceneHandler.GetGraphicsSystem())->
GetInteractorManager();
//Widget toplevel = (Widget)fInteractorManager->GetMainInteractor ();
//fInteractorManager->
//AddSecondaryLoopPostAction((G4SecondaryLoopAction)SecondaryLoopPostAction);
G4cout << "Window name: " << fName << G4endl;
//
// Selection
//
fSelection = new SoSelection;
fSelection->policy = SoSelection::SINGLE;
fSelection->ref();
fSelection->addChild(fG4OpenInventorSceneHandler.root);
G4String wName = fName;
#define SIZE 400
HWND parent = (HWND)fInteractorManager->GetParentInteractor ();
if(!parent) {
//Create a shell window :
G4String shellName = wName;
shellName += "_shell";
static SbBool done = FALSE;
if(done==FALSE) {
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = ::GetModuleHandle(0);
wc.hIcon = ::LoadIcon(0, IDI_APPLICATION);
wc.hCursor = ::LoadCursor(0, IDC_ARROW);
wc.hbrBackground = 0;
wc.lpszMenuName = className;
wc.lpszClassName = className;
::RegisterClass(&wc);
done = TRUE;
}
// Compell window to be created at 0,0 to bypass
// the 'black border' problem.
fShell = ::CreateWindow(className, shellName.c_str(),
WS_OVERLAPPEDWINDOW,
//CW_USEDEFAULT, CW_USEDEFAULT,
0,0,400,400,0, 0,::GetModuleHandle(0),0);
// Retreive window and client sizez :
RECT wrect,crect;
GetWindowRect((HWND)fShell,&wrect);
GetClientRect((HWND)fShell,&crect);
int ww = wrect.right-wrect.left;
int wh = wrect.bottom-wrect.top;
int cw = crect.right-crect.left;
int ch = crect.bottom-crect.top;
// Compell client rect to be 400 400 :
MoveWindow((HWND)fShell,wrect.left,wrect.top,400+ww-cw,400+wh-ch,TRUE);
::SetWindowLong((HWND)fShell,GWL_USERDATA,LONG(this));
::SetWindowText((HWND)fShell,shellName.c_str());
parent = fShell;
fInteractorManager->AddShell(fShell);
} else {
char* str = fInteractorManager->GetCreationString();
if(str!=0) wName = str;
}
fViewer = new SoWinExaminerViewer(parent,wName.c_str(),TRUE);
fViewer->setSize(SbVec2s(SIZE,SIZE));
fViewer->setSceneGraph(fSelection);
fViewer->viewAll();
fViewer->saveHomePosition();
fViewer->setTitle(fName);
fViewer->show();
if(fShell) {
SoWin::show(fShell);
fInteractorManager->FlushAndWaitExecution ();
}
fInteractorManager->SetCreatedInteractor (fViewer -> getWidget());
}
G4OpenInventorWinViewer::~G4OpenInventorWinViewer () {
if(fShell) fInteractorManager->RemoveShell(fShell);
if(fViewer) delete fViewer;
if(fShell) {
::SetWindowLong((HWND)fShell,GWL_USERDATA,LONG(0));
::DestroyWindow((HWND)fShell);
}
if(fSelection) fSelection->unref();
}
void G4OpenInventorWinViewer::ClearView () {
}
void G4OpenInventorWinViewer::SetView () {
}
void G4OpenInventorWinViewer::DrawView () {
G4cout << "debug Iv::DrawViewer " <<G4endl;
KernelVisitDecision();
ProcessView();
FinishView();
}
void G4OpenInventorWinViewer::ShowView () {
fInteractorManager -> SecondaryLoop ();
}
//////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WindowProc (
HWND aWindow
,UINT aMessage
,WPARAM aWParam
,LPARAM aLParam
)
//////////////////////////////////////////////////////////////////////////////
// Below treatment of WM_SIZE, WM_SETFOCUS not necessary
// with TGS, but needed with SoFree. WM_DESTROY needed for
// 'main top level window' so that 'Close window' induces
// the end of the task.
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
{
switch (aMessage) {
case WM_SIZE:{ // Assume one child window !
int width = LOWORD(aLParam);
int height = HIWORD(aLParam);
//printf("debug : G4SoWindow : WMS_SIZE : %d %d\n",width,height);
HWND hwnd = ::GetFirstChild(aWindow);
if(hwnd!=0) {
::MoveWindow(hwnd,0,0,width,height,TRUE);
}
}return 0;
case WM_SETFOCUS:{ // Assume one child window !
HWND hwnd = ::GetFirstChild(aWindow);
if(hwnd!=0) ::SetFocus(hwnd);
}return 0;
case WM_DESTROY:{
//G4OpenInventorWinViewer* This =
// (G4OpenInventorWinViewer*)::GetWindowLong(aWindow,GWL_USERDATA);
//::PostQuitMessage(0);
}return 0;
default:
return (::DefWindowProc(aWindow,aMessage,aWParam,aLParam));
}
}
#endif
@@ -21,8 +21,8 @@
// ********************************************************************
//
//
// $Id: G4OpenInventorX.cc,v 1.5 2001/07/11 10:09:01 gunter Exp $
// GEANT4 tag $Name: geant4-05-02-patch-01 $
// $Id: G4OpenInventorXt.cc,v 1.1 2004/04/08 09:41:11 gbarrand Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
//
// Jeff Kallenbach 01 Aug 1996
@@ -30,16 +30,17 @@
#ifdef G4VIS_BUILD_OIX_DRIVER
// this :
#include "G4OpenInventorXt.hh"
#include <Inventor/Xt/SoXt.h>
#include "G4OpenInventorX.hh"
#include "G4OpenInventorSceneHandler.hh"
#include "G4OpenInventorViewer.hh"
#include "G4Xt.hh"
#include "G4OpenInventorSceneHandler.hh"
#include "G4OpenInventorXtViewer.hh"
G4OpenInventorX::G4OpenInventorX ()
:G4OpenInventor("OpenInventorX","OIX",G4VGraphicsSystem::threeD)
G4OpenInventorXt::G4OpenInventorXt ()
:G4OpenInventor("OpenInventorXt","OIX",G4VGraphicsSystem::threeD)
{
SetInteractorManager (G4Xt::getInstance ());
GetInteractorManager () ->
@@ -48,12 +49,17 @@ G4OpenInventorX::G4OpenInventorX ()
AddDispatcher ((G4DispatchFunction)SoXt::dispatchEvent);
Widget toplevel = (Widget)GetInteractorManager()->GetMainInteractor();
SoXt::init(toplevel);
SoXt::init (toplevel);
InitHEPVis();
InitNodes();
}
G4OpenInventorXt::~G4OpenInventorXt () {}
G4VViewer* G4OpenInventorXt::CreateViewer (G4VSceneHandler& scene, const G4String& name)
{
G4OpenInventorSceneHandler* pScene = (G4OpenInventorSceneHandler*)&scene;
return new G4OpenInventorXtViewer (*pScene, name);
}
G4OpenInventorX::~G4OpenInventorX () {}
#endif
@@ -21,33 +21,29 @@
// ********************************************************************
//
//
// $Id: G4OpenInventorViewer.cc,v 1.10 2003/08/28 11:44:22 gcosmo Exp $
// GEANT4 tag $Name: geant4-06-00-patch-01 $
// $Id: G4OpenInventorXtViewer.cc,v 1.1 2004/04/08 09:41:11 gbarrand Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
/*
* jck 05 Feb 1997 - Initial Implementation
* jck 21 Apr 1997
* Mods for SoXtHepViewer
* gb : on Win32 use an SoXtExaminerViewer.
* gb 05 April 2004 : revisit to separate Windows things.
*/
#ifdef G4VIS_BUILD_OI_DRIVER
#ifdef G4VIS_BUILD_OIX_DRIVER
// this :
#include "G4OpenInventorXtViewer.hh"
#include <Inventor/nodes/SoSelection.h>
#include <Inventor/Xt/SoXt.h>
#include <Inventor/nodes/SoSelection.h>
#include <Inventor/nodes/SoSelection.h>
#include "G4SoWindow.hh"
#ifdef WIN32
#include <Inventor/Xt/viewers/SoXtExaminerViewer.h>
#else
#include <HEPVis/Xt/viewers/SoXtHepViewer.h>
#endif
#include <X11/StringDefs.h>
#include "G4OpenInventor.hh"
#include "G4OpenInventorViewer.hh"
#include "G4OpenInventorSceneHandler.hh"
#include "G4VInteractorManager.hh"
//
@@ -56,24 +52,10 @@
//static void SecondaryLoopPostAction ();
void G4OpenInventorViewer::FinishView () {
if(fViewer==0) return;
#ifdef WIN32
((SoXtViewer*)fViewer)->viewAll();
((SoXtViewer*)fViewer)->saveHomePosition();
#else
((SoXtHepViewer*)fViewer)->getCurrentViewer()->viewAll();
((SoXtHepViewer*)fViewer)->getCurrentViewer()->saveHomePosition();
#endif
}
//
// Exit
//
int quitCB(void* interactorManager) {
((G4VInteractorManager*)interactorManager) ->
RequireExitSecondaryLoop (OIV_EXIT_CODE);
return 0;
void G4OpenInventorXtViewer::FinishView () {
if(!fViewer) return;
fViewer->viewAll();
fViewer->saveHomePosition();
}
//static void SecondaryLoopPostAction ()
@@ -85,7 +67,7 @@ int quitCB(void* interactorManager) {
// }
//}
void G4OpenInventorViewer::KernelVisitDecision () {
void G4OpenInventorXtViewer::KernelVisitDecision () {
// If there's a significant difference with the last view parameters
// of either the scene handler or this viewer, trigger a rebuild.
@@ -103,7 +85,7 @@ void G4OpenInventorViewer::KernelVisitDecision () {
fG4OpenInventorSceneHandler.fLastVP = fVP;
}
G4bool G4OpenInventorViewer::CompareForKernelVisit
G4bool G4OpenInventorXtViewer::CompareForKernelVisit
(G4ViewParameters&) {
if (
@@ -135,13 +117,12 @@ G4bool G4OpenInventorViewer::CompareForKernelVisit
return false;
}
G4OpenInventorViewer::G4OpenInventorViewer
G4OpenInventorXtViewer::G4OpenInventorXtViewer
(G4OpenInventorSceneHandler& sceneHandler,
const G4String& name)
:G4VViewer (sceneHandler, sceneHandler.IncrementViewCount(), name)
,fG4OpenInventorSceneHandler(sceneHandler)
,fShell(0)
,fWindow(0)
,fViewer(0)
,fSelection(0)
,fInteractorManager(0)
@@ -151,10 +132,10 @@ G4OpenInventorViewer::G4OpenInventorViewer
fInteractorManager =
((G4OpenInventor*)fG4OpenInventorSceneHandler.GetGraphicsSystem())->
GetInteractorManager();
//Widget toplevel = (Widget)fInteractorManager->GetMainInteractor ();
//Widget toplevel = (Widget)fInteractorManager->GetMainInteractor ();
//fInteractorManager->
//AddSecondaryLoopPostAction ((G4SecondaryLoopAction)SecondaryLoopPostAction);
//fInteractorManager->
//AddSecondaryLoopPostAction((G4SecondaryLoopAction)SecondaryLoopPostAction);
G4cout << "Window name: " << fName << G4endl;
//
@@ -165,78 +146,68 @@ G4OpenInventorViewer::G4OpenInventorViewer
fSelection->ref();
fSelection->addChild(fG4OpenInventorSceneHandler.root);
Widget parent = (Widget)fInteractorManager->GetParentInteractor ();
G4String wName = fName;
const char* wname = wName.data();
#define SIZE 400
if(parent==0) { //Create a shell window :
fWindow = new G4SoWindow(wname);
fWindow->setTitle(wname);
fWindow->setSize(SbVec2s(SIZE,SIZE));
fShell = parent = fWindow->getWidget();
Widget parent = (Widget)fInteractorManager->GetParentInteractor ();
if(!parent) {
//Create a shell window :
G4String shellName = wName;
shellName += "_shell";
Arg args[3];
char s[32];
sprintf(s,"%dx%d",SIZE,SIZE);
XtSetArg(args[0],XtNgeometry,XtNewString(s));
XtSetArg(args[1],XtNborderWidth,0);
XtSetArg(args[2],XtNtitle,XtNewString(wName.c_str()));
fShell = XtAppCreateShell(shellName.c_str(),"Inventor",
topLevelShellWidgetClass,
SoXt::getDisplay(),
args,3);
parent = fShell;
fInteractorManager->AddShell(fShell);
} else {
char* str = fInteractorManager->GetCreationString ();
if(str!=0) wname = str;
char* str = fInteractorManager->GetCreationString();
if(str!=0) wName = str;
}
//
// Create and Customize the Viewer
//
#ifdef WIN32
fViewer = new SoXtExaminerViewer(parent,wname,TRUE);
fViewer = new SoXtExaminerViewer(parent,wName.c_str(),TRUE);
fViewer->setSize(SbVec2s(SIZE,SIZE));
((SoXtViewer*)fViewer)->setSceneGraph(fSelection);
((SoXtViewer*)fViewer)->viewAll();
((SoXtViewer*)fViewer)->saveHomePosition();
#else
fViewer = new SoXtHepViewer (parent,wname,TRUE);
((SoXtHepViewer*)fViewer)->hideTextArea();
((SoXtHepViewer*)fViewer)->resizeMain(SIZE,SIZE);
((SoXtHepViewer*)fViewer)->setQuitCallback(quitCB, fInteractorManager);
((SoXtHepViewer*)fViewer)->setSceneGraph(fSelection);
((SoXtHepViewer*)fViewer)->getCurrentViewer()->viewAll();
((SoXtHepViewer*)fViewer)->getCurrentViewer()->saveHomePosition();
#endif
fViewer->setSceneGraph(fSelection);
fViewer->viewAll();
fViewer->saveHomePosition();
fViewer->setTitle(fName);
fViewer->show();
if(fWindow!=0) {
fWindow->show();
if(fShell) {
SoXt::show(fShell);
fInteractorManager->FlushAndWaitExecution ();
}
fInteractorManager->SetCreatedInteractor (fViewer -> getWidget());
}
G4OpenInventorViewer::~G4OpenInventorViewer () {
if(fShell!=0) fInteractorManager -> RemoveShell (fShell);
if(fViewer!=0) {
#ifdef WIN32
delete ((SoXtExaminerViewer*)fViewer);
#else
delete ((SoXtHepViewer*)fViewer);
#endif
}
if(fWindow!=0) delete fWindow;
if(fSelection!=0) fSelection->unref();
G4OpenInventorXtViewer::~G4OpenInventorXtViewer () {
if(fShell) fInteractorManager->RemoveShell(fShell);
if(fViewer) delete fViewer;
if(fShell) XtDestroyWidget(fShell);
if(fSelection) fSelection->unref();
}
void G4OpenInventorViewer::ClearView () {
void G4OpenInventorXtViewer::ClearView () {
}
void G4OpenInventorViewer::SetView () {
void G4OpenInventorXtViewer::SetView () {
}
void G4OpenInventorViewer::DrawView () {
void G4OpenInventorXtViewer::DrawView () {
G4cout << "debug Iv::DrawViewer " <<G4endl;
KernelVisitDecision ();
ProcessView ();
FinishView ();
KernelVisitDecision();
ProcessView();
FinishView();
}
void G4OpenInventorViewer::ShowView () {
void G4OpenInventorXtViewer::ShowView () {
fInteractorManager -> SecondaryLoop ();
}
@@ -1,403 +0,0 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. *
// * *
// * 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. *
// ********************************************************************
//
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define SbWarn printf
#include <HEPVis/SbBasic.h>
// For backward compatibility :
#ifdef HEPVisWin
#define HEPVisWin32
#endif
#ifdef CDF
#ifndef LINUX
#define u_long unsigned long
#endif
#endif
#ifdef HEPVisXt
#include <X11/Intrinsic.h>
#include <X11/Shell.h>
#include <X11/StringDefs.h>
#include <X11/IntrinsicP.h>
#endif
#ifdef HEPVisWin32
#include <windowsx.h> //For GetWindowInstance.
#endif
#include <Inventor/SbString.h>
#include <Inventor/SbDict.h>
#include "G4SoWindow.hh"
#ifdef HEPVisXt
static XtTranslations trans_table = 0;
static XtActionsRec closeAction =
{(String)"CloseG4SoWindow",G4SoWindow::closeWindow};
//static void XWidgetSetDimension(Widget,Dimension,Dimension);
#endif
#ifdef HEPVisWin32
static LRESULT CALLBACK WindowProc (HWND,UINT,WPARAM,LPARAM);
static const char className[] = "G4SoWindow";
#endif
SbDict* G4SoWindow::fWidgetDictionary = 0;
//////////////////////////////////////////////////////////////////////////////
void G4SoWindow::clearClass (
)
//////////////////////////////////////////////////////////////////////////////
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
{
if(fWidgetDictionary!=0) delete fWidgetDictionary;
fWidgetDictionary = 0;
}
//////////////////////////////////////////////////////////////////////////////
G4SoWindow::G4SoWindow(
const char* aName
,SbBool aWMClose
)
:fWidget(0)
,fWMClose(aWMClose)
//////////////////////////////////////////////////////////////////////////////
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
{
#ifdef HEPVisXt
if(trans_table==0) {
trans_table =
XtParseTranslationTable("<Message>WM_PROTOCOLS:CloseG4SoWindow()");
XtAppAddActions(SoXt::getAppContext(),&closeAction,1);
}
SbString shellName = aName;
shellName += "_shell";
Arg args[2];
XtSetArg(args[0],XtNgeometry,XtNewString("400x400"));
XtSetArg(args[1],XtNborderWidth,0);
fWidget = XtAppCreateShell(shellName.getString(),"Inventor",
topLevelShellWidgetClass,
SoXt::getDisplay(),
args,2);
if(fWidget!=0) {
XtOverrideTranslations(fWidget,trans_table);
XtAddCallback(fWidget,XtNdestroyCallback,
(XtCallbackProc)G4SoWindow::widgetDestroyedCB,0);
}
#endif
#ifdef HEPVisWin32
static SbBool done = FALSE;
if(done==FALSE) {
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = ::GetModuleHandle(0);
wc.hIcon = ::LoadIcon(0, IDI_APPLICATION);
wc.hCursor = ::LoadCursor(0, IDC_ARROW);
wc.hbrBackground = 0;
wc.lpszMenuName = className;
wc.lpszClassName = className;
::RegisterClass(&wc);
done = TRUE;
}
// Compell window to be created at 0,0 to bypass
// the 'black border' problem.
fWidget = ::CreateWindow(className, aName,
WS_OVERLAPPEDWINDOW,
//CW_USEDEFAULT, CW_USEDEFAULT,
0,0,
400,400,
0, 0,
::GetModuleHandle(0),
0);
// Retreive window and client sizez :
RECT wrect,crect;
GetWindowRect((HWND)fWidget,&wrect);
GetClientRect((HWND)fWidget,&crect);
int ww = wrect.right-wrect.left;
int wh = wrect.bottom-wrect.top;
int cw = crect.right-crect.left;
int ch = crect.bottom-crect.top;
// Compell client rect to be 400 400 :
MoveWindow((HWND)fWidget,wrect.left,wrect.top,400+ww-cw,400+wh-ch,TRUE);
//
::SetWindowLong((HWND)fWidget,GWL_USERDATA,LONG(this));
#endif
registerWidget(fWidget);
}
//////////////////////////////////////////////////////////////////////////////
G4SoWindow::~G4SoWindow(
)
//////////////////////////////////////////////////////////////////////////////
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
{
if(fWidget==0) return;
unregisterWidget(fWidget);
#ifdef HEPVisXt
XtDestroyWidget(fWidget);
#endif
#ifdef HEPVisWin32
::SetWindowLong((HWND)fWidget,GWL_USERDATA,LONG(0));
::DestroyWindow((HWND)fWidget);
#endif
}
//////////////////////////////////////////////////////////////////////////////
Widget G4SoWindow::getWidget(
) const
//////////////////////////////////////////////////////////////////////////////
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
{
return fWidget;
}
//////////////////////////////////////////////////////////////////////////////
void G4SoWindow::setWMClose(
SbBool aValue
)
//////////////////////////////////////////////////////////////////////////////
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
{
fWMClose = aValue;
}
//////////////////////////////////////////////////////////////////////////////
SbBool G4SoWindow::getWMClose(
) const
//////////////////////////////////////////////////////////////////////////////
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
{
return fWMClose;
}
//////////////////////////////////////////////////////////////////////////////
void G4SoWindow::show(
)
//////////////////////////////////////////////////////////////////////////////
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
{
if(fWidget==0) return;
SoXt::show(fWidget);
}
//////////////////////////////////////////////////////////////////////////////
void G4SoWindow::hide(
)
//////////////////////////////////////////////////////////////////////////////
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
{
if(fWidget==0) return;
SoXt::hide(fWidget);
}
//////////////////////////////////////////////////////////////////////////////
void G4SoWindow::setTitle(
const char* aString
)
//////////////////////////////////////////////////////////////////////////////
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
{
if(aString==0) return;
#ifdef HEPVisXt
Arg args[1];
XtSetArg(args[0],XtNtitle,XtNewString(aString));
XtSetValues(fWidget,args,1);
#endif
#ifdef HEPVisWin32
::SetWindowText((HWND)fWidget,aString);
#endif
}
//////////////////////////////////////////////////////////////////////////////
void G4SoWindow::setSize(
const SbVec2s& aSize
)
//////////////////////////////////////////////////////////////////////////////
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
{
if(fWidget==0) return;
#ifdef HEPVisXt
Arg args[1];
char s[32];
sprintf(s,"%dx%d",aSize[0],aSize[1]);
XtSetArg(args[0],XtNgeometry,XtNewString(s));
XtSetValues(fWidget,args,1);
//XWidgetSetDimension(fWidget,aSize[0],aSize[1]);
#endif
#ifdef HEPVisWin32
// Retreive window and client sizez :
RECT wrect,crect;
GetWindowRect((HWND)fWidget,&wrect);
GetClientRect((HWND)fWidget,&crect);
int ww = wrect.right-wrect.left;
int wh = wrect.bottom-wrect.top;
int cw = crect.right-crect.left;
int ch = crect.bottom-crect.top;
// Compell client rect to be 400 400 :
MoveWindow((HWND)fWidget,
wrect.left,wrect.top,
aSize[0]+ww-cw,aSize[1]+wh-ch,TRUE);
#endif
}
//////////////////////////////////////////////////////////////////////////////
SbVec2s G4SoWindow::getSize(
)
//////////////////////////////////////////////////////////////////////////////
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
{
if(fWidget==0) return SbVec2s();
#ifdef HEPVisXt
Dimension width,height;
Arg args[2];
XtSetArg(args[0],XtNwidth ,&width);
XtSetArg(args[1],XtNheight,&height);
XtGetValues(fWidget,args,2);
return SbVec2s(width,height);
#endif
#ifdef HEPVisWin32
RECT rect;
::GetClientRect((HWND)fWidget,&rect);
return SbVec2s((short)(rect.right-rect.left),(short)(rect.bottom-rect.top));
#endif
}
//////////////////////////////////////////////////////////////////////////////
void G4SoWindow::registerWidget(
Widget aWidget
)
//////////////////////////////////////////////////////////////////////////////
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
{
if(aWidget==0) return;
if(fWidgetDictionary==0) fWidgetDictionary = new SbDict;
fWidgetDictionary->enter((unsigned long)aWidget,this);
}
//////////////////////////////////////////////////////////////////////////////
void G4SoWindow::unregisterWidget(
Widget aWidget
)
//////////////////////////////////////////////////////////////////////////////
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
{
if(aWidget==0) return;
if(fWidgetDictionary==0) return;
fWidgetDictionary->remove((unsigned long)aWidget);
}
//////////////////////////////////////////////////////////////////////////////
G4SoWindow* G4SoWindow::getWindow(
Widget aWidget
)
//////////////////////////////////////////////////////////////////////////////
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
{
if(aWidget==0) return 0;
if(fWidgetDictionary==0) return 0;
void* value;
SbBool found = fWidgetDictionary->find((unsigned long)aWidget,value);
return (G4SoWindow*)(found==FALSE ? 0 : value);
}
#ifdef HEPVisXt
//////////////////////////////////////////////////////////////////////////////
void G4SoWindow::widgetDestroyedCB(
Widget aWidget
,XtPointer
,XtPointer
)
//////////////////////////////////////////////////////////////////////////////
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
{
G4SoWindow* This = G4SoWindow::getWindow(aWidget);
if(This==0) return; // XtDestroyWidget called from ~G4SoWindow.
//printf("debug : G4SoWindow::widgetDestroyCB\n");
This->unregisterWidget(aWidget);
}
//////////////////////////////////////////////////////////////////////////////
void G4SoWindow::closeWindow(
Widget aWidget
,XEvent* /*aEvent*/
,char** /*aArgs*/
,Cardinal* /*aNarg*/
)
//////////////////////////////////////////////////////////////////////////////
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
{
G4SoWindow* This = G4SoWindow::getWindow(aWidget);
if( (This!=0) && (This->getWMClose()==TRUE) ) {
//SbWarn ("debug : CloseWindow : close\n");
#ifdef SoFreePackage
SoXt::sendExit ();
#else
exit (EXIT_SUCCESS);
#endif
} else {
// Should destroy G4SoWindow.
XtUnmapWidget(aWidget);
}
}
/*
#include <X11/IntrinsicP.h> //Dangerous.
void XWidgetSetDimension(Widget aWidget,Dimension a_width,Dimension a_height){
if(aWidget==0) return;
if((a_width<=0)||(a_height<=0)) return;
XtResizeWidget (aWidget,a_width,a_height,aWidget->core.border_width);
}
*/
#endif
#ifdef HEPVisWin32
//////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WindowProc (
HWND aWindow
,UINT aMessage
,WPARAM aWParam
,LPARAM aLParam
)
//////////////////////////////////////////////////////////////////////////////
// Below treatment of WM_SIZE, WM_SETFOCUS not necessary
// with TGS, but needed with SoFree. WM_DESTROY needed for
// 'main top level window' so that 'Close window' induces
// the end of the task.
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
{
switch (aMessage) {
case WM_SIZE:{ // Assume one child window !
int width = LOWORD(aLParam);
int height = HIWORD(aLParam);
//printf("debug : G4SoWindow : WMS_SIZE : %d %d\n",width,height);
HWND hwnd = ::GetFirstChild(aWindow);
if(hwnd!=0) {
::MoveWindow(hwnd,0,0,width,height,TRUE);
}
}return 0;
case WM_SETFOCUS:{ // Assume one child window !
HWND hwnd = ::GetFirstChild(aWindow);
if(hwnd!=0) ::SetFocus(hwnd);
}return 0;
case WM_DESTROY:{
G4SoWindow* This = (G4SoWindow*)::GetWindowLong(aWindow,GWL_USERDATA);
if( (This!=0) && (This->getWMClose()==TRUE) ) {
::PostQuitMessage(0);
}
}return 0;
default:
return (::DefWindowProc(aWindow,aMessage,aWParam,aLParam));
}
}
#endif
@@ -0,0 +1,273 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. *
// * *
// * 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: SoBox.cc,v 1.2 2004/06/14 09:27:39 gcosmo Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
/*----------------------------Hepvis----------------------------------------*/
/* */
/* Node: SoBox */
/* Description: Represents the G4Box Geant Geometry entity */
/* Author: Joe Boudreau Nov 11 1996 */
/* */
/*--------------------------------------------------------------------------*/
#include <assert.h>
#include <math.h>
#include <Inventor/SbBox.h>
#include <Inventor/fields/SoSFFloat.h>
#include <Inventor/misc/SoChildList.h>
#include <Inventor/nodes/SoSeparator.h>
#include <Inventor/nodes/SoCube.h>
#include <Inventor/nodes/SoScale.h>
#include <Inventor/actions/SoAction.h>
#include <Inventor/nodes/SoIndexedFaceSet.h>
#include <Inventor/SoPrimitiveVertex.h>
#include <Inventor/elements/SoTextureCoordinateElement.h>
#include "HEPVis/nodes/SoBox.h"
// This statement is required
SO_NODE_SOURCE(SoBox)
// Constructor
SoBox::SoBox() {
// This statement is required
SO_NODE_CONSTRUCTOR(SoBox);
// Data fields are initialized like this:
SO_NODE_ADD_FIELD(fDx, (1.0));
SO_NODE_ADD_FIELD(fDy, (1.0));
SO_NODE_ADD_FIELD(fDz, (1.0));
SO_NODE_ADD_FIELD(alternateRep, (NULL));
children = new SoChildList(this);
}
// Destructor
SoBox::~SoBox() {
delete children;
}
// initClass
void SoBox::initClass(){
// This statement is required.
SO_NODE_INIT_CLASS(SoBox,SoShape,"Shape");
}
// generatePrimitives
void SoBox::generatePrimitives(SoAction *action) {
// This variable is used to store each vertex
SoPrimitiveVertex pv;
// Access the stat from the action
SoState *state = action->getState();
// See if we have to use a texture coordinate function,
// rather than generating explicit texture coordinates.
SbBool useTexFunction=
(SoTextureCoordinateElement::getType(state) ==
SoTextureCoordinateElement::FUNCTION);
// If we need to generate texture coordinates with a function,
// we'll need an SoGLTextureCoordinateElement. Otherwise, we'll
// set up the coordinates directly.
const SoTextureCoordinateElement *tce = NULL;
SbVec4f texCoord;
if (useTexFunction) {
tce = SoTextureCoordinateElement::getInstance(state);
}
else {
texCoord[2] = 0.0;
texCoord[3] = 1.0;
}
SbVec3f point, normal;
//////////////////////////////////////////
//----------------------------------------
#define GEN_VERTEX(pv,x,y,z,s,t,nx,ny,nz) \
point.setValue(x,y,z); \
normal.setValue(nx,ny,nz); \
if (useTexFunction) { \
texCoord=tce->get(point,normal); \
} \
else { \
texCoord[0]=s; \
texCoord[1]=t; \
} \
pv.setPoint(point); \
pv.setNormal(normal); \
pv.setTextureCoords(texCoord); \
shapeVertex(&pv);
//----------------------------------------
//////////////////////////////////////////
const int NPOINTS=8, NFACES=6, NINDICES = NFACES*5;
int indices[NINDICES] = {3,2,1,0, SO_END_FACE_INDEX, //z back.
4,5,6,7, SO_END_FACE_INDEX, //z front.
0,1,5,4, SO_END_FACE_INDEX, //y up.
1,2,6,5, SO_END_FACE_INDEX, //x left.
2,3,7,6, SO_END_FACE_INDEX, //y down.
3,0,4,7, SO_END_FACE_INDEX}; //x right.
// points for the eight vertices
float points[NPOINTS][3];
points[0][0] = fDx.getValue();
points[0][1] = fDy.getValue();
points[0][2] = -fDz.getValue();
points[1][0] = -fDx.getValue();
points[1][1] = fDy.getValue();
points[1][2] = -fDz.getValue();
points[2][0] = -fDx.getValue();
points[2][1] = -fDy.getValue();
points[2][2] = -fDz.getValue();
points[3][0] = fDx.getValue();
points[3][1] = -fDy.getValue();
points[3][2] = -fDz.getValue();
points[4][0] = fDx.getValue();
points[4][1] = fDy.getValue();
points[4][2] = fDz.getValue();
points[5][0] = -fDx.getValue();
points[5][1] = fDy.getValue();
points[5][2] = fDz.getValue();
points[6][0] = -fDx.getValue();
points[6][1] = -fDy.getValue();
points[6][2] = fDz.getValue();
points[7][0] = fDx.getValue();
points[7][1] = -fDy.getValue();
points[7][2] = fDz.getValue();
float normals[NFACES][3];
//z back.
normals[0][0] = 0 ; normals[0][1] = 0; normals [0][2] = -1;
//z front.
normals[1][0] = 0 ; normals[1][1] = 0; normals [1][2] = 1;
//y up.
normals[2][0] = 0 ; normals[2][1] = 1; normals [2][2] = 0;
//x left.
normals[3][0] = -1 ; normals[3][1] = 0; normals [3][2] = 0;
//y down.
normals[4][0] = 0 ; normals[4][1] = -1; normals [4][2] = 0;
//x right.
normals[5][0] = 1 ; normals[5][1] = 0; normals [5][2] = 0;
float x,y,z;
int index;
for (int nf=0;nf<NFACES;nf++) {
beginShape(action,TRIANGLE_FAN);
index = indices[nf * 5];
x = points[index][0];
y = points[index][1];
z = points[index][2];
GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0],normals[nf][1],normals[nf][2]);
index = indices[nf * 5 + 1];
x = points[index][0];
y = points[index][1];
z = points[index][2];
GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0],normals[nf][1],normals[nf][2]);
index = indices[nf * 5 + 2];
x = points[index][0];
y = points[index][1];
z = points[index][2];
GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0],normals[nf][1],normals[nf][2]);
index = indices[nf * 5 + 3];
x = points[index][0];
y = points[index][1];
z = points[index][2];
GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0],normals[nf][1],normals[nf][2]);
endShape();
}
}
// getChildren
SoChildList *SoBox::getChildren() const {
return children;
}
// computeBBox
void SoBox::computeBBox(SoAction *, SbBox3f &box, SbVec3f &center ){
SbVec3f vmin(-fDx.getValue(),-fDy.getValue(),-fDz.getValue()),
vmax( fDx.getValue(), fDy.getValue(), fDz.getValue());
center.setValue(0,0,0);
box.setBounds(vmin,vmax);
}
// updateChildren
void SoBox::updateChildren() {
// Redraw the G4Box....
assert(children->getLength()==1);
SoSeparator *sep = (SoSeparator *) ( *children)[0];
SoScale *scale = (SoScale *)( sep->getChild(0));
//SoCube *cube = (SoCube *)( sep->getChild(1));
scale->scaleFactor.setValue(fDx.getValue(), fDy.getValue(), fDz.getValue());
}
// generateChildren
void SoBox::generateChildren() {
// A box consists of a set of scale factors and a
// cube.
assert(children->getLength() ==0);
SoSeparator *sep = new SoSeparator();
SoScale *scale = new SoScale();
SoCube *cube = new SoCube();
sep->addChild(scale);
sep->addChild(cube);
children->append(sep);
}
// generateAlternateRep
void SoBox::generateAlternateRep() {
// This routine sets the alternate representation to the child
// list of this mode.
if (children->getLength() == 0) generateChildren();
updateChildren();
alternateRep.setValue((SoSeparator *) ( *children)[0]);
}
// clearAlternateRep
void SoBox::clearAlternateRep() {
alternateRep.setValue(NULL);
}
@@ -0,0 +1,436 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. *
// * *
// * 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: SoCons.cc,v 1.2 2004/06/14 09:27:39 gcosmo Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
/*-----------------------------Hepvis---------------------------------------*/
/* */
/* Node: SoCons */
/* Description: Represents the G4Cons Geant Geometry entity */
/* Author: Joe Boudreau Nov 11 1996 */
/* */
/*--------------------------------------------------------------------------*/
#include <assert.h>
#include <math.h>
#include <Inventor/SbBox.h>
#include <Inventor/actions/SoAction.h>
#include <Inventor/fields/SoSFFloat.h>
#include <Inventor/misc/SoChildList.h>
#include <Inventor/nodes/SoSeparator.h>
#include <Inventor/nodes/SoIndexedFaceSet.h>
#include <Inventor/nodes/SoNormal.h>
#include <Inventor/nodes/SoCoordinate3.h>
#include <Inventor/nodes/SoNormalBinding.h>
#include <Inventor/SoPrimitiveVertex.h>
#include <Inventor/elements/SoTextureCoordinateElement.h>
#include "HEPVis/SbMath.h"
#include "HEPVis/nodes/SoCons.h"
// This statement is required
SO_NODE_SOURCE(SoCons)
// Constructor
SoCons::SoCons() {
// This statement is required
SO_NODE_CONSTRUCTOR(SoCons);
// Data fields are initialized like this:
SO_NODE_ADD_FIELD(fRmin1, (0.0));
SO_NODE_ADD_FIELD(fRmin2, (0.0));
SO_NODE_ADD_FIELD(fRmax1, (1.0));
SO_NODE_ADD_FIELD(fRmax2, (1.0));
SO_NODE_ADD_FIELD(fDz, (10.0));
SO_NODE_ADD_FIELD(fSPhi, (0.0));
SO_NODE_ADD_FIELD(fDPhi, ((float)(2*M_PI)));
SO_NODE_ADD_FIELD(smoothDraw, (TRUE));
SO_NODE_ADD_FIELD(alternateRep, (NULL));
children = new SoChildList(this);
}
// Destructor
SoCons::~SoCons() {
delete children;
}
// initClass
void SoCons::initClass(){
// This statement is required.
SO_NODE_INIT_CLASS(SoCons,SoShape,"Shape");
}
// generatePrimitives
void SoCons::generatePrimitives(SoAction *action) {
// This variable is used to store each vertex
SoPrimitiveVertex pv;
// Access the stat from the action
SoState *state = action->getState();
// See if we have to use a texture coordinate function,
// rather than generating explicit texture coordinates.
SbBool useTexFunction=
(SoTextureCoordinateElement::getType(state) ==
SoTextureCoordinateElement::FUNCTION);
// If we need to generate texture coordinates with a function,
// we'll need an SoGLTextureCoordinateElement. Otherwise, we'll
// set up the coordinates directly.
const SoTextureCoordinateElement *tce = NULL;
SbVec4f texCoord;
if (useTexFunction) {
tce = SoTextureCoordinateElement::getInstance(state);
} else {
texCoord[2] = 0.0;
texCoord[3] = 1.0;
}
SbVec3f point, normal;
///////////////////////////////////////////////////////
//-----------------------------------------------------
#define GEN_VERTEX(pv,x,y,z,s,t,nx,ny,nz) \
point.setValue((float)(x),(float)(y),(float)(z)); \
normal.setValue((float)(nx),(float)(ny),(float)(nz)); \
if (useTexFunction) { \
texCoord=tce->get(point,normal); \
} else { \
texCoord[0]=(float)(s); \
texCoord[1]=(float)(t); \
} \
pv.setPoint(point); \
pv.setNormal(normal); \
pv.setTextureCoords(texCoord); \
shapeVertex(&pv);
//-----------------------------------------------------
///////////////////////////////////////////////////////
int NPHI = (int)(2+22*fabs(fDPhi.getValue()/(2.0*M_PI)));
double deltaPhi = fDPhi.getValue()/NPHI;
double phi0 = fSPhi.getValue();
double phi1 = phi0 + fDPhi.getValue();
double rMax1 = fRmax1.getValue();
double rMin1 = fRmin1.getValue();
double rMax2 = fRmax2.getValue();
double rMin2 = fRmin2.getValue();
double zMax = fDz.getValue();
double zMin = -zMax;
double cosPhi0 = cos(phi0);
double sinPhi0 = sin(phi0);
double cosPhi1 = cos(phi1);
double sinPhi1 = sin(phi1);
double cosDeltaPhi = cos(deltaPhi);
double sinDeltaPhi = sin(deltaPhi);
//
// The outer surface!
//
beginShape(action,TRIANGLE_STRIP);
int i;
double sinPhi=sinPhi0;
double cosPhi=cosPhi0;
for (i = 0; i<=NPHI; i++) {
GEN_VERTEX(pv,rMax2*cosPhi,rMax2*sinPhi,zMax,0.0,0.0,cosPhi,sinPhi,0);
GEN_VERTEX(pv,rMax1*cosPhi,rMax1*sinPhi,zMin,1.0,1.0,cosPhi,sinPhi,0);
inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi);
}
endShape();
//
// The inner surface!
//
beginShape(action,TRIANGLE_STRIP);
sinPhi=sinPhi0;
cosPhi=cosPhi0;
for (i = 0; i<=NPHI; i++) {
GEN_VERTEX(pv,rMin2*cosPhi,rMin2*sinPhi,zMax,0.0,0.0,-cosPhi,-sinPhi,0);
GEN_VERTEX(pv,rMin1*cosPhi,rMin1*sinPhi,zMin,1.0,1.0,-cosPhi,-sinPhi,0);
inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi);
}
endShape();
if (fabs(deltaPhi)<2.0*M_PI) {
//
// The end
//
beginShape(action,TRIANGLE_STRIP);
sinPhi=sinPhi0;
cosPhi=cosPhi0;
GEN_VERTEX(pv,rMax2*cosPhi,rMax2*sinPhi,zMax,0.0,0.0,sinPhi,-cosPhi,0);
GEN_VERTEX(pv,rMax1*cosPhi,rMax1*sinPhi,zMin,1.0,1.0,sinPhi,-cosPhi,0);
GEN_VERTEX(pv,rMin2*cosPhi,rMin2*sinPhi,zMax,1.0,0.0,sinPhi,-cosPhi,0);
GEN_VERTEX(pv,rMin1*cosPhi,rMin1*sinPhi,zMin,0.0,1.0,sinPhi,-cosPhi,0);
endShape();
//
// The other end
//
beginShape(action,TRIANGLE_STRIP);
sinPhi=sinPhi1;
cosPhi=cosPhi1;
GEN_VERTEX(pv,rMax2*cosPhi,rMax2*sinPhi, zMax,0.0,0.0,-sinPhi,+cosPhi,0);
GEN_VERTEX(pv,rMax1*cosPhi,rMax1*sinPhi, zMin,1.0,1.0,-sinPhi,+cosPhi,0);
GEN_VERTEX(pv,rMin2*cosPhi,rMin2*sinPhi, zMax,1.0,0.0,-sinPhi,+cosPhi,0);
GEN_VERTEX(pv,rMin1*cosPhi,rMin1*sinPhi, zMin,0.0,1.0,-sinPhi,+cosPhi,0);
endShape();
}
//
// The outer surface at z=+PDZ
//
beginShape(action,TRIANGLE_STRIP);
sinPhi=sinPhi0;
cosPhi=cosPhi0;
for (i = 0; i<=NPHI; i++) {
GEN_VERTEX(pv,rMin2*cosPhi,rMin2*sinPhi,zMax,0.0,0.0,0,0,1);
GEN_VERTEX(pv,rMax2*cosPhi,rMax2*sinPhi,zMax,1.0,1.0,0,0,1);
inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi);
}
endShape();
//
// The outer surface at z=-PDZ
//
beginShape(action,TRIANGLE_STRIP);
sinPhi=sinPhi0;
cosPhi=cosPhi0;
for (i = 0; i<=NPHI; i++) {
GEN_VERTEX(pv,rMin1*cosPhi,rMin1*sinPhi,zMin,0.0,0.0,0,0,-1);
GEN_VERTEX(pv,rMax1*cosPhi,rMax1*sinPhi,zMin,1.0,1.0,0,0,-1);
inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi);
}
endShape();
}
// getChildren
SoChildList *SoCons::getChildren() const {
return children;
}
// computeBBox
void SoCons::computeBBox(SoAction *, SbBox3f &box, SbVec3f &center ){
float fRmax= fRmax1.getValue();
if (fRmax2.getValue() > fRmax) fRmax = fRmax2.getValue();
SbVec3f vmin(-fRmax,-fRmax,-fDz.getValue()),
vmax( fRmax, fRmax, fDz.getValue());
center.setValue(0,0,0);
box.setBounds(vmin,vmax);
}
// updateChildren
void SoCons::updateChildren() {
// Redraw the G4Cons....
assert(children->getLength()==1);
SoSeparator *sep = (SoSeparator *) ( *children)[0];
SoCoordinate3 *theCoordinates = (SoCoordinate3 *) ( sep->getChild(0));
SoNormal *theNormals = (SoNormal *) ( sep->getChild(1));
SoNormalBinding *theNormalBinding = (SoNormalBinding *) ( sep->getChild(2));
SoIndexedFaceSet *theFaceSet = (SoIndexedFaceSet *) ( sep->getChild(3));
const int NPHI=24, NPOINTS=2*(2*NPHI+2), NFACES=4*NPHI+2, NINDICES = NFACES*5;
float points[NPOINTS][3], normals[NFACES][3];
#ifdef INVENTOR2_0
static long indices[NINDICES];
#else
static int32_t indices[NINDICES];
#endif
static int init=0;
double phi, pp, DeltaPhi;
// Indices need to be generated once! This is here to keep it close to the point
// generation, since otherwise it will be confusing.
int i;
if (!init) {
init = 1;
// Outer face
for (i = 0; i< NPHI; i++) {
// 0 1 3 2;
indices[5*i+0] = 2*i+0;
indices[5*i+1] = 2*i+1;
indices[5*i+2] = 2*i+3;
indices[5*i+3] = 2*i+2;
indices[5*i+4] = SO_END_FACE_INDEX;
}
// the inner face
for (i=0;i<NPHI;i++) {
indices[5*1*NPHI + 5*i+0] = 2*NPHI+2 + 2*i+0;
indices[5*1*NPHI + 5*i+1] = 2*NPHI+2 + 2*i+1;
indices[5*1*NPHI + 5*i+2] = 2*NPHI+2 + 2*i+3;
indices[5*1*NPHI + 5*i+3] = 2*NPHI+2 + 2*i+2;
indices[5*1*NPHI + 5*i+4] = SO_END_FACE_INDEX;
}
// the top side
for (i=0;i<NPHI;i++) {
indices[5*2*NPHI + 5*i+0] = 2*i+0;
indices[5*2*NPHI + 5*i+1] = 2*i+2;
indices[5*2*NPHI + 5*i+2] = NPOINTS - (2*i+4);
indices[5*2*NPHI + 5*i+3] = NPOINTS - (2*i+2);
indices[5*2*NPHI + 5*i+4] = SO_END_FACE_INDEX;
}
// the bottom side
for (i=0;i<NPHI;i++) {
indices[5*3*NPHI + 5*i+0] = 2*i+1;
indices[5*3*NPHI + 5*i+1] = NPOINTS - (2*i+1);
indices[5*3*NPHI + 5*i+2] = NPOINTS - (2*i+3);
indices[5*3*NPHI + 5*i+3] = 2*i+3;
indices[5*3*NPHI + 5*i+4] = SO_END_FACE_INDEX;
}
// the odd side
indices[5*4*NPHI +0] = 2*NPHI;
indices[5*4*NPHI +1] = 2*NPHI+1;
indices[5*4*NPHI +2] = 2*NPHI+3;
indices[5*4*NPHI +3] = 2*NPHI+2;
indices[5*4*NPHI +4] = SO_END_FACE_INDEX;
// aother odd side
indices[5*4*NPHI +5 +0] = 0;
indices[5*4*NPHI +5 +1] = NPOINTS-2;
indices[5*4*NPHI +5 +2] = NPOINTS-1;
indices[5*4*NPHI +5 +3] = 1;
indices[5*4*NPHI +5 +4] = SO_END_FACE_INDEX;
}
// Points need to be generated each time:
// The outer surface
DeltaPhi = fDPhi.getValue()/NPHI, phi = fSPhi.getValue();
float t,st,ct;
t = FATAN((fRmax2.getValue()-fRmax1.getValue())/(2*fDz.getValue()));
st = FSIN(t);
ct = FCOS(t);
for (i = 0; i<=NPHI; i++) {
points[2*i+0][0] = fRmax2.getValue()*FCOS(phi);
points[2*i+0][1] = fRmax2.getValue()*FSIN(phi);
points[2*i+0][2] = +fDz.getValue();
points[2*i+1][0] = fRmax1.getValue()*FCOS(phi);
points[2*i+1][1] = fRmax1.getValue()*FSIN(phi);
points[2*i+1][2] = -fDz.getValue();
pp = phi+DeltaPhi/2.0;
if (i!=NPHI) {
normals[i][0] = ct * FCOS(pp);
normals[i][1] = ct * FSIN(pp);
normals[i][2] = -st;
}
phi+=DeltaPhi;
}
// The inner surface
phi = fSPhi.getValue() + fDPhi.getValue();
t = FATAN((fRmin2.getValue()-fRmin1.getValue())/(2*fDz.getValue()));
st = FSIN(t);
ct = FCOS(t);
for (i = 0; i<=NPHI; i++) {
points[2*NPHI+2+2*i+0][0] = fRmin2.getValue()*FCOS(phi);
points[2*NPHI+2+2*i+0][1] = fRmin2.getValue()*FSIN(phi);
points[2*NPHI+2+2*i+0][2] = +fDz.getValue();
points[2*NPHI+2+2*i+1][0] = fRmin1.getValue()*FCOS(phi);
points[2*NPHI+2+2*i+1][1] = fRmin1.getValue()*FSIN(phi);
points[2*NPHI+2+2*i+1][2] = -fDz.getValue();
pp = phi-DeltaPhi/2.0;
if (i!=NPHI) {
normals[NPHI+i][0] = -ct*FCOS(pp);
normals[NPHI+i][1] = -ct*FSIN(pp);
normals[NPHI+i][2] = st;
}
phi-=DeltaPhi;
}
// The top side
for (i=0;i<NPHI;i++) {
normals[2*NPHI+i][0]=normals[2*NPHI+i][1]=0;
normals[2*NPHI+i][2]= 1.0;
}
// The bottom side
for (i=0;i<NPHI;i++) {
normals[3*NPHI+i][0]=normals[3*NPHI+i][1]=0;
normals[3*NPHI+i][2]= -1.0;
}
// The odd side
phi = fSPhi.getValue();
normals[4*NPHI+0][0]= FSIN(phi);
normals[4*NPHI+0][1]= -FCOS(phi);
normals[4*NPHI+0][2]= 0;
// Another odd side
phi = fSPhi.getValue()+fDPhi.getValue();
normals[4*NPHI+1][0]= -FSIN(phi);
normals[4*NPHI+1][1]= +FCOS(phi);
normals[4*NPHI+1][2]=0;
for (int np=0;np<NPOINTS;np++) theCoordinates->point.set1Value(np,points[np][0],points[np][1],points[np][2]);
theFaceSet->coordIndex.setValues(0,NINDICES,indices);
if (smoothDraw.getValue()) {
// This Line is replaced by the next one because of an apparent Bug in Inventor (mem. leak).
// theNormals->vector.deleteValues(0);
for (int nf=0;nf<NFACES;nf++) theNormals->vector.set1Value(nf,normals[nf][0],normals[nf][1],normals[nf][2]);
theNormalBinding->value=SoNormalBinding::PER_FACE;
}
else {
for (int nf=0;nf<NFACES;nf++) theNormals->vector.set1Value(nf,normals[nf][0],normals[nf][1],normals[nf][2]);
theNormalBinding->value=SoNormalBinding::PER_FACE;
}
}
// generateChildren
void SoCons::generateChildren() {
// This routines creates one SoSeparator, one SoCoordinate3, and
// one SoLineSet, and puts it in the child list. This is done only
// once, whereas redrawing the position of the coordinates occurs each
// time an update is necessary, in the updateChildren routine.
assert(children->getLength() ==0);
SoSeparator *sep = new SoSeparator();
SoCoordinate3 *theCoordinates = new SoCoordinate3();
SoNormal *theNormals = new SoNormal();
SoNormalBinding *theNormalBinding = new SoNormalBinding();
SoIndexedFaceSet *theFaceSet = new SoIndexedFaceSet();
//
// This line costs some in render quality! but gives speed.
//
sep->addChild(theCoordinates);
sep->addChild(theNormals);
sep->addChild(theNormalBinding);
sep->addChild(theFaceSet);
children->append(sep);
}
// generateAlternateRep
void SoCons::generateAlternateRep() {
// This routine sets the alternate representation to the child
// list of this mode.
if (children->getLength() == 0) generateChildren();
updateChildren();
alternateRep.setValue((SoSeparator *) ( *children)[0]);
}
// clearAlternateRep
void SoCons::clearAlternateRep() {
alternateRep.setValue(NULL);
}
@@ -0,0 +1,214 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. *
// * *
// * 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: SoDetectorTreeKit.cc,v 1.2 2004/06/14 09:27:40 gcosmo Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
/*-----------------------------Hepvis----------------------------------------*/
/* */
/* Node: SoDetectorTreeKit */
/* Description: Represents a single sided silicon strip detector */
/* Author: Joe Boudreau Nov 11 1996 */
/* */
/*---------------------------------------------------------------------------*/
#include <math.h>
#include <Inventor/nodes/SoSeparator.h>
#include <Inventor/events/SoMouseButtonEvent.h>
#include <Inventor/SoPickedPoint.h>
#include <Inventor/nodes/SoPickStyle.h>
#include <Inventor/nodes/SoDrawStyle.h>
#include <Inventor/nodekits/SoAppearanceKit.h>
#include <Inventor/nodekits/SoNodeKitListPart.h>
#include <Inventor/nodekits/SoBaseKit.h>
#include <Inventor/nodes/SoSwitch.h>
#include <Inventor/nodekits/SoSeparatorKit.h>
#include <Inventor/nodekits/SoShapeKit.h>
#include <Inventor/nodes/SoMaterial.h>
#include <Inventor/actions/SoHandleEventAction.h>
#include <Inventor/nodes/SoUnits.h>
#include <Inventor/nodes/SoTransform.h>
#include <Inventor/nodes/SoTexture2Transform.h>
#include "HEPVis/nodekits/SoDetectorTreeKit.h"
// This statement is required
SO_KIT_SOURCE(SoDetectorTreeKit)
// initClass
void SoDetectorTreeKit::initClass(){
SO_KIT_INIT_CLASS(SoDetectorTreeKit,SoBaseKit,"BaseKit");
}
// Constructor
SoDetectorTreeKit::SoDetectorTreeKit() {
SO_KIT_CONSTRUCTOR(SoDetectorTreeKit);
SO_NODE_ADD_FIELD(alternateRep, (NULL));
SO_KIT_ADD_CATALOG_ENTRY ( topSeparator, SoSeparator, FALSE, this,\0, FALSE);
SO_KIT_ADD_CATALOG_ENTRY ( pickStyle, SoSeparator, TRUE , topSeparator,\0, TRUE);
SO_KIT_ADD_CATALOG_ENTRY ( appearance, SoAppearanceKit, TRUE, topSeparator ,\0, TRUE);
SO_KIT_ADD_CATALOG_ENTRY ( units, SoUnits, TRUE, topSeparator ,\0, TRUE);
SO_KIT_ADD_CATALOG_ENTRY ( transform, SoTransform, TRUE , topSeparator,\0, TRUE);
SO_KIT_ADD_CATALOG_ENTRY (texture2Transform, SoTexture2Transform, TRUE, topSeparator ,\0, TRUE);
SO_KIT_ADD_CATALOG_ENTRY ( childList, SoSwitch, FALSE, topSeparator,\0, FALSE);
SO_KIT_ADD_CATALOG_ENTRY ( previewSeparator, SoSeparator, FALSE, childList,\0, TRUE);
SO_KIT_ADD_CATALOG_ENTRY ( fullSeparator, SoSeparator, FALSE, childList,\0, TRUE);
SO_KIT_INIT_INSTANCE();
createInitialTree();
}
// Destructor
SoDetectorTreeKit::~SoDetectorTreeKit() {
}
SbBool SoDetectorTreeKit::affectsState() const {
return FALSE;
}
void SoDetectorTreeKit::createInitialTree() {
SoEventCallback *myCallback = new SoEventCallback();
myCallback->addEventCallback(SoMouseButtonEvent::getClassTypeId(),
SoDetectorTreeKit::expand,
this);
myCallback->addEventCallback(SoMouseButtonEvent::getClassTypeId(),
SoDetectorTreeKit::contract ,
this);
if(setPart("callbackList[0]",myCallback)==FALSE) myCallback->unref();
SoSwitch *theChildList = (SoSwitch *) childList.getValue();
theChildList->whichChild.setValue(0);
}
void SoDetectorTreeKit::expand(void *userData, SoEventCallback *eventCB){
// Was the event previously handled? Is it the right kind?
if (eventCB->isHandled()) return;
const SoMouseButtonEvent *event= (SoMouseButtonEvent *) eventCB->getEvent();
if (!SoMouseButtonEvent::isButtonPressEvent(event,SoMouseButtonEvent::BUTTON1)) return;
if (!event->wasCtrlDown()) return;
if (event->wasShiftDown()) return;
// Which Strip Detector is this being called for?
SoDetectorTreeKit *This = (SoDetectorTreeKit *) userData;
// Find out whether that's the one that has been picked. This is the lowest detector
// tree kit in the hierarchy.
SoHandleEventAction *handleEventAction = eventCB->getAction();
const SoPickedPoint *pickedPoint = handleEventAction->getPickedPoint();
if (!pickedPoint) return;
SoFullPath *path = (SoFullPath *) pickedPoint->getPath();
SoNode *ancestorNode=NULL;
for (int i=0;i<path->getLength();i++) {
ancestorNode = path->getNodeFromTail(i);
if (ancestorNode->isOfType(SoDetectorTreeKit::getClassTypeId())) break;
}
if (This!=ancestorNode) return;
// if (!ancestorNode->isOfType(SoDetectorTreeKit::getClassTypeId())) return;
// Deactivate the Preview
This->setPreview(FALSE);
eventCB->setHandled();
}
void SoDetectorTreeKit::contract(void *userData, SoEventCallback *eventCB){
// Was the event previously handled? Is it the right kind?
if (eventCB->isHandled()) return;
const SoMouseButtonEvent *event= (SoMouseButtonEvent *) eventCB->getEvent();
if (!SoMouseButtonEvent::isButtonPressEvent(event,SoMouseButtonEvent::BUTTON1)) return;
if (event->wasCtrlDown()) return;
if (!event->wasShiftDown()) return;
// Which Strip Detector is this being called for?
SoDetectorTreeKit *This = (SoDetectorTreeKit *) userData;
// Find out whether that's the one that has been picked
SoHandleEventAction *handleEventAction = eventCB->getAction();
const SoPickedPoint *pickedPoint = handleEventAction->getPickedPoint();
if (!pickedPoint) return;
// Find out whether that's the one that has been picked. This is the lowest detector
// tree kit in the hierarchy.
SoFullPath *path = (SoFullPath *) pickedPoint->getPath();
SoNode *ancestorNode=NULL;
SbBool firstTreeFound=FALSE;
for (int i=0;i<path->getLength();i++) {
ancestorNode = path->getNodeFromTail(i);
if (ancestorNode->isOfType(SoDetectorTreeKit::getClassTypeId())) {
if (!firstTreeFound) {
if (This!=ancestorNode) return;
firstTreeFound=TRUE;
}
SoDetectorTreeKit *That = (SoDetectorTreeKit *) ancestorNode;
if (!That->getPreview()) {
That->setPreview(TRUE);
eventCB->setHandled();
return;
}
}
}
}
void SoDetectorTreeKit::setPreview(SbBool Flag) {
SoSwitch *theChildList = (SoSwitch *) childList.getValue();
if (Flag) {
theChildList->whichChild.setValue(0);
}
else {
theChildList->whichChild.setValue(1);
}
}
SbBool SoDetectorTreeKit::getPreview() const {
SoSwitch *theChildList = (SoSwitch *) childList.getValue();
if (theChildList->whichChild.getValue()==0) return TRUE;
return FALSE;
}
SoSeparator *SoDetectorTreeKit::getPreviewSeparator() const {
return (SoSeparator *) previewSeparator.getValue();
}
SoSeparator *SoDetectorTreeKit::getFullSeparator() const {
return (SoSeparator *) fullSeparator.getValue();
}
// generateAlternateRep
void SoDetectorTreeKit::generateAlternateRep() {
alternateRep.setValue(topSeparator.getValue());
}
void SoDetectorTreeKit::clearAlternateRep() {
alternateRep.setValue(NULL);
}
@@ -0,0 +1,403 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. *
// * *
// * 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: SoTrap.cc,v 1.2 2004/06/14 09:27:40 gcosmo Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
/*-----------------------------Hepvis----------------------------------------*/
/* */
/* Node: SoTrap */
/* Description: Represents the G4Trap Geant Geometry entity */
/* Author: Joe Boudreau Nov 11 1996 */
/* */
/* */
/*---------------------------------------------------------------------------*/
#include <assert.h>
#include <math.h>
#include <Inventor/SbBox.h>
#include <Inventor/actions/SoGLRenderAction.h>
#include <Inventor/actions/SoAction.h>
#include <Inventor/fields/SoSFFloat.h>
#include <Inventor/misc/SoChildList.h>
#include <Inventor/nodes/SoSeparator.h>
#include <Inventor/nodes/SoIndexedFaceSet.h>
#include <Inventor/nodes/SoNormal.h>
#include <Inventor/nodes/SoCoordinate3.h>
#include <Inventor/nodes/SoNormalBinding.h>
#include <Inventor/SoPrimitiveVertex.h>
#include <Inventor/elements/SoTextureCoordinateElement.h>
#include "HEPVis/SbMath.h"
#include "HEPVis/nodes/SoTrap.h"
// This statement is required
SO_NODE_SOURCE(SoTrap)
// Constructor
SoTrap::SoTrap() {
// This statement is required
SO_NODE_CONSTRUCTOR(SoTrap);
// Data fields are initialized like this:
SO_NODE_ADD_FIELD(pDz, (1.0));
SO_NODE_ADD_FIELD(pTheta, (0.0));
SO_NODE_ADD_FIELD(pPhi, (0.0));
SO_NODE_ADD_FIELD(pDy1, (1.0));
SO_NODE_ADD_FIELD(pDx1, (1.0));
SO_NODE_ADD_FIELD(pDx2, (1.0));
SO_NODE_ADD_FIELD(pDy2, (1.0));
SO_NODE_ADD_FIELD(pDx3, (1.0));
SO_NODE_ADD_FIELD(pDx4, (1.0));
SO_NODE_ADD_FIELD(pAlp1, (0.0));
SO_NODE_ADD_FIELD(pAlp2, (0.0));
SO_NODE_ADD_FIELD(alternateRep, (NULL));
children = new SoChildList(this);
}
// Destructor
SoTrap::~SoTrap() {
delete children;
}
// initClass
void SoTrap::initClass(){
// This statement is required.
SO_NODE_INIT_CLASS(SoTrap,SoShape,"Shape");
}
// generatePrimitives
void SoTrap::generatePrimitives(SoAction *action) {
// This variable is used to store each vertex
SoPrimitiveVertex pv;
// Access the stat from the action
SoState *state = action->getState();
// See if we have to use a texture coordinate function,
// rather than generating explicit texture coordinates.
SbBool useTexFunction=
(SoTextureCoordinateElement::getType(state) ==
SoTextureCoordinateElement::FUNCTION);
// If we need to generate texture coordinates with a function,
// we'll need an SoGLTextureCoordinateElement. Otherwise, we'll
// set up the coordinates directly.
const SoTextureCoordinateElement *tce = NULL;
SbVec4f texCoord;
if (useTexFunction) {
tce = SoTextureCoordinateElement::getInstance(state);
}
else {
texCoord[2] = 0.0;
texCoord[3] = 1.0;
}
SbVec3f point, normal;
//////////////////////////////////////////
//----------------------------------------
#define GEN_VERTEX(pv,x,y,z,s,t,nx,ny,nz) \
point.setValue(x,y,z); \
normal.setValue(nx,ny,nz); \
if (useTexFunction) { \
texCoord=tce->get(point,normal); \
} \
else { \
texCoord[0]=s; \
texCoord[1]=t; \
} \
pv.setPoint(point); \
pv.setNormal(normal); \
pv.setTextureCoords(texCoord); \
shapeVertex(&pv);
//----------------------------------------
//////////////////////////////////////////
const int NPOINTS=8, NFACES=6, NINDICES = NFACES*5;
int indices[NINDICES] = {3,2,1,0, SO_END_FACE_INDEX, //z back.
4,5,6,7, SO_END_FACE_INDEX, //z front.
0,1,5,4, SO_END_FACE_INDEX, //y up.
1,2,6,5, SO_END_FACE_INDEX, //x left.
2,3,7,6, SO_END_FACE_INDEX, //y down.
3,0,4,7, SO_END_FACE_INDEX}; //x right.
// points for the eight vertices
float TthetaCphi = FTAN(pTheta.getValue())*FCOS(pPhi.getValue());
float TthetaSphi = FTAN(pTheta.getValue())*FSIN(pPhi.getValue());
float Talp1 = FTAN(pAlp1.getValue());
float Talp2 = FTAN(pAlp2.getValue());
float points[NPOINTS][3];
points[0][0] = pDx2.getValue()+pDy1.getValue()*Talp1;
points[0][1] = pDy1.getValue();
points[0][2] = -pDz.getValue();
points[1][0] = -pDx2.getValue()+pDy1.getValue()*Talp1;
points[1][1] = pDy1.getValue();
points[1][2] = -pDz.getValue();
points[2][0] = -pDx1.getValue()-pDy1.getValue()*Talp1;
points[2][1] = -pDy1.getValue();
points[2][2] = -pDz.getValue();
points[3][0] = pDx1.getValue()-pDy1.getValue()*Talp1;
points[3][1] = -pDy1.getValue();
points[3][2] = -pDz.getValue();
points[4][0] = pDx4.getValue()+pDy2.getValue()*Talp2;
points[4][1] = pDy2.getValue();
points[4][2] = pDz.getValue();
points[5][0] = -pDx4.getValue()+pDy2.getValue()*Talp2;
points[5][1] = pDy2.getValue();
points[5][2] = pDz.getValue();
points[6][0] = -pDx3.getValue()-pDy2.getValue()*Talp2;
points[6][1] = -pDy2.getValue();
points[6][2] = pDz.getValue();
points[7][0] = pDx3.getValue()-pDy2.getValue()*Talp2;
points[7][1] = -pDy2.getValue();
points[7][2] = pDz.getValue();
int i;
for (i=0;i<4;i++) {
points[i][0] -= pDz.getValue()*TthetaCphi;
points[i][1] -= pDz.getValue()*TthetaSphi;
}
for (i=4;i<8;i++) {
points[i][0] += pDz.getValue()*TthetaCphi;
points[i][1] += pDz.getValue()*TthetaSphi;
}
SbVec3f normals[NFACES];
int nf;
for (nf=0;nf<NFACES;nf++) {
int j0 = indices[5*nf + 0];
int j1 = indices[5*nf + 1];
int j2 = indices[5*nf + 2];
SbVec3f p0(points[j0][0],points[j0][1],points[j0][2]);
SbVec3f p1(points[j1][0],points[j1][1],points[j1][2]);
SbVec3f p2(points[j2][0],points[j2][1],points[j2][2]);
normals[nf] = (p1-p0).cross(p2-p0);
normals[nf].normalize();
}
float x,y,z;
int index;
for (nf=0;nf<NFACES;nf++) {
beginShape(action,TRIANGLE_FAN);
index = indices[nf * 5];
x = points[index][0];
y = points[index][1];
z = points[index][2];
GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0],normals[nf][1],normals[nf][2]);
index = indices[nf * 5 + 1];
x = points[index][0];
y = points[index][1];
z = points[index][2];
GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0],normals[nf][1],normals[nf][2]);
index = indices[nf * 5 + 2];
x = points[index][0];
y = points[index][1];
z = points[index][2];
GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0],normals[nf][1],normals[nf][2]);
index = indices[nf * 5 + 3];
x = points[index][0];
y = points[index][1];
z = points[index][2];
GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0],normals[nf][1],normals[nf][2]);
endShape();
}
}
// getChildren
SoChildList *SoTrap::getChildren() const {
return children;
}
// computeBBox
void SoTrap::computeBBox(SoAction *, SbBox3f &box, SbVec3f &center ){
float pDx= pDx1.getValue(),pDy=pDy1.getValue();
if (pDx2.getValue() > pDx) pDx = pDx2.getValue();
if (pDx3.getValue() > pDx) pDx = pDx3.getValue();
if (pDx4.getValue() > pDx) pDx = pDx4.getValue();
if (pDy2.getValue() > pDy) pDy = pDy2.getValue();
float TthetaCphi = FTAN(pTheta.getValue())*FCOS(pPhi.getValue());
float TthetaSphi = FTAN(pTheta.getValue())*FSIN(pPhi.getValue());
float Xalp = FFABS(tan(pAlp1.getValue())*pDy1.getValue());
float Xalp2 = FFABS(tan(pAlp2.getValue())*pDy2.getValue());
if (Xalp< Xalp2) Xalp=Xalp2;
pDx += FFABS(TthetaCphi*pDz.getValue());
pDx += Xalp;
pDy += FFABS(TthetaSphi*pDz.getValue());
center.setValue(0,0,0);
box.setBounds(SbVec3f(-pDx,-pDy,-pDz.getValue()),
SbVec3f( pDx, pDy, pDz.getValue()));
}
// updateChildren
void SoTrap::updateChildren() {
// Redraw the G4Trap....
assert(children->getLength()==1);
SoSeparator *sep = (SoSeparator *) ( *children)[0];
SoCoordinate3 *theCoordinates = (SoCoordinate3 *) ( sep->getChild(0));
SoNormal *theNormals = (SoNormal *) ( sep->getChild(1));
SoNormalBinding *theNormalBinding = (SoNormalBinding *) ( sep->getChild(2));
SoIndexedFaceSet *theFaceSet = (SoIndexedFaceSet *) ( sep->getChild(3));
const int NPOINTS=8, NFACES=6, NINDICES = NFACES*5;
float points[NPOINTS][3];
// Indices for the eight faces
#ifdef INVENTOR2_0
static long
#else
static int32_t
#endif
indices[NINDICES] = {3,2,1,0, SO_END_FACE_INDEX, // bottom
4,5,6,7, SO_END_FACE_INDEX, // top
0,1,5,4, SO_END_FACE_INDEX,
1,2,6,5, SO_END_FACE_INDEX,
2,3,7,6, SO_END_FACE_INDEX,
3,0,4,7, SO_END_FACE_INDEX};
// points for the eight vertices
float TthetaCphi = FTAN(pTheta.getValue())*FCOS(pPhi.getValue());
float TthetaSphi = FTAN(pTheta.getValue())*FSIN(pPhi.getValue());
float Talp1 = FTAN(pAlp1.getValue());
float Talp2 = FTAN(pAlp2.getValue());
points[0][0] = pDx2.getValue()+pDy1.getValue()*Talp1;
points[0][1] = pDy1.getValue();
points[0][2] = -pDz.getValue();
points[1][0] = -pDx2.getValue()+pDy1.getValue()*Talp1;
points[1][1] = pDy1.getValue();
points[1][2] = -pDz.getValue();
points[2][0] = -pDx1.getValue()-pDy1.getValue()*Talp1;
points[2][1] = -pDy1.getValue();
points[2][2] = -pDz.getValue();
points[3][0] = pDx1.getValue()-pDy1.getValue()*Talp1;
points[3][1] = -pDy1.getValue();
points[3][2] = -pDz.getValue();
points[4][0] = pDx4.getValue()+pDy2.getValue()*Talp2;
points[4][1] = pDy2.getValue();
points[4][2] = pDz.getValue();
points[5][0] = -pDx4.getValue()+pDy2.getValue()*Talp2;
points[5][1] = pDy2.getValue();
points[5][2] = pDz.getValue();
points[6][0] = -pDx3.getValue()-pDy2.getValue()*Talp2;
points[6][1] = -pDy2.getValue();
points[6][2] = pDz.getValue();
points[7][0] = pDx3.getValue()-pDy2.getValue()*Talp2;
points[7][1] = -pDy2.getValue();
points[7][2] = pDz.getValue();
int i;
for (i=0;i<4;i++) {
points[i][0] -= pDz.getValue()*TthetaCphi;
points[i][1] -= pDz.getValue()*TthetaSphi;
}
for (i=4;i<8;i++) {
points[i][0] += pDz.getValue()*TthetaCphi;
points[i][1] += pDz.getValue()*TthetaSphi;
}
for (int np=0;np<NPOINTS;np++) theCoordinates->point.set1Value(np,points[np][0],points[np][1],points[np][2]);
theFaceSet->coordIndex.setValues(0,NINDICES,indices);
theNormals->vector.deleteValues(0);
theNormals->vector.insertSpace(0,6);
for (int n=0;n<6;n++) {
int i0 = 5*n+0,i1=5*n+1,i2=5*n+2;
int j0 = theFaceSet->coordIndex[i0];
int j1 = theFaceSet->coordIndex[i1];
int j2 = theFaceSet->coordIndex[i2];
SbVec3f p0= theCoordinates->point[j0];
SbVec3f p1= theCoordinates->point[j1];
SbVec3f p2= theCoordinates->point[j2];
SbVec3f normal = (p1-p0).cross(p2-p0);
normal.normalize();
theNormals->vector.set1Value(n,normal);
}
theNormalBinding->value=SoNormalBinding::PER_FACE;
}
// generateChildren
void SoTrap::generateChildren() {
// This routines creates one SoSeparator, one SoCoordinate3, and
// one SoLineSet, and puts it in the child list. This is done only
// once, whereas redrawing the position of the coordinates occurs each
// time an update is necessary, in the updateChildren routine.
assert(children->getLength() ==0);
SoSeparator *sep = new SoSeparator();
SoCoordinate3 *theCoordinates = new SoCoordinate3();
SoNormal *theNormals = new SoNormal();
SoNormalBinding *theNormalBinding = new SoNormalBinding();
SoIndexedFaceSet *theFaceSet = new SoIndexedFaceSet();
//
// This line costs some in render quality! but gives speed.
//
sep->addChild(theCoordinates);
sep->addChild(theNormals);
sep->addChild(theNormalBinding);
sep->addChild(theFaceSet);
children->append(sep);
}
// generateAlternateRep
void SoTrap::generateAlternateRep() {
// This routine sets the alternate representation to the child
// list of this mode.
if (children->getLength() == 0) generateChildren();
updateChildren();
alternateRep.setValue((SoSeparator *) ( *children)[0]);
}
// clearAlternateRep
void SoTrap::clearAlternateRep() {
alternateRep.setValue(NULL);
}
@@ -0,0 +1,339 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. *
// * *
// * 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: SoTrd.cc,v 1.2 2004/06/14 09:27:41 gcosmo Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
/*-----------------------------Hepvis---------------------------------------*/
/* */
/* Node: SoTrd */
/* Description: Represents the G4Trd Geant Geometry entity */
/* Author: Joe Boudreau Nov 11 1996 */
/* */
/*--------------------------------------------------------------------------*/
#include <assert.h>
#include <math.h>
#include <Inventor/SbBox.h>
#include <Inventor/actions/SoAction.h>
#include <Inventor/fields/SoSFFloat.h>
#include <Inventor/misc/SoChildList.h>
#include <Inventor/nodes/SoSeparator.h>
#include <Inventor/nodes/SoIndexedFaceSet.h>
#include <Inventor/nodes/SoNormal.h>
#include <Inventor/nodes/SoCoordinate3.h>
#include <Inventor/nodes/SoNormalBinding.h>
#include <Inventor/SoPrimitiveVertex.h>
#include <Inventor/elements/SoTextureCoordinateElement.h>
#include "HEPVis/SbMath.h"
#include "HEPVis/nodes/SoTrd.h"
// This statement is required
SO_NODE_SOURCE(SoTrd)
// initClass
void SoTrd::initClass(){
SO_NODE_INIT_CLASS(SoTrd,SoShape,"Shape");
}
// Constructor
SoTrd::SoTrd() {
// This statement is required
SO_NODE_CONSTRUCTOR(SoTrd);
// Data fields are initialized like this:
SO_NODE_ADD_FIELD(fDx1,(1.0));
SO_NODE_ADD_FIELD(fDx2,(1.0));
SO_NODE_ADD_FIELD(fDy1,(1.0));
SO_NODE_ADD_FIELD(fDy2,(1.0));
SO_NODE_ADD_FIELD(fDz,(1.0));
SO_NODE_ADD_FIELD(alternateRep,(NULL));
children = new SoChildList(this);
}
// Destructor
SoTrd::~SoTrd() {
delete children;
}
// generatePrimitives
void SoTrd::generatePrimitives(SoAction *action) {
// This variable is used to store each vertex
SoPrimitiveVertex pv;
// Access the stat from the action
SoState *state = action->getState();
// See if we have to use a texture coordinate function,
// rather than generating explicit texture coordinates.
SbBool useTexFunction=
(SoTextureCoordinateElement::getType(state) ==
SoTextureCoordinateElement::FUNCTION);
// If we need to generate texture coordinates with a function,
// we'll need an SoGLTextureCoordinateElement. Otherwise, we'll
// set up the coordinates directly.
const SoTextureCoordinateElement *tce = NULL;
SbVec4f texCoord;
if (useTexFunction) {
tce = SoTextureCoordinateElement::getInstance(state);
}
else {
texCoord[2] = 0.0;
texCoord[3] = 1.0;
}
SbVec3f point, normal;
//////////////////////////////////////////
//----------------------------------------
#define GEN_VERTEX(pv,x,y,z,s,t,nx,ny,nz) \
point.setValue(x,y,z); \
normal.setValue(nx,ny,nz); \
if (useTexFunction) { \
texCoord=tce->get(point,normal); \
} \
else { \
texCoord[0]=s; \
texCoord[1]=t; \
} \
pv.setPoint(point); \
pv.setNormal(normal); \
pv.setTextureCoords(texCoord); \
shapeVertex(&pv);
//----------------------------------------
//////////////////////////////////////////
const int NPOINTS=8, NFACES=6, NINDICES = NFACES*5;
int indices[NINDICES] = {3,2,1,0, SO_END_FACE_INDEX, //z back.
4,5,6,7, SO_END_FACE_INDEX, //z front.
0,1,5,4, SO_END_FACE_INDEX, //y up.
1,2,6,5, SO_END_FACE_INDEX, //x left.
2,3,7,6, SO_END_FACE_INDEX, //y down.
3,0,4,7, SO_END_FACE_INDEX}; //x right.
// points for the eight vertices
float points[NPOINTS][3];
points[0][0] = fDx1.getValue();
points[0][1] = fDy1.getValue();
points[0][2] = -fDz.getValue();
points[1][0] = -fDx1.getValue();
points[1][1] = fDy1.getValue();
points[1][2] = -fDz.getValue();
points[2][0] = -fDx1.getValue();
points[2][1] = -fDy1.getValue();
points[2][2] = -fDz.getValue();
points[3][0] = fDx1.getValue();
points[3][1] = -fDy1.getValue();
points[3][2] = -fDz.getValue();
points[4][0] = fDx2.getValue();
points[4][1] = fDy2.getValue();
points[4][2] = fDz.getValue();
points[5][0] = -fDx2.getValue();
points[5][1] = fDy2.getValue();
points[5][2] = fDz.getValue();
points[6][0] = -fDx2.getValue();
points[6][1] = -fDy2.getValue();
points[6][2] = fDz.getValue();
points[7][0] = fDx2.getValue();
points[7][1] = -fDy2.getValue();
points[7][2] = fDz.getValue();
float t1 = FATAN((fDx2.getValue()-fDx1.getValue())/(2*fDz.getValue()));
float t2 = FATAN((fDy2.getValue()-fDy1.getValue())/(2*fDz.getValue()));
float st1 = FSIN(t1);
float st2 = FSIN(t2);
float ct1 = FCOS(t1);
float ct2 = FCOS(t2);
float normals[NFACES][3];
//z back.
normals[0][0] = 0 ; normals[0][1] = 0; normals [0][2] = -1;
//z front.
normals[1][0] = 0 ; normals[1][1] = 0; normals [1][2] = 1;
//y up.
normals[2][0] = 0 ; normals[2][1] = ct2; normals [2][2] = -st2;
//x left.
normals[3][0] = -ct1; normals[3][1] = 0; normals [3][2] = -st1;
//y down.
normals[4][0] = 0 ; normals[4][1] = -ct2; normals [4][2] = -st2;
//x right.
normals[5][0] = ct1; normals[5][1] = 0; normals [5][2] = -st1;
float x,y,z;
int index;
for (int nf=0;nf<NFACES;nf++) {
beginShape(action,TRIANGLE_FAN);
index = indices[nf * 5];
x = points[index][0];
y = points[index][1];
z = points[index][2];
GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0],normals[nf][1],normals[nf][2]);
index = indices[nf * 5 + 1];
x = points[index][0];
y = points[index][1];
z = points[index][2];
GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0],normals[nf][1],normals[nf][2]);
index = indices[nf * 5 + 2];
x = points[index][0];
y = points[index][1];
z = points[index][2];
GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0],normals[nf][1],normals[nf][2]);
index = indices[nf * 5 + 3];
x = points[index][0];
y = points[index][1];
z = points[index][2];
GEN_VERTEX(pv,x,y,z,0.0,0.0,normals[nf][0],normals[nf][1],normals[nf][2]);
endShape();
}
}
// getChildren
SoChildList *SoTrd::getChildren() const {
return children;
}
// computeBBox
void SoTrd::computeBBox(SoAction *, SbBox3f &box, SbVec3f &center ){
float fDx= fDx1.getValue(),fDy=fDy1.getValue();
if (fDx2.getValue() > fDx) fDx = fDx2.getValue();
if (fDy2.getValue() > fDy) fDy = fDy2.getValue();
SbVec3f vmin(-fDx,-fDy,-fDz.getValue()),
vmax( fDx, fDy, fDz.getValue());
center.setValue(0,0,0);
box.setBounds(vmin,vmax);
}
// updateChildren
void SoTrd::updateChildren() {
// Redraw the G4Trd....
assert(children->getLength()==1);
SoSeparator *sep = (SoSeparator *) ( *children)[0];
SoCoordinate3 *theCoordinates = (SoCoordinate3 *) ( sep->getChild(0));
SoNormal *theNormals = (SoNormal *) ( sep->getChild(1));
SoNormalBinding *theNormalBinding = (SoNormalBinding *) ( sep->getChild(2));
SoIndexedFaceSet *theFaceSet = (SoIndexedFaceSet *) ( sep->getChild(3));
const int NPOINTS=8, NFACES=6, NINDICES = NFACES*5;
float points[NPOINTS][3];
float normals[NFACES][3]= {{0,0,-1}, {0,0,1}, {0,1,0}, {-1, 0, 0}, {0, -1, 0}, {1,0,0}};
// Indices for the eight faces
#ifdef INVENTOR2_0
static long
#else
static int32_t
#endif
indices[NINDICES] = {3,2,1,0, SO_END_FACE_INDEX, // bottom
4,5,6,7, SO_END_FACE_INDEX, // top
0,1,5,4, SO_END_FACE_INDEX,
1,2,6,5, SO_END_FACE_INDEX,
2,3,7,6, SO_END_FACE_INDEX,
3,0,4,7, SO_END_FACE_INDEX};
// points for the eight vertices
points[0][0] = fDx1.getValue(); points[0][1] = fDy1.getValue(); points[0][2] = -fDz.getValue();
points[1][0] = -fDx1.getValue(); points[1][1] = fDy1.getValue(); points[1][2] = -fDz.getValue();
points[2][0] = -fDx1.getValue(); points[2][1] = -fDy1.getValue(); points[2][2] = -fDz.getValue();
points[3][0] = fDx1.getValue(); points[3][1] = -fDy1.getValue(); points[3][2] = -fDz.getValue();
points[4][0] = fDx2.getValue(); points[4][1] = fDy2.getValue(); points[4][2] = fDz.getValue();
points[5][0] = -fDx2.getValue(); points[5][1] = fDy2.getValue(); points[5][2] = fDz.getValue();
points[6][0] = -fDx2.getValue(); points[6][1] = -fDy2.getValue(); points[6][2] = fDz.getValue();
points[7][0] = fDx2.getValue(); points[7][1] = -fDy2.getValue(); points[7][2] = fDz.getValue();
float t1 = FATAN((fDx2.getValue()-fDx1.getValue())/(2*fDz.getValue()));
float t2 = FATAN((fDy2.getValue()-fDy1.getValue())/(2*fDz.getValue()));
float st1 = FSIN(t1);
float st2 = FSIN(t2);
float ct1 = FCOS(t1);
float ct2 = FCOS(t2);
normals[0][0] = 0 ; normals[0][1] = 0; normals [0][2] = -1;
normals[1][0] = 0 ; normals[1][1] = 0; normals [1][2] = 1;
normals[2][0] = 0 ; normals[2][1] = ct2; normals [2][2] = -st2;
normals[3][0] = -ct1; normals[3][1] = 0; normals [3][2] = -st1;
normals[4][0] = 0 ; normals[4][1] = -ct2; normals [4][2] = -st2;
normals[5][0] = ct1; normals[5][1] = 0; normals [5][2] = -st1;
for (int np=0;np<NPOINTS;np++) theCoordinates->point.set1Value(np,points[np][0],points[np][1],points[np][2]);
theFaceSet->coordIndex.setValues(0,NINDICES,indices);
for (int nf=0;nf<NFACES;nf++) theNormals->vector.set1Value(nf,normals[nf][0],normals[nf][1],normals[nf][2]);
theNormalBinding->value=SoNormalBinding::PER_FACE;
}
// generateChildren
void SoTrd::generateChildren() {
// This routines creates one SoSeparator, one SoCoordinate3, and
// one SoLineSet, and puts it in the child list. This is done only
// once, whereas redrawing the position of the coordinates occurs each
// time an update is necessary, in the updateChildren routine.
assert(children->getLength() ==0);
SoSeparator *sep = new SoSeparator();
SoCoordinate3 *theCoordinates = new SoCoordinate3();
SoNormal *theNormals = new SoNormal();
SoNormalBinding *theNormalBinding = new SoNormalBinding();
SoIndexedFaceSet *theFaceSet = new SoIndexedFaceSet();
//
// This line costs some in render quality! but gives speed.
//
sep->addChild(theCoordinates);
sep->addChild(theNormals);
sep->addChild(theNormalBinding);
sep->addChild(theFaceSet);
children->append(sep);
}
// generateAlternateRep
void SoTrd::generateAlternateRep() {
// This routine sets the alternate representation to the child
// list of this mode.
if (children->getLength() == 0) generateChildren();
updateChildren();
alternateRep.setValue((SoSeparator *) ( *children)[0]);
}
// clearAlternateRep
void SoTrd::clearAlternateRep() {
alternateRep.setValue(NULL);
}
@@ -0,0 +1,462 @@
//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. *
// * *
// * 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: SoTubs.cc,v 1.2 2004/06/14 09:27:41 gcosmo Exp $
// GEANT4 tag $Name: geant4-06-02 $
//
/*-----------------------------Hepvis---------------------------------------*/
/* */
/* Node: SoTubs */
/* Description: Represents the G4Tubs Geant Geometry entity */
/* Author: Joe Boudreau Nov 11 1996 */
/* */
/*--------------------------------------------------------------------------*/
#include <assert.h>
#include <math.h>
#include <Inventor/SbBox.h>
#include <Inventor/actions/SoGLRenderAction.h>
#include <Inventor/fields/SoSFFloat.h>
#include <Inventor/misc/SoChildList.h>
#include <Inventor/nodes/SoSeparator.h>
#include <Inventor/nodes/SoIndexedFaceSet.h>
#include <Inventor/nodes/SoNormal.h>
#include <Inventor/nodes/SoCoordinate3.h>
#include <Inventor/nodes/SoNormalBinding.h>
#include <Inventor/SoPrimitiveVertex.h>
#include <Inventor/elements/SoTextureCoordinateElement.h>
#include "HEPVis/SbMath.h"
#include "HEPVis/nodes/SoTubs.h"
// This statement is required
SO_NODE_SOURCE(SoTubs)
// Constructor
SoTubs::SoTubs() {
// This statement is required
SO_NODE_CONSTRUCTOR(SoTubs);
// Data fields are initialized like this:
SO_NODE_ADD_FIELD(pRMin, (0));
SO_NODE_ADD_FIELD(pRMax, (1));
SO_NODE_ADD_FIELD(pDz, (10));
SO_NODE_ADD_FIELD(pSPhi, (0));
SO_NODE_ADD_FIELD(pDPhi, ((float)(2*M_PI)));
SO_NODE_ADD_FIELD(alternateRep, (NULL));
children = new SoChildList(this);
}
// Destructor
SoTubs::~SoTubs() {
delete children;
}
// initClass
void SoTubs::initClass(){
// This statement is required.
SO_NODE_INIT_CLASS(SoTubs,SoShape,"Shape");
}
// generatePrimitives
void SoTubs::generatePrimitives(SoAction *action) {
// This variable is used to store each vertex
SoPrimitiveVertex pv;
// Access the stat from the action
SoState *state = action->getState();
// See if we have to use a texture coordinate function,
// rather than generating explicit texture coordinates.
SbBool useTexFunction=
(SoTextureCoordinateElement::getType(state) ==
SoTextureCoordinateElement::FUNCTION);
// If we need to generate texture coordinates with a function,
// we'll need an SoGLTextureCoordinateElement. Otherwise, we'll
// set up the coordinates directly.
const SoTextureCoordinateElement* tce = NULL;
SbVec4f texCoord;
if (useTexFunction) {
tce = SoTextureCoordinateElement::getInstance(state);
}
else {
texCoord[2] = 0.0;
texCoord[3] = 1.0;
}
SbVec3f point, normal;
///////////////////////////////////////////////////////
//-----------------------------------------------------
#define GEN_VERTEX(pv,x,y,z,s,t,nx,ny,nz) \
point.setValue((float)(x),(float)(y),(float)(z)); \
normal.setValue((float)(nx),(float)(ny),(float)(nz)); \
if (useTexFunction) { \
texCoord=tce->get(point,normal); \
} else { \
texCoord[0]=(float)(s); \
texCoord[1]=(float)(t); \
} \
pv.setPoint(point); \
pv.setNormal(normal); \
pv.setTextureCoords(texCoord); \
shapeVertex(&pv);
//-----------------------------------------------------
///////////////////////////////////////////////////////
int NPHI = (int)(2+22*fabs(pDPhi.getValue()/(2.0*M_PI)));
double deltaPhi = pDPhi.getValue()/NPHI, phi0 = pSPhi.getValue(),phi1=phi0+pDPhi.getValue();
double rMax=pRMax.getValue(),rMin=pRMin.getValue();
double zMax=pDz.getValue(),zMin=-zMax;
double cosPhi0=cos(phi0), sinPhi0=sin(phi0);
double cosPhi1=cos(phi1), sinPhi1=sin(phi1);
double cosDeltaPhi=cos(deltaPhi),sinDeltaPhi=sin(deltaPhi);
//
// The outer surface!
//
int i;
double sinPhi,cosPhi;
beginShape(action,TRIANGLE_STRIP);
sinPhi=sinPhi0;
cosPhi=cosPhi0;
for (i = 0; i<=NPHI; i++) {
GEN_VERTEX(pv,rMax*cosPhi,rMax*sinPhi,zMax,0.0,0.0,cosPhi,sinPhi,0);
GEN_VERTEX(pv,rMax*cosPhi,rMax*sinPhi,zMin,1.0,1.0,cosPhi,sinPhi,0);
inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi);
}
endShape();
//
// The inner surface!
//
if(rMin!=0.F) {
beginShape(action,TRIANGLE_STRIP);
sinPhi=sinPhi0;
cosPhi=cosPhi0;
for (i = 0; i<=NPHI; i++) {
GEN_VERTEX(pv,rMin*cosPhi,rMin*sinPhi,zMax,0.0,0.0,-cosPhi,-sinPhi,0);
GEN_VERTEX(pv,rMin*cosPhi,rMin*sinPhi,zMin,1.0,1.0,-cosPhi,-sinPhi,0);
inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi);
}
endShape();
}
if (fabs(deltaPhi)<2.0*M_PI) {
//
// The end
//
beginShape(action,TRIANGLE_STRIP);
sinPhi=sinPhi0;
cosPhi=cosPhi0;
GEN_VERTEX(pv,rMax*cosPhi,rMax*sinPhi,zMax,0.0,0.0,sinPhi,-cosPhi,0);
GEN_VERTEX(pv,rMax*cosPhi,rMax*sinPhi,zMin,1.0,1.0,sinPhi,-cosPhi,0);
GEN_VERTEX(pv,rMin*cosPhi,rMin*sinPhi,zMax,1.0,0.0,sinPhi,-cosPhi,0);
GEN_VERTEX(pv,rMin*cosPhi,rMin*sinPhi,zMin,0.0,1.0,sinPhi,-cosPhi,0);
endShape();
//
// The other end
//
beginShape(action,TRIANGLE_STRIP);
sinPhi=sinPhi1;
cosPhi=cosPhi1;
GEN_VERTEX(pv,rMax*cosPhi,rMax*sinPhi, zMax,0.0,0.0,-sinPhi,+cosPhi,0);
GEN_VERTEX(pv,rMax*cosPhi,rMax*sinPhi, zMin,1.0,1.0,-sinPhi,+cosPhi,0);
GEN_VERTEX(pv,rMin*cosPhi,rMin*sinPhi, zMax,1.0,0.0,-sinPhi,+cosPhi,0);
GEN_VERTEX(pv,rMin*cosPhi,rMin*sinPhi, zMin,0.0,1.0,-sinPhi,+cosPhi,0);
endShape();
}
//
// The outer surface at z=+PDZ
//
if(rMin==0.F) {
beginShape(action,TRIANGLE_FAN);
sinPhi=sinPhi0;
cosPhi=cosPhi0;
GEN_VERTEX(pv,0,0,zMax,0.0,0.0,0,0,1);
for (i = 0; i<=NPHI; i++) {
GEN_VERTEX(pv,rMax*cosPhi,rMax*sinPhi,zMax,1.0,1.0,0,0,1);
inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi);
}
endShape();
//
// The outer surface at z=-PDZ
//
beginShape(action,TRIANGLE_FAN);
sinPhi=sinPhi0;
cosPhi=cosPhi0;
GEN_VERTEX(pv,0,0,zMin,0.0,0.0,0,0,-1);
for (i = 0; i<=NPHI; i++) {
GEN_VERTEX(pv,rMax*cosPhi,rMax*sinPhi,zMin,1.0,1.0,0,0,-1);
inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi);
}
endShape();
} else {
beginShape(action,TRIANGLE_STRIP);
sinPhi=sinPhi0;
cosPhi=cosPhi0;
for (i = 0; i<=NPHI; i++) {
GEN_VERTEX(pv,rMin*cosPhi,rMin*sinPhi,zMax,0.0,0.0,0,0,1);
GEN_VERTEX(pv,rMax*cosPhi,rMax*sinPhi,zMax,1.0,1.0,0,0,1);
inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi);
}
endShape();
//
// The outer surface at z=-PDZ
//
beginShape(action,TRIANGLE_STRIP);
sinPhi=sinPhi0;
cosPhi=cosPhi0;
for (i = 0; i<=NPHI; i++) {
GEN_VERTEX(pv,rMin*cosPhi,rMin*sinPhi,zMin,0.0,0.0,0,0,-1);
GEN_VERTEX(pv,rMax*cosPhi,rMax*sinPhi,zMin,1.0,1.0,0,0,-1);
inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi);
}
endShape();
}
}
// getChildren
SoChildList *SoTubs::getChildren() const {
return children;
}
// computeBBox
void SoTubs::computeBBox(SoAction *, SbBox3f &box, SbVec3f &center ){
SbVec3f vmin(-pRMax.getValue(),-pRMax.getValue(),-pDz.getValue()),
vmax( pRMax.getValue(), pRMax.getValue(), pDz.getValue());
center.setValue(0,0,0);
box.setBounds(vmin,vmax);
}
// updateChildren
void SoTubs::updateChildren() {
// Redraw the G4Tubs....
assert(children->getLength()==1);
SoSeparator *sep = (SoSeparator *) ( *children)[0];
SoCoordinate3 *theCoordinates = (SoCoordinate3 *) ( sep->getChild(0));
SoNormal *theNormals = (SoNormal *) ( sep->getChild(1));
SoNormalBinding *theNormalBinding = (SoNormalBinding *) ( sep->getChild(2));
SoIndexedFaceSet *theFaceSet = (SoIndexedFaceSet *) ( sep->getChild(3));
const int NPHI=24, NPOINTS=2*(2*NPHI+2), NFACES=4*NPHI+2, NINDICES = NFACES*5;
float points[NPOINTS][3],normals[NFACES][3];
#ifdef INVENTOR2_0
static long indices[NINDICES];
#else
static int32_t indices[NINDICES];
#endif
static int init=0;
double phi, pp, DeltaPhi;
// Indices need to be generated once! This is here to keep it close to the point
// generation, since otherwise it will be confusing.
int i;
if (!init) {
init = 1;
// Outer face
for (i = 0; i< NPHI; i++) {
// 0 1 3 2;
indices[5*i+0] = 2*i+0;
indices[5*i+1] = 2*i+1;
indices[5*i+2] = 2*i+3;
indices[5*i+3] = 2*i+2;
indices[5*i+4] = SO_END_FACE_INDEX;
}
// the inner face
for (i=0;i<NPHI;i++) {
indices[5*1*NPHI + 5*i+0] = 2*NPHI+2 + 2*i+0;
indices[5*1*NPHI + 5*i+1] = 2*NPHI+2 + 2*i+1;
indices[5*1*NPHI + 5*i+2] = 2*NPHI+2 + 2*i+3;
indices[5*1*NPHI + 5*i+3] = 2*NPHI+2 + 2*i+2;
indices[5*1*NPHI + 5*i+4] = SO_END_FACE_INDEX;
}
// the top side
for (i=0;i<NPHI;i++) {
indices[5*2*NPHI + 5*i+0] = 2*i+0;
indices[5*2*NPHI + 5*i+1] = 2*i+2;
indices[5*2*NPHI + 5*i+2] = NPOINTS - (2*i+4);
indices[5*2*NPHI + 5*i+3] = NPOINTS - (2*i+2);
indices[5*2*NPHI + 5*i+4] = SO_END_FACE_INDEX;
}
// the bottom side
for (i=0;i<NPHI;i++) {
indices[5*3*NPHI + 5*i+0] = 2*i+1;
indices[5*3*NPHI + 5*i+1] = NPOINTS - (2*i+1);
indices[5*3*NPHI + 5*i+2] = NPOINTS - (2*i+3);
indices[5*3*NPHI + 5*i+3] = 2*i+3;
indices[5*3*NPHI + 5*i+4] = SO_END_FACE_INDEX;
}
// the odd side
indices[5*4*NPHI +0] = 2*NPHI;
indices[5*4*NPHI +1] = 2*NPHI+1;
indices[5*4*NPHI +2] = 2*NPHI+3;
indices[5*4*NPHI +3] = 2*NPHI+2;
indices[5*4*NPHI +4] = SO_END_FACE_INDEX;
// aother odd side
indices[5*4*NPHI +5 +0] = 0;
indices[5*4*NPHI +5 +1] = NPOINTS-2;
indices[5*4*NPHI +5 +2] = NPOINTS-1;
indices[5*4*NPHI +5 +3] = 1;
indices[5*4*NPHI +5 +4] = SO_END_FACE_INDEX;
}
// Points need to be generated each time:
if (pDPhi.getValue()<2*M_PI) {
// the odd side
indices[5*4*NPHI +0] = 2*NPHI;
indices[5*4*NPHI +1] = 2*NPHI+1;
indices[5*4*NPHI +2] = 2*NPHI+3;
indices[5*4*NPHI +3] = 2*NPHI+2;
indices[5*4*NPHI +4] = SO_END_FACE_INDEX;
// aother odd side
indices[5*4*NPHI +5 +0] = 0;
indices[5*4*NPHI +5 +1] = NPOINTS-2;
indices[5*4*NPHI +5 +2] = NPOINTS-1;
indices[5*4*NPHI +5 +3] = 1;
indices[5*4*NPHI +5 +4] = SO_END_FACE_INDEX;
}
else {
// the odd side
indices[5*4*NPHI +0] = SO_END_FACE_INDEX;
indices[5*4*NPHI +1] = SO_END_FACE_INDEX;
indices[5*4*NPHI +2] = SO_END_FACE_INDEX;
indices[5*4*NPHI +3] = SO_END_FACE_INDEX;
indices[5*4*NPHI +4] = SO_END_FACE_INDEX;
// aother odd side
indices[5*4*NPHI +5 +0] = SO_END_FACE_INDEX;
indices[5*4*NPHI +5 +1] = SO_END_FACE_INDEX;
indices[5*4*NPHI +5 +2] = SO_END_FACE_INDEX;
indices[5*4*NPHI +5 +3] = SO_END_FACE_INDEX;
indices[5*4*NPHI +5 +4] = SO_END_FACE_INDEX;
}
// The outer surface
DeltaPhi = pDPhi.getValue()/NPHI, phi = pSPhi.getValue();
for (i = 0; i<=NPHI; i++) {
points[2*i+0][0] = pRMax.getValue()*FCOS(phi);
points[2*i+0][1]= pRMax.getValue()*FSIN(phi);
points[2*i+0][2] = +pDz.getValue();
points[2*i+1][0] = pRMax.getValue()*FCOS(phi);
points[2*i+1][1]= pRMax.getValue()*FSIN(phi);
points[2*i+1][2] = -pDz.getValue();
pp = phi+DeltaPhi/2.0;
if (i!=NPHI) {
normals[i][0] = FCOS(pp);
normals[i][1] = FSIN(pp);
normals[i][2] = 0;
}
phi+=DeltaPhi;
}
// The inner surface
phi = pSPhi.getValue() + pDPhi.getValue();
for (i = 0; i<=NPHI; i++) {
points[2*NPHI+2+2*i+0][0] = pRMin.getValue()*FCOS(phi);
points[2*NPHI+2+2*i+0][1] = pRMin.getValue()*FSIN(phi);
points[2*NPHI+2+2*i+0][2] = +pDz.getValue();
points[2*NPHI+2+2*i+1][0] = pRMin.getValue()*FCOS(phi);
points[2*NPHI+2+2*i+1][1] = pRMin.getValue()*FSIN(phi);
points[2*NPHI+2+2*i+1][2] = -pDz.getValue();
pp = phi-DeltaPhi/2.0;
if (i!=NPHI) {
normals[NPHI+i][0] = -FCOS(pp);
normals[NPHI+i][1] = -FSIN(pp);
normals[NPHI+i][2] = 0;
}
phi-=DeltaPhi;
}
// The top side
for (i=0;i<NPHI;i++) {
normals[2*NPHI+i][0]=normals[2*NPHI+i][1]=0;
normals[2*NPHI+i][2]= 1.0;
}
// The bottom side
for (i=0;i<NPHI;i++) {
normals[3*NPHI+i][0]=normals[3*NPHI+i][1]=0;
normals[3*NPHI+i][2]= -1.0;
}
// The odd side
phi = pSPhi.getValue();
normals[4*NPHI+0][0]= FSIN(phi);
normals[4*NPHI+0][1]= -FCOS(phi);
normals[4*NPHI+0][2]=0;
// Another odd side
phi = pSPhi.getValue()+pDPhi.getValue();
normals[4*NPHI+1][0]= -FSIN(phi);
normals[4*NPHI+1][1]= +FCOS(phi);
normals[4*NPHI+1][2]=0;
for (int np=0;np<NPOINTS; np++) theCoordinates->point.set1Value(np,points[np][0],points[np][1],points[np][2]);
for (int ni=0;ni<NINDICES;ni++) theFaceSet->coordIndex.set1Value(ni,indices[ni]);
for (int nf=0;nf<NFACES;nf++) theNormals->vector.set1Value(nf,normals[nf][0],normals[nf][1],normals[nf][2]);
theNormalBinding->value=SoNormalBinding::PER_FACE;
}
// generateChildren
void SoTubs::generateChildren() {
// This routines creates one SoSeparator, one SoCoordinate3, and
// one SoLineSet, and puts it in the child list. This is done only
// once, whereas redrawing the position of the coordinates occurs each
// time an update is necessary, in the updateChildren routine.
assert(children->getLength() ==0);
SoSeparator *sep = new SoSeparator();
SoCoordinate3 *theCoordinates = new SoCoordinate3();
SoNormal *theNormals = new SoNormal();
SoNormalBinding *theNormalBinding = new SoNormalBinding();
SoIndexedFaceSet *theFaceSet = new SoIndexedFaceSet();
//
// This line costs some in render quality! but gives speed.
//
sep->addChild(theCoordinates);
sep->addChild(theNormals);
sep->addChild(theNormalBinding);
sep->addChild(theFaceSet);
children->append(sep);
}
// generateAlternateRep
void SoTubs::generateAlternateRep() {
// This routine sets the alternate representation to the child
// list of this mode.
if (children->getLength() == 0) generateChildren();
updateChildren();
alternateRep.setValue((SoSeparator *) ( *children)[0]);
}
// clearAlternateRep
void SoTubs::clearAlternateRep() {
alternateRep.setValue(NULL);
}