Commit: 6bac7c35e8bbed490d5db1af7758516eca0e919c
Author: Sergey Sharybin
Date:   Thu Feb 22 10:47:40 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB6bac7c35e8bbed490d5db1af7758516eca0e919c

Merge branch 'master' into blender2.8

===================================================================



===================================================================

diff --cc source/blender/depsgraph/intern/depsgraph_build.cc
index 377f2d3b4c5,1b270e71d64..c7f53b51374
--- a/source/blender/depsgraph/intern/depsgraph_build.cc
+++ b/source/blender/depsgraph/intern/depsgraph_build.cc
@@@ -32,16 -32,11 +32,12 @@@
  
  #include "MEM_guardedalloc.h"
  
- // #define DEBUG_TIME
- 
  #include "BLI_utildefines.h"
  #include "BLI_ghash.h"
 +#include "BLI_listbase.h"
  
- #ifdef DEBUG_TIME
- #  include "PIL_time.h"
- #  include "PIL_time_utildefines.h"
- #endif
+ #include "PIL_time.h"
+ #include "PIL_time_utildefines.h"
  
  extern "C" {
  #include "DNA_cachefile_types.h"
@@@ -194,28 -188,20 +190,29 @@@ void DEG_add_special_eval_flag(Depsgrap
  /* ******************** */
  /* Graph Building API's */
  
 -/* Build depsgraph for the given scene, and dump results in given
 +/* Build depsgraph for the given scene layer, and dump results in given
   * graph container.
   */
 -/* XXX: assume that this is called from outside, given the current scene as
 - * the "main" scene.
 - */
 -void DEG_graph_build_from_scene(Depsgraph *graph, Main *bmain, Scene *scene)
 +void DEG_graph_build_from_view_layer(Depsgraph *graph,
 +                                      Main *bmain,
 +                                      Scene *scene,
 +                                      ViewLayer *view_layer)
  {
- #ifdef DEBUG_TIME
-       TIMEIT_START(DEG_graph_build_from_view_layer);
- #endif
+       double start_time;
+       if (G.debug & G_DEBUG_DEPSGRAPH_BUILD) {
+               start_time = PIL_check_seconds_timer();
+       }
  
        DEG::Depsgraph *deg_graph = reinterpret_cast<DEG::Depsgraph *>(graph);
 +      BLI_assert(BLI_findindex(&scene->view_layers, view_layer) != -1);
 +
 +      /* TODO(sergey): This is a bit tricky, but ensures that all the data
 +       * is evaluated properly when depsgraph is becoming "visible".
 +       *
 +       * This now could happen for both visible scene is changed and extra
 +       * dependency graph was created for render engine.
 +       */
 +      const bool need_on_visible_update = (deg_graph->id_nodes.size() == 0);
  
        /* 1) Generate all the nodes in the graph first */
        DEG::DepsgraphNodeBuilder node_builder(bmain, deg_graph);
@@@ -257,16 -237,10 +254,17 @@@
        }
  #endif
  
- #ifdef DEBUG_TIME
-       TIMEIT_END(DEG_graph_build_from_view_layer);
- #endif
- 
 +      /* Relations are up to date. */
 +      deg_graph->need_update = false;
 +
 +      if (need_on_visible_update) {
 +              DEG_graph_on_visible_update(bmain, graph);
 +      }
++
+       if (G.debug & G_DEBUG_DEPSGRAPH_BUILD) {
+               printf("Depsgraph built in %f seconds.\n",
+                      PIL_check_seconds_timer() - start_time);
+       }
  }
  
  /* Tag graph relations for update. */
@@@ -287,23 -280,34 +285,23 @@@ void DEG_graph_relations_update(Depsgra
                /* Graph is up to date, nothing to do. */
                return;
        }
 -
 -      /* Clear all previous nodes and operations. */
 -      graph->clear_all_nodes();
 -      graph->operations.clear();
 -      BLI_gset_clear(graph->entry_tags, NULL);
 -
 -      /* Build new nodes and relations. */
 -      DEG_graph_build_from_scene(reinterpret_cast< ::Depsgraph * >(graph),
 -                                 bmain,
 -                                 scene);
 -
 -      graph->need_update = false;
 -}
 -
 -/* Rebuild dependency graph only for a given scene. */
 -void DEG_scene_relations_rebuild(Main *bmain, Scene *scene)
 -{
 -      if (scene->depsgraph != NULL) {
 -              DEG_graph_tag_relations_update(scene->depsgraph);
 -      }
 -      DEG_scene_relations_update(bmain, scene);
 +      DEG_graph_build_from_view_layer(graph, bmain, scene, view_layer);
  }
  
 -void DEG_scene_graph_free(Scene *scene)
 +/* Tag all relations for update. */
 +void DEG_relations_tag_update(Main *bmain)
  {
-       DEG_DEBUG_PRINTF("%s: Tagging relations for update.\n", __func__);
 -      if (scene->depsgraph) {
 -              DEG_graph_free(scene->depsgraph);
 -              scene->depsgraph = NULL;
++      DEG_DEBUG_PRINTF(TAG, "%s: Tagging relations for update.\n", __func__);
 +      LISTBASE_FOREACH (Scene *, scene, &bmain->scene) {
 +              LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) 
{
 +                      Depsgraph *depsgraph =
 +                              (Depsgraph *)BKE_scene_get_depsgraph(scene,
 +                                                                   view_layer,
 +                                                                   false);
 +                      if (depsgraph != NULL) {
 +                              DEG_graph_tag_relations_update(depsgraph);
 +                      }
 +              }
        }
  }
  
@@@ -340,43 -345,40 +338,39 @@@ void DEG_add_forcefield_relations(DepsN
                                    int skip_forcefield,
                                    const char *name)
  {
 -      ListBase *effectors = pdInitEffectors(scene, object, NULL, 
effector_weights, false);
 +      ListBase *effectors = pdInitEffectors(NULL, scene, object, NULL, 
effector_weights, false);
- 
-       if (effectors) {
-               for (EffectorCache *eff = (EffectorCache*)effectors->first; 
eff; eff = eff->next) {
-                       if (eff->ob != object && eff->pd->forcefield != 
skip_forcefield) {
-                               DEG_add_object_relation(handle, eff->ob, 
DEG_OB_COMP_TRANSFORM, name);
- 
-                               if (eff->psys) {
-                                       DEG_add_object_relation(handle, 
eff->ob, DEG_OB_COMP_EVAL_PARTICLES, name);
- 
-                                       /* TODO: remove this when/if 
EVAL_PARTICLES is sufficient
-                                        * for up to date particles.
-                                        */
-                                       DEG_add_object_relation(handle, 
eff->ob, DEG_OB_COMP_GEOMETRY, name);
-                               }
- 
-                               if (eff->pd->forcefield == PFIELD_SMOKEFLOW && 
eff->pd->f_source) {
-                                       DEG_add_object_relation(handle,
-                                                               
eff->pd->f_source,
-                                                               
DEG_OB_COMP_TRANSFORM,
-                                                               "Smoke Force 
Domain");
-                                       DEG_add_object_relation(handle,
-                                                               
eff->pd->f_source,
-                                                               
DEG_OB_COMP_GEOMETRY,
-                                                               "Smoke Force 
Domain");
-                               }
- 
-                               if (add_absorption && (eff->pd->flag & 
PFIELD_VISIBILITY)) {
-                                       DEG_add_collision_relations(handle,
-                                                                   scene,
-                                                                   object,
-                                                                   NULL,
-                                                                   
eModifierType_Collision,
-                                                                   NULL,
-                                                                   true,
-                                                                   "Force 
Absorption");
-                               }
+       if (effectors == NULL) {
+               return;
+       }
+       for (EffectorCache *eff = (EffectorCache*)effectors->first; eff; eff = 
eff->next) {
+               if (eff->ob != object && eff->pd->forcefield != 
skip_forcefield) {
+                       DEG_add_object_relation(handle, eff->ob, 
DEG_OB_COMP_TRANSFORM, name);
+                       if (eff->psys) {
+                               DEG_add_object_relation(handle, eff->ob, 
DEG_OB_COMP_EVAL_PARTICLES, name);
+                               /* TODO: remove this when/if EVAL_PARTICLES is 
sufficient
+                                * for up to date particles.
+                                */
+                               DEG_add_object_relation(handle, eff->ob, 
DEG_OB_COMP_GEOMETRY, name);
+                       }
+                       if (eff->pd->forcefield == PFIELD_SMOKEFLOW && 
eff->pd->f_source) {
+                               DEG_add_object_relation(handle,
+                                                       eff->pd->f_source,
+                                                       DEG_OB_COMP_TRANSFORM,
+                                                       "Smoke Force Domain");
+                               DEG_add_object_relation(handle,
+                                                       eff->pd->f_source,
+                                                       DEG_OB_COMP_GEOMETRY,
+                                                       "Smoke Force Domain");
+                       }
+                       if (add_absorption && (eff->pd->flag & 
PFIELD_VISIBILITY)) {
+                               DEG_add_collision_relations(handle,
+                                                           scene,
+                                                           object,
+                                                           NULL,
 -                                                          eff->ob->lay,
+                                                           
eModifierType_Collision,
+                                                           NULL,
+                                                           true,
+                                                           "Force Absorption");
                        }
                }
        }
diff --cc source/blender/depsgraph/intern/depsgraph_intern.h
index 256b52a78f3,2ac97c53db7..e310608b25e
--- a/source/blender/depsgraph/intern/depsgraph_intern.h
+++ b/source/blender/depsgraph/intern/depsgraph_intern.h
@@@ -106,24 -105,15 +106,23 @@@ DepsNodeFactory *deg_type_get_factory(c
  
  /* Editors Integration -------------------------------------------------- */
  
 -void deg_editors_id_update(struct Main *bmain, struct ID *id);
 +void deg_editors_id_update(const DEGEditorUpdateContext *update_ctx,
 +                           struct ID *id);
  
 -void deg_editors_scene_update(struct Main *bmain, struct Scene *scene, bool 
updated);
 +void deg_editors_scene_update(const DEGEditorUpdateContext *update_ctx,
 +                              bool updated);
  
- #define DEG_DEBUG_PRINTF(...)               \
-       do {                                    \
-               if (G.debug & G_DEBUG_DEPSGRAPH_BUILD) {  \
-                       fprintf(stderr, __VA_ARGS__);   \
-                       fflush(stderr);                 \
-               }                                   \
+ #define DEG_DEBUG_PRINTF(type, ...) \
+       do { \
+               if (G.debug & G_DEBUG_DEPSGRAPH_ ## type) { \
+                       fprintf(stderr, __VA_ARGS__); \
+               } \
        } while (0)
  
 +#define DEG_ERROR_PRINTF(...)               \
 +      do {                                    \
 +              fprintf(stderr, __VA_ARGS__);       \
 +              fflush(stderr);                     \
 +      } while (0)
 +
  }  // namespace DEG
diff --cc source/blender/depsgraph/intern/eval/deg_eval_flush.cc
index b4e1c2f4e1a,4033e1325e6..8be8a4b31ba
--- a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
@@@ -228,34 -244,12 +228,34 @@@ void flush_editors_id_update(Main *bmai
                if (id_node->done != ID_STATE_MODIFIED) {
                        continue;
                }
 +              DEG_id_type_tag(bmain, GS(id_node->id_orig->name));
                /* TODO(sergey): Do we need to pass original or evaluated ID 
here? */
 -              ID *id = id_node->id;
 -              deg_editors_id_update(bmain, id);
 -              lib_id_recalc_tag(bmain, id);
 -              /* TODO(sergey): For until we've got proper data nodes in the 
graph. */
 -              lib_id_recalc_data_tag(bmain, id);
 +              ID *id_orig = id_node->id_orig;
 +              ID *id_cow = id_node->id_cow;
 +              /* Copy tag from original data to CoW storage.
 +               * This is because DEG_id_tag_update() sets tags on original
 +               * data.
 +               */
 +              id_cow->recalc |= (id_orig->recalc & ID_RECALC_ALL);
 +              /* Gather recalc flags from all changed components. */
 +              GHASH_FOREACH_BEGIN(ComponentDepsNode *, comp_node, 
id_node->components)
 +              {
 +                      if (comp_node->done != COMPONE

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to