bugfix/improvement for teamcolor particles ** units can morph to flying units ** tech faction with particles

This commit is contained in:
Titus Tscharntke 2010-02-27 00:34:03 +00:00
parent 3b02f9c9b7
commit 59faabfe14
9 changed files with 59 additions and 48 deletions

View File

@ -30,6 +30,8 @@ namespace Glest{ namespace Game{
// =====================================================
ParticleSystemType::ParticleSystemType(){
teamcolorNoEnergy=false;
teamcolorEnergy=false;
}
void ParticleSystemType::load(const XmlNode *particleSystemNode, const string &dir){
@ -118,6 +120,17 @@ void ParticleSystemType::load(const XmlNode *particleSystemNode, const string &d
const XmlNode *energyVarNode= particleSystemNode->getChild("energy-var");
energyVar= energyVarNode->getAttribute("value")->getIntValue();
//teamcolorNoEnergy
if(particleSystemNode->hasChild("teamcolorNoEnergy")){
const XmlNode *teamcolorNoEnergyNode= particleSystemNode->getChild("teamcolorNoEnergy");
teamcolorNoEnergy= teamcolorNoEnergyNode->getAttribute("value")->getBoolValue();
}
//teamcolorEnergy
if(particleSystemNode->hasChild("teamcolorEnergy")){
const XmlNode *teamcolorEnergyNode= particleSystemNode->getChild("teamcolorEnergy");
teamcolorEnergy= teamcolorEnergyNode->getAttribute("value")->getBoolValue();
}
//mode
if(particleSystemNode->hasChild("mode")){
const XmlNode *modeNode= particleSystemNode->getChild("mode");
@ -144,6 +157,8 @@ void ParticleSystemType::setValues(AttackParticleSystem *ats){
ats->setMaxParticleEnergy(energyMax);
ats->setVarParticleEnergy(energyVar);
ats->setModel(model);
ats->setTeamcolorNoEnergy(teamcolorNoEnergy);
ats->setTeamcolorEnergy(teamcolorEnergy);
ats->setBlendMode(ParticleSystem::strToBlendMode(mode));
}

View File

@ -58,6 +58,8 @@ protected:
int energyMax;
int energyVar;
string mode;
bool teamcolorNoEnergy;
bool teamcolorEnergy;
public:
ParticleSystemType();

View File

@ -125,12 +125,15 @@ void UnitParticleSystemType::load(const XmlNode *particleSystemNode, const strin
fixed= fixedNode->getAttribute("value")->getBoolValue();
//teamcolorNoEnergy
const XmlNode *teamcolorNoEnergyNode= particleSystemNode->getChild("teamcolorNoEnergy");
teamcolorNoEnergy= teamcolorNoEnergyNode->getAttribute("value")->getBoolValue();
if(particleSystemNode->hasChild("teamcolorNoEnergy")){
const XmlNode *teamcolorNoEnergyNode= particleSystemNode->getChild("teamcolorNoEnergy");
teamcolorNoEnergy= teamcolorNoEnergyNode->getAttribute("value")->getBoolValue();
}
//teamcolorEnergy
const XmlNode *teamcolorEnergyNode= particleSystemNode->getChild("teamcolorEnergy");
teamcolorEnergy= teamcolorEnergyNode->getAttribute("value")->getBoolValue();
if(particleSystemNode->hasChild("teamcolorEnergy")){
const XmlNode *teamcolorEnergyNode= particleSystemNode->getChild("teamcolorEnergy");
teamcolorEnergy= teamcolorEnergyNode->getAttribute("value")->getBoolValue();
}
//mode
if(particleSystemNode->hasChild("mode")){

View File

@ -1,7 +1,7 @@
// ==============================================================
// This file is part of Glest (www.glest.org)
//
// Copyright (C) 2001-2008 Martiño Figueroa
// Copyright (C) 2001-2008 Marti<EFBFBD>o Figueroa
//
// You can redistribute this code and/or modify it under
// the terms of the GNU General Public License as published
@ -84,7 +84,6 @@ bool Faction::getCpuControl() const{
return control==ctCpuEasy ||control==ctCpu || control==ctCpuUltra|| control==ctCpuMega;
}
// ==================== upgrade manager ====================
void Faction::startUpgrade(const UpgradeType *ut){

View File

@ -1,7 +1,7 @@
// ==============================================================
// This file is part of Glest (www.glest.org)
//
// Copyright (C) 2001-2008 Martiño Figueroa
// Copyright (C) 2001-2008 Marti<EFBFBD>o Figueroa
//
// You can redistribute this code and/or modify it under
// the terms of the GNU General Public License as published

View File

@ -331,7 +331,7 @@ void Unit::setCurrSkill(const SkillType *currSkill){
ups= new UnitParticleSystem(200);
(*it)->setValues(ups);
ups->setPos(getCurrVector());
ups->setTeamNumber(getTeam());
ups->setFactionColor(getFaction()->getTexture()->getPixmap()->getPixel3f(0,0));
unitParticleSystems.push_back(ups);
Renderer::getInstance().manageParticleSystem(ups, rsGame);
}
@ -876,12 +876,16 @@ void Unit::incKills(){
bool Unit::morph(const MorphCommandType *mct){
const UnitType *morphUnitType= mct->getMorphUnit();
if(map->isFreeCellsOrHasUnit(pos, morphUnitType->getSize(), currField, this)){
Field morphUnitField=fLand;
if(morphUnitType->getField(fAir)) morphUnitField=fAir;
if(morphUnitType->getField(fLand)) morphUnitField=fLand;
if(map->isFreeCellsOrHasUnit(pos, morphUnitType->getSize(), morphUnitField, this)){
map->clearUnitCells(this, pos);
faction->deApplyStaticCosts(type);
hp+= morphUnitType->getMaxHp() - type->getMaxHp();
type= morphUnitType;
level= NULL;
currField=morphUnitField;
computeTotalUpgrade();
map->putUnitCells(this, pos);
faction->applyDiscount(morphUnitType, mct->getDiscount());

View File

@ -703,6 +703,7 @@ void UnitUpdater::startAttackParticleSystem(Unit *unit){
psProj->setPath(startPos, endPos);
psProj->setObserver(new ParticleDamager(unit, this, gameCamera));
psProj->setVisible(visible);
psProj->setFactionColor(unit->getFaction()->getTexture()->getPixmap()->getPixel3f(0,0));
renderer.manageParticleSystem(psProj, rsGame);
}
else{
@ -714,6 +715,7 @@ void UnitUpdater::startAttackParticleSystem(Unit *unit){
psSplash= pstSplash->create();
psSplash->setPos(endPos);
psSplash->setVisible(visible);
psSplash->setFactionColor(unit->getFaction()->getTexture()->getPixmap()->getPixel3f(0,0));
renderer.manageParticleSystem(psSplash, rsGame);
if(pstProj!=NULL){
psProj->link(psSplash);

View File

@ -114,6 +114,9 @@ protected:
int varParticleEnergy;
float particleSize;
float speed;
Vec3f factionColor;
bool teamcolorNoEnergy;
bool teamcolorEnergy;
ParticleObserver *particleObserver;
@ -152,6 +155,9 @@ public:
void setObserver(ParticleObserver *particleObserver);
void setVisible(bool visible);
void setBlendMode(BlendMode blendMode) {this->blendMode= blendMode;}
void setTeamcolorNoEnergy(bool teamcolorNoEnergy) {this->teamcolorNoEnergy= teamcolorNoEnergy;}
void setTeamcolorEnergy(bool teamcolorEnergy) {this->teamcolorEnergy= teamcolorEnergy;}
virtual void setFactionColor(Vec3f factionColor);
static BlendMode strToBlendMode(const string &str);
//misc
@ -209,9 +215,6 @@ public:
};
bool relative;
bool fixed;
int teamNumber;
bool teamcolorNoEnergy;
bool teamcolorEnergy;
Model *model;
Primitive primitive;
Vec3f offset;
@ -227,7 +230,6 @@ public:
virtual void initParticle(Particle *p, int particleIndex);
virtual void updateParticle(Particle *p);
virtual void update();
virtual void setTeamNumber(int teamNumber);
virtual void render(ParticleRenderer *pr, ModelRenderer *mr);
//set params
@ -241,8 +243,6 @@ public:
void setRotation(float rotation) {this->rotation= rotation;}
void setRelative(bool relative) {this->relative= relative;}
void setFixed(bool fixed) {this->fixed= fixed;}
void setTeamcolorNoEnergy(bool teamcolorNoEnergy) {this->teamcolorNoEnergy= teamcolorNoEnergy;}
void setTeamcolorEnergy(bool teamcolorEnergy) {this->teamcolorEnergy= teamcolorEnergy;}
void setPrimitive(Primitive primitive) {this->primitive= primitive;}
static Primitive strToPrimitive(const string &str);

View File

@ -50,6 +50,8 @@ ParticleSystem::ParticleSystem(int particleCount){
colorNoEnergy= Vec4f(0.0f);
emissionRate= 15;
speed= 1.0f;
teamcolorNoEnergy=false;
teamcolorEnergy=false;
}
ParticleSystem::~ParticleSystem(){
@ -226,6 +228,21 @@ void ParticleSystem::killParticle(Particle *p){
aliveParticleCount--;
}
void ParticleSystem::setFactionColor(Vec3f factionColor){
this->factionColor=factionColor;
Vec3f tmpCol;
if(teamcolorEnergy)
{
this->color=Vec4f(factionColor.x,factionColor.y,factionColor.z,this->color.w);
}
if(teamcolorNoEnergy)
{
this->colorNoEnergy=Vec4f(factionColor.x,factionColor.y,factionColor.z,this->colorNoEnergy.w);
}
}
// ===========================================================================
// FireParticleSystem
// ===========================================================================
@ -308,8 +325,6 @@ UnitParticleSystem::UnitParticleSystem(int particleCount): ParticleSystem(partic
gravity= 0.0f;
fixed=false;
teamcolorNoEnergy=false;
teamcolorEnergy=false;
rotation=0.0f;
cRotation= Vec3f(1.0f,1.0f,1.0f);
@ -436,36 +451,7 @@ void UnitParticleSystem::setWind(float windAngle, float windSpeed){
this->windSpeed.z= cosf(degToRad(windAngle))*windSpeed;
}
void UnitParticleSystem::setTeamNumber(int teamNumber){
this->teamNumber=teamNumber;
Vec3f tmpCol;
if(teamNumber==0)
{
tmpCol=Vec3f(1,0,0);
}
else if(teamNumber==1)
{
tmpCol=Vec3f(0,0,1);
}
else if(teamNumber==2)
{
tmpCol=Vec3f(0,1,0);
}
else if(teamNumber==3)
{
tmpCol=Vec3f(1,1,0);
}
if(teamcolorEnergy)
{
this->color=Vec4f(tmpCol.x,tmpCol.y,tmpCol.z,this->color.w);
}
if(teamcolorNoEnergy)
{
this->colorNoEnergy=Vec4f(tmpCol.x,tmpCol.y,tmpCol.z,this->colorNoEnergy.w);
}
}
// ===========================================================================