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>2013-05-12 12:42:24 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-05-12 12:42:24 +0400
commitcf96fdfc65b069528171cee1cdd893f364ff4b7f (patch)
treeeda1afff8e55dc895ee46c88f27ede3253479a10 /source/blender/editors/space_view3d/drawmesh.c
parent0d36225dd1e8ded87949d157fedb07f9d949cb30 (diff)
Optimize face-select drawing (weight/vertex paint mode face selection)
with bmesh theres no need for edge-hash lookups, replace EdgeHash with BLI_bitmap.
Diffstat (limited to 'source/blender/editors/space_view3d/drawmesh.c')
-rw-r--r--source/blender/editors/space_view3d/drawmesh.c54
1 files changed, 17 insertions, 37 deletions
diff --git a/source/blender/editors/space_view3d/drawmesh.c b/source/blender/editors/space_view3d/drawmesh.c
index 05099d14b12..02cbcc980b2 100644
--- a/source/blender/editors/space_view3d/drawmesh.c
+++ b/source/blender/editors/space_view3d/drawmesh.c
@@ -34,8 +34,8 @@
#include "BLI_utildefines.h"
#include "BLI_blenlib.h"
+#include "BLI_bitmap.h"
#include "BLI_math.h"
-#include "BLI_edgehash.h"
#include "BLI_utildefines.h"
#include "DNA_material_types.h"
@@ -77,7 +77,7 @@
/* user data structures for derived mesh callbacks */
typedef struct drawMeshFaceSelect_userData {
Mesh *me;
- EdgeHash *eh;
+ BLI_bitmap edge_flags; /* pairs of edge options (visible, select) */
} drawMeshFaceSelect_userData;
typedef struct drawEMTFMapped_userData {
@@ -95,48 +95,33 @@ typedef struct drawTFace_userData {
/**************************** Face Select Mode *******************************/
-/* Flags for marked edges */
-enum {
- eEdge_Visible = (1 << 0),
- eEdge_Select = (1 << 1),
-};
+/* mainly to be less confusing */
+BLI_INLINE int edge_vis_index(const int index) { return index * 2; }
+BLI_INLINE int edge_sel_index(const int index) { return index * 2 + 1; }
-/* Creates a hash of edges to flags indicating selected/visible */
-static void get_marked_edge_info__orFlags(EdgeHash *eh, int v0, int v1, int flags)
+static BLI_bitmap get_tface_mesh_marked_edge_info(Mesh *me)
{
- int *flags_p;
-
- if (!BLI_edgehash_haskey(eh, v0, v1))
- BLI_edgehash_insert(eh, v0, v1, NULL);
-
- flags_p = (int *) BLI_edgehash_lookup_p(eh, v0, v1);
- *flags_p |= flags;
-}
-
-static EdgeHash *get_tface_mesh_marked_edge_info(Mesh *me)
-{
- EdgeHash *eh = BLI_edgehash_new();
+ BLI_bitmap bitmap_edge_flags = BLI_BITMAP_NEW(me->totedge * 2, __func__);
MPoly *mp;
MLoop *ml;
- MLoop *ml_next;
int i, j;
+ bool select_set;
for (i = 0; i < me->totpoly; i++) {
mp = &me->mpoly[i];
if (!(mp->flag & ME_HIDE)) {
- unsigned int flags = eEdge_Visible;
- if (mp->flag & ME_FACE_SEL) flags |= eEdge_Select;
+ select_set = (mp->flag & ME_FACE_SEL) != 0;
ml = me->mloop + mp->loopstart;
for (j = 0; j < mp->totloop; j++, ml++) {
- ml_next = ME_POLY_LOOP_NEXT(me->mloop, mp, j);
- get_marked_edge_info__orFlags(eh, ml->v, ml_next->v, flags);
+ BLI_BITMAP_SET(bitmap_edge_flags, edge_vis_index(ml->e));
+ if (select_set) BLI_BITMAP_SET(bitmap_edge_flags, edge_sel_index(ml->e));
}
}
}
- return eh;
+ return bitmap_edge_flags;
}
@@ -144,16 +129,14 @@ static DMDrawOption draw_mesh_face_select__setHiddenOpts(void *userData, int ind
{
drawMeshFaceSelect_userData *data = userData;
Mesh *me = data->me;
- MEdge *med = &me->medge[index];
- uintptr_t flags = (intptr_t) BLI_edgehash_lookup(data->eh, med->v1, med->v2);
if (me->drawflag & ME_DRAWEDGES) {
- if ((me->drawflag & ME_HIDDENEDGES) || (flags & eEdge_Visible))
+ if ((me->drawflag & ME_HIDDENEDGES) || (BLI_BITMAP_GET(data->edge_flags, edge_vis_index(index))))
return DM_DRAW_OPTION_NORMAL;
else
return DM_DRAW_OPTION_SKIP;
}
- else if (flags & eEdge_Select)
+ else if (BLI_BITMAP_GET(data->edge_flags, edge_sel_index(index)))
return DM_DRAW_OPTION_NORMAL;
else
return DM_DRAW_OPTION_SKIP;
@@ -162,10 +145,7 @@ static DMDrawOption draw_mesh_face_select__setHiddenOpts(void *userData, int ind
static DMDrawOption draw_mesh_face_select__setSelectOpts(void *userData, int index)
{
drawMeshFaceSelect_userData *data = userData;
- MEdge *med = &data->me->medge[index];
- uintptr_t flags = (intptr_t) BLI_edgehash_lookup(data->eh, med->v1, med->v2);
-
- return (flags & eEdge_Select) ? DM_DRAW_OPTION_NORMAL : DM_DRAW_OPTION_SKIP;
+ return (BLI_BITMAP_GET(data->edge_flags, edge_sel_index(index))) ? DM_DRAW_OPTION_NORMAL : DM_DRAW_OPTION_SKIP;
}
/* draws unselected */
@@ -185,7 +165,7 @@ void draw_mesh_face_select(RegionView3D *rv3d, Mesh *me, DerivedMesh *dm)
drawMeshFaceSelect_userData data;
data.me = me;
- data.eh = get_tface_mesh_marked_edge_info(me);
+ data.edge_flags = get_tface_mesh_marked_edge_info(me);
glEnable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
@@ -217,7 +197,7 @@ void draw_mesh_face_select(RegionView3D *rv3d, Mesh *me, DerivedMesh *dm)
bglPolygonOffset(rv3d->dist, 0.0); /* resets correctly now, even after calling accumulated offsets */
- BLI_edgehash_free(data.eh, NULL);
+ MEM_freeN(data.edge_flags);
}
/***************************** Texture Drawing ******************************/