Revision: 22610 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22610 Author: joeedh Date: 2009-08-18 22:05:08 +0200 (Tue, 18 Aug 2009)
Log Message: ----------- rearranged some code a bit Modified Paths: -------------- branches/bmesh/blender/source/blender/blenkernel/BKE_customdata.h branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c branches/bmesh/blender/source/blender/blenkernel/intern/modifiers_bmesh.c branches/bmesh/blender/source/blender/blenkernel/intern/subsurf_ccg.c branches/bmesh/blender/source/blender/bmesh/bmesh.h branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h branches/bmesh/blender/source/blender/bmesh/docs/bmesh_design.mwiki branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c branches/bmesh/blender/source/blender/editors/space_view3d/view3d_snap.c Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_customdata.h =================================================================== --- branches/bmesh/blender/source/blender/blenkernel/BKE_customdata.h 2009-08-18 19:58:27 UTC (rev 22609) +++ branches/bmesh/blender/source/blender/blenkernel/BKE_customdata.h 2009-08-18 20:05:08 UTC (rev 22610) @@ -162,12 +162,13 @@ void CustomData_copy_data(const struct CustomData *source, struct CustomData *dest, int source_index, int dest_index, int count); +void CustomData_copy_elements(int type, void *source, void *dest, int count); void CustomData_em_copy_data(const struct CustomData *source, struct CustomData *dest, void *src_block, void **dest_block); void CustomData_bmesh_copy_data(const struct CustomData *source, - struct CustomData *dest,void *src_block, - void **dest_block); + struct CustomData *dest, void *src_block, + void **dest_block); /* frees data in a CustomData object * return 1 on success, 0 on failure Modified: branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c =================================================================== --- branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c 2009-08-18 19:58:27 UTC (rev 22609) +++ branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c 2009-08-18 20:05:08 UTC (rev 22610) @@ -282,27 +282,75 @@ { DMFaceIter *iter = dm->newFaceIter(dm); DMLoopIter *liter; + CustomData *oldata, *opdata; MPoly *mpoly; MLoop *mloop; - int i; + int l, i, j, lasttype; + oldata = dm->getLoopDataLayout(dm); + opdata = dm->getFaceDataLayout(dm); + + CustomData_copy(oldata, ldata, CD_MASK_DERIVEDMESH, CD_CALLOC, totloop); + CustomData_copy(opdata, pdata, CD_MASK_DERIVEDMESH, CD_CALLOC, dm->getNumFaces(dm)); + mloop = MEM_callocN(sizeof(MLoop)*totloop, "MLoop from dm_add_polys_from_iter"); + CustomData_add_layer(ldata, CD_MLOOP, CD_ASSIGN, mloop, totloop); mpoly = MEM_callocN(sizeof(MPoly)*dm->getNumFaces(dm), "MPoly from dm_add_polys_from_iter"); - - CustomData_add_layer(ldata, CD_MLOOP, CD_ASSIGN, mloop, totloop); CustomData_add_layer(pdata, CD_MPOLY, CD_ASSIGN, mpoly, dm->getNumFaces(dm)); - i = 0; + l = 0; for (; !iter->done; iter->step(iter), mpoly++) { mpoly->flag = iter->flags; - mpoly->loopstart = i; + mpoly->loopstart = l; mpoly->totloop = iter->len; mpoly->mat_nr = iter->mat_nr; + j = 0; + lasttype = -1; + for (i=0; i<opdata->totlayer; i++) { + void *e1, *e2; + + if (opdata->layers[i].type == CD_MPOLY) + continue; + + e1 = iter->getCDData(iter, opdata->layers[i].type, j); + e2 = CustomData_get_layer_n(pdata, opdata->layers[i].type, j); + + CustomData_copy_elements(opdata->layers[i].type, e1, e2, 1); + + if (opdata->layers[i].type == lasttype) + j++; + else + j = 0; + + lasttype = opdata->layers[i].type; + } + liter = iter->getLoopsIter(iter); - for (; !liter->done; liter->step(liter), mloop++, i++) { + for (; !liter->done; liter->step(liter), mloop++, l++) { mloop->v = liter->vindex; mloop->e = liter->eindex; + + j = 0; + lasttype = -1; + for (i=0; i<oldata->totlayer; i++) { + void *e1, *e2; + + if (oldata->layers[i].type == CD_MLOOP) + continue; + + e1 = liter->getLoopCDData(liter, oldata->layers[i].type, j); + e2 = CustomData_get_layer_n(ldata, oldata->layers[i].type, j); + + CustomData_copy_elements(oldata->layers[i].type, e1, e2, 1); + + if (oldata->layers[i].type == lasttype) + j++; + else + j = 0; + + lasttype = oldata->layers[i].type; + } } } iter->free(iter); @@ -312,33 +360,21 @@ { DMFaceIter *iter = source->newFaceIter(source); DMLoopIter *liter; - MPoly *mpoly; - MLoop *mloop; - int i; + int totloop = 0; - mloop = MEM_callocN(sizeof(MLoop)*source->numLoopData, "MLoop from dm_add_polys_from_iter"); - mpoly = MEM_callocN(sizeof(MPoly)*source->getNumFaces(source), "MPoly from dm_add_polys_from_iter"); - - CustomData_add_layer(&target->loopData, CD_MLOOP, CD_ASSIGN, mloop, source->numLoopData); - CustomData_add_layer(&target->polyData, CD_MPOLY, CD_ASSIGN, mpoly, source->getNumFaces(source)); - - target->numLoopData = source->numLoopData; - target->numPolyData = source->numPolyData; - - i = 0; - for (; !iter->done; iter->step(iter), mpoly++) { - mpoly->flag = iter->flags; - mpoly->loopstart = i; - mpoly->totloop = iter->len; - mpoly->mat_nr = iter->mat_nr; - + for (; !iter->done; iter->step(iter)) { liter = iter->getLoopsIter(iter); - for (; !liter->done; liter->step(liter), mloop++, i++) { - mloop->v = liter->vindex; - mloop->e = liter->eindex; + for (; !liter->done; liter->step(liter)) { + totloop++; } } + iter->free(iter); + + dm_add_polys_from_iter(&target->loopData, &target->polyData, source, totloop); + + target->numLoopData = totloop; + target->numPolyData = source->getNumFaces(source); } void DM_to_mesh(DerivedMesh *dm, Mesh *me) @@ -1044,7 +1080,7 @@ } } -static void emDM_drawFacesTex(void *dm, int (*setDrawOptions)(MTFace *tface, MCol *mcol, int matnr)) +static void emDM_drawFacesTex(void *dm, int (*setDrawOptions)(MTFace *tface, int has_vcol, int matnr)) { emDM_drawFacesTex_common(dm, setDrawOptions, NULL, NULL); } Modified: branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c =================================================================== --- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c 2009-08-18 19:58:27 UTC (rev 22609) +++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c 2009-08-18 20:05:08 UTC (rev 22610) @@ -1311,7 +1311,7 @@ void *cddm_loopiter_getcddata(void *self, int type, int layer) { - CDDM_FaceIter *iter = self; + CDDM_LoopIter *iter = self; if (layer == -1) return CustomData_get(&iter->cddm->dm.loopData, iter->head.index, type); @@ -1321,13 +1321,13 @@ void *cddm_loopiter_getvertcddata(void *self, int type, int layer) { - CDDM_FaceIter *iter = self; + CDDM_LoopIter *iter = self; if (layer == -1) return CustomData_get(&iter->cddm->dm.vertData, - iter->cddm->mloop[iter->head.index].v, + iter->cddm->mloop[iter->head.vindex].v, type); else return CustomData_get_n(&iter->cddm->dm.vertData, type, - iter->cddm->mloop[iter->head.index].v, layer); + iter->cddm->mloop[iter->head.vindex].v, layer); } DMLoopIter *cddmiter_get_loopiter(void *self) @@ -1406,8 +1406,6 @@ CustomData_copy_data(&source->vertData, &dm->vertData, 0, 0, numVerts); CustomData_copy_data(&source->edgeData, &dm->edgeData, 0, 0, numEdges); CustomData_copy_data(&source->faceData, &dm->faceData, 0, 0, numFaces); - CustomData_copy_data(&source->loopData, &dm->loopData, 0, 0, numLoops); - CustomData_copy_data(&source->polyData, &dm->polyData, 0, 0, numPolys); /* now add mvert/medge/mface layers */ cddm->mvert = source->dupVertArray(source); Modified: branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c =================================================================== --- branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c 2009-08-18 19:58:27 UTC (rev 22609) +++ branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c 2009-08-18 20:05:08 UTC (rev 22610) @@ -1465,6 +1465,16 @@ data->layers[i].flag |= CD_FLAG_NOCOPY; } +void CustomData_copy_elements(int type, void *source, void *dest, int count) +{ + const LayerTypeInfo *typeInfo = layerType_getInfo(type); + + if (typeInfo->copy) + typeInfo->copy(source, dest, count); + else + memcpy(dest, source, typeInfo->size*count); +} + void CustomData_copy_data(const CustomData *source, CustomData *dest, int source_index, int dest_index, int count) { Modified: branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c =================================================================== --- branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c 2009-08-18 19:58:27 UTC (rev 22609) +++ branches/bmesh/blender/source/blender/blenkernel/intern/editderivedbmesh.c 2009-08-18 20:05:08 UTC (rev 22610) @@ -275,6 +275,9 @@ /*private variables, for number of verts/edges/faces within the above hash/table members*/ int tv, te, tf; + + /*customdata layout of the tesselated faces*/ + CustomData tessface_layout; } EditDerivedBMesh; static void bmdm_recalc_lookups(EditDerivedBMesh *bmdm) @@ -1312,6 +1315,8 @@ iter->head.flags = BMFlags_To_MEFlags(iter->f); iter->head.index++; + iter->head.len = iter->f->len; + iter->nextf = BMIter_Step(&iter->iter); if (!iter->nextf) iter->head.done = 1; @@ -1330,16 +1335,16 @@ { bmDM_loopIter *iter = self; - iter->l = iter->nextl; + iter->l = BMIter_Step(&iter->iter); + if (!iter->l) { + iter->head.done = 1; + return; + } bmvert_to_mvert(iter->l->v, &iter->head.v); iter->head.index++; iter->head.vindex = BMINDEX_GET(iter->l->v); iter->head.eindex = BMINDEX_GET(iter->l->e); - - iter->nextl = BMIter_Step(&iter->iter); - - if (!iter->nextl) iter->head.done = 1; } void *bmDM_getLoopCDData(void *self, int type, int layer) @@ -1378,15 +1383,15 @@ iter->bm = fiter->bm; iter->f = fiter->f; - iter->nextl = BMIter_New(&iter->iter, iter->bm, BM_LOOPS_OF_FACE, iter->f); + iter->l = BMIter_New(&iter->iter, iter->bm, BM_LOOPS_OF_FACE, iter->f); iter->head.step = bmDM_loopIterStep; iter->head.getLoopCDData = bmDM_getLoopCDData; iter->head.getVertCDData = bmDM_getVertCDData; - bmvert_to_mvert(iter->nextl->v, &iter->head.v); - iter->head.vindex = BMINDEX_GET(iter->nextl->v); - iter->head.eindex = BMINDEX_GET(iter->nextl->e); + bmvert_to_mvert(iter->l->v, &iter->head.v); + iter->head.vindex = BMINDEX_GET(iter->l->v); + iter->head.eindex = BMINDEX_GET(iter->l->e); return (DMLoopIter*) iter; } @@ -1450,19 +1455,76 @@ } } +CustomData *bmDm_getVertDataLayout(DerivedMesh *dm) +{ + EditDerivedBMesh *bmdm = (EditDerivedBMesh*)dm; + + return &bmdm->tc->bm->vdata; +} + +CustomData *bmDm_getEdgeDataLayout(DerivedMesh *dm) +{ + EditDerivedBMesh *bmdm = (EditDerivedBMesh*)dm; + + return &bmdm->tc->bm->edata; +} + +CustomData *bmDm_getTessFaceDataLayout(DerivedMesh *dm) +{ @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs