diff options
author | Joshua Leung <aligorith@gmail.com> | 2009-12-28 03:52:31 +0300 |
---|---|---|
committer | Joshua Leung <aligorith@gmail.com> | 2009-12-28 03:52:31 +0300 |
commit | be55097353069b56a2726ebfe87bb2dd0a4b46a6 (patch) | |
tree | 1b0caa1ad22c6a3a79b71a419379ec6cd451b95d /source/blender/blenkernel | |
parent | ff31d2d65cd6ab8bff2dc45939a8e7a2dab57c86 (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.c | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/depsgraph.c | 94 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh.c | 7 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 6 |
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); |