Commit: 6befc762652998690395083ec29caa801b24a284
Author: Bastien Montagne
Date:   Wed Jun 1 17:25:05 2016 +0200
Branches: master
https://developer.blender.org/rB6befc762652998690395083ec29caa801b24a284

Fix T48466: Multiple passes starting with 'Diffuse' in EXR file breaks its 
loading in Blender.

Issue here is that for Blender, any pass which name starts with 'Diffuse' is 
considered
a diffuse pass - and it does not really support several passes of the same type 
in renderresult.

So for now, passtype_from_name() is now checking whether a pass of same type 
already exists
in render layers, and return 0 (uknown passtype) in this case.

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

M       source/blender/render/intern/source/render_result.c

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

diff --git a/source/blender/render/intern/source/render_result.c 
b/source/blender/render/intern/source/render_result.c
index 2d26fcf..bddd84c 100644
--- a/source/blender/render/intern/source/render_result.c
+++ b/source/blender/render/intern/source/render_result.c
@@ -359,102 +359,109 @@ static const char *name_from_passtype(int passtype, int 
channel)
        return "Unknown";
 }
 
-static int passtype_from_name(const char *str)
+static int passtype_from_name(const char *str, int passflag)
 {
+       /* We do not really support several pass of the same types, so in case 
we are opening an EXR file with several pass
+        * names detected as same pass type, only return that pass type the 
first time, and return 'uknown' for the others.
+        * See T48466. */
+#define RETURN_PASS(_passtype) return (passflag & (_passtype)) ? 0 : 
(_passtype)
+
        if (STRPREFIX(str, "Combined"))
-               return SCE_PASS_COMBINED;
+               RETURN_PASS(SCE_PASS_COMBINED);
 
        if (STRPREFIX(str, "Depth"))
-               return SCE_PASS_Z;
+               RETURN_PASS(SCE_PASS_Z);
 
        if (STRPREFIX(str, "Vector"))
-               return SCE_PASS_VECTOR;
+               RETURN_PASS(SCE_PASS_VECTOR);
 
        if (STRPREFIX(str, "Normal"))
-               return SCE_PASS_NORMAL;
+               RETURN_PASS(SCE_PASS_NORMAL);
 
        if (STRPREFIX(str, "UV"))
-               return SCE_PASS_UV;
+               RETURN_PASS(SCE_PASS_UV);
 
        if (STRPREFIX(str, "Color"))
-               return SCE_PASS_RGBA;
+               RETURN_PASS(SCE_PASS_RGBA);
 
        if (STRPREFIX(str, "Emit"))
-               return SCE_PASS_EMIT;
+               RETURN_PASS(SCE_PASS_EMIT);
 
        if (STRPREFIX(str, "Diffuse"))
-               return SCE_PASS_DIFFUSE;
+               RETURN_PASS(SCE_PASS_DIFFUSE);
 
        if (STRPREFIX(str, "Spec"))
-               return SCE_PASS_SPEC;
+               RETURN_PASS(SCE_PASS_SPEC);
 
        if (STRPREFIX(str, "Shadow"))
-               return SCE_PASS_SHADOW;
+               RETURN_PASS(SCE_PASS_SHADOW);
        
        if (STRPREFIX(str, "AO"))
-               return SCE_PASS_AO;
+               RETURN_PASS(SCE_PASS_AO);
 
        if (STRPREFIX(str, "Env"))
-               return SCE_PASS_ENVIRONMENT;
+               RETURN_PASS(SCE_PASS_ENVIRONMENT);
 
        if (STRPREFIX(str, "Indirect"))
-               return SCE_PASS_INDIRECT;
+               RETURN_PASS(SCE_PASS_INDIRECT);
 
        if (STRPREFIX(str, "Reflect"))
-               return SCE_PASS_REFLECT;
+               RETURN_PASS(SCE_PASS_REFLECT);
 
        if (STRPREFIX(str, "Refract"))
-               return SCE_PASS_REFRACT;
+               RETURN_PASS(SCE_PASS_REFRACT);
 
        if (STRPREFIX(str, "IndexOB"))
-               return SCE_PASS_INDEXOB;
+               RETURN_PASS(SCE_PASS_INDEXOB);
 
        if (STRPREFIX(str, "IndexMA"))
-               return SCE_PASS_INDEXMA;
+               RETURN_PASS(SCE_PASS_INDEXMA);
 
        if (STRPREFIX(str, "Mist"))
-               return SCE_PASS_MIST;
+               RETURN_PASS(SCE_PASS_MIST);
        
        if (STRPREFIX(str, "RayHits"))
-               return SCE_PASS_RAYHITS;
+               RETURN_PASS(SCE_PASS_RAYHITS);
 
        if (STRPREFIX(str, "DiffDir"))
-               return SCE_PASS_DIFFUSE_DIRECT;
+               RETURN_PASS(SCE_PASS_DIFFUSE_DIRECT);
 
        if (STRPREFIX(str, "DiffInd"))
-               return SCE_PASS_DIFFUSE_INDIRECT;
+               RETURN_PASS(SCE_PASS_DIFFUSE_INDIRECT);
 
        if (STRPREFIX(str, "DiffCol"))
-               return SCE_PASS_DIFFUSE_COLOR;
+               RETURN_PASS(SCE_PASS_DIFFUSE_COLOR);
 
        if (STRPREFIX(str, "GlossDir"))
-               return SCE_PASS_GLOSSY_DIRECT;
+               RETURN_PASS(SCE_PASS_GLOSSY_DIRECT);
 
        if (STRPREFIX(str, "GlossInd"))
-               return SCE_PASS_GLOSSY_INDIRECT;
+               RETURN_PASS(SCE_PASS_GLOSSY_INDIRECT);
 
        if (STRPREFIX(str, "GlossCol"))
-               return SCE_PASS_GLOSSY_COLOR;
+               RETURN_PASS(SCE_PASS_GLOSSY_COLOR);
 
        if (STRPREFIX(str, "TransDir"))
-               return SCE_PASS_TRANSM_DIRECT;
+               RETURN_PASS(SCE_PASS_TRANSM_DIRECT);
 
        if (STRPREFIX(str, "TransInd"))
-               return SCE_PASS_TRANSM_INDIRECT;
+               RETURN_PASS(SCE_PASS_TRANSM_INDIRECT);
 
        if (STRPREFIX(str, "TransCol"))
-               return SCE_PASS_TRANSM_COLOR;
+               RETURN_PASS(SCE_PASS_TRANSM_COLOR);
                
        if (STRPREFIX(str, "SubsurfaceDir"))
-               return SCE_PASS_SUBSURFACE_DIRECT;
+               RETURN_PASS(SCE_PASS_SUBSURFACE_DIRECT);
 
        if (STRPREFIX(str, "SubsurfaceInd"))
-               return SCE_PASS_SUBSURFACE_INDIRECT;
+               RETURN_PASS(SCE_PASS_SUBSURFACE_INDIRECT);
 
        if (STRPREFIX(str, "SubsurfaceCol"))
-               return SCE_PASS_SUBSURFACE_COLOR;
+               RETURN_PASS(SCE_PASS_SUBSURFACE_COLOR);
 
        return 0;
+
+#undef RETURN_PASS
 }
 
 
@@ -838,8 +845,9 @@ static void ml_addpass_cb(void *base, void *lay, const char 
*str, float *rect, i
        
        BLI_addtail(&rl->passes, rpass);
        rpass->channels = totchan;
-       rpass->passtype = passtype_from_name(str);
-       if (rpass->passtype == 0) printf("unknown pass %s\n", str);
+       rpass->passtype = passtype_from_name(str, rl->passflag);
+       if (rpass->passtype == 0)
+               printf("unknown pass %s\n", str);
        rl->passflag |= rpass->passtype;
        
        /* channel id chars */

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

Reply via email to