update .mtl loader (Ke, Ns, map_Ka, map_Kd, map_Ks, map_Ns)

This commit is contained in:
YarmUI
2012-08-21 18:35:37 +09:00
parent 66528fbd6c
commit d62fdaf89d
3 changed files with 81 additions and 4 deletions

View File

@@ -8,7 +8,7 @@ main(
int argc,
char **argv)
{
std::string inputfile = "cornell_box.obj";
std::string inputfile = "test.obj";
std::vector<tinyobj::shape_t> 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");
}

View File

@@ -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<std::string, std::string>(key, value));
}
}
return err.str();

View File

@@ -8,6 +8,7 @@
#include <string>
#include <vector>
#include <map>
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<std::string, std::string> unknown_parameter;
} material_t;
typedef struct