#include <stdio.h> #include <stdlib.h> /* decoding 3d models stored in spherical coordinates. x=r.sin(azimuth).cos(zenith) y=r.sin(azimuth).sin(zenith) z=r.cos(azimuth) Test models from https://6502disassembly.com/a2-stellar7/LEV1.html and https://6502disassembly.com/a2-stellar7/LEV7.html */ typedef long fp14; // There are some architecture dependencies in this code (long vs long long, signed shifts etc) #define int2fp(x) ((x) << 14) #define fp2int(x) ((x) >> 14) const fp14 qsine[65] = { 0, 402, 803, 1205, 1605, 2005, 2404, 2801, 3196, 3589, 3980, 4369, 4756, 5139, 5519, 5896, 6269, 6639, 7005, 7366, 7723, 8075, 8423, 8765, 9102, 9434, 9759, 10079, 10393, 10701, 11002, 11297, 11585, 11866, 12139, 12406, 12665, 12916, 13159, 13395, 13622, 13842, 14053, 14255, 14449, 14634, 14810, 14978, 15136, 15286, 15426, 15557, 15678, 15790, 15892, 15985, 16069, 16142, 16206, 16260, 16305, 16339, 16364, 16379, 16384, }; static inline fp14 hsine(unsigned char x) { return x>=64 ? qsine[128-x] : qsine[x]; } static inline fp14 sine(unsigned char x) { return x&0x80 ? -hsine(x&0x7f) : hsine(x); } #define fpSin(x) (sine((x) & 0xff)) #define fpCos(x) (sine(((x)+64) & 0xff)) int x[256], y[256], z[256]; void Decode(char *model, int rotation, const unsigned char *p) { int r, azimuth, zenith; int p1, p2, i = 0; fprintf(stdout, "const int8_t %s_%d[] = {\n", model,rotation); for (;;) { r = *p++; if (r==0x80) break; azimuth = *p++; zenith = *p++; x[i] = fp2int(fp2int(r*fpSin(azimuth+rotation))*fpCos(zenith)); y[i] = fp2int(fp2int(r*fpSin(azimuth+rotation))*fpSin(zenith)); z[i] = fp2int(r*fpCos(azimuth+rotation)); i += 1; } // got and converted points, now get line segments. for (;;) { p1 = *p++; if (p1==0x80) break; p2 = *p++; fprintf(stdout, " {%d,%d,%d}, {%d,%d,%d},\n", x[p1],y[p1],z[p1], x[p2],y[p2],z[p2]); } fprintf(stdout, " {0,0,0}, {0,0,0}\n"); fprintf(stdout, "}\n"); } #define decode(s,r) Decode(#s,r,s) int main(int argc, char **argv) { const unsigned char shp_hovercraft[] = { 0x46,0x40,0xe2, 0x3c,0x80,0xe2, 0x50,0xc0,0xe2, 0x3c,0x00,0xe2, 0x32,0x40,0xd3, 0x28,0x80,0xf1, 0x28,0x80,0xd3, 0x3c,0xc0,0xf1, 0x3c,0xc0,0xd3, 0x28,0x00,0xf1, 0x28,0x00,0xd3, 0x1b,0x50,0x0f, 0x1b,0x30,0x0f, 0x2d,0x3c,0xfb, 0x31,0x3d,0xf6, 0x2d,0x44,0xfb, 0x31,0x43,0xf6, 0x64,0x3e,0xfb, 0x64,0x3e,0xf6, 0x64,0x42,0xfb, 0x64,0x42,0xf6, 0x80, 0x00,0x01, 0x01,0x02, 0x02,0x03, 0x03,0x00, 0x04,0x06, 0x06,0x08, 0x08,0x0a, 0x0a,0x04, 0x05,0x07, 0x07,0x09, 0x09,0x05, 0x0b,0x0c, 0x00,0x04, 0x01,0x06, 0x02,0x08, 0x03,0x0a, 0x01,0x05, 0x02,0x07, 0x03,0x09, 0x05,0x0b, 0x09,0x0c, 0x00,0x0b, 0x00,0x0c, 0x0d,0x11, 0x0f,0x13, 0x0e,0x12, 0x10,0x14, 0x11,0x13, 0x12,0x14, 0x11,0x12, 0x13,0x14, 0x0d,0x0f, 0x0e,0x10, 0x0d,0x0e, 0x0f,0x10, 0x80 }; decode(shp_hovercraft, 0); decode(shp_hovercraft, 128); exit(0); return(0); }