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:
-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
-rw-r--r--source/blender/render/intern/include/render_types.h5
-rw-r--r--source/blender/render/intern/source/pipeline.c120
5 files changed, 46 insertions, 162 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*/)
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