From 68638763592cae62b7ea562a84a7d3b3a14c4492 Mon Sep 17 00:00:00 2001 From: Mark Vejvoda Date: Sat, 22 Oct 2011 19:45:05 +0000 Subject: [PATCH] bugfixes from transition to battle end and back to menu --- source/glest_game/game/game.cpp | 8 +-- source/glest_game/graphics/renderer.cpp | 86 ++++++++++++++++++++----- source/glest_game/graphics/renderer.h | 7 +- 3 files changed, 81 insertions(+), 20 deletions(-) diff --git a/source/glest_game/game/game.cpp b/source/glest_game/game/game.cpp index 6e2cc6420..da297f848 100644 --- a/source/glest_game/game/game.cpp +++ b/source/glest_game/game/game.cpp @@ -236,7 +236,7 @@ void Game::endGame() { if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); -// gui.end(); //selection must be cleared before deleting units + gui.end(); //selection must be cleared before deleting units if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); @@ -247,7 +247,7 @@ void Game::endGame() { // MUST DO THIS LAST!!!! Because objects above have pointers to things like // unit particles and fade them out etc and this end method deletes the original // object pointers. - renderer.endGame(); + renderer.endGame(false); GameConstants::updateFps = original_updateFps; GameConstants::cameraFps = original_cameraFps; @@ -308,7 +308,7 @@ Game::~Game() { // MUST DO THIS LAST!!!! Because objects above have pointers to things like // unit particles and fade them out etc and this end method deletes the original // object pointers. - renderer.endGame(); + renderer.endGame(true); GameConstants::updateFps = original_updateFps; GameConstants::cameraFps = original_cameraFps; @@ -1252,7 +1252,7 @@ void Game::update() { // unit particles and fade them out etc and this end method deletes the original // object pointers. Renderer &renderer= Renderer::getInstance(); - renderer.endGame(); + renderer.endGame(true); GameConstants::updateFps = original_updateFps; GameConstants::cameraFps = original_cameraFps; diff --git a/source/glest_game/graphics/renderer.cpp b/source/glest_game/graphics/renderer.cpp index 3e8f26737..e3595b704 100644 --- a/source/glest_game/graphics/renderer.cpp +++ b/source/glest_game/graphics/renderer.cpp @@ -159,7 +159,6 @@ Renderer::Renderer(bool masterserverMode) : BaseRenderer() { this->allowRenderUnitTitles = false; this->menu = NULL; this->game = NULL; - list2d = 0; showDebugUI = false; showDebugUILevel = debugui_fps; modelRenderer = NULL; @@ -173,6 +172,16 @@ Renderer::Renderer(bool masterserverMode) : BaseRenderer() { lastRenderFps=MIN_FPS_NORMAL_RENDERING; shadowsOffDueToMinRender=false; + shadowMapHandle=0; + shadowMapHandleValid=false; + + list3d=0; + list3dValid=false; + list2d=0; + list2dValid=false; + list3dMenu=0; + list3dMenuValid=false; + customlist3dMenu=NULL; //resources for(int i=0; i < rsCount; ++i) { @@ -382,6 +391,7 @@ void Renderer::initGame(const Game *game){ static_cast(modelRenderer)->setSecondaryTexCoordUnit(2); glGenTextures(1, &shadowMapHandle); + shadowMapHandleValid=true; glBindTexture(GL_TEXTURE_2D, shadowMapHandle); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); @@ -510,9 +520,9 @@ void Renderer::end() { } //delete 2d list - if(list2d > 0) { + if(list2dValid == true) { glDeleteLists(list2d, 1); - list2d = 0; + list2dValid=false; } Renderer::rendererEnded = true; @@ -531,35 +541,47 @@ void Renderer::endScenario() { //fontManager[rsGame]->end(); //particleManager[rsGame]->end(); - if(shadows == sProjected || shadows == sShadowMapping) { + if(shadowMapHandleValid == true && + (shadows == sProjected || shadows == sShadowMapping)) { glDeleteTextures(1, &shadowMapHandle); + shadowMapHandleValid=false; } - glDeleteLists(list3d, 1); + if(list3dValid == true) { + glDeleteLists(list3d, 1); + list3dValid=false; + } //worldToScreenPosCache.clear(); ReleaseSurfaceVBOs(); mapSurfaceData.clear(); } -void Renderer::endGame() { +void Renderer::endGame(bool isFinalEnd) { game= NULL; if(this->masterserverMode == true) { return; } - //delete resources - modelManager[rsGame]->end(); - textureManager[rsGame]->end(); - fontManager[rsGame]->end(); - particleManager[rsGame]->end(); - - if(shadows == sProjected || shadows == sShadowMapping) { - glDeleteTextures(1, &shadowMapHandle); + if(isFinalEnd) { + //delete resources + modelManager[rsGame]->end(); + textureManager[rsGame]->end(); + fontManager[rsGame]->end(); + particleManager[rsGame]->end(); } - glDeleteLists(list3d, 1); + if(shadowMapHandleValid == true && + (shadows == sProjected || shadows == sShadowMapping)) { + glDeleteTextures(1, &shadowMapHandle); + shadowMapHandleValid=false; + } + + if(list3dValid == true) { + glDeleteLists(list3d, 1); + list3dValid=false; + } //worldToScreenPosCache.clear(); ReleaseSurfaceVBOs(); @@ -907,10 +929,38 @@ static Vec2i _unprojectMap(const Vec2i& pt,const GLdouble* model,const GLdouble* return pos; } +//Matrix4 LookAt( Vector3 eye, Vector3 target, Vector3 up ) { +// Vector3 zaxis = normal(target - eye); // The "look-at" vector. +// Vector3 xaxis = normal(cross(up, zaxis));// The "right" vector. +// Vector3 yaxis = cross(zaxis, xaxis); // The "up" vector. +// +// // Create a 4x4 orientation matrix from the right, up, and at vectors +// Matrix4 orientation = { +// xaxis.x, yaxis.x, zaxis.x, 0, +// xaxis.y, yaxis.y, zaxis.y, 0, +// xaxis.z, yaxis.z, zaxis.z, 0, +// 0, 0, 0, 1 +// }; +// +// // Create a 4x4 translation matrix by negating the eye position. +// Matrix4 translation = { +// 1, 0, 0, 0, +// 0, 1, 0, 0, +// 0, 0, 1, 0, +// -eye.x, -eye.y, -eye.z, 1 +// }; +// +// // Combine the orientation and translation to compute the view matrix +// return ( translation * orientation ); +//} + void Renderer::computeVisibleQuad() { const GameCamera *gameCamera = game->getGameCamera(); visibleQuad = gameCamera->computeVisibleQuad(); + //Matrix4 LookAt( gameCamera->getPos(), gameCamera->getPos(), Vector3 up ); + //gluLookAt + const bool newVisibleQuadCalc = false; if(newVisibleQuadCalc) { const bool debug = false; @@ -5782,6 +5832,8 @@ void Renderer::init3dList() { if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); list3d= glGenLists(1); + assertGl(); + list3dValid=true; if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); @@ -5888,6 +5940,7 @@ void Renderer::init2dList() { //this list sets the state for the 2d rendering list2d= glGenLists(1); assertGl(); + list2dValid=true; glNewList(list2d, GL_COMPILE); @@ -5941,9 +5994,12 @@ void Renderer::init3dListMenu(const MainMenu *mm) { if(this->customlist3dMenu != NULL) { *this->customlist3dMenu = glGenLists(1); + assertGl(); } else { list3dMenu= glGenLists(1); + assertGl(); + list3dMenuValid=true; } if(SystemFlags::getSystemSettingType(SystemFlags::debugSystem).enabled) SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); diff --git a/source/glest_game/graphics/renderer.h b/source/glest_game/graphics/renderer.h index 4053f0fbc..4c8f0124d 100644 --- a/source/glest_game/graphics/renderer.h +++ b/source/glest_game/graphics/renderer.h @@ -236,12 +236,17 @@ private: //state lists GLuint list3d; + bool list3dValid; GLuint list2d; + bool list2dValid; GLuint list3dMenu; + bool list3dMenuValid; GLuint *customlist3dMenu; //shadows GLuint shadowMapHandle; + bool shadowMapHandleValid; + Matrix4f shadowMapMatrix; int shadowMapFrame; @@ -357,7 +362,7 @@ public: void end(); void endScenario(); void endMenu(); - void endGame(); + void endGame(bool isFinalEnd); //get int getTriangleCount() const {return triangleCount;}