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:
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*/)