diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-04-16 08:17:33 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-04-16 08:17:33 +0400 |
commit | d89db25c53b4b00038061dc15fede87dd36276a0 (patch) | |
tree | 9af1a6df0b91d47d27b01e563f8c1ba3d7024252 | |
parent | d9fa08e73d71732f3170d3817e5ab51f72c62c82 (diff) |
bmesh api todo:
emDM_getTessFaceDataArray now returns UV's and Colors from editmode loops.
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 7 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/editderivedmesh.c | 38 |
2 files changed, 26 insertions, 19 deletions
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 7a39cf1b916..ed561a58cce 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -1989,13 +1989,6 @@ static DerivedMesh *cddm_copy_ex(DerivedMesh *source, int faces_from_tessfaces) cddm->mloop = CustomData_get_layer(&dm->loopData, CD_MLOOP); cddm->mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY); - /* any callers that need tessface data can calculate it - campbell */ -#if 0 - /* BMESH_TODO: Find out why this is necessary (or else find a way to remove - * it). If it is necessary, add a comment explaining why. */ - CDDM_recalc_tessellation((DerivedMesh *)cddm); -#endif - return dm; } diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c index abc74983d2b..c53b11aa60c 100644 --- a/source/blender/blenkernel/intern/editderivedmesh.c +++ b/source/blender/blenkernel/intern/editderivedmesh.c @@ -1492,35 +1492,49 @@ static void *emDM_getTessFaceDataArray(DerivedMesh *dm, int type) { EditDerivedBMesh *bmdm= (EditDerivedBMesh*) dm; BMesh *bm= bmdm->tc->bm; - BMFace *efa; - char *data, *bmdata; void *datalayer; - int index /*, offset*/ /*UNUSED */, size, i; datalayer = DM_get_tessface_data_layer(dm, type); if (datalayer) return datalayer; - /* layers are store per face for editmesh, we convert to a tbmporary + /* layers are store per face for editmesh, we convert to a temporary * data layer array in the derivedmesh when these are requested */ if (type == CD_MTFACE || type == CD_MCOL) { - index = CustomData_get_layer_index(&bm->pdata, type); + const int type_from = (type == CD_MTFACE) ? CD_MTEXPOLY : CD_MLOOPCOL; + int index; + char *data, *bmdata; + index = CustomData_get_layer_index(&bm->pdata, type_from); if (index != -1) { /* offset = bm->pdata.layers[index].offset; */ /* UNUSED */ - size = CustomData_sizeof(type); + const int size = CustomData_sizeof(type); + int i, j; DM_add_tessface_layer(dm, type, CD_CALLOC, NULL); index = CustomData_get_layer_index(&dm->faceData, type); dm->faceData.layers[index].flag |= CD_FLAG_TEMPORARY; data = datalayer = DM_get_tessface_data_layer(dm, type); - for (i=0; i<bmdm->tc->tottri; i++, data+=size) { - efa = bmdm->tc->looptris[i][0]->f; - /* BMESH_TODO: need to still add tface data, - * derived from the loops.*/ - bmdata = CustomData_bmesh_get(&bm->pdata, efa->head.data, type); - memcpy(data, bmdata, size); + + if (type == CD_MTFACE) { + for (i = 0; i < bmdm->tc->tottri; i++, data += size) { + BMFace *efa = bmdm->tc->looptris[i][0]->f; + bmdata = CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_MTEXPOLY); + ME_MTEXFACE_CPY(((MTFace *)data), ((MTexPoly *)bmdata)); + for (j = 0; j < 3; j++) { + bmdata = CustomData_bmesh_get(&bm->ldata, bmdm->tc->looptris[i][j]->head.data, CD_MLOOPUV); + copy_v2_v2(((MTFace *)data)->uv[j], ((MLoopUV *)bmdata)->uv); + } + } + } + else { + for (i = 0; i < bmdm->tc->tottri; i++, data += size) { + for (j = 0; j < 3; j++) { + bmdata = CustomData_bmesh_get(&bm->ldata, bmdm->tc->looptris[i][j]->head.data, CD_MLOOPCOL); + MESH_MLOOPCOL_TO_MCOL(((MLoopCol *)bmdata), (((MCol *)data) + j)); + } + } } } } |