[Bf-blender-cvs] [0cddbcf1d70] master: Fix T91803: Freestyle rendering as pass broken after recent changes

Brecht Van Lommel noreply at git.blender.org
Wed Sep 29 21:26:12 CEST 2021


Commit: 0cddbcf1d7054c10c483061d9eaf92eedca3d976
Author: Brecht Van Lommel
Date:   Wed Sep 29 21:13:03 2021 +0200
Branches: master
https://developer.blender.org/rB0cddbcf1d7054c10c483061d9eaf92eedca3d976

Fix T91803: Freestyle rendering as pass broken after recent changes

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

M	source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
M	source/blender/render/RE_pipeline.h
M	source/blender/render/intern/engine.c
M	source/blender/render/intern/pipeline.c
M	source/blender/render/intern/render_result.c
M	source/blender/render/intern/render_result.h

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

diff --git a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
index c74fd60fe35..405deaf00b0 100644
--- a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
+++ b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
@@ -494,7 +494,7 @@ void FRS_composite_result(Render *re, ViewLayer *view_layer, Render *freestyle_r
     if (view_layer->freestyle_config.flags & FREESTYLE_AS_RENDER_PASS) {
       // Create a blank render pass output.
       RE_create_render_pass(
-          re->result, RE_PASSNAME_FREESTYLE, 4, "RGBA", view_layer->name, re->viewname);
+          re->result, RE_PASSNAME_FREESTYLE, 4, "RGBA", view_layer->name, re->viewname, true);
     }
     return;
   }
@@ -530,7 +530,7 @@ void FRS_composite_result(Render *re, ViewLayer *view_layer, Render *freestyle_r
 
   if (view_layer->freestyle_config.flags & FREESTYLE_AS_RENDER_PASS) {
     RE_create_render_pass(
-        re->result, RE_PASSNAME_FREESTYLE, 4, "RGBA", view_layer->name, re->viewname);
+        re->result, RE_PASSNAME_FREESTYLE, 4, "RGBA", view_layer->name, re->viewname, true);
     dest = RE_RenderLayerGetPass(rl, RE_PASSNAME_FREESTYLE, re->viewname);
   }
   else {
diff --git a/source/blender/render/RE_pipeline.h b/source/blender/render/RE_pipeline.h
index 3237772dd80..0d2d93ae026 100644
--- a/source/blender/render/RE_pipeline.h
+++ b/source/blender/render/RE_pipeline.h
@@ -233,7 +233,8 @@ void RE_create_render_pass(struct RenderResult *rr,
                            int channels,
                            const char *chan_id,
                            const char *layername,
-                           const char *viewname);
+                           const char *viewname,
+                           const bool allocate);
 
 /* obligatory initialize call, disprect is optional */
 void RE_InitState(struct Render *re,
diff --git a/source/blender/render/intern/engine.c b/source/blender/render/intern/engine.c
index 389b821ca35..790c46dad0f 100644
--- a/source/blender/render/intern/engine.c
+++ b/source/blender/render/intern/engine.c
@@ -207,11 +207,10 @@ static RenderResult *render_result_from_bake(RenderEngine *engine, int x, int y,
 
   /* Add render passes. */
   RenderPass *result_pass = render_layer_add_pass(
-      rr, rl, engine->bake.depth, RE_PASSNAME_COMBINED, "", "RGBA");
-  RenderPass *primitive_pass = render_layer_add_pass(rr, rl, 4, "BakePrimitive", "", "RGBA");
-  RenderPass *differential_pass = render_layer_add_pass(rr, rl, 4, "BakeDifferential", "", "RGBA");
-
-  render_result_passes_allocated_ensure(rr);
+      rr, rl, engine->bake.depth, RE_PASSNAME_COMBINED, "", "RGBA", true);
+  RenderPass *primitive_pass = render_layer_add_pass(rr, rl, 4, "BakePrimitive", "", "RGBA", true);
+  RenderPass *differential_pass = render_layer_add_pass(
+      rr, rl, 4, "BakeDifferential", "", "RGBA", true);
 
   /* Fill render passes from bake pixel array, to be read by the render engine. */
   for (int ty = 0; ty < h; ty++) {
@@ -414,7 +413,7 @@ void RE_engine_add_pass(RenderEngine *engine,
     return;
   }
 
-  RE_create_render_pass(re->result, name, channels, chan_id, layername, NULL);
+  RE_create_render_pass(re->result, name, channels, chan_id, layername, NULL, false);
 }
 
 void RE_engine_end_result(
diff --git a/source/blender/render/intern/pipeline.c b/source/blender/render/intern/pipeline.c
index 931282e26dd..7c5259a1c5c 100644
--- a/source/blender/render/intern/pipeline.c
+++ b/source/blender/render/intern/pipeline.c
@@ -2817,7 +2817,7 @@ RenderPass *RE_create_gp_pass(RenderResult *rr, const char *layername, const cha
     BLI_freelinkN(&rl->passes, rp);
   }
   /* create a totally new pass */
-  return render_layer_add_pass(rr, rl, 4, RE_PASSNAME_COMBINED, viewname, "RGBA");
+  return render_layer_add_pass(rr, rl, 4, RE_PASSNAME_COMBINED, viewname, "RGBA", true);
 }
 
 bool RE_allow_render_generic_object(Object *ob)
diff --git a/source/blender/render/intern/render_result.c b/source/blender/render/intern/render_result.c
index db14f7a2982..0681bcd9aa5 100644
--- a/source/blender/render/intern/render_result.c
+++ b/source/blender/render/intern/render_result.c
@@ -213,12 +213,37 @@ static void set_pass_full_name(
 
 /********************************** New **************************************/
 
+static void render_layer_allocate_pass(RenderResult *rr, RenderPass *rp)
+{
+  if (rp->rect != NULL) {
+    return;
+  }
+
+  const size_t rectsize = ((size_t)rr->rectx) * rr->recty * rp->channels;
+  rp->rect = MEM_callocN(sizeof(float) * rectsize, rp->name);
+
+  if (STREQ(rp->name, RE_PASSNAME_VECTOR)) {
+    /* initialize to max speed */
+    float *rect = rp->rect;
+    for (int x = rectsize - 1; x >= 0; x--) {
+      rect[x] = PASS_VECTOR_MAX;
+    }
+  }
+  else if (STREQ(rp->name, RE_PASSNAME_Z)) {
+    float *rect = rp->rect;
+    for (int x = rectsize - 1; x >= 0; x--) {
+      rect[x] = 10e10;
+    }
+  }
+}
+
 RenderPass *render_layer_add_pass(RenderResult *rr,
                                   RenderLayer *rl,
                                   int channels,
                                   const char *name,
                                   const char *viewname,
-                                  const char *chan_id)
+                                  const char *chan_id,
+                                  const bool allocate)
 {
   const int view_id = BLI_findstringindex(&rr->views, viewname, offsetof(RenderView, name));
   RenderPass *rpass = MEM_callocN(sizeof(RenderPass), name);
@@ -250,8 +275,13 @@ RenderPass *render_layer_add_pass(RenderResult *rr,
 
   BLI_addtail(&rl->passes, rpass);
 
-  /* The result contains non-allocated pass now, so tag it as such. */
-  rr->passes_allocated = false;
+  if (allocate) {
+    render_layer_allocate_pass(rr, rpass);
+  }
+  else {
+    /* The result contains non-allocated pass now, so tag it as such. */
+    rr->passes_allocated = false;
+  }
 
   return rpass;
 }
@@ -323,14 +353,14 @@ RenderResult *render_result_new(Render *re,
 
 #define RENDER_LAYER_ADD_PASS_SAFE(rr, rl, channels, name, viewname, chan_id) \
   do { \
-    if (render_layer_add_pass(rr, rl, channels, name, viewname, chan_id) == NULL) { \
+    if (render_layer_add_pass(rr, rl, channels, name, viewname, chan_id, false) == NULL) { \
       render_result_free(rr); \
       return NULL; \
     } \
   } while (false)
 
       /* A renderlayer should always have a Combined pass. */
-      render_layer_add_pass(rr, rl, 4, "Combined", view, "RGBA");
+      render_layer_add_pass(rr, rl, 4, "Combined", view, "RGBA", false);
 
       if (view_layer->passflag & SCE_PASS_Z) {
         RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 1, RE_PASSNAME_Z, view, "Z");
@@ -427,7 +457,7 @@ RenderResult *render_result_new(Render *re,
       }
 
       /* a renderlayer should always have a Combined pass */
-      render_layer_add_pass(rr, rl, 4, RE_PASSNAME_COMBINED, view, "RGBA");
+      render_layer_add_pass(rr, rl, 4, RE_PASSNAME_COMBINED, view, "RGBA", false);
     }
 
     /* NOTE: this has to be in sync with `scene.c`. */
@@ -453,26 +483,7 @@ void render_result_passes_allocated_ensure(RenderResult *rr)
         continue;
       }
 
-      if (rp->rect != NULL) {
-        continue;
-      }
-
-      const size_t rectsize = ((size_t)rr->rectx) * rr->recty * rp->channels;
-      rp->rect = MEM_callocN(sizeof(float) * rectsize, rp->name);
-
-      if (STREQ(rp->name, RE_PASSNAME_VECTOR)) {
-        /* initialize to max speed */
-        float *rect = rp->rect;
-        for (int x = rectsize - 1; x >= 0; x--) {
-          rect[x] = PASS_VECTOR_MAX;
-        }
-      }
-      else if (STREQ(rp->name, RE_PASSNAME_Z)) {
-        float *rect = rp->rect;
-        for (int x = rectsize - 1; x >= 0; x--) {
-          rect[x] = 10e10;
-        }
-      }
+      render_layer_allocate_pass(rr, rp);
     }
   }
 
@@ -501,7 +512,7 @@ void render_result_clone_passes(Render *re, RenderResult *rr, const char *viewna
           &rl->passes, main_rp->fullname, offsetof(RenderPass, fullname));
       if (!rp) {
         render_layer_add_pass(
-            rr, rl, main_rp->channels, main_rp->name, main_rp->view, main_rp->chan_id);
+            rr, rl, main_rp->channels, main_rp->name, main_rp->view, main_rp->chan_id, false);
       }
     }
   }
@@ -512,7 +523,8 @@ void RE_create_render_pass(RenderResult *rr,
                            int channels,
                            const char *chan_id,
                            const char *layername,
-                           const char *viewname)
+                           const char *viewname,
+                           const bool allocate)
 {
   RenderLayer *rl;
   RenderPass *rp;
@@ -542,7 +554,7 @@ void RE_create_render_pass(RenderResult *rr,
       }
 
       if (!rp) {
-        render_layer_add_pass(rr, rl, channels, name, view, chan_id);
+        render_layer_add_pass(rr, rl, channels, name, view, chan_id, allocate);
       }
     }
   }
diff --git a/source/blender/render/intern/render_result.h b/source/blender/render/intern/render_result.h
index 4145bb3b8ab..34b8143869c 100644
--- a/source/blender/render/intern/render_result.h
+++ b/source/blender/render/intern/render_result.h
@@ -83,7 +83,8 @@ struct RenderPass *render_layer_add_pass(struct RenderResult *rr,
                                          int channels,
                                          const char *name,
                                          const char *viewname,
-                                         const char *chan_id);
+                                         const char *chan_id,
+                                         const bool allocate);
 
 int render_result_exr_file_read_path(struct RenderResult *rr,
                                      struct RenderLayer *rl_single,



More information about the Bf-blender-cvs mailing list