diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-11-08 17:13:43 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-11-08 17:15:29 +0300 |
commit | 146b39a45d4ad1b36a977d19984797f984f161ec (patch) | |
tree | c44be89db5b92c2ca5328933b3a1e6f891f77dbd /intern | |
parent | 3cf724209f619071555c1acce5958a13a11103e5 (diff) | |
parent | 116be3deffc087a61cdab452cd17bcaaf049a508 (diff) |
Merge branch 'master' into blender2.8
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/blender/blender_session.cpp | 28 | ||||
-rw-r--r-- | intern/cycles/blender/blender_session.h | 3 | ||||
-rw-r--r-- | intern/cycles/blender/blender_util.h | 6 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_types.h | 11 | ||||
-rw-r--r-- | intern/cycles/render/object.cpp | 34 | ||||
-rw-r--r-- | intern/cycles/render/object.h | 3 | ||||
-rw-r--r-- | intern/cycles/render/shader.cpp | 16 | ||||
-rw-r--r-- | intern/cycles/render/shader.h | 2 |
8 files changed, 98 insertions, 5 deletions
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp index 22a64df0c84..b639dcc4b00 100644 --- a/intern/cycles/blender/blender_session.cpp +++ b/intern/cycles/blender/blender_session.cpp @@ -35,6 +35,7 @@ #include "util/util_function.h" #include "util/util_hash.h" #include "util/util_logging.h" +#include "util/util_murmurhash.h" #include "util/util_progress.h" #include "util/util_time.h" @@ -382,6 +383,17 @@ void BlenderSession::update_render_tile(RenderTile& rtile, bool highlight) do_write_update_render_tile(rtile, false, false); } +static void add_cryptomatte_layer(BL::RenderResult& b_rr, string name, string manifest) +{ + string identifier = string_printf("%08x", util_murmur_hash3(name.c_str(), name.length(), 0)); + string prefix = "cryptomatte/" + identifier.substr(0, 7) + "/"; + + render_add_metadata(b_rr, prefix+"name", name); + render_add_metadata(b_rr, prefix+"hash", "MurmurHash3_32"); + render_add_metadata(b_rr, prefix+"conversion", "uint32_to_float32"); + render_add_metadata(b_rr, prefix+"manifest", manifest); +} + void BlenderSession::render(BL::Depsgraph& b_depsgraph_) { b_depsgraph = b_depsgraph_; @@ -405,6 +417,7 @@ void BlenderSession::render(BL::Depsgraph& b_depsgraph_) BL::RenderResult::layers_iterator b_single_rlay; b_rr.layers.begin(b_single_rlay); BL::RenderLayer b_rlay = *b_single_rlay; + b_rlay_name = b_view_layer.name(); /* add passes */ vector<Pass> passes = sync->sync_render_passes(b_rlay, b_view_layer, session_params); @@ -440,7 +453,6 @@ void BlenderSession::render(BL::Depsgraph& b_depsgraph_) BL::RenderResult::views_iterator b_view_iter; int view_index = 0; for(b_rr.views.begin(b_view_iter); b_view_iter != b_rr.views.end(); ++b_view_iter, ++view_index) { - b_rlay_name = b_view_layer.name(); b_rview_name = b_view_iter->name(); /* set the current view */ @@ -500,6 +512,20 @@ void BlenderSession::render(BL::Depsgraph& b_depsgraph_) */ } + /* Write cryptomatte metadata. */ + if(scene->film->cryptomatte_passes & CRYPT_OBJECT) { + add_cryptomatte_layer(b_rr, b_rlay_name+".CryptoObject", + scene->object_manager->get_cryptomatte_objects(scene)); + } + if(scene->film->cryptomatte_passes & CRYPT_MATERIAL) { + add_cryptomatte_layer(b_rr, b_rlay_name+".CryptoMaterial", + scene->shader_manager->get_cryptomatte_materials(scene)); + } + if(scene->film->cryptomatte_passes & CRYPT_ASSET) { + add_cryptomatte_layer(b_rr, b_rlay_name+".CryptoAsset", + scene->object_manager->get_cryptomatte_assets(scene)); + } + /* free result without merging */ end_render_result(b_engine, b_rr, true, true, false); diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h index 2be57f293b4..c83d3ee9aa3 100644 --- a/intern/cycles/blender/blender_session.h +++ b/intern/cycles/blender/blender_session.h @@ -172,6 +172,9 @@ protected: /* Update tile manager to reflect resumable render settings. */ void update_resumable_tile_manager(int num_samples); + + /* Add metadata for cryptomatte layers to the render result. */ + void add_cryptomatte_metadata(string layer_prefix); }; CCL_NAMESPACE_END diff --git a/intern/cycles/blender/blender_util.h b/intern/cycles/blender/blender_util.h index bb66359f4c7..02e3c292349 100644 --- a/intern/cycles/blender/blender_util.h +++ b/intern/cycles/blender/blender_util.h @@ -243,6 +243,12 @@ static inline float *image_get_float_pixels_for_frame(BL::Image& image, return BKE_image_get_float_pixels_for_frame(image.ptr.data, frame); } +static inline void render_add_metadata(BL::RenderResult& b_rr, string name, string value) +{ + b_rr.stamp_data_add_field(name.c_str(), value.c_str()); +} + + /* Utilities */ static inline Transform get_transform(const BL::Array<float, 16>& array) diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 7bc9855a807..14d5ff29bd8 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -1411,20 +1411,23 @@ typedef enum KernelBVHLayout { } KernelBVHLayout; typedef struct KernelBVH { - /* root node */ + /* Own BVH */ int root; int have_motion; int have_curves; int have_instancing; int bvh_layout; int use_bvh_steps; - int pad1; + + /* Embree */ #ifdef __EMBREE__ RTCScene scene; +# ifndef __KERNEL_64_BIT__ + int pad1; +# endif #else - void *unused; + int pad1, pad2; #endif - int pad2, pad3; } KernelBVH; static_assert_align(KernelBVH, 16); diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp index a56a8a6ec58..dc7a1043208 100644 --- a/intern/cycles/render/object.cpp +++ b/intern/cycles/render/object.cpp @@ -27,6 +27,7 @@ #include "util/util_logging.h" #include "util/util_map.h" #include "util/util_progress.h" +#include "util/util_set.h" #include "util/util_vector.h" #include "util/util_murmurhash.h" @@ -844,4 +845,37 @@ void ObjectManager::tag_update(Scene *scene) scene->light_manager->need_update = true; } +string ObjectManager::get_cryptomatte_objects(Scene *scene) +{ + string manifest = "{"; + + unordered_set<ustring, ustringHash> objects; + foreach(Object *object, scene->objects) { + if(objects.count(object->name)) { + continue; + } + objects.insert(object->name); + uint32_t hash_name = util_murmur_hash3(object->name.c_str(), object->name.length(), 0); + manifest += string_printf("\"%s\":\"%08x\",", object->name.c_str(), hash_name); + } + manifest[manifest.size()-1] = '}'; + return manifest; +} + +string ObjectManager::get_cryptomatte_assets(Scene *scene) +{ + string manifest = "{"; + unordered_set<ustring, ustringHash> assets; + foreach(Object *ob, scene->objects) { + if(assets.count(ob->asset_name)) { + continue; + } + assets.insert(ob->asset_name); + uint32_t hash_asset = util_murmur_hash3(ob->asset_name.c_str(), ob->asset_name.length(), 0); + manifest += string_printf("\"%s\":\"%08x\",", ob->asset_name.c_str(), hash_asset); + } + manifest[manifest.size()-1] = '}'; + return manifest; +} + CCL_NAMESPACE_END diff --git a/intern/cycles/render/object.h b/intern/cycles/render/object.h index bd44b35aba3..288c3f5457a 100644 --- a/intern/cycles/render/object.h +++ b/intern/cycles/render/object.h @@ -116,6 +116,9 @@ public: void apply_static_transforms(DeviceScene *dscene, Scene *scene, Progress& progress); + string get_cryptomatte_objects(Scene *scene); + string get_cryptomatte_assets(Scene *scene); + protected: void device_update_object_transform(UpdateObjectTransformState *state, Object *ob, diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp index 4fce4b79f49..86860bbc8ac 100644 --- a/intern/cycles/render/shader.cpp +++ b/intern/cycles/render/shader.cpp @@ -700,4 +700,20 @@ float ShaderManager::linear_rgb_to_gray(float3 c) return dot(c, rgb_to_y); } +string ShaderManager::get_cryptomatte_materials(Scene *scene) +{ + string manifest = "{"; + unordered_set<ustring, ustringHash> materials; + foreach(Shader *shader, scene->shaders) { + if(materials.count(shader->name)) { + continue; + } + materials.insert(shader->name); + uint32_t cryptomatte_id = util_murmur_hash3(shader->name.c_str(), shader->name.length(), 0); + manifest += string_printf("\"%s\":\"%08x\",", shader->name.c_str(), cryptomatte_id); + } + manifest[manifest.size()-1] = '}'; + return manifest; +} + CCL_NAMESPACE_END diff --git a/intern/cycles/render/shader.h b/intern/cycles/render/shader.h index e898d984f5a..890208c4bf8 100644 --- a/intern/cycles/render/shader.h +++ b/intern/cycles/render/shader.h @@ -198,6 +198,8 @@ public: float linear_rgb_to_gray(float3 c); + string get_cryptomatte_materials(Scene *scene); + protected: ShaderManager(); |