diff options
Diffstat (limited to 'source/blender/blenkernel/BKE_curves.hh')
-rw-r--r-- | source/blender/blenkernel/BKE_curves.hh | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/source/blender/blenkernel/BKE_curves.hh b/source/blender/blenkernel/BKE_curves.hh index c4edeae99a4..9fd023edcf2 100644 --- a/source/blender/blenkernel/BKE_curves.hh +++ b/source/blender/blenkernel/BKE_curves.hh @@ -158,6 +158,9 @@ class CurvesGeometry : public ::CurvesGeometry { /** Return the number of curves with each type. */ std::array<int, CURVE_TYPES_NUM> count_curve_types() const; + /** Return true if all of the curves have the provided type. */ + bool is_single_type(CurveType type) const; + Span<float3> positions() const; MutableSpan<float3> positions_for_write(); @@ -175,6 +178,13 @@ class CurvesGeometry : public ::CurvesGeometry { MutableSpan<int> resolution_for_write(); /** + * Which method to use for calculating the normals of evaluated points (#NormalMode). + * Call #tag_normals_changed after changes. + */ + VArray<int8_t> normal_mode() const; + MutableSpan<int8_t> normal_mode_for_write(); + + /** * Handle types for Bezier control points. Call #tag_topology_changed after changes. */ VArray<int8_t> handle_types_left() const; @@ -280,6 +290,8 @@ class CurvesGeometry : public ::CurvesGeometry { Span<int> bezier_evaluated_offsets_for_curve(int curve_index) const; Span<float3> evaluated_positions() const; + Span<float3> evaluated_tangents() const; + Span<float3> evaluated_normals() const; /** * Return a cache of accumulated lengths along the curve. Each item is the length of the @@ -379,6 +391,31 @@ inline float3 decode_surface_bary_coord(const float2 &v) return {v.x, v.y, 1.0f - v.x - v.y}; } +namespace poly { + +/** + * Calculate the direction at every point, defined as the normalized average of the two neighboring + * segments (and if non-cyclic, the direction of the first and last segments). This is different + * than evaluating the derivative of the basis functions for curve types like NURBS, Bezier, or + * Catmull Rom, though the results may be similar. + */ +void calculate_tangents(Span<float3> positions, bool is_cyclic, MutableSpan<float3> tangents); + +/** + * Calculate directions perpendicular to the tangent at every point by rotating an arbitrary + * starting vector by the same rotation of each tangent. If the curve is cylic, propagate a + * correction through the entire to make sure the first and last normal align. + */ +void calculate_normals_minimum(Span<float3> tangents, bool cyclic, MutableSpan<float3> normals); + +/** + * Calculate a vector perpendicular to every tangent on the X-Y plane (unless the tangent is + * vertical, in that case use the X direction). + */ +void calculate_normals_z_up(Span<float3> tangents, MutableSpan<float3> normals); + +} // namespace poly + namespace bezier { /** @@ -586,6 +623,11 @@ inline IndexRange CurvesGeometry::curves_range() const return IndexRange(this->curves_num()); } +inline bool CurvesGeometry::is_single_type(const CurveType type) const +{ + return this->count_curve_types()[type] == this->curves_num(); +} + inline IndexRange CurvesGeometry::points_for_curve(const int index) const { /* Offsets are not allocated when there are no curves. */ |