Changeset View
Changeset View
Standalone View
Standalone View
source/blender/nodes/geometry/nodes/node_geo_rotate_instances.cc
| Show All 29 Lines | static void node_declare(NodeDeclarationBuilder &b) | ||||
| b.add_output<decl::Geometry>(N_("Instances")); | b.add_output<decl::Geometry>(N_("Instances")); | ||||
| }; | }; | ||||
| static void rotate_instances(GeoNodeExecParams ¶ms, InstancesComponent &instances_component) | static void rotate_instances(GeoNodeExecParams ¶ms, InstancesComponent &instances_component) | ||||
| { | { | ||||
| GeometryComponentFieldContext field_context{instances_component, ATTR_DOMAIN_INSTANCE}; | GeometryComponentFieldContext field_context{instances_component, ATTR_DOMAIN_INSTANCE}; | ||||
| const int domain_size = instances_component.instances_amount(); | const int domain_size = instances_component.instances_amount(); | ||||
| fn::FieldEvaluator selection_evaluator{field_context, domain_size}; | fn::FieldEvaluator evaluator{field_context, domain_size}; | ||||
| 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>>("Rotation")); | ||||
| const IndexMask selection = selection_evaluator.get_evaluated_as_mask(0); | evaluator.add(params.extract_input<Field<float3>>("Pivot Point")); | ||||
| evaluator.add(params.extract_input<Field<bool>>("Local Space")); | |||||
| fn::FieldEvaluator transforms_evaluator{field_context, &selection}; | evaluator.evaluate(); | ||||
| transforms_evaluator.add(params.extract_input<Field<float3>>("Rotation")); | |||||
| transforms_evaluator.add(params.extract_input<Field<float3>>("Pivot Point")); | const IndexMask selection = evaluator.get_evaluated_selection_as_mask(); | ||||
| transforms_evaluator.add(params.extract_input<Field<bool>>("Local Space")); | const VArray<float3> &rotations = evaluator.get_evaluated<float3>(0); | ||||
| transforms_evaluator.evaluate(); | const VArray<float3> &pivots = evaluator.get_evaluated<float3>(1); | ||||
| const VArray<float3> &rotations = transforms_evaluator.get_evaluated<float3>(0); | const VArray<bool> &local_spaces = evaluator.get_evaluated<bool>(2); | ||||
| const VArray<float3> &pivots = transforms_evaluator.get_evaluated<float3>(1); | |||||
| const VArray<bool> &local_spaces = transforms_evaluator.get_evaluated<bool>(2); | |||||
| MutableSpan<float4x4> instance_transforms = instances_component.instance_transforms(); | MutableSpan<float4x4> instance_transforms = instances_component.instance_transforms(); | ||||
| threading::parallel_for(selection.index_range(), 512, [&](IndexRange range) { | threading::parallel_for(selection.index_range(), 512, [&](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]; | ||||
| const float3 pivot = pivots[i]; | const float3 pivot = pivots[i]; | ||||
| const float3 euler = rotations[i]; | const float3 euler = rotations[i]; | ||||
| ▲ Show 20 Lines • Show All 64 Lines • Show Last 20 Lines | |||||