<div dir="ltr">Woops, forgot to mention in commit log.<div><br></div><div style>Reviewed by Ton Roosendaal, thanks!</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Jun 11, 2013 at 5:21 PM, Sergey Sharybin <span dir="ltr"><<a href="mailto:sergey.vfx@gmail.com" target="_blank">sergey.vfx@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Revision: 57376<br>
          <a href="http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57376" target="_blank">http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57376</a><br>

Author:   nazgul<br>
Date:     2013-06-11 11:21:16 +0000 (Tue, 11 Jun 2013)<br>
Log Message:<br>
-----------<br>
Fix #35704: Simplify on scene with dupli recursion crashes<br>
<br>
Couple of issues here:<br>
<br>
- User shouldn't be able to run into dupligroup recursion.<br>
  It was checking already when setting a group for dupli.<br>
  Added check to operator which adds object to group.<br>
<br>
- It's still possible files with recursion are hanging around,<br>
  so made simplify function robust to such kind of crap.<br>
<br>
Modified Paths:<br>
--------------<br>
    trunk/blender/source/blender/editors/object/object_group.c<br>
    trunk/blender/source/blender/makesrna/intern/rna_scene.c<br>
<br>
Modified: trunk/blender/source/blender/editors/object/object_group.c<br>
===================================================================<br>
--- trunk/blender/source/blender/editors/object/object_group.c  2013-06-11 09:14:39 UTC (rev 57375)<br>
+++ trunk/blender/source/blender/editors/object/object_group.c  2013-06-11 11:21:16 UTC (rev 57376)<br>
@@ -42,6 +42,7 @@<br>
 #include "BKE_context.h"<br>
 #include "BKE_depsgraph.h"<br>
 #include "BKE_group.h"<br>
+#include "BKE_library.h"<br>
 #include "BKE_main.h"<br>
 #include "BKE_report.h"<br>
 #include "BKE_object.h"<br>
@@ -377,8 +378,50 @@<br>
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;<br>
 }<br>
<br>
+static bool group_link_early_exit_check(Group *group, Object *object)<br>
+{<br>
+       GroupObject *group_object;<br>
+<br>
+       for (group_object = group->gobject.first; group_object; group_object = group_object->next) {<br>
+               if (group_object->ob == object) {<br>
+                       return true;<br>
+               }<br>
+       }<br>
+<br>
+       return false;<br>
+}<br>
+<br>
+static bool check_group_contains_object_recursive(Group *group, Object *object)<br>
+{<br>
+       GroupObject *group_object;<br>
+<br>
+       if ((group->id.flag & LIB_DOIT) == 0) {<br>
+               /* Cycle already exists in groups, let's prevent further crappyness */<br>
+               return true;<br>
+       }<br>
+<br>
+       group->id.flag &= ~LIB_DOIT;<br>
+<br>
+       for (group_object = group->gobject.first; group_object; group_object = group_object->next) {<br>
+               Object *current_object = group_object->ob;<br>
+<br>
+               if (current_object == object) {<br>
+                       return true;<br>
+               }<br>
+<br>
+               if (current_object->dup_group) {<br>
+                       if (check_group_contains_object_recursive(current_object->dup_group, object)) {<br>
+                               return true;<br>
+                       }<br>
+               }<br>
+       }<br>
+<br>
+       return false;<br>
+}<br>
+<br>
 static int group_link_exec(bContext *C, wmOperator *op)<br>
 {<br>
+       Main *bmain = CTX_data_main(C);<br>
        Scene *scene = CTX_data_scene(C);<br>
        Object *ob = ED_object_context(C);<br>
        Group *group = BLI_findlink(&CTX_data_main(C)->group, RNA_enum_get(op->ptr, "group"));<br>
@@ -386,6 +429,25 @@<br>
        if (ELEM(NULL, ob, group))<br>
                return OPERATOR_CANCELLED;<br>
<br>
+       /* Early return check, if the object is already in group<br>
+        * we could sckip all the dependency check and just consider<br>
+        * operator is finished.<br>
+        */<br>
+       if (group_link_early_exit_check(group, ob)) {<br>
+               return OPERATOR_FINISHED;<br>
+       }<br>
+<br>
+       /* Adding object to group which is used as dupligroup for self is bad idea.<br>
+        *<br>
+        * It is also  bad idea to add object to group which is in group which<br>
+        * contains our current object.<br>
+        */<br>
+       tag_main_lb(&bmain->group, TRUE);<br>
+       if (ob->dup_group == group || check_group_contains_object_recursive(group, ob)) {<br>
+               BKE_report(op->reports, RPT_ERROR, "Could not add the group because of dependency cycle detected");<br>
+               return OPERATOR_CANCELLED;<br>
+       }<br>
+<br>
        BKE_group_object_add(group, ob, scene, NULL);<br>
<br>
        WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);<br>
<br>
Modified: trunk/blender/source/blender/makesrna/intern/rna_scene.c<br>
===================================================================<br>
--- trunk/blender/source/blender/makesrna/intern/rna_scene.c    2013-06-11 09:14:39 UTC (rev 57375)<br>
+++ trunk/blender/source/blender/makesrna/intern/rna_scene.c    2013-06-11 11:21:16 UTC (rev 57376)<br>
@@ -1255,6 +1255,12 @@<br>
        ModifierData *md;<br>
        ParticleSystem *psys;<br>
<br>
+       if ((ob->id.flag & LIB_DOIT) == 0) {<br>
+               return;<br>
+       }<br>
+<br>
+       ob->id.flag &= ~LIB_DOIT;<br>
+<br>
        for (md = ob->modifiers.first; md; md = md->next) {<br>
                if (ELEM3(md->type, eModifierType_Subsurf, eModifierType_Multires, eModifierType_ParticleSystem)) {<br>
                        ob->recalc |= PSYS_RECALC_CHILD;<br>
@@ -1279,6 +1285,7 @@<br>
        Scene *sce_iter;<br>
        Base *base;<br>
<br>
+       tag_main_lb(&bmain->object, TRUE);<br>
        for (SETLOOPER(sce, sce_iter, base))<br>
                object_simplify_update(base->object);<br>
<br>
<br>
_______________________________________________<br>
Bf-blender-cvs mailing list<br>
<a href="mailto:Bf-blender-cvs@blender.org">Bf-blender-cvs@blender.org</a><br>
<a href="http://lists.blender.org/mailman/listinfo/bf-blender-cvs" target="_blank">http://lists.blender.org/mailman/listinfo/bf-blender-cvs</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div><span style="color:rgb(102,102,102)">With best regards, Sergey Sharybin</span></div>
</div>