[Bf-blender-cvs] [f1ce79c7333] temp-eevee-next-cryptomatte: Eevee: Cryptomatte sync meshes.

Jeroen Bakker noreply at git.blender.org
Tue Aug 9 14:36:07 CEST 2022


Commit: f1ce79c7333cec9bb97c4afb3414c72739f915a9
Author: Jeroen Bakker
Date:   Tue Aug 9 00:50:51 2022 +0200
Branches: temp-eevee-next-cryptomatte
https://developer.blender.org/rBf1ce79c7333cec9bb97c4afb3414c72739f915a9

Eevee: Cryptomatte sync meshes.

===================================================================

M	source/blender/draw/engines/eevee_next/eevee_cryptomatte.cc
M	source/blender/draw/engines/eevee_next/eevee_cryptomatte.hh
M	source/blender/draw/engines/eevee_next/eevee_sync.cc

===================================================================

diff --git a/source/blender/draw/engines/eevee_next/eevee_cryptomatte.cc b/source/blender/draw/engines/eevee_next/eevee_cryptomatte.cc
index a611a9f57e5..5207d588d44 100644
--- a/source/blender/draw/engines/eevee_next/eevee_cryptomatte.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_cryptomatte.cc
@@ -1,3 +1,7 @@
+#include "BKE_cryptomatte.h"
+
+#include "GPU_material.h"
+
 #include "eevee_cryptomatte.hh"
 #include "eevee_instance.hh"
 #include "eevee_renderbuffers.hh"
@@ -29,6 +33,91 @@ void Cryptomatte::sync()
   hair_grp_ = DRW_shgroup_create(sh_curves, cryptomatte_ps_);
 }
 
+static float hash_id(const ID *id)
+{
+  const char *name = &id->name[2];
+  const int name_len = BLI_strnlen(name, MAX_NAME - 2);
+  uint32_t cryptomatte_hash = BKE_cryptomatte_hash(name, name_len);
+  return BKE_cryptomatte_hash_to_float(cryptomatte_hash);
+}
+
+void Cryptomatte::add_hash(const Object *object, float4 &r_hash) const
+{
+  if (object_offset_ != -1) {
+    r_hash[object_offset_] = hash_id(&object->id);
+  }
+
+  if (asset_offset_ != -1) {
+    const Object *asset_object = object;
+    while (asset_object->parent != nullptr) {
+      asset_object = asset_object->parent;
+    }
+    r_hash[asset_offset_] = hash_id(&asset_object->id);
+  }
+}
+
+void Cryptomatte::add_hash(const ::Material *mat, float4 &r_hash) const
+{
+  if (material_offset_ != -1) {
+    r_hash[material_offset_] = mat ? hash_id(&mat->id) : 0.0f;
+  }
+}
+
+void Cryptomatte::sync_mesh(Object *ob)
+{
+  if (layer_len_ == 0) {
+    return;
+  }
+
+  float4 hash(0.0f, 0.0f, 0.0f, 0.0f);
+  add_hash(ob, hash);
+
+  // TODO(jbakker): decide based on availability of surface geom if we should have an optimzied
+  // path, or that it has more overhead (memory)
+  if (material_offset_ == -1) {
+    GPUBatch *geom = DRW_cache_object_surface_get(ob);
+    if (geom) {
+      DRWShadingGroup *grp = DRW_shgroup_create_sub(mesh_grp_);
+      DRW_shgroup_uniform_vec4_copy(grp, "cryptomatte_hash", hash);
+      DRW_shgroup_call(grp, geom, ob);
+    }
+  }
+  else {
+    bool has_motion = false;
+    // TODO:  inst_.velocity.step_object_sync(ob, ob_handle.object_key,
+    // ob_handle.recalc);
+
+    MaterialArray &material_array = inst_.materials.material_array_get(ob, has_motion);
+
+    GPUBatch **mat_geom = DRW_cache_object_surface_material_get(
+        ob, material_array.gpu_materials.data(), material_array.gpu_materials.size());
+
+    if (mat_geom == nullptr) {
+      return;
+    }
+
+    for (auto i : material_array.gpu_materials.index_range()) {
+      GPUBatch *geom = mat_geom[i];
+      if (geom == nullptr) {
+        continue;
+      }
+      const ::Material *material = GPU_material_get_material(material_array.gpu_materials[i]);
+      add_hash(material, hash);
+      DRWShadingGroup *grp = DRW_shgroup_create_sub(mesh_grp_);
+      DRW_shgroup_uniform_vec4_copy(grp, "cryptomatte_hash", hash);
+      DRW_shgroup_call(grp, geom, ob);
+    }
+  }
+}
+
+void Cryptomatte::sync_curves(Object *ob, ModifierData *modifier_data)
+{
+  if (layer_len_ == 0) {
+    return;
+  }
+  BLI_assert_msg(false, "Not implemented yet");
+}
+
 void Cryptomatte::render()
 {
   if (layer_len_ == 0) {
diff --git a/source/blender/draw/engines/eevee_next/eevee_cryptomatte.hh b/source/blender/draw/engines/eevee_next/eevee_cryptomatte.hh
index 578eea77fe8..ea533c51cff 100644
--- a/source/blender/draw/engines/eevee_next/eevee_cryptomatte.hh
+++ b/source/blender/draw/engines/eevee_next/eevee_cryptomatte.hh
@@ -17,6 +17,10 @@
 
 #include "eevee_shader_shared.hh"
 
+extern "C" {
+struct Material;
+}
+
 namespace blender::eevee {
 
 class Instance;
@@ -52,8 +56,14 @@ class Cryptomatte {
   void init();
 
   void sync();
-  void object_sync(Object *ob);
+  void sync_mesh(Object *ob);
+  void sync_curves(Object *object, ModifierData *modifier_data);
+  void sync_gpencil();  // TODO
   void render();
+
+ private:
+  void add_hash(const Object *object, float4 &r_hash) const;
+  void add_hash(const Material *material, float4 &r_hash) const;
 };
 
 /** \} */
diff --git a/source/blender/draw/engines/eevee_next/eevee_sync.cc b/source/blender/draw/engines/eevee_next/eevee_sync.cc
index e2d4b0ac1c2..2abc4bcda95 100644
--- a/source/blender/draw/engines/eevee_next/eevee_sync.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_sync.cc
@@ -131,6 +131,7 @@ void SyncModule::sync_mesh(Object *ob, ObjectHandle &ob_handle)
     is_alpha_blend = is_alpha_blend || material->is_alpha_blend_transparent;
   }
 
+  inst_.cryptomatte.sync_mesh(ob);
   // shadows.sync_object(ob, ob_handle, is_shadow_caster, is_alpha_blend);
 }
 
@@ -317,6 +318,7 @@ void SyncModule::sync_curves(Object *ob, ObjectHandle &ob_handle, ModifierData *
   shgroup_curves_call(material.prepass, ob, part_sys, modifier_data);
   shgroup_curves_call(material.shadow, ob, part_sys, modifier_data);
 
+  inst_.cryptomatte.sync_curves(ob, modifier_data);
   /* TODO(fclem) Hair velocity. */
   // shading_passes.velocity.gpencil_add(ob, ob_handle);



More information about the Bf-blender-cvs mailing list