diff options
-rw-r--r-- | init.c | 2 | ||||
-rw-r--r-- | render.c | 45 |
2 files changed, 34 insertions, 13 deletions
@@ -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}; @@ -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); |