diff --git a/test.cc b/test.cc index 45a0f8b..7a8c3dd 100644 --- a/test.cc +++ b/test.cc @@ -8,7 +8,7 @@ main( int argc, char **argv) { - std::string inputfile = "cornell_box.obj"; + std::string inputfile = "test.obj"; std::vector shapes; if (argc > 1) { @@ -45,6 +45,12 @@ main( printf(" material.Kd = (%f, %f ,%f)\n", shapes[i].material.diffuse[0], shapes[i].material.diffuse[1], shapes[i].material.diffuse[2]); printf(" material.Ks = (%f, %f ,%f)\n", shapes[i].material.specular[0], shapes[i].material.specular[1], shapes[i].material.specular[2]); printf(" material.Tr = (%f, %f ,%f)\n", shapes[i].material.transmittance[0], shapes[i].material.transmittance[1], shapes[i].material.transmittance[2]); + printf(" material.Ke = (%f, %f ,%f)\n", shapes[i].material.emission[0], shapes[i].material.emission[1], shapes[i].material.emission[2]); + printf(" material.Ns = %f\n", shapes[i].material.shininess); + printf(" material.map_Ka = %s\n", shapes[i].material.ambient_texname.c_str()); + printf(" material.map_Kd = %s\n", shapes[i].material.diffuse_texname.c_str()); + printf(" material.map_Ks = %s\n", shapes[i].material.specular_texname.c_str()); + printf(" material.map_Ns = %s\n", shapes[i].material.normal_texname.c_str()); printf("\n"); } diff --git a/tiny_obj_loader.cc b/tiny_obj_loader.cc index 99e1865..e601ce3 100644 --- a/tiny_obj_loader.cc +++ b/tiny_obj_loader.cc @@ -237,10 +237,19 @@ exportFaceGroupToShape( void InitMaterial(material_t& material) { - material.name = material.ambient_texname = material.diffuse_texname = material.specular_texname = ""; + material.name = ""; + material.ambient_texname = ""; + material.diffuse_texname = ""; + material.specular_texname = ""; + material.normal_texname = ""; for (int i = 0; i < 3; i ++) { - material.ambient[i] = material.diffuse[i] = material.specular[i] = material.transmittance[i] = 0.0; + material.ambient[i] = 0.f; + material.diffuse[i] = 0.f; + material.specular[i] = 0.f; + material.transmittance[i] = 0.f; + material.emission[i] = 0.f; } + material.shininess = 1.f; } std::string LoadMtl ( @@ -346,7 +355,64 @@ std::string LoadMtl ( material.specular[2] = b; continue; } - // Ignore unknown command. + + // emission + if(token[0] == 'K' && token[1] == 'e' && isSpace(token[2])) { + token += 2; + float r, g, b; + parseFloat3(r, g, b, token); + material.emission[0] = r; + material.emission[1] = g; + material.emission[2] = b; + continue; + } + + // shininess + if(token[0] == 'N' && token[1] == 's' && isSpace(token[2])) { + token += 2; + material.shininess = parseFloat(token); + continue; + } + + // ambient texture + if ((0 == strncmp(token, "map_Ka", 6)) && isSpace(token[6])) { + token += 7; + material.ambient_texname = token; + continue; + } + + // diffuse texture + if ((0 == strncmp(token, "map_Kd", 6)) && isSpace(token[6])) { + token += 7; + material.diffuse_texname = token; + continue; + } + + // specular texture + if ((0 == strncmp(token, "map_Ks", 6)) && isSpace(token[6])) { + token += 7; + material.specular_texname = token; + continue; + } + + // normal texture + if ((0 == strncmp(token, "map_Ns", 6)) && isSpace(token[6])) { + token += 7; + material.normal_texname = token; + continue; + } + + // unknown parameter + char* _space = strchr(token, ' '); + if(!_space) { + _space = strchr(token, '\t'); + } + if(_space) { + *_space = '\0'; + std::string key = token; + std::string value = _space + 1; + material.unknown_parameter.insert(std::pair(key, value)); + } } return err.str(); diff --git a/tiny_obj_loader.h b/tiny_obj_loader.h index 4f64925..6c1adcc 100644 --- a/tiny_obj_loader.h +++ b/tiny_obj_loader.h @@ -8,6 +8,7 @@ #include #include +#include namespace tinyobj { @@ -19,10 +20,14 @@ typedef struct float diffuse[3]; float specular[3]; float transmittance[3]; + float emission[3]; + float shininess; std::string ambient_texname; std::string diffuse_texname; std::string specular_texname; + std::string normal_texname; + std::map unknown_parameter; } material_t; typedef struct