[Bf-committers] Group freeing bug

Campbell Barton cbarton at metavr.com
Sun Mar 19 18:45:05 CET 2006


Looking at this again.
the problem is also with *rem_from_group* in group.c

So best add this into

void free_group_object(GroupObject *go)
{
    MEM_freeN(go);
}

_________ Change to,

void free_group_object(GroupObject *go)
{
    Object *ob;
    Base *base;
    ob=go->ob;
    MEM_freeN(go);
    if (ob) {
       /* check to see if the group flag needs to be changed.*/
       if (!find_group(ob)) {
           go->ob->flag &= ~OB_FROMGROUP;
           base= object_in_scene(go->ob, G.scene);
           if (base) base->flag &= ~OB_FROMGROUP;
        }
    }
}

- Cam





Campbell Barton wrote:
> Hey Ton, group freeing dosent check that the objects are still in a 
> group when it removes the object from a group.
> This causes a bug in oops unlink and Python group module. where 
> objects are flagged as in a group and drawn green.
>
> Heres a change that fixes it. does more listbase loops then Id like, 
> but its probably the best that can be done with the current 
> datastructure.
> objects keeping a count of how many groups use them could be good.
> if (ob.group_users==0)    :)
>
> Was...
> _________________________________________________
> void free_group(Group *group)
> {
>    /* don't free group itself */
>    GroupObject *go;
>      while(group->gobject.first) {
>        go= group->gobject.first;
>        BLI_remlink(&group->gobject, go);
>        free_group_object(go);
>    }
> }
>
>
>
>
> Added  a check for objects group status.
> _________________________________________________
>
>
> void free_group(Group *group)
> {
>    /* don't free group itself */
>    GroupObject *go;
>    Base *base;
>      while(group->gobject.first) {
>        go= group->gobject.first;
>        BLI_remlink(&group->gobject, go);
>        free_group_object(go);
>              /* check to see if the group flag needs to be changed.*/
>        if (!find_group(go->ob)) {
>            go->ob->flag &= ~OB_FROMGROUP;
>            base= object_in_scene(go->ob, G.scene);
>            if (base) base->flag &= ~OB_FROMGROUP;                  }
>    }
> }
> _________________________________________________
>
> Does this look okay?
>


-- 
Campbell J Barton

133 Hope Street
Geelong West, Victoria 3218 Australia

URL:    http://www.metavr.com
e-mail: cbarton at metavr.com
phone: AU (03) 5229 0241


More information about the Bf-committers mailing list