Browse Source

texturec: Added --mipskip option.

Branimir Karadžić 7 năm trước cách đây
mục cha
commit
4efac57133
1 tập tin đã thay đổi với 28 bổ sung4 xóa
  1. 28 4
      tools/texturec/texturec.cpp

+ 28 - 4
tools/texturec/texturec.cpp

@@ -21,7 +21,6 @@
 #include <bx/bx.h>
 #include <bx/commandline.h>
 #include <bx/file.h>
-#include <bx/uint32_t.h>
 
 #include <string>
 
@@ -36,6 +35,7 @@ struct Options
 	{
 		DBG("Options:\n"
 			"\t  maxSize: %d\n"
+			"\t  mipSkip: %d\n"
 			"\t     edge: %f\n"
 			"\t   format: %s\n"
 			"\t     mips: %s\n"
@@ -47,6 +47,7 @@ struct Options
 			"\t equirect: %s\n"
 			"\t    strip: %s\n"
 			, maxSize
+			, mipSkip
 			, edge
 			, bimg::getName(format)
 			, mips      ? "true" : "false"
@@ -61,6 +62,7 @@ struct Options
 	}
 
 	uint32_t maxSize = UINT32_MAX;
+	uint32_t mipSkip = 0;
 	float edge       = 0.0f;
 	bimg::TextureFormat::Enum format   = bimg::TextureFormat::Count;
 	bimg::Quality::Enum quality        = bimg::Quality::Default;
@@ -159,10 +161,21 @@ bimg::ImageContainer* convert(bx::AllocatorI* _allocator, const void* _inputData
         const uint32_t blockHeight = outputBlockInfo.blockHeight;
         const uint32_t minBlockX   = outputBlockInfo.minBlockX;
         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 outputWidth  = bx::max(blockWidth  * minBlockX, ( (input->m_width  + blockWidth  - 1) / blockWidth )*blockWidth);
+        uint32_t outputHeight = bx::max(blockHeight * minBlockY, ( (input->m_height + blockHeight - 1) / blockHeight)*blockHeight);
         uint32_t outputDepth  = input->m_depth;
 
+		if (_options.mips
+		&&  _options.mipSkip != 0)
+		{
+			for (uint32_t ii = 0; ii < _options.mipSkip; ++ii)
+			{
+				outputWidth  = bx::max(blockWidth  * minBlockX, ( ( (outputWidth>>1)  + blockWidth  - 1) / blockWidth )*blockWidth);
+				outputHeight = bx::max(blockHeight * minBlockY, ( ( (outputHeight>>1) + blockHeight - 1) / blockHeight)*blockHeight);
+				outputDepth  = bx::max(outputDepth>>1, 1u);
+			}
+		}
+
 		if (_options.equirect)
 		{
 			if (outputDepth   == 1
@@ -831,6 +844,7 @@ void help(const char* _error = NULL, bool _showHelp = true)
 		  "  -t <format>              Output format type (BC1/2/3/4/5, ETC1, PVR14, etc.).\n"
 		  "  -q <quality>             Encoding quality (default, fastest, highest).\n"
 		  "  -m, --mips               Generate mip-maps.\n"
+		  "      --mipskip <N>        Skip <N> number of mips.\n"
 		  "  -n, --normalmap          Input texture is normal map.\n"
 		  "      --equirect           Input texture is equirectangular projection of cubemap.\n"
 		  "      --strip              Input texture is horizontal strip of cubemap.\n"
@@ -997,7 +1011,17 @@ int main(int _argc, const char* _argv[])
 	{
 		if (!bx::fromString(&options.maxSize, maxSize) )
 		{
-			help("Parsing max size failed.");
+			help("Parsing `--max` failed.");
+			return bx::kExitFailure;
+		}
+	}
+
+	const char* mipSkip = cmdLine.findOption("mipskip");
+	if (NULL != mipSkip)
+	{
+		if (!bx::fromString(&options.mipSkip, mipSkip) )
+		{
+			help("Parsing `--mipskip` failed.");
 			return bx::kExitFailure;
 		}
 	}