From f0c636d2ff10c25bd0e794736a549c5eb7d10b1b Mon Sep 17 00:00:00 2001 From: Mark Vejvoda Date: Sun, 12 Jun 2011 05:54:54 +0000 Subject: [PATCH] - render battle end screen to texture buffer on first render so it takes less fps to render after the 1st frame --- source/glest_game/graphics/renderer.cpp | 78 +++- source/glest_game/graphics/renderer.h | 4 + source/glest_game/main/battle_end.cpp | 534 +++++++++++++----------- source/glest_game/main/battle_end.h | 1 + 4 files changed, 362 insertions(+), 255 deletions(-) diff --git a/source/glest_game/graphics/renderer.cpp b/source/glest_game/graphics/renderer.cpp index 28da430a..ee6e39c3 100644 --- a/source/glest_game/graphics/renderer.cpp +++ b/source/glest_game/graphics/renderer.cpp @@ -1387,6 +1387,25 @@ Vec2i computeCenteredPos(const string &text, Font3D *font, int x, int y) { return textPos; } +void Renderer::renderTextBoundingBox3D(const string &text, Font3D *font, float alpha, int x, int y, int w, int h, bool centered) { + glPushAttrib(GL_ENABLE_BIT | GL_CURRENT_BIT); + glEnable(GL_BLEND); + glColor4fv(Vec4f(1.f, 1.f, 1.f, alpha).ptr()); + + Vec2f pos= Vec2f(x, y); + //Vec2i pos= centered? computeCenteredPos(text, font, x, y): Vec2i(x, y); + if(centered == true) { + getCentered3DPos(text, font, pos, w, h); + } + + textRenderer3D->begin(font); + textRenderer3D->render(text, pos.x, pos.y); + textRenderer3D->end(); + + glDisable(GL_BLEND); + glPopAttrib(); +} + void Renderer::renderText3D(const string &text, Font3D *font, float alpha, int x, int y, bool centered) { glPushAttrib(GL_ENABLE_BIT | GL_CURRENT_BIT); glEnable(GL_BLEND); @@ -1624,16 +1643,17 @@ void Renderer::renderLabel(GraphicLabel *label,const Vec4f *color) { int w= label->getW(); //if(label->getInstanceName() == "modDescrLabel") printf("~~~ lines.size() [%u] i = %d lines[i] [%s] y = %d\n",lines.size(),i,lines[i].c_str(),y); - if(label->getCentered()){ + if(label->getCentered()) { textPos= Vec2i(x+w/2, y+h/2); } - else{ + else { textPos= Vec2i(x, y+h/4); } if(color != NULL) { if(renderText3DEnabled == true) { - renderText3D(lines[i], label->getFont3D(), (*color), textPos.x, textPos.y, label->getCentered()); + //renderText3D(lines[i], label->getFont3D(), (*color), textPos.x, textPos.y, label->getCentered()); + renderTextBoundingBox3D(lines[i], label->getFont3D(), (*color), x, y, w, h, label->getCentered()); } else { renderText(lines[i], label->getFont(), (*color), textPos.x, textPos.y, label->getCentered()); @@ -1641,7 +1661,8 @@ void Renderer::renderLabel(GraphicLabel *label,const Vec4f *color) { } else { if(renderText3DEnabled == true) { - renderText3D(lines[i], label->getFont3D(), GraphicComponent::getFade(), textPos.x, textPos.y, label->getCentered()); + //renderText3D(lines[i], label->getFont3D(), GraphicComponent::getFade(), textPos.x, textPos.y, label->getCentered()); + renderTextBoundingBox3D(lines[i], label->getFont3D(), GraphicComponent::getFade(), x, y, w, h, label->getCentered()); } else { renderText(lines[i], label->getFont(), GraphicComponent::getFade(), textPos.x, textPos.y, label->getCentered()); @@ -1841,9 +1862,11 @@ void Renderer::renderCheckBox(const GraphicCheckBox *box) { //lighting float anim= GraphicComponent::getAnim(); - if(anim>0.5f) anim= 1.f-anim; + if(anim > 0.5f) { + anim = 1.f - anim; + } - if(box->getLighted() && box->getEditable()){ + if(box->getLighted() && box->getEditable()) { const int lightSize= 0; const Vec4f color1= Vec4f(color.x, color.y, color.z, 0.1f+anim*0.5f); const Vec4f color2= Vec4f(color.x, color.y, color.z, 0.3f+anim); @@ -5489,6 +5512,49 @@ VisibleQuadContainerCache & Renderer::getQuadCache( bool updateOnDirtyFrame, return quadCache; } +void Renderer::beginRenderToTexture(Texture2D **renderToTexture) { + static bool supportFBOs = Texture2DGl().supports_FBO_RBO(); + + if(supportFBOs == true && renderToTexture != NULL) { + Config &config= Config::getInstance(); + Texture2D::Filter textureFilter = strToTextureFilter(config.getString("Filter")); + int maxAnisotropy = config.getInt("FilterMaxAnisotropy"); + + const Metrics &metrics = Metrics::getInstance(); + + *renderToTexture = GraphicsInterface::getInstance().getFactory()->newTexture2D(); + Texture2DGl *texture = static_cast(*renderToTexture); + texture->setMipmap(false); + Pixmap2D *pixmapScreenShot = texture->getPixmap(); + pixmapScreenShot->init(metrics.getScreenW(), metrics.getScreenH(), 4); + texture->setForceCompressionDisabled(true); + texture->init(textureFilter,maxAnisotropy); + texture->setup_FBO_RBO(); + + assertGl(); + + if(texture->checkFrameBufferStatus() == false) { + //printf("******************** WARNING CANNOT Attach to FBO!\n"); + texture->end(); + delete texture; + *renderToTexture=NULL; + } + } +} + +void Renderer::endRenderToTexture(Texture2D **renderToTexture) { + static bool supportFBOs = Texture2DGl().supports_FBO_RBO(); + + if(supportFBOs == true && renderToTexture != NULL) { + Texture2DGl *texture = static_cast(*renderToTexture); + if(texture != NULL) { + texture->dettachFrameBufferFromTexture(); + } + + assertGl(); + } +} + void Renderer::renderMapPreview( const MapPreview *map, bool renderAll, int screenPosX, int screenPosY, Texture2D **renderToTexture) { diff --git a/source/glest_game/graphics/renderer.h b/source/glest_game/graphics/renderer.h index 42d2cb52..2b296f00 100644 --- a/source/glest_game/graphics/renderer.h +++ b/source/glest_game/graphics/renderer.h @@ -371,6 +371,10 @@ public: Vec2f getCentered3DPos(const string &text, Font3D *font, Vec2f &pos, int w, int h); void renderTextBoundingBox3D(const string &text, Font3D *font, const Vec4f &color, int x, int y, int w, int h, bool centered); void renderTextBoundingBox3D(const string &text, Font3D *font, const Vec3f &color, int x, int y, int w, int h, bool centered); + void renderTextBoundingBox3D(const string &text, Font3D *font, float alpha, int x, int y, int w, int h, bool centered); + + void beginRenderToTexture(Texture2D **renderToTexture); + void endRenderToTexture(Texture2D **renderToTexture); //components void renderLabel(GraphicLabel *label); diff --git a/source/glest_game/main/battle_end.cpp b/source/glest_game/main/battle_end.cpp index d88b7cb3..826ac42d 100644 --- a/source/glest_game/main/battle_end.cpp +++ b/source/glest_game/main/battle_end.cpp @@ -42,6 +42,7 @@ BattleEnd::BattleEnd(Program *program, const Stats *stats): ProgramState(program mouseX = 0; mouseY = 0; mouse2d = 0; + renderToTexture = NULL; const Metrics &metrics= Metrics::getInstance(); Lang &lang= Lang::getInstance(); @@ -59,7 +60,14 @@ BattleEnd::BattleEnd(Program *program, const Stats *stats): ProgramState(program BattleEnd::~BattleEnd() { SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s %d]\n",__FILE__,__FUNCTION__,__LINE__); + SoundRenderer::getInstance().playMusic(CoreData::getInstance().getMenuMusic()); + + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s %d]\n",__FILE__,__FUNCTION__,__LINE__); + + delete renderToTexture; + renderToTexture = NULL; + SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s %d]\n",__FILE__,__FUNCTION__,__LINE__); } @@ -70,291 +78,319 @@ void BattleEnd::update() { mouse2d= (mouse2d+1) % Renderer::maxMouse2dAnim; } -void BattleEnd::render(){ +void BattleEnd::render() { Renderer &renderer= Renderer::getInstance(); - TextRenderer2D *textRenderer2D = renderer.getTextRenderer(); - TextRenderer3D *textRenderer3D = renderer.getTextRenderer3D(); - TextRenderer *textRenderer = NULL; + if(renderToTexture != NULL) { + //printf("Rendering from texture!\n"); - if(Renderer::renderText3DEnabled == true) { - textRenderer= textRenderer3D; + renderer.clearBuffers(); + renderer.reset2d(); + renderer.renderBackground(renderToTexture); + + renderer.renderButton(&buttonExit); + + //exit message box + if(mainMessageBox.getEnabled()){ + renderer.renderMessageBox(&mainMessageBox); + } + + renderer.renderMouse2d(mouseX, mouseY, mouse2dAnim); + + renderer.swapBuffers(); } else { - textRenderer= textRenderer2D; - } + //printf("Rendering to texture!\n"); - Lang &lang= Lang::getInstance(); + renderer.beginRenderToTexture(&renderToTexture); - renderer.clearBuffers(); - renderer.reset2d(); - renderer.renderBackground(CoreData::getInstance().getBackgroundTexture()); + TextRenderer2D *textRenderer2D = renderer.getTextRenderer(); + TextRenderer3D *textRenderer3D = renderer.getTextRenderer3D(); + TextRenderer *textRenderer = NULL; - int winnerIndex = -1; - int bestScore = -1; - int mostKillsIndex = -1; - int bestKills = -1; - int mostEnemyKillsIndex = -1; - int bestEnemyKills = -1; - int leastDeathsIndex = -1; - int leastDeaths = -1; - int mostUnitsProducedIndex = -1; - int bestUnitsProduced = -1; - int mostResourcesHarvestedIndex = -1; - int bestResourcesHarvested = -1; - - for(int i=0; i bestKills) { - bestKills = kills; - mostKillsIndex = i; - } - - int enemykills= stats.getEnemyKills(i); - if(enemykills > bestEnemyKills) { - bestEnemyKills = enemykills; - mostEnemyKillsIndex = i; - } - - int deaths= stats.getDeaths(i); - if(deaths < leastDeaths || leastDeaths < 0) { - leastDeaths = deaths; - leastDeathsIndex = i; - } - - int unitsProduced= stats.getUnitsProduced(i); - if(unitsProduced > bestUnitsProduced) { - bestUnitsProduced = unitsProduced; - mostUnitsProducedIndex = i; - } - - int resourcesHarvested = stats.getResourcesHarvested(i); - if(resourcesHarvested > bestResourcesHarvested) { - bestResourcesHarvested = resourcesHarvested; - mostResourcesHarvestedIndex = i; - } - - int score= enemykills*100 + unitsProduced*50 + resourcesHarvested/10; - - if(score > bestScore) { - bestScore = score; - winnerIndex = i; - } - } - - bool disableStatsColorCoding = Config::getInstance().getBool("DisableBattleEndColorCoding","false"); - - if(Renderer::renderText3DEnabled == true) { - textRenderer3D->begin(CoreData::getInstance().getMenuFontNormal3D()); - } - else { - textRenderer2D->begin(CoreData::getInstance().getMenuFontNormal()); - } - - int lm= 20; - int bm= 100; - - for(int i = 0; i < stats.getFactionCount(); ++i) { - if(stats.getTeam(i) == GameConstants::maxPlayers -1 + fpt_Observer) { - continue; - } - - int textX= lm+160+i*100; - int team= stats.getTeam(i) + 1; - int kills= stats.getKills(i); - int enemykills= stats.getEnemyKills(i); - int deaths= stats.getDeaths(i); - int unitsProduced= stats.getUnitsProduced(i); - int resourcesHarvested= stats.getResourcesHarvested(i); - - int score= enemykills*100 + unitsProduced*50 + resourcesHarvested/10; - string controlString; - - if(stats.getPersonalityType(i) == fpt_Observer) { - controlString= GameConstants::OBSERVER_SLOTNAME; + if(Renderer::renderText3DEnabled == true) { + textRenderer= textRenderer3D; } else { - switch(stats.getControl(i)) { - case ctCpuEasy: - controlString= lang.get("CpuEasy"); - break; - case ctCpu: - controlString= lang.get("Cpu"); - break; - case ctCpuUltra: - controlString= lang.get("CpuUltra"); - break; - case ctCpuMega: - controlString= lang.get("CpuMega"); - break; - case ctNetwork: - controlString= lang.get("Network"); - break; - case ctHuman: - controlString= lang.get("Human"); - break; - - case ctNetworkCpuEasy: - controlString= lang.get("NetworkCpuEasy"); - break; - case ctNetworkCpu: - controlString= lang.get("NetworkCpu"); - break; - case ctNetworkCpuUltra: - controlString= lang.get("NetworkCpuUltra"); - break; - case ctNetworkCpuMega: - controlString= lang.get("NetworkCpuMega"); - break; - - default: - assert(false); - }; + textRenderer= textRenderer2D; } + + Lang &lang= Lang::getInstance(); + + renderer.clearBuffers(); + renderer.reset2d(); + renderer.renderBackground(CoreData::getInstance().getBackgroundTexture()); - if(stats.getControl(i) != ctHuman && stats.getControl(i) != ctNetwork ) { - controlString += " x " + floatToStr(stats.getResourceMultiplier(i),1); - } + int winnerIndex = -1; + int bestScore = -1; + int mostKillsIndex = -1; + int bestKills = -1; + int mostEnemyKillsIndex = -1; + int bestEnemyKills = -1; + int leastDeathsIndex = -1; + int leastDeaths = -1; + int mostUnitsProducedIndex = -1; + int bestUnitsProduced = -1; + int mostResourcesHarvestedIndex = -1; + int bestResourcesHarvested = -1; - if(score == bestScore && stats.getVictory(i)) { - if(CoreData::getInstance().getGameWinnerTexture() != NULL) { - renderer.renderTextureQuad(textX, bm+380,-1,-1,CoreData::getInstance().getGameWinnerTexture(),0.7f); + for(int i=0; i bestKills) { + bestKills = kills; + mostKillsIndex = i; + } + + int enemykills= stats.getEnemyKills(i); + if(enemykills > bestEnemyKills) { + bestEnemyKills = enemykills; + mostEnemyKillsIndex = i; + } + + int deaths= stats.getDeaths(i); + if(deaths < leastDeaths || leastDeaths < 0) { + leastDeaths = deaths; + leastDeathsIndex = i; + } + + int unitsProduced= stats.getUnitsProduced(i); + if(unitsProduced > bestUnitsProduced) { + bestUnitsProduced = unitsProduced; + mostUnitsProducedIndex = i; + } + + int resourcesHarvested = stats.getResourcesHarvested(i); + if(resourcesHarvested > bestResourcesHarvested) { + bestResourcesHarvested = resourcesHarvested; + mostResourcesHarvestedIndex = i; + } + + int score= enemykills*100 + unitsProduced*50 + resourcesHarvested/10; + + if(score > bestScore) { + bestScore = score; + winnerIndex = i; } } - Vec3f color = stats.getPlayerColor(i); - if(stats.getPlayerName(i) != "") { - textRenderer->render(stats.getPlayerName(i).c_str(), textX, bm+400, false, &color); + bool disableStatsColorCoding = Config::getInstance().getBool("DisableBattleEndColorCoding","false"); + + if(Renderer::renderText3DEnabled == true) { + textRenderer3D->begin(CoreData::getInstance().getMenuFontNormal3D()); } else { - textRenderer->render((lang.get("Player") + " " + intToStr(i+1)).c_str(), textX, bm+400,false, &color); + textRenderer2D->begin(CoreData::getInstance().getMenuFontNormal()); } - Vec3f highliteColor = Vec3f(WHITE.x,WHITE.y,WHITE.z); - if(disableStatsColorCoding == false) { - highliteColor.x = 0.85; - highliteColor.y = 0.8; - highliteColor.z = 0.07; - } + int lm= 20; + int bm= 100; - if(stats.getPersonalityType(i) == fpt_Observer) { - textRenderer->render(lang.get("GameOver").c_str(), textX, bm+360); - } - else { - if(stats.getVictory(i)) { - textRenderer->render(stats.getVictory(i)? lang.get("Victory").c_str(): lang.get("Defeat").c_str(), textX, bm+360, false, &highliteColor); + for(int i = 0; i < stats.getFactionCount(); ++i) { + if(stats.getTeam(i) == GameConstants::maxPlayers -1 + fpt_Observer) { + continue; + } + + int textX= lm+160+i*100; + int team= stats.getTeam(i) + 1; + int kills= stats.getKills(i); + int enemykills= stats.getEnemyKills(i); + int deaths= stats.getDeaths(i); + int unitsProduced= stats.getUnitsProduced(i); + int resourcesHarvested= stats.getResourcesHarvested(i); + + int score= enemykills*100 + unitsProduced*50 + resourcesHarvested/10; + string controlString; + + if(stats.getPersonalityType(i) == fpt_Observer) { + controlString= GameConstants::OBSERVER_SLOTNAME; } else { - textRenderer->render(stats.getVictory(i)? lang.get("Victory").c_str(): lang.get("Defeat").c_str(), textX, bm+360); + switch(stats.getControl(i)) { + case ctCpuEasy: + controlString= lang.get("CpuEasy"); + break; + case ctCpu: + controlString= lang.get("Cpu"); + break; + case ctCpuUltra: + controlString= lang.get("CpuUltra"); + break; + case ctCpuMega: + controlString= lang.get("CpuMega"); + break; + case ctNetwork: + controlString= lang.get("Network"); + break; + case ctHuman: + controlString= lang.get("Human"); + break; + + case ctNetworkCpuEasy: + controlString= lang.get("NetworkCpuEasy"); + break; + case ctNetworkCpu: + controlString= lang.get("NetworkCpu"); + break; + case ctNetworkCpuUltra: + controlString= lang.get("NetworkCpuUltra"); + break; + case ctNetworkCpuMega: + controlString= lang.get("NetworkCpuMega"); + break; + + default: + assert(false); + }; + } + + if(stats.getControl(i) != ctHuman && stats.getControl(i) != ctNetwork ) { + controlString += " x " + floatToStr(stats.getResourceMultiplier(i),1); + } + + if(score == bestScore && stats.getVictory(i)) { + if(CoreData::getInstance().getGameWinnerTexture() != NULL) { + renderer.renderTextureQuad(textX, bm+380,-1,-1,CoreData::getInstance().getGameWinnerTexture(),0.7f); + } + } + + Vec3f color = stats.getPlayerColor(i); + if(stats.getPlayerName(i) != "") { + textRenderer->render(stats.getPlayerName(i).c_str(), textX, bm+400, false, &color); + } + else { + textRenderer->render((lang.get("Player") + " " + intToStr(i+1)).c_str(), textX, bm+400,false, &color); + } + + Vec3f highliteColor = Vec3f(WHITE.x,WHITE.y,WHITE.z); + if(disableStatsColorCoding == false) { + highliteColor.x = 0.85; + highliteColor.y = 0.8; + highliteColor.z = 0.07; + } + + if(stats.getPersonalityType(i) == fpt_Observer) { + textRenderer->render(lang.get("GameOver").c_str(), textX, bm+360); + } + else { + if(stats.getVictory(i)) { + textRenderer->render(stats.getVictory(i)? lang.get("Victory").c_str(): lang.get("Defeat").c_str(), textX, bm+360, false, &highliteColor); + } + else { + textRenderer->render(stats.getVictory(i)? lang.get("Victory").c_str(): lang.get("Defeat").c_str(), textX, bm+360); + } + } + + textRenderer->render(controlString, textX, bm+320); + textRenderer->render(stats.getFactionTypeName(i), textX, bm+280); + textRenderer->render(intToStr(team).c_str(), textX, bm+240); + + if(kills == bestKills) { + textRenderer->render(intToStr(kills).c_str(), textX, bm+200, false,&highliteColor); + } + else { + textRenderer->render(intToStr(kills).c_str(), textX, bm+200); + } + if(enemykills == bestEnemyKills) { + textRenderer->render(intToStr(enemykills).c_str(), textX, bm+180, false , &highliteColor); + } + else { + textRenderer->render(intToStr(enemykills).c_str(), textX, bm+180); + } + if(deaths == leastDeaths) { + textRenderer->render(intToStr(deaths).c_str(), textX, bm+160,false,&highliteColor); + } + else { + textRenderer->render(intToStr(deaths).c_str(), textX, bm+160); + } + if(unitsProduced == bestUnitsProduced) { + textRenderer->render(intToStr(unitsProduced).c_str(), textX, bm+120,false,&highliteColor); + } + else { + textRenderer->render(intToStr(unitsProduced).c_str(), textX, bm+120); + } + if(resourcesHarvested == bestResourcesHarvested) { + textRenderer->render(intToStr(resourcesHarvested).c_str(), textX, bm+80,false,&highliteColor); + } + else { + textRenderer->render(intToStr(resourcesHarvested).c_str(), textX, bm+80); + } + if(score == bestScore) { + textRenderer->render(intToStr(score).c_str(), textX, bm+20,false,&highliteColor); + } + else { + textRenderer->render(intToStr(score).c_str(), textX, bm+20); } } - textRenderer->render(controlString, textX, bm+320); - textRenderer->render(stats.getFactionTypeName(i), textX, bm+280); - textRenderer->render(intToStr(team).c_str(), textX, bm+240); + textRenderer->render(lang.get("Result"), lm, bm+360); + textRenderer->render(lang.get("Control"), lm, bm+320); + textRenderer->render(lang.get("Faction"), lm, bm+280); + textRenderer->render(lang.get("Team"), lm, bm+240); + textRenderer->render(lang.get("Kills"), lm, bm+200); + textRenderer->render(lang.get("EnemyKills"), lm, bm+180); + textRenderer->render(lang.get("Deaths"), lm, bm+160); + textRenderer->render(lang.get("UnitsProduced"), lm, bm+120); + textRenderer->render(lang.get("ResourcesHarvested"), lm, bm+80); + textRenderer->render(lang.get("Score"), lm, bm+20); - if(kills == bestKills) { - textRenderer->render(intToStr(kills).c_str(), textX, bm+200, false,&highliteColor); + textRenderer->end(); + + if(Renderer::renderText3DEnabled == true) { + textRenderer3D->begin(CoreData::getInstance().getMenuFontVeryBig3D()); } else { - textRenderer->render(intToStr(kills).c_str(), textX, bm+200); + textRenderer2D->begin(CoreData::getInstance().getMenuFontVeryBig()); } - if(enemykills == bestEnemyKills) { - textRenderer->render(intToStr(enemykills).c_str(), textX, bm+180, false , &highliteColor); + + string header = stats.getDescription() + " - "; + + if(stats.getTeam(stats.getThisFactionIndex()) != GameConstants::maxPlayers -1 + fpt_Observer) { + if(stats.getVictory(stats.getThisFactionIndex())){ + header += lang.get("Victory"); + } + else{ + header += lang.get("Defeat"); + } } else { - textRenderer->render(intToStr(enemykills).c_str(), textX, bm+180); + header += "Observer"; } - if(deaths == leastDeaths) { - textRenderer->render(intToStr(deaths).c_str(), textX, bm+160,false,&highliteColor); + textRenderer->render(header, lm+250, bm+550); + + //GameConstants::updateFps + //string header2 = lang.get("GameDuration") + " " + floatToStr(stats.getWorldTimeElapsed() / 24.0,2); + + string header2 = lang.get("GameDuration") + ": " + intToStr(stats.getFramesToCalculatePlaytime()/GameConstants::updateFps/60); + textRenderer->render(header2, lm+250, bm+530); + + header2 = lang.get("GameMaxConcurrentUnitCount") + ": " + intToStr(stats.getMaxConcurrentUnitCount()); + textRenderer->render(header2, lm+250, bm+510); + + header2 = lang.get("GameTotalEndGameConcurrentUnitCount") + ": " + intToStr(stats.getTotalEndGameConcurrentUnitCount()); + textRenderer->render(header2, lm+250, bm+490); + + textRenderer->end(); + + renderer.renderButton(&buttonExit); + + //exit message box + if(mainMessageBox.getEnabled()){ + renderer.renderMessageBox(&mainMessageBox); } - else { - textRenderer->render(intToStr(deaths).c_str(), textX, bm+160); - } - if(unitsProduced == bestUnitsProduced) { - textRenderer->render(intToStr(unitsProduced).c_str(), textX, bm+120,false,&highliteColor); - } - else { - textRenderer->render(intToStr(unitsProduced).c_str(), textX, bm+120); - } - if(resourcesHarvested == bestResourcesHarvested) { - textRenderer->render(intToStr(resourcesHarvested).c_str(), textX, bm+80,false,&highliteColor); - } - else { - textRenderer->render(intToStr(resourcesHarvested).c_str(), textX, bm+80); - } - if(score == bestScore) { - textRenderer->render(intToStr(score).c_str(), textX, bm+20,false,&highliteColor); - } - else { - textRenderer->render(intToStr(score).c_str(), textX, bm+20); + + if(renderToTexture == NULL) { + renderer.renderMouse2d(mouseX, mouseY, mouse2d, 0.f); } + + renderer.endRenderToTexture(&renderToTexture); + + renderer.swapBuffers(); } - - textRenderer->render(lang.get("Result"), lm, bm+360); - textRenderer->render(lang.get("Control"), lm, bm+320); - textRenderer->render(lang.get("Faction"), lm, bm+280); - textRenderer->render(lang.get("Team"), lm, bm+240); - textRenderer->render(lang.get("Kills"), lm, bm+200); - textRenderer->render(lang.get("EnemyKills"), lm, bm+180); - textRenderer->render(lang.get("Deaths"), lm, bm+160); - textRenderer->render(lang.get("UnitsProduced"), lm, bm+120); - textRenderer->render(lang.get("ResourcesHarvested"), lm, bm+80); - textRenderer->render(lang.get("Score"), lm, bm+20); - - textRenderer->end(); - - if(Renderer::renderText3DEnabled == true) { - textRenderer3D->begin(CoreData::getInstance().getMenuFontVeryBig3D()); - } - else { - textRenderer2D->begin(CoreData::getInstance().getMenuFontVeryBig()); - } - - string header = stats.getDescription() + " - "; - - if(stats.getTeam(stats.getThisFactionIndex()) != GameConstants::maxPlayers -1 + fpt_Observer) { - if(stats.getVictory(stats.getThisFactionIndex())){ - header += lang.get("Victory"); - } - else{ - header += lang.get("Defeat"); - } - } - else { - header += "Observer"; - } - textRenderer->render(header, lm+250, bm+550); - - //GameConstants::updateFps - //string header2 = lang.get("GameDuration") + " " + floatToStr(stats.getWorldTimeElapsed() / 24.0,2); - - string header2 = lang.get("GameDuration") + ": " + intToStr(stats.getFramesToCalculatePlaytime()/GameConstants::updateFps/60); - textRenderer->render(header2, lm+250, bm+530); - - header2 = lang.get("GameMaxConcurrentUnitCount") + ": " + intToStr(stats.getMaxConcurrentUnitCount()); - textRenderer->render(header2, lm+250, bm+510); - - header2 = lang.get("GameTotalEndGameConcurrentUnitCount") + ": " + intToStr(stats.getTotalEndGameConcurrentUnitCount()); - textRenderer->render(header2, lm+250, bm+490); - - textRenderer->end(); - - renderer.renderButton(&buttonExit); - - //exit message box - if(mainMessageBox.getEnabled()){ - renderer.renderMessageBox(&mainMessageBox); - } - - renderer.renderMouse2d(mouseX, mouseY, mouse2d, 0.f); - - renderer.swapBuffers(); } void BattleEnd::keyDown(char key){ diff --git a/source/glest_game/main/battle_end.h b/source/glest_game/main/battle_end.h index b4f66a62..bce61647 100644 --- a/source/glest_game/main/battle_end.h +++ b/source/glest_game/main/battle_end.h @@ -33,6 +33,7 @@ private: int mouseY; int mouse2d; GraphicMessageBox mainMessageBox; + Texture2D *renderToTexture; void showMessageBox(const string &text, const string &header, bool toggle);