[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