diff --git a/intern/cycles/blender/addon/__init__.py b/intern/cycles/blender/addon/__init__.py index 3ab352e52a2..b1deb5cb64e 100644 --- a/intern/cycles/blender/addon/__init__.py +++ b/intern/cycles/blender/addon/__init__.py @@ -59,6 +59,7 @@ class CyclesRender(bpy.types.RenderEngine): bl_use_exclude_layers = True bl_use_save_buffers = True bl_use_spherical_stereo = True + bl_use_custom_freestyle = True def __init__(self): self.session = None diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c index 3126f3e11f4..0c2860c05e7 100644 --- a/source/blender/makesrna/intern/rna_render.c +++ b/source/blender/makesrna/intern/rna_render.c @@ -848,6 +848,14 @@ static void rna_def_render_engine(BlenderRNA *brna) RNA_def_property_ui_text( prop, "Use Eevee Viewport", "Uses Eevee for viewport shading in LookDev shading mode"); + prop = RNA_def_property(srna, "bl_use_custom_freestyle", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "type->flag", RE_USE_CUSTOM_FREESTYLE); + RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL); + RNA_def_property_ui_text( + prop, + "Use Custom Freestyle", + "Handles freestyle rendering on its own, instead of delegating it to EEVEE"); + prop = RNA_def_property(srna, "bl_use_gpu_context", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "type->flag", RE_USE_GPU_CONTEXT); RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL); diff --git a/source/blender/render/RE_engine.h b/source/blender/render/RE_engine.h index 1af40ac760b..c31a41f66d5 100644 --- a/source/blender/render/RE_engine.h +++ b/source/blender/render/RE_engine.h @@ -64,6 +64,7 @@ extern "C" { #define RE_USE_SPHERICAL_STEREO 128 #define RE_USE_STEREO_VIEWPORT 256 #define RE_USE_GPU_CONTEXT 512 +#define RE_USE_CUSTOM_FREESTYLE 1024 /* RenderEngine.flag */ #define RE_ENGINE_ANIMATION 1 diff --git a/source/blender/render/intern/pipeline.c b/source/blender/render/intern/pipeline.c index 320f8b8ed03..8567835f55c 100644 --- a/source/blender/render/intern/pipeline.c +++ b/source/blender/render/intern/pipeline.c @@ -2007,13 +2007,38 @@ void RE_RenderFrame(Render *re, G.is_rendering = false; } +static void change_renderdata_engine(Render *re, const char *new_engine) +{ + if (!STREQ(re->r.engine, new_engine)) { + if (re->engine) { + RE_engine_free(re->engine); + re->engine = NULL; + } + BLI_strncpy(re->r.engine, new_engine, sizeof(re->r.engine)); + } +} + #ifdef WITH_FREESTYLE +static bool use_eevee_for_freestyle_render(Render *re) +{ + RenderEngineType *type = RE_engines_find(re->r.engine); + return !(type->flag & RE_USE_CUSTOM_FREESTYLE); +} + void RE_RenderFreestyleStrokes(Render *re, Main *bmain, Scene *scene, int render) { re->result_ok = 0; if (render_init_from_main(re, &scene->r, bmain, scene, NULL, NULL, 0, 0)) { if (render) { + char scene_engine[32]; + BLI_strncpy(scene_engine, re->r.engine, sizeof(scene_engine)); + if (use_eevee_for_freestyle_render(re)) { + change_renderdata_engine(re, RE_engine_id_BLENDER_EEVEE); + } + do_render_3d(re); + + change_renderdata_engine(re, scene_engine); } } re->result_ok = 1;