Blender  V3.3
node_geo_points.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #include "BKE_pointcloud.h"
4 
5 #include "BLI_task.hh"
6 
7 #include "node_geometry_util.hh"
8 
10 
12 {
13  b.add_input<decl::Int>(N_("Count"))
14  .default_value(1)
15  .description(N_("The number of points to create"))
16  .min(0);
17  b.add_input<decl::Vector>(N_("Position"))
18  .supports_field()
19  .default_value(float3(0.0f))
20  .description(N_("The positions of the new points"));
21  b.add_input<decl::Float>(N_("Radius"))
22  .supports_field()
23  .subtype(PROP_DISTANCE)
24  .default_value(float(0.1f))
25  .description(N_("The radii of the new points"));
26  b.add_output<decl::Geometry>(N_("Geometry"));
27 }
28 
30  private:
31  int points_num_;
32 
33  public:
34  PointsFieldContext(const int points_num) : points_num_(points_num)
35  {
36  }
37 
39  {
40  return points_num_;
41  }
42 
44  const IndexMask mask,
45  ResourceScope &UNUSED(scope)) const
46  {
47  const bke::IDAttributeFieldInput *id_field_input =
48  dynamic_cast<const bke::IDAttributeFieldInput *>(&field_input);
49 
50  const fn::IndexFieldInput *index_field_input = dynamic_cast<const fn::IndexFieldInput *>(
51  &field_input);
52 
53  if (id_field_input == nullptr && index_field_input == nullptr) {
54  return {};
55  }
56 
58  }
59 };
60 
62 {
63  const int count = params.extract_input<int>("Count");
64  if (count <= 0) {
65  params.set_default_remaining_outputs();
66  return;
67  }
68 
69  Field<float3> position_field = params.extract_input<Field<float3>>("Position");
70  Field<float> radius_field = params.extract_input<Field<float>>("Radius");
71 
72  PointCloud *new_point_cloud = BKE_pointcloud_new_nomain(count);
73  GeometrySet geometry_set = GeometrySet::create_with_pointcloud(new_point_cloud);
75  MutableAttributeAccessor attributes = *points.attributes_for_write();
76  AttributeWriter<float3> output_position = attributes.lookup_or_add_for_write<float3>(
77  "position", ATTR_DOMAIN_POINT);
78  AttributeWriter<float> output_radii = attributes.lookup_or_add_for_write<float>(
79  "radius", ATTR_DOMAIN_POINT);
80 
82  fn::FieldEvaluator evaluator{context, count};
83  evaluator.add_with_destination(position_field, output_position.varray);
84  evaluator.add_with_destination(radius_field, output_radii.varray);
85  evaluator.evaluate();
86 
87  output_position.finish();
88  output_radii.finish();
89  params.set_output("Geometry", std::move(geometry_set));
90 }
91 
92 } // namespace blender::nodes::node_geo_points_cc
93 
95 {
96  namespace file_ns = blender::nodes::node_geo_points_cc;
97  static bNodeType ntype;
101  nodeRegisterType(&ntype);
102 }
@ ATTR_DOMAIN_POINT
Definition: BKE_attribute.h:27
#define NODE_CLASS_GEOMETRY
Definition: BKE_node.h:359
void nodeRegisterType(struct bNodeType *ntype)
Definition: node.cc:1357
#define GEO_NODE_POINTS
Definition: BKE_node.h:1503
General operations for point clouds.
struct PointCloud * BKE_pointcloud_new_nomain(int totpoint)
Definition: pointcloud.cc:243
#define UNUSED(x)
@ PROP_DISTANCE
Definition: RNA_types.h:149
std::optional< blender::bke::MutableAttributeAccessor > attributes_for_write() final
static GVArray get_index_varray(IndexMask mask)
Definition: field.cc:549
GVArray get_varray_for_input(const FieldInput &field_input, const IndexMask mask, ResourceScope &UNUSED(scope)) const
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
int count
ccl_device_inline float4 mask(const int4 &mask, const float4 &a)
Definition: math_float4.h:513
static void node_geo_exec(GeoNodeExecParams params)
static void node_declare(NodeDeclarationBuilder &b)
vec_base< float, 3 > float3
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
void register_node_type_geo_points()
void geo_node_type_base(bNodeType *ntype, int type, const char *name, short nclass)
#define min(a, b)
Definition: sort.c:35
__int64 int64_t
Definition: stdint.h:89
GeometryComponent & get_component_for_write(GeometryComponentType component_type)
static GeometrySet create_with_pointcloud(PointCloud *pointcloud, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
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)