diff --git a/code/Q3DLoader.cpp b/code/Q3DLoader.cpp index c897ebf3d..c31445e98 100644 --- a/code/Q3DLoader.cpp +++ b/code/Q3DLoader.cpp @@ -103,7 +103,8 @@ void Q3DImporter::InternReadFile( const std::string& pFile, std::string(&((const char*)stream.GetPtr())[8],2)); // ... an store it - unsigned int ff = strtol10(&((const char*)stream.GetPtr())[8]); + char major = ((const char*)stream.GetPtr())[8]; + char minor = ((const char*)stream.GetPtr())[9]; stream.IncPtr(10); unsigned int numMeshes = (unsigned int)stream.GetI4(); @@ -212,19 +213,21 @@ void Q3DImporter::InternReadFile( const std::string& pFile, Face& vec = faces[i]; for (unsigned int a = 0; a < (unsigned int)vec.indices.size();++a) { - vec.indices[a] = stream.GetI4(); + vec.uvindices[a] = stream.GetI4(); if (!i && !a) - mesh.prevUVIdx = vec.indices[a]; - else if (vec.indices[a] != mesh.prevUVIdx) + mesh.prevUVIdx = vec.uvindices[a]; + else if (vec.uvindices[a] != mesh.prevUVIdx) mesh.prevUVIdx = 0xffffffff; } } } // we don't need the rest, but we need to get to the next chunk - stream.IncPtr(36 + ((ff > 30 ? 12 : 0 ))); + stream.IncPtr(36); + if (minor > '0' && major == '3') + stream.IncPtr(mesh.faces.size()); } - stream.IncPtr(4 + (ff > 30 ? 24 : 0 )); // unknown value here + // stream.IncPtr(4); // unknown value here } break; @@ -262,7 +265,9 @@ void Q3DImporter::InternReadFile( const std::string& pFile, mat.transparency = stream.GetF4(); // unknown value here - stream.IncPtr(4); + // stream.IncPtr(4); + // FIX: it could be the texture index ... + mat.texIdx = (unsigned int)stream.GetI4(); } break; @@ -431,7 +436,8 @@ outer: mat->AddProperty(&srcMat.specular, 1,AI_MATKEY_COLOR_SPECULAR); mat->AddProperty(&srcMat.ambient, 1,AI_MATKEY_COLOR_AMBIENT); - //srcMat.transparency = 1.0f - srcMat.transparency; + //if (!(minor > '0' && major == '3')) + // srcMat.transparency = 1.0f - srcMat.transparency; mat->AddProperty(&srcMat.transparency, 1, AI_MATKEY_OPACITY); // add shininess - Quick3D seems to use it ins its viewer @@ -445,10 +451,11 @@ outer: mat->AddProperty(&srcMat.name,AI_MATKEY_NAME); // Add a texture - if (real < pScene->mNumTextures) + if (srcMat.texIdx < pScene->mNumTextures || real < pScene->mNumTextures) { srcMat.name.data[0] = '*'; - srcMat.name.length = itoa10(&srcMat.name.data[1],1000,real); + srcMat.name.length = itoa10(&srcMat.name.data[1],1000, + (srcMat.texIdx < pScene->mNumTextures ? srcMat.texIdx : real)); mat->AddProperty(&srcMat.name,AI_MATKEY_TEXTURE_DIFFUSE(0)); } @@ -519,7 +526,7 @@ outer: { if (m.prevUVIdx != 0xffffffff && m.uv.size() >= m.verts.size()) // workaround { - *uv++ = m.uv[face.indices[n]]; + *uv = m.uv[face.indices[n]]; } else { @@ -528,8 +535,10 @@ outer: DefaultLogger::get()->warn("Quick3D: Texture coordinate index overflow"); face.uvindices[n] = 0; } - *uv++ = m.uv[face.uvindices[n]]; + *uv = m.uv[face.uvindices[n]]; } + uv->y = 1.f - uv->y; + ++uv; } // setup the new vertex index diff --git a/code/Q3DLoader.h b/code/Q3DLoader.h index 72bb3366f..ca4b0f7d3 100644 --- a/code/Q3DLoader.h +++ b/code/Q3DLoader.h @@ -94,11 +94,14 @@ private: Material() : diffuse (0.6f,0.6f,0.6f) , transparency (0.f) + , texIdx (0xffffffff) {} aiString name; aiColor3D ambient, diffuse, specular; float transparency; + + unsigned int texIdx; }; struct Face