summaryrefslogtreecommitdiff
path: root/testbc1.c
diff options
context:
space:
mode:
authorquou <quou@disroot.org>2024-07-21 20:22:36 +1000
committerquou <quou@disroot.org>2024-07-21 20:22:36 +1000
commite50e53b3ea82926ab01858e5728e489bd38d6878 (patch)
tree312c584a23ad3458314c1229c6be49cbaa75be00 /testbc1.c
parent2d0d48846e66bbb0b5c6966d842cea01f4ca468d (diff)
texture compression
Diffstat (limited to 'testbc1.c')
-rw-r--r--testbc1.c74
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);
+ }
+ }
+}