diff options
| author | Magnus Auvinen <magnus.auvinen@gmail.com> | 2007-07-24 22:53:43 +0000 |
|---|---|---|
| committer | Magnus Auvinen <magnus.auvinen@gmail.com> | 2007-07-24 22:53:43 +0000 |
| commit | 5bd2c434f63ff4a039e854d647f02ef660c544d1 (patch) | |
| tree | 3fe99b2e4a7cf5e80243bde4583e10c5650ed913 /src/engine/client/gfx.cpp | |
| parent | 4b098f7711e7cb96eef6797787e3f2f2b4cbb867 (diff) | |
| download | zcatch-5bd2c434f63ff4a039e854d647f02ef660c544d1.tar.gz zcatch-5bd2c434f63ff4a039e854d647f02ef660c544d1.zip | |
epic commit. removed tga support, removed BGR support. fixed one config for editor, server and client, optimized tilemap rendering (this needs some cleanup), added tools to fix alpha outline quirk and glitches in the tilemap reindering
Diffstat (limited to 'src/engine/client/gfx.cpp')
| -rw-r--r-- | src/engine/client/gfx.cpp | 358 |
1 files changed, 158 insertions, 200 deletions
diff --git a/src/engine/client/gfx.cpp b/src/engine/client/gfx.cpp index 1e5aa19e..657f7874 100644 --- a/src/engine/client/gfx.cpp +++ b/src/engine/client/gfx.cpp @@ -1,4 +1,5 @@ #include <baselib/opengl.h> +#include <baselib/math.h> #include <baselib/vmath.h> #include <baselib/stream/file.h> @@ -22,19 +23,19 @@ struct custom_vertex vec4 color; }; -const int vertexBufferSize = 2048; +const int vertex_buffer_size = 2048*32; //static custom_vertex vertices[4]; -static custom_vertex* g_pVertices = 0; -static int g_iVertexStart = 0; -static int g_iVertexEnd = 0; -static vec4 g_QuadColor[4]; -static vec2 g_QuadTexture[4]; +static custom_vertex *vertices = 0; +static int num_vertices = 0; +static vec4 color[4]; +static vec2 texture[4]; static opengl::vertex_buffer vertex_buffer; //static int screen_width = 800; //static int screen_height = 600; static float rotation = 0; static int quads_drawing = 0; + static float screen_x0 = 0; static float screen_y0 = 0; static float screen_x1 = 0; @@ -61,19 +62,19 @@ static const unsigned char null_texture_data[] = { static void draw_quad(bool _bflush = false) { - if (!_bflush && ((g_iVertexEnd + 4) < vertexBufferSize)) + if (!_bflush && ((num_vertices + 4) < vertex_buffer_size)) { // Just add - g_iVertexEnd += 4; + num_vertices += 4; } - else if (g_iVertexEnd) + else if (num_vertices) { if (!_bflush) - g_iVertexEnd += 4; + num_vertices += 4; if(GLEW_ARB_vertex_buffer_object) { // set the data - vertex_buffer.data(g_pVertices, vertexBufferSize * sizeof(custom_vertex), GL_DYNAMIC_DRAW); + vertex_buffer.data(vertices, num_vertices * sizeof(custom_vertex), GL_DYNAMIC_DRAW); opengl::stream_vertex(&vertex_buffer, 3, GL_FLOAT, sizeof(custom_vertex), 0); opengl::stream_texcoord(&vertex_buffer, 0, 2, GL_FLOAT, sizeof(custom_vertex), @@ -81,28 +82,81 @@ static void draw_quad(bool _bflush = false) opengl::stream_color(&vertex_buffer, 4, GL_FLOAT, sizeof(custom_vertex), sizeof(vec3)+sizeof(vec2)); - opengl::draw_arrays(GL_QUADS, 0, g_iVertexEnd); + opengl::draw_arrays(GL_QUADS, 0, num_vertices); } else { glVertexPointer(3, GL_FLOAT, sizeof(custom_vertex), - (char*)g_pVertices); + (char*)vertices); glTexCoordPointer(2, GL_FLOAT, sizeof(custom_vertex), - (char*)g_pVertices + sizeof(vec3)); + (char*)vertices + sizeof(vec3)); glColorPointer(4, GL_FLOAT, sizeof(custom_vertex), - (char*)g_pVertices + sizeof(vec3) + sizeof(vec2)); + (char*)vertices + sizeof(vec3) + sizeof(vec2)); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_COLOR_ARRAY); - glDrawArrays(GL_QUADS, 0, g_iVertexEnd); + glDrawArrays(GL_QUADS, 0, num_vertices); } + // Reset pointer - g_iVertexEnd = 0; + num_vertices = 0; } } +struct batch +{ + opengl::vertex_buffer vb; + int num; +}; + +void gfx_quads_draw_batch(void *in_b) +{ + batch *b = (batch*)in_b; + + if(GLEW_ARB_vertex_buffer_object) + { + // set the data + opengl::stream_vertex(&b->vb, 3, GL_FLOAT, sizeof(custom_vertex), 0); + opengl::stream_texcoord(&b->vb, 0, 2, GL_FLOAT, + sizeof(custom_vertex), + sizeof(vec3)); + opengl::stream_color(&b->vb, 4, GL_FLOAT, + sizeof(custom_vertex), + sizeof(vec3)+sizeof(vec2)); + opengl::draw_arrays(GL_QUADS, 0, b->num); + } + /* + else + { + glVertexPointer(3, GL_FLOAT, + sizeof(custom_vertex), + (char*)vertices); + glTexCoordPointer(2, GL_FLOAT, + sizeof(custom_vertex), + (char*)vertices + sizeof(vec3)); + glColorPointer(4, GL_FLOAT, + sizeof(custom_vertex), + (char*)vertices + sizeof(vec3) + sizeof(vec2)); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + glDrawArrays(GL_QUADS, 0, b->num); + }*/ +} + + +void *gfx_quads_create_batch() +{ + batch *b = new batch; + b->num = num_vertices; + b->vb.data(vertices, num_vertices*sizeof(custom_vertex), GL_STATIC_DRAW); + num_vertices = 0; + gfx_quads_end(); + return b; +} + bool gfx_init() { @@ -114,11 +168,10 @@ bool gfx_init() // Init vertices - if (g_pVertices) - mem_free(g_pVertices); - g_pVertices = (custom_vertex*)mem_alloc(sizeof(custom_vertex) * vertexBufferSize, 1); - g_iVertexStart = 0; - g_iVertexEnd = 0; + if (vertices) + mem_free(vertices); + vertices = (custom_vertex*)mem_alloc(sizeof(custom_vertex) * vertex_buffer_size, 1); + num_vertices = 0; context.set_title("---"); @@ -137,13 +190,13 @@ bool gfx_init() opengl::matrix_modelview(&mat); // Set all z to -5.0f - for (int i = 0; i < vertexBufferSize; i++) - g_pVertices[i].pos.z = -5.0f; + for (int i = 0; i < vertex_buffer_size; i++) + vertices[i].pos.z = -5.0f; if(GLEW_ARB_vertex_buffer_object) { // set the streams - vertex_buffer.data(g_pVertices, sizeof(vertexBufferSize), GL_DYNAMIC_DRAW); + vertex_buffer.data(vertices, sizeof(vertex_buffer_size), GL_DYNAMIC_DRAW); opengl::stream_vertex(&vertex_buffer, 3, GL_FLOAT, sizeof(custom_vertex), 0); opengl::stream_texcoord(&vertex_buffer, 0, 2, GL_FLOAT, sizeof(custom_vertex), @@ -198,8 +251,6 @@ void gfx_blend_additive() glBlendFunc(GL_SRC_ALPHA, GL_ONE); } -int DEBUGTEST_MAPIMAGE = 0; - int gfx_load_texture_raw(int w, int h, int format, const void *data) { // grab texture @@ -210,27 +261,11 @@ int gfx_load_texture_raw(int w, int h, int format, const void *data) // set data and return // TODO: should be RGBA, not BGRA dbg_msg("gfx", "%d = %dx%d", tex, w, h); - if(DEBUGTEST_MAPIMAGE) + if(format == IMG_RGB) + textures[tex].tex.data2d(w, h, GL_RGB, GL_RGB, GL_UNSIGNED_BYTE, data); + else if(format == IMG_RGBA) { - if(format == IMG_RGB) - textures[tex].tex.data2d_nomip(w, h, GL_RGB, GL_RGB, GL_UNSIGNED_BYTE, data); - else if(format == IMG_RGBA) - textures[tex].tex.data2d_nomip(w, h, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, data); - else if(format == IMG_BGR) - textures[tex].tex.data2d_nomip(w, h, GL_RGB, GL_BGR, GL_UNSIGNED_BYTE, data); - else if(format == IMG_BGRA) - textures[tex].tex.data2d_nomip(w, h, GL_RGBA, GL_BGRA, GL_UNSIGNED_BYTE, data); - } - else - { - if(format == IMG_RGB) - textures[tex].tex.data2d(w, h, GL_RGB, GL_RGB, GL_UNSIGNED_BYTE, data); - else if(format == IMG_RGBA) - textures[tex].tex.data2d(w, h, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, data); - else if(format == IMG_BGR) - textures[tex].tex.data2d(w, h, GL_RGB, GL_BGR, GL_UNSIGNED_BYTE, data); - else if(format == IMG_BGRA) - textures[tex].tex.data2d(w, h, GL_RGBA, GL_BGRA, GL_UNSIGNED_BYTE, data); + textures[tex].tex.data2d(w, h, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, data); } return tex; @@ -270,93 +305,17 @@ int gfx_load_texture(const char *filename) int l = strlen(filename); if(l < 3) return 0; - - if( (filename[l-3] == 't' || filename[l-3] == 'T') && - (filename[l-2] == 'g' || filename[l-2] == 'G') && - (filename[l-1] == 'a' || filename[l-1] == 'A')) + image_info img; + if(gfx_load_png(&img, filename)) { - image_info img; - if(gfx_load_tga(&img, filename)) - { - int id = gfx_load_texture_raw(img.width, img.height, img.format, img.data); - mem_free(img.data); - return id; - } - return 0; - } - - if( (filename[l-3] == 'p' || filename[l-3] == 'P') && - (filename[l-2] == 'n' || filename[l-2] == 'N') && - (filename[l-1] == 'g' || filename[l-1] == 'G')) - { - image_info img; - if(gfx_load_png(&img, filename)) - { - int id = gfx_load_texture_raw(img.width, img.height, img.format, img.data); - mem_free(img.data); - return id; - } - - return 0; + int id = gfx_load_texture_raw(img.width, img.height, img.format, img.data); + mem_free(img.data); + return id; } return 0; } -int gfx_load_tga(image_info *img, const char *filename) -{ - // open file for reading - file_stream file; - if(!file.open_r(filename)) - { - dbg_msg("game/tga", "failed to open file. filename='%s'", filename); - return 0; - } - - // read header - unsigned char headers[18]; - file.read(headers, sizeof(headers)); - img->width = headers[12]+(headers[13]<<8); - img->height = headers[14]+(headers[15]<<8); - - bool flipx = (headers[17] >> 4) & 1; - bool flipy = !((headers[17] >> 5) & 1); - - (void)flipx; // TODO: make use of this flag - - if(headers[2] != 2) // needs to be uncompressed RGB - { - dbg_msg("game/tga", "tga not uncompressed rgb. filename='%s'", filename); - return 0; - } - - if(headers[16] != 32) // needs to be RGBA - { - dbg_msg("game/tga", "tga is 32bit. filename='%s'", filename); - return 0; - } - - // read data - int data_size = img->width*img->height*4; - img->data = mem_alloc(data_size, 1); - img->format = IMG_BGRA; - - if (flipy) - { - for (int i = 0; i < img->height; i++) - { - file.read((char *)img->data + (img->height-i-1)*img->width*4, img->width*4); - } - } - else - file.read(img->data, data_size); - file.close(); - - return 1; -} - - - int gfx_load_png(image_info *img, const char *filename) { // open file for reading @@ -391,8 +350,8 @@ int gfx_load_png(image_info *img, const char *filename) void gfx_shutdown() { - if (g_pVertices) - mem_free(g_pVertices); + if (vertices) + mem_free(vertices); context.destroy(); } @@ -458,6 +417,9 @@ void gfx_setoffset(float x, float y) opengl::matrix_modelview(&mat); } + + + void gfx_quads_begin() { dbg_assert(quads_drawing == 0, "called quads_begin twice"); @@ -485,46 +447,42 @@ void gfx_quads_setrotation(float angle) void gfx_quads_setcolorvertex(int i, float r, float g, float b, float a) { dbg_assert(quads_drawing == 1, "called gfx_quads_setcolorvertex without quads_begin"); - g_QuadColor[i].r = r; - g_QuadColor[i].g = g; - g_QuadColor[i].b = b; - g_QuadColor[i].a = a; + color[i].r = r; + color[i].g = g; + color[i].b = b; + color[i].a = a; } void gfx_quads_setcolor(float r, float g, float b, float a) { dbg_assert(quads_drawing == 1, "called gfx_quads_setcolor without quads_begin"); - g_QuadColor[0] = vec4(r,g,b,a); - g_QuadColor[1] = vec4(r,g,b,a); - g_QuadColor[2] = vec4(r,g,b,a); - g_QuadColor[3] = vec4(r,g,b,a); - /*gfx_quads_setcolorvertex(0,r,g,b,a); - gfx_quads_setcolorvertex(1,r,g,b,a); - gfx_quads_setcolorvertex(2,r,g,b,a); - gfx_quads_setcolorvertex(3,r,g,b,a);*/ + color[0] = vec4(r,g,b,a); + color[1] = vec4(r,g,b,a); + color[2] = vec4(r,g,b,a); + color[3] = vec4(r,g,b,a); } void gfx_quads_setsubset(float tl_u, float tl_v, float br_u, float br_v) { dbg_assert(quads_drawing == 1, "called gfx_quads_setsubset without quads_begin"); - g_QuadTexture[0].x = tl_u; - g_QuadTexture[0].y = tl_v; + texture[0].x = tl_u; + texture[0].y = tl_v; //g_pVertices[g_iVertexEnd].tex.u = tl_u; //g_pVertices[g_iVertexEnd].tex.v = tl_v; - g_QuadTexture[1].x = br_u; - g_QuadTexture[1].y = tl_v; + texture[1].x = br_u; + texture[1].y = tl_v; //g_pVertices[g_iVertexEnd + 2].tex.u = br_u; //g_pVertices[g_iVertexEnd + 2].tex.v = tl_v; - g_QuadTexture[2].x = br_u; - g_QuadTexture[2].y = br_v; + texture[2].x = br_u; + texture[2].y = br_v; //g_pVertices[g_iVertexEnd + 1].tex.u = tl_u; //g_pVertices[g_iVertexEnd + 1].tex.v = br_v; - g_QuadTexture[3].x = tl_u; - g_QuadTexture[3].y = br_v; + texture[3].x = tl_u; + texture[3].y = br_v; //g_pVertices[g_iVertexEnd + 3].tex.u = br_u; //g_pVertices[g_iVertexEnd + 3].tex.v = br_v; } @@ -550,33 +508,33 @@ void gfx_quads_drawTL(float x, float y, float width, float height) center.y = y + height/2; center.z = 0; - g_pVertices[g_iVertexEnd].pos.x = x; - g_pVertices[g_iVertexEnd].pos.y = y; - g_pVertices[g_iVertexEnd].tex.u = g_QuadTexture[0].x; - g_pVertices[g_iVertexEnd].tex.v = g_QuadTexture[0].y; - g_pVertices[g_iVertexEnd].color = g_QuadColor[0]; - rotate(center, g_pVertices[g_iVertexEnd].pos); - - g_pVertices[g_iVertexEnd + 1].pos.x = x+width; - g_pVertices[g_iVertexEnd + 1].pos.y = y; - g_pVertices[g_iVertexEnd + 1].tex.u = g_QuadTexture[1].x; - g_pVertices[g_iVertexEnd + 1].tex.v = g_QuadTexture[1].y; - g_pVertices[g_iVertexEnd + 1].color = g_QuadColor[1]; - rotate(center, g_pVertices[g_iVertexEnd + 1].pos); - - g_pVertices[g_iVertexEnd + 2].pos.x = x + width; - g_pVertices[g_iVertexEnd + 2].pos.y = y+height; - g_pVertices[g_iVertexEnd + 2].tex.u = g_QuadTexture[2].x; - g_pVertices[g_iVertexEnd + 2].tex.v = g_QuadTexture[2].y; - g_pVertices[g_iVertexEnd + 2].color = g_QuadColor[2]; - rotate(center, g_pVertices[g_iVertexEnd + 2].pos); - - g_pVertices[g_iVertexEnd + 3].pos.x = x; - g_pVertices[g_iVertexEnd + 3].pos.y = y+height; - g_pVertices[g_iVertexEnd + 3].tex.u = g_QuadTexture[3].x; - g_pVertices[g_iVertexEnd + 3].tex.v = g_QuadTexture[3].y; - g_pVertices[g_iVertexEnd + 3].color = g_QuadColor[3]; - rotate(center, g_pVertices[g_iVertexEnd + 3].pos); + vertices[num_vertices].pos.x = x; + vertices[num_vertices].pos.y = y; + vertices[num_vertices].tex.u = texture[0].x; + vertices[num_vertices].tex.v = texture[0].y; + vertices[num_vertices].color = color[0]; + rotate(center, vertices[num_vertices].pos); + + vertices[num_vertices + 1].pos.x = x+width; + vertices[num_vertices + 1].pos.y = y; + vertices[num_vertices + 1].tex.u = texture[1].x; + vertices[num_vertices + 1].tex.v = texture[1].y; + vertices[num_vertices + 1].color = color[1]; + rotate(center, vertices[num_vertices + 1].pos); + + vertices[num_vertices + 2].pos.x = x + width; + vertices[num_vertices + 2].pos.y = y+height; + vertices[num_vertices + 2].tex.u = texture[2].x; + vertices[num_vertices + 2].tex.v = texture[2].y; + vertices[num_vertices + 2].color = color[2]; + rotate(center, vertices[num_vertices + 2].pos); + + vertices[num_vertices + 3].pos.x = x; + vertices[num_vertices + 3].pos.y = y+height; + vertices[num_vertices + 3].tex.u = texture[3].x; + vertices[num_vertices + 3].tex.v = texture[3].y; + vertices[num_vertices + 3].color = color[3]; + rotate(center, vertices[num_vertices + 3].pos); draw_quad(); } @@ -589,29 +547,29 @@ void gfx_quads_draw_freeform( { dbg_assert(quads_drawing == 1, "called quads_draw_freeform without quads_begin"); - g_pVertices[g_iVertexEnd].pos.x = x0; - g_pVertices[g_iVertexEnd].pos.y = y0; - g_pVertices[g_iVertexEnd].tex.u = g_QuadTexture[0].x; - g_pVertices[g_iVertexEnd].tex.v = g_QuadTexture[0].y; - g_pVertices[g_iVertexEnd].color = g_QuadColor[0]; - - g_pVertices[g_iVertexEnd + 1].pos.x = x1; - g_pVertices[g_iVertexEnd + 1].pos.y = y1; - g_pVertices[g_iVertexEnd + 1].tex.u = g_QuadTexture[1].x; - g_pVertices[g_iVertexEnd + 1].tex.v = g_QuadTexture[1].y; - g_pVertices[g_iVertexEnd + 1].color = g_QuadColor[1]; - - g_pVertices[g_iVertexEnd + 2].pos.x = x3; - g_pVertices[g_iVertexEnd + 2].pos.y = y3; - g_pVertices[g_iVertexEnd + 2].tex.u = g_QuadTexture[2].x; - g_pVertices[g_iVertexEnd + 2].tex.v = g_QuadTexture[2].y; - g_pVertices[g_iVertexEnd + 2].color = g_QuadColor[2]; - - g_pVertices[g_iVertexEnd + 3].pos.x = x2; - g_pVertices[g_iVertexEnd + 3].pos.y = y2; - g_pVertices[g_iVertexEnd + 3].tex.u = g_QuadTexture[3].x; - g_pVertices[g_iVertexEnd + 3].tex.v = g_QuadTexture[3].y; - g_pVertices[g_iVertexEnd + 3].color = g_QuadColor[3]; + vertices[num_vertices].pos.x = x0; + vertices[num_vertices].pos.y = y0; + vertices[num_vertices].tex.u = texture[0].x; + vertices[num_vertices].tex.v = texture[0].y; + vertices[num_vertices].color = color[0]; + + vertices[num_vertices + 1].pos.x = x1; + vertices[num_vertices + 1].pos.y = y1; + vertices[num_vertices + 1].tex.u = texture[1].x; + vertices[num_vertices + 1].tex.v = texture[1].y; + vertices[num_vertices + 1].color = color[1]; + + vertices[num_vertices + 2].pos.x = x3; + vertices[num_vertices + 2].pos.y = y3; + vertices[num_vertices + 2].tex.u = texture[2].x; + vertices[num_vertices + 2].tex.v = texture[2].y; + vertices[num_vertices + 2].color = color[2]; + + vertices[num_vertices + 3].pos.x = x2; + vertices[num_vertices + 3].pos.y = y2; + vertices[num_vertices + 3].tex.u = texture[3].x; + vertices[num_vertices + 3].tex.v = texture[3].y; + vertices[num_vertices + 3].color = color[3]; draw_quad(); } |