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/freestyle
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/freestyle')
-rw-r--r--source/blender/freestyle/FRS_freestyle.h4
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp65
-rw-r--r--source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp14
3 files changed, 25 insertions, 58 deletions
diff --git a/source/blender/freestyle/FRS_freestyle.h b/source/blender/freestyle/FRS_freestyle.h
index dc8a0c79072..876f40b211f 100644
--- a/source/blender/freestyle/FRS_freestyle.h
+++ b/source/blender/freestyle/FRS_freestyle.h
@@ -48,9 +48,7 @@ void FRS_set_context(struct bContext *C);
int FRS_is_freestyle_enabled(struct ViewLayer *view_layer);
void FRS_init_stroke_renderer(struct Render *re);
void FRS_begin_stroke_rendering(struct Render *re);
-struct Render *FRS_do_stroke_rendering(struct Render *re,
- struct ViewLayer *view_layer,
- int render);
+void FRS_do_stroke_rendering(struct Render *re, struct ViewLayer *view_layer);
void FRS_end_stroke_rendering(struct Render *re);
void FRS_free_view_map_cache(void);
void FRS_composite_result(struct Render *re,
diff --git a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
index c88d5f24b5d..a61bad7cf8a 100644
--- a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
+++ b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
@@ -32,19 +32,19 @@ extern "C" {
#include "DNA_camera_types.h"
#include "DNA_collection_types.h"
-#include "DNA_listBase.h"
#include "DNA_linestyle_types.h"
+#include "DNA_listBase.h"
#include "DNA_material_types.h"
-#include "DNA_meshdata_types.h"
#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
-#include "DNA_screen_types.h"
#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
#include "BKE_collection.h"
#include "BKE_customdata.h"
-#include "BKE_idprop.h"
#include "BKE_global.h"
+#include "BKE_idprop.h"
#include "BKE_layer.h"
#include "BKE_lib_id.h" /* free_libblock */
#include "BKE_material.h"
@@ -76,7 +76,16 @@ const char *BlenderStrokeRenderer::uvNames[] = {"along_stroke", "along_stroke_ti
BlenderStrokeRenderer::BlenderStrokeRenderer(Render *re, int render_count) : StrokeRenderer()
{
- freestyle_bmain = re->freestyle_bmain;
+ 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)
+ */
+ freestyle_bmain->wm = re->main->wm;
// for stroke mesh generation
_width = re->winx;
@@ -170,50 +179,18 @@ BlenderStrokeRenderer::BlenderStrokeRenderer(Render *re, int render_count) : Str
BlenderStrokeRenderer::~BlenderStrokeRenderer()
{
- // The freestyle_scene object is not released here. Instead,
- // the scene is released in free_all_freestyle_renders() in
- // source/blender/render/intern/source/pipeline.c, after the
- // compositor has finished.
-
- // release objects and data blocks
- Base *base_next = NULL;
- ViewLayer *view_layer = (ViewLayer *)freestyle_scene->view_layers.first;
- for (Base *b = (Base *)view_layer->object_bases.first; b; b = base_next) {
- base_next = b->next;
- Object *ob = b->object;
- char *name = ob->id.name;
-#if 0
- if (G.debug & G_DEBUG_FREESTYLE) {
- cout << "removing " << name[0] << name[1] << ":" << (name + 2) << endl;
- }
-#endif
- switch (ob->type) {
- case OB_CAMERA:
- freestyle_scene->camera = NULL;
- ATTR_FALLTHROUGH;
- case OB_MESH:
- BKE_scene_collections_object_remove(freestyle_bmain, freestyle_scene, ob, true);
- break;
- default:
- cerr << "Warning: unexpected object in the scene: " << name[0] << name[1] << ":"
- << (name + 2) << endl;
- }
- }
-
- // release materials
- Link *lnk = (Link *)freestyle_bmain->materials.first;
-
- while (lnk) {
- Material *ma = (Material *)lnk;
- lnk = lnk->next;
- BKE_id_free(freestyle_bmain, ma);
- }
-
BLI_ghash_free(_nodetree_hash, NULL, NULL);
DEG_graph_free(freestyle_depsgraph);
FreeStrokeGroups();
+
+ /* detach the window manager from freestyle bmain (see comments
+ * in add_freestyle() for more detail)
+ */
+ BLI_listbase_clear(&freestyle_bmain->wm);
+
+ BKE_main_free(freestyle_bmain);
}
float BlenderStrokeRenderer::get_stroke_vertex_z(void) const
diff --git a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
index 0877107a240..0f4263162a6 100644
--- a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
+++ b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
@@ -637,14 +637,8 @@ void FRS_begin_stroke_rendering(Render *re)
init_camera(re);
}
-Render *FRS_do_stroke_rendering(Render *re, ViewLayer *view_layer, int render)
+void FRS_do_stroke_rendering(Render *re, ViewLayer *view_layer)
{
- Render *freestyle_render = NULL;
-
- if (!render) {
- return controller->RenderStrokes(re, false);
- }
-
RenderMonitor monitor(re);
controller->setRenderMonitor(&monitor);
controller->setViewMapCache(
@@ -685,6 +679,7 @@ Render *FRS_do_stroke_rendering(Render *re, ViewLayer *view_layer, int render)
re->i.infostr = NULL;
g_freestyle.scene = DEG_get_evaluated_scene(depsgraph);
int strokeCount = controller->DrawStrokes();
+ Render *freestyle_render = NULL;
if (strokeCount > 0) {
freestyle_render = controller->RenderStrokes(re, true);
}
@@ -694,15 +689,12 @@ Render *FRS_do_stroke_rendering(Render *re, ViewLayer *view_layer, int render)
// composite result
if (freestyle_render) {
FRS_composite_result(re, view_layer, freestyle_render);
- RE_FreeRenderResult(freestyle_render->result);
- freestyle_render->result = NULL;
+ RE_FreeRender(freestyle_render);
}
}
}
DEG_graph_free(depsgraph);
-
- return freestyle_render;
}
void FRS_end_stroke_rendering(Render * /*re*/)