diff options
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/render/SConscript | 1 | ||||
-rw-r--r-- | source/blender/render/extern/include/RE_pipeline.h | 1 | ||||
-rw-r--r-- | source/blender/render/intern/include/render_types.h | 2 | ||||
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 90 | ||||
-rw-r--r-- | source/blender/render/intern/source/shadeinput.c | 5 | ||||
-rw-r--r-- | source/blender/render/intern/source/shadeoutput.c | 2 |
7 files changed, 97 insertions, 5 deletions
diff --git a/source/blender/render/CMakeLists.txt b/source/blender/render/CMakeLists.txt index a2d698b739e..617328b7530 100644 --- a/source/blender/render/CMakeLists.txt +++ b/source/blender/render/CMakeLists.txt @@ -37,6 +37,7 @@ set(INC ../../../intern/smoke/extern ../../../intern/mikktspace ../../../intern/guardedalloc + ../freestyle ) set(INC_SYS diff --git a/source/blender/render/SConscript b/source/blender/render/SConscript index a402139b927..d751c90ba27 100644 --- a/source/blender/render/SConscript +++ b/source/blender/render/SConscript @@ -7,6 +7,7 @@ raysources = env.Glob('intern/raytrace/*.cpp') incs = 'intern/include #/intern/guardedalloc ../blenlib ../makesdna ../makesrna' incs += ' extern/include ../blenkernel ../radiosity/extern/include ../imbuf' incs += ' ../include ../blenloader ../../../intern/smoke/extern ../../../intern/mikktspace' +incs += ' ../freestyle' cflags_raytrace = env['CCFLAGS'] cxxflags_raytrace = env['CXXFLAGS'] diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index 23f301249ba..1d04eb891d6 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -219,6 +219,7 @@ void RE_TileProcessor(struct Render *re); /* only RE_NewRender() needed, main Blender render calls */ void RE_BlenderFrame(struct Render *re, struct Main *bmain, struct Scene *scene, struct SceneRenderLayer *srl, struct Object *camera_override, unsigned int lay, int frame, const short write_still); void RE_BlenderAnim(struct Render *re, struct Main *bmain, struct Scene *scene, struct Object *camera_override, unsigned int lay, int sfra, int efra, int tfra, struct ReportList *reports); +void RE_RenderFreestyleStrokes(struct Render *re, struct Main *bmain, struct Scene *scene); /* main preview render call */ void RE_PreviewRender(struct Render *re, struct Main *bmain, struct Scene *scene); diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h index b2535ebc9ea..19ae9f8c777 100644 --- a/source/blender/render/intern/include/render_types.h +++ b/source/blender/render/intern/include/render_types.h @@ -229,6 +229,8 @@ struct Render ListBase volumes; ListBase volume_precache_parts; + ListBase freestyle_renders; + /* arena for allocating data for use during render, for * example dynamic TFaces to go in the VlakRen structure. */ diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index b1c9820337c..5cbde06dfc6 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -50,6 +50,7 @@ #include "BKE_animsys.h" /* <------ should this be here?, needed for sequencer update */ #include "BKE_global.h" #include "BKE_image.h" +#include "BKE_library.h" #include "BKE_main.h" #include "BKE_node.h" #include "BKE_object.h" @@ -75,6 +76,9 @@ #include "RE_pipeline.h" +#include "FRS_freestyle.h" +#include "FRS_freestyle_config.h" + /* internal */ #include "render_types.h" #include "renderpipeline.h" @@ -660,6 +664,7 @@ static RenderResult *new_render_result(Render *re, rcti *partrct, int crop, int rl->lay= (1<<20) -1; rl->layflag= 0x7FFF; /* solid ztra halo strand */ rl->passflag= SCE_PASS_COMBINED; + FRS_add_freestyle_config( srl ); re->r.actlay= 0; } @@ -1550,7 +1555,7 @@ static RenderPart *find_next_pano_slice(Render *re, int *minx, rctf *viewplane) R.panodxp= (re->winx - (best->disprect.xmin + best->disprect.xmax) )/2; R.panodxv= ((viewplane->xmax-viewplane->xmin)*R.panodxp)/(float)(re->winx); - + /* shift viewplane */ R.viewplane.xmin = viewplane->xmin + R.panodxv; R.viewplane.xmax = viewplane->xmax + R.panodxv; @@ -1786,6 +1791,7 @@ void RE_TileProcessor(Render *re) /* ************ This part uses API, for rendering Blender scenes ********** */ static int external_render_3d(Render *re, int do_all); +static void add_freestyle(Render *re); static void do_render_3d(Render *re) { @@ -1819,6 +1825,11 @@ static void do_render_3d(Render *re) if(!re->test_break(re->tbh)) add_halo_flare(re); + /* Freestyle */ + if( re->r.mode & R_EDGE_FRS && re->r.renderer==R_INTERN) + if(!re->test_break(re->tbh)) + add_freestyle(re); + /* free all render verts etc */ RE_Database_Free(re); @@ -2255,6 +2266,66 @@ static void render_composit_stats(void *UNUSED(arg), char *str) } +/* invokes Freestyle stroke rendering */ +static void add_freestyle(Render *re) +{ + SceneRenderLayer *srl; + LinkData *link; + + FRS_init_stroke_rendering(re); + + for(srl= (SceneRenderLayer *)re->scene->r.layers.first; srl; srl= srl->next) { + + link = (LinkData *)MEM_callocN(sizeof(LinkData), "LinkData to Freestyle render"); + BLI_addtail(&re->freestyle_renders, link); + + if( FRS_is_freestyle_enabled(srl) ) { + link->data = (void *)FRS_do_stroke_rendering(re, srl); + } + } + + FRS_finish_stroke_rendering(re); +} + +/* merges the results of Freestyle stroke rendering into a given render result */ +static void composite_freestyle_renders(Render *re, int sample) +{ + Render *freestyle_render; + SceneRenderLayer *srl; + LinkData *link; + + link = (LinkData *)re->freestyle_renders.first; + for(srl= (SceneRenderLayer *)re->scene->r.layers.first; srl; srl= srl->next) { + if( FRS_is_freestyle_enabled(srl) ) { + freestyle_render = (Render *)link->data; + read_render_result(freestyle_render, sample); + FRS_composite_result(re, srl, freestyle_render); + RE_FreeRenderResult(freestyle_render->result); + freestyle_render->result = NULL; + } + link = link->next; + } +} + +/* releases temporary scenes and renders for Freestyle stroke rendering */ +static void free_all_freestyle_renders(void) +{ + Render *re1, *freestyle_render; + LinkData *link; + + for(re1= RenderGlobal.renderlist.first; re1; re1= re1->next) { + for (link = (LinkData *)re1->freestyle_renders.first; link; link = link->next) { + if (link->data) { + freestyle_render = (Render *)link->data; + free_libblock(&G.main->scene, freestyle_render->scene); + RE_FreeRender(freestyle_render); + } + } + BLI_freelistN( &re1->freestyle_renders ); + } +} + + /* reads all buffers, calls optional composite, merges in first result->rectf */ static void do_merge_fullsample(Render *re, bNodeTree *ntree) { @@ -2292,8 +2363,10 @@ static void do_merge_fullsample(Render *re, bNodeTree *ntree) for(re1= RenderGlobal.renderlist.first; re1; re1= re1->next) { if(re1->scene->id.flag & LIB_DOIT) { if(re1->r.scemode & R_FULL_SAMPLE) { - if(sample) + if(sample) { read_render_result(re1, sample); + composite_freestyle_renders(re1, sample); + } ntreeCompositTagRender(re1->scene); /* ensure node gets exec to put buffers on stack */ } } @@ -2478,6 +2551,8 @@ static void do_render_composite_fields_blur_3d(Render *re) do_merge_fullsample(re, NULL); } + free_all_freestyle_renders(); + /* weak... the display callback wants an active renderlayer pointer... */ re->result->renlay= render_get_active_layer(re, re->result); re->display_draw(re->ddh, re->result, NULL); @@ -2920,7 +2995,7 @@ void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *sr BLI_exec_cb(re->main, (ID *)scene, BLI_CB_EVT_RENDER_PRE); do_render_all_options(re); - + if(write_still && !G.afbreek) { if(BKE_imtype_is_movie(scene->r.imtype)) { /* operator checks this but incase its called from elsewhere */ @@ -2942,6 +3017,15 @@ void RE_BlenderFrame(Render *re, Main *bmain, Scene *scene, SceneRenderLayer *sr G.rendering= 0; } +void RE_RenderFreestyleStrokes(Render *re, Main *bmain, Scene *scene) +{ + re->result_ok= 0; + if(render_initialize_from_main(re, bmain, scene, NULL, NULL, scene->lay, 0, 0)) { + do_render_fields_blur_3d(re); + } + re->result_ok= 1; +} + static int do_write_image_or_movie(Render *re, Scene *scene, bMovieHandle *mh, ReportList *reports, const char *name_override) { char name[FILE_MAX]; diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c index 2702b7e5145..67b2ffb56d4 100644 --- a/source/blender/render/intern/source/shadeinput.c +++ b/source/blender/render/intern/source/shadeinput.c @@ -1096,6 +1096,7 @@ void shade_input_set_shade_texco(ShadeInput *shi) shi->actcol= obr->actmcol; if(mode & (MA_VERTEXCOL|MA_VERTEXCOLP)) { + float alpha[8]; for (i=0; (mcol=RE_vlakren_get_mcol(obr, vlr, i, &name, 0)); i++) { ShadeInputCol *scol= &shi->col[i]; char *cp1, *cp2, *cp3; @@ -1110,13 +1111,15 @@ void shade_input_set_shade_texco(ShadeInput *shi) scol->col[0]= (l*((float)cp3[3]) - u*((float)cp1[3]) - v*((float)cp2[3]))/255.0f; scol->col[1]= (l*((float)cp3[2]) - u*((float)cp1[2]) - v*((float)cp2[2]))/255.0f; scol->col[2]= (l*((float)cp3[1]) - u*((float)cp1[1]) - v*((float)cp2[1]))/255.0f; + + alpha[i]= (l*((float)cp3[0]) - u*((float)cp1[0]) - v*((float)cp2[0]))/255.0f; } if(shi->totcol) { shi->vcol[0]= shi->col[shi->actcol].col[0]; shi->vcol[1]= shi->col[shi->actcol].col[1]; shi->vcol[2]= shi->col[shi->actcol].col[2]; - shi->vcol[3]= 1.0f; + shi->vcol[3]= shi->mat->vcol_alpha ? alpha[shi->actcol] : 1.0f; } else { shi->vcol[0]= 0.0f; diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c index 7f921d21041..8b5ae479f64 100644 --- a/source/blender/render/intern/source/shadeoutput.c +++ b/source/blender/render/intern/source/shadeoutput.c @@ -1653,7 +1653,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr) shi->r= shi->vcol[0]; shi->g= shi->vcol[1]; shi->b= shi->vcol[2]; - if(ma->mode & (MA_FACETEXTURE_ALPHA)) + if((ma->mode & (MA_FACETEXTURE_ALPHA)) || ma->vcol_alpha) shi->alpha= (shi->mode & MA_TRANSP) ? shi->vcol[3] : 1.0f; } if(ma->texco){ |