|
From: julien r. <jul...@us...> - 2004-12-10 19:55:46
|
Update of /cvsroot/epfl/tgengine-0.1 In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25614 Modified Files: camera.cc glrenderer.cc glrenderer.h scenemanager.cc scenemanager.h util.cc util.h Log Message: railgun & bugfixes Index: camera.cc =================================================================== RCS file: /cvsroot/epfl/tgengine-0.1/camera.cc,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** camera.cc 17 Nov 2004 23:12:37 -0000 1.11 --- camera.cc 10 Dec 2004 19:55:36 -0000 1.12 *************** *** 150,153 **** --- 150,154 ---- qconj.GetMatrix(matrix); glMultMatrixf (matrix); + // glRotatef(-90,0,1,0); //glRotatef (-a, axis.x, axis.y, axis.z); glTranslatef(-vViewOffset.x, -vViewOffset.y, -vViewOffset.z); Index: scenemanager.cc =================================================================== RCS file: /cvsroot/epfl/tgengine-0.1/scenemanager.cc,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** scenemanager.cc 30 Nov 2004 18:21:56 -0000 1.21 --- scenemanager.cc 10 Dec 2004 19:55:36 -0000 1.22 *************** *** 17,20 **** --- 17,22 ---- pFirstPointLight = NULL; pCurrentPointLight = NULL; + pFirstBeam = NULL; + pCurrentBeam = NULL; pDecalManager = new DecalManager (); *************** *** 50,53 **** --- 52,68 ---- } + void SceneManager::_ProcessTimedObject (BeamEmitter* b, float t) + { + if (b->fTime == -1) //l'objet ne tient pas compte du temps + return; + + b->fTime -= t; + if (b->fTime <= 0) //l'objet est arrive en fin de vie + { + RemoveBeamEmitter(b); + delete b; + } + } + void SceneManager::Render () { *************** *** 66,69 **** --- 81,85 ---- Mesh* m = pFirstObject; + Mesh* mnext; if (m != NULL) { *************** *** 85,90 **** #endif } _ProcessTimedObject(m, frameInterval); ! } while((m=m->GetNext()) != NULL); } --- 101,108 ---- #endif } + //on prend un pointeur sur next maintenant au cas ou l'objet serait supprimé par _ProcessTimedObject + mnext = m->GetNext(); _ProcessTimedObject(m, frameInterval); ! } while((m=mnext) != NULL); } *************** *** 144,148 **** --- 162,168 ---- Engine::pRenderer->End2D(); #endif + ParticleEmitter* p = pFirstEmitter; + ParticleEmitter* pnext; if (p != NULL) { *************** *** 151,161 **** p->PreRender(frameInterval); p->iLeaf = pLevel->FindLeaf(p->GetPosition()); ! if (pLevel->IsVisible(p->iLeaf)) { Engine::pRenderer->RenderParticles(p); } _ProcessTimedObject(p, frameInterval); ! } while((p=p->GetNext()) != NULL); } #ifdef DEBUG Engine::pRenderer->Render (); --- 171,204 ---- p->PreRender(frameInterval); p->iLeaf = pLevel->FindLeaf(p->GetPosition()); ! if (p->GetRender() && pLevel->IsVisible(p->iLeaf)) { Engine::pRenderer->RenderParticles(p); } + //on prend un pointeur sur next maintenant au cas ou l'objet serait supprimé par _ProcessTimedObject + pnext = p->GetNext(); _ProcessTimedObject(p, frameInterval); ! } while((p=pnext) != NULL); } + + BeamEmitter* b = pFirstBeam; + BeamEmitter* bnext; + if (b != NULL) + { + do + { + b->PreRender(frameInterval); + b->iLeaf = pLevel->FindLeaf(b->GetPosition()); + if (pLevel->IsVisible(b->iLeaf)) + { + Engine::pRenderer->RenderBeams(b); + } + //on prend un pointeur sur next maintenant au cas ou l'objet serait supprimé par _ProcessTimedObject + bnext = b->GetNext(); + _ProcessTimedObject(b, frameInterval); + } while((b=bnext) != NULL); + } + + + #ifdef DEBUG Engine::pRenderer->Render (); *************** *** 255,258 **** --- 298,313 ---- } + void SceneManager::AddBeamEmitter(BeamEmitter* b) + { + _TG_ADD_DLINKEDNODE(b, pCurrentBeam, pFirstBeam); + } + + void SceneManager::RemoveBeamEmitter(BeamEmitter* b) + { + _TG_REMOVE_DLINKEDNODE(b, pCurrentBeam, pFirstBeam); + } + + + void SceneManager::SetCamera (Camera* pcam) { *************** *** 274,277 **** --- 329,340 ---- } + void SceneManager::AddTimedBeamEmitter(BeamEmitter* b, float time) + { + b->fTime = time; + AddBeamEmitter(b); + } + + + } //END tg Index: util.h =================================================================== RCS file: /cvsroot/epfl/tgengine-0.1/util.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** util.h 17 Nov 2004 23:12:39 -0000 1.4 --- util.h 10 Dec 2004 19:55:36 -0000 1.5 *************** *** 16,19 **** --- 16,22 ---- { public: + static void ProjectPointOnPlane (Vector3& dst, Vector3 p, Vector3 normal); + static void PerpendicularVector (Vector3& dst, Vector3 src); + static float Random (); static float InvSqrt(float x); Index: glrenderer.cc =================================================================== RCS file: /cvsroot/epfl/tgengine-0.1/glrenderer.cc,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** glrenderer.cc 30 Nov 2004 18:21:55 -0000 1.25 --- glrenderer.cc 10 Dec 2004 19:55:36 -0000 1.26 *************** *** 565,568 **** --- 565,633 ---- } + #define BW 2 + void GLRenderer::RenderBeams (BeamEmitter* b) + { + Beam* pBeams = b->GetBeamsTab(); + int num = b->GetNumParticles(); + + Vector3 axis[3]; + + //glLineWidth(5.0f); + glEnable(GL_BLEND); + glBlendFunc( GL_SRC_ALPHA, GL_ONE ); + + (*_glActiveTextureARB)(GL_TEXTURE0); + glEnable (GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, b->GetTexture()->iId); + + glDisable(GL_CULL_FACE); + float mat[16]; + + + for(int i=0; i<num; i++) + { + axis[0] = (pBeams[i].vEnd - pBeams[i].vBegin).Normalize(); + Util::PerpendicularVector(axis[1], axis[0]); + axis[2] = axis[0]%axis[1]; + + mat[0] = axis[2].x; + mat[1] = axis[2].y; + mat[2] = axis[2].z; + mat[3] = 0; + mat[4] = axis[1].x; + mat[5] = axis[1].y; + mat[6] = axis[1].z; + mat[7] = 0; + mat[8] = axis[0].x; + mat[9] = axis[0].y; + mat[10] = axis[0].z; + mat[11] = 0; + mat[12] = 0; + mat[13] = 0; + mat[14] = 0; + mat[15] = 1; + + float dist = (pBeams[i].vEnd-pBeams[i].vBegin).Magnitude(); + glPushMatrix(); + glTranslatef(pBeams[i].vBegin.x, pBeams[i].vBegin.y, pBeams[i].vBegin.z); + glMultMatrixf(mat); + glBegin(GL_QUADS); + glTexCoord2f(0,0); glVertex3f(-BW,0,0); + glTexCoord2f(0,1); glVertex3f(-BW,0,dist); + glTexCoord2f(1,1); glVertex3f(BW,0,dist); + glTexCoord2f(1,0); glVertex3f(BW,0,0); + + glTexCoord2f(0,0); glVertex3f(0,-BW,0); + glTexCoord2f(0,1); glVertex3f(0,-BW,dist); + glTexCoord2f(1,1); glVertex3f(0,BW,dist); + glTexCoord2f(1,0); glVertex3f(0,BW,0); + glEnd(); + glPopMatrix(); + } + + glEnable(GL_CULL_FACE); + glDisable(GL_BLEND); + } + void GLRenderer::RenderParticles (ParticleEmitter* p) Index: glrenderer.h =================================================================== RCS file: /cvsroot/epfl/tgengine-0.1/glrenderer.h,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** glrenderer.h 17 Nov 2004 23:12:37 -0000 1.6 --- glrenderer.h 10 Dec 2004 19:55:36 -0000 1.7 *************** *** 12,15 **** --- 12,16 ---- #include "tgglext.h" #include "decal.h" + #include "beamemitter.h" namespace tg *************** *** 59,62 **** --- 60,64 ---- virtual void RenderMeshShadow (Mesh*); virtual void RenderDecal (Decal*); + virtual void RenderBeams (BeamEmitter*); virtual void EndShadow (); virtual void RenderParticles (ParticleEmitter*); Index: util.cc =================================================================== RCS file: /cvsroot/epfl/tgengine-0.1/util.cc,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** util.cc 17 Nov 2004 23:12:39 -0000 1.4 --- util.cc 10 Dec 2004 19:55:36 -0000 1.5 *************** *** 5,8 **** --- 5,38 ---- { + void Util::ProjectPointOnPlane (Vector3& dst, Vector3 p, Vector3 normal) + { + float d, invDenom; + invDenom = 1.0 / (normal*normal); + d = (normal*p) * invDenom; + dst = p-d*(normal*invDenom); + } + + void Util::PerpendicularVector (Vector3& dst, Vector3 src) + { + int i, pos = 0; + float val, min = 1.0; + Vector3 tmp; + // Find the smallest magnitude axially aligned vector + for (i = 0; i < 3; i++){ + val = fabs(src[i]); + if (val < min){ + min = val; + pos = i; + } + } + tmp[pos] = 1.0; + // Project the point onto the plane defined by src + ProjectPointOnPlane(dst, tmp, src); + // Normalize the result + dst = dst.Normalize(); + } + + + float Util::Random () { Index: scenemanager.h =================================================================== RCS file: /cvsroot/epfl/tgengine-0.1/scenemanager.h,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** scenemanager.h 30 Nov 2004 18:21:56 -0000 1.10 --- scenemanager.h 10 Dec 2004 19:55:36 -0000 1.11 *************** *** 13,16 **** --- 13,17 ---- #include "pointlight.h" #include "decalmanager.h" + #include "beamemitter.h" namespace tg *************** *** 59,62 **** --- 60,67 ---- void AddTimedParticleEmitter (ParticleEmitter* p,float time); + void AddBeamEmitter (BeamEmitter* b); + void RemoveBeamEmitter(BeamEmitter* b); + void AddTimedBeamEmitter (BeamEmitter* b, float time); + void SetLevel(Q3Bsp* p) { pLevel = p; if(pPhysicEngine) pPhysicEngine->SetLevel(p); pDecalManager->SetLevel(p);} *************** *** 68,71 **** --- 73,77 ---- void _ProcessTimedObject (Mesh* s, float t); void _ProcessTimedObject (ParticleEmitter* s, float t); + void _ProcessTimedObject (BeamEmitter* b, float t); void _RenderLightedMesh (Mesh* m); void _RenderLight (PointLight*); *************** *** 84,87 **** --- 90,97 ---- PointLight* pFirstPointLight; PointLight* pCurrentPointLight; + + BeamEmitter* pFirstBeam; + BeamEmitter* pCurrentBeam; + PhysicEngine* pPhysicEngine; |