Fix parsing of crease tags(t)
Support parsing texture filename containing whitespace.
This commit is contained in:
28
models/texture-filename-with-whitespace.mtl
Normal file
28
models/texture-filename-with-whitespace.mtl
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
newmtl white
|
||||||
|
Ka 0 0 0
|
||||||
|
Kd 1 1 1
|
||||||
|
Ks 0 0 0
|
||||||
|
# filename with white space.
|
||||||
|
map_Kd texture 01.png
|
||||||
|
|
||||||
|
newmtl red
|
||||||
|
Ka 0 0 0
|
||||||
|
Kd 1 0 0
|
||||||
|
Ks 0 0 0
|
||||||
|
# texture option + filename with white space.
|
||||||
|
bump -bm 2 bump 01.png
|
||||||
|
|
||||||
|
newmtl green
|
||||||
|
Ka 0 0 0
|
||||||
|
Kd 0 1 0
|
||||||
|
Ks 0 0 0
|
||||||
|
|
||||||
|
newmtl blue
|
||||||
|
Ka 0 0 0
|
||||||
|
Kd 0 0 1
|
||||||
|
Ks 0 0 0
|
||||||
|
|
||||||
|
newmtl light
|
||||||
|
Ka 20 20 20
|
||||||
|
Kd 1 1 1
|
||||||
|
Ks 0 0 0
|
||||||
31
models/texture-filename-with-whitespace.obj
Normal file
31
models/texture-filename-with-whitespace.obj
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
mtllib texture-filename-with-whitespace.mtl
|
||||||
|
|
||||||
|
v 0.000000 2.000000 2.000000
|
||||||
|
v 0.000000 0.000000 2.000000
|
||||||
|
v 2.000000 0.000000 2.000000
|
||||||
|
v 2.000000 2.000000 2.000000
|
||||||
|
v 0.000000 2.000000 0.000000
|
||||||
|
v 0.000000 0.000000 0.000000
|
||||||
|
v 2.000000 0.000000 0.000000
|
||||||
|
v 2.000000 2.000000 0.000000
|
||||||
|
# 8 vertices
|
||||||
|
|
||||||
|
g front cube
|
||||||
|
usemtl white
|
||||||
|
f 1 2 3 4
|
||||||
|
g back cube
|
||||||
|
# expects white material
|
||||||
|
f 8 7 6 5
|
||||||
|
g right cube
|
||||||
|
usemtl red
|
||||||
|
f 4 3 7 8
|
||||||
|
g top cube
|
||||||
|
usemtl white
|
||||||
|
f 5 1 4 8
|
||||||
|
g left cube
|
||||||
|
usemtl green
|
||||||
|
f 5 6 2 1
|
||||||
|
g bottom cube
|
||||||
|
usemtl white
|
||||||
|
f 2 6 7 3
|
||||||
|
# 6 elements
|
||||||
@@ -694,6 +694,29 @@ TEST_CASE("zero-face-idx-value", "[Issue140]") {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("texture-name-whitespace", "[Issue145]") {
|
||||||
|
tinyobj::attrib_t attrib;
|
||||||
|
std::vector<tinyobj::shape_t> shapes;
|
||||||
|
std::vector<tinyobj::material_t> materials;
|
||||||
|
|
||||||
|
std::string err;
|
||||||
|
bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &err, "../models/texture-filename-with-whitespace.obj", gMtlBasePath);
|
||||||
|
|
||||||
|
|
||||||
|
if (!err.empty()) {
|
||||||
|
std::cerr << "[Issue145] " << err << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
REQUIRE(true == ret);
|
||||||
|
REQUIRE(err.empty());
|
||||||
|
REQUIRE(2 < materials.size());
|
||||||
|
|
||||||
|
REQUIRE(0 == materials[0].diffuse_texname.compare("texture 01.png"));
|
||||||
|
REQUIRE(0 == materials[1].bump_texname.compare("bump 01.png"));
|
||||||
|
REQUIRE(2 == Approx(materials[1].bump_texopt.bump_multiplier));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
int
|
int
|
||||||
main(
|
main(
|
||||||
|
|||||||
@@ -721,22 +721,24 @@ static inline texture_type_t parseTextureType(
|
|||||||
static tag_sizes parseTagTriple(const char **token) {
|
static tag_sizes parseTagTriple(const char **token) {
|
||||||
tag_sizes ts;
|
tag_sizes ts;
|
||||||
|
|
||||||
|
(*token) += strspn((*token), " \t");
|
||||||
ts.num_ints = atoi((*token));
|
ts.num_ints = atoi((*token));
|
||||||
(*token) += strcspn((*token), "/ \t\r");
|
(*token) += strcspn((*token), "/ \t\r");
|
||||||
if ((*token)[0] != '/') {
|
if ((*token)[0] != '/') {
|
||||||
return ts;
|
return ts;
|
||||||
}
|
}
|
||||||
(*token)++;
|
|
||||||
|
|
||||||
|
(*token)++; // Skip '/'
|
||||||
|
|
||||||
|
(*token) += strspn((*token), " \t");
|
||||||
ts.num_reals = atoi((*token));
|
ts.num_reals = atoi((*token));
|
||||||
(*token) += strcspn((*token), "/ \t\r");
|
(*token) += strcspn((*token), "/ \t\r");
|
||||||
if ((*token)[0] != '/') {
|
if ((*token)[0] != '/') {
|
||||||
return ts;
|
return ts;
|
||||||
}
|
}
|
||||||
(*token)++;
|
(*token)++; // Skip '/'
|
||||||
|
|
||||||
ts.num_strings = atoi((*token));
|
ts.num_strings = parseInt(token);
|
||||||
(*token) += strcspn((*token), "/ \t\r") + 1;
|
|
||||||
|
|
||||||
return ts;
|
return ts;
|
||||||
}
|
}
|
||||||
@@ -906,11 +908,18 @@ static bool ParseTextureNameAndOption(std::string *texname,
|
|||||||
parseReal2(&(texopt->brightness), &(texopt->contrast), &token, 0.0, 1.0);
|
parseReal2(&(texopt->brightness), &(texopt->contrast), &token, 0.0, 1.0);
|
||||||
} else {
|
} else {
|
||||||
// Assume texture filename
|
// Assume texture filename
|
||||||
|
#if 0
|
||||||
size_t len = strcspn(token, " \t\r"); // untile next space
|
size_t len = strcspn(token, " \t\r"); // untile next space
|
||||||
texture_name = std::string(token, token + len);
|
texture_name = std::string(token, token + len);
|
||||||
token += len;
|
token += len;
|
||||||
|
|
||||||
token += strspn(token, " \t"); // skip space
|
token += strspn(token, " \t"); // skip space
|
||||||
|
#else
|
||||||
|
// Read filename until line end to parse filename containing whitespace
|
||||||
|
// TODO(syoyo): Support parsing texture option flag after the filename.
|
||||||
|
texture_name = std::string(token);
|
||||||
|
token += texture_name.length();
|
||||||
|
#endif
|
||||||
|
|
||||||
found_texname = true;
|
found_texname = true;
|
||||||
}
|
}
|
||||||
@@ -1762,33 +1771,25 @@ bool LoadObj(attrib_t *attrib, std::vector<shape_t> *shapes,
|
|||||||
tag_t tag;
|
tag_t tag;
|
||||||
|
|
||||||
token += 2;
|
token += 2;
|
||||||
std::stringstream ss;
|
|
||||||
ss << token;
|
|
||||||
tag.name = ss.str();
|
|
||||||
|
|
||||||
token += tag.name.size() + 1;
|
tag.name = parseString(&token);
|
||||||
|
|
||||||
tag_sizes ts = parseTagTriple(&token);
|
tag_sizes ts = parseTagTriple(&token);
|
||||||
|
|
||||||
tag.intValues.resize(static_cast<size_t>(ts.num_ints));
|
tag.intValues.resize(static_cast<size_t>(ts.num_ints));
|
||||||
|
|
||||||
for (size_t i = 0; i < static_cast<size_t>(ts.num_ints); ++i) {
|
for (size_t i = 0; i < static_cast<size_t>(ts.num_ints); ++i) {
|
||||||
tag.intValues[i] = atoi(token);
|
tag.intValues[i] = parseInt(&token);
|
||||||
token += strcspn(token, "/ \t\r") + 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tag.floatValues.resize(static_cast<size_t>(ts.num_reals));
|
tag.floatValues.resize(static_cast<size_t>(ts.num_reals));
|
||||||
for (size_t i = 0; i < static_cast<size_t>(ts.num_reals); ++i) {
|
for (size_t i = 0; i < static_cast<size_t>(ts.num_reals); ++i) {
|
||||||
tag.floatValues[i] = parseReal(&token);
|
tag.floatValues[i] = parseReal(&token);
|
||||||
token += strcspn(token, "/ \t\r") + 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tag.stringValues.resize(static_cast<size_t>(ts.num_strings));
|
tag.stringValues.resize(static_cast<size_t>(ts.num_strings));
|
||||||
for (size_t i = 0; i < static_cast<size_t>(ts.num_strings); ++i) {
|
for (size_t i = 0; i < static_cast<size_t>(ts.num_strings); ++i) {
|
||||||
std::stringstream sstr;
|
tag.stringValues[i] = parseString(&token);
|
||||||
sstr << token;
|
|
||||||
tag.stringValues[i] = sstr.str();
|
|
||||||
token += tag.stringValues[i].size() + 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tags.push_back(tag);
|
tags.push_back(tag);
|
||||||
|
|||||||
Reference in New Issue
Block a user