[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31361] branches/soc-2010-moguri-2/source/ gameengine/Ketsji: Uniforms created during runtime can now be used to affect shaders.
Mitchell Stokes
mogurijin at gmail.com
Mon Aug 16 03:39:49 CEST 2010
Revision: 31361
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31361
Author: moguri
Date: 2010-08-16 03:39:37 +0200 (Mon, 16 Aug 2010)
Log Message:
-----------
Uniforms created during runtime can now be used to affect shaders.
Modified Paths:
--------------
branches/soc-2010-moguri-2/source/gameengine/Ketsji/BL_BlenderShader.cpp
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/BL_BlenderShader.cpp
===================================================================
--- branches/soc-2010-moguri-2/source/gameengine/Ketsji/BL_BlenderShader.cpp 2010-08-16 00:56:29 UTC (rev 31360)
+++ branches/soc-2010-moguri-2/source/gameengine/Ketsji/BL_BlenderShader.cpp 2010-08-16 01:39:37 UTC (rev 31361)
@@ -8,6 +8,8 @@
#include "BKE_main.h"
#include "BKE_material.h"
+#include "BLI_listbase.h"
+
#include "BL_BlenderShader.h"
#include "BL_Material.h"
@@ -69,10 +71,14 @@
}
}
- // Skip this uniform if we didn't find it
+ // If we didn't find the copy, it means the uniform wasn't an original (probably made with Python),
+ // so go ahead and get rid of it
if(!copy)
{
+ // We just remove here, and let the PythonUniform handle freeing
cu = cu->next;
+ BLI_remlink(&mMat->csi.uniforms, cu->prev);
+
continue;
}
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-16 00:56:29 UTC (rev 31360)
+++ branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_PythonShaders.cpp 2010-08-16 01:39:37 UTC (rev 31361)
@@ -36,6 +36,7 @@
#include "KX_BlenderMaterial.h"
#include "BL_BlenderShader.h"
#include "DNA_material_types.h"
+#include "BLI_listbase.h"
/**
* The Shader type
@@ -189,6 +190,7 @@
KX_PythonUniform *uniform = static_cast<KX_PythonUniform*>BGE_PROXY_REF(value);
+ BLI_addhead(&m_mat->GetBlenderMaterial()->csi.uniforms, uniform->GetCustomUniform());
m_uniforms.push_back(uniform);
Py_RETURN_NONE;
@@ -203,8 +205,8 @@
m_name(name),
m_type(type),
m_size(size),
- m_data(NULL),
- m_cu(NULL)
+ m_cu(NULL),
+ m_owns_cu(true)
{
m_cu = (CustomUniform*)malloc(sizeof(CustomUniform));
m_cu->next = m_cu->prev = NULL;
@@ -213,13 +215,35 @@
m_cu->type = type;
m_cu->size = size;
- m_cu->data =NULL;
+ switch (m_cu->type)
+ {
+ case MA_UNF_FLOAT:
+ *(float*)&m_cu->data = 0.f;
+ break;
+ case MA_UNF_VEC2:
+ case MA_UNF_VEC3:
+ case MA_UNF_VEC4:
+ m_cu->data = calloc(m_size, sizeof(float));
+ break;
+ case MA_UNF_INT:
+ *(int*)&m_cu->data = 0;
+ break;
+ case MA_UNF_IVEC2:
+ case MA_UNF_IVEC3:
+ case MA_UNF_IVEC4:
+ m_cu->data = calloc(m_size, sizeof(int));
+ default:
+ m_cu->data = NULL;
+ }
+ m_data = m_cu->data;
+
}
KX_PythonUniform::KX_PythonUniform(CustomUniform *cu)
: PyObjectPlus(),
- m_cu(cu)
+ m_cu(cu),
+ m_owns_cu(false)
{
m_name = cu->name;
m_type = cu->type;
@@ -230,7 +254,8 @@
KX_PythonUniform::~KX_PythonUniform()
{
- // Empty
+ if (m_owns_cu)
+ free(m_cu);
}
PyObject *KX_PythonUniform::py_uniform_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
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-16 00:56:29 UTC (rev 31360)
+++ branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_PythonShaders.h 2010-08-16 01:39:37 UTC (rev 31361)
@@ -40,6 +40,7 @@
{
Py_Header;
+private:
STR_String m_vert, m_geom, m_frag;
class KX_BlenderMaterial *m_mat;
UniformList m_uniforms;
@@ -68,12 +69,14 @@
{
Py_Header;
+private:
STR_String m_name;
short m_type;
int m_size;
void *m_data;
struct CustomUniform *m_cu;
+ bool m_owns_cu; // This is so uniforms created in Python can clean up after themselves
public:
KX_PythonUniform(char* name, short type, int size);
@@ -81,6 +84,7 @@
~KX_PythonUniform();
STR_String& GetName() {return m_name;}
+ struct CustomUniform *GetCustomUniform() {return m_cu;}
virtual PyObject* py_repr(void)
{
More information about the Bf-blender-cvs
mailing list