[Bf-blender-cvs] [91ce3087aa7] master: Fix T64842: crash rendering files with bevel curves

Brecht Van Lommel noreply at git.blender.org
Tue May 21 15:14:18 CEST 2019


Commit: 91ce3087aa7f763d202d913a3d77e571662654c9
Author: Brecht Van Lommel
Date:   Tue May 21 14:54:08 2019 +0200
Branches: master
https://developer.blender.org/rB91ce3087aa7f763d202d913a3d77e571662654c9

Fix T64842: crash rendering files with bevel curves

This is old logic that no longer makes sense in the new depsgraph, and causes
issues when multiple threads try to modify the same bevel object.

Differential Revision: https://developer.blender.org/D4913

===================================================================

M	source/blender/blenkernel/BKE_curve.h
M	source/blender/blenkernel/BKE_displist.h
M	source/blender/blenkernel/intern/curve.c
M	source/blender/blenkernel/intern/displist.c
M	source/blender/blenkernel/intern/effect.c
M	source/blender/blenkernel/intern/mesh_convert.c
M	source/blender/blenkernel/intern/object_update.c
M	source/blender/editors/curve/editcurve.c
M	source/blender/editors/object/object_add.c
M	source/blender/editors/object/object_modifier.c
M	source/blender/editors/object/object_relations.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h
index 4356d39be36..df1e7a7baea 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -138,12 +138,7 @@ float *BKE_curve_surf_make_orco(struct Object *ob);
 
 void BKE_curve_bevelList_free(struct ListBase *bev);
 void BKE_curve_bevelList_make(struct Object *ob, struct ListBase *nurbs, bool for_render);
-void BKE_curve_bevel_make(struct Depsgraph *depsgraph,
-                          struct Scene *scene,
-                          struct Object *ob,
-                          struct ListBase *disp,
-                          const bool for_render,
-                          struct LinkNode *ob_cyclic_list);
+void BKE_curve_bevel_make(struct Object *ob, struct ListBase *disp);
 
 void BKE_curve_forward_diff_bezier(
     float q0, float q1, float q2, float q3, float *p, int it, int stride);
diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h
index db57df42d02..c57639a8193 100644
--- a/source/blender/blenkernel/BKE_displist.h
+++ b/source/blender/blenkernel/BKE_displist.h
@@ -90,15 +90,13 @@ void BKE_displist_make_curveTypes(struct Depsgraph *depsgraph,
                                   struct Scene *scene,
                                   struct Object *ob,
                                   const bool for_render,
-                                  const bool for_orco,
-                                  struct LinkNode *ob_cyclic_list);
+                                  const bool for_orco);
 void BKE_displist_make_curveTypes_forRender(struct Depsgraph *depsgraph,
                                             struct Scene *scene,
                                             struct Object *ob,
                                             struct ListBase *dispbase,
                                             struct Mesh **r_final,
-                                            const bool for_orco,
-                                            struct LinkNode *ob_cyclic_list);
+                                            const bool for_orco);
 void BKE_displist_make_mball(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob);
 void BKE_displist_make_mball_forRender(struct Depsgraph *depsgraph,
                                        struct Scene *scene,
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 2775cf9691f..5945fa4bf33 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -1739,12 +1739,7 @@ static void forward_diff_bezier_cotangent(const float p0[3],
 
 /* ***************** BEVEL ****************** */
 
-void BKE_curve_bevel_make(Depsgraph *depsgraph,
-                          Scene *scene,
-                          Object *ob,
-                          ListBase *disp,
-                          const bool for_render,
-                          LinkNode *ob_cyclic_list)
+void BKE_curve_bevel_make(Object *ob, ListBase *disp)
 {
   DispList *dl, *dlnew;
   Curve *bevcu, *cu;
@@ -1768,25 +1763,7 @@ void BKE_curve_bevel_make(Depsgraph *depsgraph,
       facx = cu->bevobj->scale[0];
       facy = cu->bevobj->scale[1];
 
-      if (for_render) {
-        if (BLI_linklist_index(ob_cyclic_list, cu->bevobj) == -1) {
-          BKE_displist_make_curveTypes_forRender(depsgraph,
-                                                 scene,
-                                                 cu->bevobj,
-                                                 &bevdisp,
-                                                 NULL,
-                                                 false,
-                                                 &(LinkNode){
-                                                     .link = ob,
-                                                     .next = ob_cyclic_list,
-                                                 });
-          dl = bevdisp.first;
-        }
-        else {
-          dl = NULL;
-        }
-      }
-      else if (cu->bevobj->runtime.curve_cache) {
+      if (cu->bevobj->runtime.curve_cache) {
         dl = cu->bevobj->runtime.curve_cache->disp.first;
       }
       else {
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index cc1c73b1e68..c8d6f7ae313 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -723,7 +723,7 @@ static float displist_calc_taper(Depsgraph *depsgraph, Scene *scene, Object *tap
 
   dl = taperobj->runtime.curve_cache ? taperobj->runtime.curve_cache->disp.first : NULL;
   if (dl == NULL) {
-    BKE_displist_make_curveTypes(depsgraph, scene, taperobj, false, false, NULL);
+    BKE_displist_make_curveTypes(depsgraph, scene, taperobj, false, false);
     dl = taperobj->runtime.curve_cache->disp.first;
   }
   if (dl) {
@@ -1527,7 +1527,6 @@ static void do_makeDispListCurveTypes(Depsgraph *depsgraph,
                                       ListBase *dispbase,
                                       const bool for_render,
                                       const bool for_orco,
-                                      LinkNode *ob_cyclic_list,
                                       Mesh **r_final)
 {
   Curve *cu = ob->data;
@@ -1571,7 +1570,7 @@ static void do_makeDispListCurveTypes(Depsgraph *depsgraph,
     BKE_curve_bevelList_make(ob, &nubase, for_render);
 
     /* If curve has no bevel will return nothing */
-    BKE_curve_bevel_make(depsgraph, scene, ob, &dlbev, for_render, ob_cyclic_list);
+    BKE_curve_bevel_make(ob, &dlbev);
 
     /* no bevel or extrude, and no width correction? */
     if (!dlbev.first && cu->width == 1.0f) {
@@ -1786,12 +1785,8 @@ static void do_makeDispListCurveTypes(Depsgraph *depsgraph,
   }
 }
 
-void BKE_displist_make_curveTypes(Depsgraph *depsgraph,
-                                  Scene *scene,
-                                  Object *ob,
-                                  const bool for_render,
-                                  const bool for_orco,
-                                  LinkNode *ob_cyclic_list)
+void BKE_displist_make_curveTypes(
+    Depsgraph *depsgraph, Scene *scene, Object *ob, const bool for_render, const bool for_orco)
 {
   ListBase *dispbase;
 
@@ -1810,14 +1805,8 @@ void BKE_displist_make_curveTypes(Depsgraph *depsgraph,
 
   dispbase = &(ob->runtime.curve_cache->disp);
 
-  do_makeDispListCurveTypes(depsgraph,
-                            scene,
-                            ob,
-                            dispbase,
-                            for_render,
-                            for_orco,
-                            ob_cyclic_list,
-                            &ob->runtime.mesh_eval);
+  do_makeDispListCurveTypes(
+      depsgraph, scene, ob, dispbase, for_render, for_orco, &ob->runtime.mesh_eval);
 
   boundbox_displist_object(ob);
 }
@@ -1827,15 +1816,13 @@ void BKE_displist_make_curveTypes_forRender(Depsgraph *depsgraph,
                                             Object *ob,
                                             ListBase *dispbase,
                                             Mesh **r_final,
-                                            const bool for_orco,
-                                            LinkNode *ob_cyclic_list)
+                                            const bool for_orco)
 {
   if (ob->runtime.curve_cache == NULL) {
     ob->runtime.curve_cache = MEM_callocN(sizeof(CurveCache), "CurveCache for Curve");
   }
 
-  do_makeDispListCurveTypes(
-      depsgraph, scene, ob, dispbase, true, for_orco, ob_cyclic_list, r_final);
+  do_makeDispListCurveTypes(depsgraph, scene, ob, dispbase, true, for_orco, r_final);
 }
 
 void BKE_displist_minmax(ListBase *dispbase, float min[3], float max[3])
diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index 51715c3a223..7cbd5b6b050 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -172,7 +172,7 @@ static void precalculate_effector(struct Depsgraph *depsgraph, EffectorCache *ef
     if (cu->flag & CU_PATH) {
       if (eff->ob->runtime.curve_cache == NULL || eff->ob->runtime.curve_cache->path == NULL ||
           eff->ob->runtime.curve_cache->path->data == NULL) {
-        BKE_displist_make_curveTypes(depsgraph, eff->scene, eff->ob, false, false, NULL);
+        BKE_displist_make_curveTypes(depsgraph, eff->scene, eff->ob, false, false);
       }
 
       if (eff->ob->runtime.curve_cache->path && eff->ob->runtime.curve_cache->path->data) {
diff --git a/source/blender/blenkernel/intern/mesh_convert.c b/source/blender/blenkernel/intern/mesh_convert.c
index dca5248c0fa..461adc823b9 100644
--- a/source/blender/blenkernel/intern/mesh_convert.c
+++ b/source/blender/blenkernel/intern/mesh_convert.c
@@ -1005,8 +1005,7 @@ static void curve_to_mesh_eval_ensure(Object *object)
                                          &remapped_object,
                                          &remapped_object.runtime.curve_cache->disp,
                                          &remapped_object.runtime.mesh_eval,
-                                         false,
-                                         NULL);
+                                         false);
 
   BKE_object_free_curve_cache(&bevel_object);
   BKE_object_free_curve_cache(&taper_object);
diff --git a/source/blender/blenkernel/intern/object_update.c b/source/blender/blenkernel/intern/object_update.c
index 77941e7d607..6dee936ca76 100644
--- a/source/blender/blenkernel/intern/object_update.c
+++ b/source/blender/blenkernel/intern/object_update.c
@@ -204,7 +204,7 @@ void BKE_object_handle_data_update(Depsgraph *depsgraph, Scene *scene, Object *o
     case OB_SURF:
     case OB_FONT: {
       bool for_render = (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER);
-      BKE_displist_make_curveTypes(depsgraph, scene, ob, for_render, false, NULL);
+      BKE_displist_make_curveTypes(depsgraph, scene, ob, for_render, false);
       break;
     }
 
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index 65f502

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list