Browse Source

texturec: Added support for vertical cubemap strip.

Бранимир Караџић 5 years ago
parent
commit
bf830a85f5
3 changed files with 18 additions and 17 deletions
  1. 4 4
      src/image.cpp
  2. 5 3
      src/image_cubemap_filter.cpp
  3. 9 10
      tools/texturec/texturec.cpp

+ 4 - 4
src/image.cpp

@@ -571,8 +571,8 @@ namespace bimg
 
 		for (uint16_t side = 0; side < numSides; ++side)
 		{
-			bimg::ImageMip mip;
-			bimg::imageGetRawData(*_imageContainer, side, 0, _imageContainer->m_data, _imageContainer->m_size, mip);
+			ImageMip mip;
+			imageGetRawData(*_imageContainer, side, 0, _imageContainer->m_data, _imageContainer->m_size, mip);
 
 			const uint32_t pitch = _imageContainer->m_width*16;
 			const uint32_t slice = _imageContainer->m_height*pitch;
@@ -617,8 +617,8 @@ namespace bimg
 
 		for (uint16_t side = 0; side < numSides; ++side)
 		{
-			bimg::ImageMip mip;
-			bimg::imageGetRawData(*_imageContainer, side, 0, _imageContainer->m_data, _imageContainer->m_size, mip);
+			ImageMip mip;
+			imageGetRawData(*_imageContainer, side, 0, _imageContainer->m_data, _imageContainer->m_size, mip);
 
 			const uint32_t pitch = _imageContainer->m_width*16;
 			const uint32_t slice = _imageContainer->m_height*pitch;

+ 5 - 3
src/image_cubemap_filter.cpp

@@ -336,15 +336,17 @@ namespace bimg
 		if (_input.m_depth     != 1
 		&&  _input.m_numLayers != 1
 		&&  _input.m_format    != TextureFormat::RGBA32F
-		&&  _input.m_width/6   != _input.m_height)
+		&& ( (_input.m_width   != _input.m_height*6) || (_input.m_width*6 != _input.m_height) ) )
 		{
 			BX_ERROR_SET(_err, BIMG_ERROR, "Input image format is not strip projection.");
 			return NULL;
 		}
 
+		const bool   horizontal = _input.m_width == _input.m_height*6;
 		const uint32_t srcPitch = _input.m_width*16;
-		const uint32_t dstWidth = _input.m_height;
+		const uint32_t dstWidth = horizontal ? _input.m_height : _input.m_width;
 		const uint32_t dstPitch = dstWidth*16;
+		const uint32_t step     = horizontal ? dstPitch : dstPitch*dstWidth;
 
 		ImageContainer* output = imageAlloc(_allocator
 			, _input.m_format
@@ -358,7 +360,7 @@ namespace bimg
 
 		const uint8_t* srcData = (const uint8_t*)_input.m_data;
 
-		for (uint8_t side = 0; side < 6 && _err->isOk(); ++side, srcData += dstPitch)
+		for (uint8_t side = 0; side < 6 && _err->isOk(); ++side, srcData += step)
 		{
 			ImageMip dstMip;
 			imageGetRawData(*output, side, 0, output->m_data, output->m_size, dstMip);

+ 9 - 10
tools/texturec/texturec.cpp

@@ -195,20 +195,19 @@ bimg::ImageContainer* convert(bx::AllocatorI* _allocator, const void* _inputData
 		}
 		else if (_options.strip)
 		{
-			if (outputDepth   == 1
-			&&  outputWidth/6 == outputHeight)
+			if (outputDepth == 1
+			&& ( (outputWidth == outputHeight*6) || (outputWidth*6 == outputHeight) ) )
 			{
-				if (outputWidth/6 > _options.maxSize)
-				{
-					outputWidth  = _options.maxSize*6;
-					outputHeight = _options.maxSize;
-				}
+				const bool horizontal = outputWidth == outputHeight*6;
+
+				outputWidth  = bx::min(outputWidth,  horizontal ? _options.maxSize*6 : _options.maxSize);
+				outputHeight = bx::min(outputHeight, horizontal ? _options.maxSize   : _options.maxSize*6);
 			}
 			else
 			{
 				bimg::imageFree(input);
 
-				BX_ERROR_SET(_err, TEXTRUREC_ERROR, "Input image format is not horizontal strip.");
+				BX_ERROR_SET(_err, TEXTRUREC_ERROR, "Input image format is not horizontal or vertical strip.");
 				return NULL;
 			}
 		}
@@ -325,7 +324,7 @@ bimg::ImageContainer* convert(bx::AllocatorI* _allocator, const void* _inputData
 
 			bimg::ImageContainer* dst;
 
-			if (outputWidth/2 == outputHeight)
+			if (outputWidth == outputHeight*2)
 			{
 				dst = bimg::imageCubemapFromLatLongRgba32F(_allocator, *src, true, _err);
 				bimg::imageFree(src);
@@ -933,7 +932,7 @@ void help(const char* _error = NULL, bool _showHelp = true)
 		  "      --mipskip <N>        Skip <N> number of mips.\n"
 		  "  -n, --normalmap          Input texture is normal map. (Implies --linear)\n"
 		  "      --equirect           Input texture is equirectangular projection of cubemap.\n"
-		  "      --strip              Input texture is horizontal strip of cubemap.\n"
+		  "      --strip              Input texture is horizontal or vertical strip of cubemap.\n"
 		  "      --sdf                Compute SDF texture.\n"
 		  "      --ref <alpha>        Alpha reference value.\n"
 		  "      --iqa                Image Quality Assessment\n"