[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13616] branches/pynodes/source/blender/ python/api2_2x/Node.c: == Pynodes ==
Willian Padovani Germano
wpgermano at gmail.com
Sat Feb 9 20:05:17 CET 2008
Revision: 13616
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13616
Author: ianwill
Date: 2008-02-09 20:05:15 +0100 (Sat, 09 Feb 2008)
Log Message:
-----------
== Pynodes ==
More updates to the scripting side: support for int indexes when accessing input and output socket lists.
Modified Paths:
--------------
branches/pynodes/source/blender/python/api2_2x/Node.c
Modified: branches/pynodes/source/blender/python/api2_2x/Node.c
===================================================================
--- branches/pynodes/source/blender/python/api2_2x/Node.c 2008-02-09 19:00:12 UTC (rev 13615)
+++ branches/pynodes/source/blender/python/api2_2x/Node.c 2008-02-09 19:05:15 UTC (rev 13616)
@@ -61,7 +61,7 @@
PyObject *item, *arg;
bNodeSocketType *newsocks = NULL;
char *s_name = NULL;
- int s_type = 0;
+ int s_type = SOCK_VALUE;
float s_val[4], s_min, s_max;
if (BTST2(stage, NODE_DYNAMIC_READY, NODE_DYNAMIC_ADDEXIST))
@@ -74,8 +74,9 @@
for (pos = 0, a = 0; pos< len; pos++, a++) {
/* default socket values: */
s_name = NULL;
+ s_type = SOCK_VALUE;
s_min = 0.0f;
- s_max = 0.0f;
+ s_max = 1.0f;
s_val[0] = s_val[1] = s_val[2] = s_val[3] = 1.0f;
item = PyTuple_GetItem(tuple, pos);
@@ -362,38 +363,41 @@
return -1;
}
-PyObject *sockinmap_subscript(BPy_SockMap *self, PyObject *idx) {
- int _idx;
+PyObject *sockinmap_subscript(BPy_SockMap *self, PyObject *pyidx) {
+ int idx;
- if (!self->node) Py_RETURN_NONE;
+ if (!self->node)
+ return EXPP_ReturnPyObjError(PyExc_RuntimeError, "no access to Blender node data!");
- if (PyString_Check(idx)) {
- _idx = sockinmap_has_key(self, idx);
+ if (PyString_Check(pyidx)) {
+ idx = sockinmap_has_key(self, pyidx);
}
- else if(PyInt_Check(idx)) {
- return EXPP_ReturnPyObjError(PyExc_ValueError, "int index not implemented");
+ else if(PyInt_Check(pyidx)) {
+ int len = sockinmap_len(self);
+ idx = (int)PyInt_AsLong(pyidx);
+ if (idx < 0 || idx >= len)
+ return EXPP_ReturnPyObjError(PyExc_IndexError, "index out of range");
}
- else if (PySlice_Check(idx)) {
+ else if (PySlice_Check(pyidx)) {
return EXPP_ReturnPyObjError(PyExc_ValueError, "slices not implemented");
} else {
return EXPP_ReturnPyObjError(PyExc_IndexError, "index must be an int or a string");
}
- if(_idx<0) {
- PyErr_SetString(PyExc_ValueError, "no such socket");
- Py_RETURN_NONE;
+ if(idx<0) { /* we're not as nice as Python */
+ return EXPP_ReturnPyObjError(PyExc_IndexError, "invalid socket index");
}
- switch(self->node->typeinfo->inputs[_idx].type) {
+ switch(self->node->typeinfo->inputs[idx].type) {
case SOCK_VALUE:
- return Py_BuildValue("f", self->stack[_idx]->vec[0]);
+ return Py_BuildValue("f", self->stack[idx]->vec[0]);
break;
case SOCK_VECTOR:
- return Py_BuildValue("(fff)", self->stack[_idx]->vec[0], self->stack[_idx]->vec[1], self->stack[_idx]->vec[2]);
+ return Py_BuildValue("(fff)", self->stack[idx]->vec[0], self->stack[idx]->vec[1], self->stack[idx]->vec[2]);
break;
case SOCK_RGBA:
/* otherwise RGBA tuple */
- return Py_BuildValue("(ffff)", self->stack[_idx]->vec[0], self->stack[_idx]->vec[1], self->stack[_idx]->vec[2], self->stack[_idx]->vec[3]);
+ return Py_BuildValue("(ffff)", self->stack[idx]->vec[0], self->stack[idx]->vec[1], self->stack[idx]->vec[2], self->stack[idx]->vec[3]);
break;
default:
break;
@@ -529,20 +533,23 @@
return -1;
}
-static int sockoutmap_assign_subscript(BPy_SockMap *self, PyObject *idx, PyObject *value) {
- int i, _idx, len, wanted_len, ret = -1;
+static int sockoutmap_assign_subscript(BPy_SockMap *self, PyObject *pyidx, PyObject *value) {
+ int i, idx, len, wanted_len = 0, ret = -1;
PyObject *val;
PyObject **items;
- if (!self->node) return -1;
+ if (!self->node)
+ return EXPP_ReturnIntError(PyExc_RuntimeError, "no access to Blender node data!");
- if (PyInt_Check(idx)) {
- _idx = (int)PyInt_AsLong(idx);
+ if (PyInt_Check(pyidx)) {
+ idx = (int)PyInt_AsLong(pyidx);
+ if (idx < 0 || idx >= sockinmap_len(self))
+ return EXPP_ReturnIntError(PyExc_IndexError, "index out of range");
}
- else if (PyString_Check(idx)) {
- _idx = sockoutmap_has_key(self, idx);
+ else if (PyString_Check(pyidx)) {
+ idx = sockoutmap_has_key(self, pyidx);
}
- else if (PySlice_Check(idx)) {
+ else if (PySlice_Check(pyidx)) {
return EXPP_ReturnIntError(PyExc_ValueError, "slices not yet implemented");
} else {
return EXPP_ReturnIntError(PyExc_IndexError, "index must be a positive int or a string");
@@ -570,30 +577,30 @@
}
}
- switch(self->node->typeinfo->outputs[_idx].type) {
+ switch(self->node->typeinfo->outputs[idx].type) {
case SOCK_VALUE:
wanted_len = 1;
if (len == 1) {
- self->stack[_idx]->vec[0] = (float)PyFloat_AsDouble(items[0]);
+ self->stack[idx]->vec[0] = (float)PyFloat_AsDouble(items[0]);
ret = 0;
}
break;
case SOCK_VECTOR:
wanted_len = 3;
if (len == 3) {
- self->stack[_idx]->vec[0] = (float)PyFloat_AsDouble(items[0]);
- self->stack[_idx]->vec[1] = (float)PyFloat_AsDouble(items[1]);
- self->stack[_idx]->vec[2] = (float)PyFloat_AsDouble(items[2]);
+ self->stack[idx]->vec[0] = (float)PyFloat_AsDouble(items[0]);
+ self->stack[idx]->vec[1] = (float)PyFloat_AsDouble(items[1]);
+ self->stack[idx]->vec[2] = (float)PyFloat_AsDouble(items[2]);
ret = 0;
}
break;
case SOCK_RGBA:
wanted_len = 4;
if (len == 4) {
- self->stack[_idx]->vec[0] = (float)PyFloat_AsDouble(items[0]);
- self->stack[_idx]->vec[1] = (float)PyFloat_AsDouble(items[1]);
- self->stack[_idx]->vec[2] = (float)PyFloat_AsDouble(items[2]);
- self->stack[_idx]->vec[3] = (float)PyFloat_AsDouble(items[3]);
+ self->stack[idx]->vec[0] = (float)PyFloat_AsDouble(items[0]);
+ self->stack[idx]->vec[1] = (float)PyFloat_AsDouble(items[1]);
+ self->stack[idx]->vec[2] = (float)PyFloat_AsDouble(items[2]);
+ self->stack[idx]->vec[3] = (float)PyFloat_AsDouble(items[3]);
ret = 0;
}
break;
More information about the Bf-blender-cvs
mailing list