summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorneoraider <devnull@localhost>2006-11-22 23:33:04 +0100
committerneoraider <devnull@localhost>2006-11-22 23:33:04 +0100
commit671a686311e6246c6708b38e6785f3de15497309 (patch)
tree6b8c09eb6d45554ff24d6ce255852715826ad418
parente05e8eb046b0037abf5dfa6b62b1321ec4a6e0aa (diff)
downloadlibzoom-671a686311e6246c6708b38e6785f3de15497309.tar
libzoom-671a686311e6246c6708b38e6785f3de15497309.zip
Render-Funktion optimiert; Fehler in der Beleuchtungsfunktion behoben
-rw-r--r--init.c2
-rw-r--r--render.c45
2 files changed, 34 insertions, 13 deletions
diff --git a/init.c b/init.c
index defc60e..b799e77 100644
--- a/init.c
+++ b/init.c
@@ -15,7 +15,7 @@ GLuint lightmap;
extern TEXLIST *texlist;
int InitGame() {
- LIGHT light = {LIGHT_POINT, {30.0, 30.0, 30.0}, {0.0, 0.0, 0.0}};
+ LIGHT light = {LIGHT_POINT, {15.0, 15.0, 15.0}, {0.0, 0.0, 0.0}};
COLOR ambient = {0.1, 0.1, 0.1};
diff --git a/render.c b/render.c
index e260166..7500281 100644
--- a/render.c
+++ b/render.c
@@ -18,6 +18,10 @@ extern COLOR ambient;
extern GLuint lightmap;
+static int SortByTex(const void *p1, const void *p2) {
+ return ((POLYGON*)p1)->texture - ((POLYGON*)p2)->texture;
+}
+
void Render() {
GLfloat std_emission[] = {0.0, 0.0, 0.0, 1.0};
MATRIX rotate = {
@@ -32,6 +36,7 @@ void Render() {
VECTOR v, v1, v2;
VERTEX p;
COLOR c;
+ GLint last_tex;
glLoadIdentity();
@@ -43,6 +48,7 @@ void Render() {
glTranslatef(-player.pos.x, -player.pos.y, -player.pos.z);
room = DrawRoom(&level, player.room);
+ qsort(room->polygons, room->nPolygons, sizeof(POLYGON), SortByTex);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LESS);
@@ -57,10 +63,17 @@ void Render() {
glDisable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D, room->polygons[0].texture);
+ last_tex = room->polygons[0].texture;
+ glBegin(GL_TRIANGLES);
+
for(i = 0; i < room->nPolygons; i++) {
- glBindTexture(GL_TEXTURE_2D, room->polygons[i].texture);
-
- glBegin(GL_TRIANGLES);
+ if(last_tex != room->polygons[i].texture) {
+ glEnd();
+ glBindTexture(GL_TEXTURE_2D, room->polygons[i].texture);
+ last_tex = room->polygons[i].texture;
+ glBegin(GL_TRIANGLES);
+ }
glMultiTexCoord2fv(0, (GLfloat*)&room->polygons[i].texcoords[0]);
glVertex3fv((GLfloat*)&room->polygons[i].vertices[0]);
@@ -69,9 +82,11 @@ void Render() {
glMultiTexCoord2fv(0, (GLfloat*)&room->polygons[i].texcoords[2]);
glVertex3fv((GLfloat*)&room->polygons[i].vertices[2]);
- glEnd();
+
}
+ glEnd();
+
glDepthFunc(GL_EQUAL);
glDepthMask(GL_FALSE);
@@ -84,15 +99,23 @@ void Render() {
glEnable(GL_TEXTURE_2D);
for(i = 0; i < nLights; i++) {
+ glBindTexture(GL_TEXTURE_2D, room->polygons[0].texture);
+ last_tex = room->polygons[0].texture;
+
+ glBegin(GL_TRIANGLES);
+
for(j = 0; j < room->nPolygons; j++) {
- glBindTexture(GL_TEXTURE_2D, room->polygons[j].texture);
-
- glBegin(GL_TRIANGLES);
+ if(last_tex != room->polygons[j].texture) {
+ glEnd();
+ glBindTexture(GL_TEXTURE_2D, room->polygons[j].texture);
+ last_tex = room->polygons[j].texture;
+ glBegin(GL_TRIANGLES);
+ }
d = VectorDot(room->polygons[j].normal, VectorSub(room->polygons[j].vertices[0], lights[i].pos));
if(d < 0) {
- c = VectorMul(lights[i].diffuse, 1.0/((nLights+1)*d*d));
+ c = VectorMul(lights[i].diffuse, 1.0/(d*d));
glColor3fv((GLfloat*)&c);
p = VectorAdd(lights[i].pos, VectorMul(room->polygons[j].normal, d));
@@ -108,15 +131,13 @@ void Render() {
glVertex3fv((GLfloat*)&room->polygons[j].vertices[k]);
}
}
-
- glEnd();
}
+
+ glEnd();
}
free(room);
- //ApplyLightScale();
-
/*glPushMatrix();
glDisable(GL_TEXTURE_2D);
glColor3f(1.0, 1.0, 1.0);