diff options
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_depsgraph.h | 10 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_lattice.h | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/depsgraph_private.h | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/anim.c | 7 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/armature.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/depsgraph.c | 7 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/displist.c | 9 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/lattice.c | 27 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_curve.c | 3 |
9 files changed, 53 insertions, 24 deletions
diff --git a/source/blender/blenkernel/BKE_depsgraph.h b/source/blender/blenkernel/BKE_depsgraph.h index 76ce8c327ac..4fedf373a22 100644 --- a/source/blender/blenkernel/BKE_depsgraph.h +++ b/source/blender/blenkernel/BKE_depsgraph.h @@ -60,6 +60,15 @@ typedef struct EvaluationContext { keep at false if update shall happen for the viewport. */ } EvaluationContext; +/* DagNode->eval_flags */ +enum { + /* Regardless to curve->path animation flag path is to be evaluated anyway, + * to meet dependencies with such a things as curve modifier and other guys + * who're using curve deform, where_on_path and so. + */ + DAG_EVAL_NEED_CURVE_PATH = 1, +}; + /* Global initialization/deinitialization */ void DAG_init(void); void DAG_exit(void); @@ -149,6 +158,7 @@ void DAG_print_dependencies(struct Main *bmain, struct Scene *scene, struct Obje struct Object *DAG_get_node_object(void *node_v); const char *DAG_get_node_name(void *node_v); +short DAG_get_eval_flags_for_object(struct Scene *scene, void *object); #ifdef __cplusplus } diff --git a/source/blender/blenkernel/BKE_lattice.h b/source/blender/blenkernel/BKE_lattice.h index 7806c4a94a1..b57fa360441 100644 --- a/source/blender/blenkernel/BKE_lattice.h +++ b/source/blender/blenkernel/BKE_lattice.h @@ -61,10 +61,10 @@ void end_latt_deform(struct LatticeDeformData *lattice_deform_data); int object_deform_mball(struct Object *ob, struct ListBase *dispbase); void outside_lattice(struct Lattice *lt); -void curve_deform_verts(struct Scene *scene, struct Object *cuOb, struct Object *target, +void curve_deform_verts(struct Object *cuOb, struct Object *target, struct DerivedMesh *dm, float (*vertexCos)[3], int numVerts, const char *vgroup, short defaxis); -void curve_deform_vector(struct Scene *scene, struct Object *cuOb, struct Object *target, +void curve_deform_vector(struct Object *cuOb, struct Object *target, float orco[3], float vec[3], float mat[3][3], int no_rot_axis); void lattice_deform_verts(struct Object *laOb, struct Object *target, diff --git a/source/blender/blenkernel/depsgraph_private.h b/source/blender/blenkernel/depsgraph_private.h index 8aa929ca793..e178667e5a5 100644 --- a/source/blender/blenkernel/depsgraph_private.h +++ b/source/blender/blenkernel/depsgraph_private.h @@ -100,6 +100,13 @@ typedef struct DagNode { * updated aready. */ bool scheduled; + + /* Runtime flags mainly used to determine which extra data is to be evaluated + * during object_handle_update(). Such an extra data is what depends on the + * DAG topology, meaning this flags indicates the data evaluation of which + * depends on the node dependencies. + */ + short eval_flags; } DagNode; typedef struct DagNodeQueueElem { @@ -124,7 +131,6 @@ typedef struct DagForest { int time; /* for flushing/tagging, compare with node->lasttime */ } DagForest; - // queue operations DagNodeQueue *queue_create(int slots); void queue_raz(DagNodeQueue *queue); diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c index 0d7a1f9b46c..4278adc2ae9 100644 --- a/source/blender/blenkernel/intern/anim.c +++ b/source/blender/blenkernel/intern/anim.c @@ -654,7 +654,12 @@ int where_on_path(Object *ob, float ctime, float vec[4], float dir[3], float qua p2 = pp + s2; p3 = pp + s3; - /* note, commented out for follow constraint */ + /* NOTE: commented out for follow constraint + * + * If it's ever be uncommented watch out for curve_deform_verts() + * which used to temporary set CU_FOLLOW flag for the curve and no + * longer does it (because of threading issues of such a thing. + */ //if (cu->flag & CU_FOLLOW) { key_curve_tangent_weights(1.0f - fac, data, KEY_BSPLINE); diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index 0267c9a6122..b0e720fc845 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -2310,7 +2310,7 @@ static void do_strip_modifiers(Scene *scene, Object *armob, Bone *bone, bPoseCha if (strcmp(pchan->name, amod->channel) == 0) { float mat4[4][4], mat3[3][3]; - curve_deform_vector(scene, amod->ob, armob, bone->arm_mat[3], pchan->pose_mat[3], mat3, amod->no_rot_axis); + curve_deform_vector(amod->ob, armob, bone->arm_mat[3], pchan->pose_mat[3], mat3, amod->no_rot_axis); copy_m4_m4(mat4, pchan->pose_mat); mul_m4_m3m4(pchan->pose_mat, mat3, mat4); diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c index d52752c364c..13f0c2977c2 100644 --- a/source/blender/blenkernel/intern/depsgraph.c +++ b/source/blender/blenkernel/intern/depsgraph.c @@ -2844,3 +2844,10 @@ const char *DAG_get_node_name(void *node_v) return dag_node_name(node); } + +short DAG_get_eval_flags_for_object(struct Scene *scene, void *object) +{ + DagNode *node = dag_get_node(scene->theDag, object); + return node->eval_flags; +} + diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 402acf5806c..88791930e0e 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -1566,8 +1566,13 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba curve_to_filledpoly(cu, &nubase, dispbase); } - if ((cu->flag & CU_PATH) && !forOrco) - calc_curvepath(ob, &nubase); + if (!forOrco) { + if ((cu->flag & CU_PATH) || + DAG_get_eval_flags_for_object(scene, ob) & DAG_EVAL_NEED_CURVE_PATH) + { + calc_curvepath(ob, &nubase); + } + } if (!forOrco) curve_calc_modifiers_post(scene, ob, &nubase, dispbase, derivedFinal, forRender, renderResolution); diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index 850636e986c..8f7942f543a 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -614,7 +614,7 @@ static int where_on_path_deform(Object *ob, float ctime, float vec[4], float dir /* co: local coord, result local too */ /* returns quaternion for rotation, using cd->no_rot_axis */ /* axis is using another define!!! */ -static int calc_curve_deform(Scene *scene, Object *par, float co[3], +static int calc_curve_deform(Object *par, float co[3], const short axis, CurveDeform *cd, float quat_r[4]) { Curve *cu = par->data; @@ -623,9 +623,8 @@ static int calc_curve_deform(Scene *scene, Object *par, float co[3], const int is_neg_axis = (axis > 2); /* to be sure, mostly after file load */ - if (ELEM(NULL, par->curve_cache, par->curve_cache->path)) { - BKE_displist_make_curveTypes(scene, par, 0); - if (par->curve_cache->path == NULL) return 0; // happens on append... + if (par->curve_cache->path == NULL) { + return 0; // happens on append... } /* options */ @@ -705,12 +704,11 @@ static int calc_curve_deform(Scene *scene, Object *par, float co[3], return 0; } -void curve_deform_verts(Scene *scene, Object *cuOb, Object *target, - DerivedMesh *dm, float (*vertexCos)[3], +void curve_deform_verts(Object *cuOb, Object *target, DerivedMesh *dm, float (*vertexCos)[3], int numVerts, const char *vgroup, short defaxis) { Curve *cu; - int a, flag; + int a; CurveDeform cd; int use_vgroups; const int is_neg_axis = (defaxis > 2); @@ -719,8 +717,6 @@ void curve_deform_verts(Scene *scene, Object *cuOb, Object *target, return; cu = cuOb->data; - flag = cu->flag; - cu->flag |= (CU_PATH | CU_FOLLOW); // needed for path & bevlist init_curve_deform(cuOb, target, &cd); @@ -772,7 +768,7 @@ void curve_deform_verts(Scene *scene, Object *cuOb, Object *target, if (weight > 0.0f) { mul_m4_v3(cd.curvespace, vertexCos[a]); copy_v3_v3(vec, vertexCos[a]); - calc_curve_deform(scene, cuOb, vec, defaxis, &cd, NULL); + calc_curve_deform(cuOb, vec, defaxis, &cd, NULL); interp_v3_v3v3(vertexCos[a], vertexCos[a], vec, weight); mul_m4_v3(cd.objectspace, vertexCos[a]); } @@ -800,7 +796,7 @@ void curve_deform_verts(Scene *scene, Object *cuOb, Object *target, if (weight > 0.0f) { /* already in 'cd.curvespace', prev for loop */ copy_v3_v3(vec, vertexCos[a]); - calc_curve_deform(scene, cuOb, vec, defaxis, &cd, NULL); + calc_curve_deform(cuOb, vec, defaxis, &cd, NULL); interp_v3_v3v3(vertexCos[a], vertexCos[a], vec, weight); mul_m4_v3(cd.objectspace, vertexCos[a]); } @@ -812,7 +808,7 @@ void curve_deform_verts(Scene *scene, Object *cuOb, Object *target, if (cu->flag & CU_DEFORM_BOUNDS_OFF) { for (a = 0; a < numVerts; a++) { mul_m4_v3(cd.curvespace, vertexCos[a]); - calc_curve_deform(scene, cuOb, vertexCos[a], defaxis, &cd, NULL); + calc_curve_deform(cuOb, vertexCos[a], defaxis, &cd, NULL); mul_m4_v3(cd.objectspace, vertexCos[a]); } } @@ -827,18 +823,17 @@ void curve_deform_verts(Scene *scene, Object *cuOb, Object *target, for (a = 0; a < numVerts; a++) { /* already in 'cd.curvespace', prev for loop */ - calc_curve_deform(scene, cuOb, vertexCos[a], defaxis, &cd, NULL); + calc_curve_deform(cuOb, vertexCos[a], defaxis, &cd, NULL); mul_m4_v3(cd.objectspace, vertexCos[a]); } } } - cu->flag = flag; } /* input vec and orco = local coord in armature space */ /* orco is original not-animated or deformed reference point */ /* result written in vec and mat */ -void curve_deform_vector(Scene *scene, Object *cuOb, Object *target, +void curve_deform_vector(Object *cuOb, Object *target, float orco[3], float vec[3], float mat[3][3], int no_rot_axis) { CurveDeform cd; @@ -857,7 +852,7 @@ void curve_deform_vector(Scene *scene, Object *cuOb, Object *target, mul_m4_v3(cd.curvespace, vec); - if (calc_curve_deform(scene, cuOb, vec, target->trackflag, &cd, quat)) { + if (calc_curve_deform(cuOb, vec, target->trackflag, &cd, quat)) { float qmat[3][3]; quat_to_mat3(qmat, quat); diff --git a/source/blender/modifiers/intern/MOD_curve.c b/source/blender/modifiers/intern/MOD_curve.c index 28042185de0..a6ea9920e78 100644 --- a/source/blender/modifiers/intern/MOD_curve.c +++ b/source/blender/modifiers/intern/MOD_curve.c @@ -103,6 +103,7 @@ static void updateDepgraph(ModifierData *md, DagForest *forest, if (cmd->object) { DagNode *curNode = dag_get_node(forest, cmd->object); + curNode->eval_flags |= DAG_EVAL_NEED_CURVE_PATH; dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA | DAG_RL_OB_DATA, "Curve Modifier"); @@ -119,7 +120,7 @@ static void deformVerts(ModifierData *md, Object *ob, /* silly that defaxis and curve_deform_verts are off by 1 * but leave for now to save having to call do_versions */ - curve_deform_verts(md->scene, cmd->object, ob, derivedData, vertexCos, numVerts, + curve_deform_verts(cmd->object, ob, derivedData, vertexCos, numVerts, cmd->name, cmd->defaxis - 1); } |