use SDL_RWops to read obj models

This commit is contained in:
Andrei "Akari" Alexeyev 2017-03-12 23:22:43 +02:00
parent 4b132656a5
commit d39ab84742
3 changed files with 26 additions and 3 deletions

View file

@ -100,7 +100,12 @@ static void free_obj(ObjFileData *data) {
}
static void parse_obj(const char *filename, ObjFileData *data) {
FILE *fp = fopen(filename, "rb");
SDL_RWops *rw = SDL_RWFromFile(filename, "r");
if(!rw) {
warnx("%s(): SDL_RWFromFile() failed: %s", __func__, SDL_GetError());
return;
}
char line[256];
Vector buf;
@ -109,7 +114,7 @@ static void parse_obj(const char *filename, ObjFileData *data) {
memset(data, 0, sizeof(ObjFileData));
while(fgets(line, sizeof(line), fp)) {
while(SDL_RWgets(rw, line, sizeof(line))) {
linen++;
char *first;
@ -192,7 +197,7 @@ static void parse_obj(const char *filename, ObjFileData *data) {
}
}
fclose(fp);
SDL_RWclose(rw);
}
Model* get_model(const char *name) {

View file

@ -370,6 +370,22 @@ void png_init_rwops(png_structp png, SDL_RWops *rwops) {
png_set_read_fn(png, rwops, png_rwops_read_data);
}
char* SDL_RWgets(SDL_RWops *rwops, char *buf, size_t bufsize) {
char c, *ptr = buf, *end = buf + bufsize - 1;
assert(end > ptr);
while((c = SDL_ReadU8(rwops)) && ptr <= end) {
if((*ptr++ = c) == '\n')
break;
}
if(ptr == buf)
return NULL;
*ptr = 0;
return buf;
}
//
// misc utils
//

View file

@ -99,6 +99,8 @@ Hashtable* parse_keyvalue_stream(SDL_RWops *strm, size_t tablesize);
Hashtable* parse_keyvalue_file(const char *filename, size_t tablesize);
void png_init_rwops(png_structp png, SDL_RWops *rwops);
char* SDL_RWgets(SDL_RWops *rwops, char *buf, size_t bufsize);
//
// misc utils
//