void read_faces(tokenizer& t,int count,std::vector<face_type>& faces) { t.expect_literal( "{" ); t.expect_linefeed(); for( int i = 0 ; i< count ; i++ ) { face_type f; f.vertex_count = t.expect_integer( 2, 4 ); f.material_index = -1; for( int j = 0 ; j < f.vertex_count ; j++ ) { f.colors[ j ].red = f.colors[ j ].green = f.colors[ j ].blue = f.colors[ j ].alpha = 1; } for( ; ; ) { substr token = t(); if( token == "V" ) { t.expect_literal( "(" ); for( int j = 0 ; j< f.vertex_count ; j++ ) { f.vertex_indices[ j ] = t.expect_integer( 0 ); } t.expect_literal( ")" ); } else if( token == "M" ) { t.expect_literal( "(" ); f.material_index = t.expect_integer( -1 ); t.expect_literal( ")" ); } else if( token == "UV" ) { t.expect_literal( "(" ); for( int j = 0 ; j< f.vertex_count ; j++ ) { f.uv[ j ].u = t.expect_float(); f.uv[ j ].v = t.expect_float(); } t.expect_literal( ")" ); } else if( token == "COL" ) { t.expect_literal( "(" ); for( int j = 0 ; j < f.vertex_count ; j++ ) { DWORD c = t.expect_dword(); f.colors[ j ].red = ( c & 0xff ) / 255.0f; f.colors[ j ].green = ( ( c & 0xff00 ) >> 8 ) / 255.0f; f.colors[ j ].blue = ( ( c & 0xff0000 ) >> 16 ) / 255.0f; f.colors[ j ].alpha = ( ( c & 0xff000000 ) >> 24 ) / 255.0f; } t.expect_literal( ")" ); } else if( token == "\n" ) { break; } else { throw mqo_reader_error( "unexpected token: "+token.str() ); } }
void read_material(tokenizer& t,document_type& doc) { int count=t.expect_integer(1); t.expect_literal( "{" ); t.expect_linefeed(); for(int i=0;i<count;i++){ material_type m; m.name=t.expect_string(31).str(); m.shader = shader_phong; m.vertex_color = false; m.color.red = m.color.green = m.color.blue = m.color.alpha = 1.0f; m.diffuse = m.ambient = m.emissive = m.specular = m.power = 1.0f; m.projection = projection_uv; m.proj_pos.x = m.proj_pos.y = m.proj_pos.z = 0; m.proj_scale.x = m.proj_scale.y = m.proj_scale.z = 0; m.proj_angle.heading = m.proj_angle.pitching = m.proj_angle.banking = 0; for(;;){ substr token = t(); if( token == "shader" ) { t.expect_literal( "(" ); m.shader = shader_type( t.expect_integer( 0, 4 ) ); t.expect_literal( ")" ); } else if( token == "vcol" ) { t.expect_literal( "(" ); m.vertex_color = t.expect_bool(); t.expect_literal( ")" ); } else if( token == "col" ) { t.expect_literal( "(" ); m.color.red = t.expect_float( 0, 1.0f ); m.color.green = t.expect_float( 0, 1.0f ); m.color.blue = t.expect_float( 0, 1.0f ); m.color.alpha = t.expect_float( 0, 1.0f ); t.expect_literal( ")" ); } else if( token == "dif" ) { t.expect_literal( "(" ); m.diffuse = t.expect_float( 0, 1.0f ); t.expect_literal( ")" ); } else if( token == "amb" ) { t.expect_literal( "(" ); m.ambient = t.expect_float( 0, 1.0f ); t.expect_literal( ")" ); } else if( token == "emi" ) { t.expect_literal( "(" ); m.emissive = t.expect_float( 0, 1.0f ); t.expect_literal( ")" ); } else if( token == "spc" ) { t.expect_literal( "(" ); m.specular = t.expect_float( 0, 1.0f ); t.expect_literal( ")" ); } else if( token == "power" ) { t.expect_literal( "(" ); m.power = t.expect_float( 0, 100.0f ); t.expect_literal( ")" ); } else if( token == "tex" ) { t.expect_literal( "(" ); m.texture = t.expect_string( 63 ).str(); t.expect_literal( ")" ); } else if( token == "aplane" ) { t.expect_literal( "(" ); m.aplane = t.expect_string( 63 ).str(); t.expect_literal( ")" ); } else if( token == "bump" ) { t.expect_literal( "(" ); m.bump = t.expect_string( 63 ).str(); t.expect_literal( ")" ); } else if( token == "proj_type" ) { t.expect_literal( "(" ); m.projection = projection_type( t.expect_integer( 0, 3 ) ); t.expect_literal( ")" ); } else if( token == "proj_pos" ) { t.expect_literal( "(" ); m.proj_pos.x = t.expect_float(); m.proj_pos.y = t.expect_float(); m.proj_pos.z = t.expect_float(); t.expect_literal( ")" ); } else if( token == "proj_scale" ) { t.expect_literal( "(" ); m.proj_scale.x = t.expect_float(); m.proj_scale.y = t.expect_float(); m.proj_scale.z = t.expect_float(); t.expect_literal( ")" ); } else if( token == "proj_angle" ) { t.expect_literal( "(" ); m.proj_angle.heading = t.expect_float(); m.proj_angle.pitching = t.expect_float(); m.proj_angle.banking = t.expect_float(); t.expect_literal( ")" ); } else if( token == "\n" ) { break; } else { throw mqo_reader_error( "unexpected token: "+token.str() ); } } doc.materials.push_back( m ); } t.expect_literal( "}" ); t.expect_linefeed(); }