From 6372ccbef2698a8bebdf8834e0a16330cbedebec Mon Sep 17 00:00:00 2001 From: Matt Pharr Date: Wed, 9 Apr 2014 09:46:03 -0700 Subject: [PATCH] Add support for parsing 'illum' and 'd'/'Tr' statements. --- test.cc | 2 ++ tiny_obj_loader.cc | 29 +++++++++++++++++++++++++++++ tiny_obj_loader.h | 3 +++ 3 files changed, 34 insertions(+) diff --git a/test.cc b/test.cc index 578e96f..4ee4adc 100644 --- a/test.cc +++ b/test.cc @@ -47,6 +47,8 @@ TestLoadObj( 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.Ni = %f\n", shapes[i].material.ior); + printf(" material.dissolve = %f\n", shapes[i].material.dissolve); + printf(" material.illum = %d\n", shapes[i].material.illum); 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()); diff --git a/tiny_obj_loader.cc b/tiny_obj_loader.cc index bd3b3f2..c55d2ca 100644 --- a/tiny_obj_loader.cc +++ b/tiny_obj_loader.cc @@ -88,6 +88,14 @@ static inline std::string parseString(const char*& token) return s; } +static inline int parseInt(const char*& token) +{ + token += strspn(token, " \t"); + int i = atoi(token); + token += strcspn(token, " \t\r"); + return i; +} + static inline float parseFloat(const char*& token) { token += strspn(token, " \t"); @@ -269,6 +277,8 @@ void InitMaterial(material_t& material) { material.transmittance[i] = 0.f; material.emission[i] = 0.f; } + material.illum = 0; + material.dissolve = 1.f; material.shininess = 1.f; material.unknown_parameter.clear(); } @@ -411,6 +421,25 @@ std::string LoadMtl ( continue; } + // illum model + if (0 == strncmp(token, "illum", 5) && isSpace(token[5])) { + token += 6; + material.illum = parseInt(token); + continue; + } + + // dissolve + if ((token[0] == 'd' && isSpace(token[1]))) { + token += 1; + material.dissolve = parseFloat(token); + continue; + } + if (token[0] == 'T' && token[1] == 'r' && isSpace(token[2])) { + token += 2; + material.dissolve = parseFloat(token); + continue; + } + // ambient texture if ((0 == strncmp(token, "map_Ka", 6)) && isSpace(token[6])) { token += 7; diff --git a/tiny_obj_loader.h b/tiny_obj_loader.h index a5324eb..7bc68cf 100644 --- a/tiny_obj_loader.h +++ b/tiny_obj_loader.h @@ -23,6 +23,9 @@ typedef struct float emission[3]; float shininess; float ior; // index of refraction + float dissolve; // 1 == opaque; 0 == fully transparent + // illumination model (see http://www.fileformat.info/format/material/) + int illum; std::string ambient_texname; std::string diffuse_texname;