Files
geant4/source/visualization/OPACS/src/G4XoViewer.cc
T
2016-06-08 15:09:25 +02:00

261 lines
8.7 KiB
C++

// This code implementation is the intellectual property of
// the RD44 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: G4XoViewer.cc,v 1.3 1999/05/31 21:17:01 barrand Exp $
// GEANT4 tag $Name: geant4-00-01 $
//
//
// Guy Barrand 04 November 1996
#ifdef G4VIS_BUILD_OPACS_DRIVER
//#define DEBUG
//X11
#include <X11/Intrinsic.h>
#include <X11/Shell.h>
/*Co*/
#include <CPrinter.h>
#include <CString.h>
#include <CList.h>
/*Xx*/
#include <XWidget.h>
/*Go*/
#include <OCamera.h>
/*Xo*/
#include <XoCamera.h>
//G4
#include "G4GoSceneHandler.hh"
#include "G4Xo.hh"
#include "G4VInteractorManager.hh"
//This
#include "G4XoViewer.hh"
static Bool WaitForNotify (Display*,XEvent*,char*);
static void ActivateCallback (Widget,XtPointer,XtPointer);
static void CollectCallback (Widget,XtPointer,XtPointer);
/***************************************************************************/
G4XoViewer::G4XoViewer (
G4GoSceneHandler& scene,
const G4String& name
)
:G4VViewer (scene, scene.IncrementViewCount(), name)
,fSceneHandler (scene)
,fGoCamera (NULL)
,fXoCamera (NULL)
,fShell (NULL)
/***************************************************************************/
// Constructor.
/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
{
#ifdef DEBUG
G4cout << "G4XoViewer::G4XoViewer" << endl;
#endif
G4VInteractorManager* interactorManager = G4Xo::GetInteractorManager();
Widget top = (Widget)interactorManager->GetMainInteractor ();
if(top==NULL) {
CWarn ("Xt is not initialized !\n");
return;
}
char* defName = CStringDuplicate((char*)fName.data());
CStringReplacePart (&defName,"-","_");
Arg args[1];
char* wname = NULL;
Widget parent = (Widget)interactorManager->GetParentInteractor ();
if(parent==NULL) {
// Create a shell widget.
// Add WMClose does not works on ApplicationShell, then use a TopLevelShell.
char* cname;
wname = CStringCreateF (6+strlen(defName),"shell_%s",defName);
cname = CStringCreateF (6+strlen(defName),"Shell_%s",defName);
fShell = XtAppCreateShell (wname,cname,topLevelShellWidgetClass,XtDisplay(top),args,0);
CStringDelete (wname);
CStringDelete (cname);
interactorManager->AddShell (fShell);
parent = fShell;
wname = CStringDuplicate(defName);
} else {
char* str = interactorManager->GetCreationString ();
if(str==NULL) {
wname = CStringDuplicate (defName);
} else {
wname = CStringDuplicate (str);
}
}
fXoCamera = XtCreateManagedWidget (wname,xoCameraWidgetClass ,parent, args, 0);
fGoCamera = (OCamera) XoCameraGetCamera (fXoCamera);
XoCameraAddPopupEntry (fXoCamera,"Escape",ActivateCallback,NULL);
XtAddCallback (fXoCamera,XoNcollectCallback,CollectCallback,NULL);
if(fShell!=NULL) {
XtRealizeWidget (fShell);
XtMapWidget (fShell);
XEvent event;
XIfEvent (XtDisplay(fShell), &event, WaitForNotify, (char*)XtWindow(fShell));
}
if(fGoCamera==NULL) {
CWarnF ("Can't create OCamera %s\n",wname);
fXoCamera = NULL;
fGoCamera = NULL;
}
interactorManager->SetCreatedInteractor(fXoCamera);
CStringDelete (wname);
CStringDelete (defName);
}
/***************************************************************************/
G4XoViewer::~G4XoViewer (
)
/***************************************************************************/
// Destructor.
/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
{
if(fShell!=NULL) {
G4Xo::GetInteractorManager()->RemoveShell (fShell);
XtDestroyWidget (fShell);
} else if(fXoCamera!=NULL) {
XtDestroyWidget (fXoCamera);
}
fXoCamera = NULL;
fGoCamera = NULL;
}
/***************************************************************************/
void G4XoViewer::ClearView (
)
/***************************************************************************/
{
}
/***************************************************************************/
void G4XoViewer::SetView (
)
/***************************************************************************/
// Calculates view representation based on extent of object being
// viewed and (initial) direction of camera. (Note: it can change
// later due to user interaction via visualization system's GUI.)
/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
{
const G4Point3D target = fVP.GetCurrentTargetPoint ();
G4double radius = fSceneHandler.GetScene()->GetExtent().GetExtentRadius();
if(radius<=0.) radius = 1. * m;
const G4double cameraDistance = fVP.GetCameraDistance (radius);
const G4Point3D& pCamera =
target + cameraDistance * fVP.GetViewpointDirection().unit();
#ifdef DEBUG
G4cout << "G4XoViewer::SetView : target.x " << target.x() << " target.y " << target.y() << " target.z " << target.z() << endl;
G4cout << "G4XoViewer::SetView : dir.x " << fVP.GetViewpointDirection().unit().x() <<
" dir.y " << fVP.GetViewpointDirection().unit().y() <<
" dir.z " << fVP.GetViewpointDirection().unit().z() << endl;
G4cout << "G4XoViewer::SetView : cameraDistance " << cameraDistance << endl;
G4cout << "G4XoViewer::SetView : pCamera.x " << pCamera.x() << " pCamera.y " << pCamera.y() << " pCamera.z " << pCamera.z() << endl;
#endif
OCameraSetCenter (fGoCamera,target.x() ,target.y() ,target.z());
OCameraSetDefaultVRP (fGoCamera,pCamera.x(),pCamera.y(),pCamera.z());
OCameraSetDefaultUpVector (fGoCamera,0.,1.,0.);
OCameraSetField (fGoCamera,-radius,radius);
}
/***************************************************************************/
OCamera G4XoViewer::GetCamera (
)
/***************************************************************************/
{
return fGoCamera;
}
/***************************************************************************/
void G4XoViewer::DrawView (
)
/***************************************************************************/
{
NeedKernelVisit ();
ProcessView ();
FinishView ();
}
/***************************************************************************/
void G4XoViewer::FinishView (
)
/***************************************************************************/
/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
{
}
/***************************************************************************/
void G4XoViewer::ShowView (
)
/***************************************************************************/
{
OCameraViewNode (fGoCamera,fSceneHandler.GetRootNode());
G4Xo::GetInteractorManager() -> SecondaryLoop();
}
/***************************************************************************/
/***************************************************************************/
/***************************************************************************/
Bool WaitForNotify (
Display* d
,XEvent* e
,char* arg
)
/***************************************************************************/
/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
{
/*.........................................................................*/
d = NULL;
return (e->type == MapNotify) && (e->xmap.window == (Window)arg);
}
/***************************************************************************/
void ActivateCallback (
Widget This
,XtPointer a_tag
,XtPointer a_data
)
/***************************************************************************/
/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
{
G4Xo::GetInteractorManager() -> RequireExitSecondaryLoop (XO_EXIT_CODE);
This = NULL;
a_tag = NULL;
a_data = NULL;
}
/***************************************************************************/
void CollectCallback (
Widget This
,XtPointer a_tag
,XtPointer a_data
)
/***************************************************************************/
/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
{
OCamera camera;
ONode* nodes;
int noden,count;
/*.........................................................................*/
// collectCallback = osh> getCameraNodes `thisCamera` | collect ONode where highlight eq 1 | get - name | dump -
camera = (OCamera)XoCameraGetCamera (This);
nodes = OCameraCollect (camera,OCollectHighlighted);
noden = CListGetSize ((CList)nodes);
for(count=0;count<noden;count++)
{
char* name = ONodeGetName(nodes[count]);
CInfoF("%s\n",name==NULL ? "(nil)" : name);
}
CListDelete ((CList)nodes);
This = NULL;
a_tag = NULL;
a_data = NULL;
}
#endif