Allow skipping material reads on LoadObj istream overload

This commit is contained in:
Merlyn Morgan-Graham
2016-10-02 00:52:19 -07:00
parent 3ddad1e377
commit 71cc967f42

View File

@@ -209,7 +209,7 @@ bool LoadObjWithCallback(std::istream &inStream, const callback_t &callback,
/// Returns warning and error message into `err` /// Returns warning and error message into `err`
bool LoadObj(attrib_t *attrib, std::vector<shape_t> *shapes, bool LoadObj(attrib_t *attrib, std::vector<shape_t> *shapes,
std::vector<material_t> *materials, std::string *err, std::vector<material_t> *materials, std::string *err,
std::istream *inStream, MaterialReader *readMatFn, std::istream *inStream, MaterialReader *readMatFn = NULL,
bool triangulate = true); bool triangulate = true);
/// Loads materials into std::map /// Loads materials into std::map
@@ -1042,7 +1042,8 @@ bool LoadObj(attrib_t *attrib, std::vector<shape_t> *shapes,
bool LoadObj(attrib_t *attrib, std::vector<shape_t> *shapes, bool LoadObj(attrib_t *attrib, std::vector<shape_t> *shapes,
std::vector<material_t> *materials, std::string *err, std::vector<material_t> *materials, std::string *err,
std::istream *inStream, MaterialReader *readMatFn, std::istream *inStream,
MaterialReader *readMatFn /*= NULL*/,
bool triangulate) { bool triangulate) {
std::stringstream errss; std::stringstream errss;
@@ -1173,23 +1174,25 @@ bool LoadObj(attrib_t *attrib, std::vector<shape_t> *shapes,
// load mtl // load mtl
if ((0 == strncmp(token, "mtllib", 6)) && IS_SPACE((token[6]))) { if ((0 == strncmp(token, "mtllib", 6)) && IS_SPACE((token[6]))) {
char namebuf[TINYOBJ_SSCANF_BUFFER_SIZE]; if (readMatFn) {
token += 7; char namebuf[TINYOBJ_SSCANF_BUFFER_SIZE];
token += 7;
#ifdef _MSC_VER #ifdef _MSC_VER
sscanf_s(token, "%s", namebuf, (unsigned)_countof(namebuf)); sscanf_s(token, "%s", namebuf, (unsigned)_countof(namebuf));
#else #else
sscanf(token, "%s", namebuf); sscanf(token, "%s", namebuf);
#endif #endif
std::string err_mtl; std::string err_mtl;
bool ok = (*readMatFn)(namebuf, materials, &material_map, &err_mtl); bool ok = (*readMatFn)(namebuf, materials, &material_map, &err_mtl);
if (err) { if (err) {
(*err) += err_mtl; (*err) += err_mtl;
} }
if (!ok) { if (!ok) {
faceGroup.clear(); // for safety faceGroup.clear(); // for safety
return false; return false;
}
} }
continue; continue;