Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit bd36e2c

Browse files
committed
Fix mtllib reloading: load a mtl file only once
1 parent dec0ff0 commit bd36e2c

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

tiny_obj_loader.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2445,6 +2445,7 @@ bool LoadObj(attrib_t *attrib, std::vector<shape_t> *shapes,
24452445
std::string name;
24462446

24472447
// material
2448+
std::map<std::string, std::map<std::string, int> > material_maps;
24482449
std::map<std::string, int> material_map;
24492450
int material = -1;
24502451

@@ -2735,10 +2736,21 @@ bool LoadObj(attrib_t *attrib, std::vector<shape_t> *shapes,
27352736
} else {
27362737
bool found = false;
27372738
for (size_t s = 0; s < filenames.size(); s++) {
2739+
std::map<std::string, std::map<std::string, int> >::const_iterator
2740+
material_map_it = material_maps.find(filenames[s]);
2741+
if (material_map_it != material_maps.end()) {
2742+
found = true;
2743+
material_map = material_map_it->second;
2744+
continue;
2745+
}
2746+
27382747
std::string warn_mtl;
27392748
std::string err_mtl;
27402749
bool ok = (*readMatFn)(filenames[s].c_str(), materials,
27412750
&material_map, &warn_mtl, &err_mtl);
2751+
material_maps.insert(
2752+
std::pair<std::string, std::map<std::string, int> >(
2753+
filenames[s], material_map));
27422754
if (warn && (!warn_mtl.empty())) {
27432755
(*warn) += warn_mtl;
27442756
}
@@ -2993,6 +3005,7 @@ bool LoadObjWithCallback(std::istream &inStream, const callback_t &callback,
29933005
std::stringstream errss;
29943006

29953007
// material
3008+
std::map<std::string, std::map<std::string, int> > material_maps;
29963009
std::map<std::string, int> material_map;
29973010
int material_id = -1; // -1 = invalid
29983011

@@ -3138,10 +3151,21 @@ bool LoadObjWithCallback(std::istream &inStream, const callback_t &callback,
31383151
} else {
31393152
bool found = false;
31403153
for (size_t s = 0; s < filenames.size(); s++) {
3154+
std::map<std::string, std::map<std::string, int> >::const_iterator
3155+
material_map_it = material_maps.find(filenames[s]);
3156+
if (material_map_it != material_maps.end()) {
3157+
found = true;
3158+
material_map = material_map_it->second;
3159+
continue;
3160+
}
3161+
31413162
std::string warn_mtl;
31423163
std::string err_mtl;
31433164
bool ok = (*readMatFn)(filenames[s].c_str(), &materials,
31443165
&material_map, &warn_mtl, &err_mtl);
3166+
material_maps.insert(
3167+
std::pair<std::string, std::map<std::string, int> >(
3168+
filenames[s], material_map));
31453169

31463170
if (warn && (!warn_mtl.empty())) {
31473171
(*warn) += warn_mtl; // This should be warn message.

0 commit comments

Comments
 (0)