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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs