[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