Blender  V3.3
node_geo_curve_subdivide.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #include "BKE_curves.hh"
4 
6 
7 #include "UI_interface.h"
8 #include "UI_resources.h"
9 
10 #include "node_geometry_util.hh"
11 
13 
15 {
16  b.add_input<decl::Geometry>(N_("Curve")).supported_type(GEO_COMPONENT_TYPE_CURVE);
17  b.add_input<decl::Int>(N_("Cuts"))
18  .default_value(1)
19  .min(0)
20  .max(1000)
21  .supports_field()
22  .description(
23  N_("The number of control points to create on the segment following each point"));
24  b.add_output<decl::Geometry>(N_("Curve"));
25 }
26 
28 {
29  GeometrySet geometry_set = params.extract_input<GeometrySet>("Curve");
30  Field<int> cuts_field = params.extract_input<Field<int>>("Cuts");
31 
33 
34  geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) {
35  if (!geometry_set.has_curves()) {
36  return;
37  }
38 
40  const Curves &src_curves_id = *component.get_for_read();
41  const bke::CurvesGeometry &src_curves = bke::CurvesGeometry::wrap(src_curves_id.geometry);
42 
43  GeometryComponentFieldContext field_context{component, ATTR_DOMAIN_POINT};
44  fn::FieldEvaluator evaluator{field_context, src_curves.points_num()};
45  evaluator.add(cuts_field);
46  evaluator.evaluate();
47  const VArray<int> cuts = evaluator.get_evaluated<int>(0);
48  if (cuts.is_single() && cuts.get_internal_single() < 1) {
49  return;
50  }
51 
53  src_curves, src_curves.curves_range(), cuts);
54 
55  Curves *dst_curves_id = bke::curves_new_nomain(std::move(dst_curves));
56  bke::curves_copy_parameters(src_curves_id, *dst_curves_id);
57  geometry_set.replace_curves(dst_curves_id);
58  });
59  params.set_output("Curve", geometry_set);
60 }
61 
62 } // namespace blender::nodes::node_geo_curve_subdivide_cc
63 
65 {
67 
68  static bNodeType ntype;
69 
73  nodeRegisterType(&ntype);
74 }
Low-level operations for curves.
@ GEO_COMPONENT_TYPE_CURVE
#define NODE_CLASS_GEOMETRY
Definition: BKE_node.h:359
#define GEO_NODE_SUBDIVIDE_CURVE
Definition: BKE_node.h:1439
void nodeRegisterType(struct bNodeType *ntype)
Definition: node.cc:1357
static uint8 component(Color32 c, uint i)
Definition: ColorBlock.cpp:108
static void remember_deformed_curve_positions_if_necessary(GeometrySet &geometry)
static CurvesGeometry & wrap(::CurvesGeometry &dna_struct)
Definition: BKE_curves.hh:138
int add(GField field, GVArray *varray_ptr)
Definition: field.cc:731
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void curves_copy_parameters(const Curves &src, Curves &dst)
Definition: curves.cc:391
Curves * curves_new_nomain(int points_num, int curves_num)
Definition: curves.cc:367
bke::CurvesGeometry subdivide_curves(const bke::CurvesGeometry &src_curves, IndexMask selection, const VArray< int > &cuts)
static void node_declare(NodeDeclarationBuilder &b)
static void node_geo_exec(GeoNodeExecParams params)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
void register_node_type_geo_curve_subdivide()
void geo_node_type_base(bNodeType *ntype, int type, const char *name, short nclass)
void replace_curves(Curves *curves, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
const GeometryComponent * get_component_for_read(GeometryComponentType component_type) const
void modify_geometry_sets(ForeachSubGeometryCallback callback)
bool has_curves() const
Defines a node type.
Definition: BKE_node.h:226
NodeGeometryExecFunction geometry_node_execute
Definition: BKE_node.h:316
NodeDeclareFunction declare
Definition: BKE_node.h:324
#define N_(msgid)