Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Leung <aligorith@gmail.com>2009-12-28 03:52:31 +0300
committerJoshua Leung <aligorith@gmail.com>2009-12-28 03:52:31 +0300
commitbe55097353069b56a2726ebfe87bb2dd0a4b46a6 (patch)
tree1b0caa1ad22c6a3a79b71a419379ec6cd451b95d /source/blender/blenkernel
parentff31d2d65cd6ab8bff2dc45939a8e7a2dab57c86 (diff)
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.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/intern/anim_sys.c4
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c94
-rw-r--r--source/blender/blenkernel/intern/mesh.c7
-rw-r--r--source/blender/blenkernel/intern/object.c6
4 files changed, 67 insertions, 44 deletions
diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c
index a6f733708c7..4f96b031daa 100644
--- a/source/blender/blenkernel/intern/anim_sys.c
+++ b/source/blender/blenkernel/intern/anim_sys.c
@@ -72,7 +72,7 @@ static short id_has_animdata (ID *id)
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 @@ void BKE_animsys_evaluate_all_animation (Main *main, float ctime)
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);
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index aaaf54b3225..2f08abd82b3 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -491,22 +491,6 @@ static void build_dag_object(DagForest *dag, DagNode *scenenode, Scene *scene, O
/* 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 @@ static void build_dag_object(DagForest *dag, DagNode *scenenode, Scene *scene, O
}
/* 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 @@ static void build_dag_object(DagForest *dag, DagNode *scenenode, Scene *scene, O
}
}
+ /* object constraints */
for (con = ob->constraints.first; con; con=con->next) {
bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
ListBase targets = {NULL, NULL};
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index d5c597b802c..0b48d5bd0ad 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -143,7 +143,12 @@ void free_mesh(Mesh *me)
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);
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 676ab081533..06ae9874180 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -2396,7 +2396,11 @@ void object_handle_update(Scene *scene, Object *ob)
/* 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);