[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54874] branches/ge_harmony/source: Binding the material struct from the prepass to custom material shaders.
Daniel Stokes
kupomail at gmail.com
Tue Feb 26 03:36:59 CET 2013
Revision: 54874
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54874
Author: kupoman
Date: 2013-02-26 02:36:58 +0000 (Tue, 26 Feb 2013)
Log Message:
-----------
Binding the material struct from the prepass to custom material shaders. This is a little hacky since the rasterizer doesn't know as much as it should about materials.
Modified Paths:
--------------
branches/ge_harmony/source/blender/gpu/GPU_material.h
branches/ge_harmony/source/blender/gpu/intern/gpu_material.c
branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.cpp
branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.h
branches/ge_harmony/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
branches/ge_harmony/source/gameengine/Ketsji/KX_BlenderMaterial.h
branches/ge_harmony/source/gameengine/Ketsji/KX_PolygonMaterial.h
branches/ge_harmony/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h
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/source/blender/gpu/GPU_material.h
===================================================================
--- branches/ge_harmony/source/blender/gpu/GPU_material.h 2013-02-26 02:33:24 UTC (rev 54873)
+++ branches/ge_harmony/source/blender/gpu/GPU_material.h 2013-02-26 02:36:58 UTC (rev 54874)
@@ -138,6 +138,9 @@
int GPU_material_bound(GPUMaterial *material);
void GPU_material_get_sources(GPUMaterial *material, char *vertex, char *geometry, char *fragment);
+// XXX Remove after material refactor
+struct GPUShader *GPU_material_get_shader(GPUMaterial *material);
+
void GPU_material_vertex_attributes(GPUMaterial *material,
struct GPUVertexAttribs *attrib);
Modified: branches/ge_harmony/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/ge_harmony/source/blender/gpu/intern/gpu_material.c 2013-02-26 02:33:24 UTC (rev 54873)
+++ branches/ge_harmony/source/blender/gpu/intern/gpu_material.c 2013-02-26 02:36:58 UTC (rev 54874)
@@ -493,6 +493,11 @@
GPU_pass_get_sources(material->pass, vertex, geometry, fragment);
}
+struct GPUShader *GPU_material_get_shader(GPUMaterial *material)
+{
+ return GPU_pass_shader(material->pass);
+}
+
void GPU_material_vertex_attributes(GPUMaterial *material, GPUVertexAttribs *attribs)
{
*attribs = material->attribs;
Modified: branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.cpp 2013-02-26 02:33:24 UTC (rev 54873)
+++ branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.cpp 2013-02-26 02:36:58 UTC (rev 54874)
@@ -311,6 +311,11 @@
return mAlphaBlend;
}
+struct GPUShader* BL_BlenderShader::GetShader()
+{
+ return GPU_material_get_shader(mGPUMat);
+}
+
bool BL_BlenderShader::Equals(BL_BlenderShader *blshader)
{
/* to avoid unneeded state switches */
Modified: branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.h
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.h 2013-02-26 02:33:24 UTC (rev 54873)
+++ branches/ge_harmony/source/gameengine/Ketsji/BL_BlenderShader.h 2013-02-26 02:36:58 UTC (rev 54874)
@@ -90,6 +90,9 @@
void ReloadMaterial();
int GetAlphaBlend();
+ // XXX This should be removed after refactoring materials
+ struct GPUShader *GetShader();
+
void SetScene(KX_Scene *scene)
{
mScene = scene;
Modified: branches/ge_harmony/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/KX_BlenderMaterial.cpp 2013-02-26 02:33:24 UTC (rev 54873)
+++ branches/ge_harmony/source/gameengine/Ketsji/KX_BlenderMaterial.cpp 2013-02-26 02:36:58 UTC (rev 54874)
@@ -144,6 +144,10 @@
return mMaterial->material;
}
+struct GPUShader *KX_BlenderMaterial::GetShader() const
+{
+ return mBlenderShader->GetShader();
+}
void KX_BlenderMaterial::SetBlenderShader(BL_BlenderShader *shader)
{
// First get rid of the old one if we have one
@@ -618,10 +622,6 @@
void KX_BlenderMaterial::ActivateMeshSlot(const RAS_MeshSlot & ms, RAS_IRasterizer* rasty) const
{
- if (rasty->GetDrawingMode() == RAS_IRasterizer::KX_OVERRIDE)
- {
- rasty->ActivatePrePassMat(mMaterial);
- }
if (mShader && GLEW_ARB_shader_objects) {
mShader->Update(ms, rasty);
}
Modified: branches/ge_harmony/source/gameengine/Ketsji/KX_BlenderMaterial.h
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/KX_BlenderMaterial.h 2013-02-26 02:33:24 UTC (rev 54873)
+++ branches/ge_harmony/source/gameengine/Ketsji/KX_BlenderMaterial.h 2013-02-26 02:36:58 UTC (rev 54874)
@@ -78,6 +78,7 @@
)const;
Material* GetBlenderMaterial() const;
+ struct GPUShader* GetShader() const;
BL_BlenderShader* GetBlenderShader() const;
void SetBlenderShader(BL_BlenderShader* shader);
MTFace* GetMTFace(void) const;
Modified: branches/ge_harmony/source/gameengine/Ketsji/KX_PolygonMaterial.h
===================================================================
--- branches/ge_harmony/source/gameengine/Ketsji/KX_PolygonMaterial.h 2013-02-26 02:33:24 UTC (rev 54873)
+++ branches/ge_harmony/source/gameengine/Ketsji/KX_PolygonMaterial.h 2013-02-26 02:36:58 UTC (rev 54874)
@@ -112,6 +112,8 @@
return m_material;
}
+ struct GPUShader* GetShader() const {return NULL;}
+
Image *GetBlenderImage() const;
/**
Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h 2013-02-26 02:33:24 UTC (rev 54873)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h 2013-02-26 02:36:58 UTC (rev 54874)
@@ -166,6 +166,7 @@
int GetMaterialIndex() const;
virtual Material* GetBlenderMaterial() const;
+ virtual struct GPUShader* GetShader() const = 0;
virtual Image* GetBlenderImage() const;
virtual Scene* GetBlenderScene() const;
virtual void ReleaseMaterial();
Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h 2013-02-26 02:33:24 UTC (rev 54873)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_IRasterizer.h 2013-02-26 02:36:58 UTC (rev 54874)
@@ -438,7 +438,6 @@
virtual void SetPrePassShader(struct Shader** shader, int count)=0;
virtual int BeginPrePass()=0;
- virtual void ActivatePrePassMat(struct BL_Material* mat)=0;
virtual void EndPrePass()=0;
virtual void SetPrepassCount(int count)=0;
Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp 2013-02-26 02:33:24 UTC (rev 54873)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp 2013-02-26 02:36:58 UTC (rev 54874)
@@ -440,6 +440,7 @@
bool RAS_OpenGLRasterizer::SetMaterial(const RAS_IPolyMaterial& mat)
{
+ this->ActivateShader(mat);
return mat.Activate(this, m_materialCachingInfo);
}
@@ -1640,17 +1641,27 @@
return 1;
}
-void RAS_OpenGLRasterizer::ActivatePrePassMat(struct BL_Material *bmat)
+void RAS_OpenGLRasterizer::ActivateShader(const RAS_IPolyMaterial& polymat)
{
- Material *mat = bmat->material;
+ Material *mat = polymat.GetBlenderMaterial();
MTex *mtex;
Tex *tex;
GPUTexture *gpu_tex;
+ GPUShader *shader;
char name[50];
float texco[3];
int bind;
- GPUShader *shader = m_prepass_shader;
+ if (this->GetDrawingMode() == KX_OVERRIDE) {
+ shader = m_prepass_shader;
+ }
+ else {
+ shader = polymat.GetShader();
+ }
+
+ if (!shader)
+ return;
+
bind = GPU_shader_get_uniform(shader, "bgl_Material.id");
int id = (mat->diff_shader << 4) + mat->spec_shader;
float fid = id/65335.0;
@@ -1676,7 +1687,7 @@
bind = GPU_shader_get_uniform(shader, "bgl_Material.hardness");
float hardness;
if (mat->spec_shader != MA_SPEC_TOON)
- hardness = log(bmat->hard) / log(511.0);
+ hardness = logf(mat->har) / log(511.0f);
else
hardness = mat->param[2] / 10.0;
GPU_shader_uniform_vector(shader, bind, 1, 1, &hardness);
Modified: branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
===================================================================
--- branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h 2013-02-26 02:33:24 UTC (rev 54873)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h 2013-02-26 02:36:58 UTC (rev 54874)
@@ -159,6 +159,8 @@
int m_storage_type;
RAS_IStorage* m_storage;
RAS_IStorage* m_failsafe_storage; //So derived mesh can use immediate mode
+
+ void ActivateShader(const class RAS_IPolyMaterial& mat);
public:
double GetTime();
@@ -373,7 +375,6 @@
/* Pre Pass */
virtual void SetPrePassShader(struct Shader** shader, int count);
virtual int BeginPrePass();
- virtual void ActivatePrePassMat(struct BL_Material* mat);
virtual void EndPrePass();
int GetFBOWidth() { return m_width; }
More information about the Bf-blender-cvs
mailing list