Revision: 27515
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27515
Author:   blendix
Date:     2010-03-15 13:35:14 +0100 (Mon, 15 Mar 2010)

Log Message:
-----------
Render Branch: make displacement work with flat shading, previously would not
have properly set normal giving strange result, though in general it's best to
use smooth shading for displacement to avoid discontinuities at the edges.

Modified Paths:
--------------
    branches/render25/source/blender/render/intern/source/object_mesh.c

Modified: branches/render25/source/blender/render/intern/source/object_mesh.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_mesh.c 
2010-03-15 12:02:10 UTC (rev 27514)
+++ branches/render25/source/blender/render/intern/source/object_mesh.c 
2010-03-15 12:35:14 UTC (rev 27515)
@@ -1209,9 +1209,10 @@
        return 0;
 }
 
-static void displace_render_vert(Render *re, ObjectRen *obr, ShadeInput *shi, 
VertRen *vr, int vindex, float *scale, float mat[][4], float imat[][3], float 
*sample)
+static void displace_render_vert(Render *re, ObjectRen *obr, ShadeInput *shi, 
VertRen *vr, int vindex, float *scale, float mat[][4], float nmat[][3], float 
*sample)
 {
        MTFace *tface;
+       VlakRen *vlr= shi->primitive.vlr;
        short texco= shi->material.mat->texco;
        float displace[3], *orco;
        char *name;
@@ -1220,22 +1221,18 @@
        /* shi->geometry.co is current render coord, just make sure at least 
some vector is here */
        copy_v3_v3(shi->geometry.co, vr->co);
        /* vertex normal is used for textures type 'col' and 'var' */
-       copy_v3_v3(shi->geometry.vn, vr->n);
+       copy_v3_v3(shi->geometry.vn, (vlr->flag & R_SMOOTH)? vr->n: vlr->n);
 
        if(mat)
                mul_m4_v3(mat, shi->geometry.co);
+       if(nmat)
+               mul_m3_v3(nmat, shi->geometry.vn);
 
-       if(imat) {
-               shi->geometry.vn[0]= 
imat[0][0]*vr->n[0]+imat[0][1]*vr->n[1]+imat[0][2]*vr->n[2];
-               shi->geometry.vn[1]= 
imat[1][0]*vr->n[0]+imat[1][1]*vr->n[1]+imat[1][2]*vr->n[2];
-               shi->geometry.vn[2]= 
imat[2][0]*vr->n[0]+imat[2][1]*vr->n[1]+imat[2][2]*vr->n[2];
-       }
-
        if (texco & TEXCO_UV) {
                shi->texture.totuv= 0;
                shi->texture.actuv= obr->actmtface;
 
-               for (i=0; (tface=render_vlak_get_tface(obr, shi->primitive.vlr, 
i, &name, 0)); i++) {
+               for (i=0; (tface=render_vlak_get_tface(obr, vlr, i, &name, 0)); 
i++) {
                        ShadeInputUV *suv= &shi->texture.uv[i];
 
                        /* shi.uv needs scale correction from tface uv */
@@ -1280,7 +1277,7 @@
        mul_v3_v3(displace, scale);
        
        if(mat)
-               mul_m3_v3(imat, displace);
+               mul_m3_v3(nmat, displace);
 
        /* 0.5 could become button once?  */
        vr->co[0] += displace[0]; 
@@ -1298,7 +1295,7 @@
        sample[vr->index]= dot_v3v3(shi->texture.displace, 
shi->texture.displace);
 }
 
-static void displace_render_face(Render *re, ObjectRen *obr, VlakRen *vlr, 
float *scale, float mat[][4], float imat[][3], float *sample)
+static void displace_render_face(Render *re, ObjectRen *obr, VlakRen *vlr, 
float *scale, float mat[][4], float nmat[][3], float *sample)
 {
        ShadeInput shi;
        VertRen *v1= vlr->v1;
@@ -1331,17 +1328,17 @@
        
        /* Displace the verts, flag is set when done */
        if(!v1->flag)
-               displace_render_vert(re, obr, &shi, v1,0,  scale, mat, imat, 
sample);
+               displace_render_vert(re, obr, &shi, v1,0,  scale, mat, nmat, 
sample);
        
        if(!v2->flag)
-               displace_render_vert(re, obr, &shi, v2, 1, scale, mat, imat, 
sample);
+               displace_render_vert(re, obr, &shi, v2, 1, scale, mat, nmat, 
sample);
 
        if(!v3->flag)
-               displace_render_vert(re, obr, &shi, v3, 2, scale, mat, imat, 
sample);
+               displace_render_vert(re, obr, &shi, v3, 2, scale, mat, nmat, 
sample);
 
        if(v4) {
                if(!v4->flag)
-                       displace_render_vert(re, obr, &shi, v4, 3, scale, mat, 
imat, sample);
+                       displace_render_vert(re, obr, &shi, v4, 3, scale, mat, 
nmat, sample);
 
                /*      closest in displace value.  This will help smooth 
edges.   */ 
                if(fabs(sample[v1->index] - sample[v3->index]) > 
fabs(sample[v2->index] - sample[v4->index]))
@@ -1361,10 +1358,17 @@
        Object *obt;
        VlakRen *vlr;
        VertRen *vr;
-       float scale[3]={1.0f, 1.0f, 1.0f}, temp[3], *sample;
+       float scale[3]={1.0f, 1.0f, 1.0f}, temp[3], *sample, nmat[3][3];
        int i;
 
        sample= MEM_callocN(sizeof(float)*obr->totvert, "do_displacement 
sample");
+
+       if(imat) {
+               copy_m3_m3(nmat, imat);
+               transpose_m3(nmat);
+       }
+       else
+               unit_m3(nmat);
                
        /* Object Size with parenting */
        obt=obr->ob;
@@ -1382,7 +1386,7 @@
 
        for(i=0; i<obr->totvlak; i++){
                vlr=render_object_vlak_get(obr, i);
-               displace_render_face(re, obr, vlr, scale, mat, imat, sample);
+               displace_render_face(re, obr, vlr, scale, mat, nmat, sample);
        }
 
        MEM_freeN(sample);


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

Reply via email to