[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60677] trunk/blender/source/blender: use BLI_bitmap for editmesh selection buffer to save some memory.

Campbell Barton ideasman42 at gmail.com
Fri Oct 11 00:30:17 CEST 2013


Revision: 60677
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60677
Author:   campbellbarton
Date:     2013-10-10 22:30:16 +0000 (Thu, 10 Oct 2013)
Log Message:
-----------
use BLI_bitmap for editmesh selection buffer to save some memory.

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_bitmap.h
    trunk/blender/source/blender/editors/include/ED_mesh.h
    trunk/blender/source/blender/editors/mesh/editmesh_select.c
    trunk/blender/source/blender/editors/space_view3d/view3d_select.c

Modified: trunk/blender/source/blender/blenlib/BLI_bitmap.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_bitmap.h	2013-10-10 22:06:01 UTC (rev 60676)
+++ trunk/blender/source/blender/blenlib/BLI_bitmap.h	2013-10-10 22:30:16 UTC (rev 60677)
@@ -60,6 +60,9 @@
 	((_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] |= \

Modified: trunk/blender/source/blender/editors/include/ED_mesh.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_mesh.h	2013-10-10 22:06:01 UTC (rev 60676)
+++ trunk/blender/source/blender/editors/include/ED_mesh.h	2013-10-10 22:30:16 UTC (rev 60677)
@@ -152,7 +152,7 @@
 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,

Modified: trunk/blender/source/blender/editors/mesh/editmesh_select.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_select.c	2013-10-10 22:06:01 UTC (rev 60676)
+++ trunk/blender/source/blender/editors/mesh/editmesh_select.c	2013-10-10 22:30:16 UTC (rev 60677)
@@ -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,8 +185,13 @@
 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 */
 bool EDBM_backbuf_border_init(ViewContext *vc, short xmin, short ymin, short xmax, short ymax)
@@ -205,28 +211,31 @@
 	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 @@
 	       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 @@
 	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);
+				}
 			}
 		}
 	}

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_select.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_select.c	2013-10-10 22:06:01 UTC (rev 60676)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_select.c	2013-10-10 22:30:16 UTC (rev 60677)
@@ -160,7 +160,7 @@
 {
 	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 @@
 
 
 /* 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;
 	




More information about the Bf-blender-cvs mailing list