35 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER    56 #include <Wt/WHBoxLayout>    57 #include <Wt/WApplication>    64 void G4OpenGLWtViewer::CreateMainWindow (
    65   Wt::WGLWidget* glWidget
    71 #ifdef G4DEBUG_VIS_OGL    72   printf(
"G4OpenGLWtViewer::CreateMainWindow \n");
    84   if (UI == NULL) 
return;
    93   bool isTabbedView = 
false;
    99       ResizeWindow(fVP.GetWindowSizeHintX(),fVP.GetWindowSizeHintY());
   101       isTabbedView = fUiWt->AddTabWidget(fWindow->parent(),
name,getWinWidth(),getWinHeight());
   103       fWindow->parent()->decorationStyle().setBackgroundColor (Wt::WColor(
"blue"));
   106 #ifdef G4DEBUG_VIS_OGL   107       printf(
"G4OpenGLWtViewer::CreateMainWindow :: resize :%d %d\n",getWinWidth(),getWinHeight());
   109       fWindow->resize(getWinWidth(),getWinHeight());
   111       fUISceneTreeComponentsTBWidget = fUiWt->GetSceneTreeComponentsTBWidget();
   112       fWindow->resize(fWindow->parent()->width(),fWindow->parent()->height());
   117 #ifdef G4DEBUG_VIS_OGL   119     printf(
"G4OpenGLWtViewer::CreateMainWindow :: UIWt NOt found \n");
   166 #ifdef _A_FINIR_FIXME   180 G4OpenGLWtViewer::G4OpenGLWtViewer (
   181                                     G4OpenGLSceneHandler& scene
   184   ,G4OpenGLViewer (scene)
   186   ,fRecordFrameNumber(0)
   188   ,fMouseAction(STYLE1)
   190   ,fDeltaSceneTranslation(0.01)
   194   ,fHoldKeyEvent(false)
   195   ,fHoldMoveEvent(false)
   196   ,fHoldRotateEvent(false)
   200   ,fMovieTempFolderPath(
"")
   202   ,fParameterFileName(
"mpeg_encode_parameter_file.par")
   203   ,fMovieParametersDialog(NULL)
   204   ,fRecordingStep(WAIT)
   206   ,fNbMaxFramesPerSec(100)
   207   ,fNbMaxAnglePerSec(360)
   208   ,fLaunchSpinDelay(100)
   213   ,fControlKeyPress(false)
   214   ,fShiftKeyPress(false)
   220   G4Wt::getInstance ();
   225 #ifdef G4DEBUG_VIS_OGL   226   printf(
"G4OpenGLWtViewer::Create \n");
   228   fLastPos3 = Wt::WPoint(-1,-1);    
   229   fLastPos2 = Wt::WPoint(-1,-1);    
   230   fLastPos1 = Wt::WPoint(-1,-1);    
   232   mMatrix.setToIdentity();
   234 #ifdef _A_FINIR_FIXME   235   initMovieParameters();
   238   fLastEventTime = 
new Wt::WTime();
   240 #ifdef G4DEBUG_VIS_OGL   241   printf(
"G4OpenGLWtViewer::G4OpenGLWtViewer END\n");
   250 void G4OpenGLWtViewer::resizeGL(
int width, 
int height)
   252 #ifdef G4DEBUG_VIS_OGL   253     printf(
"G4OpenGLWtViewer resizeGL %d %d\n",width,height);
   262 G4OpenGLWtViewer::~G4OpenGLWtViewer (
   267 #ifdef _A_FINIR_FIXME   276 #ifdef _A_FINIR_FIXME   280 void G4OpenGLWtViewer::createPopupMenu()    {
   282   fContextMenu = 
new WMenu(
"All");
   284   WMenu *mMouseAction = fContextMenu->addMenu(
"&Mouse actions");
   286   fRotateAction = mMouseAction->addAction(
"Rotate");
   287   fMoveAction = mMouseAction->addAction(
"Move");
   288   fPickAction = mMouseAction->addAction(
"Pick");
   289   WAction *shortcutsAction = mMouseAction->addAction(
"Show shortcuts");
   291   fRotateAction->setCheckable(
true);
   292   fMoveAction->setCheckable(
false);
   293   fPickAction->setCheckable(
false);
   294   shortcutsAction->setCheckable(
false);
   296   fRotateAction->setChecked(
true);
   297   fMoveAction->setChecked(
false);
   298   fPickAction->setChecked(
false);
   299   shortcutsAction->setChecked(
false);
   301   WObject ::connect(fRotateAction, 
   302                     SIGNAL(triggered(
bool)),
   304                     SLOT(actionMouseRotate()));
   306   WObject ::connect(fMoveAction, 
   307                     SIGNAL(triggered(
bool)),
   309                     SLOT(actionMouseMove()));
   311   WObject ::connect(fPickAction, 
   312                     SIGNAL(triggered(
bool)),
   314                     SLOT(actionMousePick()));
   316   WObject ::connect(shortcutsAction, 
   317                     SIGNAL(triggered(
bool)),
   319                     SLOT(showShortcuts()));
   322   WMenu *mStyle = fContextMenu->addMenu(
"&Style");
   324   WMenu *mRepresentation = mStyle->addMenu(
"&Representation");
   325   WMenu *mProjection = mStyle->addMenu(
"&Projection");
   326   WAction *polyhedron = mRepresentation->addAction(
"Polyhedron");
   327   WAction *nurbs = mRepresentation->addAction(
"NURBS");
   329   WAction *ortho = mProjection->addAction(
"Orthographic");
   330   WAction *perspective = mProjection->addAction(
"Persepective");
   333   G4ViewParameters::RepStyle style;
   334   style = fVP.GetRepStyle();
   335   if (style == G4ViewParameters::polyhedron) {
   336     createRadioAction(polyhedron,nurbs,SLOT(toggleRepresentation(
bool)),1);
   337   } 
else if (style == G4ViewParameters::nurbs) {
   338     createRadioAction(polyhedron,nurbs,SLOT(toggleRepresentation(
bool)),2);
   340     mRepresentation->clear();
   344   if (fVP.GetFieldHalfAngle() == 0) {
   345     createRadioAction(ortho, perspective,SLOT(toggleProjection(
bool)),1);
   347     createRadioAction(ortho, perspective,SLOT(toggleProjection(
bool)),2);
   351   WMenu *mDrawing = mStyle->addMenu(
"&Drawing");
   353   fDrawingWireframe = mDrawing->addAction(
"Wireframe");
   354   fDrawingWireframe->setCheckable(
true);
   356   fDrawingLineRemoval = mDrawing->addAction(
"Hidden line removal");
   357   fDrawingLineRemoval->setCheckable(
true);
   359   fDrawingSurfaceRemoval = mDrawing->addAction(
"Hidden Surface removal");
   360   fDrawingSurfaceRemoval->setCheckable(
true);
   362   fDrawingLineSurfaceRemoval = mDrawing->addAction(
"Hidden line and surface removal");
   363   fDrawingLineSurfaceRemoval->setCheckable(
true);
   367   d_style = fVP.GetDrawingStyle();
   370     fDrawingWireframe->setChecked(
true);
   372     fDrawingLineRemoval->setChecked(
true);
   374     fDrawingSurfaceRemoval->setChecked(
true);
   376     fDrawingLineSurfaceRemoval->setChecked(
true);
   380   WObject ::connect(fDrawingWireframe, 
   381                     SIGNAL(triggered(
bool)),
   383                     SLOT(actionDrawingWireframe()));
   384   WObject ::connect(fDrawingLineRemoval, 
   385                     SIGNAL(triggered(
bool)),
   387                     SLOT(actionDrawingLineRemoval()));
   388   WObject ::connect(fDrawingSurfaceRemoval, 
   389                     SIGNAL(triggered(
bool)),
   391                     SLOT(actionDrawingSurfaceRemoval()));
   392   WObject ::connect(fDrawingLineSurfaceRemoval, 
   393                     SIGNAL(triggered(
bool)),
   395                     SLOT(actionDrawingLineSurfaceRemoval()));
   399   WAction *backgroundColorChooser ;
   402   backgroundColorChooser = mStyle->addAction(
"Background color");
   403   WObject ::connect(backgroundColorChooser, 
   406                     SLOT(actionChangeBackgroundColor()));
   410   WAction *textColorChooser ;
   412   textColorChooser = mStyle->addAction(
"Text color");
   413   WObject ::connect(textColorChooser, 
   416                     SLOT(actionChangeTextColor()));
   420   WAction *defaultColorChooser ;
   422   defaultColorChooser = mStyle->addAction(
"Default color");
   423   WObject ::connect(defaultColorChooser, 
   426                     SLOT(actionChangeDefaultColor()));
   430   WMenu *mActions = fContextMenu->addMenu(
"&Actions");
   431   WAction *createEPS = mActions->addAction(
"Save as ...");
   432   WObject ::connect(createEPS, 
   435                     SLOT(actionSaveImage()));
   438   WAction *movieParameters = mActions->addAction(
"Movie parameters...");
   439   WObject ::connect(movieParameters, 
   442                     SLOT(actionMovieParameters()));
   448   WMenu *mSpecial = fContextMenu->addMenu(
"S&pecial");
   449   WMenu *mTransparency = mSpecial->addMenu(
"Transparency");
   450   WAction *transparencyOn = mTransparency->addAction(
"On");
   451   WAction *transparencyOff = mTransparency->addAction(
"Off");
   453   if (transparency_enabled == 
false) {
   454     createRadioAction(transparencyOn,transparencyOff,SLOT(toggleTransparency(
bool)),2);
   455   } 
else if (transparency_enabled == 
true) {
   456     createRadioAction(transparencyOn,transparencyOff,SLOT(toggleTransparency(
bool)),1);
   462   WMenu *mAntialiasing = mSpecial->addMenu(
"Antialiasing");
   463   WAction *antialiasingOn = mAntialiasing->addAction(
"On");
   464   WAction *antialiasingOff = mAntialiasing->addAction(
"Off");
   466   if (antialiasing_enabled == 
false) {
   467     createRadioAction(antialiasingOn,antialiasingOff,SLOT(toggleAntialiasing(
bool)),2);
   468   } 
else if (antialiasing_enabled == 
true) {
   469     createRadioAction(antialiasingOn,antialiasingOff,SLOT(toggleAntialiasing(
bool)),1);
   471     mAntialiasing->clear();
   474   WMenu *mHaloing = mSpecial->addMenu(
"Haloing");
   475   WAction *haloingOn = mHaloing->addAction(
"On");
   476   WAction *haloingOff = mHaloing->addAction(
"Off");
   478   if (haloing_enabled == 
false) {
   479     createRadioAction(haloingOn,haloingOff,SLOT(toggleHaloing(
bool)),2);
   480   } 
else if (haloing_enabled == 
true) {
   481     createRadioAction(haloingOn,haloingOff,SLOT(toggleHaloing(
bool)),1);
   486   WMenu *mAux = mSpecial->addMenu(
"Auxiliary edges");
   487   WAction *auxOn = mAux->addAction(
"On");
   488   WAction *auxOff = mAux->addAction(
"Off");
   489   if (!fVP.IsAuxEdgeVisible()) {
   490     createRadioAction(auxOn,auxOff,SLOT(toggleAux(
bool)),1);
   492     createRadioAction(auxOn,auxOff,SLOT(toggleAux(
bool)),2);
   497   WMenu *mFullScreen = mSpecial->addMenu(
"&Full screen");
   498   fFullScreenOn = mFullScreen->addAction(
"On");
   499   fFullScreenOff = mFullScreen->addAction(
"Off");
   500   createRadioAction(fFullScreenOn,fFullScreenOff,SLOT(toggleFullScreen(
bool)),2);
   505 void G4OpenGLWtViewer::G4manageContextMenuEvent(WContextMenuEvent *
e)
   508     G4cerr << 
"Visualization window not defined, please choose one before" << 
G4endl;
   515     if ( fContextMenu ) {
   516       fContextMenu->exec( e->globalPos() );
   532 void G4OpenGLWtViewer::createRadioAction(WAction *action1,WAction *action2, 
const std::string& method,
unsigned int nCheck) {
   534   action1->setCheckable(
true);
   535   action2->setCheckable(
true);
   538     action1->setChecked (
true);
   540     action2->setChecked (
true);
   542   WObject ::connect(action1, SIGNAL(triggered(
bool)),action2, SLOT(toggle()));
   543   WObject ::connect(action2, SIGNAL(triggered(
bool)),action1, SLOT(toggle()));
   545   WObject ::connect(action1, SIGNAL(toggled(
bool)),
this, method.c_str());
   552 void G4OpenGLWtViewer::actionMouseRotate() {
   553   emit toggleMouseAction(STYLE1);
   560 void G4OpenGLWtViewer::actionMouseMove() {
   561   emit toggleMouseAction(STYLE2);
   568 void G4OpenGLWtViewer::actionMousePick() {
   569   emit toggleMouseAction(STYLE3);
   576 void G4OpenGLWtViewer::actionDrawingWireframe() {
   577   emit toggleDrawingAction(1);
   583 void G4OpenGLWtViewer::actionDrawingLineRemoval() {
   584   emit toggleDrawingAction(2);
   590 void G4OpenGLWtViewer::actionDrawingSurfaceRemoval() {
   591   emit toggleDrawingAction(3);
   597 void G4OpenGLWtViewer::actionDrawingLineSurfaceRemoval() {
   598   emit toggleDrawingAction(4);
   606 void G4OpenGLWtViewer::toggleMouseAction(mouseActions aAction) {
   608   if ((aAction == STYLE1) || 
   609       (aAction == STYLE2) ||
   610       (aAction == STYLE3))  {
   611     fRotateAction->setChecked (
false);
   612     fMoveAction->setChecked (
false);
   613     fPickAction->setChecked (
false);
   614     fVP.SetPicking(
false);
   615     fMouseAction = aAction;
   618   if (aAction == STYLE1) {  
   620     fRotateAction->setChecked (
true);
   621   } 
else  if (aAction == STYLE2) { 
   622     fMoveAction->setChecked (
true);
   623   } 
else  if (aAction == STYLE3) { 
   624     fPickAction->setChecked (
true);
   625     fVP.SetPicking(
true);
   633 void G4OpenGLWtViewer::showShortcuts() {
   634   G4cout << 
"========= Mouse Shortcuts =========" << 
G4endl;
   635   if (fMouseAction == STYLE1) {  
   636     G4cout << 
"Click and move mouse to rotate volume " << 
G4endl;
   637     G4cout << 
"ALT + Click and move mouse to rotate volume (View Direction)" << 
G4endl;
   638     G4cout << 
"CTRL + Click and zoom mouse to zoom in/out" << 
G4endl;
   639     G4cout << 
"SHIFT + Click and zoommove camera point of view" << 
G4endl;
   640   } 
else  if (fMouseAction == STYLE2) { 
   641     G4cout << 
"Move camera point of view with mouse" << 
G4endl;
   642   } 
else  if (fMouseAction == STYLE3) { 
   645   G4cout << 
"========= Move Shortcuts =========" << 
G4endl;
   646   G4cout << 
"Press left/right arrows to move volume left/right" << 
G4endl;
   647   G4cout << 
"Press up/down arrows to move volume up/down" << 
G4endl;
   648   G4cout << 
"Press '+'/'-' to move volume toward/forward" << 
G4endl;
   650   G4cout << 
"========= Rotation (Theta/Phi) Shortcuts =========" << 
G4endl;
   651   G4cout << 
"Press SHIFT + left/right arrows to rotate volume left/right" << 
G4endl;
   652   G4cout << 
"Press SHIFT + up/down arrows to rotate volume up/down" << 
G4endl;
   654   G4cout << 
"========= Rotation (View Direction) Shortcuts =========" << 
G4endl;
   655   G4cout << 
"Press ALT + left/right to rotate volume around vertical direction" << 
G4endl;
   656   G4cout << 
"Press ALT + up/down to rotate volume around horizontal direction" << 
G4endl;
   659   G4cout << 
"Press CTRL + '+'/'-' to zoom into volume" << 
G4endl;
   662   G4cout << 
"Press ALT +/- to slow/speed rotation/move" << 
G4endl;
   668   G4cout << 
" Press SPACE to Start/Pause video recording " << 
G4endl;
   669   G4cout << 
" Press RETURN to Stop video recording " << 
G4endl;
   675 #ifdef _A_FINIR_FIXME   687 void G4OpenGLWtViewer::toggleDrawingAction(
int aAction) {
   693   if ((aAction >0) && (aAction <5)) {
   694     fDrawingWireframe->setChecked (
false);
   695     fDrawingLineRemoval->setChecked (
false);
   696     fDrawingSurfaceRemoval->setChecked (
false);
   697     fDrawingLineSurfaceRemoval->setChecked (
false);
   700     fDrawingWireframe->setChecked (
true);
   704   } 
else  if (aAction ==2) {
   705     fDrawingLineRemoval->setChecked (
true);
   709   } 
else  if (aAction ==3) {
   710     fDrawingSurfaceRemoval->setChecked (
true);
   714   } 
else  if (aAction ==4) {
   715     fDrawingLineSurfaceRemoval->setChecked (
true);
   718   fVP.SetDrawingStyle(d_style);
   734 void G4OpenGLWtViewer::toggleRepresentation(
bool check) {
   736   G4ViewParameters::RepStyle style;
   738     style = G4ViewParameters::polyhedron;
   740     style = G4ViewParameters::nurbs;
   742   fVP.SetRepStyle (style);
   757 void G4OpenGLWtViewer::toggleProjection(
bool check) {
   772 void G4OpenGLWtViewer::toggleTransparency(
bool check) {
   775     transparency_enabled = 
false;
   777     transparency_enabled = 
true;
   779   SetNeedKernelVisit (
true);
   787 void G4OpenGLWtViewer::toggleAntialiasing(
bool check) {
   790     antialiasing_enabled = 
false;
   791     glDisable (GL_LINE_SMOOTH);
   792     glDisable (GL_POLYGON_SMOOTH);
   794     antialiasing_enabled = 
true;
   795     glEnable (GL_LINE_SMOOTH);
   796     glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
   797     glEnable (GL_POLYGON_SMOOTH);
   798     glHint (GL_POLYGON_SMOOTH_HINT, GL_NICEST);
   809 void G4OpenGLWtViewer::toggleHaloing(
bool check) {
   811     haloing_enabled = 
false;
   813     haloing_enabled = 
true;
   824 void G4OpenGLWtViewer::toggleAux(
bool check) {
   826     fVP.SetAuxEdgeVisible(
true);
   828     fVP.SetAuxEdgeVisible(
false);
   830   SetNeedKernelVisit (
true);
   837 void G4OpenGLWtViewer::toggleFullScreen(
bool check) {
   838   if (check != fGLWindow->isFullScreen()) { 
   839     fGLWindow->setWindowState(fGLWindow->windowState() ^ Wt::WindowFullScreen);
   840     G4cerr << 
"This version of Wt could not do fullScreen. Resizing the widget is the only solution available." << 
G4endl;
   845 #ifdef _A_FINIR_FIXME   846 void G4OpenGLWtViewer::savePPMToTemp() {
   847   if (fMovieTempFolderPath == 
"") {
   850   Wt::WString fileName =
"Test"+Wt::WString::number(fRecordFrameNumber)+
".ppm";
   851   Wt::WString filePath =fMovieTempFolderPath+fileName;
   854   image = fWindow->grabFrameBuffer();
   857   res = image.save(filePath,0);
   860     setRecordingInfos(
"Can't save tmp file "+filePath);
   864   setRecordingInfos(
"File "+fileName+
" saved");
   865   fRecordFrameNumber++;
   870 void G4OpenGLWtViewer::actionSaveImage() {
   872   WList<WByteArray> formats =  WImageWriter::supportedImageFormats ();
   873   for (
int i = 0; i < formats.size(); ++i) {
   874     filters +=formats.at(i) + 
";;";
   879   Wt::WString* selectedFormat = 
new Wt::WString();
   881   name =  WFileDialog::getSaveFileName ( fGLWindow,
   885                                                     selectedFormat ).toUTF8().c_str(); 
   890   name += 
"." + selectedFormat->toUTF8();
   891   Wt::WString format = selectedFormat->
toLower();
   892   setPrintFilename(name.c_str(),0);
   893   G4OpenGLWtExportDialog* exportDialog= 
new G4OpenGLWtExportDialog(fGLWindow,format,fWindow->height(),fWindow->width());
   894   if(  exportDialog->exec()) {
   898     if ((exportDialog->getWidth() !=fWindow->width()) ||
   899         (exportDialog->getHeight() !=fWindow->height())) {
   900       setPrintSize(exportDialog->getWidth(),exportDialog->getHeight());
   901       if ((format != Wt::WString(
"eps")) && (format != Wt::WString(
"ps"))) {
   902       G4cerr << 
"Export->Change Size : This function is not implemented, to export in another size, please resize your frame to what you need" << 
G4endl;
   921       image = fWindow->grabFrameBuffer();
   923     if (format == Wt::WString(
"eps")) {
   924       fVectoredPs = exportDialog->getVectorEPS();
   926     } 
else if (format == 
"ps") {
   929     } 
else if (format == 
"pdf") {
   931       res = printPDF(name,exportDialog->getNbColor(),image);
   933     } 
else if ((format == 
"tif") ||
   934                (format == 
"tiff") ||
   936                (format == 
"jpeg") ||
   944       res = image.save(Wt::WString(name.c_str()),0,exportDialog->getSliderValue());
   946       G4cerr << 
"This version of G4UI Could not generate the selected format" << 
G4endl;
   948     if ((format == Wt::WString(
"eps")) && (format == Wt::WString(
"ps"))) {
   950         G4cerr << 
"Error while saving file... "<<name.c_str()<< 
G4endl;
   952         G4cout << 
"File "<<name.c_str()<<
" has been saved " << 
G4endl;
   964 #ifdef _A_FINIR_FIXME   965 void G4OpenGLWtViewer::actionChangeBackgroundColor() {
   974   color = WColorDialog::getColor(Wt::black, fGLWindow);
   975   if (color.isValid()) {
   976     Wt::WString com = 
"/vis/viewer/set/background ";
   978     com += num.setNum(((
float)color.red())/256)+
" ";
   979     com += num.setNum(((
float)color.green())/256)+
" ";
   980     com += num.setNum(((
float)color.blue())/256)+
" ";
   986 void G4OpenGLWtViewer::actionChangeTextColor() {
   989   color = WColorDialog::getColor(
Wt::yellow, fGLWindow);
   990   if (color.isValid()) {
   991     Wt::WString com = 
"/vis/viewer/set/defaultTextColour ";
   993     com += num.setNum(((
float)color.red())/256)+
" ";
   994     com += num.setNum(((
float)color.green())/256)+
" ";
   995     com += num.setNum(((
float)color.blue())/256)+
" ";
  1001 void G4OpenGLWtViewer::actionChangeDefaultColor() {
  1004   color = WColorDialog::getColor(Wt::white, fGLWindow);
  1005   printf(
"actionChangeDefaultColor\n");
  1006   if (color.isValid()) {
  1007     Wt::WString com = 
"/vis/viewer/set/defaultColour ";
  1009     com += num.setNum(((
float)color.red())/256)+
" ";
  1010     com += num.setNum(((
float)color.green())/256)+
" ";
  1011     com += num.setNum(((
float)color.blue())/256)+
" ";
  1018 void G4OpenGLWtViewer::actionMovieParameters() {
  1019   showMovieParametersDialog();
  1023 void G4OpenGLWtViewer::showMovieParametersDialog() {
  1024   if (!fMovieParametersDialog) {
  1025     fMovieParametersDialog= 
new G4OpenGLWtMovieDialog(
this,fGLWindow);
  1026     displayRecordingStatus();
  1027     fMovieParametersDialog->checkEncoderSwParameters();
  1028     fMovieParametersDialog->checkSaveFileNameParameters();
  1029     fMovieParametersDialog->checkTempFolderParameters();
  1030     if (getEncoderPath() == 
"") {
  1031       setRecordingInfos(
"mpeg_encode is needed to encode in video format. It is available here: http://bmrc.berkeley.edu/frame/research/mpeg/");
  1034   fMovieParametersDialog->show();
  1060 void G4OpenGLWtViewer::G4MousePressEvent(Wt::WMouseEvent *event)
  1062     if (event->button() & Wt::WMouseEvent::LeftButton) {
  1063 #ifdef _A_FINIR_FIXME  1064     fWindow->setMouseTracking(
true);
  1067     fLastPos1 = Wt::WPoint(event->widget().x,
event->widget().y);
  1068     fLastPos2 = fLastPos1;
  1069     fLastPos3 = fLastPos2;
  1071     if (fMouseAction == STYLE3){  
  1072       Pick(event->widget().x,
event->widget().y);
  1079 void G4OpenGLWtViewer::G4MouseReleaseEvent()
  1082   Wt::WPoint delta = Wt::WPoint(fLastPos3.x()-fLastPos1.x(),fLastPos3.y()-fLastPos1.y());
  1083   if ((delta.x() == 0) && (delta.y() == 0)) {
  1086   if (fSpinningDelay < fLaunchSpinDelay ) {
  1088     Wt::WTime lastMoveTime;
  1091     float correctionFactor = 5;
  1094         if ( 1 >= (
int)(1000/fNbMaxFramesPerSec)) {
  1095         float lTime = 1000/((float)1);
  1096         if (((((
float)delta.x())/correctionFactor)*lTime > fNbMaxAnglePerSec) ||
  1097             ((((
float)delta.x())/correctionFactor)*lTime < -fNbMaxAnglePerSec) ) {
  1098           correctionFactor = (float)delta.x()*(lTime/fNbMaxAnglePerSec);
  1099           if (delta.x() <0 ) {
  1100             correctionFactor = -correctionFactor;
  1103         if (((((
float)delta.y())/correctionFactor)*lTime > fNbMaxAnglePerSec) ||
  1104             ((((
float)delta.y())/correctionFactor)*lTime < -fNbMaxAnglePerSec) ) {
  1105           correctionFactor = (float)delta.y()*(lTime/fNbMaxAnglePerSec);
  1106           if (delta.y() <0 ) {
  1107             correctionFactor = -correctionFactor;
  1118         if (fMouseAction == STYLE1) {  
  1120             rotateWtScene(((
float)delta.x())/correctionFactor,((
float)delta.y())/correctionFactor);
  1121           } 
else if (fAltKeyPress) {
  1122             rotateWtSceneToggle(((
float)delta.x())/correctionFactor,((
float)delta.y())/correctionFactor);
  1125         } 
else if (fMouseAction == STYLE2) {  
  1126           moveScene(-((
float)delta.x())/correctionFactor,-((
float)delta.y())/correctionFactor,0,
true);
  1130 #ifdef _A_FINIR_FIXME  1131       ((Wt::WApplication*)G4Wt::getInstance ())->processEvents();
  1135 #ifdef _A_FINIR_FIXME  1136   fWindow->setMouseTracking(
false);
  1141 void G4OpenGLWtViewer::G4MouseDoubleClickEvent()
  1143 #ifdef _A_FINIR_FIXME  1144   fWindow->setMouseTracking(
true);
  1156  void G4OpenGLWtViewer::G4MouseMoveEvent(Wt::WMouseEvent *event)
  1159   Wt::WMouseEvent::Button mButtons = 
event->button();
  1161 #ifdef _A_FINIR_FIXME  1162   updateKeyModifierState(event->modifiers());
  1169   fLastPos3 = fLastPos2;
  1170   fLastPos2 = fLastPos1;
  1171   fLastPos1 = Wt::WPoint(event->widget().x, 
event->widget().y);
  1173   printf(
"G4OpenGLWtViewer move :%d %d\n",event->widget().x, 
event->widget().y);
  1174   int deltaX = fLastPos2.x()-fLastPos1.x();
  1175   int deltaY = fLastPos2.y()-fLastPos1.y();
  1177   if (fMouseAction == STYLE1) {  
  1178     if (mButtons & Wt::WMouseEvent::LeftButton) {
  1180         rotateWtScene(((
float)deltaX),((
float)deltaY));
  1181       } 
else if (fAltKeyPress) {
  1182         rotateWtSceneToggle(((
float)deltaX),((
float)deltaY));
  1183       } 
else if (fShiftKeyPress) {
  1184         unsigned int sizeWin;
  1185         sizeWin = getWinWidth();
  1186         if (getWinHeight() < getWinWidth()) {
  1187           sizeWin = getWinHeight();
  1191         float factor = ((float)100/(
float)sizeWin) ;
  1192         moveScene(-(
float)deltaX*factor,-(
float)deltaY*factor,0,
false);
  1193       } 
else if (fControlKeyPress) {
  1194         fVP.SetZoomFactor(fVP.GetZoomFactor()*(1+((float)deltaY))); 
  1197   } 
else if (fMouseAction == STYLE2) {  
  1198     if (mButtons & Wt::WMouseEvent::LeftButton) {
  1199       moveScene(-deltaX,-deltaY,0,
true);
  1214 void G4OpenGLWtViewer::moveScene(
float dx,
float dy, 
float dz,
bool mouseMove)
  1218   fHoldMoveEvent = 
true;
  1221   GLdouble coefDepth = 0;
  1224     if (getWinHeight() <getWinWidth()) {
  1228     coefTrans = getSceneNearWidth()*fDeltaSceneTranslation;
  1229     coefDepth = getSceneDepth()*fDeltaDepth;
  1231   fVP.IncrementPan(-dx*coefTrans,dy*coefTrans,dz*coefDepth);
  1234 #ifdef _A_FINIR_FIXME  1235     ((WApplication*)G4Wt::getInstance ())->processEvents();
  1238   fHoldMoveEvent = 
false;
  1247 void G4OpenGLWtViewer::rotateWtScene(
float dx, 
float dy)
  1249   if (fHoldRotateEvent)
  1251   fHoldRotateEvent = 
true;
  1261   fHoldRotateEvent = 
false;
  1269 void G4OpenGLWtViewer::rotateWtSceneToggle(
float dx, 
float dy)
  1271   if (fHoldRotateEvent)
  1273   fHoldRotateEvent = 
true;
  1275   rotateSceneToggle(dx,dy);
  1279   fHoldRotateEvent = 
false;
  1294 void G4OpenGLWtViewer::rescaleImage(
  1313 #ifdef _A_FINIR_FIXME  1320 bool G4OpenGLWtViewer::printPDF (
  1321  const std::string aFilename
  1333   if ((!aImage.isGrayscale ()) &&(aInColor ==1 )) {
  1334     aImage = aImage.convertToFormat ( aImage.format(), Wt::MonoOnly);
  1338   if (aFilename.substr(aFilename.size()-3) == 
".ps") {
  1339 #if WT_VERSION > 0x040200  1340     printer.setOutputFormat(WPrinter::PostScriptFormat);
  1343 #if WT_VERSION > 0x040100  1344     printer.setOutputFormat(WPrinter::PdfFormat);
  1347 #if WT_VERSION > 0x040100  1348   printer.setOutputFileName(Wt::WString(aFilename.c_str()));
  1351   WPainter paint(&printer);
  1352   paint.drawImage (0,0,aImage);
  1359 void G4OpenGLWtViewer::G4wheelEvent (Wt::WWheelEvent * event)
  1361   fVP.SetZoomFactor(fVP.GetZoomFactor()+(fVP.GetZoomFactor()*(
event->delta())/1200)); 
  1366  void G4OpenGLWtViewer::G4keyPressEvent (Wt::WKeyEvent * event) 
  1371   fHoldKeyEvent = 
true;
  1375 #ifdef _A_FINIR_FIXME  1376   updateKeyModifierState(event->modifiers());
  1378   if ((fNoKeyPress)) { 
  1379     if (event->key() == Wt::Key_Down) { 
  1380       moveScene(0,1,0,
false);
  1382     else if (event->key() == Wt::Key_Up) {  
  1383       moveScene(0,-1,0,
false);
  1385     if (event->key() == Wt::Key_Left) { 
  1386       moveScene(-1,0,0,
false);
  1388     else if (event->key() == Wt::Key_Right) { 
  1389       moveScene(1,0,0,
false);
  1391     if (event->text() == Wt::WString(
"-") ) { 
  1392       moveScene(0,0,1,
false);
  1394     else if (event->text() == Wt::WString(
"+")) { 
  1395       moveScene(0,0,-1,
false);
  1399     if (event->key() == Wt::Key_Escape) {
  1400 #ifdef _A_FINIR_FIXME  1401       toggleFullScreen(
false);
  1411 #ifdef _A_FINIR_FIXME  1412   if ( (event->key() == Wt::Key_Enter)){ 
  1415   if (event->key() == Wt::Key_Space){ 
  1421   if (event->key() == Wt::Key_H){ 
  1423     fDeltaSceneTranslation = 0.01;
  1428     fVP.SetZoomFactor(1.);
  1430     fVP.SetViewAndLights (
G4Vector3D (0., 0., 1.));
  1436   if (fShiftKeyPress) {
  1437     if (event->key() == Wt::Key_Down) { 
  1438       rotateWtScene(0,-fDeltaRotation);
  1440     else if (event->key() == Wt::Key_Up) { 
  1441       rotateWtScene(0,fDeltaRotation);
  1443     if (event->key() == Wt::Key_Left) { 
  1444       rotateWtScene(fDeltaRotation,0);
  1446     else if (event->key() == Wt::Key_Right) { 
  1447       rotateWtScene(-fDeltaRotation,0);
  1452   if ((fAltKeyPress)) {
  1453     if (event->key() == Wt::Key_Down) { 
  1454       rotateWtSceneToggle(0,-fDeltaRotation);
  1456     else if (event->key() == Wt::Key_Up) { 
  1457       rotateWtSceneToggle(0,fDeltaRotation);
  1459     if (event->key() == Wt::Key_Left) { 
  1460       rotateWtSceneToggle(fDeltaRotation,0);
  1462     else if (event->key() == Wt::Key_Right) { 
  1463       rotateWtSceneToggle(-fDeltaRotation,0);
  1467     if (event->text() == Wt::WString(
"+")) {
  1468       fDeltaRotation = fDeltaRotation/0.7;
  1469       G4cout << 
"Auto-rotation set to : " << fDeltaRotation << 
G4endl;
  1471     else if (event->text() == Wt::WString(
"-")) {
  1472       fDeltaRotation = fDeltaRotation*0.7;
  1473       G4cout << 
"Auto-rotation set to : " << fDeltaRotation << 
G4endl;
  1478   if ((fControlKeyPress)) {
  1479     if (event->text() == Wt::WString(
"+")) {
  1480       fVP.SetZoomFactor(fVP.GetZoomFactor()*(1+fDeltaZoom)); 
  1483     else if (event->text() == Wt::WString(
"-")) {
  1484       fVP.SetZoomFactor(fVP.GetZoomFactor()*(1-fDeltaZoom)); 
  1489   fHoldKeyEvent = 
false;
  1493 #ifdef _A_FINIR_FIXME  1494 void  G4OpenGLWtViewer::updateKeyModifierState(Wt::KeyboardModifiers modifier) {
  1498   fAltKeyPress = 
false;
  1499   fShiftKeyPress = 
false;
  1500   fControlKeyPress = 
false;
  1502   if (modifier & Wt::AltModifier ) {
  1503     fAltKeyPress = 
true;
  1504     fNoKeyPress = 
false;
  1506   if (modifier & Wt::ShiftModifier ) {
  1507     fShiftKeyPress = 
true;
  1508     fNoKeyPress = 
false;
  1510   if (modifier & Wt::ControlModifier ) {
  1511     fControlKeyPress = 
true;
  1512     fNoKeyPress = 
false;
  1518 void G4OpenGLWtViewer::stopVideo() {
  1521   if (!fMovieParametersDialog) {
  1522     showMovieParametersDialog();
  1524   setRecordingStatus(STOP);
  1526   if (fRecordFrameNumber >0) {
  1528     if (!(fMovieParametersDialog->checkEncoderSwParameters())) {
  1529       setRecordingStatus(BAD_ENCODER);
  1530     }  
else if (!(fMovieParametersDialog->checkSaveFileNameParameters())) {
  1531       setRecordingStatus(BAD_OUTPUT);
  1535     setRecordingInfos(
"No frame to encode.");
  1541 void G4OpenGLWtViewer::saveVideo() {
  1544   if (!fMovieParametersDialog) {
  1545     showMovieParametersDialog();
  1548   fMovieParametersDialog->checkEncoderSwParameters();
  1549   fMovieParametersDialog->checkSaveFileNameParameters();
  1551   if (fRecordingStep == STOP) {
  1552     setRecordingStatus(SAVE);
  1553     generateMpegEncoderParameters();
  1561 void G4OpenGLWtViewer::startPauseVideo() {
  1565   if (( fRecordingStep == WAIT)) {
  1566     if ( fRecordFrameNumber == 0) {
  1567       if (getTempFolderPath() == 
"") { 
  1568         showMovieParametersDialog();
  1569         setRecordingInfos(
"You should specified the temp folder in order to make movie");
  1573         Wt::WString 
tmp = removeTempFolder();
  1575           setRecordingInfos(tmp);
  1578         tmp = createTempFolder();
  1580           setRecordingInfos(
"Can't create temp folder."+tmp);
  1586   if ((fRecordingStep == WAIT)) {
  1587     setRecordingStatus(
START); 
  1588   } 
else if (fRecordingStep == 
START) {
  1589     setRecordingStatus(PAUSE);
  1590   } 
else if (fRecordingStep == PAUSE) {
  1591     setRecordingStatus(CONTINUE);
  1592   } 
else if (fRecordingStep == CONTINUE) {
  1593     setRecordingStatus(PAUSE);
  1597 void G4OpenGLWtViewer::setRecordingStatus(RECORDING_STEP step) {
  1599   fRecordingStep = step;
  1600   displayRecordingStatus();
  1604 void G4OpenGLWtViewer::displayRecordingStatus() {
  1606   Wt::WString txtStatus = 
"";
  1607   if (fRecordingStep == WAIT) {
  1608     txtStatus  = 
"Waiting to start...";
  1609     fRecordFrameNumber = 0; 
  1610   } 
else if (fRecordingStep == 
START) {
  1611     txtStatus  = 
"Start Recording...";
  1612   } 
else if (fRecordingStep == PAUSE) {
  1613     txtStatus  = 
"Pause Recording...";
  1614   } 
else if (fRecordingStep == CONTINUE) {
  1615     txtStatus  = 
"Continue Recording...";
  1616   } 
else if (fRecordingStep == STOP) {
  1617     txtStatus  = 
"Stop Recording...";
  1618   } 
else if (fRecordingStep == READY_TO_ENCODE) {
  1619     txtStatus  = 
"Ready to Encode...";
  1620   } 
else if (fRecordingStep == 
ENCODING) {
  1621     txtStatus  = 
"Encoding...";
  1622   } 
else if (fRecordingStep == FAILED) {
  1623     txtStatus  = 
"Failed to encode...";
  1624   } 
else if ((fRecordingStep == BAD_ENCODER)
  1625          || (fRecordingStep == BAD_OUTPUT)
  1626              || (fRecordingStep == BAD_TMP)) {
  1627     txtStatus  = 
"Correct above errors first";
  1628   } 
else if (fRecordingStep == SUCCESS) {
  1629     txtStatus  = 
"File encoded successfully";
  1633   if (fMovieParametersDialog) {
  1634     fMovieParametersDialog->setRecordingStatus(txtStatus);
  1638   setRecordingInfos(
"");
  1642 void G4OpenGLWtViewer::setRecordingInfos(Wt::WString txt) {
  1643   if (fMovieParametersDialog) {
  1644     fMovieParametersDialog->setRecordingInfos(txt);
  1652 void G4OpenGLWtViewer::initMovieParameters() {
  1656      fProcess = 
new WProcess();
  1658      WObject ::connect(fProcess,SIGNAL(finished ( 
int)),
  1659                this,SLOT(processLookForFinished()));
  1660      fProcess->setReadChannelMode(WProcess::MergedChannels);
  1661      fProcess->start (
"which mpeg_encode");
  1667 Wt::WString G4OpenGLWtViewer::getEncoderPath() {
  1668   return fEncoderPath;
  1676 Wt::WString G4OpenGLWtViewer::setEncoderPath(Wt::WString path) {
  1678     return "File does not exist";
  1681   path =  WDir::cleanPath(path);
  1682   WFileInfo *
f = 
new WFileInfo(path);
  1684     return "File does not exist";
  1685   } 
else if (f->isDir()) {
  1686     return "This is a directory";
  1687   } 
else if (!f->isExecutable()) {
  1688     return "File exist but is not executable";
  1689   } 
else if (!f->isFile()) {
  1690     return "This is not a file";
  1692   fEncoderPath = path;
  1694   if ((fRecordingStep == BAD_ENCODER)) {
  1695     setRecordingStatus(STOP);
  1701 bool G4OpenGLWtViewer::isRecording(){
  1702   if ((fRecordingStep == 
START) || (fRecordingStep == CONTINUE)) {
  1708 bool G4OpenGLWtViewer::isPaused(){
  1709   if (fRecordingStep == PAUSE) {
  1715 bool G4OpenGLWtViewer::isEncoding(){
  1722 bool G4OpenGLWtViewer::isWaiting(){
  1723   if (fRecordingStep == WAIT) {
  1729 bool G4OpenGLWtViewer::isStopped(){
  1730   if (fRecordingStep == STOP) {
  1736 bool G4OpenGLWtViewer::isFailed(){
  1737   if (fRecordingStep == FAILED) {
  1743 bool G4OpenGLWtViewer::isSuccess(){
  1744   if (fRecordingStep == SUCCESS) {
  1750 bool G4OpenGLWtViewer::isBadEncoder(){
  1751   if (fRecordingStep == BAD_ENCODER) {
  1756 bool G4OpenGLWtViewer::isBadTmp(){
  1757   if (fRecordingStep == BAD_TMP) {
  1762 bool G4OpenGLWtViewer::isBadOutput(){
  1763   if (fRecordingStep == BAD_OUTPUT) {
  1769 void G4OpenGLWtViewer::setBadEncoder(){
  1770   fRecordingStep = BAD_ENCODER;
  1771   displayRecordingStatus();
  1773 void G4OpenGLWtViewer::setBadTmp(){
  1774   fRecordingStep = BAD_TMP;
  1775   displayRecordingStatus();
  1777 void G4OpenGLWtViewer::setBadOutput(){
  1778   fRecordingStep = BAD_OUTPUT;
  1779   displayRecordingStatus();
  1782 void G4OpenGLWtViewer::setWaiting(){
  1783   fRecordingStep = WAIT;
  1784   displayRecordingStatus();
  1788 bool G4OpenGLWtViewer::isReadyToEncode(){
  1789   if (fRecordingStep == READY_TO_ENCODE) {
  1795 void G4OpenGLWtViewer::resetRecording() {
  1796     setRecordingStatus(WAIT);
  1803 Wt::WString G4OpenGLWtViewer::setTempFolderPath(Wt::WString path) {
  1806     return "Path does not exist";
  1808   path =  WDir::cleanPath(path);
  1809   WFileInfo *
d = 
new WFileInfo(path);
  1811     return "Path does not exist";
  1812   } 
else if (!d->isDir()) {
  1813     return "This is not a directory";
  1814   } 
else if (!d->isReadable()) {
  1815     return path +
" is read protected";
  1816   } 
else if (!d->isWritable()) {
  1817     return path +
" is write protected";
  1820   if ((fRecordingStep == BAD_TMP)) {
  1821     setRecordingStatus(WAIT); 
  1823   fTempFolderPath = path;
  1829 Wt::WString G4OpenGLWtViewer::getTempFolderPath() {
  1830   return fTempFolderPath;
  1837 Wt::WString G4OpenGLWtViewer::setSaveFileName(Wt::WString path) {
  1840     return "Path does not exist";
  1843   WFileInfo *
file = 
new WFileInfo(path);
  1844   WDir 
dir = file->dir();
  1845   path =  WDir::cleanPath(path);
  1846   if (file->exists()) {
  1847     return "File already exist, please choose a new one";
  1848   } 
else if (!dir.exists()) {
  1849     return "Dir does not exist";
  1850   } 
else if (!dir.isReadable()) {
  1851     return path +
" is read protected";
  1854   if ((fRecordingStep == BAD_OUTPUT)) {
  1855     setRecordingStatus(STOP); 
  1857   fSaveFileName = path;
  1863 Wt::WString G4OpenGLWtViewer::getSaveFileName() {
  1864   return fSaveFileName ;
  1871 Wt::WString G4OpenGLWtViewer::createTempFolder() {
  1872   fMovieTempFolderPath = 
"";
  1874   Wt::WString 
tmp = setTempFolderPath(fTempFolderPath);
  1878   Wt::WString sep = Wt::WString(WDir::separator());
  1879   Wt::WString path = sep+
"WtMovie_"+WDateTime::currentDateTime ().toString(
"dd-MM-yyyy_hh-mm-ss")+sep; 
  1880   WDir *d = 
new WDir(WDir::cleanPath(fTempFolderPath));
  1882   if (d->exists(path)) {
  1883     return "Folder "+path+
" already exists.Please remove it first";
  1885   if (d->mkdir(fTempFolderPath+path)) {
  1886     fMovieTempFolderPath = fTempFolderPath+path;
  1889     return "Can't create "+fTempFolderPath+path;
  1896 Wt::WString G4OpenGLWtViewer::removeTempFolder() {
  1898   if (fMovieTempFolderPath == 
"") {
  1901   WDir *d = 
new WDir(WDir::cleanPath(fMovieTempFolderPath));
  1906   d->setFilter( WDir::Files );
  1907   Wt::WStringList subDirList = d->entryList();
  1909   Wt::WString 
error = 
"";
  1910   for (Wt::WStringList::ConstIterator it = subDirList.begin() ;(it != subDirList.end()) ; it++) {
  1911     const Wt::WString currentFile = *it;
  1912       if (!d->remove(currentFile)) {
  1914         Wt::WString file = fMovieTempFolderPath+currentFile;
  1915         error +=
"Removing file failed : "+
file;
  1920     if (d->rmdir(fMovieTempFolderPath)) {
  1921       fMovieTempFolderPath = 
"";
  1924       return "Dir "+fMovieTempFolderPath+
" should be empty, but could not remove it";
  1928   return "Could not remove "+fMovieTempFolderPath+
" because of the following errors :"+
error;
  1933 bool G4OpenGLWtViewer::hasPendingEvents () {
  1934 #ifdef _A_FINIR_FIXME  1935   return ((WApplication*)G4Wt::getInstance ())->hasPendingEvents ();
  1940 bool G4OpenGLWtViewer::generateMpegEncoderParameters () {
  1944   fp = fopen (Wt::WString(fMovieTempFolderPath+fParameterFileName).toUTF8().c_str(), 
"w");
  1947     setRecordingInfos(
"Generation of parameter file failed");
  1951   fprintf (fp,
"# parameter file template with lots of comments to assist you\n");
  1953   fprintf (fp,
"# you can use this as a template, copying it to a separate file then modifying\n");
  1954   fprintf (fp,
"# the copy\n");
  1957   fprintf (fp,
"# any line beginning with '#' is a comment\n");
  1959   fprintf (fp,
"# no line should be longer than 255 characters\n");
  1962   fprintf (fp,
"# general format of each line is:\n");
  1963   fprintf (fp,
"#      \n");
  1965   fprintf (fp,
"# lines can generally be in any order\n");
  1967   fprintf (fp,
"# an exception is the option 'INPUT' which must be followed by input\n");
  1968   fprintf (fp,
"# files in the order in which they must appear, followed by 'END_INPUT'\n");
  1970   fprintf (fp,
"# Also, if you use the `command` method of generating input file names,\n");
  1971   fprintf (fp,
"# the command will only be executed in the INPUT_DIR if INPUT_DIR preceeds\n");
  1972   fprintf (fp,
"# the INPUT parameter.\n");
  1974   fprintf (fp,
"#  MUST be in UPPER CASE\n");
  1977   fprintf (fp,
"# Pattern affects speed, quality and compression. See the User's Guide\n");
  1978   fprintf (fp,
"# for more info.\n");
  1980   fprintf (fp,
"PATTERN      IBBPBBPBBPBBPBBP\n");
  1981   fprintf (fp,
"OUTPUT       %s\n",getSaveFileName().toUTF8().c_str());
  1983   fprintf (fp,
"# mpeg_encode really only accepts 3 different file formats, but using a\n");
  1984   fprintf (fp,
"# conversion statement it can effectively handle ANY file format\n");
  1986   fprintf (fp,
"# You must specify the type of the input files.  The choices are:\n");
  1987   fprintf (fp,
"#    YUV, PPM, JMOVIE, Y, JPEG, PNM\n");
  1988   fprintf (fp,
"#    (must be upper case)\n");
  1990   fprintf (fp,
"BASE_FILE_FORMAT PPM\n");
  1993   fprintf (fp,
"# if YUV format (or using parallel version), must provide width and height\n");
  1994   fprintf (fp,
"# YUV_SIZE   widthxheight\n");
  1995   fprintf (fp,
"# this option is ignored if BASE_FILE_FORMAT is not YUV and you're running\n");
  1996   fprintf (fp,
"# on just one machine\n");
  1998   fprintf (fp,
"YUV_SIZE 352x240\n");
  2000   fprintf (fp,
"# If you are using YUV, there are different supported file formats.\n");
  2001   fprintf (fp,
"# EYUV or UCB are the same as previous versions of this encoder.\n");
  2002   fprintf (fp,
"# (All the Y's, then U's then V's, in 4:2:0 subsampling.)\n");
  2003   fprintf (fp,
"# Other formats, such as Abekas, Phillips, or a general format are\n");
  2004   fprintf (fp,
"# permissible, the general format is a string of Y's, U's, and V's\n");
  2005   fprintf (fp,
"# to specify the file order.\n");
  2007   fprintf (fp,
"INPUT_FORMAT UCB\n");
  2009   fprintf (fp,
"# the conversion statement\n");
  2011   fprintf (fp,
"# Each occurrence of '*' will be replaced by the input file\n");
  2013   fprintf (fp,
"# e.g., if you have a bunch of GIF files, then this might be:\n");
  2014   fprintf (fp,
"#    INPUT_CONVERT   giftoppm *\n");
  2016   fprintf (fp,
"# e.g., if you have a bunch of files like a.Y a.U a.V, etc., then:\n");
  2017   fprintf (fp,
"#    INPUT_CONVERT   cat *.Y *.U *.V\n");
  2019   fprintf (fp,
"# e.g., if you are grabbing from laser disc you might have something like\n");
  2020   fprintf (fp,
"#    INPUT_CONVERT   goto frame *; grabppm\n");
  2021   fprintf (fp,
"# 'INPUT_CONVERT *' means the files are already in the base file format\n");
  2023   fprintf (fp,
"INPUT_CONVERT    * \n");
  2025   fprintf (fp,
"# number of frames in a GOP.\n");
  2027   fprintf (fp,
"# since each GOP must have at least one I-frame, the encoder will find the\n");
  2028   fprintf (fp,
"# the first I-frame after GOP_SIZE frames to start the next GOP\n");
  2030   fprintf (fp,
"# later, will add more flexible GOP signalling\n");
  2032   fprintf (fp,
"GOP_SIZE 16\n");
  2034   fprintf (fp,
"# number of slices in a frame\n");
  2036   fprintf (fp,
"# 1 is a good number.  another possibility is the number of macroblock rows\n");
  2037   fprintf (fp,
"# (which is the height divided by 16)\n");
  2039   fprintf (fp,
"SLICES_PER_FRAME 1\n");
  2041   fprintf (fp,
"# directory to get all input files from (makes this file easier to read)\n");
  2042   fprintf (fp,
"INPUT_DIR    %s\n",fMovieTempFolderPath.toUTF8().c_str());
  2044   fprintf (fp,
"# There are a bunch of ways to specify the input files.\n");
  2045   fprintf (fp,
"# from a simple one-per-line listing, to the following \n");
  2046   fprintf (fp,
"# way of numbering them.  See the manual for more information.\n");
  2047   fprintf (fp,
"INPUT\n");
  2048   fprintf (fp,
"# '*' is replaced by the numbers 01, 02, 03, 04\n");
  2049   fprintf (fp,
"# if I instead do [01-11], it would be 01, 02, ..., 09, 10, 11\n");
  2050   fprintf (fp,
"# if I instead do [1-11], it would be 1, 2, 3, ..., 9, 10, 11\n");
  2051   fprintf (fp,
"# if I instead do [1-11+3], it would be 1, 4, 7, 10\n");
  2052   fprintf (fp,
"# the program assumes none of your input files has a name ending in ']'\n");
  2053   fprintf (fp,
"# if you do, too bad!!!\n");
  2056   fprintf (fp,
"Test*.ppm    [0-%d]\n",fRecordFrameNumber-1);
  2057   fprintf (fp,
"# can have more files here if you want...there is no limit on the number\n");
  2058   fprintf (fp,
"# of files\n");
  2059   fprintf (fp,
"END_INPUT\n");
  2063   fprintf (fp,
"# Many of the remaining options have to do with the motion search and qscale\n");
  2065   fprintf (fp,
"# FULL or HALF -- must be upper case\n");
  2066   fprintf (fp,
"# Should be FULL for computer generated images\n");
  2067   fprintf (fp,
"PIXEL        FULL\n");
  2069   fprintf (fp,
"# means +/- this many pixels for both P and B frame searches\n");
  2070   fprintf (fp,
"# specify two numbers if you wish to serc different ranges in the two.\n");
  2071   fprintf (fp,
"RANGE        10\n");
  2073   fprintf (fp,
"# The two search algorithm parameters below mostly affect speed,\n");
  2074   fprintf (fp,
"# with some affect on compression and almost none on quality.\n");
  2076   fprintf (fp,
"# this must be one of {EXHAUSTIVE, SUBSAMPLE, LOGARITHMIC}\n");
  2077   fprintf (fp,
"PSEARCH_ALG  LOGARITHMIC\n");
  2079   fprintf (fp,
"# this must be one of {SIMPLE, CROSS2, EXHAUSTIVE}\n");
  2081   fprintf (fp,
"# note that EXHAUSTIVE is really, really, really slow\n");
  2083   fprintf (fp,
"BSEARCH_ALG  SIMPLE\n");
  2086   fprintf (fp,
"# these specify the q-scale for I, P, and B frames\n");
  2087   fprintf (fp,
"# (values must be between 1 and 31)\n");
  2088   fprintf (fp,
"# These are the Wscale values for the entire frame in variable bit-rate\n");
  2089   fprintf (fp,
"# mode, and starting points (but not important) for constant bit rate\n");
  2092   fprintf (fp,
"# Wscale (Wuantization scale) affects quality and compression,\n");
  2093   fprintf (fp,
"# but has very little effect on speed.\n");
  2095   fprintf (fp,
"IWSCALE      4\n");
  2096   fprintf (fp,
"PWSCALE      5\n");
  2097   fprintf (fp,
"BWSCALE      12\n");
  2099   fprintf (fp,
"# this must be ORIGINAL or DECODED\n");
  2100   fprintf (fp,
"REFERENCE_FRAME  ORIGINAL\n");
  2102   fprintf (fp,
"# for parallel parameters see parallel.param in the exmaples subdirectory\n");
  2104   fprintf (fp,
"# if you want constant bit-rate mode, specify it as follows (number is bits/sec):\n");
  2105   fprintf (fp,
"#BIT_RATE  1000000\n");
  2107   fprintf (fp,
"# To specify the buffer size (327680 is default, measused in bits, for 16bit words)\n");
  2108   fprintf (fp,
"BUFFER_SIZE 327680\n");
  2110   fprintf (fp,
"# The frame rate is the number of frames/second (legal values:\n");
  2111   fprintf (fp,
"# 23.976, 24, 25, 29.97, 30, 50 ,59.94, 60\n");
  2112   fprintf (fp,
"FRAME_RATE 30\n");
  2114   fprintf (fp,
"# There are many more options, see the users manual for examples....\n");
  2115   fprintf (fp,
"# ASPECT_RATIO, USER_DATA, GAMMA, IWTABLE, etc.\n");
  2120   setRecordingInfos(
"Parameter file "+fParameterFileName+
" generated in "+fMovieTempFolderPath);
  2121   setRecordingStatus(READY_TO_ENCODE);
  2125 void G4OpenGLWtViewer::encodeVideo()
  2127   if ((getEncoderPath() != 
"") && (getSaveFileName() != 
"")) {
  2130     fProcess = 
new WProcess();
  2131     WObject ::connect(fProcess,SIGNAL(finished ( 
int)),
  2132                       this,SLOT(processEncodeFinished()));
  2133     WObject ::connect(fProcess,SIGNAL(readyReadStandardOutput ()),
  2134                       this,SLOT(processEncodeStdout()));
  2135     fProcess->setReadChannelMode(WProcess::MergedChannels);
  2136     fProcess->start (fEncoderPath, Wt::WStringList(fMovieTempFolderPath+fParameterFileName));
  2142 void G4OpenGLWtViewer::processEncodeStdout()
  2144   Wt::WString tmp = fProcess->readStdout ().data();
  2145   int start = tmp.findRev(
"ESTIMATED TIME");
  2146   tmp = tmp.mid(start,tmp.find(
"\n",start)-start);
  2147   setRecordingInfos(tmp);
  2151 void G4OpenGLWtViewer::processEncodeFinished()
  2154   Wt::WString txt = 
"";
  2155   txt = getProcessErrorMsg();
  2157     setRecordingStatus(SUCCESS);
  2159     setRecordingStatus(FAILED);
  2165 void G4OpenGLWtViewer::processLookForFinished() 
  2168   Wt::WString txt = getProcessErrorMsg();
  2172     fEncoderPath = Wt::WString(fProcess->readAllStandardOutput ().data()).trimmed();
  2174     if (fEncoderPath.contains(
" ")) {
  2176     } 
else if (!fEncoderPath.contains(
"mpeg_encode")) {
  2179     setEncoderPath(fEncoderPath);
  2182   setTempFolderPath(WDir::temp ().absolutePath ());
  2186 Wt::WString G4OpenGLWtViewer::getProcessErrorMsg()
  2188   Wt::WString txt = 
"";
  2189   if (fProcess->exitCode() != 0) {
  2190     switch (fProcess->error()) {
  2191     case WProcess::FailedToStart:
  2192       txt = 
"The process failed to start. Either the invoked program is missing, or you may have insufficient permissions to invoke the program.\n";
  2194     case WProcess::Crashed:
  2195       txt = 
"The process crashed some time after starting successfully.\n";
  2197     case WProcess::Timedout:
  2198       txt = 
"The last waitFor...() function timed out. The state of WProcess is unchanged, and you can try calling waitFor...() again.\n";
  2200     case WProcess::WriteError:
  2201       txt = 
"An error occurred when attempting to write to the process. For example, the process may not be running, or it may have closed its input channel.\n";
  2203     case WProcess::ReadError:
  2204       txt = 
"An error occurred when attempting to read from the process. For example, the process may not be running.\n";
  2206     case WProcess::UnknownError:
  2207       txt = 
"An unknown error occurred. This is the default return value of error().\n";
 
G4UIsession * GetG4UIWindow() const
 
printf("%d Experimental points found\, nlines)
 
static G4UImanager * GetUIpointer()
 
G4GLOB_DLL std::ostream G4cout
 
static const G4double factor
 
static PROLOG_HANDLER error
 
G4int ApplyCommand(const char *aCommand)
 
G4GLOB_DLL std::ostream G4cerr