[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51824] branches/ge_harmony: Adding UI options to override the built in light and prepass shaders.

Daniel Stokes kupomail at gmail.com
Fri Nov 2 19:38:08 CET 2012


Revision: 51824
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51824
Author:   kupoman
Date:     2012-11-02 18:38:05 +0000 (Fri, 02 Nov 2012)
Log Message:
-----------
Adding UI options to override the built in light and prepass shaders. More work still needs to be done to create a better interface for these shaders to use. This only works in the internal player for now.

Also addressing a bug where some shader files did not load properly (parts of the shader would load twice causing syntax errors).

Modified Paths:
--------------
    branches/ge_harmony/release/scripts/startup/bl_ui/properties_game.py
    branches/ge_harmony/source/blender/blenkernel/intern/shader.c
    branches/ge_harmony/source/blender/makesdna/DNA_shader_types.h
    branches/ge_harmony/source/blender/makesrna/intern/rna_shader.c
    branches/ge_harmony/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
    branches/ge_harmony/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
    branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.cpp
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h

Modified: branches/ge_harmony/release/scripts/startup/bl_ui/properties_game.py
===================================================================
--- branches/ge_harmony/release/scripts/startup/bl_ui/properties_game.py	2012-11-02 13:36:26 UTC (rev 51823)
+++ branches/ge_harmony/release/scripts/startup/bl_ui/properties_game.py	2012-11-02 18:38:05 UTC (rev 51824)
@@ -359,13 +359,23 @@
 
             layout.prop(gs, "dome_text")
             
-def display_shader_settings(shader, layout):
+def display_shader_settings(shader, layout, type="GLOBAL"):
     col = layout.column()
+    
+    if type == "GLOBAL":
+        row = col.row()
+        row.prop(shader, "type", expand=True)
+        col.label("Pass:")
+        row = col.row()
+        row.prop(shader, "render_pass", expand=True)
+        
     col.label("Source:")
     row = col.row()
     row.prop(shader, "shader_location", expand=True)
+
     if shader.shader_location == "BUILTIN":
-        col.prop(shader, "filter_builtin")
+        if type == "FILTER":
+            col.prop(shader, "filter_builtin")
     if shader.shader_location == "INTERNAL":
         col.prop(shader, "source_text", text="")
     elif shader.shader_location == "EXTERNAL":
@@ -435,7 +445,7 @@
             
         filter = gs.active_post_filter
         if filter:
-            display_shader_settings(filter, layout)
+            display_shader_settings(filter, layout, type="FILTER")
 
 
 class RENDER_PT_game_shading(RenderButtonsPanel, Panel):

Modified: branches/ge_harmony/source/blender/blenkernel/intern/shader.c
===================================================================
--- branches/ge_harmony/source/blender/blenkernel/intern/shader.c	2012-11-02 13:36:26 UTC (rev 51823)
+++ branches/ge_harmony/source/blender/blenkernel/intern/shader.c	2012-11-02 18:38:05 UTC (rev 51824)
@@ -171,7 +171,7 @@
 		BLI_parent_dir(base);
 		BLI_path_abs(path, base);
 	}
-	fp = BLI_fopen(path, "r");
+	fp = BLI_fopen(path, "rb");
 
 	if (fp) {
 		// Find the size
@@ -180,13 +180,13 @@
 		rewind(fp);
 
 		// Initialize the string and read the files
-		shader = MEM_callocN(len, "shader_text");
+		shader = MEM_callocN(len+1, "shader_text");
 		fread(shader, 1, len, fp);
 
 		// Close the file
 		fclose(fp);
 	}
-	
+
 	return shader;
 }
 

Modified: branches/ge_harmony/source/blender/makesdna/DNA_shader_types.h
===================================================================
--- branches/ge_harmony/source/blender/makesdna/DNA_shader_types.h	2012-11-02 13:36:26 UTC (rev 51823)
+++ branches/ge_harmony/source/blender/makesdna/DNA_shader_types.h	2012-11-02 18:38:05 UTC (rev 51824)
@@ -55,8 +55,10 @@
 	char location;
 	char sourceenum;
 	char sourcepath[240];
-	short geom_in;
-	short geom_out;
+	char pass;
+	char pad;
+	char geom_in;
+	char geom_out;
 	struct Text *sourcetext;
 	char *source;
 	ListBase uniforms;
@@ -89,6 +91,11 @@
 #define SHADER_TYPE_FRAGMENT	1
 #define SHADER_TYPE_GEOMETRY	2
 
+/* pass */
+#define SHADER_PASS_RENDER		0
+#define SHADER_PASS_PRE			1
+#define	SHADER_PASS_LIGHT		2
+
 /* use */
 #define SHADER_USE_MATERIAL		0
 #define SHADER_USE_FILTER		1

Modified: branches/ge_harmony/source/blender/makesrna/intern/rna_shader.c
===================================================================
--- branches/ge_harmony/source/blender/makesrna/intern/rna_shader.c	2012-11-02 13:36:26 UTC (rev 51823)
+++ branches/ge_harmony/source/blender/makesrna/intern/rna_shader.c	2012-11-02 18:38:05 UTC (rev 51824)
@@ -354,6 +354,13 @@
 		{0, NULL, 0, NULL, NULL}
 	};
 
+	static EnumPropertyItem prop_pass_items[] = {
+		{SHADER_PASS_RENDER, "RENDER", 0, "Render", "Use this shader in the main render pass"},
+		{SHADER_PASS_PRE, "PREPASS", 0, "Pre-Pass", "Use this shader in pass before the main render"},
+		{SHADER_PASS_LIGHT, "LIGHT", 0, "Light", "Use this shader when drawing lights"},
+		{0, NULL, 0, NULL, NULL}
+	};
+
 	static EnumPropertyItem prop_shader_loc_items[] = {
 		{SHADER_LOC_BUILTIN, "BUILTIN", 0, "Builtin", "Use a builtin shader"},
 		{SHADER_LOC_INTERNAL, "INTERNAL", 0, "Internal", "Use a shader from a text datablock"},
@@ -406,6 +413,12 @@
 	RNA_def_property_ui_text(prop, "Type", "Type of shader to use");
 	RNA_def_property_update(prop, 0, "rna_Shader_update");
 
+	prop = RNA_def_property(srna, "render_pass", PROP_ENUM, PROP_NONE);
+	RNA_def_property_enum_sdna(prop, NULL, "pass");
+	RNA_def_property_enum_items(prop, prop_pass_items);
+	RNA_def_property_ui_text(prop, "Pass", "Controls when the shader is used");
+	RNA_def_property_update(prop, 0, "rna_Shader_update");
+
 	prop = RNA_def_property(srna, "shader_location", PROP_ENUM, PROP_NONE);
 	RNA_def_property_enum_sdna(prop, NULL, "location");
 	RNA_def_property_enum_items(prop, prop_shader_loc_items);

Modified: branches/ge_harmony/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp	2012-11-02 13:36:26 UTC (rev 51823)
+++ branches/ge_harmony/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp	2012-11-02 18:38:05 UTC (rev 51824)
@@ -73,6 +73,7 @@
 	#include "DNA_view3d_types.h"
 	#include "DNA_screen_types.h"
 	#include "DNA_userdef_types.h"
+	#include "DNA_shader_types.h"
 	#include "DNA_scene_types.h"
 	#include "DNA_windowmanager_types.h"
 
@@ -518,6 +519,26 @@
 				
 				// init the rasterizer
 				rasterizer->Init();
+
+				// initialize global shaders
+				ShaderLink *link;
+				Shader *shader;
+				vector<Shader*> gshaders = vector<Shader*>();
+				vector<Shader*> lshaders = vector<Shader*>();
+				for (link = (ShaderLink *)scene->gm.gshaders.first; link; link = link->next) {
+					shader = link->shader;
+					if (!shader)
+						continue;
+
+					if (shader->pass == SHADER_PASS_PRE)
+						gshaders.push_back(shader);
+					else if (shader->pass == SHADER_PASS_LIGHT)
+						lshaders.push_back(shader);
+				}
+				if (gshaders.size())
+					rasterizer->SetPrePassShader(&gshaders[0], gshaders.size());
+				if (lshaders.size())
+					rasterizer->SetLightShader(&lshaders[0], lshaders.size());
 				
 				// start the engine
 				ketsjiengine->StartEngine(true);

Modified: branches/ge_harmony/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Converter/KX_BlenderSceneConverter.cpp	2012-11-02 13:36:26 UTC (rev 51823)
+++ branches/ge_harmony/source/gameengine/Converter/KX_BlenderSceneConverter.cpp	2012-11-02 18:38:05 UTC (rev 51824)
@@ -360,9 +360,10 @@
 
 	//Convert Post-process 2D Filters
 	ShaderLink *link;
+	Shader *shader;
 	int i;
 	for (link = (ShaderLink *)blenderscene->gm.postfilters.first, i=0; link; link = link->next, i++) {
-		Shader *shader = link->shader;
+		shader = link->shader;
 		if (shader) {
 			STR_String text = STR_String(shader->source);
 			Uniform *uni;

Modified: branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.cpp	2012-11-02 13:36:26 UTC (rev 51823)
+++ branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.cpp	2012-11-02 18:38:05 UTC (rev 51824)
@@ -38,8 +38,13 @@
 	bool update = false;
 	LinkData *nlink, *link;
 
+	Shader *shader;
 	for (link = (LinkData*)mBlenderScene->gm.gshaders.first; link; link = link->next)
 	{
+		shader = (Shader *)link->data;
+		if (!shader) continue;
+		if (shader->pass != SHADER_PASS_RENDER) continue;
+
 		update = true;
 		nlink = (LinkData*)MEM_mallocN(sizeof(LinkData), "Global Shader Copy");
 		nlink->data = link->data;

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h	2012-11-02 13:36:26 UTC (rev 51823)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h	2012-11-02 18:38:05 UTC (rev 51824)
@@ -429,10 +429,12 @@
 
 	virtual class	RAS_IFilterManager* CreateFilterManager()=0;
 
+	virtual void	SetLightShader(struct Shader** shader, int count)=0;
 	virtual void	BeginLightPass()=0;
 	virtual void	RenderLight(RAS_LightObject *light)=0;
 	virtual void	EndLightPass()=0;
 
+	virtual void	SetPrePassShader(struct Shader** shader, int count)=0;
 	virtual void	BeginPrePass()=0;
 	virtual void	EndPrePass()=0;
 

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2012-11-02 13:36:26 UTC (rev 51823)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2012-11-02 18:38:05 UTC (rev 51824)
@@ -51,6 +51,7 @@
 #include "DNA_meshdata_types.h"
 #include "DNA_material_types.h"
 #include "DNA_scene_types.h"
+#include "DNA_shader_types.h"
 
 #include "BKE_DerivedMesh.h"
 
@@ -93,7 +94,9 @@
 	m_materialCachingInfo(0),
 	m_width(0),
 	m_height(0),
-	m_technique(tech)
+	m_technique(tech),
+	m_prepass_shader_default(NULL),
+	m_light_shader_default(NULL)
 {
 	m_viewmatrix.setIdentity();
 	m_viewinvmatrix.setIdentity();
@@ -177,10 +180,14 @@
 	if (m_technique == KX_TECH_INFERRED)
 	{
 		glGenTextures(2, m_prepass_target);
-		m_light_shader = GPU_shader_get_builtin_shader(GPU_SHADER_LIGHT);
+		m_light_shader_default = GPU_shader_get_builtin_shader(GPU_SHADER_LIGHT);
+		m_prepass_shader_default = GPU_shader_get_builtin_shader(GPU_SHADER_PREPASS);
 		init_sphere();
 	}
 
+	m_light_shader = m_light_shader_default;
+	m_prepass_shader = m_prepass_shader_default;
+
 	return true;
 }
 
@@ -1482,9 +1489,46 @@
 	return new RAS_OGLFilterManager(this);
 }
 
+void SetShaderInternal(GPUShader **current, GPUShader *base, Shader** shaders, int count)
+{
+	if (*current != base)
+		GPU_shader_free(*current);
+
+	if (shaders == NULL) {
+		*current = base;
+	}
+	else {
+		Shader *shader = shaders[0];
+		GPUShader *gshader;
+		switch (shader->type) {
+			case SHADER_TYPE_VERTEX:
+				gshader = GPU_shader_create(shader->source, NULL, NULL, NULL, 0, 0);
+				break;
+			case SHADER_TYPE_FRAGMENT:
+				gshader = GPU_shader_create(NULL, shader->source, NULL, NULL, 0, 0);
+				break;
+			case SHADER_TYPE_GEOMETRY:

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list