[Bf-blender-cvs] [49304aa3036] curve-nodes-modifier: Various Improvements
Hans Goudey
noreply at git.blender.org
Tue Jul 13 01:40:46 CEST 2021
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. @@
More information about the Bf-blender-cvs
mailing list