diff --git a/src/chunk.c b/src/chunk.c index c1340b2..dbc6c88 100644 --- a/src/chunk.c +++ b/src/chunk.c @@ -116,7 +116,7 @@ void chunk_render(struct chunk_render_call* c) { // glPolygonMode(GL_FRONT, GL_LINE); - glx_displaylist_draw(&c->chunk->display_list, GLX_DISPLAYLIST_NORMAL, 1); + glx_displaylist_draw(&c->chunk->display_list, GLX_DISPLAYLIST_NORMAL); // glPolygonMode(GL_FRONT, GL_FILL); @@ -766,7 +766,7 @@ void chunk_update_all() { chunk_geometry_changed[closest_index] = chunk_geometry_changed[--chunk_geometry_changed_lenght]; if(!c->created) { - glx_displaylist_create(&c->display_list); + glx_displaylist_create(&c->display_list, true, false); c->created = 1; } diff --git a/src/glx.c b/src/glx.c index d77561c..9751ea4 100644 --- a/src/glx.c +++ b/src/glx.c @@ -77,14 +77,28 @@ int glx_shader(const char* vertex, const char* fragment) { #endif } -void glx_displaylist_create(struct glx_displaylist* x) { +void glx_displaylist_create(struct glx_displaylist* x, bool has_color, bool has_normal) { + x->has_color = has_color; + x->has_normal = has_normal; + #ifndef OPENGL_ES - if(!glx_version || settings.force_displaylist) + if(!glx_version || settings.force_displaylist) { x->legacy = glGenLists(1); - else - glGenBuffers(3, x->modern); + } else { + glGenBuffers(1, x->modern + 0); + + if(has_color) + glGenBuffers(1, x->modern + 1); + if(has_normal) + glGenBuffers(1, x->modern + 2); + } #else - glGenBuffers(3, x->modern); + glGenBuffers(1, x->modern + 0); + + if(has_color) + glGenBuffers(1, x->modern + 1); + if(has_normal) + glGenBuffers(1, x->modern + 2); #endif x->buffer_size = 0; } @@ -94,10 +108,20 @@ void glx_displaylist_destroy(struct glx_displaylist* x) { if(!glx_version || settings.force_displaylist) { glDeleteLists(x->legacy, 1); } else { - glDeleteBuffers(3, x->modern); + glDeleteBuffers(1, x->modern + 0); + + if(x->has_color) + glDeleteBuffers(1, x->modern + 1); + if(x->has_normal) + glDeleteBuffers(1, x->modern + 2); } #else - glDeleteBuffers(3, x->modern); + glDeleteBuffers(1, x->modern + 0); + + if(x->has_color) + glDeleteBuffers(1, x->modern + 1); + if(x->has_normal) + glDeleteBuffers(1, x->modern + 2); #endif } @@ -105,33 +129,36 @@ void glx_displaylist_update(struct glx_displaylist* x, size_t size, int type, vo int grow_buffer = size > x->buffer_size; x->buffer_size = max(x->buffer_size, size); x->size = size; - x->has_normal = normal != NULL; #ifndef OPENGL_ES if(!glx_version || settings.force_displaylist) { - glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); + if(x->has_color) + glEnableClientState(GL_COLOR_ARRAY); if(x->has_normal) glEnableClientState(GL_NORMAL_ARRAY); glNewList(x->legacy, GL_COMPILE); if(size > 0) { - glColorPointer(4, GL_UNSIGNED_BYTE, 0, color); + if(x->has_color) + glColorPointer(4, GL_UNSIGNED_BYTE, 0, color); switch(type) { case GLX_DISPLAYLIST_NORMAL: glVertexPointer(3, GL_SHORT, 0, vertex); break; case GLX_DISPLAYLIST_POINTS: case GLX_DISPLAYLIST_ENHANCED: glVertexPointer(3, GL_FLOAT, 0, vertex); break; } + if(x->has_normal) glNormalPointer(GL_BYTE, 0, normal); glDrawArrays((type == GLX_DISPLAYLIST_POINTS) ? GL_POINTS : GL_QUADS, 0, x->size); } glEndList(); + glDisableClientState(GL_VERTEX_ARRAY); + if(x->has_color) + glDisableClientState(GL_COLOR_ARRAY); if(x->has_normal) glDisableClientState(GL_NORMAL_ARRAY); - glDisableClientState(GL_COLOR_ARRAY); - glDisableClientState(GL_VERTEX_ARRAY); } else { #endif glBindBuffer(GL_ARRAY_BUFFER, x->modern[0]); @@ -142,11 +169,14 @@ void glx_displaylist_update(struct glx_displaylist* x, size_t size, int type, vo } else { glBufferSubData(GL_ARRAY_BUFFER, 0, x->size * 3 * sizeof(short), vertex); } - glBindBuffer(GL_ARRAY_BUFFER, x->modern[1]); - if(grow_buffer) { - glBufferData(GL_ARRAY_BUFFER, x->size * 4, color, GL_DYNAMIC_DRAW); - } else { - glBufferSubData(GL_ARRAY_BUFFER, 0, x->size * 4, color); + + if(x->has_color) { + glBindBuffer(GL_ARRAY_BUFFER, x->modern[1]); + if(grow_buffer) { + glBufferData(GL_ARRAY_BUFFER, x->size * 4, color, GL_DYNAMIC_DRAW); + } else { + glBufferSubData(GL_ARRAY_BUFFER, 0, x->size * 4, color); + } } break; case GLX_DISPLAYLIST_POINTS: @@ -156,11 +186,14 @@ void glx_displaylist_update(struct glx_displaylist* x, size_t size, int type, vo } else { glBufferSubData(GL_ARRAY_BUFFER, 0, x->size * 3 * sizeof(float), vertex); } - glBindBuffer(GL_ARRAY_BUFFER, x->modern[1]); - if(grow_buffer) { - glBufferData(GL_ARRAY_BUFFER, x->size * 4, color, GL_DYNAMIC_DRAW); - } else { - glBufferSubData(GL_ARRAY_BUFFER, 0, x->size * 4, color); + + if(x->has_color) { + glBindBuffer(GL_ARRAY_BUFFER, x->modern[1]); + if(grow_buffer) { + glBufferData(GL_ARRAY_BUFFER, x->size * 4, color, GL_DYNAMIC_DRAW); + } else { + glBufferSubData(GL_ARRAY_BUFFER, 0, x->size * 4, color); + } } break; } @@ -178,31 +211,35 @@ void glx_displaylist_update(struct glx_displaylist* x, size_t size, int type, vo #endif } -void glx_displaylist_draw(struct glx_displaylist* x, int type, int with_color) { +void glx_displaylist_draw(struct glx_displaylist* x, int type) { #ifndef OPENGL_ES if(!glx_version || settings.force_displaylist) { glCallList(x->legacy); } else { #endif - if(with_color) { + glEnableClientState(GL_VERTEX_ARRAY); + + if(x->has_color) { glEnableClientState(GL_COLOR_ARRAY); glBindBuffer(GL_ARRAY_BUFFER, x->modern[1]); glColorPointer(4, GL_UNSIGNED_BYTE, 0, NULL); } - glEnableClientState(GL_VERTEX_ARRAY); - if(x->has_normal) + + if(x->has_normal) { glEnableClientState(GL_NORMAL_ARRAY); + glBindBuffer(GL_ARRAY_BUFFER, x->modern[2]); + glNormalPointer(GL_BYTE, 0, NULL); + } + glBindBuffer(GL_ARRAY_BUFFER, x->modern[0]); switch(type) { case GLX_DISPLAYLIST_NORMAL: glVertexPointer(3, GL_SHORT, 0, NULL); break; case GLX_DISPLAYLIST_POINTS: case GLX_DISPLAYLIST_ENHANCED: glVertexPointer(3, GL_FLOAT, 0, NULL); break; } - if(x->has_normal) { - glBindBuffer(GL_ARRAY_BUFFER, x->modern[2]); - glNormalPointer(GL_BYTE, 0, NULL); - } + glBindBuffer(GL_ARRAY_BUFFER, 0); + if(type == GLX_DISPLAYLIST_POINTS) { glDrawArrays(GL_POINTS, 0, x->size); } else { @@ -212,9 +249,10 @@ void glx_displaylist_draw(struct glx_displaylist* x, int type, int with_color) { glDrawArrays(GL_QUADS, 0, x->size); #endif } + if(x->has_normal) glDisableClientState(GL_NORMAL_ARRAY); - if(with_color) + if(x->has_color) glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); #ifndef OPENGL_ES diff --git a/src/glx.h b/src/glx.h index 73b6a0c..4db7f7d 100644 --- a/src/glx.h +++ b/src/glx.h @@ -23,6 +23,7 @@ #define GLX_H #include +#include extern int glx_version; extern int glx_fog; @@ -32,7 +33,8 @@ struct glx_displaylist { uint32_t modern[3]; size_t size; size_t buffer_size; - int has_normal; + bool has_normal; + bool has_color; }; enum { @@ -48,9 +50,9 @@ int glx_shader(const char* vertex, const char* fragment); void glx_enable_sphericalfog(void); void glx_disable_sphericalfog(void); -void glx_displaylist_create(struct glx_displaylist* x); +void glx_displaylist_create(struct glx_displaylist* x, bool has_color, bool has_normal); void glx_displaylist_destroy(struct glx_displaylist* x); void glx_displaylist_update(struct glx_displaylist* x, size_t size, int type, void* color, void* vertex, void* normal); -void glx_displaylist_draw(struct glx_displaylist* x, int type, int with_color); +void glx_displaylist_draw(struct glx_displaylist* x, int type); #endif diff --git a/src/map.c b/src/map.c index 7ba6e5f..c6d5c0e 100644 --- a/src/map.c +++ b/src/map.c @@ -271,7 +271,7 @@ void map_collapsing_render() { matrix_upload(); if(!collapsing->has_displaylist) { collapsing->has_displaylist = 1; - glx_displaylist_create(&collapsing->displaylist); + glx_displaylist_create(&collapsing->displaylist, true, false); tesselator_clear(&tess); @@ -332,9 +332,9 @@ void map_collapsing_render() { } glColorMask(0, 0, 0, 0); - glx_displaylist_draw(&collapsing->displaylist, GLX_DISPLAYLIST_ENHANCED, 1); + glx_displaylist_draw(&collapsing->displaylist, GLX_DISPLAYLIST_ENHANCED); glColorMask(1, 1, 1, 1); - glx_displaylist_draw(&collapsing->displaylist, GLX_DISPLAYLIST_ENHANCED, 1); + glx_displaylist_draw(&collapsing->displaylist, GLX_DISPLAYLIST_ENHANCED); matrix_pop(); } diff --git a/src/model.c b/src/model.c index dc696d2..aef3683 100644 --- a/src/model.c +++ b/src/model.c @@ -261,8 +261,8 @@ void kv6_render(struct kv6_t* kv6, unsigned char team) { struct tesselator tess_team; tesselator_create(&tess_team, VERTEX_FLOAT, 1); - glx_displaylist_create(kv6->display_list + 0); - glx_displaylist_create(kv6->display_list + 1); + glx_displaylist_create(kv6->display_list + 0, !kv6->colorize, true); + glx_displaylist_create(kv6->display_list + 1, false, true); for(int k = 0; k < kv6->voxel_count; k++) { int x = kv6->voxels[k].x; @@ -284,7 +284,7 @@ void kv6_render(struct kv6_t* kv6, unsigned char team) { // negative y if(kv6->voxels[k].visfaces & 16) { - tesselator_set_color(tess, rgba(r, g, b, 255)); + tesselator_set_color(tess, rgba(r, g, b, 0)); tesselator_addf_simple(tess, (float[]) {p[0], p[1] + kv6->scale, p[2], p[0], p[1] + kv6->scale, p[2] + kv6->scale, p[0] + kv6->scale, p[1] + kv6->scale, @@ -293,7 +293,7 @@ void kv6_render(struct kv6_t* kv6, unsigned char team) { // positive y if(kv6->voxels[k].visfaces & 32) { - tesselator_set_color(tess, rgba(r * 0.6F, g * 0.6F, b * 0.6F, 255)); + tesselator_set_color(tess, rgba(r * 0.6F, g * 0.6F, b * 0.6F, 0)); tesselator_addf_simple(tess, (float[]) {p[0], p[1], p[2], p[0] + kv6->scale, p[1], p[2], p[0] + kv6->scale, p[1], p[2] + kv6->scale, p[0], p[1], @@ -302,7 +302,7 @@ void kv6_render(struct kv6_t* kv6, unsigned char team) { // negative z if(kv6->voxels[k].visfaces & 4) { - tesselator_set_color(tess, rgba(r * 0.95F, g * 0.95F, b * 0.95F, 255)); + tesselator_set_color(tess, rgba(r * 0.95F, g * 0.95F, b * 0.95F, 0)); tesselator_addf_simple(tess, (float[]) {p[0], p[1], p[2], p[0], p[1] + kv6->scale, p[2], p[0] + kv6->scale, p[1] + kv6->scale, p[2], p[0] + kv6->scale, @@ -311,7 +311,7 @@ void kv6_render(struct kv6_t* kv6, unsigned char team) { // positive z if(kv6->voxels[k].visfaces & 8) { - tesselator_set_color(tess, rgba(r * 0.9F, g * 0.9F, b * 0.9F, 255)); + tesselator_set_color(tess, rgba(r * 0.9F, g * 0.9F, b * 0.9F, 0)); tesselator_addf_simple(tess, (float[]) {p[0], p[1], p[2] + kv6->scale, p[0] + kv6->scale, p[1], p[2] + kv6->scale, p[0] + kv6->scale, p[1] + kv6->scale, @@ -320,7 +320,7 @@ void kv6_render(struct kv6_t* kv6, unsigned char team) { // negative x if(kv6->voxels[k].visfaces & 1) { - tesselator_set_color(tess, rgba(r * 0.85F, g * 0.85F, b * 0.85F, 255)); + tesselator_set_color(tess, rgba(r * 0.85F, g * 0.85F, b * 0.85F, 0)); tesselator_addf_simple(tess, (float[]) {p[0], p[1], p[2], p[0], p[1], p[2] + kv6->scale, p[0], p[1] + kv6->scale, p[2] + kv6->scale, p[0], p[1] + kv6->scale, @@ -329,7 +329,7 @@ void kv6_render(struct kv6_t* kv6, unsigned char team) { // positive x if(kv6->voxels[k].visfaces & 2) { - tesselator_set_color(tess, rgba(r * 0.8F, g * 0.8F, b * 0.8F, 255)); + tesselator_set_color(tess, rgba(r * 0.8F, g * 0.8F, b * 0.8F, 0)); tesselator_addf_simple(tess, (float[]) {p[0] + kv6->scale, p[1], p[2], p[0] + kv6->scale, p[1] + kv6->scale, p[2], p[0] + kv6->scale, p[1] + kv6->scale, @@ -356,7 +356,7 @@ void kv6_render(struct kv6_t* kv6, unsigned char team) { if(kv6->colorize) glColor3f(kv6->red, kv6->green, kv6->blue); - glx_displaylist_draw(kv6->display_list + 0, GLX_DISPLAYLIST_ENHANCED, !kv6->colorize); + glx_displaylist_draw(kv6->display_list + 0, GLX_DISPLAYLIST_ENHANCED); switch(team) { case TEAM_1: @@ -370,7 +370,7 @@ void kv6_render(struct kv6_t* kv6, unsigned char team) { default: glColor3ub(0, 0, 0); } - glx_displaylist_draw(kv6->display_list + 1, GLX_DISPLAYLIST_ENHANCED, 0); + glx_displaylist_draw(kv6->display_list + 1, GLX_DISPLAYLIST_ENHANCED); glDisable(GL_NORMALIZE); glDisable(GL_COLOR_MATERIAL); @@ -387,8 +387,8 @@ void kv6_render(struct kv6_t* kv6, unsigned char team) { int cnt[2] = {0, 0}; - glx_displaylist_create(kv6->display_list + 0); - glx_displaylist_create(kv6->display_list + 1); + glx_displaylist_create(kv6->display_list + 0, !kv6->colorize, true); + glx_displaylist_create(kv6->display_list + 1, false, true); for(int i = 0; i < kv6->voxel_count; i++) { int b = red(kv6->voxels[i].color); @@ -483,7 +483,7 @@ void kv6_render(struct kv6_t* kv6, unsigned char team) { if(kv6->colorize) glColor3f(kv6->red, kv6->green, kv6->blue); - glx_displaylist_draw(kv6->display_list + 0, GLX_DISPLAYLIST_POINTS, !kv6->colorize); + glx_displaylist_draw(kv6->display_list + 0, GLX_DISPLAYLIST_POINTS); switch(team) { case TEAM_1: @@ -495,7 +495,7 @@ void kv6_render(struct kv6_t* kv6, unsigned char team) { default: glColor3ub(0, 0, 0); } - glx_displaylist_draw(kv6->display_list + 1, GLX_DISPLAYLIST_POINTS, 0); + glx_displaylist_draw(kv6->display_list + 1, GLX_DISPLAYLIST_POINTS); if(settings.multisamples) glEnable(GL_MULTISAMPLE);