|
From: julien r. <jul...@us...> - 2004-11-13 23:38:05
|
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 |