Changeset View
Changeset View
Standalone View
Standalone View
source/blender/nodes/geometry/nodes/node_geo_translate_instances.cc
| Show All 27 Lines | static void node_declare(NodeDeclarationBuilder &b) | ||||
| b.add_input<decl::Bool>(N_("Local Space")).default_value(true).supports_field(); | b.add_input<decl::Bool>(N_("Local Space")).default_value(true).supports_field(); | ||||
| b.add_output<decl::Geometry>(N_("Instances")); | b.add_output<decl::Geometry>(N_("Instances")); | ||||
| }; | }; | ||||
| static void translate_instances(GeoNodeExecParams ¶ms, InstancesComponent &instances_component) | static void translate_instances(GeoNodeExecParams ¶ms, InstancesComponent &instances_component) | ||||
| { | { | ||||
| GeometryComponentFieldContext field_context{instances_component, ATTR_DOMAIN_INSTANCE}; | GeometryComponentFieldContext field_context{instances_component, ATTR_DOMAIN_INSTANCE}; | ||||
| fn::FieldEvaluator selection_evaluator{field_context, instances_component.instances_amount()}; | fn::FieldEvaluator evaluator{field_context, instances_component.instances_amount()}; | ||||
| selection_evaluator.add(params.extract_input<Field<bool>>("Selection")); | evaluator.set_selection(params.extract_input<Field<bool>>("Selection")); | ||||
| selection_evaluator.evaluate(); | evaluator.add(params.extract_input<Field<float3>>("Translation")); | ||||
| const IndexMask selection = selection_evaluator.get_evaluated_as_mask(0); | evaluator.add(params.extract_input<Field<bool>>("Local Space")); | ||||
| evaluator.evaluate(); | |||||
| fn::FieldEvaluator transforms_evaluator{field_context, &selection}; | |||||
| transforms_evaluator.add(params.extract_input<Field<float3>>("Translation")); | const IndexMask selection = evaluator.get_evaluated_selection_as_mask(); | ||||
| transforms_evaluator.add(params.extract_input<Field<bool>>("Local Space")); | const VArray<float3> &translations = evaluator.get_evaluated<float3>(0); | ||||
| transforms_evaluator.evaluate(); | const VArray<bool> &local_spaces = evaluator.get_evaluated<bool>(1); | ||||
| const VArray<float3> &translations = transforms_evaluator.get_evaluated<float3>(0); | |||||
| const VArray<bool> &local_spaces = transforms_evaluator.get_evaluated<bool>(1); | |||||
| MutableSpan<float4x4> instance_transforms = instances_component.instance_transforms(); | MutableSpan<float4x4> instance_transforms = instances_component.instance_transforms(); | ||||
| threading::parallel_for(selection.index_range(), 1024, [&](IndexRange range) { | threading::parallel_for(selection.index_range(), 1024, [&](IndexRange range) { | ||||
| for (const int i_selection : range) { | for (const int i_selection : range) { | ||||
| const int i = selection[i_selection]; | const int i = selection[i_selection]; | ||||
| if (local_spaces[i]) { | if (local_spaces[i]) { | ||||
| instance_transforms[i] *= float4x4::from_location(translations[i]); | instance_transforms[i] *= float4x4::from_location(translations[i]); | ||||
| Show All 32 Lines | |||||