Update of /cvsroot/epfl/tgengine-0.1
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv907
Added Files:
decal.h decalmanager.cc decalmanager.h
Log Message:
decals
--- NEW FILE: decalmanager.h ---
#ifndef _TGDECALMANAGER_H
#define _TGDECALMANAGER_H
#include "vector3.h"
#include "material.h"
#include "dlinkednode.h"
#include "decal.h"
#include "q3bsp.h"
namespace tg
{
class DecalManager
{
public:
DecalManager ();
~DecalManager () {}
void AddDecal (Vector3 vPos, Vector3 vNorm, float sX, float sY, Texture* pTex, float t);
void AddDecal (Decal* d);
void Render (float eTime);
void SetLevel(Q3Bsp* l) { pLevel = l; }
protected:
void _ProcessTimedDecal (Decal* d, float t);
void _RemoveDecal (Decal* d);
Q3Bsp* pLevel;
Decal* pFirstDecal;
Decal* pCurrentDecal;
};
}
#endif
--- NEW FILE: decalmanager.cc ---
#include "decalmanager.h"
#include "engine.h"
namespace tg
{
DecalManager::DecalManager ()
{
pCurrentDecal = NULL;
pFirstDecal = NULL;
}
void DecalManager::AddDecal (Vector3 vPos, Vector3 vNorm, float sX, float sY, Texture* pTex, float t)
{
Decal* d = new Decal (vPos, vNorm, sX, sY, pTex, t);
AddDecal(d);
}
void DecalManager::AddDecal (Decal* d)
{
if (pFirstDecal) //le premier noeud existe
{
pCurrentDecal->SetNext(d);
d->SetPrev(pCurrentDecal);
d->SetNext(NULL);
pCurrentDecal = d;
}
else
{
d->SetPrev(NULL);
d->SetNext(NULL);
pFirstDecal = d;
pCurrentDecal = d;
}
}
void DecalManager::Render (float eTime)
{
Decal* d = pFirstDecal;
if (d != NULL)
{
glDepthMask(GL_FALSE);
do
{
if (pLevel->IsVisible(pLevel->FindLeaf(d->vPosition)))
{
Engine::pRenderer->RenderDecal(d);
}
//_ProcessTimedDecal(d, eTime);
} while((d=d->GetNext()) != NULL);
glDepthMask(GL_TRUE);
}
}
void DecalManager::_ProcessTimedDecal(Decal* d, float t)
{
if (d->fTime == -1) //l'objet ne tient pas compte du temps
return;
d->fTime -= t;
if (d->fTime <= 0) //l'objet est arrive en fin de vie
{
_RemoveDecal(d);
delete d;
}
}
void DecalManager::_RemoveDecal(Decal* d)
{
if (d->GetNext() == NULL) //l'objet est le dernier de la liste
{
if (d->GetPrev() != NULL) //mais il a un predecesseur
{
pCurrentDecal = d->GetPrev();
pCurrentDecal->SetNext(NULL);
}
//sinon, il est seul dans la liste
else
{
pFirstDecal = NULL;
pCurrentDecal = NULL;
}
}
else //il n'est pas le dernier
{
if (d->GetPrev() != NULL) //il a un predecesseur
{
d->GetPrev()->SetNext(d->GetNext());
d->GetNext()->SetPrev(d->GetPrev());
}
else //il est le premier de la liste
{
pFirstDecal = d->GetNext();
pFirstDecal->SetPrev(NULL);
}
}
}
}
--- NEW FILE: decal.h ---
#ifndef _TGDECAL_H
#define _TGDECAL_H
#include "texture.h"
#include "vector3.h"
namespace tg
{
struct Decal
{
inline Decal (Vector3 v, Vector3 n, float x, float y, Texture* m, float t)
{
_TG_INIT_DLINKEDNODE(NULL,NULL)
vPosition = v;
vNormal = n;
fSizeX = x;
fSizeY = y;
fTime = t;
pTexture = m;
}
virtual ~Decal () {}
Vector3 vPosition;
Vector3 vNormal;
float fSizeX;
float fSizeY;
float fTime;
Texture* pTexture;
_TG_DLINKEDNODE(Decal)
};
}
#endif
|