Changeset View
Changeset View
Standalone View
Standalone View
source/blender/nodes/geometry/nodes/node_geo_curve_to_mesh.cc
| Show All 26 Lines | |||||
| static void geo_node_curve_to_mesh_declare(NodeDeclarationBuilder &b) | static void geo_node_curve_to_mesh_declare(NodeDeclarationBuilder &b) | ||||
| { | { | ||||
| b.add_input<decl::Geometry>("Curve"); | b.add_input<decl::Geometry>("Curve"); | ||||
| b.add_input<decl::Geometry>("Profile Curve"); | b.add_input<decl::Geometry>("Profile Curve"); | ||||
| b.add_output<decl::Geometry>("Mesh"); | b.add_output<decl::Geometry>("Mesh"); | ||||
| } | } | ||||
| static void geo_node_curve_to_mesh_exec(GeoNodeExecParams params) | static void geometry_set_curve_to_mesh(GeometrySet &geometry_set, | ||||
| const GeometrySet &profile_set, | |||||
| const GeoNodeExecParams ¶ms) | |||||
| { | { | ||||
| GeometrySet curve_set = params.extract_input<GeometrySet>("Curve"); | if (!geometry_set.has_curve()) { | ||||
| GeometrySet profile_set = params.extract_input<GeometrySet>("Profile Curve"); | if (!geometry_set.is_empty()) { | ||||
| curve_set = bke::geometry_set_realize_instances(curve_set); | |||||
| profile_set = bke::geometry_set_realize_instances(profile_set); | |||||
| /* NOTE: Theoretically an "is empty" check would be more correct for errors. */ | |||||
| if (profile_set.has_mesh() && !profile_set.has_curve()) { | |||||
| params.error_message_add(NodeWarningType::Warning, | |||||
| TIP_("No curve data available in profile input")); | |||||
| } | |||||
| if (!curve_set.has_curve()) { | |||||
| if (curve_set.has_mesh()) { | |||||
| params.error_message_add(NodeWarningType::Warning, | params.error_message_add(NodeWarningType::Warning, | ||||
| TIP_("No curve data available in curve input")); | TIP_("No curve data available in curve input")); | ||||
| } | } | ||||
| params.set_output("Mesh", GeometrySet()); | |||||
| return; | return; | ||||
| } | } | ||||
| const CurveEval *profile_curve = profile_set.get_curve_for_read(); | const CurveEval *profile_curve = profile_set.get_curve_for_read(); | ||||
| if (profile_curve == nullptr) { | if (profile_curve == nullptr) { | ||||
| Mesh *mesh = bke::curve_to_wire_mesh(*curve_set.get_curve_for_read()); | Mesh *mesh = bke::curve_to_wire_mesh(*geometry_set.get_curve_for_read()); | ||||
| params.set_output("Mesh", GeometrySet::create_with_mesh(mesh)); | geometry_set.replace_mesh(mesh); | ||||
| } | } | ||||
| else { | else { | ||||
| Mesh *mesh = bke::curve_to_mesh_sweep(*curve_set.get_curve_for_read(), *profile_curve); | Mesh *mesh = bke::curve_to_mesh_sweep(*geometry_set.get_curve_for_read(), *profile_curve); | ||||
| params.set_output("Mesh", GeometrySet::create_with_mesh(mesh)); | geometry_set.replace_mesh(mesh); | ||||
| } | |||||
| } | |||||
| static void geo_node_curve_to_mesh_exec(GeoNodeExecParams params) | |||||
| { | |||||
| GeometrySet curve_set = params.extract_input<GeometrySet>("Curve"); | |||||
| GeometrySet profile_set = params.extract_input<GeometrySet>("Profile Curve"); | |||||
| if (profile_set.has_instances()) { | |||||
| params.error_message_add(NodeWarningType::Error, | |||||
| TIP_("Instances are not supported in the profile input")); | |||||
| params.set_output("Mesh", GeometrySet()); | |||||
| return; | |||||
| } | |||||
| if (!profile_set.has_curve() && !profile_set.is_empty()) { | |||||
| params.error_message_add(NodeWarningType::Warning, | |||||
| TIP_("No curve data available in the profile input")); | |||||
| } | } | ||||
| curve_set.modify_geometry_sets([&](GeometrySet &geometry_set) { | |||||
| geometry_set_curve_to_mesh(geometry_set, profile_set, params); | |||||
| }); | |||||
| params.set_output("Mesh", std::move(curve_set)); | |||||
| } | } | ||||
| } // namespace blender::nodes | } // namespace blender::nodes | ||||
| void register_node_type_geo_curve_to_mesh() | void register_node_type_geo_curve_to_mesh() | ||||
| { | { | ||||
| static bNodeType ntype; | static bNodeType ntype; | ||||
| geo_node_type_base(&ntype, GEO_NODE_CURVE_TO_MESH, "Curve to Mesh", NODE_CLASS_GEOMETRY, 0); | geo_node_type_base(&ntype, GEO_NODE_CURVE_TO_MESH, "Curve to Mesh", NODE_CLASS_GEOMETRY, 0); | ||||
| ntype.declare = blender::nodes::geo_node_curve_to_mesh_declare; | ntype.declare = blender::nodes::geo_node_curve_to_mesh_declare; | ||||
| ntype.geometry_node_execute = blender::nodes::geo_node_curve_to_mesh_exec; | ntype.geometry_node_execute = blender::nodes::geo_node_curve_to_mesh_exec; | ||||
| nodeRegisterType(&ntype); | nodeRegisterType(&ntype); | ||||
| } | } | ||||