diff options
Diffstat (limited to 'source/blender/render')
4 files changed, 47 insertions, 44 deletions
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h index 1768b052b54..5ea1a8ee98c 100644 --- a/source/blender/render/intern/include/render_types.h +++ b/source/blender/render/intern/include/render_types.h @@ -198,6 +198,9 @@ struct Render ListBase *sss_points; struct Material *sss_mat; + /* Freestyle */ + struct Render* freestyle_render; + ListBase customdata_names; struct Object *excludeob; diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 1a387ad7466..9bf74d4d012 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -4427,6 +4427,8 @@ void RE_Database_Free(Render *re) free_occ(re); free_strand_surface(re); + if( re->freestyle_render ) RE_FreeRender(re->freestyle_render); + re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0; re->i.convertdone= 0; @@ -4874,6 +4876,13 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view) if((re->r.mode & R_SSS) && !re->test_break()) if(re->r.renderer==R_INTERN) make_sss_tree(re); + + /* Freestyle */ + if((re->r.mode & R_EDGE_FRS ) && !re->test_break()) + if(re->r.renderer==R_INTERN) { + FRS_prepare(re); + FRS_render_Blender(re); + } } if(re->test_break()) diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index ebaef19062e..673bea87d6c 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -1630,18 +1630,12 @@ static void do_render_3d(Render *re) else RE_Database_FromScene(re, re->scene, 1); - /* Freestyle */ - if( re->r.mode & R_EDGE_FRS ) { - FRS_prepare(re); - } - threaded_tile_processor(re); /* do left-over 3d post effects (flares) */ if(re->flag & R_HALO) if(!re->test_break()) add_halo_flare(re); - /* free all render verts etc */ RE_Database_Free(re); @@ -2198,36 +2192,6 @@ static void do_render_composite_fields_blur_3d(Render *re) re->display_draw(re->result, NULL); } -static void freestyleRender(Render *re) -{ - // init render result - RE_FreeRenderResult(re->result); - re->result = new_render_result(re, &re->disprect, 0, RR_USEMEM); - - // set camera - RE_SetCamera(re, re->scene->camera); - - // set up render database - if(render_scene_needs_vector(re)) - RE_Database_FromScene_Vectors(re, re->scene); - else - RE_Database_FromScene(re, re->scene, 1); - - // used to reobtain ogl context after RE_Database_FromScene call - re->display_clear(re->result); - - // Freestyle initialization - FRS_prepare(re); - - // run Freestyle - re->i.starttime = PIL_check_seconds_timer(); - FRS_render_GL(re); - re->i.lastframetime = PIL_check_seconds_timer()- re->i.starttime; - re->stats_draw(&re->i); - - RE_Database_Free(re); -} - #ifndef DISABLE_YAFRAY /* yafray: main yafray render/export call */ static void yafrayRender(Render *re) @@ -2269,7 +2233,7 @@ static void yafrayRender(Render *re) re->rectx= re->winx; re->recty= re->winy; - rres= new_render_result(re, &re->disprect, 0, RR_USEMEM); + rres = new_render_result(re, &re->disprect, 0, RR_USEMEM); merge_render_result(rres, re->result); RE_FreeRenderResult(re->result); @@ -2322,15 +2286,10 @@ static void do_render_all_options(Render *re) #ifndef DISABLE_YAFRAY if(re->r.renderer==R_YAFRAY) yafrayRender(re); - else if(re->r.renderer==R_FREESTYLE) - freestyleRender(re); else do_render_composite_fields_blur_3d(re); #else - if(re->r.renderer==R_FREESTYLE) - freestyleRender(re); - else - do_render_composite_fields_blur_3d(re); + do_render_composite_fields_blur_3d(re); #endif } @@ -2449,7 +2408,7 @@ static int is_rendering_allowed(Render *re) } /* renderer */ - if(!ELEM3(re->r.renderer, R_INTERN, R_YAFRAY, R_FREESTYLE)) { + if(!ELEM(re->r.renderer, R_INTERN, R_YAFRAY)) { re->error("Unknown render engine set"); return 0; } diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c index 1eb42bca569..7b810c142d6 100644 --- a/source/blender/render/intern/source/rendercore.c +++ b/source/blender/render/intern/source/rendercore.c @@ -901,6 +901,30 @@ static void addps(ListBase *lb, intptr_t *rd, int obi, int facenr, int z, int ma ps->shadfac= 0; } + + +static void freestyle_enhance_add(RenderPart *pa, float *rectf) +{ + int x, y; + float* freestyle; + + RenderLayer* rl= render_get_active_layer( R.freestyle_render, R.freestyle_render->result ); + if( rl->rectf == NULL) + return; + + + for( x = pa->disprect.xmin + pa->crop; x < pa->disprect.xmax - pa->crop; x++) { + for( y = pa->disprect.ymin + pa->crop; y < pa->disprect.ymax - pa->crop; y++) { + + freestyle = rl->rectf + 4 * (R.recty * x + y); + if( freestyle[3] > 0.0) + addAlphaOverFloat(rectf, freestyle); + rectf += 4; + + } + } +} + static void edge_enhance_add(RenderPart *pa, float *rectf, float *arect) { float addcol[4]; @@ -1219,6 +1243,10 @@ void zbufshadeDA_tile(RenderPart *pa) if(R.r.mode & R_EDGE) edge_enhance_add(pa, rl->rectf, edgerect); + if(rl->layflag & SCE_LAY_FRS) + if(R.r.mode & R_EDGE_FRS) + freestyle_enhance_add(pa, rl->rectf); + if(rl->passflag & SCE_PASS_VECTOR) reset_sky_speed(pa, rl); @@ -1383,6 +1411,10 @@ void zbufshade_tile(RenderPart *pa) edge_enhance_add(pa, rl->rectf, edgerect); } + if(rl->layflag & SCE_LAY_FRS) + if(R.r.mode & R_EDGE_FRS) + freestyle_enhance_add(pa, rl->rectf); + if(rl->passflag & SCE_PASS_VECTOR) reset_sky_speed(pa, rl); |