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
path: root/source
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2019-01-24 09:08:19 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2019-01-24 18:46:11 +0300
commit820d1b249df239b8ec1161ea3fb3f99fb62c9f49 (patch)
treecdd36f3ae22a6b36b12bf8c49a21f1a61ef0860a /source
parent28b1bbeb92a9e11cc067444b9ce4318ffa421977 (diff)
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.
Diffstat (limited to 'source')
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc9
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc6
-rw-r--r--source/blender/freestyle/intern/application/Controller.cpp4
-rw-r--r--source/blender/freestyle/intern/application/Controller.h2
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp15
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h4
-rw-r--r--source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp18
-rw-r--r--source/blender/render/intern/source/pipeline.c14
8 files changed, 45 insertions, 27 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc
index ce3b2538274..04cb8d12a0c 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc
@@ -42,8 +42,9 @@
#include "BLI_string.h"
extern "C" {
-#include "DNA_node_types.h"
+#include "DNA_freestyle_types.h"
#include "DNA_layer_types.h"
+#include "DNA_node_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
@@ -155,6 +156,12 @@ void DepsgraphNodeBuilder::build_view_layer(
if (view_layer->mat_override != NULL) {
build_material(view_layer->mat_override);
}
+ /* Freestyle collections. */
+ LISTBASE_FOREACH (FreestyleLineSet *, fls, &view_layer->freestyle_config.linesets) {
+ if (fls->group != NULL) {
+ build_collection(NULL, fls->group);
+ }
+ }
/* Collections. */
add_operation_node(&scene->id,
DEG_NODE_TYPE_LAYER_COLLECTIONS,
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc
index f77d47874a2..200ac4531c6 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc
@@ -136,6 +136,12 @@ void DepsgraphRelationBuilder::build_view_layer(Scene *scene, ViewLayer *view_la
if (view_layer->mat_override != NULL) {
build_material(view_layer->mat_override);
}
+ /* Freestyle collections. */
+ LISTBASE_FOREACH (FreestyleLineSet *, fls, &view_layer->freestyle_config.linesets) {
+ if (fls->group != NULL) {
+ build_collection(NULL, NULL, fls->group);
+ }
+ }
/* Build all set scenes. */
if (scene->set != NULL) {
ViewLayer *set_view_layer = BKE_view_layer_default_render(scene->set);
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;
}
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 35c85bb3292..8b815539d22 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -1335,19 +1335,21 @@ static void add_freestyle(Render *re, int render)
/* releases temporary scenes and renders for Freestyle stroke rendering */
static void free_all_freestyle_renders(void)
{
- Render *re1, *freestyle_render;
- Scene *freestyle_scene;
+ Render *re1;
LinkData *link;
for (re1= RenderGlobal.renderlist.first; re1; re1= re1->next) {
for (link = (LinkData *)re1->freestyle_renders.first; link; link = link->next) {
- freestyle_render = (Render *)link->data;
+ Render *freestyle_render = (Render *)link->data;
if (freestyle_render) {
- freestyle_scene = freestyle_render->scene;
+ Scene *freestyle_scene = freestyle_render->scene;
RE_FreeRender(freestyle_render);
- BKE_libblock_unlink(re1->freestyle_bmain, freestyle_scene, false, false);
- BKE_id_free(re1->freestyle_bmain, freestyle_scene);
+
+ 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);