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 int deltaX = fLastPos2.x()-fLastPos1.x();
1174 int deltaY = fLastPos2.y()-fLastPos1.y();
1176 if (fMouseAction == STYLE1) {
1177 if (mButtons & Wt::WMouseEvent::LeftButton) {
1179 rotateWtScene(((
float)deltaX),((
float)deltaY));
1180 }
else if (fAltKeyPress) {
1181 rotateWtSceneToggle(((
float)deltaX),((
float)deltaY));
1182 }
else if (fShiftKeyPress) {
1183 unsigned int sizeWin;
1184 sizeWin = getWinWidth();
1185 if (getWinHeight() < getWinWidth()) {
1186 sizeWin = getWinHeight();
1190 float factor = ((float)100/(
float)sizeWin) ;
1191 moveScene(-(
float)deltaX*factor,-(
float)deltaY*factor,0,
false);
1192 }
else if (fControlKeyPress) {
1193 fVP.SetZoomFactor(fVP.GetZoomFactor()*(1+((float)deltaY)));
1196 }
else if (fMouseAction == STYLE2) {
1197 if (mButtons & Wt::WMouseEvent::LeftButton) {
1198 moveScene(-deltaX,-deltaY,0,
true);
1213 void G4OpenGLWtViewer::moveScene(
float dx,
float dy,
float dz,
bool mouseMove)
1217 fHoldMoveEvent =
true;
1220 GLdouble coefDepth = 0;
1223 if (getWinHeight() <getWinWidth()) {
1227 coefTrans = getSceneNearWidth()*fDeltaSceneTranslation;
1228 coefDepth = getSceneDepth()*fDeltaDepth;
1230 fVP.IncrementPan(-dx*coefTrans,dy*coefTrans,dz*coefDepth);
1233 #ifdef _A_FINIR_FIXME
1234 ((WApplication*)G4Wt::getInstance ())->processEvents();
1237 fHoldMoveEvent =
false;
1246 void G4OpenGLWtViewer::rotateWtScene(
float dx,
float dy)
1248 if (fHoldRotateEvent)
1250 fHoldRotateEvent =
true;
1260 fHoldRotateEvent =
false;
1268 void G4OpenGLWtViewer::rotateWtSceneToggle(
float dx,
float dy)
1270 if (fHoldRotateEvent)
1272 fHoldRotateEvent =
true;
1274 rotateSceneToggle(dx,dy);
1278 fHoldRotateEvent =
false;
1293 void G4OpenGLWtViewer::rescaleImage(
1312 #ifdef _A_FINIR_FIXME
1319 bool G4OpenGLWtViewer::printPDF (
1320 const std::string aFilename
1332 if ((!aImage.isGrayscale ()) &&(aInColor ==1 )) {
1333 aImage = aImage.convertToFormat ( aImage.format(), Wt::MonoOnly);
1337 if (aFilename.substr(aFilename.size()-3) ==
".ps") {
1338 #if WT_VERSION > 0x040200
1339 printer.setOutputFormat(WPrinter::PostScriptFormat);
1342 #if WT_VERSION > 0x040100
1343 printer.setOutputFormat(WPrinter::PdfFormat);
1346 #if WT_VERSION > 0x040100
1347 printer.setOutputFileName(Wt::WString(aFilename.c_str()));
1350 WPainter paint(&printer);
1351 paint.drawImage (0,0,aImage);
1358 void G4OpenGLWtViewer::G4wheelEvent (Wt::WWheelEvent * event)
1360 fVP.SetZoomFactor(fVP.GetZoomFactor()+(fVP.GetZoomFactor()*(
event->delta())/1200));
1365 void G4OpenGLWtViewer::G4keyPressEvent (Wt::WKeyEvent * event)
1370 fHoldKeyEvent =
true;
1374 #ifdef _A_FINIR_FIXME
1375 updateKeyModifierState(event->modifiers());
1377 if ((fNoKeyPress)) {
1378 if (event->key() == Wt::Key_Down) {
1379 moveScene(0,1,0,
false);
1381 else if (event->key() == Wt::Key_Up) {
1382 moveScene(0,-1,0,
false);
1384 if (event->key() == Wt::Key_Left) {
1385 moveScene(-1,0,0,
false);
1387 else if (event->key() == Wt::Key_Right) {
1388 moveScene(1,0,0,
false);
1390 if (event->text() == Wt::WString(
"-") ) {
1391 moveScene(0,0,1,
false);
1393 else if (event->text() == Wt::WString(
"+")) {
1394 moveScene(0,0,-1,
false);
1398 if (event->key() == Wt::Key_Escape) {
1399 #ifdef _A_FINIR_FIXME
1400 toggleFullScreen(
false);
1410 #ifdef _A_FINIR_FIXME
1411 if ( (event->key() == Wt::Key_Enter)){
1414 if (event->key() == Wt::Key_Space){
1420 if (event->key() == Wt::Key_H){
1422 fDeltaSceneTranslation = 0.01;
1427 fVP.SetZoomFactor(1.);
1429 fVP.SetViewAndLights (
G4Vector3D (0., 0., 1.));
1435 if (fShiftKeyPress) {
1436 if (event->key() == Wt::Key_Down) {
1437 rotateWtScene(0,-fDeltaRotation);
1439 else if (event->key() == Wt::Key_Up) {
1440 rotateWtScene(0,fDeltaRotation);
1442 if (event->key() == Wt::Key_Left) {
1443 rotateWtScene(fDeltaRotation,0);
1445 else if (event->key() == Wt::Key_Right) {
1446 rotateWtScene(-fDeltaRotation,0);
1451 if ((fAltKeyPress)) {
1452 if (event->key() == Wt::Key_Down) {
1453 rotateWtSceneToggle(0,-fDeltaRotation);
1455 else if (event->key() == Wt::Key_Up) {
1456 rotateWtSceneToggle(0,fDeltaRotation);
1458 if (event->key() == Wt::Key_Left) {
1459 rotateWtSceneToggle(fDeltaRotation,0);
1461 else if (event->key() == Wt::Key_Right) {
1462 rotateWtSceneToggle(-fDeltaRotation,0);
1466 if (event->text() == Wt::WString(
"+")) {
1467 fDeltaRotation = fDeltaRotation/0.7;
1468 G4cout <<
"Auto-rotation set to : " << fDeltaRotation <<
G4endl;
1470 else if (event->text() == Wt::WString(
"-")) {
1471 fDeltaRotation = fDeltaRotation*0.7;
1472 G4cout <<
"Auto-rotation set to : " << fDeltaRotation <<
G4endl;
1477 if ((fControlKeyPress)) {
1478 if (event->text() == Wt::WString(
"+")) {
1479 fVP.SetZoomFactor(fVP.GetZoomFactor()*(1+fDeltaZoom));
1482 else if (event->text() == Wt::WString(
"-")) {
1483 fVP.SetZoomFactor(fVP.GetZoomFactor()*(1-fDeltaZoom));
1488 fHoldKeyEvent =
false;
1492 #ifdef _A_FINIR_FIXME
1493 void G4OpenGLWtViewer::updateKeyModifierState(Wt::KeyboardModifiers modifier) {
1497 fAltKeyPress =
false;
1498 fShiftKeyPress =
false;
1499 fControlKeyPress =
false;
1501 if (modifier & Wt::AltModifier ) {
1502 fAltKeyPress =
true;
1503 fNoKeyPress =
false;
1505 if (modifier & Wt::ShiftModifier ) {
1506 fShiftKeyPress =
true;
1507 fNoKeyPress =
false;
1509 if (modifier & Wt::ControlModifier ) {
1510 fControlKeyPress =
true;
1511 fNoKeyPress =
false;
1517 void G4OpenGLWtViewer::stopVideo() {
1520 if (!fMovieParametersDialog) {
1521 showMovieParametersDialog();
1523 setRecordingStatus(STOP);
1525 if (fRecordFrameNumber >0) {
1527 if (!(fMovieParametersDialog->checkEncoderSwParameters())) {
1528 setRecordingStatus(BAD_ENCODER);
1529 }
else if (!(fMovieParametersDialog->checkSaveFileNameParameters())) {
1530 setRecordingStatus(BAD_OUTPUT);
1534 setRecordingInfos(
"No frame to encode.");
1540 void G4OpenGLWtViewer::saveVideo() {
1543 if (!fMovieParametersDialog) {
1544 showMovieParametersDialog();
1547 fMovieParametersDialog->checkEncoderSwParameters();
1548 fMovieParametersDialog->checkSaveFileNameParameters();
1550 if (fRecordingStep == STOP) {
1551 setRecordingStatus(SAVE);
1552 generateMpegEncoderParameters();
1560 void G4OpenGLWtViewer::startPauseVideo() {
1564 if (( fRecordingStep == WAIT)) {
1565 if ( fRecordFrameNumber == 0) {
1566 if (getTempFolderPath() ==
"") {
1567 showMovieParametersDialog();
1568 setRecordingInfos(
"You should specified the temp folder in order to make movie");
1572 Wt::WString
tmp = removeTempFolder();
1574 setRecordingInfos(tmp);
1577 tmp = createTempFolder();
1579 setRecordingInfos(
"Can't create temp folder."+tmp);
1585 if ((fRecordingStep == WAIT)) {
1586 setRecordingStatus(
START);
1587 }
else if (fRecordingStep ==
START) {
1588 setRecordingStatus(PAUSE);
1589 }
else if (fRecordingStep == PAUSE) {
1590 setRecordingStatus(CONTINUE);
1591 }
else if (fRecordingStep == CONTINUE) {
1592 setRecordingStatus(PAUSE);
1596 void G4OpenGLWtViewer::setRecordingStatus(RECORDING_STEP step) {
1598 fRecordingStep = step;
1599 displayRecordingStatus();
1603 void G4OpenGLWtViewer::displayRecordingStatus() {
1605 Wt::WString txtStatus =
"";
1606 if (fRecordingStep == WAIT) {
1607 txtStatus =
"Waiting to start...";
1608 fRecordFrameNumber = 0;
1609 }
else if (fRecordingStep ==
START) {
1610 txtStatus =
"Start Recording...";
1611 }
else if (fRecordingStep == PAUSE) {
1612 txtStatus =
"Pause Recording...";
1613 }
else if (fRecordingStep == CONTINUE) {
1614 txtStatus =
"Continue Recording...";
1615 }
else if (fRecordingStep == STOP) {
1616 txtStatus =
"Stop Recording...";
1617 }
else if (fRecordingStep == READY_TO_ENCODE) {
1618 txtStatus =
"Ready to Encode...";
1619 }
else if (fRecordingStep ==
ENCODING) {
1620 txtStatus =
"Encoding...";
1621 }
else if (fRecordingStep == FAILED) {
1622 txtStatus =
"Failed to encode...";
1623 }
else if ((fRecordingStep == BAD_ENCODER)
1624 || (fRecordingStep == BAD_OUTPUT)
1625 || (fRecordingStep == BAD_TMP)) {
1626 txtStatus =
"Correct above errors first";
1627 }
else if (fRecordingStep == SUCCESS) {
1628 txtStatus =
"File encoded successfully";
1632 if (fMovieParametersDialog) {
1633 fMovieParametersDialog->setRecordingStatus(txtStatus);
1637 setRecordingInfos(
"");
1641 void G4OpenGLWtViewer::setRecordingInfos(Wt::WString txt) {
1642 if (fMovieParametersDialog) {
1643 fMovieParametersDialog->setRecordingInfos(txt);
1651 void G4OpenGLWtViewer::initMovieParameters() {
1655 fProcess =
new WProcess();
1657 WObject ::connect(fProcess,SIGNAL(finished (
int)),
1658 this,SLOT(processLookForFinished()));
1659 fProcess->setReadChannelMode(WProcess::MergedChannels);
1660 fProcess->start (
"which mpeg_encode");
1666 Wt::WString G4OpenGLWtViewer::getEncoderPath() {
1667 return fEncoderPath;
1675 Wt::WString G4OpenGLWtViewer::setEncoderPath(Wt::WString path) {
1677 return "File does not exist";
1680 path = WDir::cleanPath(path);
1681 WFileInfo *
f =
new WFileInfo(path);
1683 return "File does not exist";
1684 }
else if (f->isDir()) {
1685 return "This is a directory";
1686 }
else if (!f->isExecutable()) {
1687 return "File exist but is not executable";
1688 }
else if (!f->isFile()) {
1689 return "This is not a file";
1691 fEncoderPath = path;
1693 if ((fRecordingStep == BAD_ENCODER)) {
1694 setRecordingStatus(STOP);
1700 bool G4OpenGLWtViewer::isRecording(){
1701 if ((fRecordingStep ==
START) || (fRecordingStep == CONTINUE)) {
1707 bool G4OpenGLWtViewer::isPaused(){
1708 if (fRecordingStep == PAUSE) {
1714 bool G4OpenGLWtViewer::isEncoding(){
1721 bool G4OpenGLWtViewer::isWaiting(){
1722 if (fRecordingStep == WAIT) {
1728 bool G4OpenGLWtViewer::isStopped(){
1729 if (fRecordingStep == STOP) {
1735 bool G4OpenGLWtViewer::isFailed(){
1736 if (fRecordingStep == FAILED) {
1742 bool G4OpenGLWtViewer::isSuccess(){
1743 if (fRecordingStep == SUCCESS) {
1749 bool G4OpenGLWtViewer::isBadEncoder(){
1750 if (fRecordingStep == BAD_ENCODER) {
1755 bool G4OpenGLWtViewer::isBadTmp(){
1756 if (fRecordingStep == BAD_TMP) {
1761 bool G4OpenGLWtViewer::isBadOutput(){
1762 if (fRecordingStep == BAD_OUTPUT) {
1768 void G4OpenGLWtViewer::setBadEncoder(){
1769 fRecordingStep = BAD_ENCODER;
1770 displayRecordingStatus();
1772 void G4OpenGLWtViewer::setBadTmp(){
1773 fRecordingStep = BAD_TMP;
1774 displayRecordingStatus();
1776 void G4OpenGLWtViewer::setBadOutput(){
1777 fRecordingStep = BAD_OUTPUT;
1778 displayRecordingStatus();
1781 void G4OpenGLWtViewer::setWaiting(){
1782 fRecordingStep = WAIT;
1783 displayRecordingStatus();
1787 bool G4OpenGLWtViewer::isReadyToEncode(){
1788 if (fRecordingStep == READY_TO_ENCODE) {
1794 void G4OpenGLWtViewer::resetRecording() {
1795 setRecordingStatus(WAIT);
1802 Wt::WString G4OpenGLWtViewer::setTempFolderPath(Wt::WString path) {
1805 return "Path does not exist";
1807 path = WDir::cleanPath(path);
1808 WFileInfo *
d =
new WFileInfo(path);
1810 return "Path does not exist";
1811 }
else if (!d->isDir()) {
1812 return "This is not a directory";
1813 }
else if (!d->isReadable()) {
1814 return path +
" is read protected";
1815 }
else if (!d->isWritable()) {
1816 return path +
" is write protected";
1819 if ((fRecordingStep == BAD_TMP)) {
1820 setRecordingStatus(WAIT);
1822 fTempFolderPath = path;
1828 Wt::WString G4OpenGLWtViewer::getTempFolderPath() {
1829 return fTempFolderPath;
1836 Wt::WString G4OpenGLWtViewer::setSaveFileName(Wt::WString path) {
1839 return "Path does not exist";
1842 WFileInfo *
file =
new WFileInfo(path);
1843 WDir
dir = file->dir();
1844 path = WDir::cleanPath(path);
1845 if (file->exists()) {
1846 return "File already exist, please choose a new one";
1847 }
else if (!dir.exists()) {
1848 return "Dir does not exist";
1849 }
else if (!dir.isReadable()) {
1850 return path +
" is read protected";
1853 if ((fRecordingStep == BAD_OUTPUT)) {
1854 setRecordingStatus(STOP);
1856 fSaveFileName = path;
1862 Wt::WString G4OpenGLWtViewer::getSaveFileName() {
1863 return fSaveFileName ;
1870 Wt::WString G4OpenGLWtViewer::createTempFolder() {
1871 fMovieTempFolderPath =
"";
1873 Wt::WString
tmp = setTempFolderPath(fTempFolderPath);
1877 Wt::WString sep = Wt::WString(WDir::separator());
1878 Wt::WString path = sep+
"WtMovie_"+WDateTime::currentDateTime ().toString(
"dd-MM-yyyy_hh-mm-ss")+sep;
1879 WDir *d =
new WDir(WDir::cleanPath(fTempFolderPath));
1881 if (d->exists(path)) {
1882 return "Folder "+path+
" already exists.Please remove it first";
1884 if (d->mkdir(fTempFolderPath+path)) {
1885 fMovieTempFolderPath = fTempFolderPath+path;
1888 return "Can't create "+fTempFolderPath+path;
1895 Wt::WString G4OpenGLWtViewer::removeTempFolder() {
1897 if (fMovieTempFolderPath ==
"") {
1900 WDir *d =
new WDir(WDir::cleanPath(fMovieTempFolderPath));
1905 d->setFilter( WDir::Files );
1906 Wt::WStringList subDirList = d->entryList();
1908 Wt::WString error =
"";
1909 for (Wt::WStringList::ConstIterator it = subDirList.begin() ;(it != subDirList.end()) ; it++) {
1910 const Wt::WString currentFile = *it;
1911 if (!d->remove(currentFile)) {
1913 Wt::WString file = fMovieTempFolderPath+currentFile;
1914 error +=
"Removing file failed : "+
file;
1919 if (d->rmdir(fMovieTempFolderPath)) {
1920 fMovieTempFolderPath =
"";
1923 return "Dir "+fMovieTempFolderPath+
" should be empty, but could not remove it";
1927 return "Could not remove "+fMovieTempFolderPath+
" because of the following errors :"+error;
1932 bool G4OpenGLWtViewer::hasPendingEvents () {
1933 #ifdef _A_FINIR_FIXME
1934 return ((WApplication*)G4Wt::getInstance ())->hasPendingEvents ();
1939 bool G4OpenGLWtViewer::generateMpegEncoderParameters () {
1943 fp = fopen (Wt::WString(fMovieTempFolderPath+fParameterFileName).toUTF8().c_str(),
"w");
1946 setRecordingInfos(
"Generation of parameter file failed");
1950 fprintf (fp,
"# parameter file template with lots of comments to assist you\n");
1952 fprintf (fp,
"# you can use this as a template, copying it to a separate file then modifying\n");
1953 fprintf (fp,
"# the copy\n");
1956 fprintf (fp,
"# any line beginning with '#' is a comment\n");
1958 fprintf (fp,
"# no line should be longer than 255 characters\n");
1961 fprintf (fp,
"# general format of each line is:\n");
1962 fprintf (fp,
"# \n");
1964 fprintf (fp,
"# lines can generally be in any order\n");
1966 fprintf (fp,
"# an exception is the option 'INPUT' which must be followed by input\n");
1967 fprintf (fp,
"# files in the order in which they must appear, followed by 'END_INPUT'\n");
1969 fprintf (fp,
"# Also, if you use the `command` method of generating input file names,\n");
1970 fprintf (fp,
"# the command will only be executed in the INPUT_DIR if INPUT_DIR preceeds\n");
1971 fprintf (fp,
"# the INPUT parameter.\n");
1973 fprintf (fp,
"# MUST be in UPPER CASE\n");
1976 fprintf (fp,
"# Pattern affects speed, quality and compression. See the User's Guide\n");
1977 fprintf (fp,
"# for more info.\n");
1979 fprintf (fp,
"PATTERN IBBPBBPBBPBBPBBP\n");
1980 fprintf (fp,
"OUTPUT %s\n",getSaveFileName().toUTF8().c_str());
1982 fprintf (fp,
"# mpeg_encode really only accepts 3 different file formats, but using a\n");
1983 fprintf (fp,
"# conversion statement it can effectively handle ANY file format\n");
1985 fprintf (fp,
"# You must specify the type of the input files. The choices are:\n");
1986 fprintf (fp,
"# YUV, PPM, JMOVIE, Y, JPEG, PNM\n");
1987 fprintf (fp,
"# (must be upper case)\n");
1989 fprintf (fp,
"BASE_FILE_FORMAT PPM\n");
1992 fprintf (fp,
"# if YUV format (or using parallel version), must provide width and height\n");
1993 fprintf (fp,
"# YUV_SIZE widthxheight\n");
1994 fprintf (fp,
"# this option is ignored if BASE_FILE_FORMAT is not YUV and you're running\n");
1995 fprintf (fp,
"# on just one machine\n");
1997 fprintf (fp,
"YUV_SIZE 352x240\n");
1999 fprintf (fp,
"# If you are using YUV, there are different supported file formats.\n");
2000 fprintf (fp,
"# EYUV or UCB are the same as previous versions of this encoder.\n");
2001 fprintf (fp,
"# (All the Y's, then U's then V's, in 4:2:0 subsampling.)\n");
2002 fprintf (fp,
"# Other formats, such as Abekas, Phillips, or a general format are\n");
2003 fprintf (fp,
"# permissible, the general format is a string of Y's, U's, and V's\n");
2004 fprintf (fp,
"# to specify the file order.\n");
2006 fprintf (fp,
"INPUT_FORMAT UCB\n");
2008 fprintf (fp,
"# the conversion statement\n");
2010 fprintf (fp,
"# Each occurrence of '*' will be replaced by the input file\n");
2012 fprintf (fp,
"# e.g., if you have a bunch of GIF files, then this might be:\n");
2013 fprintf (fp,
"# INPUT_CONVERT giftoppm *\n");
2015 fprintf (fp,
"# e.g., if you have a bunch of files like a.Y a.U a.V, etc., then:\n");
2016 fprintf (fp,
"# INPUT_CONVERT cat *.Y *.U *.V\n");
2018 fprintf (fp,
"# e.g., if you are grabbing from laser disc you might have something like\n");
2019 fprintf (fp,
"# INPUT_CONVERT goto frame *; grabppm\n");
2020 fprintf (fp,
"# 'INPUT_CONVERT *' means the files are already in the base file format\n");
2022 fprintf (fp,
"INPUT_CONVERT * \n");
2024 fprintf (fp,
"# number of frames in a GOP.\n");
2026 fprintf (fp,
"# since each GOP must have at least one I-frame, the encoder will find the\n");
2027 fprintf (fp,
"# the first I-frame after GOP_SIZE frames to start the next GOP\n");
2029 fprintf (fp,
"# later, will add more flexible GOP signalling\n");
2031 fprintf (fp,
"GOP_SIZE 16\n");
2033 fprintf (fp,
"# number of slices in a frame\n");
2035 fprintf (fp,
"# 1 is a good number. another possibility is the number of macroblock rows\n");
2036 fprintf (fp,
"# (which is the height divided by 16)\n");
2038 fprintf (fp,
"SLICES_PER_FRAME 1\n");
2040 fprintf (fp,
"# directory to get all input files from (makes this file easier to read)\n");
2041 fprintf (fp,
"INPUT_DIR %s\n",fMovieTempFolderPath.toUTF8().c_str());
2043 fprintf (fp,
"# There are a bunch of ways to specify the input files.\n");
2044 fprintf (fp,
"# from a simple one-per-line listing, to the following \n");
2045 fprintf (fp,
"# way of numbering them. See the manual for more information.\n");
2046 fprintf (fp,
"INPUT\n");
2047 fprintf (fp,
"# '*' is replaced by the numbers 01, 02, 03, 04\n");
2048 fprintf (fp,
"# if I instead do [01-11], it would be 01, 02, ..., 09, 10, 11\n");
2049 fprintf (fp,
"# if I instead do [1-11], it would be 1, 2, 3, ..., 9, 10, 11\n");
2050 fprintf (fp,
"# if I instead do [1-11+3], it would be 1, 4, 7, 10\n");
2051 fprintf (fp,
"# the program assumes none of your input files has a name ending in ']'\n");
2052 fprintf (fp,
"# if you do, too bad!!!\n");
2055 fprintf (fp,
"Test*.ppm [0-%d]\n",fRecordFrameNumber-1);
2056 fprintf (fp,
"# can have more files here if you want...there is no limit on the number\n");
2057 fprintf (fp,
"# of files\n");
2058 fprintf (fp,
"END_INPUT\n");
2062 fprintf (fp,
"# Many of the remaining options have to do with the motion search and qscale\n");
2064 fprintf (fp,
"# FULL or HALF -- must be upper case\n");
2065 fprintf (fp,
"# Should be FULL for computer generated images\n");
2066 fprintf (fp,
"PIXEL FULL\n");
2068 fprintf (fp,
"# means +/- this many pixels for both P and B frame searches\n");
2069 fprintf (fp,
"# specify two numbers if you wish to serc different ranges in the two.\n");
2070 fprintf (fp,
"RANGE 10\n");
2072 fprintf (fp,
"# The two search algorithm parameters below mostly affect speed,\n");
2073 fprintf (fp,
"# with some affect on compression and almost none on quality.\n");
2075 fprintf (fp,
"# this must be one of {EXHAUSTIVE, SUBSAMPLE, LOGARITHMIC}\n");
2076 fprintf (fp,
"PSEARCH_ALG LOGARITHMIC\n");
2078 fprintf (fp,
"# this must be one of {SIMPLE, CROSS2, EXHAUSTIVE}\n");
2080 fprintf (fp,
"# note that EXHAUSTIVE is really, really, really slow\n");
2082 fprintf (fp,
"BSEARCH_ALG SIMPLE\n");
2085 fprintf (fp,
"# these specify the q-scale for I, P, and B frames\n");
2086 fprintf (fp,
"# (values must be between 1 and 31)\n");
2087 fprintf (fp,
"# These are the Wscale values for the entire frame in variable bit-rate\n");
2088 fprintf (fp,
"# mode, and starting points (but not important) for constant bit rate\n");
2091 fprintf (fp,
"# Wscale (Wuantization scale) affects quality and compression,\n");
2092 fprintf (fp,
"# but has very little effect on speed.\n");
2094 fprintf (fp,
"IWSCALE 4\n");
2095 fprintf (fp,
"PWSCALE 5\n");
2096 fprintf (fp,
"BWSCALE 12\n");
2098 fprintf (fp,
"# this must be ORIGINAL or DECODED\n");
2099 fprintf (fp,
"REFERENCE_FRAME ORIGINAL\n");
2101 fprintf (fp,
"# for parallel parameters see parallel.param in the exmaples subdirectory\n");
2103 fprintf (fp,
"# if you want constant bit-rate mode, specify it as follows (number is bits/sec):\n");
2104 fprintf (fp,
"#BIT_RATE 1000000\n");
2106 fprintf (fp,
"# To specify the buffer size (327680 is default, measused in bits, for 16bit words)\n");
2107 fprintf (fp,
"BUFFER_SIZE 327680\n");
2109 fprintf (fp,
"# The frame rate is the number of frames/second (legal values:\n");
2110 fprintf (fp,
"# 23.976, 24, 25, 29.97, 30, 50 ,59.94, 60\n");
2111 fprintf (fp,
"FRAME_RATE 30\n");
2113 fprintf (fp,
"# There are many more options, see the users manual for examples....\n");
2114 fprintf (fp,
"# ASPECT_RATIO, USER_DATA, GAMMA, IWTABLE, etc.\n");
2119 setRecordingInfos(
"Parameter file "+fParameterFileName+
" generated in "+fMovieTempFolderPath);
2120 setRecordingStatus(READY_TO_ENCODE);
2124 void G4OpenGLWtViewer::encodeVideo()
2126 if ((getEncoderPath() !=
"") && (getSaveFileName() !=
"")) {
2129 fProcess =
new WProcess();
2130 WObject ::connect(fProcess,SIGNAL(finished (
int)),
2131 this,SLOT(processEncodeFinished()));
2132 WObject ::connect(fProcess,SIGNAL(readyReadStandardOutput ()),
2133 this,SLOT(processEncodeStdout()));
2134 fProcess->setReadChannelMode(WProcess::MergedChannels);
2135 fProcess->start (fEncoderPath, Wt::WStringList(fMovieTempFolderPath+fParameterFileName));
2141 void G4OpenGLWtViewer::processEncodeStdout()
2143 Wt::WString tmp = fProcess->readStdout ().data();
2144 int start = tmp.findRev(
"ESTIMATED TIME");
2145 tmp = tmp.mid(start,tmp.find(
"\n",start)-start);
2146 setRecordingInfos(tmp);
2150 void G4OpenGLWtViewer::processEncodeFinished()
2153 Wt::WString txt =
"";
2154 txt = getProcessErrorMsg();
2156 setRecordingStatus(SUCCESS);
2158 setRecordingStatus(FAILED);
2164 void G4OpenGLWtViewer::processLookForFinished()
2167 Wt::WString txt = getProcessErrorMsg();
2171 fEncoderPath = Wt::WString(fProcess->readAllStandardOutput ().data()).trimmed();
2173 if (fEncoderPath.contains(
" ")) {
2175 }
else if (!fEncoderPath.contains(
"mpeg_encode")) {
2178 setEncoderPath(fEncoderPath);
2181 setTempFolderPath(WDir::temp ().absolutePath ());
2185 Wt::WString G4OpenGLWtViewer::getProcessErrorMsg()
2187 Wt::WString txt =
"";
2188 if (fProcess->exitCode() != 0) {
2189 switch (fProcess->error()) {
2190 case WProcess::FailedToStart:
2191 txt =
"The process failed to start. Either the invoked program is missing, or you may have insufficient permissions to invoke the program.\n";
2193 case WProcess::Crashed:
2194 txt =
"The process crashed some time after starting successfully.\n";
2196 case WProcess::Timedout:
2197 txt =
"The last waitFor...() function timed out. The state of WProcess is unchanged, and you can try calling waitFor...() again.\n";
2199 case WProcess::WriteError:
2200 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";
2202 case WProcess::ReadError:
2203 txt =
"An error occurred when attempting to read from the process. For example, the process may not be running.\n";
2205 case WProcess::UnknownError:
2206 txt =
"An unknown error occurred. This is the default return value of error().\n";
static G4UImanager * GetUIpointer()
G4GLOB_DLL std::ostream G4cout
G4UIsession * GetG4UIWindow() const
printf("%d Experimental points found\n", nlines)
G4int ApplyCommand(const char *aCommand)
G4GLOB_DLL std::ostream G4cerr