Geometry Nodes: Show supported geometry types tooltip without computing

Socket declarations exist all the time and it would be useful to use
them for tooltips at all times, not just when there is a computed log.

Differential Revision: https://developer.blender.org/D16846
This commit is contained in:
Iliya Katueshenock 2023-01-17 19:25:26 -06:00 committed by Hans Goudey
parent bdb34c9804
commit d45ad0acd3
1 changed files with 31 additions and 19 deletions

View File

@ -900,8 +900,7 @@ static void create_inspection_string_for_field_info(const bNodeSocket &socket,
}
static void create_inspection_string_for_geometry_info(const geo_log::GeometryInfoLog &value_log,
std::stringstream &ss,
const nodes::decl::Geometry *socket_decl)
std::stringstream &ss)
{
Span<GeometryComponentType> component_types = value_log.component_types;
if (component_types.is_empty()) {
@ -917,7 +916,6 @@ static void create_inspection_string_for_geometry_info(const geo_log::GeometryIn
ss << TIP_("Geometry:\n");
for (GeometryComponentType type : component_types) {
const char *line_end = (type == component_types.last()) ? "" : ".\n";
switch (type) {
case GEO_COMPONENT_TYPE_MESH: {
const geo_log::GeometryInfoLog::MeshInfo &mesh_info = *value_log.mesh_info;
@ -928,7 +926,7 @@ static void create_inspection_string_for_geometry_info(const geo_log::GeometryIn
to_string(mesh_info.verts_num).c_str(),
to_string(mesh_info.edges_num).c_str(),
to_string(mesh_info.faces_num).c_str());
ss << line << line_end;
ss << line;
break;
}
case GEO_COMPONENT_TYPE_POINT_CLOUD: {
@ -939,7 +937,7 @@ static void create_inspection_string_for_geometry_info(const geo_log::GeometryIn
sizeof(line),
TIP_("\u2022 Point Cloud: %s points"),
to_string(pointcloud_info.points_num).c_str());
ss << line << line_end;
ss << line;
break;
}
case GEO_COMPONENT_TYPE_CURVE: {
@ -949,7 +947,7 @@ static void create_inspection_string_for_geometry_info(const geo_log::GeometryIn
sizeof(line),
TIP_("\u2022 Curve: %s splines"),
to_string(curve_info.splines_num).c_str());
ss << line << line_end;
ss << line;
break;
}
case GEO_COMPONENT_TYPE_INSTANCES: {
@ -959,11 +957,11 @@ static void create_inspection_string_for_geometry_info(const geo_log::GeometryIn
sizeof(line),
TIP_("\u2022 Instances: %s"),
to_string(instances_info.instances_num).c_str());
ss << line << line_end;
ss << line;
break;
}
case GEO_COMPONENT_TYPE_VOLUME: {
ss << TIP_("\u2022 Volume") << line_end;
ss << TIP_("\u2022 Volume");
break;
}
case GEO_COMPONENT_TYPE_EDIT: {
@ -975,26 +973,38 @@ static void create_inspection_string_for_geometry_info(const geo_log::GeometryIn
TIP_("\u2022 Edit Curves: %s, %s"),
edit_info.has_deformed_positions ? TIP_("positions") : TIP_("no positions"),
edit_info.has_deform_matrices ? TIP_("matrices") : TIP_("no matrices"));
ss << line << line_end;
ss << line;
}
break;
}
}
if (type != component_types.last()) {
ss << ".\n";
}
}
}
static void create_inspection_string_for_geometry_socket(std::stringstream &ss,
const nodes::decl::Geometry *socket_decl,
const bool after_log)
{
/* If the geometry declaration is null, as is the case for input to group output,
* or it is an output socket don't show supported types. */
if (socket_decl == nullptr || socket_decl->in_out == SOCK_OUT) {
return;
}
if (after_log) {
ss << ".\n\n";
}
Span<GeometryComponentType> supported_types = socket_decl->supported_types();
if (supported_types.is_empty()) {
ss << ".\n\n" << TIP_("Supported: All Types");
ss << TIP_("Supported: All Types");
return;
}
ss << ".\n\n" << TIP_("Supported: ");
ss << TIP_("Supported: ");
for (GeometryComponentType type : supported_types) {
switch (type) {
case GEO_COMPONENT_TYPE_MESH: {
@ -1021,7 +1031,9 @@ static void create_inspection_string_for_geometry_info(const geo_log::GeometryIn
break;
}
}
ss << ((type == supported_types.last()) ? "" : ", ");
if (type != supported_types.last()) {
ss << ", ";
}
}
}
@ -1036,9 +1048,6 @@ static std::optional<std::string> create_socket_inspection_string(TreeDrawContex
tree_draw_ctx.geo_tree_log->ensure_socket_values();
ValueLog *value_log = tree_draw_ctx.geo_tree_log->find_socket_value_log(socket);
if (value_log == nullptr) {
return std::nullopt;
}
std::stringstream ss;
if (const geo_log::GenericValueLog *generic_value_log =
dynamic_cast<const geo_log::GenericValueLog *>(value_log)) {
@ -1050,10 +1059,13 @@ static std::optional<std::string> create_socket_inspection_string(TreeDrawContex
}
else if (const geo_log::GeometryInfoLog *geo_value_log =
dynamic_cast<const geo_log::GeometryInfoLog *>(value_log)) {
create_inspection_string_for_geometry_info(
*geo_value_log,
ss,
dynamic_cast<const nodes::decl::Geometry *>(socket.runtime->declaration));
create_inspection_string_for_geometry_info(*geo_value_log, ss);
}
if (const nodes::decl::Geometry *socket_decl = dynamic_cast<const nodes::decl::Geometry *>(
socket.runtime->declaration)) {
const bool after_log = value_log != nullptr;
create_inspection_string_for_geometry_socket(ss, socket_decl, after_log);
}
std::string str = ss.str();