Changeset View
Changeset View
Standalone View
Standalone View
source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc
| Show First 20 Lines • Show All 196 Lines • ▼ Show 20 Lines | else if (mode_param.mode == GEO_NODE_CURVE_RESAMPLE_EVALUATED) { | ||||
| }); | }); | ||||
| } | } | ||||
| output_curve->attributes = input_curve.attributes; | output_curve->attributes = input_curve.attributes; | ||||
| return output_curve; | return output_curve; | ||||
| } | } | ||||
| static void geo_node_resample_exec(GeoNodeExecParams params) | static void geometry_set_curve_resample(GeometrySet &geometry_set, | ||||
| const SampleModeParam &mode_param) | |||||
| { | { | ||||
| GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry"); | |||||
| geometry_set = bke::geometry_set_realize_instances(geometry_set); | |||||
| if (!geometry_set.has_curve()) { | if (!geometry_set.has_curve()) { | ||||
| params.set_output("Geometry", GeometrySet()); | |||||
| return; | return; | ||||
| } | } | ||||
| const CurveEval &input_curve = *geometry_set.get_curve_for_read(); | const CurveEval &input_curve = *geometry_set.get_curve_for_read(); | ||||
| std::unique_ptr<CurveEval> output_curve = resample_curve(input_curve, mode_param); | |||||
| geometry_set.replace_curve(output_curve.release()); | |||||
| } | |||||
| static void geo_node_resample_exec(GeoNodeExecParams params) | |||||
| { | |||||
| GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry"); | |||||
| NodeGeometryCurveResample &node_storage = *(NodeGeometryCurveResample *)params.node().storage; | NodeGeometryCurveResample &node_storage = *(NodeGeometryCurveResample *)params.node().storage; | ||||
| const GeometryNodeCurveResampleMode mode = (GeometryNodeCurveResampleMode)node_storage.mode; | const GeometryNodeCurveResampleMode mode = (GeometryNodeCurveResampleMode)node_storage.mode; | ||||
| SampleModeParam mode_param; | SampleModeParam mode_param; | ||||
| mode_param.mode = mode; | mode_param.mode = mode; | ||||
| if (mode == GEO_NODE_CURVE_RESAMPLE_COUNT) { | if (mode == GEO_NODE_CURVE_RESAMPLE_COUNT) { | ||||
| const int count = params.extract_input<int>("Count"); | const int count = params.extract_input<int>("Count"); | ||||
| if (count < 1) { | if (count < 1) { | ||||
| params.set_output("Geometry", GeometrySet()); | params.set_output("Geometry", GeometrySet()); | ||||
| return; | return; | ||||
| } | } | ||||
| mode_param.count.emplace(count); | mode_param.count.emplace(count); | ||||
| } | } | ||||
| else if (mode == GEO_NODE_CURVE_RESAMPLE_LENGTH) { | else if (mode == GEO_NODE_CURVE_RESAMPLE_LENGTH) { | ||||
| /* Don't allow asymptotic count increase for low resolution values. */ | /* Don't allow asymptotic count increase for low resolution values. */ | ||||
| const float resolution = std::max(params.extract_input<float>("Length"), 0.0001f); | const float resolution = std::max(params.extract_input<float>("Length"), 0.0001f); | ||||
| mode_param.length.emplace(resolution); | mode_param.length.emplace(resolution); | ||||
| } | } | ||||
| std::unique_ptr<CurveEval> output_curve = resample_curve(input_curve, mode_param); | geometry_set.modify_geometry_sets( | ||||
| [&](GeometrySet &geometry_set) { geometry_set_curve_resample(geometry_set, mode_param); }); | |||||
| params.set_output("Geometry", GeometrySet::create_with_curve(output_curve.release())); | params.set_output("Geometry", std::move(geometry_set)); | ||||
| } | } | ||||
| } // namespace blender::nodes | } // namespace blender::nodes | ||||
| void register_node_type_geo_curve_resample() | void register_node_type_geo_curve_resample() | ||||
| { | { | ||||
| static bNodeType ntype; | static bNodeType ntype; | ||||
| Show All 10 Lines | |||||