[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54876] branches/ge_harmony/source: Custom material shaders now also have access to the material struct.
Daniel Stokes
kupomail at gmail.com
Tue Feb 26 04:35:17 CET 2013
Revision: 54876
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54876
Author: kupoman
Date: 2013-02-26 03:35:15 +0000 (Tue, 26 Feb 2013)
Log Message:
-----------
Custom material shaders now also have access to the material struct.
Modified Paths:
--------------
branches/ge_harmony/source/blender/gpu/GPU_extensions.h
branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c
branches/ge_harmony/source/blender/gpu/intern/gpu_material.c
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_extensions.h
===================================================================
--- branches/ge_harmony/source/blender/gpu/GPU_extensions.h 2013-02-26 03:20:10 UTC (rev 54875)
+++ branches/ge_harmony/source/blender/gpu/GPU_extensions.h 2013-02-26 03:35:15 UTC (rev 54876)
@@ -167,6 +167,7 @@
void GPU_shader_bind(GPUShader *shader);
void GPU_shader_unbind(GPUShader *shader);
+void GPU_shader_material_bind(GPUShader *shader, struct Material *mat, double time);
int GPU_shader_get_uniform(GPUShader *shader, const char *name);
void GPU_shader_uniform_vector(GPUShader *shader, int location, int length,
int arraysize, float *value);
Modified: branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c
===================================================================
--- branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c 2013-02-26 03:20:10 UTC (rev 54875)
+++ branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c 2013-02-26 03:35:15 UTC (rev 54876)
@@ -33,6 +33,7 @@
#include "GL/glew.h"
#include "DNA_image_types.h"
+#include "DNA_texture_types.h"
#include "DNA_material_types.h"
#include "MEM_guardedalloc.h"
@@ -1361,6 +1362,93 @@
MEM_freeN(shader);
}
+void GPU_shader_material_bind(GPUShader *shader, Material *mat, double time)
+{
+ MTex *mtex;
+ Tex *tex;
+ GPUTexture *gpu_tex;
+ char name[50];
+ float texco[3];
+ int bind;
+
+ bind = GPU_shader_get_uniform(shader, "bgl_Material.id");
+ {
+ int id = (mat->diff_shader << 4) + mat->spec_shader;
+ float fid = id/65335.0;
+ GPU_shader_uniform_vector(shader, bind, 1, 1, &fid);
+ }
+
+ {
+ float dparam1=0.0, dparam2=0.0;
+ if (mat->diff_shader == MA_DIFF_TOON || mat->diff_shader == MA_DIFF_FRESNEL)
+ {
+ dparam1 = mat->param[0] / 10.0;
+ dparam2 = mat->param[1] / 10.0;
+ }
+ else if (mat->diff_shader == MA_DIFF_ORENNAYAR)
+ dparam1 = mat->roughness / 10.0;
+ else if (mat->diff_shader == MA_DIFF_MINNAERT)
+ dparam1 = mat->darkness / 10.0;
+
+ bind = GPU_shader_get_uniform(shader, "bgl_Material.diffuseParam1");
+ GPU_shader_uniform_vector(shader, bind, 1, 1, &dparam1);
+
+ bind = GPU_shader_get_uniform(shader, "bgl_Material.diffuseParam2");
+ GPU_shader_uniform_vector(shader, bind, 1, 1, &dparam2);
+ }
+
+ bind = GPU_shader_get_uniform(shader, "bgl_Material.hardness");
+ {
+ float hardness;
+ if (mat->spec_shader != MA_SPEC_TOON)
+ hardness = log((float)mat->har) / log(511.0f);
+ else
+ hardness = mat->param[2] / 10.0;
+ GPU_shader_uniform_vector(shader, bind, 1, 1, &hardness);
+ }
+
+ bind = GPU_shader_get_uniform(shader, "bgl_Material.specularity");
+ {
+ float spec_param = 0.0;
+ if (mat->spec_shader == MA_SPEC_BLINN)
+ spec_param = mat->refrac / 10.0;
+ else if (mat->spec_shader == MA_SPEC_WARDISO)
+ spec_param = mat->rms / 10.0;
+ else if (mat->spec_shader == MA_SPEC_TOON)
+ spec_param = mat->param[3] / 10.0;
+ GPU_shader_uniform_vector(shader, bind, 1, 1, &spec_param);
+ }
+
+ {
+ int slot = 0, i;
+ for (i = 0; i < MAX_MTEX; i++) {
+ int f = 0, t = 1;
+
+ mtex = mat->mtex[i];
+ if (!mtex) continue;
+
+ tex = mtex->tex;
+ if (!tex) continue;
+
+ if (mtex->mapto & MAP_NORM && tex->type == TEX_IMAGE) {
+ sprintf(name, "bgl_Textures[%d].data", slot);
+ bind = GPU_shader_get_uniform(shader, name);
+ gpu_tex = GPU_texture_from_blender(tex->ima, &tex->iuser, TRUE, time, 1);
+ GPU_texture_bind(gpu_tex, slot);
+ GPU_shader_uniform_texture(shader, bind, gpu_tex);
+ }
+ else
+ continue;
+
+ sprintf(name, "bgl_Textures[%d].enabled", slot);
+ bind = GPU_shader_get_uniform(shader, name);
+ GPU_shader_uniform_ivector(shader, bind, 1, 1, &t);
+
+ slot++;
+ }
+ }
+}
+
int GPU_shader_get_uniform(GPUShader *shader, const char *name)
{
int bind;
Modified: branches/ge_harmony/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/ge_harmony/source/blender/gpu/intern/gpu_material.c 2013-02-26 03:20:10 UTC (rev 54875)
+++ branches/ge_harmony/source/blender/gpu/intern/gpu_material.c 2013-02-26 03:35:15 UTC (rev 54876)
@@ -342,6 +342,9 @@
cs = cs->next;
}
+ /* bind material struct */
+ GPU_shader_material_bind(shader, material->ma, 1.0);
+
/* handle rna uniforms */
RNA_pointer_create((ID*)material->ma, &RNA_Material, material->ma, &ma_ptr);
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 03:20:10 UTC (rev 54875)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp 2013-02-26 03:35:15 UTC (rev 54876)
@@ -440,7 +440,10 @@
bool RAS_OpenGLRasterizer::SetMaterial(const RAS_IPolyMaterial& mat)
{
- this->ActivateShader(mat);
+ if (this->GetDrawingMode() == KX_OVERRIDE) {
+ GPU_shader_material_bind(m_prepass_shader, mat.GetBlenderMaterial(), this->GetTime());
+ }
+
return mat.Activate(this, m_materialCachingInfo);
}
@@ -1641,95 +1644,6 @@
return 1;
}
-void RAS_OpenGLRasterizer::ActivateShader(const RAS_IPolyMaterial& polymat)
-{
- Material *mat = polymat.GetBlenderMaterial();
- MTex *mtex;
- Tex *tex;
- GPUTexture *gpu_tex;
- GPUShader *shader;
- char name[50];
- float texco[3];
- int bind;
-
- 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;
- GPU_shader_uniform_vector(shader, bind, 1, 1, &fid);
-
- float dparam1=0.0, dparam2=0.0;
- if (mat->diff_shader == MA_DIFF_TOON || mat->diff_shader == MA_DIFF_FRESNEL)
- {
- dparam1 = mat->param[0] / 10.0;
- dparam2 = mat->param[1] / 10.0;
- }
- else if (mat->diff_shader == MA_DIFF_ORENNAYAR)
- dparam1 = mat->roughness / 10.0;
- else if (mat->diff_shader == MA_DIFF_MINNAERT)
- dparam1 = mat->darkness / 10.0;
-
- bind = GPU_shader_get_uniform(shader, "bgl_Material.diffuseParam1");
- GPU_shader_uniform_vector(shader, bind, 1, 1, &dparam1);
-
- bind = GPU_shader_get_uniform(shader, "bgl_Material.diffuseParam2");
- GPU_shader_uniform_vector(shader, bind, 1, 1, &dparam2);
-
- bind = GPU_shader_get_uniform(shader, "bgl_Material.hardness");
- float hardness;
- if (mat->spec_shader != MA_SPEC_TOON)
- hardness = logf(mat->har) / log(511.0f);
- else
- hardness = mat->param[2] / 10.0;
- GPU_shader_uniform_vector(shader, bind, 1, 1, &hardness);
-
- bind = GPU_shader_get_uniform(shader, "bgl_Material.specularity");
- float spec_param = 0.0;
- if (mat->spec_shader == MA_SPEC_BLINN)
- spec_param = mat->refrac / 10.0;
- else if (mat->spec_shader == MA_SPEC_WARDISO)
- spec_param = mat->rms / 10.0;
- else if (mat->spec_shader == MA_SPEC_TOON)
- spec_param = mat->param[3] / 10.0;
- GPU_shader_uniform_vector(shader, bind, 1, 1, &spec_param);
-
- int slot = 0;
- for (int i = 0; i < MAX_MTEX; i++) {
- int f = 0, t = 1;
-
- mtex = mat->mtex[i];
- if (!mtex) continue;
-
- tex = mtex->tex;
- if (!tex) continue;
-
- if (mtex->mapto & MAP_NORM && tex->type == TEX_IMAGE) {
- sprintf(name, "bgl_Textures[%d].data", slot);
- bind = GPU_shader_get_uniform(shader, name);
- gpu_tex = GPU_texture_from_blender(tex->ima, &tex->iuser, TRUE, this->GetTime(), 1);
- GPU_texture_bind(gpu_tex, slot);
- GPU_shader_uniform_texture(shader, bind, gpu_tex);
- }
- else
- continue;
-
- sprintf(name, "bgl_Textures[%d].enabled", slot);
- bind = GPU_shader_get_uniform(shader, name);
- GPU_shader_uniform_ivector(shader, bind, 1, 1, &t);
-
- slot++;
- }
-}
-
void RAS_OpenGLRasterizer::EndPrePass()
{
if (!m_prepass_shader) return;
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 03:20:10 UTC (rev 54875)
+++ branches/ge_harmony/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h 2013-02-26 03:35:15 UTC (rev 54876)
@@ -159,8 +159,6 @@
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();
More information about the Bf-blender-cvs
mailing list