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:
authorBrecht Van Lommel <brecht@blender.org>2020-03-26 03:14:08 +0300
committerBrecht Van Lommel <brecht@blender.org>2020-03-26 03:29:20 +0300
commitba8d819c9b1ccb7dae50167755167dc3e54bd657 (patch)
tree15428f208bb414fab49decca2aad82723939dc13 /source/blender/render
parent366cb3a0592af4736fa9efc5881eab4760b7cba7 (diff)
Fix T74417: Freestyle render removes image texture users
This simplifies freestyle render pipeline integration so we don't have to do much manual ID user management at all. The complexity here was legacy from Blender Internal. Based on fix provided by Sybren A. Stüvl.
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/intern/include/render_types.h5
-rw-r--r--source/blender/render/intern/source/pipeline.c120
2 files changed, 21 insertions, 104 deletions
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h
index 1318e2498bb..3ae4b9c0b90 100644
--- a/source/blender/render/intern/include/render_types.h
+++ b/source/blender/render/intern/include/render_types.h
@@ -123,11 +123,6 @@ struct Render {
Depsgraph *pipeline_depsgraph;
Scene *pipeline_scene_eval;
-#ifdef WITH_FREESTYLE
- struct Main *freestyle_bmain;
- ListBase freestyle_renders;
-#endif
-
/* callbacks */
void (*display_init)(void *handle, RenderResult *rr);
void *dih;
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 14a9ebcff5d..87568402df3 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -1149,14 +1149,6 @@ void RE_AddObject(Render *UNUSED(re), Object *UNUSED(ob))
}
#endif
-/* *************************************** */
-
-#ifdef WITH_FREESTYLE
-static void init_freestyle(Render *re);
-static void add_freestyle(Render *re, int render);
-static void free_all_freestyle_renders(void);
-#endif
-
/* ************ This part uses API, for rendering Blender scenes ********** */
static void do_render_3d(Render *re)
@@ -1365,87 +1357,6 @@ static void render_composit_stats(void *arg, const char *str)
re->stats_draw(re->sdh, &i);
}
-#ifdef WITH_FREESTYLE
-/* init Freestyle renderer */
-static void init_freestyle(Render *re)
-{
- re->freestyle_bmain = BKE_main_new();
-
- /* We use the same window manager for freestyle bmain as
- * real bmain uses. This is needed because freestyle's
- * bmain could be used to tag scenes for update, which
- * implies call of ED_render_scene_update in some cases
- * and that function requires proper window manager
- * to present (sergey)
- */
- re->freestyle_bmain->wm = re->main->wm;
-
- FRS_init_stroke_renderer(re);
-}
-
-/* invokes Freestyle stroke rendering */
-static void add_freestyle(Render *re, int render)
-{
- ViewLayer *view_layer, *active_view_layer;
- LinkData *link;
- Render *r;
-
- active_view_layer = BLI_findlink(&re->view_layers, re->active_view_layer);
-
- FRS_begin_stroke_rendering(re);
-
- for (view_layer = (ViewLayer *)re->view_layers.first; view_layer;
- view_layer = view_layer->next) {
- link = (LinkData *)MEM_callocN(sizeof(LinkData), "LinkData to Freestyle render");
- BLI_addtail(&re->freestyle_renders, link);
-
- if ((re->r.scemode & R_SINGLE_LAYER) && view_layer != active_view_layer) {
- continue;
- }
- if (FRS_is_freestyle_enabled(view_layer)) {
- r = FRS_do_stroke_rendering(re, view_layer, render);
- link->data = (void *)r;
- }
- }
-
- FRS_end_stroke_rendering(re);
-}
-
-/* releases temporary scenes and renders for Freestyle stroke rendering */
-static void free_all_freestyle_renders(void)
-{
- Render *re1;
- LinkData *link;
-
- for (re1 = RenderGlobal.renderlist.first; re1; re1 = re1->next) {
- for (link = (LinkData *)re1->freestyle_renders.first; link; link = link->next) {
- Render *freestyle_render = (Render *)link->data;
-
- if (freestyle_render) {
- Scene *freestyle_scene = freestyle_render->scene;
- RE_FreeRender(freestyle_render);
-
- if (freestyle_scene) {
- BKE_libblock_unlink(re1->freestyle_bmain, freestyle_scene, false, false);
- BKE_id_free(re1->freestyle_bmain, freestyle_scene);
- }
- }
- }
- BLI_freelistN(&re1->freestyle_renders);
-
- if (re1->freestyle_bmain) {
- /* detach the window manager from freestyle bmain (see comments
- * in add_freestyle() for more detail)
- */
- BLI_listbase_clear(&re1->freestyle_bmain->wm);
-
- BKE_main_free(re1->freestyle_bmain);
- re1->freestyle_bmain = NULL;
- }
- }
-}
-#endif
-
/* returns fully composited render-result on given time step (in RenderData) */
static void do_render_composite(Render *re)
{
@@ -1531,10 +1442,6 @@ static void do_render_composite(Render *re)
}
}
-#ifdef WITH_FREESTYLE
- free_all_freestyle_renders();
-#endif
-
/* weak... the display callback wants an active renderlayer pointer... */
if (re->result != NULL) {
re->result->renlay = render_get_active_layer(re, re->result);
@@ -2181,15 +2088,30 @@ void RE_RenderFreestyleStrokes(Render *re, Main *bmain, Scene *scene, int render
void RE_RenderFreestyleExternal(Render *re)
{
- if (!re->test_break(re->tbh)) {
- RenderView *rv;
+ if (re->test_break(re->tbh)) {
+ return;
+ }
- init_freestyle(re);
+ FRS_init_stroke_renderer(re);
+
+ for (RenderView *rv = re->result->views.first; rv; rv = rv->next) {
+ RE_SetActiveRenderView(re, rv->name);
- for (rv = re->result->views.first; rv; rv = rv->next) {
- RE_SetActiveRenderView(re, rv->name);
- add_freestyle(re, 1);
+ ViewLayer *active_view_layer = BLI_findlink(&re->view_layers, re->active_view_layer);
+ FRS_begin_stroke_rendering(re);
+
+ for (ViewLayer *view_layer = (ViewLayer *)re->view_layers.first; view_layer;
+ view_layer = view_layer->next) {
+ if ((re->r.scemode & R_SINGLE_LAYER) && view_layer != active_view_layer) {
+ continue;
+ }
+
+ if (FRS_is_freestyle_enabled(view_layer)) {
+ FRS_do_stroke_rendering(re, view_layer);
+ }
}
+
+ FRS_end_stroke_rendering(re);
}
}
#endif