Files
geant4/source/visualization/README.adding_graphics_system
T
2016-06-09 12:11:21 +02:00

127 lines
4.7 KiB
Plaintext

To add a graphics system:
1) implement 3 new classes:
class G4XXX: public G4VGraphicsSystem
class G4XXXSceneHandler: public G4VSceneHandler
class G4XXXViewer: virtual public G4VViewer
These should be placed in their own sub-directory under
visualization, together with a GNUmakefile and a History file.
Change the library name G4XXX in "name := G4XXX" in GNUmakefile.
2) Add to SUBDIRS and SUBLIBS in visualization/GNUmakefile.
3) Look at the XXX graphics system skeleton in visualization/XXX and
use it to build your graphics system.
You might also find it useful to look at ASCIITree (and VTree) as
an example of a minimal graphics system.
Look at FukuiRenderer as an example of a system which implements
AddThis methods for some solids.
Look at OpenGL as an example of a system which implements a graphical
database (display lists) and the machinery to decide when to rebuild.
(OpenGL is complicated by the proliferation of combinations of:
immediate (no display lists) ) ( X-windows
stored (uses display lists) ) x ( X with motif - interactive
( Win32
(6 combinations) and much use is made of inheritance to avoid code
duplication.)
4) If it requires external libraries, introduce two new environment
variables G4VIS_BUILD_XXX_DRIVER and G4VIS_USE_XXX and make the
modifications to:
source/visualization/management/include/MyVisManager.cc
(similarly all examples vis managers)
source/visualization/management/src/G4VisManager.cc
config/G4VIS_BUILD.gmk
config/G4VIS_USE.gmk
In any case, augment the informational printing in G4VisManager.cc.
=========================================================================
Frequently Asked Questions
--------------------------
Q: How do I implement the drawing of markers?
A: See graphics_reps/include/G4VMarker.hh.
Q: What functions can a user call?
A: The interface for the user (application developer) is G4VVisManager
defined in intercoms/include/G4VVisManager.hh. (The interface
G4VGraphicsScene in intercoms/include/G4VGraphicsScene.hh is for
visualization developers only. It is that part of the scene
handler's interface available to other categories, but must be used
with care.)
Q: How do I implement the drawing of trajectories?
A: (January 2002, referring to Geant4 4.0. There are plans to improve
the handling of trajectories, so this advice might change.
Hopefully we'll keep it up to date, but who knows. Be warned.)
The trajectories themselves have a method,
G4Trajectory::DrawTrajectory, invoked by the user or by the vis
manager, if requested, at the end of an event, which calls Draw
methods of G4VisManager, which call AddPrimitive. So AddPrimitive
is where you need to look at the vis attributes.
void G4VisManager::Draw (const G4Polyline& line,
const G4Transform3D& objectTransform) {
if (IsValidView ()) {
ClearTransientStoreIfMarked();
G4ModelingParameters* pMP = fpSceneHandler -> CreateModelingParameters ();
G4VModel* pModel = new G4NullModel (pMP);
fpSceneHandler -> SetModel (pModel);
fpSceneHandler -> BeginPrimitives (objectTransform);
fpSceneHandler -> AddPrimitive (line);
fpSceneHandler -> EndPrimitives ();
fpSceneHandler -> SetModel (0);
delete pModel;
delete pMP;
}
}
It needs to go through the vis manager so that "transients" are
handled properly. The geometry model and things like axes are
"run-duration" (sometimes misleadingly called persistent) and
trajectories, etc., are "end-of-event" (sometimes misleadingly
called transient) - see G4Scene:
class G4Scene {
...
private:
G4String fName;
G4std::vector<G4VModel*> fRunDurationModelList;
G4std::vector<G4VModel*> fEndOfEventModelList;
G4VisExtent fExtent;
G4Point3D fStandardTargetPoint;
G4bool fRefreshAtEndOfEvent;
};
The user can choose to have the view refreshed at the end of event,
which means previous end-of-event objects get erased. In OpenGL,
this is done by (a) in Immediate mode, erasing everything and
redrawing run-duration and the new end-of-event objects or (b) in
Stored mode, just deleting the display lists of the end-of-event
objects and recreating them.
Now, you will see that G4Trajectory::DrawTrajectory is very
primitive. It has not been changed for years!! It draws lots of
circles. This is a huge demand on graphical databases and we have
had on our to-do list for years to introduce AddPrimitive(const
G4VTrajectory&). Certainly, OpenInventor sags under the weight of
lots of circles, which it implements as spheres(!), and there are
great savings of efficiency to be made if graphics systems can
handle trajectories directly.