Nodes: Panel declarations for grouping sockets #108649

Merged
Lukas Tönne merged 27 commits from LukasTonne/blender:node-socket-categories into main 2023-06-14 18:02:46 +02:00
8 changed files with 42 additions and 85 deletions
Showing only changes of commit 661be297f0 - Show all commits

View File

@ -115,7 +115,6 @@ set(SRC_DNA_DEFAULTS_INC
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_meta_defaults.h
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_modifier_defaults.h
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_movieclip_defaults.h
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_node_defaults.h
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_object_defaults.h
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_particle_defaults.h
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_pointcloud_defaults.h

View File

@ -677,6 +677,7 @@ static void direct_link_node_socket(BlendDataReader *reader, bNodeSocket *sock)
BLO_read_data_address(reader, &sock->storage);
BLO_read_data_address(reader, &sock->default_value);
BLO_read_data_address(reader, &sock->default_attribute_name);
BLO_read_data_address(reader, &sock->panel);
sock->runtime = MEM_new<bNodeSocketRuntime>(__func__);
}
@ -3651,16 +3652,21 @@ static bNodeSocket *make_socket_interface(bNodeTree *ntree,
STRNCPY(sock->name, name);
sock->storage = nullptr;
sock->flag |= SOCK_COLLAPSED;
sock->panel_id = -1;
return sock;
}
static int node_socket_panel_cmp(const void *a, const void *b)
using PanelIndexMap = blender::Map<const bNodeSocketPanel *, int>;
static int node_socket_panel_cmp(void *panel_index_map_v, const void *a, const void *b)
{
const PanelIndexMap &panel_index_map = *static_cast<const PanelIndexMap *>(panel_index_map_v);
const bNodeSocket *sock_a = static_cast<const bNodeSocket *>(a);
const bNodeSocket *sock_b = static_cast<const bNodeSocket *>(b);
return (sock_a->panel_id > sock_b->panel_id) ? 1 : 0;
return panel_index_map.lookup_default(sock_a->panel, -1) >
panel_index_map.lookup_default(sock_b->panel, -1) ?
1 :
0;
}
bNodeSocket *ntreeFindSocketInterface(bNodeTree *ntree,
@ -3680,30 +3686,14 @@ bNodeSocket *ntreeFindSocketInterface(bNodeTree *ntree,
void ntreeEnsureSocketInterfacePanelOrder(bNodeTree *ntree)
{
/* XXX Hack: store panel index in panel_id temporarily for sorting. */
LISTBASE_FOREACH (bNodeSocket *, iosock, &ntree->inputs) {
const bNodeSocketPanel *panel = ntreeFindSocketPanelByID(ntree, iosock->panel_id);
iosock->panel_id = ntreeGetSocketPanelIndex(ntree, panel);
}
LISTBASE_FOREACH (bNodeSocket *, iosock, &ntree->outputs) {
const bNodeSocketPanel *panel = ntreeFindSocketPanelByID(ntree, iosock->panel_id);
iosock->panel_id = ntreeGetSocketPanelIndex(ntree, panel);
}
BLI_listbase_sort(&ntree->inputs, blender::bke::node_socket_panel_cmp);
BLI_listbase_sort(&ntree->outputs, blender::bke::node_socket_panel_cmp);
/* Restore panel_id. */
LISTBASE_FOREACH (bNodeSocket *, iosock, &ntree->inputs) {
if (iosock->panel_id >= 0) {
const bNodeSocketPanel *panel = ntree->socket_panels()[iosock->panel_id];
iosock->panel_id = panel->identifier;
}
}
LISTBASE_FOREACH (bNodeSocket *, iosock, &ntree->outputs) {
if (iosock->panel_id >= 0) {
const bNodeSocketPanel *panel = ntree->socket_panels()[iosock->panel_id];
iosock->panel_id = panel->identifier;
}
/* Store panel index for sorting. */
blender::Map<const bNodeSocketPanel *, int> panel_index_map;
int index = 0;
for (const bNodeSocketPanel *panel : ntree->socket_panels()) {
panel_index_map.add_new(panel, index++);
}
BLI_listbase_sort_r(&ntree->inputs, blender::bke::node_socket_panel_cmp, &panel_index_map);
BLI_listbase_sort_r(&ntree->outputs, blender::bke::node_socket_panel_cmp, &panel_index_map);
}
bNodeSocket *ntreeAddSocketInterface(bNodeTree *ntree,
@ -3727,15 +3717,11 @@ bNodeSocket *ntreeAddSocketInterface(bNodeTree *ntree,
void ntreeSetSocketInterfacePanel(bNodeTree *ntree, bNodeSocket *socket, bNodeSocketPanel *panel)
{
if (panel == NULL) {
socket->panel_id = -1;
return;
}
BLI_assert(panel == nullptr || ntreeContainsSocketPanel(ntree, panel));
socket->panel_id = panel->identifier;
socket->panel = panel;
ntreeEnsureSocketInterfacePanelOrder(ntree);
BKE_ntree_update_tag_interface(ntree);
}
@ -3896,6 +3882,18 @@ void ntreeRemoveSocketPanel(bNodeTree *ntree, bNodeSocketPanel *panel)
return;
}
/* Remove references */
LISTBASE_FOREACH (bNodeSocket *, iosock, &ntree->inputs) {
if (iosock->panel == panel) {
iosock->panel = nullptr;
}
}
LISTBASE_FOREACH (bNodeSocket *, iosock, &ntree->outputs) {
if (iosock->panel == panel) {
iosock->panel = nullptr;
}
}
bNodeSocketPanel **old_panels_array = ntree->socket_panels_array;
const Span<bNodeSocketPanel *> old_panels = ntree->socket_panels();
ntree->socket_panels_array = MEM_cnew_array<bNodeSocketPanel *>(ntree->socket_panels_num - 1,
@ -3917,6 +3915,14 @@ void ntreeRemoveSocketPanel(bNodeTree *ntree, bNodeSocketPanel *panel)
void ntreeClearSocketPanels(bNodeTree *ntree)
{
/* Remove references */
LISTBASE_FOREACH (bNodeSocket *, iosock, &ntree->inputs) {
iosock->panel = nullptr;
}
LISTBASE_FOREACH (bNodeSocket *, iosock, &ntree->outputs) {
iosock->panel = nullptr;
}
for (bNodeSocketPanel *panel : ntree->socket_panels_for_write()) {
MEM_SAFE_FREE(panel->name);
MEM_SAFE_FREE(panel);

View File

@ -212,18 +212,6 @@ void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain)
}
FOREACH_NODETREE_END;
if (!DNA_struct_elem_find(fd->filesdna, "bNodeSocket", "int", "panel_id")) {
FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
LISTBASE_FOREACH (bNodeSocket *, socket, &ntree->inputs) {
socket->panel_id = -1;
}
LISTBASE_FOREACH (bNodeSocket *, socket, &ntree->outputs) {
socket->panel_id = -1;
}
}
FOREACH_NODETREE_END;
}
/* Keep this block, even when empty. */
}
}

View File

@ -2199,7 +2199,7 @@ static int ntree_socket_add_exec(bContext *C, wmOperator *op)
/* XXX this only works for actual sockets, not interface templates! */
// nodeSocketCopyValue(sock, &ntree_ptr, active_sock, &ntree_ptr);
/* Inherit socket panel from the active socket interface. */
sock->panel_id = active_sock->panel_id;
sock->panel = active_sock->panel;
}
else {
/* XXX TODO: define default socket type for a tree! */

View File

@ -1,23 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup DNA
*/
#pragma once
/* Struct members on own line. */
/* clang-format off */
/* -------------------------------------------------------------------- */
/** \name bArmature Struct
* \{ */
#define _DNA_DEFAULT_bNodeSocket \
{ \
.panel_id = -1, \
}
/** \} */
/* clang-format on */

View File

@ -168,9 +168,8 @@ typedef struct bNodeSocket {
/** Custom data for inputs, only UI writes in this. */
bNodeStack ns DNA_DEPRECATED;
/* ID of the UI panel of the socket. */
int panel_id;
int _pad2;
/* UI panel of the socket. */
struct bNodeSocketPanel *panel;
bNodeSocketRuntimeHandle *runtime;

View File

@ -126,7 +126,6 @@
#include "DNA_meta_defaults.h"
#include "DNA_modifier_defaults.h"
#include "DNA_movieclip_defaults.h"
#include "DNA_node_defaults.h"
#include "DNA_object_defaults.h"
#include "DNA_particle_defaults.h"
#include "DNA_pointcloud_defaults.h"

View File

@ -3169,17 +3169,6 @@ static IDProperty **rna_NodeSocketInterface_idprops(PointerRNA *ptr)
return &sock->prop;
}
static PointerRNA rna_NodeSocketInterface_panel_get(PointerRNA *ptr)
{
bNodeSocket *socket = (bNodeSocket *)ptr->data;
bNodeTree *ntree = (bNodeTree *)ptr->owner_id;
bNodeSocketPanel *panel = ntreeFindSocketPanelByID(ntree, socket->panel_id);
PointerRNA r_ptr;
RNA_pointer_create(&ntree->id, &RNA_NodeSocketPanel, panel, &r_ptr);
return r_ptr;
}
static void rna_NodeSocketInterface_panel_set(PointerRNA *ptr,
PointerRNA value,
struct ReportList *reports)
@ -11742,7 +11731,7 @@ static void rna_def_node_socket_interface(BlenderRNA *brna)
prop = RNA_def_property(srna, "panel", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_funcs(prop,
"rna_NodeSocketInterface_panel_get",
NULL,
"rna_NodeSocketInterface_panel_set",
NULL,
"rna_NodeSocketInterface_panel_poll");