Merge branch 'master' into blender2.8
[blender.git] / source / blender / blenkernel / intern / curve.c
index d89e7a1..504999b 100644 (file)
@@ -53,7 +53,6 @@
 
 #include "BKE_animsys.h"
 #include "BKE_curve.h"
-#include "BKE_depsgraph.h"
 #include "BKE_displist.h"
 #include "BKE_font.h"
 #include "BKE_global.h"
@@ -129,6 +128,8 @@ void BKE_curve_free(Curve *cu)
 {
        BKE_animdata_free((ID *)cu, false);
 
+       BKE_curve_batch_cache_free(cu);
+
        BKE_nurbList_free(&cu->nurb);
        BKE_curve_editfont_free(cu);
 
@@ -209,8 +210,9 @@ void BKE_curve_copy_data(Main *bmain, Curve *cu_dst, const Curve *cu_src, const
        cu_dst->strinfo = MEM_dupallocN(cu_src->strinfo);
        cu_dst->tb = MEM_dupallocN(cu_src->tb);
        cu_dst->bb = MEM_dupallocN(cu_src->bb);
+       cu_dst->batch_cache = NULL;
 
-       if (cu_src->key) {
+       if (cu_src->key && (flag & LIB_ID_COPY_SHAPEKEY)) {
                BKE_id_copy_ex(bmain, &cu_src->key->id, (ID **)&cu_dst->key, flag, false);
        }
 
@@ -221,7 +223,7 @@ void BKE_curve_copy_data(Main *bmain, Curve *cu_dst, const Curve *cu_src, const
 Curve *BKE_curve_copy(Main *bmain, const Curve *cu)
 {
        Curve *cu_copy;
-       BKE_id_copy_ex(bmain, &cu->id, (ID **)&cu_copy, 0, false);
+       BKE_id_copy_ex(bmain, &cu->id, (ID **)&cu_copy, LIB_ID_COPY_SHAPEKEY, false);
        return cu_copy;
 }
 
@@ -1622,7 +1624,7 @@ float *BKE_curve_surf_make_orco(Object *ob)
 /* NOTE: This routine is tied to the order of vertex
  * built by displist and as passed to the renderer.
  */
-float *BKE_curve_make_orco(Scene *scene, Object *ob, int *r_numVerts)
+float *BKE_curve_make_orco(Depsgraph *depsgraph, Scene *scene, Object *ob, int *r_numVerts)
 {
        Curve *cu = ob->data;
        DispList *dl;
@@ -1630,7 +1632,7 @@ float *BKE_curve_make_orco(Scene *scene, Object *ob, int *r_numVerts)
        float *fp, *coord_array;
        ListBase disp = {NULL, NULL};
 
-       BKE_displist_make_curveTypes_forOrco(scene, ob, &disp);
+       BKE_displist_make_curveTypes_forOrco(depsgraph, scene, ob, &disp);
 
        numVerts = 0;
        for (dl = disp.first; dl; dl = dl->next) {
@@ -1721,8 +1723,9 @@ float *BKE_curve_make_orco(Scene *scene, Object *ob, int *r_numVerts)
 
 /* ***************** BEVEL ****************** */
 
-void BKE_curve_bevel_make(Scene *scene, Object *ob, ListBase *disp,
-                          const bool for_render, const bool use_render_resolution)
+void BKE_curve_bevel_make(
+        Depsgraph *depsgraph, Scene *scene, Object *ob, ListBase *disp,
+        const bool for_render, const bool use_render_resolution)
 {
        DispList *dl, *dlnew;
        Curve *bevcu, *cu;
@@ -1746,7 +1749,7 @@ void BKE_curve_bevel_make(Scene *scene, Object *ob, ListBase *disp,
                        facy = cu->bevobj->size[1];
 
                        if (for_render) {
-                               BKE_displist_make_curveTypes_forRender(scene, cu->bevobj, &bevdisp, NULL, false, use_render_resolution);
+                               BKE_displist_make_curveTypes_forRender(depsgraph, scene, cu->bevobj, &bevdisp, NULL, false, use_render_resolution);
                                dl = bevdisp.first;
                        }
                        else if (cu->bevobj->curve_cache) {
@@ -5185,7 +5188,7 @@ int BKE_curve_material_index_validate(Curve *cu)
        }
 
        if (!is_valid) {
-               DAG_id_tag_update(&cu->id, OB_RECALC_DATA);
+               DEG_id_tag_update(&cu->id, OB_RECALC_DATA);
                return true;
        }
        else {
@@ -5252,11 +5255,28 @@ void BKE_curve_rect_from_textbox(const struct Curve *cu, const struct TextBox *t
 
 /* **** Depsgraph evaluation **** */
 
-void BKE_curve_eval_geometry(EvaluationContext *UNUSED(eval_ctx),
+void BKE_curve_eval_geometry(Depsgraph *depsgraph,
                              Curve *curve)
 {
-       DEG_debug_print_eval(__func__, curve->id.name, curve);
+       DEG_debug_print_eval(depsgraph, __func__, curve->id.name, curve);
        if (curve->bb == NULL || (curve->bb->flag & BOUNDBOX_DIRTY)) {
                BKE_curve_texspace_calc(curve);
        }
 }
+
+/* Draw Engine */
+void (*BKE_curve_batch_cache_dirty_cb)(Curve *cu, int mode) = NULL;
+void (*BKE_curve_batch_cache_free_cb)(Curve *cu) = NULL;
+
+void BKE_curve_batch_cache_dirty(Curve *cu, int mode)
+{
+       if (cu->batch_cache) {
+               BKE_curve_batch_cache_dirty_cb(cu, mode);
+       }
+}
+void BKE_curve_batch_cache_free(Curve *cu)
+{
+       if (cu->batch_cache) {
+               BKE_curve_batch_cache_free_cb(cu);
+       }
+}