diff --git a/source/glest_game/game/game.cpp b/source/glest_game/game/game.cpp index f3bfca0a..7daac218 100644 --- a/source/glest_game/game/game.cpp +++ b/source/glest_game/game/game.cpp @@ -5259,7 +5259,7 @@ void Game::render3d(){ //renderOnTopBars (aka Healthbars) if(photoModeEnabled == false) { - renderer.renderOnTopBars(forcedHealthbars); + renderer.renderHealthBars(forcedHealthbars); } //particles diff --git a/source/glest_game/graphics/renderer.cpp b/source/glest_game/graphics/renderer.cpp index f5928c70..60be150e 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(bool forceHealthbars){ +void Renderer::renderHealthBars(bool forceHealthbars){ if(GlobalStaticFlags::getIsNonGraphicalModeEnabled() == true) { return; } @@ -5644,15 +5644,31 @@ void Renderer::renderOnTopBars(bool forceHealthbars){ int healthbarVisible; const Texture2D *healthbarTexture; const Texture2D *healthbarBackgroundTexture; + bool healthbarLineBorder; //get settings of the faction healthbarheight=unit->getFaction()->getType()->getHealthbarHeight(); healthbarthickness=unit->getFaction()->getType()->getHealthbarThickness(); healthbarVisible=unit->getFaction()->getType()->getHealthbarVisible(); + healthbarLineBorder=unit->getFaction()->getType()->isHealthbarLineBorder(); CoreData &coreData= CoreData::getInstance(); - healthbarTexture=coreData.getHealthbarTexture(); - healthbarBackgroundTexture=coreData.getHealthbarBackgroundTexture(); - + //First try faction texture then use core Texture + if(unit->getFaction()->getType()->isHealthbarBorderTextureEnabled()) { + healthbarTexture=unit->getFaction()->getType()->getHealthbarTexture(); + if(healthbarTexture==NULL) { + healthbarTexture=coreData.getHealthbarTexture(); + } + } else { + healthbarTexture=NULL; + } + if(unit->getFaction()->getType()->isHealthbarBackgroundTextureEnabled()) { + healthbarBackgroundTexture=unit->getFaction()->getType()->getHealthbarBackgroundTexture(); + if(healthbarBackgroundTexture==NULL) { + healthbarBackgroundTexture=coreData.getHealthbarBackgroundTexture(); + } + } else { + healthbarBackgroundTexture=NULL; + } //replace them by the ones from the unit if existent if(unit->getType()->getHealthbarVisible()!=hbvOff && unit->getType()->getHealthbarVisible()!=hbvUndefined) { @@ -5680,12 +5696,9 @@ void Renderer::renderOnTopBars(bool forceHealthbars){ if(unit->getType()->getMaxEp() > 0) { healthbarthickness=healthbarthickness*2; - } - - if(unit->getType()->getMaxEp() > 0) { - renderHealthBar(currVec,unit->getType()->getSize(),unit->getHpRatio(),healthbarthickness,healthbarTexture,healthbarBackgroundTexture,unit->getEpRatio()); + renderHealthBar(currVec,unit->getType()->getSize(),unit->getHpRatio(),healthbarthickness,healthbarLineBorder,healthbarTexture,healthbarBackgroundTexture,unit->getEpRatio()); } else { - renderHealthBar(currVec,unit->getType()->getSize(),unit->getHpRatio(),healthbarthickness,healthbarTexture,healthbarBackgroundTexture); + renderHealthBar(currVec,unit->getType()->getSize(),unit->getHpRatio(),healthbarthickness,healthbarLineBorder,healthbarTexture,healthbarBackgroundTexture); } } } @@ -8298,7 +8311,7 @@ void Renderer::enableProjectiveTexturing() { } // ==================== private aux drawing ==================== -void Renderer::renderHealthBar(Vec3f v, int size, float hp, float height, const Texture2D *texture, const Texture2D *backgroundTexture , float ep) { +void Renderer::renderHealthBar(Vec3f v, int size, float hp, float height, bool lineBorder, const Texture2D *texture, const Texture2D *backgroundTexture , float ep) { if(GlobalStaticFlags::getIsNonGraphicalModeEnabled() == true) { return; } @@ -8336,23 +8349,24 @@ void Renderer::renderHealthBar(Vec3f v, int size, float hp, float height, const 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); - + if(backgroundTexture!=NULL) { + //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); @@ -8379,31 +8393,35 @@ void Renderer::renderHealthBar(Vec3f v, int size, float hp, float height, const } glEnd(); - //border - glColor4f(red+0.1f,green+0.1f,0.1f,0.5f); - glBegin(GL_LINE_LOOP); - glVertex3fv((v - (rightVector*width - upVector*height)).ptr()); - glVertex3fv((v - (rightVector*width + upVector*height)).ptr()); - glVertex3fv((v + (rightVector*width - upVector*height)).ptr()); - glVertex3fv((v + (rightVector*width + upVector*height)).ptr()); - glEnd(); + if(lineBorder) { + //border + glColor4f(red+0.1f,green+0.1f,0.1f,0.5f); + glBegin(GL_LINE_LOOP); + glVertex3fv((v - (rightVector*width - upVector*height)).ptr()); + glVertex3fv((v - (rightVector*width + upVector*height)).ptr()); + glVertex3fv((v + (rightVector*width - upVector*height)).ptr()); + 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); + if(texture!=NULL) { + //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 451ffc28..724e7375 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(bool forceHealthbars=false); + void renderHealthBars(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, const Texture2D *texture, const Texture2D *backgroundTexture , float ep=-1.0f); + void renderHealthBar(Vec3f v, int size, float hp, float height, bool lineBorder, const Texture2D *texture=NULL, const Texture2D *backgroundTexture=NULL , 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); diff --git a/source/glest_game/types/faction_type.cpp b/source/glest_game/types/faction_type.cpp index 1c335ef7..2ce40783 100644 --- a/source/glest_game/types/faction_type.cpp +++ b/source/glest_game/types/faction_type.cpp @@ -16,6 +16,7 @@ #include "xml_parser.h" #include "tech_tree.h" #include "resource.h" +#include "renderer.h" #include "platform_util.h" #include "game_util.h" #include "conversion.h" @@ -37,6 +38,11 @@ FactionType::FactionType() { healthbarheight= -100.0f; healthbarthickness= 0.05f; healthbarVisible=hbvUndefined; + healthbarBorderTextureEnabled=false; + healthbarBackgroundTextureEnabled=false; + healthbarLineBorder=true; + healthbarTexture=NULL; + healthbarBackgroundTexture=NULL; } //load a faction, given a directory @@ -277,15 +283,15 @@ void FactionType::load(const string &factionName, const TechTree *techTree, Chec //healthbar if(factionNode->hasChild("healthbar")) { - const XmlNode *HealthbarNode= factionNode->getChild("healthbar"); - if(HealthbarNode->hasChild("height")) { - healthbarheight= HealthbarNode->getChild("height")->getAttribute("value")->getFloatValue(); + const XmlNode *healthbarNode= factionNode->getChild("healthbar"); + if(healthbarNode->hasChild("height")) { + healthbarheight= healthbarNode->getChild("height")->getAttribute("value")->getFloatValue(); } - if(HealthbarNode->hasChild("thickness")) { - healthbarthickness= HealthbarNode->getChild("thickness")->getAttribute("value")->getFloatValue(0.f, 1.f); + if(healthbarNode->hasChild("thickness")) { + healthbarthickness= healthbarNode->getChild("thickness")->getAttribute("value")->getFloatValue(0.f, 1.f); } - if(HealthbarNode->hasChild("visible")) { - string healthbarVisibleString=HealthbarNode->getChild("visible")->getAttribute("value")->getValue(); + if(healthbarNode->hasChild("visible")) { + string healthbarVisibleString=healthbarNode->getChild("visible")->getAttribute("value")->getValue(); vector v=split(healthbarVisibleString,"|"); for (int i = 0; i < (int)v.size(); ++i) { string current=trim(v[i]); @@ -302,6 +308,30 @@ void FactionType::load(const string &factionName, const TechTree *techTree, Chec } } } + if(healthbarNode->hasChild("borderTexture")) { + healthbarBorderTextureEnabled=healthbarNode->getChild("borderTexture")->getAttribute("enabled")->getBoolValue(); + if(healthbarBorderTextureEnabled && healthbarNode->getChild("borderTexture")->hasAttribute("path")) { + healthbarTexture= Renderer::getInstance().newTexture2D(rsGame); + if(healthbarTexture) { + healthbarTexture->load(healthbarNode->getChild("borderTexture")->getAttribute("path")->getRestrictedValue(currentPath)); + } + loadedFileList[healthbarNode->getChild("borderTexture")->getAttribute("path")->getRestrictedValue(currentPath)].push_back(make_pair(path,healthbarNode->getChild("borderTexture")->getAttribute("path")->getRestrictedValue())); + } + } + if(healthbarNode->hasChild("backgroundTexture")) { + healthbarBackgroundTextureEnabled=healthbarNode->getChild("backgroundTexture")->getAttribute("enabled")->getBoolValue(); + if(healthbarBackgroundTextureEnabled && healthbarNode->getChild("backgroundTexture")->hasAttribute("path")) { + healthbarBackgroundTexture= Renderer::getInstance().newTexture2D(rsGame); + if(healthbarBackgroundTexture) { + healthbarBackgroundTexture->load(healthbarNode->getChild("backgroundTexture")->getAttribute("path")->getRestrictedValue(currentPath)); + } + loadedFileList[healthbarNode->getChild("backgroundTexture")->getAttribute("path")->getRestrictedValue(currentPath)].push_back(make_pair(path,healthbarNode->getChild("backgroundTexture")->getAttribute("path")->getRestrictedValue())); + } + } + if(healthbarNode->hasChild("lineBorder")) { + healthbarLineBorder= healthbarNode->getChild("lineBorder")->getAttribute("enabled")->getBoolValue(); + } + } //read ai behavior diff --git a/source/glest_game/types/faction_type.h b/source/glest_game/types/faction_type.h index 909e9571..386df6bc 100644 --- a/source/glest_game/types/faction_type.h +++ b/source/glest_game/types/faction_type.h @@ -95,9 +95,15 @@ private: std::map mapAIBehaviorStaticOverrideValues; bool isLinked; + float healthbarheight; float healthbarthickness; int healthbarVisible; + bool healthbarBorderTextureEnabled; + bool healthbarBackgroundTextureEnabled; + bool healthbarLineBorder; + Texture2D *healthbarTexture; + Texture2D *healthbarBackgroundTexture; public: @@ -127,6 +133,11 @@ public: inline float getHealthbarHeight() const {return healthbarheight;} inline float getHealthbarThickness() const {return healthbarthickness;} inline int getHealthbarVisible() const {return healthbarVisible;} + inline bool isHealthbarBorderTextureEnabled() const {return healthbarBorderTextureEnabled;} + inline bool isHealthbarBackgroundTextureEnabled() const {return healthbarBackgroundTextureEnabled;} + inline bool isHealthbarLineBorder() const {return healthbarLineBorder;} + Texture2D *getHealthbarTexture() const {return healthbarTexture;} + Texture2D *getHealthbarBackgroundTexture() const {return healthbarBackgroundTexture;} const UnitType *getUnitType(const string &name) const; diff --git a/source/glest_game/types/unit_type.cpp b/source/glest_game/types/unit_type.cpp index 74c3cab6..fd673b1d 100644 --- a/source/glest_game/types/unit_type.cpp +++ b/source/glest_game/types/unit_type.cpp @@ -451,15 +451,15 @@ void UnitType::loaddd(int id,const string &dir, const TechTree *techTree, //healthbar if(parametersNode->hasChild("healthbar")) { - const XmlNode *HealthbarNode= parametersNode->getChild("healthbar"); - if(HealthbarNode->hasChild("height")) { - healthbarheight= HealthbarNode->getChild("height")->getAttribute("value")->getFloatValue(); + const XmlNode *healthbarNode= parametersNode->getChild("healthbar"); + if(healthbarNode->hasChild("height")) { + healthbarheight= healthbarNode->getChild("height")->getAttribute("value")->getFloatValue(); } - if(HealthbarNode->hasChild("thickness")) { - healthbarthickness= HealthbarNode->getChild("thickness")->getAttribute("value")->getFloatValue(0.f, 1.f); + if(healthbarNode->hasChild("thickness")) { + healthbarthickness= healthbarNode->getChild("thickness")->getAttribute("value")->getFloatValue(0.f, 1.f); } - if(HealthbarNode->hasChild("visible")) { - string healthbarVisibleString=HealthbarNode->getChild("visible")->getAttribute("value")->getValue(); + if(healthbarNode->hasChild("visible")) { + string healthbarVisibleString=healthbarNode->getChild("visible")->getAttribute("value")->getValue(); vector v=split(healthbarVisibleString,"|"); for (int i = 0; i < (int)v.size(); ++i) { string current=trim(v[i]);