[Bf-blender-cvs] [af9e6b7] particles_refactor: Basic particle buffer implementation with RNA for adding and removing attributes.

Lukas Tönne noreply at git.blender.org
Tue Apr 22 12:05:27 CEST 2014


Commit: af9e6b7fc5aecf864234f91607017b48e2f6bb2b
Author: Lukas Tönne
Date:   Fri Aug 2 13:29:07 2013 +0200
https://developer.blender.org/rBaf9e6b7fc5aecf864234f91607017b48e2f6bb2b

Basic particle buffer implementation with RNA for adding and removing attributes.

===================================================================

M	source/blender/blenkernel/BKE_nparticle.h
M	source/blender/blenkernel/intern/nparticle.c
M	source/blender/blenlib/BLI_pagedbuffer.h
M	source/blender/blenlib/intern/pagedbuffer.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/makesdna/DNA_nparticle_types.h
M	source/blender/makesdna/DNA_pagedbuffer_types.h
M	source/blender/makesrna/intern/CMakeLists.txt
M	source/blender/makesrna/intern/makesrna.c
M	source/blender/makesrna/intern/rna_nparticle.c
D	source/blender/makesrna/intern/rna_pagedbuffer.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_nparticle.h b/source/blender/blenkernel/BKE_nparticle.h
index e4674af..89d9e8c 100644
--- a/source/blender/blenkernel/BKE_nparticle.h
+++ b/source/blender/blenkernel/BKE_nparticle.h
@@ -30,11 +30,18 @@
  */
 
 struct NParticleBuffer;
+struct NParticleBufferAttribute;
 
 struct NParticleBuffer *BKE_nparticle_buffer_new(void);
 void BKE_nparticle_buffer_free(struct NParticleBuffer *buf);
 struct NParticleBuffer *BKE_nparticle_buffer_copy(struct NParticleBuffer *buf);
 
+struct NParticleBufferAttribute *BKE_nparticle_attribute_find(struct NParticleBuffer *buf, const char *name);
+struct NParticleBufferAttribute *BKE_nparticle_attribute_new(struct NParticleBuffer *buf, const char *name, int datatype);
+void BKE_nparticle_attribute_remove(struct NParticleBuffer *buf, struct NParticleBufferAttribute *attr);
+void BKE_nparticle_attribute_remove_all(struct NParticleBuffer *buf);
+void BKE_nparticle_attribute_move(struct NParticleBuffer *buf, int from_index, int to_index);
+
 
 #if 0 /* old code */
 #include "BLI_math.h"
diff --git a/source/blender/blenkernel/intern/nparticle.c b/source/blender/blenkernel/intern/nparticle.c
index d993151..491103f 100644
--- a/source/blender/blenkernel/intern/nparticle.c
+++ b/source/blender/blenkernel/intern/nparticle.c
@@ -26,9 +26,13 @@
  *  \ingroup bke
  */
 
+#include <string.h>
 #include "MEM_guardedalloc.h"
 
+#include "BLI_listbase.h"
 #include "BLI_pagedbuffer.h"
+#include "BLI_string.h"
+#include "BLI_utildefines.h"
 
 #include "DNA_nparticle_types.h"
 
@@ -37,27 +41,121 @@
 /* XXX TODO make this configurable */
 #define PAGE_BYTES 65536
 
+static size_t nparticle_elem_bytes(int datatype)
+{
+	switch (datatype) {
+		case PAR_ATTR_DATATYPE_FLOAT: return sizeof(float);
+		case PAR_ATTR_DATATYPE_INT: return sizeof(int);
+		case PAR_ATTR_DATATYPE_BOOL: return sizeof(bool);
+		case PAR_ATTR_DATATYPE_VECTOR:
+		case PAR_ATTR_DATATYPE_POINT:
+		case PAR_ATTR_DATATYPE_NORMAL:
+			return sizeof(float)*3;
+		case PAR_ATTR_DATATYPE_COLOR: return sizeof(float)*4;
+		case PAR_ATTR_DATATYPE_MATRIX: return sizeof(float)*16;
+
+		default:
+			BLI_assert(false);	/* unknown datatype, should never happen */
+			return 0;
+	}
+}
+
 NParticleBuffer *BKE_nparticle_buffer_new(void)
 {
 	NParticleBuffer *buf = MEM_callocN(sizeof(NParticleBuffer), "nparticle buffer");
-	BLI_pbuf_init(&buf->data, PAGE_BYTES);
 	return buf;
 }
 
 void BKE_nparticle_buffer_free(NParticleBuffer *buf)
 {
-	BLI_pbuf_free(&buf->data);
 	MEM_freeN(buf);
 }
 
 NParticleBuffer *BKE_nparticle_buffer_copy(NParticleBuffer *buf)
 {
 	NParticleBuffer *nbuf = MEM_dupallocN(buf);
-	BLI_pbuf_copy(&nbuf->data, &buf->data);
 	return nbuf;
 }
 
 
+NParticleBufferAttribute *BKE_nparticle_attribute_find(NParticleBuffer *buf, const char *name)
+{
+	NParticleBufferAttribute *attr;
+	for (attr = buf->attributes.first; attr; attr = attr->next)
+		if (STREQ(attr->desc.name, name))
+			return attr;
+	return NULL;
+}
+
+NParticleBufferAttribute *BKE_nparticle_attribute_new(NParticleBuffer *buf, const char *name, int datatype)
+{
+	NParticleBufferAttribute *attr;
+	
+	attr = BKE_nparticle_attribute_find(buf, name);
+	if (attr) {
+		/* if attribute with the same name exists, remove it first */
+		BKE_nparticle_attribute_remove(buf, attr);
+	}
+	
+	if (!attr) {
+		attr = MEM_callocN(sizeof(NParticleBufferAttribute), "particle buffer attribute");
+		BLI_strncpy(attr->desc.name, name, sizeof(attr->desc.name));
+		attr->desc.datatype = datatype;
+		BLI_pbuf_init(&attr->data, PAGE_BYTES, nparticle_elem_bytes(datatype));
+	
+		BLI_addtail(&buf->attributes, attr);
+	}
+	
+	return attr;
+}
+
+void BKE_nparticle_attribute_remove(NParticleBuffer *buf, NParticleBufferAttribute *attr)
+{
+	BLI_remlink(&buf->attributes, attr);
+	
+	BLI_pbuf_free(&attr->data);
+	MEM_freeN(attr);
+}
+
+void BKE_nparticle_attribute_remove_all(NParticleBuffer *buf)
+{
+	NParticleBufferAttribute *attr, *attr_next;
+	for (attr = buf->attributes.first; attr; attr = attr_next) {
+		attr_next = attr->next;
+		
+		BLI_pbuf_free(&attr->data);
+		MEM_freeN(attr);
+	}
+	buf->attributes.first = buf->attributes.last = NULL;
+}
+
+void BKE_nparticle_attribute_move(NParticleBuffer *buf, int from_index, int to_index)
+{
+	NParticleAttribute *attr;
+	
+	if (from_index == to_index)
+		return;
+	if (from_index < 0 || to_index < 0)
+		return;
+	
+	attr = BLI_findlink(&buf->attributes, from_index);
+	if (to_index < from_index) {
+		NParticleAttribute *nextattr = BLI_findlink(&buf->attributes, to_index);
+		if (nextattr) {
+			BLI_remlink(&buf->attributes, attr);
+			BLI_insertlinkbefore(&buf->attributes, nextattr, attr);
+		}
+	}
+	else {
+		NParticleAttribute *prevattr = BLI_findlink(&buf->attributes, to_index);
+		if (prevattr) {
+			BLI_remlink(&buf->attributes, attr);
+			BLI_insertlinkafter(&buf->attributes, prevattr, attr);
+		}
+	}
+}
+
+
 #if 0 /* old code */
 #include <assert.h>
 #include <stdlib.h>
diff --git a/source/blender/blenlib/BLI_pagedbuffer.h b/source/blender/blenlib/BLI_pagedbuffer.h
index e0dbe54..94ae2b2 100644
--- a/source/blender/blenlib/BLI_pagedbuffer.h
+++ b/source/blender/blenlib/BLI_pagedbuffer.h
@@ -35,21 +35,12 @@
 #include "BLI_utildefines.h"
 
 struct bPagedBuffer;
-struct bPagedBufferLayer;
 
-void BLI_pbuf_init(struct bPagedBuffer *pbuf, size_t page_bytes);
+void BLI_pbuf_init(struct bPagedBuffer *pbuf, size_t page_bytes, size_t elem_bytes);
 void BLI_pbuf_free(struct bPagedBuffer *pbuf);
 void BLI_pbuf_copy(struct bPagedBuffer *to, struct bPagedBuffer *from);
 
-struct bPagedBufferLayer *BLI_pbuf_layer_insert(struct bPagedBuffer *pbuf, size_t elem_bytes, int pos);
-void BLI_pbuf_layer_add(struct bPagedBuffer *pbuf, size_t elem_bytes);
-struct bPagedBufferLayer *BLI_pbuf_layer_copy(struct bPagedBuffer *pbuf, int pos, int insert_pos);
-void BLI_pbuf_layer_remove(struct bPagedBuffer *pbuf, int pos);
-void BLI_pbuf_layer_move(struct bPagedBuffer *pbuf, int from_pos, int to_pos);
-
-
-
-
+void BLI_pbuf_add_elements(struct bPagedBuffer *pbuf, int num_elem);
 
 
 #if 0
diff --git a/source/blender/blenlib/intern/pagedbuffer.c b/source/blender/blenlib/intern/pagedbuffer.c
index d2565d9..226f10d 100644
--- a/source/blender/blenlib/intern/pagedbuffer.c
+++ b/source/blender/blenlib/intern/pagedbuffer.c
@@ -45,7 +45,7 @@ BLI_INLINE div_t div_ceil(int a, int b)
 	return result;
 }
 
-static int pbuf_layer_page_size_from_bytes(size_t page_bytes, size_t elem_bytes)
+static int pbuf_page_size_from_bytes(size_t page_bytes, size_t elem_bytes)
 {
 	div_t page_size = div(page_bytes, elem_bytes);
 	#ifdef PBUF_ALIGN_STRICT
@@ -54,191 +54,125 @@ static int pbuf_layer_page_size_from_bytes(size_t page_bytes, size_t elem_bytes)
 	return page_size.quot;
 }
 
-static void pbuf_layer_page_alloc(bPagedBufferLayer *layer, int p, size_t page_bytes)
+static void pbuf_page_alloc(bPagedBuffer *pbuf, int p)
 {
-	bPagedBufferPage *page = &layer->pages[p];
+	bPagedBufferPage *page = &pbuf->pages[p];
 	if (!page->data) {
-		page->data = MEM_mallocN(page_bytes, "paged buffer page");
-		layer->totalloc += layer->page_size;
+		page->data = MEM_mallocN(pbuf->page_bytes, "paged buffer page");
+		pbuf->totalloc += pbuf->page_size;
 	}
 }
 
-static void pbuf_layer_page_free(bPagedBufferLayer *layer, int p)
+static void pbuf_page_free(bPagedBuffer *pbuf, int p)
 {
-	bPagedBufferPage *page = &layer->pages[p];
+	bPagedBufferPage *page = &pbuf->pages[p];
 	if (page->data) {
 		MEM_freeN(page->data);
-		layer->totalloc -= layer->page_size;
+		pbuf->totalloc -= pbuf->page_size;
 	}
 }
 
-typedef enum ePagedBufferLayerPageAlloc {
+typedef enum {
 	PBUF_PAGE_ALLOC_NONE,	/* don't allocate any page data */
 	PBUF_PAGE_ALLOC_EXTEND,	/* allocate only new page data */
 	PBUF_PAGE_ALLOC_ALL		/* allocate all page data */
-} ePagedBufferLayerPageAlloc;
+} ePagedBufferPageAlloc;
 
-static void pbuf_layer_set_totelem(bPagedBufferLayer *layer, size_t page_bytes, int totelem, int new_totelem, ePagedBufferLayerPageAlloc alloc_mode)
+static void pbuf_set_totelem(bPagedBuffer *pbuf, int totelem, ePagedBufferPageAlloc alloc_mode)
 {
-	div_t div_elem = div_ceil(new_totelem, layer->page_size);
-	int ntotpages = div_elem.quot;
-	//	int npagefill = div_elem.rem;
-	bPagedBufferPage *npages;
-	int startp = totelem / layer->page_size;
-	int p;
-	
-	if (ntotpages == 0) {
-		layer->pages = NULL;
-		layer->totpages = 0;
-		return;
-	}
-	
-	npages = MEM_callocN(sizeof(bPagedBufferPage) * ntotpages, "paged buffer page array");
-	if (layer->pages) {
-		int copyp = min_ii(layer->totpages, ntotpages);
-		memcpy(npages, layer->pages, sizeof(bPagedBufferPage) * copyp);
-		MEM_freeN(layer->pages);
-	}
-	
-	layer->pages = npages;
-	layer->totpages = ntotpages;
-	
-	/* init data */
-	switch (alloc_mode) {
-	case PBUF_PAGE_ALLOC_EXTEND:
-		for (p = startp; p < ntotpages; ++p)
-			pbuf_layer_page_alloc(layer, p, page_bytes);
-		break;
-	case PBUF_PAGE_ALLOC_ALL:
-		for (p = 0; p < ntotpages; ++p)
-			pbuf_layer_page_alloc(layer, p, page_bytes);
-		break;
-	case PBUF_PAGE_ALLOC_NONE:
-		/* nothing to do, data pointers are NULL already */
-		break;
+	div_t div_elem = div_ceil(totelem, pbuf->page_size);
+	int totpages = div_elem.quot;
+	//	int pagefill = div_elem.rem;
+	if (totpages == 0) {
+		pbuf->pages = NULL;
+		pbuf->totpages = 0;
+		pbuf->totelem = 0;
+		pbuf->totalloc = 0;
 	}
-}
-
-/* XXX TODO add optional iterator to determine dead pages? */
-static bPagedBufferLayer *pbuf_layer_new(int totelem, size_t page_bytes, size_t elem_bytes)
-{
-	bPagedBufferLayer *layer = MEM_callocN(sizeof(bPagedBufferLayer), "paged buffer layer");
-	layer->elem_bytes = elem_bytes;
-	layer->page_size = pbuf_layer_page_size_from_bytes(page_bytes, elem_bytes);
-	
-	pbuf_layer_set_totelem(layer, page_bytes, 0, totelem, PBUF_PAGE_ALLOC_ALL);
-	
-	return layer;
-}
-
-static void pbuf_layer_free(bPagedBufferLayer *layer)
-{
-	if (layer->pages) {
+	else {
+		bPagedBufferPage *pages = MEM_callocN(sizeof(bPagedBufferPage) * totpages, "paged buffer page array");
+		int startp = totelem / pbuf->page_size;
 		int p;
-		for (p = 0; p < layer->totpages; ++p)
-			pbuf_layer_page_free(layer, p);
-		MEM_freeN(layer->pages);
+		
+		if (pbuf->pages) {
+			int copyp = min_ii(pbuf->tot

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list