Ejemplo n.º 1
0
static ParsedData parse(Allocator* alloc, unsigned char* data, unsigned data_size)
{
    ParserState ps = {};
    ps.data = data;
    ps.head = data;
    ps.end = (unsigned char*)mem_ptr_add(data, data_size);
    ParsedData pd = {};
    pd.vertices = dynamic_array_create<Vector3>(alloc);
    pd.normals = dynamic_array_create<Vector3>(alloc);
    pd.uvs = dynamic_array_create<Vector2>(alloc);
    pd.faces = dynamic_array_create<ParsedFace>(alloc);
    ps.head = ps.data;

    while (ps.head < ps.end)
    {
        unsigned char c = *ps.head;
        bool first_on_line = ps.head == ps.data || (ps.head > ps.data && (*(ps.head - 1)) == '\n');

        if (!first_on_line)
            skip_line(&ps);
        else if (c == 'v' && ps.head + 1 < ps.end && (*(ps.head+1)) == 't')
            parse_uv(&ps, &pd);
        else if (c == 'v' && ps.head + 1 < ps.end && (*(ps.head+1)) == 'n')
            parse_normal(&ps, &pd);
        else if (c == 'v')
            parse_vertex(&ps, &pd);
        else if (c == 'f')
            parse_face(&ps, &pd);
        else
            skip_line(&ps);
    }

    return pd;
}
Ejemplo n.º 2
0
static ats_err_t
parse_line(const char *line, struct ats_wft *wft)
{
        switch (line[0]) {
                case 'v':
                        return parse_vertex(line, wft);
                case 'f':
                        return parse_face(line, wft);
                default:
			/* Skip this line. */
                        return ATS_NO_ERROR;
        }
}
Ejemplo n.º 3
0
int cubepos::parse_move(const char*&p){
skip_whitespace(p);
const char*q= p;
int f= parse_face(q);
if(f<0)
return-1;
int t= 0;
switch(*q){
case'1':case'+':t= 0;break;
case'2':t= 1;break;
case'3':case'\'':case'-':t= TWISTS-1;break;
default:
return-1;
}
p= q+1;
return f*TWISTS+t;
}
Ejemplo n.º 4
0
int wavefront_parse(wavefront_obj_t *obj, char *data) {
	char *line, *save;

	assert(obj != NULL && data != NULL);

	line = strtok_r(data, "\n", &save);

	do {
		if (line[1] == ' ') {
			switch (line[0]) {
				case 'v':
					wavefront_add_vertex(obj, parse_vertex(line+2));
					break;
				case 'f':
					wavefront_add_face(obj, parse_face(line+2));
					break;
				default:
					break;
			}
		}
	} while((line = strtok_r(NULL, "\n", &save)));

#ifdef OPTIMIZE
	obj->vertices = realloc(obj->vertices, obj->_nvertex * sizeof(vertex_t));
	obj->_vsize = obj->_nvertex;
	obj->faces = realloc(obj->faces, obj->_nface * sizeof(face_t));
	obj->_fsize = obj->_nface;
#ifdef DEBUG_MEM
	puts("*** OPTIMIZED ***");
#endif // DEBUG_MEM
#endif // OPTIMIZE

#ifdef DEBUG_MEM
	puts("*** Wavefront stats ***");
	printf("V: %d (cap %d)\n", obj->_nvertex, obj->_vsize);
	printf("F: %d (cap %d)\n", obj->_nface, obj->_fsize);
#endif // DEBUG_MEM

	return 0;
}
Ejemplo n.º 5
0
int cubepos::parse_face(const char*&p){
int f= parse_face(*p);
if(f>=0)
p++;
return f;
}
Ejemplo n.º 6
0
void cubepos::init(){
static int initialized= 0;
if(initialized)
return;
initialized= 1;
/*14:*/
#line 287 "../cubepos.w"

for(int i= 0;i<CUBIES;i++){
int perm= corner_perm(i);
int ori= corner_ori(i);
corner_ori_inc[i]= corner_val(perm,(ori+1)%3);
corner_ori_dec[i]= corner_val(perm,(ori+2)%3);
corner_ori_neg_strip[i]= corner_val(0,(3-ori)%3);
mod24[i]= mod24[i+CUBIES]= i;
}

/*:14*//*28:*/
#line 563 "../cubepos.w"

for(int m= 0;m<NMOVES;m++)
for(int c= 0;c<CUBIES;c++){
edge_trans[m][c]= c;
corner_trans[m][c]= c;
}

/*:28*//*29:*/
#line 578 "../cubepos.w"

for(int f= 0;f<FACES;f++)
for(int t= 0;t<3;t++){
int m= f*TWISTS+t;
int isquarter= (t==0||t==2);
int perminc= t+1;
if(m<0)
continue;
for(int i= 0;i<4;i++){
int ii= (i+perminc)%4;
for(int o= 0;o<2;o++){
int oo= o;
if(isquarter)
oo^= edge_change[f];
edge_trans[m][edge_val(edge_twist_perm[f][i],o)]= 
edge_val(edge_twist_perm[f][ii],oo);
}
for(int o= 0;o<3;o++){
int oo= o;
if(isquarter)
oo= (corner_change[f][i]+oo)%3;
corner_trans[m][corner_val(corner_twist_perm[f][i],o)]= 
corner_val(corner_twist_perm[f][ii],oo);
}
}
}

/*:29*//*34:*/
#line 649 "../cubepos.w"

for(int i= 0;i<NMOVES;i++)
inv_move[i]= TWISTS*(i/TWISTS)+(NMOVES-i-1)%TWISTS;

/*:34*//*51:*/
#line 1040 "../cubepos.w"

memset(lookup_edge_cubie,INVALID,sizeof(lookup_edge_cubie));
memset(lookup_corner_cubie,INVALID,sizeof(lookup_corner_cubie));
for(int i= 0;i<CUBIES;i++){
const char*tmp= 0;
lookup_corner_cubie[parse_cubie(tmp= smcorners[i])-6*6*6]= i;
lookup_corner_cubie[parse_cubie(tmp= smcorners[CUBIES+i])-6*6*6]= CUBIES+i;
lookup_edge_cubie[parse_cubie(tmp= smedges[i])-6*6]= i;
}
const char*p= sing_solved;
for(int i= 0;i<12;i++){
int cv= parse_edge(p);
sm_edge_order[i]= edge_perm(cv);
sm_edge_flipped[i]= edge_ori(cv);
}
for(int i= 0;i<8;i++)
sm_corner_order[i]= corner_perm(parse_corner(p));

/*:51*//*60:*/
#line 1238 "../cubepos.w"

unsigned char face_to_m[FACES*FACES*FACES];
for(int i= 0;i<6;i++)
parse_corner_to_facemap(axis_permute_map[i],face_map[8*i]);
for(int i= 0;i<8;i++)
parse_corner_to_facemap(axis_negate_map[i],face_map[i]);
for(int i= 1;i<6;i++)
for(int j= 1;j<8;j++)
face_map_multiply(face_map[8*i],face_map[j],face_map[8*i+j]);

/*:60*//*61:*/
#line 1251 "../cubepos.w"

for(int i= 0;i<M;i++){
int v= face_map[i][0]*36+face_map[i][1]*6+face_map[i][2];
face_to_m[v]= i;
}
unsigned char tfaces[6];
for(int i= 0;i<M;i++)
for(int j= 0;j<M;j++){
face_map_multiply(face_map[i],face_map[j],tfaces);
int v= tfaces[0]*36+tfaces[1]*6+tfaces[2];
mm[i][j]= face_to_m[v];
if(mm[i][j]==0)
invm[i]= j;
}
for(int m= 0;m<M;m++){
int is_neg= (m^(m>>3))&1;
for(int f= 0;f<6;f++){
for(int t= 0;t<TWISTS;t++){
if(is_neg)
move_map[m][f*TWISTS+t]= face_map[m][f]*TWISTS+TWISTS-1-t;
else
move_map[m][f*TWISTS+t]= face_map[m][f]*TWISTS+t;
}
}
}

/*:61*//*62:*/
#line 1281 "../cubepos.w"

for(int m= 0;m<M;m++)
for(int c= 0;c<CUBIES;c++){
int v= 0;
for(int i= 0;i<2;i++)
v= 6*v+face_map[m][parse_face(smedges[c][i])];
rot_edge[m][c]= lookup_edge_cubie[v];
v= 0;
for(int i= 0;i<3;i++)
v= 6*v+face_map[m][parse_face(smcorners[c][i])];
rot_corner[m][c]= mod24[lookup_corner_cubie[v]];
}

/*:62*//*73:*/
#line 1467 "../cubepos.w"

for(int s= 0;s<CANONSEQSTATES;s++){
int prevface= (s-1)%FACES;
canon_seq_mask[s]= (1<<NMOVES)-1;
for(int mv= 0;mv<NMOVES;mv++){
int f= mv/TWISTS;
int isplus= 0;
if(s!=0&&(prevface==f||prevface==f+3))
{
canon_seq[s][mv]= INVALID;
canon_seq_mask[s]&= ~(1<<mv);
}else{
canon_seq[s][mv]= f+1+FACES*isplus;
}
}
canon_seq_mask_ext[s]= canon_seq_mask[s];
}

/*:73*/
#line 262 "../cubepos.w"

}
Ejemplo n.º 7
0
void Mesh :: load_mesh(char* the_mesh)
{
	FILE* fp;
	char buffer[300];
	int status = 0;
	int v = 0;
	int f = 0;
	int* vert_faces;
	
	fp = fopen(the_mesh, "r+");
	if(fp == NULL)
	{
		cout << "Error reading file: " << the_mesh << endl;
		return;
	}
	while(!feof(fp))
	{
		fgets(buffer, 300, fp);
		switch(buffer[0])
		{
			case '#':
				break;
			case 'v':
				status++;
				break;
			case 'f':
				status++;
				break;
			default:
				if(status == 0)
				{
					parse_count(buffer, vert_faces);
					vert_faces = new int[verts_size];
					for( int i = 0; i < verts_size; i++ )
					{
						v_norms[i] = new GLfloat[4];
						v_norms[i][0] = 0.0;
						v_norms[i][1] = 0.0;
						v_norms[i][2] = 0.0;
						v_norms[i][3] = 1.0;
						vert_faces[i] = 0;
					}
				}
				else if(status == 1)
				{
					parse_vert(buffer, v);
					v++;
				}
				else if(status == 2)
				{
					parse_face(buffer, f, vert_faces);
					f++;
				}
				break;
				
				for( int i = 0; i < verts_size; i++ )
				{
					v_norms[i][0] = v_norms[i][0] / vert_faces[i];
					v_norms[i][1] = v_norms[i][1] / vert_faces[i];
					v_norms[i][2] = v_norms[i][2] / vert_faces[i];
					v_norms[i][3] = 1.0;
					normalize(v_norms[i]);
				}
		}
	}
}