[Bf-blender-cvs] [f1ce79c7333] temp-eevee-next-cryptomatte: Eevee: Cryptomatte sync meshes.
Jeroen Bakker
noreply at git.blender.org
Mon Aug 22 15:49:47 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