use BLI_bitmap for editmesh selection buffer to save some memory.
This commit is contained in:
@@ -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] |= \
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user