Changeset View
Changeset View
Standalone View
Standalone View
source/blender/nodes/geometry/nodes/node_geo_set_curve_handles.cc
| Show First 20 Lines • Show All 54 Lines • ▼ Show 20 Lines | static void set_position_in_component(const GeometryNodeCurveHandleMode mode, | ||||
| const Field<float3> &offset_field) | const Field<float3> &offset_field) | ||||
| { | { | ||||
| GeometryComponentFieldContext field_context{component, ATTR_DOMAIN_POINT}; | GeometryComponentFieldContext field_context{component, ATTR_DOMAIN_POINT}; | ||||
| const int domain_size = component.attribute_domain_size(ATTR_DOMAIN_POINT); | const int domain_size = component.attribute_domain_size(ATTR_DOMAIN_POINT); | ||||
| if (domain_size == 0) { | if (domain_size == 0) { | ||||
| return; | return; | ||||
| } | } | ||||
| 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(); | evaluator.add(position_field); | ||||
| const IndexMask selection = selection_evaluator.get_evaluated_as_mask(0); | evaluator.add(offset_field); | ||||
| evaluator.evaluate(); | |||||
| const IndexMask selection = evaluator.get_evaluated_as_mask(0); | |||||
| CurveComponent *curve_component = static_cast<CurveComponent *>(&component); | CurveComponent *curve_component = static_cast<CurveComponent *>(&component); | ||||
| CurveEval *curve = curve_component->get_for_write(); | CurveEval *curve = curve_component->get_for_write(); | ||||
| StringRef side = mode & GEO_NODE_CURVE_HANDLE_LEFT ? "handle_left" : "handle_right"; | StringRef side = mode & GEO_NODE_CURVE_HANDLE_LEFT ? "handle_left" : "handle_right"; | ||||
| int current_point = 0; | int current_point = 0; | ||||
| int current_mask = 0; | int current_mask = 0; | ||||
| Show All 33 Lines | else { | ||||
| if (current_mask < selection.size() && selection[current_mask] == current_point) { | if (current_mask < selection.size() && selection[current_mask] == current_point) { | ||||
| current_mask++; | current_mask++; | ||||
| } | } | ||||
| current_point++; | current_point++; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| fn::FieldEvaluator position_evaluator{field_context, &selection}; | const VArray<float3> &positions_input = evaluator.get_evaluated<float3>(0); | ||||
| position_evaluator.add(position_field); | const VArray<float3> &offsets_input = evaluator.get_evaluated<float3>(1); | ||||
| position_evaluator.add(offset_field); | |||||
| position_evaluator.evaluate(); | |||||
| const VArray<float3> &positions_input = position_evaluator.get_evaluated<float3>(0); | |||||
| const VArray<float3> &offsets_input = position_evaluator.get_evaluated<float3>(1); | |||||
| OutputAttribute_Typed<float3> positions = component.attribute_try_get_for_output<float3>( | OutputAttribute_Typed<float3> positions = component.attribute_try_get_for_output<float3>( | ||||
| side, ATTR_DOMAIN_POINT, {0, 0, 0}); | side, ATTR_DOMAIN_POINT, {0, 0, 0}); | ||||
| MutableSpan<float3> position_mutable = positions.as_span(); | MutableSpan<float3> position_mutable = positions.as_span(); | ||||
| for (int i : selection) { | for (int i : selection) { | ||||
| position_mutable[i] = positions_input[i] + offsets_input[i]; | position_mutable[i] = positions_input[i] + offsets_input[i]; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 54 Lines • Show Last 20 Lines | |||||