[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31027] branches/soc-2010-moguri-2/source: Working on interaction between the Python shader and the actual BL_BlenderShader .

Mitchell Stokes mogurijin at gmail.com
Wed Aug 4 05:49:17 CEST 2010


Revision: 31027
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31027
Author:   moguri
Date:     2010-08-04 05:48:50 +0200 (Wed, 04 Aug 2010)

Log Message:
-----------
Working on interaction between the Python shader and the actual BL_BlenderShader. Sources can be get and set, however, the set is still odd. Also, I'm pretty sure I have some memory leak issues to look into.

Modified Paths:
--------------
    branches/soc-2010-moguri-2/source/blender/blenkernel/intern/material.c
    branches/soc-2010-moguri-2/source/blender/blenloader/intern/readfile.c
    branches/soc-2010-moguri-2/source/blender/gpu/GPU_extensions.h
    branches/soc-2010-moguri-2/source/blender/gpu/GPU_material.h
    branches/soc-2010-moguri-2/source/blender/gpu/intern/gpu_codegen.c
    branches/soc-2010-moguri-2/source/blender/gpu/intern/gpu_codegen.h
    branches/soc-2010-moguri-2/source/blender/gpu/intern/gpu_extensions.c
    branches/soc-2010-moguri-2/source/blender/gpu/intern/gpu_material.c
    branches/soc-2010-moguri-2/source/blender/makesdna/DNA_material_types.h
    branches/soc-2010-moguri-2/source/gameengine/Ketsji/BL_BlenderShader.cpp
    branches/soc-2010-moguri-2/source/gameengine/Ketsji/BL_BlenderShader.h
    branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
    branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_BlenderMaterial.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/blender/blenkernel/intern/material.c
===================================================================
--- branches/soc-2010-moguri-2/source/blender/blenkernel/intern/material.c	2010-08-04 00:18:05 UTC (rev 31026)
+++ branches/soc-2010-moguri-2/source/blender/blenkernel/intern/material.c	2010-08-04 03:48:50 UTC (rev 31027)
@@ -195,6 +195,7 @@
 	ma->csi.flag= 0;
 	ma->csi.geom_in= MA_CS_GEOM_IN_TRIS;
 	ma->csi.geom_out= MA_CS_GEOM_OUT_TRIANGLE_STRIP;
+	ma->csi.sources = NULL;
 }
 
 void init_custom_uniform(CustomUniform *cu)

Modified: branches/soc-2010-moguri-2/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/soc-2010-moguri-2/source/blender/blenloader/intern/readfile.c	2010-08-04 00:18:05 UTC (rev 31026)
+++ branches/soc-2010-moguri-2/source/blender/blenloader/intern/readfile.c	2010-08-04 03:48:50 UTC (rev 31027)
@@ -2927,6 +2927,7 @@
 		direct_link_nodetree(fd, ma->nodetree);
 
 	ma->preview = direct_link_preview_image(fd, ma->preview);
+	ma->csi.sources = NULL;
 	ma->gpumaterial.first = ma->gpumaterial.last = NULL;
 }
 

Modified: branches/soc-2010-moguri-2/source/blender/gpu/GPU_extensions.h
===================================================================
--- branches/soc-2010-moguri-2/source/blender/gpu/GPU_extensions.h	2010-08-04 00:18:05 UTC (rev 31026)
+++ branches/soc-2010-moguri-2/source/blender/gpu/GPU_extensions.h	2010-08-04 03:48:50 UTC (rev 31027)
@@ -167,6 +167,8 @@
 
 int GPU_shader_get_attribute(GPUShader *shader, char *name);
 
+void GPU_shader_get_sources(GPUShader *shader, char *vertex, char *geometry, char *fragment);
+
 /* Vertex attributes for shaders */
 
 #define GPU_MAX_ATTRIB		32

Modified: branches/soc-2010-moguri-2/source/blender/gpu/GPU_material.h
===================================================================
--- branches/soc-2010-moguri-2/source/blender/gpu/GPU_material.h	2010-08-04 00:18:05 UTC (rev 31026)
+++ branches/soc-2010-moguri-2/source/blender/gpu/GPU_material.h	2010-08-04 03:48:50 UTC (rev 31027)
@@ -129,6 +129,7 @@
 void GPU_material_unbind(GPUMaterial *material);
 void GPU_material_unbind_uniforms(GPUMaterial *material);
 int GPU_material_bound(GPUMaterial *material);
+void GPU_material_get_sources(GPUMaterial *material, char *vertex, char *geometry, char *fragment);
 
 void GPU_material_vertex_attributes(GPUMaterial *material,
 	struct GPUVertexAttribs *attrib);

Modified: branches/soc-2010-moguri-2/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- branches/soc-2010-moguri-2/source/blender/gpu/intern/gpu_codegen.c	2010-08-04 00:18:05 UTC (rev 31026)
+++ branches/soc-2010-moguri-2/source/blender/gpu/intern/gpu_codegen.c	2010-08-04 03:48:50 UTC (rev 31027)
@@ -883,6 +883,11 @@
 	GPU_shader_unbind(shader);
 }
 
+void GPU_pass_get_sources(GPUPass *pass, char *vertex, char *geometry, char *fragment)
+{
+	GPU_shader_get_sources(pass->shader, vertex, geometry, fragment);
+}
+
 /* Node Link Functions */
 
 GPUNodeLink *GPU_node_link_create(int type)

Modified: branches/soc-2010-moguri-2/source/blender/gpu/intern/gpu_codegen.h
===================================================================
--- branches/soc-2010-moguri-2/source/blender/gpu/intern/gpu_codegen.h	2010-08-04 00:18:05 UTC (rev 31026)
+++ branches/soc-2010-moguri-2/source/blender/gpu/intern/gpu_codegen.h	2010-08-04 03:48:50 UTC (rev 31027)
@@ -75,6 +75,7 @@
 void GPU_pass_bind(GPUPass *pass, double time, int mipmap);
 void GPU_pass_update_uniforms(GPUPass *pass);
 void GPU_pass_unbind(GPUPass *pass);
+void GPU_pass_get_sources(GPUPass *pass, char *vertex, char *geometry, char *fragment);
 
 void GPU_pass_free(GPUPass *pass);
 

Modified: branches/soc-2010-moguri-2/source/blender/gpu/intern/gpu_extensions.c
===================================================================
--- branches/soc-2010-moguri-2/source/blender/gpu/intern/gpu_extensions.c	2010-08-04 00:18:05 UTC (rev 31026)
+++ branches/soc-2010-moguri-2/source/blender/gpu/intern/gpu_extensions.c	2010-08-04 03:48:50 UTC (rev 31027)
@@ -1207,6 +1207,14 @@
 	return index;
 }
 
+void GPU_shader_get_sources(GPUShader *shader, char *vertex, char *geometry, char *fragment)
+{
+	int size;
+	glGetShaderSource(shader->vertex, 64000, &size, vertex);
+	glGetShaderSource(shader->geometry, 64000, &size, geometry);
+	glGetShaderSource(shader->fragment, 64000, &size, fragment);
+}
+
 #if 0
 /* GPUPixelBuffer */
 

Modified: branches/soc-2010-moguri-2/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/soc-2010-moguri-2/source/blender/gpu/intern/gpu_material.c	2010-08-04 00:18:05 UTC (rev 31026)
+++ branches/soc-2010-moguri-2/source/blender/gpu/intern/gpu_material.c	2010-08-04 03:48:50 UTC (rev 31027)
@@ -231,8 +231,14 @@
 		GPUShader *shader;
 		char *frag=NULL, *vert=NULL, *geom=NULL;
 
+		if (material->ma->csi.sources)
+		{
+			vert = material->ma->csi.sources[0];
+			geom = material->ma->csi.sources[1];
+			frag = material->ma->csi.sources[2];
+		}
 		// Gather information on custom shaders
-		if (material->ma->csi.flag & MA_CS_USE_EXTERNAL)
+		else if (material->ma->csi.flag & MA_CS_USE_EXTERNAL)
 		{
 			// Load files
 			if (strcmp(material->ma->csi.vertex_shader, ""))
@@ -532,6 +538,11 @@
 	return material->bound;
 }
 
+void GPU_material_get_sources(GPUMaterial *material, char *vertex, char *geometry, char *fragment)
+{
+	GPU_pass_get_sources(material->pass, vertex, geometry, fragment);
+}
+
 void GPU_material_vertex_attributes(GPUMaterial *material, GPUVertexAttribs *attribs)
 {
 	*attribs = material->attribs;

Modified: branches/soc-2010-moguri-2/source/blender/makesdna/DNA_material_types.h
===================================================================
--- branches/soc-2010-moguri-2/source/blender/makesdna/DNA_material_types.h	2010-08-04 00:18:05 UTC (rev 31026)
+++ branches/soc-2010-moguri-2/source/blender/makesdna/DNA_material_types.h	2010-08-04 03:48:50 UTC (rev 31027)
@@ -91,6 +91,9 @@
 	short flag, geom_in, geom_out;
 	short actuniform;
 
+	// These sources are used if set, but are not saved
+	char **sources;
+
 	ListBase uniforms;
 } CustomShaderInfo;
 

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-04 00:18:05 UTC (rev 31026)
+++ branches/soc-2010-moguri-2/source/gameengine/Ketsji/BL_BlenderShader.cpp	2010-08-04 03:48:50 UTC (rev 31027)
@@ -33,6 +33,13 @@
 {
 	if(mGPUMat)
 		GPU_material_unbind(mGPUMat);
+	if(mMat && mMat->csi.sources)
+	{
+		mMat->csi.sources = NULL;
+		GPU_material_free(mMat);
+		ReloadMaterial();
+	}
+		
 }
 
 void BL_BlenderShader::ReloadMaterial()
@@ -148,6 +155,30 @@
 	mBlendMode = GPU_material_blend_mode(gpumat, obcol);
 }
 
+void BL_BlenderShader::GetSources(char *vertex, char *geometry, char *fragment)
+{
+	GPU_material_get_sources(mGPUMat, vertex, geometry, fragment);
+}
+
+void BL_BlenderShader::SetSources(char *vertex, char *geometry, char *fragment)
+{
+	char vert[64000]="", geom[64000]="", frag[64000]="";
+	GetSources(vert, geom, frag);
+
+	if (!vertex)
+		vertex = vert;
+	if (!geometry)
+		geometry = geom;
+	if (!fragment)
+		fragment = frag;
+
+	char* sources[3] = {vertex, geometry, fragment};
+
+	mMat->csi.sources = sources;
+	GPU_material_free(mMat);
+	ReloadMaterial();
+}
+
 int BL_BlenderShader::GetBlendMode()
 {
 	return mBlendMode;

Modified: branches/soc-2010-moguri-2/source/gameengine/Ketsji/BL_BlenderShader.h
===================================================================
--- branches/soc-2010-moguri-2/source/gameengine/Ketsji/BL_BlenderShader.h	2010-08-04 00:18:05 UTC (rev 31026)
+++ branches/soc-2010-moguri-2/source/gameengine/Ketsji/BL_BlenderShader.h	2010-08-04 03:48:50 UTC (rev 31027)
@@ -54,6 +54,8 @@
 	int GetAttribNum();
 	void SetAttribs(class RAS_IRasterizer* ras, const BL_Material *mat);
 	void Update(const class RAS_MeshSlot & ms, class RAS_IRasterizer* rasty);
+	void GetSources(char *vertex, char *geometry, char *fragment);
+	void SetSources(char *vertex=NULL, char *geometry=NULL, char *fragment=NULL);
 	void ReloadMaterial();
 	int GetBlendMode();
 

Modified: branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
===================================================================
--- branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_BlenderMaterial.cpp	2010-08-04 00:18:05 UTC (rev 31026)
+++ branches/soc-2010-moguri-2/source/gameengine/Ketsji/KX_BlenderMaterial.cpp	2010-08-04 03:48:50 UTC (rev 31027)
@@ -10,6 +10,7 @@
 #include "KX_Light.h"
 #include "KX_GameObject.h"
 #include "KX_MeshProxy.h"
+#include "KX_PythonShaders.h"
 
 #include "MT_Vector3.h"
 #include "MT_Vector4.h"
@@ -46,6 +47,7 @@
 	mBlenderShader(0),
 	mScene(NULL),
 	mUserDefBlend(0),
+	mLightLayer(0),
 	mModified(0),
 	mConstructed(false),
 	mPass(0)
@@ -138,6 +140,23 @@
 	return mMaterial->material;
 }
 
+void KX_BlenderMaterial::SetBlenderShader(BL_BlenderShader *shader)
+{
+	// First get rid of the old one if we have one
+	if( mBlenderShader ) {
+		if(mBlenderShader == mLastBlenderShader) {
+			mBlenderShader->SetProg(false);
+			mLastBlenderShader = NULL;
+		}
+
+		delete mBlenderShader;
+		mBlenderShader = 0;
+	}
+
+	// Now set the new one
+	mBlenderShader = shader;
+}
+
 BL_BlenderShader *KX_BlenderMaterial::GetBlenderShader() const
 {
 	return mBlenderShader;
@@ -187,6 +206,7 @@
 
 	mBlendFunc[0] =0;
 	mBlendFunc[1] =0;
+	mLightLayer = layer;
 	mConstructed = true;
 }
 
@@ -802,7 +822,7 @@
 	//KX_PYATTRIBUTE_TODO("shader"),
 	//KX_PYATTRIBUTE_TODO("materialIndex"),
 	//KX_PYATTRIBUTE_TODO("blending"),
-	KX_PYATTRIBUTE_RO_FUNCTION("blender_shader", KX_BlenderMaterial, pyattr_get_blender_shader),
+	KX_PYATTRIBUTE_RW_FUNCTION("blender_shader", KX_BlenderMaterial, pyattr_get_blender_shader, pyattr_set_blender_shader),
 	{ NULL }	//Sentinel
 };
 
@@ -831,14 +851,21 @@
 PyObject* KX_BlenderMaterial::pyattr_get_blender_shader(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
 {
 	KX_BlenderMaterial* self= static_cast<KX_BlenderMaterial*>(self_v);
-	BL_BlenderShader* shader= self->GetBlenderShader();
 
-	if (shader)
-		return shader->GetProxy();
+	KX_PythonShader *pyshader = new KX_PythonShader(self);
 
-	Py_RETURN_NONE;
+	return pyshader->NewProxy(true);
 }
 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list