34 #ifdef G4VIS_BUILD_OPENGLWT_DRIVER
55 #include <Wt/WHBoxLayout>
56 #include <Wt/WApplication>
63 void G4OpenGLWtViewer::CreateMainWindow (
64 Wt::WGLWidget* glWidget
70 #ifdef G4DEBUG_VIS_OGL
71 printf(
"G4OpenGLWtViewer::CreateMainWindow \n");
83 if (UI == NULL)
return;
92 bool isTabbedView =
false;
98 ResizeWindow(fVP.GetWindowSizeHintX(),fVP.GetWindowSizeHintY());
100 isTabbedView = fUiWt->AddTabWidget(fWindow->parent(),
name,getWinWidth(),getWinHeight());
102 fWindow->parent()->decorationStyle().setBackgroundColor (Wt::WColor(
"blue"));
105 #ifdef G4DEBUG_VIS_OGL
106 printf(
"G4OpenGLWtViewer::CreateMainWindow :: resize :%d %d\n",getWinWidth(),getWinHeight());
108 fWindow->resize(getWinWidth(),getWinHeight());
110 fUISceneTreeComponentsTBWidget = fUiWt->GetSceneTreeComponentsTBWidget();
111 fWindow->resize(fWindow->parent()->width(),fWindow->parent()->height());
116 #ifdef G4DEBUG_VIS_OGL
118 printf(
"G4OpenGLWtViewer::CreateMainWindow :: UIWt NOt found \n");
165 #ifdef _A_FINIR_FIXME
179 G4OpenGLWtViewer::G4OpenGLWtViewer (
180 G4OpenGLSceneHandler& scene
183 ,G4OpenGLViewer (scene)
185 ,fRecordFrameNumber(0)
187 ,fMouseAction(STYLE1)
189 ,fDeltaSceneTranslation(0.01)
193 ,fHoldKeyEvent(
false)
194 ,fHoldMoveEvent(
false)
195 ,fHoldRotateEvent(
false)
199 ,fMovieTempFolderPath(
"")
201 ,fParameterFileName(
"mpeg_encode_parameter_file.par")
202 ,fMovieParametersDialog(NULL)
203 ,fRecordingStep(WAIT)
205 ,fNbMaxFramesPerSec(100)
206 ,fNbMaxAnglePerSec(360)
207 ,fLaunchSpinDelay(100)
212 ,fControlKeyPress(
false)
213 ,fShiftKeyPress(
false)
219 G4Wt::getInstance ();
224 #ifdef G4DEBUG_VIS_OGL
225 printf(
"G4OpenGLWtViewer::Create \n");
227 fLastPos3 = Wt::WPoint(-1,-1);
228 fLastPos2 = Wt::WPoint(-1,-1);
229 fLastPos1 = Wt::WPoint(-1,-1);
231 mMatrix.setToIdentity();
233 #ifdef _A_FINIR_FIXME
234 initMovieParameters();
237 fLastEventTime =
new Wt::WTime();
239 #ifdef G4DEBUG_VIS_OGL
240 printf(
"G4OpenGLWtViewer::G4OpenGLWtViewer END\n");
249 void G4OpenGLWtViewer::resizeGL(
int width,
int height)
251 #ifdef G4DEBUG_VIS_OGL
252 printf(
"G4OpenGLWtViewer resizeGL %d %d\n",width,height);
261 G4OpenGLWtViewer::~G4OpenGLWtViewer (
266 #ifdef _A_FINIR_FIXME
275 #ifdef _A_FINIR_FIXME
279 void G4OpenGLWtViewer::createPopupMenu() {
281 fContextMenu =
new WMenu(
"All");
283 WMenu *mMouseAction = fContextMenu->addMenu(
"&Mouse actions");
285 fRotateAction = mMouseAction->addAction(
"Rotate");
286 fMoveAction = mMouseAction->addAction(
"Move");
287 fPickAction = mMouseAction->addAction(
"Pick");
288 WAction *shortcutsAction = mMouseAction->addAction(
"Show shortcuts");
290 fRotateAction->setCheckable(
true);
291 fMoveAction->setCheckable(
false);
292 fPickAction->setCheckable(
false);
293 shortcutsAction->setCheckable(
false);
295 fRotateAction->setChecked(
true);
296 fMoveAction->setChecked(
false);
297 fPickAction->setChecked(
false);
298 shortcutsAction->setChecked(
false);
301 SIGNAL(triggered(
bool)),
303 SLOT(actionMouseRotate()));
306 SIGNAL(triggered(
bool)),
308 SLOT(actionMouseMove()));
311 SIGNAL(triggered(
bool)),
313 SLOT(actionMousePick()));
316 SIGNAL(triggered(
bool)),
318 SLOT(showShortcuts()));
321 WMenu *mStyle = fContextMenu->addMenu(
"&Style");
323 WMenu *mRepresentation = mStyle->addMenu(
"&Representation");
324 WMenu *mProjection = mStyle->addMenu(
"&Projection");
325 WAction *polyhedron = mRepresentation->addAction(
"Polyhedron");
326 WAction *nurbs = mRepresentation->addAction(
"NURBS");
328 WAction *ortho = mProjection->addAction(
"Orthographic");
329 WAction *perspective = mProjection->addAction(
"Persepective");
332 G4ViewParameters::RepStyle style;
333 style = fVP.GetRepStyle();
334 if (style == G4ViewParameters::polyhedron) {
335 createRadioAction(polyhedron,nurbs,SLOT(toggleRepresentation(
bool)),1);
336 }
else if (style == G4ViewParameters::nurbs) {
337 createRadioAction(polyhedron,nurbs,SLOT(toggleRepresentation(
bool)),2);
339 mRepresentation->clear();
343 if (fVP.GetFieldHalfAngle() == 0) {
344 createRadioAction(ortho, perspective,SLOT(toggleProjection(
bool)),1);
346 createRadioAction(ortho, perspective,SLOT(toggleProjection(
bool)),2);
350 WMenu *mDrawing = mStyle->addMenu(
"&Drawing");
352 fDrawingWireframe = mDrawing->addAction(
"Wireframe");
353 fDrawingWireframe->setCheckable(
true);
355 fDrawingLineRemoval = mDrawing->addAction(
"Hidden line removal");
356 fDrawingLineRemoval->setCheckable(
true);
358 fDrawingSurfaceRemoval = mDrawing->addAction(
"Hidden Surface removal");
359 fDrawingSurfaceRemoval->setCheckable(
true);
361 fDrawingLineSurfaceRemoval = mDrawing->addAction(
"Hidden line and surface removal");
362 fDrawingLineSurfaceRemoval->setCheckable(
true);
366 d_style = fVP.GetDrawingStyle();
369 fDrawingWireframe->setChecked(
true);
371 fDrawingLineRemoval->setChecked(
true);
373 fDrawingSurfaceRemoval->setChecked(
true);
375 fDrawingLineSurfaceRemoval->setChecked(
true);
380 SIGNAL(triggered(
bool)),
382 SLOT(actionDrawingWireframe()));
384 SIGNAL(triggered(
bool)),
386 SLOT(actionDrawingLineRemoval()));
388 SIGNAL(triggered(
bool)),
390 SLOT(actionDrawingSurfaceRemoval()));
392 SIGNAL(triggered(
bool)),
394 SLOT(actionDrawingLineSurfaceRemoval()));
398 WAction *backgroundColorChooser ;
401 backgroundColorChooser = mStyle->addAction(
"Background color");
405 SLOT(actionChangeBackgroundColor()));
409 WAction *textColorChooser ;
411 textColorChooser = mStyle->addAction(
"Text color");
415 SLOT(actionChangeTextColor()));
419 WAction *defaultColorChooser ;
421 defaultColorChooser = mStyle->addAction(
"Default color");
425 SLOT(actionChangeDefaultColor()));
429 WMenu *mActions = fContextMenu->addMenu(
"&Actions");
430 WAction *createEPS = mActions->addAction(
"Save as ...");
434 SLOT(actionSaveImage()));
437 WAction *movieParameters = mActions->addAction(
"Movie parameters...");
441 SLOT(actionMovieParameters()));
447 WMenu *mSpecial = fContextMenu->addMenu(
"S&pecial");
448 WMenu *mTransparency = mSpecial->addMenu(
"Transparency");
449 WAction *transparencyOn = mTransparency->addAction(
"On");
450 WAction *transparencyOff = mTransparency->addAction(
"Off");
452 if (transparency_enabled ==
false) {
453 createRadioAction(transparencyOn,transparencyOff,SLOT(toggleTransparency(
bool)),2);
454 }
else if (transparency_enabled ==
true) {
455 createRadioAction(transparencyOn,transparencyOff,SLOT(toggleTransparency(
bool)),1);
461 WMenu *mAntialiasing = mSpecial->addMenu(
"Antialiasing");
462 WAction *antialiasingOn = mAntialiasing->addAction(
"On");
463 WAction *antialiasingOff = mAntialiasing->addAction(
"Off");
465 if (antialiasing_enabled ==
false) {
466 createRadioAction(antialiasingOn,antialiasingOff,SLOT(toggleAntialiasing(
bool)),2);
467 }
else if (antialiasing_enabled ==
true) {
468 createRadioAction(antialiasingOn,antialiasingOff,SLOT(toggleAntialiasing(
bool)),1);
470 mAntialiasing->clear();
473 WMenu *mHaloing = mSpecial->addMenu(
"Haloing");
474 WAction *haloingOn = mHaloing->addAction(
"On");
475 WAction *haloingOff = mHaloing->addAction(
"Off");
477 if (haloing_enabled ==
false) {
478 createRadioAction(haloingOn,haloingOff,SLOT(toggleHaloing(
bool)),2);
479 }
else if (haloing_enabled ==
true) {
480 createRadioAction(haloingOn,haloingOff,SLOT(toggleHaloing(
bool)),1);
485 WMenu *mAux = mSpecial->addMenu(
"Auxiliary edges");
486 WAction *auxOn = mAux->addAction(
"On");
487 WAction *auxOff = mAux->addAction(
"Off");
488 if (!fVP.IsAuxEdgeVisible()) {
489 createRadioAction(auxOn,auxOff,SLOT(toggleAux(
bool)),1);
491 createRadioAction(auxOn,auxOff,SLOT(toggleAux(
bool)),2);
496 WMenu *mFullScreen = mSpecial->addMenu(
"&Full screen");
497 fFullScreenOn = mFullScreen->addAction(
"On");
498 fFullScreenOff = mFullScreen->addAction(
"Off");
499 createRadioAction(fFullScreenOn,fFullScreenOff,SLOT(toggleFullScreen(
bool)),2);
504 void G4OpenGLWtViewer::G4manageContextMenuEvent(WContextMenuEvent *
e)
507 G4cerr <<
"Visualization window not defined, please choose one before" <<
G4endl;
514 if ( fContextMenu ) {
515 fContextMenu->exec( e->globalPos() );
531 void G4OpenGLWtViewer::createRadioAction(WAction *action1,WAction *action2,
const std::string& method,
unsigned int nCheck) {
533 action1->setCheckable(
true);
534 action2->setCheckable(
true);
537 action1->setChecked (
true);
539 action2->setChecked (
true);
551 void G4OpenGLWtViewer::actionMouseRotate() {
552 emit toggleMouseAction(STYLE1);
559 void G4OpenGLWtViewer::actionMouseMove() {
560 emit toggleMouseAction(STYLE2);
567 void G4OpenGLWtViewer::actionMousePick() {
568 emit toggleMouseAction(STYLE3);
575 void G4OpenGLWtViewer::actionDrawingWireframe() {
576 emit toggleDrawingAction(1);
582 void G4OpenGLWtViewer::actionDrawingLineRemoval() {
583 emit toggleDrawingAction(2);
589 void G4OpenGLWtViewer::actionDrawingSurfaceRemoval() {
590 emit toggleDrawingAction(3);
596 void G4OpenGLWtViewer::actionDrawingLineSurfaceRemoval() {
597 emit toggleDrawingAction(4);
605 void G4OpenGLWtViewer::toggleMouseAction(mouseActions aAction) {
607 if ((aAction == STYLE1) ||
608 (aAction == STYLE2) ||
609 (aAction == STYLE3)) {
610 fRotateAction->setChecked (
false);
611 fMoveAction->setChecked (
false);
612 fPickAction->setChecked (
false);
613 fVP.SetPicking(
false);
614 fMouseAction = aAction;
617 if (aAction == STYLE1) {
619 fRotateAction->setChecked (
true);
620 }
else if (aAction == STYLE2) {
621 fMoveAction->setChecked (
true);
622 }
else if (aAction == STYLE3) {
623 fPickAction->setChecked (
true);
624 fVP.SetPicking(
true);
632 void G4OpenGLWtViewer::showShortcuts() {
633 G4cout <<
"========= Mouse Shortcuts =========" <<
G4endl;
634 if (fMouseAction == STYLE1) {
635 G4cout <<
"Click and move mouse to rotate volume " <<
G4endl;
636 G4cout <<
"ALT + Click and move mouse to rotate volume (View Direction)" <<
G4endl;
637 G4cout <<
"CTRL + Click and zoom mouse to zoom in/out" <<
G4endl;
638 G4cout <<
"SHIFT + Click and zoommove camera point of view" <<
G4endl;
639 }
else if (fMouseAction == STYLE2) {
640 G4cout <<
"Move camera point of view with mouse" <<
G4endl;
641 }
else if (fMouseAction == STYLE3) {
644 G4cout <<
"========= Move Shortcuts =========" <<
G4endl;
645 G4cout <<
"Press left/right arrows to move volume left/right" <<
G4endl;
646 G4cout <<
"Press up/down arrows to move volume up/down" <<
G4endl;
647 G4cout <<
"Press '+'/'-' to move volume toward/forward" <<
G4endl;
649 G4cout <<
"========= Rotation (Theta/Phi) Shortcuts =========" <<
G4endl;
650 G4cout <<
"Press SHIFT + left/right arrows to rotate volume left/right" <<
G4endl;
651 G4cout <<
"Press SHIFT + up/down arrows to rotate volume up/down" <<
G4endl;
653 G4cout <<
"========= Rotation (View Direction) Shortcuts =========" <<
G4endl;
654 G4cout <<
"Press ALT + left/right to rotate volume around vertical direction" <<
G4endl;
655 G4cout <<
"Press ALT + up/down to rotate volume around horizontal direction" <<
G4endl;
658 G4cout <<
"Press CTRL + '+'/'-' to zoom into volume" <<
G4endl;
661 G4cout <<
"Press ALT +/- to slow/speed rotation/move" <<
G4endl;
667 G4cout <<
" Press SPACE to Start/Pause video recording " <<
G4endl;
668 G4cout <<
" Press RETURN to Stop video recording " <<
G4endl;
674 #ifdef _A_FINIR_FIXME
686 void G4OpenGLWtViewer::toggleDrawingAction(
int aAction) {
692 if ((aAction >0) && (aAction <5)) {
693 fDrawingWireframe->setChecked (
false);
694 fDrawingLineRemoval->setChecked (
false);
695 fDrawingSurfaceRemoval->setChecked (
false);
696 fDrawingLineSurfaceRemoval->setChecked (
false);
699 fDrawingWireframe->setChecked (
true);
703 }
else if (aAction ==2) {
704 fDrawingLineRemoval->setChecked (
true);
708 }
else if (aAction ==3) {
709 fDrawingSurfaceRemoval->setChecked (
true);
713 }
else if (aAction ==4) {
714 fDrawingLineSurfaceRemoval->setChecked (
true);
717 fVP.SetDrawingStyle(d_style);
733 void G4OpenGLWtViewer::toggleRepresentation(
bool check) {
735 G4ViewParameters::RepStyle style;
737 style = G4ViewParameters::polyhedron;
739 style = G4ViewParameters::nurbs;
741 fVP.SetRepStyle (style);
756 void G4OpenGLWtViewer::toggleProjection(
bool check) {
771 void G4OpenGLWtViewer::toggleTransparency(
bool check) {
774 transparency_enabled =
false;
776 transparency_enabled =
true;
778 SetNeedKernelVisit (
true);
786 void G4OpenGLWtViewer::toggleAntialiasing(
bool check) {
789 antialiasing_enabled =
false;
790 glDisable (GL_LINE_SMOOTH);
791 glDisable (GL_POLYGON_SMOOTH);
793 antialiasing_enabled =
true;
794 glEnable (GL_LINE_SMOOTH);
795 glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
796 glEnable (GL_POLYGON_SMOOTH);
797 glHint (GL_POLYGON_SMOOTH_HINT, GL_NICEST);
808 void G4OpenGLWtViewer::toggleHaloing(
bool check) {
810 haloing_enabled =
false;
812 haloing_enabled =
true;
823 void G4OpenGLWtViewer::toggleAux(
bool check) {
825 fVP.SetAuxEdgeVisible(
true);
827 fVP.SetAuxEdgeVisible(
false);
829 SetNeedKernelVisit (
true);
836 void G4OpenGLWtViewer::toggleFullScreen(
bool check) {
837 if (check != fGLWindow->isFullScreen()) {
838 fGLWindow->setWindowState(fGLWindow->windowState() ^ Wt::WindowFullScreen);
839 G4cerr <<
"This version of Wt could not do fullScreen. Resizing the widget is the only solution available." <<
G4endl;
844 #ifdef _A_FINIR_FIXME
845 void G4OpenGLWtViewer::savePPMToTemp() {
846 if (fMovieTempFolderPath ==
"") {
849 Wt::WString fileName =
"Test"+Wt::WString::number(fRecordFrameNumber)+
".ppm";
850 Wt::WString filePath =fMovieTempFolderPath+fileName;
853 image = fWindow->grabFrameBuffer();
856 res = image.save(filePath,0);
859 setRecordingInfos(
"Can't save tmp file "+filePath);
863 setRecordingInfos(
"File "+fileName+
" saved");
864 fRecordFrameNumber++;
869 void G4OpenGLWtViewer::actionSaveImage() {
871 WList<WByteArray> formats = WImageWriter::supportedImageFormats ();
872 for (
int i = 0; i < formats.size(); ++i) {
873 filters +=formats.at(i) +
";;";
878 Wt::WString* selectedFormat =
new Wt::WString();
880 name = WFileDialog::getSaveFileName ( fGLWindow,
884 selectedFormat ).toUTF8().c_str();
889 name +=
"." + selectedFormat->toUTF8();
890 Wt::WString format = selectedFormat->toLower();
891 setPrintFilename(name.c_str(),0);
892 G4OpenGLWtExportDialog* exportDialog=
new G4OpenGLWtExportDialog(fGLWindow,format,fWindow->height(),fWindow->width());
893 if( exportDialog->exec()) {
897 if ((exportDialog->getWidth() !=fWindow->width()) ||
898 (exportDialog->getHeight() !=fWindow->height())) {
899 setPrintSize(exportDialog->getWidth(),exportDialog->getHeight());
900 if ((format != Wt::WString(
"eps")) && (format != Wt::WString(
"ps"))) {
901 G4cerr <<
"Export->Change Size : This function is not implemented, to export in another size, please resize your frame to what you need" <<
G4endl;
920 image = fWindow->grabFrameBuffer();
922 if (format == Wt::WString(
"eps")) {
923 fVectoredPs = exportDialog->getVectorEPS();
925 }
else if (format ==
"ps") {
928 }
else if (format ==
"pdf") {
930 res = printPDF(name,exportDialog->getNbColor(),image);
932 }
else if ((format ==
"tif") ||
933 (format ==
"tiff") ||
935 (format ==
"jpeg") ||
943 res = image.save(Wt::WString(name.c_str()),0,exportDialog->getSliderValue());
945 G4cerr <<
"This version of G4UI Could not generate the selected format" <<
G4endl;
947 if ((format == Wt::WString(
"eps")) && (format == Wt::WString(
"ps"))) {
949 G4cerr <<
"Error while saving file... "<<name.c_str()<<
G4endl;
951 G4cout <<
"File "<<name.c_str()<<
" has been saved " <<
G4endl;
963 #ifdef _A_FINIR_FIXME
964 void G4OpenGLWtViewer::actionChangeBackgroundColor() {
973 color = WColorDialog::getColor(Wt::black, fGLWindow);
974 if (color.isValid()) {
975 Wt::WString com =
"/vis/viewer/set/background ";
977 com += num.setNum(((
float)color.red())/256)+
" ";
978 com += num.setNum(((
float)color.green())/256)+
" ";
979 com += num.setNum(((
float)color.blue())/256)+
" ";
985 void G4OpenGLWtViewer::actionChangeTextColor() {
988 color = WColorDialog::getColor(Wt::yellow, fGLWindow);
989 if (color.isValid()) {
990 Wt::WString com =
"/vis/viewer/set/defaultTextColour ";
992 com += num.setNum(((
float)color.red())/256)+
" ";
993 com += num.setNum(((
float)color.green())/256)+
" ";
994 com += num.setNum(((
float)color.blue())/256)+
" ";
1000 void G4OpenGLWtViewer::actionChangeDefaultColor() {
1003 color = WColorDialog::getColor(Wt::white, fGLWindow);
1004 printf(
"actionChangeDefaultColor\n");
1005 if (color.isValid()) {
1006 Wt::WString com =
"/vis/viewer/set/defaultColour ";
1008 com += num.setNum(((
float)color.red())/256)+
" ";
1009 com += num.setNum(((
float)color.green())/256)+
" ";
1010 com += num.setNum(((
float)color.blue())/256)+
" ";
1017 void G4OpenGLWtViewer::actionMovieParameters() {
1018 showMovieParametersDialog();
1022 void G4OpenGLWtViewer::showMovieParametersDialog() {
1023 if (!fMovieParametersDialog) {
1024 fMovieParametersDialog=
new G4OpenGLWtMovieDialog(
this,fGLWindow);
1025 displayRecordingStatus();
1026 fMovieParametersDialog->checkEncoderSwParameters();
1027 fMovieParametersDialog->checkSaveFileNameParameters();
1028 fMovieParametersDialog->checkTempFolderParameters();
1029 if (getEncoderPath() ==
"") {
1030 setRecordingInfos(
"mpeg_encode is needed to encode in video format. It is available here: http://bmrc.berkeley.edu/frame/research/mpeg/");
1033 fMovieParametersDialog->show();
1059 void G4OpenGLWtViewer::G4MousePressEvent(Wt::WMouseEvent *event)
1061 if (event->button() & Wt::WMouseEvent::LeftButton) {
1062 #ifdef _A_FINIR_FIXME
1063 fWindow->setMouseTracking(
true);
1066 fLastPos1 = Wt::WPoint(event->widget().x,
event->widget().y);
1067 fLastPos2 = fLastPos1;
1068 fLastPos3 = fLastPos2;
1070 if (fMouseAction == STYLE3){
1071 Pick(event->widget().x,
event->widget().y);
1078 void G4OpenGLWtViewer::G4MouseReleaseEvent()
1081 Wt::WPoint
delta = Wt::WPoint(fLastPos3.x()-fLastPos1.x(),fLastPos3.y()-fLastPos1.y());
1082 if ((delta.x() == 0) && (delta.y() == 0)) {
1085 if (fSpinningDelay < fLaunchSpinDelay ) {
1087 Wt::WTime lastMoveTime;
1090 float correctionFactor = 5;
1093 if ( 1 >= (
int)(1000/fNbMaxFramesPerSec)) {
1094 float lTime = 1000/((float)1);
1095 if (((((
float)delta.x())/correctionFactor)*lTime > fNbMaxAnglePerSec) ||
1096 ((((
float)delta.x())/correctionFactor)*lTime < -fNbMaxAnglePerSec) ) {
1097 correctionFactor = (float)delta.x()*(lTime/fNbMaxAnglePerSec);
1098 if (delta.x() <0 ) {
1099 correctionFactor = -correctionFactor;
1102 if (((((
float)delta.y())/correctionFactor)*lTime > fNbMaxAnglePerSec) ||
1103 ((((
float)delta.y())/correctionFactor)*lTime < -fNbMaxAnglePerSec) ) {
1104 correctionFactor = (float)delta.y()*(lTime/fNbMaxAnglePerSec);
1105 if (delta.y() <0 ) {
1106 correctionFactor = -correctionFactor;
1117 if (fMouseAction == STYLE1) {
1119 rotateWtScene(((
float)delta.x())/correctionFactor,((
float)delta.
y())/correctionFactor);
1120 } else
if (fAltKeyPress) {
1121 rotateWtSceneToggle(((
float)delta.x())/correctionFactor,((
float)delta.
y())/correctionFactor);
1124 } else
if (fMouseAction == STYLE2) {
1125 moveScene(-((
float)delta.x())/correctionFactor,-((
float)delta.
y())/correctionFactor,0,
true);
1129 #ifdef _A_FINIR_FIXME
1130 ((Wt::WApplication*)G4Wt::getInstance ())->processEvents();
1134 #ifdef _A_FINIR_FIXME
1135 fWindow->setMouseTracking(
false);
1140 void G4OpenGLWtViewer::G4MouseDoubleClickEvent()
1142 #ifdef _A_FINIR_FIXME
1143 fWindow->setMouseTracking(
true);
1155 void G4OpenGLWtViewer::G4MouseMoveEvent(Wt::WMouseEvent *event)
1158 Wt::WMouseEvent::Button mButtons =
event->button();
1160 #ifdef _A_FINIR_FIXME
1161 updateKeyModifierState(event->modifiers());
1168 fLastPos3 = fLastPos2;
1169 fLastPos2 = fLastPos1;
1170 fLastPos1 = Wt::WPoint(event->widget().x,
event->widget().y);
1172 printf(
"G4OpenGLWtViewer move :%d %d\n",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();
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);
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();
2131 this,SLOT(processEncodeFinished()));
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();
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";