diff --git a/code/AssetLib/Obj/ObjFileParser.cpp b/code/AssetLib/Obj/ObjFileParser.cpp index 0278abfa2..70df754ac 100644 --- a/code/AssetLib/Obj/ObjFileParser.cpp +++ b/code/AssetLib/Obj/ObjFileParser.cpp @@ -140,9 +140,11 @@ void ObjFileParser::parseFile(IOStreamBuffer &streamBuffer) { if (insideCstype) { switch (*m_DataIt) { case 'e': { - std::string name; - getNameNoSpace(m_DataIt, m_DataItEnd, name); - insideCstype = name != "end"; + char *name{nullptr}; + size_t len{0}; + getNameNoSpace(m_DataIt, m_DataItEnd, &name, len); + //insideCstype = name != "end"; + insideCstype = strncmp(name, "end", len) == 0; } break; } goto pf_skip_line; @@ -198,32 +200,37 @@ void ObjFileParser::parseFile(IOStreamBuffer &streamBuffer) { case 'u': // Parse a material desc. setter { - std::string name; + //std::string name; + char *name{nullptr}; + size_t len{ 0 }; + getNameNoSpace(m_DataIt, m_DataItEnd, &name, len); - getNameNoSpace(m_DataIt, m_DataItEnd, name); + //size_t nextSpace = name.find(' '); + //if (nextSpace != std::string::npos) + // name = name.substr(0, nextSpace); - size_t nextSpace = name.find(' '); - if (nextSpace != std::string::npos) - name = name.substr(0, nextSpace); - - if (name == "usemtl") { + //if (name == "usemtl") { + if (strncmp(name, "usemtl", len) == 0) { getMaterialDesc(); } } break; case 'm': // Parse a material library or merging group ('mg') { - std::string name; +// std::string name; + char *name{nullptr}; + size_t len{ 0 }; + getNameNoSpace(m_DataIt, m_DataItEnd, &name, len); - getNameNoSpace(m_DataIt, m_DataItEnd, name); + //size_t nextSpace = name.find(' '); + //if (nextSpace != std::string::npos) + // name = name.substr(0, nextSpace); - size_t nextSpace = name.find(' '); - if (nextSpace != std::string::npos) - name = name.substr(0, nextSpace); - - if (name == "mg") + if (strncmp(name, "mg", len) == 0) + //if (name == "mg") getGroupNumberAndResolution(); - else if (name == "mtllib") + //else if (name == "mtllib") + else if (strncmp(name, "mtllib", len) == 0) getMaterialLib(); else goto pf_skip_line; @@ -246,9 +253,12 @@ void ObjFileParser::parseFile(IOStreamBuffer &streamBuffer) { case 'c': // handle cstype section start { - std::string name; - getNameNoSpace(m_DataIt, m_DataItEnd, name); - insideCstype = name == "cstype"; + //std::string name; + char *name{nullptr}; + size_t len{0}; + getNameNoSpace(m_DataIt, m_DataItEnd, &name, len); + //insideCstype = name == "cstype"; + insideCstype = strncmp(name, "cstype", len) == 0; goto pf_skip_line; } diff --git a/code/AssetLib/Obj/ObjTools.h b/code/AssetLib/Obj/ObjTools.h index b6407c2c8..31bc09d45 100644 --- a/code/AssetLib/Obj/ObjTools.h +++ b/code/AssetLib/Obj/ObjTools.h @@ -177,8 +177,9 @@ inline char_t getName(char_t it, char_t end, std::string &name) { * @return Current-iterator with new position */ template -inline char_t getNameNoSpace(char_t it, char_t end, std::string &name) { - name = ""; +inline char_t getNameNoSpace(char_t it, char_t end, char **name, size_t &len) { + *name = nullptr; + len = 0; if (isEndOfBuffer(it, end)) { return end; } @@ -186,22 +187,23 @@ inline char_t getNameNoSpace(char_t it, char_t end, std::string &name) { char *pStart = &(*it); while (!isEndOfBuffer(it, end) && !IsLineEnd(*it) && !IsSpaceOrNewLine(*it)) { ++it; + ++len; } while (isEndOfBuffer(it, end) || IsLineEnd(*it) || IsSpaceOrNewLine(*it)) { --it; + --len; } ++it; + ++len; // Get name // if there is no name, and the previous char is a separator, come back to start while (&(*it) < pStart) { ++it; + ++len; } - std::string strName(pStart, &(*it)); - if (!strName.empty()) { - name = strName; - } + *name = pStart; return it; }