Changeset View
Changeset View
Standalone View
Standalone View
source/blender/nodes/geometry/nodes/node_geo_curve_trim.cc
| Show First 20 Lines • Show All 314 Lines • ▼ Show 20 Lines | bezier_spline.handle_positions_left()[start.right_index - start.left_index] = | ||||
| start_point.handle_next; | start_point.handle_next; | ||||
| bezier_spline.handle_positions_right()[end.left_index - start.left_index] = | bezier_spline.handle_positions_right()[end.left_index - start.left_index] = | ||||
| end_point.handle_prev; | end_point.handle_prev; | ||||
| } | } | ||||
| bezier_spline.resize(size); | bezier_spline.resize(size); | ||||
| } | } | ||||
| static void geo_node_curve_trim_exec(GeoNodeExecParams params) | static void geometry_set_curve_trim(GeometrySet &geometry_set, | ||||
| const GeometryNodeCurveSampleMode mode, | |||||
| const float start, | |||||
| const float end) | |||||
| { | { | ||||
| const NodeGeometryCurveTrim &node_storage = *(NodeGeometryCurveTrim *)params.node().storage; | |||||
| const GeometryNodeCurveSampleMode mode = (GeometryNodeCurveSampleMode)node_storage.mode; | |||||
| GeometrySet geometry_set = params.extract_input<GeometrySet>("Curve"); | |||||
| geometry_set = bke::geometry_set_realize_instances(geometry_set); | |||||
| if (!geometry_set.has_curve()) { | if (!geometry_set.has_curve()) { | ||||
| params.set_output("Curve", std::move(geometry_set)); | |||||
| return; | return; | ||||
| } | } | ||||
| CurveComponent &curve_component = geometry_set.get_component_for_write<CurveComponent>(); | CurveEval &curve = *geometry_set.get_curve_for_write(); | ||||
| CurveEval &curve = *curve_component.get_for_write(); | |||||
| MutableSpan<SplinePtr> splines = curve.splines(); | MutableSpan<SplinePtr> splines = curve.splines(); | ||||
| const float start = mode == GEO_NODE_CURVE_SAMPLE_FACTOR ? | |||||
| params.extract_input<float>("Start") : | |||||
| params.extract_input<float>("Start_001"); | |||||
| const float end = mode == GEO_NODE_CURVE_SAMPLE_FACTOR ? params.extract_input<float>("End") : | |||||
| params.extract_input<float>("End_001"); | |||||
| threading::parallel_for(splines.index_range(), 128, [&](IndexRange range) { | threading::parallel_for(splines.index_range(), 128, [&](IndexRange range) { | ||||
| for (const int i : range) { | for (const int i : range) { | ||||
| Spline &spline = *splines[i]; | Spline &spline = *splines[i]; | ||||
| /* Currently this node doesn't support cyclic splines, it could in the future though. */ | /* Currently this node doesn't support cyclic splines, it could in the future though. */ | ||||
| if (spline.is_cyclic()) { | if (spline.is_cyclic()) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| Show All 24 Lines | for (const int i : range) { | ||||
| case Spline::Type::NURBS: | case Spline::Type::NURBS: | ||||
| splines[i] = std::make_unique<PolySpline>( | splines[i] = std::make_unique<PolySpline>( | ||||
| trim_nurbs_spline(spline, start_lookup, end_lookup)); | trim_nurbs_spline(spline, start_lookup, end_lookup)); | ||||
| break; | break; | ||||
| } | } | ||||
| splines[i]->mark_cache_invalid(); | splines[i]->mark_cache_invalid(); | ||||
| } | } | ||||
| }); | }); | ||||
| } | |||||
| static void geo_node_curve_trim_exec(GeoNodeExecParams params) | |||||
| { | |||||
| const NodeGeometryCurveTrim &node_storage = *(NodeGeometryCurveTrim *)params.node().storage; | |||||
| const GeometryNodeCurveSampleMode mode = (GeometryNodeCurveSampleMode)node_storage.mode; | |||||
| GeometrySet geometry_set = params.extract_input<GeometrySet>("Curve"); | |||||
| if (mode == GEO_NODE_CURVE_SAMPLE_FACTOR) { | |||||
| const float start = params.extract_input<float>("Start"); | |||||
| const float end = params.extract_input<float>("End"); | |||||
| geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) { | |||||
| geometry_set_curve_trim(geometry_set, mode, start, end); | |||||
| }); | |||||
| } | |||||
| else if (mode == GEO_NODE_CURVE_SAMPLE_LENGTH) { | |||||
| const float start = params.extract_input<float>("Start_001"); | |||||
| const float end = params.extract_input<float>("End_001"); | |||||
| geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) { | |||||
| geometry_set_curve_trim(geometry_set, mode, start, end); | |||||
| }); | |||||
| } | |||||
| params.set_output("Curve", std::move(geometry_set)); | params.set_output("Curve", std::move(geometry_set)); | ||||
| } | } | ||||
| } // namespace blender::nodes | } // namespace blender::nodes | ||||
| void register_node_type_geo_curve_trim() | void register_node_type_geo_curve_trim() | ||||
| { | { | ||||
| Show All 11 Lines | |||||