Cleanup: Refactor Switch View node to use dynamic declarations
See [#108728](https://projects.blender.org/blender/blender/issues/108728). Use new API (`declare_dynamic`) for the node, avoid modifying sockets directly. Pull Request: https://projects.blender.org/blender/blender/pulls/110042
This commit is contained in:
parent
8d8f03be9c
commit
5dd9e57878
|
@ -20,113 +20,33 @@
|
||||||
|
|
||||||
namespace blender::nodes::node_composite_switchview_cc {
|
namespace blender::nodes::node_composite_switchview_cc {
|
||||||
|
|
||||||
static bNodeSocketTemplate cmp_node_switch_view_out[] = {
|
static void node_declare_dynamic(const bNodeTree & /*ntree*/,
|
||||||
{SOCK_RGBA, N_("Image"), 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
|
const bNode &node,
|
||||||
{-1, ""},
|
NodeDeclaration &r_declaration)
|
||||||
};
|
|
||||||
|
|
||||||
static bNodeSocket *ntreeCompositSwitchViewAddSocket(bNodeTree *ntree,
|
|
||||||
bNode *node,
|
|
||||||
const char *name)
|
|
||||||
{
|
{
|
||||||
bNodeSocket *sock = nodeAddStaticSocket(
|
Scene *scene = reinterpret_cast<Scene *>(node.id);
|
||||||
ntree, node, SOCK_IN, SOCK_RGBA, PROP_NONE, nullptr, name);
|
NodeDeclarationBuilder builder(r_declaration);
|
||||||
return sock;
|
builder.add_output<decl::Color>(N_("Image"));
|
||||||
}
|
|
||||||
|
|
||||||
static void cmp_node_switch_view_sanitycheck(bNodeTree *ntree, bNode *node)
|
if (scene != nullptr) {
|
||||||
{
|
/* add the new views */
|
||||||
if (!BLI_listbase_is_empty(&node->inputs)) {
|
LISTBASE_FOREACH (SceneRenderView *, srv, &scene->r.views) {
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
bNodeSocket *sock = ntreeCompositSwitchViewAddSocket(ntree, node, "No View");
|
|
||||||
sock->flag |= SOCK_HIDDEN;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void cmp_node_switch_view_update(bNodeTree *ntree, bNode *node)
|
|
||||||
{
|
|
||||||
Scene *scene = (Scene *)node->id;
|
|
||||||
|
|
||||||
/* only update when called from the operator button */
|
|
||||||
if (node->runtime->update != NODE_UPDATE_OPERATOR) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (scene == nullptr) {
|
|
||||||
blender::bke::nodeRemoveAllSockets(ntree, node);
|
|
||||||
/* make sure there is always one socket */
|
|
||||||
cmp_node_switch_view_sanitycheck(ntree, node);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* remove the views that were removed */
|
|
||||||
bNodeSocket *sock = (bNodeSocket *)node->inputs.last;
|
|
||||||
while (sock) {
|
|
||||||
SceneRenderView *srv = (SceneRenderView *)BLI_findstring(
|
|
||||||
&scene->r.views, sock->name, offsetof(SceneRenderView, name));
|
|
||||||
|
|
||||||
if (srv == nullptr) {
|
|
||||||
bNodeSocket *sock_del = sock;
|
|
||||||
sock = sock->prev;
|
|
||||||
nodeRemoveSocket(ntree, node, sock_del);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (srv->viewflag & SCE_VIEW_DISABLE) {
|
if (srv->viewflag & SCE_VIEW_DISABLE) {
|
||||||
sock->flag |= SOCK_HIDDEN;
|
continue;
|
||||||
}
|
}
|
||||||
else {
|
builder.add_input<decl::Color>(N_(srv->name)).default_value({0.0f, 0.0f, 0.0f, 1.0f});
|
||||||
sock->flag &= ~SOCK_HIDDEN;
|
|
||||||
}
|
|
||||||
|
|
||||||
sock = sock->prev;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* add the new views */
|
|
||||||
LISTBASE_FOREACH (SceneRenderView *, srv, &scene->r.views) {
|
|
||||||
sock = (bNodeSocket *)BLI_findstring(&node->inputs, srv->name, offsetof(bNodeSocket, name));
|
|
||||||
|
|
||||||
if (sock == nullptr) {
|
|
||||||
sock = ntreeCompositSwitchViewAddSocket(ntree, node, srv->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (srv->viewflag & SCE_VIEW_DISABLE) {
|
|
||||||
sock->flag |= SOCK_HIDDEN;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
sock->flag &= ~SOCK_HIDDEN;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* make sure there is always one socket */
|
|
||||||
cmp_node_switch_view_sanitycheck(ntree, node);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void init_switch_view(const bContext *C, PointerRNA *ptr)
|
static void init_switch_view(const bContext *C, PointerRNA *ptr)
|
||||||
{
|
{
|
||||||
Scene *scene = CTX_data_scene(C);
|
Scene *scene = CTX_data_scene(C);
|
||||||
bNodeTree *ntree = (bNodeTree *)ptr->owner_id;
|
|
||||||
bNode *node = (bNode *)ptr->data;
|
bNode *node = (bNode *)ptr->data;
|
||||||
|
|
||||||
/* store scene for updates */
|
/* store scene for dynamic declaration */
|
||||||
node->id = (ID *)scene;
|
node->id = (ID *)scene;
|
||||||
id_us_plus(node->id);
|
id_us_plus(node->id);
|
||||||
|
|
||||||
if (scene) {
|
|
||||||
RenderData *rd = &scene->r;
|
|
||||||
|
|
||||||
LISTBASE_FOREACH (SceneRenderView *, srv, &rd->views) {
|
|
||||||
bNodeSocket *sock = ntreeCompositSwitchViewAddSocket(ntree, node, srv->name);
|
|
||||||
|
|
||||||
if (srv->viewflag & SCE_VIEW_DISABLE) {
|
|
||||||
sock->flag |= SOCK_HIDDEN;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* make sure there is always one socket */
|
|
||||||
cmp_node_switch_view_sanitycheck(ntree, node);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void node_composit_buts_switch_view_ex(uiLayout *layout,
|
static void node_composit_buts_switch_view_ex(uiLayout *layout,
|
||||||
|
@ -179,10 +99,9 @@ void register_node_type_cmp_switch_view()
|
||||||
static bNodeType ntype;
|
static bNodeType ntype;
|
||||||
|
|
||||||
cmp_node_type_base(&ntype, CMP_NODE_SWITCH_VIEW, "Switch View", NODE_CLASS_CONVERTER);
|
cmp_node_type_base(&ntype, CMP_NODE_SWITCH_VIEW, "Switch View", NODE_CLASS_CONVERTER);
|
||||||
blender::bke::node_type_socket_templates(&ntype, nullptr, file_ns::cmp_node_switch_view_out);
|
ntype.declare_dynamic = file_ns::node_declare_dynamic;
|
||||||
ntype.draw_buttons_ex = file_ns::node_composit_buts_switch_view_ex;
|
ntype.draw_buttons_ex = file_ns::node_composit_buts_switch_view_ex;
|
||||||
ntype.initfunc_api = file_ns::init_switch_view;
|
ntype.initfunc_api = file_ns::init_switch_view;
|
||||||
ntype.updatefunc = file_ns::cmp_node_switch_view_update;
|
|
||||||
ntype.get_compositor_operation = file_ns::get_compositor_operation;
|
ntype.get_compositor_operation = file_ns::get_compositor_operation;
|
||||||
|
|
||||||
nodeRegisterType(&ntype);
|
nodeRegisterType(&ntype);
|
||||||
|
|
Loading…
Reference in New Issue