[Bf-blender-cvs] [58cdb78ea09] geometry-nodes-curve-support: Disfunctional support for geometry nodes on curve
Hans Goudey
noreply at git.blender.org
Thu Apr 1 00:49:58 CEST 2021
Commit: 58cdb78ea09c232109607e29cc086c941dc9760a
Author: Hans Goudey
Date: Wed Mar 31 17:49:51 2021 -0500
Branches: geometry-nodes-curve-support
https://developer.blender.org/rB58cdb78ea09c232109607e29cc086c941dc9760a
Disfunctional support for geometry nodes on curve
Very hacky, doesn't work, but it's a base, and some components work.
I have a feeling that the curve modifier stack is just fundamentally broken.
===================================================================
M source/blender/blenkernel/BKE_derived_curve.hh
M source/blender/blenkernel/intern/derived_curve.cc
M source/blender/blenkernel/intern/displist.cc
M source/blender/blenkernel/intern/geometry_component_curve.cc
M source/blender/blenkernel/intern/mesh_validate.c
M source/blender/editors/space_spreadsheet/spreadsheet_from_geometry.cc
M source/blender/modifiers/intern/MOD_nodes.cc
M source/blender/nodes/geometry/nodes/node_geo_curve_to_mesh.cc
M source/blender/nodes/geometry/nodes/node_geo_transform.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_derived_curve.hh b/source/blender/blenkernel/BKE_derived_curve.hh
index 35f9a6417c8..6d4af43920f 100644
--- a/source/blender/blenkernel/BKE_derived_curve.hh
+++ b/source/blender/blenkernel/BKE_derived_curve.hh
@@ -86,6 +86,8 @@ struct SplineBezier : Spline {
{
return control_points.size();
}
+
+ ~SplineBezier() = default;
};
struct SplineNURBS : Spline {
@@ -117,5 +119,15 @@ struct DCurve {
void ensure_evaluation_cache();
- DCurve from_dna_curve(const Curve &curve);
+ ~DCurve()
+ {
+ for (Spline *spline : splines) {
+ if (spline->type == SplineType::Bezier) {
+ SplineBezier *spline_bezier = reinterpret_cast<SplineBezier *>(spline);
+ delete spline_bezier;
+ }
+ }
+ }
};
+
+DCurve *dcurve_from_dna_curve(const Curve &curve);
\ No newline at end of file
diff --git a/source/blender/blenkernel/intern/derived_curve.cc b/source/blender/blenkernel/intern/derived_curve.cc
index 7e888ba7dc0..9196c4f68e6 100644
--- a/source/blender/blenkernel/intern/derived_curve.cc
+++ b/source/blender/blenkernel/intern/derived_curve.cc
@@ -25,6 +25,8 @@
using blender::Array;
using blender::float3;
+using blender::IndexRange;
+using blender::MutableSpan;
using blender::Span;
static BezierHandleType handle_type_from_dna_bezt(const eBezTriple_Handle dna_handle_type)
@@ -47,15 +49,15 @@ static BezierHandleType handle_type_from_dna_bezt(const eBezTriple_Handle dna_ha
return BezierHandleType::Free;
}
-DCurve DCurve::from_dna_curve(const Curve &dna_curve)
+DCurve *dcurve_from_dna_curve(const Curve &dna_curve)
{
- DCurve curve;
+ DCurve *curve = new DCurve();
- curve.splines.reserve(BLI_listbase_count(&dna_curve.nurb));
+ curve->splines.reserve(BLI_listbase_count(&dna_curve.nurb));
LISTBASE_FOREACH (const Nurb *, nurb, &dna_curve.nurb) {
if (nurb->type == CU_BEZIER) {
- SplineBezier spline;
+ SplineBezier *spline = new SplineBezier();
for (const BezTriple &bezt : Span(nurb->bezt, nurb->pntsu)) {
ControlPointBezier point;
point.handle_position_a = bezt.vec[0];
@@ -65,14 +67,14 @@ DCurve DCurve::from_dna_curve(const Curve &dna_curve)
point.tilt = bezt.tilt;
point.handle_type_a = handle_type_from_dna_bezt((eBezTriple_Handle)bezt.h1);
point.handle_type_b = handle_type_from_dna_bezt((eBezTriple_Handle)bezt.h2);
- spline.control_points.append(std::move(point));
+ spline->control_points.append(std::move(point));
}
- spline.resolution_u = nurb->resolu;
- spline.resolution_v = nurb->resolv;
- spline.type = SplineType::Bezier;
+ spline->resolution_u = nurb->resolu;
+ spline->resolution_v = nurb->resolv;
+ spline->type = SplineType::Bezier;
- curve.splines.append(spline);
+ curve->splines.append(spline);
}
else if (nurb->type == CU_NURBS) {
}
@@ -83,26 +85,70 @@ DCurve DCurve::from_dna_curve(const Curve &dna_curve)
return curve;
}
+static void evaluate_bezier_part_3d(const float3 point_0,
+ const float3 point_1,
+ const float3 point_2,
+ const float3 point_3,
+ MutableSpan<float3> result)
+{
+ float *data = (float *)result.data();
+ for (const int axis : {0, 1, 2}) {
+ BKE_curve_forward_diff_bezier(point_0[axis],
+ point_1[axis],
+ point_2[axis],
+ point_3[axis],
+ data + axis,
+ result.size(),
+ sizeof(float3));
+ }
+}
+
void DCurve::ensure_evaluation_cache()
{
this->evaluated_spline_cache.clear();
- for (Spline &spline : this->splines) {
- if (spline.type == SplineType::Bezier) {
- SplineBezier &spline_bezier = reinterpret_cast<SplineBezier &>(spline);
- for (ControlPointBezier &point : spline_bezier.control_points) {
- float3 *data = this->evaluated_spline_cache.end();
- float *data_axis = (float *)data;
- this->evaluated_spline_cache.reserve(this->evaluated_spline_cache.size() +
- spline_bezier.resolution_u);
- for (const int axis : {0, 1, 2}) {
- BKE_curve_forward_diff_bezier(point.position[axis],
- point.handle_position_b[axis],
- point.handle_position_a[axis],
- point.position[axis],
- data_axis + axis,
- spline_bezier.resolution_u,
- sizeof(float3));
+ int total_len = 1;
+ for (Spline *spline : this->splines) {
+ if (spline->type == SplineType::Bezier) {
+ SplineBezier &spline_bezier = *reinterpret_cast<SplineBezier *>(spline);
+ for (const int i : IndexRange(1, spline_bezier.control_points.size() - 1)) {
+ const ControlPointBezier &point_prev = spline_bezier.control_points[i - 1];
+ const ControlPointBezier &point = spline_bezier.control_points[i];
+ if (point_prev.handle_type_b == BezierHandleType::Vector &&
+ point.handle_type_a == BezierHandleType::Vector) {
+ total_len += 1;
+ }
+ else {
+ total_len += spline_bezier.resolution_u;
+ }
+ }
+ }
+ }
+
+ this->evaluated_spline_cache.resize(total_len);
+
+ MutableSpan<float3> positions(this->evaluated_spline_cache);
+
+ int offset = 0;
+ for (Spline *spline : this->splines) {
+ if (spline->type == SplineType::Bezier) {
+ SplineBezier &spline_bezier = *reinterpret_cast<SplineBezier *>(spline);
+ for (const int i : IndexRange(1, spline_bezier.control_points.size() - 1)) {
+ const ControlPointBezier &point_prev = spline_bezier.control_points[i - 1];
+ const ControlPointBezier &point = spline_bezier.control_points[i];
+
+ if (point_prev.handle_type_b == BezierHandleType::Vector &&
+ point.handle_type_a == BezierHandleType::Vector) {
+ offset++;
+ }
+ else {
+ const int resolution = spline_bezier.resolution_u;
+ evaluate_bezier_part_3d(point_prev.position,
+ point_prev.handle_position_b,
+ point.handle_position_a,
+ point.position,
+ positions.slice(offset, resolution));
+ offset += resolution;
}
}
}
diff --git a/source/blender/blenkernel/intern/displist.cc b/source/blender/blenkernel/intern/displist.cc
index dc7523bc0de..e5f3fad7318 100644
--- a/source/blender/blenkernel/intern/displist.cc
+++ b/source/blender/blenkernel/intern/displist.cc
@@ -44,8 +44,10 @@
#include "BKE_anim_path.h"
#include "BKE_curve.h"
+#include "BKE_derived_curve.hh"
#include "BKE_displist.h"
#include "BKE_font.h"
+#include "BKE_geometry_set.hh"
#include "BKE_key.h"
#include "BKE_lattice.h"
#include "BKE_lib_id.h"
@@ -889,6 +891,48 @@ static void displist_vert_coords_apply(ListBase *dispbase, float (*allverts)[3])
}
}
+static Mesh *modifier_modify_mesh_and_geometry_set(ModifierData *md,
+ const ModifierEvalContext &mectx,
+ Curve *curve,
+ Object *ob,
+ Mesh *input_mesh,
+ GeometrySet &geometry_set)
+{
+ Mesh *mesh_output = nullptr;
+ const ModifierTypeInfo *mti = BKE_modifier_get_info((ModifierType)md->type);
+ if (mti->modifyGeometrySet == nullptr) {
+ mesh_output = BKE_modifier_modify_mesh(md, &mectx, input_mesh);
+ }
+ else {
+ /* Adds a new mesh component to the geometry set based on the #input_mesh. */
+ BLI_assert(!geometry_set.has<MeshComponent>());
+ MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
+ mesh_component.replace(input_mesh, GeometryOwnershipType::Editable);
+ mesh_component.copy_vertex_group_names_from_object(*ob);
+
+ CurveComponent &curve_component = geometry_set.get_component_for_write<CurveComponent>();
+ curve_component.replace(dcurve_from_dna_curve(*curve));
+
+ /* Let the modifier change the geometry set. */
+ mti->modifyGeometrySet(md, &mectx, &geometry_set);
+
+ /* Release the mesh from the geometry set again. */
+ if (geometry_set.has<MeshComponent>()) {
+ MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
+ mesh_output = mesh_component.release();
+ geometry_set.remove<MeshComponent>();
+ }
+
+ /* Return an empty mesh instead of null. */
+ if (mesh_output == nullptr) {
+ mesh_output = BKE_mesh_new_nomain(0, 0, 0, 0, 0);
+ BKE_mesh_copy_settings(mesh_output, input_mesh);
+ }
+ }
+
+ return mesh_output;
+}
+
static void curve_calc_modifiers_post(Depsgraph *depsgraph,
Scene *scene,
Object *ob,
@@ -896,8 +940,11 @@ static void curve_calc_modifiers_post(Depsgraph *depsgraph,
ListBase *dispbase,
Mesh **r_final,
const bool for_render,
- const bool force_mesh_conversion)
+ const bool force_mesh_conversion,
+ GeometrySet **r_geometry_set)
{
+ GeometrySet geometry_set_final;
+
VirtualModifierData virtualModifierData;
ModifierData *md = BKE_modifiers_get_virtual_modifierlist(ob, &virtualModifierData);
ModifierData *pretessellatePoint;
@@ -1017,7 +1064,9 @@ static void curve_calc_modifiers_post(Depsgraph *depsgraph,
if (need_normal) {
BKE_mesh_ensure_normals(modified);
}
- mesh_applied = mti->modifyMesh(md, &mect
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list