From 899ec8b6b8035bde44d49d228c30698499a87080 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Sun, 5 Jun 2022 12:14:13 +0200 Subject: Curves: use uv coordinates to attach curves to mesh This implements the new way to attach curves to a mesh surface using a uv map (based on the recent discussion in T95776). The curves data block now not only stores a reference to the surface object but also a name of a uv map on that object. Having a uv map is optional for most operations, but it will be required later for animation (when the curves are supposed to be deformed based on deformation of the surface). The "Empty Hair" operator in the Add menu sets the uv map name automatically if possible. It's possible to start working without a uv map and to attach the curves to a uv map later on. It's also possible to reattach the curves to a new uv map using the "Curves > Snap to Nearest Surface" operator in curves sculpt mode. Note, the implementation to do the reverse lookup from uv to a position on the surface is trivial and inefficient now. A more efficient data structure will be implemented separately soon. Differential Revision: https://developer.blender.org/D15125 --- source/blender/blenkernel/BKE_curves.hh | 18 +++--------------- source/blender/blenkernel/intern/curves_geometry.cc | 21 +++++---------------- 2 files changed, 8 insertions(+), 31 deletions(-) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/BKE_curves.hh b/source/blender/blenkernel/BKE_curves.hh index 168b17bad30..dc67f1e7403 100644 --- a/source/blender/blenkernel/BKE_curves.hh +++ b/source/blender/blenkernel/BKE_curves.hh @@ -264,22 +264,10 @@ class CurvesGeometry : public ::CurvesGeometry { MutableSpan nurbs_weights_for_write(); /** - * The index of a triangle (#MLoopTri) that a curve is attached to. - * The index is -1, if the curve is not attached. + * UV coordinate for each curve that encodes where the curve is attached to the surface mesh. */ - VArray surface_triangle_indices() const; - MutableSpan surface_triangle_indices_for_write(); - - /** - * Barycentric coordinates of the attachment point within a triangle. - * Only the first two coordinates are stored. The third coordinate can be derived because the sum - * of the three coordinates is 1. - * - * When the triangle index is -1, this coordinate should be ignored. - * The span can be empty, when all triangle indices are -1. - */ - Span surface_triangle_coords() const; - MutableSpan surface_triangle_coords_for_write(); + Span surface_uv_coords() const; + MutableSpan surface_uv_coords_for_write(); VArray selection_point_float() const; MutableSpan selection_point_float_for_write(); diff --git a/source/blender/blenkernel/intern/curves_geometry.cc b/source/blender/blenkernel/intern/curves_geometry.cc index c2e67d853c9..2fa31bd4100 100644 --- a/source/blender/blenkernel/intern/curves_geometry.cc +++ b/source/blender/blenkernel/intern/curves_geometry.cc @@ -35,10 +35,9 @@ static const std::string ATTR_HANDLE_POSITION_RIGHT = "handle_right"; static const std::string ATTR_NURBS_ORDER = "nurbs_order"; static const std::string ATTR_NURBS_WEIGHT = "nurbs_weight"; static const std::string ATTR_NURBS_KNOTS_MODE = "knots_mode"; -static const std::string ATTR_SURFACE_TRIANGLE_INDEX = "surface_triangle_index"; -static const std::string ATTR_SURFACE_TRIANGLE_COORDINATE = "surface_triangle_coordinate"; static const std::string ATTR_SELECTION_POINT_FLOAT = ".selection_point_float"; static const std::string ATTR_SELECTION_CURVE_FLOAT = ".selection_curve_float"; +static const std::string ATTR_SURFACE_UV_COORDINATE = "surface_uv_coordinate"; /* -------------------------------------------------------------------- */ /** \name Constructors/Destructor @@ -419,24 +418,14 @@ MutableSpan CurvesGeometry::nurbs_knots_modes_for_write() return get_mutable_attribute(*this, ATTR_DOMAIN_CURVE, ATTR_NURBS_KNOTS_MODE, 0); } -VArray CurvesGeometry::surface_triangle_indices() const +Span CurvesGeometry::surface_uv_coords() const { - return get_varray_attribute(*this, ATTR_DOMAIN_CURVE, ATTR_SURFACE_TRIANGLE_INDEX, -1); + return get_span_attribute(*this, ATTR_DOMAIN_CURVE, ATTR_SURFACE_UV_COORDINATE); } -MutableSpan CurvesGeometry::surface_triangle_indices_for_write() +MutableSpan CurvesGeometry::surface_uv_coords_for_write() { - return get_mutable_attribute(*this, ATTR_DOMAIN_CURVE, ATTR_SURFACE_TRIANGLE_INDEX, -1); -} - -Span CurvesGeometry::surface_triangle_coords() const -{ - return get_span_attribute(*this, ATTR_DOMAIN_CURVE, ATTR_SURFACE_TRIANGLE_COORDINATE); -} - -MutableSpan CurvesGeometry::surface_triangle_coords_for_write() -{ - return get_mutable_attribute(*this, ATTR_DOMAIN_CURVE, ATTR_SURFACE_TRIANGLE_COORDINATE); + return get_mutable_attribute(*this, ATTR_DOMAIN_CURVE, ATTR_SURFACE_UV_COORDINATE); } VArray CurvesGeometry::selection_point_float() const -- cgit v1.2.3