Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2007-12-04 20:53:03 +0300
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2007-12-04 20:53:03 +0300
commitd3bd96ba6c8ab403ff7587d811cca7dd85e8c6a8 (patch)
treed59f9e902f960a2586b65394a2928c4419eaa964 /source/blender/render
parent09b9a1e3f7643f2e00d926745e96ee0752f60cdd (diff)
Strand render bugfixes:
- Fix compile error. - Some changes to bucketing. - Tweak acceleration button increase size.
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/intern/source/strand.c74
1 files changed, 50 insertions, 24 deletions
diff --git a/source/blender/render/intern/source/strand.c b/source/blender/render/intern/source/strand.c
index 413663da4ca..0c1590c216b 100644
--- a/source/blender/render/intern/source/strand.c
+++ b/source/blender/render/intern/source/strand.c
@@ -203,11 +203,15 @@ void project_hoco_to_bucket(RenderBuckets *buckets, float *hoco, float *bucketco
}
typedef struct RenderPrimitiveIterator {
+ Render *re;
RenderBuckets *buckets;
ListBase *list[6];
int listindex, totlist;
BucketPrims *bpr;
int bprindex;
+
+ StrandRen *strand;
+ int index, tot;
} RenderPrimitiveIterator;
RenderPrimitiveIterator *init_primitive_iterator(Render *re, RenderBuckets *buckets, RenderPart *pa)
@@ -216,39 +220,61 @@ RenderPrimitiveIterator *init_primitive_iterator(Render *re, RenderBuckets *buck
int nr, x, y, width;
iter= MEM_callocN(sizeof(RenderPrimitiveIterator), "RenderPrimitiveIterator");
- iter->buckets= buckets;
-
- nr= BLI_findindex(&re->parts, pa);
- width= buckets->x - 1;
- x= (nr % width) + 1;
- y= (nr / width) + 1;
-
- iter->list[iter->totlist++]= &buckets->all;
- iter->list[iter->totlist++]= &buckets->inside[y*buckets->x + x];
- iter->list[iter->totlist++]= &buckets->overlap[y*buckets->x + x];
- iter->list[iter->totlist++]= &buckets->overlap[y*buckets->x + (x-1)];
- iter->list[iter->totlist++]= &buckets->overlap[(y-1)*buckets->x + (x-1)];
- iter->list[iter->totlist++]= &buckets->overlap[(y-1)*buckets->x + x];
+ iter->re= re;
+
+ if(buckets) {
+ iter->buckets= buckets;
+
+ nr= BLI_findindex(&re->parts, pa);
+ width= buckets->x - 1;
+ x= (nr % width) + 1;
+ y= (nr / width) + 1;
+
+ iter->list[iter->totlist++]= &buckets->all;
+ iter->list[iter->totlist++]= &buckets->inside[y*buckets->x + x];
+ iter->list[iter->totlist++]= &buckets->overlap[y*buckets->x + x];
+ iter->list[iter->totlist++]= &buckets->overlap[y*buckets->x + (x-1)];
+ iter->list[iter->totlist++]= &buckets->overlap[(y-1)*buckets->x + (x-1)];
+ iter->list[iter->totlist++]= &buckets->overlap[(y-1)*buckets->x + x];
+ }
+ else {
+ iter->index= 0;
+ iter->tot= re->totstrand;
+ }
return iter;
}
void *next_primitive_iterator(RenderPrimitiveIterator *iter)
{
- if(iter->bpr && iter->bprindex >= iter->bpr->totprim) {
- iter->bpr= iter->bpr->next;
- iter->bprindex= 0;
- }
+ if(iter->buckets) {
+ if(iter->bpr && iter->bprindex >= iter->bpr->totprim) {
+ iter->bpr= iter->bpr->next;
+ iter->bprindex= 0;
+ }
- while(iter->bpr == NULL) {
- if(iter->listindex == iter->totlist)
- return NULL;
+ while(iter->bpr == NULL) {
+ if(iter->listindex == iter->totlist)
+ return NULL;
+
+ iter->bpr= iter->list[iter->listindex++]->first;
+ iter->bprindex= 0;
+ }
- iter->bpr= iter->list[iter->listindex++]->first;
- iter->bprindex= 0;
+ return iter->bpr->prim[iter->bprindex++];
}
+ else {
+ if(iter->index < iter->tot) {
+ if((iter->index & 255)==0)
+ iter->strand= iter->re->strandnodes[iter->index>>8].strand;
+ else
+ iter->strand++;
- return iter->bpr->prim[iter->bprindex++];
+ return iter->strand;
+ }
+ else
+ return NULL;
+ }
}
void free_primitive_iterator(RenderPrimitiveIterator *iter)
@@ -611,7 +637,7 @@ void strand_shade_point(Render *re, ShadeSample *ssamp, StrandSegment *sseg, Str
memset(&vlr, 0, sizeof(vlr));
vlr.flag= R_SMOOTH|R_VISIBLE;
vlr.lay= sseg->strand->buffer->lay;
- vlr.ob= sseg->strand->ob;
+ vlr.ob= sseg->strand->buffer->ob;
if(sseg->buffer->ma->mode & MA_TANGENT_STR)
vlr.flag |= R_TANGENT;
shi->vlr= &vlr;