use BLI_bitmap for editmesh selection buffer to save some memory.

This commit is contained in:
Campbell Barton
2013-10-10 22:30:16 +00:00
parent ecc5eb59c6
commit 03602dc158
4 changed files with 32 additions and 16 deletions

View File

@@ -60,6 +60,9 @@ typedef unsigned int BLI_bitmap;
((_bitmap)[(_index) >> BLI_BITMAP_POWER] & \
(1u << ((_index) & BLI_BITMAP_MASK)))
#define BLI_BITMAP_GET_BOOL(_bitmap, _index) \
(BLI_BITMAP_GET(_bitmap, _index) != 0)
/* set the value of a single bit at '_index' */
#define BLI_BITMAP_SET(_bitmap, _index) \
((_bitmap)[(_index) >> BLI_BITMAP_POWER] |= \

View File

@@ -152,7 +152,7 @@ void EDBM_select_mirrored(struct BMEditMesh *em, bool extend,
void EDBM_automerge(struct Scene *scene, struct Object *ob, bool update, const char hflag);
bool EDBM_backbuf_border_init(struct ViewContext *vc, short xmin, short ymin, short xmax, short ymax);
int EDBM_backbuf_check(unsigned int index);
bool EDBM_backbuf_check(unsigned int index);
void EDBM_backbuf_free(void);
bool EDBM_backbuf_border_mask_init(struct ViewContext *vc, const int mcords[][2], short tot,

View File

@@ -31,6 +31,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_bitmap.h"
#include "BLI_listbase.h"
#include "BLI_linklist.h"
#include "BLI_linklist_stack.h"
@@ -184,7 +185,12 @@ void EDBM_automerge(Scene *scene, Object *obedit, bool update, const char hflag)
unsigned int bm_solidoffs = 0, bm_wireoffs = 0, bm_vertoffs = 0; /* set in drawobject.c ... for colorindices */
/* facilities for border select and circle select */
static char *selbuf = NULL;
static BLI_bitmap *selbuf = NULL;
static BLI_bitmap *edbm_backbuf_alloc(const int size)
{
return BLI_BITMAP_NEW(size, "selbuf");
}
/* reads rect, and builds selection array for quick lookup */
/* returns if all is OK */
@@ -205,28 +211,31 @@ bool EDBM_backbuf_border_init(ViewContext *vc, short xmin, short ymin, short xma
dr = buf->rect;
/* build selection lookup */
selbuf = MEM_callocN(bm_vertoffs + 1, "selbuf");
selbuf = edbm_backbuf_alloc(bm_vertoffs + 1);
a = (xmax - xmin + 1) * (ymax - ymin + 1);
while (a--) {
if (*dr > 0 && *dr <= bm_vertoffs)
selbuf[*dr] = 1;
if (*dr > 0 && *dr <= bm_vertoffs) {
BLI_BITMAP_SET(selbuf, *dr);
}
dr++;
}
IMB_freeImBuf(buf);
return true;
}
int EDBM_backbuf_check(unsigned int index)
bool EDBM_backbuf_check(unsigned int index)
{
/* odd logic, if selbuf is NULL we assume no zbuf-selection is enabled
* and just ignore the depth buffer, this is error prone since its possible
* code doesn't set the depth buffer by accident, but leave for now. - Campbell */
if (selbuf == NULL) return 1;
if (selbuf == NULL)
return true;
if (index > 0 && index <= bm_vertoffs)
return selbuf[index];
return 0;
return BLI_BITMAP_GET_BOOL(selbuf, index);
return false;
}
void EDBM_backbuf_free(void)
@@ -286,11 +295,13 @@ bool EDBM_backbuf_border_mask_init(ViewContext *vc, const int mcords[][2], short
edbm_mask_lasso_px_cb, &lasso_mask_data);
/* build selection lookup */
selbuf = MEM_callocN(bm_vertoffs + 1, "selbuf");
selbuf = edbm_backbuf_alloc(bm_vertoffs + 1);
a = (xmax - xmin + 1) * (ymax - ymin + 1);
while (a--) {
if (*dr > 0 && *dr <= bm_vertoffs && *dr_mask == true) selbuf[*dr] = 1;
if (*dr > 0 && *dr <= bm_vertoffs && *dr_mask == true) {
BLI_BITMAP_SET(selbuf, *dr);
}
dr++; dr_mask++;
}
IMB_freeImBuf(buf);
@@ -326,12 +337,14 @@ bool EDBM_backbuf_circle_init(ViewContext *vc, short xs, short ys, short rads)
dr = buf->rect;
/* build selection lookup */
selbuf = MEM_callocN(bm_vertoffs + 1, "selbuf");
selbuf = edbm_backbuf_alloc(bm_vertoffs + 1);
radsq = rads * rads;
for (yc = -rads; yc <= rads; yc++) {
for (xc = -rads; xc <= rads; xc++, dr++) {
if (xc * xc + yc * yc < radsq) {
if (*dr > 0 && *dr <= bm_vertoffs) selbuf[*dr] = 1;
if (*dr > 0 && *dr <= bm_vertoffs) {
BLI_BITMAP_SET(selbuf, *dr);
}
}
}
}

View File

@@ -160,7 +160,7 @@ static void edbm_backbuf_check_and_select_edges(BMEditMesh *em, const bool selec
{
BMEdge *eed;
BMIter iter;
int index = bm_solidoffs;
unsigned int index = bm_solidoffs;
BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
@@ -288,12 +288,12 @@ static int view3d_selectable_data(bContext *C)
/* helper also for borderselect */
static int edge_fully_inside_rect(const rctf *rect, const float v1[2], const float v2[2])
static bool edge_fully_inside_rect(const rctf *rect, const float v1[2], const float v2[2])
{
return BLI_rctf_isect_pt_v(rect, v1) && BLI_rctf_isect_pt_v(rect, v2);
}
static int edge_inside_rect(const rctf *rect, const float v1[2], const float v2[2])
static bool edge_inside_rect(const rctf *rect, const float v1[2], const float v2[2])
{
int d1, d2, d3, d4;