summaryrefslogtreecommitdiffstats
path: root/render.c
diff options
context:
space:
mode:
Diffstat (limited to 'render.c')
-rw-r--r--render.c69
1 files changed, 63 insertions, 6 deletions
diff --git a/render.c b/render.c
index 5816090..508be8a 100644
--- a/render.c
+++ b/render.c
@@ -3,15 +3,67 @@
#include <zoom/render.h>
#include <zoom/player.h>
#include <zoom/level.h>
+#include <zoom/texture.h>
#include <neofx/math.h>
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();