Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2016-06-22 14:20:09 +0300
committerCampbell Barton <ideasman42@gmail.com>2016-06-22 14:31:00 +0300
commitb204bdad47ffbd92b7b6702e2a680da9cbd6489a (patch)
tree3488037b2e2eb33450a7cfee813538c4d4ce76b4 /source/blender/blenkernel/intern/editderivedmesh.c
parent493c6b622fe3fb80243dfeac29f9399ac6fc4a8c (diff)
EditMesh: Avoid creating deform-vert layer every redraw
Getting a new edit-derived-bmesh was always creating a deform-vert array, even when it wasn't needed. Since this was called on redraw, in many cases it was doing it unnecessarily. Now pass in a custom-data mask and only fill in deform-verts when needed. Gives noticeable drawing speedup (~10-30% here).
Diffstat (limited to 'source/blender/blenkernel/intern/editderivedmesh.c')
-rw-r--r--source/blender/blenkernel/intern/editderivedmesh.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c
index c1013342bd9..1aba76baa2c 100644
--- a/source/blender/blenkernel/intern/editderivedmesh.c
+++ b/source/blender/blenkernel/intern/editderivedmesh.c
@@ -2226,16 +2226,17 @@ static CustomData *bmDm_getPolyDataLayout(DerivedMesh *dm)
return &bmdm->em->bm->pdata;
}
-
+/**
+ * \note This may be called per-draw,
+ * avoid allocating large arrays where possible and keep this a thin wrapper for #BMesh.
+ */
DerivedMesh *getEditDerivedBMesh(
- BMEditMesh *em,
- Object *UNUSED(ob),
+ BMEditMesh *em, struct Object *UNUSED(ob),
+ CustomDataMask data_mask,
float (*vertexCos)[3])
{
EditDerivedBMesh *bmdm = MEM_callocN(sizeof(*bmdm), __func__);
BMesh *bm = em->bm;
- const int cd_dvert_offset = CustomData_get_offset(&bm->vdata, CD_MDEFORMVERT);
- const int cd_skin_offset = CustomData_get_offset(&bm->vdata, CD_MVERT_SKIN);
bmdm->em = em;
@@ -2304,6 +2305,9 @@ DerivedMesh *getEditDerivedBMesh(
bmdm->vertexCos = (const float (*)[3])vertexCos;
bmdm->dm.deformedOnly = (vertexCos != NULL);
+ const int cd_dvert_offset = (data_mask & CD_MASK_MDEFORMVERT) ?
+ CustomData_get_offset(&bm->vdata, CD_MDEFORMVERT) : -1;
+
if (cd_dvert_offset != -1) {
BMIter iter;
BMVert *eve;
@@ -2317,6 +2321,9 @@ DerivedMesh *getEditDerivedBMesh(
}
}
+ const int cd_skin_offset = (data_mask & CD_MASK_MVERT_SKIN) ?
+ CustomData_get_offset(&bm->vdata, CD_MVERT_SKIN) : -1;
+
if (cd_skin_offset != -1) {
BMIter iter;
BMVert *eve;