[Bf-blender-cvs] [59455f9b663] curve-nodes-modifier: Further refactoring WIP

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


Commit: 59455f9b6638cdd2437a3891eb0ee1ee58a5ee6a
Author: Hans Goudey
Date:   Sat Jun 26 23:50:49 2021 -0500
Branches: curve-nodes-modifier
https://developer.blender.org/rB59455f9b6638cdd2437a3891eb0ee1ee58a5ee6a

Further refactoring WIP

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

M	source/blender/blenkernel/BKE_curve.h
M	source/blender/blenkernel/BKE_displist.h
M	source/blender/blenkernel/BKE_spline.hh
M	source/blender/blenkernel/intern/curve.c
M	source/blender/blenkernel/intern/curve_eval.cc
M	source/blender/blenkernel/intern/displist.cc
M	source/blender/blenkernel/intern/effect.c
M	source/blender/blenkernel/intern/geometry_set_instances.cc
M	source/blender/blenkernel/intern/mesh_convert.c
M	source/blender/blenkernel/intern/object_update.c
M	source/blender/blenlib/BLI_vector.hh
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 2687a5ea16c..dbff1e23ad7 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -121,6 +121,7 @@ void BKE_curve_material_remap(struct Curve *cu, const unsigned int *remap, unsig
 void BKE_curve_smooth_flag_set(struct Curve *cu, const bool use_smooth);
 
 ListBase *BKE_curve_nurbs_get(struct Curve *cu);
+const ListBase *BKE_curve_nurbs_get_for_read(const struct Curve *cu);
 
 int BKE_curve_nurb_vert_index_get(const struct Nurb *nu, const void *vert);
 void BKE_curve_nurb_active_set(struct Curve *cu, const struct Nurb *nu);
@@ -153,6 +154,7 @@ void BKE_curve_editNurb_keyIndex_delCV(struct GHash *keyindex, const void *cv);
 void BKE_curve_editNurb_keyIndex_free(struct GHash **keyindex);
 void BKE_curve_editNurb_free(struct Curve *cu);
 struct ListBase *BKE_curve_editNurbs_get(struct Curve *cu);
+const struct ListBase *BKE_curve_editNurbs_get_for_read(const struct Curve *cu);
 
 void BKE_curve_bevelList_free(struct ListBase *bev);
 void BKE_curve_bevelList_make(struct Object *ob, struct ListBase *nurbs, bool for_render);
diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h
index fe72c5a129f..37e144ebbd3 100644
--- a/source/blender/blenkernel/BKE_displist.h
+++ b/source/blender/blenkernel/BKE_displist.h
@@ -87,13 +87,11 @@ bool BKE_displist_has_faces(const struct ListBase *lb);
 void BKE_displist_make_curveTypes(struct Depsgraph *depsgraph,
                                   const struct Scene *scene,
                                   struct Object *ob,
-                                  const bool for_render,
-                                  const bool for_orco);
+                                  const bool for_render);
 void BKE_displist_make_curveTypes_forRender(struct Depsgraph *depsgraph,
                                             const struct Scene *scene,
                                             struct Object *ob,
                                             struct ListBase *dispbase,
-                                            const bool for_orco,
                                             struct Mesh **r_final);
 void BKE_displist_make_mball(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob);
 void BKE_displist_make_mball_forRender(struct Depsgraph *depsgraph,
diff --git a/source/blender/blenkernel/BKE_spline.hh b/source/blender/blenkernel/BKE_spline.hh
index 0de9270bde1..cf77cc9b100 100644
--- a/source/blender/blenkernel/BKE_spline.hh
+++ b/source/blender/blenkernel/BKE_spline.hh
@@ -32,6 +32,7 @@
 #include "BKE_attribute_math.hh"
 
 struct Curve;
+struct ListBase;
 
 class Spline;
 using SplinePtr = std::unique_ptr<Spline>;
@@ -546,4 +547,5 @@ struct CurveEval {
   void assert_valid_point_attributes() const;
 };
 
-std::unique_ptr<CurveEval> curve_eval_from_dna_curve(const Curve &curve);
+std::unique_ptr<CurveEval> curve_eval_from_dna_curve(const Curve &curve,
+                                                     const ListBase &nurbs_list);
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 462451fe72b..14135104907 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -442,6 +442,15 @@ ListBase *BKE_curve_editNurbs_get(Curve *cu)
   return NULL;
 }
 
+const ListBase *BKE_curve_editNurbs_get_for_read(const Curve *cu)
+{
+  if (cu->editnurb) {
+    return &cu->editnurb->nurbs;
+  }
+
+  return NULL;
+}
+
 short BKE_curve_type_get(const Curve *cu)
 {
   int type = cu->type;
@@ -5078,6 +5087,15 @@ ListBase *BKE_curve_nurbs_get(Curve *cu)
   return &cu->nurb;
 }
 
+const ListBase *BKE_curve_nurbs_get_for_read(const Curve *cu)
+{
+  if (cu->editnurb) {
+    return BKE_curve_editNurbs_get_for_read(cu);
+  }
+
+  return &cu->nurb;
+}
+
 void BKE_curve_nurb_active_set(Curve *cu, const Nurb *nu)
 {
   if (nu == NULL) {
diff --git a/source/blender/blenkernel/intern/curve_eval.cc b/source/blender/blenkernel/intern/curve_eval.cc
index 0a6e4458a35..e39fb384690 100644
--- a/source/blender/blenkernel/intern/curve_eval.cc
+++ b/source/blender/blenkernel/intern/curve_eval.cc
@@ -257,9 +257,10 @@ static SplinePtr spline_from_dna_poly(const Nurb &nurb)
   return spline;
 }
 
-std::unique_ptr<CurveEval> curve_eval_from_dna_curve(const Curve &dna_curve)
+std::unique_ptr<CurveEval> curve_eval_from_dna_curve(const Curve &dna_curve,
+                                                     const ListBase &nurbs_list)
 {
-  Vector<const Nurb *> nurbs(*BKE_curve_nurbs_get(&const_cast<Curve &>(dna_curve)));
+  Vector<const Nurb *> nurbs(nurbs_list);
 
   std::unique_ptr<CurveEval> curve = std::make_unique<CurveEval>();
   curve->resize(nurbs.size());
diff --git a/source/blender/blenkernel/intern/displist.cc b/source/blender/blenkernel/intern/displist.cc
index 63414c57ed4..39f4b6b8732 100644
--- a/source/blender/blenkernel/intern/displist.cc
+++ b/source/blender/blenkernel/intern/displist.cc
@@ -539,13 +539,18 @@ void BKE_displist_fill(const ListBase *dispbase,
   /* do not free polys, needed for wireframe display */
 }
 
-static void bevels_to_filledpoly(const Curve *cu, ListBase *dispbase)
+static void bevels_to_filledpoly(const Curve *cu, const ListBase *src, ListBase *dst)
 {
   ListBase front = {nullptr, nullptr};
   ListBase back = {nullptr, nullptr};
 
-  LISTBASE_FOREACH (const DispList *, dl, dispbase) {
+  LISTBASE_FOREACH (const DispList *, dl, src) {
     if (dl->type == DL_SURF) {
+
+      /* This should be moved specifically to the surface evaluation functions,
+       * now that they are further separated. */
+      BLI_assert_unreachable();
+
       if ((dl->flag & DL_CYCL_V) && (dl->flag & DL_CYCL_U) == 0) {
         if ((cu->flag & CU_BACK) && (dl->flag & DL_BACK_CURVE)) {
           DispList *dlnew = (DispList *)MEM_callocN(sizeof(DispList), __func__);
@@ -590,28 +595,32 @@ static void bevels_to_filledpoly(const Curve *cu, ListBase *dispbase)
   }
 
   const float z_up[3] = {0.0f, 0.0f, -1.0f};
-  BKE_displist_fill(&front, dispbase, z_up, true);
-  BKE_displist_fill(&back, dispbase, z_up, false);
+  BKE_displist_fill(&front, dst, z_up, true);
+  BKE_displist_fill(&back, dst, z_up, false);
 
   BKE_displist_free(&front);
   BKE_displist_free(&back);
 
-  BKE_displist_fill(dispbase, dispbase, z_up, false);
+  BKE_displist_fill(src, dst, z_up, false);
 }
 
-static void curve_to_filledpoly(const Curve *cu, ListBase *dispbase)
+static ListBase curve_to_filledpoly(const Curve *cu, const ListBase *src)
 {
   if (!CU_DO_2DFILL(cu)) {
     return;
   }
 
-  if (dispbase->first && ((DispList *)dispbase->first)->type == DL_SURF) {
-    bevels_to_filledpoly(cu, dispbase);
+  ListBase dst = {nullptr, nullptr};
+
+  if (src->first && ((DispList *)src->first)->type == DL_SURF) {
+    bevels_to_filledpoly(cu, src, &dst);
   }
   else {
     const float z_up[3] = {0.0f, 0.0f, -1.0f};
-    BKE_displist_fill(dispbase, dispbase, z_up, false);
+    BKE_displist_fill(src, &dst, z_up, false);
   }
+
+  return dst;
 }
 
 /* taper rules:
@@ -632,7 +641,7 @@ static float displist_calc_taper(Depsgraph *depsgraph,
                      (DispList *)taperobj->runtime.curve_cache->disp.first :
                      nullptr;
   if (dl == nullptr) {
-    BKE_displist_make_curveTypes(depsgraph, scene, taperobj, false, false);
+    BKE_displist_make_curveTypes(depsgraph, scene, taperobj, false);
     dl = (DispList *)taperobj->runtime.curve_cache->disp.first;
   }
   if (dl) {
@@ -832,19 +841,13 @@ void BKE_curve_calc_modifiers_pre(Depsgraph *depsgraph,
   }
 }
 
-static void curve_calc_modifiers_post(Depsgraph *depsgraph,
-                                      const Scene *scene,
-                                      Object *ob,
-                                      ListBase *dispbase,
-                                      const bool for_render,
-                                      Mesh **r_final,
-                                      GeometrySet **r_geometry_set)
+static GeometrySet curve_calc_modifiers_post(Depsgraph *depsgraph,
+                                             const Scene *scene,
+                                             Object *ob,
+                                             ListBase *dispbase,
+                                             const bool for_render)
 {
   const Curve *cu = (const Curve *)ob->data;
-  if (r_final) {
-    /* The result mesh should already be cleared by the caller. */
-    BLI_assert(*r_final == nullptr);
-  }
   const bool editmode = (!for_render && (cu->editnurb || cu->editfont));
   const bool use_cache = !for_render;
 
@@ -867,23 +870,24 @@ static void curve_calc_modifiers_post(Depsgraph *depsgraph,
   ModifierData *md = pretessellatePoint == nullptr ?
                          BKE_modifiers_get_virtual_modifierlist(ob, &virtualModifierData) :
                          pretessellatePoint->next;
-  if (md == nullptr) {
-    return;
-  }
 
-  Mesh *modified = nullptr;
   GeometrySet geometry_set;
-  if (md->type == eModifierType_Nodes && !BKE_modifier_is_enabled(scene, md, required_mode)) {
-    geometry_set.replace_curve(curve_eval_from_dna_curve(*cu).release());
+  if (md && md->type == eModifierType_Nodes && BKE_modifier_is_enabled(scene, md, required_mode)) {
+    geometry_set.replace_curve(curve_eval_from_dna_curve(*cu, *dispbase).release());
   }
   else {
-    if (ELEM(ob->type, OB_CURVE, OB_FONT) && (cu->flag & CU_DEFORM_FILL)) {
+    const ListBase final_ if (cu->flag & CU_DEFORM_FILL)
+    {
       curve_to_filledpoly(cu, dispbase);
     }
-    modified = BKE_mesh_new_nomain_from_curve_displist(ob, 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);
+    mesh->totcol = cu->totcol;
+
+    geometry_set.replace_mesh(mesh);
   }
 
-  float(*vertCos)[3] = nullptr;
   for (; md; md = md->next) {
     const ModifierTypeInfo *mti = BKE_modifier_get_info((ModifierType)md->type);
     if (!BKE_modifier_is_enabled(scene, md, required_mode)) {
@@ -891,

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list