From b43f1071956cf3921afb73394820c2fadec75d94 Mon Sep 17 00:00:00 2001 From: Arystanbek Dyussenov Date: Fri, 12 Feb 2010 20:32:36 +0000 Subject: Merge -c 26848 from COLLADA branch into trunk. --- source/blender/collada/DocumentImporter.cpp | 103 ++++++++++++++++++++++------ 1 file changed, 81 insertions(+), 22 deletions(-) (limited to 'source/blender/collada') diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp index 8078ee2e6e0..cbab0bb3542 100644 --- a/source/blender/collada/DocumentImporter.cpp +++ b/source/blender/collada/DocumentImporter.cpp @@ -1290,30 +1290,12 @@ private: me->totvert = mesh->getPositions().getFloatValues()->getCount() / 3; me->mvert = (MVert*)CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, me->totvert); - const COLLADAFW::MeshVertexData& pos = mesh->getPositions(); + COLLADAFW::MeshVertexData& pos = mesh->getPositions(); MVert *mvert; - int i, j; - - for (i = 0, mvert = me->mvert; i < me->totvert; i++, mvert++) { - j = i * 3; + int i; - if (pos.getType() == COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT) { - const float *array = pos.getFloatValues()->getData(); - mvert->co[0] = array[j]; - mvert->co[1] = array[j + 1]; - mvert->co[2] = array[j + 2]; - } - else if (pos.getType() == COLLADAFW::MeshVertexData::DATA_TYPE_DOUBLE){ - const double *array = pos.getDoubleValues()->getData(); - mvert->co[0] = (float)array[j]; - mvert->co[1] = (float)array[j + 1]; - mvert->co[2] = (float)array[j + 2]; - } - else { - fprintf(stderr, "Cannot read vertex positions: unknown data type.\n"); - break; - } - } + for (i = 0, mvert = me->mvert; i < me->totvert; i++, mvert++) + get_vector(mvert->co, pos, i); } int triangulate_poly(unsigned int *indices, int totvert, MVert *verts, std::vector& tri) @@ -1436,6 +1418,9 @@ private: COLLADAFW::MeshPrimitiveArray& prim_arr = mesh->getMeshPrimitives(); + bool has_normals = mesh->hasNormals(); + COLLADAFW::MeshVertexData& nor = mesh->getNormals(); + for (i = 0; i < prim_arr.getCount(); i++) { COLLADAFW::MeshPrimitive *mp = prim_arr[i]; @@ -1443,6 +1428,7 @@ private: // faces size_t prim_totface = mp->getFaceCount(); unsigned int *indices = mp->getPositionIndices().getData(); + unsigned int *nind = mp->getNormalIndices().getData(); int j, k; int type = mp->getPrimitiveType(); int index = 0; @@ -1473,6 +1459,13 @@ private: } test_index_face(mface, &me->fdata, face_index, 3); + + if (has_normals) { + if (!flat_face(nind, nor, 3)) + mface->flag |= ME_SMOOTH; + + nind += 3; + } index += 3; mface++; @@ -1502,6 +1495,13 @@ private: } test_index_face(mface, &me->fdata, face_index, vcount); + + if (has_normals) { + if (!flat_face(nind, nor, vcount)) + mface->flag |= ME_SMOOTH; + + nind += vcount; + } mface++; face_index++; @@ -1535,6 +1535,15 @@ private: } test_index_face(mface, &me->fdata, face_index, 3); + + if (has_normals) { + unsigned int utri[3] = {tri[v], tri[v + 1], tri[v + 2]}; + + if (!flat_face(utri, nor, 3)) + mface->flag |= ME_SMOOTH; + + nind += 3; + } mface++; face_index++; @@ -1553,6 +1562,56 @@ private: geom_uid_mat_mapping_map[mesh->getUniqueId()] = mat_prim_map; } + void get_vector(float v[3], COLLADAFW::MeshVertexData& arr, int i) + { + i *= 3; + + switch(arr.getType()) { + case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT: + { + COLLADAFW::ArrayPrimitiveType* values = arr.getFloatValues(); + if (values->empty()) return; + + v[0] = (*values)[i++]; + v[1] = (*values)[i++]; + v[2] = (*values)[i]; + } + break; + case COLLADAFW::MeshVertexData::DATA_TYPE_DOUBLE: + { + COLLADAFW::ArrayPrimitiveType* values = arr.getDoubleValues(); + if (values->empty()) return; + + v[0] = (float)(*values)[i++]; + v[1] = (float)(*values)[i++]; + v[2] = (float)(*values)[i]; + } + break; + default: + break; + } + } + + bool flat_face(unsigned int *nind, COLLADAFW::MeshVertexData& nor, int count) + { + float a[3], b[3]; + + get_vector(a, nor, *nind++); + normalize_v3(a); + + for (int i = 1; i < count; i++, nind++) { + get_vector(b, nor, *nind); + normalize_v3(b); + + float dp = dot_v3v3(a, b); + + if (dp < 0.99999f || dp > 1.00001f) + return false; + } + + return true; + } + public: MeshImporter(ArmatureImporter *arm, Scene *sce) : scene(sce), armature_importer(arm) {} -- cgit v1.2.3