diff options
author | quou <quou@disroot.org> | 2024-07-21 20:22:36 +1000 |
---|---|---|
committer | quou <quou@disroot.org> | 2024-07-21 20:22:36 +1000 |
commit | e50e53b3ea82926ab01858e5728e489bd38d6878 (patch) | |
tree | 312c584a23ad3458314c1229c6be49cbaa75be00 /testbc1.c | |
parent | 2d0d48846e66bbb0b5c6966d842cea01f4ca468d (diff) |
texture compression
Diffstat (limited to 'testbc1.c')
-rw-r--r-- | testbc1.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/testbc1.c b/testbc1.c new file mode 100644 index 0000000..2b9aab4 --- /dev/null +++ b/testbc1.c @@ -0,0 +1,74 @@ +#include <stdio.h> +#include <stdlib.h> + +#include "render.h" + +typedef struct { + float r, g, b; +} vec3; + +void lerp(vec3* d, const vec3* a, const vec3* b, float t) { + d->r = a->r + t * (b->r - a->r); + d->g = a->g + t * (b->g - a->g); + d->b = a->b + t * (b->b - a->b); +} + +Colour get_pixel(unsigned* data, int x, int y, int w) { + vec3 start, end, col; + float t; + int i; + Colour r = { 0 }; + unsigned palette = data[(x / 4 + y / 4 * (w / 4)) * 2]; + unsigned indices = data[(x / 4 + y / 4 * (w / 4)) * 2 + 1]; + start.r = (float)((palette & (31 << 27)) >> 27) / 32.0f; + start.g = (float)((palette & (63 << 21)) >> 21) / 64.0f; + start.b = (float)((palette & (31 << 16)) >> 16) / 32.0f; + end.r = (float)((palette & (31 << 11)) >> 11) / 32.0f; + end.g = (float)((palette & (63 << 5)) >> 5) / 64.0f; + end.b = (float)((palette & (31 )) ) / 32.0f; + i = x % 4 + (y % 4) * 4; + i = (indices & (3 << i * 2)) >> i * 2; + t = (float)i / 3.0f; + lerp(&col, &start, &end, t); + r.r = (int)(col.r * 255.0f); + r.g = (int)(col.g * 255.0f); + r.b = (int)(col.b * 255.0f); + return r; +} + +int main(int argc, const char** argv) { + FILE* infile, * outfile; + unsigned* data; + int w, h, x, y, cw, ch; + unsigned palette, indices; + vec3 colour; + if (argc < 3) { + fprintf(stderr, "Usage: %s infile outfile.\n", argv[0]); + return 1; + } + infile = fopen(argv[1], "rb"); + if (!infile) { + fprintf(stderr, "Failed to open %s.\n", argv[1]); + return 2; + } + outfile = fopen(argv[2], "w"); + if (!infile) { + fprintf(stderr, "Failed to open %s.\n", argv[2]); + return 3; + } + fread(&w, 1, 4, infile); + fread(&h, 1, 4, infile); + cw = w / 4; + ch = h / 4; + data = malloc(cw * ch * 8); + fread(data, 1, cw * ch * 8, infile); + fprintf(outfile, "P3\n"); + fprintf(outfile, "%d %d\n", w, h); + fprintf(outfile, "255\n"); + for (y = 0; y < h; y++) { + for (x = 0; x < w; x++) { + Colour c = get_pixel(data, x, y, w); + fprintf(outfile, "%d %d %d\n", c.r, c.g, c.b); + } + } +} |