Fix loaders
parent
0d2d17e044
commit
a5583f3ec5
|
@ -206,9 +206,9 @@ bool MD5Parser::ParseSection(Section &out) {
|
|||
if (buffer == bufferEnd)
|
||||
return false;
|
||||
while (IsSpaceOrNewLine(*buffer)) {
|
||||
++buffer;
|
||||
if (buffer == bufferEnd)
|
||||
return false;
|
||||
break;
|
||||
++buffer;
|
||||
}
|
||||
return '\0' != *buffer;
|
||||
}
|
||||
|
@ -217,34 +217,36 @@ bool MD5Parser::ParseSection(Section &out) {
|
|||
// Some dirty macros just because they're so funny and easy to debug
|
||||
|
||||
// skip all spaces ... handle EOL correctly
|
||||
inline void AI_MD5_SKIP_SPACES(const char *sz, const char *bufferEnd, int linenumber) {
|
||||
if (!SkipSpaces(&sz, bufferEnd))
|
||||
inline void AI_MD5_SKIP_SPACES(const char **sz, const char *bufferEnd, int linenumber) {
|
||||
if (!SkipSpaces(sz, bufferEnd)) {
|
||||
MD5Parser::ReportWarning("Unexpected end of line", linenumber);
|
||||
}
|
||||
}
|
||||
|
||||
// read a triple float in brackets: (1.0 1.0 1.0)
|
||||
inline void AI_MD5_READ_TRIPLE(aiVector3D &vec, const char *sz, const char *bufferEnd, int linenumber) {
|
||||
inline void AI_MD5_READ_TRIPLE(aiVector3D &vec, const char **sz, const char *bufferEnd, int linenumber) {
|
||||
AI_MD5_SKIP_SPACES(sz, bufferEnd, linenumber);
|
||||
if ('(' != *sz++)
|
||||
if ('(' != **sz++)
|
||||
MD5Parser::ReportWarning("Unexpected token: ( was expected", linenumber);
|
||||
AI_MD5_SKIP_SPACES(sz, bufferEnd, linenumber);
|
||||
sz = fast_atoreal_move<float>(sz, (float &)vec.x);
|
||||
*sz = fast_atoreal_move<float>(*sz, (float &)vec.x);
|
||||
AI_MD5_SKIP_SPACES(sz, bufferEnd, linenumber);
|
||||
sz = fast_atoreal_move<float>(sz, (float &)vec.y);
|
||||
*sz = fast_atoreal_move<float>(*sz, (float &)vec.y);
|
||||
AI_MD5_SKIP_SPACES(sz, bufferEnd, linenumber);
|
||||
sz = fast_atoreal_move<float>(sz, (float &)vec.z);
|
||||
*sz = fast_atoreal_move<float>(*sz, (float &)vec.z);
|
||||
AI_MD5_SKIP_SPACES(sz, bufferEnd, linenumber);
|
||||
if (')' != *sz++)
|
||||
if (')' != **sz++) {
|
||||
MD5Parser::ReportWarning("Unexpected token: ) was expected", linenumber);
|
||||
}
|
||||
}
|
||||
|
||||
// parse a string, enclosed in quotation marks or not
|
||||
inline bool AI_MD5_PARSE_STRING(const char *sz, aiString &out, int linenumber) {
|
||||
bool bQuota = (*sz == '\"');
|
||||
const char *szStart = sz;
|
||||
inline bool AI_MD5_PARSE_STRING(const char **sz, aiString &out, int linenumber) {
|
||||
bool bQuota = (**sz == '\"');
|
||||
const char *szStart = *sz;
|
||||
while (!IsSpaceOrNewLine(*sz))
|
||||
++sz;
|
||||
const char *szEnd = sz;
|
||||
const char *szEnd = *sz;
|
||||
if (bQuota) {
|
||||
szStart++;
|
||||
if ('\"' != *(szEnd -= 1)) {
|
||||
|
@ -258,16 +260,16 @@ inline bool AI_MD5_PARSE_STRING(const char *sz, aiString &out, int linenumber) {
|
|||
}
|
||||
|
||||
// parse a string, enclosed in quotation marks
|
||||
inline void AI_MD5_PARSE_STRING_IN_QUOTATION(const char *sz, aiString &out) {
|
||||
inline void AI_MD5_PARSE_STRING_IN_QUOTATION(const char **sz, aiString &out) {
|
||||
out.length = 0u;
|
||||
while ('\"' != *sz && '\0' != *sz)
|
||||
while ('\"' != **sz && '\0' != *sz)
|
||||
++sz;
|
||||
if ('\0' != *sz) {
|
||||
const char *szStart = ++sz;
|
||||
while ('\"' != *sz && '\0' != *sz)
|
||||
const char *szStart = ++(*sz);
|
||||
while ('\"' != **sz && '\0' != *sz)
|
||||
++sz;
|
||||
if ('\0' != *sz) {
|
||||
const char *szEnd = (sz++);
|
||||
const char *szEnd = (*sz++);
|
||||
out.length = (ai_uint32)(szEnd - szStart);
|
||||
::memcpy(out.data, szStart, out.length);
|
||||
}
|
||||
|
@ -292,15 +294,15 @@ MD5MeshParser::MD5MeshParser(SectionArray &mSections) {
|
|||
BoneDesc &desc = mJoints.back();
|
||||
|
||||
const char *sz = elem.szStart;
|
||||
AI_MD5_PARSE_STRING_IN_QUOTATION(sz, desc.mName);
|
||||
AI_MD5_PARSE_STRING_IN_QUOTATION(&sz, desc.mName);
|
||||
|
||||
AI_MD5_SKIP_SPACES(sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber);
|
||||
|
||||
// negative values, at least -1, is allowed here
|
||||
desc.mParentIndex = (int)strtol10(sz, &sz);
|
||||
|
||||
AI_MD5_READ_TRIPLE(desc.mPositionXYZ, sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_READ_TRIPLE(desc.mRotationQuat, sz, elem.end, elem.iLineNumber); // normalized quaternion, so w is not there
|
||||
AI_MD5_READ_TRIPLE(desc.mPositionXYZ, &sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_READ_TRIPLE(desc.mRotationQuat, &sz, elem.end, elem.iLineNumber); // normalized quaternion, so w is not there
|
||||
}
|
||||
} else if ((*iter).mName == "mesh") {
|
||||
mMeshes.emplace_back();
|
||||
|
@ -311,52 +313,52 @@ MD5MeshParser::MD5MeshParser(SectionArray &mSections) {
|
|||
|
||||
// shader attribute
|
||||
if (TokenMatch(sz, "shader", 6)) {
|
||||
AI_MD5_SKIP_SPACES(sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_PARSE_STRING_IN_QUOTATION(sz, desc.mShader);
|
||||
AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_PARSE_STRING_IN_QUOTATION(&sz, desc.mShader);
|
||||
}
|
||||
// numverts attribute
|
||||
else if (TokenMatch(sz, "numverts", 8)) {
|
||||
AI_MD5_SKIP_SPACES(sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber);
|
||||
desc.mVertices.resize(strtoul10(sz));
|
||||
}
|
||||
// numtris attribute
|
||||
else if (TokenMatch(sz, "numtris", 7)) {
|
||||
AI_MD5_SKIP_SPACES(sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber);
|
||||
desc.mFaces.resize(strtoul10(sz));
|
||||
}
|
||||
// numweights attribute
|
||||
else if (TokenMatch(sz, "numweights", 10)) {
|
||||
AI_MD5_SKIP_SPACES(sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber);
|
||||
desc.mWeights.resize(strtoul10(sz));
|
||||
}
|
||||
// vert attribute
|
||||
// "vert 0 ( 0.394531 0.513672 ) 0 1"
|
||||
else if (TokenMatch(sz, "vert", 4)) {
|
||||
AI_MD5_SKIP_SPACES(sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber);
|
||||
const unsigned int idx = ::strtoul10(sz, &sz);
|
||||
AI_MD5_SKIP_SPACES(sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber);
|
||||
if (idx >= desc.mVertices.size())
|
||||
desc.mVertices.resize(idx + 1);
|
||||
|
||||
VertexDesc &vert = desc.mVertices[idx];
|
||||
if ('(' != *sz++)
|
||||
MD5Parser::ReportWarning("Unexpected token: ( was expected", elem.iLineNumber);
|
||||
AI_MD5_SKIP_SPACES(sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber);
|
||||
sz = fast_atoreal_move<float>(sz, (float &)vert.mUV.x);
|
||||
AI_MD5_SKIP_SPACES(sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber);
|
||||
sz = fast_atoreal_move<float>(sz, (float &)vert.mUV.y);
|
||||
AI_MD5_SKIP_SPACES(sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber);
|
||||
if (')' != *sz++)
|
||||
MD5Parser::ReportWarning("Unexpected token: ) was expected", elem.iLineNumber);
|
||||
AI_MD5_SKIP_SPACES(sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber);
|
||||
vert.mFirstWeight = ::strtoul10(sz, &sz);
|
||||
AI_MD5_SKIP_SPACES(sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber);
|
||||
vert.mNumWeights = ::strtoul10(sz, &sz);
|
||||
}
|
||||
// tri attribute
|
||||
// "tri 0 15 13 12"
|
||||
else if (TokenMatch(sz, "tri", 3)) {
|
||||
AI_MD5_SKIP_SPACES(sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber);
|
||||
const unsigned int idx = strtoul10(sz, &sz);
|
||||
if (idx >= desc.mFaces.size())
|
||||
desc.mFaces.resize(idx + 1);
|
||||
|
@ -364,24 +366,24 @@ MD5MeshParser::MD5MeshParser(SectionArray &mSections) {
|
|||
aiFace &face = desc.mFaces[idx];
|
||||
face.mIndices = new unsigned int[face.mNumIndices = 3];
|
||||
for (unsigned int i = 0; i < 3; ++i) {
|
||||
AI_MD5_SKIP_SPACES(sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber);
|
||||
face.mIndices[i] = strtoul10(sz, &sz);
|
||||
}
|
||||
}
|
||||
// weight attribute
|
||||
// "weight 362 5 0.500000 ( -3.553583 11.893474 9.719339 )"
|
||||
else if (TokenMatch(sz, "weight", 6)) {
|
||||
AI_MD5_SKIP_SPACES(sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber);
|
||||
const unsigned int idx = strtoul10(sz, &sz);
|
||||
AI_MD5_SKIP_SPACES(sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber);
|
||||
if (idx >= desc.mWeights.size())
|
||||
desc.mWeights.resize(idx + 1);
|
||||
|
||||
WeightDesc &weight = desc.mWeights[idx];
|
||||
weight.mBone = strtoul10(sz, &sz);
|
||||
AI_MD5_SKIP_SPACES(sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber);
|
||||
sz = fast_atoreal_move<float>(sz, weight.mWeight);
|
||||
AI_MD5_READ_TRIPLE(weight.vOffsetPosition, sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_READ_TRIPLE(weight.vOffsetPosition, &sz, elem.end, elem.iLineNumber);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -404,18 +406,18 @@ MD5AnimParser::MD5AnimParser(SectionArray &mSections) {
|
|||
AnimBoneDesc &desc = mAnimatedBones.back();
|
||||
|
||||
const char *sz = elem.szStart;
|
||||
AI_MD5_PARSE_STRING_IN_QUOTATION(sz, desc.mName);
|
||||
AI_MD5_SKIP_SPACES(sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_PARSE_STRING_IN_QUOTATION(&sz, desc.mName);
|
||||
AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber);
|
||||
|
||||
// parent index - negative values are allowed (at least -1)
|
||||
desc.mParentIndex = ::strtol10(sz, &sz);
|
||||
|
||||
// flags (highest is 2^6-1)
|
||||
AI_MD5_SKIP_SPACES(sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber);
|
||||
if (63 < (desc.iFlags = ::strtoul10(sz, &sz))) {
|
||||
MD5Parser::ReportWarning("Invalid flag combination in hierarchy section", elem.iLineNumber);
|
||||
}
|
||||
AI_MD5_SKIP_SPACES(sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_SKIP_SPACES(& sz, elem.end, elem.iLineNumber);
|
||||
|
||||
// index of the first animation keyframe component for this joint
|
||||
desc.iFirstKeyIndex = ::strtoul10(sz, &sz);
|
||||
|
@ -428,8 +430,8 @@ MD5AnimParser::MD5AnimParser(SectionArray &mSections) {
|
|||
mBaseFrames.emplace_back();
|
||||
BaseFrameDesc &desc = mBaseFrames.back();
|
||||
|
||||
AI_MD5_READ_TRIPLE(desc.vPositionXYZ, sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_READ_TRIPLE(desc.vRotationQuat, sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_READ_TRIPLE(desc.vPositionXYZ, &sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_READ_TRIPLE(desc.vRotationQuat, &sz, elem.end, elem.iLineNumber);
|
||||
}
|
||||
} else if ((*iter).mName == "frame") {
|
||||
if (!(*iter).mGlobalValue.length()) {
|
||||
|
@ -497,9 +499,9 @@ MD5CameraParser::MD5CameraParser(SectionArray &mSections) {
|
|||
|
||||
frames.emplace_back();
|
||||
CameraAnimFrameDesc &cur = frames.back();
|
||||
AI_MD5_READ_TRIPLE(cur.vPositionXYZ, sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_READ_TRIPLE(cur.vRotationQuat, sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_SKIP_SPACES(sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_READ_TRIPLE(cur.vPositionXYZ, &sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_READ_TRIPLE(cur.vRotationQuat, &sz, elem.end, elem.iLineNumber);
|
||||
AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber);
|
||||
cur.fFOV = fast_atof(sz);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -120,6 +120,7 @@ void ObjFileParser::parseFile(IOStreamBuffer<char> &streamBuffer) {
|
|||
while (streamBuffer.getNextDataLine(buffer, '\\')) {
|
||||
m_DataIt = buffer.begin();
|
||||
m_DataItEnd = buffer.end();
|
||||
mEnd = &buffer[buffer.size() - 1] + 1;
|
||||
|
||||
// Handle progress reporting
|
||||
const size_t filePos(streamBuffer.getFilePos());
|
||||
|
@ -129,7 +130,7 @@ void ObjFileParser::parseFile(IOStreamBuffer<char> &streamBuffer) {
|
|||
m_progress->UpdateFileRead(processed, progressTotal);
|
||||
}
|
||||
|
||||
// handle cstype section end (http://paulbourke.net/dataformats/obj/)
|
||||
// handle c-stype section end (http://paulbourke.net/dataformats/obj/)
|
||||
if (insideCstype) {
|
||||
switch (*m_DataIt) {
|
||||
case 'e': {
|
||||
|
@ -293,7 +294,6 @@ static bool isNanOrInf(const char *in) {
|
|||
size_t ObjFileParser::getNumComponentsInDataDefinition() {
|
||||
size_t numComponents(0);
|
||||
const char *tmp(&m_DataIt[0]);
|
||||
const char *end = &(*m_DataItEnd);
|
||||
bool end_of_definition = false;
|
||||
while (!end_of_definition) {
|
||||
if (isDataDefinitionEnd(tmp)) {
|
||||
|
@ -301,15 +301,15 @@ size_t ObjFileParser::getNumComponentsInDataDefinition() {
|
|||
} else if (IsLineEnd(*tmp)) {
|
||||
end_of_definition = true;
|
||||
}
|
||||
if (!SkipSpaces(&tmp, end)) {
|
||||
if (!SkipSpaces(&tmp, mEnd)) {
|
||||
break;
|
||||
}
|
||||
const bool isNum(IsNumeric(*tmp) || isNanOrInf(tmp));
|
||||
SkipToken(tmp, end);
|
||||
SkipToken(tmp, mEnd);
|
||||
if (isNum) {
|
||||
++numComponents;
|
||||
}
|
||||
if (!SkipSpaces(&tmp, end)) {
|
||||
if (!SkipSpaces(&tmp, mEnd)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -318,9 +318,9 @@ void UnrealImporter::InternReadFile(const std::string &pFile,
|
|||
if (pb) {
|
||||
|
||||
std::vector<char> _data;
|
||||
const char *end = &_data[_data.size() - 1] + 1;
|
||||
TextFileToBuffer(pb.get(), _data);
|
||||
const char *data = &_data[0];
|
||||
const char *end = &_data[_data.size() - 1] + 1;
|
||||
|
||||
std::vector<std::pair<std::string, std::string>> tempTextures;
|
||||
|
||||
|
|
|
@ -103,7 +103,7 @@ AI_FORCE_INLINE bool IsSpaceOrNewLine(char_t in) {
|
|||
// ---------------------------------------------------------------------------------
|
||||
template <class char_t>
|
||||
AI_FORCE_INLINE bool SkipSpaces(const char_t *in, const char_t **out, const char_t *end) {
|
||||
while (*in == (char_t)' ' || *in == (char_t)'\t' || in != end) {
|
||||
while ((*in == (char_t)' ' || *in == (char_t)'\t') && in != end) {
|
||||
++in;
|
||||
}
|
||||
*out = in;
|
||||
|
@ -119,12 +119,12 @@ AI_FORCE_INLINE bool SkipSpaces(const char_t **inout, const char_t *end) {
|
|||
// ---------------------------------------------------------------------------------
|
||||
template <class char_t>
|
||||
AI_FORCE_INLINE bool SkipLine(const char_t *in, const char_t **out, const char_t *end) {
|
||||
while (*in != (char_t)'\r' && *in != (char_t)'\n' && *in != (char_t)'\0' || in != end) {
|
||||
while ((*in != (char_t)'\r' && *in != (char_t)'\n' && *in != (char_t)'\0') && in != end) {
|
||||
++in;
|
||||
}
|
||||
|
||||
// files are opened in binary mode. Ergo there are both NL and CR
|
||||
while (*in == (char_t)'\r' || *in == (char_t)'\n' || in != end) {
|
||||
while ((*in == (char_t)'\r' || *in == (char_t)'\n') && in != end) {
|
||||
++in;
|
||||
}
|
||||
*out = in;
|
||||
|
@ -140,7 +140,7 @@ AI_FORCE_INLINE bool SkipLine(const char_t **inout, const char_t *end) {
|
|||
// ---------------------------------------------------------------------------------
|
||||
template <class char_t>
|
||||
AI_FORCE_INLINE bool SkipSpacesAndLineEnd(const char_t *in, const char_t **out, const char_t *end) {
|
||||
while (*in == (char_t)' ' || *in == (char_t)'\t' || *in == (char_t)'\r' || *in == (char_t)'\n' || in != end) {
|
||||
while ((*in == (char_t)' ' || *in == (char_t)'\t' || *in == (char_t)'\r' || *in == (char_t)'\n') && in != end) {
|
||||
++in;
|
||||
}
|
||||
*out = in;
|
||||
|
|
Loading…
Reference in New Issue