Healthbars

Textures (border and background)
Faction.xml can specify more healthbars details
This commit is contained in:
titison 2014-11-05 02:05:47 +01:00
parent d1597334bf
commit 791e1edec6
6 changed files with 127 additions and 68 deletions

View File

@ -5259,7 +5259,7 @@ void Game::render3d(){
//renderOnTopBars (aka Healthbars)
if(photoModeEnabled == false) {
renderer.renderOnTopBars(forcedHealthbars);
renderer.renderHealthBars(forcedHealthbars);
}
//particles

View File

@ -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<const Texture2DGl*>(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<const Texture2DGl*>(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<const Texture2DGl*>(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<const Texture2DGl*>(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();
}

View File

@ -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);

View File

@ -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<string> 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

View File

@ -95,9 +95,15 @@ private:
std::map<AIBehaviorStaticValueCategory, int > 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;

View File

@ -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<string> v=split(healthbarVisibleString,"|");
for (int i = 0; i < (int)v.size(); ++i) {
string current=trim(v[i]);