예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
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;
}
예제 #4
0
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;
}
예제 #5
0
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;
}
예제 #6
0
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;
}
예제 #7
0
파일: object.c 프로젝트: johnh530/electro
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;
}