Merge pull request #89 from adishavit/develop
Crash bug fix + optimizations in LoadObjWithCallback()
This commit is contained in:
@@ -1323,8 +1323,15 @@ bool LoadObjWithCallback(void *user_data, const callback_t &callback,
|
|||||||
std::map<std::string, int> material_map;
|
std::map<std::string, int> material_map;
|
||||||
int material_id = -1; // -1 = invalid
|
int material_id = -1; // -1 = invalid
|
||||||
|
|
||||||
while (inStream->peek() != -1) {
|
std::vector<index_t> indices;
|
||||||
|
std::vector<material_t> materials;
|
||||||
|
std::vector<std::string> names;
|
||||||
|
names.reserve(2);
|
||||||
|
std::string name;
|
||||||
|
std::vector<const char *> names_out;
|
||||||
|
|
||||||
std::string linebuf;
|
std::string linebuf;
|
||||||
|
while (inStream->peek() != -1) {
|
||||||
std::getline(*inStream, linebuf);
|
std::getline(*inStream, linebuf);
|
||||||
|
|
||||||
// Trim newline '\r\n' or '\n'
|
// Trim newline '\r\n' or '\n'
|
||||||
@@ -1389,7 +1396,7 @@ bool LoadObjWithCallback(void *user_data, const callback_t &callback,
|
|||||||
token += 2;
|
token += 2;
|
||||||
token += strspn(token, " \t");
|
token += strspn(token, " \t");
|
||||||
|
|
||||||
std::vector<index_t> indices;
|
indices.clear();
|
||||||
while (!IS_NEW_LINE(token[0])) {
|
while (!IS_NEW_LINE(token[0])) {
|
||||||
vertex_index vi = parseRawTriple(&token);
|
vertex_index vi = parseRawTriple(&token);
|
||||||
|
|
||||||
@@ -1440,6 +1447,7 @@ bool LoadObjWithCallback(void *user_data, const callback_t &callback,
|
|||||||
|
|
||||||
// load mtl
|
// load mtl
|
||||||
if ((0 == strncmp(token, "mtllib", 6)) && IS_SPACE((token[6]))) {
|
if ((0 == strncmp(token, "mtllib", 6)) && IS_SPACE((token[6]))) {
|
||||||
|
if (readMatFn) {
|
||||||
char namebuf[TINYOBJ_SSCANF_BUFFER_SIZE];
|
char namebuf[TINYOBJ_SSCANF_BUFFER_SIZE];
|
||||||
token += 7;
|
token += 7;
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
@@ -1449,7 +1457,7 @@ bool LoadObjWithCallback(void *user_data, const callback_t &callback,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
std::string err_mtl;
|
std::string err_mtl;
|
||||||
std::vector<material_t> materials;
|
materials.clear();
|
||||||
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;
|
||||||
@@ -1463,14 +1471,14 @@ bool LoadObjWithCallback(void *user_data, const callback_t &callback,
|
|||||||
callback.mtllib_cb(user_data, &materials.at(0),
|
callback.mtllib_cb(user_data, &materials.at(0),
|
||||||
static_cast<int>(materials.size()));
|
static_cast<int>(materials.size()));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// group name
|
// group name
|
||||||
if (token[0] == 'g' && IS_SPACE((token[1]))) {
|
if (token[0] == 'g' && IS_SPACE((token[1]))) {
|
||||||
std::vector<std::string> names;
|
names.clear();
|
||||||
names.reserve(2);
|
|
||||||
|
|
||||||
while (!IS_NEW_LINE(token[0])) {
|
while (!IS_NEW_LINE(token[0])) {
|
||||||
std::string str = parseString(&token);
|
std::string str = parseString(&token);
|
||||||
@@ -1480,23 +1488,22 @@ bool LoadObjWithCallback(void *user_data, const callback_t &callback,
|
|||||||
|
|
||||||
assert(names.size() > 0);
|
assert(names.size() > 0);
|
||||||
|
|
||||||
std::string name;
|
|
||||||
// names[0] must be 'g', so skip the 0th element.
|
// names[0] must be 'g', so skip the 0th element.
|
||||||
if (names.size() > 1) {
|
if (names.size() > 1) {
|
||||||
name = names[1];
|
name = names[1];
|
||||||
} else {
|
} else {
|
||||||
name = "";
|
name.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (callback.group_cb) {
|
if (callback.group_cb) {
|
||||||
if (names.size() > 1) {
|
if (names.size() > 1) {
|
||||||
// create const char* array.
|
// create const char* array.
|
||||||
std::vector<const char *> tmp(names.size() - 1);
|
names_out.resize(names.size() - 1);
|
||||||
for (size_t j = 0; j < tmp.size(); j++) {
|
for (size_t j = 0; j < names_out.size(); j++) {
|
||||||
tmp[j] = names[j + 1].c_str();
|
names_out[j] = names[j + 1].c_str();
|
||||||
}
|
}
|
||||||
callback.group_cb(user_data, &tmp.at(0),
|
callback.group_cb(user_data, &names_out.at(0),
|
||||||
static_cast<int>(tmp.size()));
|
static_cast<int>(names_out.size()));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
callback.group_cb(user_data, NULL, 0);
|
callback.group_cb(user_data, NULL, 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user