[Bf-blender-cvs] [7ae47bc368c] curve-nodes-modifier: More cleanup, displist still shows up when it shouldn't (no mesh in data_eval)

Hans Goudey noreply at git.blender.org
Tue Jul 13 01:40:44 CEST 2021


Commit: 7ae47bc368c4a6cbd8f2e01dd8e33c16f846683f
Author: Hans Goudey
Date:   Mon Jun 28 20:27:07 2021 -0500
Branches: curve-nodes-modifier
https://developer.blender.org/rB7ae47bc368c4a6cbd8f2e01dd8e33c16f846683f

More cleanup, displist still shows up when it shouldn't (no mesh in data_eval)

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

M	source/blender/blenkernel/intern/displist.cc

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

diff --git a/source/blender/blenkernel/intern/displist.cc b/source/blender/blenkernel/intern/displist.cc
index 4063a61e75b..3faa1ff99ce 100644
--- a/source/blender/blenkernel/intern/displist.cc
+++ b/source/blender/blenkernel/intern/displist.cc
@@ -832,10 +832,17 @@ void BKE_curve_calc_modifiers_pre(Depsgraph *depsgraph,
   }
 }
 
+static void geometry_set_ensure_mesh(GeometrySet &geometry_set)
+{
+  if (!geometry_set.has_mesh()) {
+    geometry_set.replace_mesh(BKE_mesh_new_nomain(0, 0, 0, 0, 0));
+  }
+}
+
 static GeometrySet curve_calc_modifiers_post(Depsgraph *depsgraph,
                                              const Scene *scene,
                                              Object *ob,
-                                             ListBase *dispbase,
+                                             const ListBase *dispbase,
                                              const bool for_render)
 {
   const Curve *cu = (const Curve *)ob->data;
@@ -869,7 +876,6 @@ static GeometrySet curve_calc_modifiers_post(Depsgraph *depsgraph,
     geometry_set.replace_curve(curve_eval.release());
   }
   else {
-    curve_to_filledpoly(cu, dispbase);
     Mesh *mesh = BKE_mesh_new_nomain_from_curve_displist(ob, dispbase);
     /* Copy materials, since BKE_mesh_new_nomain_from_curve_displist() doesn't. */
     mesh->mat = (Material **)MEM_dupallocN(cu->mat);
@@ -889,9 +895,7 @@ static GeometrySet curve_calc_modifiers_post(Depsgraph *depsgraph,
       continue;
     }
 
-    if (!geometry_set.has_mesh()) {
-      geometry_set.replace_mesh(BKE_mesh_new_nomain(0, 0, 0, 0, 0));
-    }
+    geometry_set_ensure_mesh(geometry_set);
     Mesh *mesh = geometry_set.get_mesh_for_write();
 
     if (mti->type == eModifierTypeType_OnlyDeform) {
@@ -915,17 +919,16 @@ static GeometrySet curve_calc_modifiers_post(Depsgraph *depsgraph,
     }
   }
 
-  if (geometry_set.has_mesh()) {
-    Mesh *final_mesh = geometry_set.get_mesh_for_write();
+  geometry_set_ensure_mesh(geometry_set);
+  Mesh *final_mesh = geometry_set.get_mesh_for_write();
 
-    /* XXX2.8(Sybren): make sure the face normals are recalculated as well */
-    BKE_mesh_ensure_normals(final_mesh);
+  /* XXX2.8(Sybren): make sure the face normals are recalculated as well */
+  BKE_mesh_ensure_normals(final_mesh);
 
-    /* Set flag which makes it easier to see what's going on in a debugger. */
-    final_mesh->id.tag |= LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT;
-    BLI_strncpy(final_mesh->id.name, cu->id.name, sizeof(final_mesh->id.name));
-    *((short *)final_mesh->id.name) = ID_ME;
-  }
+  /* Set flag which makes it easier to see what's going on in a debugger. */
+  final_mesh->id.tag |= LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT;
+  BLI_strncpy(final_mesh->id.name, cu->id.name, sizeof(final_mesh->id.name));
+  *((short *)final_mesh->id.name) = ID_ME;
 
   return geometry_set;
 }
@@ -961,12 +964,12 @@ static void displist_surf_indices(DispList *dl)
   }
 }
 
-static void displist_make_surf(Depsgraph *depsgraph,
-                               const Scene *scene,
-                               Object *ob,
-                               ListBase *dispbase,
-                               Mesh **r_final,
-                               const bool for_render)
+static void evaluate_surface_object(Depsgraph *depsgraph,
+                                    const Scene *scene,
+                                    Object *ob,
+                                    const bool for_render,
+                                    ListBase *r_dispbase,
+                                    Mesh **r_final)
 {
   BLI_assert(ob->type == OB_SURF);
   const Curve *cu = (const Curve *)ob->data;
@@ -982,7 +985,7 @@ static void displist_make_surf(Depsgraph *depsgraph,
 
   BKE_curve_calc_modifiers_pre(depsgraph, scene, ob, deformed_nurbs, deformed_nurbs, for_render);
 
-  LISTBASE_FOREACH (Nurb *, nu, deformed_nurbs) {
+  LISTBASE_FOREACH (const Nurb *, nu, deformed_nurbs) {
     if (!(for_render || nu->hide == 0) || !BKE_nurb_check_valid_uv(nu)) {
       continue;
     }
@@ -996,7 +999,7 @@ static void displist_make_surf(Depsgraph *depsgraph,
       DispList *dl = (DispList *)MEM_callocN(sizeof(DispList), "makeDispListsurf");
       dl->verts = (float *)MEM_mallocN(len * sizeof(float[3]), "dlverts");
 
-      BLI_addtail(dispbase, dl);
+      BLI_addtail(r_dispbase, dl);
       dl->parts = 1;
       dl->nr = len;
       dl->col = nu->mat_nr;
@@ -1018,7 +1021,7 @@ static void displist_make_surf(Depsgraph *depsgraph,
 
       DispList *dl = (DispList *)MEM_callocN(sizeof(DispList), "makeDispListsurf");
       dl->verts = (float *)MEM_mallocN(len * sizeof(float[3]), "dlverts");
-      BLI_addtail(dispbase, dl);
+      BLI_addtail(r_dispbase, dl);
 
       dl->col = nu->mat_nr;
       dl->charidx = nu->charidx;
@@ -1043,7 +1046,9 @@ static void displist_make_surf(Depsgraph *depsgraph,
     }
   }
 
-  GeometrySet geometry_set = curve_calc_modifiers_post(depsgraph, scene, ob, dispbase, for_render);
+  curve_to_filledpoly(cu, r_dispbase);
+  GeometrySet geometry_set = curve_calc_modifiers_post(
+      depsgraph, scene, ob, r_dispbase, for_render);
   MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
   *r_final = mesh_component.release();
 }
@@ -1268,8 +1273,8 @@ static void calc_bevfac_mapping(const Curve *cu,
 static void evaluate_curve_type_object(Depsgraph *depsgraph,
                                        const Scene *scene,
                                        Object *ob,
-                                       ListBase *dispbase,
                                        const bool for_render,
+                                       ListBase *r_dispbase,
                                        GeometrySet *r_geometry_set)
 {
   const Curve *cu = (const Curve *)ob->data;
@@ -1288,12 +1293,17 @@ static void evaluate_curve_type_object(Depsgraph *depsgraph,
 
   BKE_curve_bevelList_make(ob, deformed_nurbs, for_render);
 
+  if ((cu->flag & CU_PATH) ||
+      DEG_get_eval_flags_for_id(depsgraph, &ob->id) & DAG_EVAL_NEED_CURVE_PATH) {
+    BKE_anim_path_calc_data(ob);
+  }
+
   /* If curve has no bevel will return nothing */
   ListBase dlbev = BKE_curve_bevel_make(cu);
 
   /* no bevel or extrude, and no width correction? */
   if (BLI_listbase_is_empty(&dlbev) && cu->width == 1.0f) {
-    curve_to_displist(cu, deformed_nurbs, for_render, dispbase);
+    curve_to_displist(cu, deformed_nurbs, for_render, r_dispbase);
   }
   else {
     const float widfac = cu->width - 1.0f;
@@ -1311,7 +1321,7 @@ static void evaluate_curve_type_object(Depsgraph *depsgraph,
       if (BLI_listbase_is_empty(&dlbev)) {
         DispList *dl = (DispList *)MEM_callocN(sizeof(DispList), "makeDispListbev");
         dl->verts = (float *)MEM_mallocN(sizeof(float[3]) * bl->nr, "dlverts");
-        BLI_addtail(dispbase, dl);
+        BLI_addtail(r_dispbase, dl);
 
         if (bl->poly != -1) {
           dl->type = DL_POLY;
@@ -1361,7 +1371,7 @@ static void evaluate_curve_type_object(Depsgraph *depsgraph,
           /* for each part of the bevel use a separate displblock */
           DispList *dl = (DispList *)MEM_callocN(sizeof(DispList), "makeDispListbev1");
           dl->verts = data = (float *)MEM_mallocN(sizeof(float[3]) * dlb->nr * steps, "dlverts");
-          BLI_addtail(dispbase, dl);
+          BLI_addtail(r_dispbase, dl);
 
           dl->type = DL_SURF;
 
@@ -1457,8 +1467,8 @@ static void evaluate_curve_type_object(Depsgraph *depsgraph,
         }
 
         if (bottom_capbase.first) {
-          BKE_displist_fill(&bottom_capbase, dispbase, bottom_no, false);
-          BKE_displist_fill(&top_capbase, dispbase, top_no, false);
+          BKE_displist_fill(&bottom_capbase, r_dispbase, bottom_no, false);
+          BKE_displist_fill(&top_capbase, r_dispbase, top_no, false);
           BKE_displist_free(&bottom_capbase);
           BKE_displist_free(&top_capbase);
         }
@@ -1468,12 +1478,8 @@ static void evaluate_curve_type_object(Depsgraph *depsgraph,
 
   BKE_displist_free(&dlbev);
 
-  if ((cu->flag & CU_PATH) ||
-      DEG_get_eval_flags_for_id(depsgraph, &ob->id) & DAG_EVAL_NEED_CURVE_PATH) {
-    BKE_anim_path_calc_data(ob);
-  }
-
-  *r_geometry_set = curve_calc_modifiers_post(depsgraph, scene, ob, dispbase, for_render);
+  curve_to_filledpoly(cu, r_dispbase);
+  *r_geometry_set = curve_calc_modifiers_post(depsgraph, scene, ob, r_dispbase, for_render);
 }
 
 void BKE_displist_make_curveTypes(Depsgraph *depsgraph,
@@ -1493,12 +1499,12 @@ void BKE_displist_make_curveTypes(Depsgraph *depsgraph,
 
   if (ob->type == OB_SURF) {
     Mesh *mesh_eval;
-    displist_make_surf(depsgraph, scene, ob, dispbase, &mesh_eval, for_render);
+    evaluate_surface_object(depsgraph, scene, ob, for_render, dispbase, &mesh_eval);
     BKE_object_eval_assign_data(ob, &mesh_eval->id, true);
   }
   else {
     GeometrySet geometry_set;
-    evaluate_curve_type_object(depsgraph, scene, ob, dispbase, for_render, &geometry_set);
+    evaluate_curve_type_object(depsgraph, scene, ob, for_render, dispbase, &geometry_set);
     ob->runtime.geometry_set_eval = new GeometrySet(std::move(geometry_set));
   }
 
@@ -1513,11 +1519,11 @@ void BKE_displist_make_curveTypes_forRender(
   }
 
   if (ob->type == OB_SURF) {
-    displist_make_surf(depsgraph, scene, ob, dispbase, r_final, true);
+    evaluate_surface_object(depsgraph, scene, ob, true, dispbase, r_final);
   }
   else {
     GeometrySet geometry_set;
-    evaluate_curve_type_object(depsgraph, scene, ob, dispbase, true, &geometry_set);
+    evaluate_curve_type_object(depsgraph, scene, ob, true, dispbase, &geometry_set);
     MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
     *r_final = mesh_component.release();
   }



More information about the Bf-blender-cvs mailing list