Blender  V3.3
node_geo_scale_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_("Scale"))
14  .subtype(PROP_XYZ)
15  .default_value({1, 1, 1})
16  .supports_field();
17  b.add_input<decl::Vector>(N_("Center")).subtype(PROP_TRANSLATION).supports_field();
18  b.add_input<decl::Bool>(N_("Local Space")).default_value(true).supports_field();
19  b.add_output<decl::Geometry>(N_("Instances"));
20 }
21 
22 static void scale_instances(GeoNodeExecParams &params, InstancesComponent &instances_component)
23 {
24  GeometryComponentFieldContext field_context{instances_component, ATTR_DOMAIN_INSTANCE};
25 
26  fn::FieldEvaluator evaluator{field_context, instances_component.instances_num()};
27  evaluator.set_selection(params.extract_input<Field<bool>>("Selection"));
28  evaluator.add(params.extract_input<Field<float3>>("Scale"));
29  evaluator.add(params.extract_input<Field<float3>>("Center"));
30  evaluator.add(params.extract_input<Field<bool>>("Local Space"));
31  evaluator.evaluate();
32 
33  const IndexMask selection = evaluator.get_evaluated_selection_as_mask();
34  const VArray<float3> scales = evaluator.get_evaluated<float3>(0);
35  const VArray<float3> pivots = evaluator.get_evaluated<float3>(1);
36  const VArray<bool> local_spaces = evaluator.get_evaluated<bool>(2);
37 
38  MutableSpan<float4x4> instance_transforms = instances_component.instance_transforms();
39 
40  threading::parallel_for(selection.index_range(), 512, [&](IndexRange range) {
41  for (const int i_selection : range) {
42  const int i = selection[i_selection];
43  const float3 pivot = pivots[i];
44  float4x4 &instance_transform = instance_transforms[i];
45 
46  if (local_spaces[i]) {
47  instance_transform *= float4x4::from_location(pivot);
48  rescale_m4(instance_transform.values, scales[i]);
49  instance_transform *= float4x4::from_location(-pivot);
50  }
51  else {
52  const float4x4 original_transform = instance_transform;
53  instance_transform = float4x4::from_location(pivot);
54  rescale_m4(instance_transform.values, scales[i]);
55  instance_transform *= float4x4::from_location(-pivot);
56  instance_transform *= original_transform;
57  }
58  }
59  });
60 }
61 
63 {
64  GeometrySet geometry_set = params.extract_input<GeometrySet>("Instances");
65  if (geometry_set.has_instances()) {
67  scale_instances(params, instances);
68  }
69  params.set_output("Instances", std::move(geometry_set));
70 }
71 
72 } // namespace blender::nodes::node_geo_scale_instances_cc
73 
75 {
77 
78  static bNodeType ntype;
79 
83  nodeRegisterType(&ntype);
84 }
@ ATTR_DOMAIN_INSTANCE
Definition: BKE_attribute.h:32
#define NODE_CLASS_GEOMETRY
Definition: BKE_node.h:359
#define GEO_NODE_SCALE_INSTANCES
Definition: BKE_node.h:1463
void nodeRegisterType(struct bNodeType *ntype)
Definition: node.cc:1357
@ PROP_XYZ
Definition: RNA_types.h:162
@ 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 scale_instances(GeoNodeExecParams &params, InstancesComponent &instances_component)
static void node_geo_exec(GeoNodeExecParams params)
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_scale_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)