diff --git a/gfx.png b/gfx.png index 8473f77..fcdb274 100644 Binary files a/gfx.png and b/gfx.png differ diff --git a/src/gsa.c b/src/gsa.c index 8541cc9..15fdf5e 100644 --- a/src/gsa.c +++ b/src/gsa.c @@ -26,11 +26,12 @@ out_tex_coord = tex_coord;\ static char *frag_source = "#version 450\n\ layout(location = 0) in vec2 tex_coord;\ uniform sampler2D tex;\ +uniform vec4 palette[256];\ out vec4 color;\ void main(){\ -float r = texture(tex, tex_coord).r;\ +int r = int(texture(tex, tex_coord).r * 255);\ if(r > 0)\ -color = vec4(0.9, 0.2, 0.1, 1.0);\ +color = palette[r];\ }\ "; @@ -47,12 +48,14 @@ struct render_vert { static i32 next_render_vert; static struct render_vert render_verts[MAX_RENDER_VERTS * 4]; static sw_color32 palette[256]; +static f32 palette_gl[1024]; int gsa_main(int argc, char *argv[]) { (void)argc; (void)argv; u32 tex; struct sw_image8 *img; + i32 max_components; sw_log("Initialising GameSkunkAdvance v0.0"); @@ -60,8 +63,12 @@ int gsa_main(int argc, char *argv[]) { program = sw_shaderprogram_create(vert_source, frag_source); sw_shaderprogram_use(program); + glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS, &max_components); + sw_log("GL_MAX_VERTEX_UNIFORM_COMPONENTS: %i", max_components); + img = sw_image8_load_png("gfx.png"); memcpy(palette, img->palette, sizeof(img->palette)); + sw_debug("%08X", img->palette[1]); glGenTextures(1, &tex); glBindTexture(GL_TEXTURE_2D, tex); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); @@ -139,45 +146,16 @@ static void rect(f32 x, f32 y, f32 w, f32 h, i16 tile) { add_render_vert(x + w, y, tx + ts, ty); add_render_vert(x, y + h, tx, ty + ts); add_render_vert(x + w, y + h, tx + ts, ty + ts); +} - /* - render_verts[next_render_vert].x = x; - render_verts[next_render_vert].y = y; - render_verts[next_render_vert].tx = tx; - render_verts[next_render_vert].ty = ty; - ++next_render_vert; - - render_verts[next_render_vert].x = x + w; - render_verts[next_render_vert].y = y; - render_verts[next_render_vert].tx = tx + ts; - render_verts[next_render_vert].ty = ty; - ++next_render_vert; - - render_verts[next_render_vert].x = x; - render_verts[next_render_vert].y = y + h; - render_verts[next_render_vert].tx = tx; - render_verts[next_render_vert].ty = ty + ts; - ++next_render_vert; - - render_verts[next_render_vert].x = x + w; - render_verts[next_render_vert].y = y; - render_verts[next_render_vert].tx = tx + ts; - render_verts[next_render_vert].ty = ty; - ++next_render_vert; - - render_verts[next_render_vert].x = x; - render_verts[next_render_vert].y = y + h; - render_verts[next_render_vert].tx = tx; - render_verts[next_render_vert].ty = ty + ts; - ++next_render_vert; - - render_verts[next_render_vert].x = x + w; - render_verts[next_render_vert].y = y + h; - render_verts[next_render_vert].tx = tx + ts; - render_verts[next_render_vert].ty = ty + ts; - ++next_render_vert; - - */ +static void update_palette_gl() { + int i; + for(i = 0; i < 256; ++i) { + palette_gl[i * 4 + 0] = sw_color32_get_rf(palette[i]); + palette_gl[i * 4 + 1] = sw_color32_get_gf(palette[i]); + palette_gl[i * 4 + 2] = sw_color32_get_bf(palette[i]); + palette_gl[i * 4 + 3] = sw_color32_get_af(palette[i]); + } } void _gsa_tick() { @@ -198,7 +176,13 @@ void _gsa_tick() { sw_color32_get_bf(palette[0]), sw_color32_get_af(palette[0]) ); + glBindVertexArray(vao); + /* TODO: only do when palette changed */ + update_palette_gl(); + glUniform4fv( + glGetUniformLocation(program._program, "palette"), 256, palette_gl + ); glBufferData( GL_ARRAY_BUFFER, sizeof(struct render_vert) * (next_render_vert),