Commit: 49304aa303635d140c276ace91967cca466144d9 Author: Hans Goudey Date: Thu Jul 1 15:50:32 2021 -0500 Branches: curve-nodes-modifier https://developer.blender.org/rB49304aa303635d140c276ace91967cca466144d9
Various 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/draw/intern/draw_cache.c M source/blender/draw/intern/draw_cache.h 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 82c9a31dfce..8e93031e36d 100644 --- a/source/blender/blenkernel/BKE_geometry_set.hh +++ b/source/blender/blenkernel/BKE_geometry_set.hh @@ -413,6 +413,7 @@ 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(); @@ -439,11 +440,15 @@ 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 c978c997856..2be42d328f6 100644 --- a/source/blender/blenkernel/intern/displist.cc +++ b/source/blender/blenkernel/intern/displist.cc @@ -869,7 +869,8 @@ static GeometrySet curve_calc_modifiers_post(Depsgraph *depsgraph, pretessellatePoint->next; GeometrySet geometry_set; - if (md && md->type == eModifierType_Nodes && BKE_modifier_is_enabled(scene, md, required_mode)) { + if (md == nullptr || + (md->type == eModifierType_Nodes && BKE_modifier_is_enabled(scene, md, required_mode))) { std::unique_ptr<CurveEval> curve_eval = curve_eval_from_dna_curve( *cu, ob->runtime.curve_cache->deformed_nurbs); geometry_set.replace_curve(curve_eval.release()); @@ -1504,6 +1505,12 @@ 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); + } ob->runtime.geometry_set_eval = new GeometrySet(std::move(geometry_set)); } diff --git a/source/blender/blenkernel/intern/geometry_component_curve.cc b/source/blender/blenkernel/intern/geometry_component_curve.cc index b5c49dbb8b2..cd3cde977e4 100644 --- a/source/blender/blenkernel/intern/geometry_component_curve.cc +++ b/source/blender/blenkernel/intern/geometry_component_curve.cc @@ -64,6 +64,8 @@ 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; } @@ -128,29 +130,53 @@ void CurveComponent::ensure_owns_direct_data() } } -/** - * 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 +void CurveComponent::create_render_curve() const { - if (curve_ == nullptr) { - return nullptr; - } if (curve_for_render_ != nullptr) { - return curve_for_render_; + return; } std::lock_guard lock{curve_for_render_mutex_}; if (curve_for_render_ != nullptr) { - return curve_for_render_; + return; } 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/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c index d55da3ed83b..8e376939eb5 100644 --- a/source/blender/draw/intern/draw_cache.c +++ b/source/blender/draw/intern/draw_cache.c @@ -813,8 +813,6 @@ 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 DRW_cache_curve_edge_detection_get(ob, r_is_manifold); case OB_SURF: return DRW_cache_surf_edge_detection_get(ob, r_is_manifold); case OB_FONT: @@ -837,8 +835,6 @@ 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 DRW_cache_curve_face_wireframe_get(ob); case OB_SURF: return DRW_cache_surf_face_wireframe_get(ob); case OB_FONT: @@ -864,8 +860,6 @@ GPUBatch *DRW_cache_object_loose_edges_get(struct Object *ob) switch (ob->type) { case OB_MESH: return DRW_cache_mesh_loose_edges_get(ob); - case OB_CURVE: - return DRW_cache_curve_loose_edges_get(ob); case OB_SURF: return DRW_cache_surf_loose_edges_get(ob); case OB_FONT: @@ -888,8 +882,6 @@ GPUBatch *DRW_cache_object_surface_get(Object *ob) switch (ob->type) { case OB_MESH: return DRW_cache_mesh_surface_get(ob); - case OB_CURVE: - return DRW_cache_curve_surface_get(ob); case OB_SURF: return DRW_cache_surf_surface_get(ob); case OB_FONT: @@ -973,8 +965,6 @@ GPUBatch **DRW_cache_object_surface_material_get(struct Object *ob, switch (ob->type) { case OB_MESH: return DRW_cache_mesh_surface_shaded_get(ob, gpumat_array, gpumat_array_len); - case OB_CURVE: - return DRW_cache_curve_surface_shaded_get(ob, gpumat_array, gpumat_array_len); case OB_SURF: return DRW_cache_surf_surface_shaded_get(ob, gpumat_array, gpumat_array_len); case OB_FONT: @@ -2963,75 +2953,6 @@ GPUBatch *DRW_cache_curve_vert_overlay_get(Object *ob) return DRW_curve_batch_cache_get_edit_verts(cu); } -GPUBatch *DRW_cache_curve_surface_get(Object *ob) -{ - BLI_assert(ob->type == OB_CURVE); - - struct Curve *cu = ob->data; - struct Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob); - if (mesh_eval != NULL) { - return DRW_mesh_batch_cache_get_surface(mesh_eval); - } - - return DRW_curve_batch_cache_get_triangles_with_normals(cu); -} - -GPUBatch *DRW_cache_curve_loose_edges_get(Object *ob) -{ - BLI_assert(ob->type == OB_CURVE); - - struct Curve *cu = ob->data; - struct Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob); - if (mesh_eval != NULL) { - return DRW_mesh_batch_cache_get_loose_edges(mesh_eval); - } - - /* TODO */ - UNUSED_VARS(cu); - return NULL; -} - -GPUBatch *DRW_cache_curve_face_wireframe_get(Object *ob) -{ - BLI_assert(ob->type == OB_CURVE); - - struct Curve *cu = ob->data; - struct Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob); - if (mesh_eval != NULL) { - return DRW_mesh_batch_cache_get_wireframes_face(mesh_eval); - } - - return DRW_curve_batch_cache_get_wireframes_face(cu); -} - -GPUBatch *DRW_cache_curve_edge_detection_get(Object *ob, bool *r_is_manifold) -{ - BLI_assert(ob->type == OB_CURVE); - struct Curve *cu = ob->data; - struct Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob); - if (mesh_eval != NULL) { - return DRW_mesh_batch_cache_get_edge_detection(mesh_eval, r_is_manifold); - } - - return DRW_curve_batch_cache_get_edge_detection(cu, r_is_manifold); -} - -/* Return list of batches */ -GPUBatch **DRW_cache_curve_surface_shaded_get(Object *ob, - struct GPUMaterial **gpumat_array, - uint gpumat_array_len) -{ - BLI_assert(ob->type == OB_CURVE); - - struct Curve *cu = ob->data; - struct Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob); - if (mesh_eval != NULL) { - return DRW_mesh_batch_cache_get_surface_shaded(mesh_eval, gpumat_array, gpumat_array_len); - } - - return DRW_curve_batch_cache_get_surface_shaded(cu, gpumat_array, gpumat_array_len); -} - /** \} */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h index c58dd85b6ed..81e212c93d7 100644 --- a/source/blender/draw/intern/draw_cache.h +++ b/source/blender/draw/intern/draw_cache.h @@ -150,14 +150,7 @@ struct GPUBatch *DRW_cache_mesh_surface_mesh_analysis_get(struct Object *ob); struct GPUBatch *DRW_cache_mesh_face_wireframe_get(struct Object *ob); /* Curve */ -struct GPUBatch *DRW_cache_curve_surface_get(struct Object *ob); -struct GPUBatch **DRW_cache_curve_surface_shaded_get(struct Object *ob, - struct GPUMaterial **gpumat_array, - uint gpumat_array_len); -struct GPUBatch *DRW_cache_curve_loose_edges_get(struct Object *ob); struct GPUBatch *DRW_cache_curve_edge_wire_get(struct Object *ob); -struct GPUBatch *DRW_cache_curve_face_wireframe_get(struct Object *ob); -struct GPUBatch *DRW_cache_curve_edge_detection_get(struct Object *ob, bool *r_is_manifold); /* edit-mode */ struct GPUBat @@ 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