Revision: 28192
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28192
Author:   blendix
Date:     2010-04-14 18:07:54 +0200 (Wed, 14 Apr 2010)

Log Message:
-----------
Render Branch: Fix irregular shadow buffer + displacement crash.

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

Modified: branches/render25/source/blender/render/intern/include/object.h
===================================================================
--- branches/render25/source/blender/render/intern/include/object.h     
2010-04-14 15:50:56 UTC (rev 28191)
+++ branches/render25/source/blender/render/intern/include/object.h     
2010-04-14 16:07:54 UTC (rev 28192)
@@ -134,6 +134,8 @@
        struct RayObject *raytree;
        int transform_primitives;
 
+       struct ObjectInstanceRen *lowres;
+
 } ObjectInstanceRen;
 
 /* objectren->flag */

Modified: branches/render25/source/blender/render/intern/source/object.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object.c      
2010-04-14 15:50:56 UTC (rev 28191)
+++ branches/render25/source/blender/render/intern/source/object.c      
2010-04-14 16:07:54 UTC (rev 28192)
@@ -322,6 +322,7 @@
        obi->index= index;
        obi->psysindex= psysindex;
        obi->lay= lay;
+       obi->lowres= obi;
 
        if(mat) {
                copy_m4_m4(obi->mat, mat);
@@ -359,6 +360,7 @@
        obi= rdb->objectinstance;
        for(oldobi=rdb->instancetable.first; oldobi; oldobi=oldobi->next) {
                *obi= *oldobi;
+               obi->lowres= obi;
 
                if(obi->obr) {
                        obi->prev= obi->next= NULL;

Modified: branches/render25/source/blender/render/intern/source/shadowbuf.c
===================================================================
--- branches/render25/source/blender/render/intern/source/shadowbuf.c   
2010-04-14 15:50:56 UTC (rev 28191)
+++ branches/render25/source/blender/render/intern/source/shadowbuf.c   
2010-04-14 16:07:54 UTC (rev 28192)
@@ -2018,7 +2018,7 @@
 }
 
 /* main loop going over all faces and check in bsp overlaps, fill in shadfac 
values */
-static void isb_bsp_fillfaces(Render *re, LampRen *lar, ISBBranch *root)
+static void isb_bsp_fillfaces(Render *re, RenderPart *pa, LampRen *lar, 
ISBBranch *root)
 {
        ObjectInstanceRen *obi;
        ObjectRen *obr;
@@ -2323,7 +2323,7 @@
                                                        ps= ps->next;
                                                }
                                                if(ps && ps->facenr>0) {
-                                                       ObjectInstanceRen *obi= 
&re->db.objectinstance[ps->obi];
+                                                       ObjectInstanceRen *obi= 
part_get_instance(pa, &re->db.objectinstance[ps->obi]);
                                                        ObjectRen *obr= 
obi->obr;
                                                        VlakRen *vlr= 
render_object_vlak_get(obr, (ps->facenr-1) & RE_QUAD_MASK);
                                                        int quad= (ps->facenr) 
& RE_QUAD_OFFS;
@@ -2345,7 +2345,7 @@
                                rectp= pa->rectp + sindex;
                                recto= pa->recto + sindex;
                                if(*rectp>0) {
-                                       ObjectInstanceRen *obi= 
&re->db.objectinstance[*recto];
+                                       ObjectInstanceRen *obi= 
part_get_instance(pa, &re->db.objectinstance[*recto]);
                                        ObjectRen *obr= obi->obr;
                                        VlakRen *vlr= 
render_object_vlak_get(obr, (*rectp-1) & RE_QUAD_MASK);
                                        int quad= (*rectp) & RE_QUAD_OFFS;
@@ -2377,7 +2377,7 @@
                if(bsp_err==0) {
                        /* go over all faces and fill in shadow values */
                        
-                       isb_bsp_fillfaces(re, lar, &root);      /* shb->persmat 
should have been calculated */
+                       isb_bsp_fillfaces(re, pa, lar, &root);  /* shb->persmat 
should have been calculated */
                        
                        /* copy shadow samples to persistant buffer, reduce 
memory overhead */
                        if(re->params.osa) {
@@ -2520,7 +2520,7 @@
                                        int a;
                                        for(a=0; a<4; a++) {
                                                if(apn->p[a]) {
-                                                       ObjectInstanceRen *obi= 
&re->db.objectinstance[apn->obi[a]];
+                                                       ObjectInstanceRen *obi= 
part_get_instance(pa, &re->db.objectinstance[apn->obi[a]]);
                                                        ObjectRen *obr= 
obi->obr;
                                                        VlakRen *vlr= 
render_object_vlak_get(obr, (apn->p[a]-1) & RE_QUAD_MASK);
                                                        int quad= apn->p[a] & 
RE_QUAD_OFFS;
@@ -2582,7 +2582,7 @@
                        ISBShadfacA **isbsa;
                        
                        /* go over all faces and fill in shadow values */
-                       isb_bsp_fillfaces(re, lar, &root);      /* shb->persmat 
should have been calculated */
+                       isb_bsp_fillfaces(re, pa, lar, &root);  /* shb->persmat 
should have been calculated */
                        
                        /* copy shadow samples to persistant buffer, reduce 
memory overhead */
                        isbsa= isbdata->shadfaca= 
MEM_callocN(pa->rectx*pa->recty*sizeof(void *), "isb shadfacs");
@@ -2650,9 +2650,9 @@
                                                }
                                                else {
                                                        int sindex= 
y*isbdata->rectx + x;
-                                                       int obi= 
shi->primitive.obi - re->db.objectinstance;
+                                                       int obi= 
shi->primitive.obi->lowres - re->db.objectinstance;
                                                        ISBShadfacA *isbsa= 
*(isbdata->shadfaca + sindex);
-                                                       
+
                                                        while(isbsa) {
                                                                
if(isbsa->facenr==shi->primitive.facenr+1 && isbsa->obi==obi)
                                                                        return 
isbsa->shadfac>=1.0f?0.0f:1.0f - isbsa->shadfac;


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

Reply via email to