[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15493] branches/apricot: Apricot Branch: GLSL
Brecht Van Lommel
brechtvanlommel at pandora.be
Wed Jul 9 00:30:57 CEST 2008
Revision: 15493
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15493
Author: blendix
Date: 2008-07-09 00:30:54 +0200 (Wed, 09 Jul 2008)
Log Message:
-----------
Apricot Branch: GLSL
====================
* Some optimizations in the glsl shader code to avoid some
matrix multiplications, and other floating point ops.
* Optimized game engine mesh deforming code a bit, and
removed a bunch of unneeded/duplicated code.
* Fix for bugs #17289 and #17295, glsl compile errors.
Modified Paths:
--------------
branches/apricot/intern/moto/include/GEN_Map.h
branches/apricot/source/blender/gpu/GPU_material.h
branches/apricot/source/blender/gpu/intern/gpu_material.c
branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl
branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl.c
branches/apricot/source/blender/src/drawobject.c
branches/apricot/source/gameengine/Converter/BL_BlenderDataConversion.cpp
branches/apricot/source/gameengine/Converter/BL_MeshDeformer.cpp
branches/apricot/source/gameengine/Converter/BL_MeshDeformer.h
branches/apricot/source/gameengine/Converter/BL_SkinDeformer.cpp
branches/apricot/source/gameengine/Converter/BL_SkinMeshObject.cpp
branches/apricot/source/gameengine/Converter/BL_SkinMeshObject.h
branches/apricot/source/gameengine/Ketsji/BL_BlenderShader.cpp
branches/apricot/source/gameengine/Ketsji/BL_BlenderShader.h
branches/apricot/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
branches/apricot/source/gameengine/Rasterizer/RAS_MeshObject.cpp
branches/apricot/source/gameengine/Rasterizer/RAS_MeshObject.h
branches/apricot/source/gameengine/Rasterizer/RAS_TexVert.cpp
branches/apricot/source/gameengine/Rasterizer/RAS_TexVert.h
branches/apricot/source/kernel/gen_system/GEN_HashedPtr.h
branches/apricot/source/kernel/gen_system/GEN_Map.h
Modified: branches/apricot/intern/moto/include/GEN_Map.h
===================================================================
--- branches/apricot/intern/moto/include/GEN_Map.h 2008-07-08 19:34:20 UTC (rev 15492)
+++ branches/apricot/intern/moto/include/GEN_Map.h 2008-07-08 22:30:54 UTC (rev 15493)
@@ -82,6 +82,24 @@
}
return 0;
}
+
+ Key* getKey(int index) {
+ int count=0;
+ for (int i=0;i<m_num_buckets;i++)
+ {
+ Entry* bucket = m_buckets[i];
+ while(bucket)
+ {
+ if (count==index)
+ {
+ return &bucket->m_key;
+ }
+ bucket = bucket->m_next;
+ count++;
+ }
+ }
+ return 0;
+ }
void clear() {
for (int i = 0; i < m_num_buckets; ++i) {
Modified: branches/apricot/source/blender/gpu/GPU_material.h
===================================================================
--- branches/apricot/source/blender/gpu/GPU_material.h 2008-07-08 19:34:20 UTC (rev 15492)
+++ branches/apricot/source/blender/gpu/GPU_material.h 2008-07-08 22:30:54 UTC (rev 15493)
@@ -112,7 +112,7 @@
void GPU_material_free(GPUMaterial *material);
void GPU_material_bind(GPUMaterial *material, int lay);
-void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4]);
+void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4]);
void GPU_material_unbind(GPUMaterial *material);
void GPU_material_vertex_attributes(GPUMaterial *material,
Modified: branches/apricot/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_material.c 2008-07-08 19:34:20 UTC (rev 15492)
+++ branches/apricot/source/blender/gpu/intern/gpu_material.c 2008-07-08 22:30:54 UTC (rev 15493)
@@ -88,10 +88,11 @@
float dynenergy, dyncol[3];
float energy, col[3];
- float co[3];
- float vec[3];
+ float co[3], vec[3];
+ float dynco[3], dynvec[3];
float obmat[4][4];
float imat[4][4];
+ float dynimat[4][4];
float spotsi, spotbl, k;
float dist, att1, att2;
@@ -105,6 +106,7 @@
float winmat[4][4];
float viewmat[4][4];
float persmat[4][4];
+ float dynpersmat[4][4];
GPUFrameBuffer *fb;
GPUTexture *tex;
@@ -220,10 +222,12 @@
}
}
-void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4])
+void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4])
{
if(material->pass) {
GPUShader *shader = GPU_pass_shader(material->pass);
+ LinkNode *nlink;
+ GPULamp *lamp;
float invmat[4][4];
/* handle builtins */
@@ -231,8 +235,7 @@
GPU_shader_uniform_vector(shader, GPU_builtin_name(GPU_VIEW_MATRIX), 16, 1, (float*)viewmat);
}
if(material->builtins & GPU_INVERSE_VIEW_MATRIX) {
- Mat4Invert(invmat, viewmat);
- GPU_shader_uniform_vector(shader, GPU_builtin_name(GPU_INVERSE_VIEW_MATRIX), 16, 1, (float*)invmat);
+ GPU_shader_uniform_vector(shader, GPU_builtin_name(GPU_INVERSE_VIEW_MATRIX), 16, 1, (float*)viewinv);
}
if(material->builtins & GPU_OBJECT_MATRIX) {
GPU_shader_uniform_vector(shader, GPU_builtin_name(GPU_OBJECT_MATRIX), 16, 1, (float*)obmat);
@@ -241,6 +244,22 @@
Mat4Invert(invmat, obmat);
GPU_shader_uniform_vector(shader, GPU_builtin_name(GPU_INVERSE_OBJECT_MATRIX), 16, 1, (float*)invmat);
}
+
+ /* update lamps */
+ for(nlink=material->lamps; nlink; nlink=nlink->next) {
+ lamp= nlink->link;
+
+ VECCOPY(lamp->dynvec, lamp->vec);
+ Normalize(lamp->dynvec);
+ VecMulf(lamp->dynvec, -1.0f);
+ Mat4Mul3Vecfl(viewmat, lamp->dynvec);
+
+ VECCOPY(lamp->dynco, lamp->co);
+ Mat4MulVecfl(viewmat, lamp->dynco);
+
+ Mat4MulMat4(lamp->dynimat, viewinv, lamp->imat);
+ Mat4MulMat4(lamp->dynpersmat, viewinv, lamp->persmat);
+ }
}
}
@@ -283,11 +302,11 @@
/* from get_lamp_visibility */
if(lamp->type==LA_SUN || lamp->type==LA_HEMI) {
- GPU_link(mat, "lamp_visibility_sun_hemi", GPU_builtin(GPU_VIEW_MATRIX), GPU_dynamic_uniform(lamp->vec), lv, dist, &visifac);
+ GPU_link(mat, "lamp_visibility_sun_hemi", GPU_dynamic_uniform(lamp->dynvec), lv, dist, &visifac);
return visifac;
}
else {
- GPU_link(mat, "lamp_visibility_other", GPU_builtin(GPU_VIEW_MATRIX), GPU_builtin(GPU_VIEW_POSITION), GPU_dynamic_uniform(lamp->co), lv, dist, &visifac);
+ GPU_link(mat, "lamp_visibility_other", GPU_builtin(GPU_VIEW_POSITION), GPU_dynamic_uniform(lamp->dynco), lv, dist, &visifac);
if(lamp->type==LA_AREA)
return visifac;
@@ -321,9 +340,9 @@
if(lamp->type == LA_SPOT) {
if(lamp->mode & LA_SQUARE)
- GPU_link(mat, "lamp_visibility_spot_square", GPU_builtin(GPU_VIEW_MATRIX), GPU_builtin(GPU_INVERSE_VIEW_MATRIX), GPU_dynamic_uniform(lamp->vec), GPU_dynamic_uniform((float*)lamp->imat), *lv, &inpr);
+ GPU_link(mat, "lamp_visibility_spot_square", GPU_dynamic_uniform(lamp->dynvec), GPU_dynamic_uniform((float*)lamp->dynimat), *lv, &inpr);
else
- GPU_link(mat, "lamp_visibility_spot_circle", GPU_builtin(GPU_VIEW_MATRIX), GPU_dynamic_uniform(lamp->vec), *lv, &inpr);
+ GPU_link(mat, "lamp_visibility_spot_circle", GPU_dynamic_uniform(lamp->dynvec), *lv, &inpr);
GPU_link(mat, "lamp_visibility_spot", GPU_uniform(&lamp->spotsi), GPU_uniform(&lamp->spotbl), inpr, visifac, &visifac);
}
@@ -528,7 +547,7 @@
memset(&area, 0, sizeof(area));
memset(&areasize, 0, sizeof(areasize));
- GPU_link(mat, "shade_inp_area", GPU_builtin(GPU_VIEW_POSITION), GPU_dynamic_uniform(lamp->co), GPU_dynamic_uniform(lamp->vec), vn, GPU_uniform((float*)area),
+ GPU_link(mat, "shade_inp_area", GPU_builtin(GPU_VIEW_POSITION), GPU_dynamic_uniform(lamp->dynco), GPU_dynamic_uniform(lamp->dynvec), vn, GPU_uniform((float*)area),
GPU_uniform(&areasize), GPU_uniform(&lamp->k), &inp);
}
@@ -558,10 +577,10 @@
GPU_link(mat, "mtex_value_clamp_positive", i, &i);
if((ma->mode & MA_SHADOW) && GPU_lamp_has_shadow_buffer(lamp)) {
- GPU_link(mat, "test_shadowbuf", GPU_builtin(GPU_INVERSE_VIEW_MATRIX),
+ GPU_link(mat, "test_shadowbuf",
GPU_builtin(GPU_VIEW_POSITION),
GPU_dynamic_texture(lamp->tex),
- GPU_dynamic_uniform((float*)lamp->persmat),
+ GPU_dynamic_uniform((float*)lamp->dynpersmat),
GPU_uniform(&lamp->bias), inp, &shadfac);
if(lamp->mode & LA_ONLYSHADOW) {
@@ -741,7 +760,7 @@
Tex *tex;
GPUNodeLink *texco, *tin, *trgb, *tnor, *tcol, *stencil = NULL;
GPUNodeLink *colfac, *newnor, *varfac, *orn;
- float one = 1.0f;
+ float one = 1.0f, norfac;
int tex_nr, rgbnor, talpha;
GPU_link(mat, "texco_norm", GPU_builtin(GPU_VIEW_NORMAL), &orn);
@@ -780,7 +799,9 @@
continue;
GPU_link(mat, "mtex_2d_mapping", texco, &texco);
- GPU_link(mat, "mtex_mapping", texco, GPU_uniform(mtex->size), GPU_uniform(mtex->ofs), &texco);
+ if(mtex->size[0] != 1.0f || mtex->size[1] != 1.0f || mtex->size[2] != 1.0f ||
+ mtex->ofs[0] != 0.0f || mtex->ofs[1] != 0.0f || mtex->ofs[2] != 0.0f)
+ GPU_link(mat, "mtex_mapping", texco, GPU_uniform(mtex->size), GPU_uniform(mtex->ofs), &texco);
if(tex && tex->type == TEX_IMAGE && tex->ima) {
#ifdef DEBUG_SHADOW
@@ -860,7 +881,11 @@
else
newnor = tnor;
- GPU_link(mat, "mtex_blend_normal", GPU_uniform(&mtex->norfac), shi->vn, newnor, &shi->vn);
+ norfac = MIN2(mtex->norfac, 1.0);
+ if(norfac == 1.0f)
+ shi->vn = newnor;
+ else
+ GPU_link(mat, "mtex_blend_normal", GPU_uniform(&norfac), shi->vn, newnor, &shi->vn);
}
GPU_link(mat, "vec_math_negate", shi->vn, &orn);
Modified: branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl 2008-07-08 19:34:20 UTC (rev 15492)
+++ branches/apricot/source/blender/gpu/intern/gpu_shader_material.glsl 2008-07-08 22:30:54 UTC (rev 15493)
@@ -112,10 +112,9 @@
void camera(vec3 co, out vec3 outview, out float outdepth, out float outdist)
{
- outview = co;
- outdepth = abs(outview.z);
- outdist = length(outview);
- outview = normalize(outview);
+ outdepth = abs(co.z);
+ outdist = length(co);
+ outview = normalize(co);
}
void math_add(float val1, float val2, out float outval)
@@ -931,8 +930,7 @@
void mtex_value_clamp_positive(float fac, out float outfac)
{
- if(fac < 0.0) outfac = 0.0;
- else outfac = fac;
+ outfac = max(fac, 0.0);
}
void mtex_value_clamp(float fac, out float outfac)
@@ -1002,8 +1000,7 @@
void mtex_2d_mapping(vec3 vec, out vec3 outvec)
{
- outvec.xy = (vec.xy + vec2(1.0, 1.0))*0.5;
- outvec.z = vec.z;
+ outvec = vec3(vec.xy*0.5 + vec2(0.5, 0.5), vec.z);
}
void mtex_image(vec3 vec, sampler2D ima, out float value, out vec4 color, out vec3 normal)
@@ -1032,26 +1029,22 @@
void mtex_blend_normal(float norfac, vec3 normal, vec3 newnormal, out vec3 outnormal)
{
- norfac = min(norfac, 1.0);
outnormal = (1.0 - norfac)*normal + norfac*newnormal;
outnormal = normalize(outnormal);
}
/******* MATERIAL *********/
-void lamp_visibility_sun_hemi(mat4 viewmat, vec3 lampvec, out vec3 lv, out float dist, out float visifac)
+void lamp_visibility_sun_hemi(vec3 lampvec, out vec3 lv, out float dist, out float visifac)
{
- lampvec = -normalize(lampvec);
- lampvec = (viewmat*vec4(lampvec, 0.0)).xyz;
-
lv = lampvec;
dist = 1.0;
visifac = 1.0;
}
-void lamp_visibility_other(mat4 viewmat, vec3 co, vec3 lampco, out vec3 lv, out float dist, out float visifac)
+void lamp_visibility_other(vec3 co, vec3 lampco, out vec3 lv, out float dist, out float visifac)
{
- lv = co - (viewmat*vec4(lampco, 1.0)).xyz;
+ lv = co - lampco;
dist = length(lv);
lv = normalize(lv);
visifac = 1.0;
@@ -1087,14 +1080,10 @@
outvisifac= visifac*max(t, 0.0)/lampdist;
}
-void lamp_visibility_spot_square(mat4 viewmat, mat4 viewinvmat, vec3 lampvec, mat4 lampimat, vec3 lv, out float inpr)
+void lamp_visibility_spot_square(vec3 lampvec, mat4 lampimat, vec3 lv, out float inpr)
{
- lampvec = -normalize(lampvec);
- lampvec = (viewmat*vec4(lampvec, 0.0)).xyz;
-
if(dot(lv, lampvec) > 0.0) {
- vec3 lvrot = (viewinvmat*vec4(lv, 0.0)).xyz;
- lvrot = (lampimat*vec4(lvrot, 0.0)).xyz;
+ vec3 lvrot = (lampimat*vec4(lv, 0.0)).xyz;
float x = max(abs(lvrot.x/lvrot.z), abs(lvrot.y/lvrot.z));
inpr = 1.0/sqrt(1.0 + x*x);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list