Revision: 28092
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28092
Author:   blendix
Date:     2010-04-08 14:21:31 +0200 (Thu, 08 Apr 2010)

Log Message:
-----------
Render Branch: Fix displacement mapped surfaces not supporting speed vectors 
yet,
and optimization so displacement does not evaluate e.g. color or bump textures.

Modified Paths:
--------------
    branches/render25/source/blender/render/intern/include/object_mesh.h
    branches/render25/source/blender/render/intern/include/texture_stack.h
    branches/render25/source/blender/render/intern/source/material.c
    branches/render25/source/blender/render/intern/source/object_mesh.c
    branches/render25/source/blender/render/intern/source/object_subdivide.c
    branches/render25/source/blender/render/intern/source/texture_stack.c

Modified: branches/render25/source/blender/render/intern/include/object_mesh.h
===================================================================
--- branches/render25/source/blender/render/intern/include/object_mesh.h        
2010-04-08 11:57:23 UTC (rev 28091)
+++ branches/render25/source/blender/render/intern/include/object_mesh.h        
2010-04-08 12:21:31 UTC (rev 28092)
@@ -43,7 +43,7 @@
 struct VertRen *render_object_vert_copy(struct ObjectRen *obrn, struct 
ObjectRen *obr, struct VertRen *ver);
 struct VlakRen *render_object_vlak_copy(struct ObjectRen *obrn, struct 
ObjectRen *obr, struct VlakRen *vlr);
 
-struct VertRen *render_object_vert_interp(struct ObjectRen *obrn, struct 
ObjectRen *obr, struct VertRen **v, float *w, int totv);
+struct VertRen *render_object_vert_interp(struct ObjectInstanceRen *obin, 
struct ObjectInstanceRen *obi, struct VertRen **v, float *w, int totv);
 struct VlakRen *render_object_vlak_interp(struct ObjectRen *obrn, struct 
ObjectRen *obr, struct VlakRen *vlr, float w[4][4]);
 
 /* Vertex Texture Coordinates */

Modified: branches/render25/source/blender/render/intern/include/texture_stack.h
===================================================================
--- branches/render25/source/blender/render/intern/include/texture_stack.h      
2010-04-08 11:57:23 UTC (rev 28091)
+++ branches/render25/source/blender/render/intern/include/texture_stack.h      
2010-04-08 12:21:31 UTC (rev 28092)
@@ -39,7 +39,8 @@
 
 /* Texture Stacks */
 
-void do_material_tex(struct Render *re, struct ShadeInput *shi);
+void do_material_tex(struct Render *re, struct ShadeInput *shi,
+       int mapto_flag);
 void do_lamp_tex(struct Render *re, struct LampRen *la, float *lavec,
        struct ShadeInput *shi, float *colf, int effect);
 void do_sky_tex(struct Render *re, float *rco, float *lo, float *dxyview,

Modified: branches/render25/source/blender/render/intern/source/material.c
===================================================================
--- branches/render25/source/blender/render/intern/source/material.c    
2010-04-08 11:57:23 UTC (rev 28091)
+++ branches/render25/source/blender/render/intern/source/material.c    
2010-04-08 12:21:31 UTC (rev 28092)
@@ -560,7 +560,7 @@
 void mat_displacement(Render *re, ShadeInput *shi, float displacement[3])
 {
        zero_v3(shi->texture.displace);
-       do_material_tex(re, shi);
+       do_material_tex(re, shi, MAP_DISPLACE);
        copy_v3_v3(displacement, shi->texture.displace);
 }
 
@@ -580,7 +580,7 @@
        }
 
        if(do_textures && ma->texco)
-               do_material_tex(re, shi);
+               do_material_tex(re, shi, 0);
 
        if(!(ma->mode & MA_SHLESS)) {
                if(ma->fresnel_tra!=0.0f) 

Modified: branches/render25/source/blender/render/intern/source/object_mesh.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_mesh.c 
2010-04-08 11:57:23 UTC (rev 28091)
+++ branches/render25/source/blender/render/intern/source/object_mesh.c 
2010-04-08 12:21:31 UTC (rev 28092)
@@ -204,19 +204,36 @@
 /* also winspeed is exception, it is stored per instance */
 float *render_vert_get_winspeed(ObjectInstanceRen *obi, VertRen *ver, int 
verify)
 {
+       ObjectRen *obr= obi->obr;
        float *winspeed;
-       int totvector;
-       
-       winspeed= obi->vectors;
-       if(winspeed==NULL) {
-               if(verify) {
-                       totvector= obi->obr->totvert + obi->obr->totstrand;
-                       winspeed= obi->vectors= 
MEM_callocN(totvector*RE_WINSPEED_ELEMS*sizeof(float), "winspeed table");
+
+       if(obr->flag & R_TEMP_COPY) {
+               int nr= ver->index>>8;
+               
+               winspeed= obr->vertnodes[nr].winspeed;
+               if(winspeed==NULL) {
+                       if(verify) 
+                               winspeed= obr->vertnodes[nr].winspeed= 
MEM_callocN(256*RE_WINSPEED_ELEMS*sizeof(float), "winspeed table");
+                       else
+                               return NULL;
                }
-               else
-                       return NULL;
+               return winspeed + (ver->index & 255)*RE_WINSPEED_ELEMS;
        }
-       return winspeed + ver->index*RE_WINSPEED_ELEMS;
+       else {
+               int totvector;
+
+               winspeed= obi->vectors;
+               if(winspeed==NULL) {
+                       if(verify) {
+                               totvector= obi->obr->totvert + 
obi->obr->totstrand;
+                               winspeed= obi->vectors= 
MEM_callocN(totvector*RE_WINSPEED_ELEMS*sizeof(float), "winspeed table");
+                       }
+                       else
+                               return NULL;
+               }
+
+               return winspeed + ver->index*RE_WINSPEED_ELEMS;
+       }
 }
 
 float *render_vert_get_basenor(ObjectRen *obr, VertRen *ver, int verify)
@@ -297,8 +314,10 @@
        return vern;
 }
 
-VertRen *render_object_vert_interp(ObjectRen *obrn, ObjectRen *obr, VertRen 
**varray, float *warray, int totv)
+VertRen *render_object_vert_interp(ObjectInstanceRen *obin, ObjectInstanceRen 
*obi, VertRen **varray, float *warray, int totv)
 {
+       ObjectRen *obrn= obin->obr;
+       ObjectRen *obr= obi->obr;
        VertRen *ver= render_object_vert_get(obrn, obrn->totvert++);
        int a;
 
@@ -341,6 +360,11 @@
                        madd_v3_v3fl(ver->n, from, w);
                else
                        madd_v3_v3fl(ver->n, v->n, w);
+
+               if((from=render_vert_get_winspeed(obi, v, 0))) {
+                       to= render_vert_get_winspeed(obin, ver, 1);
+                       madd_v4_v4fl(to, from, w);
+               }
        }
 
        normalize_v3(ver->n);

Modified: 
branches/render25/source/blender/render/intern/source/object_subdivide.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_subdivide.c    
2010-04-08 11:57:23 UTC (rev 28091)
+++ branches/render25/source/blender/render/intern/source/object_subdivide.c    
2010-04-08 12:21:31 UTC (rev 28092)
@@ -68,8 +68,8 @@
        obin= MEM_callocN(sizeof(ObjectInstanceRen), "ObjectInstanceRen");
        memcpy(obin, obi, sizeof(ObjectInstanceRen));
        obin->next= obin->prev= NULL;
-       obin->vectors= NULL; // ...
-       obin->raytree= NULL; // ...
+       obin->vectors= NULL;
+       obin->raytree= NULL;
 
        return obin;
 }
@@ -211,8 +211,10 @@
        vertex_weight(w, M, u, v, vi);
 }
 
-static void render_face_subdivide(Render *re, RenderCamera *cam, float 
winmat[4][4], float bounds[4], ObjectRen *obrn, ObjectRen *obr, VlakRen *vlr, 
int quad, int depth, float M[4][4], float displacebound, float subdivision_rate)
+static void render_face_subdivide(Render *re, RenderCamera *cam, float 
winmat[4][4], float bounds[4], ObjectInstanceRen *obin, ObjectInstanceRen *obi, 
VlakRen *vlr, int quad, int depth, float M[4][4], float displacebound, float 
subdivision_rate)
 {
+       ObjectRen *obrn= obin->obr;
+       ObjectRen *obr= obi->obr;
        VertRen *s1, *s2, *s3;
        float w[4], pM[4][4], fw[4][4];
        int i, j, vi[4], offset, res, split;
@@ -259,7 +261,7 @@
                        }
 
                        if(!render_vlak_clip(obr, vlr, sM, winmat, bounds, 
displacebound, quad))
-                               render_face_subdivide(re, cam, winmat, bounds, 
obrn, obr, vlr, quad, depth+1, sM, displacebound, subdivision_rate);
+                               render_face_subdivide(re, cam, winmat, bounds, 
obin, obi, vlr, quad, depth+1, sM, displacebound, subdivision_rate);
                }
        }
        else {
@@ -267,7 +269,7 @@
                        for(i=0; i<=j; i++) {
                                face_vertex_weight(w, pM, i, j, res, vi);
 
-                               render_object_vert_interp(obrn, obr, &vlr->v1, 
w, (vlr->v4)? 4: 3);
+                               render_object_vert_interp(obin, obi, &vlr->v1, 
w, (vlr->v4)? 4: 3);
 
                                if(i > 0 && j > 0) {
                                        s1= render_object_vert_get(obrn, 
offset-j-1);
@@ -299,25 +301,25 @@
        }
 }
 
-static ObjectRen *render_object_tile_subdivide(Render *re, ObjectRen *obr, 
RenderCamera *cam, float winmat[4][4], float bounds[4])
+static ObjectRen *render_object_tile_subdivide(Render *re, ObjectInstanceRen 
*obin, ObjectInstanceRen *obi, RenderCamera *cam, float winmat[4][4], float 
bounds[4])
 {
-       ObjectRen *obrn;
+       ObjectRen *obrn, *obr= obi->obr;
        VlakRen *vlr;
        int a;
        float displacebound= obr->ob->displacebound;
        float subdivision_rate= 
re->params.r.subdivision_rate*obr->ob->subdivision_rate;
 
-       obrn= render_object_temp_copy(obr);
+       obin->obr= obrn= render_object_temp_copy(obr);
 
        /* copy subdivided faces */
        for(a=0; a<obr->totvlak; a++) {
                vlr= render_object_vlak_get(obr, a);
 
                if(!render_vlak_clip(obr, vlr, NULL, winmat, bounds, 
displacebound, 0))
-                       render_face_subdivide(re, cam, winmat, bounds, obrn, 
obr, vlr, 0, 0, NULL, displacebound, subdivision_rate);
+                       render_face_subdivide(re, cam, winmat, bounds, obin, 
obi, vlr, 0, 0, NULL, displacebound, subdivision_rate);
 
                if(vlr->v4 && !render_vlak_clip(obr, vlr, NULL, winmat, bounds, 
displacebound, 1))
-                       render_face_subdivide(re, cam, winmat, bounds, obrn, 
obr, vlr, 1, 0, NULL, displacebound, subdivision_rate);
+                       render_face_subdivide(re, cam, winmat, bounds, obin, 
obi, vlr, 1, 0, NULL, displacebound, subdivision_rate);
 
                if(re->cb.test_break(re->cb.tbh))
                        break;
@@ -326,11 +328,11 @@
        return obrn;
 }
 
-static ObjectRen *render_instance_tile_subdivide(Render *re, ObjectInstanceRen 
*obi, float winmat[4][4], float bounds[4], int thread)
+static ObjectRen *render_instance_tile_subdivide(Render *re, ObjectInstanceRen 
*obin, ObjectInstanceRen *obi, float winmat[4][4], float bounds[4], int thread)
 {
        ObjectRen *obrn;
 
-       obrn= render_object_tile_subdivide(re, obi->obr, &re->cam, winmat, 
bounds);
+       obrn= render_object_tile_subdivide(re, obin, obi, &re->cam, winmat, 
bounds);
        if(!re->cb.test_break(re->cb.tbh))
                finalize_render_object(re, obrn, 0, thread);
 
@@ -371,8 +373,7 @@
 
                obin= render_instance_temp_copy(obi);
 
-               obrn= render_instance_tile_subdivide(re, obi, winmat, bounds, 
pa->thread);
-               obin->obr= obrn;
+               obrn= render_instance_tile_subdivide(re, obin, obi, winmat, 
bounds, pa->thread);
 
                BLI_ghash_insert(pa->subdivhash, obi, obin);
        }

Modified: branches/render25/source/blender/render/intern/source/texture_stack.c
===================================================================
--- branches/render25/source/blender/render/intern/source/texture_stack.c       
2010-04-08 11:57:23 UTC (rev 28091)
+++ branches/render25/source/blender/render/intern/source/texture_stack.c       
2010-04-08 12:21:31 UTC (rev 28092)
@@ -766,7 +766,7 @@
        }
 }
 
-void do_material_tex(Render *re, ShadeInput *shi)
+void do_material_tex(Render *re, ShadeInput *shi, int mapto_flag)
 {
        MTex *mtex;
        Tex *tex;
@@ -776,7 +776,7 @@
        float texvec[3], dxt[3], dyt[3], tempvec[3], norvec[3], 
warpvec[3]={0.0f, 0.0f, 0.0f}, Tnor=1.0;
        int tex_nr, rgbnor= 0, warpdone=0;
        float nu[3] = {0,0,0}, nv[3] = {0,0,0}, nn[3] = {0,0,0}, dudnu = 1.f, 
dudnv = 0.f, dvdnu = 0.f, dvdnv = 1.f; // bump mapping
-       int nunvdone= 0;
+       int nunvdone= 0, mapto;
 
        if (re->params.r.scemode & R_NO_TEX) return;
        /* here: test flag if there's a tex (todo) */
@@ -792,6 +792,11 @@
                        tex= mtex->tex;
                        if(tex==0) continue;
 
+                       /* only process if this texture is mapped 
+                        * to one that we're interested in */

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