From d1597334bfa0b85ffeb7463152fadf2adf827869 Mon Sep 17 00:00:00 2001 From: titison Date: Sun, 2 Nov 2014 18:18:20 +0100 Subject: [PATCH] *Adjusted Healthbar color *Hotkey for Healthbars (ToggleHealthbars) *Background and Border Texture in core data --- source/glest_game/game/game.cpp | 8 ++- source/glest_game/game/game.h | 1 + source/glest_game/global/core_data.cpp | 27 ++++++++++ source/glest_game/global/core_data.h | 8 +++ source/glest_game/graphics/renderer.cpp | 69 +++++++++++++++++++++---- source/glest_game/graphics/renderer.h | 4 +- 6 files changed, 103 insertions(+), 14 deletions(-) diff --git a/source/glest_game/game/game.cpp b/source/glest_game/game/game.cpp index 67c83374..f3bfca0a 100644 --- a/source/glest_game/game/game.cpp +++ b/source/glest_game/game/game.cpp @@ -115,6 +115,7 @@ Game::Game() : ProgramState(NULL) { renderFpsAvgTest=0; renderExtraTeamColor=0; photoModeEnabled=false; + forcedHealthbars=false; visibleHUD=false; timeDisplay=false; withRainEffect=false; @@ -235,6 +236,7 @@ void Game::resetMembers() { scrollSpeed = Config::getInstance().getFloat("UiScrollSpeed","1.5"); photoModeEnabled = Config::getInstance().getBool("PhotoMode","false"); + forcedHealthbars = Config::getInstance().getBool("ForcedHealthbars","false"); visibleHUD = Config::getInstance().getBool("VisibleHud","true"); timeDisplay = Config::getInstance().getBool("TimeDisplay","true"); withRainEffect = Config::getInstance().getBool("RainEffect","true"); @@ -4655,6 +4657,10 @@ void Game::keyDown(SDL_KeyboardEvent key) { } } + //Toggle Healthbars + else if(isKeyPressed(configKeys.getSDLKey("ToggleHealthbars"),key, false) == true) { + forcedHealthbars = !forcedHealthbars; + } //Toggle music //else if(key == configKeys.getCharKey("ToggleMusic")) { else if(isKeyPressed(configKeys.getSDLKey("ToggleMusic"),key, false) == true) { @@ -5253,7 +5259,7 @@ void Game::render3d(){ //renderOnTopBars (aka Healthbars) if(photoModeEnabled == false) { - renderer.renderOnTopBars(); + renderer.renderOnTopBars(forcedHealthbars); } //particles diff --git a/source/glest_game/game/game.h b/source/glest_game/game/game.h index 1ebfc6c6..d4aae999 100644 --- a/source/glest_game/game/game.h +++ b/source/glest_game/game/game.h @@ -141,6 +141,7 @@ private: static const int renderTeamColorPlaneBit=2; bool photoModeEnabled; + bool forcedHealthbars; bool visibleHUD; bool timeDisplay; bool withRainEffect; diff --git a/source/glest_game/global/core_data.cpp b/source/glest_game/global/core_data.cpp index 6315d5d0..e0945aea 100644 --- a/source/glest_game/global/core_data.cpp +++ b/source/glest_game/global/core_data.cpp @@ -78,6 +78,9 @@ CoreData::CoreData() { statusNotReadyTexture=NULL; statusBRBTexture=NULL; + healthbarTexture=NULL; + healthbarBackgroundTexture=NULL; + miscTextureList.clear(); displayFont=NULL; @@ -181,6 +184,12 @@ Texture2D *CoreData::getTextureBySystemId(TextureSystemType type) const { case tsyst_statusBRBTexture: result = statusBRBTexture; break; + case tsyst_healthbarTexture: + result = healthbarTexture; + break; + case tsyst_healthbarBackgroundTexture: + result = healthbarBackgroundTexture; + break; //std::vector miscTextureList; } @@ -417,6 +426,24 @@ Texture2D *CoreData::getGameWinnerTexture() { return gameWinnerTexture; } +Texture2D *CoreData::getHealthbarTexture() { + string data_path = getDataPath(); + loadTextureIfRequired(&healthbarTexture,data_path, + CORE_MISC_TEXTURES_PATH + "healthbar.png", tsyst_healthbarTexture, + true, false, false, true); + + return healthbarTexture; +} + +Texture2D *CoreData::getHealthbarBackgroundTexture() { + string data_path = getDataPath(); + loadTextureIfRequired(&healthbarBackgroundTexture,data_path, + CORE_MISC_TEXTURES_PATH + "healthbarBackground.png", tsyst_healthbarBackgroundTexture, + true, false, false, true); + + return healthbarBackgroundTexture; +} + void CoreData::loadLogoTextureExtraIfRequired() { int loadAttemptLookupKey = tsyst_COUNT + 1; if(itemLoadAttempted.find(loadAttemptLookupKey) == itemLoadAttempted.end()) { diff --git a/source/glest_game/global/core_data.h b/source/glest_game/global/core_data.h index b184338e..d0ce3afa 100644 --- a/source/glest_game/global/core_data.h +++ b/source/glest_game/global/core_data.h @@ -78,6 +78,9 @@ private: Texture2D *statusNotReadyTexture; Texture2D *statusBRBTexture; + Texture2D *healthbarTexture; + Texture2D *healthbarBackgroundTexture; + std::vector miscTextureList; Font2D *displayFont; @@ -133,6 +136,8 @@ public: tsyst_statusReadyTexture, tsyst_statusNotReadyTexture, tsyst_statusBRBTexture, + tsyst_healthbarTexture, + tsyst_healthbarBackgroundTexture, tsyst_COUNT }; @@ -171,6 +176,9 @@ public: Texture2D *getStatusBRBTexture(); Texture2D *getGameWinnerTexture(); + Texture2D *getHealthbarTexture(); + Texture2D *getHealthbarBackgroundTexture(); + size_t getLogoTextureExtraCount(); Texture2D *getLogoTextureExtra(int idx); diff --git a/source/glest_game/graphics/renderer.cpp b/source/glest_game/graphics/renderer.cpp index ec35eb5b..f5928c70 100644 --- a/source/glest_game/graphics/renderer.cpp +++ b/source/glest_game/graphics/renderer.cpp @@ -5610,7 +5610,7 @@ void Renderer::renderSelectionEffects() { glPopAttrib(); } -void Renderer::renderOnTopBars(){ +void Renderer::renderOnTopBars(bool forceHealthbars){ if(GlobalStaticFlags::getIsNonGraphicalModeEnabled() == true) { return; } @@ -5642,11 +5642,17 @@ void Renderer::renderOnTopBars(){ float healthbarheight; float healthbarthickness; int healthbarVisible; + const Texture2D *healthbarTexture; + const Texture2D *healthbarBackgroundTexture; //get settings of the faction healthbarheight=unit->getFaction()->getType()->getHealthbarHeight(); healthbarthickness=unit->getFaction()->getType()->getHealthbarThickness(); healthbarVisible=unit->getFaction()->getType()->getHealthbarVisible(); + CoreData &coreData= CoreData::getInstance(); + healthbarTexture=coreData.getHealthbarTexture(); + healthbarBackgroundTexture=coreData.getHealthbarBackgroundTexture(); + //replace them by the ones from the unit if existent if(unit->getType()->getHealthbarVisible()!=hbvOff && unit->getType()->getHealthbarVisible()!=hbvUndefined) { @@ -5659,10 +5665,12 @@ void Renderer::renderOnTopBars(){ healthbarVisible=unit->getType()->getHealthbarVisible(); } - if(unit->isAlive() && !(healthbarVisible==hbvUndefined || (healthbarVisible&hbvOff)) - && ((healthbarVisible&hbvAlways) - || ((healthbarVisible&hbvDamaged) && unit->getHp()!=unit->getType()->getMaxHp()) - || ((healthbarVisible&hbvSelected) && game->getGui()->isSelected(unit)))) { + bool settingsWantToRenderThem=!(healthbarVisible==hbvUndefined || (healthbarVisible&hbvOff)) + && ((healthbarVisible&hbvAlways) + || ((healthbarVisible&hbvDamaged) && unit->getHp()!=unit->getType()->getMaxHp()) + || ((healthbarVisible&hbvSelected) && game->getGui()->isSelected(unit))); + + if(unit->isAlive() && (settingsWantToRenderThem || forceHealthbars)) { Vec3f currVec= unit->getCurrVectorFlat(); if(healthbarheight==-100.0f) { currVec.y+=unit->getType()->getHeight(); @@ -5675,9 +5683,9 @@ void Renderer::renderOnTopBars(){ } if(unit->getType()->getMaxEp() > 0) { - renderHealthBar(currVec,unit->getType()->getSize(),unit->getHpRatio(),healthbarthickness,unit->getEpRatio()); + renderHealthBar(currVec,unit->getType()->getSize(),unit->getHpRatio(),healthbarthickness,healthbarTexture,healthbarBackgroundTexture,unit->getEpRatio()); } else { - renderHealthBar(currVec,unit->getType()->getSize(),unit->getHpRatio(),healthbarthickness); + renderHealthBar(currVec,unit->getType()->getSize(),unit->getHpRatio(),healthbarthickness,healthbarTexture,healthbarBackgroundTexture); } } } @@ -8290,13 +8298,15 @@ void Renderer::enableProjectiveTexturing() { } // ==================== private aux drawing ==================== -void Renderer::renderHealthBar(Vec3f v, int size, float hp, float height, float ep) { +void Renderer::renderHealthBar(Vec3f v, int size, float hp, float height, const Texture2D *texture, const Texture2D *backgroundTexture , float ep) { if(GlobalStaticFlags::getIsNonGraphicalModeEnabled() == true) { return; } Vec3f rightVector; Vec3f upVector; + Vec3f rightVectorTexture; + Vec3f upVectorTexture; v.y+=1; float modelview[16]; float width=(float)size/6+0.25f; @@ -8311,19 +8321,40 @@ void Renderer::renderHealthBar(Vec3f v, int size, float hp, float height, float glGetFloatv(GL_MODELVIEW_MATRIX , modelview); rightVector= Vec3f(modelview[0], modelview[4], modelview[8]); upVector= Vec3f(modelview[1], modelview[5], modelview[9]); + rightVectorTexture=rightVector*2; + upVectorTexture=upVector*4; hp=hp*2-1; ep=ep*2-1; //from green to yellow to red - if(hp >= 0.0f) { + if(hp >= 0.5f) { green=brightness; - red=brightness-hp*brightness; + red=brightness-(hp-0.5f)*brightness; } else { red=brightness; - green=brightness+hp*brightness; + green=brightness+(hp-0.5f)*brightness; } + //backgroundTexture + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, static_cast(backgroundTexture)->getHandle()); + glColor4f(1.f,1.f,1.f,1.f); + //glColor4f(red+0.1f,green+0.1f,0.1f,0.5f); + glBegin(GL_QUADS); + glTexCoord2i(0,1); + glVertex3fv((v - (rightVectorTexture*width - upVectorTexture*height)).ptr()); + glTexCoord2i(0,0); + glVertex3fv((v - (rightVectorTexture*width + upVectorTexture*height)).ptr()); + glTexCoord2i(1,0); + glVertex3fv((v + (rightVectorTexture*width - upVectorTexture*height)).ptr()); + glTexCoord2i(1,1); + glVertex3fv((v + (rightVectorTexture*width + upVectorTexture*height)).ptr()); + glEnd(); + glDisable(GL_TEXTURE_2D); + + + //healthbar glColor4f(red,green,0.0f,0.4f); glBegin(GL_QUADS); if(ep < -2.0f) { @@ -8357,6 +8388,22 @@ void Renderer::renderHealthBar(Vec3f v, int size, float hp, float height, float glVertex3fv((v + (rightVector*width + upVector*height)).ptr()); glEnd(); + //BorderTexture + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, static_cast(texture)->getHandle()); + glColor4f(1.f,1.f,1.f,1.f); + //glColor4f(red+0.1f,green+0.1f,0.1f,0.5f); + glBegin(GL_QUADS); + glTexCoord2i(0,1); + glVertex3fv((v - (rightVectorTexture*width - upVectorTexture*height)).ptr()); + glTexCoord2i(0,0); + glVertex3fv((v - (rightVectorTexture*width + upVectorTexture*height)).ptr()); + glTexCoord2i(1,0); + glVertex3fv((v + (rightVectorTexture*width - upVectorTexture*height)).ptr()); + glTexCoord2i(1,1); + glVertex3fv((v + (rightVectorTexture*width + upVectorTexture*height)).ptr()); + glEnd(); + glDisable(GL_TEXTURE_2D); glPopMatrix(); } diff --git a/source/glest_game/graphics/renderer.h b/source/glest_game/graphics/renderer.h index 84059abc..451ffc28 100644 --- a/source/glest_game/graphics/renderer.h +++ b/source/glest_game/graphics/renderer.h @@ -549,7 +549,7 @@ public: void renderUnitsToBuild(const int renderFps); void renderSelectionEffects(); - void renderOnTopBars(); + void renderOnTopBars(bool forceHealthbars=false); void renderWaterEffects(); void renderHud(); void renderMinimap(); @@ -681,7 +681,7 @@ private: //private aux drawing void renderSelectionCircle(Vec3f v, int size, float radius, float thickness=0.2f); - void renderHealthBar(Vec3f v, int size, float hp, float height, float ep=-1.0f); + void renderHealthBar(Vec3f v, int size, float hp, float height, const Texture2D *texture, const Texture2D *backgroundTexture , float ep=-1.0f); void renderTeamColorEffect(Vec3f &v, int heigth, int size, Vec3f color, const Texture2D *texture); void renderArrow(const Vec3f &pos1, const Vec3f &pos2, const Vec3f &color, float width); void renderTile(const Vec2i &pos);