Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2018-11-08 17:13:43 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2018-11-08 17:15:29 +0300
commit146b39a45d4ad1b36a977d19984797f984f161ec (patch)
treec44be89db5b92c2ca5328933b3a1e6f891f77dbd /intern/cycles
parent3cf724209f619071555c1acce5958a13a11103e5 (diff)
parent116be3deffc087a61cdab452cd17bcaaf049a508 (diff)
Merge branch 'master' into blender2.8
Diffstat (limited to 'intern/cycles')
-rw-r--r--intern/cycles/blender/blender_session.cpp28
-rw-r--r--intern/cycles/blender/blender_session.h3
-rw-r--r--intern/cycles/blender/blender_util.h6
-rw-r--r--intern/cycles/kernel/kernel_types.h11
-rw-r--r--intern/cycles/render/object.cpp34
-rw-r--r--intern/cycles/render/object.h3
-rw-r--r--intern/cycles/render/shader.cpp16
-rw-r--r--intern/cycles/render/shader.h2
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();