fixed obj parsing with cstype

pull/4403/head
Jaroslav Přibyl 2022-02-22 01:32:41 +01:00
parent ba785910d1
commit 62c9347985
1 changed files with 26 additions and 0 deletions

View File

@ -117,6 +117,7 @@ void ObjFileParser::parseFile(IOStreamBuffer<char> &streamBuffer) {
unsigned int processed = 0; unsigned int processed = 0;
size_t lastFilePos(0); size_t lastFilePos(0);
bool insideCstype = false;
std::vector<char> buffer; std::vector<char> buffer;
while (streamBuffer.getNextDataLine(buffer, '\\')) { while (streamBuffer.getNextDataLine(buffer, '\\')) {
m_DataIt = buffer.begin(); m_DataIt = buffer.begin();
@ -131,6 +132,23 @@ void ObjFileParser::parseFile(IOStreamBuffer<char> &streamBuffer) {
m_progress->UpdateFileRead(processed, progressTotal); m_progress->UpdateFileRead(processed, progressTotal);
} }
// handle cstype (http://paulbourke.net/dataformats/obj/) which contains parm property which is handled by the parser as fase, but is not
// cstype bspline
// deg 1
// curv 0 4.4342367553943109 468085 ...
// parm u 0 0 0.39203731404307385 ...
// end
if (insideCstype) {
switch (*m_DataIt) {
case 'e': {
std::string name;
getNameNoSpace(m_DataIt, m_DataItEnd, name);
insideCstype = name != "end";
} break;
}
goto pf_skip_line;
}
// parse line // parse line
switch (*m_DataIt) { switch (*m_DataIt) {
case 'v': // Parse a vertex texture coordinate case 'v': // Parse a vertex texture coordinate
@ -219,6 +237,14 @@ void ObjFileParser::parseFile(IOStreamBuffer<char> &streamBuffer) {
getObjectName(); getObjectName();
} break; } break;
case 'c':
{
std::string name;
getNameNoSpace(m_DataIt, m_DataItEnd, name);
insideCstype = name == "cstype";
goto pf_skip_line;
} break;
default: { default: {
pf_skip_line: pf_skip_line:
m_DataIt = skipLine<DataArrayIt>(m_DataIt, m_DataItEnd, m_uiLine); m_DataIt = skipLine<DataArrayIt>(m_DataIt, m_DataItEnd, m_uiLine);