[Bf-blender-cvs] [14285445283] master: Python API: option for render engines to delegate Freestyle render to Eevee

Miguel Pozo noreply at git.blender.org
Tue Feb 2 14:20:08 CET 2021


Commit: 14285445283ecc8890f7e1c4b4eb92cef3f0a8ed
Author: Miguel Pozo
Date:   Mon Feb 1 18:24:15 2021 +0100
Branches: master
https://developer.blender.org/rB14285445283ecc8890f7e1c4b4eb92cef3f0a8ed

Python API: option for render engines to delegate Freestyle render to Eevee

Eevee is now used for Freestyle rendering by default, since other engines are
unlikely to have support for this. Workbench and Cycles do their own rendering.

RenderEngine add-ons can do their own Freestyle rendering by setting
bl_use_custom_freestyle = True.

Differential Revision: https://developer.blender.org/D8335

===================================================================

M	intern/cycles/blender/addon/__init__.py
M	source/blender/makesrna/intern/rna_render.c
M	source/blender/render/RE_engine.h
M	source/blender/render/intern/pipeline.c

===================================================================

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;



More information about the Bf-blender-cvs mailing list