diff --git a/source/g3d_viewer/main.cpp b/source/g3d_viewer/main.cpp index cfdbeb76..4a1eddb3 100644 --- a/source/g3d_viewer/main.cpp +++ b/source/g3d_viewer/main.cpp @@ -209,23 +209,26 @@ MainWindow::MainWindow( std::pair > unitToLoad, string appPath) : wxFrame(NULL, -1, ToUnicode(winHeader), wxPoint(Renderer::windowX, Renderer::windowY), - wxSize(Renderer::windowW, Renderer::windowH)), model(NULL), glCanvas(NULL), renderer(NULL), initTextureManager(true), timer(NULL) + wxSize(Renderer::windowW, Renderer::windowH)), + model(NULL), glCanvas(NULL), renderer(NULL), + initTextureManager(true), timer(NULL), + startupSettingsInited(false) { this->appPath = appPath; Properties::setApplicationPath(extractDirectoryPathFromFile(appPath)); Config &config = Config::getInstance(); //getGlPlatformExtensions(); + int args[] = { WX_GL_RGBA, WX_GL_DOUBLEBUFFER, WX_GL_MIN_ALPHA, 8 }; // to prevent flicker glCanvas = new GlCanvas(this, args); #if wxCHECK_VERSION(2, 9, 1) + //glCanvas->setCurrentGLContext(); #else glCanvas->SetCurrent(); #endif - renderer= Renderer::getInstance(); - model= NULL; unitPath = unitToLoad; @@ -302,56 +305,7 @@ MainWindow::MainWindow( std::pair > unitToLoad, menuMode->Check(miModeGrid, true); menuCustomColor->Check(miColorRed, true); - for(unsigned int i = 0; i < autoScreenShotParams.size(); ++i) { - if(autoScreenShotParams[i] == "transparent") { - printf("Screenshot option [%s]\n",autoScreenShotParams[i].c_str()); - menuFile->Check(miFileToggleScreenshotTransparent,true); - float alpha = 0.0f; - renderer->setAlphaColor(alpha); - } - if(autoScreenShotParams[i] == "enable_grid") { - printf("Screenshot option [%s]\n",autoScreenShotParams[i].c_str()); - menuMode->Check(miModeGrid,true); - if(renderer->getGrid() == false) { - renderer->toggleGrid(); - } - } - if(autoScreenShotParams[i] == "enable_wireframe") { - printf("Screenshot option [%s]\n",autoScreenShotParams[i].c_str()); - menuMode->Check(miModeWireframe,true); - if(renderer->getWireframe() == false) { - renderer->toggleWireframe(); - } - } - if(autoScreenShotParams[i] == "enable_normals") { - printf("Screenshot option [%s]\n",autoScreenShotParams[i].c_str()); - menuMode->Check(miModeNormals,true); - if(renderer->getNormals() == false) { - renderer->toggleNormals(); - } - } - if(autoScreenShotParams[i] == "disable_grid") { - printf("Screenshot option [%s]\n",autoScreenShotParams[i].c_str()); - menuMode->Check(miModeGrid,false); - if(renderer->getGrid() == true) { - renderer->toggleGrid(); - } - } - if(autoScreenShotParams[i] == "enable_wireframe") { - printf("Screenshot option [%s]\n",autoScreenShotParams[i].c_str()); - menuMode->Check(miModeWireframe,false); - if(renderer->getWireframe() == true) { - renderer->toggleWireframe(); - } - } - if(autoScreenShotParams[i] == "enable_normals") { - printf("Screenshot option [%s]\n",autoScreenShotParams[i].c_str()); - menuMode->Check(miModeNormals,false); - if(renderer->getNormals() == true) { - renderer->toggleNormals(); - } - } - } + //!!! SetMenuBar(menu); @@ -393,8 +347,8 @@ MainWindow::MainWindow( std::pair > unitToLoad, glCanvas->SetFocus(); - timer = new wxTimer(this); - timer->Start(100); + //timer = new wxTimer(this); + //timer->Start(100); // For windows register g3d file extension to launch this app #ifdef WIN32 @@ -426,6 +380,70 @@ MainWindow::MainWindow( std::pair > unitToLoad, #endif } +void MainWindow::setupTimer() { + timer = new wxTimer(this); + timer->Start(100); +} + +void MainWindow::setupStartupSettings() { + renderer= Renderer::getInstance(); + + for(unsigned int i = 0; i < autoScreenShotParams.size(); ++i) { + if(autoScreenShotParams[i] == "transparent") { + printf("Screenshot option [%s]\n",autoScreenShotParams[i].c_str()); + menuFile->Check(miFileToggleScreenshotTransparent,true); + float alpha = 0.0f; + renderer->setAlphaColor(alpha); + } + if(autoScreenShotParams[i] == "enable_grid") { + printf("Screenshot option [%s]\n",autoScreenShotParams[i].c_str()); + menuMode->Check(miModeGrid,true); + if(renderer->getGrid() == false) { + renderer->toggleGrid(); + } + } + if(autoScreenShotParams[i] == "enable_wireframe") { + printf("Screenshot option [%s]\n",autoScreenShotParams[i].c_str()); + menuMode->Check(miModeWireframe,true); + if(renderer->getWireframe() == false) { + renderer->toggleWireframe(); + } + } + if(autoScreenShotParams[i] == "enable_normals") { + printf("Screenshot option [%s]\n",autoScreenShotParams[i].c_str()); + menuMode->Check(miModeNormals,true); + if(renderer->getNormals() == false) { + renderer->toggleNormals(); + } + } + if(autoScreenShotParams[i] == "disable_grid") { + printf("Screenshot option [%s]\n",autoScreenShotParams[i].c_str()); + menuMode->Check(miModeGrid,false); + if(renderer->getGrid() == true) { + renderer->toggleGrid(); + } + } + if(autoScreenShotParams[i] == "enable_wireframe") { + printf("Screenshot option [%s]\n",autoScreenShotParams[i].c_str()); + menuMode->Check(miModeWireframe,false); + if(renderer->getWireframe() == true) { + renderer->toggleWireframe(); + } + } + if(autoScreenShotParams[i] == "enable_normals") { + printf("Screenshot option [%s]\n",autoScreenShotParams[i].c_str()); + menuMode->Check(miModeNormals,false); + if(renderer->getNormals() == true) { + renderer->toggleNormals(); + } + } + } + renderer->init(); + + wxCommandEvent event; + onMenuRestart(event); +} + MainWindow::~MainWindow(){ delete renderer; renderer = NULL; @@ -440,18 +458,27 @@ MainWindow::~MainWindow(){ void MainWindow::init() { #if wxCHECK_VERSION(2, 9, 1) + #else glCanvas->SetCurrent(); #endif - renderer->init(); + //renderer->init(); - wxCommandEvent event; - onMenuRestart(event); + //wxCommandEvent event; + //onMenuRestart(event); } -void MainWindow::onPaint(wxPaintEvent &event){ - //printf("Start onPaint\n"); - //fflush(stdout); +void MainWindow::onPaint(wxPaintEvent &event) { + if(!IsShown()) return; + +#if wxCHECK_VERSION(2, 9, 1) + glCanvas->setCurrentGLContext(); +#endif + + if(startupSettingsInited == false) { + startupSettingsInited = true; + setupStartupSettings(); + } renderer->reset(GetClientSize().x, GetClientSize().y, playerColor); @@ -1006,7 +1033,7 @@ void MainWindow::loadModel(string path) { for(unsigned int idx =0; idx < this->modelPathList.size(); idx++) { string modelPath = this->modelPathList[idx]; - printf("Loading model [%s] %u of %lu\n",modelPath.c_str(),idx, this->modelPathList.size()); + //printf("Loading model [%s] %u of %lu\n",modelPath.c_str(),idx, this->modelPathList.size()); if(timer) timer->Stop(); delete model; @@ -1712,9 +1739,25 @@ void translateCoords(wxWindow *wnd, int &x, int &y) { // to prevent flicker GlCanvas::GlCanvas(MainWindow * mainWindow, int *args) +#if wxCHECK_VERSION(2, 9, 1) + : wxGLCanvas(mainWindow, -1, args, wxDefaultPosition, wxDefaultSize, 0, wxT("GLCanvas")) { + this->context = new wxGLContext(this); +#else : wxGLCanvas(mainWindow, -1, wxDefaultPosition, wxDefaultSize, 0, wxT("GLCanvas"), args) { + this->context = NULL; +#endif this->mainWindow = mainWindow; - // +} + +GlCanvas::~GlCanvas() { + delete this->context; + this->context = NULL; +} + +void GlCanvas::setCurrentGLContext() { + if(this->context) { + this->SetCurrent(*this->context); + } } // for the mousewheel @@ -2103,6 +2146,7 @@ bool App::OnInit(){ mainWindow->Show(); mainWindow->init(); mainWindow->Update(); + mainWindow->setupTimer(); return true; } diff --git a/source/g3d_viewer/main.h b/source/g3d_viewer/main.h index 761fa18a..61da8870 100644 --- a/source/g3d_viewer/main.h +++ b/source/g3d_viewer/main.h @@ -106,6 +106,8 @@ private: string appPath; + bool startupSettingsInited; + void loadUnit(string path, string skillName); void loadModel(string path); void loadParticle(string path); @@ -159,6 +161,9 @@ public: void onKeyDown(wxKeyEvent &e); string getModelInfo(); + + void setupTimer(); + void setupStartupSettings(); }; // ===================================================== @@ -171,14 +176,17 @@ private: public: GlCanvas(MainWindow *mainWindow, int *args); + ~GlCanvas(); void onMouseWheel(wxMouseEvent &event); void onMouseMove(wxMouseEvent &event); void onPaint(wxPaintEvent &event); void onKeyDown(wxKeyEvent &event); + void setCurrentGLContext(); private: MainWindow *mainWindow; + wxGLContext *context; }; diff --git a/source/glest_map_editor/main.cpp b/source/glest_map_editor/main.cpp index c21bdd8b..6f9f0811 100755 --- a/source/glest_map_editor/main.cpp +++ b/source/glest_map_editor/main.cpp @@ -58,7 +58,7 @@ MainWindow::MainWindow() , menuBar(NULL) , panel(NULL) , glCanvas(NULL) - , program(NULL), boxsizer(NULL) { + , program(NULL), boxsizer(NULL), startupSettingsInited(false) { this->panel = new wxPanel(this, wxID_ANY); @@ -74,6 +74,7 @@ void MainWindow::onToolPlayer(wxCommandEvent& event){ void MainWindow::init(string fname) { #if wxCHECK_VERSION(2, 9, 1) + #else glCanvas->SetCurrent(); #endif @@ -349,18 +350,18 @@ void MainWindow::init(string fname) { this->panel->SetSizer(boxsizer); this->Layout(); - program = new Program(glCanvas->GetClientSize().x, glCanvas->GetClientSize().y); + //program = new Program(glCanvas->GetClientSize().x, glCanvas->GetClientSize().y); fileName = "New (unsaved) Map"; if (!fname.empty() && fileExists(fname)) { - program->loadMap(fname); + //program->loadMap(fname); currentFile = fname; fileName = cutLastExt(extractFileFromDirectoryPath(fname.c_str())); fileDialog->SetPath(ToUnicode(fname)); } SetTitle(ToUnicode(currentFile + " - " + winHeader)); - setDirty(false); - setExtension(); + //setDirty(false); + //setExtension(); } void MainWindow::onClose(wxCloseEvent &event) { @@ -372,6 +373,21 @@ void MainWindow::onClose(wxCloseEvent &event) { delete this; } +void MainWindow::setupStartupSettings() { + program = new Program(glCanvas->GetClientSize().x, glCanvas->GetClientSize().y); + + fileName = "New (unsaved) Map"; + if (!currentFile.empty() && fileExists(currentFile)) { + program->loadMap(currentFile); + //currentFile = fname; + fileName = cutLastExt(extractFileFromDirectoryPath(currentFile.c_str())); + fileDialog->SetPath(ToUnicode(currentFile)); + } + SetTitle(ToUnicode(currentFile + " - " + winHeader)); + setDirty(false); + setExtension(); +} + MainWindow::~MainWindow() { delete program; program = NULL; @@ -395,7 +411,7 @@ void MainWindow::setDirty(bool val) { } void MainWindow::setExtension() { - if (currentFile.empty()) { + if (currentFile.empty() || program == NULL) { return; } string extnsn = ext(currentFile); @@ -412,7 +428,7 @@ void MainWindow::setExtension() { } void MainWindow::onMouseDown(wxMouseEvent &event, int x, int y) { - if (event.LeftIsDown()) { + if (event.LeftIsDown() && program != NULL) { program->setUndoPoint(enabledGroup); program->setRefAlt(x, y); change(x, y); @@ -427,18 +443,27 @@ void MainWindow::onMouseDown(wxMouseEvent &event, int x, int y) { // for the mousewheel void MainWindow::onMouseWheelDown(wxMouseEvent &event) { + if(program == NULL) { + return; + } wxPaintEvent ev; program->incCellSize(1); onPaint(ev); } void MainWindow::onMouseWheelUp(wxMouseEvent &event) { + if(program == NULL) { + return; + } wxPaintEvent ev; program->incCellSize(-1); onPaint(ev); } void MainWindow::onMouseMove(wxMouseEvent &event, int x, int y) { + if(program == NULL) { + return; + } bool repaint = false; int dif; if (event.LeftIsDown()) { @@ -477,6 +502,20 @@ void MainWindow::onMouseMove(wxMouseEvent &event, int x, int y) { } void MainWindow::onPaint(wxPaintEvent &event) { + if(!IsShown()) { + event.Skip(); + return; + } + +#if wxCHECK_VERSION(2, 9, 1) + glCanvas->setCurrentGLContext(); +#endif + + if(startupSettingsInited == false) { + startupSettingsInited = true; + setupStartupSettings(); + } + if(lastPaintEvent.getMillis() < 30) { sleep(1); return; @@ -499,6 +538,10 @@ void MainWindow::onPaint(wxPaintEvent &event) { } void MainWindow::onMenuFileLoad(wxCommandEvent &event) { + if(program == NULL) { + return; + } + fileDialog->SetMessage(wxT("Select Glestmap to load")); fileDialog->SetWildcard(wxT("Glest&Mega Map (*.gbm *.mgm)|*.gbm;*.mgm|Glest Map (*.gbm)|*.gbm|Mega Map (*.mgm)|*.mgm")); if (fileDialog->ShowModal() == wxID_OK) { @@ -512,6 +555,10 @@ void MainWindow::onMenuFileLoad(wxCommandEvent &event) { } void MainWindow::onMenuFileSave(wxCommandEvent &event) { + if(program == NULL) { + return; + } + if (currentFile.empty()) { wxCommandEvent ev; onMenuFileSaveAs(ev); @@ -523,6 +570,9 @@ void MainWindow::onMenuFileSave(wxCommandEvent &event) { } void MainWindow::onMenuFileSaveAs(wxCommandEvent &event) { + if(program == NULL) { + return; + } #if wxCHECK_VERSION(2, 9, 1) wxFileDialog fd(this, wxT("Select file"), wxT(""), wxT(""), wxT("*.gbm|*.mgm"), wxFD_SAVE); @@ -548,6 +598,10 @@ void MainWindow::onMenuFileExit(wxCommandEvent &event) { } void MainWindow::onMenuEditUndo(wxCommandEvent &event) { + if(program == NULL) { + return; + } + // std::cout << "Undo Pressed" << std::endl; if (program->undo()) { wxPaintEvent e; @@ -557,7 +611,10 @@ void MainWindow::onMenuEditUndo(wxCommandEvent &event) { } void MainWindow::onMenuEditRedo(wxCommandEvent &event) { - // std::cout << "Redo Pressed" << std::endl; + if(program == NULL) { + return; + } + if (program->redo()) { wxPaintEvent e; onPaint(e); @@ -566,6 +623,10 @@ void MainWindow::onMenuEditRedo(wxCommandEvent &event) { } void MainWindow::onMenuEditReset(wxCommandEvent &event) { + if(program == NULL) { + return; + } + program->setUndoPoint(ctAll); SimpleDialog simpleDialog; simpleDialog.addValue("Width", "128","(must be 16,32,64,128,256,512...)"); // must be an exponent of two @@ -591,6 +652,10 @@ void MainWindow::onMenuEditReset(wxCommandEvent &event) { } void MainWindow::onMenuEditResetPlayers(wxCommandEvent &event) { + if(program == NULL) { + return; + } + SimpleDialog simpleDialog; simpleDialog.addValue("Number of players", intToStr(program->getMap()->getMaxFactions())); if (!simpleDialog.show("Reset players")) return; @@ -606,6 +671,10 @@ void MainWindow::onMenuEditResetPlayers(wxCommandEvent &event) { } void MainWindow::onMenuEditResize(wxCommandEvent &event) { + if(program == NULL) { + return; + } + SimpleDialog simpleDialog; simpleDialog.addValue("Width", intToStr(program->getMap()->getW()),"(must be 16,32,64,128,256,512...)"); simpleDialog.addValue("Height", intToStr(program->getMap()->getH()),"(must be 16,32,64,128,256,512...)"); @@ -627,73 +696,121 @@ void MainWindow::onMenuEditResize(wxCommandEvent &event) { } void MainWindow::onMenuEditFlipX(wxCommandEvent &event) { - program->setUndoPoint(ctAll); + if(program == NULL) { + return; + } + + program->setUndoPoint(ctAll); program->flipX(); setDirty(); } void MainWindow::onMenuEditFlipY(wxCommandEvent &event) { - program->setUndoPoint(ctAll); + if(program == NULL) { + return; + } + + program->setUndoPoint(ctAll); program->flipY(); setDirty(); } void MainWindow::onMenuEditMirrorX(wxCommandEvent &event) { // copy left to right - program->setUndoPoint(ctAll); + if(program == NULL) { + return; + } + + program->setUndoPoint(ctAll); program->mirrorX(); setDirty(); } void MainWindow::onMenuEditMirrorY(wxCommandEvent &event) { // copy top to bottom - program->setUndoPoint(ctAll); + if(program == NULL) { + return; + } + + program->setUndoPoint(ctAll); program->mirrorY(); setDirty(); } void MainWindow::onMenuEditMirrorXY(wxCommandEvent &event) { // copy bottomleft tp topright - program->setUndoPoint(ctAll); + if(program == NULL) { + return; + } + + program->setUndoPoint(ctAll); program->mirrorXY(); setDirty(); } void MainWindow::onMenuEditRotatecopyX(wxCommandEvent &event) { // copy left to right, rotated - program->setUndoPoint(ctAll); + if(program == NULL) { + return; + } + + program->setUndoPoint(ctAll); program->rotatecopyX(); setDirty(); } void MainWindow::onMenuEditRotatecopyY(wxCommandEvent &event) { // copy top to bottom, rotated - program->setUndoPoint(ctAll); + if(program == NULL) { + return; + } + + program->setUndoPoint(ctAll); program->rotatecopyY(); setDirty(); } void MainWindow::onMenuEditRotatecopyXY(wxCommandEvent &event) { // copy bottomleft to topright, rotated - program->setUndoPoint(ctAll); + if(program == NULL) { + return; + } + + program->setUndoPoint(ctAll); program->rotatecopyXY(); setDirty(); } void MainWindow::onMenuEditRotatecopyCorner(wxCommandEvent &event) { // copy top left 1/4 to top right 1/4, rotated - program->setUndoPoint(ctAll); + if(program == NULL) { + return; + } + + program->setUndoPoint(ctAll); program->rotatecopyCorner(); setDirty(); } void MainWindow::onMenuEditRandomizeHeights(wxCommandEvent &event) { - program->setUndoPoint(ctAll); + if(program == NULL) { + return; + } + + program->setUndoPoint(ctAll); program->randomizeMapHeights(); setDirty(); } void MainWindow::onMenuEditRandomize(wxCommandEvent &event) { - program->setUndoPoint(ctAll); + if(program == NULL) { + return; + } + + program->setUndoPoint(ctAll); program->randomizeMap(); setDirty(); } void MainWindow::onMenuEditSwitchSurfaces(wxCommandEvent &event) { + if(program == NULL) { + return; + } + SimpleDialog simpleDialog; simpleDialog.addValue("Surface1", "1","replace this surface with..."); simpleDialog.addValue("Surface2", "2","...this and vice versa"); @@ -712,6 +829,10 @@ void MainWindow::onMenuEditSwitchSurfaces(wxCommandEvent &event) { } void MainWindow::onMenuEditInfo(wxCommandEvent &event) { + if(program == NULL) { + return; + } + SimpleDialog simpleDialog; simpleDialog.addValue("Title", program->getMap()->getTitle()); simpleDialog.addValue("Description", program->getMap()->getDesc()); @@ -730,6 +851,10 @@ void MainWindow::onMenuEditInfo(wxCommandEvent &event) { } void MainWindow::onMenuEditAdvanced(wxCommandEvent &event) { + if(program == NULL) { + return; + } + SimpleDialog simpleDialog; simpleDialog.addValue("Height Factor", intToStr(program->getMap()->getHeightFactor()),"(lower means map is more more zoomed in)"); simpleDialog.addValue("Water Level", intToStr(program->getMap()->getWaterLevel()),"(water is visible below this, and walkable until 1.5 less)"); @@ -751,12 +876,20 @@ void MainWindow::onMenuEditAdvanced(wxCommandEvent &event) { } void MainWindow::onMenuViewResetZoomAndPos(wxCommandEvent &event) { + if(program == NULL) { + return; + } + program->resetOfset(); wxPaintEvent e; onPaint(e); } void MainWindow::onMenuViewGrid(wxCommandEvent &event) { + if(program == NULL) { + return; + } + menuView->Check(miViewGrid, program->setGridOnOff()); // miViewGrid event.GetId() wxPaintEvent e; onPaint(e); @@ -860,6 +993,10 @@ void MainWindow::onMenuRadius(wxCommandEvent &e) { } void MainWindow::change(int x, int y) { + if(program == NULL) { + return; + } + switch (enabledGroup) { case ctHeight: program->glestChangeMapHeight(x, y, height, radius); @@ -910,6 +1047,10 @@ void MainWindow::uncheckRadius() { } void MainWindow::onKeyDown(wxKeyEvent &e) { + if(program == NULL) { + return; + } + if (currentBrush == btHeight || currentBrush == btGradient) { // 'height' brush if (e.GetKeyCode() >= '0' && e.GetKeyCode() <= '5') { height = e.GetKeyCode() - 48; // '0'-'5' == 0-5 @@ -1077,10 +1218,28 @@ END_EVENT_TABLE() // ===================================================== GlCanvas::GlCanvas(MainWindow *mainWindow, wxWindow *parent, int *args) +#if wxCHECK_VERSION(2, 9, 1) + : wxGLCanvas(parent, -1, args, wxDefaultPosition, wxDefaultSize, 0, wxT("GLCanvas")) { + this->context = new wxGLContext(this); +#else : wxGLCanvas(parent, -1, wxDefaultPosition, wxDefaultSize, 0, wxT("GLCanvas"), args) { + this->context = NULL; +#endif + this->mainWindow = mainWindow; } +GlCanvas::~GlCanvas() { + delete this->context; + this->context = NULL; +} + +void GlCanvas::setCurrentGLContext() { + if(this->context) { + this->SetCurrent(*this->context); + } +} + void translateCoords(wxWindow *wnd, int &x, int &y) { /* #ifdef WIN32 diff --git a/source/glest_map_editor/main.h b/source/glest_map_editor/main.h index 368612ac..441041ce 100644 --- a/source/glest_map_editor/main.h +++ b/source/glest_map_editor/main.h @@ -183,6 +183,8 @@ private: wxBoxSizer *boxsizer; + bool startupSettingsInited; + public: MainWindow(); ~MainWindow(); @@ -247,9 +249,11 @@ public: void uncheckRadius(); private: + bool isDirty() const { return fileModified; } void setDirty(bool val=true); void setExtension(); + void setupStartupSettings(); }; // ===================================================== @@ -262,14 +266,18 @@ private: public: GlCanvas(MainWindow *mainWindow, wxWindow *parent, int *args); + ~GlCanvas(); void onMouseDown(wxMouseEvent &event); void onMouseMove(wxMouseEvent &event); void onMouseWheel(wxMouseEvent &event); void onKeyDown(wxKeyEvent &event); void onPaint(wxPaintEvent &event); + + void setCurrentGLContext(); private: MainWindow *mainWindow; + wxGLContext *context; }; // =====================================================