[Bf-blender-cvs] [0579125] particles_refactor: Collection properties for actual data in particle buffers.
Lukas Tönne
noreply at git.blender.org
Tue Apr 22 12:05:30 CEST 2014
Commit: 05791252b2b905d8c55dd9ed25efa03632072e2a
Author: Lukas Tönne
Date: Wed Aug 14 13:23:35 2013 +0200
https://developer.blender.org/rB05791252b2b905d8c55dd9ed25efa03632072e2a
Collection properties for actual data in particle buffers.
===================================================================
M source/blender/blenkernel/BKE_nparticle.h
M source/blender/blenlib/BLI_pagedbuffer.h
M source/blender/blenlib/intern/pagedbuffer.c
M source/blender/makesrna/intern/rna_nparticle.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_nparticle.h b/source/blender/blenkernel/BKE_nparticle.h
index 89d9e8c..2d04cbf 100644
--- a/source/blender/blenkernel/BKE_nparticle.h
+++ b/source/blender/blenkernel/BKE_nparticle.h
@@ -42,7 +42,6 @@ void BKE_nparticle_attribute_remove(struct NParticleBuffer *buf, struct NParticl
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"
#include "BLI_pagedbuffer.h"
diff --git a/source/blender/blenlib/BLI_pagedbuffer.h b/source/blender/blenlib/BLI_pagedbuffer.h
index 94ae2b2..0eb922e 100644
--- a/source/blender/blenlib/BLI_pagedbuffer.h
+++ b/source/blender/blenlib/BLI_pagedbuffer.h
@@ -42,6 +42,20 @@ void BLI_pbuf_copy(struct bPagedBuffer *to, struct bPagedBuffer *from);
void BLI_pbuf_add_elements(struct bPagedBuffer *pbuf, int num_elem);
+void *BLI_pbuf_get(struct bPagedBuffer *pbuf, int index);
+
+
+typedef struct bPagedBufferIterator
+{
+ struct bPagedBufferPage *page;
+ void *data;
+ int index, page_index;
+} bPagedBufferIterator;
+
+void BLI_pbuf_iter_init(struct bPagedBuffer *pbuf, struct bPagedBufferIterator *iter);
+void BLI_pbuf_iter_next(struct bPagedBuffer *pbuf, struct bPagedBufferIterator *iter);
+bool BLI_pbuf_iter_valid(struct bPagedBuffer *pbuf, struct bPagedBufferIterator *iter);
+
#if 0
/* Buffer Management */
diff --git a/source/blender/blenlib/intern/pagedbuffer.c b/source/blender/blenlib/intern/pagedbuffer.c
index 226f10d..bcb480e 100644
--- a/source/blender/blenlib/intern/pagedbuffer.c
+++ b/source/blender/blenlib/intern/pagedbuffer.c
@@ -175,6 +175,57 @@ void BLI_pbuf_add_elements(bPagedBuffer *pbuf, int num_elem)
pbuf_set_totelem(pbuf, ntotelem, PBUF_PAGE_ALLOC_EXTEND);
}
+void *BLI_pbuf_get(bPagedBuffer *pbuf, int index)
+{
+ if (index < pbuf->totelem) {
+ div_t page_div = div(index, pbuf->page_size);
+ bPagedBufferPage *page = pbuf->pages + page_div.quot;
+ if (page->data)
+ return (char *)page->data + pbuf->elem_bytes * page_div.rem;
+ else
+ return NULL;
+ }
+ else
+ return NULL;
+}
+
+
+void BLI_pbuf_iter_init(bPagedBuffer *pbuf, bPagedBufferIterator *iter)
+{
+ iter->index = 0;
+ iter->page = pbuf->pages;
+ iter->page_index = 0;
+ while (iter->page->data == NULL && iter->index < pbuf->totelem) {
+ iter->index += pbuf->page_size;
+ ++iter->page;
+ }
+ iter->data = iter->page->data;
+}
+
+void BLI_pbuf_iter_next(bPagedBuffer *pbuf, bPagedBufferIterator *iter)
+{
+ ++iter->index;
+ ++iter->page_index;
+ if (iter->page_index < pbuf->page_size) {
+ iter->data = (char *)iter->data + pbuf->elem_bytes;
+ }
+ else {
+ ++iter->page;
+ iter->page_index = 0;
+ while (iter->page->data == NULL && iter->index < pbuf->totelem) {
+ iter->index += pbuf->page_size;
+ ++iter->page;
+ }
+ iter->data = iter->page->data;
+ }
+}
+
+bool BLI_pbuf_iter_valid(bPagedBuffer *pbuf, bPagedBufferIterator *iter)
+{
+ return iter->index < pbuf->totelem;
+}
+
+
#if 0
/************************************************/
/* Buffer Management */
diff --git a/source/blender/makesrna/intern/rna_nparticle.c b/source/blender/makesrna/intern/rna_nparticle.c
index aa918a8..448cb5f 100644
--- a/source/blender/makesrna/intern/rna_nparticle.c
+++ b/source/blender/makesrna/intern/rna_nparticle.c
@@ -32,9 +32,73 @@
#ifdef RNA_RUNTIME
+#include "MEM_guardedalloc.h"
+
+#include "BLI_math.h"
+#include "BLI_pagedbuffer.h"
+
#include "BKE_nparticle.h"
#include "BKE_report.h"
+#include "RNA_access.h"
+
+static StructRNA *rna_NParticleBufferAttribute_refine(PointerRNA *ptr)
+{
+ NParticleBufferAttribute *attr = ptr->data;
+ switch (attr->desc.datatype) {
+ case PAR_ATTR_DATATYPE_FLOAT:
+ return &RNA_NParticleBufferAttributeFloat;
+ case PAR_ATTR_DATATYPE_INT:
+ return &RNA_NParticleBufferAttributeInt;
+ case PAR_ATTR_DATATYPE_BOOL:
+ return &RNA_NParticleBufferAttributeBool;
+ case PAR_ATTR_DATATYPE_VECTOR:
+ return &RNA_NParticleBufferAttributeVector;
+ case PAR_ATTR_DATATYPE_POINT:
+ return &RNA_NParticleBufferAttributePoint;
+ case PAR_ATTR_DATATYPE_NORMAL:
+ return &RNA_NParticleBufferAttributeNormal;
+ case PAR_ATTR_DATATYPE_COLOR:
+ return &RNA_NParticleBufferAttributeColor;
+ case PAR_ATTR_DATATYPE_MATRIX:
+ return &RNA_NParticleBufferAttributeMatrix;
+
+ default:
+ BLI_assert(false); /* unknown data type, should never happen */
+ return &RNA_NParticleBufferAttribute;
+ }
+}
+
+/* Returns the RNA type used for data elements in the attribute buffer.
+ * This is mirrors the collection type (see rna_NParticleBufferAttribute_refine),
+ * which must also be specified since each collection has a fixed data type.
+ */
+static StructRNA *rna_NParticleBufferAttribute_data_srna(NParticleBufferAttribute *attr)
+{
+ switch (attr->desc.datatype) {
+ case PAR_ATTR_DATATYPE_FLOAT:
+ return &RNA_NParticleDataFloat;
+ case PAR_ATTR_DATATYPE_INT:
+ return &RNA_NParticleDataInt;
+ case PAR_ATTR_DATATYPE_BOOL:
+ return &RNA_NParticleDataBool;
+ case PAR_ATTR_DATATYPE_VECTOR:
+ return &RNA_NParticleDataVector;
+ case PAR_ATTR_DATATYPE_POINT:
+ return &RNA_NParticleDataPoint;
+ case PAR_ATTR_DATATYPE_NORMAL:
+ return &RNA_NParticleDataNormal;
+ case PAR_ATTR_DATATYPE_COLOR:
+ return &RNA_NParticleDataColor;
+ case PAR_ATTR_DATATYPE_MATRIX:
+ return &RNA_NParticleDataMatrix;
+
+ default:
+ BLI_assert(false); /* unknown data type, should never happen */
+ return &RNA_NParticleBufferAttribute;
+ }
+}
+
static void rna_NParticleAttribute_datatype_set(PointerRNA *ptr, int value)
{
// NParticleAttribute *attr = ptr->data;
@@ -42,6 +106,127 @@ static void rna_NParticleAttribute_datatype_set(PointerRNA *ptr, int value)
BLI_assert(false);
}
+static void rna_NParticleBufferAttribute_data_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
+{
+ NParticleBufferAttribute *attr = ptr->data;
+ bPagedBufferIterator *internal = MEM_callocN(sizeof(bPagedBufferIterator), "particle data iterator");
+ BLI_pbuf_iter_init(&attr->data, internal);
+
+ iter->internal = internal;
+ iter->valid = BLI_pbuf_iter_valid(&attr->data, internal);
+}
+
+static void rna_NParticleBufferAttribute_data_next(CollectionPropertyIterator *iter)
+{
+ NParticleBufferAttribute *attr = iter->ptr.data;
+ bPagedBufferIterator *internal = iter->internal;
+ BLI_pbuf_iter_next(&attr->data, internal);
+ iter->valid = BLI_pbuf_iter_valid(&attr->data, internal);
+}
+
+static void rna_NParticleBufferAttribute_data_end(CollectionPropertyIterator *iter)
+{
+ MEM_freeN(iter->internal);
+ iter->internal = NULL;
+}
+
+static PointerRNA rna_NParticleBufferAttribute_data_get(CollectionPropertyIterator *iter)
+{
+ NParticleBufferAttribute *attr = iter->ptr.data;
+ bPagedBufferIterator *internal = iter->internal;
+ StructRNA *data_srna = rna_NParticleBufferAttribute_data_srna(attr);
+ PointerRNA ptr;
+ RNA_pointer_create(iter->ptr.id.data, data_srna, internal->data, &ptr);
+ return ptr;
+}
+
+static int rna_NParticleBufferAttribute_data_length(PointerRNA *ptr)
+{
+ NParticleBufferAttribute *attr = ptr->data;
+ return attr->data.totelem;
+}
+
+int rna_NParticleBufferAttribute_data_lookup_int(PointerRNA *ptr, int key, PointerRNA *r_ptr)
+{
+ NParticleBufferAttribute *attr = ptr->data;
+ void *data = BLI_pbuf_get(&attr->data, key);
+ StructRNA *data_srna = rna_NParticleBufferAttribute_data_srna(attr);
+ RNA_pointer_create(ptr->id.data, data_srna, data, r_ptr);
+ return true;
+}
+
+int rna_NParticleBufferAttribute_data_assign_int(PointerRNA *ptr, int key, const PointerRNA *assign_ptr)
+{
+ NParticleBufferAttribute *attr = ptr->data;
+ void *data = BLI_pbuf_get(&attr->data, key);
+ StructRNA *data_srna = rna_NParticleBufferAttribute_data_srna(attr);
+ PointerRNA data_ptr;
+ RNA_pointer_create(ptr->id.data, data_srna, data, &data_ptr);
+ /* XXX TODO */
+ BLI_assert(false);
+ return true;
+}
+
+static float rna_NParticleDataFloat_get(PointerRNA *ptr)
+{
+ return *(float *)ptr->data;
+}
+
+static void rna_NParticleDataFloat_set(PointerRNA *ptr, float value)
+{
+ *(float *)ptr->data = value;
+}
+
+static int rna_NParticleDataInt_get(PointerRNA *ptr)
+{
+ return *(int *)ptr->data;
+}
+
+static void rna_NParticleDataInt_set(PointerRNA *ptr, int value)
+{
+ *(int *)ptr->data = value;
+}
+
+static int rna_NParticleDataBool_get(PointerRNA *ptr)
+{
+ return *(bool *)ptr->data;
+}
+
+static void rna_NParticleDataBool_set(PointerRNA *ptr, int value)
+{
+ *(bool *)ptr->data = value;
+}
+
+static void rna_NParticleDataVector_get(PointerRNA *ptr, float *result)
+{
+ copy_v3_v3(result, (float *)ptr->data);
+}
+
+static void rna_NParticleDataVector_set(PointerRNA *ptr, const float *value)
+{
+ copy_v3_v3((float *)ptr->data, value);
+}
+
+static void rna_NParticleDataColor_get(PointerRNA *ptr, float *result)
+{
+ copy_v4_v4(result, (float *)ptr->data);
+}
+
+static void rna_NParticleDataColor_set(PointerRNA *ptr, const float *value)
+{
+ copy_v4_v4((float *)ptr->data, value);
+}
+
+static void rna_NParticleDataMatrix_get(PointerRNA *ptr, float *result)
+{
+ copy_m4_m4((float(*)[4])result, (float(*)[4])ptr->data);
+}
+
+static void rna_NParticleDataMatrix_set(PointerRNA *ptr, const float *value)
+{
+ copy_m4_m4((float(*)[4])ptr->data, (float(*)[4])value);
+}
+
static NParticleBufferAttribute *rna_NParticleBuffer_attributes_new(NParticleBuffer *buf, ReportList *reports, const char *name, int datatype)
{
if (BKE_nparticle_attribute_find(buf, name)) {
@@ -109,17 +294,117 @@ static void def_nparticle_attribute(StructRNA *srna)
RNA_def_property_ui_text(prop, "Data Type", "Basic data type");
}
+/* defines a subtype of NParticleBufferAttribute with a specific collection property for actual data */
+static StructRNA *def_nparticle_buffer_attribute_type(BlenderRNA *brna, const char *structname, const char *data_structname)
+{
+ StructRNA *srna = RNA_def_struct(brna, structname, "NParticleBufferAttribute");
+ PropertyRNA *prop;
+
+ prop = RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_struct_type(prop, data_structname);
+ RNA_def_property_ui_text(prop, "Data", "");
+ RNA_def_property_collection_funcs(prop, "rna_NParticle
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list