[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13368] trunk/blender/source/blender:

Chris Burt desoto at exenex.com
Wed Jan 23 14:53:41 CET 2008


I don't understand.. is this something that is required for some
renders and has been removed temporarily to tune blender for Peach
renders? Or is this just something that wasn't necessary to begin
with...

I feel like this might not be the first commit I've seen that is
somewhat "Peach specific". Is there any way these optimizations to the
renderer could negatively impact other artist's work or is this just a
technical detail that was overlooked in the past because nobody was
dealing with face counts this big?

--Chris

On Jan 23, 2008 8:35 AM, Brecht Van Lommel <brechtvanlommel at pandora.be> wrote:
> Revision: 13368
>           http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13368
> Author:   blendix
> Date:     2008-01-23 14:35:51 +0100 (Wed, 23 Jan 2008)
>
> Log Message:
> -----------
>
> Minor render memory usage optimization, removed layer and
> radface from VlakRen, saves about 100mb for 10 million faces.
>
> Modified Paths:
> --------------
>     trunk/blender/source/blender/radiosity/intern/source/radrender.c
>     trunk/blender/source/blender/render/intern/include/render_types.h
>     trunk/blender/source/blender/render/intern/include/renderdatabase.h
>     trunk/blender/source/blender/render/intern/source/convertblender.c
>     trunk/blender/source/blender/render/intern/source/envmap.c
>     trunk/blender/source/blender/render/intern/source/rayshade.c
>     trunk/blender/source/blender/render/intern/source/rendercore.c
>     trunk/blender/source/blender/render/intern/source/renderdatabase.c
>     trunk/blender/source/blender/render/intern/source/shadbuf.c
>     trunk/blender/source/blender/render/intern/source/shadeoutput.c
>     trunk/blender/source/blender/render/intern/source/strand.c
>     trunk/blender/source/blender/render/intern/source/zbuf.c
>
> Modified: trunk/blender/source/blender/radiosity/intern/source/radrender.c
> ===================================================================
> --- trunk/blender/source/blender/radiosity/intern/source/radrender.c    2008-01-23 13:24:44 UTC (rev 13367)
> +++ trunk/blender/source/blender/radiosity/intern/source/radrender.c    2008-01-23 13:35:51 UTC (rev 13368)
> @@ -84,22 +84,23 @@
>
>  /* find the face with maximum energy to become shooter */
>  /* nb: _rr means rad-render version of existing radio call */
> -static VlakRen *findshoot_rr(Render *re)
> +static void findshoot_rr(Render *re, VlakRen **shoot_p, RadFace **shootrf_p)
>  {
> -       RadFace *rf;
> +       RadFace *rf, *shootrf, **radface;
>         ObjectRen *obr;
>         VlakRen *vlr=NULL, *shoot;
>         float energy;
>         int a;
>
>         shoot= NULL;
> +       shootrf= NULL;
>         maxenergy= 0.0;
>
>         for(obr=re->objecttable.first; obr; obr=obr->next) {
>                 for(a=0; a<obr->totvlak; a++) {
>                         if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++;
> -                       if(vlr->radface) {
> -                               rf= vlr->radface;
> +                       if((radface=RE_vlakren_get_radface(obr, vlr, 0))) {
> +                               rf= *radface;
>                                 rf->flag &= ~RAD_SHOOT;
>
>                                 energy= rf->unshot[0]*rf->area;
> @@ -108,26 +109,31 @@
>
>                                 if(energy>maxenergy) {
>                                         shoot= vlr;
> +                                       shootrf= rf;
>                                         maxenergy= energy;
>                                 }
>                         }
>                 }
>         }
>
> -       if(shoot) {
> +       if(shootrf) {
>                 maxenergy/= RG.totenergy;
> -               if(maxenergy<RG.convergence) return NULL;
> -               shoot->radface->flag |= RAD_SHOOT;
> +               if(maxenergy<RG.convergence) {
> +                       *shoot_p= NULL;
> +                       *shootrf_p= NULL;
> +               }
> +               shootrf->flag |= RAD_SHOOT;
>         }
>
> -       return shoot;
> +       *shoot_p= shoot;
> +       *shootrf_p= shootrf;
>  }
>
> -static void backface_test_rr(Render *re, VlakRen *shoot)
> +static void backface_test_rr(Render *re, VlakRen *shoot, RadFace *shootrf)
>  {
>         ObjectRen *obr;
>         VlakRen *vlr=NULL;
> -       RadFace *rf;
> +       RadFace *rf, **radface;
>         float tvec[3];
>         int a;
>
> @@ -135,9 +141,9 @@
>         for(obr=re->objecttable.first; obr; obr=obr->next) {
>                 for(a=0; a<obr->totvlak; a++) {
>                         if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++;
> -                       if(vlr->radface && vlr!=shoot) {
> -                               rf= vlr->radface;
> -                               VecSubf(tvec, shoot->radface->cent, rf->cent);
> +                       if(vlr != shoot && (radface=RE_vlakren_get_radface(obr, vlr, 0))) {
> +                               rf= *radface;
> +                               VecSubf(tvec, shootrf->cent, rf->cent);
>
>                                 if(tvec[0]*rf->norm[0]+ tvec[1]*rf->norm[1]+ tvec[2]*rf->norm[2] < 0.0)
>                                         rf->flag |= RAD_BACKFACE;
> @@ -150,7 +156,7 @@
>  {
>         ObjectRen *obr;
>         VlakRen *vlr=NULL;
> -       RadFace *rf;
> +       RadFace *rf, **radface;
>         int a;
>
>         /* backface flag clear */
> @@ -158,8 +164,8 @@
>                 for(a=0; a<obr->totvlak; a++) {
>                         if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++;
>
> -                       if(vlr->radface) {
> -                               rf= vlr->radface;
> +                       if((radface=RE_vlakren_get_radface(obr, vlr, 0))) {
> +                               rf= *radface;
>                                 rf->flag &= ~RAD_BACKFACE;
>                         }
>                 }
> @@ -169,11 +175,11 @@
>  extern RadView hemitop, hemiside; // radfactors.c
>
>  /* hemi-zbuffering, delivers formfactors array */
> -static void makeformfactors_rr(Render *re, VlakRen *shoot)
> +static void makeformfactors_rr(Render *re, VlakRen *shoot, RadFace *shootrf)
>  {
>         ObjectRen *obr;
>         VlakRen *vlr=NULL;
> -       RadFace *rf;
> +       RadFace *rf, **radface;
>         float len, vec[3], up[3], side[3], tar[5][3], *fp;
>         int a;
>
> @@ -182,25 +188,25 @@
>         /* set up hemiview */
>         /* first: upvector for hemitop, we use diagonal hemicubes to prevent aliasing */
>
> -       VecSubf(vec, shoot->v1->co, shoot->radface->cent);
> -       Crossf(up, shoot->radface->norm, vec);
> +       VecSubf(vec, shoot->v1->co, shootrf->cent);
> +       Crossf(up, shootrf->norm, vec);
>         len= Normalize(up);
>
>         VECCOPY(hemitop.up, up);
> -       VECCOPY(hemiside.up, shoot->radface->norm);
> +       VECCOPY(hemiside.up, shootrf->norm);
>
> -       Crossf(side, shoot->radface->norm, up);
> +       Crossf(side, shootrf->norm, up);
>
>         /* five targets */
> -       VecAddf(tar[0], shoot->radface->cent, shoot->radface->norm);
> -       VecAddf(tar[1], shoot->radface->cent, up);
> -       VecSubf(tar[2], shoot->radface->cent, up);
> -       VecAddf(tar[3], shoot->radface->cent, side);
> -       VecSubf(tar[4], shoot->radface->cent, side);
> +       VecAddf(tar[0], shootrf->cent, shootrf->norm);
> +       VecAddf(tar[1], shootrf->cent, up);
> +       VecSubf(tar[2], shootrf->cent, up);
> +       VecAddf(tar[3], shootrf->cent, side);
> +       VecSubf(tar[4], shootrf->cent, side);
>
>         /* camera */
> -       VECCOPY(hemiside.cam, shoot->radface->cent);
> -       VECCOPY(hemitop.cam, shoot->radface->cent);
> +       VECCOPY(hemiside.cam, shootrf->cent);
> +       VECCOPY(hemitop.cam, shootrf->cent);
>
>         /* do it! */
>         VECCOPY(hemitop.tar, tar[0]);
> @@ -218,10 +224,10 @@
>                 for(a=0; a<obr->totvlak; a++) {
>                         if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++;
>
> -                       if(vlr->radface) {
> -                               rf= vlr->radface;
> +                       if((radface=RE_vlakren_get_radface(obr, vlr, 0))) {
> +                               rf= *radface;
>                                 if(*fp!=0.0 && rf->area!=0.0) {
> -                                       *fp *= shoot->radface->area/rf->area;
> +                                       *fp *= shootrf->area/rf->area;
>                                         if(*fp>1.0) *fp= 1.0001;
>                                 }
>                                 fp++;
> @@ -231,17 +237,17 @@
>  }
>
>  /* based at RG.formfactors array, distribute shoot energy over other faces */
> -static void applyformfactors_rr(Render *re, VlakRen *shoot)
> +static void applyformfactors_rr(Render *re, VlakRen *shoot, RadFace *shootrf)
>  {
>         ObjectRen *obr;
>         VlakRen *vlr=NULL;
> -       RadFace *rf;
> +       RadFace *rf, **radface;
>         float *fp, *ref, unr, ung, unb, r, g, b;
>         int a;
>
> -       unr= shoot->radface->unshot[0];
> -       ung= shoot->radface->unshot[1];
> -       unb= shoot->radface->unshot[2];
> +       unr= shootrf->unshot[0];
> +       ung= shootrf->unshot[1];
> +       unb= shootrf->unshot[2];
>
>         fp= RG.formfactors;
>
> @@ -249,8 +255,8 @@
>                 for(a=0; a<obr->totvlak; a++) {
>                         if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++;
>
> -                       if(vlr->radface) {
> -                               rf= vlr->radface;
> +                       if((radface=RE_vlakren_get_radface(obr, vlr, 0))) {
> +                               rf= *radface;
>                                 if(*fp!= 0.0) {
>
>                                         ref= &(vlr->mat->r);
> @@ -274,7 +280,7 @@
>                 }
>         }
>         /* shoot energy has been shot */
> -       shoot->radface->unshot[0]= shoot->radface->unshot[1]= shoot->radface->unshot[2]= 0.0;
> +       shootrf->unshot[0]= shootrf->unshot[1]= shootrf->unshot[2]= 0.0;
>  }
>
>
> @@ -282,29 +288,30 @@
>  static void progressiverad_rr(Render *re)
>  {
>         VlakRen *shoot;
> +       RadFace *shootrf;
>         float unshot[3];
>         int it= 0;
>
> -       shoot= findshoot_rr(re);
> +       findshoot_rr(re, &shoot, &shootrf);
>         while( shoot ) {
>
>                 /* backfaces receive no energy, but are zbuffered... */
> -               backface_test_rr(re, shoot);
> +               backface_test_rr(re, shoot, shootrf);
>
>                 /* ...unless it's two sided */
> -               if(shoot->radface->flag & RAD_TWOSIDED) {
> -                       VECCOPY(unshot, shoot->radface->unshot);
> -                       VecMulf(shoot->radface->norm, -1.0);
> -                       makeformfactors_rr(re, shoot);
> -                       applyformfactors_rr(re, shoot);
> -                       VecMulf(shoot->radface->norm, -1.0);
> -                       VECCOPY(shoot->radface->unshot, unshot);
> +               if(shootrf->flag & RAD_TWOSIDED) {
> +                       VECCOPY(unshot, shootrf->unshot);
> +                       VecMulf(shootrf->norm, -1.0);
> +                       makeformfactors_rr(re, shoot, shootrf);
> +                       applyformfactors_rr(re, shoot, shootrf);
> +                       VecMulf(shootrf->norm, -1.0);
> +                       VECCOPY(shootrf->unshot, unshot);
>                 }
>
>                 /* hemi-zbuffers */
> -               makeformfactors_rr(re, shoot);
> +               makeformfactors_rr(re, shoot, shootrf);
>                 /* based at RG.formfactors array, distribute shoot energy over other faces */
> -               applyformfactors_rr(re, shoot);
> +               applyformfactors_rr(re, shoot, shootrf);
>
>                 it++;
>                 re->timecursor(it);
> @@ -314,7 +321,7 @@
>                 if(re->test_break()) break;
>                 if(RG.maxiter && RG.maxiter<=it) break;
>
> -               shoot= findshoot_rr(re);
> +               findshoot_rr(re, &shoot, &shootrf);
>         }
>         printf(" Unshot energy:%f\n", 1000.0*maxenergy);
>
> @@ -327,7 +334,7 @@
>  {
>         ObjectRen *obr;
>         VlakRen *vlr= NULL;
> -       RadFace *rf;
> +       RadFace *rf, **radface;
>         int a, b;
>
>         /* globals */
> @@ -393,7 +400,8 @@
>         // uncommented; this isnt satisfying, but i leave it in the code for now (ton)
>         //                      if(vlr->mat->translucency!=0.0) rf->flag |= RAD_TWOSIDED;
>
> -                               vlr->radface= rf++;
> +                               radface=RE_vlakren_get_radface(obr, vlr, 1);
> +                               *radface= rf++;
>                         }
>                 }
>         }
> @@ -428,7 +436,7 @@
>         ObjectRen *obr;
>         VertRen *v1=NULL;
>         VlakRen *vlr=NULL;
> -       RadFace *rf;
> +       RadFace *rf, **radface;
>         float *col;
>         int a;
>
> @@ -440,8 +448,8 @@
>                 for(a=0; a<obr->totvlak; a++) {
>                         if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++;
>
> -                       if(vlr->radface) {
> -                               rf= vlr->radface;
> +                       if((radface=RE_vlakren_get_radface(obr, vlr, 0))) {
> +                               rf= *radface;
>
>                                 /* apply correction */
>                                 rf->totrad[0]= RG.radfactor*pow( rf->totrad[0], RG.igamma);
>
> Modified: trunk/blender/source/blender/render/intern/include/render_types.h
> ===================================================================
> --- trunk/blender/source/blender/render/intern/include/render_types.h   2008-01-23 13:24:44 UTC (rev 13367)
> +++ trunk/blender/source/blender/render/intern/include/render_types.h   2008-01-23 13:35:51 UTC (rev 13368)
> @@ -244,7 +244,7 @@
>         struct ObjectRen *next, *prev;
>         struct Object *ob, *par;
>         struct Scene *sce;
> -       int index, psysindex, flag;
> +       int index, psysindex, flag, lay;
>
>         int totvert, totvlak, totstrand, tothalo;
>         int vertnodeslen, vlaknodeslen, strandnodeslen, blohalen;
> @@ -309,12 +309,10 @@
>
>  typedef struct VlakRen {
>         struct VertRen *v1, *v2, *v3, *v4;      /* keep in order for ** addressing */
> -       unsigned int lay;
>         float n[3];
>         struct Material *mat;
>         char puno;
>         char flag, ec;
> -       RadFace *radface;
>         int index;
>  } VlakRen;
>
>
> Modified: trunk/blender/source/blender/render/intern/include/renderdatabase.h
> ===================================================================
> --- trunk/blender/source/blender/render/intern/include/renderdatabase.h 2008-01-23 13:24:44 UTC (rev 13367)
> +++ trunk/blender/source/blender/render/intern/include/renderdatabase.h 2008-01-23 13:35:51 UTC (rev 13368)
> @@ -42,6 +42,7 @@
>  struct StrandBuffer;
>  struct StrandRen;
>  struct ObjectInstanceRen;
> +struct RadFace;
>
>  #define RE_QUAD_MASK   0x7FFFFFF
>  #define RE_QUAD_OFFS   0x8000000
> @@ -63,6 +64,7 @@
>         struct MCol *mcol;
>         int totmtface, totmcol;
>         float *surfnor;
> +       struct RadFace **radface;
>  } VlakTableNode;
>
>  typedef struct StrandTableNode {
> @@ -94,7 +96,7 @@
>  struct HaloRen *RE_inithalo_particle(struct Render *re, struct ObjectRen *obr, struct DerivedMesh *dm, struct Material *ma,   float *vec,   float *vec1, float *orco, float *uvco, float hasize, float vectsize, int seed);
>  struct StrandBuffer *RE_addStrandBuffer(struct ObjectRen *obr, int totvert);
>
> -struct ObjectRen *RE_addRenderObject(struct Render *re, struct Object *ob, struct Object *par, int index, int psysindex);
> +struct ObjectRen *RE_addRenderObject(struct Render *re, struct Object *ob, struct Object *par, int index, int psysindex, int lay);
>
> @@ Diff output truncated at 10240 characters. @@
>
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>


More information about the Bf-committers mailing list