[Bf-blender-cvs] [e66e964fe88] compositor-cryptomatte-workflow: Merge branch 'master' into compositor-cryptomatte-workflow
Jeroen Bakker
noreply at git.blender.org
Tue Mar 9 15:49:52 CET 2021
Commit: e66e964fe88e7f8e4c1f7efaca0ba71a61a4a013
Author: Jeroen Bakker
Date: Tue Mar 9 15:29:49 2021 +0100
Branches: compositor-cryptomatte-workflow
https://developer.blender.org/rBe66e964fe88e7f8e4c1f7efaca0ba71a61a4a013
Merge branch 'master' into compositor-cryptomatte-workflow
===================================================================
===================================================================
diff --cc source/blender/blenkernel/BKE_cryptomatte.hh
index b3560c51578,98fdfc965bc..9e205d01765
--- a/source/blender/blenkernel/BKE_cryptomatte.hh
+++ b/source/blender/blenkernel/BKE_cryptomatte.hh
@@@ -105,7 -105,13 +107,16 @@@ struct CryptomatteStampDataCallbackDat
static void extract_layer_manifest(void *_data, const char *propname, char *propvalue, int len);
};
+const blender::Vector<std::string> &BKE_cryptomatte_layer_names_get(
+ const CryptomatteSession &session);
+
+ struct CryptomatteSessionDeleter {
+ void operator()(CryptomatteSession *session)
+ {
+ BKE_cryptomatte_free(session);
+ }
+ };
+
+ using CryptomatteSessionPtr = std::unique_ptr<CryptomatteSession, CryptomatteSessionDeleter>;
+
} // namespace blender::bke::cryptomatte
diff --cc source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc
index 615ae2541b2,84cd84e41c7..3c899234672
--- a/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc
+++ b/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc
@@@ -26,74 -24,8 +26,76 @@@
#include "BLI_assert.h"
#include "BLI_dynstr.h"
#include "BLI_hash_mm3.h"
+#include "BLI_string_ref.hh"
#include "BLI_utildefines.h"
-#include "node_composite_util.h"
+
+#include "BKE_context.h"
+#include "BKE_cryptomatte.hh"
+#include "BKE_global.h"
+#include "BKE_lib_id.h"
+#include "BKE_library.h"
+#include "BKE_main.h"
+
+#include <optional>
+
- static CryptomatteSession *cryptomatte_init_from_node(const bNode &node,
- const int frame_number,
- const bool use_meta_data)
++static blender::bke::cryptomatte::CryptomatteSessionPtr cryptomatte_init_from_node(
++ const bNode &node, const int frame_number, const bool use_meta_data)
+{
+ if (node.type != CMP_NODE_CRYPTOMATTE) {
+ return nullptr;
+ }
+
+ NodeCryptomatte *node_cryptomatte = static_cast<NodeCryptomatte *>(node.storage);
- CryptomatteSession *session = nullptr;
++ blender::bke::cryptomatte::CryptomatteSessionPtr session;
+ switch (node.custom1) {
+ case CMP_CRYPTOMATTE_SRC_RENDER: {
+ Scene *scene = (Scene *)node.id;
+ if (!scene) {
+ return nullptr;
+ }
+ BLI_assert(GS(scene->id.name) == ID_SCE);
+
+ if (use_meta_data) {
+ Render *render = (scene) ? RE_GetSceneRender(scene) : nullptr;
+ RenderResult *render_result = render ? RE_AcquireResultRead(render) : nullptr;
+ if (render_result) {
- session = BKE_cryptomatte_init_from_render_result(render_result);
++ session = blender::bke::cryptomatte::CryptomatteSessionPtr(
++ BKE_cryptomatte_init_from_render_result(render_result));
+ }
+ if (render) {
+ RE_ReleaseResult(render);
+ }
+ }
+
+ if (session == nullptr) {
- session = BKE_cryptomatte_init_from_scene(scene);
++ session = blender::bke::cryptomatte::CryptomatteSessionPtr(
++ BKE_cryptomatte_init_from_scene(scene));
+ }
+
+ break;
+ }
+
+ case CMP_CRYPTOMATTE_SRC_IMAGE: {
+ Image *image = (Image *)node.id;
+ BLI_assert(!image || GS(image->id.name) == ID_IM);
+ if (!image || image->type != IMA_TYPE_MULTILAYER) {
+ break;
+ }
+
+ ImageUser *iuser = &node_cryptomatte->iuser;
+ BKE_image_user_frame_calc(image, iuser, frame_number);
+ ImBuf *ibuf = BKE_image_acquire_ibuf(image, iuser, NULL);
+ RenderResult *render_result = image->rr;
+ if (render_result) {
- session = BKE_cryptomatte_init_from_render_result(render_result);
++ session = blender::bke::cryptomatte::CryptomatteSessionPtr(
++ BKE_cryptomatte_init_from_render_result(render_result));
+ }
+ BKE_image_release_ibuf(image, ibuf, NULL);
+ break;
+ }
+ }
+ return session;
+}
extern "C" {
static CryptomatteEntry *cryptomatte_find(const NodeCryptomatte &n, float encoded_hash)
@@@ -106,29 -38,21 +108,29 @@@
return nullptr;
}
-static void cryptomatte_add(NodeCryptomatte &n, float f)
+static void cryptomatte_add(bNode &node, NodeCryptomatte &node_cryptomatte, float encoded_hash)
{
/* Check if entry already exist. */
- if (cryptomatte_find(n, f)) {
+ if (cryptomatte_find(node_cryptomatte, encoded_hash)) {
return;
}
+
CryptomatteEntry *entry = static_cast<CryptomatteEntry *>(
MEM_callocN(sizeof(CryptomatteEntry), __func__));
- entry->encoded_hash = f;
- BLI_addtail(&n.entries, entry);
+ entry->encoded_hash = encoded_hash;
+ /* TODO(jbakker): Get current frame from scene. */
- CryptomatteSession *session = cryptomatte_init_from_node(node, 0, true);
++ blender::bke::cryptomatte::CryptomatteSessionPtr session = cryptomatte_init_from_node(
++ node, 0, true);
+ if (session) {
- BKE_cryptomatte_find_name(session, encoded_hash, entry->name, sizeof(entry->name));
- BKE_cryptomatte_free(session);
++ BKE_cryptomatte_find_name(session.get(), encoded_hash, entry->name, sizeof(entry->name));
+ }
+
+ BLI_addtail(&node_cryptomatte.entries, entry);
}
-static void cryptomatte_remove(NodeCryptomatte &n, float f)
+static void cryptomatte_remove(NodeCryptomatte &n, float encoded_hash)
{
- CryptomatteEntry *entry = cryptomatte_find(n, f);
+ CryptomatteEntry *entry = cryptomatte_find(n, encoded_hash);
if (!entry) {
return;
}
@@@ -155,63 -76,39 +157,60 @@@ void ntreeCompositCryptomatteSyncFromAd
}
}
-void ntreeCompositCryptomatteSyncFromRemove(bNodeTree *UNUSED(ntree), bNode *node)
+void ntreeCompositCryptomatteSyncFromRemove(bNode *node)
{
NodeCryptomatte *n = static_cast<NodeCryptomatte *>(node->storage);
- if (n->remove[0] != 0.0f) {
- cryptomatte_remove(*n, n->remove[0]);
- zero_v3(n->remove);
+ if (n->runtime.remove[0] != 0.0f) {
+ cryptomatte_remove(*n, n->runtime.remove[0]);
+ zero_v3(n->runtime.remove);
}
}
-
-bNodeSocket *ntreeCompositCryptomatteAddSocket(bNodeTree *ntree, bNode *node)
+void ntreeCompositCryptomatteUpdateLayerNames(bNode *node)
{
NodeCryptomatte *n = static_cast<NodeCryptomatte *>(node->storage);
- char sockname[32];
- n->num_inputs++;
- BLI_snprintf(sockname, sizeof(sockname), "Crypto %.2d", n->num_inputs - 1);
- bNodeSocket *sock = nodeAddStaticSocket(
- ntree, node, SOCK_IN, SOCK_RGBA, PROP_NONE, nullptr, sockname);
- return sock;
+ BLI_freelistN(&n->runtime.layers);
+
- CryptomatteSession *session = cryptomatte_init_from_node(*node, 0, false);
++ blender::bke::cryptomatte::CryptomatteSessionPtr session = cryptomatte_init_from_node(
++ *node, 0, false);
+
+ if (session) {
+ for (blender::StringRef layer_name :
+ blender::bke::cryptomatte::BKE_cryptomatte_layer_names_get(*session)) {
+ CryptomatteLayer *layer = static_cast<CryptomatteLayer *>(
+ MEM_callocN(sizeof(CryptomatteLayer), __func__));
+ layer_name.copy(layer->name);
+ BLI_addtail(&n->runtime.layers, layer);
+ }
-
- BKE_cryptomatte_free(session);
+ }
}
-int ntreeCompositCryptomatteRemoveSocket(bNodeTree *ntree, bNode *node)
+const char *ntreeCompositCryptomatteLayerPrefix(const bNode *node)
{
- NodeCryptomatte *n = static_cast<NodeCryptomatte *>(node->storage);
- if (n->num_inputs < 2) {
- return 0;
+ NodeCryptomatte *node_cryptomatte = (NodeCryptomatte *)node->storage;
- CryptomatteSession *session = cryptomatte_init_from_node(*node, 0, false);
++ blender::bke::cryptomatte::CryptomatteSessionPtr session = cryptomatte_init_from_node(
++ *node, 0, false);
+ std::optional<std::string> first_layer_name = std::nullopt;
+
+ if (session) {
+ for (blender::StringRef layer_name :
+ blender::bke::cryptomatte::BKE_cryptomatte_layer_names_get(*session)) {
+ if (!first_layer_name.has_value()) {
+ first_layer_name = layer_name;
+ }
+
+ if (layer_name == node_cryptomatte->layer_name) {
- BKE_cryptomatte_free(session);
+ return node_cryptomatte->layer_name;
+ }
+ }
-
- BKE_cryptomatte_free(session);
}
- bNodeSocket *sock = static_cast<bNodeSocket *>(node->inputs.last);
- nodeRemoveSocket(ntree, node, sock);
- n->num_inputs--;
- return 1;
+
+ if (!first_layer_name.has_value()) {
+ return "";
+ }
+ return first_layer_name.value().c_str();
}
-static void init(bNodeTree *ntree, bNode *node)
+static void node_init_cryptomatte(bNodeTree *UNUSED(ntree), bNode *node)
{
NodeCryptomatte *user = static_cast<NodeCryptomatte *>(
MEM_callocN(sizeof(NodeCryptomatte), __func__));
More information about the Bf-blender-cvs
mailing list