Blender  V3.3
node_geo_curve_resample.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #include "GEO_resample_curves.hh"
4 
5 #include "BKE_curves.hh"
6 
7 #include "UI_interface.h"
8 #include "UI_resources.h"
9 
10 #include "node_geometry_util.hh"
11 
13 
15 
17 {
18  b.add_input<decl::Geometry>(N_("Curve")).supported_type(GEO_COMPONENT_TYPE_CURVE);
19  b.add_input<decl::Bool>(N_("Selection")).default_value(true).supports_field().hide_value();
20  b.add_input<decl::Int>(N_("Count")).default_value(10).min(1).max(100000).supports_field();
21  b.add_input<decl::Float>(N_("Length"))
22  .default_value(0.1f)
23  .min(0.01f)
24  .supports_field()
25  .subtype(PROP_DISTANCE);
26  b.add_output<decl::Geometry>(N_("Curve"));
27 }
28 
29 static void node_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
30 {
31  uiItemR(layout, ptr, "mode", 0, "", ICON_NONE);
32 }
33 
35 {
36  NodeGeometryCurveResample *data = MEM_cnew<NodeGeometryCurveResample>(__func__);
37 
39  node->storage = data;
40 }
41 
43 {
44  const NodeGeometryCurveResample &storage = node_storage(*node);
46 
47  bNodeSocket *count_socket = ((bNodeSocket *)node->inputs.first)->next->next;
48  bNodeSocket *length_socket = count_socket->next;
49 
52 }
53 
55 {
56  GeometrySet geometry_set = params.extract_input<GeometrySet>("Curve");
57 
58  const NodeGeometryCurveResample &storage = node_storage(params.node());
60 
61  const Field<bool> selection = params.extract_input<Field<bool>>("Selection");
62 
64 
65  switch (mode) {
67  Field<int> count = params.extract_input<Field<int>>("Count");
68  geometry_set.modify_geometry_sets([&](GeometrySet &geometry) {
70  if (const Curves *src_curves = component->get_for_read()) {
71  Curves *dst_curves = geometry::resample_to_count(*component, selection, count);
72  bke::curves_copy_parameters(*src_curves, *dst_curves);
73  geometry.replace_curves(dst_curves);
74  }
75  }
76  });
77  break;
78  }
80  Field<float> length = params.extract_input<Field<float>>("Length");
81  geometry_set.modify_geometry_sets([&](GeometrySet &geometry) {
83  if (const Curves *src_curves = component->get_for_read()) {
84  Curves *dst_curves = geometry::resample_to_length(*component, selection, length);
85  bke::curves_copy_parameters(*src_curves, *dst_curves);
86  geometry.replace_curves(dst_curves);
87  }
88  }
89  });
90  break;
91  }
93  geometry_set.modify_geometry_sets([&](GeometrySet &geometry) {
95  if (const Curves *src_curves = component->get_for_read()) {
96  Curves *dst_curves = geometry::resample_to_evaluated(*component, selection);
97  bke::curves_copy_parameters(*src_curves, *dst_curves);
98  geometry.replace_curves(dst_curves);
99  }
100  }
101  });
102  break;
103  }
104 
105  params.set_output("Curve", std::move(geometry_set));
106 }
107 
108 } // namespace blender::nodes::node_geo_curve_resample_cc
109 
111 {
112  namespace file_ns = blender::nodes::node_geo_curve_resample_cc;
113 
114  static bNodeType ntype;
115 
120  &ntype, "NodeGeometryCurveResample", node_free_standard_storage, node_copy_standard_storage);
124  nodeRegisterType(&ntype);
125 }
Low-level operations for curves.
@ GEO_COMPONENT_TYPE_CURVE
void node_type_update(struct bNodeType *ntype, void(*updatefunc)(struct bNodeTree *ntree, struct bNode *node))
Definition: node.cc:4443
#define NODE_STORAGE_FUNCS(StorageT)
Definition: BKE_node.h:1563
void nodeSetSocketAvailability(struct bNodeTree *ntree, struct bNodeSocket *sock, bool is_available)
Definition: node.cc:3664
void node_type_init(struct bNodeType *ntype, void(*initfunc)(struct bNodeTree *ntree, struct bNode *node))
Definition: node.cc:4390
#define NODE_CLASS_GEOMETRY
Definition: BKE_node.h:359
void node_type_storage(struct bNodeType *ntype, const char *storagename, void(*freefunc)(struct bNode *node), void(*copyfunc)(struct bNodeTree *dest_ntree, struct bNode *dest_node, const struct bNode *src_node))
Definition: node.cc:4426
#define GEO_NODE_RESAMPLE_CURVE
Definition: BKE_node.h:1402
void nodeRegisterType(struct bNodeType *ntype)
Definition: node.cc:1357
#define UNUSED(x)
static uint8 component(Color32 c, uint i)
Definition: ColorBlock.cpp:108
GeometryNodeCurveResampleMode
@ GEO_NODE_CURVE_RESAMPLE_LENGTH
@ GEO_NODE_CURVE_RESAMPLE_EVALUATED
@ GEO_NODE_CURVE_RESAMPLE_COUNT
@ PROP_DISTANCE
Definition: RNA_types.h:149
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
static void remember_deformed_curve_positions_if_necessary(GeometrySet &geometry)
OperationNode * node
void * tree
bNodeTree * ntree
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
int count
static ulong * next
void curves_copy_parameters(const Curves &src, Curves &dst)
Definition: curves.cc:391
Curves * resample_to_count(const CurveComponent &src_component, const fn::Field< bool > &selection_field, const fn::Field< int > &count_field)
Curves * resample_to_evaluated(const CurveComponent &src_component, const fn::Field< bool > &selection_field)
Curves * resample_to_length(const CurveComponent &src_component, const fn::Field< bool > &selection_field, const fn::Field< float > &segment_length_field)
T length(const vec_base< T, Size > &a)
static void node_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
static void node_init(bNodeTree *UNUSED(tree), bNode *node)
static void node_update(bNodeTree *ntree, bNode *node)
static void node_declare(NodeDeclarationBuilder &b)
static void node_geo_exec(GeoNodeExecParams params)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
static void node_init(const struct bContext *C, bNodeTree *ntree, bNode *node)
Definition: node.cc:1082
void register_node_type_geo_curve_resample()
void geo_node_type_base(bNodeType *ntype, int type, const char *name, short nclass)
void node_copy_standard_storage(bNodeTree *UNUSED(dest_ntree), bNode *dest_node, const bNode *src_node)
Definition: node_util.c:55
void node_free_standard_storage(bNode *node)
Definition: node_util.c:43
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)
struct bNodeSocket * next
Defines a node type.
Definition: BKE_node.h:226
NodeGeometryExecFunction geometry_node_execute
Definition: BKE_node.h:316
void(* draw_buttons)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr)
Definition: BKE_node.h:244
NodeDeclareFunction declare
Definition: BKE_node.h:324
#define N_(msgid)
PointerRNA * ptr
Definition: wm_files.c:3480