Commit: c6a06692fea970304802e2dd4563b74ce68ce9e4
Author: Sergey Sharybin
Date:   Fri Jan 2 17:37:01 2015 +0500
Branches: depsgraph_refactor
https://developer.blender.org/rBc6a06692fea970304802e2dd4563b74ce68ce9e4

Depsgraph: Fix some stupid issues

- Adding empty would crash.
  This is because of missing ob->data NULL check in id type tagging.

- Fixed wrong assert statements in graph rebuild.

- Silenced error about using char for array indices.
  Not sure why it's needed since chars are unsigned in blender any
  way. Could be some mismatch in C++/C flags, need to investigate
  further.

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

M       source/blender/depsgraph/intern/depsgraph_build.cpp
M       source/blender/depsgraph/intern/depsgraph_query.cpp
M       source/blender/depsgraph/intern/depsgraph_tag.cpp

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

diff --git a/source/blender/depsgraph/intern/depsgraph_build.cpp 
b/source/blender/depsgraph/intern/depsgraph_build.cpp
index 338bb58..764e6cf 100644
--- a/source/blender/depsgraph/intern/depsgraph_build.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_build.cpp
@@ -632,10 +632,12 @@ void DEG_scene_relations_update(Main *bmain, Scene *scene)
 /* Rebuild dependency graph only for a given scene. */
 void DEG_scene_relations_rebuild(Main *bmain, Scene *scene)
 {
-       BLI_assert(graph->entry_tags.size() == NULL);
-       BLI_assert(graph->id_tags.size() == NULL);
-       DEG_graph_free(scene->depsgraph);
-       scene->depsgraph = NULL;
+       if (scene->depsgraph != NULL) {
+               BLI_assert(scene->depsgraph->entry_tags.size() == 0);
+               BLI_assert(scene->depsgraph->id_tags.size() == 0);
+               DEG_graph_free(scene->depsgraph);
+               scene->depsgraph = NULL;
+       }
        DEG_scene_relations_update(bmain, scene);
 }
 
diff --git a/source/blender/depsgraph/intern/depsgraph_query.cpp 
b/source/blender/depsgraph/intern/depsgraph_query.cpp
index 68443a9..41dbcc1 100644
--- a/source/blender/depsgraph/intern/depsgraph_query.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_query.cpp
@@ -205,5 +205,5 @@ DepsNode *DEG_copy_node(DepsgraphCopyContext *dcc, const 
DepsNode *src)
 
 bool DEG_id_type_tagged(Main *bmain, short idtype)
 {
-       return bmain->id_tag_update[((char *)&idtype)[0]] != 0;
+       return bmain->id_tag_update[((unsigned char *)&idtype)[0]] != 0;
 }
diff --git a/source/blender/depsgraph/intern/depsgraph_tag.cpp 
b/source/blender/depsgraph/intern/depsgraph_tag.cpp
index 6dc34f9..5be80a4 100644
--- a/source/blender/depsgraph/intern/depsgraph_tag.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_tag.cpp
@@ -150,9 +150,11 @@ void DEG_id_tag_update_ex(Main *bmain, ID *id, short flag)
                if (scene->depsgraph) {
                        if (flag & OB_RECALC_DATA && GS(id->name) == ID_OB) {
                                Object *object = (Object*)id;
-                               DEG_graph_id_tag_update(bmain,
-                                                       scene->depsgraph,
-                                                       (ID*)object->data);
+                               if (object->data != NULL) {
+                                       DEG_graph_id_tag_update(bmain,
+                                                               
scene->depsgraph,
+                                                               
(ID*)object->data);
+                               }
                        }
                        DEG_graph_id_tag_update(bmain, scene->depsgraph, id);
                }
@@ -175,7 +177,7 @@ void DEG_id_type_tag(Main *bmain, short idtype)
        /* We tag based on first ID type character to avoid
         * looping over all ID's in case there are no tags.
         */
-       bmain->id_tag_update[((char *)&idtype)[0]] = 1;
+       bmain->id_tag_update[((unsigned char *)&idtype)[0]] = 1;
 }
 
 /* Update Flushing ---------------------------------- */
@@ -336,7 +338,7 @@ void DEG_ids_check_recalc(Main *bmain, Scene *scene, bool 
time)
                /* We tag based on first ID type character to avoid
                 * looping over all ID's in case there are no tags.
                 */
-               if (id && bmain->id_tag_update[id->name[0]]) {
+               if (id && bmain->id_tag_update[(unsigned char)id->name[0]]) {
                        updated = true;
                        break;
                }
@@ -364,7 +366,7 @@ void DEG_ids_clear_recalc(Main *bmain)
                /* We tag based on first ID type character to avoid
                 * looping over all ID's in case there are no tags.
                 */
-               if (id && bmain->id_tag_update[id->name[0]]) {
+               if (id && bmain->id_tag_update[(unsigned char)id->name[0]]) {
                        for (; id; id = (ID *)id->next) {
                                id->flag &= ~(LIB_ID_RECALC | 
LIB_ID_RECALC_DATA);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to