Blender  V3.3
node_geo_translate_instances.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #include "BLI_task.hh"
4 
5 #include "node_geometry_util.hh"
6 
8 
10 {
11  b.add_input<decl::Geometry>(N_("Instances")).only_instances();
12  b.add_input<decl::Bool>(N_("Selection")).default_value(true).hide_value().supports_field();
13  b.add_input<decl::Vector>(N_("Translation")).subtype(PROP_TRANSLATION).supports_field();
14  b.add_input<decl::Bool>(N_("Local Space")).default_value(true).supports_field();
15  b.add_output<decl::Geometry>(N_("Instances"));
16 }
17 
19 {
20  GeometryComponentFieldContext field_context{instances_component, ATTR_DOMAIN_INSTANCE};
21 
22  fn::FieldEvaluator evaluator{field_context, instances_component.instances_num()};
23  evaluator.set_selection(params.extract_input<Field<bool>>("Selection"));
24  evaluator.add(params.extract_input<Field<float3>>("Translation"));
25  evaluator.add(params.extract_input<Field<bool>>("Local Space"));
26  evaluator.evaluate();
27 
28  const IndexMask selection = evaluator.get_evaluated_selection_as_mask();
29  const VArray<float3> translations = evaluator.get_evaluated<float3>(0);
30  const VArray<bool> local_spaces = evaluator.get_evaluated<bool>(1);
31 
32  MutableSpan<float4x4> instance_transforms = instances_component.instance_transforms();
33 
34  threading::parallel_for(selection.index_range(), 1024, [&](IndexRange range) {
35  for (const int i_selection : range) {
36  const int i = selection[i_selection];
37  if (local_spaces[i]) {
38  instance_transforms[i] *= float4x4::from_location(translations[i]);
39  }
40  else {
41  add_v3_v3(instance_transforms[i].values[3], translations[i]);
42  }
43  }
44  });
45 }
46 
48 {
49  GeometrySet geometry_set = params.extract_input<GeometrySet>("Instances");
50  if (geometry_set.has_instances()) {
52  translate_instances(params, instances);
53  }
54  params.set_output("Instances", std::move(geometry_set));
55 }
56 
57 } // namespace blender::nodes::node_geo_translate_instances_cc
58 
60 {
62 
63  static bNodeType ntype;
64 
66  &ntype, GEO_NODE_TRANSLATE_INSTANCES, "Translate Instances", NODE_CLASS_GEOMETRY);
69  nodeRegisterType(&ntype);
70 }
@ ATTR_DOMAIN_INSTANCE
Definition: BKE_attribute.h:32
#define NODE_CLASS_GEOMETRY
Definition: BKE_node.h:359
#define GEO_NODE_TRANSLATE_INSTANCES
Definition: BKE_node.h:1462
void nodeRegisterType(struct bNodeType *ntype)
Definition: node.cc:1357
@ PROP_TRANSLATION
Definition: RNA_types.h:154
blender::MutableSpan< blender::float4x4 > instance_transforms()
IndexRange index_range() const
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
static void translate_instances(GeoNodeExecParams &params, InstancesComponent &instances_component)
static void node_declare(NodeDeclarationBuilder &b)
void parallel_for(IndexRange range, int64_t grain_size, const Function &function)
Definition: BLI_task.hh:51
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
void register_node_type_geo_translate_instances()
void geo_node_type_base(bNodeType *ntype, int type, const char *name, short nclass)
GeometryComponent & get_component_for_write(GeometryComponentType component_type)
bool has_instances() 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)