[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