X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=libs%2Fgoat3d%2Fsrc%2Fread.c;h=cad023d35c490233cbe00d08727306d2262481bd;hb=4c42122003b1e2e859e63013aaf15e270d47b082;hp=368ae7503fbc87c1ec7fad783024c740b3043d03;hpb=26bd2163df04d5f7007584fcf835b1f687f3cd02;p=deeprace diff --git a/libs/goat3d/src/read.c b/libs/goat3d/src/read.c index 368ae75..cad023d 100644 --- a/libs/goat3d/src/read.c +++ b/libs/goat3d/src/read.c @@ -22,6 +22,7 @@ along with this program. If not, see . #include "log.h" #include "dynarr.h" #include "track.h" +#include "util.h" #if defined(__WATCOMC__) || defined(_WIN32) || defined(__DJGPP__) #include @@ -45,9 +46,6 @@ static int read_node(struct goat3d *g, struct goat3d_node *node, struct ts_node static int read_anim(struct goat3d *g, struct ts_node *tsanim); static struct goat3d_track *read_track(struct goat3d *g, struct ts_node *tstrk); -GOAT3DAPI void *goat3d_b64decode(const char *str, void *buf, int *bufsz); -#define b64decode goat3d_b64decode - int g3dimpl_scnload(struct goat3d *g, struct goat3d_io *io) { @@ -380,14 +378,6 @@ fail: return 0; } -static int calc_b64_size(const char *s) -{ - int len = strlen(s); - const char *end = s + len; - while(end > s && *--end == '=') len--; - return len * 3 / 4; -} - static void *read_veclist(void *arr, int dim, const char *nodename, const char *attrname, struct ts_node *tslist) { int i, size, bufsz; @@ -414,6 +404,9 @@ static void *read_veclist(void *arr, int dim, const char *nodename, const char * bufsz = size * dim * sizeof(float); b64decode(str, arr, &bufsz); +#ifdef GOAT3D_BIGEND + goat3d_bswap32(arr, size * dim); +#endif } c = tslist->child_list; @@ -473,6 +466,9 @@ static void *read_intlist(void *arr, int dim, const char *nodename, const char * bufsz = size * dim * sizeof(int); b64decode(str, arr, &bufsz); +#ifdef GOAT3D_BIGEND + goat3d_bswap32(arr, size * dim); +#endif } c = tslist->child_list; @@ -772,78 +768,3 @@ static struct goat3d_track *read_track(struct goat3d *g, struct ts_node *tstrk) return trk; } - -static int b64bits(int c) -{ - if(c >= 'A' && c <= 'Z') { - return c - 'A'; - } - if(c >= 'a' && c <= 'z') { - return c - 'a' + 26; - } - if(c >= '0' && c <= '9') { - return c - '0' + 52; - } - if(c == '+') return 62; - if(c == '/') return 63; - - return -1; -} - -GOAT3DAPI void *goat3d_b64decode(const char *str, void *buf, int *bufsz) -{ - unsigned char *dest, *end; - unsigned char acc; - int bits, sz; - unsigned int gidx; - - if(buf) { - sz = *bufsz; - } else { - sz = calc_b64_size(str); - if(!(buf = malloc(sz))) { - return 0; - } - if(bufsz) *bufsz = sz; - } - dest = buf; - end = (unsigned char*)buf + sz; - - sz = 0; - gidx = 0; - acc = 0; - while(*str) { - if((bits = b64bits(*str++)) == -1) { - continue; - } - - switch(gidx++ & 3) { - case 0: - acc = bits << 2; - break; - case 1: - if(dest < end) *dest = acc | (bits >> 4); - dest++; - acc = bits << 4; - break; - case 2: - if(dest < end) *dest = acc | (bits >> 2); - dest++; - acc = bits << 6; - break; - case 3: - if(dest < end) *dest = acc | bits; - dest++; - default: - break; - } - } - - if(gidx & 3) { - if(dest < end) *dest = acc; - dest++; - } - - if(bufsz) *bufsz = dest - (unsigned char*)buf; - return buf; -}