scenefile

annotate src/scene.c @ 3:b30f83409769

foo
author John Tsiombikas <nuclear@mutantstargoat.com>
date Sat, 21 Jan 2012 04:14:24 +0200
parents c15992cedec9
children
rev   line source
nuclear@3 1 #include <stdio.h>
nuclear@2 2 #include <stdlib.h>
nuclear@2 3 #include <string.h>
nuclear@3 4 #include <errno.h>
nuclear@2 5 #include "scene.h"
nuclear@2 6 #include "dynarr.h"
nuclear@2 7
nuclear@2 8 struct scenefile {
nuclear@2 9 struct mesh **mesh;
nuclear@2 10 };
nuclear@2 11
nuclear@3 12 struct scnfile_io {
nuclear@3 13 void *uptr; /* user-data */
nuclear@3 14
nuclear@3 15 size_t (*read)(void *buf, size_t bytes, void *uptr);
nuclear@3 16 size_t (*write)(void *buf, size_t bytes, void *uptr);
nuclear@3 17 long (*seek)(long offs, int whence, void *uptr);
nuclear@3 18 };
nuclear@3 19
nuclear@3 20 static size_t def_read(void *buf, size_t bytes, void *uptr);
nuclear@3 21 static size_t def_write(void *buf, size_t bytes, void *uptr);
nuclear@3 22 static long def_seek(long offset, int whence, void *uptr);
nuclear@3 23
nuclear@3 24
nuclear@2 25 int scnfile_init(struct scenefile *scn)
nuclear@2 26 {
nuclear@2 27 if(!(scn->mesh = dynarr_alloc(0, sizeof *scn->mesh))) {
nuclear@2 28 return -1;
nuclear@2 29 }
nuclear@2 30 return 0;
nuclear@2 31 }
nuclear@2 32
nuclear@2 33 void scnfile_destroy(struct scenefile *scn)
nuclear@2 34 {
nuclear@2 35 int i, num_meshes = scnfile_count(scn);
nuclear@2 36
nuclear@2 37 for(i=0; i<num_meshes; i++) {
nuclear@2 38 mesh_destroy(scn->mesh[i]);
nuclear@2 39 free(scn->mesh[i]);
nuclear@2 40 }
nuclear@2 41 dynarr_free(scn->mesh);
nuclear@2 42 }
nuclear@2 43
nuclear@2 44 struct scenefile *scnfile_create(void)
nuclear@2 45 {
nuclear@2 46 struct scenefile *scn;
nuclear@2 47
nuclear@2 48 if(!(scn = malloc(sizeof *scn))) {
nuclear@2 49 return 0;
nuclear@2 50 }
nuclear@2 51 if(scnfile_init(scn) == -1) {
nuclear@2 52 free(scn);
nuclear@2 53 return 0;
nuclear@2 54 }
nuclear@2 55 return scn;
nuclear@2 56 }
nuclear@2 57
nuclear@2 58 void scnfile_free(struct scenefile *scn)
nuclear@2 59 {
nuclear@2 60 scnfile_destroy(scn);
nuclear@2 61 free(scn);
nuclear@2 62 }
nuclear@2 63
nuclear@2 64
nuclear@2 65 int scnfile_add_mesh(struct scenefile *scn, struct mesh *m)
nuclear@2 66 {
nuclear@2 67 void *tmp;
nuclear@2 68 if(!(tmp = dynarr_push(scn->mesh, m))) {
nuclear@2 69 return -1;
nuclear@2 70 }
nuclear@2 71 scn->mesh = tmp;
nuclear@2 72 return 0;
nuclear@2 73 }
nuclear@2 74
nuclear@2 75 int scnfile_load(struct scenefile *scn, const char *fname)
nuclear@2 76 {
nuclear@3 77 FILE *fp;
nuclear@3 78 int res;
nuclear@3 79
nuclear@3 80 if(!(fp = fopen(fname, "rb"))) {
nuclear@3 81 fprintf(stderr, "scenefile: failed to load: %s: %s\n", fname, strerror(errno));
nuclear@3 82 return -1;
nuclear@3 83 }
nuclear@3 84 res = scnfile_read_file(scn, fp);
nuclear@3 85 fclose(fp);
nuclear@3 86 return res;
nuclear@3 87 }
nuclear@3 88
nuclear@3 89 int scnfile_read_file(struct scenefile *scn, FILE *fp)
nuclear@3 90 {
nuclear@3 91 struct scnfile_io io = {0, def_read, def_write, def_seek};
nuclear@3 92 io.uptr = fp;
nuclear@3 93 return scnfile_read(scn, &io);
nuclear@3 94 }
nuclear@3 95
nuclear@3 96 int scnfile_read(struct scenefile *scn, struct scnfile_io *io)
nuclear@3 97 {
nuclear@2 98 return -1; /* TODO */
nuclear@2 99 }
nuclear@2 100
nuclear@2 101 int scnfile_find_mesh(struct scenefile *scn, const char *fname)
nuclear@2 102 {
nuclear@2 103 int i, num = scnfile_count(scn);
nuclear@2 104
nuclear@2 105 for(i=0; i<num; i++) {
nuclear@2 106 if(strcmp(mesh_get_name(scn->mesh[i]), fname) == 0) {
nuclear@2 107 return i;
nuclear@2 108 }
nuclear@2 109 }
nuclear@2 110 return -1;
nuclear@2 111 }
nuclear@2 112
nuclear@2 113 struct mesh *scnfile_mesh(struct scenefile *scn, int idx)
nuclear@2 114 {
nuclear@2 115 if(idx < 0 || idx >= scnfile_count(scn)) {
nuclear@2 116 return 0;
nuclear@2 117 }
nuclear@2 118 return scn->mesh[idx];
nuclear@2 119 }
nuclear@2 120
nuclear@2 121 int scnfile_count(struct scenefile *scn)
nuclear@2 122 {
nuclear@2 123 return dynarr_size(scn->mesh);
nuclear@2 124 }
nuclear@3 125
nuclear@3 126
nuclear@3 127 void scnfile_io_user_data(struct scnfile_io *io, void *uptr)
nuclear@3 128 {
nuclear@3 129 io->uptr = uptr;
nuclear@3 130 }
nuclear@3 131
nuclear@3 132 void scnfile_io_read_func(struct scnfile_io *io, size_t (*read)(void*, size_t, void*))
nuclear@3 133 {
nuclear@3 134 io->read = read;
nuclear@3 135 }
nuclear@3 136
nuclear@3 137 void scnfile_io_write_func(struct scnfile_io *io, size_t (*write)(void*, size_t, void*))
nuclear@3 138 {
nuclear@3 139 io->write = write;
nuclear@3 140 }
nuclear@3 141
nuclear@3 142 void scnfile_io_seek_func(struct scnfile_io *io, long (*seek)(long, int, void*))
nuclear@3 143 {
nuclear@3 144 io->seek = seek;
nuclear@3 145 }
nuclear@3 146
nuclear@3 147
nuclear@3 148 static size_t def_read(void *buf, size_t bytes, void *uptr)
nuclear@3 149 {
nuclear@3 150 return uptr ? fread(buf, 1, bytes, uptr) : 0;
nuclear@3 151 }
nuclear@3 152
nuclear@3 153 static size_t def_write(void *buf, size_t bytes, void *uptr)
nuclear@3 154 {
nuclear@3 155 return uptr ? fwrite(buf, 1, bytes, uptr) : 0;
nuclear@3 156 }
nuclear@3 157
nuclear@3 158 static long def_seek(long offset, int whence, void *uptr)
nuclear@3 159 {
nuclear@3 160 if(!uptr || fseek(uptr, offset, whence) == -1) {
nuclear@3 161 return -1;
nuclear@3 162 }
nuclear@3 163 return ftell(uptr);
nuclear@3 164 }
nuclear@3 165