[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24760] trunk/blender/source/blender/ editors: Parenting and Deforms:

Joshua Leung aligorith at gmail.com
Sun Nov 22 13:28:39 CET 2009


Revision: 24760
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24760
Author:   aligorith
Date:     2009-11-22 13:28:38 +0100 (Sun, 22 Nov 2009)

Log Message:
-----------
Parenting and Deforms:

Parenting an object to some deformer (i.e. Armature, Curve, Lattice) now adds a new modifier if the object is deformable.

The advantages of this over setting PAR_SKEL mode are:
- instead of a hidden 'virtual' modifier, the user has direct feedback about what sort of modifier is being applied to deform
- most of the time in 2.4, whenever a virtual modifier was added, users would inevitably end up clicking "Make Real" on it

Of course, it's still possible to get 'virtual' modifiers by setting the parent type using the menu-property, but this just makes general setup easier.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/ED_object.h
    trunk/blender/source/blender/editors/object/object_hook.c
    trunk/blender/source/blender/editors/object/object_modifier.c
    trunk/blender/source/blender/editors/object/object_relations.c

Modified: trunk/blender/source/blender/editors/include/ED_object.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_object.h	2009-11-22 12:10:45 UTC (rev 24759)
+++ trunk/blender/source/blender/editors/include/ED_object.h	2009-11-22 12:28:38 UTC (rev 24760)
@@ -114,7 +114,7 @@
 void curve_to_key(struct Curve *cu, struct KeyBlock *kb, struct ListBase *nurb);
 
 /* object_modifier.c */
-int ED_object_modifier_add(struct ReportList *reports, struct Scene *scene, struct Object *ob, int type);
+struct ModifierData *ED_object_modifier_add(struct ReportList *reports, struct Scene *scene, struct Object *ob, int type);
 int ED_object_modifier_remove(struct ReportList *reports, struct Scene *scene, struct Object *ob, struct ModifierData *md);
 int ED_object_modifier_move_down(struct ReportList *reports, struct Object *ob, struct ModifierData *md);
 int ED_object_modifier_move_up(struct ReportList *reports, struct Object *ob, struct ModifierData *md);

Modified: trunk/blender/source/blender/editors/object/object_hook.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_hook.c	2009-11-22 12:10:45 UTC (rev 24759)
+++ trunk/blender/source/blender/editors/object/object_hook.c	2009-11-22 12:28:38 UTC (rev 24760)
@@ -431,7 +431,7 @@
 	
 	hmd = (HookModifierData*) modifier_new(eModifierType_Hook);
 	BLI_insertlinkbefore(&obedit->modifiers, md, hmd);
-	sprintf(hmd->modifier.name, "Hook-%s", ob->id.name+2);
+	BLI_snprintf(hmd->modifier.name, sizeof(hmd->modifier.name), "Hook-%s", ob->id.name+2);
 	modifier_unique_name(&obedit->modifiers, (ModifierData*)hmd);
 	
 	hmd->object= ob;

Modified: trunk/blender/source/blender/editors/object/object_modifier.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_modifier.c	2009-11-22 12:10:45 UTC (rev 24759)
+++ trunk/blender/source/blender/editors/object/object_modifier.c	2009-11-22 12:28:38 UTC (rev 24760)
@@ -75,7 +75,7 @@
 
 /******************************** API ****************************/
 
-int ED_object_modifier_add(ReportList *reports, Scene *scene, Object *ob, int type)
+ModifierData *ED_object_modifier_add(ReportList *reports, Scene *scene, Object *ob, int type)
 {
 	ModifierData *md=NULL, *new_md=NULL;
 	ModifierTypeInfo *mti = modifierType_getInfo(type);
@@ -83,7 +83,7 @@
 	if(mti->flags&eModifierTypeFlag_Single) {
 		if(modifiers_findByType(ob, type)) {
 			BKE_report(reports, RPT_WARNING, "Only one modifier of this type allowed.");
-			return 0;
+			return NULL;
 		}
 	}
 
@@ -131,7 +131,7 @@
 
 	DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
 
-	return 1;
+	return new_md;
 }
 
 int ED_object_modifier_remove(ReportList *reports, Scene *scene, Object *ob, ModifierData *md)

Modified: trunk/blender/source/blender/editors/object/object_relations.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_relations.c	2009-11-22 12:10:45 UTC (rev 24759)
+++ trunk/blender/source/blender/editors/object/object_relations.c	2009-11-22 12:28:38 UTC (rev 24760)
@@ -632,8 +632,6 @@
 					ob->partype= PAROBJECT;
 					what_does_parent(scene, ob, &workob);
 					
-					ob->partype= PARSKEL;
-					
 					invert_m4_m4(ob->parentinv, workob.obmat);
 				}
 				else {
@@ -646,8 +644,41 @@
 				
 				if(partype == PAR_PATH_CONST)
 					; /* don't do anything here, since this is not technically "parenting" */
-				if( ELEM(partype, PAR_CURVE, PAR_LATTICE) || pararm )
-					ob->partype= PARSKEL; /* note, dna define, not operator property */
+				else if( ELEM(partype, PAR_CURVE, PAR_LATTICE) || pararm )
+				{
+					/* partype is now set to PAROBJECT so that invisible 'virtual' modifiers don't need to be created
+					 * NOTE: the old (2.4x) method was to set ob->partype = PARSKEL, creating the virtual modifiers
+					 */
+					ob->partype= PAROBJECT;	/* note, dna define, not operator property */
+					//ob->partype= PARSKEL; /* note, dna define, not operator property */
+					
+					/* BUT, to keep the deforms, we need a modifier, and then we need to set the object that it uses */
+					// XXX currently this should only happen for meshes, curves and surfaces - this stuff isn't available for metas yet
+					if (ELEM4(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT)) 
+					{
+						switch (partype) 
+						{
+							case PAR_CURVE: /* curve deform */
+							{
+								CurveModifierData *cmd= ED_object_modifier_add(op->reports, scene, ob, eModifierType_Curve);
+								cmd->object= par;
+							}
+								break;
+							case PAR_LATTICE: /* lattice deform */
+							{
+								LatticeModifierData *lmd= ED_object_modifier_add(op->reports, scene, ob, eModifierType_Lattice);
+								lmd->object= par;
+							}
+								break;
+							default: /* armature deform */
+							{
+								ArmatureModifierData *amd= ED_object_modifier_add(op->reports, scene, ob, eModifierType_Armature);
+								amd->object= par;
+							}
+								break;
+						}
+					}
+				}
 				else if (partype == PAR_BONE)
 					ob->partype= PARBONE; /* note, dna define, not operator property */
 				else
@@ -657,7 +688,7 @@
 	}
 	CTX_DATA_END;
 	
-	DAG_scene_sort(CTX_data_scene(C));
+	DAG_scene_sort(scene);
 	ED_anim_dag_flush_update(C);
 	WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
 	





More information about the Bf-blender-cvs mailing list