[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