[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