Parcourir la source

Fixed 3D texture resize.

Branimir Karadžić il y a 7 ans
Parent
commit
33076e2849
2 fichiers modifiés avec 40 ajouts et 18 suppressions
  1. 26 15
      src/image_encode.cpp
  2. 14 3
      tools/texturec/texturec.cpp

+ 26 - 15
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);
-
-			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
-				);
+			uint8_t* dstData = const_cast<uint8_t*>(dstMip.m_data);
+
+			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;

+ 14 - 3
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