[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29346] trunk/blender/source/blender/ editors/object/object_relations.c: Fix #22534 linking object data for two forces results in crash.
Campbell Barton
ideasman42 at gmail.com
Wed Jun 9 08:32:07 CEST 2010
maybe there could be some macro's or functions
OB_MATERIAL_OK(ob), OB_MODIFIER_OK(ob)
in this code it looks like your could link modifiers to an armature &
camera too.
On Tue, Jun 8, 2010 at 10:24 PM, Diego Borghetti <bdiego at gmail.com> wrote:
> Revision: 29346
> http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29346
> Author: bdiego
> Date: 2010-06-08 22:24:28 +0200 (Tue, 08 Jun 2010)
>
> Log Message:
> -----------
> Fix #22534 linking object data for two forces results in crash.
>
> This is because the make_links_data_exec don't check for the
> object type like before, so try to access the obdata of an empty
> and blender crash.
>
> The solution is not the best, we have a new function
> allow_make_links_data to check if we can links data from one
> object to another.
>
> The real solution is build the menu like the 2.4x, so only
> show the options that we allow for the object type that
> we have select/active.
>
> Matt, any suggestion ?
>
> Modified Paths:
> --------------
> trunk/blender/source/blender/editors/object/object_relations.c
>
> Modified: trunk/blender/source/blender/editors/object/object_relations.c
> ===================================================================
> --- trunk/blender/source/blender/editors/object/object_relations.c 2010-06-08 17:10:52 UTC (rev 29345)
> +++ trunk/blender/source/blender/editors/object/object_relations.c 2010-06-08 20:24:28 UTC (rev 29346)
> @@ -1188,6 +1188,29 @@
> MAKE_LINKS_MODIFIERS
> };
>
> +/* Return 1 if make link data is allow, zero otherwise */
> +static int allow_make_links_data(int ev, Object *ob, Object *obt)
> +{
> + if (ev == MAKE_LINKS_OBDATA) {
> + if (ob->type == OB_MESH && obt->type == OB_MESH)
> + return(1);
> + }
> + else if (ev == MAKE_LINKS_MATERIALS) {
> + if ((ob->type == OB_MESH || ob->type == OB_CURVE || ob->type == OB_FONT || ob->type == OB_SURF || ob->type == OB_MBALL) &&
> + (obt->type == OB_MESH || obt->type == OB_CURVE || obt->type == OB_FONT || obt->type == OB_SURF || obt->type == OB_MBALL))
> + return(1);
> + }
> + else if (ev == MAKE_LINKS_ANIMDATA)
> + return(1);
> + else if (ev == MAKE_LINKS_DUPLIGROUP)
> + return(1);
> + else if (ev == MAKE_LINKS_MODIFIERS) {
> + if (ob->type != OB_EMPTY && obt->type != OB_EMPTY)
> + return(1);
> + }
> + return(0);
> +}
> +
> static int make_links_data_exec(bContext *C, wmOperator *op)
> {
> int event = RNA_int_get(op->ptr, "type");
> @@ -1199,43 +1222,45 @@
>
> CTX_DATA_BEGIN(C, Object*, obt, selected_editable_objects) {
> if(ob != obt) {
> - switch(event) {
> - case MAKE_LINKS_OBDATA: /* obdata */
> - id= obt->data;
> - id->us--;
> + if (allow_make_links_data(event, ob, obt)) {
> + switch(event) {
> + case MAKE_LINKS_OBDATA: /* obdata */
> + id= obt->data;
> + id->us--;
>
> - id= ob->data;
> - id_us_plus(id);
> - obt->data= id;
> + id= ob->data;
> + id_us_plus(id);
> + obt->data= id;
>
> - /* if amount of material indices changed: */
> - test_object_materials(obt->data);
> + /* if amount of material indices changed: */
> + test_object_materials(obt->data);
>
> - obt->recalc |= OB_RECALC_DATA;
> - break;
> - case MAKE_LINKS_MATERIALS:
> - /* new approach, using functions from kernel */
> - for(a=0; a<ob->totcol; a++) {
> - Material *ma= give_current_material(ob, a+1);
> - assign_material(obt, ma, a+1); /* also works with ma==NULL */
> + obt->recalc |= OB_RECALC_DATA;
> + break;
> + case MAKE_LINKS_MATERIALS:
> + /* new approach, using functions from kernel */
> + for(a=0; a<ob->totcol; a++) {
> + Material *ma= give_current_material(ob, a+1);
> + assign_material(obt, ma, a+1); /* also works with ma==NULL */
> + }
> + break;
> + case MAKE_LINKS_ANIMDATA:
> + BKE_copy_animdata_id((ID *)obt, (ID *)ob);
> + BKE_copy_animdata_id((ID *)obt->data, (ID *)ob->data);
> + break;
> + case MAKE_LINKS_DUPLIGROUP:
> + if(ob->dup_group) ob->dup_group->id.us--;
> + obt->dup_group= ob->dup_group;
> + if(obt->dup_group) {
> + id_us_plus((ID *)obt->dup_group);
> + obt->transflag |= OB_DUPLIGROUP;
> + }
> + break;
> + case MAKE_LINKS_MODIFIERS:
> + object_link_modifiers(obt, ob);
> + obt->recalc |= OB_RECALC;
> + break;
> }
> - break;
> - case MAKE_LINKS_ANIMDATA:
> - BKE_copy_animdata_id((ID *)obt, (ID *)ob);
> - BKE_copy_animdata_id((ID *)obt->data, (ID *)ob->data);
> - break;
> - case MAKE_LINKS_DUPLIGROUP:
> - if(ob->dup_group) ob->dup_group->id.us--;
> - obt->dup_group= ob->dup_group;
> - if(obt->dup_group) {
> - id_us_plus((ID *)obt->dup_group);
> - obt->transflag |= OB_DUPLIGROUP;
> - }
> - break;
> - case MAKE_LINKS_MODIFIERS:
> - object_link_modifiers(obt, ob);
> - obt->recalc |= OB_RECALC;
> - break;
> }
> }
> }
>
>
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>
--
- Campbell
More information about the Bf-committers
mailing list