nuclear@3: #include nuclear@2: #include nuclear@2: #include nuclear@3: #include nuclear@2: #include "scene.h" nuclear@2: #include "dynarr.h" nuclear@2: nuclear@2: struct scenefile { nuclear@2: struct mesh **mesh; nuclear@2: }; nuclear@2: nuclear@3: struct scnfile_io { nuclear@3: void *uptr; /* user-data */ nuclear@3: nuclear@3: size_t (*read)(void *buf, size_t bytes, void *uptr); nuclear@3: size_t (*write)(void *buf, size_t bytes, void *uptr); nuclear@3: long (*seek)(long offs, int whence, void *uptr); nuclear@3: }; nuclear@3: nuclear@3: static size_t def_read(void *buf, size_t bytes, void *uptr); nuclear@3: static size_t def_write(void *buf, size_t bytes, void *uptr); nuclear@3: static long def_seek(long offset, int whence, void *uptr); nuclear@3: nuclear@3: nuclear@2: int scnfile_init(struct scenefile *scn) nuclear@2: { nuclear@2: if(!(scn->mesh = dynarr_alloc(0, sizeof *scn->mesh))) { nuclear@2: return -1; nuclear@2: } nuclear@2: return 0; nuclear@2: } nuclear@2: nuclear@2: void scnfile_destroy(struct scenefile *scn) nuclear@2: { nuclear@2: int i, num_meshes = scnfile_count(scn); nuclear@2: nuclear@2: for(i=0; imesh[i]); nuclear@2: free(scn->mesh[i]); nuclear@2: } nuclear@2: dynarr_free(scn->mesh); nuclear@2: } nuclear@2: nuclear@2: struct scenefile *scnfile_create(void) nuclear@2: { nuclear@2: struct scenefile *scn; nuclear@2: nuclear@2: if(!(scn = malloc(sizeof *scn))) { nuclear@2: return 0; nuclear@2: } nuclear@2: if(scnfile_init(scn) == -1) { nuclear@2: free(scn); nuclear@2: return 0; nuclear@2: } nuclear@2: return scn; nuclear@2: } nuclear@2: nuclear@2: void scnfile_free(struct scenefile *scn) nuclear@2: { nuclear@2: scnfile_destroy(scn); nuclear@2: free(scn); nuclear@2: } nuclear@2: nuclear@2: nuclear@2: int scnfile_add_mesh(struct scenefile *scn, struct mesh *m) nuclear@2: { nuclear@2: void *tmp; nuclear@2: if(!(tmp = dynarr_push(scn->mesh, m))) { nuclear@2: return -1; nuclear@2: } nuclear@2: scn->mesh = tmp; nuclear@2: return 0; nuclear@2: } nuclear@2: nuclear@2: int scnfile_load(struct scenefile *scn, const char *fname) nuclear@2: { nuclear@3: FILE *fp; nuclear@3: int res; nuclear@3: nuclear@3: if(!(fp = fopen(fname, "rb"))) { nuclear@3: fprintf(stderr, "scenefile: failed to load: %s: %s\n", fname, strerror(errno)); nuclear@3: return -1; nuclear@3: } nuclear@3: res = scnfile_read_file(scn, fp); nuclear@3: fclose(fp); nuclear@3: return res; nuclear@3: } nuclear@3: nuclear@3: int scnfile_read_file(struct scenefile *scn, FILE *fp) nuclear@3: { nuclear@3: struct scnfile_io io = {0, def_read, def_write, def_seek}; nuclear@3: io.uptr = fp; nuclear@3: return scnfile_read(scn, &io); nuclear@3: } nuclear@3: nuclear@3: int scnfile_read(struct scenefile *scn, struct scnfile_io *io) nuclear@3: { nuclear@2: return -1; /* TODO */ nuclear@2: } nuclear@2: nuclear@2: int scnfile_find_mesh(struct scenefile *scn, const char *fname) nuclear@2: { nuclear@2: int i, num = scnfile_count(scn); nuclear@2: nuclear@2: for(i=0; imesh[i]), fname) == 0) { nuclear@2: return i; nuclear@2: } nuclear@2: } nuclear@2: return -1; nuclear@2: } nuclear@2: nuclear@2: struct mesh *scnfile_mesh(struct scenefile *scn, int idx) nuclear@2: { nuclear@2: if(idx < 0 || idx >= scnfile_count(scn)) { nuclear@2: return 0; nuclear@2: } nuclear@2: return scn->mesh[idx]; nuclear@2: } nuclear@2: nuclear@2: int scnfile_count(struct scenefile *scn) nuclear@2: { nuclear@2: return dynarr_size(scn->mesh); nuclear@2: } nuclear@3: nuclear@3: nuclear@3: void scnfile_io_user_data(struct scnfile_io *io, void *uptr) nuclear@3: { nuclear@3: io->uptr = uptr; nuclear@3: } nuclear@3: nuclear@3: void scnfile_io_read_func(struct scnfile_io *io, size_t (*read)(void*, size_t, void*)) nuclear@3: { nuclear@3: io->read = read; nuclear@3: } nuclear@3: nuclear@3: void scnfile_io_write_func(struct scnfile_io *io, size_t (*write)(void*, size_t, void*)) nuclear@3: { nuclear@3: io->write = write; nuclear@3: } nuclear@3: nuclear@3: void scnfile_io_seek_func(struct scnfile_io *io, long (*seek)(long, int, void*)) nuclear@3: { nuclear@3: io->seek = seek; nuclear@3: } nuclear@3: nuclear@3: nuclear@3: static size_t def_read(void *buf, size_t bytes, void *uptr) nuclear@3: { nuclear@3: return uptr ? fread(buf, 1, bytes, uptr) : 0; nuclear@3: } nuclear@3: nuclear@3: static size_t def_write(void *buf, size_t bytes, void *uptr) nuclear@3: { nuclear@3: return uptr ? fwrite(buf, 1, bytes, uptr) : 0; nuclear@3: } nuclear@3: nuclear@3: static long def_seek(long offset, int whence, void *uptr) nuclear@3: { nuclear@3: if(!uptr || fseek(uptr, offset, whence) == -1) { nuclear@3: return -1; nuclear@3: } nuclear@3: return ftell(uptr); nuclear@3: } nuclear@3: