[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25581] trunk/blender/source/blender: Mesh Animation + Depsgraph Tweaks:

Joshua Leung aligorith at gmail.com
Mon Dec 28 01:52:31 CET 2009


Revision: 25581
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25581
Author:   aligorith
Date:     2009-12-28 01:52:31 +0100 (Mon, 28 Dec 2009)

Log Message:
-----------
Mesh Animation + Depsgraph Tweaks:

* Mesh data/settings can now be animated. It is not recommended that geometry be animated directly, but other settings such as autosmooth, etc. can be...

* Code cleanups for depsgraph, making sure that drivers get included for all object data types.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/anim_sys.c
    trunk/blender/source/blender/blenkernel/intern/depsgraph.c
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/editors/animation/anim_channels_defines.c
    trunk/blender/source/blender/editors/animation/anim_channels_edit.c
    trunk/blender/source/blender/editors/animation/anim_filter.c
    trunk/blender/source/blender/editors/animation/keyframes_draw.c
    trunk/blender/source/blender/editors/animation/keyframes_edit.c
    trunk/blender/source/blender/editors/include/ED_anim_api.h
    trunk/blender/source/blender/makesdna/DNA_action_types.h
    trunk/blender/source/blender/makesdna/DNA_mesh_types.h
    trunk/blender/source/blender/makesrna/intern/rna_mesh.c

Modified: trunk/blender/source/blender/blenkernel/intern/anim_sys.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/anim_sys.c	2009-12-28 00:07:24 UTC (rev 25580)
+++ trunk/blender/source/blender/blenkernel/intern/anim_sys.c	2009-12-28 00:52:31 UTC (rev 25581)
@@ -72,7 +72,7 @@
 	switch (GS(id->name)) {
 			/* has AnimData */
 		case ID_OB:
-		case ID_MB: case ID_CU: case ID_AR:
+		case ID_ME: case ID_MB: case ID_CU: case ID_AR:
 		case ID_KE:
 		case ID_PA:
 		case ID_MA: case ID_TE: case ID_NT:
@@ -1774,7 +1774,7 @@
 	EVAL_ANIM_IDS(main->armature.first, ADT_RECALC_ANIM);
 	
 	/* meshes */
-	// TODO...
+	EVAL_ANIM_IDS(main->mesh.first, ADT_RECALC_ANIM);
 	
 	/* particles */
 	EVAL_ANIM_IDS(main->particle.first, ADT_RECALC_ANIM);

Modified: trunk/blender/source/blender/blenkernel/intern/depsgraph.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/depsgraph.c	2009-12-28 00:07:24 UTC (rev 25580)
+++ trunk/blender/source/blender/blenkernel/intern/depsgraph.c	2009-12-28 00:52:31 UTC (rev 25581)
@@ -491,22 +491,6 @@
 		/* inverted relation, so addtoroot shouldn't be set to zero */
 	}
 	
-
-	if (ob->type==OB_CAMERA) {
-		Camera *cam = (Camera *)ob->data;
-		if (cam->adt)
-			dag_add_driver_relation(cam->adt, dag, node, 1);
-		if (cam->dof_ob) {
-			node2 = dag_get_node(dag, cam->dof_ob);
-			dag_add_relation(dag,node2,node,DAG_RL_OB_OB, "Camera DoF");
-		}
-	}
-	if (ob->type==OB_LAMP) {
-		Lamp *la = (Lamp *)ob->data;
-		if (la->adt)
-			dag_add_driver_relation(la->adt, dag, node, 1);
-	}
-	
 	if (ob->transflag & OB_DUPLI) {
 		if((ob->transflag & OB_DUPLIGROUP) && ob->dup_group) {
 			GroupObject *go;
@@ -521,38 +505,67 @@
 	}
     
 	/* softbody collision  */
-	if((ob->type==OB_MESH) || (ob->type==OB_CURVE) || (ob->type==OB_LATTICE))
+	if ((ob->type==OB_MESH) || (ob->type==OB_CURVE) || (ob->type==OB_LATTICE)) {
 		if(modifiers_isSoftbodyEnabled(ob) || modifiers_isClothEnabled(ob) || ob->particlesystem.first)
 			dag_add_collision_field_relation(dag, scene, ob, node); /* TODO: use effectorweight->group */
-		
-	if (ob->type==OB_MBALL) {
-		Object *mom= find_basis_mball(scene, ob);
-		if(mom!=ob) {
-			node2 = dag_get_node(dag, mom);
-			dag_add_relation(dag,node,node2,DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Metaball");  // mom depends on children!
-		}
 	}
-	else if (ob->type==OB_CURVE) {
-		Curve *cu= ob->data;
-		if(cu->bevobj) {
-			node2 = dag_get_node(dag, cu->bevobj);
-			dag_add_relation(dag,node2,node,DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Curve Bevel");
+	
+	/* object data drivers */
+	if (ob->data) {
+		AnimData *adt= BKE_animdata_from_id((ID *)ob->data);
+		if (adt)
+			dag_add_driver_relation(adt, dag, node, 1);
+	}
+	
+	/* object type/data relationships */
+	switch (ob->type) {
+		case OB_CAMERA:
+		{
+			Camera *cam = (Camera *)ob->data;
+			
+			if (cam->dof_ob) {
+				node2 = dag_get_node(dag, cam->dof_ob);
+				dag_add_relation(dag,node2,node,DAG_RL_OB_OB, "Camera DoF");
+			}
 		}
-		if(cu->taperobj) {
-			node2 = dag_get_node(dag, cu->taperobj);
-			dag_add_relation(dag,node2,node,DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Curve Taper");
+			break;
+		case OB_MBALL: 
+		{
+			Object *mom= find_basis_mball(scene, ob);
+			
+			if(mom!=ob) {
+				node2 = dag_get_node(dag, mom);
+				dag_add_relation(dag,node,node2,DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Metaball");  // mom depends on children!
+			}
 		}
-		if (cu->adt)
-			dag_add_driver_relation(cu->adt, dag, node, 1);
-	}
-	else if(ob->type==OB_FONT) {
-		Curve *cu= ob->data;
-		if(cu->textoncurve) {
-			node2 = dag_get_node(dag, cu->textoncurve);
-			dag_add_relation(dag,node2,node,DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Texture On Curve");
+			break;
+		case OB_CURVE:
+		{
+			Curve *cu= ob->data;
+			
+			if(cu->bevobj) {
+				node2 = dag_get_node(dag, cu->bevobj);
+				dag_add_relation(dag,node2,node,DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Curve Bevel");
+			}
+			if(cu->taperobj) {
+				node2 = dag_get_node(dag, cu->taperobj);
+				dag_add_relation(dag,node2,node,DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Curve Taper");
+			}
 		}
+			break;
+		case OB_FONT: 
+		{
+			Curve *cu= ob->data;
+			
+			if(cu->textoncurve) {
+				node2 = dag_get_node(dag, cu->textoncurve);
+				dag_add_relation(dag,node2,node,DAG_RL_DATA_DATA|DAG_RL_OB_DATA, "Texture On Curve");
+			}
+		}
+			break;
 	}
 	
+	/* particles */
 	psys= ob->particlesystem.first;
 	if(psys) {
 		GroupObject *go;
@@ -624,6 +637,7 @@
 		}
 	}
 	
+	/* object constraints */
 	for (con = ob->constraints.first; con; con=con->next) {
 		bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
 		ListBase targets = {NULL, NULL};

Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c	2009-12-28 00:07:24 UTC (rev 25580)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c	2009-12-28 00:52:31 UTC (rev 25581)
@@ -143,7 +143,12 @@
 	CustomData_free(&me->vdata, me->totvert);
 	CustomData_free(&me->edata, me->totedge);
 	CustomData_free(&me->fdata, me->totface);
-
+	
+	if(me->adt) {
+		BKE_free_animdata(&me->id);
+		me->adt= NULL;
+	}
+	
 	if(me->mat) MEM_freeN(me->mat);
 	
 	if(me->bb) MEM_freeN(me->bb);

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c	2009-12-28 00:07:24 UTC (rev 25580)
+++ trunk/blender/source/blender/blenkernel/intern/object.c	2009-12-28 00:52:31 UTC (rev 25581)
@@ -2396,7 +2396,11 @@
 			/* includes all keys and modifiers */
 			if(ob->type==OB_MESH) {
 				EditMesh *em = BKE_mesh_get_editmesh(ob->data);
-
+				
+				/* evaluate drivers */
+				// XXX: should we push this to derivedmesh instead?
+				BKE_animsys_evaluate_animdata(data_id, adt, ctime, ADT_RECALC_DRIVERS);
+				
 					// here was vieweditdatamask? XXX
 				if(ob->mode & OB_MODE_EDIT) {
 					makeDerivedMesh(scene, ob, em, CD_MASK_BAREMESH);

Modified: trunk/blender/source/blender/editors/animation/anim_channels_defines.c
===================================================================
--- trunk/blender/source/blender/editors/animation/anim_channels_defines.c	2009-12-28 00:07:24 UTC (rev 25580)
+++ trunk/blender/source/blender/editors/animation/anim_channels_defines.c	2009-12-28 00:52:31 UTC (rev 25581)
@@ -53,6 +53,7 @@
 #include "DNA_constraint_types.h"
 #include "DNA_key_types.h"
 #include "DNA_lamp_types.h"
+#include "DNA_mesh_types.h"
 #include "DNA_material_types.h"
 #include "DNA_meta_types.h"
 #include "DNA_node_types.h"
@@ -1820,7 +1821,79 @@
 	acf_dsntree_setting_ptr					/* pointer for setting */
 };
 
+/* Mesh Expander  ------------------------------------------- */
 
+// TODO: just get this from RNA?
+static int acf_dsmesh_icon(bAnimListElem *ale)
+{
+	return ICON_MESH_DATA;
+}
+
+/* get the appropriate flag(s) for the setting when it is valid  */
+static int acf_dsmesh_setting_flag(int setting, short *neg)
+{
+	/* clear extra return data first */
+	*neg= 0;
+	
+	switch (setting) {
+		case ACHANNEL_SETTING_EXPAND: /* expanded */
+			return ME_DS_EXPAND;
+			
+		case ACHANNEL_SETTING_MUTE: /* mute (only in NLA) */
+			return ADT_NLA_EVAL_OFF;
+			
+		case ACHANNEL_SETTING_VISIBLE: /* visible (only in Graph Editor) */
+			*neg= 1;
+			return ADT_CURVES_NOT_VISIBLE;
+			
+		case ACHANNEL_SETTING_SELECT: /* selected */
+			return ADT_UI_SELECTED;
+			
+		default: /* unsupported */
+			return 0;
+	}
+}
+
+/* get pointer to the setting */
+static void *acf_dsmesh_setting_ptr(bAnimListElem *ale, int setting, short *type)
+{
+	Mesh *me= (Mesh *)ale->data;
+	
+	/* clear extra return data first */
+	*type= 0;
+	
+	switch (setting) {
+		case ACHANNEL_SETTING_EXPAND: /* expanded */
+			GET_ACF_FLAG_PTR(me->flag);
+			
+		case ACHANNEL_SETTING_SELECT: /* selected */
+		case ACHANNEL_SETTING_MUTE: /* muted (for NLA only) */
+		case ACHANNEL_SETTING_VISIBLE: /* visible (for Graph Editor only) */
+			if (me->adt)
+				GET_ACF_FLAG_PTR(me->adt->flag)
+				else
+					return NULL;
+			
+		default: /* unsupported */
+			return NULL;
+	}
+}
+
+/* node tree expander type define */
+static bAnimChannelType ACF_DSMESH= 
+{
+	acf_generic_dataexpand_backdrop,/* backdrop */
+	acf_generic_indention_1,		/* indent level */		// XXX this only works for compositing
+	acf_generic_basic_offset,		/* offset */
+	
+	acf_generic_idblock_name,		/* name */
+	acf_dsmesh_icon,				/* icon */
+	
+	acf_generic_dataexpand_setting_valid,	/* has setting */
+	acf_dsmesh_setting_flag,				/* flag for setting */
+	acf_dsmesh_setting_ptr					/* pointer for setting */
+};
+
 /* ShapeKey Entry  ------------------------------------------- */
 
 /* name for ShapeKey */
@@ -2071,6 +2144,7 @@
 		animchannelTypeInfo[type++]= &ACF_DSPART;		/* Particle Channel */
 		animchannelTypeInfo[type++]= &ACF_DSMBALL;		/* MetaBall Channel */
 		animchannelTypeInfo[type++]= &ACF_DSARM;		/* Armature Channel */
+		animchannelTypeInfo[type++]= &ACF_DSMESH;		/* Mesh Channel */
 		
 		animchannelTypeInfo[type++]= &ACF_SHAPEKEY;		/* ShapeKey */
 		

Modified: trunk/blender/source/blender/editors/animation/anim_channels_edit.c
===================================================================
--- trunk/blender/source/blender/editors/animation/anim_channels_edit.c	2009-12-28 00:07:24 UTC (rev 25580)
+++ trunk/blender/source/blender/editors/animation/anim_channels_edit.c	2009-12-28 00:52:31 UTC (rev 25581)
@@ -142,6 +142,7 @@
 			case ANIMTYPE_DSPART:
 			case ANIMTYPE_DSMBALL:
 			case ANIMTYPE_DSARM:
+			case ANIMTYPE_DSMESH:
 			{
 				/* need to verify that this data is valid for now */
 				if (ale->adt) {
@@ -184,6 +185,7 @@
 			case ANIMTYPE_DSPART:
 			case ANIMTYPE_DSMBALL:
 			case ANIMTYPE_DSARM:
+			case ANIMTYPE_DSMESH:
 			{
 				/* need to verify that this data is valid for now */
 				if (ale->adt)
@@ -257,6 +259,7 @@
 				case ANIMTYPE_DSPART:
 				case ANIMTYPE_DSMBALL:
 				case ANIMTYPE_DSARM:
+				case ANIMTYPE_DSMESH:
 				{
 					if ((ale->adt) && (ale->adt->flag & ADT_UI_SELECTED))
 						sel= ACHANNEL_SETFLAG_CLEAR;
@@ -337,6 +340,7 @@
 			case ANIMTYPE_DSPART:
 			case ANIMTYPE_DSMBALL:
 			case ANIMTYPE_DSARM:
+			case ANIMTYPE_DSMESH:
 			{
 				/* need to verify that this data is valid for now */
 				if (ale->adt) {
@@ -1651,6 +1655,7 @@
 		case ANIMTYPE_DSPART:
 		case ANIMTYPE_DSMBALL:
 		case ANIMTYPE_DSARM:

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list