Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2019-04-17 07:17:24 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-04-17 07:21:24 +0300
commite12c08e8d170b7ca40f204a5b0423c23a9fbc2c1 (patch)
tree8cf3453d12edb177a218ef8009357518ec6cab6a /source/blender/nodes/composite/nodes/node_composite_image.c
parentb3dabc200a4b0399ec6b81f2ff2730d07b44fcaa (diff)
ClangFormat: apply to source, most of intern
Apply clang format as proposed in T53211. For details on usage and instructions for migrating branches without conflicts, see: https://wiki.blender.org/wiki/Tools/ClangFormat
Diffstat (limited to 'source/blender/nodes/composite/nodes/node_composite_image.c')
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_image.c789
1 files changed, 450 insertions, 339 deletions
diff --git a/source/blender/nodes/composite/nodes/node_composite_image.c b/source/blender/nodes/composite/nodes/node_composite_image.c
index 37652daa312..d4278b3b540 100644
--- a/source/blender/nodes/composite/nodes/node_composite_image.c
+++ b/source/blender/nodes/composite/nodes/node_composite_image.c
@@ -38,429 +38,540 @@
/* **************** IMAGE (and RenderResult, multilayer image) ******************** */
static bNodeSocketTemplate cmp_node_rlayers_out[] = {
- { SOCK_RGBA, 0, N_("Image"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_FLOAT, 0, N_("Alpha"), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_FLOAT, 0, N_(RE_PASSNAME_Z), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 0, N_(RE_PASSNAME_NORMAL), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 0, N_(RE_PASSNAME_UV), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_VECTOR, 0, N_(RE_PASSNAME_VECTOR), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, N_(RE_PASSNAME_DEPRECATED), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, N_(RE_PASSNAME_DEPRECATED), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, N_(RE_PASSNAME_DEPRECATED), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, N_(RE_PASSNAME_SHADOW), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, N_(RE_PASSNAME_AO), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, N_(RE_PASSNAME_DEPRECATED), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, N_(RE_PASSNAME_DEPRECATED), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, N_(RE_PASSNAME_DEPRECATED), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_FLOAT, 0, N_(RE_PASSNAME_INDEXOB), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_FLOAT, 0, N_(RE_PASSNAME_INDEXMA), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_FLOAT, 0, N_(RE_PASSNAME_MIST), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, N_(RE_PASSNAME_EMIT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, N_(RE_PASSNAME_ENVIRONMENT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, N_(RE_PASSNAME_DIFFUSE_DIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, N_(RE_PASSNAME_DIFFUSE_INDIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, N_(RE_PASSNAME_DIFFUSE_COLOR), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, N_(RE_PASSNAME_GLOSSY_DIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, N_(RE_PASSNAME_GLOSSY_INDIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, N_(RE_PASSNAME_GLOSSY_COLOR), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, N_(RE_PASSNAME_TRANSM_DIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, N_(RE_PASSNAME_TRANSM_INDIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, N_(RE_PASSNAME_TRANSM_COLOR), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, N_(RE_PASSNAME_SUBSURFACE_DIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, N_(RE_PASSNAME_SUBSURFACE_INDIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { SOCK_RGBA, 0, N_(RE_PASSNAME_SUBSURFACE_COLOR), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
- { -1, 0, "" },
+ {SOCK_RGBA, 0, N_("Image"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_FLOAT, 0, N_("Alpha"), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_FLOAT, 0, N_(RE_PASSNAME_Z), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_VECTOR, 0, N_(RE_PASSNAME_NORMAL), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_VECTOR, 0, N_(RE_PASSNAME_UV), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_VECTOR, 0, N_(RE_PASSNAME_VECTOR), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_RGBA, 0, N_(RE_PASSNAME_DEPRECATED), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_RGBA, 0, N_(RE_PASSNAME_DEPRECATED), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_RGBA, 0, N_(RE_PASSNAME_DEPRECATED), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_RGBA, 0, N_(RE_PASSNAME_SHADOW), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_RGBA, 0, N_(RE_PASSNAME_AO), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_RGBA, 0, N_(RE_PASSNAME_DEPRECATED), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_RGBA, 0, N_(RE_PASSNAME_DEPRECATED), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_RGBA, 0, N_(RE_PASSNAME_DEPRECATED), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_FLOAT, 0, N_(RE_PASSNAME_INDEXOB), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_FLOAT, 0, N_(RE_PASSNAME_INDEXMA), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_FLOAT, 0, N_(RE_PASSNAME_MIST), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_RGBA, 0, N_(RE_PASSNAME_EMIT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_RGBA, 0, N_(RE_PASSNAME_ENVIRONMENT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_RGBA, 0, N_(RE_PASSNAME_DIFFUSE_DIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_RGBA, 0, N_(RE_PASSNAME_DIFFUSE_INDIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_RGBA, 0, N_(RE_PASSNAME_DIFFUSE_COLOR), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_RGBA, 0, N_(RE_PASSNAME_GLOSSY_DIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_RGBA, 0, N_(RE_PASSNAME_GLOSSY_INDIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_RGBA, 0, N_(RE_PASSNAME_GLOSSY_COLOR), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_RGBA, 0, N_(RE_PASSNAME_TRANSM_DIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_RGBA, 0, N_(RE_PASSNAME_TRANSM_INDIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_RGBA, 0, N_(RE_PASSNAME_TRANSM_COLOR), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_RGBA, 0, N_(RE_PASSNAME_SUBSURFACE_DIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_RGBA, 0, N_(RE_PASSNAME_SUBSURFACE_INDIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {SOCK_RGBA, 0, N_(RE_PASSNAME_SUBSURFACE_COLOR), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ {-1, 0, ""},
};
-static void cmp_node_image_add_pass_output(bNodeTree *ntree, bNode *node,
- const char *name, const char *passname,
- int rres_index, int type, int is_rlayers,
- LinkNodePair *available_sockets, int *prev_index)
+static void cmp_node_image_add_pass_output(bNodeTree *ntree,
+ bNode *node,
+ const char *name,
+ const char *passname,
+ int rres_index,
+ int type,
+ int is_rlayers,
+ LinkNodePair *available_sockets,
+ int *prev_index)
{
- bNodeSocket *sock;
- int sock_index = BLI_findstringindex(&node->outputs, name, offsetof(bNodeSocket, name));
-
- if (sock_index < 0) {
- /* The first 31 sockets always are the legacy hardcoded sockets.
- * Any dynamically allocated sockets follow afterwards, and are sorted in the order in which they were stored in the RenderResult.
- * Therefore, we remember the index of the last matched socket. New sockets are placed behind the previously traversed one, but always after the first 31. */
- int after_index = *prev_index;
- if (is_rlayers && after_index < 30)
- after_index = 30;
-
- if (rres_index >= 0) {
- sock = node_add_socket_from_template(ntree, node, &cmp_node_rlayers_out[rres_index], SOCK_OUT);
- }
- else {
- sock = nodeAddStaticSocket(ntree, node, SOCK_OUT, type, PROP_NONE, name, name);
- }
- /* extra socket info */
- NodeImageLayer *sockdata = MEM_callocN(sizeof(NodeImageLayer), "node image layer");
- sock->storage = sockdata;
-
- BLI_strncpy(sockdata->pass_name, passname, sizeof(sockdata->pass_name));
-
- sock_index = BLI_listbase_count(&node->outputs) - 1;
- if (sock_index != after_index + 1) {
- bNodeSocket *after_sock = BLI_findlink(&node->outputs, after_index);
- BLI_remlink(&node->outputs, sock);
- BLI_insertlinkafter(&node->outputs, after_sock, sock);
- }
- }
- else {
- sock = BLI_findlink(&node->outputs, sock_index);
- NodeImageLayer *sockdata = sock->storage;
- if (sockdata) {
- BLI_strncpy(sockdata->pass_name, passname, sizeof(sockdata->pass_name));
- }
- }
-
- BLI_linklist_append(available_sockets, sock);
- *prev_index = sock_index;
+ bNodeSocket *sock;
+ int sock_index = BLI_findstringindex(&node->outputs, name, offsetof(bNodeSocket, name));
+
+ if (sock_index < 0) {
+ /* The first 31 sockets always are the legacy hardcoded sockets.
+ * Any dynamically allocated sockets follow afterwards, and are sorted in the order in which they were stored in the RenderResult.
+ * Therefore, we remember the index of the last matched socket. New sockets are placed behind the previously traversed one, but always after the first 31. */
+ int after_index = *prev_index;
+ if (is_rlayers && after_index < 30)
+ after_index = 30;
+
+ if (rres_index >= 0) {
+ sock = node_add_socket_from_template(
+ ntree, node, &cmp_node_rlayers_out[rres_index], SOCK_OUT);
+ }
+ else {
+ sock = nodeAddStaticSocket(ntree, node, SOCK_OUT, type, PROP_NONE, name, name);
+ }
+ /* extra socket info */
+ NodeImageLayer *sockdata = MEM_callocN(sizeof(NodeImageLayer), "node image layer");
+ sock->storage = sockdata;
+
+ BLI_strncpy(sockdata->pass_name, passname, sizeof(sockdata->pass_name));
+
+ sock_index = BLI_listbase_count(&node->outputs) - 1;
+ if (sock_index != after_index + 1) {
+ bNodeSocket *after_sock = BLI_findlink(&node->outputs, after_index);
+ BLI_remlink(&node->outputs, sock);
+ BLI_insertlinkafter(&node->outputs, after_sock, sock);
+ }
+ }
+ else {
+ sock = BLI_findlink(&node->outputs, sock_index);
+ NodeImageLayer *sockdata = sock->storage;
+ if (sockdata) {
+ BLI_strncpy(sockdata->pass_name, passname, sizeof(sockdata->pass_name));
+ }
+ }
+
+ BLI_linklist_append(available_sockets, sock);
+ *prev_index = sock_index;
}
-static void cmp_node_image_create_outputs(bNodeTree *ntree, bNode *node, LinkNodePair *available_sockets)
+static void cmp_node_image_create_outputs(bNodeTree *ntree,
+ bNode *node,
+ LinkNodePair *available_sockets)
{
- Image *ima = (Image *)node->id;
- ImBuf *ibuf;
- int prev_index = -1;
- if (ima) {
- ImageUser *iuser = node->storage;
- ImageUser load_iuser = {NULL};
- int offset = BKE_image_sequence_guess_offset(ima);
-
- /* It is possible that image user in this node is not
- * properly updated yet. In this case loading image will
- * fail and sockets detection will go wrong.
- *
- * So we manually construct image user to be sure first
- * image from sequence (that one which is set as filename
- * for image datablock) is used for sockets detection
- */
- load_iuser.ok = 1;
- load_iuser.framenr = offset;
-
- /* make sure ima->type is correct */
- ibuf = BKE_image_acquire_ibuf(ima, &load_iuser, NULL);
-
- if (ima->rr) {
- RenderLayer *rl = BLI_findlink(&ima->rr->layers, iuser->layer);
-
- if (rl) {
- RenderPass *rpass;
- for (rpass = rl->passes.first; rpass; rpass = rpass->next) {
- int type;
- if (rpass->channels == 1)
- type = SOCK_FLOAT;
- else
- type = SOCK_RGBA;
-
- cmp_node_image_add_pass_output(ntree, node, rpass->name, rpass->name, -1, type, false, available_sockets, &prev_index);
- /* Special handling for the Combined pass to ensure compatibility. */
- if (STREQ(rpass->name, RE_PASSNAME_COMBINED)) {
- cmp_node_image_add_pass_output(ntree, node, "Alpha", rpass->name, -1, SOCK_FLOAT, false, available_sockets, &prev_index);
- }
- }
- BKE_image_release_ibuf(ima, ibuf, NULL);
- return;
- }
- }
- }
-
- cmp_node_image_add_pass_output(ntree, node, "Image", RE_PASSNAME_COMBINED, -1, SOCK_RGBA, false, available_sockets, &prev_index);
- cmp_node_image_add_pass_output(ntree, node, "Alpha", RE_PASSNAME_COMBINED, -1, SOCK_FLOAT, false, available_sockets, &prev_index);
-
- if (ima) {
- if (!ima->rr) {
- cmp_node_image_add_pass_output(ntree, node, RE_PASSNAME_Z, RE_PASSNAME_Z, -1, SOCK_FLOAT, false, available_sockets, &prev_index);
- }
- BKE_image_release_ibuf(ima, ibuf, NULL);
- }
+ Image *ima = (Image *)node->id;
+ ImBuf *ibuf;
+ int prev_index = -1;
+ if (ima) {
+ ImageUser *iuser = node->storage;
+ ImageUser load_iuser = {NULL};
+ int offset = BKE_image_sequence_guess_offset(ima);
+
+ /* It is possible that image user in this node is not
+ * properly updated yet. In this case loading image will
+ * fail and sockets detection will go wrong.
+ *
+ * So we manually construct image user to be sure first
+ * image from sequence (that one which is set as filename
+ * for image datablock) is used for sockets detection
+ */
+ load_iuser.ok = 1;
+ load_iuser.framenr = offset;
+
+ /* make sure ima->type is correct */
+ ibuf = BKE_image_acquire_ibuf(ima, &load_iuser, NULL);
+
+ if (ima->rr) {
+ RenderLayer *rl = BLI_findlink(&ima->rr->layers, iuser->layer);
+
+ if (rl) {
+ RenderPass *rpass;
+ for (rpass = rl->passes.first; rpass; rpass = rpass->next) {
+ int type;
+ if (rpass->channels == 1)
+ type = SOCK_FLOAT;
+ else
+ type = SOCK_RGBA;
+
+ cmp_node_image_add_pass_output(ntree,
+ node,
+ rpass->name,
+ rpass->name,
+ -1,
+ type,
+ false,
+ available_sockets,
+ &prev_index);
+ /* Special handling for the Combined pass to ensure compatibility. */
+ if (STREQ(rpass->name, RE_PASSNAME_COMBINED)) {
+ cmp_node_image_add_pass_output(ntree,
+ node,
+ "Alpha",
+ rpass->name,
+ -1,
+ SOCK_FLOAT,
+ false,
+ available_sockets,
+ &prev_index);
+ }
+ }
+ BKE_image_release_ibuf(ima, ibuf, NULL);
+ return;
+ }
+ }
+ }
+
+ cmp_node_image_add_pass_output(ntree,
+ node,
+ "Image",
+ RE_PASSNAME_COMBINED,
+ -1,
+ SOCK_RGBA,
+ false,
+ available_sockets,
+ &prev_index);
+ cmp_node_image_add_pass_output(ntree,
+ node,
+ "Alpha",
+ RE_PASSNAME_COMBINED,
+ -1,
+ SOCK_FLOAT,
+ false,
+ available_sockets,
+ &prev_index);
+
+ if (ima) {
+ if (!ima->rr) {
+ cmp_node_image_add_pass_output(ntree,
+ node,
+ RE_PASSNAME_Z,
+ RE_PASSNAME_Z,
+ -1,
+ SOCK_FLOAT,
+ false,
+ available_sockets,
+ &prev_index);
+ }
+ BKE_image_release_ibuf(ima, ibuf, NULL);
+ }
}
typedef struct RLayerUpdateData {
- LinkNodePair *available_sockets;
- int prev_index;
+ LinkNodePair *available_sockets;
+ int prev_index;
} RLayerUpdateData;
-void node_cmp_rlayers_register_pass(bNodeTree *ntree, bNode *node, Scene *scene, ViewLayer *view_layer, const char *name, int type)
+void node_cmp_rlayers_register_pass(
+ bNodeTree *ntree, bNode *node, Scene *scene, ViewLayer *view_layer, const char *name, int type)
{
- RLayerUpdateData *data = node->storage;
-
- if (scene == NULL || view_layer == NULL || data == NULL || node->id != (ID *)scene) {
- return;
- }
-
- ViewLayer *node_view_layer = BLI_findlink(&scene->view_layers, node->custom1);
- if (node_view_layer != view_layer) {
- return;
- }
-
- /* Special handling for the Combined pass to ensure compatibility. */
- if (STREQ(name, RE_PASSNAME_COMBINED)) {
- cmp_node_image_add_pass_output(ntree, node, "Image", name, -1, type, true, data->available_sockets, &data->prev_index);
- cmp_node_image_add_pass_output(ntree, node, "Alpha", name, -1, SOCK_FLOAT, true, data->available_sockets, &data->prev_index);
- }
- else {
- cmp_node_image_add_pass_output(ntree, node, name, name, -1, type, true, data->available_sockets, &data->prev_index);
- }
+ RLayerUpdateData *data = node->storage;
+
+ if (scene == NULL || view_layer == NULL || data == NULL || node->id != (ID *)scene) {
+ return;
+ }
+
+ ViewLayer *node_view_layer = BLI_findlink(&scene->view_layers, node->custom1);
+ if (node_view_layer != view_layer) {
+ return;
+ }
+
+ /* Special handling for the Combined pass to ensure compatibility. */
+ if (STREQ(name, RE_PASSNAME_COMBINED)) {
+ cmp_node_image_add_pass_output(
+ ntree, node, "Image", name, -1, type, true, data->available_sockets, &data->prev_index);
+ cmp_node_image_add_pass_output(ntree,
+ node,
+ "Alpha",
+ name,
+ -1,
+ SOCK_FLOAT,
+ true,
+ data->available_sockets,
+ &data->prev_index);
+ }
+ else {
+ cmp_node_image_add_pass_output(
+ ntree, node, name, name, -1, type, true, data->available_sockets, &data->prev_index);
+ }
}
-static void cmp_node_rlayer_create_outputs_cb(void *UNUSED(userdata), Scene *scene, ViewLayer *view_layer,
- const char *name, int UNUSED(channels), const char *UNUSED(chanid), int type)
+static void cmp_node_rlayer_create_outputs_cb(void *UNUSED(userdata),
+ Scene *scene,
+ ViewLayer *view_layer,
+ const char *name,
+ int UNUSED(channels),
+ const char *UNUSED(chanid),
+ int type)
{
- /* Register the pass in all scenes that have a render layer node for this layer.
- * Since multiple scenes can be used in the compositor, the code must loop over all scenes
- * and check whether their nodetree has a node that needs to be updated. */
- /* NOTE: using G_MAIN seems valid here,
- * unless we want to register that for every other temp Main we could generate??? */
- ntreeCompositRegisterPass(scene->nodetree, scene, view_layer, name, type);
-
- for (Scene *sce = G_MAIN->scenes.first; sce; sce = sce->id.next) {
- if (sce->nodetree && sce != scene) {
- ntreeCompositRegisterPass(sce->nodetree, scene, view_layer, name, type);
- }
- }
+ /* Register the pass in all scenes that have a render layer node for this layer.
+ * Since multiple scenes can be used in the compositor, the code must loop over all scenes
+ * and check whether their nodetree has a node that needs to be updated. */
+ /* NOTE: using G_MAIN seems valid here,
+ * unless we want to register that for every other temp Main we could generate??? */
+ ntreeCompositRegisterPass(scene->nodetree, scene, view_layer, name, type);
+
+ for (Scene *sce = G_MAIN->scenes.first; sce; sce = sce->id.next) {
+ if (sce->nodetree && sce != scene) {
+ ntreeCompositRegisterPass(sce->nodetree, scene, view_layer, name, type);
+ }
+ }
}
-static void cmp_node_rlayer_create_outputs(bNodeTree *ntree, bNode *node, LinkNodePair *available_sockets)
+static void cmp_node_rlayer_create_outputs(bNodeTree *ntree,
+ bNode *node,
+ LinkNodePair *available_sockets)
{
- Scene *scene = (Scene *)node->id;
-
- if (scene) {
- RenderEngineType *engine_type = RE_engines_find(scene->r.engine);
- if (engine_type && engine_type->update_render_passes) {
- ViewLayer *view_layer = BLI_findlink(&scene->view_layers, node->custom1);
- if (view_layer) {
- RLayerUpdateData *data = MEM_mallocN(sizeof(RLayerUpdateData), "render layer update data");
- data->available_sockets = available_sockets;
- data->prev_index = -1;
- node->storage = data;
-
- RenderEngine *engine = RE_engine_create(engine_type);
- RE_engine_update_render_passes(engine, scene, view_layer, cmp_node_rlayer_create_outputs_cb, NULL);
- RE_engine_free(engine);
-
- MEM_freeN(data);
- node->storage = NULL;
-
- return;
- }
- }
- }
-
- int prev_index = -1;
- cmp_node_image_add_pass_output(ntree, node, "Image", RE_PASSNAME_COMBINED, RRES_OUT_IMAGE, SOCK_RGBA, true, available_sockets, &prev_index);
- cmp_node_image_add_pass_output(ntree, node, "Alpha", RE_PASSNAME_COMBINED, RRES_OUT_ALPHA, SOCK_FLOAT, true, available_sockets, &prev_index);
+ Scene *scene = (Scene *)node->id;
+
+ if (scene) {
+ RenderEngineType *engine_type = RE_engines_find(scene->r.engine);
+ if (engine_type && engine_type->update_render_passes) {
+ ViewLayer *view_layer = BLI_findlink(&scene->view_layers, node->custom1);
+ if (view_layer) {
+ RLayerUpdateData *data = MEM_mallocN(sizeof(RLayerUpdateData), "render layer update data");
+ data->available_sockets = available_sockets;
+ data->prev_index = -1;
+ node->storage = data;
+
+ RenderEngine *engine = RE_engine_create(engine_type);
+ RE_engine_update_render_passes(
+ engine, scene, view_layer, cmp_node_rlayer_create_outputs_cb, NULL);
+ RE_engine_free(engine);
+
+ MEM_freeN(data);
+ node->storage = NULL;
+
+ return;
+ }
+ }
+ }
+
+ int prev_index = -1;
+ cmp_node_image_add_pass_output(ntree,
+ node,
+ "Image",
+ RE_PASSNAME_COMBINED,
+ RRES_OUT_IMAGE,
+ SOCK_RGBA,
+ true,
+ available_sockets,
+ &prev_index);
+ cmp_node_image_add_pass_output(ntree,
+ node,
+ "Alpha",
+ RE_PASSNAME_COMBINED,
+ RRES_OUT_ALPHA,
+ SOCK_FLOAT,
+ true,
+ available_sockets,
+ &prev_index);
}
/* XXX make this into a generic socket verification function for dynamic socket replacement (multilayer, groups, static templates) */
static void cmp_node_image_verify_outputs(bNodeTree *ntree, bNode *node, bool rlayer)
{
- bNodeSocket *sock, *sock_next;
- LinkNodePair available_sockets = {NULL, NULL};
- int sock_index;
-
- /* XXX make callback */
- if (rlayer)
- cmp_node_rlayer_create_outputs(ntree, node, &available_sockets);
- else
- cmp_node_image_create_outputs(ntree, node, &available_sockets);
-
- /* Get rid of sockets whose passes are not available in the image.
- * If sockets that are not available would be deleted, the connections to them would be lost
- * when e.g. opening a file (since there's no render at all yet).
- * Therefore, sockets with connected links will just be set as unavailable.
- *
- * Another important detail comes from compatibility with the older socket model, where there
- * was a fixed socket per pass type that was just hidden or not. Therefore, older versions expect
- * the first 31 passes to belong to a specific pass type.
- * So, we keep those 31 always allocated before the others as well, even if they have no links attached. */
- sock_index = 0;
- for (sock = node->outputs.first; sock; sock = sock_next, sock_index++) {
- sock_next = sock->next;
- if (BLI_linklist_index(available_sockets.list, sock) >= 0) {
- sock->flag &= ~(SOCK_UNAVAIL | SOCK_HIDDEN);
- }
- else {
- bNodeLink *link;
- for (link = ntree->links.first; link; link = link->next) {
- if (link->fromsock == sock) break;
- }
- if (!link && (!rlayer || sock_index > 30)) {
- MEM_freeN(sock->storage);
- nodeRemoveSocket(ntree, node, sock);
- }
- else {
- sock->flag |= SOCK_UNAVAIL;
- }
- }
- }
-
- BLI_linklist_free(available_sockets.list, NULL);
+ bNodeSocket *sock, *sock_next;
+ LinkNodePair available_sockets = {NULL, NULL};
+ int sock_index;
+
+ /* XXX make callback */
+ if (rlayer)
+ cmp_node_rlayer_create_outputs(ntree, node, &available_sockets);
+ else
+ cmp_node_image_create_outputs(ntree, node, &available_sockets);
+
+ /* Get rid of sockets whose passes are not available in the image.
+ * If sockets that are not available would be deleted, the connections to them would be lost
+ * when e.g. opening a file (since there's no render at all yet).
+ * Therefore, sockets with connected links will just be set as unavailable.
+ *
+ * Another important detail comes from compatibility with the older socket model, where there
+ * was a fixed socket per pass type that was just hidden or not. Therefore, older versions expect
+ * the first 31 passes to belong to a specific pass type.
+ * So, we keep those 31 always allocated before the others as well, even if they have no links attached. */
+ sock_index = 0;
+ for (sock = node->outputs.first; sock; sock = sock_next, sock_index++) {
+ sock_next = sock->next;
+ if (BLI_linklist_index(available_sockets.list, sock) >= 0) {
+ sock->flag &= ~(SOCK_UNAVAIL | SOCK_HIDDEN);
+ }
+ else {
+ bNodeLink *link;
+ for (link = ntree->links.first; link; link = link->next) {
+ if (link->fromsock == sock)
+ break;
+ }
+ if (!link && (!rlayer || sock_index > 30)) {
+ MEM_freeN(sock->storage);
+ nodeRemoveSocket(ntree, node, sock);
+ }
+ else {
+ sock->flag |= SOCK_UNAVAIL;
+ }
+ }
+ }
+
+ BLI_linklist_free(available_sockets.list, NULL);
}
static void cmp_node_image_update(bNodeTree *ntree, bNode *node)
{
- /* avoid unnecessary updates, only changes to the image/image user data are of interest */
- if (node->update & NODE_UPDATE_ID)
- cmp_node_image_verify_outputs(ntree, node, false);
+ /* avoid unnecessary updates, only changes to the image/image user data are of interest */
+ if (node->update & NODE_UPDATE_ID)
+ cmp_node_image_verify_outputs(ntree, node, false);
- cmp_node_update_default(ntree, node);
+ cmp_node_update_default(ntree, node);
}
static void node_composit_init_image(bNodeTree *ntree, bNode *node)
{
- ImageUser *iuser = MEM_callocN(sizeof(ImageUser), "node image user");
- node->storage = iuser;
- iuser->frames = 1;
- iuser->sfra = 1;
- iuser->ok = 1;
- iuser->flag |= IMA_ANIM_ALWAYS;
-
- /* setup initial outputs */
- cmp_node_image_verify_outputs(ntree, node, false);
+ ImageUser *iuser = MEM_callocN(sizeof(ImageUser), "node image user");
+ node->storage = iuser;
+ iuser->frames = 1;
+ iuser->sfra = 1;
+ iuser->ok = 1;
+ iuser->flag |= IMA_ANIM_ALWAYS;
+
+ /* setup initial outputs */
+ cmp_node_image_verify_outputs(ntree, node, false);
}
static void node_composit_free_image(bNode *node)
{
- bNodeSocket *sock;
+ bNodeSocket *sock;
- /* free extra socket info */
- for (sock = node->outputs.first; sock; sock = sock->next)
- MEM_freeN(sock->storage);
+ /* free extra socket info */
+ for (sock = node->outputs.first; sock; sock = sock->next)
+ MEM_freeN(sock->storage);
- MEM_freeN(node->storage);
+ MEM_freeN(node->storage);
}
-static void node_composit_copy_image(bNodeTree *UNUSED(dest_ntree), bNode *dest_node, bNode *src_node)
+static void node_composit_copy_image(bNodeTree *UNUSED(dest_ntree),
+ bNode *dest_node,
+ bNode *src_node)
{
- bNodeSocket *sock;
+ bNodeSocket *sock;
- dest_node->storage = MEM_dupallocN(src_node->storage);
+ dest_node->storage = MEM_dupallocN(src_node->storage);
- /* copy extra socket info */
- for (sock = src_node->outputs.first; sock; sock = sock->next)
- sock->new_sock->storage = MEM_dupallocN(sock->storage);
+ /* copy extra socket info */
+ for (sock = src_node->outputs.first; sock; sock = sock->next)
+ sock->new_sock->storage = MEM_dupallocN(sock->storage);
}
void register_node_type_cmp_image(void)
{
- static bNodeType ntype;
+ static bNodeType ntype;
- cmp_node_type_base(&ntype, CMP_NODE_IMAGE, "Image", NODE_CLASS_INPUT, NODE_PREVIEW);
- node_type_init(&ntype, node_composit_init_image);
- node_type_storage(&ntype, "ImageUser", node_composit_free_image, node_composit_copy_image);
- node_type_update(&ntype, cmp_node_image_update, NULL);
- node_type_label(&ntype, node_image_label);
+ cmp_node_type_base(&ntype, CMP_NODE_IMAGE, "Image", NODE_CLASS_INPUT, NODE_PREVIEW);
+ node_type_init(&ntype, node_composit_init_image);
+ node_type_storage(&ntype, "ImageUser", node_composit_free_image, node_composit_copy_image);
+ node_type_update(&ntype, cmp_node_image_update, NULL);
+ node_type_label(&ntype, node_image_label);
- nodeRegisterType(&ntype);
+ nodeRegisterType(&ntype);
}
-
/* **************** RENDER RESULT ******************** */
void node_cmp_rlayers_outputs(bNodeTree *ntree, bNode *node)
{
- cmp_node_image_verify_outputs(ntree, node, true);
+ cmp_node_image_verify_outputs(ntree, node, true);
}
const char *node_cmp_rlayers_sock_to_pass(int sock_index)
{
- const char *sock_to_passname[] = {
- RE_PASSNAME_COMBINED, RE_PASSNAME_COMBINED,
- RE_PASSNAME_Z, RE_PASSNAME_NORMAL, RE_PASSNAME_UV, RE_PASSNAME_VECTOR, RE_PASSNAME_DEPRECATED,
- RE_PASSNAME_DEPRECATED, RE_PASSNAME_DEPRECATED, RE_PASSNAME_SHADOW, RE_PASSNAME_AO,
- RE_PASSNAME_DEPRECATED, RE_PASSNAME_DEPRECATED, RE_PASSNAME_DEPRECATED,
- RE_PASSNAME_INDEXOB, RE_PASSNAME_INDEXMA, RE_PASSNAME_MIST, RE_PASSNAME_EMIT, RE_PASSNAME_ENVIRONMENT,
- RE_PASSNAME_DIFFUSE_DIRECT, RE_PASSNAME_DIFFUSE_INDIRECT, RE_PASSNAME_DIFFUSE_COLOR,
- RE_PASSNAME_GLOSSY_DIRECT, RE_PASSNAME_GLOSSY_INDIRECT, RE_PASSNAME_GLOSSY_COLOR,
- RE_PASSNAME_TRANSM_DIRECT, RE_PASSNAME_TRANSM_INDIRECT, RE_PASSNAME_TRANSM_COLOR,
- RE_PASSNAME_SUBSURFACE_DIRECT, RE_PASSNAME_SUBSURFACE_INDIRECT, RE_PASSNAME_SUBSURFACE_COLOR,
- };
- if (sock_index > 30) {
- return NULL;
- }
- return sock_to_passname[sock_index];
+ const char *sock_to_passname[] = {
+ RE_PASSNAME_COMBINED,
+ RE_PASSNAME_COMBINED,
+ RE_PASSNAME_Z,
+ RE_PASSNAME_NORMAL,
+ RE_PASSNAME_UV,
+ RE_PASSNAME_VECTOR,
+ RE_PASSNAME_DEPRECATED,
+ RE_PASSNAME_DEPRECATED,
+ RE_PASSNAME_DEPRECATED,
+ RE_PASSNAME_SHADOW,
+ RE_PASSNAME_AO,
+ RE_PASSNAME_DEPRECATED,
+ RE_PASSNAME_DEPRECATED,
+ RE_PASSNAME_DEPRECATED,
+ RE_PASSNAME_INDEXOB,
+ RE_PASSNAME_INDEXMA,
+ RE_PASSNAME_MIST,
+ RE_PASSNAME_EMIT,
+ RE_PASSNAME_ENVIRONMENT,
+ RE_PASSNAME_DIFFUSE_DIRECT,
+ RE_PASSNAME_DIFFUSE_INDIRECT,
+ RE_PASSNAME_DIFFUSE_COLOR,
+ RE_PASSNAME_GLOSSY_DIRECT,
+ RE_PASSNAME_GLOSSY_INDIRECT,
+ RE_PASSNAME_GLOSSY_COLOR,
+ RE_PASSNAME_TRANSM_DIRECT,
+ RE_PASSNAME_TRANSM_INDIRECT,
+ RE_PASSNAME_TRANSM_COLOR,
+ RE_PASSNAME_SUBSURFACE_DIRECT,
+ RE_PASSNAME_SUBSURFACE_INDIRECT,
+ RE_PASSNAME_SUBSURFACE_COLOR,
+ };
+ if (sock_index > 30) {
+ return NULL;
+ }
+ return sock_to_passname[sock_index];
}
static void node_composit_init_rlayers(const bContext *C, PointerRNA *ptr)
{
- Scene *scene = CTX_data_scene(C);
- bNode *node = ptr->data;
- int sock_index = 0;
+ Scene *scene = CTX_data_scene(C);
+ bNode *node = ptr->data;
+ int sock_index = 0;
- node->id = &scene->id;
+ node->id = &scene->id;
- for (bNodeSocket *sock = node->outputs.first; sock; sock = sock->next, sock_index++) {
- NodeImageLayer *sockdata = MEM_callocN(sizeof(NodeImageLayer), "node image layer");
- sock->storage = sockdata;
+ for (bNodeSocket *sock = node->outputs.first; sock; sock = sock->next, sock_index++) {
+ NodeImageLayer *sockdata = MEM_callocN(sizeof(NodeImageLayer), "node image layer");
+ sock->storage = sockdata;
- BLI_strncpy(sockdata->pass_name, node_cmp_rlayers_sock_to_pass(sock_index), sizeof(sockdata->pass_name));
- }
+ BLI_strncpy(sockdata->pass_name,
+ node_cmp_rlayers_sock_to_pass(sock_index),
+ sizeof(sockdata->pass_name));
+ }
}
static bool node_composit_poll_rlayers(bNodeType *UNUSED(ntype), bNodeTree *ntree)
{
- if (STREQ(ntree->idname, "CompositorNodeTree")) {
- Scene *scene;
-
- /* XXX ugly: check if ntree is a local scene node tree.
- * Render layers node can only be used in local scene->nodetree,
- * since it directly links to the scene.
- */
- for (scene = G.main->scenes.first; scene; scene = scene->id.next)
- if (scene->nodetree == ntree)
- break;
-
- return (scene != NULL);
- }
- return false;
+ if (STREQ(ntree->idname, "CompositorNodeTree")) {
+ Scene *scene;
+
+ /* XXX ugly: check if ntree is a local scene node tree.
+ * Render layers node can only be used in local scene->nodetree,
+ * since it directly links to the scene.
+ */
+ for (scene = G.main->scenes.first; scene; scene = scene->id.next)
+ if (scene->nodetree == ntree)
+ break;
+
+ return (scene != NULL);
+ }
+ return false;
}
static void node_composit_free_rlayers(bNode *node)
{
- bNodeSocket *sock;
-
- /* free extra socket info */
- for (sock = node->outputs.first; sock; sock = sock->next) {
- if (sock->storage) {
- MEM_freeN(sock->storage);
- }
- }
+ bNodeSocket *sock;
+
+ /* free extra socket info */
+ for (sock = node->outputs.first; sock; sock = sock->next) {
+ if (sock->storage) {
+ MEM_freeN(sock->storage);
+ }
+ }
}
-static void node_composit_copy_rlayers(bNodeTree *UNUSED(dest_ntree), bNode *UNUSED(dest_node), bNode *src_node)
+static void node_composit_copy_rlayers(bNodeTree *UNUSED(dest_ntree),
+ bNode *UNUSED(dest_node),
+ bNode *src_node)
{
- bNodeSocket *sock;
-
- /* copy extra socket info */
- for (sock = src_node->outputs.first; sock; sock = sock->next) {
- if (sock->storage) {
- sock->new_sock->storage = MEM_dupallocN(sock->storage);
- }
- }
+ bNodeSocket *sock;
+
+ /* copy extra socket info */
+ for (sock = src_node->outputs.first; sock; sock = sock->next) {
+ if (sock->storage) {
+ sock->new_sock->storage = MEM_dupallocN(sock->storage);
+ }
+ }
}
static void cmp_node_rlayers_update(bNodeTree *ntree, bNode *node)
{
- cmp_node_image_verify_outputs(ntree, node, true);
+ cmp_node_image_verify_outputs(ntree, node, true);
- cmp_node_update_default(ntree, node);
+ cmp_node_update_default(ntree, node);
}
void register_node_type_cmp_rlayers(void)
{
- static bNodeType ntype;
-
- cmp_node_type_base(&ntype, CMP_NODE_R_LAYERS, "Render Layers", NODE_CLASS_INPUT, NODE_PREVIEW);
- node_type_socket_templates(&ntype, NULL, cmp_node_rlayers_out);
- ntype.initfunc_api = node_composit_init_rlayers;
- ntype.poll = node_composit_poll_rlayers;
- node_type_storage(&ntype, NULL, node_composit_free_rlayers, node_composit_copy_rlayers);
- node_type_update(&ntype, cmp_node_rlayers_update, NULL);
- node_type_init(&ntype, node_cmp_rlayers_outputs);
- node_type_size_preset(&ntype, NODE_SIZE_LARGE);
-
- nodeRegisterType(&ntype);
+ static bNodeType ntype;
+
+ cmp_node_type_base(&ntype, CMP_NODE_R_LAYERS, "Render Layers", NODE_CLASS_INPUT, NODE_PREVIEW);
+ node_type_socket_templates(&ntype, NULL, cmp_node_rlayers_out);
+ ntype.initfunc_api = node_composit_init_rlayers;
+ ntype.poll = node_composit_poll_rlayers;
+ node_type_storage(&ntype, NULL, node_composit_free_rlayers, node_composit_copy_rlayers);
+ node_type_update(&ntype, cmp_node_rlayers_update, NULL);
+ node_type_init(&ntype, node_cmp_rlayers_outputs);
+ node_type_size_preset(&ntype, NODE_SIZE_LARGE);
+
+ nodeRegisterType(&ntype);
}