[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13665] trunk/blender/source/blender/ render/intern/source/occlusion.c:
Brecht Van Lommel
brechtvanlommel at pandora.be
Wed Feb 13 11:44:12 CET 2008
Revision: 13665
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13665
Author: blendix
Date: 2008-02-13 11:44:12 +0100 (Wed, 13 Feb 2008)
Log Message:
-----------
Bugfix: approximate AO with pixel cache & osa now should have fewer
black pixels.
Modified Paths:
--------------
trunk/blender/source/blender/render/intern/source/occlusion.c
Modified: trunk/blender/source/blender/render/intern/source/occlusion.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/occlusion.c 2008-02-13 06:43:31 UTC (rev 13664)
+++ trunk/blender/source/blender/render/intern/source/occlusion.c 2008-02-13 10:44:12 UTC (rev 13665)
@@ -1671,7 +1671,8 @@
OcclusionCacheSample *sample;
OccFace exclude;
ShadeInput *shi;
- int *ro, *rp, *rz, onlyshadow;
+ long *rd=NULL;
+ int *ro=NULL, *rp=NULL, *rz=NULL, onlyshadow;
int x, y, step = CACHE_STEP;
if(!tree->cache)
@@ -1686,45 +1687,60 @@
cache->sample= MEM_callocN(sizeof(OcclusionCacheSample)*cache->w*cache->h, "OcclusionCacheSample");
sample= cache->sample;
- ps.next= NULL;
- ps.mask= (1<<re->osa);
+ if(re->osa) {
+ rd= pa->rectdaps;
+ }
+ else {
+ /* fake pixel struct for non-osa */
+ ps.next= NULL;
+ ps.mask= 0xFFFF;
- ro= pa->recto;
- rp= pa->rectp;
- rz= pa->rectz;
+ ro= pa->recto;
+ rp= pa->rectp;
+ rz= pa->rectz;
+ }
/* compute a sample at every step pixels */
for(y=pa->disprect.ymin; y<pa->disprect.ymax; y++) {
- for(x=pa->disprect.xmin; x<pa->disprect.xmax; x++, ro++, rp++, rz++, sample++) {
- if((((x - pa->disprect.xmin + step) % step) == 0 || x == pa->disprect.xmax-1) && (((y - pa->disprect.ymin + step) % step) == 0 || y == pa->disprect.ymax-1)) {
- if(*rp) {
- ps.obi= *ro;
- ps.facenr= *rp;
- ps.z= *rz;
+ for(x=pa->disprect.xmin; x<pa->disprect.xmax; x++, sample++, rd++, ro++, rp++, rz++) {
+ if(!(((x - pa->disprect.xmin + step) % step) == 0 || x == pa->disprect.xmax-1))
+ continue;
+ if(!(((y - pa->disprect.ymin + step) % step) == 0 || y == pa->disprect.ymax-1))
+ continue;
- shade_samples_fill_with_ps(ssamp, &ps, x, y);
- shi= ssamp->shi;
- if(!shi->vlr)
- continue;
+ if(re->osa) {
+ if(!*rd) continue;
- onlyshadow= (shi->mat->mode & MA_ONLYSHADOW);
- exclude.obi= shi->obi - re->objectinstance;
- exclude.facenr= shi->vlr->index;
- sample_occ_tree(re, tree, &exclude, shi->co, shi->vno, shi->thread, onlyshadow, shi->ao);
+ shade_samples_fill_with_ps(ssamp, (PixStr *)(*rd), x, y);
+ }
+ else {
+ if(!*rp) continue;
- VECCOPY(sample->co, shi->co);
- VECCOPY(sample->n, shi->vno);
- VECCOPY(sample->col, shi->ao);
- sample->intensity= MAX3(sample->col[0], sample->col[1], sample->col[2]);
- sample->dist2= INPR(shi->dxco, shi->dxco) + INPR(shi->dyco, shi->dyco);
- sample->x= shi->xs;
- sample->y= shi->ys;
- sample->filled= 1;
- }
+ ps.obi= *ro;
+ ps.facenr= *rp;
+ ps.z= *rz;
+ shade_samples_fill_with_ps(ssamp, &ps, x, y);
+ }
- if(re->test_break())
- break;
+ shi= ssamp->shi;
+ if(shi->vlr) {
+ onlyshadow= (shi->mat->mode & MA_ONLYSHADOW);
+ exclude.obi= shi->obi - re->objectinstance;
+ exclude.facenr= shi->vlr->index;
+ sample_occ_tree(re, tree, &exclude, shi->co, shi->vno, shi->thread, onlyshadow, shi->ao);
+
+ VECCOPY(sample->co, shi->co);
+ VECCOPY(sample->n, shi->vno);
+ VECCOPY(sample->col, shi->ao);
+ sample->intensity= MAX3(sample->col[0], sample->col[1], sample->col[2]);
+ sample->dist2= INPR(shi->dxco, shi->dxco) + INPR(shi->dyco, shi->dyco);
+ sample->x= shi->xs;
+ sample->y= shi->ys;
+ sample->filled= 1;
}
+
+ if(re->test_break())
+ break;
}
}
}
More information about the Bf-blender-cvs
mailing list