Skip to content

Commit

Permalink
Fix team color when in display list mode
Browse files Browse the repository at this point in the history
  • Loading branch information
xtreme8000 committed Apr 20, 2020
1 parent a996f93 commit 8283662
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 53 deletions.
4 changes: 2 additions & 2 deletions src/chunk.c
Expand Up @@ -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);

Expand Down Expand Up @@ -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;
}

Expand Down
100 changes: 69 additions & 31 deletions src/glx.c
Expand Up @@ -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;
}
Expand All @@ -94,44 +108,57 @@ 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
}

void glx_displaylist_update(struct glx_displaylist* x, size_t size, int type, void* color, void* vertex, void* normal) {
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]);
Expand All @@ -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:
Expand All @@ -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;
}
Expand All @@ -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 {
Expand All @@ -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
Expand Down
8 changes: 5 additions & 3 deletions src/glx.h
Expand Up @@ -23,6 +23,7 @@
#define GLX_H

#include <stdint.h>
#include <stdbool.h>

extern int glx_version;
extern int glx_fog;
Expand All @@ -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 {
Expand All @@ -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
6 changes: 3 additions & 3 deletions src/map.c
Expand Up @@ -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);

Expand Down Expand Up @@ -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();
}
Expand Down
28 changes: 14 additions & 14 deletions src/model.c
Expand Up @@ -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;
Expand All @@ -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,
Expand All @@ -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],
Expand All @@ -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,
Expand All @@ -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,
Expand All @@ -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,
Expand All @@ -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,
Expand All @@ -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:
Expand All @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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:
Expand All @@ -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);
Expand Down

0 comments on commit 8283662

Please sign in to comment.