Blender  V3.3
node_composite_switchview.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2006 Blender Foundation. All rights reserved. */
3 
8 #include "BKE_context.h"
9 #include "BKE_lib_id.h"
10 
11 #include "UI_interface.h"
12 #include "UI_resources.h"
13 
14 #include "node_composite_util.hh"
15 
16 /* **************** SWITCH VIEW ******************** */
17 
19 
21  {SOCK_RGBA, N_("Image"), 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
22  {-1, ""},
23 };
24 
26  bNode *node,
27  const char *name)
28 {
30  ntree, node, SOCK_IN, SOCK_RGBA, PROP_NONE, nullptr, name);
31  return sock;
32 }
33 
35 {
36  if (!BLI_listbase_is_empty(&node->inputs)) {
37  return;
38  }
39 
41  sock->flag |= SOCK_HIDDEN;
42 }
43 
45 {
46  Scene *scene = (Scene *)node->id;
47 
48  /* only update when called from the operator button */
49  if (node->update != NODE_UPDATE_OPERATOR) {
50  return;
51  }
52 
53  if (scene == nullptr) {
55  /* make sure there is always one socket */
57  return;
58  }
59 
60  /* remove the views that were removed */
61  bNodeSocket *sock = (bNodeSocket *)node->inputs.last;
62  while (sock) {
64  &scene->r.views, sock->name, offsetof(SceneRenderView, name));
65 
66  if (srv == nullptr) {
67  bNodeSocket *sock_del = sock;
68  sock = sock->prev;
69  nodeRemoveSocket(ntree, node, sock_del);
70  }
71  else {
72  if (srv->viewflag & SCE_VIEW_DISABLE) {
73  sock->flag |= SOCK_HIDDEN;
74  }
75  else {
76  sock->flag &= ~SOCK_HIDDEN;
77  }
78 
79  sock = sock->prev;
80  }
81  }
82 
83  /* add the new views */
85  sock = (bNodeSocket *)BLI_findstring(&node->inputs, srv->name, offsetof(bNodeSocket, name));
86 
87  if (sock == nullptr) {
88  sock = ntreeCompositSwitchViewAddSocket(ntree, node, srv->name);
89  }
90 
91  if (srv->viewflag & SCE_VIEW_DISABLE) {
92  sock->flag |= SOCK_HIDDEN;
93  }
94  else {
95  sock->flag &= ~SOCK_HIDDEN;
96  }
97  }
98 
99  /* make sure there is always one socket */
101 }
102 
103 static void init_switch_view(const bContext *C, PointerRNA *ptr)
104 {
107  bNode *node = (bNode *)ptr->data;
108 
109  /* store scene for updates */
110  node->id = (ID *)scene;
111  id_us_plus(node->id);
112 
113  if (scene) {
114  RenderData *rd = &scene->r;
115 
116  LISTBASE_FOREACH (SceneRenderView *, srv, &rd->views) {
118 
119  if (srv->viewflag & SCE_VIEW_DISABLE) {
120  sock->flag |= SOCK_HIDDEN;
121  }
122  }
123  }
124 
125  /* make sure there is always one socket */
127 }
128 
130  bContext *UNUSED(C),
132 {
133  uiItemFullO(layout,
134  "NODE_OT_switch_view_update",
135  "Update Views",
136  ICON_FILE_REFRESH,
137  nullptr,
139  0,
140  nullptr);
141 }
142 
143 } // namespace blender::nodes::node_composite_switchview_cc
144 
146 {
148 
149  static bNodeType ntype;
150 
156 
157  nodeRegisterType(&ntype);
158 }
struct Scene * CTX_data_scene(const bContext *C)
Definition: context.c:1090
void id_us_plus(struct ID *id)
Definition: lib_id.c:305
void node_type_socket_templates(struct bNodeType *ntype, struct bNodeSocketTemplate *inputs, struct bNodeSocketTemplate *outputs)
Definition: node.cc:4358
void node_type_update(struct bNodeType *ntype, void(*updatefunc)(struct bNodeTree *ntree, struct bNode *node))
Definition: node.cc:4443
#define NODE_CLASS_CONVERTER
Definition: BKE_node.h:351
void nodeRemoveAllSockets(struct bNodeTree *ntree, struct bNode *node)
Definition: node.cc:1967
struct bNodeSocket * nodeAddStaticSocket(struct bNodeTree *ntree, struct bNode *node, eNodeSocketInOut in_out, int type, int subtype, const char *identifier, const char *name)
Definition: node.cc:1897
#define CMP_NODE_SWITCH_VIEW
Definition: BKE_node.h:1288
void nodeRemoveSocket(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock)
Definition: node.cc:1933
void nodeRegisterType(struct bNodeType *ntype)
Definition: node.cc:1357
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
Definition: BLI_listbase.h:269
#define LISTBASE_FOREACH(type, var, list)
Definition: BLI_listbase.h:336
void * BLI_findstring(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define UNUSED(x)
#define NODE_UPDATE_OPERATOR
@ SOCK_IN
@ SOCK_HIDDEN
@ SOCK_RGBA
#define SCE_VIEW_DISABLE
@ PROP_NONE
Definition: RNA_types.h:126
#define C
Definition: RandGen.cpp:25
void uiItemFullO(uiLayout *layout, const char *opname, const char *name, int icon, struct IDProperty *properties, wmOperatorCallContext context, int flag, struct PointerRNA *r_opptr)
@ WM_OP_INVOKE_DEFAULT
Definition: WM_types.h:201
OperationNode * node
Scene scene
bNodeTree * ntree
static void node_composit_buts_switch_view_ex(uiLayout *layout, bContext *UNUSED(C), PointerRNA *UNUSED(ptr))
static void cmp_node_switch_view_update(bNodeTree *ntree, bNode *node)
static bNodeSocket * ntreeCompositSwitchViewAddSocket(bNodeTree *ntree, bNode *node, const char *name)
static void cmp_node_switch_view_sanitycheck(bNodeTree *ntree, bNode *node)
static void init_switch_view(const bContext *C, PointerRNA *ptr)
void register_node_type_cmp_switch_view()
void cmp_node_type_base(bNodeType *ntype, int type, const char *name, short nclass)
Definition: DNA_ID.h:368
void * data
Definition: RNA_types.h:38
struct ID * owner_id
Definition: RNA_types.h:36
ListBase views
struct RenderData r
Compact definition of a node socket.
Definition: BKE_node.h:84
char name[64]
struct bNodeSocket * prev
Defines a node type.
Definition: BKE_node.h:226
void(* initfunc_api)(const struct bContext *C, struct PointerRNA *ptr)
Definition: BKE_node.h:279
void(* draw_buttons_ex)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr)
Definition: BKE_node.h:246
#define N_(msgid)
PointerRNA * ptr
Definition: wm_files.c:3480