[#27854] Collada import doesn't handle UVW mapping
Reported by David Roy Patch by Brecht van Lommel UV import code wasn't taking possible stride into account (always assuming stride==2), thus reading UV coords totally wrong.
This commit is contained in:
@@ -144,15 +144,18 @@ void WVDataWrapper::print()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void UVDataWrapper::getUV(int uv_index[2], float *uv)
|
void UVDataWrapper::getUV(int uv_index, float *uv)
|
||||||
{
|
{
|
||||||
|
int stride = mVData->getStride(0);
|
||||||
|
if(stride==0) stride = 2;
|
||||||
|
|
||||||
switch(mVData->getType()) {
|
switch(mVData->getType()) {
|
||||||
case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
|
case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
|
||||||
{
|
{
|
||||||
COLLADAFW::ArrayPrimitiveType<float>* values = mVData->getFloatValues();
|
COLLADAFW::ArrayPrimitiveType<float>* values = mVData->getFloatValues();
|
||||||
if (values->empty()) return;
|
if (values->empty()) return;
|
||||||
uv[0] = (*values)[uv_index[0]];
|
uv[0] = (*values)[uv_index*stride];
|
||||||
uv[1] = (*values)[uv_index[1]];
|
uv[1] = (*values)[uv_index*stride + 1];
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -160,8 +163,8 @@ void UVDataWrapper::getUV(int uv_index[2], float *uv)
|
|||||||
{
|
{
|
||||||
COLLADAFW::ArrayPrimitiveType<double>* values = mVData->getDoubleValues();
|
COLLADAFW::ArrayPrimitiveType<double>* values = mVData->getDoubleValues();
|
||||||
if (values->empty()) return;
|
if (values->empty()) return;
|
||||||
uv[0] = (float)(*values)[uv_index[0]];
|
uv[0] = (float)(*values)[uv_index*stride];
|
||||||
uv[1] = (float)(*values)[uv_index[1]];
|
uv[1] = (float)(*values)[uv_index*stride + 1];
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -197,54 +200,36 @@ void MeshImporter::rotate_face_indices(MFace *mface) {
|
|||||||
void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
|
void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
|
||||||
COLLADAFW::IndexList& index_list, unsigned int *tris_indices)
|
COLLADAFW::IndexList& index_list, unsigned int *tris_indices)
|
||||||
{
|
{
|
||||||
int uv_indices[4][2];
|
|
||||||
|
|
||||||
// per face vertex indices, this means for quad we have 4 indices, not 8
|
// per face vertex indices, this means for quad we have 4 indices, not 8
|
||||||
COLLADAFW::UIntValuesArray& indices = index_list.getIndices();
|
COLLADAFW::UIntValuesArray& indices = index_list.getIndices();
|
||||||
|
|
||||||
// make indices into FloatOrDoubleArray
|
uvs.getUV(indices[tris_indices[0]], mtface->uv[0]);
|
||||||
for (int i = 0; i < 3; i++) {
|
uvs.getUV(indices[tris_indices[1]], mtface->uv[1]);
|
||||||
int uv_index = indices[tris_indices[i]];
|
uvs.getUV(indices[tris_indices[2]], mtface->uv[2]);
|
||||||
uv_indices[i][0] = uv_index * 2;
|
|
||||||
uv_indices[i][1] = uv_index * 2 + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
uvs.getUV(uv_indices[0], mtface->uv[0]);
|
|
||||||
uvs.getUV(uv_indices[1], mtface->uv[1]);
|
|
||||||
uvs.getUV(uv_indices[2], mtface->uv[2]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
|
void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
|
||||||
COLLADAFW::IndexList& index_list, int index, bool quad)
|
COLLADAFW::IndexList& index_list, int index, bool quad)
|
||||||
{
|
{
|
||||||
int uv_indices[4][2];
|
|
||||||
|
|
||||||
// per face vertex indices, this means for quad we have 4 indices, not 8
|
// per face vertex indices, this means for quad we have 4 indices, not 8
|
||||||
COLLADAFW::UIntValuesArray& indices = index_list.getIndices();
|
COLLADAFW::UIntValuesArray& indices = index_list.getIndices();
|
||||||
|
|
||||||
// make indices into FloatOrDoubleArray
|
uvs.getUV(indices[index + 0], mtface->uv[0]);
|
||||||
for (int i = 0; i < (quad ? 4 : 3); i++) {
|
uvs.getUV(indices[index + 1], mtface->uv[1]);
|
||||||
int uv_index = indices[index + i];
|
uvs.getUV(indices[index + 2], mtface->uv[2]);
|
||||||
uv_indices[i][0] = uv_index * 2;
|
|
||||||
uv_indices[i][1] = uv_index * 2 + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
uvs.getUV(uv_indices[0], mtface->uv[0]);
|
if (quad) uvs.getUV(indices[index + 3], mtface->uv[3]);
|
||||||
uvs.getUV(uv_indices[1], mtface->uv[1]);
|
|
||||||
uvs.getUV(uv_indices[2], mtface->uv[2]);
|
|
||||||
|
|
||||||
if (quad) uvs.getUV(uv_indices[3], mtface->uv[3]);
|
|
||||||
|
|
||||||
#ifdef COLLADA_DEBUG
|
#ifdef COLLADA_DEBUG
|
||||||
/*if (quad) {
|
/*if (quad) {
|
||||||
fprintf(stderr, "face uv:\n"
|
fprintf(stderr, "face uv:\n"
|
||||||
"((%d, %d), (%d, %d), (%d, %d), (%d, %d))\n"
|
"((%d, %d, %d, %d))\n"
|
||||||
"((%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f))\n",
|
"((%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f))\n",
|
||||||
|
|
||||||
uv_indices[0][0], uv_indices[0][1],
|
indices[index + 0],
|
||||||
uv_indices[1][0], uv_indices[1][1],
|
indices[index + 1],
|
||||||
uv_indices[2][0], uv_indices[2][1],
|
indices[index + 2],
|
||||||
uv_indices[3][0], uv_indices[3][1],
|
indices[index + 3],
|
||||||
|
|
||||||
mtface->uv[0][0], mtface->uv[0][1],
|
mtface->uv[0][0], mtface->uv[0][1],
|
||||||
mtface->uv[1][0], mtface->uv[1][1],
|
mtface->uv[1][0], mtface->uv[1][1],
|
||||||
@@ -253,12 +238,12 @@ void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
fprintf(stderr, "face uv:\n"
|
fprintf(stderr, "face uv:\n"
|
||||||
"((%d, %d), (%d, %d), (%d, %d))\n"
|
"((%d, %d, %d))\n"
|
||||||
"((%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f))\n",
|
"((%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f))\n",
|
||||||
|
|
||||||
uv_indices[0][0], uv_indices[0][1],
|
indices[index + 0],
|
||||||
uv_indices[1][0], uv_indices[1][1],
|
indices[index + 1],
|
||||||
uv_indices[2][0], uv_indices[2][1],
|
indices[index + 2],
|
||||||
|
|
||||||
mtface->uv[0][0], mtface->uv[0][1],
|
mtface->uv[0][0], mtface->uv[0][1],
|
||||||
mtface->uv[1][0], mtface->uv[1][1],
|
mtface->uv[1][0], mtface->uv[1][1],
|
||||||
|
@@ -69,7 +69,7 @@ public:
|
|||||||
void print();
|
void print();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void getUV(int uv_index[2], float *uv);
|
void getUV(int uv_index, float *uv);
|
||||||
};
|
};
|
||||||
|
|
||||||
class MeshImporter : public MeshImporterBase
|
class MeshImporter : public MeshImporterBase
|
||||||
|
Reference in New Issue
Block a user