From 79801b6b794a5fb50a3a013354323a48de37c050 Mon Sep 17 00:00:00 2001 From: neoraider Date: Fri, 20 Oct 2006 12:57:05 +0000 Subject: Physik-Engine angefangen. Lightmaps implementiert. --- render.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 63 insertions(+), 6 deletions(-) (limited to 'render.c') diff --git a/render.c b/render.c index 5816090..508be8a 100644 --- a/render.c +++ b/render.c @@ -3,15 +3,67 @@ #include #include #include +#include #include extern PLAYER player; extern LEVEL level; extern GLuint sphere; +extern LIGHT light; + +void RenderWall(WALL w, GLuint *textures) { + int i; + float d, s, t; + VECTOR v, v1, v2; + VERTEX p; + + glBindTexture(GL_TEXTURE_2D, textures[w.texture]); + + d = VectorDot(w.normal, VectorSub(w.vertices[0], light.pos)); + + if(d >= 0) { + glActiveTexture(GL_TEXTURE0); + glDisable(GL_TEXTURE_2D); + + glBegin(GL_TRIANGLES); + + for(i = 0; i < 3; i++) { + glMultiTexCoord2fv(GL_TEXTURE1, (GLfloat*)&w.texcoords[i]); + glVertex3fv((GLfloat*)&w.vertices[i]); + } + + glEnd(); + + glEnable(GL_TEXTURE_2D); + glActiveTexture(GL_TEXTURE1); + + return; + } + + p = VectorAdd(light.pos, VectorMul(w.normal, d)); + + v1 = VectorNormalize(VectorSub(w.vertices[0], w.vertices[1])); + v2 = VectorCross(v1, w.normal); + + glBegin(GL_TRIANGLES); + + glNormal3fv((GLfloat*)&w.normal); + + for(i = 0; i < 3; i++) { + v = VectorSub(w.vertices[i], p); + s = VectorDot(v, v1)*0.005 / d + 0.5; + t = VectorDot(v, v2)*0.005 / d + 0.5; + glMultiTexCoord2f(GL_TEXTURE0, s, t); + glMultiTexCoord2fv(GL_TEXTURE1, (GLfloat*)&w.texcoords[i]); + glVertex3fv((GLfloat*)&w.vertices[i]); + } + + glEnd(); +} void Render() { - GLfloat light_position[] = { 0.0, 0.0, 0.0, 1.0 }; - GLfloat light_emission[] = {1.0, 1.0, 1.0, 1.0}; + //GLfloat light_position[] = { 0.0, 0.0, 0.0, 1.0 }; + //GLfloat light_emission[] = {1.0, 1.0, 1.0, 1.0}; GLfloat std_emission[] = {0.0, 0.0, 0.0, 1.0}; MATRIX rotate = { player.rotycos, 0.0, -player.rotysin, 0.0, @@ -19,6 +71,8 @@ void Render() { player.rotysin, 0.0, player.rotycos, 0.0, 0.0, 0.0, 0.0, 1.0 }; + COLOR color_light = {1.0, 1.0, 1.0}; + COLOR color_ambient = {0.1, 0.1, 0.1}; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); @@ -29,17 +83,20 @@ void Render() { glTranslatef(-player.pos.x, -player.pos.y, -player.pos.z); - glLightfv(GL_LIGHT0, GL_POSITION, light_position); + //glLightfv(GL_LIGHT0, GL_POSITION, light_position); glPushMatrix(); glDisable(GL_TEXTURE_2D); - glMaterialfv(GL_FRONT, GL_EMISSION, light_emission); - glTranslatef(light_position[0], light_position[1], light_position[2]); + glColor3fv((GLfloat*)&color_light); + //glMaterialfv(GL_FRONT, GL_EMISSION, light_emission); + glTranslatef(light.pos.x, light.pos.y, light.pos.z); glScalef(0.1, 0.1, 0.1); glCallList(sphere); - glMaterialfv(GL_FRONT, GL_EMISSION, std_emission); + //glMaterialfv(GL_FRONT, GL_EMISSION, std_emission); glEnable(GL_TEXTURE_2D); glPopMatrix(); + glColor3fv((GLfloat*)&color_ambient); + DrawRoom(&level, player.room); glFlush(); -- cgit v1.2.3