Commit: 850647d934d2e7d99216b90b630cecd914f9597f
Author: Stefan Werner
Date:   Fri Oct 13 10:47:33 2017 +0200
Branches: temp_cryptomatte
https://developer.blender.org/rB850647d934d2e7d99216b90b630cecd914f9597f

Cycles: Cryptomatte layers are now always written in single precision float to 
OpenEXR files

Cryptomatte layers are now always written in single precision float to OpenEXR 
files, even when the file format is set to half precision. Cryptomatte requires 
single precision (32 bit float), its data gets destroyed when it is converted 
to 16 bit float.

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

M       intern/cycles/blender/blender_sync.cpp
M       source/blender/makesdna/DNA_scene_types.h
M       source/blender/makesrna/intern/rna_render.c
M       source/blender/render/extern/include/RE_engine.h
M       source/blender/render/extern/include/RE_pipeline.h
M       source/blender/render/intern/include/render_result.h
M       source/blender/render/intern/source/external_engine.c
M       source/blender/render/intern/source/render_result.c

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

diff --git a/intern/cycles/blender/blender_sync.cpp 
b/intern/cycles/blender/blender_sync.cpp
index 539772cfa57..b58758991ba 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -580,7 +580,7 @@ void BlenderSync::sync_film(BL::RenderLayer& b_rlay,
                                AOV aov = {ustring(passname), 9999, 
AOV_CRYPTOMATTE};
                                passes.add(aov);
                                passname = "AOV " + passname;
-                               b_engine.add_pass(passname.c_str(), 4, "RGBA", 
b_srlay.name().c_str());
+                               b_engine.add_pass(passname.c_str(), 4, "RGBA", 
b_srlay.name().c_str(), 2);
                        }
                        scene->film->use_cryptomatte |= CRYPT_OBJECT;
                }
@@ -591,7 +591,7 @@ void BlenderSync::sync_film(BL::RenderLayer& b_rlay,
                                AOV aov = {ustring(passname), 9999, 
AOV_CRYPTOMATTE};
                                passes.add(aov);
                                passname = "AOV " + passname;
-                               b_engine.add_pass(passname.c_str(), 4, "RGBA", 
b_srlay.name().c_str());
+                               b_engine.add_pass(passname.c_str(), 4, "RGBA", 
b_srlay.name().c_str(), 2);
                        }
                        scene->film->use_cryptomatte |= CRYPT_MATERIAL;
                }
@@ -602,7 +602,7 @@ void BlenderSync::sync_film(BL::RenderLayer& b_rlay,
                                AOV aov = {ustring(passname), 9999, 
AOV_CRYPTOMATTE};
                                passes.add(aov);
                                passname = "AOV " + passname;
-                               b_engine.add_pass(passname.c_str(), 4, "RGBA", 
b_srlay.name().c_str());
+                               b_engine.add_pass(passname.c_str(), 4, "RGBA", 
b_srlay.name().c_str(), 2);
                        }
                        scene->film->use_cryptomatte |= CRYPT_ASSET;
                }
@@ -616,38 +616,38 @@ void BlenderSync::sync_film(BL::RenderLayer& b_rlay,
                        AOV aov = {ustring(name), 9999, is_color ? AOV_RGB : 
AOV_FLOAT};
                        passes.add(aov);
                        string passname = string_printf("AOV %s", name.c_str());
-                       b_engine.add_pass(passname.c_str(), is_color ? 3 : 1, 
is_color ? "RGB" : "X", b_srlay.name().c_str());
+                       b_engine.add_pass(passname.c_str(), is_color? 3: 1, 
is_color? "RGB": "X", b_srlay.name().c_str(), 0);
                } RNA_END
 
                PointerRNA crp = RNA_pointer_get(&b_srlay.ptr, "cycles");
                if(get_boolean(crp, "denoising_store_passes") &&
                   get_boolean(crp, "use_denoising")) {
-                       b_engine.add_pass("Denoising Normal",          3, 
"XYZ", b_srlay.name().c_str());
-                       b_engine.add_pass("Denoising Normal Variance", 3, 
"XYZ", b_srlay.name().c_str());
-                       b_engine.add_pass("Denoising Albedo",          3, 
"RGB", b_srlay.name().c_str());
-                       b_engine.add_pass("Denoising Albedo Variance", 3, 
"RGB", b_srlay.name().c_str());
-                       b_engine.add_pass("Denoising Depth",           1, "Z",  
 b_srlay.name().c_str());
-                       b_engine.add_pass("Denoising Depth Variance",  1, "Z",  
 b_srlay.name().c_str());
-                       b_engine.add_pass("Denoising Shadow A",        3, 
"XYV", b_srlay.name().c_str());
-                       b_engine.add_pass("Denoising Shadow B",        3, 
"XYV", b_srlay.name().c_str());
-                       b_engine.add_pass("Denoising Image",           3, 
"RGB", b_srlay.name().c_str());
-                       b_engine.add_pass("Denoising Image Variance",  3, 
"RGB", b_srlay.name().c_str());
+                       b_engine.add_pass("Denoising Normal",          3, 
"XYZ", b_srlay.name().c_str(), 0);
+                       b_engine.add_pass("Denoising Normal Variance", 3, 
"XYZ", b_srlay.name().c_str(), 0);
+                       b_engine.add_pass("Denoising Albedo",          3, 
"RGB", b_srlay.name().c_str(), 0);
+                       b_engine.add_pass("Denoising Albedo Variance", 3, 
"RGB", b_srlay.name().c_str(), 0);
+                       b_engine.add_pass("Denoising Depth",           1, "Z",  
 b_srlay.name().c_str(), 0);
+                       b_engine.add_pass("Denoising Depth Variance",  1, "Z",  
 b_srlay.name().c_str(), 0);
+                       b_engine.add_pass("Denoising Shadow A",        3, 
"XYV", b_srlay.name().c_str(), 0);
+                       b_engine.add_pass("Denoising Shadow B",        3, 
"XYV", b_srlay.name().c_str(), 0);
+                       b_engine.add_pass("Denoising Image",           3, 
"RGB", b_srlay.name().c_str(), 0);
+                       b_engine.add_pass("Denoising Image Variance",  3, 
"RGB", b_srlay.name().c_str(), 0);
                }
 #ifdef __KERNEL_DEBUG__
                if(get_boolean(crp, "pass_debug_bvh_traversed_nodes")) {
-                       b_engine.add_pass("Debug BVH Traversed Nodes", 1, "X", 
b_srlay.name().c_str());
+                       b_engine.add_pass("Debug BVH Traversed Nodes", 1, "X", 
b_srlay.name().c_str(), 0);
                        passes.add(PASS_BVH_TRAVERSED_NODES);
                }
                if(get_boolean(crp, "pass_debug_bvh_traversed_instances")) {
-                       b_engine.add_pass("Debug BVH Traversed Instances", 1, 
"X", b_srlay.name().c_str());
+                       b_engine.add_pass("Debug BVH Traversed Instances", 1, 
"X", b_srlay.name().c_str(), 0);
                        Pass::add(PASS_BVH_TRAVERSED_INSTANCES);
                }
                if(get_boolean(crp, "pass_debug_bvh_intersections")) {
-                       b_engine.add_pass("Debug BVH Intersections", 1, "X", 
b_srlay.name().c_str());
+                       b_engine.add_pass("Debug BVH Intersections", 1, "X", 
b_srlay.name().c_str(), 0);
                        passes.add(PASS_BVH_INTERSECTIONS);
                }
                if(get_boolean(crp, "pass_debug_ray_bounces")) {
-                       b_engine.add_pass("Debug Ray Bounces", 1, "X", 
b_srlay.name().c_str());
+                       b_engine.add_pass("Debug Ray Bounces", 1, "X", 
b_srlay.name().c_str(), 0);
                        passes.add(PASS_RAY_BOUNCES);
                }
 #endif
diff --git a/source/blender/makesdna/DNA_scene_types.h 
b/source/blender/makesdna/DNA_scene_types.h
index b9f19a36072..3a11bece4ab 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -286,6 +286,12 @@ typedef enum eScenePassType {
 #define RE_PASSNAME_SUBSURFACE_INDIRECT "SubsurfaceInd"
 #define RE_PASSNAME_SUBSURFACE_COLOR "SubsurfaceCol"
 
+/* Should these be replaced with R_IMF_CHAN_DEPTH_* #defines? */
+#define RE_PIXEL_TYPE_ANY 0
+#define RE_PIXEL_TYPE_HALF 1
+#define RE_PIXEL_TYPE_FLOAT 2
+
+
 /* note, srl->passflag is treestore element 'nr' in outliner, short still... */
 
 /* View - MultiView */
diff --git a/source/blender/makesrna/intern/rna_render.c 
b/source/blender/makesrna/intern/rna_render.c
index d3b3ed51981..50176e4aeb7 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -469,6 +469,13 @@ static void rna_def_render_engine(BlenderRNA *brna)
                {0, NULL, 0, NULL, NULL}
        };
 
+       static EnumPropertyItem render_pixel_type_items[] = {
+               {RE_PIXEL_TYPE_ANY,   "ANY",     0,    "Any",    ""},
+               {RE_PIXEL_TYPE_HALF,  "HALF",    0,    "Half",    ""},
+               {RE_PIXEL_TYPE_FLOAT, "FLOAT",   0,    "Float",   ""},
+               {0, NULL, 0, NULL, NULL}
+       };
+
        srna = RNA_def_struct(brna, "RenderEngine", NULL);
        RNA_def_struct_sdna(srna, "RenderEngine");
        RNA_def_struct_ui_text(srna, "Render Engine", "Render engine");
@@ -580,6 +587,8 @@ static void rna_def_render_engine(BlenderRNA *brna)
        parm = RNA_def_string(func, "chan_id", NULL, 0, "Channel IDs", "Channel 
names, one character per channel");
        RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
        RNA_def_string(func, "layer", NULL, 0, "Layer", "Single layer to add 
render pass to");  /* NULL ok here */
+       parm = RNA_def_enum(func, "type", render_pixel_type_items, 
RE_PIXEL_TYPE_ANY, "Pixel Type", "");
+       RNA_def_parameter_flags(parm, 0, PARM_PYFUNC_OPTIONAL);
 
        func = RNA_def_function(srna, "get_result", "RE_engine_get_result");
        RNA_def_function_ui_description(func, "Get final result for non-pixel 
operations");
diff --git a/source/blender/render/extern/include/RE_engine.h 
b/source/blender/render/extern/include/RE_engine.h
index 321eda0175f..ea6363c9c46 100644
--- a/source/blender/render/extern/include/RE_engine.h
+++ b/source/blender/render/extern/include/RE_engine.h
@@ -140,7 +140,7 @@ void RE_result_load_from_file(struct RenderResult *result, 
struct ReportList *re
 
 struct RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int 
y, int w, int h, const char *layername, const char *viewname);
 void RE_engine_update_result(RenderEngine *engine, struct RenderResult 
*result);
-void RE_engine_add_pass(RenderEngine *engine, const char *name, int channels, 
const char *chan_id, const char *layername);
+void RE_engine_add_pass(RenderEngine *engine, const char *name, int channels, 
const char *chan_id, const char *layername, int pixel_type);
 void RE_engine_end_result(RenderEngine *engine, struct RenderResult *result, 
int cancel, int highlight, int merge_results);
 struct RenderResult *RE_engine_get_result(struct RenderEngine *engine);
 
diff --git a/source/blender/render/extern/include/RE_pipeline.h 
b/source/blender/render/extern/include/RE_pipeline.h
index cf9298bdb9e..c3936ac4d1b 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -92,8 +92,7 @@ typedef struct RenderPass {
        char fullname[64]; /* EXR_PASS_MAXNAME */
        char view[64];          /* EXR_VIEW_MAXNAME */
        int view_id;    /* quick lookup */
-
-       int pad;
+       int pixel_type; /* RE_PIXEL_TYPE_* */
 } RenderPass;
 
 
diff --git a/source/blender/render/intern/include/render_result.h 
b/source/blender/render/intern/include/render_result.h
index 4057d8c1052..5ad5efd9d46 100644
--- a/source/blender/render/intern/include/render_result.h
+++ b/source/blender/render/intern/include/render_result.h
@@ -70,7 +70,7 @@ void render_result_merge(struct RenderResult *rr, struct 
RenderResult *rrpart);
 /* Add Passes */
 
 void render_result_clone_passes(struct Render *re, struct RenderResult *rr, 
const char *viewname);
-void render_result_add_pass(struct RenderResult *rr, const char *name, int 
channels, const char *chan_id, const char *layername, const char *viewname);
+void render_result_add_pass(struct RenderResult *rr, const char *name, int 
channels, const char *chan_id, const char *layername, const char *viewname, int 
pixel_type);
 
 /* Free */
 
diff --git a/source/blender/render/intern/source/external_engine.c 
b/source/blender/render/intern/source/external_engine.c
index 8764abf9674..54d03a3098c 100644
--- a/source/blender/render/intern/source/external_engine.c
+++ b/source/blender/render/intern/source/external_engine.c
@@ -248,7 +248,7 @@ void RE_engine_update_result(RenderEngine *engine, 
RenderResult *result)
        }
 }
 
-void RE_engine_add_pass(RenderEngine *engine, const char *name, int channels, 
const char *chan_id, const char *layername)
+void RE_engine_add_pass(RenderEngine *engine, const char *name, int channels, 
const char *chan_id, const char *layername, int pixel_type)
 {
        Render *re = engine->re;
 
@@ -256,7 +256,7 @@ void RE_engine_add_pass(RenderEngine *engine, const char 
*name, int channels, co
                return;
        }
 
-       render_result_add_p

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to