Strand render shadow now only renders lines for shadow instead
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Mon, 14 Jan 2008 10:00:20 +0000 (10:00 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Mon, 14 Jan 2008 10:00:20 +0000 (10:00 +0000)
of polygons, to avoid shadow flicker between frames.

Added some code that makes it possible to generate APixbuf's
from strands.

source/blender/render/intern/include/strand.h
source/blender/render/intern/source/strand.c
source/blender/render/intern/source/zbuf.c

index f2f1c2763c0863bc58f313c0db55c128142d79db..f1c0b6d1e3a521251af2a5f1481a22e68a690fc5 100644 (file)
@@ -86,7 +86,7 @@ typedef struct StrandSegment {
 } StrandSegment;
 
 void strand_eval_point(StrandSegment *sseg, StrandPoint *spoint);
-void render_strand_segment(struct Render *re, float winmat[][4], struct StrandPart *spart, struct ZSpan *zspan, StrandSegment *sseg);
+void render_strand_segment(struct Render *re, float winmat[][4], struct StrandPart *spart, struct ZSpan *zspan, int totzspan, StrandSegment *sseg);
 void project_strands(Render *re, void (*projectfunc)(float *, float mat[][4], float *),  int do_pano, int do_buckets);
 
 struct RenderBuckets *init_buckets(struct Render *re);
index 3930a35dc68124e3adc08881a7e949b950e8f681..3ad9bb665593ac2b2690323b0308102a97191ce3 100644 (file)
@@ -758,7 +758,7 @@ static void do_scanconvert_strand(Render *re, StrandPart *spart, ZSpan *zspan, f
        zspan_scanconvert_strand(zspan, spart, jco1, jco3, jco4, do_strand_blend);
 }
 
-static void strand_render(Render *re, float winmat[][4], StrandPart *spart, ZSpan *zspan, StrandPoint *p1, StrandPoint *p2)
+static void strand_render(Render *re, StrandSegment *sseg, float winmat[][4], StrandPart *spart, ZSpan *zspan, int totzspan, StrandPoint *p1, StrandPoint *p2)
 {
        if(spart) {
                float t= p2->t;
@@ -774,17 +774,27 @@ static void strand_render(Render *re, float winmat[][4], StrandPart *spart, ZSpa
        }
        else {
                float hoco1[4], hoco2[3];
-
-               projectvert(p1->co, winmat, hoco1);
-               projectvert(p2->co, winmat, hoco2);
-
-               /* render both strand and single pixel wire to counter aliasing */
-               zbufclip4(zspan, 0, 0, p1->hoco2, p1->hoco1, p2->hoco1, p2->hoco2, p1->clip2, p1->clip1, p2->clip1, p2->clip2);
-               zbufsinglewire(zspan, 0, 0, hoco1, hoco2);
+               int a, obi, index;
+  
+               obi= sseg->obi - re->objectinstance;
+               index= sseg->strand->index;
+
+               projectvert(p1->co, winmat, hoco1);
+               projectvert(p2->co, winmat, hoco2);
+  
+               for(a=0; a<totzspan; a++) {
+#if 0
+                       /* render both strand and single pixel wire to counter aliasing */
+                       zbufclip4(re, &zspan[a], obi, index, p1->hoco2, p1->hoco1, p2->hoco1, p2->hoco2, p1->clip2, p1->clip1, p2->clip1, p2->clip2);
+#endif
+                       /* only render a line for now, which makes the shadow map more
+                          similiar across frames, and so reduces flicker */
+                       zbufsinglewire(&zspan[a], obi, index, hoco1, hoco2);
+               }
        }
 }
-
-static int strand_segment_recursive(Render *re, float winmat[][4], StrandPart *spart, ZSpan *zspan, StrandSegment *sseg, StrandPoint *p1, StrandPoint *p2, int depth)
+  
+static int strand_segment_recursive(Render *re, float winmat[][4], StrandPart *spart, ZSpan *zspan, int totzspan, StrandSegment *sseg, StrandPoint *p1, StrandPoint *p2, int depth)
 {
        StrandPoint p;
        StrandBuffer *buffer= sseg->buffer;
@@ -817,21 +827,23 @@ static int strand_segment_recursive(Render *re, float winmat[][4], StrandPart *s
                do_strand_point_project(winmat, zspan, p.co2, p.hoco2, p.zco2);
        }
        else {
+#if 0
                projectvert(p.co1, winmat, p.hoco1);
                projectvert(p.co2, winmat, p.hoco2);
                p.clip1= testclip(p.hoco1);
                p.clip2= testclip(p.hoco2);
+#endif
        }
 
-       if(!strand_segment_recursive(re, winmat, spart, zspan, sseg, p1, &p, depth+1))
-               strand_render(re, winmat, spart, zspan, p1, &p);
-       if(!strand_segment_recursive(re, winmat, spart, zspan, sseg, &p, p2, depth+1))
-               strand_render(re, winmat, spart, zspan, &p, p2);
+       if(!strand_segment_recursive(re, winmat, spart, zspan, totzspan, sseg, p1, &p, depth+1))
+               strand_render(re, sseg, winmat, spart, zspan, totzspan, p1, &p);
+       if(!strand_segment_recursive(re, winmat, spart, zspan, totzspan, sseg, &p, p2, depth+1))
+               strand_render(re, sseg, winmat, spart, zspan, totzspan, &p, p2);
        
        return 1;
 }
 
-void render_strand_segment(Render *re, float winmat[][4], StrandPart *spart, ZSpan *zspan, StrandSegment *sseg)
+void render_strand_segment(Render *re, float winmat[][4], StrandPart *spart, ZSpan *zspan, int totzspan, StrandSegment *sseg)
 {
        StrandBuffer *buffer= sseg->buffer;
        StrandPoint *p1= &sseg->point1;
@@ -852,6 +864,7 @@ void render_strand_segment(Render *re, float winmat[][4], StrandPart *spart, ZSp
                do_strand_point_project(winmat, zspan, p2->co2, p2->hoco2, p2->zco2);
        }
        else {
+#if 0
                projectvert(p1->co1, winmat, p1->hoco1);
                projectvert(p1->co2, winmat, p1->hoco2);
                projectvert(p2->co1, winmat, p2->hoco1);
@@ -860,10 +873,11 @@ void render_strand_segment(Render *re, float winmat[][4], StrandPart *spart, ZSp
                p1->clip2= testclip(p1->hoco2);
                p2->clip1= testclip(p2->hoco1);
                p2->clip2= testclip(p2->hoco2);
+#endif
        }
 
-       if(!strand_segment_recursive(re, winmat, spart, zspan, sseg, p1, p2, 0))
-               strand_render(re, winmat, spart, zspan, p1, p2);
+       if(!strand_segment_recursive(re, winmat, spart, zspan, totzspan, sseg, p1, p2, 0))
+               strand_render(re, sseg, winmat, spart, zspan, totzspan, p1, p2);
 }
 
 static void zbuffer_strands_filter(Render *re, RenderPart *pa, RenderLayer *rl, StrandPart *spart, float *pass)
@@ -1128,7 +1142,7 @@ unsigned short *zbuffer_strands_shade(Render *re, RenderPart *pa, RenderLayer *r
 
                        spart.segment= &sseg;
 
-                       render_strand_segment(re, winmat, &spart, &zspan, &sseg);
+                       render_strand_segment(re, winmat, &spart, &zspan, 1, &sseg);
                }
        }
 
index b808b76b78633462332618c899902bc2e3c867f6..98a19c8c0e039352b9cd0e4374f5ee40389e1516 100644 (file)
@@ -2354,7 +2354,7 @@ void zbuffer_shadow(Render *re, float winmat[][4], LampRen *lar, int *rectz, int
                                        c4= zbuf_shadow_project(cache, sseg.v[3]-strand->vert, obwinmat, sseg.v[3]->co, ho4);
 
                                        if(!(c1 & c2 & c3 & c4))
-                                               render_strand_segment(NULL, winmat, NULL, &zspan, &sseg);
+                                               render_strand_segment(re, winmat, NULL, &zspan, 1, &sseg);
                                }
                        }