Cleanup: simplify wrapping CurvesGeometry in C++

This commit is contained in:
Jacques Lucke 2023-01-31 18:45:34 +01:00
parent fa9fc59b56
commit 2995165148
72 changed files with 154 additions and 174 deletions

View File

@ -128,17 +128,6 @@ class CurvesGeometry : public ::CurvesGeometry {
CurvesGeometry &operator=(CurvesGeometry &&other);
~CurvesGeometry();
static CurvesGeometry &wrap(::CurvesGeometry &dna_struct)
{
CurvesGeometry *geometry = reinterpret_cast<CurvesGeometry *>(&dna_struct);
return *geometry;
}
static const CurvesGeometry &wrap(const ::CurvesGeometry &dna_struct)
{
const CurvesGeometry *geometry = reinterpret_cast<const CurvesGeometry *>(&dna_struct);
return *geometry;
}
/* --------------------------------------------------------------------
* Accessors.
*/
@ -408,6 +397,8 @@ class CurvesGeometry : public ::CurvesGeometry {
}
};
static_assert(sizeof(blender::bke::CurvesGeometry) == sizeof(::CurvesGeometry));
/**
* Used to propagate deformation data through modifier evaluation so that sculpt tools can work on
* evaluated data.
@ -966,3 +957,12 @@ struct CurvesSurfaceTransforms {
};
} // namespace blender::bke
inline blender::bke::CurvesGeometry &CurvesGeometry::wrap()
{
return *reinterpret_cast<blender::bke::CurvesGeometry *>(this);
}
inline const blender::bke::CurvesGeometry &CurvesGeometry::wrap() const
{
return *reinterpret_cast<const blender::bke::CurvesGeometry *>(this);
}

View File

@ -112,7 +112,7 @@ static std::optional<blender::bke::MutableAttributeAccessor> get_attribute_acces
}
case ID_CV: {
Curves &curves_id = reinterpret_cast<Curves &>(id);
CurvesGeometry &curves = CurvesGeometry::wrap(curves_id.geometry);
CurvesGeometry &curves = curves_id.geometry.wrap();
return curves.attributes_for_write();
}
default: {

View File

@ -601,7 +601,7 @@ GeometryDeformation get_evaluated_curves_deformation(const Depsgraph &depsgraph,
{
BLI_assert(ob_orig.type == OB_CURVES);
const Curves &curves_id_orig = *static_cast<const Curves *>(ob_orig.data);
const CurvesGeometry &curves_orig = CurvesGeometry::wrap(curves_id_orig.geometry);
const CurvesGeometry &curves_orig = curves_id_orig.geometry.wrap();
const int points_num = curves_orig.points_num();
GeometryDeformation deformation;
@ -643,7 +643,7 @@ GeometryDeformation get_evaluated_curves_deformation(const Depsgraph &depsgraph,
if (curves_component_eval != nullptr) {
const Curves *curves_id_eval = curves_component_eval->get_for_read();
if (curves_id_eval != nullptr) {
const CurvesGeometry &curves_eval = CurvesGeometry::wrap(curves_id_eval->geometry);
const CurvesGeometry &curves_eval = curves_id_eval->geometry.wrap();
if (curves_eval.points_num() == points_num) {
deformation.positions = curves_eval.positions();
}

View File

@ -82,7 +82,7 @@ Curves *curve_legacy_to_curves(const Curve &curve_legacy, const ListBase &nurbs_
const Vector<const Nurb *> src_curves(nurbs_list);
Curves *curves_id = curves_new_nomain(0, src_curves.size());
CurvesGeometry &curves = CurvesGeometry::wrap(curves_id->geometry);
CurvesGeometry &curves = curves_id->geometry.wrap();
MutableAttributeAccessor curves_attributes = curves.attributes_for_write();
MutableSpan<int8_t> types = curves.curve_types_for_write();

View File

@ -70,8 +70,8 @@ static void curves_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, con
const Curves *curves_src = (const Curves *)id_src;
curves_dst->mat = static_cast<Material **>(MEM_dupallocN(curves_src->mat));
const bke::CurvesGeometry &src = bke::CurvesGeometry::wrap(curves_src->geometry);
bke::CurvesGeometry &dst = bke::CurvesGeometry::wrap(curves_dst->geometry);
const bke::CurvesGeometry &src = curves_src->geometry.wrap();
bke::CurvesGeometry &dst = curves_dst->geometry.wrap();
/* We need special handling here because the generic ID management code has already done a
* shallow copy from the source to the destination, and because the copy-on-write functionality
@ -103,7 +103,7 @@ static void curves_free_data(ID *id)
Curves *curves = (Curves *)id;
BKE_animdata_free(&curves->id, false);
blender::bke::CurvesGeometry::wrap(curves->geometry).~CurvesGeometry();
curves->geometry.wrap().~CurvesGeometry();
BKE_curves_batch_cache_free(curves);
@ -174,7 +174,7 @@ static void curves_blend_read_data(BlendDataReader *reader, ID *id)
curves->geometry.runtime = MEM_new<blender::bke::CurvesGeometryRuntime>(__func__);
/* Recalculate curve type count cache that isn't saved in files. */
blender::bke::CurvesGeometry::wrap(curves->geometry).update_curve_types();
curves->geometry.wrap().update_curve_types();
/* Materials */
BLO_read_pointer_array(reader, (void **)&curves->mat);
@ -247,8 +247,7 @@ BoundBox *BKE_curves_boundbox_get(Object *ob)
if (ob->runtime.bb == nullptr) {
ob->runtime.bb = MEM_cnew<BoundBox>(__func__);
const blender::bke::CurvesGeometry &curves = blender::bke::CurvesGeometry::wrap(
curves_id->geometry);
const blender::bke::CurvesGeometry &curves = curves_id->geometry.wrap();
float3 min(FLT_MAX);
float3 max(-FLT_MAX);
@ -372,7 +371,7 @@ Curves *curves_new_nomain(const int points_num, const int curves_num)
BLI_assert(points_num >= 0);
BLI_assert(curves_num >= 0);
Curves *curves_id = static_cast<Curves *>(BKE_id_new_nomain(ID_CV, nullptr));
CurvesGeometry &curves = CurvesGeometry::wrap(curves_id->geometry);
CurvesGeometry &curves = curves_id->geometry.wrap();
curves.resize(points_num, curves_num);
return curves_id;
}
@ -380,7 +379,7 @@ Curves *curves_new_nomain(const int points_num, const int curves_num)
Curves *curves_new_nomain_single(const int points_num, const CurveType type)
{
Curves *curves_id = curves_new_nomain(points_num, 1);
CurvesGeometry &curves = CurvesGeometry::wrap(curves_id->geometry);
CurvesGeometry &curves = curves_id->geometry.wrap();
curves.offsets_for_write().last() = points_num;
curves.fill_curve_types(type);
return curves_id;
@ -389,7 +388,7 @@ Curves *curves_new_nomain_single(const int points_num, const CurveType type)
Curves *curves_new_nomain(CurvesGeometry curves)
{
Curves *curves_id = static_cast<Curves *>(BKE_id_new_nomain(ID_CV, nullptr));
bke::CurvesGeometry::wrap(curves_id->geometry) = std::move(curves);
curves_id->geometry.wrap() = std::move(curves);
return curves_id;
}

View File

@ -48,7 +48,7 @@ void GeometryComponentEditData::remember_deformed_curve_positions_if_necessary(
if (curves_id == nullptr) {
return;
}
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
const bke::CurvesGeometry &curves = curves_id->geometry.wrap();
const int points_num = curves.points_num();
if (points_num != edit_component.curves_edit_hints_->curves_id_orig.geometry.point_num) {
return;

View File

@ -55,7 +55,7 @@ GeometryFieldContext::GeometryFieldContext(const GeometryComponent &component,
case GEO_COMPONENT_TYPE_CURVE: {
const CurveComponent &curve_component = static_cast<const CurveComponent &>(component);
const Curves *curves = curve_component.get_for_read();
geometry_ = curves ? &CurvesGeometry::wrap(curves->geometry) : nullptr;
geometry_ = curves ? &curves->geometry.wrap() : nullptr;
break;
}
case GEO_COMPONENT_TYPE_POINT_CLOUD: {
@ -560,8 +560,7 @@ std::optional<eAttrDomain> try_detect_field_domain(const GeometryComponent &comp
}
else if (const auto *curves_field_input = dynamic_cast<const CurvesFieldInput *>(
&field_input)) {
if (!handle_domain(
curves_field_input->preferred_domain(CurvesGeometry::wrap(curves->geometry)))) {
if (!handle_domain(curves_field_input->preferred_domain(curves->geometry.wrap()))) {
return std::nullopt;
}
}

View File

@ -227,7 +227,7 @@ bool GeometrySet::compute_boundbox_without_instances(float3 *r_min, float3 *r_ma
have_minmax |= BKE_volume_min_max(volume, *r_min, *r_max);
}
if (const Curves *curves_id = this->get_curves_for_read()) {
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
const bke::CurvesGeometry &curves = curves_id->geometry.wrap();
have_minmax |= curves.bounds_min_max(*r_min, *r_max);
}
return have_minmax;

View File

@ -802,8 +802,7 @@ static Mesh *mesh_new_from_evaluated_curve_type_object(const Object *evaluated_o
}
if (const Curves *curves = get_evaluated_curves_from_object(evaluated_object)) {
const blender::bke::AnonymousAttributePropagationInfo propagation_info;
return blender::bke::curve_to_wire_mesh(blender::bke::CurvesGeometry::wrap(curves->geometry),
propagation_info);
return blender::bke::curve_to_wire_mesh(curves->geometry.wrap(), propagation_info);
}
return nullptr;
}

View File

@ -33,7 +33,7 @@ void OVERLAY_sculpt_curves_cache_init(OVERLAY_Data *vedata)
static bool everything_selected(const Curves &curves_id)
{
using namespace blender;
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
const bke::CurvesGeometry &curves = curves_id.geometry.wrap();
const VArray<bool> selection = curves.attributes().lookup_or_default<bool>(
".selection", ATTR_DOMAIN_POINT, true);
return selection.is_single() && selection.get_internal_single();

View File

@ -131,7 +131,7 @@ static void populate_cache_for_geometry(Object &object,
}
case OB_CURVES_LEGACY: {
Curve *curve = static_cast<Curve *>(object.data);
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curve->curve_eval->geometry);
const bke::CurvesGeometry &curves = curve->curve_eval->geometry.wrap();
if (curves.attributes().contains(".viewer")) {
GPUBatch *batch = DRW_cache_curve_edge_wire_viewer_attribute_get(&object);
DRW_shgroup_uniform_float_copy(pd.viewer_attribute_curve_grp, "opacity", opacity);
@ -141,7 +141,7 @@ static void populate_cache_for_geometry(Object &object,
}
case OB_CURVES: {
Curves *curves_id = static_cast<Curves *>(object.data);
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
const bke::CurvesGeometry &curves = curves_id->geometry.wrap();
if (curves.attributes().contains(".viewer")) {
bool is_point_domain;
GPUVertBuf **texture = DRW_curves_texture_for_evaluated_attribute(

View File

@ -213,11 +213,10 @@ static CurveRenderData *curve_render_data_create(Curve *cu,
if (types & CU_DATATYPE_WIRE) {
if (rdata->curve_eval != nullptr) {
curve_eval_render_wire_verts_edges_len_get(
blender::bke::CurvesGeometry::wrap(rdata->curve_eval->geometry),
&rdata->wire.curve_len,
&rdata->wire.vert_len,
&rdata->wire.edge_len);
curve_eval_render_wire_verts_edges_len_get(rdata->curve_eval->geometry.wrap(),
&rdata->wire.curve_len,
&rdata->wire.vert_len,
&rdata->wire.edge_len);
}
}
@ -473,8 +472,7 @@ static void curve_create_curves_pos(CurveRenderData *rdata, GPUVertBuf *vbo_curv
GPU_vertbuf_init_with_format(vbo_curves_pos, &format);
GPU_vertbuf_data_alloc(vbo_curves_pos, vert_len);
const blender::bke::CurvesGeometry &curves = blender::bke::CurvesGeometry::wrap(
rdata->curve_eval->geometry);
const blender::bke::CurvesGeometry &curves = rdata->curve_eval->geometry.wrap();
const Span<float3> positions = curves.evaluated_positions();
GPU_vertbuf_attr_fill(vbo_curves_pos, attr_id.pos, positions.data());
}
@ -495,7 +493,7 @@ static void curve_create_attribute(CurveRenderData *rdata, GPUVertBuf *vbo_attr)
GPU_vertbuf_init_with_format(vbo_attr, &format);
GPU_vertbuf_data_alloc(vbo_attr, vert_len);
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(rdata->curve_eval->geometry);
const bke::CurvesGeometry &curves = rdata->curve_eval->geometry.wrap();
curves.ensure_can_interpolate_to_evaluated();
const VArraySpan<ColorGeometry4f> colors = curves.attributes().lookup<ColorGeometry4f>(
".viewer", ATTR_DOMAIN_POINT);
@ -519,7 +517,7 @@ static void curve_create_curves_lines(CurveRenderData *rdata, GPUIndexBuf *ibo_c
GPUIndexBufBuilder elb;
GPU_indexbuf_init_ex(&elb, GPU_PRIM_LINE_STRIP, index_len, vert_len);
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(rdata->curve_eval->geometry);
const bke::CurvesGeometry &curves = rdata->curve_eval->geometry.wrap();
const OffsetIndices points_by_curve = curves.evaluated_points_by_curve();
const VArray<bool> cyclic = curves.cyclic();

View File

@ -237,7 +237,7 @@ static void curves_batch_cache_fill_segments_proc_pos(
{
using namespace blender;
/* TODO: use hair radius layer if available. */
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
const bke::CurvesGeometry &curves = curves_id.geometry.wrap();
const OffsetIndices points_by_curve = curves.points_by_curve();
const Span<float3> positions = curves.positions();
@ -305,7 +305,7 @@ static void curves_batch_cache_ensure_edit_points_pos(const Curves &curves_id,
CurvesBatchCache &cache)
{
using namespace blender;
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
const bke::CurvesGeometry &curves = curves_id.geometry.wrap();
static GPUVertFormat format_pos = {0};
static uint pos;
@ -324,7 +324,7 @@ static void curves_batch_cache_ensure_edit_points_data(const Curves &curves_id,
CurvesBatchCache &cache)
{
using namespace blender;
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
const bke::CurvesGeometry &curves = curves_id.geometry.wrap();
static GPUVertFormat format_data = {0};
static uint color;
@ -361,7 +361,7 @@ static void curves_batch_cache_ensure_edit_points_data(const Curves &curves_id,
static void curves_batch_cache_ensure_edit_lines(const Curves &curves_id, CurvesBatchCache &cache)
{
using namespace blender;
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
const bke::CurvesGeometry &curves = curves_id.geometry.wrap();
const int vert_len = curves.points_num();
const int curve_len = curves.curves_num();
@ -432,8 +432,7 @@ static void curves_batch_ensure_attribute(const Curves &curves,
request.domain == ATTR_DOMAIN_POINT ? curves.geometry.point_num :
curves.geometry.curve_num);
const bke::AttributeAccessor attributes =
bke::CurvesGeometry::wrap(curves.geometry).attributes();
const bke::AttributeAccessor attributes = curves.geometry.wrap().attributes();
/* TODO(@kevindietrich): float4 is used for scalar attributes as the implicit conversion done
* by OpenGL to vec4 for a scalar `s` will produce a `vec4(s, 0, 0, 1)`. However, following
@ -463,8 +462,7 @@ static void curves_batch_cache_fill_strands_data(const Curves &curves_id,
GPUVertBufRaw &data_step,
GPUVertBufRaw &seg_step)
{
const blender::bke::CurvesGeometry &curves = blender::bke::CurvesGeometry::wrap(
curves_id.geometry);
const blender::bke::CurvesGeometry &curves = curves_id.geometry.wrap();
const blender::OffsetIndices points_by_curve = curves.points_by_curve();
for (const int i : IndexRange(curves.curves_num())) {
@ -694,8 +692,7 @@ static void request_attribute(Curves &curves, const char *name)
DRW_Attributes attributes{};
blender::bke::CurvesGeometry &curves_geometry = blender::bke::CurvesGeometry::wrap(
curves.geometry);
blender::bke::CurvesGeometry &curves_geometry = curves.geometry.wrap();
std::optional<blender::bke::AttributeMetaData> meta_data =
curves_geometry.attributes().lookup_meta_data(name);
if (!meta_data) {

View File

@ -327,8 +327,7 @@ DRWShadingGroup *DRW_shgroup_curves_create_sub(Object *object,
/* Use the radius of the root and tip of the first curve for now. This is a workaround that we
* use for now because we can't use a per-point radius yet. */
const blender::bke::CurvesGeometry &curves = blender::bke::CurvesGeometry::wrap(
curves_id.geometry);
const blender::bke::CurvesGeometry &curves = curves_id.geometry.wrap();
if (curves.curves_num() >= 1) {
blender::VArray<float> radii = curves.attributes().lookup_or_default(
"radius", ATTR_DOMAIN_POINT, 0.005f);

View File

@ -8,7 +8,7 @@
float (*ED_curves_point_normals_array_create(const Curves *curves_id))[3]
{
using namespace blender;
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
const bke::CurvesGeometry &curves = curves_id->geometry.wrap();
const int size = curves.points_num();
float3 *data = static_cast<float3 *>(MEM_malloc_arrayN(size, sizeof(float3), __func__));

View File

@ -238,7 +238,7 @@ static void try_convert_single_object(Object &curves_ob,
return;
}
Curves &curves_id = *static_cast<Curves *>(curves_ob.data);
CurvesGeometry &curves = CurvesGeometry::wrap(curves_id.geometry);
CurvesGeometry &curves = curves_id.geometry.wrap();
if (curves_id.surface == nullptr) {
return;
}
@ -521,7 +521,7 @@ static int curves_convert_from_particle_system_exec(bContext *C, wmOperator * /*
Object *ob_new = BKE_object_add(&bmain, &scene, &view_layer, OB_CURVES, psys_eval->name);
Curves *curves_id = static_cast<Curves *>(ob_new->data);
BKE_object_apply_mat4(ob_new, ob_from_orig->object_to_world, true, false);
bke::CurvesGeometry::wrap(curves_id->geometry) = particles_to_curves(*ob_from_eval, *psys_eval);
curves_id->geometry.wrap() = particles_to_curves(*ob_from_eval, *psys_eval);
DEG_relations_tag_update(&bmain);
WM_main_add_notifier(NC_OBJECT | ND_DRAW, nullptr);
@ -562,7 +562,7 @@ static void snap_curves_to_surface_exec_object(Object &curves_ob,
bool *r_missing_uvs)
{
Curves &curves_id = *static_cast<Curves *>(curves_ob.data);
CurvesGeometry &curves = CurvesGeometry::wrap(curves_id.geometry);
CurvesGeometry &curves = curves_id.geometry.wrap();
const Mesh &surface_mesh = *static_cast<const Mesh *>(surface_ob.data);
const Span<float3> surface_positions = surface_mesh.vert_positions();
@ -774,7 +774,7 @@ static int curves_set_selection_domain_exec(bContext *C, wmOperator *op)
curves_id->selection_domain = domain;
CurvesGeometry &curves = CurvesGeometry::wrap(curves_id->geometry);
CurvesGeometry &curves = curves_id->geometry.wrap();
bke::MutableAttributeAccessor attributes = curves.attributes_for_write();
if (curves.points_num() == 0) {
continue;
@ -830,7 +830,7 @@ static void CURVES_OT_set_selection_domain(wmOperatorType *ot)
static bool has_anything_selected(const Span<Curves *> curves_ids)
{
return std::any_of(curves_ids.begin(), curves_ids.end(), [](const Curves *curves_id) {
return has_anything_selected(CurvesGeometry::wrap(curves_id->geometry));
return has_anything_selected(curves_id->geometry.wrap());
});
}
@ -846,9 +846,7 @@ static int select_all_exec(bContext *C, wmOperator *op)
for (Curves *curves_id : unique_curves) {
/* (De)select all the curves. */
select_all(CurvesGeometry::wrap(curves_id->geometry),
eAttrDomain(curves_id->selection_domain),
action);
select_all(curves_id->geometry.wrap(), eAttrDomain(curves_id->selection_domain), action);
/* Use #ID_RECALC_GEOMETRY instead of #ID_RECALC_SELECT because it is handled as a generic
* attribute for now. */
@ -881,7 +879,7 @@ static int select_random_exec(bContext *C, wmOperator *op)
const float probability = RNA_float_get(op->ptr, "probability");
for (Curves *curves_id : unique_curves) {
CurvesGeometry &curves = CurvesGeometry::wrap(curves_id->geometry);
CurvesGeometry &curves = curves_id->geometry.wrap();
select_random(curves, eAttrDomain(curves_id->selection_domain), uint32_t(seed), probability);
/* Use #ID_RECALC_GEOMETRY instead of #ID_RECALC_SELECT because it is handled as a generic
@ -952,7 +950,7 @@ static int select_end_exec(bContext *C, wmOperator *op)
const int amount = RNA_int_get(op->ptr, "amount");
for (Curves *curves_id : unique_curves) {
CurvesGeometry &curves = CurvesGeometry::wrap(curves_id->geometry);
CurvesGeometry &curves = curves_id->geometry.wrap();
select_ends(curves, eAttrDomain(curves_id->selection_domain), amount, end_points);
/* Use #ID_RECALC_GEOMETRY instead of #ID_RECALC_SELECT because it is handled as a generic

View File

@ -52,7 +52,7 @@ static IndexMask retrieve_selected_curves(const bke::CurvesGeometry &curves,
IndexMask retrieve_selected_curves(const Curves &curves_id, Vector<int64_t> &r_indices)
{
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
const bke::CurvesGeometry &curves = curves_id.geometry.wrap();
return retrieve_selected_curves(curves, r_indices);
}
@ -67,7 +67,7 @@ IndexMask retrieve_selected_points(const bke::CurvesGeometry &curves, Vector<int
IndexMask retrieve_selected_points(const Curves &curves_id, Vector<int64_t> &r_indices)
{
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
const bke::CurvesGeometry &curves = curves_id.geometry.wrap();
return retrieve_selected_points(curves, r_indices);
}

View File

@ -60,7 +60,7 @@ static bool step_encode(bContext *C, Main *bmain, UndoStep *us_p)
StepObject &object = us->objects[i];
object.obedit_ref.ptr = ob;
object.geometry = bke::CurvesGeometry::wrap(curves_id.geometry);
object.geometry = curves_id.geometry.wrap();
}
});
MEM_SAFE_FREE(objects);
@ -86,7 +86,7 @@ static void step_decode(
Curves &curves_id = *static_cast<Curves *>(object.obedit_ref.ptr->data);
/* Overwrite the curves geometry. */
bke::CurvesGeometry::wrap(curves_id.geometry) = object.geometry;
curves_id.geometry.wrap() = object.geometry;
DEG_id_tag_update(&curves_id.id, ID_RECALC_GEOMETRY);
}

View File

@ -2048,7 +2048,7 @@ static int object_curves_random_add_exec(bContext *C, wmOperator *op)
Object *object = ED_object_add_type(C, OB_CURVES, nullptr, loc, rot, false, local_view_bits);
Curves *curves_id = static_cast<Curves *>(object->data);
bke::CurvesGeometry::wrap(curves_id->geometry) = ed::curves::primitive_random_sphere(500, 8);
curves_id->geometry.wrap() = ed::curves::primitive_random_sphere(500, 8);
return OPERATOR_FINISHED;
}
@ -3091,8 +3091,7 @@ static int object_convert_exec(bContext *C, wmOperator *op)
newob->data = new_curves;
newob->type = OB_CURVES;
blender::bke::CurvesGeometry::wrap(
new_curves->geometry) = blender::bke::CurvesGeometry::wrap(curves_eval->geometry);
new_curves->geometry.wrap() = curves_eval->geometry.wrap();
BKE_object_material_from_eval_data(bmain, newob, &curves_eval->id);
BKE_object_free_derived_caches(newob);
@ -3392,8 +3391,7 @@ static int object_convert_exec(bContext *C, wmOperator *op)
else if (const Curves *curves_eval = geometry.get_curves_for_read()) {
bke::AnonymousAttributePropagationInfo propagation_info;
propagation_info.propagate_all = false;
Mesh *mesh = bke::curve_to_wire_mesh(bke::CurvesGeometry::wrap(curves_eval->geometry),
propagation_info);
Mesh *mesh = bke::curve_to_wire_mesh(curves_eval->geometry.wrap(), propagation_info);
BKE_mesh_nomain_to_mesh(mesh, new_mesh, newob);
BKE_object_material_from_eval_data(bmain, newob, &curves_eval->id);
}

View File

@ -1075,13 +1075,10 @@ static bool modifier_apply_obdata(
Curves &curves_eval = *geometry_set.get_curves_for_write();
/* Anonymous attributes shouldn't be available on the applied geometry. */
blender::bke::CurvesGeometry::wrap(curves_eval.geometry)
.attributes_for_write()
.remove_anonymous();
curves_eval.geometry.wrap().attributes_for_write().remove_anonymous();
/* Copy the relevant information to the original. */
blender::bke::CurvesGeometry::wrap(curves.geometry) = std::move(
blender::bke::CurvesGeometry::wrap(curves_eval.geometry));
curves.geometry.wrap() = std::move(curves_eval.geometry.wrap());
Main *bmain = DEG_get_bmain(depsgraph);
BKE_object_material_from_eval_data(bmain, ob, &curves_eval.id);
}

View File

@ -944,8 +944,8 @@ static int apply_objects_internal(bContext *C,
}
else if (ob->type == OB_CURVES) {
Curves &curves = *static_cast<Curves *>(ob->data);
blender::bke::CurvesGeometry::wrap(curves.geometry).transform(mat);
blender::bke::CurvesGeometry::wrap(curves.geometry).calculate_bezier_auto_handles();
curves.geometry.wrap().transform(mat);
curves.geometry.wrap().calculate_bezier_auto_handles();
}
else if (ob->type == OB_POINTCLOUD) {
PointCloud &pointcloud = *static_cast<PointCloud *>(ob->data);
@ -1674,7 +1674,7 @@ static int object_origin_set_exec(bContext *C, wmOperator *op)
else if (ob->type == OB_CURVES) {
using namespace blender;
Curves &curves_id = *static_cast<Curves *>(ob->data);
bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
bke::CurvesGeometry &curves = curves_id.geometry.wrap();
if (ELEM(centermode, ORIGIN_TO_CENTER_OF_MASS_SURFACE, ORIGIN_TO_CENTER_OF_MASS_VOLUME) ||
!ELEM(around, V3D_AROUND_CENTER_BOUNDS, V3D_AROUND_CENTER_MEDIAN)) {
BKE_report(

View File

@ -117,7 +117,7 @@ struct AddOperationExecutor {
curves_ob_orig_ = CTX_data_active_object(&C);
curves_id_orig_ = static_cast<Curves *>(curves_ob_orig_->data);
curves_orig_ = &CurvesGeometry::wrap(curves_id_orig_->geometry);
curves_orig_ = &curves_id_orig_->geometry.wrap();
if (curves_id_orig_->surface == nullptr || curves_id_orig_->surface->type != OB_MESH) {
report_missing_surface(stroke_extension.reports);

View File

@ -177,7 +177,7 @@ std::optional<CurvesBrush3D> sample_curves_3d_brush(const Depsgraph &depsgraph,
const float brush_radius_re)
{
const Curves &curves_id = *static_cast<Curves *>(curves_object.data);
const CurvesGeometry &curves = CurvesGeometry::wrap(curves_id.geometry);
const CurvesGeometry &curves = curves_id.geometry.wrap();
Object *surface_object = curves_id.surface;
Object *surface_object_eval = DEG_get_evaluated_object(&depsgraph, surface_object);

View File

@ -117,7 +117,7 @@ struct CombOperationExecutor {
curves_ob_orig_ = CTX_data_active_object(&C);
curves_id_orig_ = static_cast<Curves *>(curves_ob_orig_->data);
curves_orig_ = &CurvesGeometry::wrap(curves_id_orig_->geometry);
curves_orig_ = &curves_id_orig_->geometry.wrap();
if (curves_orig_->curves_num() == 0) {
return;
}

View File

@ -94,7 +94,7 @@ struct DeleteOperationExecutor {
object_ = CTX_data_active_object(&C);
curves_id_ = static_cast<Curves *>(object_->data);
curves_ = &CurvesGeometry::wrap(curves_id_->geometry);
curves_ = &curves_id_->geometry.wrap();
selected_curve_indices_.clear();
curve_selection_ = curves::retrieve_selected_curves(*curves_id_, selected_curve_indices_);

View File

@ -102,7 +102,7 @@ struct DensityAddOperationExecutor {
self_ = &self;
curves_ob_orig_ = CTX_data_active_object(&C);
curves_id_orig_ = static_cast<Curves *>(curves_ob_orig_->data);
curves_orig_ = &CurvesGeometry::wrap(curves_id_orig_->geometry);
curves_orig_ = &curves_id_orig_->geometry.wrap();
if (stroke_extension.is_first) {
self_->original_curve_num_ = curves_orig_->curves_num();
@ -540,7 +540,7 @@ struct DensitySubtractOperationExecutor {
object_ = CTX_data_active_object(&C);
curves_id_ = static_cast<Curves *>(object_->data);
curves_ = &CurvesGeometry::wrap(curves_id_->geometry);
curves_ = &curves_id_->geometry.wrap();
if (curves_->curves_num() == 0) {
return;
}
@ -834,7 +834,7 @@ static bool use_add_density_mode(const BrushStrokeMode brush_mode,
if (surface_ob_eval == nullptr) {
return true;
}
const CurvesGeometry &curves = CurvesGeometry::wrap(curves_id_orig.geometry);
const CurvesGeometry &curves = curves_id_orig.geometry.wrap();
if (curves.curves_num() <= 1) {
return true;
}

View File

@ -278,7 +278,7 @@ struct CurvesEffectOperationExecutor {
object_ = CTX_data_active_object(&C);
curves_id_ = static_cast<Curves *>(object_->data);
curves_ = &CurvesGeometry::wrap(curves_id_->geometry);
curves_ = &curves_id_->geometry.wrap();
if (curves_->curves_num() == 0) {
return;
}

View File

@ -362,7 +362,7 @@ static int select_random_exec(bContext *C, wmOperator *op)
const auto next_bool_random_value = [&]() { return rng.get_float() <= probability; };
for (Curves *curves_id : unique_curves) {
CurvesGeometry &curves = CurvesGeometry::wrap(curves_id->geometry);
CurvesGeometry &curves = curves_id->geometry.wrap();
const bool was_anything_selected = curves::has_anything_selected(curves);
bke::SpanAttributeWriter<float> attribute = float_selection_ensure(*curves_id);
@ -581,7 +581,7 @@ static int select_grow_update(bContext *C, wmOperator *op, const float mouse_dif
for (std::unique_ptr<GrowOperatorDataPerCurve> &curve_op_data : op_data.per_curve) {
Curves &curves_id = *curve_op_data->curves_id;
CurvesGeometry &curves = CurvesGeometry::wrap(curves_id.geometry);
CurvesGeometry &curves = curves_id.geometry.wrap();
const float distance = curve_op_data->pixel_to_distance_factor * mouse_diff_x;
bke::SpanAttributeWriter<float> selection = float_selection_ensure(curves_id);
@ -629,7 +629,7 @@ static void select_grow_invoke_per_curve(const Curves &curves_id,
const RegionView3D &rv3d,
GrowOperatorDataPerCurve &curve_op_data)
{
const CurvesGeometry &curves = CurvesGeometry::wrap(curves_id.geometry);
const CurvesGeometry &curves = curves_id.geometry.wrap();
const Span<float3> positions = curves.positions();
if (const bke::GAttributeReader original_selection = curves.attributes().lookup(".selection")) {
@ -773,7 +773,7 @@ static int select_grow_modal(bContext *C, wmOperator *op, const wmEvent *event)
/* Undo operator by resetting the selection to the original value. */
for (std::unique_ptr<GrowOperatorDataPerCurve> &curve_op_data : op_data.per_curve) {
Curves &curves_id = *curve_op_data->curves_id;
CurvesGeometry &curves = CurvesGeometry::wrap(curves_id.geometry);
CurvesGeometry &curves = curves_id.geometry.wrap();
bke::MutableAttributeAccessor attributes = curves.attributes_for_write();
attributes.remove(".selection");

View File

@ -90,7 +90,7 @@ struct PinchOperationExecutor {
object_ = CTX_data_active_object(&C);
curves_id_ = static_cast<Curves *>(object_->data);
curves_ = &CurvesGeometry::wrap(curves_id_->geometry);
curves_ = &curves_id_->geometry.wrap();
if (curves_->curves_num() == 0) {
return;
}

View File

@ -87,7 +87,7 @@ struct PuffOperationExecutor {
object_ = CTX_data_active_object(&C);
curves_id_ = static_cast<Curves *>(object_->data);
curves_ = &CurvesGeometry::wrap(curves_id_->geometry);
curves_ = &curves_id_->geometry.wrap();
if (curves_->curves_num() == 0) {
return;
}

View File

@ -13,7 +13,7 @@ namespace blender::ed::sculpt_paint {
bke::SpanAttributeWriter<float> float_selection_ensure(Curves &curves_id)
{
/* TODO: Use a generic attribute conversion utility instead of this function. */
bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
bke::CurvesGeometry &curves = curves_id.geometry.wrap();
bke::MutableAttributeAccessor attributes = curves.attributes_for_write();
if (const auto meta_data = attributes.lookup_meta_data(".selection")) {

View File

@ -83,7 +83,7 @@ struct SelectionPaintOperationExecutor {
object_ = CTX_data_active_object(&C);
curves_id_ = static_cast<Curves *>(object_->data);
curves_ = &CurvesGeometry::wrap(curves_id_->geometry);
curves_ = &curves_id_->geometry.wrap();
if (curves_->curves_num() == 0) {
return;
}

View File

@ -131,7 +131,7 @@ struct SlideOperationExecutor {
curves_ob_orig_ = CTX_data_active_object(&C);
curves_id_orig_ = static_cast<Curves *>(curves_ob_orig_->data);
curves_orig_ = &CurvesGeometry::wrap(curves_id_orig_->geometry);
curves_orig_ = &curves_id_orig_->geometry.wrap();
if (curves_id_orig_->surface == nullptr || curves_id_orig_->surface->type != OB_MESH) {
report_missing_surface(stroke_extension.reports);
return;

View File

@ -66,7 +66,7 @@ struct SmoothOperationExecutor {
object_ = CTX_data_active_object(&C);
curves_id_ = static_cast<Curves *>(object_->data);
curves_ = &CurvesGeometry::wrap(curves_id_->geometry);
curves_ = &curves_id_->geometry.wrap();
if (curves_->curves_num() == 0) {
return;
}

View File

@ -118,7 +118,7 @@ struct SnakeHookOperatorExecutor {
falloff_shape_ = static_cast<eBrushFalloffShape>(brush_->falloff_shape);
curves_id_ = static_cast<Curves *>(object_->data);
curves_ = &CurvesGeometry::wrap(curves_id_->geometry);
curves_ = &curves_id_->geometry.wrap();
if (curves_->curves_num() == 0) {
return;
}

View File

@ -33,7 +33,7 @@ static void createTransCurvesVerts(bContext * /*C*/, TransInfo *t)
for (const int i : trans_data_contrainers.index_range()) {
TransDataContainer &tc = trans_data_contrainers[i];
Curves *curves_id = static_cast<Curves *>(tc.obedit->data);
bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
bke::CurvesGeometry &curves = curves_id->geometry.wrap();
selection_per_object[i] = ed::curves::retrieve_selected_points(curves,
selected_indices_per_object[i]);
@ -51,7 +51,7 @@ static void createTransCurvesVerts(bContext * /*C*/, TransInfo *t)
continue;
}
Curves *curves_id = static_cast<Curves *>(tc.obedit->data);
bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
bke::CurvesGeometry &curves = curves_id->geometry.wrap();
IndexMask selected_indices = selection_per_object[i];
float mtx[3][3], smtx[3][3];
@ -82,7 +82,7 @@ static void recalcData_curves(TransInfo *t)
Span<TransDataContainer> trans_data_contrainers(t->data_container, t->data_container_len);
for (const TransDataContainer &tc : trans_data_contrainers) {
Curves *curves_id = static_cast<Curves *>(tc.obedit->data);
bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
bke::CurvesGeometry &curves = curves_id->geometry.wrap();
curves.calculate_bezier_auto_handles();
curves.tag_positions_changed();

View File

@ -1197,7 +1197,7 @@ static AllCurvesInfo preprocess_curves(const GeometrySet &geometry_set,
for (const int curve_index : info.realize_info.index_range()) {
RealizeCurveInfo &curve_info = info.realize_info[curve_index];
const Curves *curves_id = info.order[curve_index];
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
const bke::CurvesGeometry &curves = curves_id->geometry.wrap();
curve_info.curves = curves_id;
/* Access attributes. */
@ -1258,7 +1258,7 @@ static void execute_realize_curve_task(const RealizeInstancesOptions &options,
{
const RealizeCurveInfo &curves_info = *task.curve_info;
const Curves &curves_id = *curves_info.curves;
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
const bke::CurvesGeometry &curves = curves_id.geometry.wrap();
const IndexRange dst_point_range{task.start_indices.point, curves.points_num()};
const IndexRange dst_curve_range{task.start_indices.curve, curves.curves_num()};
@ -1347,7 +1347,7 @@ static void execute_realize_curve_tasks(const RealizeInstancesOptions &options,
/* Allocate new curves data-block. */
Curves *dst_curves_id = bke::curves_new_nomain(points_num, curves_num);
bke::CurvesGeometry &dst_curves = bke::CurvesGeometry::wrap(dst_curves_id->geometry);
bke::CurvesGeometry &dst_curves = dst_curves_id->geometry.wrap();
dst_curves.offsets_for_write().last() = points_num;
CurveComponent &dst_component = r_realized_geometry.get_component_for_write<CurveComponent>();
dst_component.replace(dst_curves_id);

View File

@ -17,6 +17,7 @@ extern "C" {
#ifdef __cplusplus
namespace blender::bke {
class CurvesGeometry;
class CurvesGeometryRuntime;
} // namespace blender::bke
using CurvesGeometryRuntimeHandle = blender::bke::CurvesGeometryRuntime;
@ -134,6 +135,11 @@ typedef struct CurvesGeometry {
* Runtime data for curves, stored as a pointer to allow defining this as a C++ class.
*/
CurvesGeometryRuntimeHandle *runtime;
#ifdef __cplusplus
blender::bke::CurvesGeometry &wrap();
const blender::bke::CurvesGeometry &wrap() const;
#endif
} CurvesGeometry;
/**

View File

@ -170,7 +170,7 @@ static Mesh *compute_hull(const GeometrySet &geometry_set)
if (const Curves *curves_id = geometry_set.get_curves_for_read()) {
count++;
span_count++;
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
const bke::CurvesGeometry &curves = curves_id->geometry.wrap();
positions_span = curves.evaluated_positions();
total_num += positions_span.size();
}
@ -205,7 +205,7 @@ static Mesh *compute_hull(const GeometrySet &geometry_set)
}
if (const Curves *curves_id = geometry_set.get_curves_for_read()) {
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
const bke::CurvesGeometry &curves = curves_id->geometry.wrap();
Span<float3> array = curves.evaluated_positions();
positions.as_mutable_span().slice(offset, array.size()).copy_from(array);
offset += array.size();

View File

@ -116,7 +116,7 @@ static void curve_fill_calculate(GeometrySet &geometry_set, const GeometryNodeCu
}
const Curves &curves_id = *geometry_set.get_curves_for_read();
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
const bke::CurvesGeometry &curves = curves_id.geometry.wrap();
if (curves.curves_num() == 0) {
geometry_set.replace_curves(nullptr);
return;

View File

@ -76,7 +76,7 @@ static void node_geo_exec(GeoNodeExecParams params)
}
const Curves &curves_id = *geometry_set.get_curves_for_read();
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
const bke::CurvesGeometry &curves = curves_id.geometry.wrap();
bke::CurvesFieldContext context{curves, ATTR_DOMAIN_POINT};
fn::FieldEvaluator evaluator{context, curves.points_num()};
evaluator.add(radius_field);

View File

@ -21,7 +21,7 @@ static void node_geo_exec(GeoNodeExecParams params)
}
const Curves &curves_id = *curve_set.get_curves_for_read();
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
const bke::CurvesGeometry &curves = curves_id.geometry.wrap();
const VArray<bool> cyclic = curves.cyclic();
curves.ensure_evaluated_lengths();

View File

@ -167,7 +167,7 @@ static Curves *create_arc_curve_from_points(const int resolution,
{
const int size = connect_center ? resolution + 1 : resolution;
Curves *curves_id = bke::curves_new_nomain_single(size, CURVE_TYPE_POLY);
bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
bke::CurvesGeometry &curves = curves_id->geometry.wrap();
const int stepcount = resolution - 1;
const int centerpoint = resolution;
@ -285,7 +285,7 @@ static Curves *create_arc_curve_from_radius(const int resolution,
{
const int size = connect_center ? resolution + 1 : resolution;
Curves *curves_id = bke::curves_new_nomain_single(size, CURVE_TYPE_POLY);
bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
bke::CurvesGeometry &curves = curves_id->geometry.wrap();
const int stepcount = resolution - 1;
const int centerpoint = resolution;

View File

@ -63,7 +63,7 @@ static Curves *create_bezier_segment_curve(const float3 start,
const GeometryNodeCurvePrimitiveBezierSegmentMode mode)
{
Curves *curves_id = bke::curves_new_nomain_single(2, CURVE_TYPE_BEZIER);
bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
bke::CurvesGeometry &curves = curves_id->geometry.wrap();
curves.resolution_for_write().fill(resolution);
MutableSpan<float3> positions = curves.positions_for_write();

View File

@ -137,7 +137,7 @@ static Curves *create_point_circle_curve(
}
Curves *curves_id = bke::curves_new_nomain_single(resolution, CURVE_TYPE_POLY);
bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
bke::CurvesGeometry &curves = curves_id->geometry.wrap();
curves.cyclic_for_write().first() = true;
MutableSpan<float3> positions = curves.positions_for_write();
@ -163,7 +163,7 @@ static Curves *create_point_circle_curve(
static Curves *create_radius_circle_curve(const int resolution, const float radius)
{
Curves *curves_id = bke::curves_new_nomain_single(resolution, CURVE_TYPE_POLY);
bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
bke::CurvesGeometry &curves = curves_id->geometry.wrap();
curves.cyclic_for_write().first() = true;
MutableSpan<float3> positions = curves.positions_for_write();

View File

@ -71,7 +71,7 @@ static void node_update(bNodeTree *ntree, bNode *node)
static Curves *create_point_line_curve(const float3 start, const float3 end)
{
Curves *curves_id = bke::curves_new_nomain_single(2, CURVE_TYPE_POLY);
bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
bke::CurvesGeometry &curves = curves_id->geometry.wrap();
curves.positions_for_write().first() = start;
curves.positions_for_write().last() = end;
@ -84,7 +84,7 @@ static Curves *create_direction_line_curve(const float3 start,
const float length)
{
Curves *curves_id = bke::curves_new_nomain_single(2, CURVE_TYPE_POLY);
bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
bke::CurvesGeometry &curves = curves_id->geometry.wrap();
curves.positions_for_write().first() = start;
curves.positions_for_write().last() = math::normalize(direction) * length + start;

View File

@ -34,7 +34,7 @@ static Curves *create_quadratic_bezier_curve(const float3 p1,
const int resolution)
{
Curves *curves_id = bke::curves_new_nomain_single(resolution + 1, CURVE_TYPE_POLY);
bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
bke::CurvesGeometry &curves = curves_id->geometry.wrap();
MutableSpan<float3> positions = curves.positions_for_write();

View File

@ -216,7 +216,7 @@ static void node_geo_exec(GeoNodeExecParams params)
const GeometryNodeCurvePrimitiveQuadMode mode = (GeometryNodeCurvePrimitiveQuadMode)storage.mode;
Curves *curves_id = bke::curves_new_nomain_single(4, CURVE_TYPE_POLY);
bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
bke::CurvesGeometry &curves = curves_id->geometry.wrap();
curves.cyclic_for_write().first() = true;
MutableSpan<float3> positions = curves.positions_for_write();

View File

@ -49,7 +49,7 @@ static Curves *create_spiral_curve(const float rotations,
(direction ? 1.0f : -1.0f);
Curves *curves_id = bke::curves_new_nomain_single(totalpoints + 1, CURVE_TYPE_POLY);
bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
bke::CurvesGeometry &curves = curves_id->geometry.wrap();
MutableSpan<float3> positions = curves.positions_for_write();

View File

@ -39,7 +39,7 @@ static Curves *create_star_curve(const float inner_radius,
const int points)
{
Curves *curves_id = bke::curves_new_nomain_single(points * 2, CURVE_TYPE_POLY);
bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
bke::CurvesGeometry &curves = curves_id->geometry.wrap();
curves.cyclic_for_write().first() = true;
MutableSpan<float3> positions = curves.positions_for_write();

View File

@ -67,8 +67,7 @@ static void node_geo_exec(GeoNodeExecParams params)
Field<int> count = params.extract_input<Field<int>>("Count");
geometry_set.modify_geometry_sets([&](GeometrySet &geometry) {
if (const Curves *src_curves_id = geometry.get_curves_for_read()) {
const bke::CurvesGeometry &src_curves = bke::CurvesGeometry::wrap(
src_curves_id->geometry);
const bke::CurvesGeometry &src_curves = src_curves_id->geometry.wrap();
bke::CurvesGeometry dst_curves = geometry::resample_to_count(
src_curves, selection, count);
Curves *dst_curves_id = bke::curves_new_nomain(std::move(dst_curves));
@ -82,8 +81,7 @@ static void node_geo_exec(GeoNodeExecParams params)
Field<float> length = params.extract_input<Field<float>>("Length");
geometry_set.modify_geometry_sets([&](GeometrySet &geometry) {
if (const Curves *src_curves_id = geometry.get_curves_for_read()) {
const bke::CurvesGeometry &src_curves = bke::CurvesGeometry::wrap(
src_curves_id->geometry);
const bke::CurvesGeometry &src_curves = src_curves_id->geometry.wrap();
bke::CurvesGeometry dst_curves = geometry::resample_to_length(
src_curves, selection, length);
Curves *dst_curves_id = bke::curves_new_nomain(std::move(dst_curves));
@ -96,8 +94,7 @@ static void node_geo_exec(GeoNodeExecParams params)
case GEO_NODE_CURVE_RESAMPLE_EVALUATED:
geometry_set.modify_geometry_sets([&](GeometrySet &geometry) {
if (const Curves *src_curves_id = geometry.get_curves_for_read()) {
const bke::CurvesGeometry &src_curves = bke::CurvesGeometry::wrap(
src_curves_id->geometry);
const bke::CurvesGeometry &src_curves = src_curves_id->geometry.wrap();
bke::CurvesGeometry dst_curves = geometry::resample_to_evaluated(src_curves, selection);
Curves *dst_curves_id = bke::curves_new_nomain(std::move(dst_curves));
bke::curves_copy_parameters(*src_curves_id, *dst_curves_id);

View File

@ -26,7 +26,7 @@ static void node_geo_exec(GeoNodeExecParams params)
return;
}
const Curves &src_curves_id = *geometry_set.get_curves_for_read();
const bke::CurvesGeometry &src_curves = bke::CurvesGeometry::wrap(src_curves_id.geometry);
const bke::CurvesGeometry &src_curves = src_curves_id.geometry.wrap();
bke::CurvesFieldContext field_context{src_curves, ATTR_DOMAIN_CURVE};
fn::FieldEvaluator selection_evaluator{field_context, src_curves.curves_num()};
@ -38,7 +38,7 @@ static void node_geo_exec(GeoNodeExecParams params)
}
Curves &curves_id = *geometry_set.get_curves_for_write();
bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
bke::CurvesGeometry &curves = curves_id.geometry.wrap();
curves.reverse_curves(selection);
});

View File

@ -297,7 +297,7 @@ class SampleCurveFunction : public mf::MultiFunction {
}
const Curves &curves_id = *geometry_set_.get_curves_for_read();
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
const bke::CurvesGeometry &curves = curves_id.geometry.wrap();
if (curves.points_num() == 0) {
return return_default();
}
@ -428,7 +428,7 @@ class SampleCurveFunction : public mf::MultiFunction {
void evaluate_source()
{
const Curves &curves_id = *geometry_set_.get_curves_for_read();
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
const bke::CurvesGeometry &curves = curves_id.geometry.wrap();
source_context_.emplace(bke::CurvesFieldContext{curves, ATTR_DOMAIN_POINT});
source_evaluator_ = std::make_unique<FieldEvaluator>(*source_context_, curves.points_num());
source_evaluator_->add(src_field_);
@ -506,7 +506,7 @@ static void node_geo_exec(GeoNodeExecParams params)
}
const Curves &curves_id = *geometry_set.get_curves_for_read();
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
const bke::CurvesGeometry &curves = curves_id.geometry.wrap();
if (curves.points_num() == 0) {
params.set_default_remaining_outputs();
return;

View File

@ -91,7 +91,7 @@ static void node_geo_exec(GeoNodeExecParams params)
geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) {
if (Curves *curves_id = geometry_set.get_curves_for_write()) {
bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
bke::CurvesGeometry &curves = curves_id->geometry.wrap();
has_curves = true;
const AttributeAccessor attributes = curves.attributes();
if (!attributes.contains("handle_type_left") || !attributes.contains("handle_type_right")) {

View File

@ -46,7 +46,7 @@ static void node_geo_exec(GeoNodeExecParams params)
return;
}
const Curves &src_curves_id = *geometry_set.get_curves_for_read();
const bke::CurvesGeometry &src_curves = bke::CurvesGeometry::wrap(src_curves_id.geometry);
const bke::CurvesGeometry &src_curves = src_curves_id.geometry.wrap();
if (src_curves.is_single_type(dst_type)) {
return;
}
@ -62,7 +62,7 @@ static void node_geo_exec(GeoNodeExecParams params)
if (geometry::try_curves_conversion_in_place(
selection, dst_type, [&]() -> bke::CurvesGeometry & {
return bke::CurvesGeometry::wrap(geometry_set.get_curves_for_write()->geometry);
return geometry_set.get_curves_for_write()->geometry.wrap();
})) {
return;
}

View File

@ -37,7 +37,7 @@ static void node_geo_exec(GeoNodeExecParams params)
}
const Curves &src_curves_id = *geometry_set.get_curves_for_read();
const bke::CurvesGeometry &src_curves = bke::CurvesGeometry::wrap(src_curves_id.geometry);
const bke::CurvesGeometry &src_curves = src_curves_id.geometry.wrap();
bke::CurvesFieldContext field_context{src_curves, ATTR_DOMAIN_POINT};
fn::FieldEvaluator evaluator{field_context, src_curves.points_num()};

View File

@ -34,15 +34,12 @@ static void geometry_set_curve_to_mesh(GeometrySet &geometry_set,
GeometryComponentEditData::remember_deformed_curve_positions_if_necessary(geometry_set);
if (profile_curves == nullptr) {
Mesh *mesh = bke::curve_to_wire_mesh(bke::CurvesGeometry::wrap(curves.geometry),
propagation_info);
Mesh *mesh = bke::curve_to_wire_mesh(curves.geometry.wrap(), propagation_info);
geometry_set.replace_mesh(mesh);
}
else {
Mesh *mesh = bke::curve_to_mesh_sweep(bke::CurvesGeometry::wrap(curves.geometry),
bke::CurvesGeometry::wrap(profile_curves->geometry),
fill_caps,
propagation_info);
Mesh *mesh = bke::curve_to_mesh_sweep(
curves.geometry.wrap(), profile_curves->geometry.wrap(), fill_caps, propagation_info);
geometry_set.replace_mesh(mesh);
}
}

View File

@ -129,8 +129,7 @@ static void node_geo_exec(GeoNodeExecParams params)
Field<int> count = params.extract_input<Field<int>>("Count");
geometry_set.modify_geometry_sets([&](GeometrySet &geometry) {
if (const Curves *src_curves_id = geometry.get_curves_for_read()) {
const bke::CurvesGeometry &src_curves = bke::CurvesGeometry::wrap(
src_curves_id->geometry);
const bke::CurvesGeometry &src_curves = src_curves_id->geometry.wrap();
bke::CurvesGeometry dst_curves = geometry::resample_to_count(
src_curves, fn::make_constant_field<bool>(true), count, resample_attributes);
PointCloud *pointcloud = pointcloud_from_curves(std::move(dst_curves),
@ -147,8 +146,7 @@ static void node_geo_exec(GeoNodeExecParams params)
Field<float> length = params.extract_input<Field<float>>("Length");
geometry_set.modify_geometry_sets([&](GeometrySet &geometry) {
if (const Curves *src_curves_id = geometry.get_curves_for_read()) {
const bke::CurvesGeometry &src_curves = bke::CurvesGeometry::wrap(
src_curves_id->geometry);
const bke::CurvesGeometry &src_curves = src_curves_id->geometry.wrap();
bke::CurvesGeometry dst_curves = geometry::resample_to_length(
src_curves, fn::make_constant_field<bool>(true), length, resample_attributes);
PointCloud *pointcloud = pointcloud_from_curves(std::move(dst_curves),
@ -164,8 +162,7 @@ static void node_geo_exec(GeoNodeExecParams params)
case GEO_NODE_CURVE_RESAMPLE_EVALUATED:
geometry_set.modify_geometry_sets([&](GeometrySet &geometry) {
if (const Curves *src_curves_id = geometry.get_curves_for_read()) {
const bke::CurvesGeometry &src_curves = bke::CurvesGeometry::wrap(
src_curves_id->geometry);
const bke::CurvesGeometry &src_curves = src_curves_id->geometry.wrap();
bke::CurvesGeometry dst_curves = geometry::resample_to_evaluated(
src_curves, fn::make_constant_field<bool>(true), resample_attributes);
PointCloud *pointcloud = pointcloud_from_curves(std::move(dst_curves),

View File

@ -119,7 +119,7 @@ static void geometry_set_curve_trim(GeometrySet &geometry_set,
return;
}
const Curves &src_curves_id = *geometry_set.get_curves_for_read();
const bke::CurvesGeometry &src_curves = bke::CurvesGeometry::wrap(src_curves_id.geometry);
const bke::CurvesGeometry &src_curves = src_curves_id.geometry.wrap();
if (src_curves.curves_num() == 0) {
return;
}

View File

@ -278,7 +278,7 @@ static void node_geo_exec(GeoNodeExecParams params)
const AttributeAccessor mesh_attributes_orig = surface_mesh_orig->attributes();
Curves &curves_id = *curves_geometry.get_curves_for_write();
CurvesGeometry &curves = CurvesGeometry::wrap(curves_id.geometry);
CurvesGeometry &curves = curves_id.geometry.wrap();
if (!mesh_attributes_eval.contains(uv_map_name)) {
pass_through_input();
@ -383,7 +383,7 @@ static void node_geo_exec(GeoNodeExecParams params)
{},
invalid_uv_count);
/* Then also deform edit curve information for use in sculpt mode. */
const CurvesGeometry &curves_orig = CurvesGeometry::wrap(edit_hints->curves_id_orig.geometry);
const CurvesGeometry &curves_orig = edit_hints->curves_id_orig.geometry.wrap();
const VArraySpan<float2> surface_uv_coords_orig = curves_orig.attributes().lookup_or_default(
"surface_uv_coordinate", ATTR_DOMAIN_CURVE, float2(0));
if (!surface_uv_coords_orig.is_empty()) {

View File

@ -293,7 +293,7 @@ static void delete_curves_selection(GeometrySet &geometry_set,
const bke::AnonymousAttributePropagationInfo &propagation_info)
{
const Curves &src_curves_id = *geometry_set.get_curves_for_read();
const bke::CurvesGeometry &src_curves = bke::CurvesGeometry::wrap(src_curves_id.geometry);
const bke::CurvesGeometry &src_curves = src_curves_id.geometry.wrap();
const int domain_size = src_curves.attributes().domain_size(selection_domain);
bke::CurvesFieldContext field_context{src_curves, selection_domain};
@ -311,7 +311,7 @@ static void delete_curves_selection(GeometrySet &geometry_set,
CurveComponent &component = geometry_set.get_component_for_write<CurveComponent>();
Curves &curves_id = *component.get_for_write();
bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
bke::CurvesGeometry &curves = curves_id.geometry.wrap();
if (selection_domain == ATTR_DOMAIN_POINT) {
curves.remove_points(selection, propagation_info);

View File

@ -330,7 +330,7 @@ static void duplicate_curves(GeometrySet &geometry_set,
GeometryComponentEditData::remember_deformed_curve_positions_if_necessary(geometry_set);
const Curves &curves_id = *geometry_set.get_curves_for_read();
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
const bke::CurvesGeometry &curves = curves_id.geometry.wrap();
bke::CurvesFieldContext field_context{curves, ATTR_DOMAIN_CURVE};
FieldEvaluator evaluator{field_context, curves.curves_num()};
@ -363,7 +363,7 @@ static void duplicate_curves(GeometrySet &geometry_set,
Curves *new_curves_id = bke::curves_new_nomain(dst_points_num, dst_curves_num);
bke::curves_copy_parameters(curves_id, *new_curves_id);
bke::CurvesGeometry &new_curves = bke::CurvesGeometry::wrap(new_curves_id->geometry);
bke::CurvesGeometry &new_curves = new_curves_id->geometry.wrap();
MutableSpan<int> all_dst_offsets = new_curves.offsets_for_write();
threading::parallel_for(selection.index_range(), 512, [&](IndexRange range) {
@ -811,7 +811,7 @@ static void duplicate_points_curve(GeometrySet &geometry_set,
const AnonymousAttributePropagationInfo &propagation_info)
{
const Curves &src_curves_id = *geometry_set.get_curves_for_read();
const bke::CurvesGeometry &src_curves = bke::CurvesGeometry::wrap(src_curves_id.geometry);
const bke::CurvesGeometry &src_curves = src_curves_id.geometry.wrap();
if (src_curves.points_num() == 0) {
return;
}
@ -833,7 +833,7 @@ static void duplicate_points_curve(GeometrySet &geometry_set,
Curves *new_curves_id = bke::curves_new_nomain(dst_num, dst_num);
bke::curves_copy_parameters(src_curves_id, *new_curves_id);
bke::CurvesGeometry &new_curves = bke::CurvesGeometry::wrap(new_curves_id->geometry);
bke::CurvesGeometry &new_curves = new_curves_id->geometry.wrap();
MutableSpan<int> new_curve_offsets = new_curves.offsets_for_write();
for (const int i : new_curves.curves_range()) {
new_curve_offsets[i] = i;

View File

@ -660,7 +660,7 @@ static GeometrySet generate_interpolated_curves(
const AutoAnonymousAttributeID &index_attribute_id,
const AutoAnonymousAttributeID &weight_attribute_id)
{
const bke::CurvesGeometry &guide_curves = bke::CurvesGeometry::wrap(guide_curves_id.geometry);
const bke::CurvesGeometry &guide_curves = guide_curves_id.geometry.wrap();
const MultiValueMap<int, int> guides_by_group = separate_guides_by_group(guide_group_ids);
const Map<int, int> points_per_curve_by_group = compute_points_per_curve_by_group(
@ -692,7 +692,7 @@ static GeometrySet generate_interpolated_curves(
all_neighbor_counts);
Curves *child_curves_id = bke::curves_new_nomain(0, num_child_curves);
bke::CurvesGeometry &child_curves = bke::CurvesGeometry::wrap(child_curves_id->geometry);
bke::CurvesGeometry &child_curves = child_curves_id->geometry.wrap();
MutableSpan<int> children_curve_offsets = child_curves.offsets_for_write();
Array<bool> use_direct_interpolation_per_child(num_child_curves);
@ -792,8 +792,7 @@ static void node_geo_exec(GeoNodeExecParams params)
const Curves &guide_curves_id = *guide_curves_geometry.get_curves_for_read();
bke::CurvesFieldContext curves_context{bke::CurvesGeometry::wrap(guide_curves_id.geometry),
ATTR_DOMAIN_CURVE};
bke::CurvesFieldContext curves_context{guide_curves_id.geometry.wrap(), ATTR_DOMAIN_CURVE};
fn::FieldEvaluator curves_evaluator{curves_context, guide_curves_id.geometry.curve_num};
curves_evaluator.add(guides_up_field);
curves_evaluator.add(guide_group_field);

View File

@ -144,7 +144,7 @@ static void node_geo_exec(GeoNodeExecParams params)
geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) {
if (Curves *curves_id = geometry_set.get_curves_for_write()) {
bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
bke::CurvesGeometry &curves = curves_id->geometry.wrap();
has_curves = true;
const AttributeAccessor attributes = curves.attributes();
if (!attributes.contains("handle_left") || !attributes.contains("handle_right")) {

View File

@ -48,7 +48,7 @@ static void node_geo_exec(GeoNodeExecParams params)
geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) {
if (Curves *curves_id = geometry_set.get_curves_for_write()) {
bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
bke::CurvesGeometry &curves = curves_id->geometry.wrap();
set_normal_mode(curves, mode, selection_field);
}
});

View File

@ -46,7 +46,7 @@ static void node_geo_exec(GeoNodeExecParams params)
geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) {
if (Curves *curves_id = geometry_set.get_curves_for_write()) {
set_radius(bke::CurvesGeometry::wrap(curves_id->geometry), selection_field, radii_field);
set_radius(curves_id->geometry.wrap(), selection_field, radii_field);
}
});

View File

@ -42,7 +42,7 @@ static void node_geo_exec(GeoNodeExecParams params)
geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) {
if (Curves *curves_id = geometry_set.get_curves_for_write()) {
set_tilt(bke::CurvesGeometry::wrap(curves_id->geometry), selection_field, tilt_field);
set_tilt(curves_id->geometry.wrap(), selection_field, tilt_field);
}
});

View File

@ -52,7 +52,7 @@ static void set_computed_position_and_offset(GeometryComponent &component,
if (attributes.contains("handle_right") && attributes.contains("handle_left")) {
CurveComponent &curve_component = static_cast<CurveComponent &>(component);
Curves &curves_id = *curve_component.get_for_write();
bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
bke::CurvesGeometry &curves = curves_id.geometry.wrap();
SpanAttributeWriter<float3> handle_right_attribute =
attributes.lookup_or_add_for_write_span<float3>("handle_right", ATTR_DOMAIN_POINT);
SpanAttributeWriter<float3> handle_left_attribute =

View File

@ -42,7 +42,7 @@ static void node_geo_exec(GeoNodeExecParams params)
geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) {
if (Curves *curves_id = geometry_set.get_curves_for_write()) {
set_cyclic(bke::CurvesGeometry::wrap(curves_id->geometry), selection_field, cyclic_field);
set_cyclic(curves_id->geometry.wrap(), selection_field, cyclic_field);
}
});

View File

@ -44,7 +44,7 @@ static void node_geo_exec(GeoNodeExecParams params)
geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) {
if (Curves *curves_id = geometry_set.get_curves_for_write()) {
set_resolution(bke::CurvesGeometry::wrap(curves_id->geometry), selection, resolution);
set_resolution(curves_id->geometry.wrap(), selection, resolution);
}
});

View File

@ -301,7 +301,7 @@ static Map<int, int> create_curve_instances(GeoNodeExecParams &params,
continue;
}
bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
bke::CurvesGeometry &curves = curves_id->geometry.wrap();
BKE_nurbList_free(&cu.nurb);
float4x4 size_matrix = float4x4::identity();

View File

@ -194,7 +194,7 @@ static void translate_geometry_set(GeoNodeExecParams &params,
const Depsgraph &depsgraph)
{
if (Curves *curves = geometry.get_curves_for_write()) {
bke::CurvesGeometry::wrap(curves->geometry).translate(translation);
curves->geometry.wrap().translate(translation);
}
if (Mesh *mesh = geometry.get_mesh_for_write()) {
translate_mesh(*mesh, translation);
@ -219,7 +219,7 @@ void transform_geometry_set(GeoNodeExecParams &params,
const Depsgraph &depsgraph)
{
if (Curves *curves = geometry.get_curves_for_write()) {
bke::CurvesGeometry::wrap(curves->geometry).transform(transform);
curves->geometry.wrap().transform(transform);
}
if (Mesh *mesh = geometry.get_mesh_for_write()) {
transform_mesh(*mesh, transform);