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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to