[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