size-optimized marching cube tables COM went from 68420->53252
[metatoy] / tools / mctab.c
diff --git a/tools/mctab.c b/tools/mctab.c
new file mode 100644 (file)
index 0000000..3a6c053
--- /dev/null
@@ -0,0 +1,61 @@
+#include <stdio.h>
+#include "mcubes.h"
+
+int main(void)
+{
+       int i, j, len, n;
+       unsigned char byte;
+
+       printf("static unsigned char tritab_runlen[128] = {\n\t");
+
+       for(i=0; i<128; i++) {
+               unsigned int val;
+               for(j=0; j<16; j++) {
+                       if(mc_tri_table[i * 2][j] == -1) break;
+               }
+               val = j;
+               for(j=0; j<16; j++) {
+                       if(mc_tri_table[i * 2 + 1][j] == -1) break;
+               }
+               val |= j << 4;
+               printf("0x%02x", val);
+               if(i == 127) {
+                       printf("\n};\n");
+               } else if(i % 12 != 11) {
+                       printf(", ");
+               } else {
+                       printf(",\n\t");
+               }
+       }
+
+       printf("\nstatic unsigned char tritab_data[] = {\n\t");
+
+       len = 4;
+       byte = 0;
+       n = 0;
+       for(i=0; i<256; i++) {
+               for(j=0; j<16; j++) {
+                       if(mc_tri_table[i][j] == -1) break;
+
+                       if(n++ == 0) {
+                               byte = mc_tri_table[i][j];
+                       } else {
+                               byte |= mc_tri_table[i][j] << 4;
+                               n = 0;
+
+                               len += printf("%d", byte);
+                               if(i < 254 || (j < 15 && mc_tri_table[i][j + 1] != -1)) {
+                                       if(len < 72) {
+                                               len += printf(", ");
+                                       } else {
+                                               printf(",\n\t");
+                                               len = 4;
+                                       }
+                               }
+                       }
+               }
+       }
+       printf("\n};\n");
+
+       return 0;
+}