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:
authorLukas Toenne <lukas.toenne@googlemail.com>2013-06-12 15:26:44 +0400
committerLukas Toenne <lukas.toenne@googlemail.com>2013-06-12 15:26:44 +0400
commit0c91ebfeee94500ebd76d15119261c6d0f72b41f (patch)
tree56085fede92d05e6017cde223b0f94e1018db64a /source/blender/nodes
parent793e582d1a65bf2fbe285ae624916a569a8fdc17 (diff)
Fix #35703, Viewer node doesn't updates image sometimes. The viewer node was not getting correctly initialized node->id pointer to the Viewer image (thanks to Sergey for figuring that out). The original
proposal was to add another special init hack for the viewer node->id, but rather would do it right and so moved all the special init hacks for constant ID backpointers (Scene for RenderLayer, Composite, Defocus, FileOutput and MovieClip for MovieClip, MovieDistortion and Stabilization nodes). These are now part of the local init callbacks functions of the appropriate nodes, using the new initfunc_api callback which takes a Context pointer, so they have access to Scene.
Diffstat (limited to 'source/blender/nodes')
-rw-r--r--source/blender/nodes/NOD_composite.h2
-rw-r--r--source/blender/nodes/composite/node_composite_tree.c62
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_composite.c13
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_defocus.c12
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_image.c79
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_movieclip.c11
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_moviedistortion.c13
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_outputFile.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_splitViewer.c4
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_stabilize2d.c13
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_viewer.c4
11 files changed, 152 insertions, 63 deletions
diff --git a/source/blender/nodes/NOD_composite.h b/source/blender/nodes/NOD_composite.h
index 896714338e5..626e7955b08 100644
--- a/source/blender/nodes/NOD_composite.h
+++ b/source/blender/nodes/NOD_composite.h
@@ -138,4 +138,6 @@ void register_node_type_cmp_switch(void);
void register_node_type_cmp_pixelate(void);
void register_node_type_cmp_trackpos(void);
+void node_cmp_rlayers_force_hidden_passes(struct bNode *node);
+
#endif
diff --git a/source/blender/nodes/composite/node_composite_tree.c b/source/blender/nodes/composite/node_composite_tree.c
index a00ddf3d5e0..0b62481b2f7 100644
--- a/source/blender/nodes/composite/node_composite_tree.c
+++ b/source/blender/nodes/composite/node_composite_tree.c
@@ -74,7 +74,7 @@ static void composite_get_from_context(const bContext *C, bNodeTreeType *UNUSED(
*r_ntree = scene->nodetree;
/* update output sockets based on available layers */
- ntreeCompositForceHidden(scene->nodetree, scene);
+ ntreeCompositForceHidden(scene->nodetree);
}
@@ -262,69 +262,17 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int rendering, int
/* *********************************************** */
-static void set_output_visible(bNode *node, int passflag, int index, int pass)
-{
- bNodeSocket *sock = BLI_findlink(&node->outputs, index);
- /* clear the SOCK_HIDDEN flag as well, in case a socket was hidden before */
- if (passflag & pass)
- sock->flag &= ~(SOCK_HIDDEN | SOCK_UNAVAIL);
- else
- sock->flag |= SOCK_UNAVAIL;
-}
-
-/* clumsy checking... should do dynamic outputs once */
-static void force_hidden_passes(bNode *node, int passflag)
-{
- bNodeSocket *sock;
-
- for (sock = node->outputs.first; sock; sock = sock->next)
- sock->flag &= ~SOCK_UNAVAIL;
-
- set_output_visible(node, passflag, RRES_OUT_IMAGE, SCE_PASS_COMBINED);
- set_output_visible(node, passflag, RRES_OUT_ALPHA, SCE_PASS_COMBINED);
-
- set_output_visible(node, passflag, RRES_OUT_Z, SCE_PASS_Z);
- set_output_visible(node, passflag, RRES_OUT_NORMAL, SCE_PASS_NORMAL);
- set_output_visible(node, passflag, RRES_OUT_VEC, SCE_PASS_VECTOR);
- set_output_visible(node, passflag, RRES_OUT_UV, SCE_PASS_UV);
- set_output_visible(node, passflag, RRES_OUT_RGBA, SCE_PASS_RGBA);
- set_output_visible(node, passflag, RRES_OUT_DIFF, SCE_PASS_DIFFUSE);
- set_output_visible(node, passflag, RRES_OUT_SPEC, SCE_PASS_SPEC);
- set_output_visible(node, passflag, RRES_OUT_SHADOW, SCE_PASS_SHADOW);
- set_output_visible(node, passflag, RRES_OUT_AO, SCE_PASS_AO);
- set_output_visible(node, passflag, RRES_OUT_REFLECT, SCE_PASS_REFLECT);
- set_output_visible(node, passflag, RRES_OUT_REFRACT, SCE_PASS_REFRACT);
- set_output_visible(node, passflag, RRES_OUT_INDIRECT, SCE_PASS_INDIRECT);
- set_output_visible(node, passflag, RRES_OUT_INDEXOB, SCE_PASS_INDEXOB);
- set_output_visible(node, passflag, RRES_OUT_INDEXMA, SCE_PASS_INDEXMA);
- set_output_visible(node, passflag, RRES_OUT_MIST, SCE_PASS_MIST);
- set_output_visible(node, passflag, RRES_OUT_EMIT, SCE_PASS_EMIT);
- set_output_visible(node, passflag, RRES_OUT_ENV, SCE_PASS_ENVIRONMENT);
- set_output_visible(node, passflag, RRES_OUT_DIFF_DIRECT, SCE_PASS_DIFFUSE_DIRECT);
- set_output_visible(node, passflag, RRES_OUT_DIFF_INDIRECT, SCE_PASS_DIFFUSE_INDIRECT);
- set_output_visible(node, passflag, RRES_OUT_DIFF_COLOR, SCE_PASS_DIFFUSE_COLOR);
- set_output_visible(node, passflag, RRES_OUT_GLOSSY_DIRECT, SCE_PASS_GLOSSY_DIRECT);
- set_output_visible(node, passflag, RRES_OUT_GLOSSY_INDIRECT, SCE_PASS_GLOSSY_INDIRECT);
- set_output_visible(node, passflag, RRES_OUT_GLOSSY_COLOR, SCE_PASS_GLOSSY_COLOR);
- set_output_visible(node, passflag, RRES_OUT_TRANSM_DIRECT, SCE_PASS_TRANSM_DIRECT);
- set_output_visible(node, passflag, RRES_OUT_TRANSM_INDIRECT, SCE_PASS_TRANSM_INDIRECT);
- set_output_visible(node, passflag, RRES_OUT_TRANSM_COLOR, SCE_PASS_TRANSM_COLOR);
-}
-
/* based on rules, force sockets hidden always */
-void ntreeCompositForceHidden(bNodeTree *ntree, Scene *curscene)
+void ntreeCompositForceHidden(bNodeTree *ntree)
{
bNode *node;
if (ntree == NULL) return;
for (node = ntree->nodes.first; node; node = node->next) {
- if (node->type == CMP_NODE_R_LAYERS) {
- Scene *sce = node->id ? (Scene *)node->id : curscene;
- SceneRenderLayer *srl = BLI_findlink(&sce->r.layers, node->custom1);
- if (srl)
- force_hidden_passes(node, srl->passflag);
- }
+ if (node->type == CMP_NODE_R_LAYERS)
+ node_cmp_rlayers_force_hidden_passes(node);
+
/* XXX this stuff is called all the time, don't want that.
* Updates should only happen when actually necessary.
*/
diff --git a/source/blender/nodes/composite/nodes/node_composite_composite.c b/source/blender/nodes/composite/nodes/node_composite_composite.c
index be9ed457150..c6c6a612bc4 100644
--- a/source/blender/nodes/composite/nodes/node_composite_composite.c
+++ b/source/blender/nodes/composite/nodes/node_composite_composite.c
@@ -31,6 +31,10 @@
#include "node_composite_util.h"
+#include "BKE_context.h"
+
+#include "RNA_access.h"
+
/* **************** COMPOSITE ******************** */
static bNodeSocketTemplate cmp_node_composite_in[] = {
{ SOCK_RGBA, 1, N_("Image"), 0.0f, 0.0f, 0.0f, 1.0f},
@@ -39,12 +43,21 @@ static bNodeSocketTemplate cmp_node_composite_in[] = {
{ -1, 0, "" }
};
+static void init(const bContext *C, PointerRNA *ptr)
+{
+ Scene *scene = CTX_data_scene(C);
+ bNode *node = ptr->data;
+
+ node->id = &scene->id;
+}
+
void register_node_type_cmp_composite(void)
{
static bNodeType ntype;
cmp_node_type_base(&ntype, CMP_NODE_COMPOSITE, "Composite", NODE_CLASS_OUTPUT, NODE_PREVIEW);
node_type_socket_templates(&ntype, cmp_node_composite_in, NULL);
+ ntype.initfunc_api = init;
/* Do not allow muting for this node. */
node_type_internal_links(&ntype, NULL);
diff --git a/source/blender/nodes/composite/nodes/node_composite_defocus.c b/source/blender/nodes/composite/nodes/node_composite_defocus.c
index a3311755717..c057ba904ba 100644
--- a/source/blender/nodes/composite/nodes/node_composite_defocus.c
+++ b/source/blender/nodes/composite/nodes/node_composite_defocus.c
@@ -33,6 +33,10 @@
#include <limits.h>
+#include "BKE_context.h"
+
+#include "RNA_access.h"
+
/* ************ qdn: Defocus node ****************** */
static bNodeSocketTemplate cmp_node_defocus_in[] = {
{ SOCK_RGBA, 1, N_("Image"), 1.0f, 1.0f, 1.0f, 1.0f},
@@ -44,8 +48,10 @@ static bNodeSocketTemplate cmp_node_defocus_out[] = {
{ -1, 0, "" }
};
-static void node_composit_init_defocus(bNodeTree *UNUSED(ntree), bNode *node)
+static void node_composit_init_defocus(const bContext *C, PointerRNA *ptr)
{
+ Scene *scene = CTX_data_scene(C);
+ bNode *node = ptr->data;
/* qdn: defocus node */
NodeDefocus *nbd = MEM_callocN(sizeof(NodeDefocus), "node defocus data");
nbd->bktype = 0;
@@ -59,6 +65,8 @@ static void node_composit_init_defocus(bNodeTree *UNUSED(ntree), bNode *node)
nbd->scale = 1.f;
nbd->no_zbuf = 1;
node->storage = nbd;
+
+ node->id = &scene->id;
}
void register_node_type_cmp_defocus(void)
@@ -67,7 +75,7 @@ void register_node_type_cmp_defocus(void)
cmp_node_type_base(&ntype, CMP_NODE_DEFOCUS, "Defocus", NODE_CLASS_OP_FILTER, 0);
node_type_socket_templates(&ntype, cmp_node_defocus_in, cmp_node_defocus_out);
- node_type_init(&ntype, node_composit_init_defocus);
+ ntype.initfunc_api = node_composit_init_defocus;
node_type_storage(&ntype, "NodeDefocus", node_free_standard_storage, node_copy_standard_storage);
nodeRegisterType(&ntype);
diff --git a/source/blender/nodes/composite/nodes/node_composite_image.c b/source/blender/nodes/composite/nodes/node_composite_image.c
index b02bf6f438a..41f1f81e048 100644
--- a/source/blender/nodes/composite/nodes/node_composite_image.c
+++ b/source/blender/nodes/composite/nodes/node_composite_image.c
@@ -31,9 +31,16 @@
#include "node_composite_util.h"
+#include "BLI_utildefines.h"
+
+#include "DNA_scene_types.h"
+
+#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_main.h"
+#include "RNA_access.h"
+
/* **************** IMAGE (and RenderResult, multilayer image) ******************** */
static bNodeSocketTemplate cmp_node_rlayers_out[] = {
@@ -347,6 +354,77 @@ void register_node_type_cmp_image(void)
/* **************** RENDER RESULT ******************** */
+static void set_output_visible(bNode *node, int passflag, int index, int pass)
+{
+ bNodeSocket *sock = BLI_findlink(&node->outputs, index);
+ /* clear the SOCK_HIDDEN flag as well, in case a socket was hidden before */
+ if (passflag & pass)
+ sock->flag &= ~(SOCK_HIDDEN | SOCK_UNAVAIL);
+ else
+ sock->flag |= SOCK_UNAVAIL;
+}
+
+/* clumsy checking... should do dynamic outputs once */
+void node_cmp_rlayers_force_hidden_passes(bNode *node)
+{
+ Scene *scene = (Scene *)node->id;
+ SceneRenderLayer *srl;
+ int passflag;
+ bNodeSocket *sock;
+
+ /* must always have valid scene pointer */
+ BLI_assert(scene != NULL);
+
+ srl = BLI_findlink(&scene->r.layers, node->custom1);
+ if (!srl)
+ return;
+
+ passflag = srl->passflag;
+
+ for (sock = node->outputs.first; sock; sock = sock->next)
+ sock->flag &= ~SOCK_UNAVAIL;
+
+ set_output_visible(node, passflag, RRES_OUT_IMAGE, SCE_PASS_COMBINED);
+ set_output_visible(node, passflag, RRES_OUT_ALPHA, SCE_PASS_COMBINED);
+
+ set_output_visible(node, passflag, RRES_OUT_Z, SCE_PASS_Z);
+ set_output_visible(node, passflag, RRES_OUT_NORMAL, SCE_PASS_NORMAL);
+ set_output_visible(node, passflag, RRES_OUT_VEC, SCE_PASS_VECTOR);
+ set_output_visible(node, passflag, RRES_OUT_UV, SCE_PASS_UV);
+ set_output_visible(node, passflag, RRES_OUT_RGBA, SCE_PASS_RGBA);
+ set_output_visible(node, passflag, RRES_OUT_DIFF, SCE_PASS_DIFFUSE);
+ set_output_visible(node, passflag, RRES_OUT_SPEC, SCE_PASS_SPEC);
+ set_output_visible(node, passflag, RRES_OUT_SHADOW, SCE_PASS_SHADOW);
+ set_output_visible(node, passflag, RRES_OUT_AO, SCE_PASS_AO);
+ set_output_visible(node, passflag, RRES_OUT_REFLECT, SCE_PASS_REFLECT);
+ set_output_visible(node, passflag, RRES_OUT_REFRACT, SCE_PASS_REFRACT);
+ set_output_visible(node, passflag, RRES_OUT_INDIRECT, SCE_PASS_INDIRECT);
+ set_output_visible(node, passflag, RRES_OUT_INDEXOB, SCE_PASS_INDEXOB);
+ set_output_visible(node, passflag, RRES_OUT_INDEXMA, SCE_PASS_INDEXMA);
+ set_output_visible(node, passflag, RRES_OUT_MIST, SCE_PASS_MIST);
+ set_output_visible(node, passflag, RRES_OUT_EMIT, SCE_PASS_EMIT);
+ set_output_visible(node, passflag, RRES_OUT_ENV, SCE_PASS_ENVIRONMENT);
+ set_output_visible(node, passflag, RRES_OUT_DIFF_DIRECT, SCE_PASS_DIFFUSE_DIRECT);
+ set_output_visible(node, passflag, RRES_OUT_DIFF_INDIRECT, SCE_PASS_DIFFUSE_INDIRECT);
+ set_output_visible(node, passflag, RRES_OUT_DIFF_COLOR, SCE_PASS_DIFFUSE_COLOR);
+ set_output_visible(node, passflag, RRES_OUT_GLOSSY_DIRECT, SCE_PASS_GLOSSY_DIRECT);
+ set_output_visible(node, passflag, RRES_OUT_GLOSSY_INDIRECT, SCE_PASS_GLOSSY_INDIRECT);
+ set_output_visible(node, passflag, RRES_OUT_GLOSSY_COLOR, SCE_PASS_GLOSSY_COLOR);
+ set_output_visible(node, passflag, RRES_OUT_TRANSM_DIRECT, SCE_PASS_TRANSM_DIRECT);
+ set_output_visible(node, passflag, RRES_OUT_TRANSM_INDIRECT, SCE_PASS_TRANSM_INDIRECT);
+ set_output_visible(node, passflag, RRES_OUT_TRANSM_COLOR, SCE_PASS_TRANSM_COLOR);
+}
+
+static void node_composit_init_rlayers(const bContext *C, PointerRNA *ptr)
+{
+ Scene *scene = CTX_data_scene(C);
+ bNode *node = ptr->data;
+
+ node->id = &scene->id;
+
+ node_cmp_rlayers_force_hidden_passes(node);
+}
+
static int node_composit_poll_rlayers(bNodeType *UNUSED(ntype), bNodeTree *ntree)
{
if (strcmp(ntree->idname, "CompositorNodeTree") == 0) {
@@ -371,6 +449,7 @@ void register_node_type_cmp_rlayers(void)
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;
nodeRegisterType(&ntype);
diff --git a/source/blender/nodes/composite/nodes/node_composite_movieclip.c b/source/blender/nodes/composite/nodes/node_composite_movieclip.c
index b42b8d36c0c..fc0d8060644 100644
--- a/source/blender/nodes/composite/nodes/node_composite_movieclip.c
+++ b/source/blender/nodes/composite/nodes/node_composite_movieclip.c
@@ -33,6 +33,10 @@
#include "node_composite_util.h"
+#include "BKE_context.h"
+
+#include "RNA_access.h"
+
static bNodeSocketTemplate cmp_node_movieclip_out[] = {
{ SOCK_RGBA, 0, N_("Image")},
{ SOCK_FLOAT, 0, N_("Alpha")},
@@ -43,10 +47,13 @@ static bNodeSocketTemplate cmp_node_movieclip_out[] = {
{ -1, 0, "" }
};
-static void init(bNodeTree *UNUSED(ntree), bNode *node)
+static void init(const bContext *C, PointerRNA *ptr)
{
+ bNode *node = ptr->data;
+ Scene *scene = CTX_data_scene(C);
MovieClipUser *user = MEM_callocN(sizeof(MovieClipUser), "node movie clip user");
+ node->id = (ID *)scene->clip;
node->storage = user;
user->framenr = 1;
}
@@ -57,7 +64,7 @@ void register_node_type_cmp_movieclip(void)
cmp_node_type_base(&ntype, CMP_NODE_MOVIECLIP, "Movie Clip", NODE_CLASS_INPUT, NODE_PREVIEW);
node_type_socket_templates(&ntype, NULL, cmp_node_movieclip_out);
- node_type_init(&ntype, init);
+ ntype.initfunc_api = init;
node_type_storage(&ntype, "MovieClipUser", node_free_standard_storage, node_copy_standard_storage);
nodeRegisterType(&ntype);
diff --git a/source/blender/nodes/composite/nodes/node_composite_moviedistortion.c b/source/blender/nodes/composite/nodes/node_composite_moviedistortion.c
index 103a05f900e..b110cffd080 100644
--- a/source/blender/nodes/composite/nodes/node_composite_moviedistortion.c
+++ b/source/blender/nodes/composite/nodes/node_composite_moviedistortion.c
@@ -32,6 +32,10 @@
#include "node_composite_util.h"
+#include "BKE_context.h"
+
+#include "RNA_access.h"
+
/* **************** Translate ******************** */
static bNodeSocketTemplate cmp_node_moviedistortion_in[] = {
@@ -52,6 +56,14 @@ static const char *label(bNode *node)
return IFACE_("Distortion");
}
+static void init(const bContext *C, PointerRNA *ptr)
+{
+ bNode *node = ptr->data;
+ Scene *scene = CTX_data_scene(C);
+
+ node->id = (ID *)scene->clip;
+}
+
static void storage_free(bNode *node)
{
if (node->storage)
@@ -74,6 +86,7 @@ void register_node_type_cmp_moviedistortion(void)
node_type_socket_templates(&ntype, cmp_node_moviedistortion_in, cmp_node_moviedistortion_out);
node_type_label(&ntype, label);
+ ntype.initfunc_api = init;
node_type_storage(&ntype, NULL, storage_free, storage_copy);
nodeRegisterType(&ntype);
diff --git a/source/blender/nodes/composite/nodes/node_composite_outputFile.c b/source/blender/nodes/composite/nodes/node_composite_outputFile.c
index a6c59c1bc91..90b21f1bab0 100644
--- a/source/blender/nodes/composite/nodes/node_composite_outputFile.c
+++ b/source/blender/nodes/composite/nodes/node_composite_outputFile.c
@@ -179,6 +179,8 @@ static void init_output_file(const bContext *C, PointerRNA *ptr)
ImageFormatData *format = NULL;
node->storage = nimf;
+ node->id = &scene->id;
+
if (scene) {
RenderData *rd = &scene->r;
diff --git a/source/blender/nodes/composite/nodes/node_composite_splitViewer.c b/source/blender/nodes/composite/nodes/node_composite_splitViewer.c
index 6d1cd56fa4a..c3eb44281f5 100644
--- a/source/blender/nodes/composite/nodes/node_composite_splitViewer.c
+++ b/source/blender/nodes/composite/nodes/node_composite_splitViewer.c
@@ -32,6 +32,8 @@
#include "node_composite_util.h"
+#include "BKE_image.h"
+
/* **************** SPLIT VIEWER ******************** */
static bNodeSocketTemplate cmp_node_splitviewer_in[] = {
{ SOCK_RGBA, 1, N_("Image"), 0.0f, 0.0f, 0.0f, 1.0f},
@@ -47,6 +49,8 @@ static void node_composit_init_splitviewer(bNodeTree *UNUSED(ntree), bNode *node
iuser->fie_ima = 2;
iuser->ok = 1;
node->custom1 = 50; /* default 50% split */
+
+ node->id = (ID *)BKE_image_verify_viewer(IMA_TYPE_COMPOSITE, "Viewer Node");
}
void register_node_type_cmp_splitviewer(void)
diff --git a/source/blender/nodes/composite/nodes/node_composite_stabilize2d.c b/source/blender/nodes/composite/nodes/node_composite_stabilize2d.c
index 2daf240ab18..28e2a2a205b 100644
--- a/source/blender/nodes/composite/nodes/node_composite_stabilize2d.c
+++ b/source/blender/nodes/composite/nodes/node_composite_stabilize2d.c
@@ -33,6 +33,10 @@
#include "node_composite_util.h"
+#include "BKE_context.h"
+
+#include "RNA_access.h"
+
/* **************** Translate ******************** */
static bNodeSocketTemplate cmp_node_stabilize2d_in[] = {
@@ -45,8 +49,13 @@ static bNodeSocketTemplate cmp_node_stabilize2d_out[] = {
{ -1, 0, "" }
};
-static void init(bNodeTree *UNUSED(ntree), bNode *node)
+static void init(const bContext *C, PointerRNA *ptr)
{
+ bNode *node = ptr->data;
+ Scene *scene = CTX_data_scene(C);
+
+ node->id = (ID *)scene->clip;
+
/* default to bilinear, see node_sampler_type_items in rna_nodetree.c */
node->custom1 = 1;
}
@@ -57,7 +66,7 @@ void register_node_type_cmp_stabilize2d(void)
cmp_node_type_base(&ntype, CMP_NODE_STABILIZE2D, "Stabilize 2D", NODE_CLASS_DISTORT, 0);
node_type_socket_templates(&ntype, cmp_node_stabilize2d_in, cmp_node_stabilize2d_out);
- node_type_init(&ntype, init);
+ ntype.initfunc_api = init;
nodeRegisterType(&ntype);
}
diff --git a/source/blender/nodes/composite/nodes/node_composite_viewer.c b/source/blender/nodes/composite/nodes/node_composite_viewer.c
index 54d3f372c50..4b96270d36c 100644
--- a/source/blender/nodes/composite/nodes/node_composite_viewer.c
+++ b/source/blender/nodes/composite/nodes/node_composite_viewer.c
@@ -32,6 +32,8 @@
#include "node_composite_util.h"
+#include "BKE_image.h"
+
/* **************** VIEWER ******************** */
static bNodeSocketTemplate cmp_node_viewer_in[] = {
@@ -50,6 +52,8 @@ static void node_composit_init_viewer(bNodeTree *UNUSED(ntree), bNode *node)
iuser->ok = 1;
node->custom3 = 0.5f;
node->custom4 = 0.5f;
+
+ node->id = (ID *)BKE_image_verify_viewer(IMA_TYPE_COMPOSITE, "Viewer Node");
}
void register_node_type_cmp_viewer(void)