blargg_err_t Data_Reader::skip_v( BOOST::uint64_t count ) { char buf [512]; while ( count ) { BOOST::uint64_t n = min( count, (BOOST::uint64_t) sizeof buf ); count -= n; RETURN_ERR( read_v( buf, n ) ); } return blargg_ok; }
const char * Data_Reader::skip_v( int count ) { char buf [512]; while ( count ) { int n = min( count, (int) sizeof buf ); count -= n; RETURN_ERR( read_v( buf, n ) ); } return 0; }
const char * Data_Reader::read( void* p, int n ) { if ( n < 0 ) return blargg_err_caller; if ( n <= 0 ) return 0; if ( n > remain() ) return blargg_err_file_eof; const char * err = read_v( p, n ); if ( !err ) remain_ -= n; return err; }
blargg_err_t Data_Reader::read( void* p, long n ) { assert( n >= 0 ); if ( n < 0 ) return blargg_err_caller; if ( n <= 0 ) return blargg_ok; if ( n > remain() ) return blargg_err_file_eof; blargg_err_t err = read_v( p, n ); if ( !err ) remain_ -= n; return err; }
const char * Data_Reader::read_avail( void* p, int* n_ ) { int n = min( (uint64_t)(*n_), remain() ); *n_ = 0; if ( n < 0 ) return blargg_err_caller; if ( n <= 0 ) return 0; const char * err = read_v( p, n ); if ( !err ) { remain_ -= n; *n_ = n; } return err; }
blargg_err_t Data_Reader::read_avail( void* p, int* n_ ) { assert( *n_ >= 0 ); long n = (long)(BOOST::uint64_t) min( (BOOST::uint64_t)(*n_), remain() ); *n_ = 0; if ( n < 0 ) return blargg_err_caller; if ( n <= 0 ) return blargg_ok; blargg_err_t err = read_v( p, n ); if ( !err ) { remain_ -= n; *n_ = (int) n; } return err; }
static int read_obj(const char *filename, struct object *o) { char L[MAXSTR]; char W[MAXSTR]; FILE *fin; int i, j, n = 0; /* Initialize the object element vectors. */ vector_t vv = o->vv = vecnew(0, sizeof (struct object_vert)); vector_t mv = o->mv = vecnew(0, sizeof (struct object_mesh)); if (filename) { path_push(get_file_path(filename)); /* Initialize the loader vector caches. */ _uv = vecnew(1024, sizeof (struct vec2)); _nv = vecnew(1024, sizeof (struct vec3)); _vv = vecnew(1024, sizeof (struct vec3)); uerr = nerr = verr = 0; if ((fin = open_file(get_file_name(filename), "r"))) { /* Create a default catch-all group using the default material. */ struct object_mesh *m = read_usemtl(mv, NULL, NULL); const char *F = NULL; /* Process each line, invoking the handler for each keyword. */ while (fgets(L, MAXSTR, fin)) if (sscanf(L, "%s%n", W, &n) >= 1) { char *V = L + n; if (!strcmp(W, "mtllib")) F = read_mtllib(mv, V); else if (!strcmp(W, "usemtl")) m = read_usemtl(mv, V, F); else if (!strcmp(W, "f")) read_f(vv, m->fv, V); else if (!strcmp(W, "l")) read_l(vv, m->ev, V); else if (!strcmp(W, "vt")) read_vt(V); else if (!strcmp(W, "vn")) read_vn(V); else if (!strcmp(W, "v" )) read_v (V); } fclose(fin); } else error("OBJ file '%s': %s", filename, system_error()); /* Remove any empty meshes. */ for (i = 0; i < vecnum(o->mv); ) if (vecnum(((struct object_mesh *) vecget(o->mv, i))->fv) || vecnum(((struct object_mesh *) vecget(o->mv, i))->ev)) i++; else { memmove(vecget(o->mv, i), vecget(o->mv, i + 1), (vecnum(o->mv) - i - 1) * sizeof (struct object_mesh)); vecpop(o->mv); } /* Compute tangent and bitangent vectors. */ calc_tbn(o); /* Sort meshes such that transparent ones appear last. */ for (i = 0; i < vecnum(o->mv); ++i) for (j = i + 1; j < vecnum(o->mv); ++j) { struct object_mesh *mi = vecget(o->mv, i); struct object_mesh *mj = vecget(o->mv, j); struct object_mesh mt; if (get_brush_t(mi->brush) > get_brush_t(mj->brush)) { mt = *mi; *mi = *mj; *mj = mt; } } /* Release the loader caches. */ vecdel(_vv); vecdel(_nv); vecdel(_uv); /* Report index errors. */ if (uerr > 0) error("OBJ file '%s' has %d bad texture indices", filename, uerr); if (nerr > 0) error("OBJ file '%s' has %d bad normal indices", filename, nerr); if (verr > 0) error("OBJ file '%s' has %d bad vertex indices", filename, verr); path_pop(); } return 1; }