Cryptomatte layer initialization required the active scene to update the image user frame, but the image user is already updated through other mechanisms and is thus redundant to do at draw time, so we remove the frame update call as well as the scene argument from the call chain. The frame number of the image user is ignored at compositing time in any case since it is set to the compositing scene frame. This is needed for #124738.
102 lines
3.9 KiB
C++
102 lines
3.9 KiB
C++
/* SPDX-FileCopyrightText: 2005 Blender Authors
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
/** \file
|
|
* \ingroup nodes
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "BKE_node.hh"
|
|
|
|
namespace blender::realtime_compositor {
|
|
class RenderContext;
|
|
class Profiler;
|
|
} // namespace blender::realtime_compositor
|
|
namespace blender::bke {
|
|
struct bNodeTreeType;
|
|
} // namespace blender::bke
|
|
|
|
struct CryptomatteSession;
|
|
struct Scene;
|
|
struct RenderData;
|
|
struct Render;
|
|
struct ViewLayer;
|
|
|
|
extern blender::bke::bNodeTreeType *ntreeType_Composite;
|
|
|
|
void node_cmp_rlayers_outputs(bNodeTree *ntree, bNode *node);
|
|
void node_cmp_rlayers_register_pass(bNodeTree *ntree,
|
|
bNode *node,
|
|
Scene *scene,
|
|
ViewLayer *view_layer,
|
|
const char *name,
|
|
eNodeSocketDatatype type);
|
|
const char *node_cmp_rlayers_sock_to_pass(int sock_index);
|
|
|
|
void register_node_type_cmp_custom_group(blender::bke::bNodeType *ntype);
|
|
|
|
void ntreeCompositExecTree(Render *render,
|
|
Scene *scene,
|
|
bNodeTree *ntree,
|
|
RenderData *rd,
|
|
const char *view_name,
|
|
blender::realtime_compositor::RenderContext *render_context,
|
|
blender::realtime_compositor::Profiler *profiler);
|
|
|
|
/**
|
|
* Called from render pipeline, to tag render input and output.
|
|
* need to do all scenes, to prevent errors when you re-render 1 scene.
|
|
*/
|
|
void ntreeCompositTagRender(Scene *scene);
|
|
|
|
void ntreeCompositTagNeedExec(bNode *node);
|
|
|
|
/**
|
|
* Update the outputs of the render layer nodes.
|
|
* Since the outputs depend on the render engine, this part is a bit complex:
|
|
* - #ntreeCompositUpdateRLayers is called and loops over all render layer nodes.
|
|
* - Each render layer node calls the update function of the
|
|
* render engine that's used for its scene.
|
|
* - The render engine calls RE_engine_register_pass for each pass.
|
|
* - #RE_engine_register_pass calls #node_cmp_rlayers_register_pass.
|
|
*/
|
|
void ntreeCompositUpdateRLayers(bNodeTree *ntree);
|
|
|
|
void ntreeCompositClearTags(bNodeTree *ntree);
|
|
|
|
bNodeSocket *ntreeCompositOutputFileAddSocket(bNodeTree *ntree,
|
|
bNode *node,
|
|
const char *name,
|
|
const ImageFormatData *im_format);
|
|
|
|
int ntreeCompositOutputFileRemoveActiveSocket(bNodeTree *ntree, bNode *node);
|
|
void ntreeCompositOutputFileSetPath(bNode *node, bNodeSocket *sock, const char *name);
|
|
void ntreeCompositOutputFileSetLayer(bNode *node, bNodeSocket *sock, const char *name);
|
|
/* needed in do_versions */
|
|
void ntreeCompositOutputFileUniquePath(ListBase *list,
|
|
bNodeSocket *sock,
|
|
const char defname[],
|
|
char delim);
|
|
void ntreeCompositOutputFileUniqueLayer(ListBase *list,
|
|
bNodeSocket *sock,
|
|
const char defname[],
|
|
char delim);
|
|
|
|
void ntreeCompositColorBalanceSyncFromLGG(bNodeTree *ntree, bNode *node);
|
|
void ntreeCompositColorBalanceSyncFromCDL(bNodeTree *ntree, bNode *node);
|
|
|
|
void ntreeCompositCryptomatteSyncFromAdd(bNode *node);
|
|
void ntreeCompositCryptomatteSyncFromRemove(bNode *node);
|
|
bNodeSocket *ntreeCompositCryptomatteAddSocket(bNodeTree *ntree, bNode *node);
|
|
int ntreeCompositCryptomatteRemoveSocket(bNodeTree *ntree, bNode *node);
|
|
void ntreeCompositCryptomatteLayerPrefix(const bNode *node, char *r_prefix, size_t prefix_maxncpy);
|
|
|
|
/**
|
|
* Update the runtime layer names with the crypto-matte layer names of the references render layer
|
|
* or image.
|
|
*/
|
|
void ntreeCompositCryptomatteUpdateLayerNames(bNode *node);
|
|
CryptomatteSession *ntreeCompositCryptomatteSession(bNode *node);
|