summaryrefslogtreecommitdiffstats
path: root/render.c
blob: 508be8a2700cc8db4849b57f6547f1ede16029f4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <GL/gl.h>
#include <math.h>
#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 std_emission[] = {0.0, 0.0, 0.0, 1.0};
	MATRIX rotate = {
		player.rotycos, 0.0, -player.rotysin, 0.0,
		0.0, 1.0, 0.0, 0.0,
		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();
	
	glRotatef(player.rotx, 1.0, 0.0, 0.0);
	glMultMatrixf(rotate.f);
	
	
	glTranslatef(-player.pos.x, -player.pos.y, -player.pos.z);
	
	//glLightfv(GL_LIGHT0, GL_POSITION, light_position);
	glPushMatrix();
	glDisable(GL_TEXTURE_2D);
	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);
	glEnable(GL_TEXTURE_2D);
	glPopMatrix();
	
	glColor3fv((GLfloat*)&color_ambient);
	
	DrawRoom(&level, player.room);
	
	glFlush();
}