Пример #1
0
/**
 * @function OnToolMovie
 * @brief
 * @date 2011-10-13
 */
void GRIPFrame::OnToolMovie(wxCommandEvent& event){
    wxString dirname = wxDirSelector(wxT("Choose output directory for movie pictures:")); // , "", wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST

    if ( dirname.empty() ){ // filename
        std::cout << "No Directory Selected" << std::endl;
	return;
    }

    string path = string(dirname.mb_str());

    char *buf = new char[1000];

	//Create a new Viewer Window
	wxFrame *movieFrame = new wxFrame(NULL,wxID_ANY, wxT("MovieWindow"),wxPoint(0, 0), wxSize(renderW,renderH),wxDEFAULT_FRAME_STYLE & ~ (wxRESIZE_BORDER | wxMAXIMIZE_BOX));
	//#ifndef WIN32 // Weird hack to make wxWidgets work in Linux
	movieFrame->Show();
	//#endif

	int attrib[] = {WX_GL_DOUBLEBUFFER,WX_GL_RGBA,	WX_GL_DEPTH_SIZE, 16,0};
	Viewer *movieViewer = new Viewer(movieFrame, viewer, wxID_ANY, wxPoint(0, 0), wxSize(renderW, renderH), 0, _T("MovieWindow"), attrib);
	movieViewer->backColor = viewer->backColor;
	movieViewer->gridColor = viewer->gridColor;	

	//movieFrame.AddChild(
	#ifdef WIN32  // Weird hack to make wxWidgets work with VC++ debug
	movieViewer->MSWSetOldWndProc((WXFARPROC)DefWindowProc);
	#endif

	int w,h;

	movieViewer->Show(true);
    movieViewer->Freeze();
    wxClientDC dc2(movieViewer);
    dc2.GetSize(&w, &h);
    movieViewer->InitGL();
    movieViewer->Thaw();
	movieViewer->handleEvents = false;
	movieViewer->Show(true);

	movieViewer->camT = viewer->camT;
	movieViewer->camRotT = viewer->camRotT;
	movieViewer->camRadius = viewer->camRadius;
	movieViewer->worldV = viewer->worldV;

    double curTargetTime = 0.0;
    std::vector<GRIPTimeSlice>::iterator it = timeVector.begin();
    int framesWritten = 0;

    double framerate = 30.0;

    do {
        if (it == timeVector.end()) break; // call it done
        while((*it).time < curTargetTime) it++;

		// Issue 122 from DART
        //mWorld->setState((*it).state);
		Eigen::VectorXd newState = (*it).state;   
    	setState_Issue122( newState );

        movieViewer->DrawGLScene();
        wxYield();

        unsigned char* imageData = (unsigned char*) malloc(w * h * 3);
        glReadPixels(0, 0, w, h, GL_RGB, GL_UNSIGNED_BYTE, imageData);
        wxImage img_ud(w,h,imageData);
        wxImage img = img_ud.Mirror(false);

        sprintf(buf, "%s/%06d.png",path.c_str(), framesWritten);

        wxString fname = wxString(buf,wxConvUTF8);
        cout << "Saving frame at t = " << (*it).time << " (targeting " << curTargetTime << ") into " << buf << "" << endl;
        img.SaveFile(fname, wxBITMAP_TYPE_PNG);

        framesWritten++;

        curTargetTime += 1.0 / framerate;
    } while (curTargetTime < timeVector.back().time);


	delete movieViewer;
	delete movieFrame;
	viewer->InitGL();

    delete buf;
    event.Skip();
}