Geometry Nodes: add descriptions to various built-in geometry sockets

In some cases the description is more useful than in others. But overall it's
nice if users can expect there to be some description instead of nothing.

The goal is also to not show the supported geometry types as a separate line
in the tooltip as that can be misleading sometimes and is often redundant
with the socket name and description already. Now the description is expected
to contain the relevant data for the user. It can also be more detailed than
just mentioning which geometry types are supported.
This commit is contained in:
Jacques Lucke
2025-07-16 18:17:29 +02:00
parent c2497d16e3
commit feb4122f62
88 changed files with 229 additions and 106 deletions

View File

@@ -33,7 +33,10 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_default_layout();
b.add_input<decl::Geometry>("Geometry");
b.add_input<decl::Geometry>("Geometry")
.description(
"Geometry to evaluate the given fields and store the resulting attributes on. All "
"geometry types except volumes are supported");
b.add_output<decl::Geometry>("Geometry").propagate_all().align_with_previous();
if (node != nullptr) {
const NodeGeometryAttributeCapture &storage = node_storage(*node);

View File

@@ -15,7 +15,10 @@ namespace blender::nodes::node_geo_attribute_domain_size_cc {
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Geometry");
b.add_input<decl::Geometry>("Geometry")
.description(
"Geometry to get the domain sizes of. Only the root geometry is considered, not nested "
"instances");
auto &total_points = b.add_output<decl::Int>("Point Count")
.make_available([](bNode &node) {
node.custom1 = int16_t(GeometryComponent::Type::Mesh);

View File

@@ -24,7 +24,7 @@ static void node_declare(NodeDeclarationBuilder &b)
{
const bNode *node = b.node_or_null();
b.add_input<decl::Geometry>("Geometry");
b.add_input<decl::Geometry>("Geometry").description("Geometry to get the statistics from");
b.add_input<decl::Bool>("Selection").default_value(true).field_on_all().hide_value();
if (node != nullptr) {

View File

@@ -25,8 +25,10 @@ static void node_declare(NodeDeclarationBuilder &b)
{
const bNode *node = b.node_or_null();
auto &first_geometry = b.add_input<decl::Geometry>("Mesh 1").only_realized_data().supported_type(
GeometryComponent::Type::Mesh);
auto &first_geometry = b.add_input<decl::Geometry>("Mesh 1")
.only_realized_data()
.supported_type(GeometryComponent::Type::Mesh)
.description("Base mesh to subtract geometry from");
if (node != nullptr) {
switch (geometry::boolean::Operation(node->custom1)) {
@@ -34,12 +36,14 @@ static void node_declare(NodeDeclarationBuilder &b)
case geometry::boolean::Operation::Union:
b.add_input<decl::Geometry>("Mesh", "Mesh 2")
.supported_type(GeometryComponent::Type::Mesh)
.multi_input();
.multi_input()
.description("Meshes to union or intersect");
break;
case geometry::boolean::Operation::Difference:
b.add_input<decl::Geometry>("Mesh 2")
.supported_type(GeometryComponent::Type::Mesh)
.multi_input();
.multi_input()
.description("Mesh that is subtracted from the first mesh");
break;
}
}

View File

@@ -11,13 +11,18 @@ namespace blender::nodes::node_geo_bounding_box_cc {
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Geometry");
b.add_input<decl::Geometry>("Geometry")
.description(
"Geometry to compute the bounding box of. Instances have to be realized before the full "
"bounding box can be computed");
b.add_input<decl::Bool>("Use Radius")
.default_value(true)
.description(
"For curves, point clouds, and Grease Pencil, take the radius attribute into account "
"when computing the bounds.");
b.add_output<decl::Geometry>("Bounding Box").propagate_all_instance_attributes();
b.add_output<decl::Geometry>("Bounding Box")
.propagate_all_instance_attributes()
.description("A cube mesh enclosing the input geometry");
b.add_output<decl::Vector>("Min");
b.add_output<decl::Vector>("Max");
}

View File

@@ -35,7 +35,8 @@ static void node_declare(NodeDeclarationBuilder &b)
.description(
"Reset the transforms of every child instance in the output. Only used when Separate "
"Children is enabled");
b.add_output<decl::Geometry>("Instances");
b.add_output<decl::Geometry>("Instances")
.description("Instance of the collection or instances all the children in the collection");
}
static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr)

View File

@@ -22,7 +22,7 @@ namespace blender::nodes::node_geo_convex_hull_cc {
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Geometry");
b.add_input<decl::Geometry>("Geometry").description("Points to compute the convex hull of");
b.add_output<decl::Geometry>("Convex Hull").propagate_all_instance_attributes();
}

View File

@@ -27,8 +27,10 @@ NODE_STORAGE_FUNCS(NodeGeometryCurveFill)
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Curve").supported_type(
{GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil});
b.add_input<decl::Geometry>("Curve")
.supported_type({GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil})
.description(
"Curves to fill. All curves are treated as cyclic and projected to the XY plane");
b.add_input<decl::Int>("Group ID")
.field_on_all()
.hide_value()

View File

@@ -24,8 +24,9 @@ static void node_declare(NodeDeclarationBuilder &b)
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_default_layout();
b.add_input<decl::Geometry>("Curve").supported_type(
{GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil});
b.add_input<decl::Geometry>("Curve")
.supported_type({GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil})
.description("Curves to generated rounded corners on");
b.add_output<decl::Geometry>("Curve").propagate_all().align_with_previous();
auto &count_input = b.add_input<decl::Int>("Count")
.default_value(1)

View File

@@ -11,8 +11,9 @@ namespace blender::nodes::node_geo_curve_length_cc {
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Curve").supported_type(
{GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil});
b.add_input<decl::Geometry>("Curve")
.supported_type({GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil})
.description("Curve to compute the length of");
b.add_output<decl::Float>("Length");
}

View File

@@ -23,8 +23,9 @@ static void node_declare(NodeDeclarationBuilder &b)
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_default_layout();
b.add_input<decl::Geometry>("Curve").supported_type(
{GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil});
b.add_input<decl::Geometry>("Curve")
.supported_type({GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil})
.description("Curves to resample");
b.add_output<decl::Geometry>("Curve").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).field_on_all().hide_value();
auto &count =

View File

@@ -13,8 +13,9 @@ static void node_declare(NodeDeclarationBuilder &b)
{
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Curve").supported_type(
{GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil});
b.add_input<decl::Geometry>("Curve")
.supported_type({GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil})
.description("Curves to switch the start and end of");
b.add_output<decl::Geometry>("Curve").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
}

View File

@@ -24,8 +24,10 @@ NODE_STORAGE_FUNCS(NodeGeometryCurveSample)
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Curves").only_realized_data().supported_type(
GeometryComponent::Type::Curve);
b.add_input<decl::Geometry>("Curves")
.only_realized_data()
.supported_type(GeometryComponent::Type::Curve)
.description("Curves to sample positions on");
if (const bNode *node = b.node_or_null()) {
const NodeGeometryCurveSample &storage = node_storage(*node);

View File

@@ -20,7 +20,9 @@ static void node_declare(NodeDeclarationBuilder &b)
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_default_layout();
b.add_input<decl::Geometry>("Curve").supported_type(GeometryComponent::Type::Curve);
b.add_input<decl::Geometry>("Curve")
.supported_type(GeometryComponent::Type::Curve)
.description("Curves to set handles of control points on");
b.add_output<decl::Geometry>("Curve").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
}

View File

@@ -21,7 +21,9 @@ NODE_STORAGE_FUNCS(NodeGeometryCurveSplineType)
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Curve").supported_type(GeometryComponent::Type::Curve);
b.add_input<decl::Geometry>("Curve")
.supported_type(GeometryComponent::Type::Curve)
.description("Curves to change the type of");
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_output<decl::Geometry>("Curve").propagate_all();
}

View File

@@ -15,8 +15,9 @@ static void node_declare(NodeDeclarationBuilder &b)
{
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Curve").supported_type(
{GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil});
b.add_input<decl::Geometry>("Curve")
.supported_type({GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil})
.description("Curves to subdivide");
b.add_output<decl::Geometry>("Curve").propagate_all().align_with_previous();
b.add_input<decl::Int>("Cuts").default_value(1).min(0).max(1000).field_on_all().description(
"The number of control points to create on the segment following each point");

View File

@@ -19,11 +19,13 @@ namespace blender::nodes::node_geo_curve_to_mesh_cc {
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Curve").supported_type(
{GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil});
b.add_input<decl::Geometry>("Curve")
.supported_type({GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil})
.description("Curve to convert to a mesh using the given profile");
b.add_input<decl::Geometry>("Profile Curve")
.only_realized_data()
.supported_type(GeometryComponent::Type::Curve);
.supported_type(GeometryComponent::Type::Curve)
.description("Curves that are sweeped along the main curve");
b.add_input<decl::Float>("Scale").default_value(1.0f).min(0.0f).field_on({0}).description(
"Scale of the profile at each point");
b.add_input<decl::Bool>("Fill Caps")

View File

@@ -27,8 +27,9 @@ NODE_STORAGE_FUNCS(NodeGeometryCurveToPoints)
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Curve").supported_type(
{GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil});
b.add_input<decl::Geometry>("Curve")
.supported_type({GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil})
.description("Curves to convert to points");
auto &count = b.add_input<decl::Int>("Count")
.default_value(10)
.min(2)

View File

@@ -25,8 +25,9 @@ static void node_declare(NodeDeclarationBuilder &b)
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_default_layout();
b.add_input<decl::Geometry>("Curve").supported_type(
{GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil});
b.add_input<decl::Geometry>("Curve")
.supported_type({GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil})
.description("Curves to shorten");
b.add_output<decl::Geometry>("Curve").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().supports_field();
auto &start_fac = b.add_input<decl::Float>("Start")

View File

@@ -33,7 +33,9 @@ static void node_declare(NodeDeclarationBuilder &b)
{
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Curves").supported_type(GeometryComponent::Type::Curve);
b.add_input<decl::Geometry>("Curves")
.supported_type(GeometryComponent::Type::Curve)
.description("Curves to deform");
b.add_output<decl::Geometry>("Curves").propagate_all().align_with_previous();
}

View File

@@ -22,7 +22,7 @@ static void node_declare(NodeDeclarationBuilder &b)
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_default_layout();
b.add_input<decl::Geometry>("Geometry");
b.add_input<decl::Geometry>("Geometry").description("Geometry to delete elements from");
b.add_output<decl::Geometry>("Geometry").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection")
.default_value(true)

View File

@@ -34,7 +34,8 @@ static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Volume")
.supported_type(GeometryComponent::Type::Volume)
.translation_context(BLT_I18NCONTEXT_ID_ID);
.translation_context(BLT_I18NCONTEXT_ID_ID)
.description("Volume with fog grids that points are scattered in");
auto &density = b.add_input<decl::Float>("Density")
.default_value(1.0f)
.min(0.0f)

View File

@@ -35,7 +35,9 @@ static void node_declare(NodeDeclarationBuilder &b)
node.custom1 = GEO_NODE_POINT_DISTRIBUTE_POINTS_ON_FACES_POISSON;
};
b.add_input<decl::Geometry>("Mesh").supported_type(GeometryComponent::Type::Mesh);
b.add_input<decl::Geometry>("Mesh")
.supported_type(GeometryComponent::Type::Mesh)
.description("Mesh on whose faces to distribute points on");
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
auto &distance_min = b.add_input<decl::Float>("Distance Min")
.min(0.0f)

View File

@@ -17,7 +17,9 @@ static void node_declare(NodeDeclarationBuilder &b)
{
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Mesh").supported_type(GeometryComponent::Type::Mesh);
b.add_input<decl::Geometry>("Mesh")
.supported_type(GeometryComponent::Type::Mesh)
.description("Mesh to compute the dual of");
b.add_output<decl::Geometry>("Dual Mesh").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Keep Boundaries")
.default_value(false)

View File

@@ -32,7 +32,7 @@ NODE_STORAGE_FUNCS(NodeGeometryDuplicateElements);
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Geometry");
b.add_input<decl::Geometry>("Geometry").description("Geometry to duplicate elements of");
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_input<decl::Int>("Amount").min(0).default_value(1).field_on_all().description(
"The number of duplicates to create for each element");

View File

@@ -14,7 +14,9 @@ namespace blender::nodes::node_geo_edge_paths_to_curves_cc {
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Mesh").supported_type(GeometryComponent::Type::Mesh);
b.add_input<decl::Geometry>("Mesh")
.supported_type(GeometryComponent::Type::Mesh)
.description("Edges to convert to curves");
b.add_input<decl::Bool>("Start Vertices").default_value(true).hide_value().field_on_all();
b.add_input<decl::Int>("Next Vertex Index").default_value(-1).hide_value().field_on_all();
b.add_output<decl::Geometry>("Curves").propagate_all();

View File

@@ -14,7 +14,9 @@ static void node_declare(NodeDeclarationBuilder &b)
{
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Mesh").supported_type(GeometryComponent::Type::Mesh);
b.add_input<decl::Geometry>("Mesh")
.supported_type(GeometryComponent::Type::Mesh)
.description("Mesh whose edges to split");
b.add_output<decl::Geometry>("Mesh").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
}

View File

@@ -35,7 +35,9 @@ NODE_STORAGE_FUNCS(NodeGeometryExtrudeMesh)
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Mesh").supported_type(GeometryComponent::Type::Mesh);
b.add_input<decl::Geometry>("Mesh")
.supported_type(GeometryComponent::Type::Mesh)
.description("Mesh to extrude elements of");
b.add_input<decl::Bool>("Selection").default_value(true).field_on_all().hide_value();
b.add_input<decl::Vector>("Offset")
.subtype(PROP_TRANSLATION)

View File

@@ -12,7 +12,9 @@ static void node_declare(NodeDeclarationBuilder &b)
{
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Mesh").supported_type(GeometryComponent::Type::Mesh);
b.add_input<decl::Geometry>("Mesh")
.supported_type(GeometryComponent::Type::Mesh)
.description("Mesh to flip faces of");
b.add_output<decl::Geometry>("Mesh").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
}

View File

@@ -10,7 +10,9 @@ namespace blender::nodes::node_geo_geometry_to_instance_cc {
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Geometry").multi_input();
b.add_input<decl::Geometry>("Geometry")
.multi_input()
.description("Each input geometry is turned into a separate instance");
b.add_output<decl::Geometry>("Instances").propagate_all();
}

View File

@@ -20,7 +20,7 @@ namespace blender::nodes::node_geo_get_named_grid_cc {
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Volume");
b.add_input<decl::Geometry>("Volume").description("Volume to take a named grid out of");
b.add_input<decl::String>("Name").hide_label();
b.add_input<decl::Bool>("Remove").default_value(true).translation_context(
BLT_I18NCONTEXT_OPERATOR_DEFAULT);

View File

@@ -17,7 +17,8 @@ namespace blender::nodes::node_geo_grease_pencil_to_curves_cc {
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Grease Pencil")
.supported_type(bke::GeometryComponent::Type::GreasePencil);
.supported_type(bke::GeometryComponent::Type::GreasePencil)
.description("Grease pencil data to convert to curves");
b.add_input<decl::Bool>("Selection")
.default_value(true)
.hide_value()

View File

@@ -15,7 +15,9 @@ namespace blender::nodes::node_geo_instances_to_points_cc {
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Instances").only_instances();
b.add_input<decl::Geometry>("Instances")
.only_instances()
.description("Instances that converted to a point per instance");
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_input<decl::Vector>("Position").implicit_field_on_all(NODE_DEFAULT_INPUT_POSITION_FIELD);
b.add_input<decl::Float>("Radius")

View File

@@ -12,7 +12,9 @@ static void node_declare(NodeDeclarationBuilder &b)
{
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Geometry").multi_input();
b.add_input<decl::Geometry>("Geometry")
.multi_input()
.description("Geometries to merge together by concatenating their elements");
b.add_output<decl::Geometry>("Geometry").propagate_all().align_with_previous();
}

View File

@@ -15,7 +15,8 @@ static void node_declare(NodeDeclarationBuilder &b)
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Geometry")
.supported_type({GeometryComponent::Type::Mesh, GeometryComponent::Type::GreasePencil});
.supported_type({GeometryComponent::Type::Mesh, GeometryComponent::Type::GreasePencil})
.description("Geometry to replace materials on");
b.add_output<decl::Geometry>("Geometry").propagate_all().align_with_previous();
b.add_input<decl::Material>("Old");
b.add_input<decl::Material>("New").translation_context(BLT_I18NCONTEXT_ID_MATERIAL);

View File

@@ -25,7 +25,8 @@ static void node_declare(NodeDeclarationBuilder &b)
b.allow_any_socket_order();
b.add_default_layout();
b.add_input<decl::Geometry>("Geometry")
.supported_type({GeometryComponent::Type::PointCloud, GeometryComponent::Type::Mesh});
.supported_type({GeometryComponent::Type::PointCloud, GeometryComponent::Type::Mesh})
.description("Point cloud or mesh to merge points of");
b.add_output<decl::Geometry>("Geometry").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_input<decl::Float>("Distance").default_value(0.001f).min(0.0f).subtype(PROP_DISTANCE);

View File

@@ -28,7 +28,8 @@ static void node_declare(NodeDeclarationBuilder &b)
b.allow_any_socket_order();
b.add_default_layout();
b.add_input<decl::Geometry>("Grease Pencil")
.supported_type(GeometryComponent::Type::GreasePencil);
.supported_type(GeometryComponent::Type::GreasePencil)
.description("Grease Pencil data to merge layers of");
b.add_output<decl::Geometry>("Grease Pencil").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
auto &group_id = b.add_input<decl::Int>("Group ID")

View File

@@ -15,7 +15,9 @@ static void node_declare(NodeDeclarationBuilder &b)
{
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Mesh").supported_type(GeometryComponent::Type::Mesh);
b.add_input<decl::Geometry>("Mesh")
.supported_type(GeometryComponent::Type::Mesh)
.description("Mesh to subdivide");
b.add_output<decl::Geometry>("Mesh").propagate_all().align_with_previous();
b.add_input<decl::Int>("Level").default_value(1).min(0).max(6);
}

View File

@@ -22,7 +22,9 @@ enum class Mode : int8_t {
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Mesh").supported_type(GeometryComponent::Type::Mesh);
b.add_input<decl::Geometry>("Mesh")
.supported_type(GeometryComponent::Type::Mesh)
.description("Mesh to convert to curves");
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_output<decl::Geometry>("Curve").propagate_all();
}

View File

@@ -16,7 +16,9 @@ NODE_STORAGE_FUNCS(NodeGeometryMeshToVolume)
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Mesh").supported_type(GeometryComponent::Type::Mesh);
b.add_input<decl::Geometry>("Mesh")
.supported_type(GeometryComponent::Type::Mesh)
.description("Mesh whose inner volume is converted to a density grid");
b.add_input<decl::Float>("Density").default_value(1.0f).min(0.01f).max(FLT_MAX);
b.add_input<decl::Float>("Voxel Size")
.default_value(0.3f)

View File

@@ -26,7 +26,9 @@ NODE_STORAGE_FUNCS(NodeGeometryMeshToPoints)
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Mesh").supported_type(GeometryComponent::Type::Mesh);
b.add_input<decl::Geometry>("Mesh")
.supported_type(GeometryComponent::Type::Mesh)
.description("Mesh whose elements are converted to points");
b.add_input<decl::Bool>("Selection").default_value(true).field_on_all().hide_value();
b.add_input<decl::Vector>("Position").implicit_field_on_all(NODE_DEFAULT_INPUT_POSITION_FIELD);
b.add_input<decl::Float>("Radius")

View File

@@ -14,7 +14,9 @@ namespace blender::nodes::node_geo_mesh_to_sdf_grid_cc {
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Mesh").supported_type(GeometryComponent::Type::Mesh);
b.add_input<decl::Geometry>("Mesh")
.supported_type(GeometryComponent::Type::Mesh)
.description("Mesh whose inner volume is converted to a signed distance field grid");
b.add_input<decl::Float>("Voxel Size")
.default_value(0.3f)
.min(0.01f)

View File

@@ -22,7 +22,9 @@ NODE_STORAGE_FUNCS(NodeGeometryMeshToVolume)
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Mesh").supported_type(GeometryComponent::Type::Mesh);
b.add_input<decl::Geometry>("Mesh")
.supported_type(GeometryComponent::Type::Mesh)
.description("Mesh to convert the inner volume of to a fog volume geometry");
b.add_input<decl::Float>("Density").default_value(1.0f).min(0.01f).max(FLT_MAX);
auto &voxel_size = b.add_input<decl::Float>("Voxel Size")
.default_value(0.3f)

View File

@@ -13,7 +13,8 @@ namespace blender::nodes::node_geo_points_to_sdf_grid_cc {
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Points");
b.add_input<decl::Geometry>("Points").description(
"Points whose volume is converted to a signed distance field grid");
b.add_input<decl::Float>("Radius")
.default_value(0.5f)
.min(0.0f)

View File

@@ -15,7 +15,9 @@ namespace blender::nodes::node_geo_points_to_vertices_cc {
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Points").supported_type(GeometryComponent::Type::PointCloud);
b.add_input<decl::Geometry>("Points")
.supported_type(GeometryComponent::Type::PointCloud)
.description("Points that are converted to vertices in a mesh");
b.add_input<decl::Bool>("Selection").default_value(true).field_on_all().hide_value();
b.add_output<decl::Geometry>("Mesh").propagate_all();
}

View File

@@ -142,7 +142,8 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_input<decl::Menu>("Resolution Mode")
.static_items(resolution_mode_items)
.description("How the voxel size is specified");
b.add_input<decl::Geometry>("Points").is_default_link_socket();
b.add_input<decl::Geometry>("Points").is_default_link_socket().description(
"Points which are converted to a volume");
b.add_input<decl::Float>("Density").default_value(1.0f).min(0.0f);
b.add_input<decl::Float>("Voxel Size")
.default_value(0.3f)

View File

@@ -25,7 +25,8 @@ static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Geometry", "Target")
.only_realized_data()
.supported_type({GeometryComponent::Type::Mesh, GeometryComponent::Type::PointCloud});
.supported_type({GeometryComponent::Type::Mesh, GeometryComponent::Type::PointCloud})
.description("Geometry to find the closest point on");
b.add_input<decl::Int>("Group ID")
.hide_value()
.field_on_all()

View File

@@ -31,7 +31,8 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_input<decl::Geometry>("Target Geometry")
.only_realized_data()
.supported_type(GeometryComponent::Type::Mesh);
.supported_type(GeometryComponent::Type::Mesh)
.description("Geometry to cast rays onto");
if (node != nullptr) {
const eCustomDataType data_type = eCustomDataType(node_storage(*node).data_type);
/* TODO: Field interfacing depends on the offset of the next declarations! */

View File

@@ -16,7 +16,8 @@ static void node_declare(NodeDeclarationBuilder &b)
{
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Geometry");
b.add_input<decl::Geometry>("Geometry")
.description("Geometry whose instances are (partially) realized");
b.add_output<decl::Geometry>("Geometry").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection")
.default_value(true)

View File

@@ -23,7 +23,7 @@ static void node_declare(NodeDeclarationBuilder &b)
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_default_layout();
b.add_input<decl::Geometry>("Geometry");
b.add_input<decl::Geometry>("Geometry").description("Geometry to remove attributes from");
b.add_output<decl::Geometry>("Geometry").propagate_all().align_with_previous();
b.add_input<decl::String>("Name").is_attribute_name().hide_label();
}

View File

@@ -16,7 +16,9 @@ static void node_declare(NodeDeclarationBuilder &b)
{
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Instances").only_instances();
b.add_input<decl::Geometry>("Instances")
.only_instances()
.description("Instances to rotate individually");
b.add_output<decl::Geometry>("Instances").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_input<decl::Rotation>("Rotation").field_on_all();

View File

@@ -25,7 +25,8 @@ static void node_declare(NodeDeclarationBuilder &b)
GeometryComponent::Type::PointCloud,
GeometryComponent::Type::Curve,
GeometryComponent::Type::Instance,
GeometryComponent::Type::GreasePencil});
GeometryComponent::Type::GreasePencil})
.description("Geometry to sample a value on");
if (node != nullptr) {
const eCustomDataType data_type = eCustomDataType(node_storage(*node).data_type);
b.add_input(data_type, "Value").hide_value().field_on_all();

View File

@@ -57,7 +57,8 @@ namespace blender::nodes::node_geo_sample_nearest_cc {
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Geometry")
.supported_type({GeometryComponent::Type::Mesh, GeometryComponent::Type::PointCloud});
.supported_type({GeometryComponent::Type::Mesh, GeometryComponent::Type::PointCloud})
.description("Mesh or point cloud to find the nearest point on");
b.add_input<decl::Vector>("Sample Position").implicit_field(NODE_DEFAULT_INPUT_POSITION_FIELD);
b.add_output<decl::Int>("Index").dependent_field({1});
}

View File

@@ -26,7 +26,9 @@ static void node_declare(NodeDeclarationBuilder &b)
{
const bNode *node = b.node_or_null();
b.add_input<decl::Geometry>("Mesh").supported_type(GeometryComponent::Type::Mesh);
b.add_input<decl::Geometry>("Mesh")
.supported_type(GeometryComponent::Type::Mesh)
.description("Mesh to find the closest surface point on");
if (node != nullptr) {
const eCustomDataType data_type = eCustomDataType(node->custom1);
b.add_input(data_type, "Value").hide_value().field_on_all();

View File

@@ -27,7 +27,9 @@ static void node_declare(NodeDeclarationBuilder &b)
{
const bNode *node = b.node_or_null();
b.add_input<decl::Geometry>("Mesh").supported_type(GeometryComponent::Type::Mesh);
b.add_input<decl::Geometry>("Mesh")
.supported_type(GeometryComponent::Type::Mesh)
.description("Mesh whose UV map is used");
if (node != nullptr) {
const eCustomDataType data_type = eCustomDataType(node->custom1);
b.add_input(data_type, "Value").hide_value().field_on_all();

View File

@@ -30,7 +30,9 @@ static void node_declare(NodeDeclarationBuilder &b)
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_default_layout();
b.add_input<decl::Geometry>("Geometry").supported_type(GeometryComponent::Type::Mesh);
b.add_input<decl::Geometry>("Geometry")
.supported_type(GeometryComponent::Type::Mesh)
.description("Geometry to scale elements of");
b.add_output<decl::Geometry>("Geometry").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_input<decl::Float>("Scale", "Scale").default_value(1.0f).min(0.0f).field_on_all();

View File

@@ -17,7 +17,9 @@ static void node_declare(NodeDeclarationBuilder &b)
{
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Instances").only_instances();
b.add_input<decl::Geometry>("Instances")
.only_instances()
.description("Instances to scale individually");
b.add_output<decl::Geometry>("Instances").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_input<decl::Vector>("Scale").subtype(PROP_XYZ).default_value({1, 1, 1}).field_on_all();

View File

@@ -8,7 +8,8 @@ namespace blender::nodes::node_geo_separate_components_cc {
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Geometry");
b.add_input<decl::Geometry>("Geometry")
.description("Geometry to split into separate components");
b.add_output<decl::Geometry>("Mesh").propagate_all();
b.add_output<decl::Geometry>("Curve").propagate_all();
b.add_output<decl::Geometry>("Grease Pencil").propagate_all();

View File

@@ -19,7 +19,7 @@ NODE_STORAGE_FUNCS(NodeGeometrySeparateGeometry)
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Geometry");
b.add_input<decl::Geometry>("Geometry").description("Geometry to split into two parts");
b.add_input<decl::Bool>("Selection")
.default_value(true)
.hide_value()

View File

@@ -29,7 +29,9 @@ static void node_declare(NodeDeclarationBuilder &b)
const bNode *node = b.node_or_null();
b.add_input<decl::Geometry>("Curve").supported_type(GeometryComponent::Type::Curve);
b.add_input<decl::Geometry>("Curve")
.supported_type(GeometryComponent::Type::Curve)
.description("Curves to change the handles on");
b.add_output<decl::Geometry>("Curve").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
auto &position = b.add_input<decl::Vector>("Position");

View File

@@ -21,8 +21,9 @@ static void node_declare(NodeDeclarationBuilder &b)
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_default_layout();
b.add_input<decl::Geometry>("Curve").supported_type(
{GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil});
b.add_input<decl::Geometry>("Curve")
.supported_type({GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil})
.description("Curves to change the normals on");
b.add_output<decl::Geometry>("Curve").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
auto &normal = b.add_input<decl::Vector>("Normal")

View File

@@ -13,8 +13,9 @@ static void node_declare(NodeDeclarationBuilder &b)
{
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Curve").supported_type(
{GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil});
b.add_input<decl::Geometry>("Curve")
.supported_type({GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil})
.description("Curves to set the radius on");
b.add_output<decl::Geometry>("Curve").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_input<decl::Float>("Radius")

View File

@@ -13,8 +13,9 @@ static void node_declare(NodeDeclarationBuilder &b)
{
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Curve").supported_type(
{GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil});
b.add_input<decl::Geometry>("Curve")
.supported_type({GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil})
.description("Curves to set tilt on");
b.add_output<decl::Geometry>("Curve").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_input<decl::Float>("Tilt").subtype(PROP_ANGLE).field_on_all();

View File

@@ -10,7 +10,7 @@ static void node_declare(NodeDeclarationBuilder &b)
{
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Geometry");
b.add_input<decl::Geometry>("Geometry").description("Geometry to override the name of");
b.add_output<decl::Geometry>("Geometry").propagate_all().align_with_previous();
b.add_input<decl::String>("Name").hide_label();
}

View File

@@ -28,7 +28,8 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_default_layout();
b.add_input<decl::Geometry>("Grease Pencil")
.supported_type(GeometryComponent::Type::GreasePencil)
.align_with_previous();
.align_with_previous()
.description("Grease Pencil to change the color of");
b.add_output<decl::Geometry>("Grease Pencil").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_input<decl::Color>("Color")

View File

@@ -21,7 +21,8 @@ static void node_declare(NodeDeclarationBuilder &b)
b.allow_any_socket_order();
b.add_default_layout();
b.add_input<decl::Geometry>("Grease Pencil")
.supported_type(GeometryComponent::Type::GreasePencil);
.supported_type(GeometryComponent::Type::GreasePencil)
.description("Great Pencil to set the depth order of");
b.add_output<decl::Geometry>("Grease Pencil").propagate_all().align_with_previous();
}

View File

@@ -15,7 +15,8 @@ static void node_declare(NodeDeclarationBuilder &b)
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Grease Pencil")
.supported_type(GeometryComponent::Type::GreasePencil)
.align_with_previous();
.align_with_previous()
.description("Grease Pencil to set the softness of");
b.add_output<decl::Geometry>("Grease Pencil").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_input<decl::Float>("Softness").default_value(0.0f).min(0.0f).max(1.0f).field_on_all();

View File

@@ -10,7 +10,7 @@ static void node_declare(NodeDeclarationBuilder &b)
{
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Geometry");
b.add_input<decl::Geometry>("Geometry").description("Geometry to update the ID attribute on");
b.add_output<decl::Geometry>("Geometry").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_input<decl::Int>("ID").implicit_field_on_all(NODE_DEFAULT_INPUT_INDEX_FIELD);

View File

@@ -10,7 +10,9 @@ static void node_declare(NodeDeclarationBuilder &b)
{
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Instances").only_instances();
b.add_input<decl::Geometry>("Instances")
.only_instances()
.description("Instances to transform individually");
b.add_output<decl::Geometry>("Instances").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_input<decl::Matrix>("Transform")

View File

@@ -25,7 +25,10 @@ static void node_declare(NodeDeclarationBuilder &b)
GeometryComponent::Type::PointCloud,
GeometryComponent::Type::Curve,
GeometryComponent::Type::GreasePencil});
b.add_output<decl::Geometry>("Geometry").propagate_all().align_with_previous();
b.add_output<decl::Geometry>("Geometry")
.propagate_all()
.align_with_previous()
.description("Geometry to assign a material to");
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_input<decl::Material>("Material").hide_label();
}

View File

@@ -17,7 +17,8 @@ static void node_declare(NodeDeclarationBuilder &b)
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Geometry")
.supported_type({GeometryComponent::Type::Mesh, GeometryComponent::Type::GreasePencil});
.supported_type({GeometryComponent::Type::Mesh, GeometryComponent::Type::GreasePencil})
.description("Geometry to update the material indices on");
b.add_output<decl::Geometry>("Geometry").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_input<decl::Int>("Material Index").min(0).field_on_all();

View File

@@ -26,7 +26,9 @@ static void node_declare(NodeDeclarationBuilder &b)
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_default_layout();
b.add_input<decl::Geometry>("Mesh").supported_type(GeometryComponent::Type::Mesh);
b.add_input<decl::Geometry>("Mesh")
.supported_type(GeometryComponent::Type::Mesh)
.description("Mesh to set the custom normals on");
b.add_output<decl::Geometry>("Mesh").propagate_all().align_with_previous();
if (const bNode *node = b.node_or_null()) {
switch (Mode(node->custom1)) {

View File

@@ -12,7 +12,9 @@ static void node_declare(NodeDeclarationBuilder &b)
{
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Points").supported_type(GeometryComponent::Type::PointCloud);
b.add_input<decl::Geometry>("Points")
.supported_type(GeometryComponent::Type::PointCloud)
.description("Points to set the radius of");
b.add_output<decl::Geometry>("Points").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_input<decl::Float>("Radius")

View File

@@ -19,7 +19,7 @@ static void node_declare(NodeDeclarationBuilder &b)
{
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Geometry");
b.add_input<decl::Geometry>("Geometry").description("Points to modify the positions of");
b.add_output<decl::Geometry>("Geometry").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_input<decl::Vector>("Position").implicit_field_on_all(NODE_DEFAULT_INPUT_POSITION_FIELD);

View File

@@ -20,7 +20,9 @@ static void node_declare(NodeDeclarationBuilder &b)
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_default_layout();
b.add_input<decl::Geometry>("Geometry").supported_type(GeometryComponent::Type::Mesh);
b.add_input<decl::Geometry>("Geometry")
.supported_type(GeometryComponent::Type::Mesh)
.description("Description to set the smoothness of");
b.add_output<decl::Geometry>("Geometry").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_input<decl::Bool>("Shade Smooth").default_value(true).field_on_all();

View File

@@ -14,7 +14,8 @@ static void node_declare(NodeDeclarationBuilder &b)
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Geometry")
.supported_type({GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil});
.supported_type({GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil})
.description("Curves to change the cyclic state of");
b.add_output<decl::Geometry>("Geometry").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_input<decl::Bool>("Cyclic").field_on_all();

View File

@@ -14,7 +14,8 @@ static void node_declare(NodeDeclarationBuilder &b)
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Geometry")
.supported_type({GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil});
.supported_type({GeometryComponent::Type::Curve, GeometryComponent::Type::GreasePencil})
.description("Curves to change the resolution of");
b.add_output<decl::Geometry>("Geometry").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_input<decl::Int>("Resolution").min(1).default_value(12).field_on_all();

View File

@@ -30,7 +30,7 @@ static void node_declare(NodeDeclarationBuilder &b)
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_default_layout();
b.add_input<decl::Geometry>("Geometry");
b.add_input<decl::Geometry>("Geometry").description("Geometry to sort the elements of");
b.add_output<decl::Geometry>("Geometry").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).field_on_all().hide_value();
b.add_input<decl::Int>("Group ID").field_on_all().hide_value();

View File

@@ -28,7 +28,8 @@ static void node_declare(NodeDeclarationBuilder &b)
.supported_type({GeometryComponent::Type::Mesh,
GeometryComponent::Type::PointCloud,
GeometryComponent::Type::Curve,
GeometryComponent::Type::Instance});
GeometryComponent::Type::Instance})
.description("Geometry to split into instances");
b.add_input<decl::Bool>("Selection").default_value(true).field_on_all().hide_value();
b.add_input<decl::Int>("Group ID").field_on_all().hide_value();
b.add_output<decl::Geometry>("Instances")

View File

@@ -33,7 +33,8 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_default_layout();
const bNode *node = b.node_or_null();
b.add_input<decl::Geometry>("Geometry");
b.add_input<decl::Geometry>("Geometry")
.description("Geometry to store a new attribute with the given name on");
b.add_output<decl::Geometry>("Geometry").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_input<decl::String>("Name").is_attribute_name().hide_label();

View File

@@ -23,7 +23,7 @@ static void node_declare(NodeDeclarationBuilder &b)
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_default_layout();
b.add_input<decl::Geometry>("Volume");
b.add_input<decl::Geometry>("Volume").description("Volume geometry to add a grid to");
b.add_output<decl::Geometry>("Volume").align_with_previous();
b.add_input<decl::String>("Name").hide_label();

View File

@@ -32,7 +32,9 @@ static void node_declare(NodeDeclarationBuilder &b)
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_default_layout();
b.add_input<decl::Geometry>("Mesh").supported_type(GeometryComponent::Type::Mesh);
b.add_input<decl::Geometry>("Mesh")
.supported_type(GeometryComponent::Type::Mesh)
.description("Mesh to subdivide");
b.add_output<decl::Geometry>("Mesh").propagate_all().align_with_previous();
b.add_input<decl::Int>("Level").default_value(1).min(0).max(6);
b.add_input<decl::Float>("Edge Crease")

View File

@@ -13,7 +13,8 @@ static void node_declare(NodeDeclarationBuilder &b)
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Mesh");
b.add_output<decl::Geometry>("Mesh").align_with_previous();
b.add_output<decl::Geometry>("Mesh").align_with_previous().description(
"Mesh to override the face set attribute on");
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_input<decl::Int>("Face Set").hide_value().field_on_all();
}

View File

@@ -29,7 +29,7 @@ static void node_declare(NodeDeclarationBuilder &b)
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_default_layout();
b.add_input<decl::Geometry>("Geometry");
b.add_input<decl::Geometry>("Geometry").description("Geometry to update the selection of");
b.add_output<decl::Geometry>("Geometry").align_with_previous();
if (const bNode *node = b.node_or_null()) {
switch (SelectionType(node->custom2)) {

View File

@@ -29,7 +29,9 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_input<decl::Menu>("Mode")
.static_items(mode_items)
.description("How the transformation is specified");
b.add_input<decl::Geometry>("Geometry").is_default_link_socket();
b.add_input<decl::Geometry>("Geometry")
.is_default_link_socket()
.description("Geometry to transform");
b.add_output<decl::Geometry>("Geometry").propagate_all().align_with_previous();
b.add_input<decl::Vector>("Translation")
.subtype(PROP_TRANSLATION)

View File

@@ -16,7 +16,9 @@ static void node_declare(NodeDeclarationBuilder &b)
{
b.use_custom_socket_order();
b.allow_any_socket_order();
b.add_input<decl::Geometry>("Instances").only_instances();
b.add_input<decl::Geometry>("Instances")
.only_instances()
.description("Instances to translate individually");
b.add_output<decl::Geometry>("Instances").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_input<decl::Vector>("Translation").subtype(PROP_TRANSLATION).field_on_all();

View File

@@ -70,7 +70,8 @@ static void node_declare(NodeDeclarationBuilder &b)
.description("Method for splitting the n-gons into triangles");
b.add_input<decl::Geometry>("Mesh")
.supported_type(GeometryComponent::Type::Mesh)
.is_default_link_socket();
.is_default_link_socket()
.description("Mesh to triangulate");
b.add_output<decl::Geometry>("Mesh").propagate_all().align_with_previous();
b.add_input<decl::Bool>("Selection").default_value(true).field_on_all().hide_value();
}

View File

@@ -44,7 +44,8 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_input<decl::Geometry>("Volume")
.supported_type(GeometryComponent::Type::Volume)
.translation_context(BLT_I18NCONTEXT_ID_ID)
.is_default_link_socket();
.is_default_link_socket()
.description("Volume to convert to a mesh");
b.add_input<decl::Float>("Voxel Size")
.default_value(0.3f)
.min(0.01f)