From 820d1b249df239b8ec1161ea3fb3f99fb62c9f49 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 24 Jan 2019 07:08:19 +0100 Subject: Fix freestyle renders not including some types of animation. Freestyle Python scripts need to get the evaluated view layer and scene, not the original one. --- .../freestyle/intern/application/Controller.cpp | 4 ++-- .../blender/freestyle/intern/application/Controller.h | 2 +- .../intern/blender_interface/BlenderFileLoader.cpp | 15 ++++----------- .../intern/blender_interface/BlenderFileLoader.h | 4 ++-- .../intern/blender_interface/FRS_freestyle.cpp | 18 ++++++++++++++---- 5 files changed, 23 insertions(+), 20 deletions(-) (limited to 'source/blender/freestyle') diff --git a/source/blender/freestyle/intern/application/Controller.cpp b/source/blender/freestyle/intern/application/Controller.cpp index 5ae04698a73..ea11e64e775 100644 --- a/source/blender/freestyle/intern/application/Controller.cpp +++ b/source/blender/freestyle/intern/application/Controller.cpp @@ -232,9 +232,9 @@ bool Controller::hitViewMapCache() return false; } -int Controller::LoadMesh(Render *re, ViewLayer *view_layer) +int Controller::LoadMesh(Render *re, ViewLayer *view_layer, Depsgraph *depsgraph) { - BlenderFileLoader loader(re, view_layer); + BlenderFileLoader loader(re, view_layer, depsgraph); loader.setRenderMonitor(_pRenderMonitor); diff --git a/source/blender/freestyle/intern/application/Controller.h b/source/blender/freestyle/intern/application/Controller.h index 0304c18b8a6..80c7d8656a3 100644 --- a/source/blender/freestyle/intern/application/Controller.h +++ b/source/blender/freestyle/intern/application/Controller.h @@ -68,7 +68,7 @@ public: //soc void init_options(); - int LoadMesh(Render *re, ViewLayer *view_layer); + int LoadMesh(Render *re, ViewLayer *view_layer, Depsgraph *depsgraph); int Load3DSFile(const char *iFileName); void CloseFile(); void ComputeViewMap(); diff --git a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp index 8a4fa91d650..4d77962bdfa 100644 --- a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp +++ b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp @@ -32,10 +32,10 @@ namespace Freestyle { -BlenderFileLoader::BlenderFileLoader(Render *re, ViewLayer *view_layer) +BlenderFileLoader::BlenderFileLoader(Render *re, ViewLayer *view_layer, Depsgraph *depsgraph) { _re = re; - _view_layer = view_layer; + _depsgraph = depsgraph; _Scene = NULL; _numFacesRead = 0; #if 0 @@ -79,11 +79,6 @@ NodeGroup *BlenderFileLoader::Load() _z_offset = 0.f; } - ViewLayer *view_layer = (ViewLayer*)BLI_findstring(&_re->scene->view_layers, _view_layer->name, offsetof(ViewLayer, name)); - Depsgraph *depsgraph = DEG_graph_new(_re->scene, view_layer, DAG_EVAL_RENDER); - - BKE_scene_graph_update_tagged(depsgraph, _re->main); - #if 0 if (G.debug & G_DEBUG_FREESTYLE) { cout << "Frustum: l " << _viewplane_left << " r " << _viewplane_right @@ -95,7 +90,7 @@ NodeGroup *BlenderFileLoader::Load() int id = 0; DEG_OBJECT_ITER_BEGIN( - depsgraph, ob, + _depsgraph, ob, DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY | DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET | DEG_ITER_OBJECT_FLAG_VISIBLE | @@ -111,7 +106,7 @@ NodeGroup *BlenderFileLoader::Load() bool apply_modifiers = false; bool calc_undeformed = false; - Mesh *mesh = BKE_mesh_new_from_object(depsgraph, + Mesh *mesh = BKE_mesh_new_from_object(_depsgraph, _re->main, _re->scene, ob, @@ -125,8 +120,6 @@ NodeGroup *BlenderFileLoader::Load() } DEG_OBJECT_ITER_END; - DEG_graph_free(depsgraph); - // Return the built scene. return _Scene; } diff --git a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h index 2fcf4373bba..8fb95ad7e37 100644 --- a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h +++ b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h @@ -89,7 +89,7 @@ class BlenderFileLoader { public: /*! Builds a MaxFileLoader */ - BlenderFileLoader(Render *re, ViewLayer *view_layer); + BlenderFileLoader(Render *re, ViewLayer *view_layer, Depsgraph *depsgraph); virtual ~BlenderFileLoader(); /*! Loads the 3D scene and returns a pointer to the scene root node */ @@ -124,7 +124,7 @@ protected: unsigned n; }; Render *_re; - ViewLayer *_view_layer; + Depsgraph *_depsgraph; NodeGroup *_Scene; unsigned _numFacesRead; #if 0 diff --git a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp index 3486980fa65..470b1151391 100644 --- a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp +++ b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp @@ -51,6 +51,7 @@ extern "C" { #include "BKE_global.h" #include "BKE_library.h" #include "BKE_linestyle.h" +#include "BKE_scene.h" #include "BKE_text.h" #include "BLT_translation.h" @@ -62,6 +63,8 @@ extern "C" { #include "BPY_extern.h" +#include "DEG_depsgraph_query.h" + #include "renderpipeline.h" #include "FRS_freestyle.h" @@ -282,13 +285,13 @@ static bool test_edge_type_conditions(struct edge_type_condition *conditions, return true; } -static void prepare(Render *re, ViewLayer *view_layer) +static void prepare(Render *re, ViewLayer *view_layer, Depsgraph *depsgraph) { // load mesh re->i.infostr = IFACE_("Freestyle: Mesh loading"); re->stats_draw(re->sdh, &re->i); re->i.infostr = NULL; - if (controller->LoadMesh(re, view_layer)) // returns if scene cannot be loaded or if empty + if (controller->LoadMesh(re, view_layer, depsgraph)) // returns if scene cannot be loaded or if empty return; if (re->test_break(re->tbh)) return; @@ -606,12 +609,17 @@ Render *FRS_do_stroke_rendering(Render *re, ViewLayer *view_layer, int render) cout << "----------------------------------------------------------" << endl; } + /* Create depsgraph and evaluate scene. */ + ViewLayer *scene_view_layer = (ViewLayer*)BLI_findstring(&re->scene->view_layers, view_layer->name, offsetof(ViewLayer, name)); + Depsgraph *depsgraph = DEG_graph_new(re->scene, scene_view_layer, DAG_EVAL_RENDER); + BKE_scene_graph_update_tagged(depsgraph, re->main); + // prepare Freestyle: // - load mesh // - add style modules // - set parameters // - compute view map - prepare(re, view_layer); + prepare(re, view_layer, depsgraph); if (re->test_break(re->tbh)) { controller->CloseFile(); @@ -626,7 +634,7 @@ Render *FRS_do_stroke_rendering(Render *re, ViewLayer *view_layer, int render) re->i.infostr = IFACE_("Freestyle: Stroke rendering"); re->stats_draw(re->sdh, &re->i); re->i.infostr = NULL; - g_freestyle.scene = re->scene; + g_freestyle.scene = DEG_get_evaluated_scene(depsgraph); int strokeCount = controller->DrawStrokes(); if (strokeCount > 0) { freestyle_render = controller->RenderStrokes(re, true); @@ -643,6 +651,8 @@ Render *FRS_do_stroke_rendering(Render *re, ViewLayer *view_layer, int render) } } + DEG_graph_free(depsgraph); + return freestyle_render; } -- cgit v1.2.3