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:
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/CMakeLists.txt1
-rw-r--r--source/blender/render/SConscript1
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h1
-rw-r--r--source/blender/render/intern/include/render_types.h2
-rw-r--r--source/blender/render/intern/source/pipeline.c90
-rw-r--r--source/blender/render/intern/source/shadeinput.c5
-rw-r--r--source/blender/render/intern/source/shadeoutput.c2
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){