Changeset View
Changeset View
Standalone View
Standalone View
source/blender/nodes/geometry/nodes/node_geo_instance_on_points.cc
| Show First 20 Lines • Show All 59 Lines • ▼ Show 20 Lines | static void add_instances_from_component( | ||||
| const GeometryComponent &src_component, | const GeometryComponent &src_component, | ||||
| const GeometrySet &instance, | const GeometrySet &instance, | ||||
| const GeoNodeExecParams ¶ms, | const GeoNodeExecParams ¶ms, | ||||
| const Map<AttributeIDRef, AttributeKind> &attributes_to_propagate) | const Map<AttributeIDRef, AttributeKind> &attributes_to_propagate) | ||||
| { | { | ||||
| const AttributeDomain domain = ATTR_DOMAIN_POINT; | const AttributeDomain domain = ATTR_DOMAIN_POINT; | ||||
| const int domain_size = src_component.attribute_domain_size(domain); | const int domain_size = src_component.attribute_domain_size(domain); | ||||
| VArray<bool> pick_instance; | |||||
| VArray<int> indices; | |||||
| VArray<float3> rotations; | |||||
| VArray<float3> scales; | |||||
| GeometryComponentFieldContext field_context{src_component, domain}; | GeometryComponentFieldContext field_context{src_component, domain}; | ||||
| const Field<bool> selection_field = params.get_input<Field<bool>>("Selection"); | const Field<bool> selection_field = params.get_input<Field<bool>>("Selection"); | ||||
| fn::FieldEvaluator selection_evaluator{field_context, domain_size}; | fn::FieldEvaluator evaluator{field_context, domain_size}; | ||||
| selection_evaluator.add(selection_field); | evaluator.set_selection(selection_field); | ||||
| selection_evaluator.evaluate(); | /* The evaluator could use the component's stable IDs as a destination directly, but only the | ||||
| const IndexMask selection = selection_evaluator.get_evaluated_as_mask(0); | * selected indices should be copied. */ | ||||
| evaluator.add(params.get_input<Field<bool>>("Pick Instance"), &pick_instance); | |||||
| evaluator.add(params.get_input<Field<int>>("Instance Index"), &indices); | |||||
| evaluator.add(params.get_input<Field<float3>>("Rotation"), &rotations); | |||||
| evaluator.add(params.get_input<Field<float3>>("Scale"), &scales); | |||||
| evaluator.evaluate(); | |||||
| const IndexMask selection = evaluator.get_evaluated_selection_as_mask(); | |||||
| /* The initial size of the component might be non-zero when this function is called for multiple | /* The initial size of the component might be non-zero when this function is called for multiple | ||||
| * component types. */ | * component types. */ | ||||
| const int start_len = dst_component.instances_amount(); | const int start_len = dst_component.instances_amount(); | ||||
| const int select_len = selection.index_range().size(); | const int select_len = selection.index_range().size(); | ||||
| dst_component.resize(start_len + select_len); | dst_component.resize(start_len + select_len); | ||||
| MutableSpan<int> dst_handles = dst_component.instance_reference_handles().slice(start_len, | MutableSpan<int> dst_handles = dst_component.instance_reference_handles().slice(start_len, | ||||
| select_len); | select_len); | ||||
| MutableSpan<float4x4> dst_transforms = dst_component.instance_transforms().slice(start_len, | MutableSpan<float4x4> dst_transforms = dst_component.instance_transforms().slice(start_len, | ||||
| select_len); | select_len); | ||||
| FieldEvaluator field_evaluator{field_context, domain_size}; | |||||
| VArray<bool> pick_instance; | |||||
| VArray<int> indices; | |||||
| VArray<float3> rotations; | |||||
| VArray<float3> scales; | |||||
| /* The evaluator could use the component's stable IDs as a destination directly, but only the | |||||
| * selected indices should be copied. */ | |||||
| field_evaluator.add(params.get_input<Field<bool>>("Pick Instance"), &pick_instance); | |||||
| field_evaluator.add(params.get_input<Field<int>>("Instance Index"), &indices); | |||||
| field_evaluator.add(params.get_input<Field<float3>>("Rotation"), &rotations); | |||||
| field_evaluator.add(params.get_input<Field<float3>>("Scale"), &scales); | |||||
| field_evaluator.evaluate(); | |||||
| VArray<float3> positions = src_component.attribute_get_for_read<float3>( | VArray<float3> positions = src_component.attribute_get_for_read<float3>( | ||||
| "position", domain, {0, 0, 0}); | "position", domain, {0, 0, 0}); | ||||
| const InstancesComponent *src_instances = instance.get_component_for_read<InstancesComponent>(); | const InstancesComponent *src_instances = instance.get_component_for_read<InstancesComponent>(); | ||||
| /* Maps handles from the source instances to handles on the new instance. */ | /* Maps handles from the source instances to handles on the new instance. */ | ||||
| Array<int> handle_mapping; | Array<int> handle_mapping; | ||||
| /* Only fill #handle_mapping when it may be used below. */ | /* Only fill #handle_mapping when it may be used below. */ | ||||
| ▲ Show 20 Lines • Show All 161 Lines • Show Last 20 Lines | |||||