[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31331] branches/soc-2010-moguri-2/source/ gameengine/Ketsji: Adding a Uniform. value attribute which can be used to get/ set the value of all uniforms that are currently supported except for Sampler2D .
Mitchell Stokes
mogurijin at gmail.com
Sat Aug 14 03:33:29 CEST 2010
Revision: 31331
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31331
Author: moguri
Date: 2010-08-14 03:33:26 +0200 (Sat, 14 Aug 2010)
Log Message:
-----------
Adding a Uniform.value attribute which can be used to get/set the value of all uniforms that are currently supported except for Sampler2D. I'm not yet quite sure how to tackle this one. Maybe switching it from a Texture to an Image first will help.
Modified Paths:
--------------
branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_PythonShaders.cpp
branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_PythonShaders.h
Modified: branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_PythonShaders.cpp
===================================================================
--- branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_PythonShaders.cpp 2010-08-13 23:08:22 UTC (rev 31330)
+++ branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_PythonShaders.cpp 2010-08-14 01:33:26 UTC (rev 31331)
@@ -211,6 +211,7 @@
{
m_name = cu->name;
m_type = cu->type;
+ m_size = cu->size;
m_data = cu->data;
}
@@ -260,6 +261,159 @@
PyAttributeDef KX_PythonUniform::Attributes[] = {
KX_PYATTRIBUTE_STRING_RO("name", KX_PythonUniform, m_name),
KX_PYATTRIBUTE_SHORT_RO("type", KX_PythonUniform, m_type),
+ KX_PYATTRIBUTE_RW_FUNCTION("value", KX_PythonUniform, pyattr_get_value, pyattr_set_value),
{NULL} //Sentinel
};
+
+PyObject *KX_PythonUniform::pyattr_get_value(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+ KX_PythonUniform *self = static_cast<KX_PythonUniform*>(self_v);
+
+ switch(self->m_type)
+ {
+ case MA_UNF_FLOAT:
+ {
+ float val = *(float*)(&self->m_data);
+ return PyFloat_FromDouble(val);
+ }
+ case MA_UNF_VEC2:
+ case MA_UNF_VEC3:
+ case MA_UNF_VEC4:
+ {
+ float* val = static_cast<float*>(self->m_data);
+ PyObject* ret = PyList_New(self->m_size);
+
+ for (int i=0; i<self->m_size; ++i)
+ {
+ PyList_SetItem(ret, i, PyFloat_FromDouble(val[i]));
+ }
+
+ return ret;
+
+ }
+ case MA_UNF_INT:
+ {
+ int val = *(int*)(&self->m_data);
+ return PyLong_FromLong(val);
+ }
+ case MA_UNF_IVEC2:
+ case MA_UNF_IVEC3:
+ case MA_UNF_IVEC4:
+ {
+ int* val = static_cast<int*>(self->m_data);
+ PyObject* ret = PyList_New(self->m_size);
+
+ for (int i=0; i<self->m_size; ++i)
+ {
+ PyList_SetItem(ret, i, PyLong_FromLong(val[i]));
+ }
+
+ return ret;
+ }
+ case MA_UNF_SAMPLER2D:
+ PyErr_SetString(PyExc_AttributeError, "Sampler2D value not yet supported");
+ return NULL;
+ default:
+ // Should never happen
+ PyErr_SetString(PyExc_AttributeError, "invalid type for uniform, internal error");
+ return NULL;
+ }
+}
+
+int KX_PythonUniform::pyattr_set_value(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+ KX_PythonUniform *self = static_cast<KX_PythonUniform*>(self_v);
+
+ switch(self->m_type)
+ {
+ case MA_UNF_FLOAT:
+ {
+ if (!PyFloat_Check(value))
+ {
+ PyErr_SetString(PyExc_ValueError, "float uniform type requires a float value");
+ return PY_SET_ATTR_FAIL;
+ }
+
+ *(float*)(&self->m_data) = PyFloat_AsDouble(value);
+ return PY_SET_ATTR_SUCCESS;
+ }
+ case MA_UNF_VEC2:
+ case MA_UNF_VEC3:
+ case MA_UNF_VEC4:
+ {
+ if (!PySequence_Check(value))
+ {
+ PyErr_SetString(PyExc_ValueError, "vector uniform types require a sequence of floats");
+ return PY_SET_ATTR_FAIL;
+ }
+
+ if (PySequence_Size(value) != self->m_size)
+ {
+ PyErr_SetString(PyExc_ValueError, "not enough values in the sequence");
+ return PY_SET_ATTR_FAIL;
+ }
+
+ for (int i=0; i<self->m_size; ++i)
+ {
+ PyObject* val = PySequence_Fast_GET_ITEM(value, i);
+ if (!PyFloat_Check(val))
+ {
+ PyErr_SetString(PyExc_ValueError, "vector uniform types require a sequence of floats");
+ return PY_SET_ATTR_FAIL;
+ }
+ ((float*)self->m_data)[i] = PyFloat_AsDouble(val);
+ }
+
+ return PY_SET_ATTR_SUCCESS;
+ }
+ case MA_UNF_INT:
+ {
+ if (!PyLong_Check(value))
+ {
+ PyErr_SetString(PyExc_ValueError, "integer uniform type requires an integer value");
+ return PY_SET_ATTR_FAIL;
+ }
+
+ *(int*)(&self->m_data) = PyLong_AsLong(value);
+ return PY_SET_ATTR_SUCCESS;
+ }
+ case MA_UNF_IVEC2:
+ case MA_UNF_IVEC3:
+ case MA_UNF_IVEC4:
+ {
+ if (!PySequence_Check(value))
+ {
+ PyErr_SetString(PyExc_ValueError, "integer vector uniform types require a sequence of integers");
+ return PY_SET_ATTR_FAIL;
+ }
+
+ if (PySequence_Size(value) != self->m_size)
+ {
+ PyErr_SetString(PyExc_ValueError, "not enough values in the sequence");
+ return PY_SET_ATTR_FAIL;
+ }
+
+ for (int i=0; i<self->m_size; ++i)
+ {
+ PyObject* val = PySequence_Fast_GET_ITEM(value, i);
+ if (!PyLong_Check(val))
+ {
+ PyErr_SetString(PyExc_ValueError, "integer vector uniform types require a sequence of integers");
+ return PY_SET_ATTR_FAIL;
+ }
+ ((int*)self->m_data)[i] = PyLong_AsLong(val);
+ }
+
+ return PY_SET_ATTR_SUCCESS;
+ }
+ case MA_UNF_SAMPLER2D:
+ PyErr_SetString(PyExc_AttributeError, "Sampler2D value not yet supported");
+ return PY_SET_ATTR_FAIL;
+ default:
+ // Should never happen
+ PyErr_SetString(PyExc_AttributeError, "invalid type for uniform, internal error");
+ return PY_SET_ATTR_FAIL;
+ }
+}
+
#endif // ndef DISABLE_PYTHON
\ No newline at end of file
Modified: branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_PythonShaders.h
===================================================================
--- branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_PythonShaders.h 2010-08-13 23:08:22 UTC (rev 31330)
+++ branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_PythonShaders.h 2010-08-14 01:33:26 UTC (rev 31331)
@@ -70,6 +70,7 @@
STR_String m_name;
short m_type;
+ int m_size;
void *m_data;
public:
@@ -85,6 +86,9 @@
}
static PyObject* py_uniform_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
+
+ static PyObject* pyattr_get_value(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+ static int pyattr_set_value(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
};
#endif //ndef DISABLE_PYTHON
More information about the Bf-blender-cvs
mailing list