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
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenlib/BLI_bitmap.h82
-rw-r--r--source/blender/blenlib/CMakeLists.txt1
-rw-r--r--source/blender/blenlib/intern/pbvh.c32
3 files changed, 87 insertions, 28 deletions
diff --git a/source/blender/blenlib/BLI_bitmap.h b/source/blender/blenlib/BLI_bitmap.h
new file mode 100644
index 00000000000..16a6fb8ee15
--- /dev/null
+++ b/source/blender/blenlib/BLI_bitmap.h
@@ -0,0 +1,82 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2012 by Nicholas Bishop
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __BLI_BITMAP_H__
+#define __BLI_BITMAP_H__
+
+typedef unsigned int* BLI_bitmap;
+
+/* warning: the bitmap does not keep track of its own size or check
+ for out-of-bounds access */
+
+/* internal use */
+/* 2^5 = 32 (bits) */
+#define BLI_BITMAP_POWER 5
+/* 0b11111 */
+#define BLI_BITMAP_MASK 31
+
+/* number of blocks needed to hold '_tot' bits */
+#define BLI_BITMAP_NUM_BLOCKS(_tot) \
+ (((_tot) >> BLI_BITMAP_POWER) + 1)
+
+/* size (in bytes) used to hold '_tot' bits */
+#define BLI_BITMAP_SIZE(_tot) \
+ (BLI_BITMAP_NUM_BLOCKS(_tot) * sizeof(unsigned int))
+
+/* allocate memory for a bitmap with '_tot' bits; free
+ with MEM_freeN() */
+#define BLI_BITMAP_NEW(_tot, _alloc_string) \
+ ((BLI_bitmap)MEM_callocN(BLI_BITMAP_SIZE(_tot), \
+ _alloc_string))
+
+/* get the value of a single bit at '_index' */
+#define BLI_BITMAP_GET(_bitmap, _index) \
+ ((_bitmap)[(_index) >> BLI_BITMAP_POWER] & \
+ (1 << ((_index) & BLI_BITMAP_MASK)))
+
+/* set the value of a single bit at '_index' */
+#define BLI_BITMAP_SET(_bitmap, _index) \
+ ((_bitmap)[(_index) >> BLI_BITMAP_POWER] |= \
+ (1 << ((_index) & BLI_BITMAP_MASK)))
+
+/* clear the value of a single bit at '_index' */
+#define BLI_BITMAP_CLEAR(_bitmap, _index) \
+ ((_bitmap)[(_index) >> BLI_BITMAP_POWER] &= \
+ ~(1 << ((_index) & BLI_BITMAP_MASK)))
+
+/* set or clear the value of a single bit at '_index' */
+#define BLI_BITMAP_MODIFY(_bitmap, _index, _set) \
+ do { \
+ if(_set) \
+ BLI_BITMAP_SET(_bitmap, _index); \
+ else \
+ BLI_BITMAP_CLEAR(_bitmap, _index); \
+ } while(0)
+
+/* resize bitmap to have space for '_tot' bits */
+#define BLI_BITMAP_RESIZE(_bitmap, _tot) \
+ (_bitmap) = MEM_reallocN(_bitmap, BLI_BITMAP_SIZE(_tot))
+
+#endif
diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt
index 6e8da84cb24..46538a6e0c1 100644
--- a/source/blender/blenlib/CMakeLists.txt
+++ b/source/blender/blenlib/CMakeLists.txt
@@ -90,6 +90,7 @@ set(SRC
intern/winstuff.c
BLI_array.h
+ BLI_bitmap.h
BLI_smallhash.h
BLI_sparsemap.h
BLI_args.h
diff --git a/source/blender/blenlib/intern/pbvh.c b/source/blender/blenlib/intern/pbvh.c
index 87fa4437ec1..318cd15d2e9 100644
--- a/source/blender/blenlib/intern/pbvh.c
+++ b/source/blender/blenlib/intern/pbvh.c
@@ -28,6 +28,7 @@
#include "MEM_guardedalloc.h"
+#include "BLI_bitmap.h"
#include "BLI_math.h"
#include "BLI_utildefines.h"
#include "BLI_ghash.h"
@@ -43,31 +44,6 @@
//#define PERFCNTRS
-/* Bitmap */
-typedef char* BLI_bitmap;
-
-static BLI_bitmap BLI_bitmap_new(int tot)
-{
- return MEM_callocN((tot >> 3) + 1, "BLI bitmap");
-}
-
-static int BLI_bitmap_get(BLI_bitmap b, int index)
-{
- return b[index >> 3] & (1 << (index & 7));
-}
-
-static void BLI_bitmap_set(BLI_bitmap b, int index)
-{
- b[index >> 3] |= (1 << (index & 7));
-}
-
-#if 0 /* UNUSED */
-static void BLI_bitmap_clear(BLI_bitmap b, int index)
-{
- b[index >> 3] &= ~(1 << (index & 7));
-}
-#endif
-
/* Axis-aligned bounding box */
typedef struct {
float bmin[3], bmax[3];
@@ -343,12 +319,12 @@ static int map_insert_vert(PBVH *bvh, GHash *map,
void *value, *key = SET_INT_IN_POINTER(vertex);
if(!BLI_ghash_haskey(map, key)) {
- if(BLI_bitmap_get(bvh->vert_bitmap, vertex)) {
+ if(BLI_BITMAP_GET(bvh->vert_bitmap, vertex)) {
value = SET_INT_IN_POINTER(~(*face_verts));
++(*face_verts);
}
else {
- BLI_bitmap_set(bvh->vert_bitmap, vertex);
+ BLI_BITMAP_SET(bvh->vert_bitmap, vertex);
value = SET_INT_IN_POINTER(*uniq_verts);
++(*uniq_verts);
}
@@ -553,7 +529,7 @@ void BLI_pbvh_build_mesh(PBVH *bvh, MFace *faces, MVert *verts, int totface, int
bvh->faces = faces;
bvh->verts = verts;
- bvh->vert_bitmap = BLI_bitmap_new(totvert);
+ bvh->vert_bitmap = BLI_BITMAP_NEW(totvert, "bvh->vert_bitmap");
bvh->totvert = totvert;
bvh->leaf_limit = LEAF_LIMIT;