From d89db25c53b4b00038061dc15fede87dd36276a0 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 16 Apr 2012 04:17:33 +0000 Subject: bmesh api todo: emDM_getTessFaceDataArray now returns UV's and Colors from editmode loops. --- source/blender/blenkernel/intern/editderivedmesh.c | 38 +++++++++++++++------- 1 file changed, 26 insertions(+), 12 deletions(-) (limited to 'source/blender/blenkernel/intern/editderivedmesh.c') 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; itc->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)); + } + } } } } -- cgit v1.2.3