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
|