diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2014-05-19 18:23:37 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2014-05-19 18:25:17 +0400 |
commit | 6271c72cafa576faf4c98e326fbed4aeccf7ab12 (patch) | |
tree | b37d341f8302aa327e5a1efab58f81fa3621dc2f /intern/cycles/render | |
parent | d9dd29054f0154b629cdaea04862602446f1575c (diff) |
Fix T39764: cycles not rendering EXR image textures with 5 channels (RGBA + Z).
Diffstat (limited to 'intern/cycles/render')
-rw-r--r-- | intern/cycles/render/image.cpp | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp index 4e61464920d..77cd6d5e79d 100644 --- a/intern/cycles/render/image.cpp +++ b/intern/cycles/render/image.cpp @@ -448,7 +448,7 @@ bool ImageManager::file_load_float_image(Image *img, device_vector<float4>& tex_ builtin_image_info_cb(img->filename, img->builtin_data, is_float, width, height, depth, components); } - if(!(components >= 1 && components <= 4)) { + if(components < 1 || width == 0 || height == 0) { if(in) { in->close(); delete in; @@ -460,17 +460,36 @@ bool ImageManager::file_load_float_image(Image *img, device_vector<float4>& tex_ float *pixels = (float*)tex_img.resize(width, height, depth); if(in) { + float *readpixels = pixels; + vector<float> tmppixels; + + if(components > 4) { + tmppixels.resize(width*height*components); + readpixels = &tmppixels[0]; + } + if(depth <= 1) { int scanlinesize = width*components*sizeof(float); in->read_image(TypeDesc::FLOAT, - (uchar*)pixels + (height-1)*scanlinesize, + (uchar*)readpixels + (height-1)*scanlinesize, AutoStride, -scanlinesize, AutoStride); } else { - in->read_image(TypeDesc::FLOAT, (uchar*)pixels); + in->read_image(TypeDesc::FLOAT, (uchar*)readpixels); + } + + if(components > 4) { + for(int i = width*height-1; i >= 0; i--) { + pixels[i*4+3] = tmppixels[i*components+3]; + pixels[i*4+2] = tmppixels[i*components+2]; + pixels[i*4+1] = tmppixels[i*components+1]; + pixels[i*4+0] = tmppixels[i*components+0]; + } + + tmppixels.clear(); } in->close(); |