Revision: 27713
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27713
Author:   blendix
Date:     2010-03-24 12:33:39 +0100 (Wed, 24 Mar 2010)

Log Message:
-----------
Render Branch: displacement now preserves smooth normals from the base mesh,
which got lost due to linear subdivision. It now does this:

final normal = displaced normal + (base mesh normal - subdivided normal)

Modified Paths:
--------------
    branches/render25/source/blender/render/intern/include/object.h
    branches/render25/source/blender/render/intern/include/object_mesh.h
    branches/render25/source/blender/render/intern/source/object.c
    branches/render25/source/blender/render/intern/source/object_displace.c
    branches/render25/source/blender/render/intern/source/object_mesh.c
    branches/render25/source/blender/render/intern/source/object_particle.c

Modified: branches/render25/source/blender/render/intern/include/object.h
===================================================================
--- branches/render25/source/blender/render/intern/include/object.h     
2010-03-24 10:56:37 UTC (rev 27712)
+++ branches/render25/source/blender/render/intern/include/object.h     
2010-03-24 11:33:39 UTC (rev 27713)
@@ -167,6 +167,7 @@
 #define RE_FACE_ELEMS                  1
 #define RE_NMAP_TANGENT_ELEMS  12
 #define RE_STRANDCO_ELEMS              1
+#define RE_BASENOR_ELEMS               3
 
 #endif /* __RENDER_OBJECT_H__ */
 

Modified: branches/render25/source/blender/render/intern/include/object_mesh.h
===================================================================
--- branches/render25/source/blender/render/intern/include/object_mesh.h        
2010-03-24 10:56:37 UTC (rev 27712)
+++ branches/render25/source/blender/render/intern/include/object_mesh.h        
2010-03-24 11:33:39 UTC (rev 27713)
@@ -55,6 +55,7 @@
 float *render_vert_get_tangent(struct ObjectRen *obr, struct VertRen *ver, int 
verify);
 float *render_vert_get_strandco(struct ObjectRen *obr, struct VertRen *ver, 
int verify);
 float *render_vert_get_winspeed(struct ObjectInstanceRen *obi, struct VertRen 
*ver, int verify);
+float *render_vert_get_basenor(struct ObjectRen *obr, struct VertRen *ren, int 
verify);
 
 /* Face Texture Coordinates */
 
@@ -69,7 +70,7 @@
 void init_render_object_data(struct Render *re, struct ObjectRen *obr, int 
timeoffset);
 void init_render_particle_system(struct Render *re, struct ObjectRen *obr, 
struct ParticleSystem *psys, int timeoffset);
 void finalize_render_object(struct Render *re, struct ObjectRen *obr, int 
timeoffset);
-void render_object_calc_vnormals(struct Render *re, struct ObjectRen *obr, int 
do_tangent, int do_nmap_tangent);
+void render_object_calc_vnormals(struct Render *re, struct ObjectRen *obr, int 
do_tangent, int do_nmap_tangent, float (**diffnor)[3]);
 int render_object_has_displacement(struct Render *re, struct ObjectRen *obr);
 void render_object_displace(struct Render *re, struct ObjectRen *obr, float 
mat[][4], float nmat[][3]);
 
@@ -84,6 +85,7 @@
        float *stress;
        float *winspeed;
        float *strandco;
+       float *basenor;
 } VertTableNode;
 
 typedef struct VlakTableNode {

Modified: branches/render25/source/blender/render/intern/source/object.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object.c      
2010-03-24 10:56:37 UTC (rev 27712)
+++ branches/render25/source/blender/render/intern/source/object.c      
2010-03-24 11:33:39 UTC (rev 27713)
@@ -204,6 +204,8 @@
                        MEM_freeN(vertnodes[a].winspeed);
                if(vertnodes[a].strandco)
                        MEM_freeN(vertnodes[a].strandco);
+               if(vertnodes[a].basenor)
+                       MEM_freeN(vertnodes[a].basenor);
        }
        
        MEM_freeN(vertnodes);

Modified: 
branches/render25/source/blender/render/intern/source/object_displace.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_displace.c     
2010-03-24 10:56:37 UTC (rev 27712)
+++ branches/render25/source/blender/render/intern/source/object_displace.c     
2010-03-24 11:33:39 UTC (rev 27713)
@@ -227,11 +227,14 @@
        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, (*diffnor)[3]= 
NULL;
        int i;
 
        sample= MEM_callocN(sizeof(float)*obr->totvert, "render_object_displace 
sample");
 
+       /* calculate difference between base smooth and new smooth normals */
+       render_object_calc_vnormals(re, obr, 0, 0, &diffnor);
+
        /* Object Size with parenting */
        obt=obr->ob;
        while(obt){
@@ -253,7 +256,7 @@
 
        MEM_freeN(sample);
        
-       /* Recalc vertex normals */
-       render_object_calc_vnormals(re, obr, 0, 0);
+       /* recalculate displaced smooth normals, and apply difference */
+       render_object_calc_vnormals(re, obr, 0, 0, &diffnor);
 }
 

Modified: branches/render25/source/blender/render/intern/source/object_mesh.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_mesh.c 
2010-03-24 10:56:37 UTC (rev 27712)
+++ branches/render25/source/blender/render/intern/source/object_mesh.c 
2010-03-24 11:33:39 UTC (rev 27713)
@@ -219,6 +219,21 @@
        return winspeed + ver->index*RE_WINSPEED_ELEMS;
 }
 
+float *render_vert_get_basenor(ObjectRen *obr, VertRen *ver, int verify)
+{
+       float *basenor;
+       int nr= ver->index>>8;
+       
+       basenor= obr->vertnodes[nr].basenor;
+       if(basenor==NULL) {
+               if(verify) 
+                       basenor= obr->vertnodes[nr].basenor= 
MEM_callocN(256*RE_BASENOR_ELEMS*sizeof(float), "basenor table");
+               else
+                       return NULL;
+       }
+       return basenor + (ver->index & 255)*RE_BASENOR_ELEMS;
+}
+
 VertRen *render_object_vert_copy(ObjectRen *obrn, ObjectRen *obr, VertRen *ver)
 {
        VertRen *vern= render_object_vert_get(obrn, obrn->totvert++);
@@ -253,6 +268,12 @@
                fp2= render_vert_get_strandco(obrn, vern, 1);
                memcpy(fp2, fp1, RE_STRANDCO_ELEMS*sizeof(float));
        }
+       fp1= render_vert_get_basenor(obr, ver, 0);
+       if(fp1) {
+               fp2= render_vert_get_basenor(obrn, vern, 1);
+               memcpy(fp2, fp1, RE_BASENOR_ELEMS*sizeof(float));
+       }
+
        return vern;
 }
 
@@ -797,10 +818,11 @@
 }
 
 
-void render_object_calc_vnormals(Render *re, ObjectRen *obr, int do_tangent, 
int do_nmap_tangent)
+void render_object_calc_vnormals(Render *re, ObjectRen *obr, int do_tangent, 
int do_nmap_tangent, float (**dispnor)[3])
 {
        MemArena *arena= NULL;
        VertexTangent **vtangents= NULL;
+       float (*backupnor)[3]= NULL, (*diffnor)[3]= NULL;
        int a;
 
        if(do_nmap_tangent) {
@@ -810,9 +832,19 @@
                vtangents= MEM_callocN(sizeof(VertexTangent*)*obr->totvert, 
"VertexTangent");
        }
 
+       /* for displacement, we compute difference between smooth base & 
subdivded nor,
+          and then add that difference to the displaced normal to keep it 
smooth */
+       if(dispnor) {
+               if(*dispnor)
+                       diffnor= *dispnor;
+               else
+                       *dispnor= backupnor= 
MEM_callocN(sizeof(float)*3*obr->totvert, "backupnor");
+       }
+
                /* clear all vertex normals */
        for(a=0; a<obr->totvert; a++) {
                VertRen *ver= render_object_vert_get(obr, a);
+               if(backupnor) copy_v3_v3(backupnor[a], ver->n);
                ver->n[0]=ver->n[1]=ver->n[2]= 0.0f;
        }
 
@@ -945,9 +977,20 @@
                                normalize_v3(tav);
                        }
                }
+
+               if(backupnor) {
+                       float tmp[3];
+                       
+                       copy_v3_v3(tmp, backupnor[a]);
+                       sub_v3_v3(backupnor[a], ver->n);
+                       copy_v3_v3(ver->n, tmp);
+               }
+               else if(diffnor)
+                       add_v3_v3(ver->n, diffnor[a]);
        }
 
-
+       if(diffnor)
+               MEM_freeN(diffnor);
        if(arena)
                BLI_memarena_free(arena);
        if(vtangents)
@@ -1558,7 +1601,7 @@
                }
 
                /* Normals */
-               render_object_calc_vnormals(re, obr, 0, 0);
+               render_object_calc_vnormals(re, obr, 0, 0, NULL);
        }
 
 }
@@ -2253,7 +2296,7 @@
        
        if(!timeoffset) {
                if (!(ob->flag & OB_RENDER_SUBDIVIDE) && 
render_object_has_displacement(re, obr) ) {
-                       render_object_calc_vnormals(re, obr, 0, 0);
+                       render_object_calc_vnormals(re, obr, 0, 0, NULL);
                        if(do_autosmooth)
                                render_object_displace(re, obr, mat, nmat);
                        else
@@ -2264,7 +2307,7 @@
                        autosmooth(re, obr, mat, me->smoothresh);
                }
 
-               render_object_calc_vnormals(re, obr, need_tangent, 
need_nmap_tangent);
+               render_object_calc_vnormals(re, obr, need_tangent, 
need_nmap_tangent, NULL);
 
                if(need_stress)
                        calc_edge_stress(re, obr, me);

Modified: 
branches/render25/source/blender/render/intern/source/object_particle.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_particle.c     
2010-03-24 10:56:37 UTC (rev 27712)
+++ branches/render25/source/blender/render/intern/source/object_particle.c     
2010-03-24 11:33:39 UTC (rev 27713)
@@ -1138,6 +1138,6 @@
        }
 
        if(path_nbr && (ma->mode_l & MA_TANGENT_STR)==0)
-               render_object_calc_vnormals(re, obr, 0, 0);
+               render_object_calc_vnormals(re, obr, 0, 0, NULL);
 }
 


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

Reply via email to