38 if (curves_ !=
nullptr) {
48 if (curves_ !=
nullptr) {
52 if (curve_for_render_ !=
nullptr) {
56 curve_for_render_ =
nullptr;
65 return curves_ !=
nullptr;
73 ownership_ = ownership;
101 return curves_ ==
nullptr;
123 curves_->
geometry.wrap().count_memory(memory);
129 if (curves_ ==
nullptr) {
132 if (curve_for_render_ !=
nullptr) {
133 return curve_for_render_;
135 std::lock_guard
lock{curve_for_render_mutex_};
136 if (curve_for_render_ !=
nullptr) {
137 return curve_for_render_;
143 return curve_for_render_;
171 Vector<float3> nurbs_tangents;
173 for (const int i_curve : range) {
174 const IndexRange points = points_by_curve[i_curve];
175 const IndexRange evaluated_points = evaluated_points_by_curve[i_curve];
177 MutableSpan<float3> curve_normals = results.as_mutable_span().slice(points);
179 switch (types[i_curve]) {
180 case CURVE_TYPE_CATMULL_ROM: {
181 const Span<float3> normals = evaluated_normals.slice(evaluated_points);
182 const int resolution = resolutions[i_curve];
183 for (const int i : IndexRange(points.size())) {
184 curve_normals[i] = normals[resolution * i];
188 case CURVE_TYPE_POLY:
189 curve_normals.copy_from(evaluated_normals.slice(evaluated_points));
191 case CURVE_TYPE_BEZIER: {
192 const Span<float3> normals = evaluated_normals.slice(evaluated_points);
193 curve_normals.first() = normals.first();
194 const Span<int> offsets = curves.bezier_evaluated_offsets_for_curve(i_curve);
195 for (const int i : IndexRange(points.size()).drop_front(1)) {
196 curve_normals[i] = normals[offsets[i]];
200 case CURVE_TYPE_NURBS: {
203 nurbs_tangents.clear();
204 nurbs_tangents.resize(points.size());
205 const bool cyclic = curves_cyclic[i_curve];
206 const Span<float3> curve_positions = positions.slice(points);
207 curves::poly::calculate_tangents(curve_positions, cyclic, nurbs_tangents);
208 switch (NormalMode(normal_modes[i_curve])) {
209 case NORMAL_MODE_Z_UP:
210 curves::poly::calculate_normals_z_up(nurbs_tangents, curve_normals);
212 case NORMAL_MODE_MINIMUM_TWIST:
213 curves::poly::calculate_normals_minimum(nurbs_tangents, cyclic, curve_normals);
215 case NORMAL_MODE_FREE:
216 custom_normals.materialize(points, results);
237 if (domain == AttrDomain::Point) {
241 if (domain == AttrDomain::Curve) {
263 return curves.evaluated_length_total_for_curve(index, cyclic[index]);
266 if (domain == AttrDomain::Curve) {
270 if (domain == AttrDomain::Point) {
271 return curves.
adapt_domain<
float>(std::move(lengths), AttrDomain::Curve, AttrDomain::Point);
277CurveLengthFieldInput::CurveLengthFieldInput()
struct Curves * BKE_curves_copy_for_eval(const struct Curves *curves_src)
Low-level operations for curves.
void BKE_id_free(Main *bmain, void *idv)
void * BKE_id_new_nomain(short type, const char *name)
Enumerations for DNA_ID.h.
static VArray ForContainer(ContainerT container)
static VArray ForSpan(Span< T > values)
static VArray ForFunc(const int64_t size, GetFunc get_func)
GAttributeReader lookup_or_default(StringRef attribute_id, AttrDomain domain, eCustomDataType data_type, const void *default_value=nullptr) const
void ensure_owns_direct_data() override
const Curve * get_curve_for_render() const
void count_memory(MemoryCounter &memory) const override
void replace(Curves *curve, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
~CurveComponent() override
const Curves * get() const
GeometryComponentPtr copy() const override
bool is_empty() const final
std::optional< AttributeAccessor > attributes() const final
std::optional< MutableAttributeAccessor > attributes_for_write() final
bool owns_direct_data() const override
OffsetIndices< int > points_by_curve() const
VArray< int8_t > normal_mode() const
IndexRange curves_range() const
VArray< int > resolution() const
Span< float3 > evaluated_normals() const
Span< float3 > positions() const
OffsetIndices< int > evaluated_points_by_curve() const
GVArray adapt_domain(const GVArray &varray, AttrDomain from, AttrDomain to) const
AttributeAccessor attributes() const
bool is_single_type(CurveType type) const
void ensure_evaluated_lengths() const
VArray< int8_t > curve_types() const
VArray< bool > cyclic() const
static float normals[][3]
const AttributeAccessorFunctions & get_attribute_accessor_functions()
ImplicitSharingPtr< GeometryComponent > GeometryComponentPtr
static Array< float3 > curve_normal_point_domain(const CurvesGeometry &curves)
VArray< float3 > curve_normals_varray(const CurvesGeometry &curves, AttrDomain domain)
static VArray< float > construct_curve_length_gvarray(const CurvesGeometry &curves, const AttrDomain domain)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
VecBase< float, 3 > float3
unsigned __int64 uint64_t
const struct Curves * curve_eval
struct EditFont * editfont