[Bf-blender-cvs] [3033fdd] particles_refactor: Added particles sequence in state bpy api.

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


Commit: 3033fdd5025cc706a2ed77debe8f83ab6ea18cdd
Author: Lukas Tönne
Date:   Fri Dec 20 10:30:21 2013 +0100
https://developer.blender.org/rB3033fdd5025cc706a2ed77debe8f83ab6ea18cdd

Added particles sequence in state bpy api.

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

M	source/blender/blenkernel/BKE_nparticle.h
M	source/blender/blenkernel/intern/nparticle.c
M	source/blender/python/bparticles/bparticles_py_types.c
M	source/blender/python/bparticles/bparticles_py_types.h

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

diff --git a/source/blender/blenkernel/BKE_nparticle.h b/source/blender/blenkernel/BKE_nparticle.h
index 2502158..9648b10 100644
--- a/source/blender/blenkernel/BKE_nparticle.h
+++ b/source/blender/blenkernel/BKE_nparticle.h
@@ -30,6 +30,7 @@
  */
 
 #include "BLI_sys_types.h"
+#include "BLI_utildefines.h"
 
 struct NParticleSystem;
 struct NParticleAttribute;
@@ -62,6 +63,8 @@ int BKE_nparticle_state_num_attributes(struct NParticleState *state);
 struct NParticleAttributeState *BKE_nparticle_state_find_attribute(struct NParticleState *state, const char *name);
 struct NParticleAttributeState *BKE_nparticle_state_get_attribute_by_index(struct NParticleState *state, int index);
 
+int BKE_nparticle_state_num_particles(struct NParticleState *state);
+
 typedef struct NParticleAttributeStateIterator {
 	/* XXX for now is simply a pointer, using ListBase next/prev.
 	 * Eventually this will become a hash table iterator.
@@ -97,6 +100,11 @@ void BKE_nparticle_iter_set_float(struct NParticleIterator *it, const char *attr
 void BKE_nparticle_iter_get_vector(struct NParticleIterator *it, const char *attr, float *result);
 void BKE_nparticle_iter_set_vector(struct NParticleIterator *it, const char *attr, const float *value);
 
+BLI_INLINE NParticleID BKE_nparticle_iter_get_id(struct NParticleIterator *it)
+{
+	return (NParticleID)BKE_nparticle_iter_get_int(it, "id");
+}
+
 
 struct NParticleDisplay *BKE_nparticle_display_particle(void);
 struct NParticleDisplay *BKE_nparticle_display_copy(struct NParticleDisplay *display);
diff --git a/source/blender/blenkernel/intern/nparticle.c b/source/blender/blenkernel/intern/nparticle.c
index 1951687..a7ec704 100644
--- a/source/blender/blenkernel/intern/nparticle.c
+++ b/source/blender/blenkernel/intern/nparticle.c
@@ -364,15 +364,26 @@ NParticleAttributeState *BKE_nparticle_state_find_attribute(NParticleState *stat
 	return NULL;
 }
 
+BLI_INLINE NParticleAttributeState *nparticle_state_find_attribute_id(NParticleState *state)
+{
+	return BKE_nparticle_state_find_attribute(state, "id");
+}
+
 NParticleAttributeState *BKE_nparticle_state_get_attribute_by_index(NParticleState *state, int index)
 {
 	return BLI_findlink(&state->attributes, index);
 }
 
+int BKE_nparticle_state_num_particles(NParticleState *state)
+{
+	NParticleAttributeState *attrstate = nparticle_state_find_attribute_id(state);
+	return attrstate ? attrstate->data.totelem : 0;
+}
+
 
 int BKE_nparticle_find_index(NParticleState *state, NParticleID id)
 {
-	NParticleAttributeState *attrstate = BKE_nparticle_state_find_attribute(state, "id");
+	NParticleAttributeState *attrstate = nparticle_state_find_attribute_id(state);
 	if (attrstate) {
 		bPagedBuffer *pbuf = &attrstate->data;
 		bPagedBufferIterator it;
@@ -449,7 +460,7 @@ void BKE_nparticle_iter_next(NParticleIterator *it)
 
 bool BKE_nparticle_iter_valid(NParticleIterator *it)
 {
-	NParticleAttributeState *attrstate = BKE_nparticle_state_find_attribute(it->state, "id");
+	NParticleAttributeState *attrstate = nparticle_state_find_attribute_id(it->state);
 	if (attrstate)
 		return it->index < attrstate->data.totelem;
 	else
diff --git a/source/blender/python/bparticles/bparticles_py_types.c b/source/blender/python/bparticles/bparticles_py_types.c
index 468d2fb..efe54df 100644
--- a/source/blender/python/bparticles/bparticles_py_types.c
+++ b/source/blender/python/bparticles/bparticles_py_types.c
@@ -58,6 +58,18 @@ PyDoc_STRVAR(bpy_bpar_attrstateiter_doc,
 "Iterator for looping over particle attribute states\n"
 );
 
+PyDoc_STRVAR(bpy_bpar_particle_doc,
+"Single particle in state data\n"
+);
+
+PyDoc_STRVAR(bpy_bpar_particleseq_doc,
+"Particle sequence\n"
+);
+
+PyDoc_STRVAR(bpy_bpar_particleiter_doc,
+"Iterator for looping over particles\n"
+);
+
 
 PyDoc_STRVAR(bpy_bpar_state_attributes_doc,
 "State attributes (read-only).\n\n:type: :class:`NParticleAttributeStateSeq`"
@@ -102,6 +114,18 @@ static PyObject *bpy_bpar_attrstate_repr(BPy_NParticleAttributeState *self)
 	}
 }
 
+static PyObject *bpy_bpar_particle_repr(BPy_NParticleParticle *self)
+{
+	NParticleIterator *iter = &self->iter;
+
+	if (iter->index >= 0) {
+		return PyUnicode_FromFormat("<NParticleParticle index=%d>", iter->index);
+	}
+	else {
+		return PyUnicode_FromFormat("<NParticleParticle invalid>");
+	}
+}
+
 static PyGetSetDef bpy_bpar_state_getseters[] = {
 	{(char *)"attributes", (getter)bpy_bpar_state_attributes_get, (setter)NULL, (char *)bpy_bpar_state_attributes_doc, NULL},
 	{NULL, NULL, NULL, NULL, NULL} /* Sentinel */
@@ -120,6 +144,10 @@ static struct PyMethodDef bpy_bpar_attrstate_methods[] = {
 	{NULL, NULL, 0, NULL}
 };
 
+static PyGetSetDef bpy_bpar_particle_getseters[] = {
+	{NULL, NULL, NULL, NULL, NULL} /* Sentinel */
+};
+
 static Py_hash_t bpy_bpar_state_hash(PyObject *self)
 {
 	return _Py_HashPointer(((BPy_NParticleState *)self)->state);
@@ -278,6 +306,69 @@ static PyMappingMethods bpy_bpar_attrstateseq_as_mapping = {
 	(objobjargproc)NULL,                                /* mp_ass_subscript */
 };
 
+static Py_ssize_t bpy_bpar_particleseq_length(BPy_NParticleAttributeStateSeq *self)
+{
+	return BKE_nparticle_state_num_particles(self->state);
+}
+
+static PyObject *bpy_bpar_particleseq_subscript_int(BPy_NParticleAttributeStateSeq *self, int keynum)
+{
+	NParticleIterator iter;
+	
+	BKE_nparticle_iter_find_id(self->state, &iter, (NParticleID)keynum);
+	if (BKE_nparticle_iter_valid(&iter))
+		return BPy_NParticleParticle_CreatePyObject(self->state, iter);
+	
+	PyErr_Format(PyExc_IndexError,
+	             "NParticleParticleSeq[id]: id %d not found", keynum);
+	return NULL;
+}
+
+static int bpy_bpar_particleseq_contains(BPy_NParticleParticleSeq *self, PyObject *value)
+{
+	if (BPy_NParticleParticle_Check(value)) {
+		BPy_NParticleParticle *particle_py = (BPy_NParticleParticle *)value;
+		return particle_py->state == self->state && BKE_nparticle_iter_valid(&particle_py->iter);
+	}
+	return 0;
+}
+
+static PyObject *bpy_bpar_particleseq_subscript(BPy_NParticleAttributeStateSeq *self, PyObject *key)
+{
+	if (PyIndex_Check(key)) {
+		Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
+		if (i == -1 && PyErr_Occurred())
+			return NULL;
+		return bpy_bpar_particleseq_subscript_int(self, i);
+	}
+	else {
+		PyErr_Format(PyExc_TypeError,
+		             "NParticleAttributeStateSeq[key]: invalid key, "
+		             "must be an int, not %.200s",
+		             Py_TYPE(key)->tp_name);
+		return NULL;
+	}
+}
+
+static PySequenceMethods bpy_bpar_particleseq_as_sequence = {
+	(lenfunc)bpy_bpar_particleseq_length,               /* sq_length */
+	NULL,                                               /* sq_concat */
+	NULL,                                               /* sq_repeat */
+	(ssizeargfunc)bpy_bpar_particleseq_subscript_int,   /* sq_item */ /* Only set this so PySequence_Check() returns True */
+	NULL,                                               /* sq_slice */
+	(ssizeobjargproc)NULL,                              /* sq_ass_item */
+	NULL,                                               /* *was* sq_ass_slice */
+	(objobjproc)bpy_bpar_particleseq_contains,          /* sq_contains */
+	(binaryfunc) NULL,                                  /* sq_inplace_concat */
+	(ssizeargfunc) NULL,                                /* sq_inplace_repeat */
+};
+
+static PyMappingMethods bpy_bpar_particleseq_as_mapping = {
+	(lenfunc)bpy_bpar_particleseq_length,               /* mp_length */
+	(binaryfunc)bpy_bpar_particleseq_subscript,         /* mp_subscript */
+	(objobjargproc)NULL,                                /* mp_ass_subscript */
+};
+
 /* Iterator
  * -------- */
 
@@ -303,6 +394,28 @@ static PyObject *bpy_bpar_attrstateiter_next(BPy_NParticleAttributeStateIter *se
 	}
 }
 
+static PyObject *bpy_bpar_particleseq_iter(BPy_NParticleParticleSeq *self)
+{
+	BPy_NParticleParticleIter *py_iter;
+
+	py_iter = (BPy_NParticleParticleIter *)BPy_NParticleParticleIter_CreatePyObject(self->state);
+	BKE_nparticle_iter_init(self->state, &py_iter->iter);
+	return (PyObject *)py_iter;
+}
+
+static PyObject *bpy_bpar_particleiter_next(BPy_NParticleParticleIter *self)
+{
+	if (BKE_nparticle_iter_valid(&self->iter)) {
+		PyObject *result = BPy_NParticleParticle_CreatePyObject(self->state, self->iter);
+		BKE_nparticle_iter_next(&self->iter);
+		return result;
+	}
+	else {
+		PyErr_SetNone(PyExc_StopIteration);
+		return NULL;
+	}
+}
+
 /* Dealloc Functions
  * ================= */
 
@@ -335,13 +448,31 @@ static void bpy_bpar_attrstateiter_dealloc(BPy_NParticleAttributeStateIter *self
 	PyObject_DEL(self);
 }
 
+static void bpy_bpar_particle_dealloc(BPy_NParticleParticle *self)
+{
+	PyObject_DEL(self);
+}
+
+static void bpy_bpar_particleseq_dealloc(BPy_NParticleParticleSeq *self)
+{
+	PyObject_DEL(self);
+}
+
+static void bpy_bpar_particleiter_dealloc(BPy_NParticleParticleIter *self)
+{
+	PyObject_DEL(self);
+}
+
 /* Types
  * ===== */
 
 PyTypeObject BPy_NParticleState_Type                = {{{0}}};
+PyTypeObject BPy_NParticleAttributeState_Type       = {{{0}}};
 PyTypeObject BPy_NParticleAttributeStateSeq_Type    = {{{0}}};
 PyTypeObject BPy_NParticleAttributeStateIter_Type   = {{{0}}};
-PyTypeObject BPy_NParticleAttributeState_Type       = {{{0}}};
+PyTypeObject BPy_NParticleParticle_Type             = {{{0}}};
+PyTypeObject BPy_NParticleParticleSeq_Type          = {{{0}}};
+PyTypeObject BPy_NParticleParticleIter_Type         = {{{0}}};
 
 void BPy_BPAR_init_types(void)
 {
@@ -349,60 +480,95 @@ void BPy_BPAR_init_types(void)
 	BPy_NParticleAttributeState_Type.tp_basicsize       = sizeof(BPy_NParticleAttributeState);
 	BPy_NParticleAttributeStateSeq_Type.tp_basicsize    = sizeof(BPy_NParticleAttributeStateSeq);
 	BPy_NParticleAttributeStateIter_Type.tp_basicsize   = sizeof(BPy_NParticleAttributeStateIter);
+	BPy_NParticleParticle_Type.tp_basicsize             = sizeof(BPy_NParticleParticle);
+	BPy_NParticleParticleSeq_Type.tp_basicsize          = sizeof(BPy_NParticleParticleSeq);
+	BPy_NParticleParticleIter_Type.tp_basicsize         = sizeof(BPy_NParticleParticleIter);
 
 	BPy_NParticleState_Type.tp_name                     = "NParticleState";
 	BPy_NParticleAttributeState_Type.tp_name            = "NParticleAttributeState";
 	BPy_NParticl

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list