[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