fixes in rendering

This commit is contained in:
Erwin Coumans
2016-05-13 18:45:56 -07:00
parent 6a9c54c4ef
commit d186320f30
12 changed files with 223 additions and 103 deletions

View File

@@ -30,6 +30,40 @@
namespace tinyobj {
//See http://stackoverflow.com/questions/6089231/getting-std-ifstream-to-handle-lf-cr-and-crlf
std::istream& safeGetline(std::istream& is, std::string& t)
{
t.clear();
// The characters in the stream are read one-by-one using a std::streambuf.
// That is faster than reading them one-by-one using the std::istream.
// Code that uses streambuf this way must be guarded by a sentry object.
// The sentry object performs various tasks,
// such as thread synchronization and updating the stream state.
std::istream::sentry se(is, true);
std::streambuf* sb = is.rdbuf();
for(;;) {
int c = sb->sbumpc();
switch (c) {
case '\n':
return is;
case '\r':
if(sb->sgetc() == '\n')
sb->sbumpc();
return is;
case EOF:
// Also handle the case when the last line has no line ending
if(t.empty())
is.setstate(std::ios::eofbit);
return is;
default:
t += (char)c;
}
}
}
struct vertex_index {
int v_idx, vt_idx, vn_idx, dummy;
};
@@ -313,9 +347,11 @@ std::string LoadMtl (
int maxchars = 8192; // Alloc enough size.
std::vector<char> buf(maxchars); // Alloc enough size.
while (ifs.peek() != -1) {
ifs.getline(&buf[0], maxchars);
std::string linebuf(&buf[0]);
std::string linebuf;
safeGetline(ifs,linebuf);
// Trim newline '\r\n' or '\r'
if (linebuf.size() > 0) {
@@ -502,9 +538,9 @@ LoadObj(
int maxchars = 8192; // Alloc enough size.
std::vector<char> buf(maxchars); // Alloc enough size.
while (ifs.peek() != -1) {
ifs.getline(&buf[0], maxchars);
std::string linebuf(&buf[0]);
std::string linebuf;
safeGetline(ifs,linebuf);
// Trim newline '\r\n' or '\r'
if (linebuf.size() > 0) {