[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49825] branches/ge_harmony: Fixing up saving and loading for global shaders and allowing access to the second render target in a 2D filter (bgl_RenderTarget1, it's 0 based).

Daniel Stokes kupomail at gmail.com
Sun Aug 12 01:36:01 CEST 2012


Revision: 49825
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49825
Author:   kupoman
Date:     2012-08-11 23:36:00 +0000 (Sat, 11 Aug 2012)
Log Message:
-----------
Fixing up saving and loading for global shaders and allowing access to the second render target in a 2D filter (bgl_RenderTarget1, it's 0 based).

Modified Paths:
--------------
    branches/ge_harmony/release/scripts/startup/bl_ui/properties_game.py
    branches/ge_harmony/source/blender/blenloader/intern/readfile.c
    branches/ge_harmony/source/blender/blenloader/intern/writefile.c
    branches/ge_harmony/source/blender/editors/render/render_shading.c
    branches/ge_harmony/source/blender/makesdna/DNA_shader_types.h
    branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.cpp
    branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OGLFilterManager.cpp
    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-08-11 22:12:32 UTC (rev 49824)
+++ branches/ge_harmony/release/scripts/startup/bl_ui/properties_game.py	2012-08-11 23:36:00 UTC (rev 49825)
@@ -407,7 +407,7 @@
         col.template_list(gs, "global_shaders", gs, "active_global_shader_index", rows=2)
         col.template_ID(gs, "active_global_shader", new="shader.new_postfilter")
             
-        shader = gs.active_post_filter
+        shader = gs.active_global_shader
         if shader:
             display_shader_settings(shader, layout)
             

Modified: branches/ge_harmony/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/ge_harmony/source/blender/blenloader/intern/readfile.c	2012-08-11 22:12:32 UTC (rev 49824)
+++ branches/ge_harmony/source/blender/blenloader/intern/readfile.c	2012-08-11 23:36:00 UTC (rev 49825)
@@ -4936,6 +4936,9 @@
 			}
 			/*Game Settings: Dome Warp Text*/
 			sce->gm.dome.warptext = newlibadr(fd, sce->id.lib, sce->gm.dome.warptext);
+			
+			for (link = sce->gm.gshaders.first; link; link = link->next)
+				link->data = newlibadr_us(fd, sce->id.lib, link->data);
 
 			for (link = sce->gm.postfilters.first; link; link = link->next)
 				link->data = newlibadr_us(fd, sce->id.lib, link->data);
@@ -5151,6 +5154,7 @@
 	if (sce->nodetree)
 		direct_link_nodetree(fd, sce->nodetree);
 
+	link_list(fd, &sce->gm.gshaders);
 	link_list(fd, &sce->gm.postfilters);
 }
 

Modified: branches/ge_harmony/source/blender/blenloader/intern/writefile.c
===================================================================
--- branches/ge_harmony/source/blender/blenloader/intern/writefile.c	2012-08-11 22:12:32 UTC (rev 49824)
+++ branches/ge_harmony/source/blender/blenloader/intern/writefile.c	2012-08-11 23:36:00 UTC (rev 49825)
@@ -2271,6 +2271,12 @@
 			write_nodetree(wd, sce->nodetree);
 		}
 		
+		/* write global shaders */
+		for (link = sce->gm.gshaders.first; link; link = link->next) {
+			writestruct(wd, DATA, "LinkData", 1, link);
+			writestruct(wd, DATA, "Shader", 1, link->data);
+		}
+		
 		/* write post-process filters */
 		for (link = sce->gm.postfilters.first; link; link = link->next) {
 			writestruct(wd, DATA, "LinkData", 1, link);

Modified: branches/ge_harmony/source/blender/editors/render/render_shading.c
===================================================================
--- branches/ge_harmony/source/blender/editors/render/render_shading.c	2012-08-11 22:12:32 UTC (rev 49824)
+++ branches/ge_harmony/source/blender/editors/render/render_shading.c	2012-08-11 23:36:00 UTC (rev 49825)
@@ -432,6 +432,8 @@
 	else
 		sh = BKE_shader_add("Shader");
 
+	sh->use = SHADER_USE_MATERIAL;
+
 	/* hook into UI */
 	uiIDContextProperty(C, &ptr, &prop);
 
@@ -480,7 +482,7 @@
 	else
 		sh = BKE_shader_add("Post-Process");
 
-	sh->type = SHADER_TYPE_POSTPROCESS;
+	sh->use = SHADER_USE_FILTER;
 
 	/* hook into UI */
 	uiIDContextProperty(C, &ptr, &prop);

Modified: branches/ge_harmony/source/blender/makesdna/DNA_shader_types.h
===================================================================
--- branches/ge_harmony/source/blender/makesdna/DNA_shader_types.h	2012-08-11 22:12:32 UTC (rev 49824)
+++ branches/ge_harmony/source/blender/makesdna/DNA_shader_types.h	2012-08-11 23:36:00 UTC (rev 49825)
@@ -50,7 +50,8 @@
 
 typedef struct Shader {
 	ID id;
-	short type;
+	char type;
+	char use;
 	char location;
 	char sourcenum;
 	char sourcepath[240];
@@ -71,9 +72,13 @@
 #define SHADER_TYPE_VERTEX		0
 #define SHADER_TYPE_FRAGMENT	1
 #define SHADER_TYPE_GEOMETRY	2
-#define SHADER_TYPE_PREPROCESS	3
-#define SHADER_TYPE_POSTPROCESS	4
 
+/* use */
+#define SHADER_USE_MATERIAL		0
+#define SHADER_USE_FILTER		1
+#define	SHADER_USE_GLOBAL		3
+#define SHADER_USE_GENERATED	4
+
 /* location */
 #define SHADER_LOC_BUILTIN	0
 #define SHADER_LOC_INTERNAL	1

Modified: branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.cpp	2012-08-11 22:12:32 UTC (rev 49824)
+++ branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.cpp	2012-08-11 23:36:00 UTC (rev 49825)
@@ -17,6 +17,8 @@
 #include "BL_BlenderShader.h"
 #include "BL_Material.h"
 
+#include "MEM_guardedalloc.h"
+
 #include "GPU_extensions.h"
 #include "GPU_material.h"
 
@@ -33,7 +35,16 @@
 {
 	mBlenderScene = scene->GetBlenderScene();
 	mAlphaBlend = GPU_BLEND_SOLID;
+	bool update = false;
+	LinkData *nlink, *link;
 
+	for (link = (LinkData*)mBlenderScene->gm.gshaders.first; link; link = link->next)
+	{
+		update = true;
+		nlink = (LinkData*)MEM_mallocN(sizeof(LinkData), "Global Shader Copy");
+		nlink->data = link->data;
+		BLI_addhead(&ma->custom_shaders, nlink);
+	}
 	// Store the custom uniforms so they can be restored on exit
 	CustomUniform* cu = (CustomUniform*)ma->csi.uniforms.first;
 	while (cu)
@@ -48,15 +59,36 @@
 		cu = cu->next;
 	}
 
+
+	if (update)
+		GPU_material_free(mMat);
+
 	ReloadMaterial();
 }
 
 BL_BlenderShader::~BL_BlenderShader()
 {
+	bool reload = false;
 	if (mGPUMat)
 		GPU_material_unbind(mGPUMat);
 	if(mMat)
 	{
+		// Remove any global shaders that were added to the custom shader list
+		Shader *shader;
+		LinkData *link = (LinkData*)mMat->custom_shaders.first, *rem;
+		while (link)
+		{
+			shader = (Shader*)link->data;
+			rem = link;
+			link = link->next;
+
+			if (shader->use != SHADER_USE_MATERIAL)
+			{
+				BLI_freelinkN(&mMat->custom_shaders, rem);
+				reload = true;
+			}
+		}
+
 		// Restore the uniforms with their original value
 		CustomUniform* cu = (CustomUniform*)mMat->csi.uniforms.first;
 		CustomUniform* copy = NULL;
@@ -124,6 +156,10 @@
 	if(mMat && mMat->csi.sources)
 	{
 		mMat->csi.sources = NULL;
+		reload = true;
+	}
+	if (reload)
+	{
 		GPU_material_free(mMat);
 		ReloadMaterial();
 	}

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OGLFilterManager.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OGLFilterManager.cpp	2012-08-11 22:12:32 UTC (rev 49824)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OGLFilterManager.cpp	2012-08-11 23:36:00 UTC (rev 49825)
@@ -51,6 +51,12 @@
 
 #include "Value.h"
 
+#define NEED_DEPTH_TEXTURE	1
+#define	NEED_LUM_TEXTURE	2
+#define NEED_MRT1_TEXTURE	4
+#define NEED_MRT2_TEXTURE	4
+#define NEED_MRT3_TEXTURE	4
+
 RAS_OGLFilterManager::RAS_OGLFilterManager():
 texturewidth(-1), textureheight(-1),
 /* numberoffilters(0), */ /* UNUSED */ need_tex_update(true)
@@ -191,6 +197,14 @@
 	uniform.bind = glGetUniformLocationARB(m_filters[passindex], uniform.name);
 	m_uniforms[passindex][uniform.name] = FilterUniform(uniform);
 
+	uniform.name = "bgl_RenderTarget1";
+	uniform.bind = glGetUniformLocationARB(m_filters[passindex], uniform.name);
+	m_uniforms[passindex][uniform.name] = FilterUniform(uniform);
+	if (uniform.bind != -1)
+	{
+		texflag[passindex] |= NEED_MRT1_TEXTURE;
+	}
+
 	uniform.name = "bgl_DepthTexture";
 	uniform.bind = glGetUniformLocationARB(m_filters[passindex], uniform.name);
 	m_uniforms[passindex][uniform.name] = FilterUniform(uniform);
@@ -277,6 +291,15 @@
 		}
 	}
 
+	/* send MRT1 texture to glsl program if it needs */
+	if (texflag[passindex] & NEED_MRT1_TEXTURE) {
+		uniformLoc = m_uniforms[passindex]["bgl_RenderTarget1"].bind;
+		if (uniformLoc != -1)
+		{
+			glUniform1iARB(uniformLoc, 3);
+		}
+	}
+
 	uniformLoc = m_uniforms[passindex]["bgl_TextureCoordinateOffset"].bind;
 	if (uniformLoc != -1)
 	{
@@ -457,6 +480,7 @@
 	RAS_OpenGLRasterizer *rast = (RAS_OpenGLRasterizer *)irast;
 	bool need_depth=false;
 	bool need_luminance=false;
+	bool need_mrt1=false;
 	int num_filters = 0;
 	bool first_filter = true;
 	char buffer_toggle = 0;
@@ -474,7 +498,9 @@
 				need_depth = true;
 			if (texflag[passindex] & 0x2)
 				need_luminance = true;
-			if (need_depth && need_luminance)
+			if (texflag[passindex] & NEED_MRT1_TEXTURE)
+				need_mrt1 = true;
+			if (need_depth && need_luminance && need_mrt1)
 				break;
 		}
 	}
@@ -515,6 +541,12 @@
 		glCopyTexImage2D(GL_TEXTURE_2D,0,GL_LUMINANCE16, rect.GetLeft(), rect.GetBottom(), rect_width, rect_height, 0);
 	}
 
+	if (need_mrt1) {
+		glActiveTextureARB(GL_TEXTURE3);
+		glBindTexture(GL_TEXTURE_2D, rast->GetColorTarget(1));
+	}
+
+
 	// reverting to texunit 0, without this we get bug [#28462]
 	glActiveTextureARB(GL_TEXTURE0);
 

Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2012-08-11 22:12:32 UTC (rev 49824)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp	2012-08-11 23:36:00 UTC (rev 49825)
@@ -92,7 +92,8 @@
 	m_last_frontface(true),
 	m_materialCachingInfo(0),
 	m_width(0),
-	m_height(0)
+	m_height(0),
+	m_target_count(2)
 {
 	m_viewmatrix.setIdentity();
 	m_viewinvmatrix.setIdentity();
@@ -106,6 +107,11 @@
 	hinterlace_mask[32] = 0;
 
 	m_prevafvalue = GPU_get_anisotropic();
+
+	for (int i = 0; i < RAS_MAX_MRT; i++)
+	{
+		m_color_target[i] = -1;
+	}
 }
 
 
@@ -148,7 +154,7 @@
 	// FBO
 	glGenFramebuffersEXT(1, &m_fbo);
 	glGenTextures(1, &m_depth_target);
-	glGenTextures(1, &m_color_target);
+	glGenTextures(m_target_count, m_color_target);
 
 	return true;
 }
@@ -287,7 +293,7 @@
 	if (GLEW_EXT_separate_specular_color || GLEW_VERSION_1_2)
 		glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR);
 
-	glDeleteTextures(1, &m_color_target);
+	glDeleteTextures(m_target_count, m_color_target);
 	glDeleteTextures(1, &m_depth_target);
 	glDeleteFramebuffersEXT(1, &m_fbo);
 	
@@ -300,8 +306,11 @@
 	m_drawingmode = drawingmode;
 
 	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
-	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_color_target, 0);
-	m_final_target = m_color_target;
+	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_color_target[0], 0);
+	m_final_target = m_color_target[0];
+	

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list