[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