WIP: Geometry Nodes: new socket shape for unknown socket type category #113608
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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]);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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). */
|
||||
|
|
|
@ -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};
|
||||
|
|
Loading…
Reference in New Issue