[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31015] branches/soc-2010-moguri-2/source/ gameengine/Ketsji: Adding a uniforms list to KX_PythonShader
Mitchell Stokes
mogurijin at gmail.com
Tue Aug 3 22:09:51 CEST 2010
Revision: 31015
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31015
Author: moguri
Date: 2010-08-03 22:09:51 +0200 (Tue, 03 Aug 2010)
Log Message:
-----------
Adding a uniforms list to KX_PythonShader
Modified Paths:
--------------
branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_PythonSeq.cpp
branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_PythonSeq.h
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_PythonSeq.cpp
===================================================================
--- branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_PythonSeq.cpp 2010-08-03 19:29:43 UTC (rev 31014)
+++ branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_PythonSeq.cpp 2010-08-03 20:09:51 UTC (rev 31015)
@@ -32,6 +32,7 @@
#include "KX_PythonSeq.h"
#include "KX_GameObject.h"
+#include "KX_PythonShaders.h"
#include "BL_ArmatureObject.h"
#include "SCA_ISensor.h"
#include "SCA_IController.h"
@@ -78,6 +79,8 @@
return ((BL_ArmatureObject *)self_plus)->GetConstraintNumber();
case KX_PYGENSEQ_OB_TYPE_CHANNELS:
return ((BL_ArmatureObject *)self_plus)->GetChannelNumber();
+ case KX_PYGENSEQ_SHADER_TYPE_UNIFORMS:
+ return ((KX_PythonShader *)self_plus)->GetUniforms().size();
default:
/* Should never happen */
PyErr_SetString(PyExc_SystemError, "invalid type, internal error");
@@ -167,7 +170,18 @@
}
return ((BL_ArmatureObject *)self_plus)->GetChannel(index)->GetProxy();
}
+ case KX_PYGENSEQ_SHADER_TYPE_UNIFORMS:
+ {
+ UniformList& uniforms= ((KX_PythonShader *)self_plus)->GetUniforms();
+ if (index<0) index += uniforms.size();
+ if (index<0 || index>= uniforms.size()) {
+ PyErr_SetString(PyExc_IndexError, "seq[i]: index out of range");
+ return NULL;
+ }
+
+ return uniforms[index]->GetProxy();
+ }
}
PyErr_SetString(PyExc_SystemError, "invalid sequence type, this is a bug");
@@ -235,6 +249,17 @@
}
break;
}
+ case KX_PYGENSEQ_SHADER_TYPE_UNIFORMS:
+ {
+ UniformList& uniforms= ((KX_PythonShader *)self_plus)->GetUniforms();
+ KX_PythonUniform *uniform;
+ for (unsigned int index=0;index<uniforms.size();index++) {
+ uniform= uniforms[index];
+ if (uniform->GetName() == key)
+ return static_cast<PyObjectPlus *>(uniform);
+ }
+ break;
+ }
case KX_PYGENSEQ_OB_TYPE_CONSTRAINTS:
{
return ((BL_ArmatureObject*)self_plus)->GetConstraint(key);
Modified: branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_PythonSeq.h
===================================================================
--- branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_PythonSeq.h 2010-08-03 19:29:43 UTC (rev 31014)
+++ branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_PythonSeq.h 2010-08-03 20:09:51 UTC (rev 31015)
@@ -44,6 +44,7 @@
KX_PYGENSEQ_OB_TYPE_ACTUATORS,
KX_PYGENSEQ_OB_TYPE_CONSTRAINTS,
KX_PYGENSEQ_OB_TYPE_CHANNELS,
+ KX_PYGENSEQ_SHADER_TYPE_UNIFORMS,
};
/* The Main PyType Object defined in Main.c */
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-03 19:29:43 UTC (rev 31014)
+++ branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_PythonShaders.cpp 2010-08-03 20:09:51 UTC (rev 31015)
@@ -31,6 +31,7 @@
#ifndef DISABLE_PYTHON
#include "KX_PythonInit.h"
#include "PyObjectPlus.h"
+#include "KX_PythonSeq.h"
#include "KX_PythonShaders.h"
#include "BL_BlenderShader.h"
@@ -42,14 +43,14 @@
: PyObjectPlus(),
m_vert(""),
m_geom(""),
- m_frag(""),
- m_uniforms(NULL)
+ m_frag("")
{
}
KX_PythonShader::~KX_PythonShader()
{
- Py_XDECREF(m_uniforms);
+ // XXX This probably needs more attention...
+ m_uniforms.clear();
}
PyObject *KX_PythonShader::py_shader_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
@@ -81,6 +82,7 @@
};
PyMethodDef KX_PythonShader::Methods[] = {
+ KX_PYMETHODTABLE_O(KX_PythonShader, addUniform),
{NULL} //Sentinel
};
@@ -95,23 +97,33 @@
PyObject* KX_PythonShader::pyattr_get_uniforms(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
{
KX_PythonShader* self = static_cast<KX_PythonShader*>(self_v);
+ return KX_PythonSeq_CreatePyObject(self->m_proxy, KX_PYGENSEQ_SHADER_TYPE_UNIFORMS);
- if (self->m_uniforms == NULL)
- self->m_uniforms = PyList_New(0);
+}
- Py_INCREF(self->m_uniforms);
- return self->m_uniforms;
+KX_PYMETHODDEF_DOC_O(KX_PythonShader, addUniform,
+ "addUniform(uniform) -- Adds the uniform to the shader's uniform list")
+{
+ if (!PyType_IsSubtype(&KX_PythonUniform::Type, Py_TYPE(value)))
+ return NULL;
+
+ KX_PythonUniform *uniform = static_cast<KX_PythonUniform*>BGE_PROXY_REF(value);
+
+ m_uniforms.push_back(uniform);
+
+ Py_RETURN_NONE;
}
-
/**
* The Uniform type
*/
KX_PythonUniform::KX_PythonUniform(char* name)
- : PyObjectPlus()
+ : PyObjectPlus(),
+ m_type(0),
+ m_data(NULL)
{
- m_name = STR_String(name);
+ m_name = name;
}
KX_PythonUniform::~KX_PythonUniform()
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-03 19:29:43 UTC (rev 31014)
+++ branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_PythonShaders.h 2010-08-03 20:09:51 UTC (rev 31015)
@@ -34,19 +34,28 @@
#include "PyObjectPlus.h"
+typedef std::vector<class KX_PythonUniform *> UniformList;
+
class KX_PythonShader: public PyObjectPlus
{
Py_Header;
STR_String m_vert, m_geom, m_frag;
- PyObject* m_uniforms;
+ UniformList m_uniforms;
public:
KX_PythonShader();
~KX_PythonShader();
+ UniformList& GetUniforms()
+ {
+ return m_uniforms;
+ }
+
static PyObject* py_shader_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
+ KX_PYMETHOD_DOC_O(KX_PythonShader, addUniform);
+
static PyObject* pyattr_get_uniforms(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
};
@@ -55,13 +64,20 @@
Py_Header;
STR_String m_name;
- short type;
- void *data;
+ short m_type;
+ void *m_data;
public:
KX_PythonUniform(char* name);
~KX_PythonUniform();
+ STR_String& GetName() {return m_name;}
+
+ virtual PyObject* py_repr(void)
+ {
+ return PyUnicode_FromString(GetName().ReadPtr());
+ }
+
static PyObject* py_uniform_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
};
More information about the Bf-blender-cvs
mailing list