<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>