From 33076e284959ec36c413b85efc471449b39cf70a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Wed, 21 Mar 2018 17:12:07 -0700 Subject: [PATCH] Fixed 3D texture resize. --- src/image_encode.cpp | 39 ++++++++++++++++++++++++------------- tools/texturec/texturec.cpp | 17 +++++++++++++--- 2 files changed, 39 insertions(+), 17 deletions(-) diff --git a/src/image_encode.cpp b/src/image_encode.cpp index 022a344..f7abf4c 100644 --- a/src/image_encode.cpp +++ b/src/image_encode.cpp @@ -414,27 +414,38 @@ namespace bimg { bimg::ImageMip srcMip; bimg::imageGetRawData(*_src, side, 0, _src->m_data, _src->m_size, srcMip); - const float* srcData = (const float*)(srcMip.m_data); bimg::ImageMip dstMip; bimg::imageGetRawData(*_dst, side, 0, _dst->m_data, _dst->m_size, dstMip); - float* dstData = (float*)(dstMip.m_data); + uint8_t* dstData = const_cast(dstMip.m_data); - int result = stbir_resize_float_generic( - (const float*)srcData, _src->m_width, _src->m_height, _src->m_width*16 - , ( float*)dstData, _dst->m_width, _dst->m_height, _dst->m_width*16 - , 4, 3 - , STBIR_FLAG_ALPHA_PREMULTIPLIED - , STBIR_EDGE_CLAMP - , STBIR_FILTER_CUBICBSPLINE - , STBIR_COLORSPACE_LINEAR - , NULL - ); + const uint32_t srcPitch = _src->m_width*16; + const uint32_t srcSlice = _src->m_height*srcPitch; + const uint32_t dstPitch = _dst->m_width*16; + const uint32_t dstSlice = _dst->m_height*dstPitch; - if (1 != result) + for (uint32_t zz = 0, depth = _dst->m_depth; zz < depth; ++zz, dstData += dstSlice) { - return false; + const uint32_t srcDataStep = uint32_t(bx::floor(zz * _src->m_depth / float(_dst->m_depth) ) ); + const uint8_t* srcData = &srcMip.m_data[srcDataStep*srcSlice]; + + int result = stbir_resize_float_generic( + (const float*)srcData, _src->m_width, _src->m_height, srcPitch + , ( float*)dstData, _dst->m_width, _dst->m_height, dstPitch + , 4, 3 + , STBIR_FLAG_ALPHA_PREMULTIPLIED + , STBIR_EDGE_CLAMP + , STBIR_FILTER_CUBICBSPLINE + , STBIR_COLORSPACE_LINEAR + , NULL + ); + + if (1 != result) + { + return false; + } } + } return true; diff --git a/tools/texturec/texturec.cpp b/tools/texturec/texturec.cpp index 45b0617..da09ae4 100644 --- a/tools/texturec/texturec.cpp +++ b/tools/texturec/texturec.cpp @@ -133,17 +133,28 @@ bimg::ImageContainer* convert(bx::AllocatorI* _allocator, const void* _inputData const uint32_t minBlockY = outputBlockInfo.minBlockY; uint32_t outputWidth = bx::uint32_max(blockWidth * minBlockX, ( (input->m_width + blockWidth - 1) / blockWidth )*blockWidth); uint32_t outputHeight = bx::uint32_max(blockHeight * minBlockY, ( (input->m_height + blockHeight - 1) / blockHeight)*blockHeight); + uint32_t outputDepth = input->m_depth; if (outputWidth > _options.maxSize - || outputHeight > _options.maxSize) + || outputHeight > _options.maxSize + || outputDepth > _options.maxSize) { - if (outputWidth > outputHeight) + if (outputDepth > outputWidth + && outputDepth > outputHeight) { + outputWidth = outputWidth * _options.maxSize / outputDepth; + outputHeight = outputHeight * _options.maxSize / outputDepth; + outputDepth = _options.maxSize; + } + else if (outputWidth > outputHeight) + { + outputDepth = outputDepth * _options.maxSize / outputWidth; outputHeight = outputHeight * _options.maxSize / outputWidth; outputWidth = _options.maxSize; } else { + outputDepth = outputDepth * _options.maxSize / outputHeight; outputWidth = outputWidth * _options.maxSize / outputHeight; outputHeight = _options.maxSize; } @@ -173,7 +184,7 @@ bimg::ImageContainer* convert(bx::AllocatorI* _allocator, const void* _inputData , bimg::TextureFormat::RGBA32F , uint16_t(outputWidth) , uint16_t(outputHeight) - , 1 + , uint16_t(outputDepth) , input->m_numLayers , input->m_cubeMap , false