WIP: Geometry Nodes: new socket shape for unknown socket type category #113608

Draft
Jacques Lucke wants to merge 2 commits from JacquesLucke/blender:asterisk-socket-shape into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
7 changed files with 27 additions and 3 deletions

View File

@ -652,7 +652,7 @@ static void update_socket_shapes(const bNodeTree &tree,
const Span<SocketFieldState> field_state_by_socket_id)
{
const eNodeSocketDisplayShape requires_data_shape = SOCK_DISPLAY_SHAPE_CIRCLE;
const eNodeSocketDisplayShape data_but_can_be_field_shape = SOCK_DISPLAY_SHAPE_DIAMOND_DOT;
const eNodeSocketDisplayShape data_but_can_be_field_shape = SOCK_DISPLAY_SHAPE_ASTERISK;
const eNodeSocketDisplayShape is_field_shape = SOCK_DISPLAY_SHAPE_DIAMOND;
auto get_shape_for_state = [&](const SocketFieldState &state) {

View File

@ -1124,12 +1124,17 @@ static void node_socket_draw(const bNodeSocket &sock,
case SOCK_DISPLAY_SHAPE_CIRCLE_DOT:
flags = GPU_KEYFRAME_SHAPE_CIRCLE;
break;
case SOCK_DISPLAY_SHAPE_ASTERISK:
case SOCK_DISPLAY_SHAPE_ASTERISK_DOT:
flags = GPU_KEYFRAME_SHAPE_ASTERISK;
break;
}
if (ELEM(sock.display_shape,
SOCK_DISPLAY_SHAPE_DIAMOND_DOT,
SOCK_DISPLAY_SHAPE_SQUARE_DOT,
SOCK_DISPLAY_SHAPE_CIRCLE_DOT))
SOCK_DISPLAY_SHAPE_CIRCLE_DOT,
SOCK_DISPLAY_SHAPE_ASTERISK_DOT))
{
flags |= GPU_KEYFRAME_SHAPE_INNER_DOT;
}

View File

@ -30,6 +30,7 @@ enum eGPUKeyframeShapes {
GPU_KEYFRAME_SHAPE_ARROW_END_MIXED = (1u << 10u),
GPU_KEYFRAME_SHAPE_SQUARE = (GPU_KEYFRAME_SHAPE_CLIPPED_VERTICAL |
GPU_KEYFRAME_SHAPE_CLIPPED_HORIZONTAL),
GPU_KEYFRAME_SHAPE_ASTERISK = (1u << 11u),
};
struct NodeLinkData {

View File

@ -32,6 +32,20 @@ void main()
outline_dist = max(outline_dist, radius - radii[1]);
}
/* Asterisk outline */
if (test(GPU_KEYFRAME_SHAPE_ASTERISK)) {
float s1 = radii[1];
float s2 = s1 * 0.35;
float horizontal_bar_dist = max(absPos.x - s1, absPos.y - s2);
float angle = radians(-60);
float angle_cos = cos(angle);
float angle_sin = sin(angle);
float new_pos_x = abs(absPos.x * angle_cos - absPos.y * angle_sin);
float new_pos_y = abs(absPos.x * angle_sin + absPos.y * angle_cos);
float rotated_bar_dist = max(new_pos_x - s1, new_pos_y - s2);
outline_dist = min(horizontal_bar_dist, rotated_bar_dist);
}
/* Top & Bottom clamp */
if (test(GPU_KEYFRAME_SHAPE_CLIPPED_VERTICAL)) {
outline_dist = max(outline_dist, absPos.y - radii[2]);

View File

@ -34,7 +34,7 @@ void main()
finalOutlineColor = outlineColor;
finalFlags = flags;
if (!test(GPU_KEYFRAME_SHAPE_DIAMOND | GPU_KEYFRAME_SHAPE_CIRCLE |
if (!test(GPU_KEYFRAME_SHAPE_DIAMOND | GPU_KEYFRAME_SHAPE_CIRCLE | GPU_KEYFRAME_SHAPE_ASTERISK |
GPU_KEYFRAME_SHAPE_CLIPPED_VERTICAL | GPU_KEYFRAME_SHAPE_CLIPPED_HORIZONTAL))
{
finalFlags |= GPU_KEYFRAME_SHAPE_DIAMOND;

View File

@ -265,6 +265,8 @@ typedef enum eNodeSocketDisplayShape {
SOCK_DISPLAY_SHAPE_CIRCLE_DOT = 3,
SOCK_DISPLAY_SHAPE_SQUARE_DOT = 4,
SOCK_DISPLAY_SHAPE_DIAMOND_DOT = 5,
SOCK_DISPLAY_SHAPE_ASTERISK = 6,
SOCK_DISPLAY_SHAPE_ASTERISK_DOT = 7,
} eNodeSocketDisplayShape;
/** Socket side (input/output). */

View File

@ -427,6 +427,8 @@ static void rna_def_node_socket(BlenderRNA *brna)
{SOCK_DISPLAY_SHAPE_CIRCLE_DOT, "CIRCLE_DOT", 0, "Circle with inner dot", ""},
{SOCK_DISPLAY_SHAPE_SQUARE_DOT, "SQUARE_DOT", 0, "Square with inner dot", ""},
{SOCK_DISPLAY_SHAPE_DIAMOND_DOT, "DIAMOND_DOT", 0, "Diamond with inner dot", ""},
{SOCK_DISPLAY_SHAPE_ASTERISK, "ASTERISK", 0, "Asterisk", ""},
{SOCK_DISPLAY_SHAPE_ASTERISK_DOT, "ASTERISK_DOT", 0, "Asterisk with inner dot", ""},
{0, nullptr, 0, nullptr, nullptr}};
static float default_draw_color[] = {0.0f, 0.0f, 0.0f, 1.0f};