[Bf-blender-cvs] [4c0c91cb603] curve-nodes-modifier: Further development and improvements

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


Commit: 4c0c91cb603f8201f26a4d3a0096008f873bfe39
Author: Hans Goudey
Date:   Fri Jul 2 00:03:24 2021 -0500
Branches: curve-nodes-modifier
https://developer.blender.org/rB4c0c91cb603f8201f26a4d3a0096008f873bfe39

Further development and improvements

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

M	source/blender/blenkernel/BKE_geometry_set.hh
M	source/blender/blenkernel/intern/displist.cc
M	source/blender/blenkernel/intern/geometry_component_curve.cc
M	source/blender/blenkernel/intern/geometry_set_instances.cc
M	source/blender/depsgraph/intern/depsgraph_query_iter.cc
M	source/blender/draw/intern/draw_cache.c
M	source/blender/draw/intern/draw_cache_impl_curve.cc
M	source/blender/makesdna/DNA_curve_types.h

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

diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh
index 8e93031e36d..82c9a31dfce 100644
--- a/source/blender/blenkernel/BKE_geometry_set.hh
+++ b/source/blender/blenkernel/BKE_geometry_set.hh
@@ -413,7 +413,6 @@ class CurveComponent : public GeometryComponent {
    */
   mutable Curve *curve_for_render_ = nullptr;
   mutable std::mutex curve_for_render_mutex_;
-  // std::unique_ptr<CurveEval> owned_edit_mode_curve_;
 
  public:
   CurveComponent();
@@ -440,15 +439,11 @@ class CurveComponent : public GeometryComponent {
   void ensure_owns_direct_data() override;
 
   const Curve *get_curve_for_render() const;
-  void add_edit_mode_data_to_result(const Curve &original_curve);
-  // void add_edit_curve_eval_to_render_curve(std::unique_ptr<CurveEval> curve);
 
   static constexpr inline GeometryComponentType static_type = GEO_COMPONENT_TYPE_CURVE;
 
  private:
   const blender::bke::ComponentAttributeProviders *get_attribute_providers() const final;
-
-  void create_render_curve() const;
 };
 
 class InstanceReference {
diff --git a/source/blender/blenkernel/intern/displist.cc b/source/blender/blenkernel/intern/displist.cc
index 00995e23d30..efd87318bbd 100644
--- a/source/blender/blenkernel/intern/displist.cc
+++ b/source/blender/blenkernel/intern/displist.cc
@@ -831,13 +831,6 @@ 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,
@@ -895,7 +888,9 @@ static GeometrySet curve_calc_modifiers_post(Depsgraph *depsgraph,
       continue;
     }
 
-    geometry_set_ensure_mesh(geometry_set);
+    if (!geometry_set.has_mesh()) {
+      geometry_set.replace_mesh(BKE_mesh_new_nomain(0, 0, 0, 0, 0));
+    }
     Mesh *mesh = geometry_set.get_mesh_for_write();
 
     if (mti->type == eModifierTypeType_OnlyDeform) {
@@ -919,16 +914,17 @@ static GeometrySet curve_calc_modifiers_post(Depsgraph *depsgraph,
     }
   }
 
-  geometry_set_ensure_mesh(geometry_set);
-  Mesh *final_mesh = geometry_set.get_mesh_for_write();
+  if (geometry_set.has_mesh()) {
+    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;
 }
@@ -1505,13 +1501,15 @@ void BKE_displist_make_curveTypes(Depsgraph *depsgraph,
   else {
     GeometrySet geometry_set;
     evaluate_curve_type_object(depsgraph, scene, ob, for_render, dispbase, &geometry_set);
-
-    if (ob->mode == OB_MODE_EDIT) {
-      const Curve &original_curve = *(const Curve *)ob->data;
-      CurveComponent &curve_component = geometry_set.get_component_for_write<CurveComponent>();
-      curve_component.add_edit_mode_data_to_result(original_curve);
+    if (BKE_curve_editNurbs_get_for_read((const Curve *)ob->data) &&
+        !geometry_set.has<CurveComponent>()) {
+      geometry_set.get_component_for_write<CurveComponent>();
     }
     ob->runtime.geometry_set_eval = new GeometrySet(std::move(geometry_set));
+
+    if (geometry_set.has<MeshComponent>()) {
+      std::cout << "Output has mesh component\n";
+    }
   }
 
   boundbox_displist_object(ob);
diff --git a/source/blender/blenkernel/intern/geometry_component_curve.cc b/source/blender/blenkernel/intern/geometry_component_curve.cc
index cd3cde977e4..e177cceb091 100644
--- a/source/blender/blenkernel/intern/geometry_component_curve.cc
+++ b/source/blender/blenkernel/intern/geometry_component_curve.cc
@@ -64,8 +64,6 @@ void CurveComponent::clear()
       delete curve_;
     }
     if (curve_for_render_ != nullptr) {
-      /* Don't free the edit mode data, it's only borrowed! */
-      curve_for_render_->editnurb = nullptr;
       BKE_id_free(nullptr, curve_for_render_);
       curve_for_render_ = nullptr;
     }
@@ -130,53 +128,28 @@ void CurveComponent::ensure_owns_direct_data()
   }
 }
 
-void CurveComponent::create_render_curve() const
+/**
+ * Create empty curve data used for rendering the spline's wire edges.
+ * \note See comment on #curve_for_render_ for further explanation.
+ */
+const Curve *CurveComponent::get_curve_for_render() const
 {
+  if (curve_ == nullptr) {
+    return nullptr;
+  }
   if (curve_for_render_ != nullptr) {
-    return;
+    return curve_for_render_;
   }
   std::lock_guard lock{curve_for_render_mutex_};
   if (curve_for_render_ != nullptr) {
-    return;
+    return curve_for_render_;
   }
 
   curve_for_render_ = (Curve *)BKE_id_new_nomain(ID_CU, nullptr);
-  curve_for_render_->curve_eval = curve_;
-}
-
-/**
- * Create empty curve data used for rendering the spline's wire edges.
- * \note See comment on #curve_for_render_ for further explanation.
- */
-const Curve *CurveComponent::get_curve_for_render() const
-{
-  this->create_render_curve();
 
   return curve_for_render_;
 }
 
-/**
- * TODO: Comment
- */
-void CurveComponent::add_edit_mode_data_to_result(const Curve &original_curve)
-{
-  std::cout << __func__ << "\n";
-  this->create_render_curve();
-
-  curve_for_render_->editnurb = original_curve.editnurb;
-  curve_for_render_->actnu = original_curve.actnu;
-  curve_for_render_->actvert = original_curve.actvert;
-}
-
-// void CurveComponent::add_edit_curve_eval_to_render_curve(std::unique_ptr<CurveEval> edit_curve)
-// {
-//   this->create_render_curve();
-
-//   owned_edit_mode_curve_ = std::move(edit_curve);
-
-//   curve_for_render_->edit_mode_curve_eval = owned_edit_mode_curve_.get();
-// }
-
 /** \} */
 
 /* -------------------------------------------------------------------- */
diff --git a/source/blender/blenkernel/intern/geometry_set_instances.cc b/source/blender/blenkernel/intern/geometry_set_instances.cc
index 01b51d552a9..9c00367a0ed 100644
--- a/source/blender/blenkernel/intern/geometry_set_instances.cc
+++ b/source/blender/blenkernel/intern/geometry_set_instances.cc
@@ -52,16 +52,6 @@ static void add_final_mesh_as_geometry_component(const Object &object, GeometryS
   }
 }
 
-static void add_curve_data_as_geometry_component(const Object &object, GeometrySet &geometry_set)
-{
-  BLI_assert(object.type == OB_CURVE);
-  if (object.data != nullptr) {
-    std::unique_ptr<CurveEval> curve = curve_eval_from_dna_curve(*(const Curve *)object.data);
-    CurveComponent &curve_component = geometry_set.get_component_for_write<CurveComponent>();
-    curve_component.replace(curve.release(), GeometryOwnershipType::Owned);
-  }
-}
-
 /**
  * \note This doesn't extract instances from the "dupli" system for non-geometry-nodes instances.
  */
@@ -85,9 +75,6 @@ static GeometrySet object_get_geometry_set_for_read(const Object &object)
   if (object.type == OB_MESH) {
     add_final_mesh_as_geometry_component(object, geometry_set);
   }
-  else if (object.type == OB_CURVE) {
-    add_curve_data_as_geometry_component(object, geometry_set);
-  }
 
   /* TODO: Cover the case of point-clouds without modifiers-- they may not be covered by the
    * #geometry_set_eval case above. */
diff --git a/source/blender/depsgraph/intern/depsgraph_query_iter.cc b/source/blender/depsgraph/intern/depsgraph_query_iter.cc
index df1cf8cc771..2d4e5286e35 100644
--- a/source/blender/depsgraph/intern/depsgraph_query_iter.cc
+++ b/source/blender/depsgraph/intern/depsgraph_query_iter.cc
@@ -225,16 +225,19 @@ bool deg_iterator_components_step(BLI_Iterator *iter)
 
     const CurveComponent *component = geometry_set->get_component_for_read<CurveComponent>();
     if (component != nullptr) {
-      const Curve *curve = component->get_curve_for_render();
 
+      /* Don't use a temporary object for this component when the owner is a curve object. */
+      if (data->geometry_component_owner->type == OB_CURVE) {
+        iter->current = data->geometry_component_owner;
+        return true;
+      }
+
+      const Curve *curve = component->get_curve_for_render();
       if (curve != nullptr) {
         Object *temp_object = &data->temp_geometry_component_object;
         *temp_object = *data->geometry_component_owner;
         temp_object->type = OB_CURVE;
         temp_object->data = (void *)curve;
-        /* Assign data_eval here too, because curve rendering code tries
-         * to use a mesh if it can find one in this pointer. */
-        temp_object->runtime.data_eval = (ID *)curve;
         temp_object->runtime.select_id = data->geometry_component_owner->runtime.select_id;
         iter->current = temp_object;
         return true;
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index 8e376939eb5..6775a281677 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -813,6 +813,8 @@ GPUBatch *DRW_cache_object_edge_detection_get(Object *ob, bool *r_is_manifold)
   switch (ob->type) {
     case OB_MESH:
       return DRW_cache_mesh_edge_detection_get(ob, r_is_manifold);
+    case OB_CURVE:
+      return NULL;
     case OB_SURF:
       return DRW_cache_surf_edge_detection_get(ob, r_is_manifold);
     case OB_FONT:
@@ -835,6 +837,8 @@ GPUBatch *DRW_cache_object_face_wireframe_get(Object *ob)
   switch (ob->type) {
     case OB_MESH:
       return DRW_cache_mesh_face_wireframe_get(ob);
+    case OB_CURVE:
+      return NULL;
     case OB_SURF:
       re

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list