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